UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

83 lines (81 loc) 2.93 kB
var particle_cpuVS = ` attribute particle_vertexData: vec4f; attribute particle_vertexData2: vec4f; attribute particle_vertexData3: vec4f; attribute particle_vertexData4: f32; #ifndef USE_MESH attribute particle_vertexData5: vec2f; #else attribute particle_vertexData5: vec4f; #endif uniform matrix_viewProjection: mat4x4f; uniform matrix_model: mat4x4f; #ifndef VIEWMATRIX #define VIEWMATRIX uniform matrix_view: mat4x4f; #endif uniform matrix_normal: mat3x3f; uniform matrix_viewInverse: mat4x4f; uniform numParticles: f32; uniform lifetime: f32; uniform stretch: f32; uniform seed: f32; uniform wrapBounds: vec3f; uniform emitterScale: vec3f; uniform faceTangent: vec3f; uniform faceBinorm: vec3f; #ifdef PARTICLE_GPU var internalTex0: texture_2d<f32>; var internalTex0Sampler: sampler; var internalTex1: texture_2d<f32>; var internalTex1Sampler: sampler; var internalTex2: texture_2d<f32>; var internalTex2Sampler: sampler; #endif uniform emitterPos: vec3f; varying texCoordsAlphaLife: vec4f; struct RotateResult { rotatedVec: vec2f, matrix: mat2x2f } fn rotateWithMatrix(quadXY: vec2f, pRotation: f32) -> RotateResult { let c = cos(pRotation); let s = sin(pRotation); let m = mat2x2f(vec2f(c, s), vec2f(-s, c)); return RotateResult(m * quadXY, m); } fn billboard(InstanceCoords: vec3f, quadXY: vec2f) -> vec3f { let pos = -uniform.matrix_viewInverse[0].xyz * quadXY.x + -uniform.matrix_viewInverse[1].xyz * quadXY.y; return pos; } fn customFace(InstanceCoords: vec3f, quadXY: vec2f) -> vec3f { let pos = uniform.faceTangent * quadXY.x + uniform.faceBinorm * quadXY.y; return pos; } @vertex fn vertexMain(input: VertexInput) -> VertexOutput { var output: VertexOutput; var particlePos = input.particle_vertexData.xyz; let inPos = particlePos; let vertPos = input.particle_vertexData3.xyz; var inVel = vec3f(input.particle_vertexData2.w, input.particle_vertexData3.w, input.particle_vertexData5.x); let id = floor(input.particle_vertexData4); let rndFactor = fract(sin(id + 1.0 + uniform.seed)); let rndFactor3 = vec3f(rndFactor, fract(rndFactor*10.0), fract(rndFactor*100.0)); #ifdef LOCAL_SPACE let modelRotation = mat3x3f(uniform.matrix_model[0].xyz, uniform.matrix_model[1].xyz, uniform.matrix_model[2].xyz); inVel = modelRotation * inVel; #endif let velocityV = safeNormalize((mat3x3f(uniform.matrix_view[0].xyz, uniform.matrix_view[1].xyz, uniform.matrix_view[2].xyz) * inVel).xy); let quadXY = vertPos.xy; #ifdef USE_MESH output.texCoordsAlphaLife = vec4f(input.particle_vertexData5.zw, input.particle_vertexData2.z, input.particle_vertexData.w); #else output.texCoordsAlphaLife = vec4f(quadXY * -0.5 + 0.5, input.particle_vertexData2.z, input.particle_vertexData.w); #endif var rotMatrix: mat2x2f; let inAngle = input.particle_vertexData2.x; var particlePosMoved = vec3f(0.0); let meshLocalPos = input.particle_vertexData3.xyz; `; export { particle_cpuVS as default };