precision highp float; #include #include #include in vec3 a_position; // center position in vec3 a_texCoord; // xy:vertex index,z:frame index in vec3 a_texCoord1; // size in vec3 a_texCoord2; // rotation in vec4 a_color; #if CC_USE_STRETCHED_BILLBOARD in vec3 a_color1; // velocity.x, velocity.y, velocity.z, scale #endif #if CC_USE_MESH in vec3 a_texCoord3; // mesh vertices in vec3 a_normal; // mesh normal in vec4 a_color1; // mesh color #endif vec4 lpvs_main() { vec3 compScale = scale.xyz * a_texCoord1; vec4 pos = vec4(a_position, 1); #if CC_USE_STRETCHED_BILLBOARD vec4 velocity = vec4(a_color1.xyz, 0); #endif #if !CC_USE_WORLD_SPACE // simulate in world space. apply cc_matWorld matrix on CPU side. pos = cc_matWorld * pos; #if CC_USE_STRETCHED_BILLBOARD velocity = cc_matWorld * velocity; #endif #endif #if !CC_USE_MESH vec2 cornerOffset = vec2((a_texCoord.xy - 0.5)); #if CC_USE_BILLBOARD vec3 rotEuler = a_texCoord2; #elif CC_USE_STRETCHED_BILLBOARD vec3 rotEuler = vec3(0.); #else vec3 rotEuler = vec3(0., 0., a_texCoord2.z); #endif computeVertPos(pos, cornerOffset, quaternionFromEuler(rotEuler), compScale #if CC_USE_BILLBOARD || CC_USE_VERTICAL_BILLBOARD , cc_matViewInv #endif #if CC_USE_STRETCHED_BILLBOARD , cc_cameraPos.xyz , velocity , frameTile_velLenScale.z , frameTile_velLenScale.w , a_texCoord.x #endif ); color = a_color; #else mat4 xformNoScale = matrixFromRT(quaternionFromEuler(a_texCoord2), pos.xyz); mat4 xform = matFromRTS(quaternionFromEuler(a_texCoord2), pos.xyz, compScale); pos = xform * vec4(a_texCoord3, 1); vec4 normal = xformNoScale * vec4(a_normal, 0); color = a_color * a_color1; #endif uv = computeUV(a_texCoord.z, a_texCoord.xy, frameTile_velLenScale.xy) * mainTiling_Offset.xy + mainTiling_Offset.zw; pos = cc_matViewProj * pos; return pos; }