@pascal-app/nodes 1.0.0-beta.4 → 1.0.0
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.
- package/LICENSE +21 -0
- package/dist/block/commands.d.ts +68 -0
- package/dist/block/commands.d.ts.map +1 -0
- package/dist/block/commands.js +1144 -0
- package/dist/block/contextual-help.d.ts +3 -0
- package/dist/block/contextual-help.d.ts.map +1 -0
- package/dist/block/contextual-help.js +38 -0
- package/dist/block/definition.d.ts +8 -0
- package/dist/block/definition.d.ts.map +1 -0
- package/dist/block/definition.js +126 -0
- package/dist/block/edit-session.d.ts +16 -0
- package/dist/block/edit-session.d.ts.map +1 -0
- package/dist/block/edit-session.js +32 -0
- package/dist/block/face-host.d.ts +3 -0
- package/dist/block/face-host.d.ts.map +1 -0
- package/dist/block/face-host.js +178 -0
- package/dist/block/floorplan.d.ts +3 -0
- package/dist/block/floorplan.d.ts.map +1 -0
- package/dist/block/floorplan.js +43 -0
- package/dist/block/geometry-snap.d.ts +18 -0
- package/dist/block/geometry-snap.d.ts.map +1 -0
- package/dist/block/geometry-snap.js +137 -0
- package/dist/block/geometry.d.ts +11 -0
- package/dist/block/geometry.d.ts.map +1 -0
- package/dist/block/geometry.js +146 -0
- package/dist/block/gesture-wheel.d.ts +8 -0
- package/dist/block/gesture-wheel.d.ts.map +1 -0
- package/dist/block/gesture-wheel.js +7 -0
- package/dist/block/interaction-sfx.d.ts +3 -0
- package/dist/block/interaction-sfx.d.ts.map +1 -0
- package/dist/block/interaction-sfx.js +16 -0
- package/dist/block/last-operation.d.ts +48 -0
- package/dist/block/last-operation.d.ts.map +1 -0
- package/dist/block/last-operation.js +120 -0
- package/dist/block/loop-cut-interaction.d.ts +5 -0
- package/dist/block/loop-cut-interaction.d.ts.map +1 -0
- package/dist/block/loop-cut-interaction.js +13 -0
- package/dist/block/material-slots.d.ts +61 -0
- package/dist/block/material-slots.d.ts.map +1 -0
- package/dist/block/material-slots.js +131 -0
- package/dist/block/modal-face-operation.d.ts +13 -0
- package/dist/block/modal-face-operation.d.ts.map +1 -0
- package/dist/block/modal-face-operation.js +40 -0
- package/dist/block/modal-session.d.ts +15 -0
- package/dist/block/modal-session.d.ts.map +1 -0
- package/dist/block/modal-session.js +40 -0
- package/dist/block/modal-transform.d.ts +30 -0
- package/dist/block/modal-transform.d.ts.map +1 -0
- package/dist/block/modal-transform.js +144 -0
- package/dist/block/paint.d.ts +3 -0
- package/dist/block/paint.d.ts.map +1 -0
- package/dist/block/paint.js +136 -0
- package/dist/block/panel.d.ts +2 -0
- package/dist/block/panel.d.ts.map +1 -0
- package/dist/block/panel.js +234 -0
- package/dist/block/parametrics.d.ts +4 -0
- package/dist/block/parametrics.d.ts.map +1 -0
- package/dist/block/parametrics.js +9 -0
- package/dist/block/preview.d.ts +6 -0
- package/dist/block/preview.d.ts.map +1 -0
- package/dist/block/preview.js +46 -0
- package/dist/block/rotation-drag.d.ts +5 -0
- package/dist/block/rotation-drag.d.ts.map +1 -0
- package/dist/block/rotation-drag.js +18 -0
- package/dist/block/schema.d.ts +2 -0
- package/dist/block/schema.d.ts.map +1 -0
- package/dist/block/schema.js +1 -0
- package/dist/block/selection-geometry.d.ts +9 -0
- package/dist/block/selection-geometry.d.ts.map +1 -0
- package/dist/block/selection-geometry.js +31 -0
- package/dist/block/selection-model.d.ts +17 -0
- package/dist/block/selection-model.d.ts.map +1 -0
- package/dist/block/selection-model.js +84 -0
- package/dist/block/selection.d.ts +4 -0
- package/dist/block/selection.d.ts.map +1 -0
- package/dist/block/selection.js +2570 -0
- package/dist/block/slots.d.ts +4 -0
- package/dist/block/slots.d.ts.map +1 -0
- package/dist/block/slots.js +17 -0
- package/dist/block/tool.d.ts +3 -0
- package/dist/block/tool.d.ts.map +1 -0
- package/dist/block/tool.js +174 -0
- package/dist/block/toolbar-state.d.ts +46 -0
- package/dist/block/toolbar-state.d.ts.map +1 -0
- package/dist/block/toolbar-state.js +67 -0
- package/dist/block/use-block-face-operation.d.ts +39 -0
- package/dist/block/use-block-face-operation.d.ts.map +1 -0
- package/dist/block/use-block-face-operation.js +218 -0
- package/dist/box-vent/definition.d.ts.map +1 -1
- package/dist/box-vent/definition.js +8 -5
- package/dist/box-vent/geometry.d.ts +4 -0
- package/dist/box-vent/geometry.d.ts.map +1 -1
- package/dist/box-vent/geometry.js +76 -44
- package/dist/box-vent/paint.d.ts +4 -0
- package/dist/box-vent/paint.d.ts.map +1 -0
- package/dist/box-vent/paint.js +40 -0
- package/dist/box-vent/panel.js +1 -1
- package/dist/box-vent/parametrics.js +3 -3
- package/dist/box-vent/renderer.d.ts.map +1 -1
- package/dist/box-vent/renderer.js +29 -10
- package/dist/cabinet/compartment-card.d.ts.map +1 -1
- package/dist/cabinet/compartment-card.js +11 -3
- package/dist/cabinet/continuous-placement.d.ts +3 -0
- package/dist/cabinet/continuous-placement.d.ts.map +1 -1
- package/dist/cabinet/continuous-placement.js +6 -0
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +400 -54
- package/dist/cabinet/flame-index.d.ts +3 -0
- package/dist/cabinet/flame-index.d.ts.map +1 -0
- package/dist/cabinet/flame-index.js +13 -0
- package/dist/cabinet/floorplan-move.d.ts.map +1 -1
- package/dist/cabinet/floorplan-move.js +91 -22
- package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
- package/dist/cabinet/geometry/fridge.js +25 -1
- package/dist/cabinet/geometry/fronts.d.ts +4 -0
- package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
- package/dist/cabinet/geometry/fronts.js +1 -1
- package/dist/cabinet/geometry/run.d.ts.map +1 -1
- package/dist/cabinet/geometry/run.js +19 -1
- package/dist/cabinet/geometry.d.ts.map +1 -1
- package/dist/cabinet/geometry.js +63 -1
- package/dist/cabinet/index.d.ts +1 -0
- package/dist/cabinet/index.d.ts.map +1 -1
- package/dist/cabinet/index.js +1 -0
- package/dist/cabinet/insertion.d.ts +19 -0
- package/dist/cabinet/insertion.d.ts.map +1 -0
- package/dist/cabinet/insertion.js +49 -0
- package/dist/cabinet/move-frame.d.ts.map +1 -1
- package/dist/cabinet/move-frame.js +68 -2
- package/dist/cabinet/panel-context.d.ts +7 -0
- package/dist/cabinet/panel-context.d.ts.map +1 -0
- package/dist/cabinet/panel-context.js +16 -0
- package/dist/cabinet/panel-visibility.d.ts +9 -0
- package/dist/cabinet/panel-visibility.d.ts.map +1 -0
- package/dist/cabinet/panel-visibility.js +26 -0
- package/dist/cabinet/panel.d.ts.map +1 -1
- package/dist/cabinet/panel.js +221 -37
- package/dist/cabinet/placement-dimensions.d.ts +42 -0
- package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
- package/dist/cabinet/placement-dimensions.js +227 -0
- package/dist/cabinet/placement-snap.d.ts +21 -1
- package/dist/cabinet/placement-snap.d.ts.map +1 -1
- package/dist/cabinet/placement-snap.js +48 -6
- package/dist/cabinet/preset-width-debt.d.ts +7 -0
- package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
- package/dist/cabinet/preset-width-debt.js +45 -0
- package/dist/cabinet/presets.d.ts.map +1 -1
- package/dist/cabinet/presets.js +14 -13
- package/dist/cabinet/profiles.d.ts +14 -0
- package/dist/cabinet/profiles.d.ts.map +1 -0
- package/dist/cabinet/profiles.js +30 -0
- package/dist/cabinet/quick-actions.d.ts.map +1 -1
- package/dist/cabinet/quick-actions.js +8 -24
- package/dist/cabinet/reveals.d.ts +37 -0
- package/dist/cabinet/reveals.d.ts.map +1 -0
- package/dist/cabinet/reveals.js +13 -0
- package/dist/cabinet/run-layout.d.ts +90 -4
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +408 -23
- package/dist/cabinet/run-ops.d.ts +202 -10
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/run-ops.js +520 -33
- package/dist/cabinet/run-panel.d.ts +6 -2
- package/dist/cabinet/run-panel.d.ts.map +1 -1
- package/dist/cabinet/run-panel.js +285 -108
- package/dist/cabinet/stack-transitions.d.ts.map +1 -1
- package/dist/cabinet/stack-transitions.js +35 -24
- package/dist/cabinet/stack.d.ts +169 -1
- package/dist/cabinet/stack.d.ts.map +1 -1
- package/dist/cabinet/stack.js +57 -18
- package/dist/cabinet/system.d.ts +2 -0
- package/dist/cabinet/system.d.ts.map +1 -1
- package/dist/cabinet/system.js +28 -8
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +616 -91
- package/dist/cabinet/validation.d.ts +27 -0
- package/dist/cabinet/validation.d.ts.map +1 -0
- package/dist/cabinet/validation.js +56 -0
- package/dist/cabinet/wall-height-presets.d.ts +12 -0
- package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
- package/dist/cabinet/wall-height-presets.js +15 -0
- package/dist/cabinet/wall-snap.d.ts +27 -3
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +278 -62
- package/dist/cabinet/widths.d.ts +10 -0
- package/dist/cabinet/widths.d.ts.map +1 -0
- package/dist/cabinet/widths.js +13 -0
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +7 -1
- package/dist/ceiling/floorplan-affordances.d.ts +8 -8
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +0 -1
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +8 -2
- package/dist/ceiling/parametrics.js +1 -1
- package/dist/chimney/definition.js +1 -1
- package/dist/chimney/panel.js +1 -1
- package/dist/chimney/parametrics.js +3 -3
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +22 -4
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +37 -7
- package/dist/column/parametrics.d.ts.map +1 -1
- package/dist/column/parametrics.js +5 -3
- package/dist/column/tool.d.ts.map +1 -1
- package/dist/column/tool.js +50 -14
- package/dist/cupola/definition.d.ts.map +1 -1
- package/dist/cupola/definition.js +15 -6
- package/dist/cupola/geometry.d.ts +6 -0
- package/dist/cupola/geometry.d.ts.map +1 -1
- package/dist/cupola/geometry.js +60 -13
- package/dist/cupola/paint.d.ts +4 -0
- package/dist/cupola/paint.d.ts.map +1 -0
- package/dist/cupola/paint.js +39 -0
- package/dist/cupola/panel.js +1 -1
- package/dist/cupola/parametrics.js +3 -3
- package/dist/cupola/renderer.d.ts.map +1 -1
- package/dist/cupola/renderer.js +27 -8
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +1 -1
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +86 -32
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +1 -1
- package/dist/door/parametrics.js +2 -2
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +16 -4
- package/dist/dormer/csg-geometry.d.ts +6 -42
- package/dist/dormer/csg-geometry.d.ts.map +1 -1
- package/dist/dormer/csg-geometry.js +38 -209
- package/dist/dormer/definition.d.ts +4 -12
- package/dist/dormer/definition.d.ts.map +1 -1
- package/dist/dormer/definition.js +18 -193
- package/dist/dormer/floorplan.d.ts +3 -3
- package/dist/dormer/floorplan.d.ts.map +1 -1
- package/dist/dormer/floorplan.js +6 -17
- package/dist/dormer/geometry.d.ts +5 -24
- package/dist/dormer/geometry.d.ts.map +1 -1
- package/dist/dormer/geometry.js +64 -41
- package/dist/dormer/index.d.ts +1 -1
- package/dist/dormer/index.d.ts.map +1 -1
- package/dist/dormer/index.js +1 -1
- package/dist/dormer/move-tool.d.ts.map +1 -1
- package/dist/dormer/move-tool.js +31 -3
- package/dist/dormer/panel-windows-section.d.ts +9 -0
- package/dist/dormer/panel-windows-section.d.ts.map +1 -0
- package/dist/dormer/panel-windows-section.js +7 -0
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +100 -18
- package/dist/dormer/parametrics.d.ts.map +1 -1
- package/dist/dormer/parametrics.js +8 -77
- package/dist/dormer/placement-guides.d.ts.map +1 -1
- package/dist/dormer/placement-guides.js +5 -4
- package/dist/dormer/preview.d.ts.map +1 -1
- package/dist/dormer/preview.js +9 -1
- package/dist/dormer/renderer.d.ts.map +1 -1
- package/dist/dormer/renderer.js +24 -26
- package/dist/dormer/tool.d.ts.map +1 -1
- package/dist/dormer/tool.js +3 -1
- package/dist/dormer/window-layout.d.ts +15 -0
- package/dist/dormer/window-layout.d.ts.map +1 -0
- package/dist/dormer/window-layout.js +59 -0
- package/dist/downspout/definition.d.ts.map +1 -1
- package/dist/downspout/definition.js +17 -4
- package/dist/downspout/geometry.d.ts.map +1 -1
- package/dist/downspout/geometry.js +10 -0
- package/dist/downspout/inspector-editors.d.ts.map +1 -1
- package/dist/downspout/inspector-editors.js +9 -1
- package/dist/downspout/parametrics.d.ts.map +1 -1
- package/dist/downspout/parametrics.js +2 -1
- package/dist/downspout/renderer.d.ts.map +1 -1
- package/dist/downspout/renderer.js +19 -3
- package/dist/downspout/system.d.ts +7 -0
- package/dist/downspout/system.d.ts.map +1 -0
- package/dist/downspout/system.js +114 -0
- package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
- package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
- package/dist/duct-fitting/accessory-geometry.js +47 -0
- package/dist/duct-fitting/definition.d.ts.map +1 -1
- package/dist/duct-fitting/definition.js +11 -1
- package/dist/duct-fitting/floorplan.d.ts.map +1 -1
- package/dist/duct-fitting/floorplan.js +8 -0
- package/dist/duct-fitting/geometry.d.ts.map +1 -1
- package/dist/duct-fitting/geometry.js +52 -38
- package/dist/duct-fitting/parametrics.d.ts.map +1 -1
- package/dist/duct-fitting/parametrics.js +78 -15
- package/dist/duct-fitting/ports.d.ts +1 -0
- package/dist/duct-fitting/ports.d.ts.map +1 -1
- package/dist/duct-fitting/ports.js +46 -0
- package/dist/duct-fitting/tool.d.ts +19 -0
- package/dist/duct-fitting/tool.d.ts.map +1 -1
- package/dist/duct-fitting/tool.js +126 -34
- package/dist/duct-segment/continuation.d.ts +21 -0
- package/dist/duct-segment/continuation.d.ts.map +1 -0
- package/dist/duct-segment/continuation.js +167 -0
- package/dist/duct-segment/definition.d.ts.map +1 -1
- package/dist/duct-segment/definition.js +19 -18
- package/dist/duct-segment/floorplan.d.ts.map +1 -1
- package/dist/duct-segment/floorplan.js +43 -0
- package/dist/duct-segment/geometry.d.ts.map +1 -1
- package/dist/duct-segment/geometry.js +3 -0
- package/dist/duct-segment/move-tool.d.ts.map +1 -1
- package/dist/duct-segment/move-tool.js +33 -6
- package/dist/duct-segment/parametrics.d.ts.map +1 -1
- package/dist/duct-segment/parametrics.js +45 -1
- package/dist/duct-segment/selection.d.ts +3 -4
- package/dist/duct-segment/selection.d.ts.map +1 -1
- package/dist/duct-segment/selection.js +186 -158
- package/dist/duct-segment/tool.d.ts +37 -0
- package/dist/duct-segment/tool.d.ts.map +1 -1
- package/dist/duct-segment/tool.js +305 -678
- package/dist/duct-terminal/parametrics.js +2 -2
- package/dist/duct-terminal/tool.d.ts.map +1 -1
- package/dist/duct-terminal/tool.js +37 -7
- package/dist/elevator/definition.d.ts.map +1 -1
- package/dist/elevator/definition.js +2 -0
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +7 -7
- package/dist/elevator/system.d.ts.map +1 -1
- package/dist/elevator/system.js +10 -1
- package/dist/eyebrow-vent/definition.d.ts.map +1 -1
- package/dist/eyebrow-vent/definition.js +8 -5
- package/dist/eyebrow-vent/geometry.d.ts +4 -0
- package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
- package/dist/eyebrow-vent/geometry.js +60 -15
- package/dist/eyebrow-vent/paint.d.ts +4 -0
- package/dist/eyebrow-vent/paint.d.ts.map +1 -0
- package/dist/eyebrow-vent/paint.js +33 -0
- package/dist/eyebrow-vent/panel.js +1 -1
- package/dist/eyebrow-vent/parametrics.js +3 -3
- package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
- package/dist/eyebrow-vent/renderer.js +27 -8
- package/dist/fence/curve-tool.d.ts.map +1 -1
- package/dist/fence/curve-tool.js +14 -9
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +2 -1
- package/dist/fence/floorplan-affordances.d.ts +1 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +30 -1
- package/dist/fence/floorplan.d.ts.map +1 -1
- package/dist/fence/floorplan.js +14 -0
- package/dist/fence/move-control-point-tool.d.ts.map +1 -1
- package/dist/fence/move-control-point-tool.js +13 -8
- package/dist/fence/move-tangent-tool.d.ts.map +1 -1
- package/dist/fence/move-tangent-tool.js +13 -8
- package/dist/fence/parametrics.js +3 -3
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +55 -31
- package/dist/gutter/corner-mitre.d.ts.map +1 -1
- package/dist/gutter/corner-mitre.js +47 -7
- package/dist/gutter/definition.d.ts.map +1 -1
- package/dist/gutter/definition.js +23 -13
- package/dist/gutter/eave-align.d.ts.map +1 -1
- package/dist/gutter/eave-align.js +10 -0
- package/dist/gutter/eave-snap.d.ts +1 -1
- package/dist/gutter/eave-snap.d.ts.map +1 -1
- package/dist/gutter/eave-snap.js +10 -23
- package/dist/gutter/geometry.d.ts.map +1 -1
- package/dist/gutter/geometry.js +126 -8
- package/dist/gutter/outlet-lookup.d.ts.map +1 -1
- package/dist/gutter/outlet-lookup.js +22 -1
- package/dist/gutter/paint.d.ts +3 -0
- package/dist/gutter/paint.d.ts.map +1 -0
- package/dist/gutter/paint.js +6 -0
- package/dist/gutter/parametrics.d.ts.map +1 -1
- package/dist/gutter/parametrics.js +4 -1
- package/dist/gutter/renderer.d.ts.map +1 -1
- package/dist/gutter/renderer.js +63 -7
- package/dist/gutter/trim-clip.d.ts +3 -0
- package/dist/gutter/trim-clip.d.ts.map +1 -0
- package/dist/gutter/trim-clip.js +5 -0
- package/dist/hvac-equipment/parametrics.js +3 -3
- package/dist/hvac-equipment/tool.d.ts.map +1 -1
- package/dist/hvac-equipment/tool.js +12 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +10 -2
- package/dist/item/floorplan-move.d.ts.map +1 -1
- package/dist/item/floorplan-move.js +20 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +22 -1
- package/dist/item/move-tool.d.ts +28 -1
- package/dist/item/move-tool.d.ts.map +1 -1
- package/dist/item/move-tool.js +14 -2
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +16 -6
- package/dist/item/system.d.ts +5 -0
- package/dist/item/system.d.ts.map +1 -1
- package/dist/item/system.js +7 -1
- package/dist/lean-to-extension/arc.d.ts +14 -0
- package/dist/lean-to-extension/arc.d.ts.map +1 -0
- package/dist/lean-to-extension/arc.js +56 -0
- package/dist/lean-to-extension/assembly.d.ts +61 -0
- package/dist/lean-to-extension/assembly.d.ts.map +1 -0
- package/dist/lean-to-extension/assembly.js +761 -0
- package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
- package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/canopy-joint.js +234 -0
- package/dist/lean-to-extension/conical-host.d.ts +15 -0
- package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
- package/dist/lean-to-extension/conical-host.js +113 -0
- package/dist/lean-to-extension/corner-joint.d.ts +29 -0
- package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
- package/dist/lean-to-extension/corner-joint.js +1202 -0
- package/dist/lean-to-extension/definition.d.ts +4 -0
- package/dist/lean-to-extension/definition.d.ts.map +1 -0
- package/dist/lean-to-extension/definition.js +433 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-affordances.js +144 -0
- package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
- package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-move.js +157 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
- package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan-tool.js +385 -0
- package/dist/lean-to-extension/floorplan.d.ts +3 -0
- package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
- package/dist/lean-to-extension/floorplan.js +373 -0
- package/dist/lean-to-extension/geometry.d.ts +7 -0
- package/dist/lean-to-extension/geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/geometry.js +662 -0
- package/dist/lean-to-extension/index.d.ts +8 -0
- package/dist/lean-to-extension/index.d.ts.map +1 -0
- package/dist/lean-to-extension/index.js +7 -0
- package/dist/lean-to-extension/layout.d.ts +108 -0
- package/dist/lean-to-extension/layout.d.ts.map +1 -0
- package/dist/lean-to-extension/layout.js +477 -0
- package/dist/lean-to-extension/managed-preview.d.ts +3 -0
- package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
- package/dist/lean-to-extension/managed-preview.js +93 -0
- package/dist/lean-to-extension/move-tool.d.ts +8 -0
- package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
- package/dist/lean-to-extension/move-tool.js +202 -0
- package/dist/lean-to-extension/paint.d.ts +2 -0
- package/dist/lean-to-extension/paint.d.ts.map +1 -0
- package/dist/lean-to-extension/paint.js +16 -0
- package/dist/lean-to-extension/parametrics.d.ts +4 -0
- package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
- package/dist/lean-to-extension/parametrics.js +570 -0
- package/dist/lean-to-extension/placement-scope.d.ts +3 -0
- package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-scope.js +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts +4 -0
- package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
- package/dist/lean-to-extension/placement-validation.js +324 -0
- package/dist/lean-to-extension/placement.d.ts +59 -0
- package/dist/lean-to-extension/placement.d.ts.map +1 -0
- package/dist/lean-to-extension/placement.js +331 -0
- package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
- package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
- package/dist/lean-to-extension/plan-footprint.js +27 -0
- package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
- package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
- package/dist/lean-to-extension/preview-geometry.js +40 -0
- package/dist/lean-to-extension/preview.d.ts +7 -0
- package/dist/lean-to-extension/preview.d.ts.map +1 -0
- package/dist/lean-to-extension/preview.js +20 -0
- package/dist/lean-to-extension/renderer.d.ts +6 -0
- package/dist/lean-to-extension/renderer.d.ts.map +1 -0
- package/dist/lean-to-extension/renderer.js +34 -0
- package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
- package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
- package/dist/lean-to-extension/roof-attachment.js +376 -0
- package/dist/lean-to-extension/schema.d.ts +2 -0
- package/dist/lean-to-extension/schema.d.ts.map +1 -0
- package/dist/lean-to-extension/schema.js +1 -0
- package/dist/lean-to-extension/slots.d.ts +5 -0
- package/dist/lean-to-extension/slots.d.ts.map +1 -0
- package/dist/lean-to-extension/slots.js +15 -0
- package/dist/lean-to-extension/system.d.ts +7 -0
- package/dist/lean-to-extension/system.d.ts.map +1 -0
- package/dist/lean-to-extension/system.js +726 -0
- package/dist/lean-to-extension/tool.d.ts +3 -0
- package/dist/lean-to-extension/tool.d.ts.map +1 -0
- package/dist/lean-to-extension/tool.js +580 -0
- package/dist/lean-to-extension/wall-target.d.ts +10 -0
- package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
- package/dist/lean-to-extension/wall-target.js +29 -0
- package/dist/lineset/definition.d.ts.map +1 -1
- package/dist/lineset/definition.js +1 -0
- package/dist/liquid-line/definition.d.ts.map +1 -1
- package/dist/liquid-line/definition.js +1 -0
- package/dist/measurement/renderer.d.ts.map +1 -1
- package/dist/measurement/renderer.js +6 -5
- package/dist/measurement/surface-query.js +5 -5
- package/dist/measurement/tool.d.ts.map +1 -1
- package/dist/measurement/tool.js +7 -5
- package/dist/pipe-fitting/definition.d.ts.map +1 -1
- package/dist/pipe-fitting/definition.js +16 -2
- package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
- package/dist/pipe-fitting/floorplan.js +4 -0
- package/dist/pipe-fitting/geometry.d.ts +3 -5
- package/dist/pipe-fitting/geometry.d.ts.map +1 -1
- package/dist/pipe-fitting/geometry.js +154 -21
- package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
- package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
- package/dist/pipe-fitting/inline-insertion.js +96 -0
- package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
- package/dist/pipe-fitting/parametrics.js +17 -3
- package/dist/pipe-fitting/ports.d.ts.map +1 -1
- package/dist/pipe-fitting/ports.js +8 -1
- package/dist/pipe-fitting/tool.d.ts +26 -0
- package/dist/pipe-fitting/tool.d.ts.map +1 -1
- package/dist/pipe-fitting/tool.js +182 -37
- package/dist/pipe-segment/continuation.d.ts +22 -0
- package/dist/pipe-segment/continuation.d.ts.map +1 -0
- package/dist/pipe-segment/continuation.js +146 -0
- package/dist/pipe-segment/definition.d.ts.map +1 -1
- package/dist/pipe-segment/definition.js +23 -7
- package/dist/pipe-segment/floorplan.d.ts.map +1 -1
- package/dist/pipe-segment/floorplan.js +42 -0
- package/dist/pipe-segment/geometry.d.ts +2 -1
- package/dist/pipe-segment/geometry.d.ts.map +1 -1
- package/dist/pipe-segment/geometry.js +4 -1
- package/dist/pipe-segment/move-tool.d.ts.map +1 -1
- package/dist/pipe-segment/move-tool.js +25 -5
- package/dist/pipe-segment/parametrics.d.ts.map +1 -1
- package/dist/pipe-segment/parametrics.js +45 -0
- package/dist/pipe-segment/selection.d.ts +3 -4
- package/dist/pipe-segment/selection.d.ts.map +1 -1
- package/dist/pipe-segment/selection.js +169 -105
- package/dist/pipe-segment/slope.d.ts +5 -0
- package/dist/pipe-segment/slope.d.ts.map +1 -0
- package/dist/pipe-segment/slope.js +10 -0
- package/dist/pipe-segment/tool.d.ts.map +1 -1
- package/dist/pipe-segment/tool.js +325 -545
- package/dist/pipe-trap/tool.d.ts.map +1 -1
- package/dist/pipe-trap/tool.js +15 -2
- package/dist/ridge-vent/definition.js +1 -1
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +2 -2
- package/dist/ridge-vent/parametrics.js +1 -1
- package/dist/ridge-vent/renderer.d.ts.map +1 -1
- package/dist/ridge-vent/renderer.js +2 -2
- package/dist/roof/conical-roof-placement.d.ts +36 -0
- package/dist/roof/conical-roof-placement.d.ts.map +1 -0
- package/dist/roof/conical-roof-placement.js +134 -0
- package/dist/roof/conical-roof.d.ts +3 -0
- package/dist/roof/conical-roof.d.ts.map +1 -0
- package/dist/roof/conical-roof.js +53 -0
- package/dist/roof/definition.d.ts +3 -10
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +83 -13
- package/dist/roof/floorplan.d.ts +3 -10
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +139 -165
- package/dist/roof/index.d.ts +1 -0
- package/dist/roof/index.d.ts.map +1 -1
- package/dist/roof/index.js +1 -0
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +22 -23
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/roof-footprint-source.d.ts +16 -0
- package/dist/roof/roof-footprint-source.d.ts.map +1 -0
- package/dist/roof/roof-footprint-source.js +14 -0
- package/dist/roof/roof-footprint.d.ts +25 -0
- package/dist/roof/roof-footprint.d.ts.map +1 -0
- package/dist/roof/roof-footprint.js +94 -0
- package/dist/roof/roof-placement-mode.d.ts +18 -0
- package/dist/roof/roof-placement-mode.d.ts.map +1 -0
- package/dist/roof/roof-placement-mode.js +24 -0
- package/dist/roof/tool.d.ts +10 -0
- package/dist/roof/tool.d.ts.map +1 -0
- package/dist/roof/tool.js +922 -0
- package/dist/roof-segment/definition.d.ts.map +1 -1
- package/dist/roof-segment/definition.js +52 -8
- package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
- package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
- package/dist/roof-segment/floorplan-affordances.js +64 -18
- package/dist/roof-segment/floorplan.d.ts +3 -2
- package/dist/roof-segment/floorplan.d.ts.map +1 -1
- package/dist/roof-segment/floorplan.js +95 -46
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +122 -27
- package/dist/scan/definition.d.ts +2 -3
- package/dist/scan/definition.d.ts.map +1 -1
- package/dist/scan/definition.js +9 -7
- package/dist/scan/parametrics.d.ts.map +1 -1
- package/dist/scan/parametrics.js +13 -1
- package/dist/scan/renderer.d.ts.map +1 -1
- package/dist/scan/renderer.js +8 -2
- package/dist/shared/accessory-cursor.d.ts +7 -0
- package/dist/shared/accessory-cursor.d.ts.map +1 -0
- package/dist/shared/accessory-cursor.js +83 -0
- package/dist/shared/accessory-floorplan.d.ts +4 -0
- package/dist/shared/accessory-floorplan.d.ts.map +1 -0
- package/dist/shared/accessory-floorplan.js +51 -0
- package/dist/shared/accessory-geometry.d.ts +7 -0
- package/dist/shared/accessory-geometry.d.ts.map +1 -0
- package/dist/shared/accessory-geometry.js +79 -0
- package/dist/shared/accessory-placement.d.ts +10 -0
- package/dist/shared/accessory-placement.d.ts.map +1 -0
- package/dist/shared/accessory-placement.js +126 -0
- package/dist/shared/accessory-snapping.d.ts +5 -0
- package/dist/shared/accessory-snapping.d.ts.map +1 -0
- package/dist/shared/accessory-snapping.js +40 -0
- package/dist/shared/automatic-run-end-cap.d.ts +11 -0
- package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
- package/dist/shared/automatic-run-end-cap.js +159 -0
- package/dist/shared/block-face-host.d.ts +15 -0
- package/dist/shared/block-face-host.d.ts.map +1 -0
- package/dist/shared/block-face-host.js +36 -0
- package/dist/shared/connection-compatibility.d.ts +8 -0
- package/dist/shared/connection-compatibility.d.ts.map +1 -0
- package/dist/shared/connection-compatibility.js +28 -0
- package/dist/shared/connection-feedback.d.ts +10 -0
- package/dist/shared/connection-feedback.d.ts.map +1 -0
- package/dist/shared/connection-feedback.js +17 -0
- package/dist/shared/distribution-run-contract.d.ts +49 -0
- package/dist/shared/distribution-run-contract.d.ts.map +1 -0
- package/dist/shared/distribution-run-contract.js +30 -0
- package/dist/shared/distribution-run-tool.d.ts +107 -0
- package/dist/shared/distribution-run-tool.d.ts.map +1 -0
- package/dist/shared/distribution-run-tool.js +941 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
- package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
- package/dist/shared/dormer-wall-opening-placement.js +101 -0
- package/dist/shared/duct-adapter.d.ts +10 -0
- package/dist/shared/duct-adapter.d.ts.map +1 -0
- package/dist/shared/duct-adapter.js +43 -0
- package/dist/shared/elbow-branch-continuation.d.ts +20 -0
- package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
- package/dist/shared/elbow-branch-continuation.js +200 -0
- package/dist/shared/fitting-clearance.d.ts +5 -0
- package/dist/shared/fitting-clearance.d.ts.map +1 -0
- package/dist/shared/fitting-clearance.js +11 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
- package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
- package/dist/shared/fitting-deletion-cleanup.js +297 -0
- package/dist/shared/fitting-surface-support.d.ts +5 -0
- package/dist/shared/fitting-surface-support.d.ts.map +1 -0
- package/dist/shared/fitting-surface-support.js +42 -0
- package/dist/shared/fitting-tool-options.d.ts +4 -0
- package/dist/shared/fitting-tool-options.d.ts.map +1 -0
- package/dist/shared/fitting-tool-options.js +175 -0
- package/dist/shared/floor-placement.d.ts +1 -1
- package/dist/shared/floor-placement.d.ts.map +1 -1
- package/dist/shared/floor-placement.js +13 -33
- package/dist/shared/ghost-materials.d.ts.map +1 -1
- package/dist/shared/ghost-materials.js +2 -1
- package/dist/shared/lean-to-post-omissions.d.ts +8 -0
- package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
- package/dist/shared/lean-to-post-omissions.js +51 -0
- package/dist/shared/mep-fitting-actions.d.ts +5 -0
- package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
- package/dist/shared/mep-fitting-actions.js +16 -0
- package/dist/shared/mep-ghost.d.ts.map +1 -1
- package/dist/shared/mep-ghost.js +19 -1
- package/dist/shared/mep-presets.d.ts +11 -0
- package/dist/shared/mep-presets.d.ts.map +1 -0
- package/dist/shared/mep-presets.js +34 -0
- package/dist/shared/node-batch/candidates.d.ts +29 -0
- package/dist/shared/node-batch/candidates.d.ts.map +1 -0
- package/dist/shared/node-batch/candidates.js +260 -0
- package/dist/shared/node-batch/store.d.ts +26 -0
- package/dist/shared/node-batch/store.d.ts.map +1 -0
- package/dist/shared/node-batch/store.js +319 -0
- package/dist/shared/node-batch/system.d.ts +8 -0
- package/dist/shared/node-batch/system.d.ts.map +1 -0
- package/dist/shared/node-batch/system.js +569 -0
- package/dist/shared/node-batch/types.d.ts +99 -0
- package/dist/shared/node-batch/types.d.ts.map +1 -0
- package/dist/shared/node-batch/types.js +4 -0
- package/dist/shared/opening-move-history.d.ts +47 -0
- package/dist/shared/opening-move-history.d.ts.map +1 -0
- package/dist/shared/opening-move-history.js +18 -0
- package/dist/shared/opening-move-wall-gate.d.ts +55 -0
- package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
- package/dist/shared/opening-move-wall-gate.js +44 -0
- package/dist/shared/path-point-affordance.d.ts +2 -2
- package/dist/shared/path-point-affordance.d.ts.map +1 -1
- package/dist/shared/path-point-affordance.js +30 -6
- package/dist/shared/placeholder-geometry.d.ts.map +1 -1
- package/dist/shared/placeholder-geometry.js +4 -0
- package/dist/shared/ports.d.ts +20 -3
- package/dist/shared/ports.d.ts.map +1 -1
- package/dist/shared/ports.js +148 -7
- package/dist/shared/primitive-uv.d.ts +17 -0
- package/dist/shared/primitive-uv.d.ts.map +1 -0
- package/dist/shared/primitive-uv.js +107 -0
- package/dist/shared/reducer-size.d.ts +2 -0
- package/dist/shared/reducer-size.d.ts.map +1 -0
- package/dist/shared/reducer-size.js +12 -0
- package/dist/shared/ridge-snap.js +1 -1
- package/dist/shared/roof-surface.d.ts.map +1 -1
- package/dist/shared/roof-surface.js +17 -2
- package/dist/shared/run-cursor.d.ts +22 -0
- package/dist/shared/run-cursor.d.ts.map +1 -0
- package/dist/shared/run-cursor.js +19 -0
- package/dist/shared/run-direction-feedback.d.ts +20 -0
- package/dist/shared/run-direction-feedback.d.ts.map +1 -0
- package/dist/shared/run-direction-feedback.js +139 -0
- package/dist/shared/run-hanger-controls.d.ts +7 -0
- package/dist/shared/run-hanger-controls.d.ts.map +1 -0
- package/dist/shared/run-hanger-controls.js +44 -0
- package/dist/shared/run-hanger-inspector.d.ts +5 -0
- package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
- package/dist/shared/run-hanger-inspector.js +43 -0
- package/dist/shared/run-hanger-mode.d.ts +11 -0
- package/dist/shared/run-hanger-mode.d.ts.map +1 -0
- package/dist/shared/run-hanger-mode.js +32 -0
- package/dist/shared/run-hanger-system.d.ts +3 -0
- package/dist/shared/run-hanger-system.d.ts.map +1 -0
- package/dist/shared/run-hanger-system.js +39 -0
- package/dist/shared/run-hangers.d.ts +25 -0
- package/dist/shared/run-hangers.d.ts.map +1 -0
- package/dist/shared/run-hangers.js +261 -0
- package/dist/shared/run-port-snap.d.ts +11 -0
- package/dist/shared/run-port-snap.d.ts.map +1 -0
- package/dist/shared/run-port-snap.js +19 -0
- package/dist/shared/run-screen-direction.d.ts +5 -0
- package/dist/shared/run-screen-direction.d.ts.map +1 -0
- package/dist/shared/run-screen-direction.js +24 -0
- package/dist/shared/selection-handles.d.ts +4 -0
- package/dist/shared/selection-handles.d.ts.map +1 -1
- package/dist/shared/selection-handles.js +10 -0
- package/dist/shared/slot-paint.d.ts +8 -1
- package/dist/shared/slot-paint.d.ts.map +1 -1
- package/dist/shared/slot-paint.js +120 -27
- package/dist/shared/surface-paint.d.ts +1 -2
- package/dist/shared/surface-paint.d.ts.map +1 -1
- package/dist/shared/surface-paint.js +9 -20
- package/dist/shared/system-check-panel.d.ts +6 -0
- package/dist/shared/system-check-panel.d.ts.map +1 -0
- package/dist/shared/system-check-panel.js +62 -0
- package/dist/shared/system-checks.d.ts +9 -0
- package/dist/shared/system-checks.d.ts.map +1 -0
- package/dist/shared/system-checks.js +131 -0
- package/dist/shared/wall-attach-target.d.ts +14 -2
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +108 -4
- package/dist/shared/wall-opening-clearance.d.ts +19 -0
- package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
- package/dist/shared/wall-opening-clearance.js +28 -0
- package/dist/shared/wall-run-move.d.ts +17 -0
- package/dist/shared/wall-run-move.d.ts.map +1 -0
- package/dist/shared/wall-run-move.js +56 -0
- package/dist/shelf/parametrics.js +4 -4
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +40 -28
- package/dist/site/terrain-geometry.d.ts +1 -1
- package/dist/site/terrain-geometry.d.ts.map +1 -1
- package/dist/site/terrain-geometry.js +35 -9
- package/dist/site/terrain-mesh.d.ts +5 -0
- package/dist/site/terrain-mesh.d.ts.map +1 -1
- package/dist/site/terrain-mesh.js +63 -34
- package/dist/skylight/definition.js +1 -1
- package/dist/skylight/panel.js +1 -1
- package/dist/skylight/parametrics.js +2 -2
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +6 -1
- package/dist/slab/dependency-tracker.d.ts +3 -0
- package/dist/slab/dependency-tracker.d.ts.map +1 -0
- package/dist/slab/dependency-tracker.js +104 -0
- package/dist/slab/floorplan-affordances.d.ts +8 -8
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +16 -2
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +1 -1
- package/dist/slab/parametrics.js +1 -1
- package/dist/slab/system.d.ts.map +1 -1
- package/dist/slab/system.js +8 -64
- package/dist/solar-panel/definition.js +1 -1
- package/dist/solar-panel/panel.js +1 -1
- package/dist/solar-panel/parametrics.js +2 -2
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +18 -13
- package/dist/stair/stair-type.d.ts +18 -0
- package/dist/stair/stair-type.d.ts.map +1 -0
- package/dist/stair/stair-type.js +25 -0
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +44 -5
- package/dist/turbine-vent/definition.d.ts.map +1 -1
- package/dist/turbine-vent/definition.js +8 -5
- package/dist/turbine-vent/geometry.d.ts.map +1 -1
- package/dist/turbine-vent/geometry.js +48 -18
- package/dist/turbine-vent/paint.d.ts +4 -0
- package/dist/turbine-vent/paint.d.ts.map +1 -0
- package/dist/turbine-vent/paint.js +35 -0
- package/dist/turbine-vent/panel.js +1 -1
- package/dist/turbine-vent/parametrics.js +2 -2
- package/dist/turbine-vent/renderer.d.ts.map +1 -1
- package/dist/turbine-vent/renderer.js +31 -9
- package/dist/wall/curve-eligibility.d.ts +3 -0
- package/dist/wall/curve-eligibility.d.ts.map +1 -0
- package/dist/wall/curve-eligibility.js +10 -0
- package/dist/wall/curve-tool.d.ts +3 -4
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +24 -23
- package/dist/wall/definition.d.ts +1 -1
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +36 -13
- package/dist/wall/floorplan-affordances.d.ts +1 -0
- package/dist/wall/floorplan-affordances.d.ts.map +1 -1
- package/dist/wall/floorplan-affordances.js +46 -7
- package/dist/wall/floorplan-move.d.ts +3 -4
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +122 -9
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +19 -23
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +10 -7
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +2 -0
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +62 -27
- package/dist/wall/parametrics.js +2 -2
- package/dist/wall/pointer-transparency.d.ts +128 -0
- package/dist/wall/pointer-transparency.d.ts.map +1 -0
- package/dist/wall/pointer-transparency.js +147 -0
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +65 -8
- package/dist/wall/selection-hit-owner.d.ts +53 -0
- package/dist/wall/selection-hit-owner.d.ts.map +1 -0
- package/dist/wall/selection-hit-owner.js +79 -0
- package/dist/wall/system.d.ts +5 -0
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +71 -26
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +29 -27
- package/dist/wall/treatment-level-data.d.ts +6 -1
- package/dist/wall/treatment-level-data.d.ts.map +1 -1
- package/dist/wall/treatment-level-data.js +82 -5
- package/dist/wall/treatments.d.ts +1 -0
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +5 -0
- package/dist/wall/wall-batch-system.d.ts +55 -0
- package/dist/wall/wall-batch-system.d.ts.map +1 -0
- package/dist/wall/wall-batch-system.js +486 -0
- package/dist/wall/wall-batch.d.ts +66 -0
- package/dist/wall/wall-batch.d.ts.map +1 -0
- package/dist/wall/wall-batch.js +169 -0
- package/dist/window/definition.d.ts +2 -1
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +51 -24
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +1 -1
- package/dist/window/move-tool.d.ts +7 -5
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +344 -58
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +2 -0
- package/dist/window/parametrics.js +2 -2
- package/dist/window/renderer.d.ts.map +1 -1
- package/dist/window/renderer.js +5 -7
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +227 -13
- package/dist/zone/floorplan-affordances.d.ts +12 -12
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +4 -3
- package/package.json +11 -9
- package/dist/dormer/panel-window-section.d.ts +0 -14
- package/dist/dormer/panel-window-section.d.ts.map +0 -1
- package/dist/dormer/panel-window-section.js +0 -59
- package/dist/dormer/window-assembly.d.ts +0 -22
- package/dist/dormer/window-assembly.d.ts.map +0 -1
- package/dist/dormer/window-assembly.js +0 -111
- package/dist/dormer/window-frame.d.ts +0 -24
- package/dist/dormer/window-frame.d.ts.map +0 -1
- package/dist/dormer/window-frame.js +0 -100
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { emitter, sceneRegistry, useScene } from '@pascal-app/core';
|
|
3
|
+
import { drainRebuiltWalls, getPendingWallRebuildCount, isIsolationActive, SCENE_LAYER, useViewer, } from '@pascal-app/viewer';
|
|
4
|
+
import { useFrame, useThree } from '@react-three/fiber';
|
|
5
|
+
import { useEffect, useRef } from 'react';
|
|
6
|
+
import { Matrix4, Mesh } from 'three';
|
|
7
|
+
import { applyWallBatchGroups, buildWallBatch, hideBatchedWall, revealBatchedWall, } from './wall-batch';
|
|
8
|
+
// A level's walls are merged only once they stop changing. Below this many
|
|
9
|
+
// walls a merge is not worth the buffer, and the leftovers (a selected wall,
|
|
10
|
+
// a lone partition) keep drawing themselves.
|
|
11
|
+
const MIN_BATCH_WALLS = 8;
|
|
12
|
+
// Quiet window after the last wall change before the merge runs.
|
|
13
|
+
const BATCH_SETTLE_MS = 180;
|
|
14
|
+
const lastAppearance = {
|
|
15
|
+
shading: undefined,
|
|
16
|
+
textures: undefined,
|
|
17
|
+
colorPreset: undefined,
|
|
18
|
+
sceneTheme: undefined,
|
|
19
|
+
materials: null,
|
|
20
|
+
};
|
|
21
|
+
function appearanceChanged() {
|
|
22
|
+
const viewer = useViewer.getState();
|
|
23
|
+
const materials = useScene.getState().materials;
|
|
24
|
+
if (lastAppearance.shading === viewer.shading &&
|
|
25
|
+
lastAppearance.textures === viewer.textures &&
|
|
26
|
+
lastAppearance.colorPreset === viewer.colorPreset &&
|
|
27
|
+
lastAppearance.sceneTheme === viewer.sceneTheme &&
|
|
28
|
+
lastAppearance.materials === materials) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
lastAppearance.shading = viewer.shading;
|
|
32
|
+
lastAppearance.textures = viewer.textures;
|
|
33
|
+
lastAppearance.colorPreset = viewer.colorPreset;
|
|
34
|
+
lastAppearance.sceneTheme = viewer.sceneTheme;
|
|
35
|
+
lastAppearance.materials = materials;
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const batchesByLevel = new Map();
|
|
39
|
+
const batchByNode = new Map();
|
|
40
|
+
const staleLevels = new Set();
|
|
41
|
+
const changedWalls = new Set();
|
|
42
|
+
const EMPTY_IDS = new Set();
|
|
43
|
+
let lastCutawayHiddenWalls = EMPTY_IDS;
|
|
44
|
+
let knownWallCount = -1;
|
|
45
|
+
let lastWallChangeAtMs = 0;
|
|
46
|
+
let batchingSuspended = false;
|
|
47
|
+
/**
|
|
48
|
+
* Batched walls are drawn by the merged mesh but still picked, measured and
|
|
49
|
+
* highlighted through their own meshes, so the merged copy must stay out of
|
|
50
|
+
* every raycast.
|
|
51
|
+
*/
|
|
52
|
+
function skipRaycast() {
|
|
53
|
+
// intentionally empty — see the note above
|
|
54
|
+
}
|
|
55
|
+
function showOwnGeometry(nodeId) {
|
|
56
|
+
const mesh = sceneRegistry.nodes.get(nodeId);
|
|
57
|
+
if (mesh)
|
|
58
|
+
revealBatchedWall(mesh);
|
|
59
|
+
}
|
|
60
|
+
export function revealBatchedWallsForCapture() {
|
|
61
|
+
for (const nodeId of batchByNode.keys())
|
|
62
|
+
showOwnGeometry(nodeId);
|
|
63
|
+
}
|
|
64
|
+
export function holdBatchedWallsAfterCapture() {
|
|
65
|
+
for (const nodeId of batchByNode.keys()) {
|
|
66
|
+
const mesh = sceneRegistry.nodes.get(nodeId);
|
|
67
|
+
if (mesh)
|
|
68
|
+
hideBatchedWall(mesh);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Hands a wall back to itself: the merged mesh stops drawing it, it resumes. */
|
|
72
|
+
function releaseWall(nodeId) {
|
|
73
|
+
const record = batchByNode.get(nodeId);
|
|
74
|
+
if (record) {
|
|
75
|
+
record.hidden.add(nodeId);
|
|
76
|
+
applyWallBatchGroups(record.batch, record.hidden);
|
|
77
|
+
batchByNode.delete(nodeId);
|
|
78
|
+
}
|
|
79
|
+
showOwnGeometry(nodeId);
|
|
80
|
+
}
|
|
81
|
+
function disposeLevelBatches(levelId) {
|
|
82
|
+
const records = batchesByLevel.get(levelId);
|
|
83
|
+
if (!records)
|
|
84
|
+
return;
|
|
85
|
+
for (const record of records) {
|
|
86
|
+
record.mesh.removeFromParent();
|
|
87
|
+
record.batch.geometry.dispose();
|
|
88
|
+
for (const nodeId of record.nodeIds) {
|
|
89
|
+
if (batchByNode.get(nodeId) === record)
|
|
90
|
+
batchByNode.delete(nodeId);
|
|
91
|
+
showOwnGeometry(nodeId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
batchesByLevel.delete(levelId);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A wall joins a batch only if its whole material set is opaque. Translucent
|
|
98
|
+
* and cut-away walls depend on per-object blend ordering, which merging would
|
|
99
|
+
* change — they keep the per-wall path.
|
|
100
|
+
*/
|
|
101
|
+
function toCandidate(nodeId, node, excludedNodeIds = EMPTY_IDS) {
|
|
102
|
+
if (excludedNodeIds.has(nodeId))
|
|
103
|
+
return null;
|
|
104
|
+
if (node.visible === false)
|
|
105
|
+
return null;
|
|
106
|
+
const mesh = sceneRegistry.nodes.get(nodeId);
|
|
107
|
+
if (!mesh?.visible)
|
|
108
|
+
return null;
|
|
109
|
+
if (mesh.userData.wallHidden === true)
|
|
110
|
+
return null;
|
|
111
|
+
// Solo's shadow-caster-only pass and the viewer's isolation filter both
|
|
112
|
+
// hide a wall by taking it off the scene layer. Sewing it in would put it
|
|
113
|
+
// back on screen through the merged mesh, which neither asked for.
|
|
114
|
+
if (!mesh.layers.isEnabled(SCENE_LAYER))
|
|
115
|
+
return null;
|
|
116
|
+
if (!mesh.geometry?.getAttribute('position'))
|
|
117
|
+
return null;
|
|
118
|
+
const materials = mesh.material;
|
|
119
|
+
if (!Array.isArray(materials) || materials.length === 0)
|
|
120
|
+
return null;
|
|
121
|
+
if (materials.some((material) => material.transparent))
|
|
122
|
+
return null;
|
|
123
|
+
return { nodeId, mesh, materials };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Whether a level's walls may be merged at all right now.
|
|
127
|
+
*
|
|
128
|
+
* The merged mesh captures one material set when it is sewn and nothing
|
|
129
|
+
* re-reads it, so batching is only sound while every batched wall's materials
|
|
130
|
+
* hold still. That is true in `up`; in `cutaway`, walls stamped `wallHidden`
|
|
131
|
+
* are released per wall in the same frame because WallCutout runs at priority
|
|
132
|
+
* 0 and this system at 5. `down` and `translucent` make every wall see-through.
|
|
133
|
+
* Isolation is the other stand-down: it hides the level root the merged mesh
|
|
134
|
+
* hangs off, which would leave a focused batched wall drawn by nobody.
|
|
135
|
+
*/
|
|
136
|
+
export function canBatchWalls(wallMode, isolationActive) {
|
|
137
|
+
return !isolationActive && (wallMode === 'up' || wallMode === 'cutaway');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Walls the viewer is currently lighting up — a selection, or any hover.
|
|
141
|
+
*
|
|
142
|
+
* A selection or delete hover paints the wall by swapping the materials on its
|
|
143
|
+
* own mesh, which the merged mesh does not follow. Every other hover draws an
|
|
144
|
+
* outline instead, and that needs the same thing for a different reason: the
|
|
145
|
+
* outline node renders `outliner.hoveredObjects` through the main camera, which
|
|
146
|
+
* enables no batched layer, so a sewn wall reaches neither mask pass and
|
|
147
|
+
* hovering it lights up nothing at all — in select mode, and in paint mode
|
|
148
|
+
* where the outline is the only signal for which surface the next click lands
|
|
149
|
+
* on.
|
|
150
|
+
*
|
|
151
|
+
* Both wants are the same one: a lit wall goes back to drawing its own
|
|
152
|
+
* geometry. Only ever a handful are lit at once, and a handful of extra draw
|
|
153
|
+
* calls is what lighting them costs.
|
|
154
|
+
*/
|
|
155
|
+
export function collectTintedWalls(wallIds) {
|
|
156
|
+
const viewer = useViewer.getState();
|
|
157
|
+
const tinted = new Set();
|
|
158
|
+
for (const id of viewer.selection.selectedIds)
|
|
159
|
+
if (wallIds.has(id))
|
|
160
|
+
tinted.add(id);
|
|
161
|
+
for (const id of viewer.previewSelectedIds)
|
|
162
|
+
if (wallIds.has(id))
|
|
163
|
+
tinted.add(id);
|
|
164
|
+
const hovered = viewer.hoveredId;
|
|
165
|
+
if (hovered && wallIds.has(hovered))
|
|
166
|
+
tinted.add(hovered);
|
|
167
|
+
return tinted;
|
|
168
|
+
}
|
|
169
|
+
function materialSetKey(materials) {
|
|
170
|
+
return materials.map((material) => material.uuid).join('|');
|
|
171
|
+
}
|
|
172
|
+
export function collectWallBatchCandidates(levelId, excludedNodeIds = EMPTY_IDS) {
|
|
173
|
+
const nodes = useScene.getState().nodes;
|
|
174
|
+
const level = nodes[levelId];
|
|
175
|
+
const grouped = new Map();
|
|
176
|
+
if (level?.type !== 'level')
|
|
177
|
+
return grouped;
|
|
178
|
+
for (const childId of level.children) {
|
|
179
|
+
const child = nodes[childId];
|
|
180
|
+
if (child?.type !== 'wall')
|
|
181
|
+
continue;
|
|
182
|
+
const candidate = toCandidate(childId, child, excludedNodeIds);
|
|
183
|
+
if (!candidate)
|
|
184
|
+
continue;
|
|
185
|
+
const key = materialSetKey(candidate.materials);
|
|
186
|
+
const bucket = grouped.get(key);
|
|
187
|
+
if (bucket)
|
|
188
|
+
bucket.push(candidate);
|
|
189
|
+
else
|
|
190
|
+
grouped.set(key, [candidate]);
|
|
191
|
+
}
|
|
192
|
+
return grouped;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Walls on this level that no batch currently draws.
|
|
196
|
+
*
|
|
197
|
+
* Editing a wall drops it out of its batch — a group-list rewrite that touches
|
|
198
|
+
* no buffer — and it goes back to drawing itself. Re-sewing the level only
|
|
199
|
+
* pays off once enough walls have drifted out, so a single edit leaves the
|
|
200
|
+
* floor's merged mesh exactly where it was.
|
|
201
|
+
*/
|
|
202
|
+
function unbatchedWallCount(levelId, excludedNodeIds = EMPTY_IDS) {
|
|
203
|
+
const nodes = useScene.getState().nodes;
|
|
204
|
+
const level = nodes[levelId];
|
|
205
|
+
if (level?.type !== 'level')
|
|
206
|
+
return 0;
|
|
207
|
+
let count = 0;
|
|
208
|
+
for (const childId of level.children) {
|
|
209
|
+
if (excludedNodeIds.has(childId))
|
|
210
|
+
continue;
|
|
211
|
+
if (batchByNode.has(childId))
|
|
212
|
+
continue;
|
|
213
|
+
const child = nodes[childId];
|
|
214
|
+
if (child?.type !== 'wall')
|
|
215
|
+
continue;
|
|
216
|
+
if (toCandidate(childId, child))
|
|
217
|
+
count++;
|
|
218
|
+
}
|
|
219
|
+
return count;
|
|
220
|
+
}
|
|
221
|
+
const localMatrix = new Matrix4();
|
|
222
|
+
const rootInverse = new Matrix4();
|
|
223
|
+
function mergeLevel(levelId, excludedNodeIds = EMPTY_IDS) {
|
|
224
|
+
disposeLevelBatches(levelId);
|
|
225
|
+
const root = sceneRegistry.nodes.get(levelId);
|
|
226
|
+
if (!root)
|
|
227
|
+
return;
|
|
228
|
+
root.updateWorldMatrix(true, false);
|
|
229
|
+
rootInverse.copy(root.matrixWorld).invert();
|
|
230
|
+
const records = [];
|
|
231
|
+
for (const candidates of collectWallBatchCandidates(levelId, excludedNodeIds).values()) {
|
|
232
|
+
if (candidates.length < MIN_BATCH_WALLS)
|
|
233
|
+
continue;
|
|
234
|
+
const sources = candidates.map((candidate) => {
|
|
235
|
+
candidate.mesh.updateWorldMatrix(true, false);
|
|
236
|
+
return {
|
|
237
|
+
nodeId: candidate.nodeId,
|
|
238
|
+
geometry: candidate.mesh.geometry,
|
|
239
|
+
matrix: localMatrix.multiplyMatrices(rootInverse, candidate.mesh.matrixWorld).clone(),
|
|
240
|
+
};
|
|
241
|
+
});
|
|
242
|
+
const batch = buildWallBatch(sources);
|
|
243
|
+
if (!batch)
|
|
244
|
+
continue;
|
|
245
|
+
const mesh = new Mesh(batch.geometry, candidates[0].materials);
|
|
246
|
+
mesh.name = 'wall-batch';
|
|
247
|
+
mesh.userData.pascalExport = 'strip';
|
|
248
|
+
mesh.castShadow = true;
|
|
249
|
+
mesh.receiveShadow = true;
|
|
250
|
+
mesh.matrixAutoUpdate = false;
|
|
251
|
+
mesh.raycast = skipRaycast;
|
|
252
|
+
root.add(mesh);
|
|
253
|
+
const record = {
|
|
254
|
+
levelId,
|
|
255
|
+
mesh,
|
|
256
|
+
batch,
|
|
257
|
+
hidden: new Set(),
|
|
258
|
+
nodeIds: candidates.map((candidate) => candidate.nodeId),
|
|
259
|
+
};
|
|
260
|
+
records.push(record);
|
|
261
|
+
for (const candidate of candidates) {
|
|
262
|
+
hideBatchedWall(candidate.mesh);
|
|
263
|
+
batchByNode.set(candidate.nodeId, record);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (records.length > 0)
|
|
267
|
+
batchesByLevel.set(levelId, records);
|
|
268
|
+
}
|
|
269
|
+
export const WallBatchSystem = () => {
|
|
270
|
+
const invalidate = useThree((state) => state.invalidate);
|
|
271
|
+
const wakeRef = useRef(null);
|
|
272
|
+
useFrame(() => runBatchFrame(invalidate, wakeRef), 5);
|
|
273
|
+
// Captures and exports clone the scene and prune whatever is off the scene
|
|
274
|
+
// layer, so the sources come back for the capture and go under again after
|
|
275
|
+
// it. The node batch used to reveal them as a side effect of its own sweep
|
|
276
|
+
// (shared hold reason) and nothing ever re-hid them: every batched wall
|
|
277
|
+
// drew twice for the rest of the session.
|
|
278
|
+
useEffect(() => {
|
|
279
|
+
emitter.on('thumbnail:before-capture', revealBatchedWallsForCapture);
|
|
280
|
+
emitter.on('thumbnail:after-capture', holdBatchedWallsAfterCapture);
|
|
281
|
+
return () => {
|
|
282
|
+
emitter.off('thumbnail:before-capture', revealBatchedWallsForCapture);
|
|
283
|
+
emitter.off('thumbnail:after-capture', holdBatchedWallsAfterCapture);
|
|
284
|
+
};
|
|
285
|
+
}, []);
|
|
286
|
+
// Scripted-probe hook, ?perf sessions only (mirrors __itemBatch): the
|
|
287
|
+
// panel has no row for the merged wall batch, so probes read it here.
|
|
288
|
+
useEffect(() => {
|
|
289
|
+
if (!new URLSearchParams(window.location.search).has('perf'))
|
|
290
|
+
return;
|
|
291
|
+
const probe = {
|
|
292
|
+
stats: () => {
|
|
293
|
+
let batches = 0;
|
|
294
|
+
for (const records of batchesByLevel.values())
|
|
295
|
+
batches += records.length;
|
|
296
|
+
let hidden = 0;
|
|
297
|
+
for (const nodeId of sceneRegistry.byType.wall ?? EMPTY_IDS) {
|
|
298
|
+
if (sceneRegistry.nodes.get(nodeId)?.userData.wallHidden === true)
|
|
299
|
+
hidden++;
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
walls: batchByNode.size,
|
|
303
|
+
batches,
|
|
304
|
+
levels: batchesByLevel.size,
|
|
305
|
+
hidden,
|
|
306
|
+
suspended: batchingSuspended,
|
|
307
|
+
wallMode: useViewer.getState().wallMode,
|
|
308
|
+
};
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
window.__wallBatch = probe;
|
|
312
|
+
return () => {
|
|
313
|
+
delete window.__wallBatch;
|
|
314
|
+
};
|
|
315
|
+
}, []);
|
|
316
|
+
useEffect(() => () => {
|
|
317
|
+
if (wakeRef.current)
|
|
318
|
+
clearTimeout(wakeRef.current);
|
|
319
|
+
for (const levelId of [...batchesByLevel.keys()])
|
|
320
|
+
disposeLevelBatches(levelId);
|
|
321
|
+
changedWalls.clear();
|
|
322
|
+
staleLevels.clear();
|
|
323
|
+
lastCutawayHiddenWalls = EMPTY_IDS;
|
|
324
|
+
knownWallCount = -1;
|
|
325
|
+
batchingSuspended = false;
|
|
326
|
+
lastAppearance.shading = undefined;
|
|
327
|
+
lastAppearance.textures = undefined;
|
|
328
|
+
lastAppearance.colorPreset = undefined;
|
|
329
|
+
lastAppearance.sceneTheme = undefined;
|
|
330
|
+
lastAppearance.materials = null;
|
|
331
|
+
}, []);
|
|
332
|
+
return null;
|
|
333
|
+
};
|
|
334
|
+
/**
|
|
335
|
+
* Follows the scene's dirty tracking rather than watching the walls itself.
|
|
336
|
+
*
|
|
337
|
+
* A wall changes for exactly one reason the merged mesh cares about: the wall
|
|
338
|
+
* system rebuilt its geometry. That system already runs off `dirtyNodes`, so
|
|
339
|
+
* this reads the same signal from both ends — the marks still standing when
|
|
340
|
+
* this frame reaches us, and the rebuild notices the wall system left behind
|
|
341
|
+
* for the walls whose marks it has already cleared. Nothing here re-derives
|
|
342
|
+
* "did this wall move" on its own, and the per-frame cost is the size of the
|
|
343
|
+
* dirty set rather than the size of the floor.
|
|
344
|
+
*/
|
|
345
|
+
export function runBatchFrame(invalidate, wakeRef) {
|
|
346
|
+
const wallIds = sceneRegistry.byType.wall ?? EMPTY_IDS;
|
|
347
|
+
const nodes = useScene.getState().nodes;
|
|
348
|
+
// Walls the wall system rebuilt: it clears each mark as it goes, so by the
|
|
349
|
+
// time this runs the store no longer names them.
|
|
350
|
+
drainRebuiltWalls(changedWalls);
|
|
351
|
+
// Walls still marked: the wall system deferred them to a later frame (a
|
|
352
|
+
// progressive import) or their mesh had not mounted yet.
|
|
353
|
+
for (const nodeId of useScene.getState().dirtyNodes) {
|
|
354
|
+
if (wallIds.has(nodeId))
|
|
355
|
+
changedWalls.add(nodeId);
|
|
356
|
+
}
|
|
357
|
+
let changed = changedWalls.size > 0;
|
|
358
|
+
for (const nodeId of changedWalls) {
|
|
359
|
+
const record = batchByNode.get(nodeId);
|
|
360
|
+
if (record)
|
|
361
|
+
staleLevels.add(record.levelId);
|
|
362
|
+
const node = nodes[nodeId];
|
|
363
|
+
if (node?.type === 'wall' && node.parentId)
|
|
364
|
+
staleLevels.add(node.parentId);
|
|
365
|
+
releaseWall(nodeId);
|
|
366
|
+
}
|
|
367
|
+
changedWalls.clear();
|
|
368
|
+
// A tinted wall paints itself through materials the merged mesh never reads,
|
|
369
|
+
// so it goes back to drawing its own geometry for as long as it is lit. It
|
|
370
|
+
// stays out afterwards: one wall short of a batch is not worth re-sewing a
|
|
371
|
+
// floor over, and the level's own re-merge threshold decides when it is.
|
|
372
|
+
const tintedWalls = collectTintedWalls(wallIds);
|
|
373
|
+
for (const nodeId of tintedWalls) {
|
|
374
|
+
if (!batchByNode.has(nodeId))
|
|
375
|
+
continue;
|
|
376
|
+
const record = batchByNode.get(nodeId);
|
|
377
|
+
if (record)
|
|
378
|
+
staleLevels.add(record.levelId);
|
|
379
|
+
releaseWall(nodeId);
|
|
380
|
+
changed = true;
|
|
381
|
+
}
|
|
382
|
+
// Only cutaway hides walls one by one; `up` hides none and the other modes
|
|
383
|
+
// stand the batch down, so the stamp scan is worth a frame only there.
|
|
384
|
+
const cutawayHiddenWalls = new Set();
|
|
385
|
+
if (useViewer.getState().wallMode === 'cutaway') {
|
|
386
|
+
for (const nodeId of wallIds) {
|
|
387
|
+
const mesh = sceneRegistry.nodes.get(nodeId);
|
|
388
|
+
if (mesh?.userData.wallHidden === true)
|
|
389
|
+
cutawayHiddenWalls.add(nodeId);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
for (const nodeId of cutawayHiddenWalls) {
|
|
393
|
+
const record = batchByNode.get(nodeId);
|
|
394
|
+
if (!record)
|
|
395
|
+
continue;
|
|
396
|
+
releaseWall(nodeId);
|
|
397
|
+
staleLevels.add(record.levelId);
|
|
398
|
+
changed = true;
|
|
399
|
+
}
|
|
400
|
+
// A stamp that lifts hands the wall back to its own draw call, and nothing
|
|
401
|
+
// else marks the level — so the flip itself has to, or the wall would stay
|
|
402
|
+
// out of the merged mesh until an unrelated edit re-sews the floor.
|
|
403
|
+
for (const nodeId of lastCutawayHiddenWalls) {
|
|
404
|
+
if (cutawayHiddenWalls.has(nodeId))
|
|
405
|
+
continue;
|
|
406
|
+
const node = nodes[nodeId];
|
|
407
|
+
if (node?.type === 'wall' && node.parentId)
|
|
408
|
+
staleLevels.add(node.parentId);
|
|
409
|
+
changed = true;
|
|
410
|
+
}
|
|
411
|
+
lastCutawayHiddenWalls = cutawayHiddenWalls;
|
|
412
|
+
const excludedNodeIds = new Set(cutawayHiddenWalls);
|
|
413
|
+
for (const nodeId of tintedWalls)
|
|
414
|
+
excludedNodeIds.add(nodeId);
|
|
415
|
+
// A theme, texture or material-library switch re-makes every wall's
|
|
416
|
+
// materials without marking a single node, so the merged copies have to be
|
|
417
|
+
// sewn again from the new ones. See `appearanceChanged`.
|
|
418
|
+
if (appearanceChanged()) {
|
|
419
|
+
for (const levelId of [...batchesByLevel.keys()])
|
|
420
|
+
disposeLevelBatches(levelId);
|
|
421
|
+
for (const levelId of sceneRegistry.byType.level ?? EMPTY_IDS)
|
|
422
|
+
staleLevels.add(levelId);
|
|
423
|
+
changed = true;
|
|
424
|
+
}
|
|
425
|
+
// A wall that left the scene carries no mark of its own — deleting one
|
|
426
|
+
// dirties the neighbours it re-mitres, not the node that went away. The
|
|
427
|
+
// wall count moving is the cheap tell that the batch needs reconciling.
|
|
428
|
+
if (wallIds.size !== knownWallCount) {
|
|
429
|
+
knownWallCount = wallIds.size;
|
|
430
|
+
for (const [nodeId, record] of [...batchByNode]) {
|
|
431
|
+
if (wallIds.has(nodeId))
|
|
432
|
+
continue;
|
|
433
|
+
staleLevels.add(record.levelId);
|
|
434
|
+
releaseWall(nodeId);
|
|
435
|
+
changed = true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// Isolation, `down` and `translucent` make batching unsound, so the batch
|
|
439
|
+
// stands down while they hold and sews the floors back together once they
|
|
440
|
+
// lift. `cutaway` stays live because WallCutout stamps hidden walls at
|
|
441
|
+
// priority 0 and this system releases them per wall at priority 5 in the
|
|
442
|
+
// same frame. See `canBatchWalls`.
|
|
443
|
+
const suspended = !canBatchWalls(useViewer.getState().wallMode, isIsolationActive());
|
|
444
|
+
if (suspended !== batchingSuspended) {
|
|
445
|
+
batchingSuspended = suspended;
|
|
446
|
+
for (const levelId of [...batchesByLevel.keys()])
|
|
447
|
+
disposeLevelBatches(levelId);
|
|
448
|
+
staleLevels.clear();
|
|
449
|
+
if (!suspended) {
|
|
450
|
+
for (const levelId of sceneRegistry.byType.level ?? EMPTY_IDS)
|
|
451
|
+
staleLevels.add(levelId);
|
|
452
|
+
}
|
|
453
|
+
changed = true;
|
|
454
|
+
}
|
|
455
|
+
if (batchingSuspended) {
|
|
456
|
+
staleLevels.clear();
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
const now = performance.now();
|
|
460
|
+
if (changed)
|
|
461
|
+
lastWallChangeAtMs = now;
|
|
462
|
+
if (staleLevels.size === 0)
|
|
463
|
+
return;
|
|
464
|
+
// Merging mid-edit would sew stale geometry in: a dragged wall's neighbours
|
|
465
|
+
// are deferred to the wall system's trailing-edge flush, and those rebuilds
|
|
466
|
+
// land after the drag's last dirty mark. Waiting on its queue — not just on
|
|
467
|
+
// a clock — is what keeps a re-sewn floor in step with the walls it copies.
|
|
468
|
+
const settled = !changed && getPendingWallRebuildCount() === 0 && now - lastWallChangeAtMs >= BATCH_SETTLE_MS;
|
|
469
|
+
if (!settled) {
|
|
470
|
+
// The canvas renders on demand, so nothing would bring us back once the
|
|
471
|
+
// scene goes quiet — poke one frame after the window should have closed.
|
|
472
|
+
if (wakeRef.current)
|
|
473
|
+
clearTimeout(wakeRef.current);
|
|
474
|
+
wakeRef.current = setTimeout(() => {
|
|
475
|
+
wakeRef.current = null;
|
|
476
|
+
invalidate();
|
|
477
|
+
}, BATCH_SETTLE_MS + 20);
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
for (const levelId of staleLevels) {
|
|
481
|
+
if (unbatchedWallCount(levelId, excludedNodeIds) >= MIN_BATCH_WALLS) {
|
|
482
|
+
mergeLevel(levelId, excludedNodeIds);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
staleLevels.clear();
|
|
486
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/** A contiguous vertex range one wall contributes to one material run. */
|
|
3
|
+
export type WallBatchSlice = {
|
|
4
|
+
nodeId: string;
|
|
5
|
+
start: number;
|
|
6
|
+
count: number;
|
|
7
|
+
};
|
|
8
|
+
/** Every triangle drawn with one material index, in wall order. */
|
|
9
|
+
export type WallBatchRun = {
|
|
10
|
+
materialIndex: number;
|
|
11
|
+
start: number;
|
|
12
|
+
count: number;
|
|
13
|
+
slices: WallBatchSlice[];
|
|
14
|
+
};
|
|
15
|
+
export type WallBatchSource = {
|
|
16
|
+
nodeId: string;
|
|
17
|
+
geometry: THREE.BufferGeometry;
|
|
18
|
+
/** Source-local to batch-root transform, baked into the merged vertices. */
|
|
19
|
+
matrix: THREE.Matrix4;
|
|
20
|
+
};
|
|
21
|
+
export type WallBatch = {
|
|
22
|
+
geometry: THREE.BufferGeometry;
|
|
23
|
+
runs: WallBatchRun[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Concatenates wall geometries into one buffer laid out material-major,
|
|
27
|
+
* wall-minor: every triangle sharing a material index ends up in a single
|
|
28
|
+
* contiguous run, so the merged mesh costs one draw call per material
|
|
29
|
+
* instead of one per wall per material.
|
|
30
|
+
*
|
|
31
|
+
* Vertices are baked into the batch root's frame, so the merged mesh needs
|
|
32
|
+
* no transform of its own. Each wall's slice of every run is recorded, which
|
|
33
|
+
* is what lets a single wall be pulled back out later without touching the
|
|
34
|
+
* buffers — see `applyWallBatchGroups`.
|
|
35
|
+
*
|
|
36
|
+
* Sources must be non-indexed (the wall pipeline's `applyWorldPlanarWallUVs`
|
|
37
|
+
* already de-indexes) and are skipped if they carry no positions.
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildWallBatch(sources: readonly WallBatchSource[]): WallBatch | null;
|
|
40
|
+
/**
|
|
41
|
+
* Rewrites the merged geometry's draw groups so the listed walls are skipped.
|
|
42
|
+
*
|
|
43
|
+
* Pulling a wall out of the batch is what happens while it is being dragged:
|
|
44
|
+
* it goes back to drawing itself, and the merged mesh has to stop drawing it
|
|
45
|
+
* or the two would overlap. Because each wall owns a contiguous slice of each
|
|
46
|
+
* run, skipping it is a matter of splitting that run around the hole — no
|
|
47
|
+
* vertex data moves and nothing is re-uploaded to the GPU, so a drag costs a
|
|
48
|
+
* handful of group objects rather than a rebuild of the floor.
|
|
49
|
+
*
|
|
50
|
+
* Each hidden wall adds at most one extra group (one extra draw call) per run,
|
|
51
|
+
* so callers should re-merge once the holes stop being temporary.
|
|
52
|
+
*/
|
|
53
|
+
export declare function applyWallBatchGroups(batch: WallBatch, hidden: ReadonlySet<string>): void;
|
|
54
|
+
/**
|
|
55
|
+
* Silences a wall the batch now draws.
|
|
56
|
+
*
|
|
57
|
+
* Emptying the draw range is not enough — three.js still submits a zero-count
|
|
58
|
+
* group, so 1000 muted walls cost 1000 draw calls. `visible = false` would
|
|
59
|
+
* cost nothing but takes the wall's children (cutters, treatments) down with
|
|
60
|
+
* it. Moving the mesh alone off the scene layer skips it in every pass while
|
|
61
|
+
* its subtree keeps rendering and picking.
|
|
62
|
+
*/
|
|
63
|
+
export declare function hideBatchedWall(mesh: THREE.Object3D): void;
|
|
64
|
+
/** Hands a wall back its own draw call — unless solo or isolation still hide it. */
|
|
65
|
+
export declare function revealBatchedWall(mesh: THREE.Object3D): void;
|
|
66
|
+
//# sourceMappingURL=wall-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-batch.d.ts","sourceRoot":"","sources":["../../src/wall/wall-batch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7E,mEAAmE;AACnE,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAA;IAC9B,4EAA4E;IAC5E,MAAM,EAAE,KAAK,CAAC,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAA;IAC9B,IAAI,EAAE,YAAY,EAAE,CAAA;CACrB,CAAA;AAkCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,GAAG,IAAI,CAmEpF;AAwCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAmBxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAE5D"}
|