@pascal-app/core 1.0.0-beta.5 → 1.0.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 (417) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/dist/capture/index.d.ts +3 -0
  4. package/dist/capture/index.d.ts.map +1 -0
  5. package/dist/capture/index.js +2 -0
  6. package/dist/capture/schema.d.ts +417 -0
  7. package/dist/capture/schema.d.ts.map +1 -0
  8. package/dist/capture/schema.js +350 -0
  9. package/dist/capture/source.d.ts +60 -0
  10. package/dist/capture/source.d.ts.map +1 -0
  11. package/dist/capture/source.js +254 -0
  12. package/dist/events/bus.d.ts +58 -7
  13. package/dist/events/bus.d.ts.map +1 -1
  14. package/dist/events/hidden-wall-pointer-hold.d.ts +28 -0
  15. package/dist/events/hidden-wall-pointer-hold.d.ts.map +1 -0
  16. package/dist/events/hidden-wall-pointer-hold.js +37 -0
  17. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +4 -4
  18. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  19. package/dist/hooks/spatial-grid/floor-placed-elevation.js +7 -12
  20. package/dist/hooks/spatial-grid/floor-placed-footprints.d.ts +4 -0
  21. package/dist/hooks/spatial-grid/floor-placed-footprints.d.ts.map +1 -0
  22. package/dist/hooks/spatial-grid/floor-placed-footprints.js +7 -0
  23. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +5 -8
  24. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  25. package/dist/hooks/spatial-grid/spatial-grid-manager.js +23 -106
  26. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +2931 -2
  27. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  28. package/dist/hooks/spatial-grid/spatial-grid-sync.js +207 -30
  29. package/dist/hooks/spatial-grid/support-host-patch.d.ts +45 -1
  30. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  31. package/dist/hooks/spatial-grid/support-host-patch.js +174 -9
  32. package/dist/hooks/spatial-grid/use-spatial-query.d.ts +1 -1
  33. package/dist/hooks/spatial-grid/use-spatial-query.js +1 -1
  34. package/dist/index.d.ts +74 -64
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +74 -61
  37. package/dist/lib/asset-storage.d.ts.map +1 -1
  38. package/dist/lib/asset-storage.js +4 -1
  39. package/dist/lib/door-operation.d.ts +1 -1
  40. package/dist/lib/item-polygon-overlap.d.ts +6 -0
  41. package/dist/lib/item-polygon-overlap.d.ts.map +1 -0
  42. package/dist/lib/item-polygon-overlap.js +67 -0
  43. package/dist/lib/level-name.d.ts +1 -1
  44. package/dist/lib/measurement-geometry.d.ts +4 -4
  45. package/dist/lib/plan-footprint.d.ts +41 -0
  46. package/dist/lib/plan-footprint.d.ts.map +1 -0
  47. package/dist/lib/plan-footprint.js +58 -0
  48. package/dist/lib/polygon-union.d.ts +4 -0
  49. package/dist/lib/polygon-union.d.ts.map +1 -0
  50. package/dist/lib/polygon-union.js +306 -0
  51. package/dist/lib/roof-overlap.d.ts +32 -0
  52. package/dist/lib/roof-overlap.d.ts.map +1 -0
  53. package/dist/lib/roof-overlap.js +72 -0
  54. package/dist/lib/room-topology-index.d.ts +1 -1
  55. package/dist/lib/room-topology-index.js +1 -1
  56. package/dist/lib/selection-proxy.d.ts +1 -1
  57. package/dist/lib/slab-polygon.d.ts +36 -3
  58. package/dist/lib/slab-polygon.d.ts.map +1 -1
  59. package/dist/lib/slab-polygon.js +135 -29
  60. package/dist/lib/space-detection.d.ts +12 -1
  61. package/dist/lib/space-detection.d.ts.map +1 -1
  62. package/dist/lib/space-detection.js +58 -25
  63. package/dist/lib/terrain-brush.d.ts +1 -1
  64. package/dist/lib/terrain-brush.js +1 -1
  65. package/dist/lib/terrain-codec.d.ts +2 -2
  66. package/dist/lib/terrain-codec.js +1 -1
  67. package/dist/lib/terrain-raycast.d.ts +1 -1
  68. package/dist/lib/terrain-raycast.js +1 -1
  69. package/dist/lib/terrain-source.d.ts +3 -3
  70. package/dist/lib/terrain-source.js +3 -3
  71. package/dist/lib/terrain-support.d.ts +1 -1
  72. package/dist/lib/terrain-support.js +3 -3
  73. package/dist/lib/unit-containment.d.ts +19 -0
  74. package/dist/lib/unit-containment.d.ts.map +1 -0
  75. package/dist/lib/unit-containment.js +158 -0
  76. package/dist/lib/unit-report.d.ts +19 -0
  77. package/dist/lib/unit-report.d.ts.map +1 -0
  78. package/dist/lib/unit-report.js +36 -0
  79. package/dist/lib/wall-distance.d.ts +2 -2
  80. package/dist/lib/wall-distance.js +1 -1
  81. package/dist/lib/zone-quantities.d.ts +1 -1
  82. package/dist/lib/zone-quantities.js +7 -7
  83. package/dist/material-library.d.ts +1 -1
  84. package/dist/material-library.js +1 -1
  85. package/dist/procedural-items/fixtures.d.ts +261 -0
  86. package/dist/procedural-items/fixtures.d.ts.map +1 -0
  87. package/dist/procedural-items/fixtures.js +349 -0
  88. package/dist/procedural-items/index.d.ts +10 -0
  89. package/dist/procedural-items/index.d.ts.map +1 -0
  90. package/dist/procedural-items/index.js +9 -0
  91. package/dist/procedural-items/integration.d.ts +92 -0
  92. package/dist/procedural-items/integration.d.ts.map +1 -0
  93. package/dist/procedural-items/integration.js +19 -0
  94. package/dist/procedural-items/library-colors.d.ts +56 -0
  95. package/dist/procedural-items/library-colors.d.ts.map +1 -0
  96. package/dist/procedural-items/library-colors.js +84 -0
  97. package/dist/procedural-items/materials.d.ts +5 -0
  98. package/dist/procedural-items/materials.d.ts.map +1 -0
  99. package/dist/procedural-items/materials.js +47 -0
  100. package/dist/procedural-items/node.d.ts +280 -0
  101. package/dist/procedural-items/node.d.ts.map +1 -0
  102. package/dist/procedural-items/node.js +71 -0
  103. package/dist/procedural-items/placement.d.ts +7 -0
  104. package/dist/procedural-items/placement.d.ts.map +1 -0
  105. package/dist/procedural-items/placement.js +48 -0
  106. package/dist/procedural-items/query.d.ts +50 -0
  107. package/dist/procedural-items/query.d.ts.map +1 -0
  108. package/dist/procedural-items/query.js +298 -0
  109. package/dist/procedural-items/recipe.d.ts +144 -0
  110. package/dist/procedural-items/recipe.d.ts.map +1 -0
  111. package/dist/procedural-items/recipe.js +372 -0
  112. package/dist/procedural-items/spatial.d.ts +19 -0
  113. package/dist/procedural-items/spatial.d.ts.map +1 -0
  114. package/dist/procedural-items/spatial.js +39 -0
  115. package/dist/registry/__bench__/relations-resolver.bench.js +2 -2
  116. package/dist/registry/handles.d.ts +36 -7
  117. package/dist/registry/handles.d.ts.map +1 -1
  118. package/dist/registry/index.d.ts +6 -7
  119. package/dist/registry/index.d.ts.map +1 -1
  120. package/dist/registry/index.js +4 -5
  121. package/dist/registry/registry.d.ts +13 -6
  122. package/dist/registry/registry.d.ts.map +1 -1
  123. package/dist/registry/registry.js +37 -4
  124. package/dist/registry/relations-resolver.d.ts +2 -2
  125. package/dist/registry/relations-resolver.js +1 -1
  126. package/dist/registry/scene-api.d.ts +18 -2
  127. package/dist/registry/scene-api.d.ts.map +1 -1
  128. package/dist/registry/scene-api.js +50 -2
  129. package/dist/registry/subtree.d.ts +1 -1
  130. package/dist/registry/subtree.js +2 -2
  131. package/dist/registry/types.d.ts +246 -21
  132. package/dist/registry/types.d.ts.map +1 -1
  133. package/dist/registry/use-registry-version.js +1 -1
  134. package/dist/registry/validate-relations.d.ts +4 -0
  135. package/dist/registry/validate-relations.d.ts.map +1 -0
  136. package/dist/registry/validate-relations.js +22 -0
  137. package/dist/schema/__bench__/node-parsers.bench.d.ts +24 -0
  138. package/dist/schema/__bench__/node-parsers.bench.d.ts.map +1 -0
  139. package/dist/schema/__bench__/node-parsers.bench.js +314 -0
  140. package/dist/schema/__fixtures__/node-fixtures.d.ts +28 -0
  141. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -0
  142. package/dist/schema/__fixtures__/node-fixtures.js +127 -0
  143. package/dist/schema/base.d.ts +1 -1
  144. package/dist/schema/base.d.ts.map +1 -1
  145. package/dist/schema/base.js +9 -2
  146. package/dist/schema/collections.d.ts +1 -1
  147. package/dist/schema/collections.js +1 -1
  148. package/dist/schema/compiled-node-parsers.d.ts +40 -0
  149. package/dist/schema/compiled-node-parsers.d.ts.map +1 -0
  150. package/dist/schema/compiled-node-parsers.js +95 -0
  151. package/dist/schema/index.d.ts +73 -66
  152. package/dist/schema/index.d.ts.map +1 -1
  153. package/dist/schema/index.js +65 -57
  154. package/dist/schema/material.d.ts +1 -0
  155. package/dist/schema/material.d.ts.map +1 -1
  156. package/dist/schema/material.js +2 -1
  157. package/dist/schema/nodes/automatic-downspout.d.ts +17 -0
  158. package/dist/schema/nodes/automatic-downspout.d.ts.map +1 -0
  159. package/dist/schema/nodes/automatic-downspout.js +237 -0
  160. package/dist/schema/nodes/block.d.ts +107 -0
  161. package/dist/schema/nodes/block.d.ts.map +1 -0
  162. package/dist/schema/nodes/block.js +206 -0
  163. package/dist/schema/nodes/box-vent.d.ts +8 -2
  164. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  165. package/dist/schema/nodes/box-vent.js +4 -2
  166. package/dist/schema/nodes/building.d.ts +2 -2
  167. package/dist/schema/nodes/building.d.ts.map +1 -1
  168. package/dist/schema/nodes/building.js +8 -5
  169. package/dist/schema/nodes/cabinet.d.ts +26 -4
  170. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  171. package/dist/schema/nodes/cabinet.js +29 -8
  172. package/dist/schema/nodes/ceiling.d.ts +2 -2
  173. package/dist/schema/nodes/ceiling.js +5 -5
  174. package/dist/schema/nodes/chimney.d.ts +2 -2
  175. package/dist/schema/nodes/chimney.js +2 -2
  176. package/dist/schema/nodes/column.d.ts +7 -6
  177. package/dist/schema/nodes/column.d.ts.map +1 -1
  178. package/dist/schema/nodes/column.js +3 -2
  179. package/dist/schema/nodes/construction-dimension.d.ts +1 -1
  180. package/dist/schema/nodes/construction-dimension.js +2 -2
  181. package/dist/schema/nodes/cupola.d.ts +9 -1
  182. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  183. package/dist/schema/nodes/cupola.js +4 -2
  184. package/dist/schema/nodes/door.d.ts +1 -1
  185. package/dist/schema/nodes/door.js +2 -2
  186. package/dist/schema/nodes/dormer.d.ts +45 -2
  187. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  188. package/dist/schema/nodes/dormer.js +133 -9
  189. package/dist/schema/nodes/downspout.d.ts +11 -1
  190. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  191. package/dist/schema/nodes/downspout.js +26 -2
  192. package/dist/schema/nodes/duct-fitting.d.ts +18 -1
  193. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -1
  194. package/dist/schema/nodes/duct-fitting.js +26 -5
  195. package/dist/schema/nodes/duct-segment.d.ts +23 -1
  196. package/dist/schema/nodes/duct-segment.d.ts.map +1 -1
  197. package/dist/schema/nodes/duct-segment.js +21 -1
  198. package/dist/schema/nodes/duct-terminal.d.ts +1 -1
  199. package/dist/schema/nodes/duct-terminal.js +1 -1
  200. package/dist/schema/nodes/elevator.d.ts +1 -1
  201. package/dist/schema/nodes/elevator.js +2 -2
  202. package/dist/schema/nodes/eyebrow-vent.d.ts +8 -2
  203. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  204. package/dist/schema/nodes/eyebrow-vent.js +4 -2
  205. package/dist/schema/nodes/fence.d.ts +1 -1
  206. package/dist/schema/nodes/fence.js +2 -2
  207. package/dist/schema/nodes/guide.d.ts +1 -1
  208. package/dist/schema/nodes/guide.js +2 -2
  209. package/dist/schema/nodes/gutter.d.ts +36 -2
  210. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  211. package/dist/schema/nodes/gutter.js +310 -3
  212. package/dist/schema/nodes/hanger-overrides.d.ts +7 -0
  213. package/dist/schema/nodes/hanger-overrides.d.ts.map +1 -0
  214. package/dist/schema/nodes/hanger-overrides.js +6 -0
  215. package/dist/schema/nodes/hvac-equipment.d.ts +1 -1
  216. package/dist/schema/nodes/hvac-equipment.js +1 -1
  217. package/dist/schema/nodes/imported-mesh.d.ts +40 -0
  218. package/dist/schema/nodes/imported-mesh.d.ts.map +1 -0
  219. package/dist/schema/nodes/imported-mesh.js +27 -0
  220. package/dist/schema/nodes/item.d.ts +3 -2
  221. package/dist/schema/nodes/item.d.ts.map +1 -1
  222. package/dist/schema/nodes/item.js +8 -3
  223. package/dist/schema/nodes/lean-to-extension.d.ts +212 -0
  224. package/dist/schema/nodes/lean-to-extension.d.ts.map +1 -0
  225. package/dist/schema/nodes/lean-to-extension.js +114 -0
  226. package/dist/schema/nodes/level.d.ts +2 -2
  227. package/dist/schema/nodes/level.d.ts.map +1 -1
  228. package/dist/schema/nodes/level.js +1 -1
  229. package/dist/schema/nodes/lineset.d.ts +1 -1
  230. package/dist/schema/nodes/lineset.js +1 -1
  231. package/dist/schema/nodes/liquid-line.d.ts +1 -1
  232. package/dist/schema/nodes/liquid-line.js +1 -1
  233. package/dist/schema/nodes/measurement.d.ts +1 -1
  234. package/dist/schema/nodes/measurement.js +2 -2
  235. package/dist/schema/nodes/pipe-fitting.d.ts +10 -2
  236. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -1
  237. package/dist/schema/nodes/pipe-fitting.js +7 -3
  238. package/dist/schema/nodes/pipe-segment.d.ts +24 -2
  239. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -1
  240. package/dist/schema/nodes/pipe-segment.js +21 -1
  241. package/dist/schema/nodes/pipe-trap.d.ts +2 -2
  242. package/dist/schema/nodes/pipe-trap.js +1 -1
  243. package/dist/schema/nodes/ridge-vent.d.ts +2 -2
  244. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  245. package/dist/schema/nodes/ridge-vent.js +7 -4
  246. package/dist/schema/nodes/roof-segment-shape.d.ts +5 -1
  247. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  248. package/dist/schema/nodes/roof-segment-shape.js +65 -2
  249. package/dist/schema/nodes/roof-segment-walls.d.ts +4 -2
  250. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  251. package/dist/schema/nodes/roof-segment-walls.js +2 -2
  252. package/dist/schema/nodes/roof-segment.d.ts +42 -2
  253. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  254. package/dist/schema/nodes/roof-segment.js +81 -4
  255. package/dist/schema/nodes/roof.d.ts +23 -2
  256. package/dist/schema/nodes/roof.d.ts.map +1 -1
  257. package/dist/schema/nodes/roof.js +17 -3
  258. package/dist/schema/nodes/scan.d.ts +19 -2
  259. package/dist/schema/nodes/scan.d.ts.map +1 -1
  260. package/dist/schema/nodes/scan.js +13 -3
  261. package/dist/schema/nodes/shelf.d.ts +3 -3
  262. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  263. package/dist/schema/nodes/shelf.js +3 -4
  264. package/dist/schema/nodes/site.d.ts +1 -1
  265. package/dist/schema/nodes/site.js +2 -2
  266. package/dist/schema/nodes/skylight.d.ts +5 -5
  267. package/dist/schema/nodes/skylight.js +2 -2
  268. package/dist/schema/nodes/slab.d.ts +1 -1
  269. package/dist/schema/nodes/slab.js +3 -3
  270. package/dist/schema/nodes/solar-panel.d.ts +1 -1
  271. package/dist/schema/nodes/solar-panel.js +3 -3
  272. package/dist/schema/nodes/spawn.d.ts +1 -1
  273. package/dist/schema/nodes/spawn.js +1 -1
  274. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  275. package/dist/schema/nodes/stair-segment.js +2 -2
  276. package/dist/schema/nodes/stair.d.ts +2 -2
  277. package/dist/schema/nodes/stair.js +3 -3
  278. package/dist/schema/nodes/structural-grid.d.ts +1 -1
  279. package/dist/schema/nodes/structural-grid.js +1 -1
  280. package/dist/schema/nodes/turbine-vent.d.ts +8 -2
  281. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  282. package/dist/schema/nodes/turbine-vent.js +4 -2
  283. package/dist/schema/nodes/unit.d.ts +33 -0
  284. package/dist/schema/nodes/unit.d.ts.map +1 -0
  285. package/dist/schema/nodes/unit.js +13 -0
  286. package/dist/schema/nodes/wall.d.ts +5 -5
  287. package/dist/schema/nodes/wall.d.ts.map +1 -1
  288. package/dist/schema/nodes/wall.js +13 -6
  289. package/dist/schema/nodes/window.d.ts +10 -3
  290. package/dist/schema/nodes/window.d.ts.map +1 -1
  291. package/dist/schema/nodes/window.js +6 -2
  292. package/dist/schema/nodes/zone.d.ts +2 -2
  293. package/dist/schema/nodes/zone.js +2 -2
  294. package/dist/schema/scene-material.js +2 -2
  295. package/dist/schema/types.d.ts +815 -118
  296. package/dist/schema/types.d.ts.map +1 -1
  297. package/dist/schema/types.js +79 -46
  298. package/dist/services/alignment-anchors.d.ts +6 -11
  299. package/dist/services/alignment-anchors.d.ts.map +1 -1
  300. package/dist/services/alignment-anchors.js +7 -34
  301. package/dist/services/drag-session.d.ts +4 -4
  302. package/dist/services/drag-session.js +1 -1
  303. package/dist/services/hosting.d.ts +4 -10
  304. package/dist/services/hosting.d.ts.map +1 -1
  305. package/dist/services/hosting.js +6 -16
  306. package/dist/services/index.d.ts +16 -13
  307. package/dist/services/index.d.ts.map +1 -1
  308. package/dist/services/index.js +16 -13
  309. package/dist/services/level-height.d.ts +2 -2
  310. package/dist/services/level-height.js +3 -3
  311. package/dist/services/movement.d.ts +3 -3
  312. package/dist/services/movement.js +2 -2
  313. package/dist/services/port-connectivity.d.ts +1 -1
  314. package/dist/services/port-connectivity.js +1 -1
  315. package/dist/services/riser-diagram.d.ts +1 -1
  316. package/dist/services/shelf-board.d.ts +5 -0
  317. package/dist/services/shelf-board.d.ts.map +1 -0
  318. package/dist/services/shelf-board.js +15 -0
  319. package/dist/services/storey.d.ts +2 -2
  320. package/dist/services/storey.js +2 -2
  321. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts +13 -0
  322. package/dist/services/surface-hosting-procedural-parity.fixtures.d.ts.map +1 -0
  323. package/dist/services/surface-hosting-procedural-parity.fixtures.js +4691 -0
  324. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts +1060 -0
  325. package/dist/services/surface-hosting-shelf-parity.fixtures.d.ts.map +1 -0
  326. package/dist/services/surface-hosting-shelf-parity.fixtures.js +3127 -0
  327. package/dist/services/surface-hosting.d.ts +88 -0
  328. package/dist/services/surface-hosting.d.ts.map +1 -0
  329. package/dist/services/surface-hosting.js +268 -0
  330. package/dist/services/surface-region.d.ts +8 -0
  331. package/dist/services/surface-region.d.ts.map +1 -0
  332. package/dist/services/surface-region.js +44 -0
  333. package/dist/services/system-graph.d.ts +12 -1
  334. package/dist/services/system-graph.d.ts.map +1 -1
  335. package/dist/services/system-graph.js +36 -6
  336. package/dist/services/validate-dwv.d.ts +1 -1
  337. package/dist/services/validate-dwv.js +1 -1
  338. package/dist/store/actions/node-actions.d.ts +9 -2
  339. package/dist/store/actions/node-actions.d.ts.map +1 -1
  340. package/dist/store/actions/node-actions.js +475 -24
  341. package/dist/store/history-control.d.ts +3 -3
  342. package/dist/store/history-invalidation.d.ts +3 -0
  343. package/dist/store/history-invalidation.d.ts.map +1 -0
  344. package/dist/store/history-invalidation.js +72 -0
  345. package/dist/store/scene-hydration.d.ts +5 -0
  346. package/dist/store/scene-hydration.d.ts.map +1 -0
  347. package/dist/store/scene-hydration.js +57 -0
  348. package/dist/store/use-interactive.d.ts +2 -2
  349. package/dist/store/use-live-terrain.d.ts +1 -1
  350. package/dist/store/use-scene.d.ts +7 -4
  351. package/dist/store/use-scene.d.ts.map +1 -1
  352. package/dist/store/use-scene.js +361 -87
  353. package/dist/systems/elevator/elevator-dispatch.d.ts +2 -2
  354. package/dist/systems/elevator/elevator-dispatch.js +1 -1
  355. package/dist/systems/elevator/elevator-geometry.d.ts +1 -1
  356. package/dist/systems/elevator/elevator-opening-sync.d.ts +1 -1
  357. package/dist/systems/elevator/elevator-opening-sync.js +2 -2
  358. package/dist/systems/elevator/elevator-opening-system.js +3 -3
  359. package/dist/systems/elevator/elevator-runtime.d.ts +3 -3
  360. package/dist/systems/elevator/elevator-runtime.js +3 -3
  361. package/dist/systems/elevator/elevator-service.d.ts +1 -1
  362. package/dist/systems/elevator/elevator-service.js +1 -1
  363. package/dist/systems/fence/fence-centerline.d.ts +2 -2
  364. package/dist/systems/fence/fence-centerline.js +2 -2
  365. package/dist/systems/fence/fence-spline.d.ts +2 -2
  366. package/dist/systems/roof/roof-elevation-system.d.ts +3 -0
  367. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -0
  368. package/dist/systems/roof/roof-elevation-system.js +94 -0
  369. package/dist/systems/roof/roof-elevation.d.ts +4 -0
  370. package/dist/systems/roof/roof-elevation.d.ts.map +1 -0
  371. package/dist/systems/roof/roof-elevation.js +95 -0
  372. package/dist/systems/roof/roof-footprint.d.ts +17 -0
  373. package/dist/systems/roof/roof-footprint.d.ts.map +1 -0
  374. package/dist/systems/roof/roof-footprint.js +83 -0
  375. package/dist/systems/slab/slab-placement.d.ts +1 -1
  376. package/dist/systems/slab/slab-support.d.ts +1 -1
  377. package/dist/systems/slab/slab-support.js +4 -4
  378. package/dist/systems/stair/stair-flight.d.ts +17 -0
  379. package/dist/systems/stair/stair-flight.d.ts.map +1 -0
  380. package/dist/systems/stair/stair-flight.js +27 -0
  381. package/dist/systems/stair/stair-footprint.d.ts +1 -1
  382. package/dist/systems/stair/stair-opening-preview.d.ts +1621 -1267
  383. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  384. package/dist/systems/stair/stair-opening-preview.js +2 -2
  385. package/dist/systems/stair/stair-opening-sync.d.ts +1 -1
  386. package/dist/systems/stair/stair-opening-sync.js +6 -6
  387. package/dist/systems/stair/stair-opening-system.d.ts +1 -0
  388. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  389. package/dist/systems/stair/stair-opening-system.js +100 -103
  390. package/dist/systems/stair/stair-rise.d.ts +1 -1
  391. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  392. package/dist/systems/stair/stair-rise.js +23 -24
  393. package/dist/systems/wall/wall-curve.d.ts +3 -2
  394. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  395. package/dist/systems/wall/wall-curve.js +73 -0
  396. package/dist/systems/wall/wall-footprint.d.ts +3 -2
  397. package/dist/systems/wall/wall-footprint.d.ts.map +1 -1
  398. package/dist/systems/wall/wall-footprint.js +3 -2
  399. package/dist/systems/wall/wall-mitering.d.ts +1 -1
  400. package/dist/systems/wall/wall-mitering.js +1 -1
  401. package/dist/systems/wall/wall-move.d.ts +1 -1
  402. package/dist/systems/wall/wall-top.d.ts +1 -1
  403. package/dist/systems/wall/wall-topology.d.ts +2 -2
  404. package/dist/systems/wall/wall-topology.js +4 -4
  405. package/dist/utils/clone-scene-graph.d.ts +3 -3
  406. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  407. package/dist/utils/clone-scene-graph.js +35 -3
  408. package/dist/utils/scene-migrations.d.ts +3 -3
  409. package/dist/utils/scene-migrations.js +3 -3
  410. package/dist/utils/vertical-scene-migration.js +5 -5
  411. package/dist/validation/validate-build-json.d.ts +7 -1
  412. package/dist/validation/validate-build-json.d.ts.map +1 -1
  413. package/dist/validation/validate-build-json.js +92 -4
  414. package/package.json +23 -5
  415. package/dist/systems/elevator/elevator-runtime-system.d.ts +0 -2
  416. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +0 -1
  417. package/dist/systems/elevator/elevator-runtime-system.js +0 -8
@@ -28,14 +28,36 @@ export declare const PipeSegmentNode: z.ZodObject<{
28
28
  fov: z.ZodOptional<z.ZodNumber>;
29
29
  zoom: z.ZodOptional<z.ZodNumber>;
30
30
  }, z.core.$strip>>;
31
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
31
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
32
32
  id: z.ZodDefault<z.ZodTemplateLiteral<`pipe-segment_${string}`>>;
33
33
  type: z.ZodDefault<z.ZodLiteral<"pipe-segment">>;
34
34
  path: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
35
+ autoHangers: z.ZodOptional<z.ZodBoolean>;
36
+ hangerOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
37
+ fraction: z.ZodOptional<z.ZodNumber>;
38
+ skipped: z.ZodOptional<z.ZodBoolean>;
39
+ hostId: z.ZodOptional<z.ZodString>;
40
+ }, z.core.$strip>>>;
41
+ hangerStyle: z.ZodOptional<z.ZodEnum<{
42
+ double: "double";
43
+ single: "single";
44
+ }>>;
45
+ hangerSpacing: z.ZodOptional<z.ZodNumber>;
46
+ hangerMaxReach: z.ZodOptional<z.ZodNumber>;
47
+ wallAttachment: z.ZodOptional<z.ZodObject<{
48
+ wallId: z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>;
49
+ side: z.ZodEnum<{
50
+ front: "front";
51
+ back: "back";
52
+ }>;
53
+ startUV: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
54
+ endUV: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
55
+ offset: z.ZodNumber;
56
+ }, z.core.$strip>>;
35
57
  diameter: z.ZodDefault<z.ZodNumber>;
36
58
  pipeMaterial: z.ZodDefault<z.ZodEnum<{
37
- pvc: "pvc";
38
59
  abs: "abs";
60
+ pvc: "pvc";
39
61
  "cast-iron": "cast-iron";
40
62
  }>>;
41
63
  system: z.ZodDefault<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"pipe-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/pipe-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"pipe-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/pipe-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuC3B,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
- import { BaseNode, nodeType, objectId } from '../base';
3
+ import { BaseNode, nodeType, objectId } from '../base.js';
4
+ import { HangerOverrides } from './hanger-overrides.js';
4
5
  /**
5
6
  * DWV pipe segment — drain / waste / vent runs in US residential
6
7
  * plumbing. Phase 2 of the distribution-system effort: the plumbing
@@ -20,6 +21,22 @@ export const PipeSegmentNode = BaseNode.extend({
20
21
  type: nodeType('pipe-segment'),
21
22
  // Polyline path in level-local meters. Minimum two points.
22
23
  path: z.array(z.tuple([z.number(), z.number(), z.number()])).min(2),
24
+ autoHangers: z.boolean().optional(),
25
+ hangerOverrides: HangerOverrides.optional(),
26
+ hangerStyle: z.enum(['single', 'double']).optional(),
27
+ hangerSpacing: z.number().finite().positive().optional(),
28
+ hangerMaxReach: z.number().finite().positive().optional(),
29
+ // Logical wall host for runs drafted on a wall. The path remains
30
+ // level-local; UV coordinates let wall edits reproject the run later.
31
+ wallAttachment: z
32
+ .object({
33
+ wallId: objectId('wall'),
34
+ side: z.enum(['front', 'back']),
35
+ startUV: z.tuple([z.number(), z.number()]),
36
+ endUV: z.tuple([z.number(), z.number()]),
37
+ offset: z.number().finite().nonnegative(),
38
+ })
39
+ .optional(),
23
40
  // Nominal pipe size in inches. Residential DWV: 1¼ (lav tailpiece) to
24
41
  // 4 (building drain); 6 covers oversized mains.
25
42
  diameter: z.number().min(1.25).max(8).default(2),
@@ -29,6 +46,9 @@ export const PipeSegmentNode = BaseNode.extend({
29
46
  system: z.enum(['waste', 'vent']).default('waste'),
30
47
  }).describe(dedent `
31
48
  DWV pipe segment - drain / waste / vent run as a polyline of 3D points.
49
+ - autoHangers: automatically attach supports to nearby walls or ceilings (off when absent)
50
+ - hangerSpacing: distance between supports in meters (default 1.5)
51
+ - hangerMaxReach: maximum centerline-to-host distance in meters (default 2)
32
52
  - path: list of [x, y, z] points in level-local meters (min 2; y may go below the floor)
33
53
  - diameter: nominal size in inches (1.5 / 2 / 3 / 4 typical residential)
34
54
  - pipeMaterial: pvc | abs | cast-iron
@@ -25,15 +25,15 @@ export declare const PipeTrapNode: z.ZodObject<{
25
25
  fov: z.ZodOptional<z.ZodNumber>;
26
26
  zoom: z.ZodOptional<z.ZodNumber>;
27
27
  }, z.core.$strip>>;
28
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
28
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
29
29
  id: z.ZodDefault<z.ZodTemplateLiteral<`pipe-trap_${string}`>>;
30
30
  type: z.ZodDefault<z.ZodLiteral<"pipe-trap">>;
31
31
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
32
32
  rotation: z.ZodDefault<z.ZodNumber>;
33
33
  diameter: z.ZodDefault<z.ZodNumber>;
34
34
  pipeMaterial: z.ZodDefault<z.ZodEnum<{
35
- pvc: "pvc";
36
35
  abs: "abs";
36
+ pvc: "pvc";
37
37
  "cast-iron": "cast-iron";
38
38
  }>>;
39
39
  armLengthM: z.ZodDefault<z.ZodNumber>;
@@ -1,6 +1,6 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
- import { BaseNode, nodeType, objectId } from '../base';
3
+ import { BaseNode, nodeType, objectId } from '../base.js';
4
4
  /**
5
5
  * DWV trap — the P-trap between a fixture and the waste system. Holds a
6
6
  * water seal that blocks sewer gas; every drained fixture has exactly
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { type RoofSegmentNode } from './roof-segment';
2
+ import { type RoofSegmentNode } from './roof-segment.js';
3
3
  export type RidgeVentLine = {
4
4
  name: string;
5
5
  start: [number, number];
@@ -20,7 +20,7 @@ export declare const RidgeVentNode: z.ZodObject<{
20
20
  fov: z.ZodOptional<z.ZodNumber>;
21
21
  zoom: z.ZodOptional<z.ZodNumber>;
22
22
  }, z.core.$strip>>;
23
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
23
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
24
24
  id: z.ZodDefault<z.ZodTemplateLiteral<`rvent_${string}`>>;
25
25
  type: z.ZodDefault<z.ZodLiteral<"ridge-vent">>;
26
26
  material: z.ZodOptional<z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"ridge-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/ridge-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,gBAAgB,CAAA;AAyBvB,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvB,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAkJrF;AAQD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAiB3F;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,IAAI,IAAI,aAAa,CAyBvB;AASD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GACzC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAA;CAC/D,CAEA;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAUT"}
1
+ {"version":3,"file":"ridge-vent.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/ridge-vent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,gBAAgB,CAAA;AAyBvB,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvB,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8BzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAwJrF;AAQD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,EAAE,CAiB3F;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,aAAa,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,GACpC,IAAI,IAAI,aAAa,CAyBvB;AASD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GACzC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IAChD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,aAAa,EAAE,OAAO,CAAA;KAAE,CAAA;CAC/D,CAEA;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC,EAC9D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAUT"}
@@ -1,8 +1,8 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
- import { BaseNode, nodeType, objectId } from '../base';
4
- import { MaterialSchema } from '../material';
5
- import { getDutchRoofMetrics, getRoofSegmentVisibleTopBounds, ROOF_SHAPE_DEFAULTS, } from './roof-segment';
3
+ import { BaseNode, nodeType, objectId } from '../base.js';
4
+ import { MaterialSchema } from '../material.js';
5
+ import { getDutchRoofMetrics, getRoofSegmentVisibleTopBounds, ROOF_SHAPE_DEFAULTS, } from './roof-segment.js';
6
6
  const MIN_DEFAULT_RIDGE_VENT_LENGTH_M = 0.4;
7
7
  const DEFAULT_RIDGE_VENT_GENERATOR = 'default-ridge-vent';
8
8
  const AUTO_RIDGE_VENT_METADATA_KEY = 'autoRidgeVent';
@@ -56,8 +56,11 @@ export function getRidgeVentLinesForSegment(segment) {
56
56
  trim: UNTRIMMED_RIDGE_VENT_BOUNDS_TRIM,
57
57
  });
58
58
  const { width, depth, minX, maxX, minZ, maxZ } = bounds;
59
- if (segment.roofType === 'flat' || segment.roofType === 'shed')
59
+ if (segment.roofType === 'flat' ||
60
+ segment.roofType === 'shed' ||
61
+ segment.roofType === 'conical') {
60
62
  return [];
63
+ }
61
64
  const halfW = width / 2;
62
65
  const halfD = depth / 2;
63
66
  const ridgeZVisible = minZ <= 0 && maxZ >= 0;
@@ -1,9 +1,11 @@
1
- import { type RoofType } from './roof-segment';
1
+ import { type RoofType } from './roof-segment.js';
2
2
  export type RoofShapeFaceVertex = {
3
3
  x: number;
4
4
  y: number;
5
5
  z: number;
6
6
  };
7
+ export type RoofShapeEaveSide = '+X' | '-X' | '+Z' | '-Z';
8
+ export declare function getRoofShapeEaveSides(type: RoofType): RoofShapeEaveSide[];
7
9
  export type RoofShapeInsets = {
8
10
  iF?: number;
9
11
  iB?: number;
@@ -86,5 +88,7 @@ export declare function getRoofModuleFaces(input: {
86
88
  shapeRatios: RoofShapeRatios;
87
89
  excludeDutchEndSlopes?: boolean;
88
90
  dutchTopRakeThickness?: number;
91
+ conicalStartAngle?: number;
92
+ conicalSweepAngle?: number;
89
93
  }): RoofShapeFaceVertex[][];
90
94
  //# sourceMappingURL=roof-segment-shape.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roof-segment-shape.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment-shape.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roof-segment-shape.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment-shape.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
- import { ROOF_SHAPE_DEFAULTS } from './roof-segment';
1
+ import { ROOF_SHAPE_DEFAULTS } from './roof-segment.js';
2
+ export function getRoofShapeEaveSides(type) {
3
+ switch (type) {
4
+ case 'conical':
5
+ return [];
6
+ case 'shed':
7
+ return ['+Z'];
8
+ case 'gable':
9
+ case 'gambrel':
10
+ return ['+Z', '-Z'];
11
+ default:
12
+ return ['+Z', '-Z', '+X', '-X'];
13
+ }
14
+ }
2
15
  export function getRoofShapeRatios(input) {
3
16
  return {
4
17
  gambrelLowerWidthRatio: input.gambrelLowerWidthRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerWidthRatio,
@@ -61,7 +74,10 @@ export function getRoofShapeInsets(input) {
61
74
  let iB = 0;
62
75
  let iL = 0;
63
76
  let iR = 0;
64
- if (input.roofType === 'hip' || input.roofType === 'mansard' || input.roofType === 'dutch') {
77
+ if (input.roofType === 'hip' ||
78
+ input.roofType === 'mansard' ||
79
+ input.roofType === 'dutch' ||
80
+ input.roofType === 'conical') {
65
81
  iF = inset;
66
82
  iB = inset;
67
83
  iL = inset;
@@ -158,6 +174,53 @@ export function getDutchEndSlopeFaces(input) {
158
174
  export function getRoofModuleFaces(input) {
159
175
  const v = (x, y, z) => ({ x, y, z });
160
176
  const { iF = 0, iB = 0, iL = 0, iR = 0 } = input.insets;
177
+ if (input.type === 'conical') {
178
+ const startAngle = Number.isFinite(input.conicalStartAngle) ? input.conicalStartAngle : 0;
179
+ const requestedSweep = Number.isFinite(input.conicalSweepAngle)
180
+ ? input.conicalSweepAngle
181
+ : -Math.PI * 2;
182
+ const sweepAngle = Math.max(-Math.PI * 2, Math.min(Math.PI * 2, Math.abs(requestedSweep) < 1e-4 ? 1e-4 : requestedSweep));
183
+ const isFullCone = Math.abs(sweepAngle) >= Math.PI * 2 - 1e-4;
184
+ const radialSegments = isFullCone
185
+ ? 48
186
+ : Math.max(1, Math.ceil((48 * Math.abs(sweepAngle)) / (Math.PI * 2)));
187
+ const eaveRadius = Math.max(0.005, input.w / 2);
188
+ const radialInset = (iF + iB + iL + iR) / 4;
189
+ const baseRadius = Math.max(0.005, eaveRadius - radialInset);
190
+ const eaveY = input.wh;
191
+ const peak = v(0, input.wh + Math.max(0.001, input.rh), 0);
192
+ const ringPointCount = isFullCone ? radialSegments : radialSegments + 1;
193
+ const bottomRing = Array.from({ length: ringPointCount }, (_, index) => {
194
+ const angle = startAngle + (index / radialSegments) * sweepAngle;
195
+ return v(Math.cos(angle) * baseRadius, input.baseY, Math.sin(angle) * baseRadius);
196
+ });
197
+ const eaveRing = Array.from({ length: ringPointCount }, (_, index) => {
198
+ const angle = startAngle + (index / radialSegments) * sweepAngle;
199
+ return v(Math.cos(angle) * eaveRadius, eaveY, Math.sin(angle) * eaveRadius);
200
+ });
201
+ const bottomCenter = v(0, input.baseY, 0);
202
+ const eaveCenter = v(0, eaveY, 0);
203
+ const faces = [
204
+ isFullCone ? [...bottomRing].reverse() : [bottomCenter, ...[...bottomRing].reverse()],
205
+ ];
206
+ for (let index = 0; index < radialSegments; index += 1) {
207
+ const next = isFullCone ? (index + 1) % radialSegments : index + 1;
208
+ faces.push([bottomRing[index], bottomRing[next], eaveRing[next], eaveRing[index]]);
209
+ }
210
+ if (input.rh === 0) {
211
+ faces.push(isFullCone ? [...eaveRing].reverse() : [eaveCenter, ...[...eaveRing].reverse()]);
212
+ }
213
+ else {
214
+ for (let index = 0; index < radialSegments; index += 1) {
215
+ const next = isFullCone ? (index + 1) % radialSegments : index + 1;
216
+ faces.push([eaveRing[index], eaveRing[next], peak]);
217
+ }
218
+ }
219
+ if (!isFullCone) {
220
+ faces.push([bottomCenter, bottomRing[0], eaveRing[0], peak], [bottomCenter, peak, eaveRing.at(-1), bottomRing.at(-1)]);
221
+ }
222
+ return sweepAngle > 0 ? faces.map((face) => [...face].reverse()) : faces;
223
+ }
161
224
  const b1 = v(-input.w / 2 + iL, input.baseY, input.d / 2 - iF);
162
225
  const b2 = v(input.w / 2 - iR, input.baseY, input.d / 2 - iF);
163
226
  const b3 = v(input.w / 2 - iR, input.baseY, -input.d / 2 + iB);
@@ -1,4 +1,4 @@
1
- import type { RoofSegmentNode } from './roof-segment';
1
+ import type { RoofSegmentNode } from './roof-segment.js';
2
2
  /**
3
3
  * Wall-face math for roof segments — the vertical surfaces a wall-mounted
4
4
  * opening (door / window) can attach to. A segment's generated volume has
@@ -14,7 +14,9 @@ import type { RoofSegmentNode } from './roof-segment';
14
14
  * (`getVol(wallThickness / 2, 0, 0, …)`): the volume is the segment
15
15
  * footprint extended outward by `wallThickness / 2`, which drops the eave
16
16
  * line by `(wallThickness / 2) · tanθ` and raises the ridge by the same
17
- * amount so the apex stays at `wallHeight + activeRh`.
17
+ * amount so the apex stays at `wallHeight + activeRh` unless the eave
18
+ * hits the CSG minimum. The base stays at 0; the eave is raised to at
19
+ * least 0.05 above it to avoid sinking the shell into the supporting wall.
18
20
  */
19
21
  export type RoofWallFaceId = 'front' | 'back' | 'right' | 'left';
20
22
  export type RoofSegmentWallFace = {
@@ -1 +1 @@
1
- {"version":3,"file":"roof-segment-walls.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment-walls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,cAAc,CAAA;IAClB,6CAA6C;IAC7C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAC5B,CAAA;AAED,KAAK,iBAAiB,GAAG,IAAI,CAC3B,eAAe,EACf,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAC1E,GACC,OAAO,CACL,IAAI,CACF,eAAe,EACb,wBAAwB,GACxB,yBAAyB,GACzB,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,GACrB,uBAAuB,CAC1B,CACF,CAAA;AAqJH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,GACjB,mBAAmB,CAUrB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,EAAE,CAStF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAaxC;AA+CD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,GACjB;IAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAYnD;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAO1B;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,CAWR;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AAID;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,mBAAmB,EACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwCjC"}
1
+ {"version":3,"file":"roof-segment-walls.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment-walls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAGrD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,cAAc,CAAA;IAClB,6CAA6C;IAC7C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC;;;;OAIG;IACH,GAAG,EAAE,MAAM,CAAA;IACX,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAC5B,CAAA;AAED,KAAK,iBAAiB,GAAG,IAAI,CAC3B,eAAe,EACf,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,YAAY,GAAG,eAAe,GAAG,OAAO,CAC1E,GACC,OAAO,CACL,IAAI,CACF,eAAe,EACb,wBAAwB,GACxB,yBAAyB,GACzB,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,qBAAqB,GACrB,uBAAuB,CAC1B,CACF,CAAA;AAqJH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,GACjB,mBAAmB,CAUrB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,EAAE,CAStF;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAaxC;AA+CD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,GACjB;IAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAYnD;AAED,yEAAyE;AACzE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC9B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAO1B;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,MAAM,CAWR;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AAID;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,mBAAmB,EACzB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwCjC"}
@@ -1,11 +1,11 @@
1
- import { getDutchRoofMetrics, getSegmentSlopeFrame } from './roof-segment';
1
+ import { getDutchRoofMetrics, getSegmentSlopeFrame } from './roof-segment.js';
2
2
  function getWallVolumeFrame(node) {
3
3
  const { activeRh, tanTheta } = getSegmentSlopeFrame(node);
4
4
  const wallThickness = node.wallThickness ?? 0.1;
5
5
  const autoDrop = (wallThickness / 2) * tanTheta;
6
6
  const wV = Math.max(0.01, node.width + wallThickness);
7
7
  const dV = Math.max(0.01, node.depth + wallThickness);
8
- const eaveY = Math.max(0.01, node.wallHeight - autoDrop);
8
+ const eaveY = Math.max(0.05, node.wallHeight - autoDrop);
9
9
  let rh = activeRh;
10
10
  if (activeRh > 0) {
11
11
  rh = activeRh + autoDrop;
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import type { MaterialSchema as MaterialSchemaType } from '../material';
2
+ import type { MaterialSchema as MaterialSchemaType } from '../material.js';
3
3
  export declare const RoofType: z.ZodEnum<{
4
4
  flat: "flat";
5
5
  hip: "hip";
@@ -8,6 +8,7 @@ export declare const RoofType: z.ZodEnum<{
8
8
  gambrel: "gambrel";
9
9
  dutch: "dutch";
10
10
  mansard: "mansard";
11
+ conical: "conical";
11
12
  }>;
12
13
  export type RoofType = z.infer<typeof RoofType>;
13
14
  export declare const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
@@ -70,7 +71,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
70
71
  fov: z.ZodOptional<z.ZodNumber>;
71
72
  zoom: z.ZodOptional<z.ZodNumber>;
72
73
  }, z.core.$strip>>;
73
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
74
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
74
75
  id: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
75
76
  type: z.ZodDefault<z.ZodLiteral<"roof-segment">>;
76
77
  material: z.ZodOptional<z.ZodObject<{
@@ -215,9 +216,13 @@ export declare const RoofSegmentNode: z.ZodObject<{
215
216
  gambrel: "gambrel";
216
217
  dutch: "dutch";
217
218
  mansard: "mansard";
219
+ conical: "conical";
218
220
  }>>;
219
221
  width: z.ZodDefault<z.ZodNumber>;
220
222
  depth: z.ZodDefault<z.ZodNumber>;
223
+ conicalStartAngle: z.ZodOptional<z.ZodNumber>;
224
+ conicalSweepAngle: z.ZodOptional<z.ZodNumber>;
225
+ conicalFullCircle: z.ZodOptional<z.ZodBoolean>;
221
226
  trim: z.ZodDefault<z.ZodObject<{
222
227
  left: z.ZodDefault<z.ZodNumber>;
223
228
  right: z.ZodDefault<z.ZodNumber>;
@@ -242,6 +247,33 @@ export declare const RoofSegmentNode: z.ZodObject<{
242
247
  deckThickness: z.ZodDefault<z.ZodNumber>;
243
248
  overhang: z.ZodDefault<z.ZodNumber>;
244
249
  shingleThickness: z.ZodDefault<z.ZodNumber>;
250
+ arc: z.ZodOptional<z.ZodObject<{
251
+ centerX: z.ZodNumber;
252
+ centerZ: z.ZodNumber;
253
+ radius: z.ZodNumber;
254
+ }, z.core.$strip>>;
255
+ shedSideInfillSpan: z.ZodOptional<z.ZodNumber>;
256
+ shedSideInfillMinX: z.ZodOptional<z.ZodNumber>;
257
+ shedSideInfillMaxX: z.ZodOptional<z.ZodNumber>;
258
+ shedFootprintPieces: z.ZodOptional<z.ZodArray<z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>>>;
259
+ shedOpenEndSides: z.ZodOptional<z.ZodArray<z.ZodEnum<{
260
+ right: "right";
261
+ left: "left";
262
+ }>>>;
263
+ shedJointFrame: z.ZodOptional<z.ZodObject<{
264
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
265
+ rotation: z.ZodNumber;
266
+ }, z.core.$strip>>;
267
+ shedJointOwnerId: z.ZodOptional<z.ZodString>;
268
+ shedJointNeighborIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
269
+ shedJointScopeId: z.ZodOptional<z.ZodString>;
270
+ managedByParent: z.ZodDefault<z.ZodBoolean>;
271
+ wallShell: z.ZodDefault<z.ZodEnum<{
272
+ omit: "omit";
273
+ auto: "auto";
274
+ include: "include";
275
+ }>>;
276
+ shedInsetEndPanels: z.ZodDefault<z.ZodBoolean>;
245
277
  gambrelLowerWidthRatio: z.ZodDefault<z.ZodNumber>;
246
278
  gambrelLowerHeightRatio: z.ZodDefault<z.ZodNumber>;
247
279
  mansardSteepWidthRatio: z.ZodDefault<z.ZodNumber>;
@@ -254,6 +286,11 @@ export declare const RoofSegmentNode: z.ZodObject<{
254
286
  children: z.ZodDefault<z.ZodArray<z.ZodString>>;
255
287
  }, z.core.$strip>;
256
288
  export type RoofSegmentNode = z.infer<typeof RoofSegmentNode>;
289
+ export declare function getConicalRoofCoverage(node: Pick<RoofSegmentNode, 'conicalFullCircle' | 'conicalStartAngle' | 'conicalSweepAngle'>): {
290
+ fullCircle: boolean;
291
+ startAngle: number;
292
+ sweepAngle: number;
293
+ };
257
294
  export declare function normalizeRoofSegmentTrim(node: Pick<RoofSegmentNode, 'width' | 'depth'> & {
258
295
  trim?: Partial<RoofSegmentTrim>;
259
296
  }): RoofSegmentTrim;
@@ -322,6 +359,9 @@ export type RoofSegmentVisibleTopBounds = {
322
359
  export declare function getRoofSegmentVisibleTopBounds(segment: RoofSegmentNode): RoofSegmentVisibleTopBounds;
323
360
  /** Segment-local surface height used by roof accessory placement and hit disambiguation. */
324
361
  export declare function getRoofSegmentSurfaceY(node: Pick<RoofSegmentNode, 'roofType' | 'width' | 'depth' | 'wallHeight'> & Parameters<typeof getSegmentSlopeFrame>[0], localX: number, localZ: number): number;
362
+ export declare function isBandedShedSegment(node: Pick<RoofSegmentNode, 'roofType' | 'arc'>): node is Pick<RoofSegmentNode, 'roofType' | 'arc'> & {
363
+ arc: NonNullable<RoofSegmentNode['arc']>;
364
+ };
325
365
  /**
326
366
  * Inverse of `getActiveRoofHeight` — recover the pitch a legacy
327
367
  * `roofHeight` value would correspond to. Used by the scene migration.
@@ -1 +1 @@
1
- {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,17 @@
1
1
  import dedent from 'dedent';
2
2
  import { z } from 'zod';
3
- import { BaseNode, nodeType, objectId } from '../base';
4
- import { MaterialSchema } from '../material';
5
- export const RoofType = z.enum(['hip', 'gable', 'shed', 'gambrel', 'dutch', 'mansard', 'flat']);
3
+ import { BaseNode, nodeType, objectId } from '../base.js';
4
+ import { MaterialSchema } from '../material.js';
5
+ export const RoofType = z.enum([
6
+ 'hip',
7
+ 'gable',
8
+ 'shed',
9
+ 'gambrel',
10
+ 'dutch',
11
+ 'mansard',
12
+ 'flat',
13
+ 'conical',
14
+ ]);
6
15
  export const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
7
16
  const DEFAULT_ROOF_SEGMENT_WIDTH = 8;
8
17
  const DEFAULT_ROOF_SEGMENT_DEPTH = 6;
@@ -96,6 +105,18 @@ export const RoofSegmentNode = BaseNode.extend({
96
105
  // Footprint dimensions
97
106
  width: z.number().default(8),
98
107
  depth: z.number().default(6),
108
+ // Angular extent of a conical roof. A full cone uses 2π. A signed
109
+ // sweep preserves the direction of the curved wall used to create a
110
+ // conical sector; other roof types ignore both fields.
111
+ conicalStartAngle: z.number().optional(),
112
+ conicalSweepAngle: z
113
+ .number()
114
+ .min(-Math.PI * 2)
115
+ .max(Math.PI * 2)
116
+ .optional(),
117
+ // Overrides the stored sector angles without discarding them, allowing
118
+ // the panel to switch back to the original clipped wall sweep.
119
+ conicalFullCircle: z.boolean().optional(),
99
120
  // Segment-local distances trimmed from each footprint side. The trim
100
121
  // boundary is projected vertically through the roof volume, so the
101
122
  // resulting edge follows the actual sloped roof surfaces.
@@ -112,6 +133,34 @@ export const RoofSegmentNode = BaseNode.extend({
112
133
  deckThickness: z.number().default(0.1),
113
134
  overhang: z.number().default(0.3),
114
135
  shingleThickness: z.number().default(0.05),
136
+ arc: z
137
+ .object({
138
+ centerX: z.number(),
139
+ centerZ: z.number(),
140
+ radius: z.number(),
141
+ })
142
+ .optional()
143
+ .describe('Concentric-arc descriptor for a curved shed deck, in segment-local coordinates (center + true radius). Absent for a straight deck.'),
144
+ shedSideInfillSpan: z.number().positive().optional(),
145
+ shedSideInfillMinX: z.number().optional(),
146
+ shedSideInfillMaxX: z.number().optional(),
147
+ shedFootprintPieces: z.array(z.array(z.tuple([z.number(), z.number()])).min(3)).optional(),
148
+ shedOpenEndSides: z.array(z.enum(['left', 'right'])).optional(),
149
+ // Shared scene-scope data for comparing shed seams that live under separate
150
+ // roof parents. Kind-owned assembly code supplies it; the renderer remains
151
+ // independent of the kind that produced the segment.
152
+ shedJointFrame: z
153
+ .object({
154
+ position: z.tuple([z.number(), z.number(), z.number()]),
155
+ rotation: z.number(),
156
+ })
157
+ .optional(),
158
+ shedJointOwnerId: z.string().optional(),
159
+ shedJointNeighborIds: z.array(z.string()).optional(),
160
+ shedJointScopeId: z.string().optional(),
161
+ managedByParent: z.boolean().default(false),
162
+ wallShell: z.enum(['auto', 'include', 'omit']).default('auto'),
163
+ shedInsetEndPanels: z.boolean().default(false),
115
164
  // Shape-specific ratios. Only the pair matching `roofType` is read; the
116
165
  // rest are inert. Defined on every segment so the panel can flip
117
166
  // roofType without losing the previous shape's tuning.
@@ -169,8 +218,10 @@ export const RoofSegmentNode = BaseNode.extend({
169
218
  Roof segment node - an individual roof module within a roof group.
170
219
  Each segment generates a complete architectural volume (walls + roof).
171
220
  Multiple segments can be combined to form complex roof shapes.
172
- - roofType: hip, gable, shed, gambrel, dutch, mansard, flat
221
+ - roofType: hip, gable, shed, gambrel, dutch, mansard, flat, conical
173
222
  - width/depth: footprint dimensions
223
+ - conicalStartAngle / conicalSweepAngle: angular extent of a conical sector (radians)
224
+ - conicalFullCircle: temporarily render the complete cone while preserving the sector angles
174
225
  - trim: segment-local side cut distances
175
226
  - wallHeight: height of walls below the roof
176
227
  - pitch: roof slope in degrees (angle of the primary slope face)
@@ -184,6 +235,20 @@ export const RoofSegmentNode = BaseNode.extend({
184
235
  - dutchGabletRake: gablet barge-board overhang past the gablet end-wall (m, 0 = none)
185
236
  - dutchTopRakeThickness: thickness of the top gable rake slab
186
237
  `);
238
+ export function getConicalRoofCoverage(node) {
239
+ const storedSweep = node.conicalSweepAngle;
240
+ const inferredFullCircle = storedSweep === undefined || Math.abs(storedSweep) >= Math.PI * 2 - 1e-4;
241
+ const fullCircle = node.conicalFullCircle ?? inferredFullCircle;
242
+ if (fullCircle) {
243
+ return { fullCircle: true, startAngle: 0, sweepAngle: -Math.PI * 2 };
244
+ }
245
+ const hasClippedSweep = storedSweep !== undefined && Math.abs(storedSweep) < Math.PI * 2 - 1e-4;
246
+ return {
247
+ fullCircle: false,
248
+ startAngle: node.conicalStartAngle ?? 0,
249
+ sweepAngle: hasClippedSweep ? storedSweep : -Math.PI,
250
+ };
251
+ }
187
252
  function finiteNonNegative(value) {
188
253
  return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0;
189
254
  }
@@ -323,6 +388,8 @@ export function getDutchRoofMetrics(input) {
323
388
  function getPrimarySlopeRun(input) {
324
389
  const min = Math.min(input.width, input.depth);
325
390
  switch (input.roofType) {
391
+ case 'conical':
392
+ return input.width / 2;
326
393
  case 'shed':
327
394
  return input.depth;
328
395
  case 'gable':
@@ -395,6 +462,7 @@ export function getRoofSegmentVisibleTopBounds(segment) {
395
462
  let frontExt = deckExt;
396
463
  let backExt = deckExt;
397
464
  if (segment.roofType === 'hip' ||
465
+ segment.roofType === 'conical' ||
398
466
  segment.roofType === 'mansard' ||
399
467
  segment.roofType === 'dutch') {
400
468
  xExt += shingleOverhang;
@@ -495,9 +563,18 @@ export function getRoofSegmentSurfaceY(node, localX, localZ) {
495
563
  const fz = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
496
564
  return peakY - Math.max(fx, fz) * activeRh;
497
565
  }
566
+ if (node.roofType === 'conical') {
567
+ const radius = Math.max(0.0001, node.width / 2);
568
+ const radialProgress = Math.min(1, Math.hypot(localX, localZ) / radius);
569
+ return peakY - radialProgress * activeRh;
570
+ }
498
571
  const t = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
499
572
  return peakY - t * activeRh;
500
573
  }
574
+ // A shed segment whose deck follows a concentric arc.
575
+ export function isBandedShedSegment(node) {
576
+ return node.roofType === 'shed' && node.arc != null && Number.isFinite(node.arc.radius);
577
+ }
501
578
  /**
502
579
  * Inverse of `getActiveRoofHeight` — recover the pitch a legacy
503
580
  * `roofHeight` value would correspond to. Used by the scene migration.
@@ -1,10 +1,21 @@
1
1
  import { z } from 'zod';
2
- import type { MaterialSchema as MaterialSchemaType } from '../material';
2
+ import type { MaterialSchema as MaterialSchemaType } from '../material.js';
3
3
  export type RoofSurfaceMaterialRole = 'top' | 'edge' | 'wall';
4
4
  export type RoofSurfaceMaterialSpec = {
5
5
  material?: MaterialSchemaType;
6
6
  materialPreset?: string;
7
7
  };
8
+ export declare const RoofSupport: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
9
+ kind: z.ZodLiteral<"level">;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ kind: z.ZodLiteral<"walls">;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ kind: z.ZodLiteral<"roof">;
14
+ roofSegmentId: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
15
+ localPosition: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
16
+ curbHeight: z.ZodDefault<z.ZodNumber>;
17
+ }, z.core.$strip>], "kind">>;
18
+ export type RoofSupport = z.infer<typeof RoofSupport>;
8
19
  export declare const RoofNode: z.ZodObject<{
9
20
  object: z.ZodDefault<z.ZodLiteral<"node">>;
10
21
  name: z.ZodOptional<z.ZodString>;
@@ -20,7 +31,7 @@ export declare const RoofNode: z.ZodObject<{
20
31
  fov: z.ZodOptional<z.ZodNumber>;
21
32
  zoom: z.ZodOptional<z.ZodNumber>;
22
33
  }, z.core.$strip>>;
23
- metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
34
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
24
35
  id: z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>;
25
36
  type: z.ZodDefault<z.ZodLiteral<"roof">>;
26
37
  material: z.ZodOptional<z.ZodObject<{
@@ -157,6 +168,16 @@ export declare const RoofNode: z.ZodObject<{
157
168
  wallMaterialPreset: z.ZodOptional<z.ZodString>;
158
169
  position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
159
170
  rotation: z.ZodDefault<z.ZodNumber>;
171
+ support: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
172
+ kind: z.ZodLiteral<"level">;
173
+ }, z.core.$strip>, z.ZodObject<{
174
+ kind: z.ZodLiteral<"walls">;
175
+ }, z.core.$strip>, z.ZodObject<{
176
+ kind: z.ZodLiteral<"roof">;
177
+ roofSegmentId: z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>;
178
+ localPosition: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
179
+ curbHeight: z.ZodDefault<z.ZodNumber>;
180
+ }, z.core.$strip>], "kind">>;
160
181
  children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`rseg_${string}`>>>>;
161
182
  }, z.core.$strip>;
162
183
  export type RoofNode = z.infer<typeof RoofNode>;
@@ -1 +1 @@
1
- {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyBpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAS/C,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAoCzB"}
1
+ {"version":3,"file":"roof.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,cAAc,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAIvE,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAC7D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;;;4BAWK,CAAA;AAE7B,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAErD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BpB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAS/C,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,uBAAuB,GAC5B,uBAAuB,CAoCzB"}