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
PropertyTypein 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.ParticleDataBufferon a source emitter), and input buffers a consuming node reads from (Emission.SourceEventBuffer,Emission.SourceParticleDataBufferon a subemitter). The author doesn’t type a value into an input buffer property: it gets populated by aBindingthat 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 |
|---|---|---|---|---|---|
|
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. |
|
Enum: |
|
— |
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. |
|
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
ParticleSystemor groupingEmptyNode(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 |
|---|---|---|---|---|---|
|
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. |
|
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. |
|
ResourceID (Material) |
— |
— |
Emission |
Compute material that implements EmitParticle(). Defines the spawn position, velocity, and initial state of each new particle. |
|
Int |
5000 |
0 .. 2000000 (step 10) |
Emission |
Maximum amount of particles for this emitter. [1] |
|
ResourceID (Buffer) |
— |
— |
Events |
GPU buffer populated by the Event Generate Material. Read-only; automatically allocated and updated by the emitter. [2] |
|
ResourceID (Material) |
— |
— |
Events |
Event generation material. Compute shader that writes events (e.g. death events) to the EventBuffer. |
|
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] |
|
ResourceID (Material) |
— |
— |
Rendering |
2D/3D particle material. This defines the look and behavior of the particles. |
|
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. |
|
Enum: |
|
— |
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 |
|---|---|---|---|---|---|
|
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 |
|---|---|---|---|---|---|
|
Float |
0.5 |
0.0 .. 1.0 (step 0.01) |
Collider |
Coefficient of restitution [0..1]. 0 = inelastic (no bounce), 1 = perfectly elastic. |
|
ResourceID (Material) |
— |
— |
Collider |
Collider material. Must contain a compute shader that includes Particles/collider.glsl and implements HitInfo Collide(mat4, vec3, vec3). |
|
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 |
|---|---|---|---|---|---|---|
|
Float |
10 |
0 |
50000 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0.5,0.5,0.5 |
0,0,0 |
100,100,100 |
Emission |
— |
|
Float |
0 |
0 |
1 |
Emission |
— |
|
Float |
0 |
0 |
1 |
Emission |
— |
|
Float |
1 |
0 |
100 |
Emission |
— |
|
Bool |
false |
— |
— |
Emission |
— |
|
Float |
0 |
0 |
100000 |
Emission |
Particles emitted in a single burst at the start of each cycle. Float to preserve the fractional accumulator tail. |
|
Float |
0 |
0 |
100000 |
Emission |
Symmetric +/- variance band on ImpulseAtCycleStart, rolled once per cycle. |
|
Int |
0 |
-2147483648 |
2147483647 |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,0 |
-62.8318558,-62.8318558,-62.8318558 |
62.8318558,62.8318558,62.8318558 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,0 |
0,0,0 |
100,100,100 |
Emission |
— |
|
Float |
1 |
0 |
100 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,0 |
-6.28318548,-6.28318548,-6.28318548 |
6.28318548,6.28318548,6.28318548 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,0 |
0,0,0 |
100,100,100 |
Emission |
— |
|
Float |
4 |
0 |
20 |
Emission |
— |
|
Float |
1 |
0 |
10 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,1 |
-1,-1,-1 |
1,1,1 |
Emission |
— |
|
Float |
0 |
0 |
3.14159274 |
Emission |
— |
|
Bool |
true |
— |
— |
Emission |
Surface emission only: reinterprets InitialVelocityDirection in a frame where +Z is the spawn surface normal. Ignored when Volume = true. |
|
Float |
3.14159274 |
0 |
3.14159274 |
Emission |
— |
|
Float |
1 |
0 |
100 |
Emission |
— |
|
Float |
0 |
0 |
100 |
Emission |
— |
|
Float |
15 |
0 |
90 |
Emission |
— |
|
Float |
0 |
0 |
1 |
Emission |
— |
|
Float |
0 |
0 |
10 |
Emission |
— |
|
Float |
1 |
0 |
10 |
Emission |
— |
|
Float |
0 |
0 |
5 |
Emission |
— |
|
Float |
1 |
0 |
1 |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Float |
0.5 |
0 |
1 |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Float |
0.25 |
0 |
1 |
Emission |
— |
|
Float |
0.300000012 |
0 |
1 |
Emission |
Pulls spark scatter direction toward the surface normal. 0 = full hemisphere, 1 = along normal only. |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Float |
0 |
0 |
1 |
Emission |
— |
|
Float |
0 |
0 |
1 |
Emission |
— |
|
Float |
45 |
0 |
90 |
Emission |
— |
|
Float |
1 |
0 |
10 |
Emission |
— |
|
Float |
0.0500000007 |
0.00999999978 |
2 |
Emission |
— |
|
Int |
0 |
-2147483648 |
2147483647 |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Float |
1 |
0.100000001 |
100 |
Emission |
— |
|
Float |
10 |
0 |
50000 |
Emission |
Particles per second emitted during the cycle on-phase. |
|
Float |
0 |
0 |
50000 |
Emission |
Symmetric +/- variance band on Rate, rolled once per frame. |
|
Float |
2 |
0 |
20 |
Emission |
— |
|
Vector3DDynamicPropertyType |
1,1,1 |
0,0,0 |
100,100,100 |
Emission |
— |
|
Vector3DDynamicPropertyType |
0,0,0 |
0,0,0 |
100,100,100 |
Emission |
— |
|
Float |
5 |
0 |
50 |
Emission |
Base speed of spark particles scattered from a hit event. |
|
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. |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
Buffer holding the source emitter’s particle data, used by subemitters to read source particle state at event time. |
|
Float |
1 |
0 |
20 |
Emission |
— |
|
Buffer ref |
— |
— |
— |
Emission |
— |
|
Bool |
false |
— |
— |
Emission |
— |
|
Bool |
false |
— |
— |
Emission |
— |
Affector¶
Property |
Type |
Default |
Min |
Max |
Category |
Tooltip |
|---|---|---|---|---|---|---|
|
Float |
1 |
0.100000001 |
5 |
Affector |
— |
|
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. |
|
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. |
|
Float |
0 |
0 |
15 |
Affector |
— |
|
Float |
0 |
0 |
1 |
Affector |
— |
|
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. |
|
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. |
|
Float |
0 |
0 |
1 |
Affector |
— |
|
Float |
0 |
0 |
1 |
Affector |
— |
|
Float |
5 |
0 |
50 |
Affector |
World-space Y height where wind reaches full strength. Between GroundLevel and this height, wind ramps up smoothly (smoothstep). |
|
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. |
|
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. |
|
Float |
2 |
0 |
20 |
Affector |
Spatial frequency of wind gusts. Higher values create more rapid variation as particles move through the wind field. |
|
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. |
|
Float |
18 |
0 |
50 |
Affector |
— |
|
Float |
0 |
0 |
1 |
Affector |
— |
|
Float |
0 |
0 |
100 |
Affector |
— |
|
Float |
0 |
0 |
10 |
Affector |
— |
|
Float |
0 |
0 |
1 |
Affector |
— |
|
Float |
5 |
0 |
20 |
Affector |
— |
|
Float |
3 |
0 |
20 |
Affector |
— |
|
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 |
|---|---|---|---|---|---|---|
|
Float |
30 |
1 |
89 |
Collider |
Half-angle of the cone collider in degrees. 0 is a line, 90 would be a flat disc. |
|
Bool |
false |
— |
— |
Collider |
— |
|
Int |
0 |
-2147483648 |
2147483647 |
Collider |
— |
|
Float |
2 |
0 |
50 |
Collider |
Height of the collider shape along its local Y axis. |
|
Float |
0 |
0 |
100 |
Collider |
— |
Events¶
Property |
Type |
Default |
Min |
Max |
Category |
Tooltip |
|---|---|---|---|---|---|---|
|
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”. |
|
Float |
0 |
0 |
100 |
Events |
Lower bound of the acceleration-magnitude band (plugin acceleration units) within which events fire. Snapshot test, evaluated each frame. |
|
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”. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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”. |
|
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 |
|---|---|---|
|
Color |
|
|
Scale |
All |
|
Opacity |
All |
|
Color (3-stop) |
|
|
Scale (3-stop) |
|
|
Opacity (3-stop) |
|
|
Velocity |
|
Non-particle rendering (environment)¶
These drive the WorldGrid / Glass materials used in the exhibit scenery and aren’t particle-specific.
Property |
Used by |
|---|---|
|
|
|
|
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 |
|---|---|---|
|
TBD |
|
|
TBD |
|
|
TBD |
|
|
TBD |
|
|
Subemitter spawn: one particle per event from bound event buffer. |
|
|
TBD |
|
|
TBD |
|
|
TBD |
|
|
TBD |
|
|
TBD |
|
|
Event-driven spark spawn triggered by hit events. |
|
|
TBD |
|
|
TBD |
|
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 |
|
|---|---|---|---|
|
Event-driven count. |
|
TBD |
|
Spawn N particles per event from source emitter. |
|
TBD: depends on source emitter’s event rate; typically |
|
TBD |
|
TBD |
Affector materials (→ ParticleAffector.AffectorMaterial)¶
Material |
Role |
Properties used |
|---|---|---|
|
TBD |
|
|
Upward force with turbulence (smoke). |
|
|
Curl-noise field. |
|
|
Directional force. |
|
|
Velocity damping. |
|
|
Constant downward acceleration. |
— |
|
Kill particles inside/outside a region. |
|
|
Attractor toward a point. |
|
|
Scale local dt. |
|
|
Clamp speed. |
|
|
Wind with gusts and height falloff. |
|
Collider materials (→ ParticleCollider.ColliderMaterial)¶
Material |
Role |
Properties used |
|---|---|---|
|
Axis-aligned box collision (uses node scale). |
— |
|
Capsule collision. |
|
|
Cone collision. |
|
|
Cylinder collision. |
|
|
TBD |
|
|
Infinite plane collision. |
— |
|
Sphere collision. |
|
Event-generator materials (→ ParticleEmitter.GenerateEventsMaterial)¶
Material |
Role |
Properties used |
|---|---|---|
|
Fires on normalised-lifetime band crossing. |
|
|
Fires on speed-band crossing (symmetric, swept test). |
|
|
Fires on collision hit; optional speed-range and probability gates. |
|
|
Fires on absolute-age band crossing (seconds, not normalised lifetime). |
|
|
Fires once per interval, per particle, phase-anchored at birth. |
|
Particle-rendering materials (→ ParticleEmitter.ParticleMaterial)¶
Material |
Role |
Properties used |
|---|---|---|
|
TBD |
— |
|
2-stop color/scale/opacity ramp over lifetime. |
|
|
Pre-configured green colour ramp instance of |
Same as |
|
Pre-configured red colour ramp instance of |
Same as |
|
3-stop color/scale/opacity ramp with independent midpoints. |
All |
|
TBD |
|
|
Color/scale driven by speed. |
|
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
TBDentries with the definitive uniforms each material consumes.Per-
EmissionMaterialmatrix: 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 |
|---|---|---|
|
|
Per-event records the source wrote via its |
|
|
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.SourceParticleDataBufferfor stock materials),PropertyTypeReference,WHOLE_PROPERTY.BindingItem.BindingMode=ONE_WAY.BindingItem.PushTarget→ the subemitter itself (absoluteProjectItemPathto this node). This is load-bearing: without the push target the buffer handle never arrives at the GPU-side property.BindingItem.IsBindingEnabled=true.One
BindingSourceItemchild named"0"whoseBindingSourceItem.Itempoints to the source emitter (absolute path) and whoseBindingSourceItem.Sourceis thePropertyTypeReferenceParticleEmitter.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 emptyProjectItemReferenceon 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
Sourceand pushes intoSubemitter.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.ItemandBindingItem.PushTargetare resolved viaProjectItemPath, so moving or renaming either node invalidates the binding: the editor should rewrite these paths on rename.