@pascal-app/core 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/bus.d.ts +30 -2
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
- package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
- package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
- package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
- package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
- package/dist/hooks/scene-registry/scene-registry.js +27 -1
- package/dist/hooks/scene-registry/scene-registry.test.d.ts +2 -0
- package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +1 -0
- package/dist/hooks/scene-registry/scene-registry.test.js +26 -0
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +93 -0
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +69 -12
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +476 -195
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +19 -1
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +2 -0
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +363 -0
- package/dist/index.d.ts +16 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -5
- package/dist/lib/level-name.d.ts +4 -0
- package/dist/lib/level-name.d.ts.map +1 -0
- package/dist/lib/level-name.js +10 -0
- package/dist/lib/measurement-geometry.d.ts +19 -0
- package/dist/lib/measurement-geometry.d.ts.map +1 -0
- package/dist/lib/measurement-geometry.js +232 -0
- package/dist/lib/measurement-geometry.test.d.ts +2 -0
- package/dist/lib/measurement-geometry.test.d.ts.map +1 -0
- package/dist/lib/measurement-geometry.test.js +102 -0
- package/dist/lib/polygon-geometry.d.ts +0 -1
- package/dist/lib/polygon-geometry.d.ts.map +1 -1
- package/dist/lib/polygon-geometry.js +0 -18
- package/dist/lib/selection-proxy.d.ts +4 -0
- package/dist/lib/selection-proxy.d.ts.map +1 -0
- package/dist/lib/selection-proxy.js +12 -0
- package/dist/lib/slab-polygon.d.ts +31 -2
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +525 -31
- package/dist/lib/slab-polygon.test.d.ts +2 -0
- package/dist/lib/slab-polygon.test.d.ts.map +1 -0
- package/dist/lib/slab-polygon.test.js +635 -0
- package/dist/lib/slots.d.ts +14 -0
- package/dist/lib/slots.d.ts.map +1 -0
- package/dist/lib/slots.js +26 -0
- package/dist/lib/space-detection.d.ts +25 -2
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +414 -118
- package/dist/lib/space-detection.test.js +301 -2
- package/dist/lib/wall-distance.d.ts +60 -0
- package/dist/lib/wall-distance.d.ts.map +1 -0
- package/dist/lib/wall-distance.js +85 -0
- package/dist/lib/zone-quantities.d.ts +21 -0
- package/dist/lib/zone-quantities.d.ts.map +1 -0
- package/dist/lib/zone-quantities.js +183 -0
- package/dist/lib/zone-quantities.test.d.ts +2 -0
- package/dist/lib/zone-quantities.test.d.ts.map +1 -0
- package/dist/lib/zone-quantities.test.js +82 -0
- package/dist/material-library.d.ts +20 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +2181 -441
- package/dist/registry/handles.d.ts +75 -2
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +3 -3
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/registry/registry.d.ts +46 -3
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +82 -1
- package/dist/registry/registry.test.js +14 -1
- package/dist/registry/subtree.d.ts.map +1 -1
- package/dist/registry/subtree.js +4 -0
- package/dist/registry/subtree.test.js +30 -0
- package/dist/registry/types.d.ts +717 -38
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/schema/index.d.ts +21 -5
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +17 -3
- package/dist/schema/material.d.ts +3 -2
- package/dist/schema/material.d.ts.map +1 -1
- package/dist/schema/material.js +7 -5
- package/dist/schema/material.test.d.ts +2 -0
- package/dist/schema/material.test.d.ts.map +1 -0
- package/dist/schema/material.test.js +43 -0
- package/dist/schema/nodes/box-vent.d.ts +2 -2
- package/dist/schema/nodes/cabinet.d.ts +534 -0
- package/dist/schema/nodes/cabinet.d.ts.map +1 -0
- package/dist/schema/nodes/cabinet.js +137 -0
- package/dist/schema/nodes/ceiling.d.ts +3 -2
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +4 -0
- package/dist/schema/nodes/chimney.d.ts +4 -4
- package/dist/schema/nodes/column.d.ts +3 -2
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +3 -0
- package/dist/schema/nodes/cupola.d.ts +2 -2
- package/dist/schema/nodes/door.d.ts +13 -5
- package/dist/schema/nodes/door.d.ts.map +1 -1
- package/dist/schema/nodes/door.js +12 -0
- package/dist/schema/nodes/dormer.d.ts +8 -8
- package/dist/schema/nodes/dormer.js +1 -1
- package/dist/schema/nodes/downspout.d.ts +2 -2
- package/dist/schema/nodes/duct-fitting.d.ts +91 -0
- package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
- package/dist/schema/nodes/duct-fitting.js +92 -0
- package/dist/schema/nodes/duct-segment.d.ts +61 -0
- package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
- package/dist/schema/nodes/duct-segment.js +73 -0
- package/dist/schema/nodes/duct-terminal.d.ts +57 -0
- package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
- package/dist/schema/nodes/duct-terminal.js +51 -0
- package/dist/schema/nodes/elevator.d.ts +3 -2
- package/dist/schema/nodes/elevator.d.ts.map +1 -1
- package/dist/schema/nodes/elevator.js +3 -0
- package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
- package/dist/schema/nodes/fence.d.ts +18 -2
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +25 -2
- package/dist/schema/nodes/gutter.d.ts +2 -2
- package/dist/schema/nodes/hvac-equipment.d.ts +63 -0
- package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
- package/dist/schema/nodes/hvac-equipment.js +55 -0
- package/dist/schema/nodes/item.d.ts +8 -0
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +11 -0
- package/dist/schema/nodes/level.d.ts +1 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +2 -0
- package/dist/schema/nodes/lineset.d.ts +42 -0
- package/dist/schema/nodes/lineset.d.ts.map +1 -0
- package/dist/schema/nodes/lineset.js +38 -0
- package/dist/schema/nodes/liquid-line.d.ts +34 -0
- package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
- package/dist/schema/nodes/liquid-line.js +24 -0
- package/dist/schema/nodes/measurement.d.ts +306 -0
- package/dist/schema/nodes/measurement.d.ts.map +1 -0
- package/dist/schema/nodes/measurement.js +87 -0
- package/dist/schema/nodes/measurement.test.d.ts +2 -0
- package/dist/schema/nodes/measurement.test.d.ts.map +1 -0
- package/dist/schema/nodes/measurement.test.js +139 -0
- package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
- package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
- package/dist/schema/nodes/pipe-fitting.js +45 -0
- package/dist/schema/nodes/pipe-segment.d.ts +48 -0
- package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
- package/dist/schema/nodes/pipe-segment.js +36 -0
- package/dist/schema/nodes/pipe-trap.d.ts +43 -0
- package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
- package/dist/schema/nodes/pipe-trap.js +36 -0
- package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +2 -0
- package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +1 -0
- package/dist/schema/nodes/ridge-vent-defaults.test.js +205 -0
- package/dist/schema/nodes/ridge-vent.d.ts +18 -3
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
- package/dist/schema/nodes/ridge-vent.js +221 -3
- package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
- package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-shape.js +318 -0
- package/dist/schema/nodes/roof-segment-shape.test.d.ts +2 -0
- package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-shape.test.js +175 -0
- package/dist/schema/nodes/roof-segment-surface.test.d.ts +2 -0
- package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-surface.test.js +48 -0
- package/dist/schema/nodes/roof-segment-trim.test.d.ts +2 -0
- package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-trim.test.js +107 -0
- package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
- package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-walls.js +330 -0
- package/dist/schema/nodes/roof-segment-walls.test.d.ts +2 -0
- package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +1 -0
- package/dist/schema/nodes/roof-segment-walls.test.js +92 -0
- package/dist/schema/nodes/roof-segment.d.ts +84 -8
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +290 -5
- package/dist/schema/nodes/roof.d.ts +8 -8
- package/dist/schema/nodes/shelf.d.ts +3 -2
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/shelf.js +6 -0
- package/dist/schema/nodes/skylight.d.ts +10 -10
- package/dist/schema/nodes/slab.d.ts +3 -2
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +4 -0
- package/dist/schema/nodes/solar-panel.d.ts +4 -4
- package/dist/schema/nodes/stair-segment.d.ts +4 -4
- package/dist/schema/nodes/stair.d.ts +13 -12
- package/dist/schema/nodes/stair.d.ts.map +1 -1
- package/dist/schema/nodes/stair.js +3 -0
- package/dist/schema/nodes/turbine-vent.d.ts +2 -2
- package/dist/schema/nodes/wall.d.ts +245 -6
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +257 -0
- package/dist/schema/nodes/wall.test.d.ts +2 -0
- package/dist/schema/nodes/wall.test.d.ts.map +1 -0
- package/dist/schema/nodes/wall.test.js +208 -0
- package/dist/schema/nodes/window.d.ts +11 -3
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +12 -0
- package/dist/schema/nodes/zone.d.ts +2 -0
- package/dist/schema/nodes/zone.d.ts.map +1 -1
- package/dist/schema/nodes/zone.js +6 -0
- package/dist/schema/scene-material.d.ts +41 -0
- package/dist/schema/scene-material.d.ts.map +1 -0
- package/dist/schema/scene-material.js +9 -0
- package/dist/schema/types.d.ts +1089 -94
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +23 -0
- package/dist/services/alignment-anchors.d.ts.map +1 -1
- package/dist/services/alignment-anchors.js +30 -1
- package/dist/services/alignment.d.ts +5 -0
- package/dist/services/alignment.d.ts.map +1 -1
- package/dist/services/alignment.js +2 -0
- package/dist/services/hosting.d.ts +8 -0
- package/dist/services/hosting.d.ts.map +1 -1
- package/dist/services/hosting.js +13 -4
- package/dist/services/hosting.test.js +32 -1
- package/dist/services/index.d.ts +8 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +8 -2
- package/dist/services/level-height.d.ts +28 -0
- package/dist/services/level-height.d.ts.map +1 -0
- package/dist/services/level-height.js +62 -0
- package/dist/services/opening-guides.d.ts +141 -0
- package/dist/services/opening-guides.d.ts.map +1 -0
- package/dist/services/opening-guides.js +267 -0
- package/dist/services/opening-guides.test.d.ts +2 -0
- package/dist/services/opening-guides.test.d.ts.map +1 -0
- package/dist/services/opening-guides.test.js +208 -0
- package/dist/services/port-connectivity.d.ts +115 -0
- package/dist/services/port-connectivity.d.ts.map +1 -0
- package/dist/services/port-connectivity.js +300 -0
- package/dist/services/port-connectivity.test.d.ts +2 -0
- package/dist/services/port-connectivity.test.d.ts.map +1 -0
- package/dist/services/port-connectivity.test.js +297 -0
- package/dist/services/riser-diagram.d.ts +40 -0
- package/dist/services/riser-diagram.d.ts.map +1 -0
- package/dist/services/riser-diagram.js +110 -0
- package/dist/services/riser-diagram.test.d.ts +2 -0
- package/dist/services/riser-diagram.test.d.ts.map +1 -0
- package/dist/services/riser-diagram.test.js +66 -0
- package/dist/services/snap.d.ts +9 -1
- package/dist/services/snap.d.ts.map +1 -1
- package/dist/services/snap.js +21 -1
- package/dist/services/snap.test.js +43 -1
- package/dist/services/system-graph.d.ts +30 -0
- package/dist/services/system-graph.d.ts.map +1 -0
- package/dist/services/system-graph.js +164 -0
- package/dist/services/system-graph.test.d.ts +2 -0
- package/dist/services/system-graph.test.d.ts.map +1 -0
- package/dist/services/system-graph.test.js +138 -0
- package/dist/services/validate-dwv.d.ts +32 -0
- package/dist/services/validate-dwv.d.ts.map +1 -0
- package/dist/services/validate-dwv.js +118 -0
- package/dist/services/validate-dwv.test.d.ts +2 -0
- package/dist/services/validate-dwv.test.d.ts.map +1 -0
- package/dist/services/validate-dwv.test.js +109 -0
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +94 -1
- package/dist/store/actions/ridge-vent-update.test.d.ts +2 -0
- package/dist/store/actions/ridge-vent-update.test.d.ts.map +1 -0
- package/dist/store/actions/ridge-vent-update.test.js +264 -0
- package/dist/store/history-control.d.ts +11 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +33 -0
- package/dist/store/use-scene-dirty-tracking.test.d.ts +2 -0
- package/dist/store/use-scene-dirty-tracking.test.d.ts.map +1 -0
- package/dist/store/use-scene-dirty-tracking.test.js +68 -0
- package/dist/store/use-scene-measurement-roundtrip.test.d.ts +2 -0
- package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +1 -0
- package/dist/store/use-scene-measurement-roundtrip.test.js +97 -0
- package/dist/store/use-scene-plugins.test.d.ts +2 -0
- package/dist/store/use-scene-plugins.test.d.ts.map +1 -0
- package/dist/store/use-scene-plugins.test.js +51 -0
- package/dist/store/use-scene-wall-slot-migration.test.d.ts +2 -0
- package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +1 -0
- package/dist/store/use-scene-wall-slot-migration.test.js +210 -0
- package/dist/store/use-scene-window-migration.test.d.ts +2 -0
- package/dist/store/use-scene-window-migration.test.d.ts.map +1 -0
- package/dist/store/use-scene-window-migration.test.js +85 -0
- package/dist/store/use-scene.d.ts +17 -2
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +358 -51
- package/dist/systems/elevator/elevator-service.js +1 -1
- package/dist/systems/fence/fence-centerline.d.ts +12 -0
- package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
- package/dist/systems/fence/fence-centerline.js +37 -0
- package/dist/systems/fence/fence-spline.d.ts +39 -0
- package/dist/systems/fence/fence-spline.d.ts.map +1 -0
- package/dist/systems/fence/fence-spline.js +196 -0
- package/dist/systems/fence/fence-spline.test.d.ts +2 -0
- package/dist/systems/fence/fence-spline.test.d.ts.map +1 -0
- package/dist/systems/fence/fence-spline.test.js +136 -0
- package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
- package/dist/systems/stair/stair-footprint.js +21 -11
- package/dist/systems/stair/stair-opening-preview.d.ts +1139 -469
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.js +1 -18
- package/dist/systems/stair/stair-opening-sync.test.js +39 -0
- package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
- package/dist/systems/wall/wall-mitering.js +38 -2
- package/dist/systems/wall/wall-mitering.test.d.ts +2 -0
- package/dist/systems/wall/wall-mitering.test.d.ts.map +1 -0
- package/dist/systems/wall/wall-mitering.test.js +63 -0
- package/dist/utils/clone-scene-graph.d.ts +1 -0
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +23 -3
- package/dist/utils/clone-scene-graph.test.js +3 -0
- package/dist/utils/heal-scene-graph.d.ts +18 -0
- package/dist/utils/heal-scene-graph.d.ts.map +1 -0
- package/dist/utils/heal-scene-graph.js +90 -0
- package/dist/utils/heal-scene-graph.test.d.ts +2 -0
- package/dist/utils/heal-scene-graph.test.d.ts.map +1 -0
- package/dist/utils/heal-scene-graph.test.js +88 -0
- package/dist/validation/validate-build-json.d.ts +1 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +31 -2
- package/package.json +3 -3
|
@@ -10,6 +10,26 @@ export declare const RoofType: z.ZodEnum<{
|
|
|
10
10
|
mansard: "mansard";
|
|
11
11
|
}>;
|
|
12
12
|
export type RoofType = z.infer<typeof RoofType>;
|
|
13
|
+
export declare const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
|
|
14
|
+
export declare const RoofSegmentTrim: z.ZodDefault<z.ZodObject<{
|
|
15
|
+
left: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
right: z.ZodDefault<z.ZodNumber>;
|
|
17
|
+
front: z.ZodDefault<z.ZodNumber>;
|
|
18
|
+
back: z.ZodDefault<z.ZodNumber>;
|
|
19
|
+
frontLeft: z.ZodDefault<z.ZodNumber>;
|
|
20
|
+
frontRight: z.ZodDefault<z.ZodNumber>;
|
|
21
|
+
backLeft: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
backRight: z.ZodDefault<z.ZodNumber>;
|
|
23
|
+
frontLeftX: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
frontLeftZ: z.ZodDefault<z.ZodNumber>;
|
|
25
|
+
frontRightX: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
frontRightZ: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
backLeftX: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
backLeftZ: z.ZodDefault<z.ZodNumber>;
|
|
29
|
+
backRightX: z.ZodDefault<z.ZodNumber>;
|
|
30
|
+
backRightZ: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
}, z.core.$strip>>;
|
|
32
|
+
export type RoofSegmentTrim = z.infer<typeof RoofSegmentTrim>;
|
|
13
33
|
export declare const ROOF_SHAPE_DEFAULTS: {
|
|
14
34
|
/** Gambrel: lower (steep) face occupies this fraction of the horizontal half-depth. */
|
|
15
35
|
readonly gambrelLowerWidthRatio: 0.5;
|
|
@@ -23,6 +43,17 @@ export declare const ROOF_SHAPE_DEFAULTS: {
|
|
|
23
43
|
readonly dutchHipWidthRatio: 0.25;
|
|
24
44
|
/** Dutch: hip face rises this fraction of the way to the peak. */
|
|
25
45
|
readonly dutchHipHeightRatio: 0.5;
|
|
46
|
+
/** Dutch: gable waist span along the ridge axis, as a fraction of the max span. */
|
|
47
|
+
readonly dutchWaistLengthRatio: 0.98;
|
|
48
|
+
/**
|
|
49
|
+
* Dutch: how far the gablet's barge board extends outward past the gablet
|
|
50
|
+
* end-wall, along the ridge axis, in metres. 0 disables the rake. The board
|
|
51
|
+
* lies in the gablet's slope planes (coplanar with the main Dutch slopes)
|
|
52
|
+
* and overhangs the lower hip skirt; the gablet end-wall itself stays put.
|
|
53
|
+
*/
|
|
54
|
+
readonly dutchGabletRake: 0.48;
|
|
55
|
+
/** Dutch: thickness of the top gable rake slab. */
|
|
56
|
+
readonly dutchTopRakeThickness: 0.21;
|
|
26
57
|
};
|
|
27
58
|
export declare const RoofSegmentNode: z.ZodObject<{
|
|
28
59
|
object: z.ZodDefault<z.ZodLiteral<"node">>;
|
|
@@ -44,7 +75,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
44
75
|
type: z.ZodDefault<z.ZodLiteral<"roof-segment">>;
|
|
45
76
|
material: z.ZodOptional<z.ZodObject<{
|
|
46
77
|
id: z.ZodOptional<z.ZodString>;
|
|
47
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
78
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
48
79
|
custom: "custom";
|
|
49
80
|
white: "white";
|
|
50
81
|
brick: "brick";
|
|
@@ -55,7 +86,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
55
86
|
plaster: "plaster";
|
|
56
87
|
tile: "tile";
|
|
57
88
|
marble: "marble";
|
|
58
|
-
}
|
|
89
|
+
}>>>;
|
|
59
90
|
properties: z.ZodOptional<z.ZodObject<{
|
|
60
91
|
color: z.ZodDefault<z.ZodString>;
|
|
61
92
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -77,7 +108,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
77
108
|
materialPreset: z.ZodOptional<z.ZodString>;
|
|
78
109
|
topMaterial: z.ZodOptional<z.ZodObject<{
|
|
79
110
|
id: z.ZodOptional<z.ZodString>;
|
|
80
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
111
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
81
112
|
custom: "custom";
|
|
82
113
|
white: "white";
|
|
83
114
|
brick: "brick";
|
|
@@ -88,7 +119,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
88
119
|
plaster: "plaster";
|
|
89
120
|
tile: "tile";
|
|
90
121
|
marble: "marble";
|
|
91
|
-
}
|
|
122
|
+
}>>>;
|
|
92
123
|
properties: z.ZodOptional<z.ZodObject<{
|
|
93
124
|
color: z.ZodDefault<z.ZodString>;
|
|
94
125
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -110,7 +141,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
110
141
|
topMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
111
142
|
edgeMaterial: z.ZodOptional<z.ZodObject<{
|
|
112
143
|
id: z.ZodOptional<z.ZodString>;
|
|
113
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
144
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
114
145
|
custom: "custom";
|
|
115
146
|
white: "white";
|
|
116
147
|
brick: "brick";
|
|
@@ -121,7 +152,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
121
152
|
plaster: "plaster";
|
|
122
153
|
tile: "tile";
|
|
123
154
|
marble: "marble";
|
|
124
|
-
}
|
|
155
|
+
}>>>;
|
|
125
156
|
properties: z.ZodOptional<z.ZodObject<{
|
|
126
157
|
color: z.ZodDefault<z.ZodString>;
|
|
127
158
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -143,7 +174,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
143
174
|
edgeMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
144
175
|
wallMaterial: z.ZodOptional<z.ZodObject<{
|
|
145
176
|
id: z.ZodOptional<z.ZodString>;
|
|
146
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
177
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
147
178
|
custom: "custom";
|
|
148
179
|
white: "white";
|
|
149
180
|
brick: "brick";
|
|
@@ -154,7 +185,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
154
185
|
plaster: "plaster";
|
|
155
186
|
tile: "tile";
|
|
156
187
|
marble: "marble";
|
|
157
|
-
}
|
|
188
|
+
}>>>;
|
|
158
189
|
properties: z.ZodOptional<z.ZodObject<{
|
|
159
190
|
color: z.ZodDefault<z.ZodString>;
|
|
160
191
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -187,6 +218,24 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
187
218
|
}>>;
|
|
188
219
|
width: z.ZodDefault<z.ZodNumber>;
|
|
189
220
|
depth: z.ZodDefault<z.ZodNumber>;
|
|
221
|
+
trim: z.ZodDefault<z.ZodObject<{
|
|
222
|
+
left: z.ZodDefault<z.ZodNumber>;
|
|
223
|
+
right: z.ZodDefault<z.ZodNumber>;
|
|
224
|
+
front: z.ZodDefault<z.ZodNumber>;
|
|
225
|
+
back: z.ZodDefault<z.ZodNumber>;
|
|
226
|
+
frontLeft: z.ZodDefault<z.ZodNumber>;
|
|
227
|
+
frontRight: z.ZodDefault<z.ZodNumber>;
|
|
228
|
+
backLeft: z.ZodDefault<z.ZodNumber>;
|
|
229
|
+
backRight: z.ZodDefault<z.ZodNumber>;
|
|
230
|
+
frontLeftX: z.ZodDefault<z.ZodNumber>;
|
|
231
|
+
frontLeftZ: z.ZodDefault<z.ZodNumber>;
|
|
232
|
+
frontRightX: z.ZodDefault<z.ZodNumber>;
|
|
233
|
+
frontRightZ: z.ZodDefault<z.ZodNumber>;
|
|
234
|
+
backLeftX: z.ZodDefault<z.ZodNumber>;
|
|
235
|
+
backLeftZ: z.ZodDefault<z.ZodNumber>;
|
|
236
|
+
backRightX: z.ZodDefault<z.ZodNumber>;
|
|
237
|
+
backRightZ: z.ZodDefault<z.ZodNumber>;
|
|
238
|
+
}, z.core.$strip>>;
|
|
190
239
|
wallHeight: z.ZodDefault<z.ZodNumber>;
|
|
191
240
|
pitch: z.ZodDefault<z.ZodNumber>;
|
|
192
241
|
wallThickness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -199,9 +248,15 @@ export declare const RoofSegmentNode: z.ZodObject<{
|
|
|
199
248
|
mansardSteepHeightRatio: z.ZodDefault<z.ZodNumber>;
|
|
200
249
|
dutchHipWidthRatio: z.ZodDefault<z.ZodNumber>;
|
|
201
250
|
dutchHipHeightRatio: z.ZodDefault<z.ZodNumber>;
|
|
251
|
+
dutchWaistLengthRatio: z.ZodDefault<z.ZodNumber>;
|
|
252
|
+
dutchGabletRake: z.ZodDefault<z.ZodNumber>;
|
|
253
|
+
dutchTopRakeThickness: z.ZodDefault<z.ZodNumber>;
|
|
202
254
|
children: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
203
255
|
}, z.core.$strip>;
|
|
204
256
|
export type RoofSegmentNode = z.infer<typeof RoofSegmentNode>;
|
|
257
|
+
export declare function normalizeRoofSegmentTrim(node: Pick<RoofSegmentNode, 'width' | 'depth'> & {
|
|
258
|
+
trim?: Partial<RoofSegmentTrim>;
|
|
259
|
+
}): RoofSegmentTrim;
|
|
205
260
|
/** Shape of the per-type ratios consumed by the slope helpers. */
|
|
206
261
|
type ShapeRatios = {
|
|
207
262
|
gambrelLowerWidthRatio: number;
|
|
@@ -210,12 +265,24 @@ type ShapeRatios = {
|
|
|
210
265
|
mansardSteepHeightRatio: number;
|
|
211
266
|
dutchHipWidthRatio: number;
|
|
212
267
|
dutchHipHeightRatio: number;
|
|
268
|
+
dutchWaistLengthRatio: number;
|
|
213
269
|
};
|
|
214
270
|
type PitchInputs = {
|
|
215
271
|
roofType: RoofType;
|
|
216
272
|
width: number;
|
|
217
273
|
depth: number;
|
|
218
274
|
} & Partial<ShapeRatios>;
|
|
275
|
+
export type DutchRoofMetrics = {
|
|
276
|
+
axis: 'x' | 'z';
|
|
277
|
+
inset: number;
|
|
278
|
+
waistHalfX: number;
|
|
279
|
+
waistHalfZ: number;
|
|
280
|
+
ridgeStart: readonly [number, number];
|
|
281
|
+
ridgeEnd: readonly [number, number];
|
|
282
|
+
shoulderInsetAlongDepth: number;
|
|
283
|
+
shoulderInsetAlongWidth: number;
|
|
284
|
+
};
|
|
285
|
+
export declare function getDutchRoofMetrics(input: Pick<RoofSegmentNode, 'width' | 'depth'> & Partial<Pick<RoofSegmentNode, 'dutchHipWidthRatio' | 'dutchWaistLengthRatio'>>): DutchRoofMetrics;
|
|
219
286
|
export type SegmentSlopeFrame = {
|
|
220
287
|
/** Horizontal half-span of the primary slope face (eave-to-ridge). */
|
|
221
288
|
run: number;
|
|
@@ -244,6 +311,15 @@ export declare function getSegmentSlopeFrame(node: Pick<RoofSegmentNode, 'roofTy
|
|
|
244
311
|
* footprint + roofType. Replaces the legacy `roofHeight` field on the node.
|
|
245
312
|
*/
|
|
246
313
|
export declare function getActiveRoofHeight(node: Parameters<typeof getSegmentSlopeFrame>[0]): number;
|
|
314
|
+
export type RoofSegmentVisibleTopBounds = {
|
|
315
|
+
minX: number;
|
|
316
|
+
maxX: number;
|
|
317
|
+
minZ: number;
|
|
318
|
+
maxZ: number;
|
|
319
|
+
width: number;
|
|
320
|
+
depth: number;
|
|
321
|
+
};
|
|
322
|
+
export declare function getRoofSegmentVisibleTopBounds(segment: RoofSegmentNode): RoofSegmentVisibleTopBounds;
|
|
247
323
|
/** Segment-local surface height used by roof accessory placement and hit disambiguation. */
|
|
248
324
|
export declare function getRoofSegmentSurfaceY(node: Pick<RoofSegmentNode, 'roofType' | 'width' | 'depth' | 'wallHeight'> & Parameters<typeof getSegmentSlopeFrame>[0], localX: number, localZ: number): number;
|
|
249
325
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGvE,eAAO,MAAM,QAAQ;;;;;;;;EAA0E,CAAA;AAE/F,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,46 @@ import { z } from 'zod';
|
|
|
3
3
|
import { BaseNode, nodeType, objectId } from '../base';
|
|
4
4
|
import { MaterialSchema } from '../material';
|
|
5
5
|
export const RoofType = z.enum(['hip', 'gable', 'shed', 'gambrel', 'dutch', 'mansard', 'flat']);
|
|
6
|
+
export const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
|
|
7
|
+
const DEFAULT_ROOF_SEGMENT_WIDTH = 8;
|
|
8
|
+
const DEFAULT_ROOF_SEGMENT_DEPTH = 6;
|
|
9
|
+
export const RoofSegmentTrim = z
|
|
10
|
+
.object({
|
|
11
|
+
left: z.number().min(0).default(0),
|
|
12
|
+
right: z.number().min(0).default(0),
|
|
13
|
+
front: z.number().min(0).default(0),
|
|
14
|
+
back: z.number().min(0).default(0),
|
|
15
|
+
frontLeft: z.number().min(0).default(0),
|
|
16
|
+
frontRight: z.number().min(0).default(0),
|
|
17
|
+
backLeft: z.number().min(0).default(0),
|
|
18
|
+
backRight: z.number().min(0).default(0),
|
|
19
|
+
frontLeftX: z.number().min(0).default(0),
|
|
20
|
+
frontLeftZ: z.number().min(0).default(0),
|
|
21
|
+
frontRightX: z.number().min(0).default(0),
|
|
22
|
+
frontRightZ: z.number().min(0).default(0),
|
|
23
|
+
backLeftX: z.number().min(0).default(0),
|
|
24
|
+
backLeftZ: z.number().min(0).default(0),
|
|
25
|
+
backRightX: z.number().min(0).default(0),
|
|
26
|
+
backRightZ: z.number().min(0).default(0),
|
|
27
|
+
})
|
|
28
|
+
.default({
|
|
29
|
+
left: 0,
|
|
30
|
+
right: 0,
|
|
31
|
+
front: 0,
|
|
32
|
+
back: 0,
|
|
33
|
+
frontLeft: 0,
|
|
34
|
+
frontRight: 0,
|
|
35
|
+
backLeft: 0,
|
|
36
|
+
backRight: 0,
|
|
37
|
+
frontLeftX: 0,
|
|
38
|
+
frontLeftZ: 0,
|
|
39
|
+
frontRightX: 0,
|
|
40
|
+
frontRightZ: 0,
|
|
41
|
+
backLeftX: 0,
|
|
42
|
+
backLeftZ: 0,
|
|
43
|
+
backRightX: 0,
|
|
44
|
+
backRightZ: 0,
|
|
45
|
+
});
|
|
6
46
|
// Default shape ratios. Tuning these used to require editing the geometry
|
|
7
47
|
// code in two places; they are now schema fields with these defaults.
|
|
8
48
|
export const ROOF_SHAPE_DEFAULTS = {
|
|
@@ -18,6 +58,17 @@ export const ROOF_SHAPE_DEFAULTS = {
|
|
|
18
58
|
dutchHipWidthRatio: 0.25,
|
|
19
59
|
/** Dutch: hip face rises this fraction of the way to the peak. */
|
|
20
60
|
dutchHipHeightRatio: 0.5,
|
|
61
|
+
/** Dutch: gable waist span along the ridge axis, as a fraction of the max span. */
|
|
62
|
+
dutchWaistLengthRatio: 0.98,
|
|
63
|
+
/**
|
|
64
|
+
* Dutch: how far the gablet's barge board extends outward past the gablet
|
|
65
|
+
* end-wall, along the ridge axis, in metres. 0 disables the rake. The board
|
|
66
|
+
* lies in the gablet's slope planes (coplanar with the main Dutch slopes)
|
|
67
|
+
* and overhangs the lower hip skirt; the gablet end-wall itself stays put.
|
|
68
|
+
*/
|
|
69
|
+
dutchGabletRake: 0.48,
|
|
70
|
+
/** Dutch: thickness of the top gable rake slab. */
|
|
71
|
+
dutchTopRakeThickness: 0.21,
|
|
21
72
|
};
|
|
22
73
|
export const RoofSegmentNode = BaseNode.extend({
|
|
23
74
|
id: objectId('rseg'),
|
|
@@ -45,6 +96,10 @@ export const RoofSegmentNode = BaseNode.extend({
|
|
|
45
96
|
// Footprint dimensions
|
|
46
97
|
width: z.number().default(8),
|
|
47
98
|
depth: z.number().default(6),
|
|
99
|
+
// Segment-local distances trimmed from each footprint side. The trim
|
|
100
|
+
// boundary is projected vertically through the roof volume, so the
|
|
101
|
+
// resulting edge follows the actual sloped roof surfaces.
|
|
102
|
+
trim: RoofSegmentTrim,
|
|
48
103
|
// Wall height beneath the roof
|
|
49
104
|
wallHeight: z.number().default(0.5),
|
|
50
105
|
// Roof pitch in degrees — angle of the primary slope face.
|
|
@@ -90,6 +145,17 @@ export const RoofSegmentNode = BaseNode.extend({
|
|
|
90
145
|
.min(0.1)
|
|
91
146
|
.max(0.9)
|
|
92
147
|
.default(ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio),
|
|
148
|
+
dutchWaistLengthRatio: z
|
|
149
|
+
.number()
|
|
150
|
+
.min(0.1)
|
|
151
|
+
.max(1)
|
|
152
|
+
.default(ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio),
|
|
153
|
+
dutchGabletRake: z.number().min(0).max(3).default(ROOF_SHAPE_DEFAULTS.dutchGabletRake),
|
|
154
|
+
dutchTopRakeThickness: z
|
|
155
|
+
.number()
|
|
156
|
+
.min(0.01)
|
|
157
|
+
.max(0.5)
|
|
158
|
+
.default(ROOF_SHAPE_DEFAULTS.dutchTopRakeThickness),
|
|
93
159
|
// Hosted accessories — chimney, dormer, skylight, box-vent,
|
|
94
160
|
// ridge-vent, solar-panel, gutter. Each accessory's `parentId` points back
|
|
95
161
|
// here; the segment renderer mounts them recursively via
|
|
@@ -105,6 +171,7 @@ export const RoofSegmentNode = BaseNode.extend({
|
|
|
105
171
|
Multiple segments can be combined to form complex roof shapes.
|
|
106
172
|
- roofType: hip, gable, shed, gambrel, dutch, mansard, flat
|
|
107
173
|
- width/depth: footprint dimensions
|
|
174
|
+
- trim: segment-local side cut distances
|
|
108
175
|
- wallHeight: height of walls below the roof
|
|
109
176
|
- pitch: roof slope in degrees (angle of the primary slope face)
|
|
110
177
|
- wallThickness/deckThickness: structural thicknesses
|
|
@@ -113,16 +180,144 @@ export const RoofSegmentNode = BaseNode.extend({
|
|
|
113
180
|
- gambrelLowerWidthRatio / gambrelLowerHeightRatio: kink position on gambrel roofs
|
|
114
181
|
- mansardSteepWidthRatio / mansardSteepHeightRatio: waist position on mansard roofs
|
|
115
182
|
- dutchHipWidthRatio / dutchHipHeightRatio: hip-to-gable split on dutch roofs
|
|
183
|
+
- dutchWaistLengthRatio: gable waist span along the ridge axis
|
|
184
|
+
- dutchGabletRake: gablet barge-board overhang past the gablet end-wall (m, 0 = none)
|
|
185
|
+
- dutchTopRakeThickness: thickness of the top gable rake slab
|
|
116
186
|
`);
|
|
187
|
+
function finiteNonNegative(value) {
|
|
188
|
+
return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
189
|
+
}
|
|
190
|
+
function finitePositive(value, fallback) {
|
|
191
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
|
|
192
|
+
}
|
|
193
|
+
function normalizeTrimAxis(start, end, span) {
|
|
194
|
+
const maxTotal = Math.max(0, finiteNonNegative(span) - MIN_ROOF_SEGMENT_TRIM_SPAN);
|
|
195
|
+
let a = Math.min(finiteNonNegative(start), maxTotal);
|
|
196
|
+
let b = Math.min(finiteNonNegative(end), maxTotal);
|
|
197
|
+
const total = a + b;
|
|
198
|
+
if (total > maxTotal && total > 0) {
|
|
199
|
+
const scale = maxTotal / total;
|
|
200
|
+
a *= scale;
|
|
201
|
+
b *= scale;
|
|
202
|
+
}
|
|
203
|
+
return [a, b];
|
|
204
|
+
}
|
|
205
|
+
export function normalizeRoofSegmentTrim(node) {
|
|
206
|
+
const trim = node.trim ?? {};
|
|
207
|
+
const [left, right] = normalizeTrimAxis(trim.left, trim.right, node.width);
|
|
208
|
+
const [back, front] = normalizeTrimAxis(trim.back, trim.front, node.depth);
|
|
209
|
+
const maxWidthDiagonal = Math.max(0, finiteNonNegative(node.width) - left - right);
|
|
210
|
+
const maxDepthDiagonal = Math.max(0, finiteNonNegative(node.depth) - front - back);
|
|
211
|
+
const maxWidthPair = Math.max(0, maxWidthDiagonal - MIN_ROOF_SEGMENT_TRIM_SPAN);
|
|
212
|
+
const maxDepthPair = Math.max(0, maxDepthDiagonal - MIN_ROOF_SEGMENT_TRIM_SPAN);
|
|
213
|
+
let [frontLeftX, frontLeftZ] = normalizeCornerAxisTrim(trim.frontLeft, trim.frontLeftX, trim.frontLeftZ, maxWidthPair, maxDepthPair);
|
|
214
|
+
let [frontRightX, frontRightZ] = normalizeCornerAxisTrim(trim.frontRight, trim.frontRightX, trim.frontRightZ, maxWidthPair, maxDepthPair);
|
|
215
|
+
let [backLeftX, backLeftZ] = normalizeCornerAxisTrim(trim.backLeft, trim.backLeftX, trim.backLeftZ, maxWidthPair, maxDepthPair);
|
|
216
|
+
let [backRightX, backRightZ] = normalizeCornerAxisTrim(trim.backRight, trim.backRightX, trim.backRightZ, maxWidthPair, maxDepthPair);
|
|
217
|
+
for (let i = 0; i < 3; i += 1) {
|
|
218
|
+
;
|
|
219
|
+
[frontLeftX, frontRightX] = normalizeTrimPair(frontLeftX, frontRightX, maxWidthPair);
|
|
220
|
+
[backLeftX, backRightX] = normalizeTrimPair(backLeftX, backRightX, maxWidthPair);
|
|
221
|
+
[frontLeftZ, backLeftZ] = normalizeTrimPair(frontLeftZ, backLeftZ, maxDepthPair);
|
|
222
|
+
[frontRightZ, backRightZ] = normalizeTrimPair(frontRightZ, backRightZ, maxDepthPair);
|
|
223
|
+
}
|
|
224
|
+
const frontLeft = Math.min(frontLeftX, frontLeftZ);
|
|
225
|
+
const frontRight = Math.min(frontRightX, frontRightZ);
|
|
226
|
+
const backLeft = Math.min(backLeftX, backLeftZ);
|
|
227
|
+
const backRight = Math.min(backRightX, backRightZ);
|
|
228
|
+
return {
|
|
229
|
+
left,
|
|
230
|
+
right,
|
|
231
|
+
front,
|
|
232
|
+
back,
|
|
233
|
+
frontLeft,
|
|
234
|
+
frontRight,
|
|
235
|
+
backLeft,
|
|
236
|
+
backRight,
|
|
237
|
+
frontLeftX,
|
|
238
|
+
frontLeftZ,
|
|
239
|
+
frontRightX,
|
|
240
|
+
frontRightZ,
|
|
241
|
+
backLeftX,
|
|
242
|
+
backLeftZ,
|
|
243
|
+
backRightX,
|
|
244
|
+
backRightZ,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function normalizeTrimPair(a, b, maxTotal) {
|
|
248
|
+
const total = a + b;
|
|
249
|
+
if (total <= maxTotal || total <= 0)
|
|
250
|
+
return [a, b];
|
|
251
|
+
const scale = maxTotal / total;
|
|
252
|
+
return [a * scale, b * scale];
|
|
253
|
+
}
|
|
254
|
+
function normalizeCornerAxisTrim(scalar, axisX, axisZ, maxX, maxZ) {
|
|
255
|
+
const x = finiteNonNegative(axisX);
|
|
256
|
+
const z = finiteNonNegative(axisZ);
|
|
257
|
+
const fallback = finiteNonNegative(scalar);
|
|
258
|
+
if (x > 0 || z > 0) {
|
|
259
|
+
return [Math.min(x, maxX), Math.min(z, maxZ)];
|
|
260
|
+
}
|
|
261
|
+
return [Math.min(fallback, maxX), Math.min(fallback, maxZ)];
|
|
262
|
+
}
|
|
263
|
+
function getDutchUpperShellBounds(node) {
|
|
264
|
+
const metrics = getDutchRoofMetrics(node);
|
|
265
|
+
const width = finitePositive(node.width, DEFAULT_ROOF_SEGMENT_WIDTH);
|
|
266
|
+
const depth = finitePositive(node.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
|
|
267
|
+
const rake = node.dutchGabletRake ?? ROOF_SHAPE_DEFAULTS.dutchGabletRake;
|
|
268
|
+
const rakeReach = metrics.axis === 'x'
|
|
269
|
+
? Math.min(Math.max(0, rake), Math.max(0, width / 2 - metrics.waistHalfX) * 0.98)
|
|
270
|
+
: Math.min(Math.max(0, rake), Math.max(0, depth / 2 - metrics.waistHalfZ) * 0.98);
|
|
271
|
+
return {
|
|
272
|
+
...metrics,
|
|
273
|
+
upperHalfX: metrics.axis === 'x' ? metrics.waistHalfX + rakeReach : metrics.waistHalfX,
|
|
274
|
+
upperHalfZ: metrics.axis === 'x' ? metrics.waistHalfZ : metrics.waistHalfZ + rakeReach,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
117
277
|
function withRatioDefaults(input) {
|
|
118
278
|
return {
|
|
119
279
|
...input,
|
|
280
|
+
width: finitePositive(input.width, DEFAULT_ROOF_SEGMENT_WIDTH),
|
|
281
|
+
depth: finitePositive(input.depth, DEFAULT_ROOF_SEGMENT_DEPTH),
|
|
120
282
|
gambrelLowerWidthRatio: input.gambrelLowerWidthRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerWidthRatio,
|
|
121
283
|
gambrelLowerHeightRatio: input.gambrelLowerHeightRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerHeightRatio,
|
|
122
284
|
mansardSteepWidthRatio: input.mansardSteepWidthRatio ?? ROOF_SHAPE_DEFAULTS.mansardSteepWidthRatio,
|
|
123
285
|
mansardSteepHeightRatio: input.mansardSteepHeightRatio ?? ROOF_SHAPE_DEFAULTS.mansardSteepHeightRatio,
|
|
124
286
|
dutchHipWidthRatio: input.dutchHipWidthRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipWidthRatio,
|
|
125
287
|
dutchHipHeightRatio: input.dutchHipHeightRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio,
|
|
288
|
+
dutchWaistLengthRatio: input.dutchWaistLengthRatio ?? ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
export function getDutchRoofMetrics(input) {
|
|
292
|
+
const width = finitePositive(input.width, DEFAULT_ROOF_SEGMENT_WIDTH);
|
|
293
|
+
const depth = finitePositive(input.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
|
|
294
|
+
const inset = Math.min(width, depth) * (input.dutchHipWidthRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipWidthRatio);
|
|
295
|
+
const waistLengthRatio = input.dutchWaistLengthRatio ?? ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio;
|
|
296
|
+
if (width >= depth) {
|
|
297
|
+
const waistHalfX = Math.max(0, (width / 2 - inset) * waistLengthRatio);
|
|
298
|
+
const waistHalfZ = Math.max(0, depth / 2 - inset);
|
|
299
|
+
return {
|
|
300
|
+
axis: 'x',
|
|
301
|
+
inset,
|
|
302
|
+
waistHalfX,
|
|
303
|
+
waistHalfZ,
|
|
304
|
+
ridgeStart: [-waistHalfX, 0],
|
|
305
|
+
ridgeEnd: [waistHalfX, 0],
|
|
306
|
+
shoulderInsetAlongDepth: Math.max(0, depth / 2 - waistHalfZ),
|
|
307
|
+
shoulderInsetAlongWidth: Math.max(0, width / 2 - waistHalfX),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
const waistHalfX = Math.max(0, width / 2 - inset);
|
|
311
|
+
const waistHalfZ = Math.max(0, (depth / 2 - inset) * waistLengthRatio);
|
|
312
|
+
return {
|
|
313
|
+
axis: 'z',
|
|
314
|
+
inset,
|
|
315
|
+
waistHalfX,
|
|
316
|
+
waistHalfZ,
|
|
317
|
+
ridgeStart: [0, waistHalfZ],
|
|
318
|
+
ridgeEnd: [0, -waistHalfZ],
|
|
319
|
+
shoulderInsetAlongDepth: Math.max(0, depth / 2 - waistHalfZ),
|
|
320
|
+
shoulderInsetAlongWidth: Math.max(0, width / 2 - waistHalfX),
|
|
126
321
|
};
|
|
127
322
|
}
|
|
128
323
|
function getPrimarySlopeRun(input) {
|
|
@@ -188,19 +383,109 @@ export function getSegmentSlopeFrame(node) {
|
|
|
188
383
|
export function getActiveRoofHeight(node) {
|
|
189
384
|
return getSegmentSlopeFrame(node).activeRh;
|
|
190
385
|
}
|
|
386
|
+
export function getRoofSegmentVisibleTopBounds(segment) {
|
|
387
|
+
const { activeRh, cosTheta, sinTheta } = getSegmentSlopeFrame(segment);
|
|
388
|
+
const width = finitePositive(segment.width, DEFAULT_ROOF_SEGMENT_WIDTH);
|
|
389
|
+
const depth = finitePositive(segment.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
|
|
390
|
+
const trim = normalizeRoofSegmentTrim({ ...segment, width, depth });
|
|
391
|
+
const horizontalOverhang = finiteNonNegative(segment.overhang) * cosTheta;
|
|
392
|
+
const deckExt = finiteNonNegative(segment.wallThickness) / 2 + horizontalOverhang;
|
|
393
|
+
const shingleOverhang = finiteNonNegative(segment.shingleThickness) * sinTheta;
|
|
394
|
+
let xExt = deckExt;
|
|
395
|
+
let frontExt = deckExt;
|
|
396
|
+
let backExt = deckExt;
|
|
397
|
+
if (segment.roofType === 'hip' ||
|
|
398
|
+
segment.roofType === 'mansard' ||
|
|
399
|
+
segment.roofType === 'dutch') {
|
|
400
|
+
xExt += shingleOverhang;
|
|
401
|
+
frontExt += shingleOverhang;
|
|
402
|
+
backExt += shingleOverhang;
|
|
403
|
+
}
|
|
404
|
+
else if (segment.roofType === 'gable' || segment.roofType === 'gambrel') {
|
|
405
|
+
frontExt += shingleOverhang;
|
|
406
|
+
backExt += shingleOverhang;
|
|
407
|
+
}
|
|
408
|
+
else if (segment.roofType === 'shed' && activeRh > 0) {
|
|
409
|
+
frontExt += shingleOverhang;
|
|
410
|
+
}
|
|
411
|
+
let minX = trim.left > 0 ? -width / 2 + trim.left : -width / 2 - xExt;
|
|
412
|
+
let maxX = trim.right > 0 ? width / 2 - trim.right : width / 2 + xExt;
|
|
413
|
+
let minZ = trim.back > 0 ? -depth / 2 + trim.back : -depth / 2 - backExt;
|
|
414
|
+
let maxZ = trim.front > 0 ? depth / 2 - trim.front : depth / 2 + frontExt;
|
|
415
|
+
if (trim.frontLeftX > 0 && trim.frontLeftZ > 0 && maxZ - trim.frontLeftZ < 0) {
|
|
416
|
+
minX = Math.max(minX, minX + (trim.frontLeftX * (trim.frontLeftZ - maxZ)) / trim.frontLeftZ);
|
|
417
|
+
}
|
|
418
|
+
if (trim.backLeftX > 0 && trim.backLeftZ > 0 && minZ + trim.backLeftZ > 0) {
|
|
419
|
+
minX = Math.max(minX, minX + (trim.backLeftX * (trim.backLeftZ + minZ)) / trim.backLeftZ);
|
|
420
|
+
}
|
|
421
|
+
if (trim.frontRightX > 0 && trim.frontRightZ > 0 && maxZ - trim.frontRightZ < 0) {
|
|
422
|
+
maxX = Math.min(maxX, maxX - (trim.frontRightX * (trim.frontRightZ - maxZ)) / trim.frontRightZ);
|
|
423
|
+
}
|
|
424
|
+
if (trim.backRightX > 0 && trim.backRightZ > 0 && minZ + trim.backRightZ > 0) {
|
|
425
|
+
maxX = Math.min(maxX, maxX - (trim.backRightX * (trim.backRightZ + minZ)) / trim.backRightZ);
|
|
426
|
+
}
|
|
427
|
+
if (trim.frontLeftX > 0 && trim.frontLeftZ > 0 && minX + trim.frontLeftX > 0) {
|
|
428
|
+
maxZ = Math.min(maxZ, maxZ - (trim.frontLeftZ * (trim.frontLeftX + minX)) / trim.frontLeftX);
|
|
429
|
+
}
|
|
430
|
+
if (trim.frontRightX > 0 && trim.frontRightZ > 0 && maxX - trim.frontRightX < 0) {
|
|
431
|
+
maxZ = Math.min(maxZ, maxZ - (trim.frontRightZ * (trim.frontRightX - maxX)) / trim.frontRightX);
|
|
432
|
+
}
|
|
433
|
+
if (trim.backLeftX > 0 && trim.backLeftZ > 0 && minX + trim.backLeftX > 0) {
|
|
434
|
+
minZ = Math.max(minZ, minZ + (trim.backLeftZ * (trim.backLeftX + minX)) / trim.backLeftX);
|
|
435
|
+
}
|
|
436
|
+
if (trim.backRightX > 0 && trim.backRightZ > 0 && maxX - trim.backRightX < 0) {
|
|
437
|
+
minZ = Math.max(minZ, minZ + (trim.backRightZ * (trim.backRightX - maxX)) / trim.backRightX);
|
|
438
|
+
}
|
|
439
|
+
return {
|
|
440
|
+
minX,
|
|
441
|
+
maxX,
|
|
442
|
+
minZ,
|
|
443
|
+
maxZ,
|
|
444
|
+
width: Math.max(0.01, maxX - minX),
|
|
445
|
+
depth: Math.max(0.01, maxZ - minZ),
|
|
446
|
+
};
|
|
447
|
+
}
|
|
191
448
|
/** Segment-local surface height used by roof accessory placement and hit disambiguation. */
|
|
192
449
|
export function getRoofSegmentSurfaceY(node, localX, localZ) {
|
|
193
|
-
const
|
|
450
|
+
const slopeFrame = getSegmentSlopeFrame(node);
|
|
451
|
+
const activeRh = slopeFrame.activeRh;
|
|
194
452
|
const peakY = node.wallHeight + activeRh;
|
|
195
453
|
if (activeRh === 0)
|
|
196
454
|
return node.wallHeight;
|
|
197
|
-
if (node.roofType === 'gable' ||
|
|
198
|
-
node.roofType === 'gambrel' ||
|
|
199
|
-
node.roofType === 'mansard' ||
|
|
200
|
-
node.roofType === 'dutch') {
|
|
455
|
+
if (node.roofType === 'gable' || node.roofType === 'gambrel' || node.roofType === 'mansard') {
|
|
201
456
|
const t = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
|
|
202
457
|
return peakY - t * activeRh;
|
|
203
458
|
}
|
|
459
|
+
if (node.roofType === 'dutch') {
|
|
460
|
+
const hipHeightRatio = node.dutchHipHeightRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio;
|
|
461
|
+
const metrics = getDutchUpperShellBounds(node);
|
|
462
|
+
const lowerRise = activeRh * hipHeightRatio;
|
|
463
|
+
if (metrics.axis === 'x') {
|
|
464
|
+
const waistHalfZ = Math.max(0.0001, metrics.waistHalfZ);
|
|
465
|
+
if (Math.abs(localX) <= metrics.upperHalfX && Math.abs(localZ) <= waistHalfZ) {
|
|
466
|
+
const upperRise = activeRh * (1 - hipHeightRatio);
|
|
467
|
+
const upperTan = upperRise / waistHalfZ;
|
|
468
|
+
return peakY - Math.abs(localZ) * upperTan;
|
|
469
|
+
}
|
|
470
|
+
const xProgressDenom = Math.max(0.0001, node.width / 2 - metrics.waistHalfX);
|
|
471
|
+
const zProgressDenom = Math.max(0.0001, node.depth / 2 - waistHalfZ);
|
|
472
|
+
const xProgress = Math.max(0, Math.abs(localX) - metrics.waistHalfX) / xProgressDenom;
|
|
473
|
+
const zProgress = Math.max(0, Math.abs(localZ) - waistHalfZ) / zProgressDenom;
|
|
474
|
+
return node.wallHeight + lowerRise * (1 - Math.min(1, Math.max(xProgress, zProgress)));
|
|
475
|
+
}
|
|
476
|
+
const waistHalfX = Math.max(0.0001, metrics.waistHalfX);
|
|
477
|
+
if (Math.abs(localX) <= waistHalfX && Math.abs(localZ) <= metrics.upperHalfZ) {
|
|
478
|
+
const upperRise = activeRh * (1 - hipHeightRatio);
|
|
479
|
+
const upperRun = waistHalfX;
|
|
480
|
+
const upperTan = upperRise / upperRun;
|
|
481
|
+
return peakY - Math.abs(localX) * upperTan;
|
|
482
|
+
}
|
|
483
|
+
const xProgressDenom = Math.max(0.0001, node.width / 2 - waistHalfX);
|
|
484
|
+
const zProgressDenom = Math.max(0.0001, node.depth / 2 - metrics.waistHalfZ);
|
|
485
|
+
const xProgress = Math.max(0, Math.abs(localX) - waistHalfX) / xProgressDenom;
|
|
486
|
+
const zProgress = Math.max(0, Math.abs(localZ) - metrics.waistHalfZ) / zProgressDenom;
|
|
487
|
+
return node.wallHeight + lowerRise * (1 - Math.min(1, Math.max(xProgress, zProgress)));
|
|
488
|
+
}
|
|
204
489
|
if (node.roofType === 'shed') {
|
|
205
490
|
const t = (localZ + node.depth / 2) / (node.depth || 1);
|
|
206
491
|
return peakY - t * activeRh;
|
|
@@ -25,7 +25,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
25
25
|
type: z.ZodDefault<z.ZodLiteral<"roof">>;
|
|
26
26
|
material: z.ZodOptional<z.ZodObject<{
|
|
27
27
|
id: z.ZodOptional<z.ZodString>;
|
|
28
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
28
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
29
29
|
custom: "custom";
|
|
30
30
|
white: "white";
|
|
31
31
|
brick: "brick";
|
|
@@ -36,7 +36,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
36
36
|
plaster: "plaster";
|
|
37
37
|
tile: "tile";
|
|
38
38
|
marble: "marble";
|
|
39
|
-
}
|
|
39
|
+
}>>>;
|
|
40
40
|
properties: z.ZodOptional<z.ZodObject<{
|
|
41
41
|
color: z.ZodDefault<z.ZodString>;
|
|
42
42
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -58,7 +58,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
58
58
|
materialPreset: z.ZodOptional<z.ZodString>;
|
|
59
59
|
topMaterial: z.ZodOptional<z.ZodObject<{
|
|
60
60
|
id: z.ZodOptional<z.ZodString>;
|
|
61
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
61
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
62
62
|
custom: "custom";
|
|
63
63
|
white: "white";
|
|
64
64
|
brick: "brick";
|
|
@@ -69,7 +69,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
69
69
|
plaster: "plaster";
|
|
70
70
|
tile: "tile";
|
|
71
71
|
marble: "marble";
|
|
72
|
-
}
|
|
72
|
+
}>>>;
|
|
73
73
|
properties: z.ZodOptional<z.ZodObject<{
|
|
74
74
|
color: z.ZodDefault<z.ZodString>;
|
|
75
75
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -91,7 +91,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
91
91
|
topMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
92
92
|
edgeMaterial: z.ZodOptional<z.ZodObject<{
|
|
93
93
|
id: z.ZodOptional<z.ZodString>;
|
|
94
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
94
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
95
95
|
custom: "custom";
|
|
96
96
|
white: "white";
|
|
97
97
|
brick: "brick";
|
|
@@ -102,7 +102,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
102
102
|
plaster: "plaster";
|
|
103
103
|
tile: "tile";
|
|
104
104
|
marble: "marble";
|
|
105
|
-
}
|
|
105
|
+
}>>>;
|
|
106
106
|
properties: z.ZodOptional<z.ZodObject<{
|
|
107
107
|
color: z.ZodDefault<z.ZodString>;
|
|
108
108
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -124,7 +124,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
124
124
|
edgeMaterialPreset: z.ZodOptional<z.ZodString>;
|
|
125
125
|
wallMaterial: z.ZodOptional<z.ZodObject<{
|
|
126
126
|
id: z.ZodOptional<z.ZodString>;
|
|
127
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
127
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
128
128
|
custom: "custom";
|
|
129
129
|
white: "white";
|
|
130
130
|
brick: "brick";
|
|
@@ -135,7 +135,7 @@ export declare const RoofNode: z.ZodObject<{
|
|
|
135
135
|
plaster: "plaster";
|
|
136
136
|
tile: "tile";
|
|
137
137
|
marble: "marble";
|
|
138
|
-
}
|
|
138
|
+
}>>>;
|
|
139
139
|
properties: z.ZodOptional<z.ZodObject<{
|
|
140
140
|
color: z.ZodDefault<z.ZodString>;
|
|
141
141
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -69,7 +69,7 @@ export declare const ShelfNode: z.ZodObject<{
|
|
|
69
69
|
}>>;
|
|
70
70
|
material: z.ZodOptional<z.ZodObject<{
|
|
71
71
|
id: z.ZodOptional<z.ZodString>;
|
|
72
|
-
preset: z.ZodOptional<z.ZodEnum<{
|
|
72
|
+
preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
|
|
73
73
|
custom: "custom";
|
|
74
74
|
white: "white";
|
|
75
75
|
brick: "brick";
|
|
@@ -80,7 +80,7 @@ export declare const ShelfNode: z.ZodObject<{
|
|
|
80
80
|
plaster: "plaster";
|
|
81
81
|
tile: "tile";
|
|
82
82
|
marble: "marble";
|
|
83
|
-
}
|
|
83
|
+
}>>>;
|
|
84
84
|
properties: z.ZodOptional<z.ZodObject<{
|
|
85
85
|
color: z.ZodDefault<z.ZodString>;
|
|
86
86
|
roughness: z.ZodDefault<z.ZodNumber>;
|
|
@@ -100,6 +100,7 @@ export declare const ShelfNode: z.ZodObject<{
|
|
|
100
100
|
}, z.core.$strip>>;
|
|
101
101
|
}, z.core.$strip>>;
|
|
102
102
|
materialPreset: z.ZodOptional<z.ZodString>;
|
|
103
|
+
slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
103
104
|
}, z.core.$strip>;
|
|
104
105
|
export type ShelfNode = z.infer<typeof ShelfNode>;
|
|
105
106
|
//# sourceMappingURL=shelf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shelf.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/shelf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"shelf.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/shelf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
|