@pascal-app/core 0.9.1 → 1.0.0-beta.1
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/README.md +17 -10
- package/dist/events/bus.d.ts +49 -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/spatial-grid/floor-placed-elevation.d.ts +17 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +135 -28
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +427 -271
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +208 -9
- package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
- package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/support-host-id.js +2 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
- package/dist/index.d.ts +33 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -10
- 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 +23 -0
- package/dist/lib/measurement-geometry.d.ts.map +1 -0
- package/dist/lib/measurement-geometry.js +249 -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 +557 -31
- 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 +40 -6
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +574 -192
- package/dist/lib/terrain-brush.d.ts +163 -0
- package/dist/lib/terrain-brush.d.ts.map +1 -0
- package/dist/lib/terrain-brush.js +359 -0
- package/dist/lib/terrain-codec.d.ts +51 -0
- package/dist/lib/terrain-codec.d.ts.map +1 -0
- package/dist/lib/terrain-codec.js +167 -0
- package/dist/lib/terrain-field.d.ts +150 -0
- package/dist/lib/terrain-field.d.ts.map +1 -0
- package/dist/lib/terrain-field.js +248 -0
- package/dist/lib/terrain-raycast.d.ts +44 -0
- package/dist/lib/terrain-raycast.d.ts.map +1 -0
- package/dist/lib/terrain-raycast.js +188 -0
- package/dist/lib/terrain-source.d.ts +60 -0
- package/dist/lib/terrain-source.d.ts.map +1 -0
- package/dist/lib/terrain-source.js +90 -0
- package/dist/lib/terrain-support.d.ts +60 -0
- package/dist/lib/terrain-support.d.ts.map +1 -0
- package/dist/lib/terrain-support.js +150 -0
- 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 +428 -0
- package/dist/material-library.d.ts +28 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +2233 -441
- package/dist/registry/handles.d.ts +91 -3
- 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/subtree.d.ts.map +1 -1
- package/dist/registry/subtree.js +8 -1
- package/dist/registry/types.d.ts +781 -39
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/schema/index.d.ts +27 -8
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +23 -6
- 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/nodes/box-vent.d.ts +2 -2
- package/dist/schema/nodes/cabinet.d.ts +536 -0
- package/dist/schema/nodes/cabinet.d.ts.map +1 -0
- package/dist/schema/nodes/cabinet.js +139 -0
- package/dist/schema/nodes/ceiling.d.ts +4 -3
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +11 -1
- package/dist/schema/nodes/chimney.d.ts +4 -4
- package/dist/schema/nodes/column.d.ts +4 -2
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +5 -0
- package/dist/schema/nodes/construction-dimension.d.ts +195 -0
- package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
- package/dist/schema/nodes/construction-dimension.js +151 -0
- package/dist/schema/nodes/cupola.d.ts +2 -2
- package/dist/schema/nodes/door.d.ts +42 -5
- package/dist/schema/nodes/door.d.ts.map +1 -1
- package/dist/schema/nodes/door.js +32 -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 +58 -0
- package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
- package/dist/schema/nodes/duct-terminal.js +53 -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 +20 -2
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +33 -2
- package/dist/schema/nodes/gutter.d.ts +2 -2
- package/dist/schema/nodes/hvac-equipment.d.ts +64 -0
- package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
- package/dist/schema/nodes/hvac-equipment.js +57 -0
- package/dist/schema/nodes/item.d.ts +9 -0
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +24 -0
- package/dist/schema/nodes/level.d.ts +2 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +12 -31
- 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/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.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-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.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 +4 -2
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/shelf.js +8 -0
- package/dist/schema/nodes/site.d.ts +9 -0
- package/dist/schema/nodes/site.d.ts.map +1 -1
- package/dist/schema/nodes/site.js +8 -6
- package/dist/schema/nodes/skylight.d.ts +10 -10
- package/dist/schema/nodes/slab.d.ts +8 -2
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +18 -2
- package/dist/schema/nodes/solar-panel.d.ts +4 -4
- package/dist/schema/nodes/spawn.d.ts +1 -0
- package/dist/schema/nodes/spawn.d.ts.map +1 -1
- package/dist/schema/nodes/spawn.js +2 -0
- package/dist/schema/nodes/stair-segment.d.ts +4 -4
- package/dist/schema/nodes/stair.d.ts +16 -13
- package/dist/schema/nodes/stair.d.ts.map +1 -1
- package/dist/schema/nodes/stair.js +11 -1
- package/dist/schema/nodes/structural-grid.d.ts +27 -0
- package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
- package/dist/schema/nodes/structural-grid.js +17 -0
- package/dist/schema/nodes/turbine-vent.d.ts +2 -2
- package/dist/schema/nodes/wall.d.ts +248 -6
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +266 -0
- package/dist/schema/nodes/window.d.ts +40 -3
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +30 -0
- package/dist/schema/nodes/zone.d.ts +22 -0
- package/dist/schema/nodes/zone.d.ts.map +1 -1
- package/dist/schema/nodes/zone.js +21 -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/terrain.d.ts +28 -0
- package/dist/schema/terrain.d.ts.map +1 -0
- package/dist/schema/terrain.js +30 -0
- package/dist/schema/types.d.ts +1300 -97
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +27 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -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/index.d.ts +9 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +9 -2
- package/dist/services/level-height.d.ts +27 -0
- package/dist/services/level-height.d.ts.map +1 -0
- package/dist/services/level-height.js +94 -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/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/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/snap.d.ts +9 -1
- package/dist/services/snap.d.ts.map +1 -1
- package/dist/services/snap.js +21 -1
- package/dist/services/storey.d.ts +103 -0
- package/dist/services/storey.d.ts.map +1 -0
- package/dist/services/storey.js +296 -0
- 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/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/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +141 -4
- package/dist/store/history-control.d.ts +31 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +130 -0
- package/dist/store/use-live-terrain.d.ts +65 -0
- package/dist/store/use-live-terrain.d.ts.map +1 -0
- package/dist/store/use-live-terrain.js +31 -0
- package/dist/store/use-live-transforms.d.ts +8 -0
- package/dist/store/use-live-transforms.d.ts.map +1 -1
- package/dist/store/use-scene.d.ts +47 -3
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +992 -55
- package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
- package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-system.js +27 -21
- package/dist/systems/elevator/elevator-service.d.ts +0 -2
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +2 -24
- 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/slab/slab-placement.d.ts +11 -0
- package/dist/systems/slab/slab-placement.d.ts.map +1 -0
- package/dist/systems/slab/slab-placement.js +14 -0
- package/dist/systems/slab/slab-support.d.ts +137 -0
- package/dist/systems/slab/slab-support.d.ts.map +1 -0
- package/dist/systems/slab/slab-support.js +557 -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 +1300 -505
- 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 +19 -33
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +32 -4
- package/dist/systems/stair/stair-rise.d.ts +22 -0
- package/dist/systems/stair/stair-rise.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise.js +79 -0
- package/dist/systems/wall/wall-curve.d.ts +10 -0
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +1 -1
- package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
- package/dist/systems/wall/wall-mitering.js +44 -8
- package/dist/systems/wall/wall-top.d.ts +40 -0
- package/dist/systems/wall/wall-top.d.ts.map +1 -0
- package/dist/systems/wall/wall-top.js +46 -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 +56 -5
- 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 +106 -0
- package/dist/validation/validate-build-json.d.ts +3 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +90 -5
- package/package.json +4 -4
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -273
- package/dist/lib/space-detection-pause.test.d.ts +0 -2
- package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
- package/dist/lib/space-detection-pause.test.js +0 -42
- package/dist/lib/space-detection.test.d.ts +0 -2
- package/dist/lib/space-detection.test.d.ts.map +0 -1
- package/dist/lib/space-detection.test.js +0 -77
- package/dist/registry/registry.test.d.ts +0 -2
- package/dist/registry/registry.test.d.ts.map +0 -1
- package/dist/registry/registry.test.js +0 -183
- package/dist/registry/relations-resolver.test.d.ts +0 -2
- package/dist/registry/relations-resolver.test.d.ts.map +0 -1
- package/dist/registry/relations-resolver.test.js +0 -183
- package/dist/registry/scene-api.test.d.ts +0 -2
- package/dist/registry/scene-api.test.d.ts.map +0 -1
- package/dist/registry/scene-api.test.js +0 -183
- package/dist/registry/subtree.test.d.ts +0 -2
- package/dist/registry/subtree.test.d.ts.map +0 -1
- package/dist/registry/subtree.test.js +0 -133
- package/dist/schema/asset-url.test.d.ts +0 -2
- package/dist/schema/asset-url.test.d.ts.map +0 -1
- package/dist/schema/asset-url.test.js +0 -134
- package/dist/services/alignment-anchors.test.d.ts +0 -2
- package/dist/services/alignment-anchors.test.d.ts.map +0 -1
- package/dist/services/alignment-anchors.test.js +0 -383
- package/dist/services/alignment.test.d.ts +0 -2
- package/dist/services/alignment.test.d.ts.map +0 -1
- package/dist/services/alignment.test.js +0 -92
- package/dist/services/drag-session.test.d.ts +0 -2
- package/dist/services/drag-session.test.d.ts.map +0 -1
- package/dist/services/drag-session.test.js +0 -219
- package/dist/services/hosting.test.d.ts +0 -2
- package/dist/services/hosting.test.d.ts.map +0 -1
- package/dist/services/hosting.test.js +0 -199
- package/dist/services/movement.test.d.ts +0 -2
- package/dist/services/movement.test.d.ts.map +0 -1
- package/dist/services/movement.test.js +0 -133
- package/dist/services/single-undo-dance.test.d.ts +0 -2
- package/dist/services/single-undo-dance.test.d.ts.map +0 -1
- package/dist/services/single-undo-dance.test.js +0 -210
- package/dist/services/snap.test.d.ts +0 -2
- package/dist/services/snap.test.d.ts.map +0 -1
- package/dist/services/snap.test.js +0 -95
- package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
- package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
- package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
- package/dist/store/actions/reparent.test.d.ts +0 -2
- package/dist/store/actions/reparent.test.d.ts.map +0 -1
- package/dist/store/actions/reparent.test.js +0 -212
- package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
- package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
- package/dist/store/use-scene-elevator-migration.test.js +0 -109
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
- package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
- package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-runtime.test.js +0 -64
- package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
- package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
- package/dist/systems/stair/stair-opening-preview.test.js +0 -80
- package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
- package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
- package/dist/systems/stair/stair-opening-sync.test.js +0 -446
- package/dist/utils/clone-scene-graph.test.d.ts +0 -2
- package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
- package/dist/utils/clone-scene-graph.test.js +0 -59
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { getDutchRoofMetrics, getSegmentSlopeFrame } from './roof-segment';
|
|
2
|
+
function getWallVolumeFrame(node) {
|
|
3
|
+
const { activeRh, tanTheta } = getSegmentSlopeFrame(node);
|
|
4
|
+
const wallThickness = node.wallThickness ?? 0.1;
|
|
5
|
+
const autoDrop = (wallThickness / 2) * tanTheta;
|
|
6
|
+
const wV = Math.max(0.01, node.width + wallThickness);
|
|
7
|
+
const dV = Math.max(0.01, node.depth + wallThickness);
|
|
8
|
+
const eaveY = Math.max(0.01, node.wallHeight - autoDrop);
|
|
9
|
+
let rh = activeRh;
|
|
10
|
+
if (activeRh > 0) {
|
|
11
|
+
rh = activeRh + autoDrop;
|
|
12
|
+
if (node.roofType === 'shed')
|
|
13
|
+
rh = activeRh + 2 * autoDrop;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
wV,
|
|
17
|
+
dV,
|
|
18
|
+
eaveY,
|
|
19
|
+
peakY: eaveY + Math.max(0.001, rh),
|
|
20
|
+
tanTheta,
|
|
21
|
+
hasSlope: activeRh > 0,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const FACE_NORMALS = {
|
|
25
|
+
front: [0, 0, 1],
|
|
26
|
+
back: [0, 0, -1],
|
|
27
|
+
right: [1, 0, 0],
|
|
28
|
+
left: [-1, 0, 0],
|
|
29
|
+
};
|
|
30
|
+
const FACE_YAWS = {
|
|
31
|
+
front: 0,
|
|
32
|
+
back: Math.PI,
|
|
33
|
+
right: Math.PI / 2,
|
|
34
|
+
left: -Math.PI / 2,
|
|
35
|
+
};
|
|
36
|
+
function rectProfile(length, top) {
|
|
37
|
+
return [
|
|
38
|
+
[0, 0],
|
|
39
|
+
[length, 0],
|
|
40
|
+
[length, top],
|
|
41
|
+
[0, top],
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
function buildFaceProfile(node, frame, id) {
|
|
45
|
+
const { wV, dV, eaveY, peakY, tanTheta, hasSlope } = frame;
|
|
46
|
+
const isEnd = id === 'right' || id === 'left';
|
|
47
|
+
const length = isEnd ? dV : wV;
|
|
48
|
+
if (!hasSlope)
|
|
49
|
+
return rectProfile(length, eaveY);
|
|
50
|
+
switch (node.roofType) {
|
|
51
|
+
case 'gable': {
|
|
52
|
+
if (!isEnd)
|
|
53
|
+
return rectProfile(length, eaveY);
|
|
54
|
+
return [
|
|
55
|
+
[0, 0],
|
|
56
|
+
[length, 0],
|
|
57
|
+
[length, eaveY],
|
|
58
|
+
[length / 2, peakY],
|
|
59
|
+
[0, eaveY],
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
case 'gambrel': {
|
|
63
|
+
if (!isEnd)
|
|
64
|
+
return rectProfile(length, eaveY);
|
|
65
|
+
// Kink ring sits at z = ±mz on the nominal footprint (see
|
|
66
|
+
// getModuleFaces); both end faces are symmetric about u = length/2.
|
|
67
|
+
const ratio = node.gambrelLowerWidthRatio ?? 0.5;
|
|
68
|
+
const mz = Math.min((node.depth / 2) * ratio, length / 2);
|
|
69
|
+
const kinkY = eaveY + (length / 2 - mz) * tanTheta;
|
|
70
|
+
return [
|
|
71
|
+
[0, 0],
|
|
72
|
+
[length, 0],
|
|
73
|
+
[length, eaveY],
|
|
74
|
+
[length / 2 + mz, kinkY],
|
|
75
|
+
[length / 2, peakY],
|
|
76
|
+
[length / 2 - mz, kinkY],
|
|
77
|
+
[0, eaveY],
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
case 'shed': {
|
|
81
|
+
// Slope falls toward +Z: 'back' is the full-height wall, the end
|
|
82
|
+
// faces are right trapezoids rising toward the back edge.
|
|
83
|
+
if (id === 'front')
|
|
84
|
+
return rectProfile(length, eaveY);
|
|
85
|
+
if (id === 'back')
|
|
86
|
+
return rectProfile(length, peakY);
|
|
87
|
+
if (id === 'right') {
|
|
88
|
+
return [
|
|
89
|
+
[0, 0],
|
|
90
|
+
[length, 0],
|
|
91
|
+
[length, peakY],
|
|
92
|
+
[0, eaveY],
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
return [
|
|
96
|
+
[0, 0],
|
|
97
|
+
[length, 0],
|
|
98
|
+
[length, eaveY],
|
|
99
|
+
[0, peakY],
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
case 'dutch': {
|
|
103
|
+
const metrics = getDutchRoofMetrics(node);
|
|
104
|
+
const isDutchGableFace = (metrics.axis === 'x' && isEnd) ||
|
|
105
|
+
(metrics.axis === 'z' && (id === 'front' || id === 'back'));
|
|
106
|
+
if (!isDutchGableFace)
|
|
107
|
+
return rectProfile(length, eaveY);
|
|
108
|
+
const shoulderInset = metrics.axis === 'x' ? metrics.shoulderInsetAlongDepth : metrics.shoulderInsetAlongWidth;
|
|
109
|
+
if (!(shoulderInset > 0.001))
|
|
110
|
+
return rectProfile(length, eaveY);
|
|
111
|
+
const shoulderLo = Math.max(0, shoulderInset);
|
|
112
|
+
const shoulderHi = Math.min(length, length - shoulderInset);
|
|
113
|
+
if (!(shoulderHi - shoulderLo > 0.02))
|
|
114
|
+
return rectProfile(length, eaveY);
|
|
115
|
+
return [
|
|
116
|
+
[0, 0],
|
|
117
|
+
[length, 0],
|
|
118
|
+
[length, eaveY],
|
|
119
|
+
[shoulderHi, eaveY],
|
|
120
|
+
[length / 2, peakY],
|
|
121
|
+
[shoulderLo, eaveY],
|
|
122
|
+
[0, eaveY],
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
default:
|
|
126
|
+
return rectProfile(length, eaveY);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
export function getRoofSegmentWallFace(node, id) {
|
|
130
|
+
const frame = getWallVolumeFrame(node);
|
|
131
|
+
const isEnd = id === 'right' || id === 'left';
|
|
132
|
+
return {
|
|
133
|
+
id,
|
|
134
|
+
normal: FACE_NORMALS[id],
|
|
135
|
+
yaw: FACE_YAWS[id],
|
|
136
|
+
length: isEnd ? frame.dV : frame.wV,
|
|
137
|
+
profile: buildFaceProfile(node, frame, id),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
export function getRoofSegmentWallFaces(node) {
|
|
141
|
+
const frame = getWallVolumeFrame(node);
|
|
142
|
+
return ['front', 'back', 'right', 'left'].map((id) => ({
|
|
143
|
+
id,
|
|
144
|
+
normal: FACE_NORMALS[id],
|
|
145
|
+
yaw: FACE_YAWS[id],
|
|
146
|
+
length: id === 'right' || id === 'left' ? frame.dV : frame.wV,
|
|
147
|
+
profile: buildFaceProfile(node, frame, id),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Segment-local point → face coords. `dist` is the signed offset off the
|
|
152
|
+
* outer wall plane along the face normal (0 = on the plane, positive =
|
|
153
|
+
* outside the volume).
|
|
154
|
+
*/
|
|
155
|
+
export function segmentPointToRoofWallFace(node, id, point) {
|
|
156
|
+
const { wV, dV } = getWallVolumeFrame(node);
|
|
157
|
+
const [x, y, z] = point;
|
|
158
|
+
switch (id) {
|
|
159
|
+
case 'front':
|
|
160
|
+
return { u: x + wV / 2, v: y, dist: z - dV / 2 };
|
|
161
|
+
case 'back':
|
|
162
|
+
return { u: wV / 2 - x, v: y, dist: -z - dV / 2 };
|
|
163
|
+
case 'right':
|
|
164
|
+
return { u: dV / 2 - z, v: y, dist: x - wV / 2 };
|
|
165
|
+
case 'left':
|
|
166
|
+
return { u: z + dV / 2, v: y, dist: -x - wV / 2 };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Inward half-plane constraints of the raw profile polygon (CCW →
|
|
171
|
+
* interior is to the left of each edge): a point p is inside when
|
|
172
|
+
* `nu·p.u + nv·p.v ≥ c` for every constraint.
|
|
173
|
+
*/
|
|
174
|
+
function getProfileConstraints(face) {
|
|
175
|
+
const constraints = [];
|
|
176
|
+
const pts = face.profile;
|
|
177
|
+
for (let i = 0; i < pts.length; i++) {
|
|
178
|
+
const a = pts[i];
|
|
179
|
+
const b = pts[(i + 1) % pts.length];
|
|
180
|
+
const du = b[0] - a[0];
|
|
181
|
+
const dv = b[1] - a[1];
|
|
182
|
+
const len = Math.hypot(du, dv);
|
|
183
|
+
if (len < 1e-9)
|
|
184
|
+
continue;
|
|
185
|
+
const nu = -dv / len;
|
|
186
|
+
const nv = du / len;
|
|
187
|
+
constraints.push({ nu, nv, c: nu * a[0] + nv * a[1] });
|
|
188
|
+
}
|
|
189
|
+
return constraints;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Half-plane constraints for the CENTER of a `width × height` rect that
|
|
193
|
+
* must fit inside the face profile — the raw constraints eroded by the
|
|
194
|
+
* rect's half-extents projected on each edge normal.
|
|
195
|
+
*/
|
|
196
|
+
function getRectCenterConstraints(face, width, height) {
|
|
197
|
+
return getProfileConstraints(face).map(({ nu, nv, c }) => ({
|
|
198
|
+
nu,
|
|
199
|
+
nv,
|
|
200
|
+
c: c + (Math.abs(nu) * width) / 2 + (Math.abs(nv) * height) / 2,
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The face's render frame in segment-local space: a group placed at
|
|
205
|
+
* `origin` and yawed by `yaw` maps face coords to segment space —
|
|
206
|
+
* frame X = U (along the face), frame Y = V (height), frame Z = the
|
|
207
|
+
* outward normal, with z = 0 on the WALL MID-PLANE. The mid-plane of
|
|
208
|
+
* the generated wall volume lands exactly on the nominal footprint
|
|
209
|
+
* (`±width/2` / `±depth/2`), so hosted children use the same position
|
|
210
|
+
* conventions as wall children (openings at z = 0, wall-side items
|
|
211
|
+
* pushed +thickness/2 at render time). Renderers derive this from the
|
|
212
|
+
* live-override-merged segment, which is what makes hosted children
|
|
213
|
+
* track segment edits live instead of jumping on commit.
|
|
214
|
+
*/
|
|
215
|
+
export function getRoofWallFaceFrame(node, id) {
|
|
216
|
+
const { wV, dV } = getWallVolumeFrame(node);
|
|
217
|
+
switch (id) {
|
|
218
|
+
case 'front':
|
|
219
|
+
return { origin: [-wV / 2, 0, node.depth / 2], yaw: FACE_YAWS.front };
|
|
220
|
+
case 'back':
|
|
221
|
+
return { origin: [wV / 2, 0, -node.depth / 2], yaw: FACE_YAWS.back };
|
|
222
|
+
case 'right':
|
|
223
|
+
return { origin: [node.width / 2, 0, dV / 2], yaw: FACE_YAWS.right };
|
|
224
|
+
case 'left':
|
|
225
|
+
return { origin: [-node.width / 2, 0, -dV / 2], yaw: FACE_YAWS.left };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/** Face-frame point ([u, v, z-from-mid-plane]) → segment-local point. */
|
|
229
|
+
export function roofFacePointToSegment(node, id, point) {
|
|
230
|
+
const { origin, yaw } = getRoofWallFaceFrame(node, id);
|
|
231
|
+
const cos = Math.cos(yaw);
|
|
232
|
+
const sin = Math.sin(yaw);
|
|
233
|
+
const [u, v, z] = point;
|
|
234
|
+
// rotation-y: +x → (cos, 0, -sin), +z → (sin, 0, cos)
|
|
235
|
+
return [origin[0] + u * cos + z * sin, origin[1] + v, origin[2] - u * sin + z * cos];
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Max width of a rect growing from an anchored vertical edge (`anchorU`)
|
|
239
|
+
* in direction `growSign` (±1 along U) while staying inside the face
|
|
240
|
+
* profile at the fixed vertical center `vCenter`. Resize-handle limit:
|
|
241
|
+
* the anchored-edge model matches the handles' apply math (opposite
|
|
242
|
+
* edge stays put, center re-derives).
|
|
243
|
+
*/
|
|
244
|
+
export function getMaxRoofRectWidthFromAnchor(face, anchorU, growSign, vCenter, height) {
|
|
245
|
+
let max = Number.POSITIVE_INFINITY;
|
|
246
|
+
for (const { nu, nv, c } of getProfileConstraints(face)) {
|
|
247
|
+
// Center at anchorU + growSign·w/2, eroded by |nu|·w/2 + |nv|·h/2:
|
|
248
|
+
// base + k·w ≥ 0 with k ≤ 0 only when growth approaches the edge.
|
|
249
|
+
const k = (nu * growSign - Math.abs(nu)) / 2;
|
|
250
|
+
if (k >= -1e-9)
|
|
251
|
+
continue;
|
|
252
|
+
const base = nu * anchorU + nv * vCenter - c - (Math.abs(nv) * height) / 2;
|
|
253
|
+
max = Math.min(max, Math.max(0, base / -k));
|
|
254
|
+
}
|
|
255
|
+
return max;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Max height of a rect growing from an anchored horizontal edge
|
|
259
|
+
* (`anchorV`) in direction `growSign` (+1 = bottom anchored, grows up)
|
|
260
|
+
* while staying inside the face profile at the fixed horizontal center
|
|
261
|
+
* `uCenter`.
|
|
262
|
+
*/
|
|
263
|
+
export function getMaxRoofRectHeightFromAnchor(face, uCenter, width, anchorV, growSign) {
|
|
264
|
+
let max = Number.POSITIVE_INFINITY;
|
|
265
|
+
for (const { nu, nv, c } of getProfileConstraints(face)) {
|
|
266
|
+
const k = (nv * growSign - Math.abs(nv)) / 2;
|
|
267
|
+
if (k >= -1e-9)
|
|
268
|
+
continue;
|
|
269
|
+
const base = nu * uCenter + nv * anchorV - c - (Math.abs(nu) * width) / 2;
|
|
270
|
+
max = Math.min(max, Math.max(0, base / -k));
|
|
271
|
+
}
|
|
272
|
+
return max;
|
|
273
|
+
}
|
|
274
|
+
const CLAMP_EPSILON = 1e-4;
|
|
275
|
+
/**
|
|
276
|
+
* Clamp a rect center so the rect fits inside the face profile.
|
|
277
|
+
*
|
|
278
|
+
* - `lockV: true` (doors): `v` is fixed; only `u` slides. Returns null
|
|
279
|
+
* when no `u` keeps the rect inside at that height.
|
|
280
|
+
* - otherwise (windows): the center is projected into the eroded convex
|
|
281
|
+
* region (cyclic projection — profiles are convex by construction).
|
|
282
|
+
*
|
|
283
|
+
* Returns null when the rect cannot fit anywhere on the face.
|
|
284
|
+
*/
|
|
285
|
+
export function clampRectToRoofWallFace(face, u, v, width, height, opts) {
|
|
286
|
+
const constraints = getRectCenterConstraints(face, width, height);
|
|
287
|
+
if (constraints.length < 3)
|
|
288
|
+
return null;
|
|
289
|
+
if (opts?.lockV) {
|
|
290
|
+
let lo = Number.NEGATIVE_INFINITY;
|
|
291
|
+
let hi = Number.POSITIVE_INFINITY;
|
|
292
|
+
for (const { nu, nv, c } of constraints) {
|
|
293
|
+
const rhs = c - nv * v;
|
|
294
|
+
if (Math.abs(nu) < 1e-9) {
|
|
295
|
+
if (rhs > CLAMP_EPSILON)
|
|
296
|
+
return null;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (nu > 0)
|
|
300
|
+
lo = Math.max(lo, rhs / nu);
|
|
301
|
+
else
|
|
302
|
+
hi = Math.min(hi, rhs / nu);
|
|
303
|
+
}
|
|
304
|
+
if (lo > hi + CLAMP_EPSILON)
|
|
305
|
+
return null;
|
|
306
|
+
return { u: Math.min(Math.max(u, lo), hi), v };
|
|
307
|
+
}
|
|
308
|
+
let pu = u;
|
|
309
|
+
let pv = v;
|
|
310
|
+
for (let iter = 0; iter < 32; iter++) {
|
|
311
|
+
let worst = null;
|
|
312
|
+
let worstViolation = CLAMP_EPSILON;
|
|
313
|
+
for (const constraint of constraints) {
|
|
314
|
+
const violation = constraint.c - (constraint.nu * pu + constraint.nv * pv);
|
|
315
|
+
if (violation > worstViolation) {
|
|
316
|
+
worstViolation = violation;
|
|
317
|
+
worst = constraint;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
if (!worst)
|
|
321
|
+
return { u: pu, v: pv };
|
|
322
|
+
pu += worst.nu * worstViolation;
|
|
323
|
+
pv += worst.nv * worstViolation;
|
|
324
|
+
}
|
|
325
|
+
for (const { nu, nv, c } of constraints) {
|
|
326
|
+
if (nu * pu + nv * pv < c - 1e-3)
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
return { u: pu, v: pv };
|
|
330
|
+
}
|
|
@@ -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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"}
|