BabylonJS/Babylon.js · error

No particle systems were produced by the node particle syste

Error message

No particle systems were produced by the node particle system.

What it means

NodeParticleSystemSet.buildAsync(scene) compiles the node particle set into concrete particle systems. The library expects a successfully built set to yield at least one system; if the produced array is empty the build effectively yielded nothing usable, so the extension throws instead of returning an invalid/empty result. This guards downstream code that assumes systems[0] exists.

Source

Thrown at packages/dev/inspector-v2/src/extensions/quickCreate/particles.tsx:76

                system.start();
                resolve(system);
            }, 0);
        });
    };

    const handleCreateNodeAsync = async () => {
        let nodeParticleSet;
        const snippetId = nodeParticleSystemSnippetId.trim();
        if (snippetId) {
            nodeParticleSet = await NodeParticleSystemSet.ParseFromSnippetAsync(snippetId);
            nodeParticleSet.name = nodeParticleSystemName;
        } else {
            nodeParticleSet = NodeParticleSystemSet.CreateDefault(nodeParticleSystemName);
        }
        const particleSystemSet = await nodeParticleSet.buildAsync(scene);
        const systems = particleSystemSet.systems;
        if (systems.length === 0) {
            throw new Error("No particle systems were produced by the node particle system.");
        }
        for (const system of systems) {
            system.name = nodeParticleSystemName;
        }
        particleSystemSet.start();
        return systems[0];
    };

    return (
        <QuickCreateSection>
            {/* CPU Particle System */}
            <QuickCreateItem selectionService={selectionService} label="CPU Particle System" onCreate={handleCreateCPUAsync}>
                <TextInputPropertyLine label="Name" value={cpuParticleSystemName} onChange={(value) => setCpuParticleSystemName(value)} />
                <SpinButtonPropertyLine
                    label="Capacity"
                    value={cpuParticleSystemCapacity}
                    onChange={(value) => setCpuParticleSystemCapacity(value)}
                    min={1}

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Verify the node particle set graph has a complete, connected emitter/output chain before calling buildAsync.
  2. Wait for scene.whenReadyAsync() and ensure the engine is initialized before building the set.
  3. Re-export the node particle set with a matching Babylon.js version (node particle system API changed across versions).
  4. Log particleSystemSet.systems length and the set's block graph to find why compilation produced no systems; fall back to NodeParticleSystemSet.CreateDefault to confirm the runtime itself works.

Example fix

// before
const set = NodeParticleSystemSet.Parse(serializedJson, scene);
const particleSystemSet = await set.buildAsync(scene); // throws if 0 systems

// after
await scene.whenReadyAsync();
const particleSystemSet = await set.buildAsync(scene);
if (particleSystemSet.systems.length === 0) {
  console.warn("Node particle set produced no systems; using default");
  const fallback = await NodeParticleSystemSet.CreateDefault("default").buildAsync(scene);
  fallback.start();
}
else {
  particleSystemSet.start();
}
Defensive patterns

Strategy: validation

Validate before calling

const particleSystemSet = await nodeParticleSet.buildAsync(scene);
if (!particleSystemSet || particleSystemSet.systems.length === 0) {
  throw new Error("Node particle set built zero systems");
}

Type guard

function hasSystems(set: { systems: unknown[] }): set is { systems: [unknown, ...unknown[]] } {
  return Array.isArray(set?.systems) && set.systems.length > 0;
}

Try / catch

try {
  const systems = await buildNodeParticles(scene);
  systems[0].name = name;
} catch (e) {
  if (e instanceof Error && e.message.includes("No particle systems")) {
    rebuildWithDefaultSet(scene);
  } else {
    throw e;
  }
}

Prevention

When it happens

Trigger: Calling buildAsync on a NodeParticleSystemSet (including CreateDefault) that compiles to zero systems — e.g. a custom/loaded node graph with no emitter blocks wired to output, or a default set failing to expand on the current engine.

Common situations: Loading a serialized node particle set JSON that was hand-edited or exported from an incompatible Babylon version; building a programmatically constructed set before all required blocks were added; engine/scene not fully ready when buildAsync resolves; version mismatch between the node particle editor export and runtime library.

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/2ab0a08098148c0d. Report an issue: GitHub.