mirror of
https://gitlab.com/skysthelimit.dev/selenite.git
synced 2025-06-18 11:32:08 -05:00
111 lines
2.8 KiB
GLSL
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
|