@pascal-app/core 0.9.1 → 0.9.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 (321) hide show
  1. package/dist/events/bus.d.ts +30 -2
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  6. package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
  7. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  8. package/dist/hooks/scene-registry/scene-registry.js +27 -1
  9. package/dist/hooks/scene-registry/scene-registry.test.d.ts +2 -0
  10. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +1 -0
  11. package/dist/hooks/scene-registry/scene-registry.test.js +26 -0
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +93 -0
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +69 -12
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +476 -195
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.js +19 -1
  18. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +2 -0
  19. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +1 -0
  20. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +363 -0
  21. package/dist/index.d.ts +16 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +15 -5
  24. package/dist/lib/level-name.d.ts +4 -0
  25. package/dist/lib/level-name.d.ts.map +1 -0
  26. package/dist/lib/level-name.js +10 -0
  27. package/dist/lib/measurement-geometry.d.ts +19 -0
  28. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  29. package/dist/lib/measurement-geometry.js +232 -0
  30. package/dist/lib/measurement-geometry.test.d.ts +2 -0
  31. package/dist/lib/measurement-geometry.test.d.ts.map +1 -0
  32. package/dist/lib/measurement-geometry.test.js +102 -0
  33. package/dist/lib/polygon-geometry.d.ts +0 -1
  34. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  35. package/dist/lib/polygon-geometry.js +0 -18
  36. package/dist/lib/selection-proxy.d.ts +4 -0
  37. package/dist/lib/selection-proxy.d.ts.map +1 -0
  38. package/dist/lib/selection-proxy.js +12 -0
  39. package/dist/lib/slab-polygon.d.ts +31 -2
  40. package/dist/lib/slab-polygon.d.ts.map +1 -1
  41. package/dist/lib/slab-polygon.js +525 -31
  42. package/dist/lib/slab-polygon.test.d.ts +2 -0
  43. package/dist/lib/slab-polygon.test.d.ts.map +1 -0
  44. package/dist/lib/slab-polygon.test.js +635 -0
  45. package/dist/lib/slots.d.ts +14 -0
  46. package/dist/lib/slots.d.ts.map +1 -0
  47. package/dist/lib/slots.js +26 -0
  48. package/dist/lib/space-detection.d.ts +25 -2
  49. package/dist/lib/space-detection.d.ts.map +1 -1
  50. package/dist/lib/space-detection.js +414 -118
  51. package/dist/lib/space-detection.test.js +301 -2
  52. package/dist/lib/wall-distance.d.ts +60 -0
  53. package/dist/lib/wall-distance.d.ts.map +1 -0
  54. package/dist/lib/wall-distance.js +85 -0
  55. package/dist/lib/zone-quantities.d.ts +21 -0
  56. package/dist/lib/zone-quantities.d.ts.map +1 -0
  57. package/dist/lib/zone-quantities.js +183 -0
  58. package/dist/lib/zone-quantities.test.d.ts +2 -0
  59. package/dist/lib/zone-quantities.test.d.ts.map +1 -0
  60. package/dist/lib/zone-quantities.test.js +82 -0
  61. package/dist/material-library.d.ts +20 -1
  62. package/dist/material-library.d.ts.map +1 -1
  63. package/dist/material-library.js +2181 -441
  64. package/dist/registry/handles.d.ts +75 -2
  65. package/dist/registry/handles.d.ts.map +1 -1
  66. package/dist/registry/index.d.ts +3 -3
  67. package/dist/registry/index.d.ts.map +1 -1
  68. package/dist/registry/index.js +1 -1
  69. package/dist/registry/registry.d.ts +46 -3
  70. package/dist/registry/registry.d.ts.map +1 -1
  71. package/dist/registry/registry.js +82 -1
  72. package/dist/registry/registry.test.js +14 -1
  73. package/dist/registry/subtree.d.ts.map +1 -1
  74. package/dist/registry/subtree.js +4 -0
  75. package/dist/registry/subtree.test.js +30 -0
  76. package/dist/registry/types.d.ts +717 -38
  77. package/dist/registry/types.d.ts.map +1 -1
  78. package/dist/schema/index.d.ts +21 -5
  79. package/dist/schema/index.d.ts.map +1 -1
  80. package/dist/schema/index.js +17 -3
  81. package/dist/schema/material.d.ts +3 -2
  82. package/dist/schema/material.d.ts.map +1 -1
  83. package/dist/schema/material.js +7 -5
  84. package/dist/schema/material.test.d.ts +2 -0
  85. package/dist/schema/material.test.d.ts.map +1 -0
  86. package/dist/schema/material.test.js +43 -0
  87. package/dist/schema/nodes/box-vent.d.ts +2 -2
  88. package/dist/schema/nodes/cabinet.d.ts +534 -0
  89. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  90. package/dist/schema/nodes/cabinet.js +137 -0
  91. package/dist/schema/nodes/ceiling.d.ts +3 -2
  92. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  93. package/dist/schema/nodes/ceiling.js +4 -0
  94. package/dist/schema/nodes/chimney.d.ts +4 -4
  95. package/dist/schema/nodes/column.d.ts +3 -2
  96. package/dist/schema/nodes/column.d.ts.map +1 -1
  97. package/dist/schema/nodes/column.js +3 -0
  98. package/dist/schema/nodes/cupola.d.ts +2 -2
  99. package/dist/schema/nodes/door.d.ts +13 -5
  100. package/dist/schema/nodes/door.d.ts.map +1 -1
  101. package/dist/schema/nodes/door.js +12 -0
  102. package/dist/schema/nodes/dormer.d.ts +8 -8
  103. package/dist/schema/nodes/dormer.js +1 -1
  104. package/dist/schema/nodes/downspout.d.ts +2 -2
  105. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  106. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  107. package/dist/schema/nodes/duct-fitting.js +92 -0
  108. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  109. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  110. package/dist/schema/nodes/duct-segment.js +73 -0
  111. package/dist/schema/nodes/duct-terminal.d.ts +57 -0
  112. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  113. package/dist/schema/nodes/duct-terminal.js +51 -0
  114. package/dist/schema/nodes/elevator.d.ts +3 -2
  115. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  116. package/dist/schema/nodes/elevator.js +3 -0
  117. package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
  118. package/dist/schema/nodes/fence.d.ts +18 -2
  119. package/dist/schema/nodes/fence.d.ts.map +1 -1
  120. package/dist/schema/nodes/fence.js +25 -2
  121. package/dist/schema/nodes/gutter.d.ts +2 -2
  122. package/dist/schema/nodes/hvac-equipment.d.ts +63 -0
  123. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  124. package/dist/schema/nodes/hvac-equipment.js +55 -0
  125. package/dist/schema/nodes/item.d.ts +8 -0
  126. package/dist/schema/nodes/item.d.ts.map +1 -1
  127. package/dist/schema/nodes/item.js +11 -0
  128. package/dist/schema/nodes/level.d.ts +1 -1
  129. package/dist/schema/nodes/level.d.ts.map +1 -1
  130. package/dist/schema/nodes/level.js +2 -0
  131. package/dist/schema/nodes/lineset.d.ts +42 -0
  132. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  133. package/dist/schema/nodes/lineset.js +38 -0
  134. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  135. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  136. package/dist/schema/nodes/liquid-line.js +24 -0
  137. package/dist/schema/nodes/measurement.d.ts +306 -0
  138. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  139. package/dist/schema/nodes/measurement.js +87 -0
  140. package/dist/schema/nodes/measurement.test.d.ts +2 -0
  141. package/dist/schema/nodes/measurement.test.d.ts.map +1 -0
  142. package/dist/schema/nodes/measurement.test.js +139 -0
  143. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  144. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  145. package/dist/schema/nodes/pipe-fitting.js +45 -0
  146. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  147. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  148. package/dist/schema/nodes/pipe-segment.js +36 -0
  149. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  150. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  151. package/dist/schema/nodes/pipe-trap.js +36 -0
  152. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +2 -0
  153. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +1 -0
  154. package/dist/schema/nodes/ridge-vent-defaults.test.js +205 -0
  155. package/dist/schema/nodes/ridge-vent.d.ts +18 -3
  156. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  157. package/dist/schema/nodes/ridge-vent.js +221 -3
  158. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  159. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  160. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  161. package/dist/schema/nodes/roof-segment-shape.test.d.ts +2 -0
  162. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +1 -0
  163. package/dist/schema/nodes/roof-segment-shape.test.js +175 -0
  164. package/dist/schema/nodes/roof-segment-surface.test.d.ts +2 -0
  165. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +1 -0
  166. package/dist/schema/nodes/roof-segment-surface.test.js +48 -0
  167. package/dist/schema/nodes/roof-segment-trim.test.d.ts +2 -0
  168. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +1 -0
  169. package/dist/schema/nodes/roof-segment-trim.test.js +107 -0
  170. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  171. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  172. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  173. package/dist/schema/nodes/roof-segment-walls.test.d.ts +2 -0
  174. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +1 -0
  175. package/dist/schema/nodes/roof-segment-walls.test.js +92 -0
  176. package/dist/schema/nodes/roof-segment.d.ts +84 -8
  177. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  178. package/dist/schema/nodes/roof-segment.js +290 -5
  179. package/dist/schema/nodes/roof.d.ts +8 -8
  180. package/dist/schema/nodes/shelf.d.ts +3 -2
  181. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  182. package/dist/schema/nodes/shelf.js +6 -0
  183. package/dist/schema/nodes/skylight.d.ts +10 -10
  184. package/dist/schema/nodes/slab.d.ts +3 -2
  185. package/dist/schema/nodes/slab.d.ts.map +1 -1
  186. package/dist/schema/nodes/slab.js +4 -0
  187. package/dist/schema/nodes/solar-panel.d.ts +4 -4
  188. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  189. package/dist/schema/nodes/stair.d.ts +13 -12
  190. package/dist/schema/nodes/stair.d.ts.map +1 -1
  191. package/dist/schema/nodes/stair.js +3 -0
  192. package/dist/schema/nodes/turbine-vent.d.ts +2 -2
  193. package/dist/schema/nodes/wall.d.ts +245 -6
  194. package/dist/schema/nodes/wall.d.ts.map +1 -1
  195. package/dist/schema/nodes/wall.js +257 -0
  196. package/dist/schema/nodes/wall.test.d.ts +2 -0
  197. package/dist/schema/nodes/wall.test.d.ts.map +1 -0
  198. package/dist/schema/nodes/wall.test.js +208 -0
  199. package/dist/schema/nodes/window.d.ts +11 -3
  200. package/dist/schema/nodes/window.d.ts.map +1 -1
  201. package/dist/schema/nodes/window.js +12 -0
  202. package/dist/schema/nodes/zone.d.ts +2 -0
  203. package/dist/schema/nodes/zone.d.ts.map +1 -1
  204. package/dist/schema/nodes/zone.js +6 -0
  205. package/dist/schema/scene-material.d.ts +41 -0
  206. package/dist/schema/scene-material.d.ts.map +1 -0
  207. package/dist/schema/scene-material.js +9 -0
  208. package/dist/schema/types.d.ts +1089 -94
  209. package/dist/schema/types.d.ts.map +1 -1
  210. package/dist/schema/types.js +23 -0
  211. package/dist/services/alignment-anchors.d.ts.map +1 -1
  212. package/dist/services/alignment-anchors.js +30 -1
  213. package/dist/services/alignment.d.ts +5 -0
  214. package/dist/services/alignment.d.ts.map +1 -1
  215. package/dist/services/alignment.js +2 -0
  216. package/dist/services/hosting.d.ts +8 -0
  217. package/dist/services/hosting.d.ts.map +1 -1
  218. package/dist/services/hosting.js +13 -4
  219. package/dist/services/hosting.test.js +32 -1
  220. package/dist/services/index.d.ts +8 -2
  221. package/dist/services/index.d.ts.map +1 -1
  222. package/dist/services/index.js +8 -2
  223. package/dist/services/level-height.d.ts +28 -0
  224. package/dist/services/level-height.d.ts.map +1 -0
  225. package/dist/services/level-height.js +62 -0
  226. package/dist/services/opening-guides.d.ts +141 -0
  227. package/dist/services/opening-guides.d.ts.map +1 -0
  228. package/dist/services/opening-guides.js +267 -0
  229. package/dist/services/opening-guides.test.d.ts +2 -0
  230. package/dist/services/opening-guides.test.d.ts.map +1 -0
  231. package/dist/services/opening-guides.test.js +208 -0
  232. package/dist/services/port-connectivity.d.ts +115 -0
  233. package/dist/services/port-connectivity.d.ts.map +1 -0
  234. package/dist/services/port-connectivity.js +300 -0
  235. package/dist/services/port-connectivity.test.d.ts +2 -0
  236. package/dist/services/port-connectivity.test.d.ts.map +1 -0
  237. package/dist/services/port-connectivity.test.js +297 -0
  238. package/dist/services/riser-diagram.d.ts +40 -0
  239. package/dist/services/riser-diagram.d.ts.map +1 -0
  240. package/dist/services/riser-diagram.js +110 -0
  241. package/dist/services/riser-diagram.test.d.ts +2 -0
  242. package/dist/services/riser-diagram.test.d.ts.map +1 -0
  243. package/dist/services/riser-diagram.test.js +66 -0
  244. package/dist/services/snap.d.ts +9 -1
  245. package/dist/services/snap.d.ts.map +1 -1
  246. package/dist/services/snap.js +21 -1
  247. package/dist/services/snap.test.js +43 -1
  248. package/dist/services/system-graph.d.ts +30 -0
  249. package/dist/services/system-graph.d.ts.map +1 -0
  250. package/dist/services/system-graph.js +164 -0
  251. package/dist/services/system-graph.test.d.ts +2 -0
  252. package/dist/services/system-graph.test.d.ts.map +1 -0
  253. package/dist/services/system-graph.test.js +138 -0
  254. package/dist/services/validate-dwv.d.ts +32 -0
  255. package/dist/services/validate-dwv.d.ts.map +1 -0
  256. package/dist/services/validate-dwv.js +118 -0
  257. package/dist/services/validate-dwv.test.d.ts +2 -0
  258. package/dist/services/validate-dwv.test.d.ts.map +1 -0
  259. package/dist/services/validate-dwv.test.js +109 -0
  260. package/dist/store/actions/node-actions.d.ts.map +1 -1
  261. package/dist/store/actions/node-actions.js +94 -1
  262. package/dist/store/actions/ridge-vent-update.test.d.ts +2 -0
  263. package/dist/store/actions/ridge-vent-update.test.d.ts.map +1 -0
  264. package/dist/store/actions/ridge-vent-update.test.js +264 -0
  265. package/dist/store/history-control.d.ts +11 -0
  266. package/dist/store/history-control.d.ts.map +1 -1
  267. package/dist/store/history-control.js +33 -0
  268. package/dist/store/use-scene-dirty-tracking.test.d.ts +2 -0
  269. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +1 -0
  270. package/dist/store/use-scene-dirty-tracking.test.js +68 -0
  271. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +2 -0
  272. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +1 -0
  273. package/dist/store/use-scene-measurement-roundtrip.test.js +97 -0
  274. package/dist/store/use-scene-plugins.test.d.ts +2 -0
  275. package/dist/store/use-scene-plugins.test.d.ts.map +1 -0
  276. package/dist/store/use-scene-plugins.test.js +51 -0
  277. package/dist/store/use-scene-wall-slot-migration.test.d.ts +2 -0
  278. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +1 -0
  279. package/dist/store/use-scene-wall-slot-migration.test.js +210 -0
  280. package/dist/store/use-scene-window-migration.test.d.ts +2 -0
  281. package/dist/store/use-scene-window-migration.test.d.ts.map +1 -0
  282. package/dist/store/use-scene-window-migration.test.js +85 -0
  283. package/dist/store/use-scene.d.ts +17 -2
  284. package/dist/store/use-scene.d.ts.map +1 -1
  285. package/dist/store/use-scene.js +358 -51
  286. package/dist/systems/elevator/elevator-service.js +1 -1
  287. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  288. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  289. package/dist/systems/fence/fence-centerline.js +37 -0
  290. package/dist/systems/fence/fence-spline.d.ts +39 -0
  291. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  292. package/dist/systems/fence/fence-spline.js +196 -0
  293. package/dist/systems/fence/fence-spline.test.d.ts +2 -0
  294. package/dist/systems/fence/fence-spline.test.d.ts.map +1 -0
  295. package/dist/systems/fence/fence-spline.test.js +136 -0
  296. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  297. package/dist/systems/stair/stair-footprint.js +21 -11
  298. package/dist/systems/stair/stair-opening-preview.d.ts +1139 -469
  299. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  300. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  301. package/dist/systems/stair/stair-opening-sync.js +1 -18
  302. package/dist/systems/stair/stair-opening-sync.test.js +39 -0
  303. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  304. package/dist/systems/wall/wall-mitering.js +38 -2
  305. package/dist/systems/wall/wall-mitering.test.d.ts +2 -0
  306. package/dist/systems/wall/wall-mitering.test.d.ts.map +1 -0
  307. package/dist/systems/wall/wall-mitering.test.js +63 -0
  308. package/dist/utils/clone-scene-graph.d.ts +1 -0
  309. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  310. package/dist/utils/clone-scene-graph.js +23 -3
  311. package/dist/utils/clone-scene-graph.test.js +3 -0
  312. package/dist/utils/heal-scene-graph.d.ts +18 -0
  313. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  314. package/dist/utils/heal-scene-graph.js +90 -0
  315. package/dist/utils/heal-scene-graph.test.d.ts +2 -0
  316. package/dist/utils/heal-scene-graph.test.d.ts.map +1 -0
  317. package/dist/utils/heal-scene-graph.test.js +88 -0
  318. package/dist/validation/validate-build-json.d.ts +1 -0
  319. package/dist/validation/validate-build-json.d.ts.map +1 -1
  320. package/dist/validation/validate-build-json.js +31 -2
  321. package/package.json +3 -3
@@ -10,6 +10,26 @@ export declare const RoofType: z.ZodEnum<{
10
10
  mansard: "mansard";
11
11
  }>;
12
12
  export type RoofType = z.infer<typeof RoofType>;
13
+ export declare const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
14
+ export declare const RoofSegmentTrim: z.ZodDefault<z.ZodObject<{
15
+ left: z.ZodDefault<z.ZodNumber>;
16
+ right: z.ZodDefault<z.ZodNumber>;
17
+ front: z.ZodDefault<z.ZodNumber>;
18
+ back: z.ZodDefault<z.ZodNumber>;
19
+ frontLeft: z.ZodDefault<z.ZodNumber>;
20
+ frontRight: z.ZodDefault<z.ZodNumber>;
21
+ backLeft: z.ZodDefault<z.ZodNumber>;
22
+ backRight: z.ZodDefault<z.ZodNumber>;
23
+ frontLeftX: z.ZodDefault<z.ZodNumber>;
24
+ frontLeftZ: z.ZodDefault<z.ZodNumber>;
25
+ frontRightX: z.ZodDefault<z.ZodNumber>;
26
+ frontRightZ: z.ZodDefault<z.ZodNumber>;
27
+ backLeftX: z.ZodDefault<z.ZodNumber>;
28
+ backLeftZ: z.ZodDefault<z.ZodNumber>;
29
+ backRightX: z.ZodDefault<z.ZodNumber>;
30
+ backRightZ: z.ZodDefault<z.ZodNumber>;
31
+ }, z.core.$strip>>;
32
+ export type RoofSegmentTrim = z.infer<typeof RoofSegmentTrim>;
13
33
  export declare const ROOF_SHAPE_DEFAULTS: {
14
34
  /** Gambrel: lower (steep) face occupies this fraction of the horizontal half-depth. */
15
35
  readonly gambrelLowerWidthRatio: 0.5;
@@ -23,6 +43,17 @@ export declare const ROOF_SHAPE_DEFAULTS: {
23
43
  readonly dutchHipWidthRatio: 0.25;
24
44
  /** Dutch: hip face rises this fraction of the way to the peak. */
25
45
  readonly dutchHipHeightRatio: 0.5;
46
+ /** Dutch: gable waist span along the ridge axis, as a fraction of the max span. */
47
+ readonly dutchWaistLengthRatio: 0.98;
48
+ /**
49
+ * Dutch: how far the gablet's barge board extends outward past the gablet
50
+ * end-wall, along the ridge axis, in metres. 0 disables the rake. The board
51
+ * lies in the gablet's slope planes (coplanar with the main Dutch slopes)
52
+ * and overhangs the lower hip skirt; the gablet end-wall itself stays put.
53
+ */
54
+ readonly dutchGabletRake: 0.48;
55
+ /** Dutch: thickness of the top gable rake slab. */
56
+ readonly dutchTopRakeThickness: 0.21;
26
57
  };
27
58
  export declare const RoofSegmentNode: z.ZodObject<{
28
59
  object: z.ZodDefault<z.ZodLiteral<"node">>;
@@ -44,7 +75,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
44
75
  type: z.ZodDefault<z.ZodLiteral<"roof-segment">>;
45
76
  material: z.ZodOptional<z.ZodObject<{
46
77
  id: z.ZodOptional<z.ZodString>;
47
- preset: z.ZodOptional<z.ZodEnum<{
78
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
48
79
  custom: "custom";
49
80
  white: "white";
50
81
  brick: "brick";
@@ -55,7 +86,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
55
86
  plaster: "plaster";
56
87
  tile: "tile";
57
88
  marble: "marble";
58
- }>>;
89
+ }>>>;
59
90
  properties: z.ZodOptional<z.ZodObject<{
60
91
  color: z.ZodDefault<z.ZodString>;
61
92
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -77,7 +108,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
77
108
  materialPreset: z.ZodOptional<z.ZodString>;
78
109
  topMaterial: z.ZodOptional<z.ZodObject<{
79
110
  id: z.ZodOptional<z.ZodString>;
80
- preset: z.ZodOptional<z.ZodEnum<{
111
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
81
112
  custom: "custom";
82
113
  white: "white";
83
114
  brick: "brick";
@@ -88,7 +119,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
88
119
  plaster: "plaster";
89
120
  tile: "tile";
90
121
  marble: "marble";
91
- }>>;
122
+ }>>>;
92
123
  properties: z.ZodOptional<z.ZodObject<{
93
124
  color: z.ZodDefault<z.ZodString>;
94
125
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -110,7 +141,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
110
141
  topMaterialPreset: z.ZodOptional<z.ZodString>;
111
142
  edgeMaterial: z.ZodOptional<z.ZodObject<{
112
143
  id: z.ZodOptional<z.ZodString>;
113
- preset: z.ZodOptional<z.ZodEnum<{
144
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
114
145
  custom: "custom";
115
146
  white: "white";
116
147
  brick: "brick";
@@ -121,7 +152,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
121
152
  plaster: "plaster";
122
153
  tile: "tile";
123
154
  marble: "marble";
124
- }>>;
155
+ }>>>;
125
156
  properties: z.ZodOptional<z.ZodObject<{
126
157
  color: z.ZodDefault<z.ZodString>;
127
158
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -143,7 +174,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
143
174
  edgeMaterialPreset: z.ZodOptional<z.ZodString>;
144
175
  wallMaterial: z.ZodOptional<z.ZodObject<{
145
176
  id: z.ZodOptional<z.ZodString>;
146
- preset: z.ZodOptional<z.ZodEnum<{
177
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
147
178
  custom: "custom";
148
179
  white: "white";
149
180
  brick: "brick";
@@ -154,7 +185,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
154
185
  plaster: "plaster";
155
186
  tile: "tile";
156
187
  marble: "marble";
157
- }>>;
188
+ }>>>;
158
189
  properties: z.ZodOptional<z.ZodObject<{
159
190
  color: z.ZodDefault<z.ZodString>;
160
191
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -187,6 +218,24 @@ export declare const RoofSegmentNode: z.ZodObject<{
187
218
  }>>;
188
219
  width: z.ZodDefault<z.ZodNumber>;
189
220
  depth: z.ZodDefault<z.ZodNumber>;
221
+ trim: z.ZodDefault<z.ZodObject<{
222
+ left: z.ZodDefault<z.ZodNumber>;
223
+ right: z.ZodDefault<z.ZodNumber>;
224
+ front: z.ZodDefault<z.ZodNumber>;
225
+ back: z.ZodDefault<z.ZodNumber>;
226
+ frontLeft: z.ZodDefault<z.ZodNumber>;
227
+ frontRight: z.ZodDefault<z.ZodNumber>;
228
+ backLeft: z.ZodDefault<z.ZodNumber>;
229
+ backRight: z.ZodDefault<z.ZodNumber>;
230
+ frontLeftX: z.ZodDefault<z.ZodNumber>;
231
+ frontLeftZ: z.ZodDefault<z.ZodNumber>;
232
+ frontRightX: z.ZodDefault<z.ZodNumber>;
233
+ frontRightZ: z.ZodDefault<z.ZodNumber>;
234
+ backLeftX: z.ZodDefault<z.ZodNumber>;
235
+ backLeftZ: z.ZodDefault<z.ZodNumber>;
236
+ backRightX: z.ZodDefault<z.ZodNumber>;
237
+ backRightZ: z.ZodDefault<z.ZodNumber>;
238
+ }, z.core.$strip>>;
190
239
  wallHeight: z.ZodDefault<z.ZodNumber>;
191
240
  pitch: z.ZodDefault<z.ZodNumber>;
192
241
  wallThickness: z.ZodDefault<z.ZodNumber>;
@@ -199,9 +248,15 @@ export declare const RoofSegmentNode: z.ZodObject<{
199
248
  mansardSteepHeightRatio: z.ZodDefault<z.ZodNumber>;
200
249
  dutchHipWidthRatio: z.ZodDefault<z.ZodNumber>;
201
250
  dutchHipHeightRatio: z.ZodDefault<z.ZodNumber>;
251
+ dutchWaistLengthRatio: z.ZodDefault<z.ZodNumber>;
252
+ dutchGabletRake: z.ZodDefault<z.ZodNumber>;
253
+ dutchTopRakeThickness: z.ZodDefault<z.ZodNumber>;
202
254
  children: z.ZodDefault<z.ZodArray<z.ZodString>>;
203
255
  }, z.core.$strip>;
204
256
  export type RoofSegmentNode = z.infer<typeof RoofSegmentNode>;
257
+ export declare function normalizeRoofSegmentTrim(node: Pick<RoofSegmentNode, 'width' | 'depth'> & {
258
+ trim?: Partial<RoofSegmentTrim>;
259
+ }): RoofSegmentTrim;
205
260
  /** Shape of the per-type ratios consumed by the slope helpers. */
206
261
  type ShapeRatios = {
207
262
  gambrelLowerWidthRatio: number;
@@ -210,12 +265,24 @@ type ShapeRatios = {
210
265
  mansardSteepHeightRatio: number;
211
266
  dutchHipWidthRatio: number;
212
267
  dutchHipHeightRatio: number;
268
+ dutchWaistLengthRatio: number;
213
269
  };
214
270
  type PitchInputs = {
215
271
  roofType: RoofType;
216
272
  width: number;
217
273
  depth: number;
218
274
  } & Partial<ShapeRatios>;
275
+ export type DutchRoofMetrics = {
276
+ axis: 'x' | 'z';
277
+ inset: number;
278
+ waistHalfX: number;
279
+ waistHalfZ: number;
280
+ ridgeStart: readonly [number, number];
281
+ ridgeEnd: readonly [number, number];
282
+ shoulderInsetAlongDepth: number;
283
+ shoulderInsetAlongWidth: number;
284
+ };
285
+ export declare function getDutchRoofMetrics(input: Pick<RoofSegmentNode, 'width' | 'depth'> & Partial<Pick<RoofSegmentNode, 'dutchHipWidthRatio' | 'dutchWaistLengthRatio'>>): DutchRoofMetrics;
219
286
  export type SegmentSlopeFrame = {
220
287
  /** Horizontal half-span of the primary slope face (eave-to-ridge). */
221
288
  run: number;
@@ -244,6 +311,15 @@ export declare function getSegmentSlopeFrame(node: Pick<RoofSegmentNode, 'roofTy
244
311
  * footprint + roofType. Replaces the legacy `roofHeight` field on the node.
245
312
  */
246
313
  export declare function getActiveRoofHeight(node: Parameters<typeof getSegmentSlopeFrame>[0]): number;
314
+ export type RoofSegmentVisibleTopBounds = {
315
+ minX: number;
316
+ maxX: number;
317
+ minZ: number;
318
+ maxZ: number;
319
+ width: number;
320
+ depth: number;
321
+ };
322
+ export declare function getRoofSegmentVisibleTopBounds(segment: RoofSegmentNode): RoofSegmentVisibleTopBounds;
247
323
  /** Segment-local surface height used by roof accessory placement and hit disambiguation. */
248
324
  export declare function getRoofSegmentSurfaceY(node: Pick<RoofSegmentNode, 'roofType' | 'width' | 'depth' | 'wallHeight'> & Parameters<typeof getSegmentSlopeFrame>[0], localX: number, localZ: number): number;
249
325
  /**
@@ -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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"}
@@ -3,6 +3,46 @@ import { z } from 'zod';
3
3
  import { BaseNode, nodeType, objectId } from '../base';
4
4
  import { MaterialSchema } from '../material';
5
5
  export const RoofType = z.enum(['hip', 'gable', 'shed', 'gambrel', 'dutch', 'mansard', 'flat']);
6
+ export const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
7
+ const DEFAULT_ROOF_SEGMENT_WIDTH = 8;
8
+ const DEFAULT_ROOF_SEGMENT_DEPTH = 6;
9
+ export const RoofSegmentTrim = z
10
+ .object({
11
+ left: z.number().min(0).default(0),
12
+ right: z.number().min(0).default(0),
13
+ front: z.number().min(0).default(0),
14
+ back: z.number().min(0).default(0),
15
+ frontLeft: z.number().min(0).default(0),
16
+ frontRight: z.number().min(0).default(0),
17
+ backLeft: z.number().min(0).default(0),
18
+ backRight: z.number().min(0).default(0),
19
+ frontLeftX: z.number().min(0).default(0),
20
+ frontLeftZ: z.number().min(0).default(0),
21
+ frontRightX: z.number().min(0).default(0),
22
+ frontRightZ: z.number().min(0).default(0),
23
+ backLeftX: z.number().min(0).default(0),
24
+ backLeftZ: z.number().min(0).default(0),
25
+ backRightX: z.number().min(0).default(0),
26
+ backRightZ: z.number().min(0).default(0),
27
+ })
28
+ .default({
29
+ left: 0,
30
+ right: 0,
31
+ front: 0,
32
+ back: 0,
33
+ frontLeft: 0,
34
+ frontRight: 0,
35
+ backLeft: 0,
36
+ backRight: 0,
37
+ frontLeftX: 0,
38
+ frontLeftZ: 0,
39
+ frontRightX: 0,
40
+ frontRightZ: 0,
41
+ backLeftX: 0,
42
+ backLeftZ: 0,
43
+ backRightX: 0,
44
+ backRightZ: 0,
45
+ });
6
46
  // Default shape ratios. Tuning these used to require editing the geometry
7
47
  // code in two places; they are now schema fields with these defaults.
8
48
  export const ROOF_SHAPE_DEFAULTS = {
@@ -18,6 +58,17 @@ export const ROOF_SHAPE_DEFAULTS = {
18
58
  dutchHipWidthRatio: 0.25,
19
59
  /** Dutch: hip face rises this fraction of the way to the peak. */
20
60
  dutchHipHeightRatio: 0.5,
61
+ /** Dutch: gable waist span along the ridge axis, as a fraction of the max span. */
62
+ dutchWaistLengthRatio: 0.98,
63
+ /**
64
+ * Dutch: how far the gablet's barge board extends outward past the gablet
65
+ * end-wall, along the ridge axis, in metres. 0 disables the rake. The board
66
+ * lies in the gablet's slope planes (coplanar with the main Dutch slopes)
67
+ * and overhangs the lower hip skirt; the gablet end-wall itself stays put.
68
+ */
69
+ dutchGabletRake: 0.48,
70
+ /** Dutch: thickness of the top gable rake slab. */
71
+ dutchTopRakeThickness: 0.21,
21
72
  };
22
73
  export const RoofSegmentNode = BaseNode.extend({
23
74
  id: objectId('rseg'),
@@ -45,6 +96,10 @@ export const RoofSegmentNode = BaseNode.extend({
45
96
  // Footprint dimensions
46
97
  width: z.number().default(8),
47
98
  depth: z.number().default(6),
99
+ // Segment-local distances trimmed from each footprint side. The trim
100
+ // boundary is projected vertically through the roof volume, so the
101
+ // resulting edge follows the actual sloped roof surfaces.
102
+ trim: RoofSegmentTrim,
48
103
  // Wall height beneath the roof
49
104
  wallHeight: z.number().default(0.5),
50
105
  // Roof pitch in degrees — angle of the primary slope face.
@@ -90,6 +145,17 @@ export const RoofSegmentNode = BaseNode.extend({
90
145
  .min(0.1)
91
146
  .max(0.9)
92
147
  .default(ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio),
148
+ dutchWaistLengthRatio: z
149
+ .number()
150
+ .min(0.1)
151
+ .max(1)
152
+ .default(ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio),
153
+ dutchGabletRake: z.number().min(0).max(3).default(ROOF_SHAPE_DEFAULTS.dutchGabletRake),
154
+ dutchTopRakeThickness: z
155
+ .number()
156
+ .min(0.01)
157
+ .max(0.5)
158
+ .default(ROOF_SHAPE_DEFAULTS.dutchTopRakeThickness),
93
159
  // Hosted accessories — chimney, dormer, skylight, box-vent,
94
160
  // ridge-vent, solar-panel, gutter. Each accessory's `parentId` points back
95
161
  // here; the segment renderer mounts them recursively via
@@ -105,6 +171,7 @@ export const RoofSegmentNode = BaseNode.extend({
105
171
  Multiple segments can be combined to form complex roof shapes.
106
172
  - roofType: hip, gable, shed, gambrel, dutch, mansard, flat
107
173
  - width/depth: footprint dimensions
174
+ - trim: segment-local side cut distances
108
175
  - wallHeight: height of walls below the roof
109
176
  - pitch: roof slope in degrees (angle of the primary slope face)
110
177
  - wallThickness/deckThickness: structural thicknesses
@@ -113,16 +180,144 @@ export const RoofSegmentNode = BaseNode.extend({
113
180
  - gambrelLowerWidthRatio / gambrelLowerHeightRatio: kink position on gambrel roofs
114
181
  - mansardSteepWidthRatio / mansardSteepHeightRatio: waist position on mansard roofs
115
182
  - dutchHipWidthRatio / dutchHipHeightRatio: hip-to-gable split on dutch roofs
183
+ - dutchWaistLengthRatio: gable waist span along the ridge axis
184
+ - dutchGabletRake: gablet barge-board overhang past the gablet end-wall (m, 0 = none)
185
+ - dutchTopRakeThickness: thickness of the top gable rake slab
116
186
  `);
187
+ function finiteNonNegative(value) {
188
+ return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, value) : 0;
189
+ }
190
+ function finitePositive(value, fallback) {
191
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;
192
+ }
193
+ function normalizeTrimAxis(start, end, span) {
194
+ const maxTotal = Math.max(0, finiteNonNegative(span) - MIN_ROOF_SEGMENT_TRIM_SPAN);
195
+ let a = Math.min(finiteNonNegative(start), maxTotal);
196
+ let b = Math.min(finiteNonNegative(end), maxTotal);
197
+ const total = a + b;
198
+ if (total > maxTotal && total > 0) {
199
+ const scale = maxTotal / total;
200
+ a *= scale;
201
+ b *= scale;
202
+ }
203
+ return [a, b];
204
+ }
205
+ export function normalizeRoofSegmentTrim(node) {
206
+ const trim = node.trim ?? {};
207
+ const [left, right] = normalizeTrimAxis(trim.left, trim.right, node.width);
208
+ const [back, front] = normalizeTrimAxis(trim.back, trim.front, node.depth);
209
+ const maxWidthDiagonal = Math.max(0, finiteNonNegative(node.width) - left - right);
210
+ const maxDepthDiagonal = Math.max(0, finiteNonNegative(node.depth) - front - back);
211
+ const maxWidthPair = Math.max(0, maxWidthDiagonal - MIN_ROOF_SEGMENT_TRIM_SPAN);
212
+ const maxDepthPair = Math.max(0, maxDepthDiagonal - MIN_ROOF_SEGMENT_TRIM_SPAN);
213
+ let [frontLeftX, frontLeftZ] = normalizeCornerAxisTrim(trim.frontLeft, trim.frontLeftX, trim.frontLeftZ, maxWidthPair, maxDepthPair);
214
+ let [frontRightX, frontRightZ] = normalizeCornerAxisTrim(trim.frontRight, trim.frontRightX, trim.frontRightZ, maxWidthPair, maxDepthPair);
215
+ let [backLeftX, backLeftZ] = normalizeCornerAxisTrim(trim.backLeft, trim.backLeftX, trim.backLeftZ, maxWidthPair, maxDepthPair);
216
+ let [backRightX, backRightZ] = normalizeCornerAxisTrim(trim.backRight, trim.backRightX, trim.backRightZ, maxWidthPair, maxDepthPair);
217
+ for (let i = 0; i < 3; i += 1) {
218
+ ;
219
+ [frontLeftX, frontRightX] = normalizeTrimPair(frontLeftX, frontRightX, maxWidthPair);
220
+ [backLeftX, backRightX] = normalizeTrimPair(backLeftX, backRightX, maxWidthPair);
221
+ [frontLeftZ, backLeftZ] = normalizeTrimPair(frontLeftZ, backLeftZ, maxDepthPair);
222
+ [frontRightZ, backRightZ] = normalizeTrimPair(frontRightZ, backRightZ, maxDepthPair);
223
+ }
224
+ const frontLeft = Math.min(frontLeftX, frontLeftZ);
225
+ const frontRight = Math.min(frontRightX, frontRightZ);
226
+ const backLeft = Math.min(backLeftX, backLeftZ);
227
+ const backRight = Math.min(backRightX, backRightZ);
228
+ return {
229
+ left,
230
+ right,
231
+ front,
232
+ back,
233
+ frontLeft,
234
+ frontRight,
235
+ backLeft,
236
+ backRight,
237
+ frontLeftX,
238
+ frontLeftZ,
239
+ frontRightX,
240
+ frontRightZ,
241
+ backLeftX,
242
+ backLeftZ,
243
+ backRightX,
244
+ backRightZ,
245
+ };
246
+ }
247
+ function normalizeTrimPair(a, b, maxTotal) {
248
+ const total = a + b;
249
+ if (total <= maxTotal || total <= 0)
250
+ return [a, b];
251
+ const scale = maxTotal / total;
252
+ return [a * scale, b * scale];
253
+ }
254
+ function normalizeCornerAxisTrim(scalar, axisX, axisZ, maxX, maxZ) {
255
+ const x = finiteNonNegative(axisX);
256
+ const z = finiteNonNegative(axisZ);
257
+ const fallback = finiteNonNegative(scalar);
258
+ if (x > 0 || z > 0) {
259
+ return [Math.min(x, maxX), Math.min(z, maxZ)];
260
+ }
261
+ return [Math.min(fallback, maxX), Math.min(fallback, maxZ)];
262
+ }
263
+ function getDutchUpperShellBounds(node) {
264
+ const metrics = getDutchRoofMetrics(node);
265
+ const width = finitePositive(node.width, DEFAULT_ROOF_SEGMENT_WIDTH);
266
+ const depth = finitePositive(node.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
267
+ const rake = node.dutchGabletRake ?? ROOF_SHAPE_DEFAULTS.dutchGabletRake;
268
+ const rakeReach = metrics.axis === 'x'
269
+ ? Math.min(Math.max(0, rake), Math.max(0, width / 2 - metrics.waistHalfX) * 0.98)
270
+ : Math.min(Math.max(0, rake), Math.max(0, depth / 2 - metrics.waistHalfZ) * 0.98);
271
+ return {
272
+ ...metrics,
273
+ upperHalfX: metrics.axis === 'x' ? metrics.waistHalfX + rakeReach : metrics.waistHalfX,
274
+ upperHalfZ: metrics.axis === 'x' ? metrics.waistHalfZ : metrics.waistHalfZ + rakeReach,
275
+ };
276
+ }
117
277
  function withRatioDefaults(input) {
118
278
  return {
119
279
  ...input,
280
+ width: finitePositive(input.width, DEFAULT_ROOF_SEGMENT_WIDTH),
281
+ depth: finitePositive(input.depth, DEFAULT_ROOF_SEGMENT_DEPTH),
120
282
  gambrelLowerWidthRatio: input.gambrelLowerWidthRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerWidthRatio,
121
283
  gambrelLowerHeightRatio: input.gambrelLowerHeightRatio ?? ROOF_SHAPE_DEFAULTS.gambrelLowerHeightRatio,
122
284
  mansardSteepWidthRatio: input.mansardSteepWidthRatio ?? ROOF_SHAPE_DEFAULTS.mansardSteepWidthRatio,
123
285
  mansardSteepHeightRatio: input.mansardSteepHeightRatio ?? ROOF_SHAPE_DEFAULTS.mansardSteepHeightRatio,
124
286
  dutchHipWidthRatio: input.dutchHipWidthRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipWidthRatio,
125
287
  dutchHipHeightRatio: input.dutchHipHeightRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio,
288
+ dutchWaistLengthRatio: input.dutchWaistLengthRatio ?? ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio,
289
+ };
290
+ }
291
+ export function getDutchRoofMetrics(input) {
292
+ const width = finitePositive(input.width, DEFAULT_ROOF_SEGMENT_WIDTH);
293
+ const depth = finitePositive(input.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
294
+ const inset = Math.min(width, depth) * (input.dutchHipWidthRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipWidthRatio);
295
+ const waistLengthRatio = input.dutchWaistLengthRatio ?? ROOF_SHAPE_DEFAULTS.dutchWaistLengthRatio;
296
+ if (width >= depth) {
297
+ const waistHalfX = Math.max(0, (width / 2 - inset) * waistLengthRatio);
298
+ const waistHalfZ = Math.max(0, depth / 2 - inset);
299
+ return {
300
+ axis: 'x',
301
+ inset,
302
+ waistHalfX,
303
+ waistHalfZ,
304
+ ridgeStart: [-waistHalfX, 0],
305
+ ridgeEnd: [waistHalfX, 0],
306
+ shoulderInsetAlongDepth: Math.max(0, depth / 2 - waistHalfZ),
307
+ shoulderInsetAlongWidth: Math.max(0, width / 2 - waistHalfX),
308
+ };
309
+ }
310
+ const waistHalfX = Math.max(0, width / 2 - inset);
311
+ const waistHalfZ = Math.max(0, (depth / 2 - inset) * waistLengthRatio);
312
+ return {
313
+ axis: 'z',
314
+ inset,
315
+ waistHalfX,
316
+ waistHalfZ,
317
+ ridgeStart: [0, waistHalfZ],
318
+ ridgeEnd: [0, -waistHalfZ],
319
+ shoulderInsetAlongDepth: Math.max(0, depth / 2 - waistHalfZ),
320
+ shoulderInsetAlongWidth: Math.max(0, width / 2 - waistHalfX),
126
321
  };
127
322
  }
128
323
  function getPrimarySlopeRun(input) {
@@ -188,19 +383,109 @@ export function getSegmentSlopeFrame(node) {
188
383
  export function getActiveRoofHeight(node) {
189
384
  return getSegmentSlopeFrame(node).activeRh;
190
385
  }
386
+ export function getRoofSegmentVisibleTopBounds(segment) {
387
+ const { activeRh, cosTheta, sinTheta } = getSegmentSlopeFrame(segment);
388
+ const width = finitePositive(segment.width, DEFAULT_ROOF_SEGMENT_WIDTH);
389
+ const depth = finitePositive(segment.depth, DEFAULT_ROOF_SEGMENT_DEPTH);
390
+ const trim = normalizeRoofSegmentTrim({ ...segment, width, depth });
391
+ const horizontalOverhang = finiteNonNegative(segment.overhang) * cosTheta;
392
+ const deckExt = finiteNonNegative(segment.wallThickness) / 2 + horizontalOverhang;
393
+ const shingleOverhang = finiteNonNegative(segment.shingleThickness) * sinTheta;
394
+ let xExt = deckExt;
395
+ let frontExt = deckExt;
396
+ let backExt = deckExt;
397
+ if (segment.roofType === 'hip' ||
398
+ segment.roofType === 'mansard' ||
399
+ segment.roofType === 'dutch') {
400
+ xExt += shingleOverhang;
401
+ frontExt += shingleOverhang;
402
+ backExt += shingleOverhang;
403
+ }
404
+ else if (segment.roofType === 'gable' || segment.roofType === 'gambrel') {
405
+ frontExt += shingleOverhang;
406
+ backExt += shingleOverhang;
407
+ }
408
+ else if (segment.roofType === 'shed' && activeRh > 0) {
409
+ frontExt += shingleOverhang;
410
+ }
411
+ let minX = trim.left > 0 ? -width / 2 + trim.left : -width / 2 - xExt;
412
+ let maxX = trim.right > 0 ? width / 2 - trim.right : width / 2 + xExt;
413
+ let minZ = trim.back > 0 ? -depth / 2 + trim.back : -depth / 2 - backExt;
414
+ let maxZ = trim.front > 0 ? depth / 2 - trim.front : depth / 2 + frontExt;
415
+ if (trim.frontLeftX > 0 && trim.frontLeftZ > 0 && maxZ - trim.frontLeftZ < 0) {
416
+ minX = Math.max(minX, minX + (trim.frontLeftX * (trim.frontLeftZ - maxZ)) / trim.frontLeftZ);
417
+ }
418
+ if (trim.backLeftX > 0 && trim.backLeftZ > 0 && minZ + trim.backLeftZ > 0) {
419
+ minX = Math.max(minX, minX + (trim.backLeftX * (trim.backLeftZ + minZ)) / trim.backLeftZ);
420
+ }
421
+ if (trim.frontRightX > 0 && trim.frontRightZ > 0 && maxZ - trim.frontRightZ < 0) {
422
+ maxX = Math.min(maxX, maxX - (trim.frontRightX * (trim.frontRightZ - maxZ)) / trim.frontRightZ);
423
+ }
424
+ if (trim.backRightX > 0 && trim.backRightZ > 0 && minZ + trim.backRightZ > 0) {
425
+ maxX = Math.min(maxX, maxX - (trim.backRightX * (trim.backRightZ + minZ)) / trim.backRightZ);
426
+ }
427
+ if (trim.frontLeftX > 0 && trim.frontLeftZ > 0 && minX + trim.frontLeftX > 0) {
428
+ maxZ = Math.min(maxZ, maxZ - (trim.frontLeftZ * (trim.frontLeftX + minX)) / trim.frontLeftX);
429
+ }
430
+ if (trim.frontRightX > 0 && trim.frontRightZ > 0 && maxX - trim.frontRightX < 0) {
431
+ maxZ = Math.min(maxZ, maxZ - (trim.frontRightZ * (trim.frontRightX - maxX)) / trim.frontRightX);
432
+ }
433
+ if (trim.backLeftX > 0 && trim.backLeftZ > 0 && minX + trim.backLeftX > 0) {
434
+ minZ = Math.max(minZ, minZ + (trim.backLeftZ * (trim.backLeftX + minX)) / trim.backLeftX);
435
+ }
436
+ if (trim.backRightX > 0 && trim.backRightZ > 0 && maxX - trim.backRightX < 0) {
437
+ minZ = Math.max(minZ, minZ + (trim.backRightZ * (trim.backRightX - maxX)) / trim.backRightX);
438
+ }
439
+ return {
440
+ minX,
441
+ maxX,
442
+ minZ,
443
+ maxZ,
444
+ width: Math.max(0.01, maxX - minX),
445
+ depth: Math.max(0.01, maxZ - minZ),
446
+ };
447
+ }
191
448
  /** Segment-local surface height used by roof accessory placement and hit disambiguation. */
192
449
  export function getRoofSegmentSurfaceY(node, localX, localZ) {
193
- const activeRh = getActiveRoofHeight(node);
450
+ const slopeFrame = getSegmentSlopeFrame(node);
451
+ const activeRh = slopeFrame.activeRh;
194
452
  const peakY = node.wallHeight + activeRh;
195
453
  if (activeRh === 0)
196
454
  return node.wallHeight;
197
- if (node.roofType === 'gable' ||
198
- node.roofType === 'gambrel' ||
199
- node.roofType === 'mansard' ||
200
- node.roofType === 'dutch') {
455
+ if (node.roofType === 'gable' || node.roofType === 'gambrel' || node.roofType === 'mansard') {
201
456
  const t = node.depth > 0 ? Math.abs(localZ) / (node.depth / 2) : 0;
202
457
  return peakY - t * activeRh;
203
458
  }
459
+ if (node.roofType === 'dutch') {
460
+ const hipHeightRatio = node.dutchHipHeightRatio ?? ROOF_SHAPE_DEFAULTS.dutchHipHeightRatio;
461
+ const metrics = getDutchUpperShellBounds(node);
462
+ const lowerRise = activeRh * hipHeightRatio;
463
+ if (metrics.axis === 'x') {
464
+ const waistHalfZ = Math.max(0.0001, metrics.waistHalfZ);
465
+ if (Math.abs(localX) <= metrics.upperHalfX && Math.abs(localZ) <= waistHalfZ) {
466
+ const upperRise = activeRh * (1 - hipHeightRatio);
467
+ const upperTan = upperRise / waistHalfZ;
468
+ return peakY - Math.abs(localZ) * upperTan;
469
+ }
470
+ const xProgressDenom = Math.max(0.0001, node.width / 2 - metrics.waistHalfX);
471
+ const zProgressDenom = Math.max(0.0001, node.depth / 2 - waistHalfZ);
472
+ const xProgress = Math.max(0, Math.abs(localX) - metrics.waistHalfX) / xProgressDenom;
473
+ const zProgress = Math.max(0, Math.abs(localZ) - waistHalfZ) / zProgressDenom;
474
+ return node.wallHeight + lowerRise * (1 - Math.min(1, Math.max(xProgress, zProgress)));
475
+ }
476
+ const waistHalfX = Math.max(0.0001, metrics.waistHalfX);
477
+ if (Math.abs(localX) <= waistHalfX && Math.abs(localZ) <= metrics.upperHalfZ) {
478
+ const upperRise = activeRh * (1 - hipHeightRatio);
479
+ const upperRun = waistHalfX;
480
+ const upperTan = upperRise / upperRun;
481
+ return peakY - Math.abs(localX) * upperTan;
482
+ }
483
+ const xProgressDenom = Math.max(0.0001, node.width / 2 - waistHalfX);
484
+ const zProgressDenom = Math.max(0.0001, node.depth / 2 - metrics.waistHalfZ);
485
+ const xProgress = Math.max(0, Math.abs(localX) - waistHalfX) / xProgressDenom;
486
+ const zProgress = Math.max(0, Math.abs(localZ) - metrics.waistHalfZ) / zProgressDenom;
487
+ return node.wallHeight + lowerRise * (1 - Math.min(1, Math.max(xProgress, zProgress)));
488
+ }
204
489
  if (node.roofType === 'shed') {
205
490
  const t = (localZ + node.depth / 2) / (node.depth || 1);
206
491
  return peakY - t * activeRh;
@@ -25,7 +25,7 @@ export declare const RoofNode: z.ZodObject<{
25
25
  type: z.ZodDefault<z.ZodLiteral<"roof">>;
26
26
  material: z.ZodOptional<z.ZodObject<{
27
27
  id: z.ZodOptional<z.ZodString>;
28
- preset: z.ZodOptional<z.ZodEnum<{
28
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
29
29
  custom: "custom";
30
30
  white: "white";
31
31
  brick: "brick";
@@ -36,7 +36,7 @@ export declare const RoofNode: z.ZodObject<{
36
36
  plaster: "plaster";
37
37
  tile: "tile";
38
38
  marble: "marble";
39
- }>>;
39
+ }>>>;
40
40
  properties: z.ZodOptional<z.ZodObject<{
41
41
  color: z.ZodDefault<z.ZodString>;
42
42
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -58,7 +58,7 @@ export declare const RoofNode: z.ZodObject<{
58
58
  materialPreset: z.ZodOptional<z.ZodString>;
59
59
  topMaterial: z.ZodOptional<z.ZodObject<{
60
60
  id: z.ZodOptional<z.ZodString>;
61
- preset: z.ZodOptional<z.ZodEnum<{
61
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
62
62
  custom: "custom";
63
63
  white: "white";
64
64
  brick: "brick";
@@ -69,7 +69,7 @@ export declare const RoofNode: z.ZodObject<{
69
69
  plaster: "plaster";
70
70
  tile: "tile";
71
71
  marble: "marble";
72
- }>>;
72
+ }>>>;
73
73
  properties: z.ZodOptional<z.ZodObject<{
74
74
  color: z.ZodDefault<z.ZodString>;
75
75
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -91,7 +91,7 @@ export declare const RoofNode: z.ZodObject<{
91
91
  topMaterialPreset: z.ZodOptional<z.ZodString>;
92
92
  edgeMaterial: z.ZodOptional<z.ZodObject<{
93
93
  id: z.ZodOptional<z.ZodString>;
94
- preset: z.ZodOptional<z.ZodEnum<{
94
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
95
95
  custom: "custom";
96
96
  white: "white";
97
97
  brick: "brick";
@@ -102,7 +102,7 @@ export declare const RoofNode: z.ZodObject<{
102
102
  plaster: "plaster";
103
103
  tile: "tile";
104
104
  marble: "marble";
105
- }>>;
105
+ }>>>;
106
106
  properties: z.ZodOptional<z.ZodObject<{
107
107
  color: z.ZodDefault<z.ZodString>;
108
108
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -124,7 +124,7 @@ export declare const RoofNode: z.ZodObject<{
124
124
  edgeMaterialPreset: z.ZodOptional<z.ZodString>;
125
125
  wallMaterial: z.ZodOptional<z.ZodObject<{
126
126
  id: z.ZodOptional<z.ZodString>;
127
- preset: z.ZodOptional<z.ZodEnum<{
127
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
128
128
  custom: "custom";
129
129
  white: "white";
130
130
  brick: "brick";
@@ -135,7 +135,7 @@ export declare const RoofNode: z.ZodObject<{
135
135
  plaster: "plaster";
136
136
  tile: "tile";
137
137
  marble: "marble";
138
- }>>;
138
+ }>>>;
139
139
  properties: z.ZodOptional<z.ZodObject<{
140
140
  color: z.ZodDefault<z.ZodString>;
141
141
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -69,7 +69,7 @@ export declare const ShelfNode: z.ZodObject<{
69
69
  }>>;
70
70
  material: z.ZodOptional<z.ZodObject<{
71
71
  id: z.ZodOptional<z.ZodString>;
72
- preset: z.ZodOptional<z.ZodEnum<{
72
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
73
73
  custom: "custom";
74
74
  white: "white";
75
75
  brick: "brick";
@@ -80,7 +80,7 @@ export declare const ShelfNode: z.ZodObject<{
80
80
  plaster: "plaster";
81
81
  tile: "tile";
82
82
  marble: "marble";
83
- }>>;
83
+ }>>>;
84
84
  properties: z.ZodOptional<z.ZodObject<{
85
85
  color: z.ZodDefault<z.ZodString>;
86
86
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -100,6 +100,7 @@ export declare const ShelfNode: z.ZodObject<{
100
100
  }, z.core.$strip>>;
101
101
  }, z.core.$strip>>;
102
102
  materialPreset: z.ZodOptional<z.ZodString>;
103
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
103
104
  }, z.core.$strip>;
104
105
  export type ShelfNode = z.infer<typeof ShelfNode>;
105
106
  //# sourceMappingURL=shelf.d.ts.map
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwDpB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DpB,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA"}