layout (location=0) in vec4 a_co; layout (location=1) in vec4 a_norm; layout (location=2) in vec4 a_colour; #include "motion_vectors_vs.glsl" uniform mat4x3 uMdl; uniform mat3 uNormMtx; uniform mat4 uPv; uniform mat4 uPvmPrev; uniform vec2 uTime; uniform vec4 uTransform; out vec4 aColour; out vec3 aNorm; out vec3 aWorldCo; out vec3 aCo; vec2 rand_hash22( vec2 p ) { vec3 p3 = fract(vec3(p.xyx) * 213.8976123); p3 += dot(p3, p3.yzx+19.19); return fract(vec2((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y)); } vec3 mapP( vec3 p ) { return p; float t = max(0.0,uTime.y); vec3 lco = p * 20.0; vec3 grid = vec3(floor(lco.x),lco.y,floor(lco.z));//fract(p); return mix(p,grid * (1.0/20.0), t)*vec3(1.0+t,1.0-t,1.0+t); } void main() { vec3 mco = a_co.xyz * uTransform.w + uTransform.xyz; vec3 center = vec3(0.5); vec3 lco = mapP(mco-center); mco = lco + center; vec3 world_pos0 = uMdl * vec4( mco, 1.0 ); vec4 vproj0 = uPv * vec4( world_pos0, 1.0 ); vec4 vproj1 = uPvmPrev * vec4( mco, 1.0 ); float t = max(0.0,uTime.y); float scaler = smoothstep(0.6,0.58,length(lco.xz*vec2(0.7,1.0))); vs_motion_out( vproj0, vproj1 ); gl_Position = vproj0; gl_PointSize = (8.0*uTransform.w*scaler) / (gl_Position.z + 0.01); aWorldCo = world_pos0; aColour = a_colour*scaler*(0.3+a_co.y)+pow(1.0-a_co.y,16.0); aCo = mco; aNorm = uNormMtx * a_norm.xyz; }