From 1cdf09a3c419b95ea7119783703875db19f3d7cc Mon Sep 17 00:00:00 2001 From: Aymeric Rabot Date: Tue, 4 Aug 2026 13:02:49 -0400 Subject: [PATCH] fix(nodes): guard missing roof-segment trim in ridge-vent geometry key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Roof-segments migrated on scene load are cast rather than zod-parsed, so a segment saved before `trim` existed reaches the renderer with the field absent and the geometry key crashed reading `trim.left` off undefined. Route the key through core's `normalizeRoofSegmentTrim`, matching what `use-segment-trim-clip` and `ridge-vent/geometry` already do. Besides handling the absent field, this makes the cache key agree with the trim the geometry is actually built from — an out-of-range trim normalizes to a clamped value, so keying on the raw field could otherwise vary while the built mesh did not. Co-Authored-By: Claude Opus 5 --- packages/core/src/schema/nodes/roof-segment-trim.test.ts | 9 +++++++++ packages/nodes/src/ridge-vent/renderer.tsx | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/core/src/schema/nodes/roof-segment-trim.test.ts b/packages/core/src/schema/nodes/roof-segment-trim.test.ts index d35de190c..ad2923107 100644 --- a/packages/core/src/schema/nodes/roof-segment-trim.test.ts +++ b/packages/core/src/schema/nodes/roof-segment-trim.test.ts @@ -32,6 +32,15 @@ describe('roof segment trim', () => { }) }) + // Scene loading casts migrated roof-segments instead of zod-parsing them, so a + // segment saved before `trim` existed reaches renderers with the field absent. + test('tolerates a segment carrying no trim at all', () => { + const trim = normalizeRoofSegmentTrim({ width: 8, depth: 6 }) + + expect(trim.left).toBe(0) + expect(trim.backRightZ).toBe(0) + }) + test('normalizes impossible side totals without inverting the footprint', () => { const trim = normalizeRoofSegmentTrim({ width: 4, diff --git a/packages/nodes/src/ridge-vent/renderer.tsx b/packages/nodes/src/ridge-vent/renderer.tsx index 635917034..8398ae830 100644 --- a/packages/nodes/src/ridge-vent/renderer.tsx +++ b/packages/nodes/src/ridge-vent/renderer.tsx @@ -4,6 +4,7 @@ import { type AnyNodeId, getEffectiveRoofSurfaceMaterial, getEffectiveSegmentSurfaceMaterial, + normalizeRoofSegmentTrim, type RidgeVentNode, type RoofNode, type RoofSegmentNode, @@ -29,7 +30,7 @@ import { buildRidgeVentGeometry } from './geometry' function ridgeVentSegmentGeometryKey(segment: RoofSegmentNode | undefined): string { if (!segment) return 'none' - const trim = segment.trim + const trim = normalizeRoofSegmentTrim(segment) return [ segment.roofType, segment.width,