@pascal-app/core 1.0.7 → 1.1.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.
Files changed (266) hide show
  1. package/dist/agent-operations/__fixtures__/cases.d.ts +3 -2
  2. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/native-materials.d.ts +4 -0
  4. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  5. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/place-items-cases.js +28 -0
  7. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +9567 -9563
  8. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +77 -77
  10. package/dist/agent-operations/asset-catalog.d.ts +21 -11
  11. package/dist/agent-operations/asset-catalog.d.ts.map +1 -1
  12. package/dist/agent-operations/asset-catalog.js +28 -10
  13. package/dist/agent-operations/asset-views.d.ts +8 -3
  14. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  15. package/dist/agent-operations/asset-views.js +19 -3
  16. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  17. package/dist/agent-operations/author-scene.js +2 -3
  18. package/dist/agent-operations/batch.d.ts +7 -1
  19. package/dist/agent-operations/batch.d.ts.map +1 -1
  20. package/dist/agent-operations/batch.js +17 -2
  21. package/dist/agent-operations/catalog-asset.d.ts +15 -0
  22. package/dist/agent-operations/catalog-asset.d.ts.map +1 -0
  23. package/dist/agent-operations/catalog-asset.js +4 -0
  24. package/dist/agent-operations/circulation-spaces.d.ts +1724 -1723
  25. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -1
  26. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  27. package/dist/agent-operations/design-brief.js +2 -0
  28. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  29. package/dist/agent-operations/furnish-room.js +2 -1
  30. package/dist/agent-operations/index.d.ts +3 -0
  31. package/dist/agent-operations/index.d.ts.map +1 -1
  32. package/dist/agent-operations/index.js +4 -1
  33. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  34. package/dist/agent-operations/level-reads.js +5 -2
  35. package/dist/agent-operations/move-plan.d.ts.map +1 -1
  36. package/dist/agent-operations/move-plan.js +11 -9
  37. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  38. package/dist/agent-operations/place-in-room.js +2 -1
  39. package/dist/agent-operations/place-items.d.ts.map +1 -1
  40. package/dist/agent-operations/place-items.js +2 -1
  41. package/dist/agent-operations/scene-queries.d.ts +2944 -2943
  42. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  43. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  44. package/dist/agent-operations/scene-view.js +38 -13
  45. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  46. package/dist/agent-operations/search-assets.js +6 -0
  47. package/dist/agent-operations/types.d.ts +3 -2
  48. package/dist/agent-operations/types.d.ts.map +1 -1
  49. package/dist/agent-operations/usage-checks.js +18 -3
  50. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  51. package/dist/agent-operations/verify-scene.js +4 -2
  52. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  53. package/dist/agent-operations/wall-object-observations.js +1 -1
  54. package/dist/agent-tools/assets.js +1 -1
  55. package/dist/agent-tools/wall-openings.js +2 -2
  56. package/dist/building/__fixtures__/wall-opening-cases.d.ts +13 -12
  57. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  58. package/dist/building/level-duplication.d.ts +1281 -1279
  59. package/dist/building/level-duplication.d.ts.map +1 -1
  60. package/dist/building/level-duplication.js +3 -1
  61. package/dist/building/merge-windows.d.ts.map +1 -1
  62. package/dist/building/merge-windows.js +4 -3
  63. package/dist/building/wall-openings.d.ts +95 -81
  64. package/dist/building/wall-openings.d.ts.map +1 -1
  65. package/dist/building/wall-openings.js +74 -25
  66. package/dist/commands/structure/shared.d.ts +3203 -3202
  67. package/dist/commands/structure/shared.d.ts.map +1 -1
  68. package/dist/commands/structure/zone-wall-merge.d.ts +2028 -2025
  69. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  70. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  71. package/dist/contracts/reference-inventory.js +0 -1
  72. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +6 -1
  73. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  74. package/dist/hooks/spatial-grid/spatial-grid-manager.js +30 -9
  75. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2101 -2100
  76. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  77. package/dist/hooks/spatial-grid/spatial-grid-sync.js +8 -4
  78. package/dist/index.d.ts +13 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +13 -4
  81. package/dist/lib/__fixtures__/mezzanine.d.ts +6428 -6424
  82. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  83. package/dist/lib/absorb-wall-separators.d.ts +2267 -2266
  84. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  85. package/dist/lib/asset-storage.d.ts.map +1 -1
  86. package/dist/lib/asset-storage.js +3 -0
  87. package/dist/lib/build-mode.d.ts +11 -0
  88. package/dist/lib/build-mode.d.ts.map +1 -0
  89. package/dist/lib/build-mode.js +24 -0
  90. package/dist/lib/corner-pair.d.ts +2 -0
  91. package/dist/lib/corner-pair.d.ts.map +1 -1
  92. package/dist/lib/door-interaction.d.ts +14 -0
  93. package/dist/lib/door-interaction.d.ts.map +1 -0
  94. package/dist/lib/door-interaction.js +62 -0
  95. package/dist/lib/elevator-support.d.ts +15 -0
  96. package/dist/lib/elevator-support.d.ts.map +1 -0
  97. package/dist/lib/elevator-support.js +40 -0
  98. package/dist/lib/floor-foundation-datum.d.ts.map +1 -1
  99. package/dist/lib/floor-foundation-datum.js +5 -1
  100. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  101. package/dist/lib/floor-intent-changes.js +6 -4
  102. package/dist/lib/floorplan/context.d.ts +95 -0
  103. package/dist/lib/floorplan/context.d.ts.map +1 -0
  104. package/dist/lib/floorplan/context.js +155 -0
  105. package/dist/lib/floorplan/index.d.ts +6 -0
  106. package/dist/lib/floorplan/index.d.ts.map +1 -0
  107. package/dist/lib/floorplan/index.js +5 -0
  108. package/dist/lib/floorplan/marks.d.ts +71 -0
  109. package/dist/lib/floorplan/marks.d.ts.map +1 -0
  110. package/dist/lib/floorplan/marks.js +157 -0
  111. package/dist/lib/floorplan/plan-math.d.ts +18 -0
  112. package/dist/lib/floorplan/plan-math.d.ts.map +1 -0
  113. package/dist/lib/floorplan/plan-math.js +82 -0
  114. package/dist/lib/floorplan/svg-paths.d.ts +17 -0
  115. package/dist/lib/floorplan/svg-paths.d.ts.map +1 -0
  116. package/dist/lib/floorplan/svg-paths.js +92 -0
  117. package/dist/lib/floorplan/wall-affordances.d.ts +31 -0
  118. package/dist/lib/floorplan/wall-affordances.d.ts.map +1 -0
  119. package/dist/lib/floorplan/wall-affordances.js +24 -0
  120. package/dist/lib/hierarchy.d.ts +19 -0
  121. package/dist/lib/hierarchy.d.ts.map +1 -0
  122. package/dist/lib/hierarchy.js +53 -0
  123. package/dist/lib/opening-floor-datum.d.ts +1 -1
  124. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  125. package/dist/lib/opening-floor-datum.js +2 -2
  126. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  127. package/dist/lib/own-floor-intent.js +2 -2
  128. package/dist/lib/polygon-boolean.d.ts.map +1 -1
  129. package/dist/lib/polygon-boolean.js +2 -1
  130. package/dist/lib/room-floor-elevation.d.ts +12 -0
  131. package/dist/lib/room-floor-elevation.d.ts.map +1 -0
  132. package/dist/lib/room-floor-elevation.js +41 -0
  133. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  134. package/dist/lib/room-floor-feasibility.js +1 -1
  135. package/dist/lib/space-detection.d.ts.map +1 -1
  136. package/dist/lib/space-detection.js +1 -0
  137. package/dist/lib/wall-face-script.d.ts.map +1 -1
  138. package/dist/lib/wall-face-script.js +3 -3
  139. package/dist/lib/window-interaction.d.ts +16 -0
  140. package/dist/lib/window-interaction.d.ts.map +1 -0
  141. package/dist/lib/window-interaction.js +82 -0
  142. package/dist/lib/zone-quantities.js +1 -1
  143. package/dist/node-slots/column.d.ts +5 -0
  144. package/dist/node-slots/column.d.ts.map +1 -1
  145. package/dist/node-slots/column.js +10 -0
  146. package/dist/registry/__fixtures__/roof-planes.d.ts +69 -0
  147. package/dist/registry/__fixtures__/roof-planes.d.ts.map +1 -0
  148. package/dist/registry/__fixtures__/roof-planes.js +59 -0
  149. package/dist/registry/index.d.ts +3 -2
  150. package/dist/registry/index.d.ts.map +1 -1
  151. package/dist/registry/index.js +2 -1
  152. package/dist/registry/registry.d.ts +5 -0
  153. package/dist/registry/registry.d.ts.map +1 -1
  154. package/dist/registry/registry.js +10 -0
  155. package/dist/registry/roofs.d.ts +34 -0
  156. package/dist/registry/roofs.d.ts.map +1 -0
  157. package/dist/registry/roofs.js +61 -0
  158. package/dist/registry/types.d.ts +54 -0
  159. package/dist/registry/types.d.ts.map +1 -1
  160. package/dist/registry/validate-relations.d.ts +5 -1
  161. package/dist/registry/validate-relations.d.ts.map +1 -1
  162. package/dist/registry/validate-relations.js +6 -2
  163. package/dist/schema/asset-url.d.ts +8 -0
  164. package/dist/schema/asset-url.d.ts.map +1 -1
  165. package/dist/schema/asset-url.js +17 -0
  166. package/dist/schema/index.d.ts +1 -1
  167. package/dist/schema/index.d.ts.map +1 -1
  168. package/dist/schema/index.js +1 -1
  169. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment-resize.js +2 -2
  171. package/dist/schema/nodes/roof-segment.d.ts +2 -0
  172. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  173. package/dist/schema/nodes/roof-segment.js +40 -2
  174. package/dist/schema/nodes/roof.d.ts +1 -1
  175. package/dist/schema/nodes/roof.d.ts.map +1 -1
  176. package/dist/schema/nodes/roof.js +13 -8
  177. package/dist/schema/nodes/wall.d.ts +1 -0
  178. package/dist/schema/nodes/wall.d.ts.map +1 -1
  179. package/dist/schema/nodes/wall.js +6 -0
  180. package/dist/schema/types.d.ts +2 -1
  181. package/dist/schema/types.d.ts.map +1 -1
  182. package/dist/services/index.d.ts +1 -1
  183. package/dist/services/index.d.ts.map +1 -1
  184. package/dist/services/index.js +1 -1
  185. package/dist/services/movement.d.ts +7 -0
  186. package/dist/services/movement.d.ts.map +1 -1
  187. package/dist/services/movement.js +13 -0
  188. package/dist/services/port-connectivity.d.ts +15 -6
  189. package/dist/services/port-connectivity.d.ts.map +1 -1
  190. package/dist/services/port-connectivity.js +83 -17
  191. package/dist/services/roof-bearing.js +2 -1
  192. package/dist/services/roof-level.d.ts.map +1 -1
  193. package/dist/services/roof-level.js +12 -2
  194. package/dist/services/roof-move.d.ts +4 -2
  195. package/dist/services/roof-move.d.ts.map +1 -1
  196. package/dist/services/roof-move.js +21 -9
  197. package/dist/services/storey.d.ts +6 -1
  198. package/dist/services/storey.d.ts.map +1 -1
  199. package/dist/services/storey.js +11 -2
  200. package/dist/spatial/usage-field/findings.d.ts +7 -1
  201. package/dist/spatial/usage-field/findings.d.ts.map +1 -1
  202. package/dist/spatial/usage-field/findings.js +42 -10
  203. package/dist/spatial/usage-field/path.d.ts.map +1 -1
  204. package/dist/spatial/usage-field/path.js +28 -18
  205. package/dist/spatial/usage-field/swings.d.ts +1 -0
  206. package/dist/spatial/usage-field/swings.d.ts.map +1 -1
  207. package/dist/spatial/usage-field/walls.d.ts +2 -0
  208. package/dist/spatial/usage-field/walls.d.ts.map +1 -1
  209. package/dist/spatial/usage-field/walls.js +18 -4
  210. package/dist/store/actions/node-actions.d.ts +2 -1
  211. package/dist/store/actions/node-actions.d.ts.map +1 -1
  212. package/dist/store/actions/node-actions.js +23 -5
  213. package/dist/store/derived-node-guard.d.ts.map +1 -1
  214. package/dist/store/derived-node-guard.js +2 -1
  215. package/dist/store/scene-annotations.d.ts +4634 -4632
  216. package/dist/store/scene-annotations.d.ts.map +1 -1
  217. package/dist/systems/document-reconcile.d.ts.map +1 -1
  218. package/dist/systems/document-reconcile.js +1 -2
  219. package/dist/systems/elevator/elevator-geometry.d.ts +25 -0
  220. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -1
  221. package/dist/systems/elevator/elevator-geometry.js +40 -8
  222. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -1
  223. package/dist/systems/elevator/elevator-opening-sync.js +4 -35
  224. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -1
  225. package/dist/systems/elevator/elevator-runtime.js +95 -18
  226. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  227. package/dist/systems/elevator/elevator-service.js +24 -4
  228. package/dist/systems/roof/roof-elevation.d.ts +11 -6
  229. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  230. package/dist/systems/roof/roof-elevation.js +26 -12
  231. package/dist/systems/slab/__fixtures__/floor-step.d.ts +5 -1
  232. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  233. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2218 -2214
  234. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  235. package/dist/systems/stair/stair-opening-preview.d.ts +3203 -3202
  236. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  237. package/dist/systems/wall/wall-curve.d.ts +10 -0
  238. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  239. package/dist/systems/wall/wall-curve.js +38 -0
  240. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  241. package/dist/systems/wall/wall-frame.js +8 -0
  242. package/dist/systems/wall/wall-merge.d.ts +9 -1
  243. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  244. package/dist/systems/wall/wall-merge.js +38 -6
  245. package/dist/systems/wall/wall-top.d.ts +10 -3
  246. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  247. package/dist/systems/wall/wall-top.js +24 -8
  248. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  249. package/dist/systems/wall/wall-topology.js +19 -1
  250. package/dist/utils/ensure-scene-openings.d.ts +5595 -5593
  251. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  252. package/dist/utils/floor-plate-migration.d.ts +2267 -2266
  253. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  254. package/dist/utils/measurement-format.d.ts +27 -0
  255. package/dist/utils/measurement-format.d.ts.map +1 -0
  256. package/dist/utils/measurement-format.js +143 -0
  257. package/dist/utils/owned-floor-opening-migration.d.ts +653 -652
  258. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  259. package/dist/utils/reconcile-structure-on-load.d.ts +1724 -1723
  260. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  261. package/dist/utils/scene-bounds.d.ts +32 -0
  262. package/dist/utils/scene-bounds.d.ts.map +1 -0
  263. package/dist/utils/scene-bounds.js +201 -0
  264. package/dist/validation/validate-build-json.d.ts.map +1 -1
  265. package/dist/validation/validate-build-json.js +3 -1
  266. package/package.json +1 -1
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwBvC;AAED,wBAAgB,qCAAqC;;mBAUlC,oBAAoB,EAAE;;EAiCxC"}
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"}
@@ -54,6 +54,16 @@ export declare function sampleWallCenterline(wall: WallCurveLike, segments?: num
54
54
  export declare function getWallCenterlineSegments(wall: WallCurveLike, segments?: number): [Point2D, Point2D][];
55
55
  export declare function constrainWallCurveOffsetToAvoidIntersections(wall: WallNode, proposedOffset: number, walls: readonly WallNode[]): number;
56
56
  export declare function getWallCurveLength(wall: WallCurveLike, segments?: number): number;
57
+ /**
58
+ * Where arc-length `station` (m along the centreline, the frame openings are placed in) projects
59
+ * onto the chord, as a fraction of it: the frame the wall body is extruded and its top sloped in.
60
+ */
61
+ export declare function getWallChordFractionAt(wall: WallCurveLike, station: number): number;
62
+ /**
63
+ * The arc-length station that projects onto chord `fraction`: the inverse of
64
+ * {@link getWallChordFractionAt}. A wall arc is at most a semicircle, so the projection only grows.
65
+ */
66
+ export declare function getWallStationAtChordFraction(wall: WallCurveLike, fraction: number): number;
57
67
  export declare function getWallSurfacePolygon(wall: Pick<WallNode | FenceNode, 'start' | 'end' | 'curveOffset' | 'thickness'> & Pick<WallNode, 'justification'>, segments?: number, miterOverrides?: WallSurfaceMiterOverrides): Point2D[];
58
68
  export declare function getWallCurveStationAtPoint(wall: WallCurveLike, point: readonly [number, number]): number;
59
69
  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;AAEvD,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;;;;;QAYpC,CAAC;QAAK,CAAC;;;QACR,CAAC;QAAK,CAAC;;;EAgBtB;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;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,aAAa,EACnB,QAAQ,SAA0B,GACjC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAOtB;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,GAC7E,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EACjC,QAAQ,SAA0B,EAClC,cAAc,CAAC,EAAE,yBAAyB,aA2B3C;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAcR"}
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;AAEvD,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;;;;;QAYpC,CAAC;QAAK,CAAC;;;QACR,CAAC;QAAK,CAAC;;;EAgBtB;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;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,aAAa,EACnB,QAAQ,SAA0B,GACjC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAOtB;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;AAYD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW3F;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,WAAW,CAAC,GAC7E,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EACjC,QAAQ,SAA0B,EAClC,cAAc,CAAC,EAAE,yBAAyB,aA2B3C;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAcR"}
@@ -237,6 +237,44 @@ export function getWallCurveLength(wall, segments = DEFAULT_SAMPLE_SEGMENTS) {
237
237
  }
238
238
  return totalLength;
239
239
  }
240
+ function chordFractionAtParam(wall, u) {
241
+ const chord = getWallChordFrame(wall);
242
+ const { point } = getWallCurveFrameAt(wall, u);
243
+ const dx = chord.end.x - chord.start.x;
244
+ const dy = chord.end.y - chord.start.y;
245
+ return clamp01(((point.x - chord.start.x) * dx + (point.y - chord.start.y) * dy) / chord.length ** 2);
246
+ }
247
+ /**
248
+ * Where arc-length `station` (m along the centreline, the frame openings are placed in) projects
249
+ * onto the chord, as a fraction of it: the frame the wall body is extruded and its top sloped in.
250
+ */
251
+ export function getWallChordFractionAt(wall, station) {
252
+ const chord = getWallChordLength(wall);
253
+ if (chord < CURVE_EPSILON)
254
+ return 0;
255
+ if (!isCurvedWall(wall))
256
+ return clamp01(station / chord);
257
+ return chordFractionAtParam(wall, station / getWallCurveLength(wall));
258
+ }
259
+ /**
260
+ * The arc-length station that projects onto chord `fraction`: the inverse of
261
+ * {@link getWallChordFractionAt}. A wall arc is at most a semicircle, so the projection only grows.
262
+ */
263
+ export function getWallStationAtChordFraction(wall, fraction) {
264
+ const chord = getWallChordLength(wall);
265
+ if (!isCurvedWall(wall) || chord < CURVE_EPSILON)
266
+ return clamp01(fraction) * chord;
267
+ let lo = 0;
268
+ let hi = 1;
269
+ for (let step = 0; step < 40; step += 1) {
270
+ const mid = (lo + hi) / 2;
271
+ if (chordFractionAtParam(wall, mid) < fraction)
272
+ lo = mid;
273
+ else
274
+ hi = mid;
275
+ }
276
+ return ((lo + hi) / 2) * getWallCurveLength(wall);
277
+ }
240
278
  export function getWallSurfacePolygon(wall, segments = DEFAULT_SAMPLE_SEGMENTS, miterOverrides) {
241
279
  const { a, b } = getWallFaceOffsets(wall);
242
280
  const count = Math.max(1, segments);
@@ -1 +1 @@
1
- {"version":3,"file":"wall-frame.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK9C,MAAM,MAAM,iBAAiB,GAAG,GAAG,GAAG,GAAG,CAAA;AACzC,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtD,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,eAAe,CAAC,CAAA;AAC9D,KAAK,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,CAAA;AAE3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,eAAe,CAKnE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAG/D;AAiBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAEhF;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,iBAAiB,GACtB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAElC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAGlF;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAC9C,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChD,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9C,iBAAiB,GAAG,IAAI,CAkC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,CAEtF;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,GACzB,iBAAiB,GAAG,SAAS,CAE/B;AAED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAEjC;AAmBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiDtE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,KAAK,CAAC;IAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;CAAE,CAAC,CAKtE"}
1
+ {"version":3,"file":"wall-frame.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-frame.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK9C,MAAM,MAAM,iBAAiB,GAAG,GAAG,GAAG,GAAG,CAAA;AACzC,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtD,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,eAAe,CAAC,CAAA;AAC9D,KAAK,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,CAAA;AAE3D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,eAAe,CAKnE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAG/D;AAiBD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAEhF;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,iBAAiB,GACtB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAElC;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAGlF;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAC9C,aAAa,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAChD,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9C,iBAAiB,GAAG,IAAI,CAkC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,QAAQ,CAEtF;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,GACzB,iBAAiB,GAAG,SAAS,CAE/B;AAED,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAEjC;AAmBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyDtE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,GAAG,SAAS,GAC3C,KAAK,CAAC;IAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;CAAE,CAAC,CAKtE"}
@@ -124,6 +124,14 @@ export function reverseWallDirection(wall) {
124
124
  ? {}
125
125
  : { justification: wall.justification === 'a' ? 'b' : 'a' }),
126
126
  ...(wall.curveOffset === undefined ? {} : { curveOffset: -wall.curveOffset }),
127
+ // The old end's top becomes the start. A storey-bound start has no stored height to lift, so
128
+ // only the slope turns; readers that need its heights resolve them (`mergedWallTop`).
129
+ ...(wall.endHeightOffset
130
+ ? {
131
+ endHeightOffset: -wall.endHeightOffset,
132
+ ...(wall.height === undefined ? {} : { height: wall.height + wall.endHeightOffset }),
133
+ }
134
+ : {}),
127
135
  ...(wall.slots === undefined
128
136
  ? {}
129
137
  : {
@@ -10,7 +10,8 @@ export declare function getWallEndpointAtPoint(wall: Pick<WallNode, 'start' | 'e
10
10
  * The delete heal is strict: room sides must match, and a wall following the
11
11
  * storey never joins one with an explicit height. An explicit merge compares
12
12
  * what is visible instead — `heightOf` resolves each wall's actual height — and
13
- * leaves the sides to room detection, which reclassifies the merged wall.
13
+ * leaves the sides to room detection, which reclassifies the merged wall. Sloped
14
+ * tops are matched by `mergedWallTop`, which also builds the merged top.
14
15
  */
15
16
  export declare function wallStyleMismatch(a: WallNode, b: WallNode, options: {
16
17
  sides: boolean;
@@ -36,6 +37,13 @@ export declare function planMergedZoneReferences(nodes: Record<AnyNodeId, AnyNod
36
37
  data: Partial<ZoneNode>;
37
38
  }> | null;
38
39
  export declare function areWallStylesCompatible(a: WallNode, b: WallNode): boolean;
40
+ /**
41
+ * The kept wall's top once `secondary` joins it at `joint`: nothing changes between flat walls;
42
+ * sloped ones take the start height and the summed end offset along the kept wall. Null when the
43
+ * tops don't continue one line — a step at the joint or a different rise per metre.
44
+ * `heightAt` reads a wall's body height at a chord fraction.
45
+ */
46
+ export declare function mergedWallTop(primary: WallNode, secondary: WallNode, joint: [number, number], heightAt: (wall: WallNode, t: number) => number): Pick<WallNode, 'height' | 'endHeightOffset'> | null;
39
47
  export declare function areWallsCollinearAcrossPoint(a: WallNode, b: WallNode, sharedPoint: [number, number]): boolean;
40
48
  export declare function resolveMergedWallEndpoints(primary: WallNode, secondary: WallNode, sharedPoint: [number, number]): {
41
49
  start: [number, number];
@@ -1 +1 @@
1
- {"version":3,"file":"wall-merge.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-merge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAMd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,cAAc,CAAA;AAGrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAK1D,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAY5E,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,OAAO,GAAG,KAAK,GAAG,IAAI,CAIxB;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,QAAQ,EACX,CAAC,EAAE,QAAQ,EACX,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAA;CAAE,GACjE,MAAM,GAAG,IAAI,CAiCf;AA4CD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,cAAc,EAAE,GAAG,IAAI,CAqEzB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC,GAAG,IAAI,CA+C1D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,WAE/D;AAED,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,QAAQ,EACX,CAAC,EAAE,QAAQ,EACX,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,WAgB9B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAkBpD;AA8BD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,YAAY,EAAE,SAAS,EACvB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAChC,oBAAoB,EAAE,CAyDxB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,SAAS,SAAS,EAAE,GAC5B;IAAE,OAAO,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;CAAE,CA2G1D"}
1
+ {"version":3,"file":"wall-merge.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-merge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAMd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,cAAc,CAAA;AAGrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAK1D,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAY5E,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC,EACrC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GACtB,OAAO,GAAG,KAAK,GAAG,IAAI,CAIxB;AAMD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,QAAQ,EACX,CAAC,EAAE,QAAQ,EACX,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAA;CAAE,GACjE,MAAM,GAAG,IAAI,CAkCf;AA4CD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,cAAc,EAAE,GAAG,IAAI,CAqEzB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,KAAK,CAAC;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;CAAE,CAAC,GAAG,IAAI,CA+C1D;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,WAE/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,GAC9C,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAkBrD;AAED,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,QAAQ,EACX,CAAC,EAAE,QAAQ,EACX,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,WAgB9B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAkBpD;AA8BD,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,QAAQ,EACnB,YAAY,EAAE,SAAS,EACvB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAChC,oBAAoB,EAAE,CAyDxB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,SAAS,SAAS,EAAE,GAC5B;IAAE,OAAO,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;CAAE,CAgH1D"}
@@ -25,7 +25,8 @@ function getWallFreeEndpoint(wall, sharedPoint) {
25
25
  * The delete heal is strict: room sides must match, and a wall following the
26
26
  * storey never joins one with an explicit height. An explicit merge compares
27
27
  * what is visible instead — `heightOf` resolves each wall's actual height — and
28
- * leaves the sides to room detection, which reclassifies the merged wall.
28
+ * leaves the sides to room detection, which reclassifies the merged wall. Sloped
29
+ * tops are matched by `mergedWallTop`, which also builds the merged top.
29
30
  */
30
31
  export function wallStyleMismatch(a, b, options) {
31
32
  if ((a.parentId ?? null) !== (b.parentId ?? null))
@@ -41,10 +42,11 @@ export function wallStyleMismatch(a, b, options) {
41
42
  if (a.justification !== alignedB.justification)
42
43
  return 'justification';
43
44
  const { heightOf } = options;
44
- if (heightOf
45
- ? Math.abs(heightOf(a) - heightOf(b)) > 1e-6
46
- : (a.height == null) !== (b.height == null) ||
47
- Math.abs((a.height ?? 0) - (b.height ?? 0)) > 1e-6)
45
+ if (!(a.endHeightOffset || b.endHeightOffset) &&
46
+ (heightOf
47
+ ? Math.abs(heightOf(a) - heightOf(b)) > 1e-6
48
+ : (a.height == null) !== (b.height == null) ||
49
+ Math.abs((a.height ?? 0) - (b.height ?? 0)) > 1e-6))
48
50
  return 'height';
49
51
  // Faces are compared as the merged wall will carry them: b read in a's direction. An unpainted
50
52
  // face's default follows its room side, which room detection reclassifies, so it is set aside.
@@ -225,6 +227,32 @@ export function planMergedZoneReferences(nodes, primary, secondary, mergedStart,
225
227
  export function areWallStylesCompatible(a, b) {
226
228
  return wallStyleMismatch(a, b, { sides: true }) === null;
227
229
  }
230
+ /**
231
+ * The kept wall's top once `secondary` joins it at `joint`: nothing changes between flat walls;
232
+ * sloped ones take the start height and the summed end offset along the kept wall. Null when the
233
+ * tops don't continue one line — a step at the joint or a different rise per metre.
234
+ * `heightAt` reads a wall's body height at a chord fraction.
235
+ */
236
+ export function mergedWallTop(primary, secondary, joint, heightAt) {
237
+ if (!(primary.endHeightOffset || secondary.endHeightOffset))
238
+ return {};
239
+ const reversed = readsBackwards(secondary, primary.start, primary.end);
240
+ const along = (wall, backwards) => {
241
+ const heights = [heightAt(wall, 0), heightAt(wall, 1)];
242
+ const [from, to] = backwards ? [heights[1], heights[0]] : [heights[0], heights[1]];
243
+ return { from, to, rise: (to - from) / Math.max(wallLength(wall), 1e-9) };
244
+ };
245
+ const primaryFirst = getWallEndpointAtPoint(primary, joint) === 'end';
246
+ const first = primaryFirst ? along(primary, false) : along(secondary, reversed);
247
+ const second = primaryFirst ? along(secondary, reversed) : along(primary, false);
248
+ if (Math.abs(first.to - second.from) > 1e-6 || Math.abs(first.rise - second.rise) > 1e-6)
249
+ return null;
250
+ return {
251
+ // A start that stays where it was keeps its height mode, storey-bound included.
252
+ height: primaryFirst ? primary.height : reversed ? first.from : secondary.height,
253
+ endHeightOffset: first.to - first.from + (second.to - second.from),
254
+ };
255
+ }
228
256
  export function areWallsCollinearAcrossPoint(a, b, sharedPoint) {
229
257
  const freeA = getWallFreeEndpoint(a, sharedPoint);
230
258
  const freeB = getWallFreeEndpoint(b, sharedPoint);
@@ -385,10 +413,13 @@ export function planWallMerge(nodes, wallIds) {
385
413
  throw Error('Another wall meets this joint, so merging would disconnect it.');
386
414
  const mismatch = wallStyleMismatch(merged, next, {
387
415
  sides: false,
388
- heightOf: (wall) => getWallEffectiveHeightForNodes(wall, virtual),
416
+ heightOf: (wall) => getWallEffectiveHeightForNodes(wall, virtual, 0),
389
417
  });
390
418
  if (mismatch)
391
419
  throw Error(`These walls have a different ${mismatch}.`);
420
+ const top = mergedWallTop(merged, next, joint, (wall, t) => getWallEffectiveHeightForNodes(wall, virtual, t));
421
+ if (!top)
422
+ throw Error('These walls have a different slope.');
392
423
  const { start, end } = resolveMergedWallEndpoints(merged, next, joint);
393
424
  const faceRegions = mergeWallFaceRegions([merged, next], start, end);
394
425
  if (!faceRegions)
@@ -402,6 +433,7 @@ export function planWallMerge(nodes, wallIds) {
402
433
  const { faceRegions: _regions, ...kept } = merged;
403
434
  merged = {
404
435
  ...kept,
436
+ ...top,
405
437
  ...(faceRegions.length > 0 ? { faceRegions } : {}),
406
438
  start,
407
439
  end,
@@ -7,6 +7,12 @@ import type { WallNode } from '../../schema/nodes/wall.js';
7
7
  * would collapse below this minimum.
8
8
  */
9
9
  export declare const MIN_WALL_HEIGHT = 0.5;
10
+ export declare const MIN_WALL_END_HEIGHT = 0.01;
11
+ /**
12
+ * Clamps a wall's end-height offset so the lower end of the wall never
13
+ * collapses below `minEndHeight` (0.01 m by default).
14
+ */
15
+ export declare function clampWallEndHeightOffset(endHeightOffset: number | undefined, bodyHeight: number, minEndHeight?: number): number;
10
16
  export declare function wallFollowsStorey(wall: Pick<WallNode, 'height' | 'supportSlabId' | 'wallType'>, authoredStoreyHeight: number | null): boolean;
11
17
  /**
12
18
  * Wall-top inversion (vertical building model): a wall with no stored
@@ -18,9 +24,10 @@ export declare function wallFollowsStorey(wall: Pick<WallNode, 'height' | 'suppo
18
24
  * Other explicit walls stand on their elected support; ground-hosted walls
19
25
  * always retain their authored body height.
20
26
  *
21
- * Returns the top in level-local Y (same frame as `electedBase`).
27
+ * Returns the top in level-local Y (same frame as `electedBase`) at chord fraction `t`
28
+ * ($t = 0$ is the start, $t = 1$ the end); a sloped top differs along the wall.
22
29
  */
23
- export declare function resolveWallTop(wall: Pick<WallNode, 'height' | 'supportSlabId' | 'wallType'>, storeyHeight: number, electedBase: number, authoredStoreyHeight?: number | null): number;
30
+ export declare function resolveWallTop(wall: Pick<WallNode, 'height' | 'supportSlabId' | 'wallType' | 'endHeightOffset'>, storeyHeight: number, electedBase: number, authoredStoreyHeight?: number | null, t?: number): number;
24
31
  /**
25
32
  * Extruded height of the wall body: {@link resolveWallTop} minus the
26
33
  * elected base. Base convention: the elected slab-support elevation itself
@@ -35,5 +42,5 @@ export declare function resolveWallTop(wall: Pick<WallNode, 'height' | 'supportS
35
42
  * slab reaches the storey plane; callers own the degenerate-geometry
36
43
  * policy.
37
44
  */
38
- export declare function resolveWallEffectiveHeight(wall: Pick<WallNode, 'height' | 'supportSlabId'>, storeyHeight: number, electedBase: number, authoredStoreyHeight?: number | null): number;
45
+ export declare function resolveWallEffectiveHeight(wall: Pick<WallNode, 'height' | 'supportSlabId' | 'wallType' | 'endHeightOffset'>, storeyHeight: number, electedBase: number, authoredStoreyHeight?: number | null, t?: number): number;
39
46
  //# sourceMappingURL=wall-top.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wall-top.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-top.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC,EAC7D,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAClC,OAAO,CAST;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC,EAC7D,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE,MAAM,GAAG,IAAmB,GACjD,MAAM,CAIR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAAC,EAChD,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE,MAAM,GAAG,IAAmB,GACjD,MAAM,CAER"}
1
+ {"version":3,"file":"wall-top.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-top.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAClC,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAEvC;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,YAAY,SAAsB,GACjC,MAAM,CAKR;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,CAAC,EAC7D,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAClC,OAAO,CAST;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAC,EACjF,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE,MAAM,GAAG,IAAmB,EAClD,CAAC,SAAI,GACJ,MAAM,CAOR;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAC,EACjF,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE,MAAM,GAAG,IAAmB,EAClD,CAAC,SAAI,GACJ,MAAM,CAER"}
@@ -7,6 +7,18 @@ import { RAILING_GUARD_HEIGHT } from '../../schema/nodes/railing-wall.js';
7
7
  * would collapse below this minimum.
8
8
  */
9
9
  export const MIN_WALL_HEIGHT = 0.5;
10
+ export const MIN_WALL_END_HEIGHT = 0.01;
11
+ /**
12
+ * Clamps a wall's end-height offset so the lower end of the wall never
13
+ * collapses below `minEndHeight` (0.01 m by default).
14
+ */
15
+ export function clampWallEndHeightOffset(endHeightOffset, bodyHeight, minEndHeight = MIN_WALL_END_HEIGHT) {
16
+ if (!endHeightOffset)
17
+ return 0;
18
+ const maxNegativeOffset = -(Math.max(minEndHeight, bodyHeight) - minEndHeight);
19
+ const clamped = Math.max(endHeightOffset, maxNegativeOffset);
20
+ return clamped === 0 ? 0 : clamped;
21
+ }
10
22
  export function wallFollowsStorey(wall, authoredStoreyHeight) {
11
23
  // A railing is a guard as tall as itself, never the storey (36 in when it says nothing).
12
24
  if (wall.wallType === 'railing')
@@ -26,13 +38,17 @@ export function wallFollowsStorey(wall, authoredStoreyHeight) {
26
38
  * Other explicit walls stand on their elected support; ground-hosted walls
27
39
  * always retain their authored body height.
28
40
  *
29
- * Returns the top in level-local Y (same frame as `electedBase`).
41
+ * Returns the top in level-local Y (same frame as `electedBase`) at chord fraction `t`
42
+ * ($t = 0$ is the start, $t = 1$ the end); a sloped top differs along the wall.
30
43
  */
31
- export function resolveWallTop(wall, storeyHeight, electedBase, authoredStoreyHeight = storeyHeight) {
32
- if (wallFollowsStorey(wall, authoredStoreyHeight))
33
- return storeyHeight;
34
- // Only a railing reaches here with no height of its own.
35
- return electedBase + (wall.height ?? RAILING_GUARD_HEIGHT);
44
+ export function resolveWallTop(wall, storeyHeight, electedBase, authoredStoreyHeight = storeyHeight, t = 0) {
45
+ // Only a railing reaches the fallback with no height of its own.
46
+ const top = wallFollowsStorey(wall, authoredStoreyHeight)
47
+ ? storeyHeight
48
+ : electedBase + (wall.height ?? RAILING_GUARD_HEIGHT);
49
+ if (!wall.endHeightOffset)
50
+ return top;
51
+ return top + clampWallEndHeightOffset(wall.endHeightOffset, top - electedBase) * t;
36
52
  }
37
53
  /**
38
54
  * Extruded height of the wall body: {@link resolveWallTop} minus the
@@ -48,6 +64,6 @@ export function resolveWallTop(wall, storeyHeight, electedBase, authoredStoreyHe
48
64
  * slab reaches the storey plane; callers own the degenerate-geometry
49
65
  * policy.
50
66
  */
51
- export function resolveWallEffectiveHeight(wall, storeyHeight, electedBase, authoredStoreyHeight = storeyHeight) {
52
- return resolveWallTop(wall, storeyHeight, electedBase, authoredStoreyHeight) - electedBase;
67
+ export function resolveWallEffectiveHeight(wall, storeyHeight, electedBase, authoredStoreyHeight = storeyHeight, t = 0) {
68
+ return resolveWallTop(wall, storeyHeight, electedBase, authoredStoreyHeight, t) - electedBase;
53
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wall-topology.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-topology.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wall-topology.d.ts","sourceRoot":"","sources":["../../../src/systems/wall/wall-topology.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,12 @@ import { GROUND_SUPPORT_ID } from '../../hooks/spatial-grid/support-host-id.js';
2
2
  import { getDoorOpeningSize } from '../../lib/door-opening.js';
3
3
  import { withFoundationConstruction } from '../../lib/foundation-wall.js';
4
4
  import { openingHostFacing } from '../../lib/opening-casing.js';
5
+ import { wallSupportForNodes } from '../../lib/opening-floor-datum.js';
5
6
  import { detectOpenWallEnds, wallEndJoinCandidates } from '../../lib/room-graph.js';
6
7
  import { terrainSupportLift } from '../../lib/terrain-support.js';
7
8
  import { getScaledDimensions, SeparatorNode, WallNode as WallSchema, } from '../../schema/index.js';
8
- import { getWallArcData, getWallCurveFrameAt, getWallCurveLength, isCurvedWall } from './wall-curve.js';
9
+ import { getWallTop } from '../../services/storey.js';
10
+ import { getWallArcData, getWallChordFractionAt, getWallCurveFrameAt, getWallCurveLength, isCurvedWall, } from './wall-curve.js';
9
11
  import { getWallFaceOffsets } from './wall-frame.js';
10
12
  export const WALL_MIN_LENGTH = 0.01;
11
13
  const WALL_SPLIT_ENDPOINT_EPSILON = 0.02;
@@ -341,6 +343,21 @@ function remapAttachment(node, wall, nextLocalX) {
341
343
  ...(node.type === 'item' ? { wallT: nextLength > 1e-6 ? clampedX / nextLength : 0 } : {}),
342
344
  };
343
345
  }
346
+ /**
347
+ * The height and end offset of the piece of a sloped wall between curve parameters `startT` and
348
+ * `endT`, so the pieces' tops continue the original line. The first piece keeps the wall's own
349
+ * height (a storey-bound start stays storey-bound); later ones start at the top where they begin.
350
+ */
351
+ function slopedPieceTop(wall, nodes, startT, endT) {
352
+ const base = wallSupportForNodes(wall, nodes).elevation;
353
+ const length = getWallCurveLength(wall);
354
+ const topAt = (t) => getWallTop(wall, wall.parentId ?? '', nodes, base, getWallChordFractionAt(wall, t * length));
355
+ const startTop = topAt(startT);
356
+ return {
357
+ height: startT === 0 ? wall.height : startTop - base,
358
+ endHeightOffset: topAt(endT) - startTop,
359
+ };
360
+ }
344
361
  export function splitWall(wall, splitParameters, nodes, mintId) {
345
362
  const parameters = [
346
363
  0,
@@ -358,6 +375,7 @@ export function splitWall(wall, splitParameters, nodes, mintId) {
358
375
  start: wallPointAt(wall, startT),
359
376
  end: wallPointAt(wall, endT),
360
377
  curveOffset: segmentCurveOffset(wall, startT, endT),
378
+ ...(wall.endHeightOffset ? slopedPieceTop(wall, nodes, startT, endT) : {}),
361
379
  children: [],
362
380
  });
363
381
  });