@pascal-app/core 1.0.3 → 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 +1612 -127
- 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 +80 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -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/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 +18 -1
- package/dist/procedural-items/query.d.ts.map +1 -1
- package/dist/procedural-items/query.js +78 -39
- 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 +2 -0
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +6 -4
- 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 +53 -0
- package/dist/registry/types.d.ts +340 -11
- 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 +19 -7
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +21 -5
- package/dist/schema/nodes/block.d.ts +26 -0
- package/dist/schema/nodes/block.d.ts.map +1 -1
- package/dist/schema/nodes/block.js +1 -1
- 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 +5 -5
- package/dist/schema/nodes/door.d.ts +139 -20
- 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 +352 -61
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +185 -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 +3317 -68
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +7 -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/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -1
- package/dist/services/level-height.d.ts.map +1 -1
- package/dist/services/level-height.js +6 -4
- 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.map +1 -1
- package/dist/services/surface-hosting.js +4 -1
- 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 +495 -174
- 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 +416 -305
- 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 +1612 -80
- 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 +20 -1
- package/dist/systems/wall/wall-merge.d.ts.map +1 -1
- package/dist/systems/wall/wall-merge.js +189 -18
- 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 +1 -1
- package/dist/systems/wall/wall-operations.d.ts.map +1 -1
- package/dist/systems/wall/wall-operations.js +2 -1
- 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 +21 -0
- package/dist/systems/wall/wall-topology.d.ts.map +1 -1
- package/dist/systems/wall/wall-topology.js +405 -4
- 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 +36 -1
- package/package.json +36 -3
- 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,7 +907,7 @@ function sceneHistorySnapshotFromState(state) {
|
|
|
990
907
|
pendingIds.push(childId);
|
|
991
908
|
}
|
|
992
909
|
}
|
|
993
|
-
const
|
|
910
|
+
const documentNodes = {};
|
|
994
911
|
for (const [id, sourceNode] of Object.entries(nodes)) {
|
|
995
912
|
if (transientNodeIds.has(id))
|
|
996
913
|
continue;
|
|
@@ -1007,31 +924,76 @@ function sceneHistorySnapshotFromState(state) {
|
|
|
1007
924
|
node = { ...node, attachments };
|
|
1008
925
|
}
|
|
1009
926
|
if (!('children' in node && Array.isArray(node.children))) {
|
|
1010
|
-
|
|
927
|
+
documentNodes[id] = node;
|
|
1011
928
|
continue;
|
|
1012
929
|
}
|
|
1013
930
|
const children = node.children.filter((childId) => !transientNodeIds.has(childId));
|
|
1014
|
-
|
|
931
|
+
documentNodes[id] =
|
|
1015
932
|
children.length === node.children.length ? node : { ...node, children };
|
|
1016
933
|
}
|
|
1017
|
-
const
|
|
934
|
+
const documentCollections = {};
|
|
1018
935
|
for (const [id, collection] of Object.entries(collections)) {
|
|
1019
936
|
const nodeIds = collection.nodeIds.filter((nodeId) => !transientNodeIds.has(nodeId));
|
|
1020
937
|
if (collection.controlNodeId && transientNodeIds.has(collection.controlNodeId)) {
|
|
1021
938
|
const { controlNodeId: _controlNodeId, ...rest } = collection;
|
|
1022
|
-
|
|
939
|
+
documentCollections[id] = { ...rest, nodeIds };
|
|
1023
940
|
}
|
|
1024
941
|
else {
|
|
1025
|
-
|
|
942
|
+
documentCollections[id] =
|
|
1026
943
|
nodeIds.length === collection.nodeIds.length ? collection : { ...collection, nodeIds };
|
|
1027
944
|
}
|
|
1028
945
|
}
|
|
1029
946
|
return {
|
|
1030
|
-
nodes:
|
|
947
|
+
nodes: documentNodes,
|
|
1031
948
|
rootNodeIds: rootNodeIds.filter((id) => !transientNodeIds.has(id)),
|
|
1032
|
-
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,
|
|
1033
976
|
materials,
|
|
1034
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,
|
|
1035
997
|
};
|
|
1036
998
|
}
|
|
1037
999
|
/**
|
|
@@ -1091,7 +1053,26 @@ function createSceneStore(config) {
|
|
|
1091
1053
|
};
|
|
1092
1054
|
return create()(hydratedConfig);
|
|
1093
1055
|
}
|
|
1094
|
-
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) {
|
|
1095
1076
|
if (!target?.nodes) {
|
|
1096
1077
|
jump();
|
|
1097
1078
|
return;
|
|
@@ -1104,7 +1085,6 @@ function runTemporalJump(target, jump) {
|
|
|
1104
1085
|
const next = target.nodes[nodeId];
|
|
1105
1086
|
if (previous === next)
|
|
1106
1087
|
continue;
|
|
1107
|
-
// Structural hierarchy changes keep the full-level reconciliation fallback.
|
|
1108
1088
|
if ([previous, next].some((node) => node && ['site', 'building', 'level'].includes(node.type))) {
|
|
1109
1089
|
jump();
|
|
1110
1090
|
return;
|
|
@@ -1159,9 +1139,9 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1159
1139
|
setScene: (nodes, rootNodeIds, extra) => {
|
|
1160
1140
|
// Apply backward compatibility migrations
|
|
1161
1141
|
const { nodes: patchedNodes, mintedMaterials } = migrateNodes(nodes);
|
|
1162
|
-
// Scene materials minted by the
|
|
1163
|
-
// loaded palette
|
|
1164
|
-
//
|
|
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.
|
|
1165
1145
|
const materials = { ...mintedMaterials, ...(extra?.materials ?? {}) };
|
|
1166
1146
|
// Remove orphans: nodes whose parentId points to a non-existent node
|
|
1167
1147
|
const cleanedNodes = { ...patchedNodes };
|
|
@@ -1198,37 +1178,22 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1198
1178
|
installedPlugins: Array.from(new Set(extra?.installedPlugins ?? [])),
|
|
1199
1179
|
hasExplicitPluginInstallState: extra?.hasExplicitPluginInstallState ?? false,
|
|
1200
1180
|
});
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
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);
|
|
1211
1192
|
}
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
}
|
|
1216
|
-
if (hydratedNodes.some((node) => node.type === 'stair')) {
|
|
1217
|
-
// Spatial-grid subscribers must settle first. Owning this pass
|
|
1218
|
-
// here also covers opening systems that mount after the load.
|
|
1219
|
-
queueSceneNormalization(() => {
|
|
1220
|
-
if (get().hydrationId !== hydrationId)
|
|
1221
|
-
return;
|
|
1222
|
-
pauseSceneHistory(useScene);
|
|
1223
|
-
try {
|
|
1224
|
-
applyNormalization(syncStairRises(get().nodes));
|
|
1225
|
-
applyNormalization(syncAutoStairOpenings(get().nodes));
|
|
1226
|
-
}
|
|
1227
|
-
finally {
|
|
1228
|
-
resumeSceneHistory(useScene);
|
|
1229
|
-
}
|
|
1230
|
-
});
|
|
1231
|
-
}
|
|
1193
|
+
finally {
|
|
1194
|
+
resumeSceneHistory(useScene);
|
|
1195
|
+
}
|
|
1196
|
+
});
|
|
1232
1197
|
}
|
|
1233
1198
|
// Mark all nodes as dirty to trigger re-validation
|
|
1234
1199
|
Object.values(get().nodes).forEach((node) => {
|
|
@@ -1281,7 +1246,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1281
1246
|
parentId: building.id,
|
|
1282
1247
|
level: 0,
|
|
1283
1248
|
children: [],
|
|
1284
|
-
height:
|
|
1249
|
+
height: DEFAULT_LEVEL_HEIGHT,
|
|
1285
1250
|
});
|
|
1286
1251
|
// Define all nodes flat
|
|
1287
1252
|
const nodes = {
|
|
@@ -1303,33 +1268,24 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1303
1268
|
clearDirty: (id) => {
|
|
1304
1269
|
get().dirtyNodes.delete(id);
|
|
1305
1270
|
},
|
|
1306
|
-
createNodes: (ops) => nodeActions.createNodesAction(set, get, ops),
|
|
1307
|
-
createNode: (node, parentId) => nodeActions.createNodesAction(set, get, [{ node, parentId }]),
|
|
1308
|
-
applyNodeChanges: (changes) => nodeActions.applyNodeChangesAction(set, get, changes),
|
|
1309
|
-
updateNodes: (updates) => nodeActions.updateNodesAction(set, get, updates),
|
|
1310
|
-
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),
|
|
1311
1277
|
// --- DELETE ---
|
|
1312
|
-
deleteNodes: (ids) => nodeActions.deleteNodesAction(set, get, ids),
|
|
1313
|
-
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),
|
|
1314
1280
|
// --- COLLECTIONS ---
|
|
1315
1281
|
createCollection: (name, nodeIds = []) => {
|
|
1316
1282
|
if (get().readOnly)
|
|
1317
1283
|
return '';
|
|
1318
1284
|
const id = generateCollectionId();
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
const nextNodes = { ...state.nodes };
|
|
1324
|
-
for (const nodeId of nodeIds) {
|
|
1325
|
-
const node = nextNodes[nodeId];
|
|
1326
|
-
if (!node)
|
|
1327
|
-
continue;
|
|
1328
|
-
const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
|
|
1329
|
-
nextNodes[nodeId] = { ...node, collectionIds: [...existing, id] };
|
|
1330
|
-
}
|
|
1331
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1332
|
-
});
|
|
1285
|
+
set((state) => ({
|
|
1286
|
+
collections: { ...state.collections, [id]: { id, name, nodeIds: [...nodeIds] } },
|
|
1287
|
+
nodes: mirrorItemMembership(state.nodes, id, nodeIds, true),
|
|
1288
|
+
}));
|
|
1333
1289
|
return id;
|
|
1334
1290
|
},
|
|
1335
1291
|
deleteCollection: (id) => {
|
|
@@ -1339,18 +1295,10 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1339
1295
|
const col = state.collections[id];
|
|
1340
1296
|
const nextCollections = { ...state.collections };
|
|
1341
1297
|
delete nextCollections[id];
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
if (!(node && 'collectionIds' in node))
|
|
1347
|
-
continue;
|
|
1348
|
-
nextNodes[nodeId] = {
|
|
1349
|
-
...node,
|
|
1350
|
-
collectionIds: node.collectionIds.filter((cid) => cid !== id),
|
|
1351
|
-
};
|
|
1352
|
-
}
|
|
1353
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1298
|
+
return {
|
|
1299
|
+
collections: nextCollections,
|
|
1300
|
+
nodes: mirrorItemMembership(state.nodes, id, col?.nodeIds ?? [], false),
|
|
1301
|
+
};
|
|
1354
1302
|
});
|
|
1355
1303
|
},
|
|
1356
1304
|
updateCollection: (id, data) => {
|
|
@@ -1363,50 +1311,38 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1363
1311
|
return { collections: { ...state.collections, [id]: { ...col, ...data } } };
|
|
1364
1312
|
});
|
|
1365
1313
|
},
|
|
1366
|
-
addToCollection: (id,
|
|
1314
|
+
addToCollection: (id, nodeIds) => {
|
|
1367
1315
|
if (get().readOnly)
|
|
1368
1316
|
return;
|
|
1369
1317
|
set((state) => {
|
|
1370
1318
|
const col = state.collections[id];
|
|
1371
|
-
|
|
1319
|
+
const added = nodeIds.filter((nodeId) => !col?.nodeIds.includes(nodeId));
|
|
1320
|
+
if (!col || added.length === 0)
|
|
1372
1321
|
return state;
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
return { collections: nextCollections };
|
|
1380
|
-
const existing = ('collectionIds' in node ? node.collectionIds : undefined) ?? [];
|
|
1381
|
-
const nextNodes = {
|
|
1382
|
-
...state.nodes,
|
|
1383
|
-
[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),
|
|
1384
1328
|
};
|
|
1385
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1386
1329
|
});
|
|
1387
1330
|
},
|
|
1388
|
-
removeFromCollection: (id,
|
|
1331
|
+
removeFromCollection: (id, nodeIds) => {
|
|
1389
1332
|
if (get().readOnly)
|
|
1390
1333
|
return;
|
|
1391
1334
|
set((state) => {
|
|
1392
1335
|
const col = state.collections[id];
|
|
1393
|
-
|
|
1336
|
+
const removed = nodeIds.filter((nodeId) => col?.nodeIds.includes(nodeId));
|
|
1337
|
+
if (!col || removed.length === 0)
|
|
1394
1338
|
return state;
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
const node = state.nodes[nodeId];
|
|
1400
|
-
if (!(node && 'collectionIds' in node))
|
|
1401
|
-
return { collections: nextCollections };
|
|
1402
|
-
const nextNodes = {
|
|
1403
|
-
...state.nodes,
|
|
1404
|
-
[nodeId]: {
|
|
1405
|
-
...node,
|
|
1406
|
-
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)) },
|
|
1407
1343
|
},
|
|
1344
|
+
nodes: mirrorItemMembership(state.nodes, id, removed, false),
|
|
1408
1345
|
};
|
|
1409
|
-
return { collections: nextCollections, nodes: nextNodes };
|
|
1410
1346
|
});
|
|
1411
1347
|
},
|
|
1412
1348
|
// --- SCENE MATERIALS ---
|
|
@@ -1438,7 +1374,7 @@ const useScene = createSceneStore(temporal((set, get) => ({
|
|
|
1438
1374
|
},
|
|
1439
1375
|
}), {
|
|
1440
1376
|
partialize: (state) => sceneHistorySnapshotFromState(state),
|
|
1441
|
-
equality: (pastState, currentState) => areSceneSnapshotsEqual(pastState, currentState),
|
|
1377
|
+
equality: (pastState, currentState) => areSceneSnapshotsEqual({ ...pastState, nodes: withoutSceneAnnotations(pastState.nodes) }, { ...currentState, nodes: withoutSceneAnnotations(currentState.nodes) }),
|
|
1442
1378
|
onSave: (pastState, currentState) => {
|
|
1443
1379
|
notifySceneCommit({
|
|
1444
1380
|
origin: 'local',
|
|
@@ -1467,6 +1403,23 @@ const invalidateForLiveState = () => {
|
|
|
1467
1403
|
useLiveNodeOverrides.subscribe(invalidateForLiveState);
|
|
1468
1404
|
useLiveTransforms.subscribe(invalidateForLiveState);
|
|
1469
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
|
+
});
|
|
1470
1423
|
export default useScene;
|
|
1471
1424
|
let sceneReadOnlyLeaseCount = 0;
|
|
1472
1425
|
let sceneReadOnlyLeaseBaseline = false;
|
|
@@ -1523,7 +1476,8 @@ function sceneOperationPatchHasLiveConflict(beforeState, changes) {
|
|
|
1523
1476
|
return false;
|
|
1524
1477
|
}
|
|
1525
1478
|
function areScenePatchValuesEqual(left, right) {
|
|
1526
|
-
|
|
1479
|
+
// Compensation crosses JSON, which serializes both signed zeros as 0.
|
|
1480
|
+
if (left === right)
|
|
1527
1481
|
return true;
|
|
1528
1482
|
if (typeof left !== typeof right || left === null || right === null)
|
|
1529
1483
|
return false;
|
|
@@ -1537,8 +1491,10 @@ function areScenePatchValuesEqual(left, right) {
|
|
|
1537
1491
|
return false;
|
|
1538
1492
|
const leftRecord = left;
|
|
1539
1493
|
const rightRecord = right;
|
|
1540
|
-
|
|
1541
|
-
|
|
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)
|
|
1542
1498
|
return false;
|
|
1543
1499
|
return leftKeys.every((key) => Object.hasOwn(rightRecord, key) &&
|
|
1544
1500
|
areScenePatchValuesEqual(leftRecord[key], rightRecord[key]));
|
|
@@ -1617,7 +1573,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1617
1573
|
!Number.isSafeInteger(change.position) ||
|
|
1618
1574
|
change.position < 0 ||
|
|
1619
1575
|
siblings?.[change.position] !== id ||
|
|
1620
|
-
!areScenePatchValuesEqual(current, change.node)) {
|
|
1576
|
+
!areScenePatchValuesEqual(withoutSceneNodeAnnotations(current), withoutSceneNodeAnnotations(change.node))) {
|
|
1621
1577
|
return null;
|
|
1622
1578
|
}
|
|
1623
1579
|
deleteIds.add(id);
|
|
@@ -1626,11 +1582,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1626
1582
|
if (deleteIds.has(id))
|
|
1627
1583
|
return null;
|
|
1628
1584
|
}
|
|
1629
|
-
for (const node of Object.values(beforeState.nodes)) {
|
|
1630
|
-
const parentId = node.parentId ?? null;
|
|
1631
|
-
if (parentId && deleteIds.has(parentId) && !deleteIds.has(node.id))
|
|
1632
|
-
return null;
|
|
1633
|
-
}
|
|
1634
1585
|
const nextNodes = { ...beforeState.nodes };
|
|
1635
1586
|
let nextRootNodeIds = deleteIds.size > 0
|
|
1636
1587
|
? beforeState.rootNodeIds.filter((id) => !deleteIds.has(id))
|
|
@@ -1665,8 +1616,7 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1665
1616
|
if (!parent)
|
|
1666
1617
|
return null;
|
|
1667
1618
|
if (createIds.has(parentId)) {
|
|
1668
|
-
if (!('children' in parent) ||
|
|
1669
|
-
!Array.isArray(parent.children) ||
|
|
1619
|
+
if (!('children' in parent && Array.isArray(parent.children)) ||
|
|
1670
1620
|
parent.children[change.position] !== change.node.id) {
|
|
1671
1621
|
return null;
|
|
1672
1622
|
}
|
|
@@ -1676,6 +1626,66 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1676
1626
|
placements.push(change);
|
|
1677
1627
|
existingParentCreates.set(parentId, placements);
|
|
1678
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
|
+
}
|
|
1679
1689
|
const insertedRoots = insertSceneStructuralPlacements(nextRootNodeIds, rootCreates);
|
|
1680
1690
|
if (!insertedRoots)
|
|
1681
1691
|
return null;
|
|
@@ -1689,6 +1699,10 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1689
1699
|
return null;
|
|
1690
1700
|
nextNodes[parentId] = { ...parent, children };
|
|
1691
1701
|
}
|
|
1702
|
+
for (const node of Object.values(nextNodes)) {
|
|
1703
|
+
if (node.parentId && deleteIds.has(node.parentId))
|
|
1704
|
+
return null;
|
|
1705
|
+
}
|
|
1692
1706
|
for (const change of parsedCreates) {
|
|
1693
1707
|
const parentId = change.node.parentId ?? null;
|
|
1694
1708
|
const siblings = structuralSiblingIds(nextNodes, nextRootNodeIds, parentId);
|
|
@@ -1701,31 +1715,6 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1701
1715
|
return null;
|
|
1702
1716
|
}
|
|
1703
1717
|
}
|
|
1704
|
-
for (const { id, data, removeFields } of changes.nodeUpdates) {
|
|
1705
|
-
const node = nextNodes[id];
|
|
1706
|
-
if (!node ||
|
|
1707
|
-
createIds.has(id) ||
|
|
1708
|
-
deleteIds.has(id) ||
|
|
1709
|
-
updateIds.has(id) ||
|
|
1710
|
-
('id' in data && data.id !== node.id) ||
|
|
1711
|
-
('type' in data && data.type !== node.type) ||
|
|
1712
|
-
('object' in data && data.object !== node.object) ||
|
|
1713
|
-
removeFields.some((field) => field === 'id' || field === 'object' || field === 'type' || Object.hasOwn(data, field))) {
|
|
1714
|
-
return null;
|
|
1715
|
-
}
|
|
1716
|
-
updateIds.add(id);
|
|
1717
|
-
const candidate = { ...node, ...data };
|
|
1718
|
-
for (const field of removeFields)
|
|
1719
|
-
delete candidate[field];
|
|
1720
|
-
const validated = parseSceneOperationPatchNode(candidate);
|
|
1721
|
-
if (!validated ||
|
|
1722
|
-
validated.id !== id ||
|
|
1723
|
-
validated.type !== node.type ||
|
|
1724
|
-
validated.object !== node.object) {
|
|
1725
|
-
return null;
|
|
1726
|
-
}
|
|
1727
|
-
nextNodes[id] = candidate;
|
|
1728
|
-
}
|
|
1729
1718
|
const materials = changes.materialChanges.length > 0 ? { ...beforeState.materials } : beforeState.materials;
|
|
1730
1719
|
for (const { id, material } of changes.materialChanges) {
|
|
1731
1720
|
if (materialIds.has(id) ||
|
|
@@ -1738,16 +1727,87 @@ function sceneOperationPatchNextState(beforeState, changes) {
|
|
|
1738
1727
|
else
|
|
1739
1728
|
materials[id] = material;
|
|
1740
1729
|
}
|
|
1741
|
-
|
|
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
|
+
};
|
|
1742
1777
|
}
|
|
1743
|
-
export function applySceneOperationPatch(changes) {
|
|
1778
|
+
export function applySceneOperationPatch(changes, options = {}) {
|
|
1744
1779
|
const beforeState = useScene.getState();
|
|
1745
1780
|
if (changes.nodeUpdates.length === 0 &&
|
|
1746
1781
|
changes.materialChanges.length === 0 &&
|
|
1747
1782
|
changes.nodeCreates.length === 0 &&
|
|
1748
|
-
changes.nodeDeletes.length === 0
|
|
1783
|
+
changes.nodeDeletes.length === 0 &&
|
|
1784
|
+
!changes.pluginChanges?.length &&
|
|
1785
|
+
!changes.collectionChanges?.length &&
|
|
1786
|
+
!changes.pluginInstallState) {
|
|
1787
|
+
return false;
|
|
1788
|
+
}
|
|
1789
|
+
if (options.undoable &&
|
|
1790
|
+
!(useScene.temporal.getState().isTracking &&
|
|
1791
|
+
getSceneHistoryPauseDepth() === 0 &&
|
|
1792
|
+
!hasSceneHistoryDrafts())) {
|
|
1749
1793
|
return false;
|
|
1750
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;
|
|
1751
1811
|
if (sceneOperationPatchHasLiveConflict(beforeState, changes))
|
|
1752
1812
|
return false;
|
|
1753
1813
|
const next = sceneOperationPatchNextState(beforeState, changes);
|
|
@@ -1758,7 +1818,7 @@ export function applySceneOperationPatch(changes) {
|
|
|
1758
1818
|
if (shouldScopeHistoryPause)
|
|
1759
1819
|
pauseSceneHistory(useScene);
|
|
1760
1820
|
try {
|
|
1761
|
-
useScene.setState(next);
|
|
1821
|
+
runAsRemoteSceneChange(() => useScene.setState(next));
|
|
1762
1822
|
}
|
|
1763
1823
|
finally {
|
|
1764
1824
|
if (shouldScopeHistoryPause)
|
|
@@ -1777,6 +1837,12 @@ export function applySceneOperationPatch(changes) {
|
|
|
1777
1837
|
}
|
|
1778
1838
|
if (areSceneSnapshotsEqual(before, current))
|
|
1779
1839
|
return false;
|
|
1840
|
+
if (options.undoable) {
|
|
1841
|
+
useScene.temporal.setState(({ pastStates }) => ({
|
|
1842
|
+
pastStates: [...pastStates, before],
|
|
1843
|
+
futureStates: [],
|
|
1844
|
+
}));
|
|
1845
|
+
}
|
|
1780
1846
|
for (const id of touchedNodeIds) {
|
|
1781
1847
|
if (current.nodes[id])
|
|
1782
1848
|
currentState.markDirty(id);
|
|
@@ -1816,10 +1882,22 @@ export function applySceneOperationPatch(changes) {
|
|
|
1816
1882
|
currentState.markDirty(node.parentId);
|
|
1817
1883
|
}
|
|
1818
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
|
+
}
|
|
1819
1897
|
for (const { node } of changes.nodeDeletes)
|
|
1820
1898
|
currentState.clearDirty(node.id);
|
|
1821
1899
|
notifySceneCommit({
|
|
1822
|
-
origin: 'host',
|
|
1900
|
+
origin: options.annotation ? 'local' : 'host',
|
|
1823
1901
|
before,
|
|
1824
1902
|
current,
|
|
1825
1903
|
});
|
|
@@ -1835,18 +1913,19 @@ export function applyScenePatch(changes) {
|
|
|
1835
1913
|
export function applySceneSnapshot(snapshot, options) {
|
|
1836
1914
|
const before = sceneHistorySnapshotFromState(useScene.getState());
|
|
1837
1915
|
const temporalState = useScene.temporal.getState();
|
|
1838
|
-
if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0) {
|
|
1916
|
+
if (!temporalState.isTracking || getSceneHistoryPauseDepth() > 0 || hasSceneHistoryDrafts()) {
|
|
1839
1917
|
throw new Error('Cannot replace the scene snapshot during an active interaction');
|
|
1840
1918
|
}
|
|
1841
1919
|
useLiveNodeOverrides.getState().clearAll();
|
|
1842
1920
|
useLiveTransforms.getState().clearAll();
|
|
1843
1921
|
pauseSceneHistory(useScene);
|
|
1844
1922
|
try {
|
|
1845
|
-
useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
|
|
1923
|
+
runAsRemoteSceneChange(() => useScene.getState().setScene(snapshot.nodes, snapshot.rootNodeIds, {
|
|
1846
1924
|
collections: snapshot.collections,
|
|
1847
1925
|
installedPlugins: snapshot.installedPlugins,
|
|
1926
|
+
hasExplicitPluginInstallState: options.explicitPluginInstallState,
|
|
1848
1927
|
materials: snapshot.materials,
|
|
1849
|
-
});
|
|
1928
|
+
}));
|
|
1850
1929
|
useScene.temporal.getState().clear();
|
|
1851
1930
|
}
|
|
1852
1931
|
finally {
|
|
@@ -1861,8 +1940,37 @@ export function applySceneSnapshot(snapshot, options) {
|
|
|
1861
1940
|
// Track previous temporal state lengths for identifying history jumps
|
|
1862
1941
|
let prevPastLength = 0;
|
|
1863
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 };
|
|
1864
1971
|
export function clearSceneHistory() {
|
|
1865
1972
|
resetSceneHistoryPauseDepth();
|
|
1973
|
+
clearSceneHistoryDrafts();
|
|
1866
1974
|
// Resetting the pause-depth counter without resuming would strand the
|
|
1867
1975
|
// temporal store in `isTracking: false` if a pause window was active when
|
|
1868
1976
|
// the scene was (re)loaded — every edit after the load would then be
|
|
@@ -1882,10 +1990,13 @@ useScene.temporal.subscribe((state, previousState) => {
|
|
|
1882
1990
|
return;
|
|
1883
1991
|
const currentPastLength = state.pastStates.length;
|
|
1884
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.
|
|
1885
1995
|
// Undo: futureStates increases (state moved from past to future)
|
|
1886
1996
|
// Redo: pastStates increases while futureStates decreases (state moved from future to past)
|
|
1887
|
-
const
|
|
1888
|
-
const
|
|
1997
|
+
const jumping = isRestoringSceneHistory();
|
|
1998
|
+
const didUndo = jumping && currentFutureLength > prevFutureLength;
|
|
1999
|
+
const didRedo = jumping && currentPastLength > prevPastLength && currentFutureLength < prevFutureLength;
|
|
1889
2000
|
if (didUndo || didRedo) {
|
|
1890
2001
|
// Capture both layouts before another synchronous jump can replace them.
|
|
1891
2002
|
// The state pushed onto the opposite stack includes history-paused derived
|