Fission SDK · C++ technical reference

Fission Particle Parameter Reference

Particle-file commands, defaults, value formats, runtime behavior, graph syntax, and emitter integration for the C++ renderer.

C++ runtime Source-derived defaults Constraints & caveats Reviewed 13 Aug 2026

Reference at a glance

current repository behavior
35
Loader commands
4
Content commands
4
Graph families
C++
Runtime scope

Browse and search

press Escape to clear

How to read this guide

reference section

Particle definitions use command = value; statements. Whitespace is generally tolerated, but command names and enum strings are case-sensitive. Unknown commands assert in development builds. Defaults below are the values constructed by fsCParticleData before any file is parsed.

File anatomy

reference section
imageFileName = particles/gfx/spark.png;
alphaMode = add;
particleLifeMs = 1200;
emitterLifeMs = 0;
maxParticles = 24;
emitSpeed = 12.0;
emitPosXY = 0, 0 rndRangeXY = 20, 8;
velocityXY = 0, 90 rndRangeXY = 25, 10;
scale = 0.5 rndRange = 0.15;
scaleDelta = -0.25 rndRange = 0.05;
colourGraph = ffffff00, ffffffff, 150, ffffff00, 1050;
SyntaxMeaning
;Terminates every command, including multi-line graph commands.
x, yTwo floating-point values used for positions, velocities, UV motion, and pivots.
value rndRange = rLegacy scalar form: choose a per-particle value approximately uniformly from value − r through value + r. Use a non-negative range.
x, y rndRangeXY = rx, ryVector form: independently randomize X and Y around the supplied centre. Use non-negative ranges.
initial, value, duration, …Graph form: linearly interpolate from the initial value to each following value over that pair's duration in milliseconds.
RRGGBBAAExactly eight hexadecimal characters: red, green, blue, alpha.

Quick command index

reference section
GroupCommands
ContentimageFileName, animFileName, particleFileName, sfxFileName
Emitterpulse, maxParticles, emitSpeed, emitterLifeMs, prerun
Particle lifetimeparticleLifeMs, collectable, collectableType, linkToEmitter
Position and motionemitPosXY, velocityXY, velocityDeltaXY, velocityUV, pivot
AppearancealphaMode, colour, colourGraph
OscillationoscillationX, oscillationY, optional rndRangeOT
ScalescaleParam, scale, scaleDelta, scaleXParam, scaleX, scaleXDelta, scaleYParam, scaleY, scaleYDelta
RotationangleParam, angle, angleDelta

Content and rendering

reference section
ParameterType / unitsDefaultExplanation and constraints
imageFileNameasset path stringnoneCreates sprite particles when no nested particle or animation takes priority. A comma in the value selects multi-image mode; brushes are assigned round-robin when the cache is created.
animFileNameasset path stringnoneLoads animation data and creates animated particles unless particleFileName is also present. Static alphaMode, colour, and pivot setup is not passed to the animation-particle constructor.
particleFileNameparticle .txt pathnoneCreates particles that contain their own emitter. This has creation priority over animFileName and imageFileName. An optional image or animation becomes the nested particle's visible root.
sfxFileNameaudio asset pathemptyPlays the effect once for every particle reset/emission. Sound is suppressed during prerun simulation.
alphaModeenum stringnormalSprite blend mode. Valid values: none, normal, add, subtract. Invalid values assert.
colourRRGGBBAAffffffffStatic sprite tint. Exactly eight hex characters. A colourGraph, when present, updates the rendered colour over time.
pivotx, y position units0, 0Adds a local translation to sprite rendering, effectively moving the sprite's pivot. Applied by the sprite-particle path.

Emitter lifecycle and capacity

reference section
ParameterType / unitsDefaultExplanation and constraints
pulsebooleanfalseWhen true, each fill pass requests the entire cached particle set at once. With a cloud emitter, cache size is taken from the spawn-cloud pixel count rather than maxParticles.
maxParticlesinteger count0Maximum cached/live particles for a normal emitter. Zero creates no cache. In pulse cloud mode this value is overridden by the cloud size.
emitSpeedfloat; particles/s0.0Accumulates particles to emit per second. Fractional rates are supported. A one-particle emitter with emitSpeed = 1 has a dedicated immediate-fill case.
particleLifeMsinteger ms0Zero means an emitted particle does not expire. Positive values deactivate it at expiry. Negative values use abs(value) as the update limit, finalise scale/angle there, and participate in special one-particle active-state handling.
emitterLifeMsinteger ms0Zero makes the emitter run forever. A non-zero value stops new emission after the emitter's elapsed time reaches the value; already-active particles continue updating.
preruninteger ms0Before normal display, simulates the emitter in 32 ms updates for approximately this duration. Useful for starting a continuous effect in a populated state; emission SFX is muted during the simulation.

Collection and transform attachment

reference section
ParameterType / unitsDefaultExplanation and constraints
collectableinteger count0Initial remaining-collectable count exposed by the emitter. A non-zero value also requests hit-test-capable brush loading and causes the component to add collectable interaction during finalisation.
collectableTypestring labelemptyApplication-facing category returned when a collectable particle is queried. The particle engine does not interpret the string.
linkToEmitterbooleanfalseTrue keeps particles under the emitter entity's render transform, so existing particles follow it. False updates the spawn position from the entity while rendering particles in the parent coordinate space.

Spawn position and movement

reference section
ParameterType / unitsDefaultExplanation and constraints
emitPosXYx, y; position units0, 0Local emission centre. Optional rndRangeXY independently spreads X and Y around the centre. A parent-entity emission source or spawn cloud overrides the normal random-position path.
velocityXYx, y; units/s0, 0Initial linear velocity. Optional rndRangeXY is sampled independently for every reset particle.
velocityDeltaXYx, y; units/s²0, 0Rate added to velocity each second—acceleration or deceleration. Optional rndRangeXY randomizes it per particle.
velocityUVu, v; UV/ms0, 0Texture-coordinate movement for sprite particles. The implementation adds this value once per millisecond, wraps positive values above 1 by subtracting 1, and enables texture wrapping.

Scale parameters

reference section
ParameterType / unitsDefaultExplanation and constraints
scalefloat + optional rndRange1.0Legacy uniform/X starting scale. With no scaleY command, Y mirrors X.
scaleDeltafloat/s + optional rndRange0.0Legacy uniform/X scale rate. Added over time in units per second.
scaleParamgraphnoneAbsolute scale graph for X and, when no Y parameter exists, both axes. Alias of scaleXParam.
scaleXfloat + optional rndRange1.0Legacy X starting scale. Same storage as scale.
scaleXDeltafloat/s + optional rndRange0.0Legacy X scale rate. Same modifier as scaleDelta.
scaleXParamgraphnoneAbsolute X scale graph. Same storage as scaleParam.
scaleYfloat + optional rndRange1.0 when createdCreates an independent Y scale parameter; after this, Y no longer mirrors X.
scaleYDeltafloat/s + optional rndRange0.0Creates/updates the independent Y scale rate.
scaleYParamgraphnoneCreates an independent absolute Y scale graph.

Rotation parameters

reference section
ParameterType / unitsDefaultExplanation and constraints
angledegrees + optional rndRange0.0°Legacy starting rotation. Converted to radians internally. Positive file angles are negated when the local render matrix is built.
angleDeltadegrees/s + optional rndRange0.0°/sLegacy angular rate, sampled per particle when a range is supplied.
angleParamdegree graphnoneAbsolute repeating angle graph. Each value is written in degrees and converted internally.
angleParam = 0,
    20, 1500,
    10, 1000,
    0, 500,
    -20, 1500,
    0, 1500;

Colour graphs

reference section
ParameterType / unitsDefaultExplanation and constraints
colourGraphRGBA graphnoneStarts at the first RRGGBBAA value, then interpolates to each following colour over its paired duration in milliseconds. Evaluation repeats at the sum of the durations.
colourGraph = ffffff00,
    ffffffff, 150,
    ffffffff, 700,
    ffffff00, 350;

Position oscillation

reference section
ParameterType / unitsDefaultExplanation and constraints
oscillationXoffset graphnoneAdds a repeating X-position offset. The parser consumes but ignores the first scalar token and constructs a zero starting offset; subsequent value/duration pairs define the curve.
oscillationYoffset graphnoneEquivalent repeating Y-position offset.
rndRangeOTamplitude, time multipliersabsentOptional final clause inside either oscillation command. Positive values randomize that particle's amplitude and/or graph-time multiplier; zero leaves the corresponding multiplier at 1.
oscillationX = 0,
    -10, 1000,
    0, 1000,
    10, 1000,
    0, 1000,
rndRangeOT = 0.8, 0.2;

Component and scene integration

reference section
ParameterType / unitsDefaultExplanation and constraints
particleFileasset path stringRequiredVariable-table key read by fsCParticleEmitterComponent. The file must exist; it is loaded through fsCParticleDataManager and used to construct the emitter.
PAR prefixentity conventionregisteredEntity prefix associated with fsCParticleEmitterComponent, the normal emitter component.
PRC prefixentity conventionregisteredEntity prefix associated with fsCParticleCloudEmitterComponent, which derives a spawn-cloud image from the particle path and entity name.

Cloud image resolution

parameter group

The PRC component first searches a localized level layers folder, then the ordinary layers folder, using the entity name without its suffix. If neither level-layer candidate is found, it falls back to a PNG beside the particle file. Opaque pixels become spawn points; sequence clouds keep pixel-colour ordering while ordinary clouds store positions.

Validation checklist

reference section
CheckWhat to verify
SyntaxEnd every command with a semicolon. Use exactly eight RRGGBBAA hex characters for colours.
Content sourceSupply an image, animation, or nested particle appropriate to the intended particle type; remember nested particles take creation priority.
Capacity and rateUse maxParticles > 0 and emitSpeed > 0 for ordinary emission. Treat pulse as cloud-emitter-only.
LifetimeUse emitterLifeMs = 0 for continuous emission and particleLifeMs = 0 only when particles should not expire.
GraphsGive colour, scale, angle, and oscillation graphs a positive total duration.
RangesUse non-negative rndRange and rndRangeXY values; they are half-ranges around the configured centre.
Multi-image listsAdd a trailing comma when more than one image name is supplied, so the final name is consumed.
Runtime costRemember sfxFileName plays per particle, and choose linkToEmitter based on whether emitted particles should keep following the entity.

Source map

reference section

Primary files reviewed; update this guide when loader or emitter behavior changes:

libs/fsRenderer/src/particles/fsCParticleDataLoader.cpplibs/fsRenderer/src/particles/fsCParticleData.{h,cpp}libs/fsRenderer/src/particles/fsCParticleDataInstance.cpplibs/fsRenderer/src/particles/fsCParticleEmitter.cpplibs/fsRenderer/src/particles/fsIParticle.cpplibs/fsRenderer/src/particles/fsCParticleParameter.cpplibs/fsRenderer/src/particles/fsCParticleParameterModifier.cpplibs/fsRenderer/src/particles/fsCParticle{Scale,Rotate}Parameter.cpplibs/fsRenderer/src/components/fsCParticle{,Cloud}EmitterComponent.cpplibs/fsAppCore/src/fsCGraph.h