@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
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ npm install react three @react-three/fiber @react-three/drei
|
|
|
18
18
|
|
|
19
19
|
- **Node Schemas** - Zod schemas for all building primitives (walls, slabs, items, etc.)
|
|
20
20
|
- **Scene State** - Zustand store with IndexedDB persistence and undo/redo
|
|
21
|
-
- **
|
|
21
|
+
- **Registry Contracts** - Plugin and node-definition APIs shared by renderers and editor tools
|
|
22
22
|
- **Scene Registry** - Fast lookup from node IDs to Three.js objects
|
|
23
23
|
- **Spatial Grid** - Collision detection and placement validation
|
|
24
24
|
- **Event Bus** - Typed event emitter for inter-component communication
|
|
@@ -27,11 +27,12 @@ npm install react three @react-three/fiber @react-three/drei
|
|
|
27
27
|
## Usage
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
|
-
import { useScene, WallNode
|
|
30
|
+
import { useScene, WallNode } from '@pascal-app/core'
|
|
31
31
|
|
|
32
32
|
// Create a wall
|
|
33
33
|
const wall = WallNode.parse({
|
|
34
|
-
|
|
34
|
+
start: [0, 0],
|
|
35
|
+
end: [5, 0],
|
|
35
36
|
height: 3,
|
|
36
37
|
thickness: 0.2,
|
|
37
38
|
})
|
|
@@ -61,15 +62,21 @@ function MyComponent() {
|
|
|
61
62
|
- `ScanNode` - 3D scan reference
|
|
62
63
|
- `GuideNode` - 2D guide image reference
|
|
63
64
|
|
|
64
|
-
##
|
|
65
|
+
## Built-in Node Definitions
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
Core contains the schemas, scene state, and registry contracts. The built-in node definitions,
|
|
68
|
+
renderers, geometry builders, tools, and systems ship in `@pascal-app/nodes`:
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
```typescript
|
|
71
|
+
import { loadPlugin } from '@pascal-app/core'
|
|
72
|
+
import { builtinPlugin } from '@pascal-app/nodes'
|
|
73
|
+
|
|
74
|
+
await loadPlugin(builtinPlugin)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Load the plugin before mounting `@pascal-app/viewer`. See the
|
|
78
|
+
[`@pascal-app/viewer` quick start](https://github.com/pascalorg/editor/tree/main/packages/viewer#usage)
|
|
79
|
+
for a React example.
|
|
73
80
|
|
|
74
81
|
## License
|
|
75
82
|
|
package/dist/events/bus.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ThreeEvent } from '@react-three/fiber';
|
|
2
2
|
import type { Object3D } from 'three';
|
|
3
|
-
import type { BoxVentNode, BuildingNode, CeilingNode, ChimneyNode, ColumnNode, CupolaNode, DoorNode, DormerNode, DownspoutNode, ElevatorNode, EyebrowVentNode, FenceNode, GuideNode, GutterNode, ItemNode, LevelNode, RidgeVentNode, RoofNode, RoofSegmentNode, ScanNode, ShelfNode, SiteNode, SkylightNode, SlabNode, SolarPanelNode, SpawnNode, StairNode, StairSegmentNode, TurbineVentNode, WallNode, WindowNode, ZoneNode } from '../schema';
|
|
3
|
+
import type { BoxVentNode, BuildingNode, CabinetModuleNode, CabinetNode, CeilingNode, ChimneyNode, ColumnNode, ConstructionDimensionNode, CupolaNode, DoorNode, DormerNode, DownspoutNode, DuctFittingNode, DuctSegmentNode, DuctTerminalNode, ElevatorNode, EyebrowVentNode, FenceNode, GuideNode, GutterNode, HvacEquipmentNode, ItemNode, LevelNode, LinesetNode, LiquidLineNode, MeasurementNode, PipeFittingNode, PipeSegmentNode, PipeTrapNode, RidgeVentNode, RoofNode, RoofSegmentNode, ScanNode, ShelfNode, SiteNode, SkylightNode, SlabNode, SolarPanelNode, SpawnNode, StairNode, StairSegmentNode, StructuralGridNode, TurbineVentNode, WallNode, WindowNode, ZoneNode } from '../schema';
|
|
4
4
|
import type { AnyNode } from '../schema/types';
|
|
5
5
|
export interface GridEvent {
|
|
6
6
|
/** World-space intersection point on the grid plane. */
|
|
@@ -38,6 +38,8 @@ export type FenceEvent = NodeEvent<FenceNode>;
|
|
|
38
38
|
export type ItemEvent = NodeEvent<ItemNode>;
|
|
39
39
|
export type SiteEvent = NodeEvent<SiteNode>;
|
|
40
40
|
export type BuildingEvent = NodeEvent<BuildingNode>;
|
|
41
|
+
export type CabinetEvent = NodeEvent<CabinetNode>;
|
|
42
|
+
export type CabinetModuleEvent = NodeEvent<CabinetModuleNode>;
|
|
41
43
|
export type LevelEvent = NodeEvent<LevelNode>;
|
|
42
44
|
export type ZoneEvent = NodeEvent<ZoneNode>;
|
|
43
45
|
export type ShelfEvent = NodeEvent<ShelfNode>;
|
|
@@ -45,10 +47,12 @@ export type SlabEvent = NodeEvent<SlabNode>;
|
|
|
45
47
|
export type SpawnEvent = NodeEvent<SpawnNode>;
|
|
46
48
|
export type CeilingEvent = NodeEvent<CeilingNode>;
|
|
47
49
|
export type ColumnEvent = NodeEvent<ColumnNode>;
|
|
50
|
+
export type ConstructionDimensionEvent = NodeEvent<ConstructionDimensionNode>;
|
|
48
51
|
export type RoofEvent = NodeEvent<RoofNode>;
|
|
49
52
|
export type RoofSegmentEvent = NodeEvent<RoofSegmentNode>;
|
|
50
53
|
export type StairEvent = NodeEvent<StairNode>;
|
|
51
54
|
export type StairSegmentEvent = NodeEvent<StairSegmentNode>;
|
|
55
|
+
export type StructuralGridEvent = NodeEvent<StructuralGridNode>;
|
|
52
56
|
export type WindowEvent = NodeEvent<WindowNode>;
|
|
53
57
|
export type DoorEvent = NodeEvent<DoorNode>;
|
|
54
58
|
export type ElevatorEvent = NodeEvent<ElevatorNode>;
|
|
@@ -65,6 +69,16 @@ export type SolarPanelEvent = NodeEvent<SolarPanelNode>;
|
|
|
65
69
|
export type SkylightEvent = NodeEvent<SkylightNode>;
|
|
66
70
|
export type DormerEvent = NodeEvent<DormerNode>;
|
|
67
71
|
export type DownspoutEvent = NodeEvent<DownspoutNode>;
|
|
72
|
+
export type DuctSegmentEvent = NodeEvent<DuctSegmentNode>;
|
|
73
|
+
export type DuctFittingEvent = NodeEvent<DuctFittingNode>;
|
|
74
|
+
export type DuctTerminalEvent = NodeEvent<DuctTerminalNode>;
|
|
75
|
+
export type HvacEquipmentEvent = NodeEvent<HvacEquipmentNode>;
|
|
76
|
+
export type PipeSegmentEvent = NodeEvent<PipeSegmentNode>;
|
|
77
|
+
export type PipeFittingEvent = NodeEvent<PipeFittingNode>;
|
|
78
|
+
export type PipeTrapEvent = NodeEvent<PipeTrapNode>;
|
|
79
|
+
export type LinesetEvent = NodeEvent<LinesetNode>;
|
|
80
|
+
export type LiquidLineEvent = NodeEvent<LiquidLineNode>;
|
|
81
|
+
export type MeasurementEvent = NodeEvent<MeasurementNode>;
|
|
68
82
|
export declare const eventSuffixes: readonly ["click", "move", "enter", "leave", "pointerdown", "pointerup", "context-menu", "double-click"];
|
|
69
83
|
export type EventSuffix = (typeof eventSuffixes)[number];
|
|
70
84
|
type NodeEvents<T extends string, E> = {
|
|
@@ -85,6 +99,14 @@ export interface ThumbnailGenerateEvent {
|
|
|
85
99
|
width: number;
|
|
86
100
|
height: number;
|
|
87
101
|
};
|
|
102
|
+
/**
|
|
103
|
+
* Output size for `standard` captures (center-crop target). Defaults to
|
|
104
|
+
* 1920×1080; the capture overlay passes other aspect presets (9:16, 4:3…).
|
|
105
|
+
*/
|
|
106
|
+
standardSize?: {
|
|
107
|
+
w: number;
|
|
108
|
+
h: number;
|
|
109
|
+
};
|
|
88
110
|
/**
|
|
89
111
|
* When true, snap levels to their true positions before capturing (for a
|
|
90
112
|
* consistent auto-thumbnail angle) and defer the capture if the tab is
|
|
@@ -114,6 +136,14 @@ export interface CameraControlFitSceneEvent {
|
|
|
114
136
|
size: [number, number];
|
|
115
137
|
};
|
|
116
138
|
}
|
|
139
|
+
export interface CameraPose {
|
|
140
|
+
position: [number, number, number];
|
|
141
|
+
target: [number, number, number];
|
|
142
|
+
projection: 'perspective' | 'orthographic';
|
|
143
|
+
/** Width, in scene units, of the visible plane through `target`. */
|
|
144
|
+
viewWidth?: number;
|
|
145
|
+
fov?: number;
|
|
146
|
+
}
|
|
117
147
|
type CameraControlEvents = {
|
|
118
148
|
'camera-controls:view': CameraControlEvent;
|
|
119
149
|
'camera-controls:focus': CameraControlEvent;
|
|
@@ -123,6 +153,9 @@ type CameraControlEvents = {
|
|
|
123
153
|
'camera-controls:orbit-ccw': undefined;
|
|
124
154
|
'camera-controls:fit-scene': CameraControlFitSceneEvent;
|
|
125
155
|
'camera-controls:generate-thumbnail': ThumbnailGenerateEvent;
|
|
156
|
+
'camera-controls:apply-pose': CameraPose;
|
|
157
|
+
'camera-controls:cancel-pose': undefined;
|
|
158
|
+
'camera-controls:interaction-start': undefined;
|
|
126
159
|
};
|
|
127
160
|
type ToolEvents = {
|
|
128
161
|
'tool:cancel': undefined;
|
|
@@ -174,7 +207,21 @@ export interface RoomPresetCreateEvent {
|
|
|
174
207
|
type RoomPresetEvents = {
|
|
175
208
|
'room-preset:create': RoomPresetCreateEvent;
|
|
176
209
|
};
|
|
177
|
-
type
|
|
210
|
+
type SelectionEvents = {
|
|
211
|
+
/**
|
|
212
|
+
* A node click accepted by an editor canvas selection path after proxy and
|
|
213
|
+
* phase routing. Hosts can react to the user's 2D/3D selection intent
|
|
214
|
+
* without treating programmatic selection changes as canvas clicks.
|
|
215
|
+
*/
|
|
216
|
+
'selection:canvas-node-click': AnyNode;
|
|
217
|
+
/**
|
|
218
|
+
* "Reveal this node" intent — the editor's node action menu emits it with the
|
|
219
|
+
* selected node; whoever owns the node's catalog/panel (host browser, a
|
|
220
|
+
* plugin's presets panel) listens and reveals it.
|
|
221
|
+
*/
|
|
222
|
+
'selection:find-node': AnyNode;
|
|
223
|
+
};
|
|
224
|
+
type EditorEvents = GridEvents & NodeEvents<'wall', WallEvent> & NodeEvents<'fence', FenceEvent> & NodeEvents<'cabinet', CabinetEvent> & NodeEvents<'cabinet-module', CabinetModuleEvent> & NodeEvents<'item', ItemEvent> & NodeEvents<'site', SiteEvent> & NodeEvents<'building', BuildingEvent> & NodeEvents<'elevator', ElevatorEvent> & NodeEvents<'level', LevelEvent> & NodeEvents<'zone', ZoneEvent> & NodeEvents<'slab', SlabEvent> & NodeEvents<'shelf', ShelfEvent> & NodeEvents<'spawn', SpawnEvent> & NodeEvents<'ceiling', CeilingEvent> & NodeEvents<'column', ColumnEvent> & NodeEvents<'construction-dimension', ConstructionDimensionEvent> & NodeEvents<'roof', RoofEvent> & NodeEvents<'roof-segment', RoofSegmentEvent> & NodeEvents<'stair', StairEvent> & NodeEvents<'stair-segment', StairSegmentEvent> & NodeEvents<'structural-grid', StructuralGridEvent> & NodeEvents<'window', WindowEvent> & NodeEvents<'door', DoorEvent> & NodeEvents<'scan', ScanEvent> & NodeEvents<'guide', GuideEvent> & NodeEvents<'box-vent', BoxVentEvent> & NodeEvents<'ridge-vent', RidgeVentEvent> & NodeEvents<'turbine-vent', TurbineVentEvent> & NodeEvents<'cupola', CupolaEvent> & NodeEvents<'eyebrow-vent', EyebrowVentEvent> & NodeEvents<'gutter', GutterEvent> & NodeEvents<'chimney', ChimneyEvent> & NodeEvents<'solar-panel', SolarPanelEvent> & NodeEvents<'skylight', SkylightEvent> & NodeEvents<'dormer', DormerEvent> & NodeEvents<'downspout', DownspoutEvent> & NodeEvents<'duct-segment', DuctSegmentEvent> & NodeEvents<'duct-fitting', DuctFittingEvent> & NodeEvents<'duct-terminal', DuctTerminalEvent> & NodeEvents<'hvac-equipment', HvacEquipmentEvent> & NodeEvents<'pipe-segment', PipeSegmentEvent> & NodeEvents<'pipe-fitting', PipeFittingEvent> & NodeEvents<'pipe-trap', PipeTrapEvent> & NodeEvents<'lineset', LinesetEvent> & NodeEvents<'liquid-line', LiquidLineEvent> & NodeEvents<'measurement', MeasurementEvent> & CameraControlEvents & ToolEvents & GuideEvents & DoorAnimationEvents & WindowAnimationEvents & ThumbnailEvents & SnapshotEvents & AIChatEvents & RoomPresetEvents & SelectionEvents;
|
|
178
225
|
export declare const emitter: import("mitt").Emitter<EditorEvents>;
|
|
179
226
|
export {};
|
|
180
227
|
//# sourceMappingURL=bus.d.ts.map
|
package/dist/events/bus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type * as THREE from 'three';
|
|
2
|
+
export type ItemClipEntry = {
|
|
3
|
+
/** The catalog clip to re-emit (e.g. a fan's "On" spin). */
|
|
4
|
+
clip: THREE.AnimationClip;
|
|
5
|
+
/** Plays looping in the baked viewer (ambient motion) vs once. */
|
|
6
|
+
loop: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Catalog-item animation clips the bake needs to re-emit. A catalog GLB ships
|
|
10
|
+
* its own clips (the live item renderer loads + plays them), but those clips
|
|
11
|
+
* are not part of the editor scene graph, so the GLB export can't see them on
|
|
12
|
+
* its own. The item renderer registers the resolved clip per node id while the
|
|
13
|
+
* scene is live; `glb-export` reads this and retargets the clip onto the baked
|
|
14
|
+
* item subtree. Door/window motion is synthesized separately and never goes
|
|
15
|
+
* here. Keyed by node id; cleared with the rest of the scene refs on unload.
|
|
16
|
+
*/
|
|
17
|
+
export declare const itemClipRegistry: Map<string, ItemClipEntry>;
|
|
18
|
+
//# sourceMappingURL=item-clip-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-clip-registry.d.ts","sourceRoot":"","sources":["../../../src/hooks/scene-registry/item-clip-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAEnC,MAAM,MAAM,aAAa,GAAG;IAC1B,4DAA4D;IAC5D,IAAI,EAAE,KAAK,CAAC,aAAa,CAAA;IACzB,kEAAkE;IAClE,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,4BAAmC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog-item animation clips the bake needs to re-emit. A catalog GLB ships
|
|
3
|
+
* its own clips (the live item renderer loads + plays them), but those clips
|
|
4
|
+
* are not part of the editor scene graph, so the GLB export can't see them on
|
|
5
|
+
* its own. The item renderer registers the resolved clip per node id while the
|
|
6
|
+
* scene is live; `glb-export` reads this and retargets the clip onto the baked
|
|
7
|
+
* item subtree. Door/window motion is synthesized separately and never goes
|
|
8
|
+
* here. Keyed by node id; cleared with the rest of the scene refs on unload.
|
|
9
|
+
*/
|
|
10
|
+
export const itemClipRegistry = new Map();
|
|
@@ -2,8 +2,15 @@ import type * as THREE from 'three';
|
|
|
2
2
|
type ByTypeMap = {
|
|
3
3
|
[kind: string]: Set<string>;
|
|
4
4
|
};
|
|
5
|
+
declare class RevisionedMap<K, V> extends Map<K, V> {
|
|
6
|
+
revision: number;
|
|
7
|
+
set(key: K, value: V): this;
|
|
8
|
+
delete(key: K): boolean;
|
|
9
|
+
clear(): void;
|
|
10
|
+
}
|
|
5
11
|
export declare const sceneRegistry: {
|
|
6
|
-
nodes:
|
|
12
|
+
nodes: RevisionedMap<string, THREE.Object3D<THREE.Object3DEventMap>>;
|
|
13
|
+
readonly revision: number;
|
|
7
14
|
byType: ByTypeMap;
|
|
8
15
|
/** Remove all entries. Call when unloading a scene to prevent stale 3D refs. */
|
|
9
16
|
clear(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-registry.d.ts","sourceRoot":"","sources":["../../../src/hooks/scene-registry/scene-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAYnC,KAAK,SAAS,GAAG;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"scene-registry.d.ts","sourceRoot":"","sources":["../../../src/hooks/scene-registry/scene-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAYnC,KAAK,SAAS,GAAG;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAGhD,cAAM,aAAa,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACzC,QAAQ,SAAI;IAEH,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IAOpB,MAAM,CAAC,GAAG,EAAE,CAAC;IAMb,KAAK;CAKf;AA4BD,eAAO,MAAM,aAAa;;;;IAYxB,gFAAgF;;CAOjF,CAAA;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,QAiBzF"}
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useLayoutEffect } from 'react';
|
|
3
3
|
const byTypeStore = new Map();
|
|
4
|
+
class RevisionedMap extends Map {
|
|
5
|
+
revision = 0;
|
|
6
|
+
set(key, value) {
|
|
7
|
+
if (this.has(key) && this.get(key) === value)
|
|
8
|
+
return this;
|
|
9
|
+
super.set(key, value);
|
|
10
|
+
this.revision += 1;
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
delete(key) {
|
|
14
|
+
const deleted = super.delete(key);
|
|
15
|
+
if (deleted)
|
|
16
|
+
this.revision += 1;
|
|
17
|
+
return deleted;
|
|
18
|
+
}
|
|
19
|
+
clear() {
|
|
20
|
+
if (this.size === 0)
|
|
21
|
+
return;
|
|
22
|
+
super.clear();
|
|
23
|
+
this.revision += 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const registeredNodes = new RevisionedMap();
|
|
4
27
|
const byTypeProxy = new Proxy({}, {
|
|
5
28
|
get(_target, key) {
|
|
6
29
|
if (typeof key !== 'string')
|
|
@@ -29,7 +52,10 @@ const byTypeProxy = new Proxy({}, {
|
|
|
29
52
|
});
|
|
30
53
|
export const sceneRegistry = {
|
|
31
54
|
// Master lookup: ID -> Object3D
|
|
32
|
-
nodes:
|
|
55
|
+
nodes: registeredNodes,
|
|
56
|
+
get revision() {
|
|
57
|
+
return registeredNodes.revision;
|
|
58
|
+
},
|
|
33
59
|
// Categorized lookups: Kind -> Set of IDs. Backed by a Proxy so any kind
|
|
34
60
|
// gets a Set on first touch — no hardcoded list.
|
|
35
61
|
byType: byTypeProxy,
|
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
import type { FloorPlacedConfig, FloorPlacedFootprint, FloorPlacedFootprintContext, FloorPlacedFootprintsResolver } from '../../registry/types';
|
|
2
2
|
import type { AnyNode } from '../../schema';
|
|
3
|
+
export { GROUND_SUPPORT_ID } from './support-host-id';
|
|
4
|
+
/**
|
|
5
|
+
* Sentinel `supportSlabId` meaning "hosted by the level base (ground)".
|
|
6
|
+
* Persisted when a pointer-capped commit elects the ground while one or
|
|
7
|
+
* more slabs (e.g. an elevated deck) still overlap the footprint above the
|
|
8
|
+
* cap — without it, the uncapped per-frame election would lift the
|
|
9
|
+
* committed node back onto the deck.
|
|
10
|
+
*/
|
|
3
11
|
export type FloorPlacedElevationArgs = {
|
|
4
12
|
node: AnyNode;
|
|
5
13
|
nodes: Record<string, AnyNode>;
|
|
6
14
|
position: [number, number, number];
|
|
7
15
|
rotation?: unknown;
|
|
8
16
|
levelId?: string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Pointer-decided support cap (level-local Y): only slabs whose walking
|
|
19
|
+
* surface sits at or below `maxElevation + SUPPORT_ELEVATION_EPSILON`
|
|
20
|
+
* may be elected, and the persisted `supportSlabId` is bypassed — during
|
|
21
|
+
* a drag the pointer, not the stored host, decides the target surface.
|
|
22
|
+
* Omit (or pass null) for the uncapped committed-read behavior.
|
|
23
|
+
*/
|
|
24
|
+
maxElevation?: number | null;
|
|
9
25
|
};
|
|
10
26
|
export declare function getFloorPlacedFootprints(floorPlaced: FloorPlacedConfig, node: AnyNode, ctx?: FloorPlacedFootprintContext): FloorPlacedFootprint[];
|
|
11
|
-
export declare function getFloorPlacedElevation({ node, nodes, position, rotation, levelId, }: FloorPlacedElevationArgs): number;
|
|
27
|
+
export declare function getFloorPlacedElevation({ node, nodes, position, rotation, levelId, maxElevation, }: FloorPlacedElevationArgs): number;
|
|
12
28
|
export declare function getFloorStackedPosition(args: FloorPlacedElevationArgs): [number, number, number];
|
|
13
29
|
export type { FloorPlacedFootprint, FloorPlacedFootprintContext, FloorPlacedFootprintsResolver };
|
|
14
30
|
//# sourceMappingURL=floor-placed-elevation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floor-placed-elevation.d.ts","sourceRoot":"","sources":["../../../src/hooks/spatial-grid/floor-placed-elevation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"floor-placed-elevation.d.ts","sourceRoot":"","sources":["../../../src/hooks/spatial-grid/floor-placed-elevation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAa,MAAM,cAAc,CAAA;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIrD;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B,CAAA;AAkBD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,iBAAiB,EAC9B,IAAI,EAAE,OAAO,EACb,GAAG,CAAC,EAAE,2BAA2B,GAChC,oBAAoB,EAAE,CAMxB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,YAAY,GACb,EAAE,wBAAwB,GAAG,MAAM,CA0FnC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAGhG;AAED,YAAY,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,CAAA"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { terrainSupportLift } from '../../lib/terrain-support';
|
|
1
2
|
import { nodeRegistry } from '../../registry';
|
|
2
3
|
import { spatialGridManager } from './spatial-grid-manager';
|
|
4
|
+
export { GROUND_SUPPORT_ID } from './support-host-id';
|
|
5
|
+
import { GROUND_SUPPORT_ID } from './support-host-id';
|
|
3
6
|
function finiteSlabElevation(elevation) {
|
|
4
7
|
return Number.isFinite(elevation) ? elevation : 0;
|
|
5
8
|
}
|
|
@@ -17,7 +20,7 @@ export function getFloorPlacedFootprints(floorPlaced, node, ctx) {
|
|
|
17
20
|
const footprint = floorPlaced.footprint?.(node, ctx);
|
|
18
21
|
return footprint ? [footprint] : [];
|
|
19
22
|
}
|
|
20
|
-
export function getFloorPlacedElevation({ node, nodes, position, rotation, levelId, }) {
|
|
23
|
+
export function getFloorPlacedElevation({ node, nodes, position, rotation, levelId, maxElevation, }) {
|
|
21
24
|
const floorPlaced = nodeRegistry.get(node.type)?.capabilities?.floorPlaced;
|
|
22
25
|
if (!floorPlaced)
|
|
23
26
|
return 0;
|
|
@@ -35,15 +38,65 @@ export function getFloorPlacedElevation({ node, nodes, position, rotation, level
|
|
|
35
38
|
const resolvedLevelId = parent?.type === 'level' ? parent.id : levelId;
|
|
36
39
|
if (!resolvedLevelId)
|
|
37
40
|
return 0;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
const footprints = getFloorPlacedFootprints(floorPlaced, effectiveNode, { nodes });
|
|
42
|
+
/**
|
|
43
|
+
* What "the level base" evaluates to: the sculpted ground under this node, or 0
|
|
44
|
+
* when the scene has no terrain / this storey is not at grade.
|
|
45
|
+
*
|
|
46
|
+
* Sampled once at the node's own XZ — not per footprint, and not averaged over
|
|
47
|
+
* the footprint. One sample per node is what keeps a row of columns individually
|
|
48
|
+
* correct on a slope while a composite node (a cabinet run, an L-shaped desk)
|
|
49
|
+
* stays rigid instead of shearing across its own parts. Kinds that need a level
|
|
50
|
+
* pad (stairs, a building's ground slab) get one by flattening the terrain under
|
|
51
|
+
* them, which is a scene edit and therefore visible and undoable — not by
|
|
52
|
+
* silently disagreeing with the ground here.
|
|
53
|
+
*
|
|
54
|
+
* Deliberately called only where level-base support is asserted. The six
|
|
55
|
+
* `0`-returns above mean "do not touch this node's Y" — an attached item, a
|
|
56
|
+
* non-`level` parent, a broken graph — and lifting those would pull wall sconces
|
|
57
|
+
* and cabinet interiors off their hosts.
|
|
58
|
+
*/
|
|
59
|
+
let groundLiftCache = null;
|
|
60
|
+
const groundLift = () => {
|
|
61
|
+
groundLiftCache ??= terrainSupportLift(nodes, resolvedLevelId, position[0], position[2]) ?? 0;
|
|
62
|
+
return groundLiftCache;
|
|
63
|
+
};
|
|
64
|
+
// A persisted support host pins the elevation while it still exists and
|
|
65
|
+
// overlaps a footprint — deterministic across stacked slabs. A stale
|
|
66
|
+
// host (deleted or reshaped away) silently falls through to the
|
|
67
|
+
// election below; this per-frame read path never writes the field.
|
|
68
|
+
// Skipped entirely under a pointer cap: the cursor, not the stored
|
|
69
|
+
// host, decides the target surface during a drag.
|
|
70
|
+
const supportSlabId = effectiveNode.supportSlabId;
|
|
71
|
+
if (maxElevation == null && supportSlabId) {
|
|
72
|
+
if (supportSlabId === GROUND_SUPPORT_ID)
|
|
73
|
+
return groundLift();
|
|
74
|
+
for (const footprint of footprints) {
|
|
75
|
+
const hosted = spatialGridManager.getHostSlabElevationForFootprint(resolvedLevelId, supportSlabId, footprint.position ?? position, footprint.dimensions, footprint.rotation);
|
|
76
|
+
if (hosted !== null)
|
|
77
|
+
return finiteSlabElevation(hosted);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Per footprint the support is its winning slab, or the level base when no slab
|
|
81
|
+
// overlaps it; the node rests on the highest of them. The *slab id* is what says
|
|
82
|
+
// which of the two it is — `getSlabSupportForItem` reports a no-winner election
|
|
83
|
+
// as elevation 0, and terrain makes that ambiguous: a slab flush with the storey
|
|
84
|
+
// base and bare ground both read as 0, and only the second follows a hillside.
|
|
85
|
+
//
|
|
86
|
+
// Electing the base per footprint rather than as a whole-node fallback is what
|
|
87
|
+
// keeps this identical on flat ground, where `groundLift()` is 0: a composite node
|
|
88
|
+
// straddling a recessed slab and bare floor still rests on the floor rather than
|
|
89
|
+
// sinking into the recess.
|
|
90
|
+
let elected = Number.NEGATIVE_INFINITY;
|
|
91
|
+
for (const footprint of footprints) {
|
|
92
|
+
const support = spatialGridManager.getSlabSupportForItem(resolvedLevelId, footprint.position ?? position, footprint.dimensions, footprint.rotation, maxElevation);
|
|
93
|
+
const elevation = support.slabId === null ? groundLift() : finiteSlabElevation(support.elevation);
|
|
94
|
+
if (elevation > elected) {
|
|
95
|
+
elected = elevation;
|
|
44
96
|
}
|
|
45
97
|
}
|
|
46
|
-
|
|
98
|
+
// A kind with no footprint at all still rests on the ground.
|
|
99
|
+
return elected === Number.NEGATIVE_INFINITY ? groundLift() : elected;
|
|
47
100
|
}
|
|
48
101
|
export function getFloorStackedPosition(args) {
|
|
49
102
|
const [x, y, z] = args.position;
|