@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.
Files changed (55) hide show
  1. package/dist/applyParticleCollisions.d.ts +2 -2
  2. package/dist/applyParticleCollisions.d.ts.map +1 -1
  3. package/dist/applyParticleCollisions.js +75 -30
  4. package/dist/applyParticleCollisions.js.map +1 -1
  5. package/dist/applyParticleForces.d.ts.map +1 -1
  6. package/dist/applyParticleForces.js +33 -10
  7. package/dist/applyParticleForces.js.map +1 -1
  8. package/dist/index.d.ts +1 -4
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/particleEmitterConfig.d.ts.map +1 -1
  13. package/dist/particleEmitterConfig.js +4 -0
  14. package/dist/particleEmitterConfig.js.map +1 -1
  15. package/dist/particleEmitterState.d.ts +1 -0
  16. package/dist/particleEmitterState.d.ts.map +1 -1
  17. package/dist/particleEmitterState.js +4 -1
  18. package/dist/particleEmitterState.js.map +1 -1
  19. package/dist/stepParticleObjects.d.ts +19 -0
  20. package/dist/stepParticleObjects.d.ts.map +1 -0
  21. package/dist/stepParticleObjects.js +29 -0
  22. package/dist/stepParticleObjects.js.map +1 -0
  23. package/dist/validateParticleEmitterConfig.d.ts.map +1 -1
  24. package/dist/validateParticleEmitterConfig.js +8 -0
  25. package/dist/validateParticleEmitterConfig.js.map +1 -1
  26. package/package.json +10 -7
  27. package/src/applyParticleCollisions.test.ts +71 -32
  28. package/src/applyParticleForces.test.ts +70 -34
  29. package/src/curve.test.ts +0 -63
  30. package/src/particleEmitterConfig.test.ts +4 -0
  31. package/src/particleEmitterSignals.test.ts +0 -83
  32. package/src/particleEmitterState.test.ts +7 -44
  33. package/src/stepParticleObjects.test.ts +30 -0
  34. package/src/validateParticleEmitterConfig.test.ts +0 -32
  35. package/dist/emitParticleBurst.d.ts +0 -15
  36. package/dist/emitParticleBurst.d.ts.map +0 -1
  37. package/dist/emitParticleBurst.js +0 -114
  38. package/dist/emitParticleBurst.js.map +0 -1
  39. package/dist/prewarmParticleEmitter.d.ts +0 -5
  40. package/dist/prewarmParticleEmitter.d.ts.map +0 -1
  41. package/dist/prewarmParticleEmitter.js +0 -13
  42. package/dist/prewarmParticleEmitter.js.map +0 -1
  43. package/dist/stepParticleEmitter.d.ts +0 -38
  44. package/dist/stepParticleEmitter.d.ts.map +0 -1
  45. package/dist/stepParticleEmitter.js +0 -57
  46. package/dist/stepParticleEmitter.js.map +0 -1
  47. package/dist/updateParticleEmitter.d.ts +0 -8
  48. package/dist/updateParticleEmitter.d.ts.map +0 -1
  49. package/dist/updateParticleEmitter.js +0 -315
  50. package/dist/updateParticleEmitter.js.map +0 -1
  51. package/src/deterministic.test.ts +0 -54
  52. package/src/emitParticleBurst.test.ts +0 -103
  53. package/src/prewarmParticleEmitter.test.ts +0 -68
  54. package/src/stepParticleEmitter.test.ts +0 -113
  55. 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
- }