@pascal-app/core 1.0.1 → 1.0.4
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/agent-operations/__fixtures__/add-object-cases.d.ts +235 -0
- package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/add-object-cases.js +129 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.d.ts +4 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/build-room-cases.js +635 -0
- package/dist/agent-operations/__fixtures__/cases.d.ts +52 -0
- package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/cases.js +689 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts +7 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/find-by-type-cases.js +21 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.d.ts +17 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/place-items-cases.js +506 -0
- package/dist/agent-operations/__fixtures__/room-cases.d.ts +3 -0
- package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/room-cases.js +338 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts +5 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/search-assets-cases.js +137 -0
- package/dist/agent-operations/__fixtures__/structure-cases.d.ts +6 -0
- package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/structure-cases.js +588 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +3 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -0
- package/dist/agent-operations/__fixtures__/verify-scene-cases.js +302 -0
- package/dist/agent-operations/achieved.d.ts +16 -0
- package/dist/agent-operations/achieved.d.ts.map +1 -0
- package/dist/agent-operations/achieved.js +28 -0
- package/dist/agent-operations/add-column.d.ts +23 -0
- package/dist/agent-operations/add-column.d.ts.map +1 -0
- package/dist/agent-operations/add-column.js +97 -0
- package/dist/agent-operations/add-level.d.ts +14 -0
- package/dist/agent-operations/add-level.d.ts.map +1 -0
- package/dist/agent-operations/add-level.js +94 -0
- package/dist/agent-operations/add-object.d.ts +114 -0
- package/dist/agent-operations/add-object.d.ts.map +1 -0
- package/dist/agent-operations/add-object.js +361 -0
- package/dist/agent-operations/add-wall.d.ts +15 -0
- package/dist/agent-operations/add-wall.d.ts.map +1 -0
- package/dist/agent-operations/add-wall.js +47 -0
- package/dist/agent-operations/apply-changes.d.ts +16 -0
- package/dist/agent-operations/apply-changes.d.ts.map +1 -0
- package/dist/agent-operations/apply-changes.js +93 -0
- package/dist/agent-operations/apply-outcome.d.ts +15 -0
- package/dist/agent-operations/apply-outcome.d.ts.map +1 -0
- package/dist/agent-operations/apply-outcome.js +18 -0
- package/dist/agent-operations/collections.d.ts +28 -0
- package/dist/agent-operations/collections.d.ts.map +1 -0
- package/dist/agent-operations/collections.js +130 -0
- package/dist/agent-operations/create-room.d.ts +36 -0
- package/dist/agent-operations/create-room.d.ts.map +1 -0
- package/dist/agent-operations/create-room.js +177 -0
- package/dist/agent-operations/create-stair.d.ts +33 -0
- package/dist/agent-operations/create-stair.d.ts.map +1 -0
- package/dist/agent-operations/create-stair.js +247 -0
- package/dist/agent-operations/delete-node.d.ts +6 -0
- package/dist/agent-operations/delete-node.d.ts.map +1 -0
- package/dist/agent-operations/delete-node.js +9 -0
- package/dist/agent-operations/door-clearance.d.ts +135 -0
- package/dist/agent-operations/door-clearance.d.ts.map +1 -0
- package/dist/agent-operations/door-clearance.js +334 -0
- package/dist/agent-operations/duplicate-level.d.ts +12 -0
- package/dist/agent-operations/duplicate-level.d.ts.map +1 -0
- package/dist/agent-operations/duplicate-level.js +54 -0
- package/dist/agent-operations/find-by-type.d.ts +11 -0
- package/dist/agent-operations/find-by-type.d.ts.map +1 -0
- package/dist/agent-operations/find-by-type.js +94 -0
- package/dist/agent-operations/furnish-room.d.ts +18 -0
- package/dist/agent-operations/furnish-room.d.ts.map +1 -0
- package/dist/agent-operations/furnish-room.js +259 -0
- package/dist/agent-operations/get-node.d.ts +9 -0
- package/dist/agent-operations/get-node.d.ts.map +1 -0
- package/dist/agent-operations/get-node.js +33 -0
- package/dist/agent-operations/hosted-services.d.ts +13 -0
- package/dist/agent-operations/hosted-services.d.ts.map +1 -0
- package/dist/agent-operations/hosted-services.js +22 -0
- package/dist/agent-operations/index.d.ts +277 -0
- package/dist/agent-operations/index.d.ts.map +1 -0
- package/dist/agent-operations/index.js +80 -0
- package/dist/agent-operations/layout-clearance.d.ts +108 -0
- package/dist/agent-operations/layout-clearance.d.ts.map +1 -0
- package/dist/agent-operations/layout-clearance.js +190 -0
- package/dist/agent-operations/level-reads.d.ts +33 -0
- package/dist/agent-operations/level-reads.d.ts.map +1 -0
- package/dist/agent-operations/level-reads.js +161 -0
- package/dist/agent-operations/level-target.d.ts +11 -0
- package/dist/agent-operations/level-target.d.ts.map +1 -0
- package/dist/agent-operations/level-target.js +29 -0
- package/dist/agent-operations/list-levels.d.ts +4 -0
- package/dist/agent-operations/list-levels.d.ts.map +1 -0
- package/dist/agent-operations/list-levels.js +31 -0
- package/dist/agent-operations/material-preset.d.ts +11 -0
- package/dist/agent-operations/material-preset.d.ts.map +1 -0
- package/dist/agent-operations/material-preset.js +74 -0
- package/dist/agent-operations/material-refs.d.ts +24 -0
- package/dist/agent-operations/material-refs.d.ts.map +1 -0
- package/dist/agent-operations/material-refs.js +100 -0
- package/dist/agent-operations/node-patch.d.ts +3 -0
- package/dist/agent-operations/node-patch.d.ts.map +1 -0
- package/dist/agent-operations/node-patch.js +114 -0
- package/dist/agent-operations/paint.d.ts +21 -0
- package/dist/agent-operations/paint.d.ts.map +1 -0
- package/dist/agent-operations/paint.js +219 -0
- package/dist/agent-operations/place-items.d.ts +20 -0
- package/dist/agent-operations/place-items.d.ts.map +1 -0
- package/dist/agent-operations/place-items.js +226 -0
- package/dist/agent-operations/plan-geometry.d.ts +24 -0
- package/dist/agent-operations/plan-geometry.d.ts.map +1 -0
- package/dist/agent-operations/plan-geometry.js +94 -0
- package/dist/agent-operations/room-structure.d.ts +87 -0
- package/dist/agent-operations/room-structure.d.ts.map +1 -0
- package/dist/agent-operations/room-structure.js +144 -0
- package/dist/agent-operations/scene-materials.d.ts +15 -0
- package/dist/agent-operations/scene-materials.d.ts.map +1 -0
- package/dist/agent-operations/scene-materials.js +62 -0
- package/dist/agent-operations/scene-measure.d.ts +73 -0
- package/dist/agent-operations/scene-measure.d.ts.map +1 -0
- package/dist/agent-operations/scene-measure.js +73 -0
- package/dist/agent-operations/scene-queries.d.ts +4510 -0
- package/dist/agent-operations/scene-queries.d.ts.map +1 -0
- package/dist/agent-operations/scene-queries.js +84 -0
- package/dist/agent-operations/scene-view.d.ts +98 -0
- package/dist/agent-operations/scene-view.d.ts.map +1 -0
- package/dist/agent-operations/scene-view.js +559 -0
- package/dist/agent-operations/search-assets.d.ts +14 -0
- package/dist/agent-operations/search-assets.d.ts.map +1 -0
- package/dist/agent-operations/search-assets.js +42 -0
- package/dist/agent-operations/search-materials.d.ts +12 -0
- package/dist/agent-operations/search-materials.d.ts.map +1 -0
- package/dist/agent-operations/search-materials.js +111 -0
- package/dist/agent-operations/stairs.d.ts +5 -0
- package/dist/agent-operations/stairs.d.ts.map +1 -0
- package/dist/agent-operations/stairs.js +70 -0
- package/dist/agent-operations/types.d.ts +59 -0
- package/dist/agent-operations/types.d.ts.map +1 -0
- package/dist/agent-operations/types.js +1 -0
- package/dist/agent-operations/verify-scene.d.ts +50 -0
- package/dist/agent-operations/verify-scene.d.ts.map +1 -0
- package/dist/agent-operations/verify-scene.js +369 -0
- package/dist/agent-operations/wall-opening.d.ts +65 -0
- package/dist/agent-operations/wall-opening.d.ts.map +1 -0
- package/dist/agent-operations/wall-opening.js +55 -0
- package/dist/agent-tools/achieved.d.ts +9 -0
- package/dist/agent-tools/achieved.d.ts.map +1 -0
- package/dist/agent-tools/achieved.js +8 -0
- package/dist/agent-tools/add-object.d.ts +43 -0
- package/dist/agent-tools/add-object.d.ts.map +1 -0
- package/dist/agent-tools/add-object.js +86 -0
- package/dist/agent-tools/assets.d.ts +13 -0
- package/dist/agent-tools/assets.d.ts.map +1 -0
- package/dist/agent-tools/assets.js +18 -0
- package/dist/agent-tools/clear-scene.d.ts +10 -0
- package/dist/agent-tools/clear-scene.d.ts.map +1 -0
- package/dist/agent-tools/clear-scene.js +9 -0
- package/dist/agent-tools/collections.d.ts +35 -0
- package/dist/agent-tools/collections.d.ts.map +1 -0
- package/dist/agent-tools/collections.js +31 -0
- package/dist/agent-tools/columns.d.ts +44 -0
- package/dist/agent-tools/columns.d.ts.map +1 -0
- package/dist/agent-tools/columns.js +59 -0
- package/dist/agent-tools/contract.d.ts +68 -0
- package/dist/agent-tools/contract.d.ts.map +1 -0
- package/dist/agent-tools/contract.js +1 -0
- package/dist/agent-tools/create-room.d.ts +63 -0
- package/dist/agent-tools/create-room.d.ts.map +1 -0
- package/dist/agent-tools/create-room.js +90 -0
- package/dist/agent-tools/find-by-type.d.ts +11 -0
- package/dist/agent-tools/find-by-type.d.ts.map +1 -0
- package/dist/agent-tools/find-by-type.js +14 -0
- package/dist/agent-tools/furnish-room.d.ts +26 -0
- package/dist/agent-tools/furnish-room.d.ts.map +1 -0
- package/dist/agent-tools/furnish-room.js +35 -0
- package/dist/agent-tools/hosted-services.d.ts +402 -0
- package/dist/agent-tools/hosted-services.d.ts.map +1 -0
- package/dist/agent-tools/hosted-services.js +148 -0
- package/dist/agent-tools/index.d.ts +864 -0
- package/dist/agent-tools/index.d.ts.map +1 -0
- package/dist/agent-tools/index.js +82 -0
- package/dist/agent-tools/levels.d.ts +72 -0
- package/dist/agent-tools/levels.d.ts.map +1 -0
- package/dist/agent-tools/levels.js +76 -0
- package/dist/agent-tools/measurement.d.ts +37 -0
- package/dist/agent-tools/measurement.d.ts.map +1 -0
- package/dist/agent-tools/measurement.js +94 -0
- package/dist/agent-tools/node-id.d.ts +3 -0
- package/dist/agent-tools/node-id.d.ts.map +1 -0
- package/dist/agent-tools/node-id.js +2 -0
- package/dist/agent-tools/nodes.d.ts +17 -0
- package/dist/agent-tools/nodes.d.ts.map +1 -0
- package/dist/agent-tools/nodes.js +13 -0
- package/dist/agent-tools/paint.d.ts +46 -0
- package/dist/agent-tools/paint.d.ts.map +1 -0
- package/dist/agent-tools/paint.js +29 -0
- package/dist/agent-tools/place-items.d.ts +19 -0
- package/dist/agent-tools/place-items.d.ts.map +1 -0
- package/dist/agent-tools/place-items.js +29 -0
- package/dist/agent-tools/refusal.d.ts +20 -0
- package/dist/agent-tools/refusal.d.ts.map +1 -0
- package/dist/agent-tools/refusal.js +29 -0
- package/dist/agent-tools/room-structure.d.ts +438 -0
- package/dist/agent-tools/room-structure.d.ts.map +1 -0
- package/dist/agent-tools/room-structure.js +207 -0
- package/dist/agent-tools/search-materials.d.ts +20 -0
- package/dist/agent-tools/search-materials.d.ts.map +1 -0
- package/dist/agent-tools/search-materials.js +32 -0
- package/dist/agent-tools/stairs.d.ts +86 -0
- package/dist/agent-tools/stairs.d.ts.map +1 -0
- package/dist/agent-tools/stairs.js +103 -0
- package/dist/agent-tools/verify-scene.d.ts +13 -0
- package/dist/agent-tools/verify-scene.d.ts.map +1 -0
- package/dist/agent-tools/verify-scene.js +21 -0
- package/dist/agent-tools/view-scene.d.ts +43 -0
- package/dist/agent-tools/view-scene.d.ts.map +1 -0
- package/dist/agent-tools/view-scene.js +80 -0
- package/dist/agent-tools/wall-openings.d.ts +163 -0
- package/dist/agent-tools/wall-openings.d.ts.map +1 -0
- package/dist/agent-tools/wall-openings.js +144 -0
- package/dist/agent-tools/walls.d.ts +21 -0
- package/dist/agent-tools/walls.d.ts.map +1 -0
- package/dist/agent-tools/walls.js +30 -0
- package/dist/agent-tools/write-target.d.ts +12 -0
- package/dist/agent-tools/write-target.d.ts.map +1 -0
- package/dist/agent-tools/write-target.js +10 -0
- package/dist/building/__fixtures__/wall-opening-cases.d.ts +736 -0
- package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -0
- package/dist/building/__fixtures__/wall-opening-cases.js +307 -0
- package/dist/building/door-types.d.ts +22 -0
- package/dist/building/door-types.d.ts.map +1 -0
- package/dist/building/door-types.js +167 -0
- package/dist/building/floor-item-fit.d.ts +38 -0
- package/dist/building/floor-item-fit.d.ts.map +1 -0
- package/dist/building/floor-item-fit.js +47 -0
- package/dist/building/index.d.ts +7 -0
- package/dist/building/index.d.ts.map +1 -0
- package/dist/building/index.js +6 -0
- package/dist/building/level-duplication.d.ts +8983 -0
- package/dist/building/level-duplication.d.ts.map +1 -0
- package/dist/building/level-duplication.js +314 -0
- package/dist/building/opening-style-presets.d.ts +46 -0
- package/dist/building/opening-style-presets.d.ts.map +1 -0
- package/dist/building/opening-style-presets.js +195 -0
- package/dist/building/wall-openings.d.ts +445 -0
- package/dist/building/wall-openings.d.ts.map +1 -0
- package/dist/building/wall-openings.js +231 -0
- package/dist/building/window-types.d.ts +17 -0
- package/dist/building/window-types.d.ts.map +1 -0
- package/dist/building/window-types.js +31 -0
- package/dist/commands/structure/apply-zone-transform.d.ts +23 -0
- package/dist/commands/structure/apply-zone-transform.d.ts.map +1 -0
- package/dist/commands/structure/apply-zone-transform.js +55 -0
- package/dist/commands/structure/create-mezzanine.d.ts +12 -0
- package/dist/commands/structure/create-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/create-mezzanine.js +46 -0
- package/dist/commands/structure/create-zone.d.ts +32 -0
- package/dist/commands/structure/create-zone.d.ts.map +1 -0
- package/dist/commands/structure/create-zone.js +126 -0
- package/dist/commands/structure/delete-zone.d.ts +51 -0
- package/dist/commands/structure/delete-zone.d.ts.map +1 -0
- package/dist/commands/structure/delete-zone.js +354 -0
- package/dist/commands/structure/divide-zone.d.ts +38 -0
- package/dist/commands/structure/divide-zone.d.ts.map +1 -0
- package/dist/commands/structure/divide-zone.js +186 -0
- package/dist/commands/structure/duplicate-zone.d.ts +7 -0
- package/dist/commands/structure/duplicate-zone.d.ts.map +1 -0
- package/dist/commands/structure/duplicate-zone.js +21 -0
- package/dist/commands/structure/floor-opening.d.ts +36 -0
- package/dist/commands/structure/floor-opening.d.ts.map +1 -0
- package/dist/commands/structure/floor-opening.js +124 -0
- package/dist/commands/structure/index.d.ts +22 -0
- package/dist/commands/structure/index.d.ts.map +1 -0
- package/dist/commands/structure/index.js +20 -0
- package/dist/commands/structure/lock-outside-faces.d.ts +12 -0
- package/dist/commands/structure/lock-outside-faces.d.ts.map +1 -0
- package/dist/commands/structure/lock-outside-faces.js +32 -0
- package/dist/commands/structure/merge-zones.d.ts +5 -0
- package/dist/commands/structure/merge-zones.d.ts.map +1 -0
- package/dist/commands/structure/merge-zones.js +22 -0
- package/dist/commands/structure/mezzanine-content.d.ts +16 -0
- package/dist/commands/structure/mezzanine-content.d.ts.map +1 -0
- package/dist/commands/structure/mezzanine-content.js +109 -0
- package/dist/commands/structure/plan-mezzanine-stair.d.ts +7 -0
- package/dist/commands/structure/plan-mezzanine-stair.d.ts.map +1 -0
- package/dist/commands/structure/plan-mezzanine-stair.js +127 -0
- package/dist/commands/structure/plan-wall-deletion.d.ts +9 -0
- package/dist/commands/structure/plan-wall-deletion.d.ts.map +1 -0
- package/dist/commands/structure/plan-wall-deletion.js +151 -0
- package/dist/commands/structure/rebase-floor-reference.d.ts +7 -0
- package/dist/commands/structure/rebase-floor-reference.d.ts.map +1 -0
- package/dist/commands/structure/rebase-floor-reference.js +90 -0
- package/dist/commands/structure/resize-mezzanine.d.ts +8 -0
- package/dist/commands/structure/resize-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/resize-mezzanine.js +43 -0
- package/dist/commands/structure/rotate-zone.d.ts +8 -0
- package/dist/commands/structure/rotate-zone.d.ts.map +1 -0
- package/dist/commands/structure/rotate-zone.js +28 -0
- package/dist/commands/structure/set-floor-foundation.d.ts +62 -0
- package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -0
- package/dist/commands/structure/set-floor-foundation.js +162 -0
- package/dist/commands/structure/set-room-floor-construction.d.ts +8 -0
- package/dist/commands/structure/set-room-floor-construction.d.ts.map +1 -0
- package/dist/commands/structure/set-room-floor-construction.js +72 -0
- package/dist/commands/structure/set-wall-geometry.d.ts +10 -0
- package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -0
- package/dist/commands/structure/set-wall-geometry.js +52 -0
- package/dist/commands/structure/set-zone-edges.d.ts +14 -0
- package/dist/commands/structure/set-zone-edges.d.ts.map +1 -0
- package/dist/commands/structure/set-zone-edges.js +143 -0
- package/dist/commands/structure/set-zone-intent.d.ts +39 -0
- package/dist/commands/structure/set-zone-intent.d.ts.map +1 -0
- package/dist/commands/structure/set-zone-intent.js +125 -0
- package/dist/commands/structure/shared.d.ts +4512 -0
- package/dist/commands/structure/shared.d.ts.map +1 -0
- package/dist/commands/structure/shared.js +102 -0
- package/dist/commands/structure/transform-zone.d.ts +23 -0
- package/dist/commands/structure/transform-zone.d.ts.map +1 -0
- package/dist/commands/structure/transform-zone.js +472 -0
- package/dist/commands/structure/validate-mezzanine.d.ts +5 -0
- package/dist/commands/structure/validate-mezzanine.d.ts.map +1 -0
- package/dist/commands/structure/validate-mezzanine.js +46 -0
- package/dist/commands/structure/zone-crossings.d.ts +8 -0
- package/dist/commands/structure/zone-crossings.d.ts.map +1 -0
- package/dist/commands/structure/zone-crossings.js +162 -0
- package/dist/commands/structure/zone-drop.d.ts +4 -0
- package/dist/commands/structure/zone-drop.d.ts.map +1 -0
- package/dist/commands/structure/zone-drop.js +68 -0
- package/dist/commands/structure/zone-insertion.d.ts +4 -0
- package/dist/commands/structure/zone-insertion.d.ts.map +1 -0
- package/dist/commands/structure/zone-insertion.js +200 -0
- package/dist/commands/structure/zone-transform-content.d.ts +6 -0
- package/dist/commands/structure/zone-transform-content.d.ts.map +1 -0
- package/dist/commands/structure/zone-transform-content.js +117 -0
- package/dist/commands/structure/zone-wall-merge.d.ts +4977 -0
- package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -0
- package/dist/commands/structure/zone-wall-merge.js +135 -0
- package/dist/contracts/reference-discovery.d.ts +18 -0
- package/dist/contracts/reference-discovery.d.ts.map +1 -0
- package/dist/contracts/reference-discovery.js +100 -0
- package/dist/contracts/reference-inventory.d.ts +44 -0
- package/dist/contracts/reference-inventory.d.ts.map +1 -0
- package/dist/contracts/reference-inventory.js +872 -0
- package/dist/events/bus.d.ts +70 -9
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/hooks/scene-registry/item-clip-registry.d.ts +6 -3
- package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -1
- package/dist/hooks/scene-registry/item-clip-registry.js +2 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +15 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +3 -2
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +53 -66
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1650 -131
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +86 -83
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +1 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/support-host-patch.js +12 -5
- package/dist/index.d.ts +83 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -11
- package/dist/lib/__bench__/near-linear-walls.d.ts +2 -0
- package/dist/lib/__bench__/near-linear-walls.d.ts.map +1 -0
- package/dist/lib/__bench__/near-linear-walls.js +24 -0
- package/dist/lib/__bench__/structure-preview.bench.d.ts +2 -0
- package/dist/lib/__bench__/structure-preview.bench.d.ts.map +1 -0
- package/dist/lib/__bench__/structure-preview.bench.js +72 -0
- package/dist/lib/__fixtures__/mezzanine.d.ts +13968 -0
- package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -0
- package/dist/lib/__fixtures__/mezzanine.js +43 -0
- package/dist/lib/absorb-wall-separators.d.ts +4483 -0
- package/dist/lib/absorb-wall-separators.d.ts.map +1 -0
- package/dist/lib/absorb-wall-separators.js +65 -0
- package/dist/lib/angle-accumulator.d.ts +3 -0
- package/dist/lib/angle-accumulator.d.ts.map +1 -0
- package/dist/lib/angle-accumulator.js +13 -0
- package/dist/lib/artifact-store.d.ts +31 -0
- package/dist/lib/artifact-store.d.ts.map +1 -0
- package/dist/lib/artifact-store.js +42 -0
- package/dist/lib/assembly-stack.d.ts +54 -0
- package/dist/lib/assembly-stack.d.ts.map +1 -0
- package/dist/lib/assembly-stack.js +52 -0
- package/dist/lib/asset-storage.d.ts.map +1 -1
- package/dist/lib/asset-storage.js +3 -0
- package/dist/lib/canonical-opening-ring.d.ts +3 -0
- package/dist/lib/canonical-opening-ring.d.ts.map +1 -0
- package/dist/lib/canonical-opening-ring.js +14 -0
- package/dist/lib/ceiling-children.d.ts +8 -0
- package/dist/lib/ceiling-children.d.ts.map +1 -0
- package/dist/lib/ceiling-children.js +36 -0
- package/dist/lib/ceiling-surface.d.ts +40 -0
- package/dist/lib/ceiling-surface.d.ts.map +1 -0
- package/dist/lib/ceiling-surface.js +65 -0
- package/dist/lib/cutter-host.d.ts +5 -0
- package/dist/lib/cutter-host.d.ts.map +1 -0
- package/dist/lib/cutter-host.js +30 -0
- package/dist/lib/floor-construction-lift.d.ts +4 -0
- package/dist/lib/floor-construction-lift.d.ts.map +1 -0
- package/dist/lib/floor-construction-lift.js +54 -0
- package/dist/lib/floor-footprint-key.d.ts +3 -0
- package/dist/lib/floor-footprint-key.d.ts.map +1 -0
- package/dist/lib/floor-footprint-key.js +9 -0
- package/dist/lib/floor-footprint-name.d.ts +11 -0
- package/dist/lib/floor-footprint-name.d.ts.map +1 -0
- package/dist/lib/floor-footprint-name.js +52 -0
- package/dist/lib/floor-foundation-datum.d.ts +31 -0
- package/dist/lib/floor-foundation-datum.d.ts.map +1 -0
- package/dist/lib/floor-foundation-datum.js +226 -0
- package/dist/lib/floor-foundation-stack.d.ts +16 -0
- package/dist/lib/floor-foundation-stack.d.ts.map +1 -0
- package/dist/lib/floor-foundation-stack.js +214 -0
- package/dist/lib/floor-intent-changes.d.ts +10 -0
- package/dist/lib/floor-intent-changes.d.ts.map +1 -0
- package/dist/lib/floor-intent-changes.js +461 -0
- package/dist/lib/floor-opening-footprints.d.ts +24 -0
- package/dist/lib/floor-opening-footprints.d.ts.map +1 -0
- package/dist/lib/floor-opening-footprints.js +127 -0
- package/dist/lib/floor-opening-intent.d.ts +16 -0
- package/dist/lib/floor-opening-intent.d.ts.map +1 -0
- package/dist/lib/floor-opening-intent.js +82 -0
- package/dist/lib/floor-plate-id.d.ts +5 -0
- package/dist/lib/floor-plate-id.d.ts.map +1 -0
- package/dist/lib/floor-plate-id.js +20 -0
- package/dist/lib/floor-plate-paint.d.ts +8 -0
- package/dist/lib/floor-plate-paint.d.ts.map +1 -0
- package/dist/lib/floor-plate-paint.js +11 -0
- package/dist/lib/floor-plates.d.ts +211 -0
- package/dist/lib/floor-plates.d.ts.map +1 -0
- package/dist/lib/floor-plates.js +729 -0
- package/dist/lib/floor-room-faces.d.ts +5 -0
- package/dist/lib/floor-room-faces.d.ts.map +1 -0
- package/dist/lib/floor-room-faces.js +29 -0
- package/dist/lib/floor-step-finish.d.ts +49 -0
- package/dist/lib/floor-step-finish.d.ts.map +1 -0
- package/dist/lib/floor-step-finish.js +128 -0
- package/dist/lib/geometry-script-node.d.ts +82 -0
- package/dist/lib/geometry-script-node.d.ts.map +1 -0
- package/dist/lib/geometry-script-node.js +147 -0
- package/dist/lib/geometry-surfaces.d.ts +61 -0
- package/dist/lib/geometry-surfaces.d.ts.map +1 -0
- package/dist/lib/geometry-surfaces.js +156 -0
- package/dist/lib/item-slab-support.d.ts +14 -0
- package/dist/lib/item-slab-support.d.ts.map +1 -0
- package/dist/lib/item-slab-support.js +40 -0
- package/dist/lib/level-footprints.d.ts +23 -0
- package/dist/lib/level-footprints.d.ts.map +1 -0
- package/dist/lib/level-footprints.js +398 -0
- package/dist/lib/level-name.d.ts +7 -0
- package/dist/lib/level-name.d.ts.map +1 -1
- package/dist/lib/level-name.js +11 -3
- package/dist/lib/new-zone.d.ts +10 -0
- package/dist/lib/new-zone.d.ts.map +1 -0
- package/dist/lib/new-zone.js +10 -0
- package/dist/lib/node-ancestry.d.ts +30 -0
- package/dist/lib/node-ancestry.d.ts.map +1 -0
- package/dist/lib/node-ancestry.js +76 -0
- package/dist/lib/node-visibility.d.ts +12 -0
- package/dist/lib/node-visibility.d.ts.map +1 -0
- package/dist/lib/node-visibility.js +12 -0
- package/dist/lib/object-cuts.d.ts +11 -0
- package/dist/lib/object-cuts.d.ts.map +1 -0
- package/dist/lib/object-cuts.js +63 -0
- package/dist/lib/opening-floor-datum.d.ts +24 -0
- package/dist/lib/opening-floor-datum.d.ts.map +1 -0
- package/dist/lib/opening-floor-datum.js +145 -0
- package/dist/lib/own-floor-intent.d.ts +15 -0
- package/dist/lib/own-floor-intent.d.ts.map +1 -0
- package/dist/lib/own-floor-intent.js +201 -0
- package/dist/lib/plate-reference.d.ts +3 -0
- package/dist/lib/plate-reference.d.ts.map +1 -0
- package/dist/lib/plate-reference.js +91 -0
- package/dist/lib/plate-surface.d.ts +120 -0
- package/dist/lib/plate-surface.d.ts.map +1 -0
- package/dist/lib/plate-surface.js +725 -0
- package/dist/lib/polygon-boolean.d.ts +17 -0
- package/dist/lib/polygon-boolean.d.ts.map +1 -0
- package/dist/lib/polygon-boolean.js +195 -0
- package/dist/lib/polygon-label.d.ts +7 -0
- package/dist/lib/polygon-label.d.ts.map +1 -0
- package/dist/lib/polygon-label.js +94 -0
- package/dist/lib/room-drawn-floor.d.ts +29 -0
- package/dist/lib/room-drawn-floor.d.ts.map +1 -0
- package/dist/lib/room-drawn-floor.js +88 -0
- package/dist/lib/room-floor-choices.d.ts +11 -0
- package/dist/lib/room-floor-choices.d.ts.map +1 -0
- package/dist/lib/room-floor-choices.js +60 -0
- package/dist/lib/room-floor-feasibility.d.ts +25 -0
- package/dist/lib/room-floor-feasibility.d.ts.map +1 -0
- package/dist/lib/room-floor-feasibility.js +293 -0
- package/dist/lib/room-floor-plate.d.ts +3 -0
- package/dist/lib/room-floor-plate.d.ts.map +1 -0
- package/dist/lib/room-floor-plate.js +4 -0
- package/dist/lib/room-graph.d.ts +79 -0
- package/dist/lib/room-graph.d.ts.map +1 -0
- package/dist/lib/room-graph.js +1265 -0
- package/dist/lib/room-name.d.ts +10 -0
- package/dist/lib/room-name.d.ts.map +1 -0
- package/dist/lib/room-name.js +22 -0
- package/dist/lib/room-topology-index.d.ts +53 -5
- package/dist/lib/room-topology-index.d.ts.map +1 -1
- package/dist/lib/room-topology-index.js +176 -30
- package/dist/lib/room-vertical-placement.d.ts +12 -0
- package/dist/lib/room-vertical-placement.d.ts.map +1 -0
- package/dist/lib/room-vertical-placement.js +28 -0
- package/dist/lib/room-zone-adoption.d.ts +74 -0
- package/dist/lib/room-zone-adoption.d.ts.map +1 -0
- package/dist/lib/room-zone-adoption.js +150 -0
- package/dist/lib/setback-envelope.d.ts +73 -0
- package/dist/lib/setback-envelope.d.ts.map +1 -0
- package/dist/lib/setback-envelope.js +506 -0
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +33 -12
- package/dist/lib/slots.d.ts +20 -0
- package/dist/lib/slots.d.ts.map +1 -1
- package/dist/lib/slots.js +44 -0
- package/dist/lib/space-detection.d.ts +14 -94
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +244 -1616
- package/dist/lib/structure-commit.d.ts +38 -0
- package/dist/lib/structure-commit.d.ts.map +1 -0
- package/dist/lib/structure-commit.js +52 -0
- package/dist/lib/structure-kernel.d.ts +66 -0
- package/dist/lib/structure-kernel.d.ts.map +1 -0
- package/dist/lib/structure-kernel.js +735 -0
- package/dist/lib/structure-reconcile.d.ts +15 -0
- package/dist/lib/structure-reconcile.d.ts.map +1 -0
- package/dist/lib/structure-reconcile.js +218 -0
- package/dist/lib/terrain-contours.d.ts +29 -0
- package/dist/lib/terrain-contours.d.ts.map +1 -0
- package/dist/lib/terrain-contours.js +199 -0
- package/dist/lib/terrain-source-persisted.d.ts +42 -0
- package/dist/lib/terrain-source-persisted.d.ts.map +1 -0
- package/dist/lib/terrain-source-persisted.js +68 -0
- package/dist/lib/terrain-source.d.ts +2 -40
- package/dist/lib/terrain-source.d.ts.map +1 -1
- package/dist/lib/terrain-source.js +2 -68
- package/dist/lib/terrain-support-query.d.ts +83 -0
- package/dist/lib/terrain-support-query.d.ts.map +1 -0
- package/dist/lib/terrain-support-query.js +187 -0
- package/dist/lib/terrain-support.d.ts +1 -77
- package/dist/lib/terrain-support.d.ts.map +1 -1
- package/dist/lib/terrain-support.js +3 -181
- package/dist/lib/unit-containment.js +2 -2
- package/dist/lib/unit-report.d.ts.map +1 -1
- package/dist/lib/unit-report.js +5 -4
- package/dist/lib/zone-colors.d.ts +11 -0
- package/dist/lib/zone-colors.d.ts.map +1 -0
- package/dist/lib/zone-colors.js +32 -0
- package/dist/lib/zone-quantities.d.ts.map +1 -1
- package/dist/lib/zone-quantities.js +113 -223
- package/dist/material-library.d.ts +9 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +550 -1
- package/dist/node-slots/block.d.ts +7 -0
- package/dist/node-slots/block.d.ts.map +1 -0
- package/dist/node-slots/block.js +27 -0
- package/dist/node-slots/cabinet.d.ts +4 -0
- package/dist/node-slots/cabinet.d.ts.map +1 -0
- package/dist/node-slots/cabinet.js +24 -0
- package/dist/node-slots/ceiling.d.ts +6 -0
- package/dist/node-slots/ceiling.d.ts.map +1 -0
- package/dist/node-slots/ceiling.js +7 -0
- package/dist/node-slots/column.d.ts +9 -0
- package/dist/node-slots/column.d.ts.map +1 -0
- package/dist/node-slots/column.js +24 -0
- package/dist/node-slots/door.d.ts +9 -0
- package/dist/node-slots/door.d.ts.map +1 -0
- package/dist/node-slots/door.js +20 -0
- package/dist/node-slots/duct.d.ts +5 -0
- package/dist/node-slots/duct.d.ts.map +1 -0
- package/dist/node-slots/duct.js +5 -0
- package/dist/node-slots/elevator.d.ts +9 -0
- package/dist/node-slots/elevator.d.ts.map +1 -0
- package/dist/node-slots/elevator.js +17 -0
- package/dist/node-slots/fence.d.ts +10 -0
- package/dist/node-slots/fence.d.ts.map +1 -0
- package/dist/node-slots/fence.js +23 -0
- package/dist/node-slots/index.d.ts +25 -0
- package/dist/node-slots/index.d.ts.map +1 -0
- package/dist/node-slots/index.js +92 -0
- package/dist/node-slots/lean-to-extension.d.ts +5 -0
- package/dist/node-slots/lean-to-extension.d.ts.map +1 -0
- package/dist/node-slots/lean-to-extension.js +15 -0
- package/dist/node-slots/procedural-item.d.ts +4 -0
- package/dist/node-slots/procedural-item.d.ts.map +1 -0
- package/dist/node-slots/procedural-item.js +3 -0
- package/dist/node-slots/roof-accessories.d.ts +9 -0
- package/dist/node-slots/roof-accessories.d.ts.map +1 -0
- package/dist/node-slots/roof-accessories.js +34 -0
- package/dist/node-slots/shelf.d.ts +9 -0
- package/dist/node-slots/shelf.d.ts.map +1 -0
- package/dist/node-slots/shelf.js +30 -0
- package/dist/node-slots/slab.d.ts +7 -0
- package/dist/node-slots/slab.d.ts.map +1 -0
- package/dist/node-slots/slab.js +21 -0
- package/dist/node-slots/stair.d.ts +8 -0
- package/dist/node-slots/stair.d.ts.map +1 -0
- package/dist/node-slots/stair.js +17 -0
- package/dist/node-slots/wall.d.ts +12 -0
- package/dist/node-slots/wall.d.ts.map +1 -0
- package/dist/node-slots/wall.js +55 -0
- package/dist/node-slots/window.d.ts +5 -0
- package/dist/node-slots/window.d.ts.map +1 -0
- package/dist/node-slots/window.js +11 -0
- package/dist/procedural-items/design-placement.d.ts +49 -0
- package/dist/procedural-items/design-placement.d.ts.map +1 -0
- package/dist/procedural-items/design-placement.js +129 -0
- package/dist/procedural-items/design.d.ts +261 -0
- package/dist/procedural-items/design.d.ts.map +1 -0
- package/dist/procedural-items/design.js +707 -0
- package/dist/procedural-items/fixtures.d.ts +464 -24
- package/dist/procedural-items/fixtures.d.ts.map +1 -1
- package/dist/procedural-items/index.d.ts +5 -0
- package/dist/procedural-items/index.d.ts.map +1 -1
- package/dist/procedural-items/index.js +5 -0
- package/dist/procedural-items/integration.d.ts +127 -6
- package/dist/procedural-items/integration.d.ts.map +1 -1
- package/dist/procedural-items/joints.d.ts +56 -0
- package/dist/procedural-items/joints.d.ts.map +1 -0
- package/dist/procedural-items/joints.js +251 -0
- package/dist/procedural-items/library-colors.d.ts +12 -0
- package/dist/procedural-items/library-colors.d.ts.map +1 -1
- package/dist/procedural-items/library-colors.js +37 -3
- package/dist/procedural-items/motion-controller.d.ts +29 -0
- package/dist/procedural-items/motion-controller.d.ts.map +1 -0
- package/dist/procedural-items/motion-controller.js +130 -0
- package/dist/procedural-items/node.d.ts +490 -24
- package/dist/procedural-items/node.d.ts.map +1 -1
- package/dist/procedural-items/query.d.ts +19 -1
- package/dist/procedural-items/query.d.ts.map +1 -1
- package/dist/procedural-items/query.js +131 -48
- package/dist/procedural-items/recipe.d.ts +258 -14
- package/dist/procedural-items/recipe.d.ts.map +1 -1
- package/dist/procedural-items/recipe.js +933 -61
- package/dist/procedural-items/section.d.ts +27 -0
- package/dist/procedural-items/section.d.ts.map +1 -0
- package/dist/procedural-items/section.js +237 -0
- package/dist/procedural-items/spatial.d.ts +21 -0
- package/dist/procedural-items/spatial.d.ts.map +1 -1
- package/dist/procedural-items/spatial.js +90 -0
- package/dist/registry/handles.d.ts +30 -1
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +7 -5
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +4 -2
- package/dist/registry/mechanism.d.ts +9 -0
- package/dist/registry/mechanism.d.ts.map +1 -0
- package/dist/registry/mechanism.js +21 -0
- package/dist/registry/registry.d.ts +6 -3
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +59 -22
- package/dist/registry/scene-api.d.ts +20 -0
- package/dist/registry/scene-api.d.ts.map +1 -1
- package/dist/registry/scene-api.js +26 -13
- package/dist/registry/subtree.d.ts +8 -0
- package/dist/registry/subtree.d.ts.map +1 -1
- package/dist/registry/subtree.js +59 -0
- package/dist/registry/types.d.ts +352 -13
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
- package/dist/schema/__fixtures__/node-fixtures.js +2 -0
- package/dist/schema/assembly.d.ts +153 -0
- package/dist/schema/assembly.d.ts.map +1 -0
- package/dist/schema/assembly.js +155 -0
- package/dist/schema/asset-url.d.ts +2 -1
- package/dist/schema/asset-url.d.ts.map +1 -1
- package/dist/schema/asset-url.js +5 -2
- package/dist/schema/base.d.ts +26 -0
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +2 -0
- package/dist/schema/collection-templates.d.ts +46 -0
- package/dist/schema/collection-templates.d.ts.map +1 -0
- package/dist/schema/collection-templates.js +14 -0
- package/dist/schema/collections.d.ts +7 -0
- package/dist/schema/collections.d.ts.map +1 -1
- package/dist/schema/cut.d.ts +29 -0
- package/dist/schema/cut.d.ts.map +1 -0
- package/dist/schema/cut.js +50 -0
- package/dist/schema/geometry-metadata.d.ts +51 -0
- package/dist/schema/geometry-metadata.d.ts.map +1 -0
- package/dist/schema/geometry-metadata.js +57 -0
- package/dist/schema/geometry-source.d.ts +250 -0
- package/dist/schema/geometry-source.d.ts.map +1 -0
- package/dist/schema/geometry-source.js +130 -0
- package/dist/schema/index.d.ts +20 -7
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +22 -5
- package/dist/schema/nodes/block.d.ts +28 -2
- package/dist/schema/nodes/block.d.ts.map +1 -1
- package/dist/schema/nodes/block.js +22 -9
- package/dist/schema/nodes/box-vent.d.ts +26 -0
- package/dist/schema/nodes/box-vent.d.ts.map +1 -1
- package/dist/schema/nodes/building.d.ts +26 -0
- package/dist/schema/nodes/building.d.ts.map +1 -1
- package/dist/schema/nodes/cabinet.d.ts +61 -9
- package/dist/schema/nodes/cabinet.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.d.ts +37 -0
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +8 -0
- package/dist/schema/nodes/chimney.d.ts +26 -0
- package/dist/schema/nodes/chimney.d.ts.map +1 -1
- package/dist/schema/nodes/column.d.ts +126 -0
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +2 -0
- package/dist/schema/nodes/construction-dimension.d.ts +26 -0
- package/dist/schema/nodes/construction-dimension.d.ts.map +1 -1
- package/dist/schema/nodes/cupola.d.ts +26 -0
- package/dist/schema/nodes/cupola.d.ts.map +1 -1
- package/dist/schema/nodes/curtain-wall.d.ts +129 -0
- package/dist/schema/nodes/curtain-wall.d.ts.map +1 -0
- package/dist/schema/nodes/curtain-wall.js +49 -0
- package/dist/schema/nodes/door.d.ts +141 -22
- package/dist/schema/nodes/door.d.ts.map +1 -1
- package/dist/schema/nodes/door.js +18 -33
- package/dist/schema/nodes/dormer.d.ts +28 -2
- package/dist/schema/nodes/dormer.d.ts.map +1 -1
- package/dist/schema/nodes/downspout.d.ts +27 -1
- package/dist/schema/nodes/downspout.d.ts.map +1 -1
- package/dist/schema/nodes/duct-fitting.d.ts +27 -1
- package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/duct-segment.d.ts +27 -1
- package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
- package/dist/schema/nodes/duct-terminal.d.ts +26 -0
- package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
- package/dist/schema/nodes/elevator.d.ts +26 -0
- package/dist/schema/nodes/elevator.d.ts.map +1 -1
- package/dist/schema/nodes/eyebrow-vent.d.ts +26 -0
- package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
- package/dist/schema/nodes/fence-feature.d.ts +141 -0
- package/dist/schema/nodes/fence-feature.d.ts.map +1 -0
- package/dist/schema/nodes/fence-feature.js +21 -0
- package/dist/schema/nodes/fence.d.ts +186 -0
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +92 -7
- package/dist/schema/nodes/floor-opening.d.ts +61 -0
- package/dist/schema/nodes/floor-opening.d.ts.map +1 -0
- package/dist/schema/nodes/floor-opening.js +17 -0
- package/dist/schema/nodes/guide.d.ts +26 -0
- package/dist/schema/nodes/guide.d.ts.map +1 -1
- package/dist/schema/nodes/gutter.d.ts +26 -0
- package/dist/schema/nodes/gutter.d.ts.map +1 -1
- package/dist/schema/nodes/hvac-equipment.d.ts +26 -0
- package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
- package/dist/schema/nodes/imported-mesh.d.ts +26 -0
- package/dist/schema/nodes/imported-mesh.d.ts.map +1 -1
- package/dist/schema/nodes/item.d.ts +153 -2
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +13 -0
- package/dist/schema/nodes/lean-to-extension.d.ts +26 -0
- package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -1
- package/dist/schema/nodes/level.d.ts +27 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/lineset.d.ts +26 -0
- package/dist/schema/nodes/lineset.d.ts.map +1 -1
- package/dist/schema/nodes/liquid-line.d.ts +26 -0
- package/dist/schema/nodes/liquid-line.d.ts.map +1 -1
- package/dist/schema/nodes/measurement.d.ts +26 -0
- package/dist/schema/nodes/measurement.d.ts.map +1 -1
- package/dist/schema/nodes/opening-types.d.ts +41 -0
- package/dist/schema/nodes/opening-types.d.ts.map +1 -0
- package/dist/schema/nodes/opening-types.js +48 -0
- package/dist/schema/nodes/pipe-fitting.d.ts +26 -0
- package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-segment.d.ts +26 -0
- package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-trap.d.ts +26 -0
- package/dist/schema/nodes/pipe-trap.d.ts.map +1 -1
- package/dist/schema/nodes/ridge-vent.d.ts +26 -0
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.js +2 -1
- package/dist/schema/nodes/roof-segment.d.ts +30 -2
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +9 -0
- package/dist/schema/nodes/roof.d.ts +101 -0
- package/dist/schema/nodes/roof.d.ts.map +1 -1
- package/dist/schema/nodes/roof.js +6 -0
- package/dist/schema/nodes/scan.d.ts +26 -0
- package/dist/schema/nodes/scan.d.ts.map +1 -1
- package/dist/schema/nodes/separator.d.ts +50 -0
- package/dist/schema/nodes/separator.d.ts.map +1 -0
- package/dist/schema/nodes/separator.js +8 -0
- package/dist/schema/nodes/shelf.d.ts +26 -0
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/site.d.ts +192 -0
- package/dist/schema/nodes/site.d.ts.map +1 -1
- package/dist/schema/nodes/site.js +178 -1
- package/dist/schema/nodes/skylight.d.ts +30 -4
- package/dist/schema/nodes/skylight.d.ts.map +1 -1
- package/dist/schema/nodes/slab.d.ts +84 -0
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +37 -2
- package/dist/schema/nodes/solar-panel.d.ts +26 -0
- package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
- package/dist/schema/nodes/spawn.d.ts +26 -0
- package/dist/schema/nodes/spawn.d.ts.map +1 -1
- package/dist/schema/nodes/stair-construction.d.ts +21 -0
- package/dist/schema/nodes/stair-construction.d.ts.map +1 -0
- package/dist/schema/nodes/stair-construction.js +13 -0
- package/dist/schema/nodes/stair-design-targets.d.ts +9 -0
- package/dist/schema/nodes/stair-design-targets.d.ts.map +1 -0
- package/dist/schema/nodes/stair-design-targets.js +7 -0
- package/dist/schema/nodes/stair-segment.d.ts +72 -4
- package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
- package/dist/schema/nodes/stair-segment.js +13 -0
- package/dist/schema/nodes/stair.d.ts +119 -2
- package/dist/schema/nodes/stair.d.ts.map +1 -1
- package/dist/schema/nodes/stair.js +59 -2
- package/dist/schema/nodes/structural-grid.d.ts +26 -0
- package/dist/schema/nodes/structural-grid.d.ts.map +1 -1
- package/dist/schema/nodes/surface-hole-metadata.d.ts +3 -0
- package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
- package/dist/schema/nodes/surface-hole-metadata.js +2 -1
- package/dist/schema/nodes/surface-paint-region.d.ts +14 -0
- package/dist/schema/nodes/surface-paint-region.d.ts.map +1 -0
- package/dist/schema/nodes/surface-paint-region.js +12 -0
- package/dist/schema/nodes/turbine-vent.d.ts +26 -0
- package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
- package/dist/schema/nodes/unit.d.ts +26 -0
- package/dist/schema/nodes/unit.d.ts.map +1 -1
- package/dist/schema/nodes/wall.d.ts +423 -59
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +188 -186
- package/dist/schema/nodes/window.d.ts +139 -20
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +12 -14
- package/dist/schema/nodes/zone.d.ts +69 -1
- package/dist/schema/nodes/zone.d.ts.map +1 -1
- package/dist/schema/nodes/zone.js +46 -0
- package/dist/schema/provenance.d.ts +118 -0
- package/dist/schema/provenance.d.ts.map +1 -0
- package/dist/schema/provenance.js +76 -0
- package/dist/schema/source-ref.d.ts +23 -0
- package/dist/schema/source-ref.d.ts.map +1 -0
- package/dist/schema/source-ref.js +29 -0
- package/dist/schema/types.d.ts +3389 -67
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +7 -0
- package/dist/services/__fixtures__/hosting.d.ts +3 -0
- package/dist/services/__fixtures__/hosting.d.ts.map +1 -0
- package/dist/services/__fixtures__/hosting.js +9 -0
- package/dist/services/__fixtures__/shelf-surface-rows.d.ts +4 -0
- package/dist/services/__fixtures__/shelf-surface-rows.d.ts.map +1 -0
- package/dist/services/__fixtures__/shelf-surface-rows.js +18 -0
- package/dist/services/alignment-anchors.d.ts +2 -1
- package/dist/services/alignment-anchors.d.ts.map +1 -1
- package/dist/services/alignment-anchors.js +9 -6
- package/dist/services/hosting.d.ts +3 -0
- package/dist/services/hosting.d.ts.map +1 -1
- package/dist/services/hosting.js +24 -7
- package/dist/services/index.d.ts +4 -4
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +4 -4
- package/dist/services/level-height.d.ts.map +1 -1
- package/dist/services/level-height.js +6 -4
- package/dist/services/snap.d.ts +3 -0
- package/dist/services/snap.d.ts.map +1 -1
- package/dist/services/snap.js +11 -0
- package/dist/services/storey.d.ts +21 -1
- package/dist/services/storey.d.ts.map +1 -1
- package/dist/services/storey.js +94 -8
- package/dist/services/surface-hosting.d.ts +6 -2
- package/dist/services/surface-hosting.d.ts.map +1 -1
- package/dist/services/surface-hosting.js +51 -11
- package/dist/store/actions/node-actions.d.ts +4563 -8
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +497 -269
- package/dist/store/derived-node-guard.d.ts +84 -0
- package/dist/store/derived-node-guard.d.ts.map +1 -0
- package/dist/store/derived-node-guard.js +586 -0
- package/dist/store/history-control.d.ts +34 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +99 -1
- package/dist/store/history-drafts.d.ts +48 -0
- package/dist/store/history-drafts.d.ts.map +1 -0
- package/dist/store/history-drafts.js +403 -0
- package/dist/store/history-invalidation.d.ts.map +1 -1
- package/dist/store/history-invalidation.js +1 -0
- package/dist/store/item-interaction.d.ts +28 -0
- package/dist/store/item-interaction.d.ts.map +1 -0
- package/dist/store/item-interaction.js +34 -0
- package/dist/store/registered-node-defaults.d.ts +11 -0
- package/dist/store/registered-node-defaults.d.ts.map +1 -0
- package/dist/store/registered-node-defaults.js +25 -0
- package/dist/store/scene-annotations.d.ts +8969 -0
- package/dist/store/scene-annotations.d.ts.map +1 -0
- package/dist/store/scene-annotations.js +107 -0
- package/dist/store/use-interactive.d.ts +23 -1
- package/dist/store/use-interactive.d.ts.map +1 -1
- package/dist/store/use-interactive.js +128 -5
- package/dist/store/use-scene.d.ts +68 -12
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +429 -306
- package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-sync.js +4 -6
- package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-system.js +12 -6
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +8 -3
- package/dist/systems/fence/fence-centerline.d.ts.map +1 -1
- package/dist/systems/fence/fence-centerline.js +6 -5
- package/dist/systems/fence/fence-features.d.ts +36 -0
- package/dist/systems/fence/fence-features.d.ts.map +1 -0
- package/dist/systems/fence/fence-features.js +105 -0
- package/dist/systems/fence/fence-spline.d.ts +8 -5
- package/dist/systems/fence/fence-spline.d.ts.map +1 -1
- package/dist/systems/fence/fence-spline.js +51 -16
- package/dist/systems/owned-floor-openings.d.ts +9 -0
- package/dist/systems/owned-floor-openings.d.ts.map +1 -0
- package/dist/systems/owned-floor-openings.js +326 -0
- package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -0
- package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -0
- package/dist/systems/reconcile-owned-floor-openings.js +25 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.d.ts +8 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/doorway-steps.js +62 -0
- package/dist/systems/slab/__fixtures__/floor-step.d.ts +5636 -0
- package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/floor-step.js +66 -0
- package/dist/systems/slab/__fixtures__/raised-room.d.ts +5775 -0
- package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -0
- package/dist/systems/slab/__fixtures__/raised-room.js +54 -0
- package/dist/systems/slab/ensure-slab-openings.d.ts +9 -0
- package/dist/systems/slab/ensure-slab-openings.d.ts.map +1 -0
- package/dist/systems/slab/ensure-slab-openings.js +41 -0
- package/dist/systems/slab/slab-support.d.ts +25 -6
- package/dist/systems/slab/slab-support.d.ts.map +1 -1
- package/dist/systems/slab/slab-support.js +471 -54
- package/dist/systems/stair/stair-base-elevation.d.ts +3 -0
- package/dist/systems/stair/stair-base-elevation.d.ts.map +1 -0
- package/dist/systems/stair/stair-base-elevation.js +49 -0
- package/dist/systems/stair/stair-clearance.d.ts +39 -0
- package/dist/systems/stair/stair-clearance.d.ts.map +1 -0
- package/dist/systems/stair/stair-clearance.js +508 -0
- package/dist/systems/stair/stair-construction.d.ts +37 -0
- package/dist/systems/stair/stair-construction.d.ts.map +1 -0
- package/dist/systems/stair/stair-construction.js +314 -0
- package/dist/systems/stair/stair-detail-budget.d.ts +13 -0
- package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -0
- package/dist/systems/stair/stair-detail-budget.js +64 -0
- package/dist/systems/stair/stair-flight.d.ts +2 -2
- package/dist/systems/stair/stair-flight.d.ts.map +1 -1
- package/dist/systems/stair/stair-flight.js +4 -3
- package/dist/systems/stair/stair-floor-footprints.d.ts +7 -0
- package/dist/systems/stair/stair-floor-footprints.d.ts.map +1 -0
- package/dist/systems/stair/stair-floor-footprints.js +113 -0
- package/dist/systems/stair/stair-footprint.d.ts +3 -1
- package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
- package/dist/systems/stair/stair-footprint.js +97 -44
- package/dist/systems/stair/stair-layout.d.ts +39 -0
- package/dist/systems/stair/stair-layout.d.ts.map +1 -0
- package/dist/systems/stair/stair-layout.js +58 -0
- package/dist/systems/stair/stair-opening-preview.d.ts +1650 -84
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.d.ts +8 -2
- package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.js +136 -315
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +40 -8
- package/dist/systems/stair/stair-presets.d.ts +276 -0
- package/dist/systems/stair/stair-presets.d.ts.map +1 -0
- package/dist/systems/stair/stair-presets.js +151 -0
- package/dist/systems/stair/stair-rail-budget.d.ts +6 -0
- package/dist/systems/stair/stair-rail-budget.d.ts.map +1 -0
- package/dist/systems/stair/stair-rail-budget.js +36 -0
- package/dist/systems/stair/stair-rail-path.d.ts +22 -0
- package/dist/systems/stair/stair-rail-path.d.ts.map +1 -0
- package/dist/systems/stair/stair-rail-path.js +497 -0
- package/dist/systems/stair/stair-rise-edit.d.ts +9 -0
- package/dist/systems/stair/stair-rise-edit.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise-edit.js +46 -0
- package/dist/systems/stair/stair-rise-query.d.ts +24 -0
- package/dist/systems/stair/stair-rise-query.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise-query.js +125 -0
- package/dist/systems/stair/stair-rise.d.ts +4 -19
- package/dist/systems/stair/stair-rise.d.ts.map +1 -1
- package/dist/systems/stair/stair-rise.js +8 -71
- package/dist/systems/stair/stair-sizing.d.ts +414 -0
- package/dist/systems/stair/stair-sizing.d.ts.map +1 -0
- package/dist/systems/stair/stair-sizing.js +255 -0
- package/dist/systems/stair/stair-sweep-edit.d.ts +7 -0
- package/dist/systems/stair/stair-sweep-edit.d.ts.map +1 -0
- package/dist/systems/stair/stair-sweep-edit.js +8 -0
- package/dist/systems/stair/stair-walking-line.d.ts +5 -0
- package/dist/systems/stair/stair-walking-line.d.ts.map +1 -0
- package/dist/systems/stair/stair-walking-line.js +91 -0
- package/dist/systems/stair/stair-winder.d.ts +36 -0
- package/dist/systems/stair/stair-winder.d.ts.map +1 -0
- package/dist/systems/stair/stair-winder.js +173 -0
- package/dist/systems/wall/wall-assembly.d.ts +234 -0
- package/dist/systems/wall/wall-assembly.d.ts.map +1 -0
- package/dist/systems/wall/wall-assembly.js +854 -0
- package/dist/systems/wall/wall-curve.d.ts +2 -1
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +21 -5
- package/dist/systems/wall/wall-finish.d.ts +102 -0
- package/dist/systems/wall/wall-finish.d.ts.map +1 -0
- package/dist/systems/wall/wall-finish.js +264 -0
- package/dist/systems/wall/wall-footprint.d.ts +3 -0
- package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
- package/dist/systems/wall/wall-footprint.js +15 -13
- package/dist/systems/wall/wall-frame.d.ts +45 -0
- package/dist/systems/wall/wall-frame.d.ts.map +1 -0
- package/dist/systems/wall/wall-frame.js +162 -0
- package/dist/systems/wall/wall-layer-bands.d.ts +38 -0
- package/dist/systems/wall/wall-layer-bands.d.ts.map +1 -0
- package/dist/systems/wall/wall-layer-bands.js +109 -0
- package/dist/systems/wall/wall-merge.d.ts +57 -0
- package/dist/systems/wall/wall-merge.d.ts.map +1 -0
- package/dist/systems/wall/wall-merge.js +411 -0
- package/dist/systems/wall/wall-mitering.d.ts +6 -5
- package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
- package/dist/systems/wall/wall-mitering.js +70 -20
- package/dist/systems/wall/wall-operations.d.ts +28 -0
- package/dist/systems/wall/wall-operations.d.ts.map +1 -0
- package/dist/systems/wall/wall-operations.js +146 -0
- package/dist/systems/wall/wall-paint-plan.d.ts +30 -0
- package/dist/systems/wall/wall-paint-plan.d.ts.map +1 -0
- package/dist/systems/wall/wall-paint-plan.js +167 -0
- package/dist/systems/wall/wall-room-sides.d.ts +6 -0
- package/dist/systems/wall/wall-room-sides.d.ts.map +1 -0
- package/dist/systems/wall/wall-room-sides.js +14 -0
- package/dist/systems/wall/wall-step-openings.d.ts +17 -0
- package/dist/systems/wall/wall-step-openings.d.ts.map +1 -0
- package/dist/systems/wall/wall-step-openings.js +32 -0
- package/dist/systems/wall/wall-top.d.ts +2 -6
- package/dist/systems/wall/wall-top.d.ts.map +1 -1
- package/dist/systems/wall/wall-top.js +3 -9
- package/dist/systems/wall/wall-topology.d.ts +28 -0
- package/dist/systems/wall/wall-topology.d.ts.map +1 -1
- package/dist/systems/wall/wall-topology.js +458 -9
- package/dist/utils/clone-scene-graph.d.ts +6 -0
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +123 -15
- package/dist/utils/ensure-scene-openings.d.ts +8965 -0
- package/dist/utils/ensure-scene-openings.d.ts.map +1 -0
- package/dist/utils/ensure-scene-openings.js +29 -0
- package/dist/utils/exterior-threshold-migration.d.ts +4 -0
- package/dist/utils/exterior-threshold-migration.d.ts.map +1 -0
- package/dist/utils/exterior-threshold-migration.js +114 -0
- package/dist/utils/floor-follow-migration.d.ts +3 -0
- package/dist/utils/floor-follow-migration.d.ts.map +1 -0
- package/dist/utils/floor-follow-migration.js +29 -0
- package/dist/utils/floor-opening-migration.d.ts +13 -0
- package/dist/utils/floor-opening-migration.d.ts.map +1 -0
- package/dist/utils/floor-opening-migration.js +148 -0
- package/dist/utils/floor-piece-adoption.d.ts +50 -0
- package/dist/utils/floor-piece-adoption.d.ts.map +1 -0
- package/dist/utils/floor-piece-adoption.js +182 -0
- package/dist/utils/floor-plate-migration.d.ts +4507 -0
- package/dist/utils/floor-plate-migration.d.ts.map +1 -0
- package/dist/utils/floor-plate-migration.js +1360 -0
- package/dist/utils/heal-plan-coordinates.d.ts +2 -0
- package/dist/utils/heal-plan-coordinates.d.ts.map +1 -0
- package/dist/utils/heal-plan-coordinates.js +69 -0
- package/dist/utils/heal-scene-graph.d.ts +20 -6
- package/dist/utils/heal-scene-graph.d.ts.map +1 -1
- package/dist/utils/heal-scene-graph.js +61 -16
- package/dist/utils/legacy-material-slots.d.ts +23 -0
- package/dist/utils/legacy-material-slots.d.ts.map +1 -0
- package/dist/utils/legacy-material-slots.js +120 -0
- package/dist/utils/legacy-opening-datums.d.ts +11 -0
- package/dist/utils/legacy-opening-datums.d.ts.map +1 -0
- package/dist/utils/legacy-opening-datums.js +92 -0
- package/dist/utils/legacy-wall-datums.d.ts +6 -0
- package/dist/utils/legacy-wall-datums.d.ts.map +1 -0
- package/dist/utils/legacy-wall-datums.js +199 -0
- package/dist/utils/load-migration.d.ts +28 -0
- package/dist/utils/load-migration.d.ts.map +1 -0
- package/dist/utils/load-migration.js +89 -0
- package/dist/utils/node-defaults.d.ts +37 -0
- package/dist/utils/node-defaults.d.ts.map +1 -0
- package/dist/utils/node-defaults.js +96 -0
- package/dist/utils/normalize-legacy-structure.d.ts +2 -0
- package/dist/utils/normalize-legacy-structure.d.ts.map +1 -0
- package/dist/utils/normalize-legacy-structure.js +61 -0
- package/dist/utils/omit-undefined.d.ts +2 -0
- package/dist/utils/omit-undefined.d.ts.map +1 -0
- package/dist/utils/omit-undefined.js +17 -0
- package/dist/utils/owned-floor-opening-migration.d.ts +4489 -0
- package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -0
- package/dist/utils/owned-floor-opening-migration.js +365 -0
- package/dist/utils/reconcile-structure-on-load.d.ts +8965 -0
- package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -0
- package/dist/utils/reconcile-structure-on-load.js +307 -0
- package/dist/utils/room-zone-migration.d.ts +18 -0
- package/dist/utils/room-zone-migration.d.ts.map +1 -0
- package/dist/utils/room-zone-migration.js +258 -0
- package/dist/utils/scene-migrations.d.ts +16 -1
- package/dist/utils/scene-migrations.d.ts.map +1 -1
- package/dist/utils/scene-migrations.js +15 -1
- package/dist/utils/structure-id.d.ts +4 -0
- package/dist/utils/structure-id.d.ts.map +1 -0
- package/dist/utils/structure-id.js +115 -0
- package/dist/utils/vertical-scene-migration.d.ts +8 -8
- package/dist/utils/vertical-scene-migration.d.ts.map +1 -1
- package/dist/utils/vertical-scene-migration.js +18 -8
- package/dist/utils/wall-assembly-migration.d.ts +14 -0
- package/dist/utils/wall-assembly-migration.d.ts.map +1 -0
- package/dist/utils/wall-assembly-migration.js +23 -0
- package/dist/utils/wall-face-migration.d.ts +23 -0
- package/dist/utils/wall-face-migration.d.ts.map +1 -0
- package/dist/utils/wall-face-migration.js +246 -0
- package/dist/validation/opening-bounds.d.ts +36 -0
- package/dist/validation/opening-bounds.d.ts.map +1 -0
- package/dist/validation/opening-bounds.js +34 -0
- package/dist/validation/validate-build-json.d.ts +2 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +48 -1
- package/package.json +37 -4
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +0 -13
- package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +0 -1
- package/dist/services/surface-hosting-procedural-parity.fixtures.js +0 -4691
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +0 -1060
- package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +0 -1
- package/dist/services/surface-hosting-shelf-parity.fixtures.js +0 -3127
package/dist/store/use-scene.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { temporal } from 'zundo';
|
|
3
3
|
import { create } from 'zustand';
|
|
4
|
-
import {
|
|
4
|
+
import { toSceneMaterialRef } from '../material-library.js';
|
|
5
5
|
import { getNodePluginId, isNodeKindEnabled, nodeRegistry } from '../registry/registry.js';
|
|
6
6
|
import { BuildingNode } from '../schema/index.js';
|
|
7
7
|
import { generateCollectionId } from '../schema/collections.js';
|
|
@@ -16,19 +16,28 @@ import { ShelfNode as ShelfNodeSchema } from '../schema/nodes/shelf.js';
|
|
|
16
16
|
import { SiteNode } from '../schema/nodes/site.js';
|
|
17
17
|
import { getEffectiveStairSurfaceMaterial, StairNode as StairNodeSchema, } from '../schema/nodes/stair.js';
|
|
18
18
|
import { StairSegmentNode as StairSegmentNodeSchema } from '../schema/nodes/stair-segment.js';
|
|
19
|
-
import { getEffectiveWallSurfaceMaterial } from '../schema/nodes/wall.js';
|
|
20
19
|
import { WindowNode as WindowNodeSchema } from '../schema/nodes/window.js';
|
|
21
|
-
import {
|
|
20
|
+
import { SceneMaterial } from '../schema/scene-material.js';
|
|
22
21
|
import { AnyNode as AnyNodeSchema } from '../schema/types.js';
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
22
|
+
import { DEFAULT_LEVEL_HEIGHT } from '../services/level-height.js';
|
|
23
|
+
import { ensureSceneOpenings } from '../utils/ensure-scene-openings.js';
|
|
24
|
+
import { migrateFloorPlates, migrateSlabSlots } from '../utils/floor-plate-migration.js';
|
|
26
25
|
import { healSceneNodes } from '../utils/heal-scene-graph.js';
|
|
26
|
+
import { legacySpecToMaterialRef, migrateSingleMaterialSlots, migrateWallSurfaceMaterials, } from '../utils/legacy-material-slots.js';
|
|
27
|
+
import { materializeNodeDefaults } from '../utils/node-defaults.js';
|
|
28
|
+
import { normalizeLegacyStructure } from '../utils/normalize-legacy-structure.js';
|
|
29
|
+
import { materializeLegacyAutoOpenings } from '../utils/owned-floor-opening-migration.js';
|
|
30
|
+
import { reconcileStructureOnLoad } from '../utils/reconcile-structure-on-load.js';
|
|
27
31
|
import { removeRetiredDrawingSheetNodes } from '../utils/retired-scene-nodes.js';
|
|
32
|
+
import { migrateCeilingRoomLinks, migrateRoomZones } from '../utils/room-zone-migration.js';
|
|
28
33
|
import { migrateVerticalSceneNodes } from '../utils/vertical-scene-migration.js';
|
|
34
|
+
import { migrateLegacyWallAssemblies } from '../utils/wall-assembly-migration.js';
|
|
35
|
+
import { migrateWallFaceBands, migrateWallFaceKeys } from '../utils/wall-face-migration.js';
|
|
29
36
|
import * as nodeActions from './actions/node-actions.js';
|
|
30
|
-
import { areSceneSnapshotsEqual, getSceneHistoryPauseDepth, notifySceneCommit, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runWithSceneCommitNodeIds, } from './history-control.js';
|
|
37
|
+
import { areSceneSnapshotsEqual, beginSceneHistoryPauseSession, getSceneHistoryPauseDepth, isRestoringSceneHistory, notifySceneCommit, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsRemoteSceneChange, runAsSceneHistoryRestore, runWithSceneCommitNodeIds, } from './history-control.js';
|
|
38
|
+
import { beginSceneHistoryDraft as beginSceneHistoryDraftIn, clearSceneHistoryDrafts, createdSceneHistoryDraftIds, hasSceneHistoryDrafts, noteSceneHistoryDraftWrite, sceneHistoryDraftRevertUpdates as sceneHistoryDraftRevertUpdatesIn, settleSceneHistoryDrafts, withAdoptedDraftsAsOriginal, withDraftsRestored, } from './history-drafts.js';
|
|
31
39
|
import { getHistoryDirtyNodeIds } from './history-invalidation.js';
|
|
40
|
+
import { retainSceneAnnotations, withoutSceneAnnotations, withoutSceneNodeAnnotations, writeSceneNodeField, } from './scene-annotations.js';
|
|
32
41
|
import { invalidatePendingHydration, isHydrationNormalization, queueSceneNormalization, runSceneHydration, } from './scene-hydration.js';
|
|
33
42
|
import useLiveNodeOverrides from './use-live-node-overrides.js';
|
|
34
43
|
import useLiveTransforms from './use-live-transforms.js';
|
|
@@ -217,91 +226,6 @@ function migrateElevatorParent(id, node, nodes) {
|
|
|
217
226
|
parentId: buildingId,
|
|
218
227
|
};
|
|
219
228
|
}
|
|
220
|
-
// Reuse an already-minted scene material for an identical inline legacy
|
|
221
|
-
// material so a whole building painted one custom colour collapses to one
|
|
222
|
-
// shared datablock (mirrors `commitSlotPaint`'s dedupe-on-match).
|
|
223
|
-
function findMintedSceneMaterialRef(material, mintedMaterials) {
|
|
224
|
-
const target = JSON.stringify(material);
|
|
225
|
-
for (const sceneMaterial of Object.values(mintedMaterials)) {
|
|
226
|
-
if (JSON.stringify(sceneMaterial.material) === target) {
|
|
227
|
-
return toSceneMaterialRef(sceneMaterial.id);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
// Turn a legacy surface spec (`{ material, materialPreset }`) into a
|
|
233
|
-
// `MaterialRef`: a preset that's already a `library:`/`scene:` ref is used
|
|
234
|
-
// as-is; an inline material mints (or reuses) a scene material. Returns
|
|
235
|
-
// undefined when the spec carries no material. Shared by every legacy→slots
|
|
236
|
-
// migration below.
|
|
237
|
-
function legacySpecToMaterialRef(spec, mintedMaterials) {
|
|
238
|
-
if (typeof spec.materialPreset === 'string' && parseMaterialRef(spec.materialPreset)) {
|
|
239
|
-
return spec.materialPreset;
|
|
240
|
-
}
|
|
241
|
-
if (spec.material !== undefined) {
|
|
242
|
-
const existing = findMintedSceneMaterialRef(spec.material, mintedMaterials);
|
|
243
|
-
if (existing)
|
|
244
|
-
return existing;
|
|
245
|
-
const id = generateSceneMaterialId();
|
|
246
|
-
mintedMaterials[id] = {
|
|
247
|
-
id,
|
|
248
|
-
name: `Material ${Object.keys(mintedMaterials).length + 1}`,
|
|
249
|
-
material: spec.material,
|
|
250
|
-
};
|
|
251
|
-
return toSceneMaterialRef(id);
|
|
252
|
-
}
|
|
253
|
-
return undefined;
|
|
254
|
-
}
|
|
255
|
-
// Move the retired inline `material*` / `interiorMaterial*` / `exteriorMaterial*`
|
|
256
|
-
// fields onto the unified `node.slots` model (interior / exterior → a
|
|
257
|
-
// `library:`/`scene:` ref), minting scene materials for inline customs into
|
|
258
|
-
// `mintedMaterials` (merged into the scene material map by the caller). Already
|
|
259
|
-
// slot-modelled walls and walls with no legacy material are left untouched.
|
|
260
|
-
function migrateWallSurfaceMaterials(node, mintedMaterials) {
|
|
261
|
-
if (node.slots && (node.slots.interior !== undefined || node.slots.exterior !== undefined)) {
|
|
262
|
-
return node;
|
|
263
|
-
}
|
|
264
|
-
const slots = { ...(node.slots ?? {}) };
|
|
265
|
-
for (const side of ['interior', 'exterior']) {
|
|
266
|
-
const spec = getEffectiveWallSurfaceMaterial(node, side);
|
|
267
|
-
const ref = legacySpecToMaterialRef(spec, mintedMaterials);
|
|
268
|
-
if (ref)
|
|
269
|
-
slots[side] = ref;
|
|
270
|
-
}
|
|
271
|
-
if (Object.keys(slots).length === 0) {
|
|
272
|
-
return node;
|
|
273
|
-
}
|
|
274
|
-
return {
|
|
275
|
-
...node,
|
|
276
|
-
slots,
|
|
277
|
-
material: undefined,
|
|
278
|
-
materialPreset: undefined,
|
|
279
|
-
interiorMaterial: undefined,
|
|
280
|
-
interiorMaterialPreset: undefined,
|
|
281
|
-
exteriorMaterial: undefined,
|
|
282
|
-
exteriorMaterialPreset: undefined,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
// Move a kind's single legacy `material` / `materialPreset` onto its declared
|
|
286
|
-
// slots. A pre-slot-model node painted one material rendered that material on
|
|
287
|
-
// every part (each slot resolves `node.slots[slot]` → legacy → default), so the
|
|
288
|
-
// migration writes the same ref to every slot id the kind can expose — unused
|
|
289
|
-
// conditional slots are harmless. Already slot-modelled or unpainted nodes are
|
|
290
|
-
// left untouched. Mirrors `migrateWallSurfaceMaterials` for single-surface and
|
|
291
|
-
// whole-object kinds (slab, ceiling, fence, column, shelf).
|
|
292
|
-
function migrateSingleMaterialSlots(node, slotIds, mintedMaterials) {
|
|
293
|
-
if (node.slots && Object.keys(node.slots).length > 0) {
|
|
294
|
-
return node;
|
|
295
|
-
}
|
|
296
|
-
const ref = legacySpecToMaterialRef({ material: node.material, materialPreset: node.materialPreset }, mintedMaterials);
|
|
297
|
-
if (!ref) {
|
|
298
|
-
return node;
|
|
299
|
-
}
|
|
300
|
-
const slots = {};
|
|
301
|
-
for (const slotId of slotIds)
|
|
302
|
-
slots[slotId] = ref;
|
|
303
|
-
return { ...node, slots, material: undefined, materialPreset: undefined };
|
|
304
|
-
}
|
|
305
229
|
function migrateRoleMaterialSlots(node, roles, mintedMaterials) {
|
|
306
230
|
const slots = { ...(node.slots ?? {}) };
|
|
307
231
|
const next = { ...node };
|
|
@@ -509,22 +433,6 @@ function migrateConstructionDimension(node) {
|
|
|
509
433
|
}),
|
|
510
434
|
};
|
|
511
435
|
}
|
|
512
|
-
function migrateWallAssembly(node) {
|
|
513
|
-
if (!Object.hasOwn(node, 'assemblyLayers'))
|
|
514
|
-
return node;
|
|
515
|
-
const assemblyThickness = Array.isArray(node.assemblyLayers)
|
|
516
|
-
? node.assemblyLayers.reduce((total, layer) => {
|
|
517
|
-
if (!(layer && typeof layer === 'object'))
|
|
518
|
-
return total;
|
|
519
|
-
const thickness = layer.thickness;
|
|
520
|
-
return typeof thickness === 'number' && Number.isFinite(thickness) && thickness > 0
|
|
521
|
-
? total + thickness
|
|
522
|
-
: total;
|
|
523
|
-
}, 0)
|
|
524
|
-
: 0;
|
|
525
|
-
const { assemblyLayers: _assemblyLayers, ...wall } = node;
|
|
526
|
-
return assemblyThickness > 0 ? { ...wall, thickness: assemblyThickness } : wall;
|
|
527
|
-
}
|
|
528
436
|
function migrateBlockRename(id, node, nodes) {
|
|
529
437
|
if (node.type !== 'custom-mesh')
|
|
530
438
|
return [id, node];
|
|
@@ -561,7 +469,7 @@ function migrateBlockHostedItem(node) {
|
|
|
561
469
|
function migrateNodes(nodes) {
|
|
562
470
|
// Repair pre-existing corruption (null children, zero-length walls) before
|
|
563
471
|
// any per-type migration runs, so already-saved scenes load cleanly.
|
|
564
|
-
const { nodes: healed } = healSceneNodes(nodes);
|
|
472
|
+
const { nodes: healed } = healSceneNodes(normalizeLegacyStructure(nodes));
|
|
565
473
|
const { nodes: patchedNodes } = removeRetiredDrawingSheetNodes(healed);
|
|
566
474
|
// Scene materials minted while moving legacy wall fields onto `node.slots`;
|
|
567
475
|
// merged into the scene material map by the caller (`setScene`).
|
|
@@ -706,7 +614,7 @@ function migrateNodes(nodes) {
|
|
|
706
614
|
}
|
|
707
615
|
}
|
|
708
616
|
if (node.type === 'wall') {
|
|
709
|
-
patchedNodes[id] = migrateWallSurfaceMaterials(
|
|
617
|
+
patchedNodes[id] = migrateWallSurfaceMaterials(patchedNodes[id], mintedMaterials);
|
|
710
618
|
}
|
|
711
619
|
// Cabinet v2→v3: node-level `doorStyle` was dead (geometry reads only the
|
|
712
620
|
// per-compartment `doorType`) and was removed from both cabinet schemas;
|
|
@@ -822,30 +730,6 @@ function migrateNodes(nodes) {
|
|
|
822
730
|
if (node.type === 'roof') {
|
|
823
731
|
patchedNodes[id] = migrateRoofSurfaceMaterials(patchedNodes[id]);
|
|
824
732
|
}
|
|
825
|
-
// Legacy: site.children used to hold nested BuildingNode / ItemNode
|
|
826
|
-
// objects (see the SiteNode schema before the children-as-ids fix).
|
|
827
|
-
// Flatten any leftover nested children into ids, and absorb the
|
|
828
|
-
// embedded nodes into the flat map so the rest of the loader can
|
|
829
|
-
// treat the site like every other parent.
|
|
830
|
-
if (node.type === 'site' && Array.isArray(node.children)) {
|
|
831
|
-
let needsFlatten = false;
|
|
832
|
-
const flattened = [];
|
|
833
|
-
for (const child of node.children) {
|
|
834
|
-
if (typeof child === 'string') {
|
|
835
|
-
flattened.push(child);
|
|
836
|
-
}
|
|
837
|
-
else if (child && typeof child === 'object' && typeof child.id === 'string') {
|
|
838
|
-
needsFlatten = true;
|
|
839
|
-
flattened.push(child.id);
|
|
840
|
-
if (!patchedNodes[child.id]) {
|
|
841
|
-
patchedNodes[child.id] = { ...child, parentId: id };
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
}
|
|
845
|
-
if (needsFlatten) {
|
|
846
|
-
patchedNodes[id] = { ...node, children: flattened };
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
733
|
// Level children normalization.
|
|
850
734
|
// Pre-0.9.1 JSONs may carry child IDs that no longer exist in the node
|
|
851
735
|
// map (e.g. elevator IDs that lived under a level before the elevator
|
|
@@ -898,8 +782,28 @@ function migrateNodes(nodes) {
|
|
|
898
782
|
patchedNodes[id] = normalized;
|
|
899
783
|
}
|
|
900
784
|
}
|
|
901
|
-
const
|
|
902
|
-
|
|
785
|
+
const walls = migrateLegacyWallAssemblies(patchedNodes);
|
|
786
|
+
const vertical = migrateVerticalSceneNodes(walls.nodes);
|
|
787
|
+
const rooms = migrateRoomZones(vertical.nodes);
|
|
788
|
+
const ceilings = migrateCeilingRoomLinks(rooms.nodes);
|
|
789
|
+
const legacyOpeningsPrepared = Object.values(ceilings.nodes).some((value) => {
|
|
790
|
+
const node = value;
|
|
791
|
+
return node.type === 'slab' && node.autoFromWalls && !node.plateRole;
|
|
792
|
+
}) &&
|
|
793
|
+
Object.values(ceilings.nodes).some((value) => {
|
|
794
|
+
const node = value;
|
|
795
|
+
return node.type === 'stair' || node.type === 'elevator';
|
|
796
|
+
});
|
|
797
|
+
const plates = migrateFloorPlates(materializeLegacyAutoOpenings(ceilings.nodes, true));
|
|
798
|
+
const slots = migrateSlabSlots(plates.nodes);
|
|
799
|
+
const openings = ensureSceneOpenings(slots.nodes).nodes;
|
|
800
|
+
// M1 before M2: bands move onto geometric faces, then become paint regions.
|
|
801
|
+
const wallFaces = migrateWallFaceKeys(openings);
|
|
802
|
+
const structure = reconcileStructureOnLoad(migrateWallFaceBands(wallFaces.nodes).nodes, vertical.nodes, { legacyOpeningsPrepared });
|
|
803
|
+
return {
|
|
804
|
+
nodes: materializeNodeDefaults(structure.nodes).nodes,
|
|
805
|
+
mintedMaterials,
|
|
806
|
+
};
|
|
903
807
|
}
|
|
904
808
|
function getNodeChildIds(node) {
|
|
905
809
|
if (!('children' in node && Array.isArray(node.children))) {
|
|
@@ -949,23 +853,36 @@ function collectReachableNodeIds(nodes, rootNodeIds) {
|
|
|
949
853
|
}
|
|
950
854
|
return reachable;
|
|
951
855
|
}
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
856
|
+
/** Collection membership lives in `collection.nodeIds`; items alone mirror it in `collectionIds`. */
|
|
857
|
+
function mirrorItemMembership(nodes, collectionId, nodeIds, member) {
|
|
858
|
+
let next = nodes;
|
|
859
|
+
for (const nodeId of nodeIds) {
|
|
860
|
+
const node = next[nodeId];
|
|
861
|
+
if (node?.type !== 'item')
|
|
862
|
+
continue;
|
|
863
|
+
const current = node.collectionIds ?? [];
|
|
864
|
+
if (current.includes(collectionId) === member)
|
|
865
|
+
continue;
|
|
866
|
+
if (next === nodes)
|
|
867
|
+
next = { ...nodes };
|
|
868
|
+
next[nodeId] = {
|
|
869
|
+
...node,
|
|
870
|
+
collectionIds: member
|
|
871
|
+
? [...current, collectionId]
|
|
872
|
+
: current.filter((id) => id !== collectionId),
|
|
873
|
+
};
|
|
968
874
|
}
|
|
875
|
+
return next;
|
|
876
|
+
}
|
|
877
|
+
/**
|
|
878
|
+
* `parts` without the subtrees of `draftIds`, and without the references to them (children,
|
|
879
|
+
* procedural attachments, collections, roots). Returns `parts` itself when there is nothing to drop.
|
|
880
|
+
*/
|
|
881
|
+
function withoutDraftSubtrees(parts, draftIds) {
|
|
882
|
+
const { nodes, rootNodeIds, collections } = parts;
|
|
883
|
+
const transientNodeIds = new Set([...draftIds].filter((id) => Boolean(nodes[id])));
|
|
884
|
+
if (transientNodeIds.size === 0)
|
|
885
|
+
return parts;
|
|
969
886
|
const childIdsByParentId = new Map();
|
|
970
887
|
const addChild = (parentId, childId) => {
|
|
971
888
|
const childIds = childIdsByParentId.get(parentId) ?? new Set();
|
|
@@ -990,36 +907,93 @@ function sceneHistorySnapshotFromState(state) {
|
|
|
990
907
|
pendingIds.push(childId);
|
|
991
908
|
}
|
|
992
909
|
}
|
|
993
|
-
const
|
|
994
|
-
for (const [id,
|
|
910
|
+
const documentNodes = {};
|
|
911
|
+
for (const [id, sourceNode] of Object.entries(nodes)) {
|
|
995
912
|
if (transientNodeIds.has(id))
|
|
996
913
|
continue;
|
|
914
|
+
let node = sourceNode;
|
|
915
|
+
if (node.type === 'procedural-item') {
|
|
916
|
+
let attachments;
|
|
917
|
+
for (const childId of transientNodeIds) {
|
|
918
|
+
if (!Object.hasOwn(node.attachments, childId))
|
|
919
|
+
continue;
|
|
920
|
+
attachments ??= { ...node.attachments };
|
|
921
|
+
delete attachments[childId];
|
|
922
|
+
}
|
|
923
|
+
if (attachments)
|
|
924
|
+
node = { ...node, attachments };
|
|
925
|
+
}
|
|
997
926
|
if (!('children' in node && Array.isArray(node.children))) {
|
|
998
|
-
|
|
927
|
+
documentNodes[id] = node;
|
|
999
928
|
continue;
|
|
1000
929
|
}
|
|
1001
930
|
const children = node.children.filter((childId) => !transientNodeIds.has(childId));
|
|
1002
|
-
|
|
931
|
+
documentNodes[id] =
|
|
1003
932
|
children.length === node.children.length ? node : { ...node, children };
|
|
1004
933
|
}
|
|
1005
|
-
const
|
|
934
|
+
const documentCollections = {};
|
|
1006
935
|
for (const [id, collection] of Object.entries(collections)) {
|
|
1007
936
|
const nodeIds = collection.nodeIds.filter((nodeId) => !transientNodeIds.has(nodeId));
|
|
1008
937
|
if (collection.controlNodeId && transientNodeIds.has(collection.controlNodeId)) {
|
|
1009
938
|
const { controlNodeId: _controlNodeId, ...rest } = collection;
|
|
1010
|
-
|
|
939
|
+
documentCollections[id] = { ...rest, nodeIds };
|
|
1011
940
|
}
|
|
1012
941
|
else {
|
|
1013
|
-
|
|
942
|
+
documentCollections[id] =
|
|
1014
943
|
nodeIds.length === collection.nodeIds.length ? collection : { ...collection, nodeIds };
|
|
1015
944
|
}
|
|
1016
945
|
}
|
|
1017
946
|
return {
|
|
1018
|
-
nodes:
|
|
947
|
+
nodes: documentNodes,
|
|
1019
948
|
rootNodeIds: rootNodeIds.filter((id) => !transientNodeIds.has(id)),
|
|
1020
|
-
collections:
|
|
949
|
+
collections: documentCollections,
|
|
950
|
+
};
|
|
951
|
+
}
|
|
952
|
+
function isFreshPlacementNode(node) {
|
|
953
|
+
const metadata = node.metadata;
|
|
954
|
+
return (!!metadata &&
|
|
955
|
+
typeof metadata === 'object' &&
|
|
956
|
+
!Array.isArray(metadata) &&
|
|
957
|
+
metadata.isNew === true);
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Fresh placement nodes are renderable drafts, not document history. Excluding their entire
|
|
961
|
+
* subtree here protects both local undo and external commit subscribers. Carried drafts
|
|
962
|
+
* (history-drafts.ts) are kept out the same way.
|
|
963
|
+
*/
|
|
964
|
+
function sceneHistorySnapshotFromState(state) {
|
|
965
|
+
const { nodes, materials, installedPlugins, hasExplicitPluginInstallState } = state;
|
|
966
|
+
const kept = withoutDraftSubtrees(state, [
|
|
967
|
+
...createdSceneHistoryDraftIds(),
|
|
968
|
+
...Object.values(nodes)
|
|
969
|
+
.filter(isFreshPlacementNode)
|
|
970
|
+
.map((node) => node.id),
|
|
971
|
+
]);
|
|
972
|
+
return {
|
|
973
|
+
nodes: withAdoptedDraftsAsOriginal(nodes, kept.nodes),
|
|
974
|
+
rootNodeIds: kept.rootNodeIds,
|
|
975
|
+
collections: kept.collections,
|
|
1021
976
|
materials,
|
|
1022
977
|
installedPlugins,
|
|
978
|
+
hasExplicitPluginInstallState,
|
|
979
|
+
};
|
|
980
|
+
}
|
|
981
|
+
/**
|
|
982
|
+
* The current scene as every save writes it: without the drafts an interaction is carrying —
|
|
983
|
+
* created carry drafts (history-drafts.ts) and the `drafts` the caller owns — and with adopted
|
|
984
|
+
* carry drafts as they were before the carry. Never inferred from metadata: committed nodes can
|
|
985
|
+
* still carry `metadata.isNew`, so only explicitly owned drafts are left out.
|
|
986
|
+
*/
|
|
987
|
+
export function getSceneDocument(drafts = []) {
|
|
988
|
+
const state = useScene.getState();
|
|
989
|
+
const kept = withoutDraftSubtrees(state, [...createdSceneHistoryDraftIds(), ...drafts]);
|
|
990
|
+
return {
|
|
991
|
+
nodes: withAdoptedDraftsAsOriginal(state.nodes, kept.nodes),
|
|
992
|
+
rootNodeIds: kept.rootNodeIds,
|
|
993
|
+
collections: kept.collections,
|
|
994
|
+
materials: state.materials,
|
|
995
|
+
installedPlugins: state.installedPlugins,
|
|
996
|
+
hasExplicitPluginInstallState: state.hasExplicitPluginInstallState,
|
|
1023
997
|
};
|
|
1024
998
|
}
|
|
1025
999
|
/**
|
|
@@ -1079,7 +1053,26 @@ function createSceneStore(config) {
|
|
|
1079
1053
|
};
|
|
1080
1054
|
return create()(hydratedConfig);
|
|
1081
1055
|
}
|
|
1082
|
-
function runTemporalJump(target,
|
|
1056
|
+
function runTemporalJump(target, restore) {
|
|
1057
|
+
const draftsBefore = useScene.getState().nodes;
|
|
1058
|
+
const restoreDrafts = () => {
|
|
1059
|
+
const current = useScene.getState().nodes;
|
|
1060
|
+
const nodes = retainSceneAnnotations(draftsBefore, withDraftsRestored(draftsBefore, current) ?? current);
|
|
1061
|
+
if (nodes === current)
|
|
1062
|
+
return;
|
|
1063
|
+
// The carry's own state, not a new step: a tracked write here would clear redo.
|
|
1064
|
+
const pause = beginSceneHistoryPauseSession(useScene);
|
|
1065
|
+
try {
|
|
1066
|
+
useScene.setState({ nodes });
|
|
1067
|
+
}
|
|
1068
|
+
finally {
|
|
1069
|
+
pause.end();
|
|
1070
|
+
}
|
|
1071
|
+
};
|
|
1072
|
+
runTemporalJumpOnly(target, () => runAsSceneHistoryRestore(restore));
|
|
1073
|
+
restoreDrafts();
|
|
1074
|
+
}
|
|
1075
|
+
function runTemporalJumpOnly(target, jump) {
|
|
1083
1076
|
if (!target?.nodes) {
|
|
1084
1077
|
jump();
|
|
1085
1078
|
return;
|
|
@@ -1092,7 +1085,6 @@ function runTemporalJump(target, jump) {
|
|
|
1092
1085
|
const next = target.nodes[nodeId];
|
|
1093
1086
|
if (previous === next)
|
|
1094
1087
|
continue;
|
|
1095
|
-
// Structural hierarchy changes keep the full-level reconciliation fallback.
|
|
1096
1088
|
if ([previous, next].some((node) => node && ['site', 'building', 'level'].includes(node.type))) {
|
|
1097
1089
|
jump();
|
|
1098
1090
|
return;
|
|
@@ -1147,9 +1139,9 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1147
1139
|
setScene: (nodes, rootNodeIds, extra) => {
|
|
1148
1140
|
// Apply backward compatibility migrations
|
|
1149
1141
|
const { nodes: patchedNodes, mintedMaterials } = migrateNodes(nodes);
|
|
1150
|
-
// Scene materials minted by the
|
|
1151
|
-
// loaded palette
|
|
1152
|
-
//
|
|
1142
|
+
// Scene materials minted by the legacy→slots migrations join the
|
|
1143
|
+
// loaded palette. Their ids are content-derived, so an existing entry
|
|
1144
|
+
// with the same id (the hosted authority minted it) is the same material.
|
|
1153
1145
|
const materials = { ...mintedMaterials, ...(extra?.materials ?? {}) };
|
|
1154
1146
|
// Remove orphans: nodes whose parentId points to a non-existent node
|
|
1155
1147
|
const cleanedNodes = { ...patchedNodes };
|
|
@@ -1186,37 +1178,22 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1186
1178
|
installedPlugins: Array.from(new Set(extra?.installedPlugins ?? [])),
|
|
1187
1179
|
hasExplicitPluginInstallState: extra?.hasExplicitPluginInstallState ?? false,
|
|
1188
1180
|
});
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1181
|
+
if (!get().readOnly &&
|
|
1182
|
+
Object.values(get().nodes).some((node) => node.type === 'stair')) {
|
|
1183
|
+
queueSceneNormalization(() => {
|
|
1184
|
+
if (get().hydrationId !== hydrationId)
|
|
1185
|
+
return;
|
|
1186
|
+
const { updates } = ensureSceneOpenings(get().nodes);
|
|
1187
|
+
if (!updates.length)
|
|
1188
|
+
return;
|
|
1189
|
+
pauseSceneHistory(useScene);
|
|
1190
|
+
try {
|
|
1191
|
+
get().updateNodes(updates);
|
|
1199
1192
|
}
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
}
|
|
1204
|
-
if (hydratedNodes.some((node) => node.type === 'stair')) {
|
|
1205
|
-
// Spatial-grid subscribers must settle first. Owning this pass
|
|
1206
|
-
// here also covers opening systems that mount after the load.
|
|
1207
|
-
queueSceneNormalization(() => {
|
|
1208
|
-
if (get().hydrationId !== hydrationId)
|
|
1209
|
-
return;
|
|
1210
|
-
pauseSceneHistory(useScene);
|
|
1211
|
-
try {
|
|
1212
|
-
applyNormalization(syncStairRises(get().nodes));
|
|
1213
|
-
applyNormalization(syncAutoStairOpenings(get().nodes));
|
|
1214
|
-
}
|
|
1215
|
-
finally {
|
|
1216
|
-
resumeSceneHistory(useScene);
|
|
1217
|
-
}
|
|
1218
|
-
});
|
|
1219
|
-
}
|
|
1193
|
+
finally {
|
|
1194
|
+
resumeSceneHistory(useScene);
|
|
1195
|
+
}
|
|
1196
|
+
});
|
|
1220
1197
|
}
|
|
1221
1198
|
// Mark all nodes as dirty to trigger re-validation
|
|
1222
1199
|
Object.values(get().nodes).forEach((node) => {
|
|
@@ -1269,7 +1246,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1269
1246
|
parentId: building.id,
|
|
1270
1247
|
level: 0,
|
|
1271
1248
|
children: [],
|
|
1272
|
-
height:
|
|
1249
|
+
height: DEFAULT_LEVEL_HEIGHT,
|
|
1273
1250
|
});
|
|
1274
1251
|
// Define all nodes flat
|
|
1275
1252
|
const nodes = {
|
|
@@ -1291,33 +1268,24 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1291
1268
|
clearDirty: (id) => {
|
|
1292
1269
|
get().dirtyNodes.delete(id);
|
|
1293
1270
|
},
|
|
1294
|
-
createNodes: (ops) => nodeActions.createNodesAction(set, get, ops),
|
|
1295
|
-
createNode: (node, parentId) => nodeActions.createNodesAction(set, get, [{ node, parentId }]),
|
|
1296
|
-
applyNodeChanges: (changes) => nodeActions.applyNodeChangesAction(set, get, changes),
|
|
1297
|
-
updateNodes: (updates) => nodeActions.updateNodesAction(set, get, updates),
|
|
1298
|
-
updateNode: (id, data) => nodeActions.updateNodesAction(set, get, [{ id, data }]),
|
|
1271
|
+
createNodes: (ops, options) => nodeActions.createNodesAction(set, get, ops, options),
|
|
1272
|
+
createNode: (node, parentId, options) => nodeActions.createNodesAction(set, get, [{ node, parentId }], options),
|
|
1273
|
+
applyNodeChanges: (changes, options) => nodeActions.applyNodeChangesAction(set, get, changes, options),
|
|
1274
|
+
updateNodes: (updates, options) => nodeActions.updateNodesAction(set, get, updates, options),
|
|
1275
|
+
updateNode: (id, data, options) => nodeActions.updateNodesAction(set, get, [{ id, data }], options),
|
|
1276
|
+
detachDerivedNode: (id, data) => nodeActions.detachDerivedNodeAction(set, get, id, data),
|
|
1299
1277
|
// --- DELETE ---
|
|
1300
|
-
deleteNodes: (ids) => nodeActions.deleteNodesAction(set, get, ids),
|
|
1301
|
-
deleteNode: (id) => nodeActions.deleteNodesAction(set, get, [id]),
|
|
1278
|
+
deleteNodes: (ids, options) => nodeActions.deleteNodesAction(set, get, ids, options),
|
|
1279
|
+
deleteNode: (id, options) => nodeActions.deleteNodesAction(set, get, [id], options),
|
|
1302
1280
|
// --- COLLECTIONS ---
|
|
1303
1281
|
createCollection: (name, nodeIds = []) => {
|
|
1304
1282
|
if (get().readOnly)
|
|
1305
1283
|
return '';
|
|
1306
1284
|
const id = generateCollectionId();
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
const nextNodes = { ...state.nodes };
|
|
1312
|
-
for (const nodeId of nodeIds) {
|
|
1313
|
-
const node = nextNodes[nodeId];
|
|
1314
|
-
if (!node)
|
|
1315
|
-
continue;
|
|
1316
|
-
const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
|
|
1317
|
-
nextNodes[nodeId] = { ...node, collectionIds: [...existing, id] };
|
|
1318
|
-
}
|
|
1319
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1320
|
-
});
|
|
1285
|
+
set((state) => ({
|
|
1286
|
+
collections: { ...state.collections, [id]: { id, name, nodeIds: [...nodeIds] } },
|
|
1287
|
+
nodes: mirrorItemMembership(state.nodes, id, nodeIds, true),
|
|
1288
|
+
}));
|
|
1321
1289
|
return id;
|
|
1322
1290
|
},
|
|
1323
1291
|
deleteCollection: (id) => {
|
|
@@ -1327,18 +1295,10 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1327
1295
|
const col = state.collections[id];
|
|
1328
1296
|
const nextCollections = { ...state.collections };
|
|
1329
1297
|
delete nextCollections[id];
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
if (!(node && 'collectionIds' in node))
|
|
1335
|
-
continue;
|
|
1336
|
-
nextNodes[nodeId] = {
|
|
1337
|
-
...node,
|
|
1338
|
-
collectionIds: node.collectionIds.filter((cid) => cid !== id),
|
|
1339
|
-
};
|
|
1340
|
-
}
|
|
1341
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1298
|
+
return {
|
|
1299
|
+
collections: nextCollections,
|
|
1300
|
+
nodes: mirrorItemMembership(state.nodes, id, col?.nodeIds ?? [], false),
|
|
1301
|
+
};
|
|
1342
1302
|
});
|
|
1343
1303
|
},
|
|
1344
1304
|
updateCollection: (id, data) => {
|
|
@@ -1351,50 +1311,38 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1351
1311
|
return { collections: { ...state.collections, [id]: { ...col, ...data } } };
|
|
1352
1312
|
});
|
|
1353
1313
|
},
|
|
1354
|
-
addToCollection: (id,
|
|
1314
|
+
addToCollection: (id, nodeIds) => {
|
|
1355
1315
|
if (get().readOnly)
|
|
1356
1316
|
return;
|
|
1357
1317
|
set((state) => {
|
|
1358
1318
|
const col = state.collections[id];
|
|
1359
|
-
|
|
1319
|
+
const added = nodeIds.filter((nodeId) => !col?.nodeIds.includes(nodeId));
|
|
1320
|
+
if (!col || added.length === 0)
|
|
1360
1321
|
return state;
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
return { collections: nextCollections };
|
|
1368
|
-
const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
|
|
1369
|
-
const nextNodes = {
|
|
1370
|
-
...state.nodes,
|
|
1371
|
-
[nodeId]: { ...node, collectionIds: [...existing, id] },
|
|
1322
|
+
return {
|
|
1323
|
+
collections: {
|
|
1324
|
+
...state.collections,
|
|
1325
|
+
[id]: { ...col, nodeIds: [...col.nodeIds, ...added] },
|
|
1326
|
+
},
|
|
1327
|
+
nodes: mirrorItemMembership(state.nodes, id, added, true),
|
|
1372
1328
|
};
|
|
1373
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1374
1329
|
});
|
|
1375
1330
|
},
|
|
1376
|
-
removeFromCollection: (id,
|
|
1331
|
+
removeFromCollection: (id, nodeIds) => {
|
|
1377
1332
|
if (get().readOnly)
|
|
1378
1333
|
return;
|
|
1379
1334
|
set((state) => {
|
|
1380
1335
|
const col = state.collections[id];
|
|
1381
|
-
|
|
1336
|
+
const removed = nodeIds.filter((nodeId) => col?.nodeIds.includes(nodeId));
|
|
1337
|
+
if (!col || removed.length === 0)
|
|
1382
1338
|
return state;
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
const node = state.nodes[nodeId];
|
|
1388
|
-
if (!(node && 'collectionIds' in node))
|
|
1389
|
-
return { collections: nextCollections };
|
|
1390
|
-
const nextNodes = {
|
|
1391
|
-
...state.nodes,
|
|
1392
|
-
[nodeId]: {
|
|
1393
|
-
...node,
|
|
1394
|
-
collectionIds: node.collectionIds.filter((cid) => cid !== id),
|
|
1339
|
+
return {
|
|
1340
|
+
collections: {
|
|
1341
|
+
...state.collections,
|
|
1342
|
+
[id]: { ...col, nodeIds: col.nodeIds.filter((nodeId) => !removed.includes(nodeId)) },
|
|
1395
1343
|
},
|
|
1344
|
+
nodes: mirrorItemMembership(state.nodes, id, removed, false),
|
|
1396
1345
|
};
|
|
1397
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1398
1346
|
});
|
|
1399
1347
|
},
|
|
1400
1348
|
// --- SCENE MATERIALS ---
|
|
@@ -1426,7 +1374,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1426
1374
|
},
|
|
1427
1375
|
}), {
|
|
1428
1376
|
partialize: (state) => sceneHistorySnapshotFromState(state),
|
|
1429
|
-
equality: (pastState, currentState) => areSceneSnapshotsEqual(pastState, currentState),
|
|
1377
|
+
equality: (pastState, currentState) => areSceneSnapshotsEqual({ ...pastState, nodes: withoutSceneAnnotations(pastState.nodes) }, { ...currentState, nodes: withoutSceneAnnotations(currentState.nodes) }),
|
|
1430
1378
|
onSave: (pastState, currentState) => {
|
|
1431
1379
|
notifySceneCommit({
|
|
1432
1380
|
origin: 'local',
|
|
@@ -1455,6 +1403,23 @@ const invalidateForLiveState = () => {
|
|
|
1455
1403
|
useLiveNodeOverrides.subscribe(invalidateForLiveState);
|
|
1456
1404
|
useLiveTransforms.subscribe(invalidateForLiveState);
|
|
1457
1405
|
useScene.subscribe(invalidateForLiveState);
|
|
1406
|
+
// Systems rebuild a node's geometry only when it is dirty, so a preview that
|
|
1407
|
+
// drops its override without marking the node left it drawn at the preview
|
|
1408
|
+
// (a cancelled wall move's floor still pushed out). Whoever clears an
|
|
1409
|
+
// override, or one of its fields, the node rebuilds from the scene.
|
|
1410
|
+
useLiveNodeOverrides.subscribe(function markClearedOverridesDirty(state, previous) {
|
|
1411
|
+
if (state.overrides === previous.overrides)
|
|
1412
|
+
return;
|
|
1413
|
+
let scene = null;
|
|
1414
|
+
for (const [id, before] of previous.overrides) {
|
|
1415
|
+
const after = state.overrides.get(id);
|
|
1416
|
+
if (after === before || (after && Object.keys(before).every((key) => key in after)))
|
|
1417
|
+
continue;
|
|
1418
|
+
scene ??= useScene.getState();
|
|
1419
|
+
if (scene.nodes[id])
|
|
1420
|
+
scene.markDirty(id);
|
|
1421
|
+
}
|
|
1422
|
+
});
|
|
1458
1423
|
export default useScene;
|
|
1459
1424
|
let sceneReadOnlyLeaseCount = 0;
|
|
1460
1425
|
let sceneReadOnlyLeaseBaseline = false;
|
|
@@ -1511,7 +1476,8 @@ function sceneOperationPatchHasLiveConflict(beforeState, changes) {
|
|
|
1511
1476
|
return false;
|
|
1512
1477
|
}
|
|
1513
1478
|
function areScenePatchValuesEqual(left, right) {
|
|
1514
|
-
|
|
1479
|
+
// Compensation crosses JSON, which serializes both signed zeros as 0.
|
|
1480
|
+
if (left === right)
|
|
1515
1481
|
return true;
|
|
1516
1482
|
if (typeof left !== typeof right || left === null || right === null)
|
|
1517
1483
|
return false;
|
|
@@ -1525,8 +1491,10 @@ function areScenePatchValuesEqual(left, right) {
|
|
|
1525
1491
|
return false;
|
|
1526
1492
|
const leftRecord = left;
|
|
1527
1493
|
const rightRecord = right;
|
|
1528
|
-
|
|
1529
|
-
|
|
1494
|
+
// Recorded compensation nodes have crossed JSON, which omits undefined properties.
|
|
1495
|
+
const leftKeys = Object.keys(leftRecord).filter((key) => leftRecord[key] !== undefined);
|
|
1496
|
+
const rightKeys = Object.keys(rightRecord).filter((key) => rightRecord[key] !== undefined);
|
|
1497
|
+
if (leftKeys.length !== rightKeys.length)
|
|
1530
1498
|
return false;
|
|
1531
1499
|
return leftKeys.every((key) => Object.hasOwn(rightRecord, key) &&
|
|
1532
1500
|
areScenePatchValuesEqual(leftRecord[key], rightRecord[key]));
|
|
@@ -1605,7 +1573,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1605
1573
|
!Number.isSafeInteger(change.position) ||
|
|
1606
1574
|
change.position < 0 ||
|
|
1607
1575
|
siblings?.[change.position] !== id ||
|
|
1608
|
-
!areScenePatchValuesEqual(current, change.node)) {
|
|
1576
|
+
!areScenePatchValuesEqual(withoutSceneNodeAnnotations(current), withoutSceneNodeAnnotations(change.node))) {
|
|
1609
1577
|
return null;
|
|
1610
1578
|
}
|
|
1611
1579
|
deleteIds.add(id);
|
|
@@ -1614,11 +1582,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1614
1582
|
if (deleteIds.has(id))
|
|
1615
1583
|
return null;
|
|
1616
1584
|
}
|
|
1617
|
-
for (const node of Object.values(beforeState.nodes)) {
|
|
1618
|
-
const parentId = node.parentId ?? null;
|
|
1619
|
-
if (parentId && deleteIds.has(parentId) && !deleteIds.has(node.id))
|
|
1620
|
-
return null;
|
|
1621
|
-
}
|
|
1622
1585
|
const nextNodes = { ...beforeState.nodes };
|
|
1623
1586
|
let nextRootNodeIds = deleteIds.size > 0
|
|
1624
1587
|
? beforeState.rootNodeIds.filter((id) => !deleteIds.has(id))
|
|
@@ -1653,8 +1616,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1653
1616
|
if (!parent)
|
|
1654
1617
|
return null;
|
|
1655
1618
|
if (createIds.has(parentId)) {
|
|
1656
|
-
if (!('children' in parent) ||
|
|
1657
|
-
!Array.isArray(parent.children) ||
|
|
1619
|
+
if (!('children' in parent && Array.isArray(parent.children)) ||
|
|
1658
1620
|
parent.children[change.position] !== change.node.id) {
|
|
1659
1621
|
return null;
|
|
1660
1622
|
}
|
|
@@ -1664,6 +1626,66 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1664
1626
|
placements.push(change);
|
|
1665
1627
|
existingParentCreates.set(parentId, placements);
|
|
1666
1628
|
}
|
|
1629
|
+
for (const { id, data, removeFields } of changes.nodeUpdates) {
|
|
1630
|
+
const node = nextNodes[id];
|
|
1631
|
+
if (!node ||
|
|
1632
|
+
createIds.has(id) ||
|
|
1633
|
+
deleteIds.has(id) ||
|
|
1634
|
+
updateIds.has(id) ||
|
|
1635
|
+
('id' in data && data.id !== node.id) ||
|
|
1636
|
+
('type' in data && data.type !== node.type) ||
|
|
1637
|
+
('object' in data && data.object !== node.object) ||
|
|
1638
|
+
removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
|
|
1639
|
+
return null;
|
|
1640
|
+
}
|
|
1641
|
+
updateIds.add(id);
|
|
1642
|
+
let candidate = { ...node };
|
|
1643
|
+
for (const [field, value] of Object.entries(data)) {
|
|
1644
|
+
const written = writeSceneNodeField(candidate, field, value, true);
|
|
1645
|
+
if (!written)
|
|
1646
|
+
return null;
|
|
1647
|
+
candidate = written;
|
|
1648
|
+
}
|
|
1649
|
+
for (const field of removeFields) {
|
|
1650
|
+
const written = writeSceneNodeField(candidate, field, undefined, false);
|
|
1651
|
+
if (!written)
|
|
1652
|
+
return null;
|
|
1653
|
+
candidate = written;
|
|
1654
|
+
}
|
|
1655
|
+
const validated = parseSceneOperationPatchNode(candidate);
|
|
1656
|
+
if (!validated ||
|
|
1657
|
+
validated.id !== id ||
|
|
1658
|
+
validated.type !== node.type ||
|
|
1659
|
+
validated.object !== node.object) {
|
|
1660
|
+
return null;
|
|
1661
|
+
}
|
|
1662
|
+
nextNodes[id] = candidate;
|
|
1663
|
+
}
|
|
1664
|
+
for (const id of updateIds) {
|
|
1665
|
+
const previousParent = beforeState.nodes[id]?.parentId;
|
|
1666
|
+
const parentId = nextNodes[id]?.parentId;
|
|
1667
|
+
if (previousParent === parentId)
|
|
1668
|
+
continue;
|
|
1669
|
+
if (previousParent) {
|
|
1670
|
+
const parent = nextNodes[previousParent];
|
|
1671
|
+
if (parent && 'children' in parent && Array.isArray(parent.children))
|
|
1672
|
+
nextNodes[previousParent] = {
|
|
1673
|
+
...parent,
|
|
1674
|
+
children: parent.children.filter((child) => child !== id),
|
|
1675
|
+
};
|
|
1676
|
+
}
|
|
1677
|
+
else
|
|
1678
|
+
nextRootNodeIds = nextRootNodeIds.filter((child) => child !== id);
|
|
1679
|
+
if (parentId) {
|
|
1680
|
+
const parent = nextNodes[parentId];
|
|
1681
|
+
if (!(parent && 'children' in parent && Array.isArray(parent.children)))
|
|
1682
|
+
return null;
|
|
1683
|
+
if (!parent.children.includes(id))
|
|
1684
|
+
nextNodes[parentId] = { ...parent, children: [...parent.children, id] };
|
|
1685
|
+
}
|
|
1686
|
+
else if (!nextRootNodeIds.includes(id))
|
|
1687
|
+
nextRootNodeIds = [...nextRootNodeIds, id];
|
|
1688
|
+
}
|
|
1667
1689
|
const insertedRoots = insertSceneStructuralPlacements(nextRootNodeIds, rootCreates);
|
|
1668
1690
|
if (!insertedRoots)
|
|
1669
1691
|
return null;
|
|
@@ -1677,6 +1699,10 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1677
1699
|
return null;
|
|
1678
1700
|
nextNodes[parentId] = { ...parent, children };
|
|
1679
1701
|
}
|
|
1702
|
+
for (const node of Object.values(nextNodes)) {
|
|
1703
|
+
if (node.parentId && deleteIds.has(node.parentId))
|
|
1704
|
+
return null;
|
|
1705
|
+
}
|
|
1680
1706
|
for (const change of parsedCreates) {
|
|
1681
1707
|
const parentId = change.node.parentId ?? null;
|
|
1682
1708
|
const siblings = structuralSiblingIds(nextNodes, nextRootNodeIds, parentId);
|
|
@@ -1689,31 +1715,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1689
1715
|
return null;
|
|
1690
1716
|
}
|
|
1691
1717
|
}
|
|
1692
|
-
for (const { id, data, removeFields } of changes.nodeUpdates) {
|
|
1693
|
-
const node = nextNodes[id];
|
|
1694
|
-
if (!node ||
|
|
1695
|
-
createIds.has(id) ||
|
|
1696
|
-
deleteIds.has(id) ||
|
|
1697
|
-
updateIds.has(id) ||
|
|
1698
|
-
('id' in data && data.id !== node.id) ||
|
|
1699
|
-
('type' in data && data.type !== node.type) ||
|
|
1700
|
-
('object' in data && data.object !== node.object) ||
|
|
1701
|
-
removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
|
|
1702
|
-
return null;
|
|
1703
|
-
}
|
|
1704
|
-
updateIds.add(id);
|
|
1705
|
-
const candidate = { ...node, ...data };
|
|
1706
|
-
for (const field of removeFields)
|
|
1707
|
-
delete candidate[field];
|
|
1708
|
-
const validated = parseSceneOperationPatchNode(candidate);
|
|
1709
|
-
if (!validated ||
|
|
1710
|
-
validated.id !== id ||
|
|
1711
|
-
validated.type !== node.type ||
|
|
1712
|
-
validated.object !== node.object) {
|
|
1713
|
-
return null;
|
|
1714
|
-
}
|
|
1715
|
-
nextNodes[id] = candidate;
|
|
1716
|
-
}
|
|
1717
1718
|
const materials = changes.materialChanges.length > 0 ? { ...beforeState.materials } : beforeState.materials;
|
|
1718
1719
|
for (const { id, material } of changes.materialChanges) {
|
|
1719
1720
|
if (materialIds.has(id) ||
|
|
@@ -1726,16 +1727,87 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1726
1727
|
else
|
|
1727
1728
|
materials[id] = material;
|
|
1728
1729
|
}
|
|
1729
|
-
|
|
1730
|
+
const collectionChanges = changes.collectionChanges ?? [];
|
|
1731
|
+
const collections = collectionChanges.length > 0 ? { ...beforeState.collections } : beforeState.collections;
|
|
1732
|
+
const collectionIds = new Set();
|
|
1733
|
+
for (const { id, collection } of collectionChanges) {
|
|
1734
|
+
if (collectionIds.has(id) || (collection !== null && collection.id !== id))
|
|
1735
|
+
return null;
|
|
1736
|
+
collectionIds.add(id);
|
|
1737
|
+
if (collection === null)
|
|
1738
|
+
delete collections[id];
|
|
1739
|
+
else
|
|
1740
|
+
collections[id] = collection;
|
|
1741
|
+
}
|
|
1742
|
+
const pluginChanges = changes.pluginChanges ?? [];
|
|
1743
|
+
if (changes.pluginInstallState) {
|
|
1744
|
+
return {
|
|
1745
|
+
collections,
|
|
1746
|
+
materials,
|
|
1747
|
+
nodes: nextNodes,
|
|
1748
|
+
rootNodeIds: nextRootNodeIds,
|
|
1749
|
+
installedPlugins: [...changes.pluginInstallState.installedPlugins],
|
|
1750
|
+
hasExplicitPluginInstallState: changes.pluginInstallState.explicit,
|
|
1751
|
+
};
|
|
1752
|
+
}
|
|
1753
|
+
if (pluginChanges.length === 0) {
|
|
1754
|
+
return { collections, materials, nodes: nextNodes, rootNodeIds: nextRootNodeIds };
|
|
1755
|
+
}
|
|
1756
|
+
const installedPlugins = new Set(beforeState.installedPlugins);
|
|
1757
|
+
const pluginIds = new Set();
|
|
1758
|
+
for (const { id, installed } of pluginChanges) {
|
|
1759
|
+
if (!id || pluginIds.has(id))
|
|
1760
|
+
return null;
|
|
1761
|
+
pluginIds.add(id);
|
|
1762
|
+
if (installed)
|
|
1763
|
+
installedPlugins.add(id);
|
|
1764
|
+
else
|
|
1765
|
+
installedPlugins.delete(id);
|
|
1766
|
+
}
|
|
1767
|
+
return {
|
|
1768
|
+
collections,
|
|
1769
|
+
materials,
|
|
1770
|
+
nodes: nextNodes,
|
|
1771
|
+
rootNodeIds: nextRootNodeIds,
|
|
1772
|
+
installedPlugins: Array.from(installedPlugins),
|
|
1773
|
+
// A shared install list is a decision someone made, so hosts must not
|
|
1774
|
+
// re-add their default plugins on top of it.
|
|
1775
|
+
hasExplicitPluginInstallState: true,
|
|
1776
|
+
};
|
|
1730
1777
|
}
|
|
1731
|
-
export function applySceneOperationPatch(changes) {
|
|
1778
|
+
export function applySceneOperationPatch(changes, options = {}) {
|
|
1732
1779
|
const beforeState = useScene.getState();
|
|
1733
1780
|
if (changes.nodeUpdates.length === 0 &&
|
|
1734
1781
|
changes.materialChanges.length === 0 &&
|
|
1735
1782
|
changes.nodeCreates.length === 0 &&
|
|
1736
|
-
changes.nodeDeletes.length === 0
|
|
1783
|
+
changes.nodeDeletes.length === 0 &&
|
|
1784
|
+
!changes.pluginChanges?.length &&
|
|
1785
|
+
!changes.collectionChanges?.length &&
|
|
1786
|
+
!changes.pluginInstallState) {
|
|
1737
1787
|
return false;
|
|
1738
1788
|
}
|
|
1789
|
+
if (options.undoable &&
|
|
1790
|
+
!(useScene.temporal.getState().isTracking &&
|
|
1791
|
+
getSceneHistoryPauseDepth() === 0 &&
|
|
1792
|
+
!hasSceneHistoryDrafts())) {
|
|
1793
|
+
return false;
|
|
1794
|
+
}
|
|
1795
|
+
if (options.annotation &&
|
|
1796
|
+
(options.undoable ||
|
|
1797
|
+
beforeState.readOnly ||
|
|
1798
|
+
!useScene.temporal.getState().isTracking ||
|
|
1799
|
+
getSceneHistoryPauseDepth() > 0 ||
|
|
1800
|
+
hasSceneHistoryDrafts()))
|
|
1801
|
+
return false;
|
|
1802
|
+
if (options.annotation &&
|
|
1803
|
+
(changes.nodeCreates.length ||
|
|
1804
|
+
changes.nodeDeletes.length ||
|
|
1805
|
+
changes.materialChanges.length ||
|
|
1806
|
+
changes.pluginChanges?.length ||
|
|
1807
|
+
changes.collectionChanges?.length ||
|
|
1808
|
+
changes.pluginInstallState ||
|
|
1809
|
+
changes.nodeUpdates.some(({ data, removeFields }) => removeFields.length || Object.keys(data).some((field) => field !== 'source.images'))))
|
|
1810
|
+
return false;
|
|
1739
1811
|
if (sceneOperationPatchHasLiveConflict(beforeState, changes))
|
|
1740
1812
|
return false;
|
|
1741
1813
|
const next = sceneOperationPatchNextState(beforeState, changes);
|
|
@@ -1746,7 +1818,7 @@ export function applySceneOperationPatch(changes) {
|
|
|
1746
1818
|
if (shouldScopeHistoryPause)
|
|
1747
1819
|
pauseSceneHistory(useScene);
|
|
1748
1820
|
try {
|
|
1749
|
-
useScene.setState(next);
|
|
1821
|
+
runAsRemoteSceneChange(() => useScene.setState(next));
|
|
1750
1822
|
}
|
|
1751
1823
|
finally {
|
|
1752
1824
|
if (shouldScopeHistoryPause)
|
|
@@ -1765,6 +1837,12 @@ export function applySceneOperationPatch(changes) {
|
|
|
1765
1837
|
}
|
|
1766
1838
|
if (areSceneSnapshotsEqual(before, current))
|
|
1767
1839
|
return false;
|
|
1840
|
+
if (options.undoable) {
|
|
1841
|
+
useScene.temporal.setState(({ pastStates }) => ({
|
|
1842
|
+
pastStates: [...pastStates, before],
|
|
1843
|
+
futureStates: [],
|
|
1844
|
+
}));
|
|
1845
|
+
}
|
|
1768
1846
|
for (const id of touchedNodeIds) {
|
|
1769
1847
|
if (current.nodes[id])
|
|
1770
1848
|
currentState.markDirty(id);
|
|
@@ -1804,10 +1882,22 @@ export function applySceneOperationPatch(changes) {
|
|
|
1804
1882
|
currentState.markDirty(node.parentId);
|
|
1805
1883
|
}
|
|
1806
1884
|
}
|
|
1885
|
+
if (changes.pluginChanges?.length || changes.pluginInstallState) {
|
|
1886
|
+
for (const node of Object.values(current.nodes)) {
|
|
1887
|
+
if (!getNodePluginId(node.type))
|
|
1888
|
+
continue;
|
|
1889
|
+
if (!isNodeKindEnabled(node.type, currentState.installedPlugins)) {
|
|
1890
|
+
currentState.clearDirty(node.id);
|
|
1891
|
+
}
|
|
1892
|
+
else if (!isNodeKindEnabled(node.type, beforeState.installedPlugins)) {
|
|
1893
|
+
currentState.markDirty(node.id);
|
|
1894
|
+
}
|
|
1895
|
+
}
|
|
1896
|
+
}
|
|
1807
1897
|
for (const { node } of changes.nodeDeletes)
|
|
1808
1898
|
currentState.clearDirty(node.id);
|
|
1809
1899
|
notifySceneCommit({
|
|
1810
|
-
origin: 'host',
|
|
1900
|
+
origin: options.annotation ? 'local' : 'host',
|
|
1811
1901
|
before,
|
|
1812
1902
|
current,
|
|
1813
1903
|
});
|
|
@@ -1823,18 +1913,19 @@ export function applyScenePatch(changes) {
|
|
|
1823
1913
|
export function applySceneSnapshot(snapshot, options) {
|
|
1824
1914
|
const before = sceneHistorySnapshotFromState(useScene.getState());
|
|
1825
1915
|
const temporalState = useScene.temporal.getState();
|
|
1826
|
-
if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0) {
|
|
1916
|
+
if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0 || hasSceneHistoryDrafts()) {
|
|
1827
1917
|
throw new Error('Cannot replace the scene snapshot during an active interaction');
|
|
1828
1918
|
}
|
|
1829
1919
|
useLiveNodeOverrides.getState().clearAll();
|
|
1830
1920
|
useLiveTransforms.getState().clearAll();
|
|
1831
1921
|
pauseSceneHistory(useScene);
|
|
1832
1922
|
try {
|
|
1833
|
-
useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
|
|
1923
|
+
runAsRemoteSceneChange(() => useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
|
|
1834
1924
|
collections: snapshot.collections,
|
|
1835
1925
|
installedPlugins: snapshot.installedPlugins,
|
|
1926
|
+
hasExplicitPluginInstallState: options.explicitPluginInstallState,
|
|
1836
1927
|
materials: snapshot.materials,
|
|
1837
|
-
});
|
|
1928
|
+
}));
|
|
1838
1929
|
useScene.temporal.getState().clear();
|
|
1839
1930
|
}
|
|
1840
1931
|
finally {
|
|
@@ -1849,8 +1940,37 @@ export function applySceneSnapshot(snapshot, options) {
|
|
|
1849
1940
|
// Track previous temporal state lengths for identifying history jumps
|
|
1850
1941
|
let prevPastLength = 0;
|
|
1851
1942
|
let prevFutureLength = 0;
|
|
1943
|
+
/**
|
|
1944
|
+
* Runs one of a carry's own writes to its drafts (see history-drafts.ts) under a short pause,
|
|
1945
|
+
* and marks the adopted drafts' fields it changed as carry-owned.
|
|
1946
|
+
*/
|
|
1947
|
+
export function runSceneHistoryDraftWrite(write) {
|
|
1948
|
+
const before = useScene.getState().nodes;
|
|
1949
|
+
const wasRawPaused = !useScene.temporal.getState().isTracking && getSceneHistoryPauseDepth() === 0;
|
|
1950
|
+
const pause = beginSceneHistoryPauseSession(useScene);
|
|
1951
|
+
try {
|
|
1952
|
+
return write();
|
|
1953
|
+
}
|
|
1954
|
+
finally {
|
|
1955
|
+
noteSceneHistoryDraftWrite(before, useScene.getState().nodes);
|
|
1956
|
+
pause.end();
|
|
1957
|
+
// Legacy movers can co-mount with the overlay without owning a counted pause.
|
|
1958
|
+
if (wasRawPaused && getSceneHistoryPauseDepth() === 0)
|
|
1959
|
+
useScene.temporal.getState().pause();
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
/** Updates that revert the fields a carry still holds on `ids` (see history-drafts.ts). */
|
|
1963
|
+
export function sceneHistoryDraftRevertUpdates(ids) {
|
|
1964
|
+
return sceneHistoryDraftRevertUpdatesIn(useScene.getState().nodes, ids);
|
|
1965
|
+
}
|
|
1966
|
+
/** Registers a carried draft (see history-drafts.ts); returns the call that ends it. */
|
|
1967
|
+
export function beginSceneHistoryDraft(id, original) {
|
|
1968
|
+
return beginSceneHistoryDraftIn(id, original, useScene.getState().nodes);
|
|
1969
|
+
}
|
|
1970
|
+
export { settleSceneHistoryDrafts };
|
|
1852
1971
|
export function clearSceneHistory() {
|
|
1853
1972
|
resetSceneHistoryPauseDepth();
|
|
1973
|
+
clearSceneHistoryDrafts();
|
|
1854
1974
|
// Resetting the pause-depth counter without resuming would strand the
|
|
1855
1975
|
// temporal store in `isTracking: false` if a pause window was active when
|
|
1856
1976
|
// the scene was (re)loaded — every edit after the load would then be
|
|
@@ -1870,10 +1990,13 @@ useScene.temporal.subscribe((state, previousState) => {
|
|
|
1870
1990
|
return;
|
|
1871
1991
|
const currentPastLength = state.pastStates.length;
|
|
1872
1992
|
const currentFutureLength = state.futureStates.length;
|
|
1993
|
+
// Only the store's own undo / redo jump history: a new edit after an undo also
|
|
1994
|
+
// grows the past and drops the redo stack, and is not a redo.
|
|
1873
1995
|
// Undo: futureStates increases (state moved from past to future)
|
|
1874
1996
|
// Redo: pastStates increases while futureStates decreases (state moved from future to past)
|
|
1875
|
-
const
|
|
1876
|
-
const
|
|
1997
|
+
const jumping = isRestoringSceneHistory();
|
|
1998
|
+
const didUndo = jumping && currentFutureLength > prevFutureLength;
|
|
1999
|
+
const didRedo = jumping && currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
|
|
1877
2000
|
if (didUndo || didRedo) {
|
|
1878
2001
|
// Capture both layouts before another synchronous jump can replace them.
|
|
1879
2002
|
// The state pushed onto the opposite stack includes history-paused derived
|