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 emit_rate for time-based emission or a custom shader to read from an event buffer.

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. Assign a mesh to render each particle as that mesh.

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.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.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

Surface emission only: reinterprets InitialVelocityDirection in a frame where +Z is the spawn surface normal. Ignored when Volume = true.

Emission.InitialVelocityOuterAngle

Float

3.14159274

0

3.14159274

Emission

Emission.InitialVelocityStrength

Float

1

0

100

Emission

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.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

0

-2147483648

2147483647

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.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.ContainMode

Bool

false

Collider

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.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

TBD

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

TBD

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

TBD

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

Emitter_Fire

TBD

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

Emitter_MeshEdges

TBD

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

Emitter_MeshSurface

TBD

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

Emitter_MeshVertices

TBD

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

Emitter_Point

TBD

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

TBD

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.

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

Emitter_Sphere

TBD

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

TBD

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

Event-driven count.

Emission.SourceEventBuffer, Emission.ParticlesPerEvent

TBD

EmissionCount_PerEvent

Spawn N particles per event from source emitter.

Emission.ParticlesPerEvent, Emission.SourceEventBuffer

TBD: depends on source emitter’s event rate; typically SourceEmitter.MaximumAmount * Emission.ParticlesPerEvent as an upper bound

EmissionCount_Schedule

TBD

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

TBD

Affector materials (→ ParticleAffector.AffectorMaterial)

Material

Role

Properties used

Affector_Accelerate

TBD

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_Capsule

Capsule collision.

Collider.Radius, Collider.Height

Collider_Cone

Cone collision.

Collider.Angle, Collider.Height

Collider_Cylinder

Cylinder collision.

Collider.Radius, Collider.Height

Collider_DestructibleBox

TBD

Collider.DamageThreshold

Collider_Plane

Infinite plane collision.

Collider_Sphere

Sphere collision.

Collider.Radius

Event-generator materials (→ ParticleEmitter.GenerateEventsMaterial)

Material

Role

Properties used

Event_Lifetime

Fires on normalised-lifetime band crossing.

Events.LifetimeMin, Events.LifetimeMax, Events.Probability

Event_VelocityRange

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

Events.VelocityMin, Events.VelocityMax, Events.Probability

Event_OnHit

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

Events.Probability, Events.VelocityMin, Events.VelocityMax

Event_AgeRange

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

Events.AgeMin, Events.AgeMax, Events.Probability

Event_Periodic

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

Events.Interval, Events.Probability

Particle-rendering materials (→ ParticleEmitter.ParticleMaterial)

Material

Role

Properties used

Particles

TBD

ParticlesColorOverLife

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

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

ParticlesColorOverLife_Green

Pre-configured green colour ramp instance of ParticlesColorOverLife.

Same as ParticlesColorOverLife.

ParticlesColorOverLife_Red

Pre-configured red colour ramp instance of ParticlesColorOverLife.

Same as ParticlesColorOverLife.

ParticlesColorOverLife3Stop

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

All ParticlesColorOverLife properties plus ParticlesOverLife.ColorMid, ParticlesOverLife.ColorMidPoint, ParticlesOverLife.ScaleMid, ParticlesOverLife.ScaleMidPoint, ParticlesOverLife.OpacityMid, ParticlesOverLife.OpacityMidPoint

ParticlesSmoke

TBD

SmokeColor, NoiseScale, EdgeSoftness

ParticlesVelocityColor

Color/scale driven by speed.

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

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: replacing the TBD entries with the definitive uniforms each material consumes.

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

  • Event-generator catalog: what each GenerateEvent_* 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_PerEvent 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.PushTargetthe 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_PerEvent (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.