@pascal-app/core 0.9.2 → 1.0.0-beta.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 (339) hide show
  1. package/README.md +17 -10
  2. package/dist/events/bus.d.ts +21 -2
  3. package/dist/events/bus.d.ts.map +1 -1
  4. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +17 -1
  5. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  6. package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
  7. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +116 -66
  8. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  9. package/dist/hooks/spatial-grid/spatial-grid-manager.js +316 -441
  10. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -1
  11. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  12. package/dist/hooks/spatial-grid/spatial-grid-sync.js +193 -12
  13. package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
  14. package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
  15. package/dist/hooks/spatial-grid/support-host-id.js +2 -0
  16. package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
  17. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
  18. package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
  19. package/dist/index.d.ts +23 -11
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +22 -10
  22. package/dist/lib/measurement-geometry.d.ts +4 -0
  23. package/dist/lib/measurement-geometry.d.ts.map +1 -1
  24. package/dist/lib/measurement-geometry.js +27 -10
  25. package/dist/lib/slab-polygon.d.ts.map +1 -1
  26. package/dist/lib/slab-polygon.js +33 -1
  27. package/dist/lib/space-detection.d.ts +15 -4
  28. package/dist/lib/space-detection.d.ts.map +1 -1
  29. package/dist/lib/space-detection.js +174 -88
  30. package/dist/lib/terrain-brush.d.ts +163 -0
  31. package/dist/lib/terrain-brush.d.ts.map +1 -0
  32. package/dist/lib/terrain-brush.js +359 -0
  33. package/dist/lib/terrain-codec.d.ts +51 -0
  34. package/dist/lib/terrain-codec.d.ts.map +1 -0
  35. package/dist/lib/terrain-codec.js +167 -0
  36. package/dist/lib/terrain-field.d.ts +150 -0
  37. package/dist/lib/terrain-field.d.ts.map +1 -0
  38. package/dist/lib/terrain-field.js +248 -0
  39. package/dist/lib/terrain-raycast.d.ts +44 -0
  40. package/dist/lib/terrain-raycast.d.ts.map +1 -0
  41. package/dist/lib/terrain-raycast.js +188 -0
  42. package/dist/lib/terrain-source.d.ts +60 -0
  43. package/dist/lib/terrain-source.d.ts.map +1 -0
  44. package/dist/lib/terrain-source.js +90 -0
  45. package/dist/lib/terrain-support.d.ts +60 -0
  46. package/dist/lib/terrain-support.d.ts.map +1 -0
  47. package/dist/lib/terrain-support.js +150 -0
  48. package/dist/lib/zone-quantities.d.ts +1 -1
  49. package/dist/lib/zone-quantities.d.ts.map +1 -1
  50. package/dist/lib/zone-quantities.js +311 -66
  51. package/dist/material-library.d.ts +9 -1
  52. package/dist/material-library.d.ts.map +1 -1
  53. package/dist/material-library.js +56 -4
  54. package/dist/registry/handles.d.ts +16 -1
  55. package/dist/registry/handles.d.ts.map +1 -1
  56. package/dist/registry/index.d.ts +1 -1
  57. package/dist/registry/index.d.ts.map +1 -1
  58. package/dist/registry/subtree.d.ts.map +1 -1
  59. package/dist/registry/subtree.js +5 -2
  60. package/dist/registry/types.d.ts +64 -1
  61. package/dist/registry/types.d.ts.map +1 -1
  62. package/dist/schema/index.d.ts +6 -3
  63. package/dist/schema/index.d.ts.map +1 -1
  64. package/dist/schema/index.js +6 -3
  65. package/dist/schema/nodes/cabinet.d.ts +2 -0
  66. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  67. package/dist/schema/nodes/cabinet.js +4 -2
  68. package/dist/schema/nodes/ceiling.d.ts +1 -1
  69. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  70. package/dist/schema/nodes/ceiling.js +7 -1
  71. package/dist/schema/nodes/column.d.ts +1 -0
  72. package/dist/schema/nodes/column.d.ts.map +1 -1
  73. package/dist/schema/nodes/column.js +2 -0
  74. package/dist/schema/nodes/construction-dimension.d.ts +195 -0
  75. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
  76. package/dist/schema/nodes/construction-dimension.js +151 -0
  77. package/dist/schema/nodes/door.d.ts +29 -0
  78. package/dist/schema/nodes/door.d.ts.map +1 -1
  79. package/dist/schema/nodes/door.js +20 -0
  80. package/dist/schema/nodes/duct-terminal.d.ts +1 -0
  81. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  82. package/dist/schema/nodes/duct-terminal.js +2 -0
  83. package/dist/schema/nodes/fence.d.ts +2 -0
  84. package/dist/schema/nodes/fence.d.ts.map +1 -1
  85. package/dist/schema/nodes/fence.js +8 -0
  86. package/dist/schema/nodes/hvac-equipment.d.ts +1 -0
  87. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  88. package/dist/schema/nodes/hvac-equipment.js +2 -0
  89. package/dist/schema/nodes/item.d.ts +1 -0
  90. package/dist/schema/nodes/item.d.ts.map +1 -1
  91. package/dist/schema/nodes/item.js +13 -0
  92. package/dist/schema/nodes/level.d.ts +2 -1
  93. package/dist/schema/nodes/level.d.ts.map +1 -1
  94. package/dist/schema/nodes/level.js +12 -33
  95. package/dist/schema/nodes/shelf.d.ts +1 -0
  96. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  97. package/dist/schema/nodes/shelf.js +2 -0
  98. package/dist/schema/nodes/site.d.ts +9 -0
  99. package/dist/schema/nodes/site.d.ts.map +1 -1
  100. package/dist/schema/nodes/site.js +8 -6
  101. package/dist/schema/nodes/slab.d.ts +5 -0
  102. package/dist/schema/nodes/slab.d.ts.map +1 -1
  103. package/dist/schema/nodes/slab.js +14 -2
  104. package/dist/schema/nodes/spawn.d.ts +1 -0
  105. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  106. package/dist/schema/nodes/spawn.js +2 -0
  107. package/dist/schema/nodes/stair.d.ts +3 -1
  108. package/dist/schema/nodes/stair.d.ts.map +1 -1
  109. package/dist/schema/nodes/stair.js +8 -1
  110. package/dist/schema/nodes/structural-grid.d.ts +27 -0
  111. package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
  112. package/dist/schema/nodes/structural-grid.js +17 -0
  113. package/dist/schema/nodes/wall.d.ts +5 -2
  114. package/dist/schema/nodes/wall.d.ts.map +1 -1
  115. package/dist/schema/nodes/wall.js +13 -4
  116. package/dist/schema/nodes/window.d.ts +29 -0
  117. package/dist/schema/nodes/window.d.ts.map +1 -1
  118. package/dist/schema/nodes/window.js +18 -0
  119. package/dist/schema/nodes/zone.d.ts +20 -0
  120. package/dist/schema/nodes/zone.d.ts.map +1 -1
  121. package/dist/schema/nodes/zone.js +15 -0
  122. package/dist/schema/terrain.d.ts +28 -0
  123. package/dist/schema/terrain.d.ts.map +1 -0
  124. package/dist/schema/terrain.js +30 -0
  125. package/dist/schema/types.d.ts +211 -3
  126. package/dist/schema/types.d.ts.map +1 -1
  127. package/dist/schema/types.js +4 -0
  128. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
  129. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
  130. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -0
  131. package/dist/services/index.d.ts +2 -1
  132. package/dist/services/index.d.ts.map +1 -1
  133. package/dist/services/index.js +2 -1
  134. package/dist/services/level-height.d.ts +8 -9
  135. package/dist/services/level-height.d.ts.map +1 -1
  136. package/dist/services/level-height.js +48 -16
  137. package/dist/services/storey.d.ts +103 -0
  138. package/dist/services/storey.d.ts.map +1 -0
  139. package/dist/services/storey.js +296 -0
  140. package/dist/store/actions/node-actions.d.ts.map +1 -1
  141. package/dist/store/actions/node-actions.js +47 -3
  142. package/dist/store/history-control.d.ts +20 -0
  143. package/dist/store/history-control.d.ts.map +1 -1
  144. package/dist/store/history-control.js +110 -13
  145. package/dist/store/use-live-terrain.d.ts +65 -0
  146. package/dist/store/use-live-terrain.d.ts.map +1 -0
  147. package/dist/store/use-live-terrain.js +31 -0
  148. package/dist/store/use-live-transforms.d.ts +8 -0
  149. package/dist/store/use-live-transforms.d.ts.map +1 -1
  150. package/dist/store/use-scene.d.ts +31 -2
  151. package/dist/store/use-scene.d.ts.map +1 -1
  152. package/dist/store/use-scene.js +638 -8
  153. package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
  154. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  155. package/dist/systems/elevator/elevator-opening-system.js +27 -21
  156. package/dist/systems/elevator/elevator-service.d.ts +0 -2
  157. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  158. package/dist/systems/elevator/elevator-service.js +2 -24
  159. package/dist/systems/slab/slab-placement.d.ts +11 -0
  160. package/dist/systems/slab/slab-placement.d.ts.map +1 -0
  161. package/dist/systems/slab/slab-placement.js +14 -0
  162. package/dist/systems/slab/slab-support.d.ts +137 -0
  163. package/dist/systems/slab/slab-support.d.ts.map +1 -0
  164. package/dist/systems/slab/slab-support.js +557 -0
  165. package/dist/systems/stair/stair-opening-preview.d.ts +1060 -935
  166. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  167. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  168. package/dist/systems/stair/stair-opening-sync.js +18 -15
  169. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  170. package/dist/systems/stair/stair-opening-system.js +32 -4
  171. package/dist/systems/stair/stair-rise.d.ts +22 -0
  172. package/dist/systems/stair/stair-rise.d.ts.map +1 -0
  173. package/dist/systems/stair/stair-rise.js +79 -0
  174. package/dist/systems/wall/wall-curve.d.ts +10 -0
  175. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  176. package/dist/systems/wall/wall-curve.js +1 -1
  177. package/dist/systems/wall/wall-mitering.js +6 -6
  178. package/dist/systems/wall/wall-top.d.ts +40 -0
  179. package/dist/systems/wall/wall-top.d.ts.map +1 -0
  180. package/dist/systems/wall/wall-top.js +46 -0
  181. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  182. package/dist/utils/clone-scene-graph.js +34 -3
  183. package/dist/utils/heal-scene-graph.d.ts +1 -1
  184. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  185. package/dist/utils/heal-scene-graph.js +25 -9
  186. package/dist/validation/validate-build-json.d.ts +2 -0
  187. package/dist/validation/validate-build-json.d.ts.map +1 -1
  188. package/dist/validation/validate-build-json.js +59 -3
  189. package/package.json +2 -2
  190. package/dist/hooks/scene-registry/scene-registry.test.d.ts +0 -2
  191. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +0 -1
  192. package/dist/hooks/scene-registry/scene-registry.test.js +0 -26
  193. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
  194. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
  195. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -366
  196. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +0 -2
  197. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +0 -1
  198. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +0 -363
  199. package/dist/lib/measurement-geometry.test.d.ts +0 -2
  200. package/dist/lib/measurement-geometry.test.d.ts.map +0 -1
  201. package/dist/lib/measurement-geometry.test.js +0 -102
  202. package/dist/lib/slab-polygon.test.d.ts +0 -2
  203. package/dist/lib/slab-polygon.test.d.ts.map +0 -1
  204. package/dist/lib/slab-polygon.test.js +0 -635
  205. package/dist/lib/space-detection-pause.test.d.ts +0 -2
  206. package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
  207. package/dist/lib/space-detection-pause.test.js +0 -42
  208. package/dist/lib/space-detection.test.d.ts +0 -2
  209. package/dist/lib/space-detection.test.d.ts.map +0 -1
  210. package/dist/lib/space-detection.test.js +0 -376
  211. package/dist/lib/zone-quantities.test.d.ts +0 -2
  212. package/dist/lib/zone-quantities.test.d.ts.map +0 -1
  213. package/dist/lib/zone-quantities.test.js +0 -82
  214. package/dist/registry/registry.test.d.ts +0 -2
  215. package/dist/registry/registry.test.d.ts.map +0 -1
  216. package/dist/registry/registry.test.js +0 -196
  217. package/dist/registry/relations-resolver.test.d.ts +0 -2
  218. package/dist/registry/relations-resolver.test.d.ts.map +0 -1
  219. package/dist/registry/relations-resolver.test.js +0 -183
  220. package/dist/registry/scene-api.test.d.ts +0 -2
  221. package/dist/registry/scene-api.test.d.ts.map +0 -1
  222. package/dist/registry/scene-api.test.js +0 -183
  223. package/dist/registry/subtree.test.d.ts +0 -2
  224. package/dist/registry/subtree.test.d.ts.map +0 -1
  225. package/dist/registry/subtree.test.js +0 -163
  226. package/dist/schema/asset-url.test.d.ts +0 -2
  227. package/dist/schema/asset-url.test.d.ts.map +0 -1
  228. package/dist/schema/asset-url.test.js +0 -134
  229. package/dist/schema/material.test.d.ts +0 -2
  230. package/dist/schema/material.test.d.ts.map +0 -1
  231. package/dist/schema/material.test.js +0 -43
  232. package/dist/schema/nodes/measurement.test.d.ts +0 -2
  233. package/dist/schema/nodes/measurement.test.d.ts.map +0 -1
  234. package/dist/schema/nodes/measurement.test.js +0 -139
  235. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +0 -2
  236. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +0 -1
  237. package/dist/schema/nodes/ridge-vent-defaults.test.js +0 -205
  238. package/dist/schema/nodes/roof-segment-shape.test.d.ts +0 -2
  239. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +0 -1
  240. package/dist/schema/nodes/roof-segment-shape.test.js +0 -175
  241. package/dist/schema/nodes/roof-segment-surface.test.d.ts +0 -2
  242. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +0 -1
  243. package/dist/schema/nodes/roof-segment-surface.test.js +0 -48
  244. package/dist/schema/nodes/roof-segment-trim.test.d.ts +0 -2
  245. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +0 -1
  246. package/dist/schema/nodes/roof-segment-trim.test.js +0 -107
  247. package/dist/schema/nodes/roof-segment-walls.test.d.ts +0 -2
  248. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +0 -1
  249. package/dist/schema/nodes/roof-segment-walls.test.js +0 -92
  250. package/dist/schema/nodes/wall.test.d.ts +0 -2
  251. package/dist/schema/nodes/wall.test.d.ts.map +0 -1
  252. package/dist/schema/nodes/wall.test.js +0 -208
  253. package/dist/services/alignment-anchors.test.d.ts +0 -2
  254. package/dist/services/alignment-anchors.test.d.ts.map +0 -1
  255. package/dist/services/alignment-anchors.test.js +0 -383
  256. package/dist/services/alignment.test.d.ts +0 -2
  257. package/dist/services/alignment.test.d.ts.map +0 -1
  258. package/dist/services/alignment.test.js +0 -92
  259. package/dist/services/drag-session.test.d.ts +0 -2
  260. package/dist/services/drag-session.test.d.ts.map +0 -1
  261. package/dist/services/drag-session.test.js +0 -219
  262. package/dist/services/hosting.test.d.ts +0 -2
  263. package/dist/services/hosting.test.d.ts.map +0 -1
  264. package/dist/services/hosting.test.js +0 -230
  265. package/dist/services/movement.test.d.ts +0 -2
  266. package/dist/services/movement.test.d.ts.map +0 -1
  267. package/dist/services/movement.test.js +0 -133
  268. package/dist/services/opening-guides.test.d.ts +0 -2
  269. package/dist/services/opening-guides.test.d.ts.map +0 -1
  270. package/dist/services/opening-guides.test.js +0 -208
  271. package/dist/services/port-connectivity.test.d.ts +0 -2
  272. package/dist/services/port-connectivity.test.d.ts.map +0 -1
  273. package/dist/services/port-connectivity.test.js +0 -297
  274. package/dist/services/riser-diagram.test.d.ts +0 -2
  275. package/dist/services/riser-diagram.test.d.ts.map +0 -1
  276. package/dist/services/riser-diagram.test.js +0 -66
  277. package/dist/services/single-undo-dance.test.d.ts +0 -2
  278. package/dist/services/single-undo-dance.test.d.ts.map +0 -1
  279. package/dist/services/single-undo-dance.test.js +0 -210
  280. package/dist/services/snap.test.d.ts +0 -2
  281. package/dist/services/snap.test.d.ts.map +0 -1
  282. package/dist/services/snap.test.js +0 -137
  283. package/dist/services/system-graph.test.d.ts +0 -2
  284. package/dist/services/system-graph.test.d.ts.map +0 -1
  285. package/dist/services/system-graph.test.js +0 -138
  286. package/dist/services/validate-dwv.test.d.ts +0 -2
  287. package/dist/services/validate-dwv.test.d.ts.map +0 -1
  288. package/dist/services/validate-dwv.test.js +0 -109
  289. package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
  290. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
  291. package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
  292. package/dist/store/actions/reparent.test.d.ts +0 -2
  293. package/dist/store/actions/reparent.test.d.ts.map +0 -1
  294. package/dist/store/actions/reparent.test.js +0 -212
  295. package/dist/store/actions/ridge-vent-update.test.d.ts +0 -2
  296. package/dist/store/actions/ridge-vent-update.test.d.ts.map +0 -1
  297. package/dist/store/actions/ridge-vent-update.test.js +0 -264
  298. package/dist/store/use-scene-dirty-tracking.test.d.ts +0 -2
  299. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +0 -1
  300. package/dist/store/use-scene-dirty-tracking.test.js +0 -68
  301. package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
  302. package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
  303. package/dist/store/use-scene-elevator-migration.test.js +0 -109
  304. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +0 -2
  305. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +0 -1
  306. package/dist/store/use-scene-measurement-roundtrip.test.js +0 -97
  307. package/dist/store/use-scene-plugins.test.d.ts +0 -2
  308. package/dist/store/use-scene-plugins.test.d.ts.map +0 -1
  309. package/dist/store/use-scene-plugins.test.js +0 -51
  310. package/dist/store/use-scene-wall-slot-migration.test.d.ts +0 -2
  311. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +0 -1
  312. package/dist/store/use-scene-wall-slot-migration.test.js +0 -210
  313. package/dist/store/use-scene-window-migration.test.d.ts +0 -2
  314. package/dist/store/use-scene-window-migration.test.d.ts.map +0 -1
  315. package/dist/store/use-scene-window-migration.test.js +0 -85
  316. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
  317. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
  318. package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
  319. package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
  320. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
  321. package/dist/systems/elevator/elevator-runtime.test.js +0 -64
  322. package/dist/systems/fence/fence-spline.test.d.ts +0 -2
  323. package/dist/systems/fence/fence-spline.test.d.ts.map +0 -1
  324. package/dist/systems/fence/fence-spline.test.js +0 -136
  325. package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
  326. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
  327. package/dist/systems/stair/stair-opening-preview.test.js +0 -80
  328. package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
  329. package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
  330. package/dist/systems/stair/stair-opening-sync.test.js +0 -485
  331. package/dist/systems/wall/wall-mitering.test.d.ts +0 -2
  332. package/dist/systems/wall/wall-mitering.test.d.ts.map +0 -1
  333. package/dist/systems/wall/wall-mitering.test.js +0 -63
  334. package/dist/utils/clone-scene-graph.test.d.ts +0 -2
  335. package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
  336. package/dist/utils/clone-scene-graph.test.js +0 -62
  337. package/dist/utils/heal-scene-graph.test.d.ts +0 -2
  338. package/dist/utils/heal-scene-graph.test.d.ts.map +0 -1
  339. package/dist/utils/heal-scene-graph.test.js +0 -88
@@ -1,7 +1,15 @@
1
+ import { DEFAULT_LEVEL_HEIGHT, resolveCeilingHeight } from '../services/level-height';
2
+ import { getWallPlaneTop } from '../services/storey';
3
+ import { computeWallSlabSupport } from '../systems/slab/slab-support';
1
4
  import { sampleWallCenterline } from '../systems/wall/wall-curve';
2
- import { DEFAULT_WALL_HEIGHT } from '../systems/wall/wall-footprint';
5
+ import { DEFAULT_WALL_THICKNESS } from '../systems/wall/wall-footprint';
6
+ import { resolveWallEffectiveHeight } from '../systems/wall/wall-top';
3
7
  import { detectSpacesForLevel } from './space-detection';
4
8
  const BOUNDARY_TOLERANCE = 0.08;
9
+ const SURFACE_COVERAGE_THRESHOLD = 0.95;
10
+ const SPACE_CONTAINMENT_THRESHOLD = 0.95;
11
+ const COVERAGE_SAMPLE_STEPS = 24;
12
+ const SURFACE_DATUM_EPSILON = 1e-4;
5
13
  function pointDistance(a, b) {
6
14
  return Math.hypot(a[0] - b[0], a[1] - b[1]);
7
15
  }
@@ -39,17 +47,6 @@ function signedPolygonArea(polygon) {
39
47
  function polygonArea(polygon) {
40
48
  return Math.abs(signedPolygonArea(polygon));
41
49
  }
42
- function polygonPerimeter(polygon) {
43
- let perimeter = 0;
44
- for (let index = 0; index < polygon.length; index += 1) {
45
- const start = polygon[index];
46
- const end = polygon[(index + 1) % polygon.length];
47
- if (!(start && end))
48
- continue;
49
- perimeter += pointDistance(start, end);
50
- }
51
- return perimeter;
52
- }
53
50
  function polygonsDescribeSameRegion(a, b) {
54
51
  if (a.length < 3 || b.length < 3)
55
52
  return false;
@@ -61,8 +58,110 @@ function polygonsDescribeSameRegion(a, b) {
61
58
  return (a.every((point) => pointToPolygonBoundaryDistance(point, b) <= BOUNDARY_TOLERANCE) &&
62
59
  b.every((point) => pointToPolygonBoundaryDistance(point, a) <= BOUNDARY_TOLERANCE));
63
60
  }
64
- function polygonSurfaceArea(polygon, holes = []) {
65
- return Math.max(0, polygonArea(polygon) - holes.reduce((sum, hole) => sum + polygonArea(hole), 0));
61
+ function pointInPolygon(point, polygon, includeBoundary = true) {
62
+ if (polygon.length < 3)
63
+ return false;
64
+ if (pointToPolygonBoundaryDistance(point, polygon) <= 1e-6)
65
+ return includeBoundary;
66
+ let inside = false;
67
+ for (let index = 0, previous = polygon.length - 1; index < polygon.length; previous = index++) {
68
+ const currentPoint = polygon[index];
69
+ const previousPoint = polygon[previous];
70
+ if (currentPoint[1] > point[1] !== previousPoint[1] > point[1] &&
71
+ point[0] <
72
+ ((previousPoint[0] - currentPoint[0]) * (point[1] - currentPoint[1])) /
73
+ (previousPoint[1] - currentPoint[1]) +
74
+ currentPoint[0]) {
75
+ inside = !inside;
76
+ }
77
+ }
78
+ return inside;
79
+ }
80
+ function segmentsCrossProperly(a, b, c, d) {
81
+ const cross = (start, end, point) => (end[0] - start[0]) * (point[1] - start[1]) - (end[1] - start[1]) * (point[0] - start[0]);
82
+ const abC = cross(a, b, c);
83
+ const abD = cross(a, b, d);
84
+ const cdA = cross(c, d, a);
85
+ const cdB = cross(c, d, b);
86
+ return abC * abD < -1e-12 && cdA * cdB < -1e-12;
87
+ }
88
+ function polygonContainsRegion(outer, inner) {
89
+ if (outer.length < 3 || inner.length < 3)
90
+ return false;
91
+ if (polygonsDescribeSameRegion(outer, inner))
92
+ return true;
93
+ if (!inner.every((point) => pointInPolygon(point, outer) ||
94
+ pointToPolygonBoundaryDistance(point, outer) <= BOUNDARY_TOLERANCE)) {
95
+ return false;
96
+ }
97
+ for (let innerIndex = 0; innerIndex < inner.length; innerIndex += 1) {
98
+ const innerStart = inner[innerIndex];
99
+ const innerEnd = inner[(innerIndex + 1) % inner.length];
100
+ for (let outerIndex = 0; outerIndex < outer.length; outerIndex += 1) {
101
+ if (segmentsCrossProperly(innerStart, innerEnd, outer[outerIndex], outer[(outerIndex + 1) % outer.length])) {
102
+ return false;
103
+ }
104
+ }
105
+ }
106
+ return inner.some((start, index) => {
107
+ const end = inner[(index + 1) % inner.length];
108
+ const midpoint = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2];
109
+ return pointInPolygon(start, outer, false) || pointInPolygon(midpoint, outer, false);
110
+ });
111
+ }
112
+ function polygonsHaveInteriorOverlap(a, b) {
113
+ if (polygonsDescribeSameRegion(a, b))
114
+ return true;
115
+ if (a.some((point, index) => {
116
+ const end = a[(index + 1) % a.length];
117
+ return (pointInPolygon(point, b, false) ||
118
+ pointInPolygon([(point[0] + end[0]) / 2, (point[1] + end[1]) / 2], b, false));
119
+ })) {
120
+ return true;
121
+ }
122
+ if (b.some((point, index) => {
123
+ const end = b[(index + 1) % b.length];
124
+ return (pointInPolygon(point, a, false) ||
125
+ pointInPolygon([(point[0] + end[0]) / 2, (point[1] + end[1]) / 2], a, false));
126
+ })) {
127
+ return true;
128
+ }
129
+ for (let aIndex = 0; aIndex < a.length; aIndex += 1) {
130
+ for (let bIndex = 0; bIndex < b.length; bIndex += 1) {
131
+ if (segmentsCrossProperly(a[aIndex], a[(aIndex + 1) % a.length], b[bIndex], b[(bIndex + 1) % b.length])) {
132
+ return true;
133
+ }
134
+ }
135
+ }
136
+ return false;
137
+ }
138
+ function polygonCoverageRatio(subject, covers) {
139
+ if (subject.length < 3 || covers.length === 0)
140
+ return 0;
141
+ const xs = subject.map((point) => point[0]);
142
+ const ys = subject.map((point) => point[1]);
143
+ const minX = Math.min(...xs);
144
+ const maxX = Math.max(...xs);
145
+ const minY = Math.min(...ys);
146
+ const maxY = Math.max(...ys);
147
+ if (maxX - minX <= 1e-9 || maxY - minY <= 1e-9)
148
+ return 0;
149
+ let inside = 0;
150
+ let covered = 0;
151
+ for (let xIndex = 0; xIndex < COVERAGE_SAMPLE_STEPS; xIndex += 1) {
152
+ for (let yIndex = 0; yIndex < COVERAGE_SAMPLE_STEPS; yIndex += 1) {
153
+ const point = [
154
+ minX + ((xIndex + 0.5) / COVERAGE_SAMPLE_STEPS) * (maxX - minX),
155
+ minY + ((yIndex + 0.5) / COVERAGE_SAMPLE_STEPS) * (maxY - minY),
156
+ ];
157
+ if (!pointInPolygon(point, subject))
158
+ continue;
159
+ inside += 1;
160
+ if (covers.some((cover) => pointInPolygon(point, cover)))
161
+ covered += 1;
162
+ }
163
+ }
164
+ return inside > 0 ? covered / inside : 0;
66
165
  }
67
166
  function pointToPolylineDistance(point, polyline) {
68
167
  let best = Number.POSITIVE_INFINITY;
@@ -75,12 +174,11 @@ function pointToPolylineDistance(point, polyline) {
75
174
  }
76
175
  return best;
77
176
  }
78
- function wallForBoundarySegment(start, end, walls) {
177
+ function wallForBoundarySegment(start, end, wallPaths) {
79
178
  const midpoint = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2];
80
179
  let best = null;
81
- for (const wall of walls) {
82
- const centerline = sampleWallCenterline(wall, 32).map((point) => [point.x, point.y]);
83
- const distances = [start, midpoint, end].map((point) => pointToPolylineDistance(point, centerline));
180
+ for (const { wall, points } of wallPaths) {
181
+ const distances = [start, midpoint, end].map((point) => pointToPolylineDistance(point, points));
84
182
  if (distances.some((distance) => distance > BOUNDARY_TOLERANCE))
85
183
  continue;
86
184
  const distance = distances.reduce((sum, value) => sum + value, 0);
@@ -89,8 +187,166 @@ function wallForBoundarySegment(start, end, walls) {
89
187
  }
90
188
  return best?.wall ?? null;
91
189
  }
92
- function matchingSurfaceNodes(zone, nodes) {
93
- return nodes.filter((node) => polygonsDescribeSameRegion(zone.polygon, node.polygon));
190
+ function wallPathsFor(walls) {
191
+ return walls.map((wall) => ({
192
+ wall,
193
+ points: sampleWallCenterline(wall, 32).map((point) => [point.x, point.y]),
194
+ }));
195
+ }
196
+ function pointAlongSegment(start, end, t) {
197
+ return [start[0] + (end[0] - start[0]) * t, start[1] + (end[1] - start[1]) * t];
198
+ }
199
+ function segmentParameter(point, start, end) {
200
+ const dx = end[0] - start[0];
201
+ const dy = end[1] - start[1];
202
+ const lengthSquared = dx * dx + dy * dy;
203
+ return lengthSquared <= 1e-12
204
+ ? 0
205
+ : ((point[0] - start[0]) * dx + (point[1] - start[1]) * dy) / lengthSquared;
206
+ }
207
+ function segmentLengthInsideOrNearPolygon(start, end, polygon, tolerance) {
208
+ const dx = end[0] - start[0];
209
+ const dy = end[1] - start[1];
210
+ const length = Math.hypot(dx, dy);
211
+ if (length <= 1e-9)
212
+ return 0;
213
+ const breaks = [0, 1];
214
+ for (let index = 0; index < polygon.length; index += 1) {
215
+ const polygonStart = polygon[index];
216
+ const polygonEnd = polygon[(index + 1) % polygon.length];
217
+ const edgeX = polygonEnd[0] - polygonStart[0];
218
+ const edgeY = polygonEnd[1] - polygonStart[1];
219
+ const denominator = dx * edgeY - dy * edgeX;
220
+ if (Math.abs(denominator) > 1e-12) {
221
+ const t = ((polygonStart[0] - start[0]) * edgeY - (polygonStart[1] - start[1]) * edgeX) / denominator;
222
+ const edgeT = ((polygonStart[0] - start[0]) * dy - (polygonStart[1] - start[1]) * dx) / denominator;
223
+ if (t > 0 && t < 1 && edgeT >= -1e-9 && edgeT <= 1 + 1e-9)
224
+ breaks.push(t);
225
+ }
226
+ if (pointToSegmentDistance(polygonStart, start, end) <= tolerance) {
227
+ const projected = segmentParameter(polygonStart, start, end);
228
+ if (projected > 0 && projected < 1)
229
+ breaks.push(projected);
230
+ }
231
+ }
232
+ breaks.sort((a, b) => a - b);
233
+ const uniqueBreaks = breaks.filter((value, index) => index === 0 || value - breaks[index - 1] > 1e-7);
234
+ let insideLength = 0;
235
+ for (let index = 0; index < uniqueBreaks.length - 1; index += 1) {
236
+ const t0 = uniqueBreaks[index];
237
+ const t1 = uniqueBreaks[index + 1];
238
+ const midpoint = pointAlongSegment(start, end, (t0 + t1) / 2);
239
+ if (pointInPolygon(midpoint, polygon) ||
240
+ pointToPolygonBoundaryDistance(midpoint, polygon) <= tolerance) {
241
+ insideLength += length * (t1 - t0);
242
+ }
243
+ }
244
+ return insideLength;
245
+ }
246
+ function boundaryFaceKey(boundary) {
247
+ const pointKey = (point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`;
248
+ const forward = boundary.points.map(pointKey).join('|');
249
+ const reverse = [...boundary.points].reverse().map(pointKey).join('|');
250
+ return `${boundary.wallId}:${boundary.face}:${forward < reverse ? forward : reverse}`;
251
+ }
252
+ function spansFromSpaces(spaces, zone, wallsById) {
253
+ const spans = [];
254
+ const seen = new Set();
255
+ for (const space of spaces) {
256
+ for (const boundary of space.boundaryFaces) {
257
+ const key = boundaryFaceKey(boundary);
258
+ if (seen.has(key))
259
+ continue;
260
+ seen.add(key);
261
+ const wall = wallsById.get(boundary.wallId);
262
+ if (!wall)
263
+ return null;
264
+ const tolerance = (wall.thickness ?? DEFAULT_WALL_THICKNESS) / 2 + BOUNDARY_TOLERANCE;
265
+ let length = 0;
266
+ for (let index = 0; index < boundary.points.length - 1; index += 1) {
267
+ length += segmentLengthInsideOrNearPolygon(boundary.points[index], boundary.points[index + 1], zone.polygon, tolerance);
268
+ }
269
+ if (length > 1e-6)
270
+ spans.push({ wall, length });
271
+ }
272
+ }
273
+ return spans.length > 0 ? spans : null;
274
+ }
275
+ function spansFromZoneBoundary(zone, wallPaths) {
276
+ const spans = [];
277
+ for (let edgeIndex = 0; edgeIndex < zone.polygon.length; edgeIndex += 1) {
278
+ const start = zone.polygon[edgeIndex];
279
+ const end = zone.polygon[(edgeIndex + 1) % zone.polygon.length];
280
+ const edgeLength = pointDistance(start, end);
281
+ if (edgeLength <= 1e-6)
282
+ continue;
283
+ const breaks = [0, 1];
284
+ for (const path of wallPaths) {
285
+ for (const point of path.points) {
286
+ if (pointToSegmentDistance(point, start, end) > BOUNDARY_TOLERANCE)
287
+ continue;
288
+ const t = segmentParameter(point, start, end);
289
+ if (t > 0 && t < 1)
290
+ breaks.push(t);
291
+ }
292
+ }
293
+ breaks.sort((a, b) => a - b);
294
+ const uniqueBreaks = breaks.filter((value, index) => index === 0 || value - breaks[index - 1] > 1e-6);
295
+ for (let index = 0; index < uniqueBreaks.length - 1; index += 1) {
296
+ const t0 = uniqueBreaks[index];
297
+ const t1 = uniqueBreaks[index + 1];
298
+ if (t1 - t0 <= 1e-6)
299
+ continue;
300
+ const spanStart = pointAlongSegment(start, end, t0);
301
+ const spanEnd = pointAlongSegment(start, end, t1);
302
+ const wall = wallForBoundarySegment(spanStart, spanEnd, wallPaths);
303
+ if (!wall)
304
+ return null;
305
+ spans.push({ wall, length: edgeLength * (t1 - t0) });
306
+ }
307
+ }
308
+ return spans.length > 0 ? spans : null;
309
+ }
310
+ function proveSurfaceCoverage(zone, nodes, getDatum, labels) {
311
+ const candidates = nodes.filter((node) => polygonsHaveInteriorOverlap(zone.polygon, node.polygon) &&
312
+ polygonCoverageRatio(zone.polygon, [node.polygon]) > 0);
313
+ if (candidates.length === 0 ||
314
+ polygonCoverageRatio(zone.polygon, candidates.map((node) => node.polygon)) < SURFACE_COVERAGE_THRESHOLD) {
315
+ return { status: 'unavailable', reason: `No ${labels.singular} coverage proves this zone.` };
316
+ }
317
+ const datum = getDatum(candidates[0]);
318
+ if (!Number.isFinite(datum) ||
319
+ candidates.some((node) => Math.abs(getDatum(node) - datum) > SURFACE_DATUM_EPSILON)) {
320
+ return {
321
+ status: 'unavailable',
322
+ reason: `${labels.plural} covering this zone have different ${labels.datum}.`,
323
+ };
324
+ }
325
+ let area = polygonArea(zone.polygon);
326
+ const seenHoles = new Set();
327
+ for (const node of candidates) {
328
+ for (const hole of node.holes) {
329
+ const forward = hole.map((point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`).join('|');
330
+ const reverse = [...hole]
331
+ .reverse()
332
+ .map((point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`)
333
+ .join('|');
334
+ const key = forward < reverse ? forward : reverse;
335
+ if (seenHoles.has(key))
336
+ continue;
337
+ seenHoles.add(key);
338
+ if (polygonContainsRegion(hole, zone.polygon)) {
339
+ return { status: 'unavailable', reason: 'A surface opening removes this zone.' };
340
+ }
341
+ if (polygonContainsRegion(zone.polygon, hole)) {
342
+ area -= polygonArea(hole);
343
+ }
344
+ else if (polygonsHaveInteriorOverlap(zone.polygon, hole)) {
345
+ return { status: 'unavailable', reason: 'A surface opening crosses the zone boundary.' };
346
+ }
347
+ }
348
+ }
349
+ return { status: 'available', area: Math.max(0, area), datum };
94
350
  }
95
351
  function unavailable(reason) {
96
352
  return { status: 'unavailable', reason };
@@ -101,77 +357,66 @@ export function deriveZoneQuantityReport(zone, sceneNodes) {
101
357
  ? Object.values(sceneNodes).filter((node) => node.parentId === levelId)
102
358
  : [];
103
359
  const walls = levelNodes.filter((node) => node.type === 'wall');
104
- const slabs = matchingSurfaceNodes(zone, levelNodes.filter((node) => node.type === 'slab'));
105
- const ceilings = matchingSurfaceNodes(zone, levelNodes.filter((node) => node.type === 'ceiling'));
360
+ const slabs = levelNodes.filter((node) => node.type === 'slab');
361
+ const wallEffectiveHeight = (wall) => {
362
+ const support = computeWallSlabSupport(wall, slabs, walls, wall.supportSlabId);
363
+ const planeTop = levelId ? getWallPlaneTop(wall, levelId, sceneNodes) : DEFAULT_LEVEL_HEIGHT;
364
+ return resolveWallEffectiveHeight(wall, planeTop, support.elevation);
365
+ };
106
366
  const edgeLengths = zone.polygon.map((start, index) => {
107
367
  const end = zone.polygon[(index + 1) % zone.polygon.length];
108
368
  return end ? pointDistance(start, end) : 0;
109
369
  });
110
370
  const footprintArea = polygonArea(zone.polygon);
111
371
  const perimeter = edgeLengths.reduce((sum, length) => sum + length, 0);
112
- const matchingRoom = levelId
113
- ? detectSpacesForLevel(levelId, walls).roomPolygons.find((polygon) => polygonsDescribeSameRegion(zone.polygon, polygon.map((point) => [point.x, point.y])))
114
- : undefined;
115
- const wallMatches = matchingRoom?.map((start, index) => {
116
- const end = matchingRoom[(index + 1) % matchingRoom.length];
117
- if (!end)
118
- return null;
119
- const tupleStart = [start.x, start.y];
120
- const tupleEnd = [end.x, end.y];
121
- const wall = wallForBoundarySegment(tupleStart, tupleEnd, walls);
122
- if (!wall)
123
- return null;
124
- return { wall, length: pointDistance(tupleStart, tupleEnd) };
125
- });
126
- const allWallsProven = !!wallMatches && wallMatches.length > 0 && wallMatches.every(Boolean);
127
- const boundaryWallIds = allWallsProven
128
- ? [...new Set(wallMatches.map((match) => match.wall.id))]
129
- : [];
372
+ const slabCoverage = proveSurfaceCoverage(zone, levelNodes.filter((node) => node.type === 'slab'), (node) => node.elevation, { singular: 'slab', plural: 'Slabs', datum: 'elevations' });
373
+ const ceilingCoverage = proveSurfaceCoverage(zone, levelNodes.filter((node) => node.type === 'ceiling'), (node) => resolveCeilingHeight(node, sceneNodes), { singular: 'ceiling', plural: 'Ceilings', datum: 'heights' });
374
+ const spaces = levelId ? detectSpacesForLevel(levelId, walls).spaces : [];
375
+ const overlappingSpaces = spaces.filter((space) => polygonsHaveInteriorOverlap(zone.polygon, space.polygon));
376
+ const topologyEnclosesZone = overlappingSpaces.length > 0 &&
377
+ polygonCoverageRatio(zone.polygon, overlappingSpaces.map((space) => space.polygon)) >= SPACE_CONTAINMENT_THRESHOLD &&
378
+ overlappingSpaces.every((space) => polygonCoverageRatio(space.polygon, [zone.polygon]) >= SPACE_CONTAINMENT_THRESHOLD);
379
+ const wallsById = new Map(walls.map((wall) => [wall.id, wall]));
380
+ const wallPaths = wallPathsFor(walls);
381
+ const topologyWallSpans = spansFromSpaces(overlappingSpaces, zone, wallsById);
382
+ const boundaryWallSpans = spansFromZoneBoundary(zone, wallPaths);
383
+ const wallSpans = topologyWallSpans ?? boundaryWallSpans;
384
+ const allWallsProven = Boolean(wallSpans);
385
+ const boundaryWallIds = wallSpans ? [...new Set(wallSpans.map((span) => span.wall.id))] : [];
130
386
  const wallSurface = allWallsProven
131
387
  ? {
132
388
  status: 'available',
133
- value: wallMatches.reduce((sum, match) => sum + match.length * (match.wall.height ?? DEFAULT_WALL_HEIGHT), 0),
134
- note: 'Gross interior wall face before openings.',
389
+ value: wallSpans.reduce((sum, span) => sum + span.length * wallEffectiveHeight(span.wall), 0),
390
+ note: 'Gross indoor-facing wall surface within this zone, including both sides of interior partitions.',
135
391
  }
136
- : unavailable(matchingRoom
137
- ? 'The closed boundary could not be assigned to every wall segment.'
138
- : 'No matching closed wall loop was detected.');
139
- const matchingSlab = slabs.length === 1 ? slabs[0] : undefined;
140
- const floorSurface = matchingSlab
392
+ : unavailable('No indoor-facing wall surface is proven within this zone.');
393
+ const floorSurface = slabCoverage.status === 'available'
141
394
  ? {
142
395
  status: 'available',
143
- value: polygonSurfaceArea(matchingSlab.polygon, matchingSlab.holes),
144
- note: 'Matching slab surface after openings.',
396
+ value: slabCoverage.area,
397
+ note: 'Zone floor surface proven by compatible slab coverage, after openings.',
145
398
  }
146
- : unavailable(slabs.length > 1
147
- ? 'More than one slab matches this boundary.'
148
- : 'No slab matches this zone boundary.');
149
- const matchingCeiling = ceilings.length === 1 ? ceilings[0] : undefined;
399
+ : unavailable(slabCoverage.reason);
150
400
  let volume;
151
- if (!matchingRoom) {
152
- volume = unavailable('No matching closed wall loop was detected.');
153
- }
154
- else if (!matchingSlab) {
155
- volume = unavailable(floorSurface.status === 'unavailable' ? floorSurface.reason : 'No floor.');
401
+ if (slabCoverage.status === 'unavailable') {
402
+ volume = unavailable(slabCoverage.reason);
156
403
  }
157
- else if (!matchingCeiling) {
158
- volume = unavailable(ceilings.length > 1
159
- ? 'More than one ceiling matches this boundary.'
160
- : 'No ceiling matches this zone boundary.');
404
+ else if (ceilingCoverage.status === 'unavailable') {
405
+ volume = unavailable(ceilingCoverage.reason);
161
406
  }
162
407
  else {
163
- const clearHeight = matchingCeiling.height - matchingSlab.elevation;
408
+ const clearHeight = ceilingCoverage.datum - slabCoverage.datum;
164
409
  volume =
165
410
  Number.isFinite(clearHeight) && clearHeight > 0
166
411
  ? {
167
412
  status: 'available',
168
- value: polygonSurfaceArea(matchingSlab.polygon, matchingSlab.holes) * clearHeight,
169
- note: 'Matching slab area multiplied by clear ceiling height.',
413
+ value: slabCoverage.area * clearHeight,
414
+ note: 'Proven zone floor area multiplied by clear ceiling height.',
170
415
  }
171
416
  : unavailable('The matching ceiling is not above the slab surface.');
172
417
  }
173
418
  return {
174
- classification: matchingRoom ? 'enclosed-room' : 'footprint',
419
+ classification: topologyEnclosesZone || boundaryWallSpans ? 'enclosed-room' : 'footprint',
175
420
  footprintArea,
176
421
  perimeter,
177
422
  edgeLengths,
@@ -1,8 +1,11 @@
1
1
  import { type MaterialPresetPayload } from './schema/material';
2
+ export type MaterialSource = 'pascal' | 'community' | 'mine' | 'workspace';
2
3
  export type MaterialCatalogItem = {
3
4
  id: string;
4
5
  label: string;
5
6
  category: MaterialCategory;
7
+ /** Origin of the entry. Absent = 'pascal' (all static catalog entries). */
8
+ source?: MaterialSource;
6
9
  /**
7
10
  * Where this finish is appropriate. Absent = universal (e.g. flat colors).
8
11
  * The paint picker may filter by the slot being painted; v1 shows everything.
@@ -13,11 +16,16 @@ export type MaterialCatalogItem = {
13
16
  previewColor?: string;
14
17
  preset: MaterialPresetPayload;
15
18
  };
16
- export declare const MATERIAL_CATEGORIES: readonly ["colors", "wood", "stone", "brick", "tile", "concrete", "metal", "fabric", "leather", "roofing", "ground", "glass"];
19
+ export declare const MATERIAL_CATEGORIES: readonly ["colors", "wood", "stone", "brick", "tile", "wallpaper", "concrete", "metal", "plastic", "fabric", "carpet", "leather", "roofing", "ground", "glass", "other"];
17
20
  export type MaterialCategory = (typeof MATERIAL_CATEGORIES)[number];
18
21
  export declare const MATERIAL_SURFACES: readonly ["floor", "wall", "ceiling", "roof", "furniture", "outdoor"];
19
22
  export type MaterialSurface = (typeof MATERIAL_SURFACES)[number];
20
23
  export declare const MATERIAL_CATALOG: MaterialCatalogItem[];
24
+ export declare function registerLibraryMaterials(items: MaterialCatalogItem[]): void;
25
+ export declare function unregisterLibraryMaterials(ids: string[]): void;
26
+ export declare function getDynamicLibraryMaterials(): MaterialCatalogItem[];
27
+ export declare function subscribeLibraryMaterials(listener: () => void): () => void;
28
+ export declare function getLibraryMaterialsVersion(): number;
21
29
  export declare function getMaterialsForCategory(category: MaterialCategory): MaterialCatalogItem[];
22
30
  export declare function getCatalogMaterialById(id?: string): MaterialCatalogItem | undefined;
23
31
  export declare const LIBRARY_MATERIAL_REF_PREFIX = "library:";
@@ -1 +1 @@
1
- {"version":3,"file":"material-library.d.ts","sourceRoot":"","sources":["../src/material-library.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAuCD,eAAO,MAAM,mBAAmB,+HAatB,CAAA;AACV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,eAAO,MAAM,iBAAiB,uEAOpB,CAAA;AACV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAi+HjD,CAAA;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAEzF;AAED,wBAAgB,sBAAsB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAGnF;AAED,eAAO,MAAM,2BAA2B,aAAa,CAAA;AACrD,eAAO,MAAM,yBAAyB,WAAW,CAAA;AAEjD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,UAE9C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,UAE5C;AAED,wBAAgB,2BAA2B,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,iBAItE;AAED,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/F,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAM9E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAIhG"}
1
+ {"version":3,"file":"material-library.d.ts","sourceRoot":"","sources":["../src/material-library.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAA;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAuCD,eAAO,MAAM,mBAAmB,0KAiBtB,CAAA;AACV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,eAAO,MAAM,iBAAiB,uEAOpB,CAAA;AACV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAi+HjD,CAAA;AAkBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAM3E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAM9D;AAED,wBAAgB,0BAA0B,IAAI,mBAAmB,EAAE,CAElE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1E;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAMzF;AAED,wBAAgB,sBAAsB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAGnF;AAED,eAAO,MAAM,2BAA2B,aAAa,CAAA;AACrD,eAAO,MAAM,yBAAyB,WAAW,CAAA;AAEjD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,UAE9C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,UAE5C;AAED,wBAAgB,2BAA2B,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,iBAItE;AAED,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAIpF;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/F,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAM9E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAIhG"}
@@ -35,13 +35,17 @@ export const MATERIAL_CATEGORIES = [
35
35
  'stone',
36
36
  'brick',
37
37
  'tile',
38
+ 'wallpaper',
38
39
  'concrete',
39
40
  'metal',
41
+ 'plastic',
40
42
  'fabric',
43
+ 'carpet',
41
44
  'leather',
42
45
  'roofing',
43
46
  'ground',
44
47
  'glass',
48
+ 'other',
45
49
  ];
46
50
  export const MATERIAL_SURFACES = [
47
51
  'floor',
@@ -4091,13 +4095,59 @@ export const MATERIAL_CATALOG = [
4091
4095
  },
4092
4096
  },
4093
4097
  ];
4098
+ const STATIC_CATALOG_IDS = new Set(MATERIAL_CATALOG.map((item) => item.id));
4099
+ // Embedder-registered library materials (user/community/workspace). Core stays
4100
+ // passive: hosts push entries in; nothing here fetches. Static catalog entries
4101
+ // win on id collision so a registration can never shadow a built-in.
4102
+ const dynamicLibraryMaterials = new Map();
4103
+ const dynamicLibraryListeners = new Set();
4104
+ let dynamicLibraryVersion = 0;
4105
+ function notifyDynamicLibraryChange() {
4106
+ dynamicLibraryVersion += 1;
4107
+ for (const listener of [...dynamicLibraryListeners]) {
4108
+ listener();
4109
+ }
4110
+ }
4111
+ export function registerLibraryMaterials(items) {
4112
+ if (items.length === 0)
4113
+ return;
4114
+ for (const item of items) {
4115
+ dynamicLibraryMaterials.set(item.id, item);
4116
+ }
4117
+ notifyDynamicLibraryChange();
4118
+ }
4119
+ export function unregisterLibraryMaterials(ids) {
4120
+ let changed = false;
4121
+ for (const id of ids) {
4122
+ changed = dynamicLibraryMaterials.delete(id) || changed;
4123
+ }
4124
+ if (changed)
4125
+ notifyDynamicLibraryChange();
4126
+ }
4127
+ export function getDynamicLibraryMaterials() {
4128
+ return [...dynamicLibraryMaterials.values()];
4129
+ }
4130
+ export function subscribeLibraryMaterials(listener) {
4131
+ dynamicLibraryListeners.add(listener);
4132
+ return () => {
4133
+ dynamicLibraryListeners.delete(listener);
4134
+ };
4135
+ }
4136
+ export function getLibraryMaterialsVersion() {
4137
+ return dynamicLibraryVersion;
4138
+ }
4094
4139
  export function getMaterialsForCategory(category) {
4095
- return MATERIAL_CATALOG.filter((item) => item.category === category);
4140
+ const items = MATERIAL_CATALOG.filter((item) => item.category === category);
4141
+ for (const item of dynamicLibraryMaterials.values()) {
4142
+ if (item.category === category && !STATIC_CATALOG_IDS.has(item.id))
4143
+ items.push(item);
4144
+ }
4145
+ return items;
4096
4146
  }
4097
4147
  export function getCatalogMaterialById(id) {
4098
4148
  if (!id)
4099
4149
  return undefined;
4100
- return MATERIAL_CATALOG.find((item) => item.id === id);
4150
+ return MATERIAL_CATALOG.find((item) => item.id === id) ?? dynamicLibraryMaterials.get(id);
4101
4151
  }
4102
4152
  export const LIBRARY_MATERIAL_REF_PREFIX = 'library:';
4103
4153
  export const SCENE_MATERIAL_REF_PREFIX = 'scene:';
@@ -4108,14 +4158,16 @@ export function toSceneMaterialRef(id) {
4108
4158
  return `${SCENE_MATERIAL_REF_PREFIX}${id}`;
4109
4159
  }
4110
4160
  export function getLibraryMaterialIdFromRef(materialRef) {
4111
- if (!materialRef)
4161
+ if (typeof materialRef !== 'string')
4112
4162
  return null;
4113
4163
  if (!materialRef.startsWith(LIBRARY_MATERIAL_REF_PREFIX))
4114
4164
  return null;
4115
4165
  return materialRef.slice(LIBRARY_MATERIAL_REF_PREFIX.length);
4116
4166
  }
4117
4167
  export function getSceneMaterialIdFromRef(materialRef) {
4118
- if (!materialRef?.startsWith(SCENE_MATERIAL_REF_PREFIX))
4168
+ if (typeof materialRef !== 'string')
4169
+ return null;
4170
+ if (!materialRef.startsWith(SCENE_MATERIAL_REF_PREFIX))
4119
4171
  return null;
4120
4172
  return materialRef.slice(SCENE_MATERIAL_REF_PREFIX.length);
4121
4173
  }
@@ -97,6 +97,13 @@ export type LinearResizeHandle<N> = {
97
97
  anchor: HandleAnchor;
98
98
  currentValue: (node: N) => number;
99
99
  apply: (node: N, newValue: number, sceneApi: SceneApi) => Partial<N>;
100
+ /**
101
+ * Additional live-only patches for geometry owned by related nodes. The
102
+ * editor publishes these during the drag and clears them on release or
103
+ * cancellation; committed scene writes remain the responsibility of
104
+ * `commit` (or the generic selected-node update).
105
+ */
106
+ previewOverrides?: (node: N, newValue: number, sceneApi: SceneApi) => ReadonlyArray<readonly [AnyNodeId, Partial<AnyNode>]>;
100
107
  /** Optional live-scene visibility gate for context-dependent arrows. */
101
108
  visible?: (node: N, sceneApi: SceneApi) => boolean;
102
109
  /**
@@ -115,6 +122,12 @@ export type LinearResizeHandle<N> = {
115
122
  * by `apply`.
116
123
  */
117
124
  onDrag?: (node: N, sceneApi: SceneApi) => void;
125
+ /**
126
+ * Cleanup companion to {@link onDrag}. Called for commit, cancellation, and
127
+ * unmount so a descriptor can release transient feedback it owns without the
128
+ * generic renderer knowing which guide store produced it.
129
+ */
130
+ onDragEnd?: (node: N, sceneApi: SceneApi) => void;
118
131
  /**
119
132
  * Cross-node redirect. By default the drag's live override + the
120
133
  * committed write both land on the SELECTED node. When this returns
@@ -131,6 +144,8 @@ export type LinearResizeHandle<N> = {
131
144
  max?: number | ((node: N, sceneApi: SceneApi) => number);
132
145
  /** Snap the resized scalar to the editor's active grid step before apply. */
133
146
  gridSnap?: boolean;
147
+ /** Kind-owned magnetic snap for the resized scalar, gated by the active snapping mode. */
148
+ magneticSnap?: (node: N, newValue: number, sceneApi: SceneApi) => number;
134
149
  placement: HandlePlacement<N>;
135
150
  /**
136
151
  * Dimension this handle steers (e.g. `'height'`). When set, the editor
@@ -390,5 +405,5 @@ export type HandleDescriptor<N = any> = LinearResizeHandle<N> | RadialResizeHand
390
405
  * Static array, or a function for shape-dependent cases (column
391
406
  * crossSection / supportStyle, stair-segment segmentType, etc.).
392
407
  */
393
- export type HandleList<N> = HandleDescriptor<N>[] | ((node: N) => HandleDescriptor<N>[]);
408
+ export type HandleList<N> = HandleDescriptor<N>[] | ((node: N, sceneApi?: SceneApi) => HandleDescriptor<N>[]);
394
409
  //# sourceMappingURL=handles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/registry/handles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/registry/handles.ts"],"names":[],"mappings":"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"}