2023-09-04 21:49:30 -04:00

111 lines
2.8 KiB
GLSL

#ifdef GL_ES
#define LOWP lowp
#define MED mediump
#define HIGH highp
precision mediump float;
#else
#define MED
#define LOWP
#define HIGH
#endif
#ifdef billboard
//Billboard particles
//In
attribute vec3 a_position;
attribute vec2 a_texCoord0;
attribute vec4 a_sizeAndRotation;
attribute vec4 a_color;
//out
varying MED vec2 v_texCoords0;
varying vec4 v_color;
//Camera
uniform mat4 u_projViewTrans;
//Billboard to screen
#ifdef screenFacing
uniform vec3 u_cameraInvDirection;
uniform vec3 u_cameraRight;
uniform vec3 u_cameraUp;
#endif
#ifdef viewPointFacing
uniform vec3 u_cameraPosition;
uniform vec3 u_cameraUp;
#endif
#ifdef paticleDirectionFacing
uniform vec3 u_cameraPosition;
attribute vec3 a_direction;
#endif
void main() {
#ifdef screenFacing
vec3 right = u_cameraRight;
vec3 up = u_cameraUp;
vec3 look = u_cameraInvDirection;
#endif
#ifdef viewPointFacing
vec3 look = normalize(u_cameraPosition - a_position);
vec3 right = normalize(cross(u_cameraUp, look));
vec3 up = normalize(cross(look, right));
#endif
#ifdef paticleDirectionFacing
vec3 up = a_direction;
vec3 look = normalize(u_cameraPosition - a_position);
vec3 right = normalize(cross(up, look));
look = normalize(cross(right, up));
#endif
//Rotate around look
vec3 axis = look;
float c = a_sizeAndRotation.z;
float s = a_sizeAndRotation.w;
float oc = 1.0 - c;
mat3 rot = mat3(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c);
vec3 offset = rot*(right*a_sizeAndRotation.x + up*a_sizeAndRotation.y );
gl_Position = u_projViewTrans * vec4(a_position + offset, 1.0);
v_texCoords0 = a_texCoord0;
v_color = a_color;
}
#else
//Point particles
attribute vec3 a_position;
attribute vec3 a_sizeAndRotation;
attribute vec4 a_color;
attribute vec4 a_region;
//out
varying vec4 v_color;
varying vec4 v_rotation;
varying MED vec4 v_region;
varying vec2 v_uvRegionCenter;
//Camera
uniform mat4 u_projTrans;
//should be modelView but particles are already in world coordinates
uniform mat4 u_viewTrans;
uniform float u_screenWidth;
uniform vec2 u_regionSize;
void main(){
float halfSize = 0.5*a_sizeAndRotation.x;
vec4 eyePos = u_viewTrans * vec4(a_position, 1);
vec4 projCorner = u_projTrans * vec4(halfSize, halfSize, eyePos.z, eyePos.w);
gl_PointSize = u_screenWidth * projCorner.x / projCorner.w;
gl_Position = u_projTrans * eyePos;
v_rotation = vec4(a_sizeAndRotation.y, a_sizeAndRotation.z, -a_sizeAndRotation.z, a_sizeAndRotation.y);
v_color = a_color;
v_region.xy = a_region.xy;
v_region.zw = a_region.zw -a_region.xy;
v_uvRegionCenter = a_region.xy +v_region.zw*0.5;
}
#endif