@flighthq/particleemitter 0.1.0

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.
@@ -0,0 +1,15 @@
1
+ import type { ParticleEmitter } from '@flighthq/types';
2
+ import type { ParticleEmitterConfig, ParticleEmitterState } from '@flighthq/types';
3
+ /** Emit `count` particles immediately at an arbitrary point (in the emitter's
4
+ * simulation space), independent of the emitter's own spawn rate, bursts, or
5
+ * duration. Returns the number actually spawned (capped by `maxParticles`).
6
+ *
7
+ * This is the building block for sub-emitters: call it from an `onDeath` /
8
+ * `onSpawn` callback to spawn a child effect at the event position (explosions,
9
+ * debris, impact sparks), or once per live particle for trails. The child
10
+ * emitter/state/config are completely independent of the parent.
11
+ *
12
+ * Spawn randomness is drawn from `state.random`, so a seeded child state keeps
13
+ * sub-emitter output deterministic. */
14
+ export declare function emitParticleBurst(emitter: ParticleEmitter, state: ParticleEmitterState, config: Readonly<ParticleEmitterConfig>, count: number, x: number, y: number): number;
15
+ //# sourceMappingURL=emitParticleBurst.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitParticleBurst.d.ts","sourceRoot":"","sources":["../src/emitParticleBurst.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAOnF;;;;;;;;;;wCAUwC;AACxC,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EACvC,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,MAAM,CAqGR"}
@@ -0,0 +1,113 @@
1
+ import { ensureParticleEmitterStateCapacity, sampleParticleColorCurve, sampleParticleCurve } from '@flighthq/particles';
2
+ import { reserveParticleEmitter } from './particleEmitter';
3
+ const PARTICLE_TRANSFORM_STRIDE = 4;
4
+ const TWO_PI = Math.PI * 2;
5
+ /** Emit `count` particles immediately at an arbitrary point (in the emitter's
6
+ * simulation space), independent of the emitter's own spawn rate, bursts, or
7
+ * duration. Returns the number actually spawned (capped by `maxParticles`).
8
+ *
9
+ * This is the building block for sub-emitters: call it from an `onDeath` /
10
+ * `onSpawn` callback to spawn a child effect at the event position (explosions,
11
+ * debris, impact sparks), or once per live particle for trails. The child
12
+ * emitter/state/config are completely independent of the parent.
13
+ *
14
+ * Spawn randomness is drawn from `state.random`, so a seeded child state keeps
15
+ * sub-emitter output deterministic. */
16
+ export function emitParticleBurst(emitter, state, config, count, x, y) {
17
+ const data = emitter.data;
18
+ const liveCount = data.particleCount;
19
+ let toSpawn = Math.floor(count);
20
+ const maxNew = config.maxParticles - liveCount;
21
+ if (toSpawn > maxNew)
22
+ toSpawn = maxNew;
23
+ if (toSpawn <= 0)
24
+ return 0;
25
+ const hasColorVariance = config.colorStartVarianceR !== 0 ||
26
+ config.colorStartVarianceG !== 0 ||
27
+ config.colorStartVarianceB !== 0 ||
28
+ config.colorEndVarianceR !== 0 ||
29
+ config.colorEndVarianceG !== 0 ||
30
+ config.colorEndVarianceB !== 0;
31
+ const newCount = liveCount + toSpawn;
32
+ reserveParticleEmitter(emitter, newCount);
33
+ ensureParticleEmitterStateCapacity(state, newCount, hasColorVariance);
34
+ const { colorStartR, colorStartG, colorStartB, colorEndR, colorEndG, colorEndB } = config;
35
+ const alphaCurve = config.alphaCurve;
36
+ const colorCurve = config.colorCurve;
37
+ const scaleCurve = config.scaleCurve;
38
+ const hasAlphaCurve = alphaCurve != null && alphaCurve.length > 0;
39
+ const hasColorCurve = colorCurve != null && colorCurve.length >= 3;
40
+ const hasScaleCurve = scaleCurve != null && scaleCurve.length > 0;
41
+ const baseAngle = Math.atan2(config.directionY, config.directionX);
42
+ const regionRange = config.regionIdMax - config.regionIdMin;
43
+ const regionIdMin = config.regionIdMin;
44
+ const rotSpeedRange = config.rotationSpeedMax - config.rotationSpeedMin;
45
+ const hasRotSpeed = config.rotationSpeedMin !== 0 || config.rotationSpeedMax !== 0;
46
+ const random = state.random;
47
+ for (let sIdx = 0; sIdx < toSpawn; sIdx++) {
48
+ const idx = liveCount + sIdx;
49
+ const lifetime = config.lifetimeMin + random() * (config.lifetimeMax - config.lifetimeMin);
50
+ const lt = idx * 2;
51
+ state.lifetimes[lt] = 0;
52
+ state.lifetimes[lt + 1] = lifetime;
53
+ const angle = baseAngle + (random() - 0.5) * 2 * config.spread;
54
+ const speed = config.speedMin + random() * (config.speedMax - config.speedMin);
55
+ state.velocities[idx * 2] = Math.cos(angle) * speed;
56
+ state.velocities[idx * 2 + 1] = Math.sin(angle) * speed;
57
+ // Position = burst point + emitter-shape offset.
58
+ let spawnX = x;
59
+ let spawnY = y;
60
+ if (config.emitterShape === 'circle' && config.emitterRadius > 0) {
61
+ const r = Math.sqrt(random()) * config.emitterRadius;
62
+ const a = random() * TWO_PI;
63
+ spawnX += Math.cos(a) * r;
64
+ spawnY += Math.sin(a) * r;
65
+ }
66
+ else if (config.emitterShape === 'rect' && (config.emitterWidth > 0 || config.emitterHeight > 0)) {
67
+ spawnX += (random() - 0.5) * config.emitterWidth;
68
+ spawnY += (random() - 0.5) * config.emitterHeight;
69
+ }
70
+ const spawnScale = config.scaleMin + random() * (config.scaleMax - config.scaleMin);
71
+ state.scales[idx] = spawnScale;
72
+ const tt = idx * PARTICLE_TRANSFORM_STRIDE;
73
+ data.transforms[tt] = spawnX;
74
+ data.transforms[tt + 1] = spawnY;
75
+ data.transforms[tt + 2] = angle;
76
+ data.transforms[tt + 3] = hasScaleCurve ? spawnScale * sampleParticleCurve(scaleCurve, 0) : spawnScale;
77
+ data.alphas[idx] = hasAlphaCurve ? sampleParticleCurve(alphaCurve, 0) : config.alphaStart;
78
+ const ct = idx * 3;
79
+ if (hasColorCurve) {
80
+ sampleParticleColorCurve(data.colors, ct, colorCurve, 0);
81
+ }
82
+ else if (hasColorVariance) {
83
+ const r0 = clamp01(colorStartR + (random() - 0.5) * 2 * config.colorStartVarianceR);
84
+ const g0 = clamp01(colorStartG + (random() - 0.5) * 2 * config.colorStartVarianceG);
85
+ const b0 = clamp01(colorStartB + (random() - 0.5) * 2 * config.colorStartVarianceB);
86
+ const r1 = clamp01(colorEndR + (random() - 0.5) * 2 * config.colorEndVarianceR);
87
+ const g1 = clamp01(colorEndG + (random() - 0.5) * 2 * config.colorEndVarianceG);
88
+ const b1 = clamp01(colorEndB + (random() - 0.5) * 2 * config.colorEndVarianceB);
89
+ state.colorBirth[ct] = r0;
90
+ state.colorBirth[ct + 1] = g0;
91
+ state.colorBirth[ct + 2] = b0;
92
+ state.colorDeath[ct] = r1;
93
+ state.colorDeath[ct + 1] = g1;
94
+ state.colorDeath[ct + 2] = b1;
95
+ data.colors[ct] = r0;
96
+ data.colors[ct + 1] = g0;
97
+ data.colors[ct + 2] = b0;
98
+ }
99
+ else {
100
+ data.colors[ct] = colorStartR;
101
+ data.colors[ct + 1] = colorStartG;
102
+ data.colors[ct + 2] = colorStartB;
103
+ }
104
+ data.ids[idx] = regionIdMin + (config.frameCount > 1 ? 0 : regionRange > 0 ? (random() * regionRange) | 0 : 0);
105
+ state.rotationSpeeds[idx] = hasRotSpeed ? config.rotationSpeedMin + random() * rotSpeedRange : 0;
106
+ }
107
+ data.particleCount = newCount;
108
+ return toSpawn;
109
+ }
110
+ function clamp01(v) {
111
+ return v < 0 ? 0 : v > 1 ? 1 : v;
112
+ }
113
+ //# sourceMappingURL=emitParticleBurst.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitParticleBurst.js","sourceRoot":"","sources":["../src/emitParticleBurst.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from './emitParticleBurst';
2
+ export * from './particleEmitter';
3
+ export * from './prewarmParticleEmitter';
4
+ export * from './stepParticleEmitter';
5
+ export * from './updateParticleEmitter';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './emitParticleBurst';
2
+ export * from './particleEmitter';
3
+ export * from './prewarmParticleEmitter';
4
+ export * from './stepParticleEmitter';
5
+ export * from './updateParticleEmitter';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { PartialNode, ParticleEmitter, ParticleEmitterData, ParticleEmitterRuntime, Rectangle, Vector2Like } from '@flighthq/types';
2
+ export declare const PARTICLE_EMITTER_DELETED_ID = 65535;
3
+ /**
4
+ * Appends a new particle at the end of `target`, auto-growing capacity via `reserveParticleEmitter`.
5
+ * Returns the new particle index. Color defaults to white (1, 1, 1) and alpha to 1.0 unless
6
+ * overridden with `setParticleEmitterParticleColor` / `setParticleEmitterParticleAlpha`.
7
+ */
8
+ export declare function appendParticleEmitterParticle(target: ParticleEmitter, id: number, x: number, y: number, rotation: number, scale: number): number;
9
+ /** Sets `target.data.particleCount = 0`, keeping allocated capacity. */
10
+ export declare function clearParticleEmitter(target: ParticleEmitter): void;
11
+ /**
12
+ * Deep-copies `source` into a new `ParticleEmitter` with independent typed arrays and a fresh runtime.
13
+ * The new emitter has the same `particleCount`, `atlas`, and `worldSpace` flag, but its
14
+ * `transforms`, `alphas`, `colors`, `ids`, and `velocities` are cloned typed arrays.
15
+ */
16
+ export declare function cloneParticleEmitter(source: Readonly<ParticleEmitter>): ParticleEmitter;
17
+ /**
18
+ * Compacts the particle buffer by removing entries whose id equals `0xffff` (the Uint16Array
19
+ * sentinel for logically deleted slots). Preserves the relative order of remaining entries.
20
+ * After compaction, `particleCount` equals the number of non-sentinel entries.
21
+ *
22
+ * Use after a series of swap-removes with manual id-zeroing when stable iteration order is needed.
23
+ * For simple swap-remove workflows, compaction is not required.
24
+ */
25
+ export declare function compactParticleEmitter(target: ParticleEmitter): void;
26
+ export declare function computeParticleEmitterLocalBoundsRectangle(out: Rectangle, source: Readonly<ParticleEmitter>): void;
27
+ export declare function createParticleEmitter(obj?: Readonly<PartialNode<ParticleEmitter>>): ParticleEmitter;
28
+ export declare function createParticleEmitterData(data?: Readonly<Partial<ParticleEmitterData>>): ParticleEmitterData;
29
+ export declare function createParticleEmitterRuntime(): ParticleEmitterRuntime;
30
+ export declare function getParticleEmitterCapacity(source: Readonly<ParticleEmitter>): number;
31
+ /**
32
+ * Returns the alpha of particle `index`, or -1 when `index` is out of range.
33
+ * Bounds-checked against `particleCount`.
34
+ */
35
+ export declare function getParticleEmitterParticleAlpha(source: Readonly<ParticleEmitter>, index: number): number;
36
+ /**
37
+ * Returns the region id of particle `index`, or -1 when `index` is out of range.
38
+ * Bounds-checked against `particleCount`.
39
+ */
40
+ export declare function getParticleEmitterParticleId(source: Readonly<ParticleEmitter>, index: number): number;
41
+ /**
42
+ * Writes the velocity (vx, vy) of particle `index` into `out.x` and `out.y`.
43
+ * Returns false and writes nothing when `index` is out of range.
44
+ */
45
+ export declare function getParticleEmitterParticleVelocity(out: Vector2Like, source: Readonly<ParticleEmitter>, index: number): boolean;
46
+ export declare function getParticleEmitterRuntime(source: Readonly<ParticleEmitter>): Readonly<ParticleEmitterRuntime>;
47
+ /**
48
+ * Swap-removes particle `index` with the last particle (O(1)), decrementing `particleCount`.
49
+ * Does not preserve order — the particle that was at `particleCount-1` moves to `index`.
50
+ * No-ops when `index` is out of range.
51
+ */
52
+ export declare function removeParticleEmitterParticle(target: ParticleEmitter, index: number): void;
53
+ export declare function reserveParticleEmitter(target: ParticleEmitter, capacity: number): void;
54
+ export declare function setParticleEmitterLocalBoundsRectangle(target: ParticleEmitter, rect: Readonly<Rectangle>): void;
55
+ /**
56
+ * Sets the full transform and id for particle `index`.
57
+ * No-ops when `index` is out of range (`[0, particleCount)`).
58
+ */
59
+ export declare function setParticleEmitterParticle(target: ParticleEmitter, index: number, id: number, x: number, y: number, rotation: number, scale: number): void;
60
+ /**
61
+ * Sets the alpha of particle `index`. No-ops when `index` is out of range.
62
+ */
63
+ export declare function setParticleEmitterParticleAlpha(target: ParticleEmitter, index: number, alpha: number): void;
64
+ /**
65
+ * Sets the color (r, g, b, 0–1 normalized) of particle `index`. No-ops when `index` is out of range.
66
+ */
67
+ export declare function setParticleEmitterParticleColor(target: ParticleEmitter, index: number, r: number, g: number, b: number): void;
68
+ /**
69
+ * Sets the velocity (vx, vy) of particle `index`. No-ops when `index` is out of range.
70
+ */
71
+ export declare function setParticleEmitterParticleVelocity(target: ParticleEmitter, index: number, vx: number, vy: number): void;
72
+ //# sourceMappingURL=particleEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particleEmitter.d.ts","sourceRoot":"","sources":["../src/particleEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,328 @@
1
+ import { createDisplayObjectGeneric, createDisplayObjectRuntime, getDisplayObjectRuntime, } from '@flighthq/displayobject';
2
+ import { copyRectangle, createRectangle, reserveFloat32Array, reserveUint16Array } from '@flighthq/geometry';
3
+ import { invalidateNodeLocalBounds } from '@flighthq/node';
4
+ import { ParticleEmitterKind } from '@flighthq/types';
5
+ // Internal stride constants. Hidden from callers so no raw array index math leaks out.
6
+ const PARTICLE_TRANSFORM_STRIDE = 4; // [x, y, rotation, scale] per particle
7
+ const PARTICLE_COLOR_STRIDE = 3; // [r, g, b] per particle
8
+ const PARTICLE_VELOCITY_STRIDE = 2; // [vx, vy] per particle
9
+ // Uint16Array sentinel marking a logically deleted slot in a particle emitter.
10
+ export const PARTICLE_EMITTER_DELETED_ID = 0xffff;
11
+ function copyLocalBoundsRectangle(out, source) {
12
+ const runtime = getDisplayObjectRuntime(source);
13
+ if (runtime.localBoundsRectangle !== null)
14
+ copyRectangle(out, runtime.localBoundsRectangle);
15
+ }
16
+ /**
17
+ * Appends a new particle at the end of `target`, auto-growing capacity via `reserveParticleEmitter`.
18
+ * Returns the new particle index. Color defaults to white (1, 1, 1) and alpha to 1.0 unless
19
+ * overridden with `setParticleEmitterParticleColor` / `setParticleEmitterParticleAlpha`.
20
+ */
21
+ export function appendParticleEmitterParticle(target, id, x, y, rotation, scale) {
22
+ const index = target.data.particleCount;
23
+ const needed = index + 1;
24
+ if (getParticleEmitterCapacity(target) < needed) {
25
+ const newCapacity = Math.max(needed, target.data.particleCount * 2 || 8);
26
+ reserveParticleEmitter(target, newCapacity);
27
+ }
28
+ target.data.particleCount = needed;
29
+ target.data.ids[index] = id;
30
+ const tt = index * PARTICLE_TRANSFORM_STRIDE;
31
+ target.data.transforms[tt] = x;
32
+ target.data.transforms[tt + 1] = y;
33
+ target.data.transforms[tt + 2] = rotation;
34
+ target.data.transforms[tt + 3] = scale;
35
+ target.data.alphas[index] = 1;
36
+ const ct = index * PARTICLE_COLOR_STRIDE;
37
+ target.data.colors[ct] = 1;
38
+ target.data.colors[ct + 1] = 1;
39
+ target.data.colors[ct + 2] = 1;
40
+ const vt = index * PARTICLE_VELOCITY_STRIDE;
41
+ target.data.velocities[vt] = 0;
42
+ target.data.velocities[vt + 1] = 0;
43
+ return index;
44
+ }
45
+ /** Sets `target.data.particleCount = 0`, keeping allocated capacity. */
46
+ export function clearParticleEmitter(target) {
47
+ target.data.particleCount = 0;
48
+ }
49
+ /**
50
+ * Deep-copies `source` into a new `ParticleEmitter` with independent typed arrays and a fresh runtime.
51
+ * The new emitter has the same `particleCount`, `atlas`, and `worldSpace` flag, but its
52
+ * `transforms`, `alphas`, `colors`, `ids`, and `velocities` are cloned typed arrays.
53
+ */
54
+ export function cloneParticleEmitter(source) {
55
+ const src = source.data;
56
+ return createParticleEmitter({
57
+ data: {
58
+ alphas: src.alphas.slice(),
59
+ atlas: src.atlas,
60
+ colors: src.colors.slice(),
61
+ ids: src.ids.slice(),
62
+ particleCount: src.particleCount,
63
+ transforms: src.transforms.slice(),
64
+ velocities: src.velocities.slice(),
65
+ worldSpace: src.worldSpace,
66
+ },
67
+ });
68
+ }
69
+ /**
70
+ * Compacts the particle buffer by removing entries whose id equals `0xffff` (the Uint16Array
71
+ * sentinel for logically deleted slots). Preserves the relative order of remaining entries.
72
+ * After compaction, `particleCount` equals the number of non-sentinel entries.
73
+ *
74
+ * Use after a series of swap-removes with manual id-zeroing when stable iteration order is needed.
75
+ * For simple swap-remove workflows, compaction is not required.
76
+ */
77
+ export function compactParticleEmitter(target) {
78
+ const data = target.data;
79
+ if (data.particleCount === 0)
80
+ return;
81
+ let write = 0;
82
+ for (let read = 0; read < data.particleCount; read++) {
83
+ if (data.ids[read] === PARTICLE_EMITTER_DELETED_ID)
84
+ continue;
85
+ if (write !== read) {
86
+ data.ids[write] = data.ids[read];
87
+ const tt = write * PARTICLE_TRANSFORM_STRIDE;
88
+ const tts = read * PARTICLE_TRANSFORM_STRIDE;
89
+ data.transforms[tt] = data.transforms[tts];
90
+ data.transforms[tt + 1] = data.transforms[tts + 1];
91
+ data.transforms[tt + 2] = data.transforms[tts + 2];
92
+ data.transforms[tt + 3] = data.transforms[tts + 3];
93
+ data.alphas[write] = data.alphas[read];
94
+ const ct = write * PARTICLE_COLOR_STRIDE;
95
+ const cts = read * PARTICLE_COLOR_STRIDE;
96
+ data.colors[ct] = data.colors[cts];
97
+ data.colors[ct + 1] = data.colors[cts + 1];
98
+ data.colors[ct + 2] = data.colors[cts + 2];
99
+ const vt = write * PARTICLE_VELOCITY_STRIDE;
100
+ const vts = read * PARTICLE_VELOCITY_STRIDE;
101
+ data.velocities[vt] = data.velocities[vts];
102
+ data.velocities[vt + 1] = data.velocities[vts + 1];
103
+ }
104
+ write++;
105
+ }
106
+ data.particleCount = write;
107
+ }
108
+ export function computeParticleEmitterLocalBoundsRectangle(out, source) {
109
+ const { atlas, ids, particleCount, transforms } = source.data;
110
+ if (atlas === null || particleCount === 0) {
111
+ out.x = 0;
112
+ out.y = 0;
113
+ out.width = 0;
114
+ out.height = 0;
115
+ return;
116
+ }
117
+ const regions = atlas.regions;
118
+ const numRegions = regions.length;
119
+ let minX = Infinity;
120
+ let minY = Infinity;
121
+ let maxX = -Infinity;
122
+ let maxY = -Infinity;
123
+ for (let i = 0; i < particleCount; i++) {
124
+ const id = ids[i];
125
+ if (id < 0 || id >= numRegions)
126
+ continue;
127
+ const region = regions[id];
128
+ if (region.width <= 0 || region.height <= 0)
129
+ continue;
130
+ const tt = i * PARTICLE_TRANSFORM_STRIDE;
131
+ const px = transforms[tt];
132
+ const py = transforms[tt + 1];
133
+ const rotation = transforms[tt + 2];
134
+ const scale = transforms[tt + 3];
135
+ const cosR = Math.cos(rotation) * scale;
136
+ const sinR = Math.sin(rotation) * scale;
137
+ const w = region.width;
138
+ const h = region.height;
139
+ // Four corners of the quad at local (0,0)-(w,h) after rotate+scale+translate
140
+ const x0 = px;
141
+ const y0 = py;
142
+ const x1 = cosR * w + px;
143
+ const y1 = sinR * w + py;
144
+ const x2 = cosR * w - sinR * h + px;
145
+ const y2 = sinR * w + cosR * h + py;
146
+ const x3 = -sinR * h + px;
147
+ const y3 = cosR * h + py;
148
+ const qMinX = Math.min(x0, x1, x2, x3);
149
+ const qMinY = Math.min(y0, y1, y2, y3);
150
+ const qMaxX = Math.max(x0, x1, x2, x3);
151
+ const qMaxY = Math.max(y0, y1, y2, y3);
152
+ if (qMinX < minX)
153
+ minX = qMinX;
154
+ if (qMinY < minY)
155
+ minY = qMinY;
156
+ if (qMaxX > maxX)
157
+ maxX = qMaxX;
158
+ if (qMaxY > maxY)
159
+ maxY = qMaxY;
160
+ }
161
+ if (minX === Infinity) {
162
+ out.x = 0;
163
+ out.y = 0;
164
+ out.width = 0;
165
+ out.height = 0;
166
+ }
167
+ else {
168
+ out.x = minX;
169
+ out.y = minY;
170
+ out.width = maxX - minX;
171
+ out.height = maxY - minY;
172
+ }
173
+ }
174
+ export function createParticleEmitter(obj) {
175
+ return createDisplayObjectGeneric(ParticleEmitterKind, obj, createParticleEmitterData, createParticleEmitterRuntime);
176
+ }
177
+ export function createParticleEmitterData(data) {
178
+ return {
179
+ alphas: data?.alphas ?? new Float32Array(),
180
+ atlas: data?.atlas ?? null,
181
+ colors: data?.colors ?? new Float32Array(),
182
+ ids: data?.ids ?? new Uint16Array(),
183
+ particleCount: data?.particleCount ?? 0,
184
+ transforms: data?.transforms ?? new Float32Array(),
185
+ velocities: data?.velocities ?? new Float32Array(),
186
+ worldSpace: data?.worldSpace ?? false,
187
+ };
188
+ }
189
+ export function createParticleEmitterRuntime() {
190
+ const runtime = createDisplayObjectRuntime(defaultMethods);
191
+ runtime.localBoundsRectangle = null;
192
+ return runtime;
193
+ }
194
+ export function getParticleEmitterCapacity(source) {
195
+ const data = source.data;
196
+ const transformCapacity = (data.transforms.length / PARTICLE_TRANSFORM_STRIDE) | 0;
197
+ return Math.min(data.ids.length, data.alphas.length, transformCapacity);
198
+ }
199
+ /**
200
+ * Returns the alpha of particle `index`, or -1 when `index` is out of range.
201
+ * Bounds-checked against `particleCount`.
202
+ */
203
+ export function getParticleEmitterParticleAlpha(source, index) {
204
+ if (index < 0 || index >= source.data.particleCount)
205
+ return -1;
206
+ return source.data.alphas[index];
207
+ }
208
+ /**
209
+ * Returns the region id of particle `index`, or -1 when `index` is out of range.
210
+ * Bounds-checked against `particleCount`.
211
+ */
212
+ export function getParticleEmitterParticleId(source, index) {
213
+ if (index < 0 || index >= source.data.particleCount)
214
+ return -1;
215
+ return source.data.ids[index];
216
+ }
217
+ /**
218
+ * Writes the velocity (vx, vy) of particle `index` into `out.x` and `out.y`.
219
+ * Returns false and writes nothing when `index` is out of range.
220
+ */
221
+ export function getParticleEmitterParticleVelocity(out, source, index) {
222
+ if (index < 0 || index >= source.data.particleCount)
223
+ return false;
224
+ const vt = index * PARTICLE_VELOCITY_STRIDE;
225
+ out.x = source.data.velocities[vt];
226
+ out.y = source.data.velocities[vt + 1];
227
+ return true;
228
+ }
229
+ export function getParticleEmitterRuntime(source) {
230
+ return getDisplayObjectRuntime(source);
231
+ }
232
+ /**
233
+ * Swap-removes particle `index` with the last particle (O(1)), decrementing `particleCount`.
234
+ * Does not preserve order — the particle that was at `particleCount-1` moves to `index`.
235
+ * No-ops when `index` is out of range.
236
+ */
237
+ export function removeParticleEmitterParticle(target, index) {
238
+ const data = target.data;
239
+ const last = data.particleCount - 1;
240
+ if (index < 0 || index > last)
241
+ return;
242
+ if (index < last) {
243
+ // Swap all buffers: id, transform, alpha, color, velocity
244
+ data.ids[index] = data.ids[last];
245
+ const tt = index * PARTICLE_TRANSFORM_STRIDE;
246
+ const tts = last * PARTICLE_TRANSFORM_STRIDE;
247
+ data.transforms[tt] = data.transforms[tts];
248
+ data.transforms[tt + 1] = data.transforms[tts + 1];
249
+ data.transforms[tt + 2] = data.transforms[tts + 2];
250
+ data.transforms[tt + 3] = data.transforms[tts + 3];
251
+ data.alphas[index] = data.alphas[last];
252
+ const ct = index * PARTICLE_COLOR_STRIDE;
253
+ const cts = last * PARTICLE_COLOR_STRIDE;
254
+ data.colors[ct] = data.colors[cts];
255
+ data.colors[ct + 1] = data.colors[cts + 1];
256
+ data.colors[ct + 2] = data.colors[cts + 2];
257
+ const vt = index * PARTICLE_VELOCITY_STRIDE;
258
+ const vts = last * PARTICLE_VELOCITY_STRIDE;
259
+ data.velocities[vt] = data.velocities[vts];
260
+ data.velocities[vt + 1] = data.velocities[vts + 1];
261
+ }
262
+ data.particleCount = last;
263
+ }
264
+ export function reserveParticleEmitter(target, capacity) {
265
+ if (getParticleEmitterCapacity(target) >= capacity)
266
+ return;
267
+ const data = target.data;
268
+ data.alphas = reserveFloat32Array(data.alphas, capacity);
269
+ data.colors = reserveFloat32Array(data.colors, capacity * 3);
270
+ data.ids = reserveUint16Array(data.ids, capacity);
271
+ data.transforms = reserveFloat32Array(data.transforms, capacity * PARTICLE_TRANSFORM_STRIDE);
272
+ data.velocities = reserveFloat32Array(data.velocities, capacity * 2);
273
+ }
274
+ export function setParticleEmitterLocalBoundsRectangle(target, rect) {
275
+ const runtime = getDisplayObjectRuntime(target);
276
+ if (runtime.localBoundsRectangle === null)
277
+ runtime.localBoundsRectangle = createRectangle();
278
+ copyRectangle(runtime.localBoundsRectangle, rect);
279
+ invalidateNodeLocalBounds(target);
280
+ }
281
+ /**
282
+ * Sets the full transform and id for particle `index`.
283
+ * No-ops when `index` is out of range (`[0, particleCount)`).
284
+ */
285
+ export function setParticleEmitterParticle(target, index, id, x, y, rotation, scale) {
286
+ const data = target.data;
287
+ if (index < 0 || index >= data.particleCount)
288
+ return;
289
+ data.ids[index] = id;
290
+ const tt = index * PARTICLE_TRANSFORM_STRIDE;
291
+ data.transforms[tt] = x;
292
+ data.transforms[tt + 1] = y;
293
+ data.transforms[tt + 2] = rotation;
294
+ data.transforms[tt + 3] = scale;
295
+ }
296
+ /**
297
+ * Sets the alpha of particle `index`. No-ops when `index` is out of range.
298
+ */
299
+ export function setParticleEmitterParticleAlpha(target, index, alpha) {
300
+ if (index < 0 || index >= target.data.particleCount)
301
+ return;
302
+ target.data.alphas[index] = alpha;
303
+ }
304
+ /**
305
+ * Sets the color (r, g, b, 0–1 normalized) of particle `index`. No-ops when `index` is out of range.
306
+ */
307
+ export function setParticleEmitterParticleColor(target, index, r, g, b) {
308
+ if (index < 0 || index >= target.data.particleCount)
309
+ return;
310
+ const ct = index * PARTICLE_COLOR_STRIDE;
311
+ target.data.colors[ct] = r;
312
+ target.data.colors[ct + 1] = g;
313
+ target.data.colors[ct + 2] = b;
314
+ }
315
+ /**
316
+ * Sets the velocity (vx, vy) of particle `index`. No-ops when `index` is out of range.
317
+ */
318
+ export function setParticleEmitterParticleVelocity(target, index, vx, vy) {
319
+ if (index < 0 || index >= target.data.particleCount)
320
+ return;
321
+ const vt = index * PARTICLE_VELOCITY_STRIDE;
322
+ target.data.velocities[vt] = vx;
323
+ target.data.velocities[vt + 1] = vy;
324
+ }
325
+ const defaultMethods = {
326
+ computeLocalBoundsRectangle: copyLocalBoundsRectangle,
327
+ };
328
+ //# sourceMappingURL=particleEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particleEmitter.js","sourceRoot":"","sources":["../src/particleEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ParticleEmitter } from '@flighthq/types';
2
+ import type { ParticleEmitterConfig, ParticleEmitterState } from '@flighthq/types';
3
+ import type { ParticleEmitterCallbacks, WorldTransform2D } from './updateParticleEmitter';
4
+ export declare function prewarmParticleEmitter(emitter: ParticleEmitter, state: ParticleEmitterState, config: Readonly<ParticleEmitterConfig>, duration: number, stepDeltaTime?: number, callbacks?: ParticleEmitterCallbacks, worldTransform?: Readonly<WorldTransform2D>): void;
5
+ //# sourceMappingURL=prewarmParticleEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prewarmParticleEmitter.d.ts","sourceRoot":"","sources":["../src/prewarmParticleEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG1F,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,aAAa,SAAS,EACtB,SAAS,CAAC,EAAE,wBAAwB,EACpC,cAAc,CAAC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAC1C,IAAI,CAUN"}
@@ -0,0 +1,13 @@
1
+ import { updateParticleEmitter } from './updateParticleEmitter';
2
+ export function prewarmParticleEmitter(emitter, state, config, duration, stepDeltaTime = 1 / 60, callbacks, worldTransform) {
3
+ // A non-positive step would never advance `elapsed`, spinning forever; fall back
4
+ // to a single step covering the whole duration instead of hanging.
5
+ const step = stepDeltaTime > 0 ? stepDeltaTime : duration;
6
+ let elapsed = 0;
7
+ while (elapsed < duration) {
8
+ const deltaTime = Math.min(step, duration - elapsed);
9
+ updateParticleEmitter(emitter, state, config, deltaTime, callbacks, worldTransform);
10
+ elapsed += deltaTime;
11
+ }
12
+ }
13
+ //# sourceMappingURL=prewarmParticleEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prewarmParticleEmitter.js","sourceRoot":"","sources":["../src/prewarmParticleEmitter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,UAAU,sBAAsB,CACpC,OAAwB,EACxB,KAA2B,EAC3B,MAAuC,EACvC,QAAgB,EAChB,aAAa,GAAG,CAAC,GAAG,EAAE,EACtB,SAAoC,EACpC,cAA2C;IAE3C,iFAAiF;IACjF,mEAAmE;IACnE,MAAM,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;QACrD,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;QACpF,OAAO,IAAI,SAAS,CAAC;IACvB,CAAC;AACH,CAAC"}