From f7e774485c94d4ec82669e53f4ddb6420c8c4f8e Mon Sep 17 00:00:00 2001 From: Wassim SAMAD Date: Wed, 17 Jun 2026 20:57:46 -0400 Subject: [PATCH] fix(paint-slots): guard empty fence slot group before mergeGeometries mergeGeometries throws on an empty array, so an absent slot group (infill with showInfill off, base on a floating fence) crashed the geometry build. Return an empty BufferGeometry for an empty group; the renderer already skips meshes with no position attribute. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/viewer/src/systems/fence/fence-system.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/viewer/src/systems/fence/fence-system.tsx b/packages/viewer/src/systems/fence/fence-system.tsx index 9e49d91d..133d6113 100644 --- a/packages/viewer/src/systems/fence/fence-system.tsx +++ b/packages/viewer/src/systems/fence/fence-system.tsx @@ -252,6 +252,10 @@ function createFenceParts(fence: FenceNode): FenceSlotParts { } function mergeFenceParts(parts: FencePart[]): THREE.BufferGeometry { + // An empty slot group (e.g. infill with showInfill off, or base on a floating + // fence) must not reach mergeGeometries — it throws on an empty array. The + // empty geometry has no position attribute, so the renderer skips its mesh. + if (parts.length === 0) return new THREE.BufferGeometry() const geometries = parts.map(createFencePartGeometry) const merged = mergeGeometries(geometries, false) ?? new THREE.BufferGeometry() geometries.forEach((geometry) => {