BabylonJS/Babylon.js · error

GaussianSplattingStream: streaming part was not reserved.

Error message

GaussianSplattingStream: streaming part was not reserved.

What it means

GaussianSplatting streaming requires reserving a streaming part before a controller can be attached; the part is exposed via streamingPartProxy. If the proxy is absent after the stream was created and prepared, the reservation never happened (or was released), so the function disposes the stream and throws. This is an internal invariant check protecting against downloading/decoding into a part that does not exist.

Source

Thrown at packages/dev/loaders/src/SPLAT/gaussianSplattingStream.ts:2781

 */
export async function AddGaussianSplattingStreamPartAsync(
    compound: GaussianSplattingMesh,
    name: string,
    metadata: ISOGLODMetadata,
    rootUrl: string,
    options: IGaussianSplattingStreamOptions = {}
): Promise<GaussianSplattingPartProxyMesh> {
    const stream = new GaussianSplattingStream(name, metadata, rootUrl, compound.getScene(), { ...options, hostCompound: compound });
    try {
        await stream.whenPartReadyAsync();
    } catch (e) {
        stream.dispose();
        throw e;
    }
    const proxy = stream.streamingPartProxy;
    if (!proxy) {
        stream.dispose();
        throw new Error("GaussianSplattingStream: streaming part was not reserved.");
    }
    // The controller already binds its own lifetime to the part (removePart / compound disposal dispose the stream,
    // and stream disposal releases the reserved part) — wired at reservation inside the stream, so it also covers the
    // download/decode window before this promise resolves. Nothing to register here.
    return proxy;
}

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Reserve the streaming part on the stream before obtaining streamingPartProxy.
  2. Do not dispose or release the reserved part between reservation and this call.
  3. Use the library's public streaming API (which handles reservation internally) instead of touching the stream directly.
  4. Check for early disposal in your lifecycle code (mesh/scene dispose) that could release the part.

Example fix

// before
const stream = new GaussianSplattingStream(...);
const proxy = getStreamingProxy(stream); // throws: part not reserved
// after
const stream = new GaussianSplattingStream(...);
stream.reserveStreamingPart(size); // reserve first
const proxy = getStreamingProxy(stream);
Defensive patterns

Strategy: validation

Validate before calling

const proxy = stream.streamingPartProxy;
if (!proxy) {
  throw new Error("Call reserveStreamingPart() before requesting the streaming proxy");
}

Type guard

function hasReservedPart(stream: GaussianSplattingStream): boolean {
  return stream.streamingPartProxy != null;
}

Try / catch

try {
  const proxy = acquireStreamingProxy(stream);
} catch (e) {
  if (String(e.message).includes("streaming part was not reserved")) {
    stream.reserveStreamingPart(requiredSize);
    return acquireStreamingProxy(stream);
  }
  throw e;
}

Prevention

When it happens

Trigger: Requesting a streaming splat controller when the stream's streaming part was not reserved beforehand — e.g. calling the streaming setup path without first reserving capacity, or after the part was consumed/released.

Common situations: Custom streaming code that creates a GaussianSplattingStream directly and skips the reservation step; double-consuming a reserved part; earlier dispose() releasing the part before this call.

Related errors


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