@flighthq/particles 0.1.0 → 0.2.1-next.410.a23f189
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/applyParticleCollisions.d.ts +2 -2
- package/dist/applyParticleCollisions.d.ts.map +1 -1
- package/dist/applyParticleCollisions.js +75 -30
- package/dist/applyParticleCollisions.js.map +1 -1
- package/dist/applyParticleForces.d.ts.map +1 -1
- package/dist/applyParticleForces.js +33 -10
- package/dist/applyParticleForces.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/particleEmitterConfig.d.ts.map +1 -1
- package/dist/particleEmitterConfig.js +4 -0
- package/dist/particleEmitterConfig.js.map +1 -1
- package/dist/particleEmitterState.d.ts +1 -0
- package/dist/particleEmitterState.d.ts.map +1 -1
- package/dist/particleEmitterState.js +4 -1
- package/dist/particleEmitterState.js.map +1 -1
- package/dist/stepParticleObjects.d.ts +19 -0
- package/dist/stepParticleObjects.d.ts.map +1 -0
- package/dist/stepParticleObjects.js +29 -0
- package/dist/stepParticleObjects.js.map +1 -0
- package/dist/validateParticleEmitterConfig.d.ts.map +1 -1
- package/dist/validateParticleEmitterConfig.js +8 -0
- package/dist/validateParticleEmitterConfig.js.map +1 -1
- package/package.json +10 -7
- package/src/applyParticleCollisions.test.ts +71 -32
- package/src/applyParticleForces.test.ts +70 -34
- package/src/curve.test.ts +0 -63
- package/src/particleEmitterConfig.test.ts +4 -0
- package/src/particleEmitterSignals.test.ts +0 -83
- package/src/particleEmitterState.test.ts +7 -44
- package/src/stepParticleObjects.test.ts +30 -0
- package/src/validateParticleEmitterConfig.test.ts +0 -32
- package/dist/emitParticleBurst.d.ts +0 -15
- package/dist/emitParticleBurst.d.ts.map +0 -1
- package/dist/emitParticleBurst.js +0 -114
- package/dist/emitParticleBurst.js.map +0 -1
- package/dist/prewarmParticleEmitter.d.ts +0 -5
- package/dist/prewarmParticleEmitter.d.ts.map +0 -1
- package/dist/prewarmParticleEmitter.js +0 -13
- package/dist/prewarmParticleEmitter.js.map +0 -1
- package/dist/stepParticleEmitter.d.ts +0 -38
- package/dist/stepParticleEmitter.d.ts.map +0 -1
- package/dist/stepParticleEmitter.js +0 -57
- package/dist/stepParticleEmitter.js.map +0 -1
- package/dist/updateParticleEmitter.d.ts +0 -8
- package/dist/updateParticleEmitter.d.ts.map +0 -1
- package/dist/updateParticleEmitter.js +0 -315
- package/dist/updateParticleEmitter.js.map +0 -1
- package/src/deterministic.test.ts +0 -54
- package/src/emitParticleBurst.test.ts +0 -103
- package/src/prewarmParticleEmitter.test.ts +0 -68
- package/src/stepParticleEmitter.test.ts +0 -113
- package/src/updateParticleEmitter.test.ts +0 -631
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { createParticleEmitter } from '@flighthq/sprite';
|
|
2
|
-
import type { ParticleCollider, ParticleForce, ParticleObject, TextureAtlas } from '@flighthq/types';
|
|
3
|
-
|
|
4
|
-
import { createParticleEmitterConfig } from './particleEmitterConfig';
|
|
5
|
-
import { createParticleEmitterState } from './particleEmitterState';
|
|
6
|
-
import { createParticleObjectsState } from './particleObjectsState';
|
|
7
|
-
import { stepParticleEmitter, stepParticleObjects } from './stepParticleEmitter';
|
|
8
|
-
|
|
9
|
-
function makeAtlas(): TextureAtlas {
|
|
10
|
-
return {
|
|
11
|
-
image: null,
|
|
12
|
-
regions: [{ id: 0, x: 0, y: 0, width: 32, height: 32, pivotX: null, pivotY: null }],
|
|
13
|
-
} as unknown as TextureAtlas;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
describe('stepParticleEmitter', () => {
|
|
17
|
-
it('spawns particles when called with no forces or colliders', () => {
|
|
18
|
-
const emitter = createParticleEmitter({ data: { atlas: makeAtlas() } });
|
|
19
|
-
const state = createParticleEmitterState();
|
|
20
|
-
const config = createParticleEmitterConfig({ spawnRate: 10, maxParticles: 100 });
|
|
21
|
-
stepParticleEmitter(emitter, state, config, 1);
|
|
22
|
-
expect(emitter.data.particleCount).toBe(10);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('applies wind force before update — particle receives velocity from wind', () => {
|
|
26
|
-
const emitter = createParticleEmitter({ data: { atlas: makeAtlas() } });
|
|
27
|
-
const state = createParticleEmitterState();
|
|
28
|
-
const config = createParticleEmitterConfig({
|
|
29
|
-
spawnRate: 1,
|
|
30
|
-
lifetimeMin: 10,
|
|
31
|
-
lifetimeMax: 10,
|
|
32
|
-
speedMin: 0,
|
|
33
|
-
speedMax: 0,
|
|
34
|
-
spread: 0,
|
|
35
|
-
directionX: 0,
|
|
36
|
-
directionY: -1,
|
|
37
|
-
});
|
|
38
|
-
// Spawn one particle first
|
|
39
|
-
stepParticleEmitter(emitter, state, config, 1);
|
|
40
|
-
expect(emitter.data.particleCount).toBe(1);
|
|
41
|
-
// Now step with a wind force pushing right
|
|
42
|
-
const wind: ParticleForce = { kind: 'WindForce', x: 200, y: 0 };
|
|
43
|
-
stepParticleEmitter(emitter, state, config, 1, [wind]);
|
|
44
|
-
// After wind: vx starts at 0, gets +200 from wind in applyForces, then particle moves right
|
|
45
|
-
const x = emitter.data.transforms[0];
|
|
46
|
-
expect(x).toBeGreaterThan(0);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('resolves collisions after update — particle stays above a plane at y=0', () => {
|
|
50
|
-
const emitter = createParticleEmitter({ data: { atlas: makeAtlas() } });
|
|
51
|
-
const state = createParticleEmitterState();
|
|
52
|
-
const config = createParticleEmitterConfig({
|
|
53
|
-
spawnRate: 1,
|
|
54
|
-
lifetimeMin: 10,
|
|
55
|
-
lifetimeMax: 10,
|
|
56
|
-
speedMin: 100,
|
|
57
|
-
speedMax: 100,
|
|
58
|
-
spread: 0,
|
|
59
|
-
directionX: 0,
|
|
60
|
-
directionY: 1, // moving downward
|
|
61
|
-
gravityY: 0,
|
|
62
|
-
});
|
|
63
|
-
stepParticleEmitter(emitter, state, config, 1);
|
|
64
|
-
// Particle moves down; plane at y=0 (normal pointing up = (0,-1), distance 0)
|
|
65
|
-
const plane: ParticleCollider = { kind: 'PlaneCollider', nx: 0, ny: -1, distance: 0, restitution: 1, friction: 0 };
|
|
66
|
-
stepParticleEmitter(emitter, state, config, 1, undefined, [plane]);
|
|
67
|
-
// Particle should be reflected above y=0
|
|
68
|
-
const y = emitter.data.transforms[1];
|
|
69
|
-
expect(y).toBeGreaterThanOrEqual(-1e-4); // at or above plane
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('passes callbacks down to updateParticleEmitter', () => {
|
|
73
|
-
const emitter = createParticleEmitter({ data: { atlas: makeAtlas() } });
|
|
74
|
-
const state = createParticleEmitterState();
|
|
75
|
-
const config = createParticleEmitterConfig({ spawnRate: 3, lifetimeMin: 10, lifetimeMax: 10 });
|
|
76
|
-
let spawnCount = 0;
|
|
77
|
-
stepParticleEmitter(emitter, state, config, 1, undefined, undefined, { onSpawn: () => spawnCount++ });
|
|
78
|
-
expect(spawnCount).toBe(3);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('is a no-op for zero deltaTime', () => {
|
|
82
|
-
const emitter = createParticleEmitter({ data: { atlas: makeAtlas() } });
|
|
83
|
-
const state = createParticleEmitterState();
|
|
84
|
-
const config = createParticleEmitterConfig({ spawnRate: 10, lifetimeMin: 10, lifetimeMax: 10 });
|
|
85
|
-
stepParticleEmitter(emitter, state, config, 0);
|
|
86
|
-
expect(emitter.data.particleCount).toBe(0);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
describe('stepParticleObjects', () => {
|
|
91
|
-
it('spawns into dead slots when called with no forces or colliders', () => {
|
|
92
|
-
const objects = Array.from({ length: 10 }, makeObject);
|
|
93
|
-
const state = createParticleObjectsState(10);
|
|
94
|
-
const config = createParticleEmitterConfig({ spawnRate: 5, lifetimeMin: 10, lifetimeMax: 10 });
|
|
95
|
-
stepParticleObjects(objects, state, config, 1);
|
|
96
|
-
const visible = objects.filter((o) => o.visible).length;
|
|
97
|
-
expect(visible).toBe(5);
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
function makeObject(): ParticleObject {
|
|
102
|
-
return {
|
|
103
|
-
alpha: 1,
|
|
104
|
-
blendMode: null,
|
|
105
|
-
colorTransform: null,
|
|
106
|
-
rotation: 0,
|
|
107
|
-
scaleX: 1,
|
|
108
|
-
scaleY: 1,
|
|
109
|
-
visible: false,
|
|
110
|
-
x: 0,
|
|
111
|
-
y: 0,
|
|
112
|
-
} as unknown as ParticleObject;
|
|
113
|
-
}
|