@pascal-app/core 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/events/bus.d.ts +1 -0
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +2 -0
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +37 -12
- package/dist/store/use-scene.d.ts +5 -0
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +25 -4
- package/dist/systems/wall/wall-footprint.d.ts +7 -0
- package/dist/systems/wall/wall-footprint.d.ts.map +1 -0
- package/dist/systems/wall/wall-footprint.js +49 -0
- package/dist/systems/wall/wall-system.d.ts.map +1 -1
- package/dist/systems/wall/wall-system.js +7 -46
- package/package.json +1 -1
package/dist/events/bus.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export interface ThumbnailGenerateEvent {
|
|
|
41
41
|
}
|
|
42
42
|
type CameraControlEvents = {
|
|
43
43
|
'camera-controls:view': CameraControlEvent;
|
|
44
|
+
'camera-controls:focus': CameraControlEvent;
|
|
44
45
|
'camera-controls:capture': CameraControlEvent;
|
|
45
46
|
'camera-controls:top-view': undefined;
|
|
46
47
|
'camera-controls:orbit-cw': undefined;
|
package/dist/events/bus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../../src/events/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACT,MAAM,WAAW,CAAA;AAClB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IACpD,IAAI,EAAE,CAAC,CAAA;IACP,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAAA;CACtC;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,CAAA;AACnD,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAA;AAC7C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,CAAA;AACjD,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAC3C,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,eAAe,CAAC,CAAA;AACzD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;AAC/C,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAG3C,eAAO,MAAM,aAAa,0GAShB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,KAAK,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;KACpC,CAAC,IAAI,GAAG,CAAC,IAAI,WAAW,EAAE,GAAG,CAAC;CAChC,CAAA;AAED,KAAK,UAAU,GAAG;KACf,CAAC,IAAI,QAAQ,WAAW,EAAE,GAAG,SAAS;CACxC,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,KAAK,mBAAmB,GAAG;IACzB,sBAAsB,EAAE,kBAAkB,CAAA;IAC1C,uBAAuB,EAAE,kBAAkB,CAAA;IAC3C,yBAAyB,EAAE,kBAAkB,CAAA;IAC7C,0BAA0B,EAAE,SAAS,CAAA;IACrC,0BAA0B,EAAE,SAAS,CAAA;IACrC,2BAA2B,EAAE,SAAS,CAAA;IACtC,oCAAoC,EAAE,sBAAsB,CAAA;CAC7D,CAAA;AAED,KAAK,UAAU,GAAG;IAChB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAED,KAAK,YAAY,GAAG;IAClB,2BAA2B,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACjE,0BAA0B,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CACvE,CAAA;AAED,KAAK,YAAY,GAAG,UAAU,GAC5B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,UAAU,EAAE,aAAa,CAAC,GACrC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,GAC/B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,SAAS,EAAE,YAAY,CAAC,GACnC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAC5C,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,GACjC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,GAC7B,mBAAmB,GACnB,UAAU,GACV,YAAY,CAAA;AAEd,eAAO,MAAM,OAAO,sCAAuB,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export { DoorSystem } from './systems/door/door-system';
|
|
|
14
14
|
export { ItemSystem } from './systems/item/item-system';
|
|
15
15
|
export { RoofSystem } from './systems/roof/roof-system';
|
|
16
16
|
export { SlabSystem } from './systems/slab/slab-system';
|
|
17
|
+
export { DEFAULT_WALL_HEIGHT, DEFAULT_WALL_THICKNESS, getWallPlanFootprint, getWallThickness, } from './systems/wall/wall-footprint';
|
|
18
|
+
export { calculateLevelMiters, type Point2D, pointToKey, type WallMiterData, } from './systems/wall/wall-mitering';
|
|
17
19
|
export { WallSystem } from './systems/wall/wall-system';
|
|
18
20
|
export { WindowSystem } from './systems/window/window-system';
|
|
19
21
|
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":"AAEA,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EACL,aAAa,EACb,WAAW,GACZ,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9F,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAExE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,KAAK,EACV,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAE9B,cAAc,UAAU,CAAA;AACxB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,iBAAiB,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EACL,aAAa,EACb,WAAW,GACZ,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9F,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAExE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE7D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,KAAK,EACV,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAE9B,cAAc,UAAU,CAAA;AACxB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,iBAAiB,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,oBAAoB,EACpB,KAAK,OAAO,EACZ,UAAU,EACV,KAAK,aAAa,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,8 @@ export { DoorSystem } from './systems/door/door-system';
|
|
|
20
20
|
export { ItemSystem } from './systems/item/item-system';
|
|
21
21
|
export { RoofSystem } from './systems/roof/roof-system';
|
|
22
22
|
export { SlabSystem } from './systems/slab/slab-system';
|
|
23
|
+
export { DEFAULT_WALL_HEIGHT, DEFAULT_WALL_THICKNESS, getWallPlanFootprint, getWallThickness, } from './systems/wall/wall-footprint';
|
|
24
|
+
export { calculateLevelMiters, pointToKey, } from './systems/wall/wall-mitering';
|
|
23
25
|
export { WallSystem } from './systems/wall/wall-system';
|
|
24
26
|
export { WindowSystem } from './systems/window/window-system';
|
|
25
27
|
export { isObject } from './utils/types';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-detection.d.ts","sourceRoot":"","sources":["../../src/lib/space-detection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAMzC,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,GAAG,EAAE,iBAAiB;AAClC,WAAW,EAAE,GAAG,GACf,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"space-detection.d.ts","sourceRoot":"","sources":["../../src/lib/space-detection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAMzC,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;CACpB,CAAA;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,GAAG,EAAE,iBAAiB;AAClC,WAAW,EAAE,GAAG,GACf,MAAM,IAAI,CAkGZ;AA+DD,KAAK,cAAc,GAAG;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;IAC9C,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;CAC9C,CAAA;AAMD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EAAE,EACjB,cAAc,SAAM,GACnB;IACD,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB,CAqBA;AAsWD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAkBjF"}
|
|
@@ -76,10 +76,12 @@ editorStore) {
|
|
|
76
76
|
// Run detection for affected levels
|
|
77
77
|
if (levelsToUpdate.size > 0) {
|
|
78
78
|
isProcessing = true;
|
|
79
|
+
sceneStore.temporal.getState().pause();
|
|
79
80
|
try {
|
|
80
81
|
runSpaceDetection(Array.from(levelsToUpdate), sceneStore, editorStore, nodes);
|
|
81
82
|
}
|
|
82
83
|
finally {
|
|
84
|
+
sceneStore.temporal.getState().resume();
|
|
83
85
|
isProcessing = false;
|
|
84
86
|
}
|
|
85
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-actions.d.ts","sourceRoot":"","sources":["../../../src/store/actions/node-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"node-actions.d.ts","sourceRoot":"","sources":["../../../src/store/actions/node-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAQ9C,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,KAAK;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,SA2C/C,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,SAAS;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAAE,SAgErD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,KAAK,SAAS,EAAE,SA4EjB,CAAA"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Track pending RAF for updateNodesAction to prevent multiple queued callbacks
|
|
2
|
+
let pendingRafId = null;
|
|
3
|
+
let pendingUpdates = new Set();
|
|
1
4
|
export const createNodesAction = (set, get, ops) => {
|
|
2
5
|
set((state) => {
|
|
3
6
|
const nextNodes = { ...state.nodes };
|
|
@@ -39,6 +42,7 @@ export const createNodesAction = (set, get, ops) => {
|
|
|
39
42
|
};
|
|
40
43
|
export const updateNodesAction = (set, get, updates) => {
|
|
41
44
|
const parentsToUpdate = new Set();
|
|
45
|
+
const idsToMarkDirty = new Set();
|
|
42
46
|
set((state) => {
|
|
43
47
|
const nextNodes = { ...state.nodes };
|
|
44
48
|
for (const { id, data } of updates) {
|
|
@@ -73,14 +77,22 @@ export const updateNodesAction = (set, get, updates) => {
|
|
|
73
77
|
}
|
|
74
78
|
return { nodes: nextNodes };
|
|
75
79
|
});
|
|
76
|
-
//
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
// Collect all IDs that need to be marked dirty
|
|
81
|
+
updates.forEach((u) => idsToMarkDirty.add(u.id));
|
|
82
|
+
parentsToUpdate.forEach((pId) => idsToMarkDirty.add(pId));
|
|
83
|
+
// Add to pending updates set
|
|
84
|
+
idsToMarkDirty.forEach((id) => pendingUpdates.add(id));
|
|
85
|
+
// Cancel any pending RAF and schedule a new one
|
|
86
|
+
if (pendingRafId !== null) {
|
|
87
|
+
cancelAnimationFrame(pendingRafId);
|
|
88
|
+
}
|
|
89
|
+
pendingRafId = requestAnimationFrame(() => {
|
|
90
|
+
// Mark all pending updates as dirty
|
|
91
|
+
pendingUpdates.forEach((id) => {
|
|
92
|
+
get().markDirty(id);
|
|
83
93
|
});
|
|
94
|
+
pendingUpdates.clear();
|
|
95
|
+
pendingRafId = null;
|
|
84
96
|
});
|
|
85
97
|
};
|
|
86
98
|
export const deleteNodesAction = (set, get, ids) => {
|
|
@@ -89,7 +101,25 @@ export const deleteNodesAction = (set, get, ids) => {
|
|
|
89
101
|
const nextNodes = { ...state.nodes };
|
|
90
102
|
const nextCollections = { ...state.collections };
|
|
91
103
|
let nextRootIds = [...state.rootNodeIds];
|
|
104
|
+
// Collect all IDs to delete (including descendants) in a first pass
|
|
105
|
+
// This avoids issues with recursive calls during state mutation
|
|
106
|
+
const allIdsToDelete = new Set();
|
|
107
|
+
const collectDescendants = (id) => {
|
|
108
|
+
const node = nextNodes[id];
|
|
109
|
+
if (!node)
|
|
110
|
+
return;
|
|
111
|
+
allIdsToDelete.add(id);
|
|
112
|
+
if ('children' in node && node.children) {
|
|
113
|
+
for (const childId of node.children) {
|
|
114
|
+
collectDescendants(childId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
92
118
|
for (const id of ids) {
|
|
119
|
+
collectDescendants(id);
|
|
120
|
+
}
|
|
121
|
+
// Now process all nodes for deletion
|
|
122
|
+
for (const id of allIdsToDelete) {
|
|
93
123
|
const node = nextNodes[id];
|
|
94
124
|
if (!node)
|
|
95
125
|
continue;
|
|
@@ -118,11 +148,6 @@ export const deleteNodesAction = (set, get, ids) => {
|
|
|
118
148
|
}
|
|
119
149
|
// 4. Delete the node itself
|
|
120
150
|
delete nextNodes[id];
|
|
121
|
-
// Inside the deleteNodes loop
|
|
122
|
-
if ('children' in node && node.children.length > 0) {
|
|
123
|
-
// Recursively delete all children first
|
|
124
|
-
get().deleteNodes(node.children);
|
|
125
|
-
}
|
|
126
151
|
}
|
|
127
152
|
return { nodes: nextNodes, rootNodeIds: nextRootIds, collections: nextCollections };
|
|
128
153
|
});
|
|
@@ -36,5 +36,10 @@ type UseSceneStore = UseBoundStore<StoreApi<SceneState>> & {
|
|
|
36
36
|
};
|
|
37
37
|
declare const useScene: UseSceneStore;
|
|
38
38
|
export default useScene;
|
|
39
|
+
/**
|
|
40
|
+
* Clears temporal history tracking variables to prevent memory leaks.
|
|
41
|
+
* Should be called when unloading a scene to release node references.
|
|
42
|
+
*/
|
|
43
|
+
export declare function clearTemporalTracking(): void;
|
|
39
44
|
export declare function clearSceneHistory(): void;
|
|
40
45
|
//# sourceMappingURL=use-scene.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-scene.d.ts","sourceRoot":"","sources":["../../src/store/use-scene.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAIrE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA8CzD,MAAM,MAAM,UAAU,GAAG;IAEvB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAGjC,WAAW,EAAE,SAAS,EAAE,CAAA;IAGxB,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAG1B,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAG7C,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAE/E,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAEnC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;IACzD,WAAW,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAErE,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAE3E,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IACnC,WAAW,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAGvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,YAAY,CAAA;IACvE,gBAAgB,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;IAC5C,gBAAgB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IACnF,eAAe,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IAC9D,oBAAoB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;CACpE,CAAA;AAID,KAAK,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG;IACzD,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;CAC7F,CAAA;AAED,QAAA,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"use-scene.d.ts","sourceRoot":"","sources":["../../src/store/use-scene.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAIrE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA8CzD,MAAM,MAAM,UAAU,GAAG;IAEvB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAGjC,WAAW,EAAE,SAAS,EAAE,CAAA;IAGxB,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAG1B,WAAW,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAG7C,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAE/E,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAEnC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;IACzD,WAAW,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAErE,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAE3E,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IACnC,WAAW,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAGvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,YAAY,CAAA;IACvE,gBAAgB,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;IAC5C,gBAAgB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAA;IACnF,eAAe,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IAC9D,oBAAoB,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;CACpE,CAAA;AAID,KAAK,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG;IACzD,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;CAC7F,CAAA;AAED,QAAA,MAAM,QAAQ,EAAE,aA0Mf,CAAA;AAED,eAAe,QAAQ,CAAA;AAOvB;;;GAGG;AACH,wBAAgB,qBAAqB,SAIpC;AAED,wBAAgB,iBAAiB,SAGhC"}
|
package/dist/store/use-scene.js
CHANGED
|
@@ -56,6 +56,10 @@ const useScene = create()(temporal((set, get) => ({
|
|
|
56
56
|
// 4. Collections
|
|
57
57
|
collections: {},
|
|
58
58
|
unloadScene: () => {
|
|
59
|
+
// Clear temporal tracking to prevent memory leaks from stale node references
|
|
60
|
+
prevPastLength = 0;
|
|
61
|
+
prevFutureLength = 0;
|
|
62
|
+
prevNodesSnapshot = null;
|
|
59
63
|
set({
|
|
60
64
|
nodes: {},
|
|
61
65
|
rootNodeIds: [],
|
|
@@ -222,12 +226,19 @@ export default useScene;
|
|
|
222
226
|
let prevPastLength = 0;
|
|
223
227
|
let prevFutureLength = 0;
|
|
224
228
|
let prevNodesSnapshot = null;
|
|
225
|
-
|
|
226
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Clears temporal history tracking variables to prevent memory leaks.
|
|
231
|
+
* Should be called when unloading a scene to release node references.
|
|
232
|
+
*/
|
|
233
|
+
export function clearTemporalTracking() {
|
|
227
234
|
prevPastLength = 0;
|
|
228
235
|
prevFutureLength = 0;
|
|
229
236
|
prevNodesSnapshot = null;
|
|
230
237
|
}
|
|
238
|
+
export function clearSceneHistory() {
|
|
239
|
+
useScene.temporal.getState().clear();
|
|
240
|
+
clearTemporalTracking();
|
|
241
|
+
}
|
|
231
242
|
// Subscribe to the temporal store (Undo/Redo events)
|
|
232
243
|
useScene.temporal.subscribe((state) => {
|
|
233
244
|
const currentPastLength = state.pastStates.length;
|
|
@@ -256,8 +267,18 @@ useScene.temporal.subscribe((state) => {
|
|
|
256
267
|
// Nodes that were deleted (exist in prev but not current)
|
|
257
268
|
for (const [id, node] of Object.entries(snapshotBefore)) {
|
|
258
269
|
if (!currentNodes[id]) {
|
|
259
|
-
|
|
260
|
-
|
|
270
|
+
const parentId = node.parentId;
|
|
271
|
+
if (parentId) {
|
|
272
|
+
markDirty(parentId);
|
|
273
|
+
// Mark sibling nodes dirty so they can update their geometry
|
|
274
|
+
// (e.g. adjacent walls need to recalculate miter/junction geometry)
|
|
275
|
+
const parent = currentNodes[parentId];
|
|
276
|
+
if (parent && 'children' in parent) {
|
|
277
|
+
for (const childId of parent.children) {
|
|
278
|
+
markDirty(childId);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
261
282
|
}
|
|
262
283
|
}
|
|
263
284
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WallNode } from '../../schema';
|
|
2
|
+
import { type Point2D, type WallMiterData } from './wall-mitering';
|
|
3
|
+
export declare const DEFAULT_WALL_THICKNESS = 0.1;
|
|
4
|
+
export declare const DEFAULT_WALL_HEIGHT = 2.5;
|
|
5
|
+
export declare function getWallThickness(wallNode: WallNode): number;
|
|
6
|
+
export declare function getWallPlanFootprint(wallNode: WallNode, miterData: WallMiterData): Point2D[];
|
|
7
|
+
//# sourceMappingURL=wall-footprint.d.ts.map
|
|
@@ -0,0 +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;AAC5C,OAAO,EAAE,KAAK,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE9E,eAAO,MAAM,sBAAsB,MAAM,CAAA;AACzC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE3D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,GAAG,OAAO,EAAE,CAkD5F"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { pointToKey } from './wall-mitering';
|
|
2
|
+
export const DEFAULT_WALL_THICKNESS = 0.1;
|
|
3
|
+
export const DEFAULT_WALL_HEIGHT = 2.5;
|
|
4
|
+
export function getWallThickness(wallNode) {
|
|
5
|
+
return wallNode.thickness ?? DEFAULT_WALL_THICKNESS;
|
|
6
|
+
}
|
|
7
|
+
export function getWallPlanFootprint(wallNode, miterData) {
|
|
8
|
+
const { junctionData } = miterData;
|
|
9
|
+
const wallStart = { x: wallNode.start[0], y: wallNode.start[1] };
|
|
10
|
+
const wallEnd = { x: wallNode.end[0], y: wallNode.end[1] };
|
|
11
|
+
const thickness = getWallThickness(wallNode);
|
|
12
|
+
const halfT = thickness / 2;
|
|
13
|
+
const v = { x: wallEnd.x - wallStart.x, y: wallEnd.y - wallStart.y };
|
|
14
|
+
const L = Math.sqrt(v.x * v.x + v.y * v.y);
|
|
15
|
+
if (L < 1e-9) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
const nUnit = { x: -v.y / L, y: v.x / L };
|
|
19
|
+
const keyStart = pointToKey(wallStart);
|
|
20
|
+
const keyEnd = pointToKey(wallEnd);
|
|
21
|
+
const startJunction = junctionData.get(keyStart)?.get(wallNode.id);
|
|
22
|
+
const endJunction = junctionData.get(keyEnd)?.get(wallNode.id);
|
|
23
|
+
const pStartLeft = startJunction?.left || {
|
|
24
|
+
x: wallStart.x + nUnit.x * halfT,
|
|
25
|
+
y: wallStart.y + nUnit.y * halfT,
|
|
26
|
+
};
|
|
27
|
+
const pStartRight = startJunction?.right || {
|
|
28
|
+
x: wallStart.x - nUnit.x * halfT,
|
|
29
|
+
y: wallStart.y - nUnit.y * halfT,
|
|
30
|
+
};
|
|
31
|
+
// Junction offsets are stored relative to the outgoing direction.
|
|
32
|
+
const pEndLeft = endJunction?.right || {
|
|
33
|
+
x: wallEnd.x + nUnit.x * halfT,
|
|
34
|
+
y: wallEnd.y + nUnit.y * halfT,
|
|
35
|
+
};
|
|
36
|
+
const pEndRight = endJunction?.left || {
|
|
37
|
+
x: wallEnd.x - nUnit.x * halfT,
|
|
38
|
+
y: wallEnd.y - nUnit.y * halfT,
|
|
39
|
+
};
|
|
40
|
+
const polygon = [pStartRight, pEndRight];
|
|
41
|
+
if (endJunction) {
|
|
42
|
+
polygon.push(wallEnd);
|
|
43
|
+
}
|
|
44
|
+
polygon.push(pEndLeft, pStartLeft);
|
|
45
|
+
if (startJunction) {
|
|
46
|
+
polygon.push(wallStart);
|
|
47
|
+
}
|
|
48
|
+
return polygon;
|
|
49
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wall-system.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-system.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"wall-system.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-system.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,KAAK,EAAE,OAAO,EAAa,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGhE,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAA;AASxB,eAAO,MAAM,UAAU,YAsDtB,CAAA;AA0DD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,OAAO,EAAE,EACxB,SAAS,EAAE,aAAa,EACxB,aAAa,SAAI,oFA+FlB"}
|
|
@@ -6,13 +6,13 @@ import { sceneRegistry } from '../../hooks/scene-registry/scene-registry';
|
|
|
6
6
|
import { spatialGridManager } from '../../hooks/spatial-grid/spatial-grid-manager';
|
|
7
7
|
import { resolveLevelId } from '../../hooks/spatial-grid/spatial-grid-sync';
|
|
8
8
|
import useScene from '../../store/use-scene';
|
|
9
|
-
import {
|
|
9
|
+
import { DEFAULT_WALL_HEIGHT, getWallPlanFootprint, getWallThickness } from './wall-footprint';
|
|
10
|
+
import { calculateLevelMiters, getAdjacentWallIds, } from './wall-mitering';
|
|
10
11
|
// Reusable CSG evaluator for better performance
|
|
11
12
|
const csgEvaluator = new Evaluator();
|
|
12
13
|
// ============================================================================
|
|
13
14
|
// WALL SYSTEM
|
|
14
15
|
// ============================================================================
|
|
15
|
-
let useFrameNb = 0;
|
|
16
16
|
export const WallSystem = () => {
|
|
17
17
|
const dirtyNodes = useScene((state) => state.dirtyNodes);
|
|
18
18
|
const clearDirty = useScene((state) => state.clearDirty);
|
|
@@ -22,7 +22,6 @@ export const WallSystem = () => {
|
|
|
22
22
|
const nodes = useScene.getState().nodes;
|
|
23
23
|
// Collect dirty walls and their levels
|
|
24
24
|
const dirtyWallsByLevel = new Map();
|
|
25
|
-
useFrameNb += 1;
|
|
26
25
|
dirtyNodes.forEach((id) => {
|
|
27
26
|
const node = nodes[id];
|
|
28
27
|
if (!node || node.type !== 'wall')
|
|
@@ -117,60 +116,22 @@ function updateWallGeometry(wallId, miterData) {
|
|
|
117
116
|
* then we transform to wall-local for the 3D mesh.
|
|
118
117
|
*/
|
|
119
118
|
export function generateExtrudedWall(wallNode, childrenNodes, miterData, slabElevation = 0) {
|
|
120
|
-
const { junctionData } = miterData;
|
|
121
119
|
const wallStart = { x: wallNode.start[0], y: wallNode.start[1] };
|
|
122
120
|
const wallEnd = { x: wallNode.end[0], y: wallNode.end[1] };
|
|
123
121
|
// Positive slab: shift the whole wall up (full height preserved)
|
|
124
122
|
// Negative slab: extend wall downward so top stays fixed at wallNode.height
|
|
125
|
-
const wallHeight = wallNode.height ??
|
|
123
|
+
const wallHeight = wallNode.height ?? DEFAULT_WALL_HEIGHT;
|
|
126
124
|
const height = slabElevation > 0 ? wallHeight : wallHeight - slabElevation;
|
|
127
|
-
const thickness = wallNode
|
|
128
|
-
const halfT = thickness / 2;
|
|
125
|
+
const thickness = getWallThickness(wallNode);
|
|
129
126
|
// Wall direction and normal (exactly like demo)
|
|
130
127
|
const v = { x: wallEnd.x - wallStart.x, y: wallEnd.y - wallStart.y };
|
|
131
128
|
const L = Math.sqrt(v.x * v.x + v.y * v.y);
|
|
132
129
|
if (L < 1e-9) {
|
|
133
130
|
return new THREE.BufferGeometry();
|
|
134
131
|
}
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const keyEnd = pointToKey(wallEnd);
|
|
139
|
-
const startJunction = junctionData.get(keyStart)?.get(wallNode.id);
|
|
140
|
-
const endJunction = junctionData.get(keyEnd)?.get(wallNode.id);
|
|
141
|
-
// Calculate polygon corners in world coordinates (exactly like demo)
|
|
142
|
-
// p_start_L = left side at start
|
|
143
|
-
// p_start_R = right side at start
|
|
144
|
-
// p_end_L = left side at end
|
|
145
|
-
// p_end_R = right side at end
|
|
146
|
-
const p_start_L = startJunction?.left || {
|
|
147
|
-
x: wallStart.x + nUnit.x * halfT,
|
|
148
|
-
y: wallStart.y + nUnit.y * halfT,
|
|
149
|
-
};
|
|
150
|
-
const p_start_R = startJunction?.right || {
|
|
151
|
-
x: wallStart.x - nUnit.x * halfT,
|
|
152
|
-
y: wallStart.y - nUnit.y * halfT,
|
|
153
|
-
};
|
|
154
|
-
// At end, SWAP left/right from junction data (exactly like demo)
|
|
155
|
-
// This is because junction stores left/right relative to OUTGOING direction,
|
|
156
|
-
// which is reversed at the end of the wall
|
|
157
|
-
const p_end_L = endJunction?.right || {
|
|
158
|
-
x: wallEnd.x + nUnit.x * halfT,
|
|
159
|
-
y: wallEnd.y + nUnit.y * halfT,
|
|
160
|
-
};
|
|
161
|
-
const p_end_R = endJunction?.left || {
|
|
162
|
-
x: wallEnd.x - nUnit.x * halfT,
|
|
163
|
-
y: wallEnd.y - nUnit.y * halfT,
|
|
164
|
-
};
|
|
165
|
-
// Build polygon points (exactly like demo)
|
|
166
|
-
// Order: start-right -> end-right -> [end center] -> end-left -> start-left -> [start center]
|
|
167
|
-
const polyPoints = [p_start_R, p_end_R];
|
|
168
|
-
if (endJunction) {
|
|
169
|
-
polyPoints.push(wallEnd); // Add center vertex at junction
|
|
170
|
-
}
|
|
171
|
-
polyPoints.push(p_end_L, p_start_L);
|
|
172
|
-
if (startJunction) {
|
|
173
|
-
polyPoints.push(wallStart); // Add center vertex at junction
|
|
132
|
+
const polyPoints = getWallPlanFootprint(wallNode, miterData);
|
|
133
|
+
if (polyPoints.length < 3) {
|
|
134
|
+
return new THREE.BufferGeometry();
|
|
174
135
|
}
|
|
175
136
|
// Transform world coordinates to wall-local coordinates
|
|
176
137
|
// Wall-local: x along wall, z perpendicular (thickness direction)
|