@pascal-app/core 0.9.2 → 1.0.0-beta.2

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 +319 -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 +204 -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 +232 -91
  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 +85 -0
  46. package/dist/lib/terrain-support.d.ts.map +1 -0
  47. package/dist/lib/terrain-support.js +218 -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 +83 -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 +150 -0
  163. package/dist/systems/slab/slab-support.d.ts.map +1 -0
  164. package/dist/systems/slab/slab-support.js +575 -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,45 +1,24 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
- import { CeilingNode } from './ceiling';
5
- import { ColumnNode } from './column';
6
- import { FenceNode } from './fence';
7
- import { GuideNode } from './guide';
8
- import { ItemNode } from './item';
9
- import { MeasurementNode } from './measurement';
10
- import { RoofNode } from './roof';
11
- import { ScanNode } from './scan';
12
- import { ShelfNode } from './shelf';
13
- import { SlabNode } from './slab';
14
- import { SpawnNode } from './spawn';
15
- import { StairNode } from './stair';
16
- import { WallNode } from './wall';
17
- import { ZoneNode } from './zone';
4
+ const LevelChildId = z.string().transform((id) => id);
18
5
  export const LevelNode = BaseNode.extend({
19
6
  id: objectId('level'),
20
7
  type: nodeType('level'),
21
- children: z
22
- .array(z.union([
23
- WallNode.shape.id,
24
- FenceNode.shape.id,
25
- ColumnNode.shape.id,
26
- ItemNode.shape.id,
27
- ZoneNode.shape.id,
28
- SlabNode.shape.id,
29
- CeilingNode.shape.id,
30
- RoofNode.shape.id,
31
- StairNode.shape.id,
32
- ScanNode.shape.id,
33
- GuideNode.shape.id,
34
- MeasurementNode.shape.id,
35
- SpawnNode.shape.id,
36
- ShelfNode.shape.id,
37
- ]))
38
- .default([]),
8
+ // The node registry owns child-kind validity. Persisted level relationships
9
+ // must also admit IDs minted by plugins that core cannot enumerate.
10
+ children: z.array(LevelChildId).default([]),
39
11
  // Specific props
40
12
  level: z.number().default(0),
13
+ /**
14
+ * Stored storey height in meters (floor-to-floor). No zod default on
15
+ * purpose: absence marks unmigrated legacy data and gates the load-time
16
+ * migration; a schema default would materialize silently through .parse().
17
+ */
18
+ height: z.number().optional(),
41
19
  }).describe(dedent `
42
20
  Level node - used to represent a level in the building
43
- - children: array of floor, wall, ceiling, roof, item nodes
21
+ - children: array of architectural, equipment, and MEP distribution nodes
44
22
  - level: level number
23
+ - height: storey height in meters (floor-to-floor); absent only on unmigrated legacy data
45
24
  `);
@@ -47,6 +47,7 @@ export declare const ShelfNode: z.ZodObject<{
47
47
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>>>;
48
48
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
49
49
  rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
50
+ supportSlabId: z.ZodOptional<z.ZodString>;
50
51
  width: z.ZodDefault<z.ZodNumber>;
51
52
  depth: z.ZodDefault<z.ZodNumber>;
52
53
  thickness: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"shelf.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/shelf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"shelf.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/shelf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiEpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
@@ -42,6 +42,8 @@ export const ShelfNode = BaseNode.extend({
42
42
  children: z.array(ItemNode.shape.id).default([]),
43
43
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
44
44
  rotation: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
45
+ // Persisted slab-support host — see ItemNode.supportSlabId for the rules.
46
+ supportSlabId: z.string().optional(),
45
47
  // Dimensions (meters). Schema-level defaults intentionally reproduce
46
48
  // the v1 wall-shelf so existing v1 scenes that omit the v2-introduced
47
49
  // fields (style / rows / columns / with*) load with their original
@@ -21,6 +21,15 @@ export declare const SiteNode: z.ZodObject<{
21
21
  type: z.ZodLiteral<"polygon">;
22
22
  points: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
23
23
  }, z.core.$strip>>>;
24
+ terrain: z.ZodOptional<z.ZodObject<{
25
+ type: z.ZodLiteral<"heightfield">;
26
+ origin: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
27
+ spacing: z.ZodNumber;
28
+ cols: z.ZodNumber;
29
+ rows: z.ZodNumber;
30
+ step: z.ZodNumber;
31
+ heights: z.ZodString;
32
+ }, z.core.$strip>>;
24
33
  children: z.ZodDefault<z.ZodArray<z.ZodString>>;
25
34
  }, z.core.$strip>;
26
35
  export type SiteNode = z.infer<typeof SiteNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/site.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAevB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;iBAsBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/site.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -2,16 +2,12 @@
2
2
  import dedent from 'dedent';
3
3
  import { z } from 'zod';
4
4
  import { BaseNode, nodeType, objectId } from '../base';
5
+ import { TerrainData } from '../terrain';
5
6
  // 2D Polygon
6
7
  const PropertyLineData = z.object({
7
8
  type: z.literal('polygon'),
8
9
  points: z.array(z.tuple([z.number(), z.number()])),
9
10
  });
10
- // 3D Polygon/Mesh
11
- // const TerrainData = z.object({
12
- // type: z.literal('terrain'),
13
- // points: z.array(z.tuple([z.number(), z.number(), z.number()])),
14
- // })
15
11
  export const SiteNode = BaseNode.extend({
16
12
  id: objectId('site'),
17
13
  type: nodeType('site'),
@@ -26,10 +22,16 @@ export const SiteNode = BaseNode.extend({
26
22
  [-15, 15],
27
23
  ],
28
24
  }),
29
- // terrain: TerrainData,
25
+ /**
26
+ * Sculpted ground. Absent means flat ground at the datum — the state every
27
+ * scene that predates terrain is in, and the state an untouched site stays in
28
+ * so ~11 KB of base64 zeroes does not land in every saved scene.
29
+ */
30
+ terrain: TerrainData.optional(),
30
31
  children: z.array(z.string()).default([]),
31
32
  }).describe(dedent `
32
33
  Site node - used to represent a site
33
34
  - polygon: polygon data
35
+ - terrain: optional sculpted heightfield; absent means flat ground
34
36
  - children: array of child node ids (buildings, items)
35
37
  `);
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ export declare const MIN_SLAB_THICKNESS = 0.02;
2
3
  export declare const SlabNode: z.ZodObject<{
3
4
  object: z.ZodDefault<z.ZodLiteral<"node">>;
4
5
  name: z.ZodOptional<z.ZodString>;
@@ -63,6 +64,10 @@ export declare const SlabNode: z.ZodObject<{
63
64
  elevatorId: z.ZodOptional<z.ZodString>;
64
65
  }, z.core.$strip>>>;
65
66
  elevation: z.ZodDefault<z.ZodNumber>;
67
+ thickness: z.ZodDefault<z.ZodNumber>;
68
+ recessed: z.ZodDefault<z.ZodBoolean>;
69
+ recessedRimElevation: z.ZodOptional<z.ZodNumber>;
70
+ fillToTerrain: z.ZodOptional<z.ZodBoolean>;
66
71
  autoFromWalls: z.ZodDefault<z.ZodBoolean>;
67
72
  }, z.core.$strip>;
68
73
  export type SlabNode = z.infer<typeof SlabNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"slab.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/slab.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"slab.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/slab.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+BpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -3,6 +3,10 @@ import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
5
  import { SurfaceHoleMetadata } from './surface-hole-metadata';
6
+ // Edit-time floor for `thickness` — a thinner slab z-fights the ceiling's
7
+ // −0.01 underside offset. Applies to edits only; migration writes legacy
8
+ // intervals verbatim (including degenerate zero-thickness slabs).
9
+ export const MIN_SLAB_THICKNESS = 0.02;
6
10
  export const SlabNode = BaseNode.extend({
7
11
  id: objectId('slab'),
8
12
  type: nodeType('slab'),
@@ -15,13 +19,21 @@ export const SlabNode = BaseNode.extend({
15
19
  polygon: z.array(z.tuple([z.number(), z.number()])),
16
20
  holes: z.array(z.array(z.tuple([z.number(), z.number()]))).default([]),
17
21
  holeMetadata: z.array(SurfaceHoleMetadata).default([]),
18
- elevation: z.number().default(0.05), // Elevation in meters
22
+ elevation: z.number().default(0.05), // Walking surface (slab top), meters above the level plane
23
+ thickness: z.number().default(0.05), // Grows downward from the surface
24
+ recessed: z.boolean().default(false),
25
+ recessedRimElevation: z.number().finite().optional(),
26
+ fillToTerrain: z.boolean().optional(),
19
27
  autoFromWalls: z.boolean().default(false),
20
28
  }).describe(dedent `
21
29
  Slab node - used to represent a slab/floor in the building
22
30
  - polygon: array of [x, z] points defining the slab boundary
23
31
  - holes: array of [x, z] polygons representing cutouts in the slab
24
32
  - holeMetadata: metadata parallel to holes, used to preserve manual and auto-managed cutouts
25
- - elevation: elevation in meters
33
+ - elevation: the walking surface (slab top), in meters above the level plane
34
+ - thickness: grows downward from the surface; the solid occupies [elevation - thickness, elevation]
35
+ - recessed: open recess (pool) whose floor sits at elevation
36
+ - recessedRimElevation: optional rim anchor for a raised/lowered recess; absent means the level plane
37
+ - fillToTerrain: extends a solid slab's perimeter downward to terrain without changing its flat top or authored thickness
26
38
  - autoFromWalls: whether the slab is automatically generated from a closed wall loop
27
39
  `);
@@ -19,6 +19,7 @@ export declare const SpawnNode: z.ZodObject<{
19
19
  type: z.ZodDefault<z.ZodLiteral<"spawn">>;
20
20
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
21
21
  rotation: z.ZodDefault<z.ZodNumber>;
22
+ supportSlabId: z.ZodOptional<z.ZodString>;
22
23
  }, z.core.$strip>;
23
24
  export type SpawnNode = z.infer<typeof SpawnNode>;
24
25
  //# sourceMappingURL=spawn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;iBAKpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
1
+ {"version":3,"file":"spawn.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;iBAOpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}
@@ -5,4 +5,6 @@ export const SpawnNode = BaseNode.extend({
5
5
  type: nodeType('spawn'),
6
6
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
7
7
  rotation: z.number().default(0),
8
+ // Persisted slab-support host — see ItemNode.supportSlabId for the rules.
9
+ supportSlabId: z.string().optional(),
8
10
  });
@@ -181,6 +181,7 @@ export declare const StairNode: z.ZodObject<{
181
181
  slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
182
182
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
183
183
  rotation: z.ZodDefault<z.ZodNumber>;
184
+ supportSlabId: z.ZodOptional<z.ZodString>;
184
185
  stairType: z.ZodDefault<z.ZodEnum<{
185
186
  straight: "straight";
186
187
  spiral: "spiral";
@@ -188,13 +189,14 @@ export declare const StairNode: z.ZodObject<{
188
189
  }>>;
189
190
  fromLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
190
191
  toLevelId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
192
+ deckSlabId: z.ZodOptional<z.ZodString>;
191
193
  slabOpeningMode: z.ZodDefault<z.ZodEnum<{
192
194
  none: "none";
193
195
  destination: "destination";
194
196
  }>>;
195
197
  openingOffset: z.ZodDefault<z.ZodNumber>;
196
198
  width: z.ZodDefault<z.ZodNumber>;
197
- totalRise: z.ZodDefault<z.ZodNumber>;
199
+ totalRise: z.ZodOptional<z.ZodNumber>;
198
200
  stepCount: z.ZodDefault<z.ZodNumber>;
199
201
  thickness: z.ZodDefault<z.ZodNumber>;
200
202
  fillToFloor: z.ZodDefault<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"stair.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/stair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,eAAO,MAAM,gBAAgB;;;;;EAA4C,CAAA;AACzE,eAAO,MAAM,SAAS;;;;EAA2C,CAAA;AACjE,eAAO,MAAM,mBAAmB;;;EAAiC,CAAA;AACjE,eAAO,MAAM,oBAAoB;;;EAAkC,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AACjD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACvE,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AACnE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AASjD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,wBAAwB,GAC7B,wBAAwB,CAmE1B"}
1
+ {"version":3,"file":"stair.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/stair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,eAAO,MAAM,gBAAgB;;;;;EAA4C,CAAA;AACzE,eAAO,MAAM,SAAS;;;;EAA2C,CAAA;AACjE,eAAO,MAAM,mBAAmB;;;EAAiC,CAAA;AACjE,eAAO,MAAM,oBAAoB;;;EAAkC,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AACjD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACvE,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AACnE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsErB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AASjD,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,wBAAwB,GAC7B,wBAAwB,CAmE1B"}
@@ -24,13 +24,19 @@ export const StairNode = BaseNode.extend({
24
24
  position: z.tuple([z.number(), z.number(), z.number()]).default([0, 0, 0]),
25
25
  // Rotation around Y axis in radians
26
26
  rotation: z.number().default(0),
27
+ // Persisted slab-support host — see ItemNode.supportSlabId for the rules.
28
+ supportSlabId: z.string().optional(),
27
29
  stairType: StairType.default('straight'),
28
30
  fromLevelId: z.string().nullable().default(null),
29
31
  toLevelId: z.string().nullable().default(null),
32
+ // Destination deck (a slab id). When set, the stair's rise follows that
33
+ // slab's elevation live. An explicit `totalRise` still wins when BOTH are
34
+ // set (edge case — the panel clears the custom rise when attaching).
35
+ deckSlabId: z.string().optional(),
30
36
  slabOpeningMode: StairSlabOpeningMode.default('none'),
31
37
  openingOffset: z.number().default(0),
32
38
  width: z.number().default(1.0),
33
- totalRise: z.number().default(2.5),
39
+ totalRise: z.number().optional(),
34
40
  stepCount: z.number().default(10),
35
41
  thickness: z.number().default(0.25),
36
42
  fillToFloor: z.boolean().default(true),
@@ -52,6 +58,7 @@ export const StairNode = BaseNode.extend({
52
58
  - rotation: rotation around Y axis
53
59
  - stairType: straight (segment-based), curved (arc-based), or spiral
54
60
  - fromLevelId / toLevelId: source and destination levels used for auto slab cutouts
61
+ - deckSlabId: destination deck (slab) — the rise derives from its elevation while set
55
62
  - slabOpeningMode: whether a destination-level slab opening is generated for this stair
56
63
  - openingOffset: extra opening expansion applied after the cutout polygon is computed
57
64
  - width: stair width
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ export declare const StructuralGridNode: z.ZodObject<{
3
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
4
+ name: z.ZodOptional<z.ZodString>;
5
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
6
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ camera: z.ZodOptional<z.ZodObject<{
8
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
9
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
10
+ mode: z.ZodDefault<z.ZodEnum<{
11
+ perspective: "perspective";
12
+ orthographic: "orthographic";
13
+ }>>;
14
+ fov: z.ZodOptional<z.ZodNumber>;
15
+ zoom: z.ZodOptional<z.ZodNumber>;
16
+ }, z.core.$strip>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
18
+ id: z.ZodDefault<z.ZodTemplateLiteral<`structural-grid_${string}`>>;
19
+ type: z.ZodDefault<z.ZodLiteral<"structural-grid">>;
20
+ start: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
21
+ end: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
22
+ label: z.ZodDefault<z.ZodString>;
23
+ showStartBubble: z.ZodDefault<z.ZodBoolean>;
24
+ showEndBubble: z.ZodDefault<z.ZodBoolean>;
25
+ }, z.core.$strip>;
26
+ export type StructuralGridNode = z.infer<typeof StructuralGridNode>;
27
+ //# sourceMappingURL=structural-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-grid.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/structural-grid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;iBAe9B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ export const StructuralGridNode = BaseNode.extend({
5
+ id: objectId('structural-grid'),
6
+ type: nodeType('structural-grid'),
7
+ start: z.tuple([z.number(), z.number()]).default([0, 0]),
8
+ end: z.tuple([z.number(), z.number()]).default([0, 5]),
9
+ label: z.string().trim().min(1).max(12).default('1'),
10
+ showStartBubble: z.boolean().default(true),
11
+ showEndBubble: z.boolean().default(true),
12
+ }).describe(dedent `
13
+ Structural grid node - a persistent floor-plan datum axis with identification bubbles
14
+ - start/end: level-local plan coordinates defining the grid axis extent
15
+ - label: axis identifier, commonly numeric in one direction and alphabetic in the other
16
+ - showStartBubble/showEndBubble: independently control the two endpoint identifiers
17
+ `);
@@ -245,6 +245,9 @@ export declare const WallNode: z.ZodObject<{
245
245
  thickness: z.ZodOptional<z.ZodNumber>;
246
246
  height: z.ZodOptional<z.ZodNumber>;
247
247
  curveOffset: z.ZodOptional<z.ZodNumber>;
248
+ supportSlabId: z.ZodOptional<z.ZodString>;
249
+ supportOffset: z.ZodOptional<z.ZodNumber>;
250
+ fillToTerrain: z.ZodOptional<z.ZodBoolean>;
248
251
  faceBands: z.ZodOptional<z.ZodPreprocess<z.ZodObject<{
249
252
  enabled: z.ZodDefault<z.ZodBoolean>;
250
253
  count: z.ZodDefault<z.ZodNumber>;
@@ -360,7 +363,7 @@ export type WallSurfaceSide = 'interior' | 'exterior';
360
363
  export type WallFaceBand = 'lower' | 'middle' | 'upper' | 'top';
361
364
  export type WallBandSurfaceSlotId = 'lowerInterior' | 'middleInterior' | 'upperInterior' | 'topInterior' | 'lowerExterior' | 'middleExterior' | 'upperExterior' | 'topExterior';
362
365
  export declare const WALL_SLOT_DEFAULT: Record<WallSurfaceSide, string>;
363
- export declare function getWallFaceBandConfig(wall: Pick<WallNode, 'height' | 'faceBands'>): {
366
+ export declare function getWallFaceBandConfig(wall: Pick<WallNode, 'height' | 'faceBands'>, effectiveWallHeight: number): {
364
367
  enabled: boolean;
365
368
  count: number;
366
369
  lowerHeight: number;
@@ -370,7 +373,7 @@ export declare function getWallFaceBandConfig(wall: Pick<WallNode, 'height' | 'f
370
373
  middleTop: number;
371
374
  upperTop: number;
372
375
  };
373
- export declare function getWallFaceBandForHeight(wall: Pick<WallNode, 'height' | 'faceBands'>, y: number): WallFaceBand;
376
+ export declare function getWallFaceBandForHeight(wall: Pick<WallNode, 'height' | 'faceBands'>, y: number, effectiveWallHeight: number): WallFaceBand;
374
377
  export declare function getWallBandSlotId(side: WallSurfaceSide, band: WallFaceBand): WallBandSurfaceSlotId;
375
378
  export declare function buildWallFaceBandCountPatch(wall: Pick<WallNode, 'faceBands' | 'slots'>, count: number): Pick<WallNode, 'faceBands' | 'slots'>;
376
379
  export declare function buildEnabledWallFaceBandPatch(wall: Pick<WallNode, 'faceBands' | 'slots'>): Pick<WallNode, 'faceBands' | 'slots'>;
@@ -1 +1 @@
1
- {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"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"}
@@ -132,6 +132,14 @@ export const WallNode = BaseNode.extend({
132
132
  thickness: z.number().optional(),
133
133
  height: z.number().optional(),
134
134
  curveOffset: z.number().optional(),
135
+ // Persisted slab-support host — see ItemNode.supportSlabId for the rules.
136
+ supportSlabId: z.string().optional(),
137
+ // Vertical offset from the elected support surface. Ground-hosted chained
138
+ // walls use this to preserve one construction plane without copying terrain.
139
+ supportOffset: z.number().finite().optional(),
140
+ // Extend downward from the authored wall base to the terrain while keeping
141
+ // the wall body height and top unchanged.
142
+ fillToTerrain: z.boolean().optional(),
135
143
  faceBands: WallFaceBandConfig.optional(),
136
144
  skirting: WallTrimConfig.optional(),
137
145
  crown: WallTrimConfig.optional(),
@@ -146,6 +154,7 @@ export const WallNode = BaseNode.extend({
146
154
  Wall node - used to represent a wall in the building
147
155
  - thickness: thickness in meters
148
156
  - height: height in meters
157
+ - fillToTerrain: extends the wall downward to the terrain without changing its authored height
149
158
  - curveOffset: midpoint sagitta offset used to bend the wall into an arc
150
159
  - start: start point of the wall in level coordinate system
151
160
  - end: end point of the wall in level coordinate system
@@ -162,8 +171,8 @@ export const WALL_SLOT_DEFAULT = {
162
171
  interior: WALL_SURFACE_SLOT_DEFAULTS.interior,
163
172
  exterior: WALL_SURFACE_SLOT_DEFAULTS.exterior,
164
173
  };
165
- export function getWallFaceBandConfig(wall) {
166
- const wallHeight = wall.height ?? 2.5;
174
+ export function getWallFaceBandConfig(wall, effectiveWallHeight) {
175
+ const wallHeight = Math.max(0, effectiveWallHeight);
167
176
  const raw = { ...WALL_FACE_BAND_DEFAULT, ...(wall.faceBands ?? {}) };
168
177
  const count = raw.enabled ? Math.max(1, Math.min(4, Math.round(raw.count ?? 3))) : 1;
169
178
  const lowerHeight = count >= 2 ? Math.max(0, Math.min(wallHeight, raw.lowerHeight)) : 0;
@@ -180,8 +189,8 @@ export function getWallFaceBandConfig(wall) {
180
189
  upperTop: lowerHeight + middleHeight + upperHeight,
181
190
  };
182
191
  }
183
- export function getWallFaceBandForHeight(wall, y) {
184
- const bands = getWallFaceBandConfig(wall);
192
+ export function getWallFaceBandForHeight(wall, y, effectiveWallHeight) {
193
+ const bands = getWallFaceBandConfig(wall, effectiveWallHeight);
185
194
  if (!bands.enabled)
186
195
  return 'upper';
187
196
  if (y < bands.lowerTop)
@@ -12,6 +12,18 @@ export declare const WindowType: z.ZodEnum<{
12
12
  louvered: "louvered";
13
13
  }>;
14
14
  export type WindowType = z.infer<typeof WindowType>;
15
+ export declare const WindowConstructionType: z.ZodEnum<{
16
+ framed: "framed";
17
+ masonry: "masonry";
18
+ }>;
19
+ export declare const WindowDimensionReference: z.ZodEnum<{
20
+ nominal: "nominal";
21
+ "rough-opening": "rough-opening";
22
+ "masonry-opening": "masonry-opening";
23
+ "finish-opening": "finish-opening";
24
+ }>;
25
+ export type WindowConstructionType = z.infer<typeof WindowConstructionType>;
26
+ export type WindowDimensionReference = z.infer<typeof WindowDimensionReference>;
15
27
  export declare const WindowNode: z.ZodObject<{
16
28
  object: z.ZodDefault<z.ZodLiteral<"node">>;
17
29
  name: z.ZodOptional<z.ZodString>;
@@ -79,6 +91,23 @@ export declare const WindowNode: z.ZodObject<{
79
91
  }>>;
80
92
  width: z.ZodDefault<z.ZodNumber>;
81
93
  height: z.ZodDefault<z.ZodNumber>;
94
+ mark: z.ZodOptional<z.ZodString>;
95
+ constructionType: z.ZodDefault<z.ZodEnum<{
96
+ framed: "framed";
97
+ masonry: "masonry";
98
+ }>>;
99
+ dimensionReference: z.ZodDefault<z.ZodEnum<{
100
+ nominal: "nominal";
101
+ "rough-opening": "rough-opening";
102
+ "masonry-opening": "masonry-opening";
103
+ "finish-opening": "finish-opening";
104
+ }>>;
105
+ roughOpeningWidth: z.ZodOptional<z.ZodNumber>;
106
+ roughOpeningHeight: z.ZodOptional<z.ZodNumber>;
107
+ masonryOpeningWidth: z.ZodOptional<z.ZodNumber>;
108
+ masonryOpeningHeight: z.ZodOptional<z.ZodNumber>;
109
+ finishOpeningWidth: z.ZodOptional<z.ZodNumber>;
110
+ finishOpeningHeight: z.ZodOptional<z.ZodNumber>;
82
111
  openingKind: z.ZodDefault<z.ZodEnum<{
83
112
  window: "window";
84
113
  opening: "opening";
@@ -1 +1 @@
1
- {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/window.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;EAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuErB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
1
+ {"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/window.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,UAAU;;;;;;;;;;;EAWrB,CAAA;AACF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,sBAAsB;;;EAAgC,CAAA;AACnE,eAAO,MAAM,wBAAwB;;;;;EAKnC,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmFrB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA"}
@@ -14,6 +14,13 @@ export const WindowType = z.enum([
14
14
  'bow',
15
15
  'louvered',
16
16
  ]);
17
+ export const WindowConstructionType = z.enum(['framed', 'masonry']);
18
+ export const WindowDimensionReference = z.enum([
19
+ 'nominal',
20
+ 'rough-opening',
21
+ 'masonry-opening',
22
+ 'finish-opening',
23
+ ]);
17
24
  export const WindowNode = BaseNode.extend({
18
25
  id: objectId('window'),
19
26
  type: nodeType('window'),
@@ -38,6 +45,17 @@ export const WindowNode = BaseNode.extend({
38
45
  // Overall dimensions
39
46
  width: z.number().default(1.5),
40
47
  height: z.number().default(1.5),
48
+ // Construction-document identity and optional manufacturer rough opening.
49
+ // Legacy scenes omit these fields and continue to parse unchanged.
50
+ mark: z.string().trim().max(16).optional(),
51
+ constructionType: WindowConstructionType.default('framed'),
52
+ dimensionReference: WindowDimensionReference.default('nominal'),
53
+ roughOpeningWidth: z.number().positive().optional(),
54
+ roughOpeningHeight: z.number().positive().optional(),
55
+ masonryOpeningWidth: z.number().positive().optional(),
56
+ masonryOpeningHeight: z.number().positive().optional(),
57
+ finishOpeningWidth: z.number().positive().optional(),
58
+ finishOpeningHeight: z.number().positive().optional(),
41
59
  // Opening mode - when set to "opening", the window is only a shaped cutout
42
60
  openingKind: z.enum(['window', 'opening']).default('window'),
43
61
  // Window family
@@ -19,6 +19,26 @@ export declare const ZoneNode: z.ZodObject<{
19
19
  polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
20
20
  autoFromWalls: z.ZodDefault<z.ZodBoolean>;
21
21
  boundaryWallIds: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>>>;
22
+ spaceRole: z.ZodDefault<z.ZodEnum<{
23
+ generic: "generic";
24
+ room: "room";
25
+ }>>;
26
+ roomNumber: z.ZodDefault<z.ZodString>;
27
+ enclosureStatus: z.ZodDefault<z.ZodEnum<{
28
+ auto: "auto";
29
+ enclosed: "enclosed";
30
+ open: "open";
31
+ }>>;
32
+ floorFinish: z.ZodDefault<z.ZodString>;
33
+ wallFinish: z.ZodDefault<z.ZodString>;
34
+ ceilingFinish: z.ZodDefault<z.ZodString>;
35
+ ceilingHeight: z.ZodDefault<z.ZodNumber>;
36
+ occupancy: z.ZodDefault<z.ZodString>;
37
+ clearDimensionPolicy: z.ZodDefault<z.ZodEnum<{
38
+ none: "none";
39
+ "inside-faces": "inside-faces";
40
+ "finish-faces": "finish-faces";
41
+ }>>;
22
42
  color: z.ZodDefault<z.ZodString>;
23
43
  metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
24
44
  }, z.core.$strip>;
@@ -1 +1 @@
1
- {"version":3,"file":"zone.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/zone.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;iBA0BpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
1
+ {"version":3,"file":"zone.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/zone.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyCpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA"}
@@ -11,6 +11,17 @@ export const ZoneNode = BaseNode.extend({
11
11
  // stored polygon remains a fallback for missing or temporarily open walls.
12
12
  autoFromWalls: z.boolean().default(false),
13
13
  boundaryWallIds: z.array(objectId('wall')).default([]),
14
+ // Generic zones remain available for sites and analysis. Architectural
15
+ // room documentation is opt-in so legacy zone behavior is unchanged.
16
+ spaceRole: z.enum(['generic', 'room']).default('generic'),
17
+ roomNumber: z.string().trim().max(32).default(''),
18
+ enclosureStatus: z.enum(['auto', 'enclosed', 'open']).default('auto'),
19
+ floorFinish: z.string().trim().max(120).default(''),
20
+ wallFinish: z.string().trim().max(120).default(''),
21
+ ceilingFinish: z.string().trim().max(120).default(''),
22
+ ceilingHeight: z.number().min(0.1).default(2.7),
23
+ occupancy: z.string().trim().max(80).default(''),
24
+ clearDimensionPolicy: z.enum(['none', 'inside-faces', 'finish-faces']).default('none'),
14
25
  // Visual styling
15
26
  color: z.string().default('#3b82f6'), // Default blue
16
27
  metadata: z.json().optional().default({}),
@@ -23,6 +34,10 @@ export const ZoneNode = BaseNode.extend({
23
34
  - polygon: array of [x, z] points defining the zone boundary
24
35
  - autoFromWalls: whether the boundary follows an enclosed wall loop
25
36
  - boundaryWallIds: wall ids that prove the procedural enclosure
37
+ - spaceRole: generic site/analysis zone or architectural room
38
+ - roomNumber/finishes/ceilingHeight/occupancy: construction-document room metadata
39
+ - enclosureStatus: auto-detected, explicitly enclosed, or open
40
+ - clearDimensionPolicy: optional room clear-dimension datum preference
26
41
  - color: hex color for visual styling
27
42
  - metadata: zone metadata (optional)
28
43
  `);
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ /** Current authoring and decoding ceiling. */
3
+ export declare const MAX_TERRAIN_SIDE = 257;
4
+ /**
5
+ * The persisted shape of a terrain heightfield.
6
+ *
7
+ * Kept in `schema/` rather than beside the codec because this is the contract
8
+ * the scene graph validates on load, and `lib/terrain-codec.ts` imports the type
9
+ * from here so there is exactly one definition of the wire format.
10
+ *
11
+ * `heights` is base64 of little-endian Int16 — see `lib/terrain-codec.ts` for why
12
+ * that beats a JSON number array, and why it is not compressed. The schema is
13
+ * intentionally loose about the *contents* of that string: validating base64
14
+ * here would duplicate the decoder, and `decodeTerrainField` already returns
15
+ * `null` for anything it cannot read, which is the behaviour a corrupt scene
16
+ * needs (load flat, don't fail the project).
17
+ */
18
+ export declare const TerrainData: z.ZodObject<{
19
+ type: z.ZodLiteral<"heightfield">;
20
+ origin: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
21
+ spacing: z.ZodNumber;
22
+ cols: z.ZodNumber;
23
+ rows: z.ZodNumber;
24
+ step: z.ZodNumber;
25
+ heights: z.ZodString;
26
+ }, z.core.$strip>;
27
+ export type TerrainData = z.infer<typeof TerrainData>;
28
+ //# sourceMappingURL=terrain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain.d.ts","sourceRoot":"","sources":["../../src/schema/terrain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,MAAM,CAAA;AAEnC;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,WAAW;;;;;;;;iBAYtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}