Particle editor reference

Reference for the Kanzi Studio editor team building a particles editor UI. Enumerates the particle node types, their plugin-defined properties, and (in the Asset package section at the bottom) the data-driven property types and materials shipped in assets/ParticlesAssetPackage/.

Note

Status: stub. The plugin-defined property tables are populated from metadata. Asset-package sections are structural only and will be filled in over time.

The marker-delimited tables on this page are regenerated by docs/tools/generate_particle_editor_reference.py from the plugin metadata and the asset package. Hand-written prose outside the markers is untouched; do not hand-edit the tables.

Conventions

  • Plugin-defined property: declared in C++ via the plugin metadata (see assets/ParticlesAssetPackage/Kanzi Engine Plugins/kzparticles.kzm). These are always present on the node and have stable types, defaults, and bounds. Covered in the per-node sections below.

  • Asset-package property: declared as a PropertyType in the asset package project. Its value is read by a compute shader whose material is assigned to one of the node’s material slots (EmissionMaterial, AffectorMaterial, ColliderMaterial, GenerateEventsMaterial, etc.). These properties are not auto-added when a material is selected: the author has to set each one on the node explicitly for the value to reach the shader. A good editor UX would hide or show them based on the selected material; today that filtering is the author’s responsibility. Covered in the asset-package section at the bottom.

  • Buffer property: a property whose value is a handle to a GPU buffer rather than a plain scalar or vector. Two kinds exist: output buffers the engine writes to on a producing node (ParticleEmitter.EventBuffer, ParticleEmitter.ParticleDataBuffer on a source emitter), and input buffers a consuming node reads from (Emission.SourceEventBuffer, Emission.SourceParticleDataBuffer on a subemitter). The author doesn’t type a value into an input buffer property: it gets populated by a Binding that pulls from the producer and pushes into the consumer. The property still has to be present on the consuming node (even as an empty reference) for the binding to have somewhere to write.

  • Asset path: paths like ParticlesAssetPackage/Materials/... are relative to the asset package root.

ParticleSystem

Root of a particle effect. Hosts emitters, affectors, and colliders as children.

Working examples: every Exhibit N/Particle System.kzm under assets/ParticlesAssetPackage/Screens/Screen/RootNode/Viewport 2D/Scene/.

Plugin-defined properties

Property

Type

Default

Range

Category

Description

ParticleSystem.Framerate

Float

60.0

0.5 .. 60.0 (step 1.0)

Particle System

Number of simulation steps per second. Higher values improve accuracy at increased CPU cost.

ParticleSystem.IntegrationMethod

Enum: Euler, Verlet

Verlet

—

Particle System

Selects the integration method for particle position updates. Verlet provides improved energy conservation; Euler is the classical method. The prevPosition field is populated every frame regardless of which integrator is active.

ParticleSystem.SortingCameraOverride

String

—

—

Particle System

Optional. Path to a Camera node to use for sort key computation. If empty, uses the Scene’s default camera.

Children

  • ParticleEmitter (one or more)

  • ParticleAffector (zero or more)

  • ParticleCollider (zero or more)

  • Nested ParticleSystem or grouping EmptyNode (for subemitter setups: see Exhibit 6)

ParticleEmitter

Spawns and renders particles. Behaviour is almost entirely determined by the materials assigned to its material slots; those materials drive the asset-package properties documented in the asset-package section.

Working examples:

  • Simple fountain: Screens/.../Exhibit 1/Particle System/Fountain.kzm.

  • Volume emitters: Screens/.../Exhibit 2/Particle System/*.kzm.

  • Subemitter (event-driven): Screens/.../Exhibit 6/Particle System/*/Subemitter.kzm.

Plugin-defined properties

Property

Type

Default

Range

Category

Description

ParticleEmitter.SelfAffectMaterial

ResourceID (Material)

—

—

Affector

Compute material run over all active particles each frame, before integration. Use to implement per-emitter forces, attraction, or custom particle-particle interaction.

ParticleEmitter.EmissionCountMaterial

ResourceID (Material)

—

—

Emission

Emission count material. Single-invocation compute shader that implements uint EmissionCount() and writes the workgroup count to the indirect emit buffer. Use EmissionCount_Schedule from the ParticlesAssetPackage for time-based emission, EmissionCount_FromEvents to emit from an event buffer, or a custom shader.

ParticleEmitter.EmissionMaterial

ResourceID (Material)

—

—

Emission

Compute material that implements EmitParticle(). Defines the spawn position, velocity, and initial state of each new particle.

ParticleEmitter.MaximumAmount

Int

5000

0 .. 2000000 (step 10)

Emission

Maximum amount of particles for this emitter. [1]

ParticleEmitter.EventBuffer

ResourceID (Buffer)

—

—

Events

GPU buffer populated by the Event Generate Material. Read-only; automatically allocated and updated by the emitter. [2]

ParticleEmitter.GenerateEventsMaterial

ResourceID (Material)

—

—

Events

Event generation material. Compute shader that writes events (e.g. death events) to the EventBuffer.

ParticleEmitter.ParticleDataBuffer

ResourceID (Buffer)

—

—

Events

GPU buffer holding all particle state for this emitter. Read-only; bind this to a sub-emitter’s emission shader to access source particle positions. [2]

ParticleEmitter.ParticleMaterial

ResourceID (Material)

—

—

Rendering

2D/3D particle material. This defines the look and behavior of the particles.

ParticleEmitter.ParticleMesh

ResourceID (Mesh)

—

—

Rendering

Optional mesh rendered once per particle. Leave unset to render camera-facing 2D billboards using the default 2D particle material.

ParticleEmitter.SortingType

Enum: Identity, Depth, Reverse Depth, Unsorted

Identity

—

Rendering

Controls particle draw order. Identity: default, allocates index buffer with identity mapping, no per-frame cost. Depth: back-to-front GPU sort for transparent particles. Reverse Depth: front-to-back sort for opaque particles. Unsorted: no index buffer, saves memory, material must not reference SortingIndicesBuffer.

ParticleAffector

Applies a per-frame force or transformation to all particles in the system.

Working examples: Screens/.../Exhibit 1/Particle System/Gravity.kzm and Exhibit 3/*/Particle Affector.kzm.

Plugin-defined properties

Property

Type

Default

Range

Category

Description

ParticleAffector.AffectorMaterial

ResourceID (Material)

—

—

Affector

Affector material. Should contain only specific compute shader that is used to affect particles.

ParticleCollider

Defines a collision volume that particles interact with after integration.

Working examples: Screens/.../Exhibit 1/Particle System/Box Collider.kzm and all collider shapes in Screens/.../Exhibit 5/Particle System/<Shape>/Bounce.kzm and Floor.kzm.

Plugin-defined properties

Property

Type

Default

Range

Category

Description

ParticleCollider.Bounce

Float

0.5

0.0 .. 1.0 (step 0.01)

Collider

Coefficient of restitution [0..1]. 0 = inelastic (no bounce), 1 = perfectly elastic.

ParticleCollider.ColliderMaterial

ResourceID (Material)

—

—

Collider

Collider material. Must contain a compute shader that includes Particles/collider.glsl and implements HitInfo Collide(mat4, vec3, vec3).

ParticleCollider.Friction

Float

0.1

0.0 .. 1.0 (step 0.01)

Collider

Tangential velocity damping factor [0..1]. 0 = no friction, 1 = full stop along surface.

Asset package

Everything below this line is shipped as editable content in assets/ParticlesAssetPackage/, not compiled into the plugin. It can be modified, replaced, or extended per project. These are the property types and materials that drive the per-slot behaviour of the nodes above.

Property types

Defined under assets/ParticlesAssetPackage/PropertyTypes/. Each property’s default, min, max, category, and tooltip is declared on the property type asset.

Emission

Property

Type

Default

Min

Max

Category

Tooltip

Emission.AmountPerSecond

Float

10

0

50000

Emission

—

Emission.BoxExtents

Vector3DDynamicPropertyType

0.5,0.5,0.5

0,0,0

100,100,100

Emission

—

Emission.BurstCount

Float

0

0

1

Emission

—

Emission.BurstInterval

Float

0

0

1

Emission

—

Emission.Density

Float

1

0

100

Emission

—

Emission.EmitAlongNormal

Bool

false

—

—

Emission

—

Emission.ImpulseAtCycleStart

Float

0

0

100000

Emission

Particles emitted in a single burst at the start of each cycle. Float to preserve the fractional accumulator tail.

Emission.ImpulseVariance

Float

0

0

100000

Emission

Symmetric +/- variance band on ImpulseAtCycleStart, rolled once per cycle.

Emission.IndexCount

Int

0

-2147483648

2147483647

Emission

—

Emission.Indices

Buffer ref

—

—

—

Emission

—

Emission.InitialAngularVelocity

Vector3DDynamicPropertyType

0,0,0

-62.8318558,-62.8318558,-62.8318558

62.8318558,62.8318558,62.8318558

Emission

—

Emission.InitialAngularVelocityFromParent

Float

0

0

1

Emission

Weight applied to the parent particle’s angular velocity, added to the locally-sampled initial angular velocity. 0 = pure local; 1 = parent angular velocity added on top of local. To inherit the parent’s angular velocity verbatim, also set Emission.InitialAngularVelocity to (0,0,0). Only meaningful on emitters with a bound source-particle buffer (Emitter_FromEvents).

Emission.InitialAngularVelocityVariance

Vector3DDynamicPropertyType

0,0,0

0,0,0

100,100,100

Emission

—

Emission.InitialForce

Float

1

0

100

Emission

—

Emission.InitialRotation

Vector3DDynamicPropertyType

0,0,0

-6.28318548,-6.28318548,-6.28318548

6.28318548,6.28318548,6.28318548

Emission

—

Emission.InitialRotationFromParent

Float

0

0

1

Emission

Weight applied to the parent particle’s rotation, added to the locally-sampled initial rotation. 0 = pure local; 1 = parent rotation added on top of local. To inherit the parent’s rotation verbatim, also set Emission.InitialRotation to (0,0,0). Only meaningful on emitters with a bound source-particle buffer (Emitter_FromEvents).

Emission.InitialRotationVariance

Vector3DDynamicPropertyType

0,0,0

0,0,0

100,100,100

Emission

—

Emission.InitialSpeed

Float

4

0

20

Emission

—

Emission.InitialSpeedVariance

Float

1

0

10

Emission

—

Emission.InitialVelocityDirection

Vector3DDynamicPropertyType

0,0,1

-1,-1,-1

1,1,1

Emission

—

Emission.InitialVelocityInnerAngle

Float

0

0

3.14159274

Emission

—

Emission.InitialVelocityOrientToNormal

Bool

true

—

—

Emission

When true, the velocity cone is built around the spawn context’s natural normal instead of around InitialVelocityDirection. On a surface emitter the normal is the spawn surface normal (ignored when Volume = true). On Emitter_FromEvents the normal is the parent particle’s velocity vector, so children fan out around the direction the parent was moving.

Emission.InitialVelocityOuterAngle

Float

3.14159274

0

3.14159274

Emission

—

Emission.InitialVelocityStrength

Float

1

0

100

Emission

—

Emission.InitialVelocityStrengthFromParent

Float

0

0

1

Emission

Weight applied to the parent particle’s speed (length of its velocity vector), added to the locally-sampled initial speed. Direction always comes from the cone sample (InitialVelocityDirection or OrientToNormal), so this lets a child inherit how fast the parent was moving without inheriting which way. 0 = pure local speed; 1 = parent speed added on top of local. To inherit the parent’s speed verbatim, also set Emission.InitialVelocityStrength to 0. Only meaningful on emitters with a bound source-particle buffer (Emitter_FromEvents).

Emission.InitialVelocityStrengthVariance

Float

0

0

100

Emission

—

Emission.InnerConeAngle

Float

15

0

90

Emission

—

Emission.InnerRadius

Float

0

0

1

Emission

—

Emission.LateralSpread

Float

0

0

10

Emission

—

Emission.Lifetime

Float

1

0

10

Emission

—

Emission.LifetimeFromParent

Float

0

0

1

Emission

Weight applied to the parent particle’s total lifetime, added to the locally-sampled lifetime. 0 = pure local; 1 = parent lifetime added on top of local. To inherit the parent’s lifetime verbatim, also set Emission.Lifetime to 0. Only meaningful on emitters with a bound source-particle buffer (Emitter_FromEvents).

Emission.LifetimeVariance

Float

0

0

5

Emission

—

Emission.MajorRadius

Float

1

0

1

Emission

—

Emission.Mask

Buffer ref

—

—

—

Emission

—

Emission.MaskThreshold

Float

0.5

0

1

Emission

—

Emission.Mesh

Buffer ref

—

—

—

Emission

—

Emission.MinorRadius

Float

0.25

0

1

Emission

—

Emission.NormalBias

Float

0.300000012

0

1

Emission

Pulls spark scatter direction toward the surface normal. 0 = full hemisphere, 1 = along normal only.

Emission.Normals

Buffer ref

—

—

—

Emission

—

Emission.OffDuration

Float

0

0

1

Emission

—

Emission.OnDuration

Float

0

0

1

Emission

—

Emission.OuterConeAngle

Float

45

0

90

Emission

—

Emission.OuterRadius

Float

1

0

10

Emission

—

Emission.ParticleScale

Float

0.0500000007

0.00999999978

2

Emission

—

Emission.ParticlesPerEvent

Int

1

1

100

Emission

—

Emission.Positions

Buffer ref

—

—

—

Emission

—

Emission.Radius

Float

1

0.100000001

100

Emission

—

Emission.Rate

Float

10

0

50000

Emission

Particles per second emitted during the cycle on-phase.

Emission.RateVariance

Float

0

0

50000

Emission

Symmetric +/- variance band on Rate, rolled once per frame.

Emission.RiseSpeed

Float

2

0

20

Emission

—

Emission.Scale

Vector3DDynamicPropertyType

1,1,1

0,0,0

100,100,100

Emission

—

Emission.ScaleFromParent

Float

0

0

1

Emission

Multiplicative scale inheritance from the parent particle (per-axis lerp on the factor). 0 = pure local scale. 1 = local scale multiplied by the parent’s scale, so with the Emission.Scale default of (1, 1, 1) the child matches the parent’s scale exactly. In between, the parent contributes proportionally. Only meaningful on emitters with a bound source-particle buffer (Emitter_FromEvents).

Emission.ScaleVariance

Vector3DDynamicPropertyType

0,0,0

0,0,0

100,100,100

Emission

—

Emission.ScatterSpeed

Float

5

0

50

Emission

Base speed of spark particles scattered from a hit event.

Emission.Seed

Float

0

0

100000

Emission

Seed for the Rate/Impulse variance RNG. Two emitters with the same Seed produce identical, repeatable sequences; change it to decorrelate emitters.

Emission.SourceEventBuffer

Buffer ref

—

—

—

Emission

—

Emission.SourceParticleDataBuffer

Buffer ref

—

—

—

Emission

Buffer holding the source emitter’s particle data, used by subemitters to read source particle state at event time.

Emission.SpreadSpeed

Float

1

0

20

Emission

—

Emission.UVs

Buffer ref

—

—

—

Emission

—

Emission.UseMask

Bool

false

—

—

Emission

—

Emission.Volume

Bool

false

—

—

Emission

—

Affector

Property

Type

Default

Min

Max

Category

Tooltip

Affector.BuoyancyFalloff

Float

1

0.100000001

5

Affector

—

Affector.DilationFactor

Float

0.5

0

4

Affector

Per-particle time scale applied at the centre of the sphere. Below 1 slows particles down (0 freezes them); above 1 speeds them up. The falloff curve blends back to 1 at the sphere surface.

Affector.Direction

Vector3DDynamicPropertyType

0,1,0

-1,-1,-1

1,1,1

Affector

Acceleration direction in the affector node’s local frame. Normalised in the shader; a zero vector is treated as the local +Y axis.

Affector.DirectionalStrength

Float

0

0

15

Affector

—

Affector.DragCoefficient

Float

0

0

1

Affector

—

Affector.DragFactor

Float

1

0

10

Affector

How strongly the medium resists particle motion. Describes the medium, not the wind. 0.5 = thin air, 1.0 = sea-level air, 3+ = dense/humid, 5+ = underwater.

Affector.FalloffExponent

Float

0

-1

1

Affector

Shapes the sphere-of-influence falloff curve. 0 is a linear ramp; negative drops off rapidly near the centre then tapers; positive stays near full strength then falls sharply at the edge. ~1 approximates a hard cutoff at the radius. Only used when Radius > 0.

Affector.FalloffRadius

Float

0

0

1

Affector

—

Affector.Frequency

Float

0

0

1

Affector

—

Affector.FullWindHeight

Float

5

0

50

Affector

World-space Y height where wind reaches full strength. Between GroundLevel and this height, wind ramps up smoothly (smoothstep).

Affector.GroundLevel

Float

0

-10

10

Affector

World-space Y height where wind starts. Below this height, wind strength is zero. Used with FullWindHeight to create a height-based wind gradient.

Affector.GustAmplitude

Float

0.300000012

0

1

Affector

Strength of wind gusts as a fraction of WindSpeed. 0 = steady wind, 0.3 = gusts up to 30% stronger/weaker, 1.0 = gusts can double the wind or drop to zero.

Affector.GustFrequency

Float

2

0

20

Affector

Spatial frequency of wind gusts. Higher values create more rapid variation as particles move through the wind field.

Affector.Magnitude

Float

1

-100

100

Affector

Signed acceleration magnitude along the normalised Direction. Negative values decelerate (push opposite the direction); animating through zero sweeps smoothly between the two.

Affector.MaxBuoyancy

Float

18

0

50

Affector

—

Affector.MaxSpeed

Float

0

0

1

Affector

—

Affector.Radius

Float

0

0

100

Affector

—

Affector.Strength

Float

0

0

10

Affector

—

Affector.TimeScale

Float

0

0

1

Affector

—

Affector.TurbulenceFrequency

Float

5

0

20

Affector

—

Affector.TurbulenceStrength

Float

3

0

20

Affector

—

Affector.WindSpeed

Float

10

0

150

Affector

Wind speed in km/h along the affector’s local Z axis. 10 = light breeze, 40 = strong wind, 100+ = storm.

Collider

Property

Type

Default

Min

Max

Category

Tooltip

Collider.Angle

Float

30

1

89

Collider

Half-angle of the cone collider in degrees. 0 is a line, 90 would be a flat disc.

Collider.DamageThreshold

Int

0

-2147483648

2147483647

Collider

—

Collider.Height

Float

2

0

50

Collider

Height of the collider shape along its local Y axis.

Collider.KeepInside

Int

0

0

1

Collider

Confinement mode. 0 (default): particles outside the volume pass freely and particles entering bounce off the inner-facing surface. 1: predicate and surface normal invert — particles inside the volume pass freely and particles trying to leave bounce off the outer-facing surface. For Collider_Plane this is a half-space flip (same plane geometry, opposite half is now the “outside”). Declared as int rather than bool because the plugin’s UBO push for bool members has a known size mismatch — see RENDERING-2882.

Collider.Radius

Float

0

0

100

Collider

—

Events

Property

Type

Default

Min

Max

Category

Tooltip

Events.AccelerationMax

Float

1E+10

0

1E+10

Events

Upper bound of the acceleration-magnitude band (plugin acceleration units) within which events fire. The very large default effectively means “no upper bound”.

Events.AccelerationMin

Float

0

0

100

Events

Lower bound of the acceleration-magnitude band (plugin acceleration units) within which events fire. Snapshot test, evaluated each frame.

Events.AgeMax

Float

1E+10

0

1E+10

Events

Upper bound (seconds) of the absolute-age band the particle’s per-frame age sweep must overlap for an event to fire. The very large default effectively means “no upper bound”.

Events.AgeMin

Float

0

0

100

Events

Lower bound (seconds) of the absolute-age band the particle’s per-frame age sweep must overlap for an event to fire.

Events.Interval

Float

1

0

60

Events

Seconds between periodic events, per particle. Phase is anchored at each particle’s birth, so staggered particles produce a steady population-level stream.

Events.LifetimeMax

Float

1

0

1

Events

Upper bound of the normalised particle lifetime (0-1) band during which events fire. Min = Max = 1 fires on death; Min = Max = 0 fires on birth.

Events.LifetimeMin

Float

1

0

1

Events

Lower bound of the normalised particle lifetime (0-1) band during which events fire. Min = Max = 1 fires on death; Min = Max = 0 fires on birth.

Events.Probability

Float

1

0

1

Events

Population-level fire probability. Per-particle deterministic (rolled against the particle hash), so a fixed fraction of the population fires rather than a per-frame coin flip. 1 = every qualifying particle fires.

Events.VelocityMax

Float

1E+10

0

1E+10

Events

Upper bound of the speed band the particle’s per-frame speed sweep must overlap for an event to fire. The very large default effectively means “no upper bound”.

Events.VelocityMin

Float

0

0

100

Events

Lower bound of the speed band the particle’s per-frame speed sweep must overlap for an event to fire.

Particle rendering

Used by the particle-rendering materials under the ParticleMaterial slot.

Property

Category

Used by

ParticlesOverLife.ColorStart, ParticlesOverLife.ColorEnd

Color

ParticlesColorOverLife, ParticlesColorOverLife_Green, ParticlesColorOverLife_Red

ParticlesOverLife.ScaleStart, ParticlesOverLife.ScaleEnd

Scale

All ParticlesColorOverLife* variants

ParticlesOverLife.OpacityStart, ParticlesOverLife.OpacityEnd

Opacity

All ParticlesColorOverLife* variants

ParticlesOverLife.ColorMid, ParticlesOverLife.ColorMidPoint

Color (3-stop)

ParticlesColorOverLife3Stop

ParticlesOverLife.ScaleMid, ParticlesOverLife.ScaleMidPoint

Scale (3-stop)

ParticlesColorOverLife3Stop

ParticlesOverLife.OpacityMid, ParticlesOverLife.OpacityMidPoint

Opacity (3-stop)

ParticlesColorOverLife3Stop

FastColor, SlowColor, FastScale, SlowScale, SpeedThreshold, SpeedVariance, MaxDisplaySpeed

Velocity

ParticlesVelocityColor

Non-particle rendering (environment)

These drive the WorldGrid / Glass materials used in the exhibit scenery and aren’t particle-specific.

Property

Used by

WorldGrid.BaseColor, WorldGrid.BaseMetallic, WorldGrid.BaseRoughness, WorldGrid.GridColor, WorldGrid.GridMetallic, WorldGrid.GridRoughness, WorldGrid.GridSpacing, WorldGrid.GridWidth

WorldGridPBR

MaterialGlass.CubemapColor, MaterialGlass.Falloff, MaterialGlass.TextureCube

Glass Material

Materials

Defined under assets/ParticlesAssetPackage/Materials/ (material instances) and assets/ParticlesAssetPackage/Material Types/ (material types, which declare the shader and uniforms). Each table lists materials grouped by the node material-slot they’re designed for, and which asset-package properties the material consumes.

Emission materials (→ ParticleEmitter.EmissionMaterial)

Material

Role

Properties used

Emitter_Box

Spawn on the faces of a box (or inside it with Emission.Volume).

Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialVelocityOrientToNormal, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density, Emission.BoxExtents, Emission.Volume

Emitter_Disc

Spawn on the rims of an annular disc (or across its area with Emission.Volume).

Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialVelocityOrientToNormal, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density, Emission.OuterRadius, Emission.InnerRadius, Emission.Volume

Emitter_Embers

Fire-effect embers: spawn in a disc on the XZ plane and rise. Not in the Asset Packages browser.

Emission.Lifetime, Emission.LifetimeVariance, Emission.Radius, Emission.InitialSpeed, Emission.InitialSpeedVariance, Emission.ParticleScale

Emitter_Fire

Fire-effect flames: spawn in a disc on the XZ plane and rise with lateral spread.

Emission.Lifetime, Emission.LifetimeVariance, Emission.InitialSpeed, Emission.InitialSpeedVariance, Emission.ParticleScale, Emission.LateralSpread, Emission.Radius

Emitter_FromEvents

Subemitter spawn: one particle per event from bound event buffer.

Emission.SourceEventBuffer, Emission.SourceParticleDataBuffer, Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density, Emission.InitialVelocityStrengthFromParent, Emission.LifetimeFromParent, Emission.ScaleFromParent, Emission.InitialRotationFromParent, Emission.InitialAngularVelocityFromParent, Emission.InitialVelocityOrientToNormal, Emission.ParticlesPerEvent

Emitter_MeshEdges

Spawn along the triangle edges of a mesh.

Emission.Lifetime, Emission.InitialSpeed, Emission.EmitAlongNormal, Emission.IndexCount, Emission.Positions, Emission.Normals, Emission.Indices, Scale

Emitter_MeshSurface

Spawn on the triangles of a mesh.

Emission.Lifetime, Emission.InitialSpeed, Emission.EmitAlongNormal, Emission.IndexCount, Emission.Positions, Emission.Normals, Emission.Indices, Scale

Emitter_MeshVertices

Spawn at the vertices of a mesh.

Emission.Lifetime, Emission.InitialSpeed, Emission.EmitAlongNormal, Emission.IndexCount, Emission.Positions, Emission.Normals, Scale

Emitter_Point

Spawn at the emitter origin; cone or fountain through the velocity angles.

Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialVelocityOrientToNormal, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density

Emitter_Smoke_FromEvents

Subemitter spawn for smoke: slow upward drift with lateral spread. Not in the Asset Packages browser.

Emission.SourceEventBuffer, Emission.SourceParticleDataBuffer, Emission.Lifetime, Emission.LifetimeVariance, Emission.ParticleScale, Emission.RiseSpeed, Emission.SpreadSpeed, ScaleVariance

Emitter_Sparks_FromHit

Event-driven spark spawn triggered by hit events. Not in the Asset Packages browser.

Emission.SourceEventBuffer, Emission.SourceParticleDataBuffer, Emission.Lifetime, Emission.LifetimeVariance, Emission.ParticleScale, Emission.ScatterSpeed, Emission.NormalBias, ScaleVariance

Emitter_Sphere

Spawn on a sphere shell (or inside it with Emission.Volume).

Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialVelocityOrientToNormal, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density, Emission.Volume, Emission.Radius

Emitter_Torus

Spawn on the skin of a torus tube (or inside the tube with Emission.Volume).

Emission.Lifetime, Emission.LifetimeVariance, Emission.Scale, Emission.ScaleVariance, Emission.InitialVelocityStrength, Emission.InitialVelocityStrengthVariance, Emission.InitialVelocityDirection, Emission.InitialVelocityInnerAngle, Emission.InitialVelocityOuterAngle, Emission.InitialVelocityOrientToNormal, Emission.InitialRotation, Emission.InitialRotationVariance, Emission.InitialAngularVelocity, Emission.InitialAngularVelocityVariance, Emission.Density, Emission.MajorRadius, Emission.MinorRadius, Emission.Volume

Emission-count materials (→ ParticleEmitter.EmissionCountMaterial)

Each material’s row includes a MaximumAmount binding column with the suggested expression for ParticleEmitter.MaximumAmount. These are heuristics that keep the cap just above steady-state load; authors can override when they want a harder or looser cap.

Material

Role

Properties used

MaximumAmount binding

EmissionCount_FromEvents

Spawn N particles per event from the source emitter.

Emission.SourceEventBuffer, Emission.ParticlesPerEvent

Depends on the source emitter’s event rate; SourceEmitter.MaximumAmount * Emission.ParticlesPerEvent is an upper bound

EmissionCount_Schedule

Time-based emission: steady stream, periodic stream, or bursts.

Emission.Rate, Emission.RateVariance, Emission.OnDuration, Emission.OffDuration, Emission.ImpulseAtCycleStart, Emission.ImpulseVariance, Emission.Seed

Steady stream: ({./Emission.Lifetime} + {./Emission.LifetimeVariance}) * ({./Emission.Rate} + {./Emission.RateVariance}). For bursts see Sizing MaximumAmount

Affector materials (→ ParticleAffector.AffectorMaterial)

Material

Role

Properties used

Affector_Accelerate

Constant acceleration along a direction, with an optional sphere of influence.

Affector.Direction, Affector.Magnitude, Affector.Radius, Affector.FalloffExponent

Affector_Buoyancy

Upward force with turbulence (smoke).

Affector.MaxBuoyancy, Affector.BuoyancyFalloff, Affector.TurbulenceStrength, Affector.TurbulenceFrequency

Affector_CurlNoise

Curl-noise field.

Affector.Frequency, Affector.TimeScale, Affector.Strength, Affector.Radius, Affector.FalloffExponent

Affector_Directional

Directional force.

Affector.DirectionalStrength, Affector.Radius, Affector.FalloffExponent

Affector_Drag

Velocity damping.

Affector.DragCoefficient, Affector.Radius, Affector.FalloffExponent

Affector_Gravity

Constant downward acceleration.

—

Affector_KillZone

Kill particles inside/outside a region.

Affector.Radius, Affector.FalloffExponent

Affector_PointAttractor

Attractor toward a point.

Affector.Strength, Affector.Radius, Affector.FalloffExponent

Affector_TimeDilation

Scale local dt.

Affector.DilationFactor, Affector.Radius, Affector.FalloffExponent

Affector_VelocityClamp

Clamp speed.

Affector.MaxSpeed, Affector.Radius

Affector_Wind

Wind with gusts and height falloff.

Affector.WindSpeed, Affector.DragFactor, Affector.TurbulenceStrength, Affector.TurbulenceFrequency, Affector.GroundLevel, Affector.FullWindHeight, Affector.GustFrequency, Affector.GustAmplitude

Collider materials (→ ParticleCollider.ColliderMaterial)

Material

Role

Properties used

Collider_Box

Axis-aligned box collision (uses node scale).

Collider.KeepInside

Collider_Capsule

Capsule collision.

Collider.Radius, Collider.Height, Collider.KeepInside

Collider_Cone

Cone collision.

Collider.Angle, Collider.Height, Collider.KeepInside

Collider_Cylinder

Cylinder collision.

Collider.Radius, Collider.Height, Collider.KeepInside

Collider_DestructibleBox

Box collision whose cells break after Collider.DamageThreshold hits.

Collider.DamageThreshold

Collider_Plane

Infinite plane collision.

Collider.KeepInside

Collider_Sphere

Sphere collision.

Collider.Radius, Collider.KeepInside

Event-generator materials (→ ParticleEmitter.GenerateEventsMaterial)

Material

Role

Properties used

Event_AccelerationRange

Fires while the acceleration magnitude is within a range.

Events.AccelerationMin, Events.AccelerationMax, Events.Probability

Event_AgeRange

Fires on absolute-age band crossing (seconds, not normalised lifetime).

Events.AgeMin, Events.AgeMax, Events.Probability

Event_Lifetime

Fires on normalised-lifetime band crossing.

Events.LifetimeMin, Events.LifetimeMax, Events.Probability

Event_OnHit

Fires on collision hit; optional speed-range and probability gates.

Events.Probability, Events.VelocityMin, Events.VelocityMax

Event_Periodic

Fires once per interval, per particle, phase-anchored at birth.

Events.Interval, Events.Probability

Event_VelocityRange

Fires on speed-band crossing (symmetric, swept test).

Events.VelocityMin, Events.VelocityMax, Events.Probability

Particle-rendering materials (→ ParticleEmitter.ParticleMaterial)

Material

Role

Properties used

Particles

Default 2D particle material. Not in the Asset Packages browser.

—

Particles_Embers

Ember rendering for the Fire and Smoke exhibit. Not in the Asset Packages browser.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart

Particles_Fire

Flame rendering for the Fire and Smoke exhibit.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart

ParticlesColorOverLife

2-stop color/scale/opacity ramp over lifetime.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart

ParticlesColorOverLife3Stop

3-stop color/scale/opacity ramp with independent midpoints.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorMid, ParticlesOverLife.ColorMidPoint, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityMid, ParticlesOverLife.OpacityMidPoint, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleMid, ParticlesOverLife.ScaleMidPoint, ParticlesOverLife.ScaleStart

ParticlesColorOverLife_Green

Pre-configured green colour ramp instance of ParticlesColorOverLife.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart

ParticlesColorOverLife_Red

Pre-configured red colour ramp instance of ParticlesColorOverLife.

ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart

ParticlesSmoke

Soft, noisy smoke puffs (tuned for the Fire and Smoke exhibit). Not in the Asset Packages browser.

NoiseScale, ParticlesOverLife.ColorEnd, ParticlesOverLife.ColorStart, ParticlesOverLife.EdgeSoftness, ParticlesOverLife.OpacityEnd, ParticlesOverLife.OpacityStart, ParticlesOverLife.ScaleEnd, ParticlesOverLife.ScaleStart, SmokeColor

ParticlesVelocityColor

Color/scale driven by speed.

FastColor, FastScale, InvertBlend, SlowColor, SlowScale, SpeedThreshold, SpeedVariance

Open sections (to flesh out later)

  • Value ranges, units, and defaults for every asset-package property (Emission, Affector, Collider, Events, rendering).

  • Per-material exact property list: the compute material tables list the property types each material type declares, which can differ from the uniforms its shader reads. The rendering material table lists only properties that the shaders declare as uniforms.

  • Per-EmissionMaterial matrix: which shape or motion properties surface for each emitter.

  • Event-generator catalog: what each Event_* material emits and which accessor functions it uses.

  • Binding recipes: step-by-step for wiring a subemitter (source → subemitter event + particle-data buffers).

  • Recommended editor UX: grouping, conditional visibility based on selected material.

GPU buffer binding reference (for subemitters)

This section is called out explicitly because it is the single most opaque part of authoring a subemitter. Per editor-team feedback, it’s the first thing that needs a concrete answer.

Note

The property names below are shader-defined, not hard-coded. Emission.SourceEventBuffer and Emission.SourceParticleDataBuffer are the conventional names used by the shipped Emitter_FromEvents and EmissionCount_FromEvents materials because those shaders declare uniforms with those names. A custom emission or emission-count material can declare uniforms with any names it wants: in which case the subemitter has to carry those property names and the binding targets change accordingly. In other words: the binding wires a producer property (always ParticleEmitter.EventBuffer / ParticleEmitter.ParticleDataBuffer, defined by the plugin) to a consumer property whose name is chosen by whatever compute shader is reading the buffer.

What you’re wiring

A subemitter reads two buffers produced by its source emitter. Using the conventional names from the stock materials:

Subemitter target property

Source emitter property

Purpose

Emission.SourceEventBuffer

ParticleEmitter.EventBuffer

Per-event records the source wrote via its GenerateEventsMaterial.

Emission.SourceParticleDataBuffer

ParticleEmitter.ParticleDataBuffer

Source emitter’s live particle data, so the subemitter can read origin particle state per event.

Each wire is a BindingItem child on the subemitter node with one BindingSourceItem underneath.

Concrete one-liner (target expression)

In a sibling layout where Source and Subemitter share a parent, the target-side expression (BindingItem.DisplayCodeForMerge) is:

{@../Source/ParticleEmitter.EventBuffer}

and:

{@../Source/ParticleEmitter.ParticleDataBuffer}

The BindingItem.RawCode is simply {0} (it references the first and only BindingSourceItem).

Working reference: assets/ParticlesAssetPackage/Screens/Screen/RootNode/Viewport 2D/Scene/Exhibit 6/Particle System/On Hit/Subemitter.kzm: binds to a sibling named Source.

Required BindingItem shape

Each binding needs all of:

  • BindingItem.Target → the shader-declared consumer property (e.g. Emission.SourceEventBuffer / Emission.SourceParticleDataBuffer for stock materials), PropertyTypeReference, WHOLE_PROPERTY.

  • BindingItem.BindingMode = ONE_WAY.

  • BindingItem.PushTarget → the subemitter itself (absolute ProjectItemPath to this node). This is load-bearing: without the push target the buffer handle never arrives at the GPU-side property.

  • BindingItem.IsBindingEnabled = true.

  • One BindingSourceItem child named "0" whose BindingSourceItem.Item points to the source emitter (absolute path) and whose BindingSourceItem.Source is the PropertyTypeReference ParticleEmitter.EventBuffer / ParticleEmitter.ParticleDataBuffer.

Gotchas

  • The buffer-typed consumer property still has to be declared on the node. The shader-declared property (e.g. Emission.SourceEventBuffer) must be present as an empty ProjectItemReference on the subemitter node even though the value comes from the binding. If you omit the literal property the binding has nothing to write into.

  • ``PushTarget`` must reference the subemitter itself, not the source. The binding pulls from Source and pushes into Subemitter.

  • The subemitter needs ``EmissionMaterial`` = ``Emitter_FromEvents`` and EmissionCountMaterial = EmissionCount_FromEvents (or custom materials declaring the matching consumer properties), otherwise the bound buffers are never consumed.

  • ``ParticleMaterial`` is required on the subemitter. Without it the emitter spawns invisible particles; easy to misread as “subemitter not firing”.

  • Absolute paths in BindingSourceItem.Item and BindingItem.PushTarget are resolved via ProjectItemPath, so moving or renaming either node invalidates the binding: the editor should rewrite these paths on rename.