diff --git a/sandbox/tests/gpu-particles/index.ts b/sandbox/tests/gpu-particles/index.ts index 55d9054f7..7ea00e7b4 100644 --- a/sandbox/tests/gpu-particles/index.ts +++ b/sandbox/tests/gpu-particles/index.ts @@ -7,31 +7,27 @@ var game = new ex.Engine({ var swordImg = new ex.ImageSource('https://cdn.rawgit.com/excaliburjs/Excalibur/7dd48128/assets/sword.png'); var particles = new ex.GpuParticleEmitter({ - pos: ex.vec(300, 500), - maxParticles: 10_000, - emitRate: 1000, - radius: 100, - width: 200, - height: 100, - emitterType: ex.EmitterType.Rectangle, + pos: ex.vec(500, 500), + z: 1, + emitterType: ex.EmitterType.Circle, + maxParticles: 1000, particle: { - acc: ex.vec(0, -100), - // opacity: 0.1, - beginColor: ex.Color.Orange, - endColor: ex.Color.Purple, - // fade: true, - focus: ex.vec(0, -400), - focusAccel: 1000, - startSize: 100, - endSize: 0, - life: 3000, - minSpeed: -100, - maxSpeed: 100, - angularVelocity: 2, - randomRotation: true, - transform: ex.ParticleTransform.Local - // graphic: swordImg.toSprite() - } + minSpeed: 1, + maxSpeed: 10, + minAngle: 3.4, + maxAngle: 6, + opacity: 0.7, + life: 2000, + maxSize: 5, + minSize: 5, + startSize: 5, + endSize: 1, + beginColor: ex.Color.fromRGB(23, 106, 170, 0.1), + endColor: ex.Color.Transparent + }, + radius: 1, + emitRate: 1, + isEmitting: true }); game.input.pointers.primary.on('move', (evt) => { @@ -44,7 +40,7 @@ game.add(particles); game.add( new ex.Actor({ - width: 200, + width: 100, height: 100, color: ex.Color.Red, pos: ex.vec(400, 400) diff --git a/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl b/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl index 05946c6cd..f01a0bc5a 100644 --- a/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl +++ b/src/engine/Graphics/Context/particle-renderer/particle-vertex.glsl @@ -51,7 +51,7 @@ void main(){ float lifePercent = finalLifeMs / maxLifeMs; vec2 transformedPos = (u_matrix * u_transform * vec4(finalPosition,0.,1.)).xy; - + float scale = sqrt(u_transform[0][0] * u_transform[0][0] + u_transform[1][1] * u_transform[1][1]); gl_Position = vec4(transformedPos, 1.0 - lifePercent, 1.); // use life percent to sort z - gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent); + gl_PointSize = mix(startSize, endSize, 1.0 - lifePercent) * scale; } \ No newline at end of file diff --git a/src/engine/Particles/GpuParticleEmitter.ts b/src/engine/Particles/GpuParticleEmitter.ts index 407bb1e21..f37912813 100644 --- a/src/engine/Particles/GpuParticleEmitter.ts +++ b/src/engine/Particles/GpuParticleEmitter.ts @@ -92,7 +92,10 @@ export class GpuParticleEmitter extends Actor { } public emitParticles(particleCount: number) { - this.renderer.emitParticles(particleCount); + if (particleCount <= 0) { + return; + } + this.renderer.emitParticles(particleCount | 0); // coerce to integer } public clearParticles() { diff --git a/src/engine/Particles/ParticleEmitter.ts b/src/engine/Particles/ParticleEmitter.ts index 71c991425..98e2ffc21 100644 --- a/src/engine/Particles/ParticleEmitter.ts +++ b/src/engine/Particles/ParticleEmitter.ts @@ -103,6 +103,10 @@ export class ParticleEmitter extends Actor { * @param particleCount Number of particles to emit right now */ public emitParticles(particleCount: number) { + if (particleCount <= 0) { + return; + } + particleCount = particleCount | 0; // coerce to int for (let i = 0; i < particleCount; i++) { const p = this._createParticle(); if (this?.scene?.world) { diff --git a/src/spec/images/GpuParticlesSpec/particles-wrapped.png b/src/spec/images/GpuParticlesSpec/particles-wrapped.png index 05467eccf..7c7761942 100644 Binary files a/src/spec/images/GpuParticlesSpec/particles-wrapped.png and b/src/spec/images/GpuParticlesSpec/particles-wrapped.png differ diff --git a/src/spec/images/GpuParticlesSpec/particles.png b/src/spec/images/GpuParticlesSpec/particles.png index 1a78e8e2e..797ed1000 100644 Binary files a/src/spec/images/GpuParticlesSpec/particles.png and b/src/spec/images/GpuParticlesSpec/particles.png differ