@pascal-app/core 1.0.0-beta.4 → 1.0.0-beta.5
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/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/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- 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/space-detection.d.ts +29 -3
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +858 -242
- package/dist/registry/index.d.ts +3 -2
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +2 -1
- package/dist/registry/registry.d.ts +17 -1
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +74 -0
- package/dist/registry/types.d.ts +35 -0
- 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/index.d.ts +1 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -0
- package/dist/schema/nodes/level.d.ts +3 -0
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +9 -0
- package/dist/schema/types.d.ts +1 -0
- package/dist/schema/types.d.ts.map +1 -1
- 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/storey.d.ts +3 -10
- package/dist/services/storey.d.ts.map +1 -1
- package/dist/services/storey.js +45 -15
- package/dist/store/actions/node-actions.d.ts +8 -4
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +31 -4
- 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/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +75 -163
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +16 -11
- 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-opening-preview.d.ts +1 -0
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-rise.d.ts.map +1 -1
- package/dist/systems/stair/stair-rise.js +4 -2
- 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 +13 -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/package.json +1 -1
|
@@ -179,6 +179,18 @@ export declare class SpatialGridManager {
|
|
|
179
179
|
*/
|
|
180
180
|
getSlabElevationForWall(levelId: string, start: [number, number], end: [number, number], curveOffset?: number, thickness?: number, preferredSlabId?: string | null): number;
|
|
181
181
|
getSlabSupportForWall(levelId: string, start: [number, number], end: [number, number], curveOffset?: number, thickness?: number, preferredSlabId?: string | null, maxElevation?: number | null, supportOffset?: number): WallSlabSupport;
|
|
182
|
+
/**
|
|
183
|
+
* Effective slab and wall records for a level, held BY IDENTITY. A single
|
|
184
|
+
* viewer pass queries support once per wall, and each query used to derive
|
|
185
|
+
* both arrays afresh — mapping every wall on the level through
|
|
186
|
+
* `getEffectiveNode` — which also defeated the rendered-polygon memo
|
|
187
|
+
* downstream in `computeWallSlabSupport`. Rebuilt only when the scene
|
|
188
|
+
* nodes, either live-preview store, or the manager's own slab/wall
|
|
189
|
+
* bookkeeping changes.
|
|
190
|
+
*/
|
|
191
|
+
private supportInputsRevision;
|
|
192
|
+
private readonly supportInputs;
|
|
193
|
+
private getSupportInputs;
|
|
182
194
|
/**
|
|
183
195
|
* Walls on a level, resolved fresh from the scene store (the manager's
|
|
184
196
|
* own wall map is only maintained on create/delete, not on updates).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-grid-manager.d.ts","sourceRoot":"","sources":["../../../src/hooks/spatial-grid/spatial-grid-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAA8C,QAAQ,EAAE,MAAM,cAAc,CAAA;AAMjG,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,iCAAiC,CAAA;AAQxC,OAAO,EACL,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,mBAAmB,GACpB,MAAM,iCAAiC,CAAA;AAmOxC;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAClC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EACpC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAChC,KAAK,SAAI,GACR,OAAO,CA8BT;AAED,6EAA6E;AAC7E,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG;IACpD;;;;;;;;OAQG;IACH,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CAC/B,CAAA;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;IACxE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAE3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;gBAErB,QAAQ,SAAM;IAI1B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;IAOlB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6C;IAElF,OAAO,CAAC,8BAA8B;
|
|
1
|
+
{"version":3,"file":"spatial-grid-manager.d.ts","sourceRoot":"","sources":["../../../src/hooks/spatial-grid/spatial-grid-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -259,6 +259,7 @@ export class SpatialGridManager {
|
|
|
259
259
|
*/
|
|
260
260
|
renderedSlabPolygons = new Map();
|
|
261
261
|
invalidateRenderedSlabPolygons(levelId) {
|
|
262
|
+
this.supportInputsRevision += 1;
|
|
262
263
|
const slabMap = this.slabsByLevel.get(levelId);
|
|
263
264
|
if (!slabMap)
|
|
264
265
|
return;
|
|
@@ -822,7 +823,8 @@ export class SpatialGridManager {
|
|
|
822
823
|
baseSegments: [{ start: 0, end: 1, elevation }],
|
|
823
824
|
};
|
|
824
825
|
}
|
|
825
|
-
const
|
|
826
|
+
const inputs = this.getSupportInputs(levelId, slabMap);
|
|
827
|
+
const support = computeWallSlabSupport({ start, end, curveOffset, thickness }, inputs.slabs, inputs.walls, preferredSlabId, maxElevation, levelBase);
|
|
826
828
|
if (supportOffset === 0)
|
|
827
829
|
return support;
|
|
828
830
|
return {
|
|
@@ -835,6 +837,40 @@ export class SpatialGridManager {
|
|
|
835
837
|
})),
|
|
836
838
|
};
|
|
837
839
|
}
|
|
840
|
+
/**
|
|
841
|
+
* Effective slab and wall records for a level, held BY IDENTITY. A single
|
|
842
|
+
* viewer pass queries support once per wall, and each query used to derive
|
|
843
|
+
* both arrays afresh — mapping every wall on the level through
|
|
844
|
+
* `getEffectiveNode` — which also defeated the rendered-polygon memo
|
|
845
|
+
* downstream in `computeWallSlabSupport`. Rebuilt only when the scene
|
|
846
|
+
* nodes, either live-preview store, or the manager's own slab/wall
|
|
847
|
+
* bookkeeping changes.
|
|
848
|
+
*/
|
|
849
|
+
supportInputsRevision = 0;
|
|
850
|
+
supportInputs = new Map();
|
|
851
|
+
getSupportInputs(levelId, slabMap) {
|
|
852
|
+
const nodes = useScene.getState().nodes;
|
|
853
|
+
const overrides = useLiveNodeOverrides.getState().overrides;
|
|
854
|
+
const transforms = useLiveTransforms.getState().transforms;
|
|
855
|
+
const cached = this.supportInputs.get(levelId);
|
|
856
|
+
if (cached &&
|
|
857
|
+
cached.revision === this.supportInputsRevision &&
|
|
858
|
+
cached.nodes === nodes &&
|
|
859
|
+
cached.overrides === overrides &&
|
|
860
|
+
cached.transforms === transforms) {
|
|
861
|
+
return cached;
|
|
862
|
+
}
|
|
863
|
+
const next = {
|
|
864
|
+
revision: this.supportInputsRevision,
|
|
865
|
+
nodes,
|
|
866
|
+
overrides,
|
|
867
|
+
transforms,
|
|
868
|
+
slabs: [...slabMap.values()].map((slab) => this.effectiveSlabRecord(slab)),
|
|
869
|
+
walls: this.getLevelWallNodes(levelId).map((wall) => getEffectiveNode(wall)),
|
|
870
|
+
};
|
|
871
|
+
this.supportInputs.set(levelId, next);
|
|
872
|
+
return next;
|
|
873
|
+
}
|
|
838
874
|
/**
|
|
839
875
|
* Walls on a level, resolved fresh from the scene store (the manager's
|
|
840
876
|
* own wall map is only maintained on create/delete, not on updates).
|
|
@@ -942,6 +978,8 @@ export class SpatialGridManager {
|
|
|
942
978
|
this.ceilings.clear();
|
|
943
979
|
this.itemCeilingMap.clear();
|
|
944
980
|
this.renderedSlabPolygons.clear();
|
|
981
|
+
this.supportInputs.clear();
|
|
982
|
+
this.supportInputsRevision += 1;
|
|
945
983
|
}
|
|
946
984
|
}
|
|
947
985
|
// Singleton instance
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export * from './registry';
|
|
|
30
30
|
export * from './schema';
|
|
31
31
|
export * from './services';
|
|
32
32
|
export { isMovable, movePlanToward, moveToward, resolveMovable } from './services/movement';
|
|
33
|
-
export { getSceneHistoryPauseDepth, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsSingleSceneHistoryStep, type SceneCommit, type SceneCommitListener, type SceneCommitOrigin, type SceneSnapshot, subscribeSceneCommits, } from './store/history-control';
|
|
33
|
+
export { acquireSceneHistoryPause, getSceneHistoryPauseDepth, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsSingleSceneHistoryStep, type SceneCommit, type SceneCommitListener, type SceneCommitOrigin, type SceneSnapshot, subscribeSceneCommits, } from './store/history-control';
|
|
34
34
|
export { type ControlValue, type DoorAnimationState, type DoorInteractiveState, type ElevatorInteractiveState, type ElevatorPhase, type ItemInteractiveState, type SkylightAnimationState, type SkylightInteractiveState, useInteractive, type WindowAnimationState, type WindowInteractiveState, } from './store/use-interactive';
|
|
35
35
|
export { default as useLiveNodeOverrides, getEffectiveNode, type LiveNodeOverrides, } from './store/use-live-node-overrides';
|
|
36
36
|
export { default as useLiveTerrain, type LiveTerrainStroke, } from './store/use-live-terrain';
|
|
@@ -57,6 +57,7 @@ export { DEFAULT_WALL_HEIGHT, DEFAULT_WALL_THICKNESS, getWallPlanFootprint, getW
|
|
|
57
57
|
export { calculateLevelMiters, getAdjacentWallIds, getWallMiterBoundaryPoints, type Point2D, pointToKey, type WallMiterBoundaryPoints, type WallMiterData, } from './systems/wall/wall-mitering';
|
|
58
58
|
export { constrainWallMoveDeltaToAxis, getLinkedWallUpdates, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planWallMoveJunctions, type WallMoveAxis, type WallMoveBridgePlan, type WallMoveJunctionPlan, type WallMoveLinkedWallTargetPlan, type WallPlanPoint, } from './systems/wall/wall-move';
|
|
59
59
|
export { MIN_WALL_HEIGHT, resolveWallEffectiveHeight, resolveWallTop, } from './systems/wall/wall-top';
|
|
60
|
+
export { planWallInsertion, planWallSplitAtPoint, } from './systems/wall/wall-topology';
|
|
60
61
|
export type { SceneGraph } from './utils/clone-scene-graph';
|
|
61
62
|
export { cloneLevelSubtree, cloneSceneGraph, forkSceneGraph } from './utils/clone-scene-graph';
|
|
62
63
|
export { isObject } from './utils/types';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,0BAA0B,EAC1B,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,SAAS,EACT,UAAU,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,KAAK,aAAa,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AAChG,OAAO,EACL,aAAa,EACb,WAAW,GACZ,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EACL,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,6CAA6C,CAAA;AACpD,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,KAAK,qBAAqB,EAC1B,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,KAAK,sBAAsB,GAC5B,MAAM,2CAA2C,CAAA;AAClD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,GACf,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EACL,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,gCAAgC,EAChC,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AACxE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,mBAAmB,EACnB,kCAAkC,GACnC,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3E,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,EAChC,4BAA4B,EAC5B,yBAAyB,EACzB,iCAAiC,EACjC,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,KAAK,OAAO,IAAI,cAAc,EAC9B,cAAc,IAAI,gBAAgB,EAClC,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AAC7F,OAAO,EACL,wBAAwB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,cAAc,EACd,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,4BAA4B,EAC5B,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,QAAQ,GACT,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,KAAK,WAAW,EAChB,QAAQ,EACR,cAAc,EACd,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,OAAO,EACP,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,oBAAoB,EACpB,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,YAAY,CAAA;AACnB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC3F,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAClB,2BAA2B,EAC3B,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,qBAAqB,GACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,OAAO,IAAI,oBAAoB,EAC/B,gBAAgB,EAChB,KAAK,iBAAiB,GACvB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EACL,OAAO,IAAI,cAAc,EACzB,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC9F,OAAO,EACL,KAAK,yBAAyB,EAC9B,yBAAyB,EACzB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,OAAO,IAAI,QAAQ,EACnB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAA;AACpF,OAAO,EACL,KAAK,gBAAgB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,EACrB,iCAAiC,EACjC,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAA;AAClF,OAAO,EACL,8BAA8B,EAC9B,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAA;AAClF,OAAO,EACL,KAAK,kBAAkB,EACvB,6BAA6B,EAC7B,qBAAqB,EACrB,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,EAC7B,aAAa,EACb,iBAAiB,GAClB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAA;AAC7E,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,kBAAkB,GACxB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,KAAK,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAA;AAC7F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAClF,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,OAAO,EACZ,UAAU,EACV,KAAK,uBAAuB,EAC5B,KAAK,aAAa,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,aAAa,GACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,kCAAkC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export * from './registry';
|
|
|
28
28
|
export * from './schema';
|
|
29
29
|
export * from './services';
|
|
30
30
|
export { isMovable, movePlanToward, moveToward, resolveMovable } from './services/movement';
|
|
31
|
-
export { getSceneHistoryPauseDepth, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsSingleSceneHistoryStep, subscribeSceneCommits, } from './store/history-control';
|
|
31
|
+
export { acquireSceneHistoryPause, getSceneHistoryPauseDepth, pauseSceneHistory, resetSceneHistoryPauseDepth, resumeSceneHistory, runAsSingleSceneHistoryStep, subscribeSceneCommits, } from './store/history-control';
|
|
32
32
|
export { useInteractive, } from './store/use-interactive';
|
|
33
33
|
export { default as useLiveNodeOverrides, getEffectiveNode, } from './store/use-live-node-overrides';
|
|
34
34
|
export { default as useLiveTerrain, } from './store/use-live-terrain';
|
|
@@ -55,6 +55,7 @@ export { DEFAULT_WALL_HEIGHT, DEFAULT_WALL_THICKNESS, getWallPlanFootprint, getW
|
|
|
55
55
|
export { calculateLevelMiters, getAdjacentWallIds, getWallMiterBoundaryPoints, pointToKey, } from './systems/wall/wall-mitering';
|
|
56
56
|
export { constrainWallMoveDeltaToAxis, getLinkedWallUpdates, getPerpendicularWallMoveAxis, getPlannedLinkedWallUpdates, planWallMoveJunctions, } from './systems/wall/wall-move';
|
|
57
57
|
export { MIN_WALL_HEIGHT, resolveWallEffectiveHeight, resolveWallTop, } from './systems/wall/wall-top';
|
|
58
|
+
export { planWallInsertion, planWallSplitAtPoint, } from './systems/wall/wall-topology';
|
|
58
59
|
export { cloneLevelSubtree, cloneSceneGraph, forkSceneGraph } from './utils/clone-scene-graph';
|
|
59
60
|
export { isObject } from './utils/types';
|
|
60
61
|
export { validateBuildJson, } from './validation/validate-build-json';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { WallNode } from '../schema';
|
|
2
|
+
type SceneNodes = Record<string, any>;
|
|
3
|
+
type Point = [number, number];
|
|
4
|
+
type IndexedRoom = {
|
|
5
|
+
boundaryFaces: Array<{
|
|
6
|
+
wallId: WallNode['id'];
|
|
7
|
+
}>;
|
|
8
|
+
};
|
|
9
|
+
type IndexedLevelTopology<TRoom extends IndexedRoom> = {
|
|
10
|
+
walls: Map<string, WallNode>;
|
|
11
|
+
rooms: TRoom[];
|
|
12
|
+
wallIdsByCell: Map<string, Set<string>>;
|
|
13
|
+
cellKeysByWallId: Map<string, string[]>;
|
|
14
|
+
};
|
|
15
|
+
export type IndexedTopologyDelta<TRoom extends IndexedRoom> = {
|
|
16
|
+
strategy: 'indexed' | 'fallback';
|
|
17
|
+
beforeRooms: TRoom[];
|
|
18
|
+
currentRooms: TRoom[];
|
|
19
|
+
allCurrentRooms: TRoom[];
|
|
20
|
+
previousWalls: WallNode[];
|
|
21
|
+
currentWalls: WallNode[];
|
|
22
|
+
examinedWallIds: string[];
|
|
23
|
+
};
|
|
24
|
+
type RoomTopologyIndexOptions<TRoom extends IndexedRoom> = {
|
|
25
|
+
detectRooms: (walls: WallNode[]) => TRoom[];
|
|
26
|
+
sampleWall: (wall: WallNode) => Point[];
|
|
27
|
+
junctionTolerance: number;
|
|
28
|
+
};
|
|
29
|
+
export declare function distanceToSegment(point: Point, segStart: Point, segEnd: Point): number;
|
|
30
|
+
export declare class RoomTopologyIndex<TRoom extends IndexedRoom> {
|
|
31
|
+
private readonly options;
|
|
32
|
+
private readonly levels;
|
|
33
|
+
private readonly queryMargin;
|
|
34
|
+
constructor(options: RoomTopologyIndexOptions<TRoom>);
|
|
35
|
+
rebuild(nodes: SceneNodes): void;
|
|
36
|
+
rebuildLevel(levelId: string, nodes: SceneNodes): IndexedLevelTopology<TRoom>;
|
|
37
|
+
applyWallDelta(levelId: string, changedWallIds: ReadonlySet<string>, beforeNodes: SceneNodes, currentNodes: SceneNodes): IndexedTopologyDelta<TRoom>;
|
|
38
|
+
private wallsForLevel;
|
|
39
|
+
private wallsFromNodes;
|
|
40
|
+
private createLevel;
|
|
41
|
+
private wallBbox;
|
|
42
|
+
private cellKeysForWall;
|
|
43
|
+
private removeWall;
|
|
44
|
+
private setWall;
|
|
45
|
+
private queryWalls;
|
|
46
|
+
private wallsTouch;
|
|
47
|
+
private connectedWallIds;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=room-topology-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-topology-index.d.ts","sourceRoot":"","sources":["../../src/lib/room-topology-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAGzC,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACrC,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE7B,KAAK,WAAW,GAAG;IACjB,aAAa,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAA;CACjD,CAAA;AAED,KAAK,oBAAoB,CAAC,KAAK,SAAS,WAAW,IAAI;IACrD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC5B,KAAK,EAAE,KAAK,EAAE,CAAA;IACd,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,KAAK,SAAS,WAAW,IAAI;IAC5D,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAA;IAChC,WAAW,EAAE,KAAK,EAAE,CAAA;IACpB,YAAY,EAAE,KAAK,EAAE,CAAA;IACrB,eAAe,EAAE,KAAK,EAAE,CAAA;IACxB,aAAa,EAAE,QAAQ,EAAE,CAAA;IACzB,YAAY,EAAE,QAAQ,EAAE,CAAA;IACxB,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B,CAAA;AAED,KAAK,wBAAwB,CAAC,KAAK,SAAS,WAAW,IAAI;IACzD,WAAW,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,KAAK,EAAE,CAAA;IAC3C,UAAU,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,KAAK,EAAE,CAAA;IACvC,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAqCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,UAY7E;AAkBD,qBAAa,iBAAiB,CAAC,KAAK,SAAS,WAAW;IAI1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IACxE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAEP,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC;IAIrE,OAAO,CAAC,KAAK,EAAE,UAAU;IAczB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAM/C,cAAc,CACZ,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,WAAW,CAAC,MAAM,CAAC,EACnC,WAAW,EAAE,UAAU,EACvB,YAAY,EAAE,UAAU,GACvB,oBAAoB,CAAC,KAAK,CAAC;IAuD9B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,OAAO;IAYf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,gBAAgB;CAiBzB"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { getClampedWallCurveOffset } from '../systems/wall/wall-curve';
|
|
2
|
+
const CELL_SIZE = 2;
|
|
3
|
+
function bboxOf(points) {
|
|
4
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
5
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
6
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
7
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
8
|
+
for (const [x, y] of points) {
|
|
9
|
+
minX = Math.min(minX, x);
|
|
10
|
+
minY = Math.min(minY, y);
|
|
11
|
+
maxX = Math.max(maxX, x);
|
|
12
|
+
maxY = Math.max(maxY, y);
|
|
13
|
+
}
|
|
14
|
+
return { minX, minY, maxX, maxY };
|
|
15
|
+
}
|
|
16
|
+
function expandedBbox(box, margin) {
|
|
17
|
+
return {
|
|
18
|
+
minX: box.minX - margin,
|
|
19
|
+
minY: box.minY - margin,
|
|
20
|
+
maxX: box.maxX + margin,
|
|
21
|
+
maxY: box.maxY + margin,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function cellKeysForBbox(box) {
|
|
25
|
+
const keys = [];
|
|
26
|
+
for (let x = Math.floor(box.minX / CELL_SIZE); x <= Math.floor(box.maxX / CELL_SIZE); x += 1) {
|
|
27
|
+
for (let y = Math.floor(box.minY / CELL_SIZE); y <= Math.floor(box.maxY / CELL_SIZE); y += 1) {
|
|
28
|
+
keys.push(`${x},${y}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return keys;
|
|
32
|
+
}
|
|
33
|
+
export function distanceToSegment(point, segStart, segEnd) {
|
|
34
|
+
const [px, py] = point;
|
|
35
|
+
const [x1, y1] = segStart;
|
|
36
|
+
const [x2, y2] = segEnd;
|
|
37
|
+
const dx = x2 - x1;
|
|
38
|
+
const dy = y2 - y1;
|
|
39
|
+
const lenSq = dx * dx + dy * dy;
|
|
40
|
+
if (lenSq < 0.0001)
|
|
41
|
+
return Math.hypot(px - x1, py - y1);
|
|
42
|
+
const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));
|
|
43
|
+
return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));
|
|
44
|
+
}
|
|
45
|
+
function roomUsesAnyWall(room, wallIds) {
|
|
46
|
+
return room.boundaryFaces.some((boundary) => wallIds.has(boundary.wallId));
|
|
47
|
+
}
|
|
48
|
+
function sameIndexedWall(left, right) {
|
|
49
|
+
if (!(left && right))
|
|
50
|
+
return left === right;
|
|
51
|
+
return (left.parentId === right.parentId &&
|
|
52
|
+
left.start[0] === right.start[0] &&
|
|
53
|
+
left.start[1] === right.start[1] &&
|
|
54
|
+
left.end[0] === right.end[0] &&
|
|
55
|
+
left.end[1] === right.end[1] &&
|
|
56
|
+
getClampedWallCurveOffset(left) === getClampedWallCurveOffset(right));
|
|
57
|
+
}
|
|
58
|
+
export class RoomTopologyIndex {
|
|
59
|
+
options;
|
|
60
|
+
levels = new Map();
|
|
61
|
+
queryMargin;
|
|
62
|
+
constructor(options) {
|
|
63
|
+
this.options = options;
|
|
64
|
+
this.queryMargin = options.junctionTolerance + 0.02;
|
|
65
|
+
}
|
|
66
|
+
rebuild(nodes) {
|
|
67
|
+
this.levels.clear();
|
|
68
|
+
const wallsByLevel = new Map();
|
|
69
|
+
for (const node of Object.values(nodes)) {
|
|
70
|
+
if (node?.type !== 'wall' || !node.parentId)
|
|
71
|
+
continue;
|
|
72
|
+
const walls = wallsByLevel.get(node.parentId) ?? [];
|
|
73
|
+
walls.push(node);
|
|
74
|
+
wallsByLevel.set(node.parentId, walls);
|
|
75
|
+
}
|
|
76
|
+
for (const [levelId, walls] of wallsByLevel) {
|
|
77
|
+
this.levels.set(levelId, this.createLevel(walls));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
rebuildLevel(levelId, nodes) {
|
|
81
|
+
const level = this.createLevel(this.wallsForLevel(nodes, levelId));
|
|
82
|
+
this.levels.set(levelId, level);
|
|
83
|
+
return level;
|
|
84
|
+
}
|
|
85
|
+
applyWallDelta(levelId, changedWallIds, beforeNodes, currentNodes) {
|
|
86
|
+
let strategy = 'indexed';
|
|
87
|
+
let level = this.levels.get(levelId);
|
|
88
|
+
if (!level) {
|
|
89
|
+
level = this.rebuildLevel(levelId, beforeNodes);
|
|
90
|
+
strategy = 'fallback';
|
|
91
|
+
}
|
|
92
|
+
for (const wallId of changedWallIds) {
|
|
93
|
+
const cached = level.walls.get(wallId);
|
|
94
|
+
const previous = beforeNodes[wallId];
|
|
95
|
+
const previousWall = previous?.type === 'wall' && previous.parentId === levelId ? previous : undefined;
|
|
96
|
+
if (!sameIndexedWall(cached, previousWall)) {
|
|
97
|
+
level = this.rebuildLevel(levelId, beforeNodes);
|
|
98
|
+
strategy = 'fallback';
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const beforeComponentIds = this.connectedWallIds(level, changedWallIds);
|
|
103
|
+
for (const wallId of changedWallIds) {
|
|
104
|
+
const current = currentNodes[wallId];
|
|
105
|
+
if (current?.type === 'wall' && current.parentId === levelId) {
|
|
106
|
+
this.setWall(level, current);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this.removeWall(level, wallId);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const currentSeedIds = new Set(changedWallIds);
|
|
113
|
+
for (const wallId of beforeComponentIds) {
|
|
114
|
+
if (level.walls.has(wallId))
|
|
115
|
+
currentSeedIds.add(wallId);
|
|
116
|
+
}
|
|
117
|
+
const currentComponentIds = this.connectedWallIds(level, currentSeedIds);
|
|
118
|
+
const examinedIds = new Set([...changedWallIds, ...beforeComponentIds, ...currentComponentIds]);
|
|
119
|
+
const beforeRooms = level.rooms.filter((room) => roomUsesAnyWall(room, examinedIds));
|
|
120
|
+
const previousWalls = this.wallsFromNodes(beforeNodes, levelId, examinedIds);
|
|
121
|
+
const currentWalls = this.wallsFromNodes(currentNodes, levelId, examinedIds);
|
|
122
|
+
const currentRooms = this.options.detectRooms(currentWalls);
|
|
123
|
+
const allCurrentRooms = [
|
|
124
|
+
...level.rooms.filter((room) => !roomUsesAnyWall(room, examinedIds)),
|
|
125
|
+
...currentRooms,
|
|
126
|
+
];
|
|
127
|
+
level.rooms = allCurrentRooms;
|
|
128
|
+
return {
|
|
129
|
+
strategy,
|
|
130
|
+
beforeRooms,
|
|
131
|
+
currentRooms,
|
|
132
|
+
allCurrentRooms,
|
|
133
|
+
previousWalls,
|
|
134
|
+
currentWalls,
|
|
135
|
+
examinedWallIds: [...examinedIds].sort(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
wallsForLevel(nodes, levelId) {
|
|
139
|
+
const level = nodes[levelId];
|
|
140
|
+
if (level?.type !== 'level')
|
|
141
|
+
return [];
|
|
142
|
+
return level.children.flatMap((id) => {
|
|
143
|
+
const node = nodes[id];
|
|
144
|
+
return node?.type === 'wall' && node.parentId === levelId ? [node] : [];
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
wallsFromNodes(nodes, levelId, ids) {
|
|
148
|
+
return [...ids].flatMap((wallId) => {
|
|
149
|
+
const node = nodes[wallId];
|
|
150
|
+
return node?.type === 'wall' && node.parentId === levelId ? [node] : [];
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
createLevel(walls) {
|
|
154
|
+
const level = {
|
|
155
|
+
walls: new Map(),
|
|
156
|
+
rooms: this.options.detectRooms(walls),
|
|
157
|
+
wallIdsByCell: new Map(),
|
|
158
|
+
cellKeysByWallId: new Map(),
|
|
159
|
+
};
|
|
160
|
+
for (const wall of walls)
|
|
161
|
+
this.setWall(level, wall);
|
|
162
|
+
return level;
|
|
163
|
+
}
|
|
164
|
+
wallBbox(wall) {
|
|
165
|
+
return bboxOf(this.options.sampleWall(wall));
|
|
166
|
+
}
|
|
167
|
+
cellKeysForWall(wall) {
|
|
168
|
+
return cellKeysForBbox(expandedBbox(this.wallBbox(wall), this.queryMargin));
|
|
169
|
+
}
|
|
170
|
+
removeWall(level, wallId) {
|
|
171
|
+
for (const key of level.cellKeysByWallId.get(wallId) ?? []) {
|
|
172
|
+
const ids = level.wallIdsByCell.get(key);
|
|
173
|
+
ids?.delete(wallId);
|
|
174
|
+
if (ids?.size === 0)
|
|
175
|
+
level.wallIdsByCell.delete(key);
|
|
176
|
+
}
|
|
177
|
+
level.cellKeysByWallId.delete(wallId);
|
|
178
|
+
level.walls.delete(wallId);
|
|
179
|
+
}
|
|
180
|
+
setWall(level, wall) {
|
|
181
|
+
this.removeWall(level, wall.id);
|
|
182
|
+
level.walls.set(wall.id, wall);
|
|
183
|
+
const keys = this.cellKeysForWall(wall);
|
|
184
|
+
level.cellKeysByWallId.set(wall.id, keys);
|
|
185
|
+
for (const key of keys) {
|
|
186
|
+
const ids = level.wallIdsByCell.get(key) ?? new Set();
|
|
187
|
+
ids.add(wall.id);
|
|
188
|
+
level.wallIdsByCell.set(key, ids);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
queryWalls(level, wall) {
|
|
192
|
+
const ids = new Set();
|
|
193
|
+
for (const key of this.cellKeysForWall(wall)) {
|
|
194
|
+
for (const id of level.wallIdsByCell.get(key) ?? [])
|
|
195
|
+
ids.add(id);
|
|
196
|
+
}
|
|
197
|
+
return ids;
|
|
198
|
+
}
|
|
199
|
+
wallsTouch(left, right) {
|
|
200
|
+
const leftPoints = this.options.sampleWall(left);
|
|
201
|
+
const rightPoints = this.options.sampleWall(right);
|
|
202
|
+
const touchesPolyline = (points, other) => {
|
|
203
|
+
const endpoints = [points[0], points.at(-1)].filter((point) => Boolean(point));
|
|
204
|
+
for (const endpoint of endpoints) {
|
|
205
|
+
for (let index = 0; index < other.length - 1; index += 1) {
|
|
206
|
+
if (distanceToSegment(endpoint, other[index], other[index + 1]) <=
|
|
207
|
+
this.options.junctionTolerance) {
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
};
|
|
214
|
+
return touchesPolyline(leftPoints, rightPoints) || touchesPolyline(rightPoints, leftPoints);
|
|
215
|
+
}
|
|
216
|
+
connectedWallIds(level, seedIds) {
|
|
217
|
+
const connected = new Set();
|
|
218
|
+
const queue = [...seedIds];
|
|
219
|
+
while (queue.length > 0) {
|
|
220
|
+
const wallId = queue.pop();
|
|
221
|
+
if (connected.has(wallId))
|
|
222
|
+
continue;
|
|
223
|
+
const wall = level.walls.get(wallId);
|
|
224
|
+
if (!wall)
|
|
225
|
+
continue;
|
|
226
|
+
connected.add(wallId);
|
|
227
|
+
for (const neighborId of this.queryWalls(level, wall)) {
|
|
228
|
+
if (connected.has(neighborId))
|
|
229
|
+
continue;
|
|
230
|
+
const neighbor = level.walls.get(neighborId);
|
|
231
|
+
if (neighbor && this.wallsTouch(wall, neighbor))
|
|
232
|
+
queue.push(neighborId);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return connected;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -16,6 +16,20 @@ export type Space = {
|
|
|
16
16
|
boundaryFaces: SpaceBoundaryFace[];
|
|
17
17
|
isExterior: boolean;
|
|
18
18
|
};
|
|
19
|
+
export type SpaceTopologyReconcileEvent = {
|
|
20
|
+
levelId: string;
|
|
21
|
+
strategy: 'indexed' | 'fallback';
|
|
22
|
+
examinedWallIds: string[];
|
|
23
|
+
affectedBeforeRoomCount: number;
|
|
24
|
+
affectedCurrentRoomCount: number;
|
|
25
|
+
};
|
|
26
|
+
export type SpaceDetectionSyncOptions = {
|
|
27
|
+
onTopologyReconcile?: (event: SpaceTopologyReconcileEvent) => void;
|
|
28
|
+
};
|
|
29
|
+
type ExtractedRoom = {
|
|
30
|
+
polygon: Point2D[];
|
|
31
|
+
boundaryFaces: SpaceBoundaryFace[];
|
|
32
|
+
};
|
|
19
33
|
type WallSideUpdate = {
|
|
20
34
|
wallId: string;
|
|
21
35
|
frontSide: 'interior' | 'exterior' | 'unknown';
|
|
@@ -31,6 +45,7 @@ export type AutoSlabSyncPlan = {
|
|
|
31
45
|
};
|
|
32
46
|
export type AutoSlabPlanningContext = {
|
|
33
47
|
elevationForRoom?: (polygon: Array<[number, number]>) => number | undefined;
|
|
48
|
+
previousElevationForRoom?: (polygon: Array<[number, number]>) => number | undefined;
|
|
34
49
|
};
|
|
35
50
|
export type AutoCeilingSyncPlan = {
|
|
36
51
|
create: CeilingNodeType[];
|
|
@@ -39,6 +54,10 @@ export type AutoCeilingSyncPlan = {
|
|
|
39
54
|
data: Partial<CeilingNodeType>;
|
|
40
55
|
}>;
|
|
41
56
|
delete: Array<CeilingNodeType['id']>;
|
|
57
|
+
reparent: Array<{
|
|
58
|
+
id: AnyNodeId;
|
|
59
|
+
parentId: CeilingNodeType['id'];
|
|
60
|
+
}>;
|
|
42
61
|
};
|
|
43
62
|
export type AutoZoneSyncPlan = {
|
|
44
63
|
update: Array<{
|
|
@@ -58,6 +77,8 @@ export type AutoCeilingPlanningContext = {
|
|
|
58
77
|
*/
|
|
59
78
|
ceilingClampBound?: (polygon: Array<[number, number]>) => number;
|
|
60
79
|
heightForRoom?: (polygon: Array<[number, number]>) => number | undefined;
|
|
80
|
+
previousHeightForRoom?: (polygon: Array<[number, number]>) => number | undefined;
|
|
81
|
+
childPosition?: (childId: AnyNodeId) => [number, number] | undefined;
|
|
61
82
|
};
|
|
62
83
|
/**
|
|
63
84
|
* True when `wall` lies on the boundary of a room enclosed by `walls`, using the
|
|
@@ -71,9 +92,14 @@ export declare function wallClosesRoom(walls: WallNode[], wall: WallNode): boole
|
|
|
71
92
|
export declare function resolveWallSurfaceSides(wall: Pick<WallNode, 'start' | 'end' | 'thickness' | 'frontSide' | 'backSide'>, roomPolygons: Point2D[][]): Pick<WallSideUpdate, 'frontSide' | 'backSide'>;
|
|
72
93
|
export declare function planAutoZonesForLevel(spaces: readonly Space[], existingZones: readonly ZoneNodeType[]): AutoZoneSyncPlan;
|
|
73
94
|
export declare function resolveAutoZonePolygon(zone: Pick<ZoneNodeType, 'autoFromWalls' | 'boundaryWallIds' | 'polygon'>, resolve: (id: AnyNodeId) => unknown): ZoneNodeType['polygon'];
|
|
74
|
-
export declare function planAutoSlabsForLevel(roomPolygons: Point2D[][], existingSlabs: SlabNodeType[], context?: AutoSlabPlanningContext
|
|
75
|
-
|
|
95
|
+
export declare function planAutoSlabsForLevel(roomPolygons: Point2D[][], existingSlabs: SlabNodeType[], context?: AutoSlabPlanningContext, namingSlabs?: Array<{
|
|
96
|
+
name?: string;
|
|
97
|
+
}>): AutoSlabSyncPlan;
|
|
98
|
+
export declare function planAutoCeilingsForLevel(roomPolygons: Point2D[][], existingCeilings: CeilingNodeType[], context?: AutoCeilingPlanningContext, namingCeilings?: Array<{
|
|
99
|
+
name?: string;
|
|
100
|
+
}>): AutoCeilingSyncPlan;
|
|
76
101
|
export declare function detectSpacesForLevel(levelId: string, walls: WallNode[]): {
|
|
102
|
+
rooms: ExtractedRoom[];
|
|
77
103
|
roomPolygons: Point2D[][];
|
|
78
104
|
spaces: Space[];
|
|
79
105
|
wallUpdates: WallSideUpdate[];
|
|
@@ -84,7 +110,7 @@ export declare function pauseSpaceDetection(): void;
|
|
|
84
110
|
export declare function resumeSpaceDetection(): void;
|
|
85
111
|
/** True iff the wall-driven auto slab/ceiling sync is currently paused. */
|
|
86
112
|
export declare function isSpaceDetectionPaused(): boolean;
|
|
87
|
-
export declare function initSpaceDetectionSync(sceneStore: any, editorStore: any): () => void;
|
|
113
|
+
export declare function initSpaceDetectionSync(sceneStore: any, editorStore: any, options?: SpaceDetectionSyncOptions): () => void;
|
|
88
114
|
export declare function wallTouchesOthers(wall: WallNode, otherWalls: WallNode[]): boolean;
|
|
89
115
|
export {};
|
|
90
116
|
//# sourceMappingURL=space-detection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-detection.d.ts","sourceRoot":"","sources":["../../src/lib/space-detection.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,WAAW,IAAI,eAAe,EAGnC,KAAK,QAAQ,IAAI,YAAY,EAC7B,KAAK,QAAQ,EAEb,KAAK,QAAQ,IAAI,YAAY,EAC9B,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"space-detection.d.ts","sourceRoot":"","sources":["../../src/lib/space-detection.ts"],"names":[],"mappings":"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"}
|