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 +237 -2
- package/dist/index.js +1187 -2
- package/package.json +1 -1
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?:
|
|
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
|
-
|
|
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 };
|