@pascal-app/core 1.0.0-beta.4 → 1.0.0
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/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/capture/index.d.ts +3 -0
- package/dist/capture/index.d.ts.map +1 -0
- package/dist/capture/index.js +2 -0
- package/dist/capture/schema.d.ts +417 -0
- package/dist/capture/schema.d.ts.map +1 -0
- package/dist/capture/schema.js +348 -0
- package/dist/capture/source.d.ts +60 -0
- package/dist/capture/source.d.ts.map +1 -0
- package/dist/capture/source.js +254 -0
- package/dist/events/bus.d.ts +55 -7
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
- package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
- package/dist/events/hidden-wall-pointer-hold.js +37 -0
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +12 -0
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +39 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2785 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +132 -19
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/support-host-patch.js +171 -6
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -5
- package/dist/lib/asset-storage.d.ts.map +1 -1
- package/dist/lib/asset-storage.js +4 -1
- package/dist/lib/polygon-union.d.ts +4 -0
- package/dist/lib/polygon-union.d.ts.map +1 -0
- package/dist/lib/polygon-union.js +306 -0
- package/dist/lib/roof-overlap.d.ts +32 -0
- package/dist/lib/roof-overlap.d.ts.map +1 -0
- package/dist/lib/roof-overlap.js +72 -0
- package/dist/lib/room-topology-index.d.ts +50 -0
- package/dist/lib/room-topology-index.d.ts.map +1 -0
- package/dist/lib/room-topology-index.js +237 -0
- package/dist/lib/slab-polygon.d.ts +35 -2
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +133 -27
- package/dist/lib/space-detection.d.ts +40 -3
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +890 -246
- package/dist/registry/handles.d.ts +24 -3
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +3 -3
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/registry/registry.d.ts +29 -6
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +111 -4
- package/dist/registry/scene-api.d.ts +16 -0
- package/dist/registry/scene-api.d.ts.map +1 -1
- package/dist/registry/scene-api.js +49 -1
- package/dist/registry/types.d.ts +261 -13
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/use-registry-version.d.ts +11 -0
- package/dist/registry/use-registry-version.d.ts.map +1 -0
- package/dist/registry/use-registry-version.js +15 -0
- package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
- package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
- package/dist/schema/__bench__/node-parsers.bench.js +314 -0
- package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
- package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
- package/dist/schema/__fixtures__/node-fixtures.js +125 -0
- package/dist/schema/base.d.ts +1 -1
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +8 -1
- package/dist/schema/compiled-node-parsers.d.ts +40 -0
- package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
- package/dist/schema/compiled-node-parsers.js +95 -0
- package/dist/schema/index.d.ts +20 -15
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +19 -12
- package/dist/schema/material.d.ts +2 -1
- package/dist/schema/material.d.ts.map +1 -1
- package/dist/schema/material.js +1 -0
- package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
- package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
- package/dist/schema/nodes/automatic-downspout.js +237 -0
- package/dist/schema/nodes/block.d.ts +107 -0
- package/dist/schema/nodes/block.d.ts.map +1 -0
- package/dist/schema/nodes/block.js +207 -0
- package/dist/schema/nodes/box-vent.d.ts +8 -2
- package/dist/schema/nodes/box-vent.d.ts.map +1 -1
- package/dist/schema/nodes/box-vent.js +2 -0
- package/dist/schema/nodes/building.d.ts +1 -1
- package/dist/schema/nodes/cabinet.d.ts +25 -3
- package/dist/schema/nodes/cabinet.d.ts.map +1 -1
- package/dist/schema/nodes/cabinet.js +26 -5
- package/dist/schema/nodes/ceiling.d.ts +1 -1
- package/dist/schema/nodes/chimney.d.ts +2 -2
- package/dist/schema/nodes/column.d.ts +6 -6
- package/dist/schema/nodes/construction-dimension.d.ts +4 -4
- package/dist/schema/nodes/cupola.d.ts +9 -1
- package/dist/schema/nodes/cupola.d.ts.map +1 -1
- package/dist/schema/nodes/cupola.js +2 -0
- package/dist/schema/nodes/door.d.ts +1 -1
- package/dist/schema/nodes/dormer.d.ts +44 -1
- package/dist/schema/nodes/dormer.d.ts.map +1 -1
- package/dist/schema/nodes/dormer.js +131 -7
- package/dist/schema/nodes/downspout.d.ts +11 -1
- package/dist/schema/nodes/downspout.d.ts.map +1 -1
- package/dist/schema/nodes/downspout.js +24 -0
- package/dist/schema/nodes/duct-fitting.d.ts +18 -1
- package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/duct-fitting.js +25 -4
- package/dist/schema/nodes/duct-segment.d.ts +23 -1
- package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
- package/dist/schema/nodes/duct-segment.js +20 -0
- package/dist/schema/nodes/duct-terminal.d.ts +1 -1
- package/dist/schema/nodes/elevator.d.ts +1 -1
- package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
- package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
- package/dist/schema/nodes/eyebrow-vent.js +2 -0
- package/dist/schema/nodes/fence.d.ts +1 -1
- package/dist/schema/nodes/guide.d.ts +1 -1
- package/dist/schema/nodes/gutter.d.ts +36 -2
- package/dist/schema/nodes/gutter.d.ts.map +1 -1
- package/dist/schema/nodes/gutter.js +308 -1
- package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
- package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
- package/dist/schema/nodes/hanger-overrides.js +6 -0
- package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
- package/dist/schema/nodes/item.d.ts +4 -3
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +5 -0
- package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
- package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
- package/dist/schema/nodes/lean-to-extension.js +114 -0
- package/dist/schema/nodes/level.d.ts +5 -2
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +9 -0
- package/dist/schema/nodes/lineset.d.ts +1 -1
- package/dist/schema/nodes/liquid-line.d.ts +1 -1
- package/dist/schema/nodes/measurement.d.ts +1 -1
- package/dist/schema/nodes/pipe-fitting.d.ts +9 -1
- package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-fitting.js +6 -2
- package/dist/schema/nodes/pipe-segment.d.ts +23 -1
- package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
- package/dist/schema/nodes/pipe-segment.js +20 -0
- package/dist/schema/nodes/pipe-trap.d.ts +1 -1
- package/dist/schema/nodes/ridge-vent.d.ts +1 -1
- package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
- package/dist/schema/nodes/ridge-vent.js +4 -1
- package/dist/schema/nodes/roof-segment-shape.d.ts +4 -0
- package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-shape.js +64 -1
- package/dist/schema/nodes/roof-segment-walls.d.ts +3 -1
- package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment-walls.js +1 -1
- package/dist/schema/nodes/roof-segment.d.ts +41 -1
- package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
- package/dist/schema/nodes/roof-segment.js +79 -2
- package/dist/schema/nodes/roof.d.ts +22 -1
- package/dist/schema/nodes/roof.d.ts.map +1 -1
- package/dist/schema/nodes/roof.js +14 -0
- package/dist/schema/nodes/scan.d.ts +19 -2
- package/dist/schema/nodes/scan.d.ts.map +1 -1
- package/dist/schema/nodes/scan.js +11 -1
- package/dist/schema/nodes/shelf.d.ts +2 -2
- package/dist/schema/nodes/site.d.ts +1 -1
- package/dist/schema/nodes/skylight.d.ts +1 -1
- package/dist/schema/nodes/slab.d.ts +1 -1
- package/dist/schema/nodes/solar-panel.d.ts +1 -1
- package/dist/schema/nodes/spawn.d.ts +1 -1
- package/dist/schema/nodes/stair-segment.d.ts +1 -1
- package/dist/schema/nodes/stair.d.ts +1 -1
- package/dist/schema/nodes/structural-grid.d.ts +1 -1
- package/dist/schema/nodes/turbine-vent.d.ts +7 -1
- package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
- package/dist/schema/nodes/turbine-vent.js +2 -0
- package/dist/schema/nodes/wall.d.ts +4 -4
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +7 -1
- package/dist/schema/nodes/window.d.ts +10 -3
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +4 -0
- package/dist/schema/nodes/zone.d.ts +2 -2
- package/dist/schema/nodes/zone.js +1 -1
- package/dist/schema/types.d.ts +485 -109
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +27 -1
- package/dist/services/hosting.d.ts +2 -2
- package/dist/services/hosting.d.ts.map +1 -1
- package/dist/services/hosting.js +4 -4
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -2
- package/dist/services/storey.d.ts +3 -10
- package/dist/services/storey.d.ts.map +1 -1
- package/dist/services/storey.js +45 -15
- package/dist/services/system-graph.d.ts +11 -0
- package/dist/services/system-graph.d.ts.map +1 -1
- package/dist/services/system-graph.js +35 -5
- package/dist/store/actions/node-actions.d.ts +15 -4
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +458 -19
- package/dist/store/history-control.d.ts +5 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +68 -6
- package/dist/store/history-invalidation.d.ts +3 -0
- package/dist/store/history-invalidation.d.ts.map +1 -0
- package/dist/store/history-invalidation.js +72 -0
- package/dist/store/scene-hydration.d.ts +5 -0
- package/dist/store/scene-hydration.d.ts.map +1 -0
- package/dist/store/scene-hydration.js +57 -0
- package/dist/store/use-scene.d.ts +3 -0
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +407 -227
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +16 -11
- package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
- package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
- package/dist/systems/roof/roof-elevation-system.js +94 -0
- package/dist/systems/roof/roof-elevation.d.ts +4 -0
- package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
- package/dist/systems/roof/roof-elevation.js +95 -0
- package/dist/systems/roof/roof-footprint.d.ts +17 -0
- package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
- package/dist/systems/roof/roof-footprint.js +83 -0
- package/dist/systems/slab/slab-support.d.ts +0 -31
- package/dist/systems/slab/slab-support.d.ts.map +1 -1
- package/dist/systems/slab/slab-support.js +26 -4
- package/dist/systems/stair/stair-flight.d.ts +17 -0
- package/dist/systems/stair/stair-flight.d.ts.map +1 -0
- package/dist/systems/stair/stair-flight.js +27 -0
- package/dist/systems/stair/stair-opening-preview.d.ts +1556 -1328
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.d.ts +1 -0
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +93 -96
- package/dist/systems/stair/stair-rise.js +21 -20
- package/dist/systems/wall/wall-curve.d.ts +1 -0
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +73 -0
- package/dist/systems/wall/wall-footprint.d.ts +1 -0
- package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
- package/dist/systems/wall/wall-footprint.js +1 -0
- package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
- package/dist/systems/wall/wall-mitering.js +88 -9
- package/dist/systems/wall/wall-topology.d.ts +53 -0
- package/dist/systems/wall/wall-topology.d.ts.map +1 -0
- package/dist/systems/wall/wall-topology.js +414 -0
- package/dist/utils/clone-scene-graph.d.ts +2 -0
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +39 -2
- package/dist/utils/scene-migrations.d.ts +1 -0
- package/dist/utils/scene-migrations.d.ts.map +1 -1
- package/dist/utils/scene-migrations.js +1 -0
- package/dist/utils/vertical-scene-migration.d.ts +13 -0
- package/dist/utils/vertical-scene-migration.d.ts.map +1 -0
- package/dist/utils/vertical-scene-migration.js +179 -0
- package/dist/validation/validate-build-json.d.ts +3 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +49 -2
- package/package.json +10 -3
- package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
- package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-runtime-system.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stair-opening-preview.d.ts","sourceRoot":"","sources":["../../../src/systems/stair/stair-opening-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC7E,OAA6B,EAAE,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAGpE,KAAK,oBAAoB,GAAG;IAC1B,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAA;CACtC,CAAA;AAoBD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAClD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,WAYvC;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAClD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"stair-opening-preview.d.ts","sourceRoot":"","sources":["../../../src/systems/stair/stair-opening-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC7E,OAA6B,EAAE,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAGpE,KAAK,oBAAoB,GAAG;IAC1B,EAAE,EAAE,SAAS,CAAA;IACb,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,WAAW,CAAC,CAAA;CACtC,CAAA;AAoBD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAClD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,WAYvC;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,EAClD,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwBvC;AAED,wBAAgB,qCAAqC;;mBAUlC,oBAAoB,EAAE;;EAiCxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stair-opening-system.d.ts","sourceRoot":"","sources":["../../../src/systems/stair/stair-opening-system.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stair-opening-system.d.ts","sourceRoot":"","sources":["../../../src/systems/stair/stair-opening-system.tsx"],"names":[],"mappings":"AA6CA,wBAAgB,0BAA0B,eAsGzC;AAED,eAAO,MAAM,kBAAkB,YAG9B,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useEffect
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
3
|
import { pauseSceneHistory, resumeSceneHistory } from '../../store/history-control';
|
|
4
|
+
import { queueSceneNormalization } from '../../store/scene-hydration';
|
|
4
5
|
import useLiveNodeOverrides from '../../store/use-live-node-overrides';
|
|
5
6
|
import useLiveTransforms from '../../store/use-live-transforms';
|
|
6
7
|
import useScene from '../../store/use-scene';
|
|
@@ -29,104 +30,100 @@ function hasOpeningRelevantNodeChange(nextNodes, prevNodes) {
|
|
|
29
30
|
}
|
|
30
31
|
return false;
|
|
31
32
|
}
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
previewControllerRef.current.apply(updates);
|
|
55
|
-
queueMicrotask(() => {
|
|
56
|
-
syncingPreviewOpeningsRef.current = false;
|
|
57
|
-
});
|
|
58
|
-
};
|
|
59
|
-
const clearPreviewUpdates = () => {
|
|
60
|
-
if (previewControllerRef.current.previewSurfaceIds.size === 0)
|
|
61
|
-
return;
|
|
62
|
-
syncingPreviewOpeningsRef.current = true;
|
|
63
|
-
previewControllerRef.current.clear();
|
|
64
|
-
queueMicrotask(() => {
|
|
65
|
-
syncingPreviewOpeningsRef.current = false;
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
const refreshLivePreview = () => {
|
|
69
|
-
if (syncingPreviewOpeningsRef.current)
|
|
70
|
-
return;
|
|
71
|
-
const nodes = useScene.getState().nodes;
|
|
72
|
-
const liveTransforms = useLiveTransforms.getState().transforms;
|
|
73
|
-
const liveOverrides = useLiveNodeOverrides.getState().overrides;
|
|
74
|
-
const previewSurfaceIds = previewControllerRef.current.previewSurfaceIds;
|
|
75
|
-
if (!hasLiveStairOpeningInputs(nodes, liveTransforms, liveOverrides, previewSurfaceIds)) {
|
|
76
|
-
clearPreviewUpdates();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
applyPreviewUpdates(syncAutoStairOpenings(getNodesWithLiveStairOpeningInputs(nodes, liveTransforms, liveOverrides, previewSurfaceIds)));
|
|
80
|
-
};
|
|
81
|
-
const runAutoSync = () => {
|
|
82
|
-
// Rise first: straight stairs converge their flight heights to the
|
|
83
|
-
// resolved rise (level height or deck elevation), and the opening pass
|
|
84
|
-
// reads those segment heights — so it must run against the post-rise
|
|
85
|
-
// nodes.
|
|
86
|
-
applyUpdates(syncStairRises(useScene.getState().nodes));
|
|
87
|
-
applyUpdates(syncAutoStairOpenings(useScene.getState().nodes));
|
|
88
|
-
};
|
|
89
|
-
let disposed = false;
|
|
90
|
-
let autoSyncQueued = false;
|
|
91
|
-
const scheduleAutoSync = () => {
|
|
92
|
-
if (autoSyncQueued)
|
|
93
|
-
return;
|
|
94
|
-
autoSyncQueued = true;
|
|
95
|
-
// One microtask later so every other scene-store listener for the
|
|
96
|
-
// triggering transition (and, at mount, the editor's spatial-grid
|
|
97
|
-
// init) runs first — the spatial-grid sync in particular. The
|
|
98
|
-
// deck-attached rise elects the stair's floor-stack base elevation
|
|
99
|
-
// through the spatial grid; syncing before the grid listener would
|
|
100
|
-
// rescale flights against the pre-transition slab state.
|
|
101
|
-
queueMicrotask(() => {
|
|
102
|
-
autoSyncQueued = false;
|
|
103
|
-
if (disposed)
|
|
104
|
-
return;
|
|
105
|
-
runAutoSync();
|
|
106
|
-
refreshLivePreview();
|
|
107
|
-
});
|
|
108
|
-
};
|
|
109
|
-
scheduleAutoSync();
|
|
110
|
-
const unsubscribeScene = useScene.subscribe((state, prevState) => {
|
|
111
|
-
if (syncingAutoOpeningsRef.current)
|
|
112
|
-
return;
|
|
113
|
-
if (!hasOpeningRelevantNodeChange(state.nodes, prevState.nodes))
|
|
114
|
-
return;
|
|
115
|
-
scheduleAutoSync();
|
|
33
|
+
export function initializeStairOpeningSync() {
|
|
34
|
+
let syncingAutoOpenings = false;
|
|
35
|
+
let syncingPreviewOpenings = false;
|
|
36
|
+
const previewController = createSurfaceOpeningPreviewController();
|
|
37
|
+
const applyUpdates = (updates) => {
|
|
38
|
+
if (updates.length === 0)
|
|
39
|
+
return;
|
|
40
|
+
syncingAutoOpenings = true;
|
|
41
|
+
pauseSceneHistory(useScene);
|
|
42
|
+
try {
|
|
43
|
+
useScene.getState().updateNodes(updates);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
resumeSceneHistory(useScene);
|
|
47
|
+
syncingAutoOpenings = false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const applyPreviewUpdates = (updates) => {
|
|
51
|
+
syncingPreviewOpenings = true;
|
|
52
|
+
previewController.apply(updates);
|
|
53
|
+
queueMicrotask(() => {
|
|
54
|
+
syncingPreviewOpenings = false;
|
|
116
55
|
});
|
|
117
|
-
|
|
118
|
-
|
|
56
|
+
};
|
|
57
|
+
const clearPreviewUpdates = () => {
|
|
58
|
+
if (previewController.previewSurfaceIds.size === 0)
|
|
59
|
+
return;
|
|
60
|
+
syncingPreviewOpenings = true;
|
|
61
|
+
previewController.clear();
|
|
62
|
+
queueMicrotask(() => {
|
|
63
|
+
syncingPreviewOpenings = false;
|
|
119
64
|
});
|
|
120
|
-
|
|
65
|
+
};
|
|
66
|
+
const refreshLivePreview = () => {
|
|
67
|
+
if (syncingPreviewOpenings)
|
|
68
|
+
return;
|
|
69
|
+
const nodes = useScene.getState().nodes;
|
|
70
|
+
const liveTransforms = useLiveTransforms.getState().transforms;
|
|
71
|
+
const liveOverrides = useLiveNodeOverrides.getState().overrides;
|
|
72
|
+
const previewSurfaceIds = previewController.previewSurfaceIds;
|
|
73
|
+
if (!hasLiveStairOpeningInputs(nodes, liveTransforms, liveOverrides, previewSurfaceIds)) {
|
|
74
|
+
clearPreviewUpdates();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
applyPreviewUpdates(syncAutoStairOpenings(getNodesWithLiveStairOpeningInputs(nodes, liveTransforms, liveOverrides, previewSurfaceIds)));
|
|
78
|
+
};
|
|
79
|
+
const runAutoSync = () => {
|
|
80
|
+
// Rise first: straight stairs converge their flight heights to the
|
|
81
|
+
// resolved rise (level height or deck elevation), and the opening pass
|
|
82
|
+
// reads those segment heights — so it must run against the post-rise
|
|
83
|
+
// nodes.
|
|
84
|
+
applyUpdates(syncStairRises(useScene.getState().nodes));
|
|
85
|
+
applyUpdates(syncAutoStairOpenings(useScene.getState().nodes));
|
|
86
|
+
};
|
|
87
|
+
let disposed = false;
|
|
88
|
+
let syncGeneration = 0;
|
|
89
|
+
const scheduleAutoSync = () => {
|
|
90
|
+
const generation = ++syncGeneration;
|
|
91
|
+
// One microtask later so every other scene-store listener for the
|
|
92
|
+
// triggering transition (and, at mount, the editor's spatial-grid
|
|
93
|
+
// init) runs first — the spatial-grid sync in particular. The
|
|
94
|
+
// deck-attached rise elects the stair's floor-stack base elevation
|
|
95
|
+
// through the spatial grid; syncing before the grid listener would
|
|
96
|
+
// rescale flights against the pre-transition slab state.
|
|
97
|
+
queueSceneNormalization(() => {
|
|
98
|
+
if (disposed || generation !== syncGeneration)
|
|
99
|
+
return;
|
|
100
|
+
runAutoSync();
|
|
121
101
|
refreshLivePreview();
|
|
122
102
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
103
|
+
};
|
|
104
|
+
scheduleAutoSync();
|
|
105
|
+
const unsubscribeScene = useScene.subscribe((state, prevState) => {
|
|
106
|
+
if (syncingAutoOpenings)
|
|
107
|
+
return;
|
|
108
|
+
if (!hasOpeningRelevantNodeChange(state.nodes, prevState.nodes))
|
|
109
|
+
return;
|
|
110
|
+
scheduleAutoSync();
|
|
111
|
+
});
|
|
112
|
+
const unsubscribeLiveTransforms = useLiveTransforms.subscribe(() => {
|
|
113
|
+
refreshLivePreview();
|
|
114
|
+
});
|
|
115
|
+
const unsubscribeLiveOverrides = useLiveNodeOverrides.subscribe(() => {
|
|
116
|
+
refreshLivePreview();
|
|
117
|
+
});
|
|
118
|
+
return () => {
|
|
119
|
+
disposed = true;
|
|
120
|
+
unsubscribeScene();
|
|
121
|
+
unsubscribeLiveTransforms();
|
|
122
|
+
unsubscribeLiveOverrides();
|
|
123
|
+
previewController.clear();
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export const StairOpeningSystem = () => {
|
|
127
|
+
useEffect(() => initializeStairOpeningSync(), []);
|
|
131
128
|
return null;
|
|
132
129
|
};
|
|
@@ -1,33 +1,34 @@
|
|
|
1
1
|
import { getFloorStackedPosition } from '../../hooks/spatial-grid/floor-placed-elevation';
|
|
2
2
|
import { DEFAULT_LEVEL_HEIGHT } from '../../services/level-height';
|
|
3
|
-
import {
|
|
3
|
+
import { getLevelFloorToFloorHeight } from '../../services/storey';
|
|
4
4
|
export function resolveStairTotalRise(stair, nodes) {
|
|
5
5
|
if (stair.totalRise !== undefined)
|
|
6
6
|
return stair.totalRise;
|
|
7
7
|
const level = Object.values(nodes).find((node) => node.type === 'level' && node.children.includes(stair.id));
|
|
8
|
+
// Both destinations are absolute level-local heights, while the stair's own
|
|
9
|
+
// base may be lifted onto a floor slab by the floor-stack
|
|
10
|
+
// (`FloorElevationSystem` / `syncStairGroupElevation` put the group at
|
|
11
|
+
// `position[1] + elected slab elevation`). The rise is measured from that
|
|
12
|
+
// base, so subtract it — electing the base exactly the way the visual
|
|
13
|
+
// systems do (persisted `supportSlabId` honored, uncapped election
|
|
14
|
+
// otherwise) keeps base + rise landing precisely on the destination surface.
|
|
15
|
+
const baseElevation = getFloorStackedPosition({
|
|
16
|
+
node: stair,
|
|
17
|
+
nodes,
|
|
18
|
+
position: stair.position,
|
|
19
|
+
rotation: stair.rotation,
|
|
20
|
+
levelId: level?.id ?? null,
|
|
21
|
+
})[1];
|
|
8
22
|
if (stair.deckSlabId) {
|
|
23
|
+
// The deck's `elevation` IS its walking surface (level-local). A stale
|
|
24
|
+
// reference (deck gone) falls through to the level-derived rise.
|
|
9
25
|
const deck = nodes[stair.deckSlabId];
|
|
10
|
-
|
|
11
|
-
// stair's own base may be lifted onto a floor slab by the floor-stack
|
|
12
|
-
// (`FloorElevationSystem` / `syncStairGroupElevation` put the group at
|
|
13
|
-
// `position[1] + elected slab elevation`). The rise is measured from
|
|
14
|
-
// that base, so subtract it — electing the base exactly the way the
|
|
15
|
-
// visual systems do (persisted `supportSlabId` honored, uncapped
|
|
16
|
-
// election otherwise) keeps base + rise landing precisely on the deck's
|
|
17
|
-
// walking surface. A stale reference (deck gone) falls through to the
|
|
18
|
-
// level-derived rise.
|
|
19
|
-
if (deck?.type === 'slab') {
|
|
20
|
-
const baseElevation = getFloorStackedPosition({
|
|
21
|
-
node: stair,
|
|
22
|
-
nodes,
|
|
23
|
-
position: stair.position,
|
|
24
|
-
rotation: stair.rotation,
|
|
25
|
-
levelId: level?.id ?? null,
|
|
26
|
-
})[1];
|
|
26
|
+
if (deck?.type === 'slab')
|
|
27
27
|
return (deck.elevation ?? 0.05) - baseElevation;
|
|
28
|
-
}
|
|
29
28
|
}
|
|
30
|
-
|
|
29
|
+
if (level?.type !== 'level')
|
|
30
|
+
return DEFAULT_LEVEL_HEIGHT;
|
|
31
|
+
return getLevelFloorToFloorHeight(level.id, nodes) - baseElevation;
|
|
31
32
|
}
|
|
32
33
|
const RISE_SYNC_EPSILON = 1e-4;
|
|
33
34
|
/**
|
|
@@ -47,6 +47,7 @@ export declare function getWallArcData(wall: WallCurveLike): {
|
|
|
47
47
|
export declare function getWallCurveFrameAt(wall: WallCurveLike, t: number): CurveFrame;
|
|
48
48
|
export declare function getWallMidpointHandlePoint(wall: WallCurveLike): Point2D;
|
|
49
49
|
export declare function sampleWallCenterline(wall: WallCurveLike, segments?: number): Point2D[];
|
|
50
|
+
export declare function constrainWallCurveOffsetToAvoidIntersections(wall: WallNode, proposedOffset: number, walls: readonly WallNode[]): number;
|
|
50
51
|
export declare function getWallCurveLength(wall: WallCurveLike, segments?: number): number;
|
|
51
52
|
export declare function getWallSurfacePolygon(wall: Pick<WallNode | FenceNode, 'start' | 'end' | 'curveOffset' | 'thickness'>, segments?: number, miterOverrides?: WallSurfaceMiterOverrides): Point2D[];
|
|
52
53
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wall-curve.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-curve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"wall-curve.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-curve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAO9C,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,CAAC,CAAA;AAEhF,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,KAAK,yBAAyB,GAAG;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAcD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAE9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,UAErD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,UAExD;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,aAAa,UAE5D;AAWD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,UAG3E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,aAAa,UAI5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,WAE/C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa;;;;;;;;;;;;;EA6BpD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa;;;;;;;;;SA2BjD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAwC9E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,aAAa,WAE7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,SAA0B,aAM3F;AAgED,wBAAgB,4CAA4C,CAC1D,IAAI,EAAE,QAAQ,EACd,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,SAAS,QAAQ,EAAE,UAoB3B;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,SAA0B,UASzF;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAC,EAC/E,QAAQ,SAA0B,EAClC,cAAc,CAAC,EAAE,yBAAyB,aA2B3C"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const CURVE_EPSILON = 1e-6;
|
|
2
2
|
const DEFAULT_SAMPLE_SEGMENTS = 24;
|
|
3
|
+
const CURVE_INTERSECTION_SEARCH_STEPS = 20;
|
|
4
|
+
const CURVE_INTERSECTION_TOLERANCE = 1e-6;
|
|
3
5
|
function clamp01(value) {
|
|
4
6
|
return Math.max(0, Math.min(1, value));
|
|
5
7
|
}
|
|
@@ -142,6 +144,77 @@ export function sampleWallCenterline(wall, segments = DEFAULT_SAMPLE_SEGMENTS) {
|
|
|
142
144
|
const count = Math.max(1, segments);
|
|
143
145
|
return Array.from({ length: count + 1 }, (_, index) => getWallCurveFrameAt(wall, index / count).point);
|
|
144
146
|
}
|
|
147
|
+
function segmentIntersectionPoint(a, b, c, d) {
|
|
148
|
+
const abX = b.x - a.x;
|
|
149
|
+
const abY = b.y - a.y;
|
|
150
|
+
const cdX = d.x - c.x;
|
|
151
|
+
const cdY = d.y - c.y;
|
|
152
|
+
const denominator = abX * cdY - abY * cdX;
|
|
153
|
+
if (Math.abs(denominator) <= CURVE_INTERSECTION_TOLERANCE)
|
|
154
|
+
return null;
|
|
155
|
+
const acX = c.x - a.x;
|
|
156
|
+
const acY = c.y - a.y;
|
|
157
|
+
const t = (acX * cdY - acY * cdX) / denominator;
|
|
158
|
+
const u = (acX * abY - acY * abX) / denominator;
|
|
159
|
+
if (t < -CURVE_INTERSECTION_TOLERANCE ||
|
|
160
|
+
t > 1 + CURVE_INTERSECTION_TOLERANCE ||
|
|
161
|
+
u < -CURVE_INTERSECTION_TOLERANCE ||
|
|
162
|
+
u > 1 + CURVE_INTERSECTION_TOLERANCE) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return { x: a.x + t * abX, y: a.y + t * abY };
|
|
166
|
+
}
|
|
167
|
+
function pointMatchesEndpoint(point, wall) {
|
|
168
|
+
return [getWallStartPoint(wall), getWallEndPoint(wall)].some((endpoint) => distance(point, endpoint) <= CURVE_INTERSECTION_TOLERANCE);
|
|
169
|
+
}
|
|
170
|
+
function wallCurveIntersectsSibling(wall, sibling) {
|
|
171
|
+
const wallPoints = sampleWallCenterline(wall);
|
|
172
|
+
const siblingPoints = sampleWallCenterline(sibling);
|
|
173
|
+
for (let wallIndex = 0; wallIndex < wallPoints.length - 1; wallIndex += 1) {
|
|
174
|
+
const wallStart = wallPoints[wallIndex];
|
|
175
|
+
const wallEnd = wallPoints[wallIndex + 1];
|
|
176
|
+
for (let siblingIndex = 0; siblingIndex < siblingPoints.length - 1; siblingIndex += 1) {
|
|
177
|
+
const siblingStart = siblingPoints[siblingIndex];
|
|
178
|
+
const siblingEnd = siblingPoints[siblingIndex + 1];
|
|
179
|
+
const intersection = segmentIntersectionPoint(wallStart, wallEnd, siblingStart, siblingEnd);
|
|
180
|
+
if (!intersection)
|
|
181
|
+
continue;
|
|
182
|
+
if (pointMatchesEndpoint(intersection, wall) && pointMatchesEndpoint(intersection, sibling)) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
function wallCurveIntersectsSiblings(wall, walls) {
|
|
191
|
+
if (!isCurvedWall(wall))
|
|
192
|
+
return false;
|
|
193
|
+
return walls.some((sibling) => sibling.id !== wall.id &&
|
|
194
|
+
sibling.parentId === wall.parentId &&
|
|
195
|
+
wallCurveIntersectsSibling(wall, sibling));
|
|
196
|
+
}
|
|
197
|
+
export function constrainWallCurveOffsetToAvoidIntersections(wall, proposedOffset, walls) {
|
|
198
|
+
const currentOffset = normalizeWallCurveOffset(wall, wall.curveOffset ?? 0);
|
|
199
|
+
const normalizedProposal = normalizeWallCurveOffset(wall, proposedOffset);
|
|
200
|
+
const proposedWall = { ...wall, curveOffset: normalizedProposal };
|
|
201
|
+
if (!wallCurveIntersectsSiblings(proposedWall, walls))
|
|
202
|
+
return normalizedProposal;
|
|
203
|
+
const currentWall = { ...wall, curveOffset: currentOffset };
|
|
204
|
+
if (wallCurveIntersectsSiblings(currentWall, walls))
|
|
205
|
+
return currentOffset;
|
|
206
|
+
let safeOffset = currentOffset;
|
|
207
|
+
let blockedOffset = normalizedProposal;
|
|
208
|
+
for (let index = 0; index < CURVE_INTERSECTION_SEARCH_STEPS; index += 1) {
|
|
209
|
+
const candidateOffset = (safeOffset + blockedOffset) / 2;
|
|
210
|
+
const candidateWall = { ...wall, curveOffset: candidateOffset };
|
|
211
|
+
if (wallCurveIntersectsSiblings(candidateWall, walls))
|
|
212
|
+
blockedOffset = candidateOffset;
|
|
213
|
+
else
|
|
214
|
+
safeOffset = candidateOffset;
|
|
215
|
+
}
|
|
216
|
+
return normalizeWallCurveOffset(wall, safeOffset);
|
|
217
|
+
}
|
|
145
218
|
export function getWallCurveLength(wall, segments = DEFAULT_SAMPLE_SEGMENTS) {
|
|
146
219
|
const points = sampleWallCenterline(wall, segments);
|
|
147
220
|
let totalLength = 0;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { WallNode } from '../../schema';
|
|
2
2
|
import { type Point2D, type WallMiterData } from './wall-mitering';
|
|
3
|
+
export { calculateLevelMiters, type Point2D, type WallMiterData } from './wall-mitering';
|
|
3
4
|
export declare const DEFAULT_WALL_THICKNESS = 0.1;
|
|
4
5
|
export declare const DEFAULT_WALL_HEIGHT = 2.5;
|
|
5
6
|
export declare function getWallThickness(wallNode: WallNode): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wall-footprint.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAA;AAExB,eAAO,MAAM,sBAAsB,MAAM,CAAA;AACzC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAGtC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE3D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,EAAE,CA6D5F"}
|
|
1
|
+
{"version":3,"file":"wall-footprint.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-footprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,oBAAoB,EAAE,KAAK,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAExF,eAAO,MAAM,sBAAsB,MAAM,CAAA;AACzC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAGtC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE3D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,EAAE,CA6D5F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getWallSurfacePolygon, isCurvedWall } from './wall-curve';
|
|
2
2
|
import { getWallMiterBoundaryPoints, pointToKey, } from './wall-mitering';
|
|
3
|
+
export { calculateLevelMiters } from './wall-mitering';
|
|
3
4
|
export const DEFAULT_WALL_THICKNESS = 0.1;
|
|
4
5
|
export const DEFAULT_WALL_HEIGHT = 2.5;
|
|
5
6
|
const CURVED_WALL_SURFACE_SEGMENTS = 24;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wall-mitering.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-mitering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAO5C,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AASD,KAAK,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAGzE,KAAK,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;AAmBlD,iBAAS,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,SAAY,GAAG,MAAM,CAG7D;AA8CD,UAAU,QAAQ;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,CAAA;KAAE,CAAC,CAAA;CACpF;
|
|
1
|
+
{"version":3,"file":"wall-mitering.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-mitering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAO5C,MAAM,WAAW,OAAO;IACtB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB;AASD,KAAK,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AAGzE,KAAK,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;AAmBlD,iBAAS,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,SAAY,GAAG,MAAM,CAG7D;AA8CD,UAAU,QAAQ;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,CAAA;KAAE,CAAC,CAAA;CACpF;AAyUD,MAAM,WAAW,aAAa;IAE5B,YAAY,EAAE,YAAY,CAAA;IAE1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;CACjC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,aAAa,CAWrE;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,aAAa,GACvB,uBAAuB,GAAG,IAAI,CA0BhC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CA8C/F;AAGD,OAAO,EAAE,UAAU,EAAE,CAAA"}
|
|
@@ -52,6 +52,49 @@ function pointOnWallSegment(point, wall, tolerance = TOLERANCE) {
|
|
|
52
52
|
const dist = Math.sqrt((point.x - projX) ** 2 + (point.y - projY) ** 2);
|
|
53
53
|
return dist < tolerance;
|
|
54
54
|
}
|
|
55
|
+
// --- Uniform grid used to prefilter T-junction candidates --------------------
|
|
56
|
+
// 2 m cells: small enough that a dense imported floor spreads across many
|
|
57
|
+
// buckets, large enough that an ordinary room wall touches only a few.
|
|
58
|
+
const JUNCTION_GRID_CELL = 2.0;
|
|
59
|
+
// A wall whose AABB would touch more than this many cells (a very long diagonal)
|
|
60
|
+
// is kept in a fallback list checked against every junction. Such walls are rare,
|
|
61
|
+
// and a model made only of them is a model with very few walls — where the naive
|
|
62
|
+
// scan was never the problem.
|
|
63
|
+
const JUNCTION_GRID_MAX_CELLS_PER_WALL = 64;
|
|
64
|
+
function cellKey(x, y) {
|
|
65
|
+
return `${Math.floor(x / JUNCTION_GRID_CELL)},${Math.floor(y / JUNCTION_GRID_CELL)}`;
|
|
66
|
+
}
|
|
67
|
+
function buildJunctionGrid(walls) {
|
|
68
|
+
const grid = new Map();
|
|
69
|
+
const oversized = [];
|
|
70
|
+
for (const wall of walls) {
|
|
71
|
+
// Pad by TOLERANCE so a point sitting exactly on the AABB edge still lands
|
|
72
|
+
// in a covered cell.
|
|
73
|
+
const minX = Math.min(wall.start[0], wall.end[0]) - TOLERANCE;
|
|
74
|
+
const maxX = Math.max(wall.start[0], wall.end[0]) + TOLERANCE;
|
|
75
|
+
const minY = Math.min(wall.start[1], wall.end[1]) - TOLERANCE;
|
|
76
|
+
const maxY = Math.max(wall.start[1], wall.end[1]) + TOLERANCE;
|
|
77
|
+
const cx0 = Math.floor(minX / JUNCTION_GRID_CELL);
|
|
78
|
+
const cx1 = Math.floor(maxX / JUNCTION_GRID_CELL);
|
|
79
|
+
const cy0 = Math.floor(minY / JUNCTION_GRID_CELL);
|
|
80
|
+
const cy1 = Math.floor(maxY / JUNCTION_GRID_CELL);
|
|
81
|
+
if ((cx1 - cx0 + 1) * (cy1 - cy0 + 1) > JUNCTION_GRID_MAX_CELLS_PER_WALL) {
|
|
82
|
+
oversized.push(wall);
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
for (let cx = cx0; cx <= cx1; cx++) {
|
|
86
|
+
for (let cy = cy0; cy <= cy1; cy++) {
|
|
87
|
+
const key = `${cx},${cy}`;
|
|
88
|
+
const bucket = grid.get(key);
|
|
89
|
+
if (bucket)
|
|
90
|
+
bucket.push(wall);
|
|
91
|
+
else
|
|
92
|
+
grid.set(key, [wall]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { grid, oversized };
|
|
97
|
+
}
|
|
55
98
|
function findJunctions(walls) {
|
|
56
99
|
const junctions = new Map();
|
|
57
100
|
// First pass: group walls by their endpoints
|
|
@@ -69,17 +112,47 @@ function findJunctions(walls) {
|
|
|
69
112
|
}
|
|
70
113
|
junctions.get(keyEnd)?.connectedWalls.push({ wall, endType: 'end' });
|
|
71
114
|
}
|
|
72
|
-
// Second pass: detect T-junctions (walls passing through junction points)
|
|
115
|
+
// Second pass: detect T-junctions (walls passing through junction points).
|
|
116
|
+
//
|
|
117
|
+
// The naive form of this pass is `for each junction: for each wall` — O(J×N).
|
|
118
|
+
// On a real imported floor (1081 walls, 2047 endpoint keys) that is ~2.2M
|
|
119
|
+
// pointOnWallSegment calls and measured 584 ms per findJunctions() call, which
|
|
120
|
+
// WallSystem then repeats every frame while progressively rebuilding.
|
|
121
|
+
//
|
|
122
|
+
// A T-junction can only exist where the junction point lies ON the wall
|
|
123
|
+
// segment, so it must lie inside the wall's AABB. Bucketing walls by the grid
|
|
124
|
+
// cells their AABB covers therefore loses nothing: the cell containing the
|
|
125
|
+
// point is always one of the cells the wall was indexed into. With the input
|
|
126
|
+
// ordering restored below, the result matches the naive pass exactly; measured
|
|
127
|
+
// 11 ms on the same geometry.
|
|
128
|
+
const { grid, oversized } = buildJunctionGrid(walls);
|
|
129
|
+
const wallOrder = new Map(walls.map((wall, index) => [wall.id, index]));
|
|
73
130
|
for (const [_key, junction] of junctions.entries()) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
131
|
+
const p = junction.meetingPoint;
|
|
132
|
+
const cellCandidates = grid.get(cellKey(p.x, p.y));
|
|
133
|
+
const passthrough = [];
|
|
134
|
+
for (const bucket of [cellCandidates, oversized]) {
|
|
135
|
+
if (!bucket || bucket.length === 0)
|
|
77
136
|
continue;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
junction.connectedWalls.
|
|
137
|
+
for (const wall of bucket) {
|
|
138
|
+
// Skip if wall already in this junction
|
|
139
|
+
if (junction.connectedWalls.some((cw) => cw.wall.id === wall.id))
|
|
140
|
+
continue;
|
|
141
|
+
// Check if junction point lies on this wall's segment (not at endpoints)
|
|
142
|
+
if (pointOnWallSegment(junction.meetingPoint, wall)) {
|
|
143
|
+
passthrough.push(wall);
|
|
144
|
+
}
|
|
81
145
|
}
|
|
82
146
|
}
|
|
147
|
+
// Append in input order, not bucket order. Two collinear walls overlapping a
|
|
148
|
+
// junction tie on angle in `calculateJunctionIntersections`, so its stable
|
|
149
|
+
// sort leaves them in the order they were appended here — and an oversized
|
|
150
|
+
// wall would otherwise land after a shorter collinear neighbour it precedes
|
|
151
|
+
// in `walls`, picking the other wall's thickness for the miter.
|
|
152
|
+
passthrough.sort((a, b) => (wallOrder.get(a.id) ?? 0) - (wallOrder.get(b.id) ?? 0));
|
|
153
|
+
for (const wall of passthrough) {
|
|
154
|
+
junction.connectedWalls.push({ wall, endType: 'passthrough' });
|
|
155
|
+
}
|
|
83
156
|
}
|
|
84
157
|
// Filter to only junctions with 2+ walls
|
|
85
158
|
const actualJunctions = new Map();
|
|
@@ -186,8 +259,14 @@ function calculateJunctionIntersections(junction, getThickness) {
|
|
|
186
259
|
});
|
|
187
260
|
}
|
|
188
261
|
}
|
|
189
|
-
// Sort by outgoing angle
|
|
190
|
-
|
|
262
|
+
// Sort by outgoing angle, then by wall ID so equal-angle walls produce the
|
|
263
|
+
// same pairing regardless of scene iteration order.
|
|
264
|
+
processedWalls.sort((a, b) => {
|
|
265
|
+
const angleOrder = a.angle - b.angle;
|
|
266
|
+
if (angleOrder !== 0)
|
|
267
|
+
return angleOrder;
|
|
268
|
+
return a.wallId < b.wallId ? -1 : a.wallId > b.wallId ? 1 : 0;
|
|
269
|
+
});
|
|
191
270
|
const wallIntersections = new Map();
|
|
192
271
|
const n = processedWalls.length;
|
|
193
272
|
if (n < 2)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type AnyNode, type AnyNodeId, type WallNode } from '../../schema';
|
|
2
|
+
import type { WallPlanPoint } from './wall-move';
|
|
3
|
+
export type WallTopologyChanges = {
|
|
4
|
+
create: Array<{
|
|
5
|
+
node: AnyNode;
|
|
6
|
+
parentId?: AnyNodeId;
|
|
7
|
+
}>;
|
|
8
|
+
update: Array<{
|
|
9
|
+
id: AnyNodeId;
|
|
10
|
+
data: Partial<AnyNode>;
|
|
11
|
+
}>;
|
|
12
|
+
delete: AnyNodeId[];
|
|
13
|
+
};
|
|
14
|
+
export type WallInsertionPlan = {
|
|
15
|
+
changes: WallTopologyChanges;
|
|
16
|
+
insertedWalls: WallNode[];
|
|
17
|
+
terminalWallId: WallNode['id'];
|
|
18
|
+
resolvedStart: WallPlanPoint;
|
|
19
|
+
resolvedEnd: WallPlanPoint;
|
|
20
|
+
};
|
|
21
|
+
export type WallTopologyRejection = {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: 'covered-existing-wall' | 'segment-too-short';
|
|
24
|
+
};
|
|
25
|
+
export type WallInsertionResult = {
|
|
26
|
+
ok: true;
|
|
27
|
+
plan: WallInsertionPlan;
|
|
28
|
+
} | WallTopologyRejection;
|
|
29
|
+
export type WallPointSplitPlan = {
|
|
30
|
+
changes: WallTopologyChanges;
|
|
31
|
+
point: WallPlanPoint;
|
|
32
|
+
};
|
|
33
|
+
export type WallPointSplitResult = {
|
|
34
|
+
ok: true;
|
|
35
|
+
plan: WallPointSplitPlan;
|
|
36
|
+
} | {
|
|
37
|
+
ok: false;
|
|
38
|
+
reason: 'no-host';
|
|
39
|
+
};
|
|
40
|
+
export declare function planWallSplitAtPoint(nodes: Record<AnyNodeId, AnyNode>, args: {
|
|
41
|
+
levelId: AnyNodeId | null;
|
|
42
|
+
point: WallPlanPoint;
|
|
43
|
+
radius: number;
|
|
44
|
+
ignoreWallIds?: readonly string[];
|
|
45
|
+
}): WallPointSplitResult;
|
|
46
|
+
export declare function planWallInsertion(nodes: Record<AnyNodeId, AnyNode>, args: {
|
|
47
|
+
levelId: AnyNodeId;
|
|
48
|
+
start: WallPlanPoint;
|
|
49
|
+
end: WallPlanPoint;
|
|
50
|
+
joinRadius: number;
|
|
51
|
+
wallDefaults?: Partial<WallNode>;
|
|
52
|
+
}): WallInsertionResult;
|
|
53
|
+
//# sourceMappingURL=wall-topology.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-topology.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-topology.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAId,KAAK,QAAQ,EAGd,MAAM,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC,CAAA;IACtD,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IACxD,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,mBAAmB,CAAA;IAC5B,aAAa,EAAE,QAAQ,EAAE,CAAA;IACzB,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9B,aAAa,EAAE,aAAa,CAAA;IAC5B,WAAW,EAAE,aAAa,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EAAE,uBAAuB,GAAG,mBAAmB,CAAA;CACtD,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAAG,qBAAqB,CAAA;AAE/F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,mBAAmB,CAAA;IAC5B,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,GACtC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AA8GpC,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE;IACJ,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;IACzB,KAAK,EAAE,aAAa,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC,GACA,oBAAoB,CAqCtB;AA4OD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,IAAI,EAAE;IACJ,OAAO,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,aAAa,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CACjC,GACA,mBAAmB,CAiGrB"}
|