playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
94 lines (93 loc) • 3.11 kB
JavaScript
var particle_cpu_default = `
attribute particle_vertexData: vec4f;
attribute particle_vertexData2: vec4f;
attribute particle_vertexData3: vec4f;
attribute particle_vertexData4: f32;
attribute particle_vertexData5: vec2f;
attribute particle_vertexData5: vec4f;
uniform matrix_viewProjection: mat4x4f;
uniform matrix_model: mat4x4f;
uniform matrix_view: mat4x4f;
uniform matrix_normal: mat3x3f;
uniform matrix_viewInverse: mat4x4f;
uniform numParticles: f32;
uniform lifetime: f32;
uniform stretch: f32;
uniform seed: f32;
uniform emitterScale: vec3f;
uniform faceTangent: vec3f;
uniform faceBinorm: vec3f;
uniform wrapBounds: vec3f;
var internalTex0: texture_2d<uff>;
var internalTex1: texture_2d<uff>;
var internalTex2: texture_2d<uff>;
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 {
var pos: vec3f;
pos = vec3f(-1.0, 0.0, 0.0) * quadXY.x + vec3f(0.0, -1.0, 0.0) * quadXY.y;
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;
}
fn safeNormalize(v: vec2f) -> vec2f {
let l = length(v);
return select(v, v / l, l > 1e-06);
}
@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));
let modelRotation = mat3x3f(uniform.matrix_model[0].xyz, uniform.matrix_model[1].xyz, uniform.matrix_model[2].xyz);
inVel = modelRotation * inVel;
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;
output.texCoordsAlphaLife = vec4f(input.particle_vertexData5.zw, input.particle_vertexData2.z, input.particle_vertexData.w);
output.texCoordsAlphaLife = vec4f(quadXY * -0.5 + 0.5, input.particle_vertexData2.z, input.particle_vertexData.w);
var rotMatrix: mat2x2f;
var inAngle = input.particle_vertexData2.x;
var particlePosMoved = vec3f(0.0);
let meshLocalPos = input.particle_vertexData3.xyz;
`;
export {
particle_cpu_default as default
};