core-vfx 0.0.10 → 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.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as zustand_vanilla from 'zustand/vanilla';
2
2
  import * as THREE from 'three/webgpu';
3
3
  import { Node, StorageBufferNode } from 'three/webgpu';
4
+ import { Quaternion } from 'three';
4
5
 
5
6
  type ParticleSystemRef = {
6
7
  spawn: (x: number, y: number, z: number, count: number, overrides?: Record<string, unknown> | null) => void;
@@ -133,6 +134,101 @@ type StretchConfig = {
133
134
  factor: number;
134
135
  maxStretch: number;
135
136
  } | null;
137
+ type NormalizedParticleProps = {
138
+ maxParticles: number;
139
+ sizeRange: [number, number];
140
+ speedRange: [number, number];
141
+ fadeSizeRange: [number, number];
142
+ fadeOpacityRange: [number, number];
143
+ lifetimeRange: [number, number];
144
+ gravity: [number, number, number];
145
+ direction3D: [[number, number], [number, number], [number, number]];
146
+ startPosition3D: [[number, number], [number, number], [number, number]];
147
+ rotation3D: [[number, number], [number, number], [number, number]];
148
+ rotationSpeed3D: [[number, number], [number, number], [number, number]];
149
+ frictionIntensityRange: [number, number];
150
+ frictionEasingType: number;
151
+ startColors: [number, number, number][];
152
+ endColors: [number, number, number][];
153
+ colorStartCount: number;
154
+ colorEndCount: number;
155
+ emitterRadiusRange: [number, number];
156
+ emitterHeightRange: [number, number];
157
+ intensity: number;
158
+ position: [number, number, number];
159
+ autoStart: boolean;
160
+ delay: number;
161
+ emitCount: number;
162
+ emitterShape: number;
163
+ emitterAngle: number;
164
+ emitterSurfaceOnly: boolean;
165
+ emitterDirection: [number, number, number];
166
+ turbulence: TurbulenceConfig;
167
+ attractors: AttractorConfig[] | null;
168
+ attractToCenter: boolean;
169
+ startPositionAsDirection: boolean;
170
+ softParticles: boolean;
171
+ softDistance: number;
172
+ collision: CollisionConfig;
173
+ appearance: string;
174
+ alphaMap: THREE.Texture | null;
175
+ flipbook: FlipbookConfig;
176
+ rotation: Rotation3DInput;
177
+ rotationSpeed: Rotation3DInput;
178
+ geometry: THREE.BufferGeometry | null;
179
+ orientToDirection: boolean;
180
+ orientAxis: string;
181
+ stretchBySpeed: StretchConfig;
182
+ lighting: string;
183
+ shadow: boolean;
184
+ blending: THREE.Blending;
185
+ depthTest: boolean;
186
+ renderOrder: number;
187
+ colorStart: string[];
188
+ colorEnd: string[] | null;
189
+ size: number | [number, number];
190
+ speed: number | [number, number];
191
+ fadeSize: number | [number, number];
192
+ fadeOpacity: number | [number, number];
193
+ lifetime: number | [number, number];
194
+ direction: Rotation3DInput;
195
+ startPosition: Rotation3DInput;
196
+ friction: FrictionConfig;
197
+ emitterRadius: number | [number, number];
198
+ emitterHeight: number | [number, number];
199
+ };
200
+ type VFXParticleSystemOptions = BaseParticleProps & {
201
+ /** TSL node or function for backdrop sampling */
202
+ backdropNode?: any | ((data: ParticleData) => any) | null;
203
+ /** TSL node or function for custom opacity */
204
+ opacityNode?: any | ((data: ParticleData) => any) | null;
205
+ /** TSL node or function to override color */
206
+ colorNode?: any | ((data: ParticleData, defaultColor: any) => any) | null;
207
+ /** TSL node or function for alpha test/discard */
208
+ alphaTestNode?: any | ((data: ParticleData) => any) | null;
209
+ /** TSL node or function for shadow map output */
210
+ castShadowNode?: any | ((data: ParticleData) => any) | null;
211
+ /** Depth test */
212
+ depthTest?: boolean;
213
+ /** Render order (higher values render on top) */
214
+ renderOrder?: number;
215
+ /** Path to pre-baked curve texture (skips runtime baking for faster load) */
216
+ curveTexturePath?: string | null;
217
+ };
218
+ type EmitterControllerOptions = {
219
+ emitCount?: number;
220
+ delay?: number;
221
+ autoStart?: boolean;
222
+ loop?: boolean;
223
+ localDirection?: boolean;
224
+ direction?: [[number, number], [number, number], [number, number]];
225
+ overrides?: Record<string, any> | null;
226
+ onEmit?: (params: {
227
+ position: [number, number, number] | number[];
228
+ count: number;
229
+ direction: any;
230
+ }) => void;
231
+ };
136
232
  type BaseParticleProps = {
137
233
  /** Maximum number of particles */
138
234
  maxParticles?: number;
@@ -189,7 +285,7 @@ type BaseParticleProps = {
189
285
  /** Enable shadows on geometry instances */
190
286
  shadow?: boolean;
191
287
  /** Blending mode */
192
- blending?: (typeof Blending)[keyof typeof Blending];
288
+ blending?: THREE.Blending;
193
289
  /** Color intensity multiplier */
194
290
  intensity?: number;
195
291
  /** Emitter position [x, y, z] */
@@ -228,12 +324,16 @@ type BaseParticleProps = {
228
324
  collision?: CollisionConfig;
229
325
  };
230
326
 
327
+ declare const isWebGPUBackend: (renderer: unknown) => boolean;
231
328
  declare const hexToRgb: (hex: string) => [number, number, number];
232
329
  declare const toRange: (value: number | [number, number] | null | undefined, defaultVal?: [number, number]) => [number, number];
233
330
  declare const easingToType: (easing: string | number | undefined) => number;
234
331
  declare const axisToNumber: (axis: string) => number;
235
332
  declare const toRotation3D: (value: number | [number, number] | [[number, number], [number, number], [number, number]] | null | undefined) => [[number, number], [number, number], [number, number]];
236
333
  declare const lifetimeToFadeRate: (seconds: number) => number;
334
+ declare const isNonDefaultRotation: (r: number | [number, number] | [[number, number], [number, number], [number, number]] | null | undefined) => boolean;
335
+
336
+ declare const normalizeProps: (props: BaseParticleProps) => NormalizedParticleProps;
237
337
 
238
338
  /**
239
339
  * Channel bitmask for curve texture .bin files.
@@ -273,12 +373,34 @@ declare const createDefaultCurveTexture: () => THREE.DataTexture;
273
373
  * Only active channels contain baked curve data; inactive channels get default 1→0.
274
374
  */
275
375
  declare const buildCurveTextureBin: (sizeCurve: CurveData | null, opacityCurve: CurveData | null, velocityCurve: CurveData | null, rotationSpeedCurve: CurveData | null) => ArrayBuffer;
376
+ type CurveTextureResolved = {
377
+ texture: THREE.DataTexture;
378
+ sizeEnabled: boolean;
379
+ opacityEnabled: boolean;
380
+ velocityEnabled: boolean;
381
+ rotationSpeedEnabled: boolean;
382
+ };
276
383
  /**
277
384
  * Load a pre-baked curve texture from a .bin file.
278
385
  * Supports both old format (raw 256*4 floats, all channels active)
279
386
  * and new format (4-float header + 256*4 floats with channel bitmask).
280
387
  */
281
388
  declare const loadCurveTextureFromPath: (path: string) => Promise<CurveTextureResult>;
389
+ /**
390
+ * Resolve a curve texture from either a .bin path or inline curve data.
391
+ *
392
+ * Priority:
393
+ * 1. curveTexturePath → load from .bin file (with fallback to baking on error)
394
+ * 2. Inline curve data → bake synchronously
395
+ * 3. No curves → default 1→0 texture
396
+ */
397
+ declare const resolveCurveTexture: (options: {
398
+ fadeSizeCurve?: CurveData | null;
399
+ fadeOpacityCurve?: CurveData | null;
400
+ velocityCurve?: CurveData | null;
401
+ rotationSpeedCurve?: CurveData | null;
402
+ curveTexturePath?: string | null;
403
+ }) => Promise<CurveTextureResolved>;
282
404
 
283
405
  type ParticleStorageArrays = {
284
406
  positions: StorageBufferNode;
@@ -297,6 +419,8 @@ type ShaderFeatures = {
297
419
  collision: boolean;
298
420
  rotation: boolean;
299
421
  perParticleColor: boolean;
422
+ needsPerParticleColor: boolean;
423
+ needsRotation: boolean;
300
424
  };
301
425
  type MaterialOptions = {
302
426
  alphaMap: THREE.Texture | null;
@@ -345,4 +469,115 @@ declare const createUpdateCompute: (storage: ParticleStorageArrays, uniforms: Pa
345
469
  */
346
470
  declare const createParticleMaterial: (storage: ParticleStorageArrays, uniforms: ParticleUniforms, curveTexture: THREE.DataTexture, options: MaterialOptions) => THREE.SpriteNodeMaterial | THREE.MeshBasicNodeMaterial | THREE.MeshStandardNodeMaterial | THREE.MeshPhysicalNodeMaterial;
347
471
 
348
- export { Appearance, type AttractorConfig, AttractorType, type BaseParticleProps, Blending, CURVE_RESOLUTION, type CollisionConfig, type CoreState, CurveChannel, type CurveData, type CurvePoint, type CurveTextureResult, DEFAULT_LINEAR_CURVE, Easing, EmitterShape, type FlipbookConfig, type FrictionConfig, Lighting, MAX_ATTRACTORS, type MaterialOptions, type ParticleData, type ParticleStorageArrays, type ParticleUniforms, type Rotation3DInput, type ShaderFeatures, type StretchConfig, type TurbulenceConfig, axisToNumber, bakeCurveToArray, buildCurveTextureBin, coreStore, createCombinedCurveTexture, createDefaultCurveTexture, createInitCompute, createParticleMaterial, createSpawnCompute, createUpdateCompute, easingToType, evaluateBezierSegment, hexToRgb, lifetimeToFadeRate, loadCurveTextureFromPath, sampleCurveAtX, selectColor, toRange, toRotation3D };
472
+ declare function createUniforms(props: NormalizedParticleProps): ParticleUniforms;
473
+ declare function updateUniforms(uniforms: ParticleUniforms, props: NormalizedParticleProps): void;
474
+ declare function updateUniformsPartial(uniforms: ParticleUniforms, rawProps: Record<string, any>): void;
475
+ declare function updateUniformsCurveFlags(uniforms: ParticleUniforms, flags: {
476
+ fadeSizeCurveEnabled: boolean;
477
+ fadeOpacityCurveEnabled: boolean;
478
+ velocityCurveEnabled: boolean;
479
+ rotationSpeedCurveEnabled: boolean;
480
+ }): void;
481
+ declare function applySpawnOverrides(uniforms: ParticleUniforms, overrides: Record<string, any> | null): (() => void) | null;
482
+
483
+ declare const STRUCTURAL_KEYS: readonly ["maxParticles", "lighting", "appearance", "shadow", "orientToDirection"];
484
+ declare function resolveFeatures(props: {
485
+ colorStart?: string[];
486
+ colorEnd?: string[] | null;
487
+ rotation?: Rotation3DInput;
488
+ rotationSpeed?: Rotation3DInput;
489
+ turbulence?: {
490
+ intensity: number;
491
+ frequency?: number;
492
+ speed?: number;
493
+ } | null;
494
+ attractors?: Array<{
495
+ position?: [number, number, number];
496
+ strength?: number;
497
+ radius?: number;
498
+ type?: 'point' | 'vortex';
499
+ axis?: [number, number, number];
500
+ }> | null;
501
+ collision?: {
502
+ plane?: {
503
+ y: number;
504
+ };
505
+ bounce?: number;
506
+ friction?: number;
507
+ die?: boolean;
508
+ sizeBasedGravity?: number;
509
+ } | null;
510
+ }): ShaderFeatures;
511
+ declare function needsRecreation(currentFeatures: ShaderFeatures, changedProps: Record<string, any>, mergedConfig: Record<string, any>): boolean;
512
+ declare function createStorageArrays(maxParticles: number, features: ShaderFeatures): ParticleStorageArrays;
513
+ declare function createRenderObject(geometry: THREE.BufferGeometry | null, material: THREE.Material, maxParticles: number, shadow: boolean): THREE.Sprite | THREE.InstancedMesh;
514
+
515
+ declare class VFXParticleSystem {
516
+ readonly uniforms: ParticleUniforms;
517
+ readonly storage: ParticleStorageArrays;
518
+ readonly features: ShaderFeatures;
519
+ renderObject: THREE.Sprite | THREE.InstancedMesh;
520
+ material: THREE.Material;
521
+ curveTexture: THREE.DataTexture;
522
+ computeInit: any;
523
+ computeSpawn: any;
524
+ computeUpdate: any;
525
+ readonly options: VFXParticleSystemOptions;
526
+ readonly normalizedProps: NormalizedParticleProps;
527
+ private renderer;
528
+ nextIndex: number;
529
+ initialized: boolean;
530
+ isEmitting: boolean;
531
+ private emitAccumulator;
532
+ private turbulenceSpeed;
533
+ position: [number, number, number];
534
+ constructor(renderer: THREE.WebGPURenderer, options: VFXParticleSystemOptions);
535
+ init(): Promise<void>;
536
+ dispose(): void;
537
+ spawn(x: number, y: number, z: number, count?: number, overrides?: Record<string, unknown> | null): void;
538
+ update(delta: number): Promise<void>;
539
+ autoEmit(delta: number): void;
540
+ start(): void;
541
+ stop(): void;
542
+ clear(): void;
543
+ updateProps(props: Partial<BaseParticleProps>): void;
544
+ setPosition(position: [number, number, number]): void;
545
+ setDelay(delay: number): void;
546
+ setEmitCount(emitCount: number): void;
547
+ setTurbulenceSpeed(speed: number): void;
548
+ setCurveTexture(texture: THREE.DataTexture): void;
549
+ }
550
+
551
+ declare class EmitterController {
552
+ private system;
553
+ isEmitting: boolean;
554
+ private emitAccumulator;
555
+ private hasEmittedOnce;
556
+ private options;
557
+ constructor(options: EmitterControllerOptions);
558
+ setSystem(system: ParticleSystemRef | null): void;
559
+ getSystem(): ParticleSystemRef | null;
560
+ updateOptions(options: Partial<EmitterControllerOptions>): void;
561
+ transformDirectionByQuat(dirRange: [[number, number], [number, number], [number, number]], quat: Quaternion): [[number, number], [number, number], [number, number]];
562
+ update(delta: number, worldPosition: {
563
+ x: number;
564
+ y: number;
565
+ z: number;
566
+ }, worldQuaternion?: Quaternion): void;
567
+ emit(emitOverrides?: Record<string, unknown> | null): boolean;
568
+ emitAtPosition(worldPosition: {
569
+ x: number;
570
+ y: number;
571
+ z: number;
572
+ }, worldQuaternion?: Quaternion, emitOverrides?: Record<string, unknown> | null): boolean;
573
+ burst(count: number, worldPosition: {
574
+ x: number;
575
+ y: number;
576
+ z: number;
577
+ }, worldQuaternion?: Quaternion): boolean;
578
+ start(): void;
579
+ stop(): void;
580
+ private doEmit;
581
+ }
582
+
583
+ export { Appearance, type AttractorConfig, AttractorType, type BaseParticleProps, Blending, CURVE_RESOLUTION, type CollisionConfig, type CoreState, CurveChannel, type CurveData, type CurvePoint, type CurveTextureResolved, type CurveTextureResult, DEFAULT_LINEAR_CURVE, Easing, EmitterController, type EmitterControllerOptions, EmitterShape, type FlipbookConfig, type FrictionConfig, Lighting, MAX_ATTRACTORS, type MaterialOptions, type NormalizedParticleProps, type ParticleData, type ParticleStorageArrays, type ParticleSystemRef, type ParticleUniforms, type Rotation3DInput, STRUCTURAL_KEYS, type ShaderFeatures, type StretchConfig, type TurbulenceConfig, VFXParticleSystem, type VFXParticleSystemOptions, applySpawnOverrides, axisToNumber, bakeCurveToArray, buildCurveTextureBin, coreStore, createCombinedCurveTexture, createDefaultCurveTexture, createInitCompute, createParticleMaterial, createRenderObject, createSpawnCompute, createStorageArrays, createUniforms, createUpdateCompute, easingToType, evaluateBezierSegment, hexToRgb, isNonDefaultRotation, isWebGPUBackend, lifetimeToFadeRate, loadCurveTextureFromPath, needsRecreation, normalizeProps, resolveCurveTexture, resolveFeatures, sampleCurveAtX, selectColor, toRange, toRotation3D, updateUniforms, updateUniformsCurveFlags, updateUniformsPartial };