Skip to content
v0.1.0
IntroductionMeet the engine, its two packages, and the requirements for running GPU particles.Quick startCreate an effect, bind its artwork, and add particles to your Pixi stage.Configuration guideUnderstand effect fields, defaults, and their live experiments.Pixi textures & animationBind artwork and configure flipbooks in the Pixi integration.How effects workUnderstand emitters, coordinate spaces, playback, and the simulation lifecycle.CurvesShape properties over time and understand the clocks and units behind each value.DevelopmentSet up the repository, run the site and examples, and check your changes.Particle architectureUnderstand shader generation, particle storage, and resource ownership.OverviewAPI reference@reparticle/coreAPI referenceCurveAPI referenceCURVE_SEGMENTSAPI referenceCurvePointAPI referenceEffectConfigAPI referenceeffectConfigSchemaAPI referenceEffectInputAPI referenceEffectTransformAPI referenceEmitterAPI referenceEmitterConfigAPI referenceemitterConfigSchemaAPI referenceEmitterContextAPI referenceEmitterInputAPI referenceEmitterParametersAPI referenceEmitterPlaybackAPI referenceEmitterStateAPI referenceEmitterStateChangeAPI referenceEmitterStateListenerAPI referenceModifierConfigAPI referenceparseEffectConfigAPI referenceParticleBlendModeAPI referenceParticleLifetimeVisitorAPI referenceParticleSlotsAPI referenceParticleTintAPI referenceprewarmAPI referencepropertyVariationAPI referenceRenderingConfigAPI referenceRenderingInputAPI referencerenderingSchemaAPI referencesampleCurveAPI referenceSampledCurveAPI referenceScalarPropertyAPI referenceSpawnRateAPI referenceSpawnScheduleAPI referenceStopOptionsAPI referenceTransformAPI reference@reparticle/pixiAPI referenceAnimationFramesAPI referenceAnimationPlaybackAPI referenceAnimationSizeAPI referenceEffectInputAPI referenceEmitterParametersAPI referenceParticleBlendModeAPI referenceParticleEffectAPI referenceParticleEffectOptionsAPI referenceParticlePivotAPI referenceParticleRenderingAPI referenceParticleSizeModeAPI referenceParticleStateChangeAPI referenceParticleStateListenerAPI referenceParticleTextureAPI referenceParticleTintAPI referenceRenderingConfigAPI referencevalidateAnimationFramesAPI referenceEmitter: IdUnique emitter identifier within this effect. Use it to look up the emitter and bind its artwork. Renaming it does not change motion.Emitter: CapacityMaximum simultaneous particles for this emitter. When all slots are occupied, excess births are dropped and living particles are preserved. Try 64 to see the stream run out of free slots.Emitter: SeedDeterministic random seed. The same definition and playback steps reproduce the same variation. Changing the seed changes the pattern, not the configured ranges.Playback: PlaybackEmission cycle mode, duration, and duration spread. Once emits for one cycle; loop repeats. Restart to observe randomized cycle timing.Playback: Start DelayDelay before emission starts, with random variation around that delay. Restart to observe the timing.Playback: Start OffsetPrewarm the effect by advancing simulation before displaying its first frame. This performs real simulation work in fixed 1/60-second steps. Compare zero with two seconds.Transform: TransformEmitter position, rotation, and uniform scale relative to the effect. Adjust these together to place and size the emitter.Transform: SpaceWorld particles stay behind when the effect moves. Local particles follow its transform. The experiment moves the whole effect so the difference is visible.Transform: Inherit VelocityAmount of emitter movement velocity added to newborn particles. Zero adds none; one inherits the full measured velocity. Existing particles keep their own motion.Appearance: OrientationChoose fixed rotation, alignment with the initial direction, alignment with current movement, or integrated angular velocity. The rectangular artwork makes the orientation visible.Appearance: Stretch With VelocityScale Y stretch by particle speed, using a fixed 60 FPS shutter factor. It needs nonzero stretchY; it does not stretch particles by itself.Emission: RateBirths requested per second and their random rate spread. Capacity limits how many particles can stay alive. Changing spread restarts playback; numeric rate changes apply live.Emission: ShapeSpawn from a point, a filled circle, a box, or a 2D cone. Each shape has its own valid fields. Change the JSON type and dimensions together.Emission: Shape typeSelect the shape. Point has no dimensions; circle uses diameter; box and cone2d use width and height. The preview supplies dimensions for the selected shape.Emission: Shape diameterCircle diameter and its random variation. Births sample the filled circle; each dimension accepts a constant or an emitter-lifetime curve.Initial properties: DirectionPoint-emitter direction and the full angular spread around it, in radians. Zero spread produces a straight stream; 2π distributes directions all around.Rendering: RenderingBlend mode controls how particles combine with the scene: normal, add, multiply, or screen. Tint applies emitter-wide red, green, blue, and alpha multipliers. One leaves a channel unchanged; zero removes it. Changes affect existing particles immediately.Effect: VersionConfiguration format version. The current schema accepts only 1. This is a compatibility marker, not a visual setting.Effect: EmittersNonempty list of emitters. Each must have a unique ID, capacity, seed, emission settings, and required initial values. Add another emitter to combine effects.Emission: Shape dimensionsWidth and height of a box or cone emitter, with independent spread for each dimension. Constants and emitter-lifetime curves are supported. This experiment uses a box.Initial properties: LifetimeSeconds each particle remains alive. Longer lifetimes require more capacity at the same emission rate. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: SpeedInitial velocity magnitude. Changing it affects new particles; modifiers change velocity afterward. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: SizeParticle size in manual texture sizing mode. Initial size is multiplied by overLifetime.scale. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: RotationInitial particle rotation. Positive angles turn counterclockwise. It is added to orientation and lifetime rotation. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: Angular VelocitySpin speed used by angular-velocity orientation. Integrated over simulation time. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: StretchAdditional horizontal and vertical stretch at birth. Zero keeps the original dimension; one doubles it. Each axis accepts a number or an emitter-lifetime curve. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: ColorBirth color as red, green, and blue channels from 0 to 1. Each channel accepts a number or an emitter-lifetime curve. Lifetime color and rendering tint multiply this color afterward. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Initial properties: AlphaInitial opacity, multiplied by lifetime alpha, emitter tint, and display-object alpha. Accepts a number or a curve sampled at birth using normalized emitter lifetime. Spread adds independent random variation around each birth value. Zero keeps that value unchanged.Over lifetime: ScaleMultiplies the particle’s initial size. A number stays constant; a curve follows each particle from birth at time 0 to expiration at time 1.Over lifetime: StretchHorizontal and vertical stretch added to birth stretch as particles age. Constants and particle-lifetime curves are supported.Over lifetime: RotationAdded to the particle’s initial rotation. A number stays constant; a curve follows each particle from birth at time 0 to expiration at time 1.Over lifetime: Angular VelocityMultiplies the particle’s initial angularVelocity. A number stays constant; a curve follows each particle from birth at time 0 to expiration at time 1.Over lifetime: ColorRed, green, and blue multipliers over each particle’s lifetime. Use curves to change color from birth at time 0 to expiration at time 1.Over lifetime: AlphaMultiplies the particle’s initial alpha. A number stays constant; a curve follows each particle from birth at time 0 to expiration at time 1.Modifiers: AccelerationConstant force along the rotated local up direction. Changes velocity every simulation step.Modifiers: DragVelocity damping. Positive strength slows particles; directional mode damps only the selected axis.Modifiers: RadialForce away from a center, with distance falloff. Negative magnitude attracts particles.Modifiers: VortexTangential force around a center, with distance falloff. Change the sign to reverse circulation.Curves: CurvesShape particle opacity over its lifetime. Edit point times, values, and tangents, then apply the curve to the preview. Time runs from birth (0) to expiration (1). A tangent controls the slope through a point.Artwork: Size ModeManual uses initial particle size. Auto uses texture-frame dimensions and treats initial size as a multiplier. The same numeric size therefore has a very different effect.Artwork: FlipMirror artwork horizontally, vertically, or both, without changing particle motion.Artwork: PivotHorizontal and vertical particle pivot offsets. Adjust both axes together to change the anchor used for particle geometry.Artwork: AnimationAnimation playback mode and FPS. Loop modes use FPS; once modes span particle lifetime. None freezes the first frame.Artwork: Animation SizeReference width and height for animation geometry. The first frame’s original size is used when omitted. This sets a consistent aspect across the sequence.
Class

Emitter

Coordinate one emitter’s playback, CPU slot metadata, and GPU simulation. Particle state stays in GPU textures; CPU metadata controls birth admission and expiration without readbacks. The renderer owns the GL context.

Constructors

Constructor

new Emitter(context, definition, sharedModifiers?, effectTransform?): Emitter

Parameters

Parameter Type Default value
context EmitterContext | null undefined
definition { capacity: number; duration: number; durationSpread: number; emission: { rate: number | { points: { tangent: number; time: number; value: number; }[]; }; rateSpread: number; shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; }; }; id: string; inheritVelocity: number; initial: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; alphaSpread: number; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocitySpread: number; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; blueSpread: number; direction: number; green: number | { points: { tangent: number; time: number; value: number; }[]; }; greenSpread: number; lifetime: number | { points: { tangent: number; time: number; value: number; }[]; }; lifetimeSpread: number; red: number | { points: { tangent: number; time: number; value: number; }[]; }; redSpread: number; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; rotationSpread: number; size: number | { points: { tangent: number; time: number; value: number; }[]; }; sizeSpread: number; speed: number | { points: { tangent: number; time: number; value: number; }[]; }; speedSpread: number; spread: number; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchXSpread: number; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchYSpread: number; }; modifiers: ({ magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "acceleration"; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "drag"; useDirection: boolean; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; spread: number; type: "radial"; x: number; y: number; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; rotation: number; spread: number; type: "vortex"; x: number; y: number; })[]; orientation: "default" | "initial-direction" | "movement-direction" | "angular-velocity"; overLifetime: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; green: number | { points: { tangent: number; time: number; value: number; }[]; }; red: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; scale: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; }; playMode: "once" | "loop"; position: { x: number; y: number; }; rendering: { blendMode: "normal" | "add" | "multiply" | "screen"; tint?: { alpha: number; blue: number; green: number; red: number; }; }; rotation: number; scale: number; seed: number; space: "world" | "local"; startDelay: number; startDelaySpread: number; startOffset: number; stretchWithVelocity: boolean; } undefined
definition.capacity? number ...
definition.duration? number ...
definition.durationSpread? number ...
definition.emission? { rate: number | { points: { tangent: number; time: number; value: number; }[]; }; rateSpread: number; shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; }; } emissionSchema
definition.emission.rate? number | { points: { tangent: number; time: number; value: number; }[]; } emissionRateSchema
definition.emission.rateSpread? number ...
definition.emission.shape? { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } emissionShapeSchema
definition.id? string emitterIdSchema
definition.inheritVelocity? number ...
definition.initial? { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; alphaSpread: number; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocitySpread: number; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; blueSpread: number; direction: number; green: number | { points: { tangent: number; time: number; value: number; }[]; }; greenSpread: number; lifetime: number | { points: { tangent: number; time: number; value: number; }[]; }; lifetimeSpread: number; red: number | { points: { tangent: number; time: number; value: number; }[]; }; redSpread: number; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; rotationSpread: number; size: number | { points: { tangent: number; time: number; value: number; }[]; }; sizeSpread: number; speed: number | { points: { tangent: number; time: number; value: number; }[]; }; speedSpread: number; spread: number; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchXSpread: number; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchYSpread: number; } initialPropertiesSchema
definition.initial.alpha? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.alphaSpread? number ...
definition.initial.angularVelocity? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.angularVelocitySpread? number ...
definition.initial.blue? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.blueSpread? number ...
definition.initial.direction? number ...
definition.initial.green? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.greenSpread? number ...
definition.initial.lifetime? number | { points: { tangent: number; time: number; value: number; }[]; } scalarPropertySchema
definition.initial.lifetimeSpread? number ...
definition.initial.red? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.redSpread? number ...
definition.initial.rotation? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.rotationSpread? number ...
definition.initial.size? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.sizeSpread? number ...
definition.initial.speed? number | { points: { tangent: number; time: number; value: number; }[]; } scalarPropertySchema
definition.initial.speedSpread? number ...
definition.initial.spread? number ...
definition.initial.stretchX? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.stretchXSpread? number ...
definition.initial.stretchY? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.initial.stretchYSpread? number ...
definition.modifiers? ({ magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "acceleration"; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "drag"; useDirection: boolean; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; spread: number; type: "radial"; x: number; y: number; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; rotation: number; spread: number; type: "vortex"; x: number; y: number; })[] ...
definition.orientation? "default" | "initial-direction" | "movement-direction" | "angular-velocity" ...
definition.overLifetime? { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; green: number | { points: { tangent: number; time: number; value: number; }[]; }; red: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; scale: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; } overLifetimeSchema
definition.overLifetime.alpha? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.angularVelocity? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.blue? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.green? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.red? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.rotation? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.scale? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.stretchX? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.overLifetime.stretchY? number | { points: { tangent: number; time: number; value: number; }[]; } ...
definition.playMode? "once" | "loop" ...
definition.position? { x: number; y: number; } ...
definition.position.x? number ...
definition.position.y? number ...
definition.rendering? { blendMode: "normal" | "add" | "multiply" | "screen"; tint?: { alpha: number; blue: number; green: number; red: number; }; } renderingSchema
definition.rendering.blendMode? "normal" | "add" | "multiply" | "screen" ...
definition.rendering.tint? { alpha: number; blue: number; green: number; red: number; } ...
definition.rendering.tint.alpha? number ...
definition.rendering.tint.blue? number ...
definition.rendering.tint.green? number ...
definition.rendering.tint.red? number ...
definition.rotation? number ...
definition.scale? number ...
definition.seed? number ...
definition.space? "world" | "local" ...
definition.startDelay? number ...
definition.startDelaySpread? number ...
definition.startOffset? number ...
definition.stretchWithVelocity? boolean ...
sharedModifiers? unknown []
effectTransform? EffectTransform ...

Returns

Emitter

Properties

capacity

readonly capacity: number


effectTransform

readonly effectTransform: EffectTransform


emitting

emitting: boolean = true

Gate new births without pausing the simulation or resetting playback.

Accessors

birthTexture

Get Signature

get birthTexture(): WebGLTexture

Borrowed birth-data texture for renderer adapters: three RGBA bands.

Returns

WebGLTexture


configuration

Get Signature

get configuration(): { capacity: number; duration: number; durationSpread: number; emission: { rate: number | { points: { tangent: number; time: number; value: number; }[]; }; rateSpread: number; shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; }; }; id: string; inheritVelocity: number; initial: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; alphaSpread: number; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocitySpread: number; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; blueSpread: number; direction: number; green: number | { points: { tangent: number; time: number; value: number; }[]; }; greenSpread: number; lifetime: number | { points: { tangent: number; time: number; value: number; }[]; }; lifetimeSpread: number; red: number | { points: { tangent: number; time: number; value: number; }[]; }; redSpread: number; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; rotationSpread: number; size: number | { points: { tangent: number; time: number; value: number; }[]; }; sizeSpread: number; speed: number | { points: { tangent: number; time: number; value: number; }[]; }; speedSpread: number; spread: number; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchXSpread: number; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchYSpread: number; }; modifiers: ({ magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "acceleration"; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "drag"; useDirection: boolean; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; spread: number; type: "radial"; x: number; y: number; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; rotation: number; spread: number; type: "vortex"; x: number; y: number; })[]; orientation: "default" | "initial-direction" | "movement-direction" | "angular-velocity"; overLifetime: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; green: number | { points: { tangent: number; time: number; value: number; }[]; }; red: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; scale: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; }; playMode: "once" | "loop"; position: { x: number; y: number; }; rendering: { blendMode: "normal" | "add" | "multiply" | "screen"; tint?: { alpha: number; blue: number; green: number; red: number; }; }; rotation: number; scale: number; seed: number; space: "world" | "local"; startDelay: number; startDelaySpread: number; startOffset: number; stretchWithVelocity: boolean; }

Owned snapshot for serialization or explicit recreation.

Returns

{ capacity: number; duration: number; durationSpread: number; emission: { rate: number | { points: { tangent: number; time: number; value: number; }[]; }; rateSpread: number; shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; }; }; id: string; inheritVelocity: number; initial: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; alphaSpread: number; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocitySpread: number; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; blueSpread: number; direction: number; green: number | { points: { tangent: number; time: number; value: number; }[]; }; greenSpread: number; lifetime: number | { points: { tangent: number; time: number; value: number; }[]; }; lifetimeSpread: number; red: number | { points: { tangent: number; time: number; value: number; }[]; }; redSpread: number; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; rotationSpread: number; size: number | { points: { tangent: number; time: number; value: number; }[]; }; sizeSpread: number; speed: number | { points: { tangent: number; time: number; value: number; }[]; }; speedSpread: number; spread: number; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchXSpread: number; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchYSpread: number; }; modifiers: ({ magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "acceleration"; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "drag"; useDirection: boolean; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; spread: number; type: "radial"; x: number; y: number; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; rotation: number; spread: number; type: "vortex"; x: number; y: number; })[]; orientation: "default" | "initial-direction" | "movement-direction" | "angular-velocity"; overLifetime: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; green: number | { points: { tangent: number; time: number; value: number; }[]; }; red: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; scale: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; }; playMode: "once" | "loop"; position: { x: number; y: number; }; rendering: { blendMode: "normal" | "add" | "multiply" | "screen"; tint?: { alpha: number; blue: number; green: number; red: number; }; }; rotation: number; scale: number; seed: number; space: "world" | "local"; startDelay: number; startDelaySpread: number; startOffset: number; stretchWithVelocity: boolean; }

capacity

capacity: number

duration

duration: number

durationSpread

durationSpread: number

emission

emission: { rate: number | { points: { tangent: number; time: number; value: number; }[]; }; rateSpread: number; shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; }; } = emissionSchema

emission.rate

rate: number | { points: { tangent: number; time: number; value: number; }[]; } = emissionRateSchema

emission.rateSpread

rateSpread: number

emission.shape

shape: { type: "point"; } | { diameter: number | { points: { tangent: number; time: number; value: number; }[]; }; diameterSpread: number; type: "circle"; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "box"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } | { height: number | { points: { tangent: number; time: number; value: number; }[]; }; heightSpread: number; type: "cone2d"; width: number | { points: { tangent: number; time: number; value: number; }[]; }; widthSpread: number; } = emissionShapeSchema

id

id: string = emitterIdSchema

inheritVelocity

inheritVelocity: number

initial

initial: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; alphaSpread: number; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocitySpread: number; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; blueSpread: number; direction: number; green: number | { points: { tangent: number; time: number; value: number; }[]; }; greenSpread: number; lifetime: number | { points: { tangent: number; time: number; value: number; }[]; }; lifetimeSpread: number; red: number | { points: { tangent: number; time: number; value: number; }[]; }; redSpread: number; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; rotationSpread: number; size: number | { points: { tangent: number; time: number; value: number; }[]; }; sizeSpread: number; speed: number | { points: { tangent: number; time: number; value: number; }[]; }; speedSpread: number; spread: number; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchXSpread: number; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchYSpread: number; } = initialPropertiesSchema

initial.alpha

alpha: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.alphaSpread

alphaSpread: number

initial.angularVelocity

angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.angularVelocitySpread

angularVelocitySpread: number

initial.blue

blue: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.blueSpread

blueSpread: number

initial.direction

direction: number

initial.green

green: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.greenSpread

greenSpread: number

initial.lifetime

lifetime: number | { points: { tangent: number; time: number; value: number; }[]; } = scalarPropertySchema

initial.lifetimeSpread

lifetimeSpread: number

initial.red

red: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.redSpread

redSpread: number

initial.rotation

rotation: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.rotationSpread

rotationSpread: number

initial.size

size: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.sizeSpread

sizeSpread: number

initial.speed

speed: number | { points: { tangent: number; time: number; value: number; }[]; } = scalarPropertySchema

initial.speedSpread

speedSpread: number

initial.spread

spread: number

initial.stretchX

stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.stretchXSpread

stretchXSpread: number

initial.stretchY

stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }

initial.stretchYSpread

stretchYSpread: number

modifiers

modifiers: ({ magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "acceleration"; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number; spread: number; type: "drag"; useDirection: boolean; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; spread: number; type: "radial"; x: number; y: number; } | { magnitude: number | { points: { tangent: number; time: number; value: number; }[]; }; maxDistance: number; rotation: number; spread: number; type: "vortex"; x: number; y: number; })[]

orientation

orientation: "default" | "initial-direction" | "movement-direction" | "angular-velocity"

overLifetime

overLifetime: { alpha: number | { points: { tangent: number; time: number; value: number; }[]; }; angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }; blue: number | { points: { tangent: number; time: number; value: number; }[]; }; green: number | { points: { tangent: number; time: number; value: number; }[]; }; red: number | { points: { tangent: number; time: number; value: number; }[]; }; rotation: number | { points: { tangent: number; time: number; value: number; }[]; }; scale: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }; stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }; } = overLifetimeSchema

overLifetime.alpha

alpha: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.angularVelocity

angularVelocity: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.blue

blue: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.green

green: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.red

red: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.rotation

rotation: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.scale

scale: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.stretchX

stretchX: number | { points: { tangent: number; time: number; value: number; }[]; }

overLifetime.stretchY

stretchY: number | { points: { tangent: number; time: number; value: number; }[]; }

playMode

playMode: "once" | "loop"

position

position: { x: number; y: number; }

position.x

x: number

position.y

y: number

rendering

rendering: { blendMode: "normal" | "add" | "multiply" | "screen"; tint?: { alpha: number; blue: number; green: number; red: number; }; } = renderingSchema

rendering.blendMode

blendMode: "normal" | "add" | "multiply" | "screen"

rendering.tint?

optional tint?: { alpha: number; blue: number; green: number; red: number; }

rendering.tint.alpha

alpha: number

rendering.tint.blue

blue: number

rendering.tint.green

green: number

rendering.tint.red

red: number

rotation

rotation: number

scale

scale: number

seed

seed: number

space

space: "world" | "local"

startDelay

startDelay: number

startDelaySpread

startDelaySpread: number

startOffset

startOffset: number

stretchWithVelocity

stretchWithVelocity: boolean


gl

Get Signature

get gl(): WebGL2RenderingContext

Returns

WebGL2RenderingContext


id

Get Signature

get id(): string

Returns

string


initialized

Get Signature

get initialized(): boolean

Returns

boolean


isEmitting

Get Signature

get isEmitting(): boolean

Emission eligibility at the current clock, before any pending prewarm.

Returns

boolean


particleCount

Get Signature

get particleCount(): number

Number of living particles tracked on the CPU; no GPU readback.

Returns

number


rotation

Get Signature

get rotation(): number

Emitter rotation in counterclockwise degrees.

Returns

number

Set Signature

set rotation(value): void

Parameters
Parameter Type
value number
Returns

void


rows

Get Signature

get rows(): number

Rows in each of the five particle-state bands.

Returns

number


scale

Get Signature

get scale(): number

Uniform emitter scale; independent of particle size curves.

Returns

number

Set Signature

set scale(value): void

Parameters
Parameter Type
value number
Returns

void


space

Get Signature

get space(): "world" | "local"

Returns

"world" | "local"


state

Get Signature

get state(): EmitterState

Returns

EmitterState


stretchWithVelocity

Get Signature

get stretchWithVelocity(): boolean

Whether Y stretch follows the current simulation speed.

Returns

boolean


texture

Get Signature

get texture(): WebGLTexture

Borrowed changing-state texture for renderer adapters: two RGBA bands.

Returns

WebGLTexture


width

Get Signature

get width(): number

Texture columns; finalized against device limits when initialized.

Returns

number


worldHandedness

Get Signature

get worldHandedness(): -1 | 1

Returns

-1 | 1


worldRotation

Get Signature

get worldRotation(): number

Returns

number


worldScale

Get Signature

get worldScale(): number

Returns

number


worldX

Get Signature

get worldX(): number

Returns

number


worldY

Get Signature

get worldY(): number

Returns

number


x

Get Signature

get x(): number

Emitter origin in effect coordinates; rotation and scale apply around this point.

Returns

number

Set Signature

set x(value): void

Parameters
Parameter Type
value number
Returns

void


y

Get Signature

get y(): number

Returns

number

Set Signature

set y(value): void

Parameters
Parameter Type
value number
Returns

void

Methods

clear()

clear(): void

Stop emission and remove all particles immediately.

Returns

void


destroy()

destroy(): void

Release owned resources once, leaving the shared WebGL context alive.

Returns

void


initialize()

initialize(context): void

Attach the renderer’s context once. CPU controls are usable before attachment.

Parameters

Parameter Type
context EmitterContext

Returns

void


onStateChange()

onStateChange(listener): () => void

Subscribe to queued lifecycle transitions; returns an unsubscribe function.

Parameters

Parameter Type
listener EmitterStateListener

Returns

() => void


play()

play(): void

Restart from the initial state, including delay, seed and prewarm.

Returns

void


reset()

reset(): void

Clear particles and restore the initial clock and seed; preserve the emitting gate.

Returns

void


retire()

retire(): void

Finish the current cycle, then drain existing particles.

Returns

void


setParameters()

setParameters(patch): void

Apply a validated patch atomically, rebuilding only affected sampled data.

Parameters

Parameter Type
patch { emission?: { rate?: number; shape?: { diameter?: number; diameterSpread?: number; height?: number; heightSpread?: number; width?: number; widthSpread?: number; }; }; inheritVelocity?: number; initial?: { alpha?: number; alphaSpread?: number; angularVelocity?: number; angularVelocitySpread?: number; blue?: number; blueSpread?: number; direction?: number; green?: number; greenSpread?: number; lifetime?: number; lifetimeSpread?: number; red?: number; redSpread?: number; rotation?: number; rotationSpread?: number; size?: number; sizeSpread?: number; speed?: number; speedSpread?: number; spread?: number; stretchX?: number; stretchXSpread?: number; stretchY?: number; stretchYSpread?: number; }; modifiers?: ({ magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; rotation?: number; spread?: number; type: "acceleration"; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; rotation?: number; spread?: number; type: "drag"; useDirection?: boolean; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; maxDistance?: number; spread?: number; type: "radial"; x?: number; y?: number; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; maxDistance?: number; rotation?: number; spread?: number; type: "vortex"; x?: number; y?: number; })[]; position?: { x?: number; y?: number; }; rotation?: number; scale?: number; stretchWithVelocity?: boolean; }
patch.emission? { rate?: number; shape?: { diameter?: number; diameterSpread?: number; height?: number; heightSpread?: number; width?: number; widthSpread?: number; }; }
patch.emission.rate? number
patch.emission.shape? { diameter?: number; diameterSpread?: number; height?: number; heightSpread?: number; width?: number; widthSpread?: number; }
patch.emission.shape.diameter? number
patch.emission.shape.diameterSpread? number
patch.emission.shape.height? number
patch.emission.shape.heightSpread? number
patch.emission.shape.width? number
patch.emission.shape.widthSpread? number
patch.inheritVelocity? number
patch.initial? { alpha?: number; alphaSpread?: number; angularVelocity?: number; angularVelocitySpread?: number; blue?: number; blueSpread?: number; direction?: number; green?: number; greenSpread?: number; lifetime?: number; lifetimeSpread?: number; red?: number; redSpread?: number; rotation?: number; rotationSpread?: number; size?: number; sizeSpread?: number; speed?: number; speedSpread?: number; spread?: number; stretchX?: number; stretchXSpread?: number; stretchY?: number; stretchYSpread?: number; }
patch.initial.alpha? number
patch.initial.alphaSpread? number
patch.initial.angularVelocity? number
patch.initial.angularVelocitySpread? number
patch.initial.blue? number
patch.initial.blueSpread? number
patch.initial.direction? number
patch.initial.green? number
patch.initial.greenSpread? number
patch.initial.lifetime? number
patch.initial.lifetimeSpread? number
patch.initial.red? number
patch.initial.redSpread? number
patch.initial.rotation? number
patch.initial.rotationSpread? number
patch.initial.size? number
patch.initial.sizeSpread? number
patch.initial.speed? number
patch.initial.speedSpread? number
patch.initial.spread? number
patch.initial.stretchX? number
patch.initial.stretchXSpread? number
patch.initial.stretchY? number
patch.initial.stretchYSpread? number
patch.modifiers? ({ magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; rotation?: number; spread?: number; type: "acceleration"; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; rotation?: number; spread?: number; type: "drag"; useDirection?: boolean; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; maxDistance?: number; spread?: number; type: "radial"; x?: number; y?: number; } | { magnitude?: number | { points: { tangent?: number; time: number; value: number; }[]; }; maxDistance?: number; rotation?: number; spread?: number; type: "vortex"; x?: number; y?: number; })[]
patch.position? { x?: number; y?: number; }
patch.position.x? number
patch.position.y? number
patch.rotation? number
patch.scale? number
patch.stretchWithVelocity? boolean

Returns

void


stop()

stop(__namedParameters?): void

Stop spawning; existing particles drain unless clear is requested.

Parameters

Parameter Type
__namedParameters? StopOptions

Returns

void


update()

update(seconds): void

Advance by 0–0.1 seconds. The first positive step runs pending prewarm first. Before initialize(), updates leave playback paused without accumulating time. Zero-time updates initialize GPU output without advancing particle ages. State notifications are delivered after the simulation work completes.

Parameters

Parameter Type
seconds number

Returns

void