@pascal-app/nodes 1.0.3 → 1.0.4
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/dist/block/definition.d.ts.map +1 -1
- package/dist/block/definition.js +18 -3
- package/dist/block/floorplan.d.ts +11 -1
- package/dist/block/floorplan.d.ts.map +1 -1
- package/dist/block/floorplan.js +81 -13
- package/dist/block/geometry.d.ts +2 -2
- package/dist/block/geometry.d.ts.map +1 -1
- package/dist/block/geometry.js +39 -24
- package/dist/block/hosted-edit.d.ts.map +1 -1
- package/dist/block/hosted-edit.js +25 -0
- package/dist/block/material-slots.d.ts +1 -3
- package/dist/block/material-slots.d.ts.map +1 -1
- package/dist/block/material-slots.js +1 -11
- package/dist/block/paint.d.ts.map +1 -1
- package/dist/block/paint.js +4 -10
- package/dist/block/panel.d.ts.map +1 -1
- package/dist/block/panel.js +8 -3
- package/dist/block/selection.d.ts.map +1 -1
- package/dist/block/selection.js +2 -2
- package/dist/box-vent/definition.d.ts.map +1 -1
- package/dist/box-vent/definition.js +2 -5
- package/dist/box-vent/panel.d.ts.map +1 -1
- package/dist/box-vent/panel.js +5 -28
- package/dist/cabinet/countertop-layout.d.ts +13 -2
- package/dist/cabinet/countertop-layout.d.ts.map +1 -1
- package/dist/cabinet/definition.d.ts.map +1 -1
- package/dist/cabinet/definition.js +1 -2
- package/dist/cabinet/floorplan.d.ts.map +1 -1
- package/dist/cabinet/floorplan.js +125 -28
- package/dist/cabinet/geometry/shared.d.ts +1 -2
- package/dist/cabinet/geometry/shared.d.ts.map +1 -1
- package/dist/cabinet/geometry/shared.js +1 -2
- package/dist/cabinet/run-layout.d.ts.map +1 -1
- package/dist/cabinet/run-layout.js +8 -5
- package/dist/cabinet/run-ops.d.ts +13 -2
- package/dist/cabinet/run-ops.d.ts.map +1 -1
- package/dist/cabinet/tool.d.ts.map +1 -1
- package/dist/cabinet/tool.js +22 -24
- package/dist/cabinet/wall-snap.d.ts.map +1 -1
- package/dist/cabinet/wall-snap.js +8 -8
- package/dist/ceiling/boundary-editor.d.ts.map +1 -1
- package/dist/ceiling/boundary-editor.js +5 -3
- package/dist/ceiling/definition.d.ts +4 -4
- package/dist/ceiling/definition.d.ts.map +1 -1
- package/dist/ceiling/definition.js +15 -15
- package/dist/ceiling/floorplan-affordances.d.ts +84 -4
- package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
- package/dist/ceiling/floorplan-affordances.js +0 -1
- package/dist/ceiling/floorplan-move.d.ts.map +1 -1
- package/dist/ceiling/floorplan-move.js +0 -1
- package/dist/ceiling/floorplan.d.ts +1 -1
- package/dist/ceiling/floorplan.d.ts.map +1 -1
- package/dist/ceiling/floorplan.js +2 -1
- package/dist/ceiling/height-bounds.d.ts +19 -0
- package/dist/ceiling/height-bounds.d.ts.map +1 -0
- package/dist/ceiling/height-bounds.js +24 -0
- package/dist/ceiling/hole-editor.d.ts.map +1 -1
- package/dist/ceiling/hole-editor.js +3 -4
- package/dist/ceiling/materials.d.ts +1 -1
- package/dist/ceiling/materials.d.ts.map +1 -1
- package/dist/ceiling/materials.js +10 -3
- package/dist/ceiling/paint.d.ts +2 -8
- package/dist/ceiling/paint.d.ts.map +1 -1
- package/dist/ceiling/paint.js +121 -24
- package/dist/ceiling/panel.d.ts.map +1 -1
- package/dist/ceiling/panel.js +40 -23
- package/dist/ceiling/renderer.d.ts.map +1 -1
- package/dist/ceiling/renderer.js +41 -5
- package/dist/chimney/move-tool.d.ts.map +1 -1
- package/dist/chimney/move-tool.js +8 -2
- package/dist/chimney/paint.d.ts.map +1 -1
- package/dist/chimney/paint.js +3 -10
- package/dist/column/definition.d.ts.map +1 -1
- package/dist/column/definition.js +24 -2
- package/dist/column/floorplan-affordances.d.ts.map +1 -1
- package/dist/column/floorplan-affordances.js +5 -0
- package/dist/column/floorplan.d.ts +1 -1
- package/dist/column/floorplan.d.ts.map +1 -1
- package/dist/column/floorplan.js +47 -2
- package/dist/column/hosted-resize.d.ts +101 -2
- package/dist/column/hosted-resize.d.ts.map +1 -1
- package/dist/column/panel.d.ts.map +1 -1
- package/dist/column/panel.js +147 -146
- package/dist/column/renderer.d.ts.map +1 -1
- package/dist/column/renderer.js +6 -4
- package/dist/column/surface.d.ts.map +1 -1
- package/dist/column/surface.js +7 -0
- package/dist/construction-dimension/floorplan.js +7 -3
- package/dist/cupola/definition.d.ts.map +1 -1
- package/dist/cupola/definition.js +2 -8
- package/dist/cupola/panel.d.ts.map +1 -1
- package/dist/cupola/panel.js +5 -23
- package/dist/door/definition.d.ts.map +1 -1
- package/dist/door/definition.js +12 -3
- package/dist/door/door-math.d.ts +5 -10
- package/dist/door/door-math.d.ts.map +1 -1
- package/dist/door/door-math.js +14 -15
- package/dist/door/floorplan-move.d.ts.map +1 -1
- package/dist/door/floorplan-move.js +3 -1
- package/dist/door/floorplan.d.ts.map +1 -1
- package/dist/door/floorplan.js +55 -21
- package/dist/door/mechanism.d.ts +4 -0
- package/dist/door/mechanism.d.ts.map +1 -0
- package/dist/door/mechanism.js +24 -0
- package/dist/door/move-tool.d.ts.map +1 -1
- package/dist/door/move-tool.js +72 -48
- package/dist/door/paint.d.ts.map +1 -1
- package/dist/door/paint.js +3 -0
- package/dist/door/panel.d.ts.map +1 -1
- package/dist/door/panel.js +34 -259
- package/dist/door/placement.d.ts +45 -0
- package/dist/door/placement.d.ts.map +1 -0
- package/dist/door/placement.js +51 -0
- package/dist/door/preview.d.ts.map +1 -1
- package/dist/door/preview.js +2 -0
- package/dist/door/renderer.d.ts.map +1 -1
- package/dist/door/renderer.js +3 -2
- package/dist/door/tool.d.ts.map +1 -1
- package/dist/door/tool.js +92 -21
- package/dist/dormer/csg-geometry.d.ts.map +1 -1
- package/dist/dormer/csg-geometry.js +2 -0
- package/dist/dormer/paint.d.ts.map +1 -1
- package/dist/dormer/paint.js +2 -5
- package/dist/dormer/panel.d.ts.map +1 -1
- package/dist/dormer/panel.js +4 -14
- package/dist/downspout/definition.d.ts.map +1 -1
- package/dist/downspout/definition.js +2 -2
- package/dist/duct-fitting/definition.d.ts.map +1 -1
- package/dist/duct-fitting/definition.js +2 -1
- package/dist/duct-fitting/geometry.d.ts.map +1 -1
- package/dist/duct-fitting/geometry.js +1 -1
- package/dist/duct-fitting/move-tool.d.ts.map +1 -1
- package/dist/duct-fitting/move-tool.js +8 -2
- package/dist/duct-segment/definition.d.ts.map +1 -1
- package/dist/duct-segment/definition.js +2 -2
- package/dist/duct-segment/geometry.d.ts.map +1 -1
- package/dist/duct-segment/geometry.js +1 -1
- package/dist/duct-segment/move-tool.d.ts.map +1 -1
- package/dist/duct-segment/move-tool.js +8 -2
- package/dist/elevator/definition.d.ts.map +1 -1
- package/dist/elevator/definition.js +1 -2
- package/dist/elevator/panel.d.ts.map +1 -1
- package/dist/elevator/panel.js +5 -27
- package/dist/elevator/parametrics.js +1 -1
- package/dist/elevator/renderer.d.ts.map +1 -1
- package/dist/elevator/renderer.js +3 -4
- package/dist/eyebrow-vent/definition.d.ts.map +1 -1
- package/dist/eyebrow-vent/definition.js +2 -5
- package/dist/eyebrow-vent/paint.d.ts.map +1 -1
- package/dist/eyebrow-vent/paint.js +3 -6
- package/dist/eyebrow-vent/panel.d.ts.map +1 -1
- package/dist/eyebrow-vent/panel.js +5 -23
- package/dist/fence/actions/move-endpoint.d.ts +1 -1
- package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
- package/dist/fence/actions/move-endpoint.js +2 -1
- package/dist/fence/definition.d.ts +2 -1
- package/dist/fence/definition.d.ts.map +1 -1
- package/dist/fence/definition.js +83 -28
- package/dist/fence/drafting.d.ts +36 -0
- package/dist/fence/drafting.d.ts.map +1 -0
- package/dist/fence/drafting.js +210 -0
- package/dist/fence/feature-tool.d.ts +4 -0
- package/dist/fence/feature-tool.d.ts.map +1 -0
- package/dist/fence/feature-tool.js +140 -0
- package/dist/fence/features.d.ts +2 -0
- package/dist/fence/features.d.ts.map +1 -0
- package/dist/fence/features.js +12 -0
- package/dist/fence/floorplan-affordances.d.ts.map +1 -1
- package/dist/fence/floorplan-affordances.js +2 -1
- package/dist/fence/floorplan.d.ts +2 -3
- package/dist/fence/floorplan.d.ts.map +1 -1
- package/dist/fence/floorplan.js +131 -71
- package/dist/fence/geometry-parts.d.ts +50 -0
- package/dist/fence/geometry-parts.d.ts.map +1 -0
- package/dist/fence/geometry-parts.js +1144 -0
- package/dist/fence/geometry.d.ts +2 -3
- package/dist/fence/geometry.d.ts.map +1 -1
- package/dist/fence/geometry.js +84 -7
- package/dist/fence/index.d.ts +1 -0
- package/dist/fence/index.d.ts.map +1 -1
- package/dist/fence/index.js +1 -0
- package/dist/fence/inspector-editors.d.ts +15 -0
- package/dist/fence/inspector-editors.d.ts.map +1 -1
- package/dist/fence/inspector-editors.js +128 -3
- package/dist/fence/lift.d.ts.map +1 -1
- package/dist/fence/lift.js +5 -2
- package/dist/fence/move-tool.js +2 -1
- package/dist/fence/panel-model.d.ts +4 -0
- package/dist/fence/panel-model.d.ts.map +1 -0
- package/dist/fence/panel-model.js +12 -0
- package/dist/fence/parametrics.d.ts +0 -12
- package/dist/fence/parametrics.d.ts.map +1 -1
- package/dist/fence/parametrics.js +185 -18
- package/dist/fence/system.d.ts.map +1 -1
- package/dist/fence/system.js +141 -31
- package/dist/fence/tool.d.ts.map +1 -1
- package/dist/fence/tool.js +256 -47
- package/dist/fence-feature/actions.d.ts +7 -0
- package/dist/fence-feature/actions.d.ts.map +1 -0
- package/dist/fence-feature/actions.js +26 -0
- package/dist/fence-feature/definition.d.ts +4 -0
- package/dist/fence-feature/definition.d.ts.map +1 -0
- package/dist/fence-feature/definition.js +112 -0
- package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
- package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
- package/dist/fence-feature/floorplan-affordances.js +37 -0
- package/dist/fence-feature/floorplan.d.ts +4 -0
- package/dist/fence-feature/floorplan.d.ts.map +1 -0
- package/dist/fence-feature/floorplan.js +120 -0
- package/dist/fence-feature/geometry.d.ts +5 -0
- package/dist/fence-feature/geometry.d.ts.map +1 -0
- package/dist/fence-feature/geometry.js +43 -0
- package/dist/fence-feature/handles.d.ts +5 -0
- package/dist/fence-feature/handles.d.ts.map +1 -0
- package/dist/fence-feature/handles.js +84 -0
- package/dist/fence-feature/inspector.d.ts +6 -0
- package/dist/fence-feature/inspector.d.ts.map +1 -0
- package/dist/fence-feature/inspector.js +214 -0
- package/dist/fence-feature/interaction.d.ts +3 -0
- package/dist/fence-feature/interaction.d.ts.map +1 -0
- package/dist/fence-feature/interaction.js +41 -0
- package/dist/fence-feature/move-session.d.ts +9 -0
- package/dist/fence-feature/move-session.d.ts.map +1 -0
- package/dist/fence-feature/move-session.js +48 -0
- package/dist/fence-feature/move-tool.d.ts +5 -0
- package/dist/fence-feature/move-tool.d.ts.map +1 -0
- package/dist/fence-feature/move-tool.js +58 -0
- package/dist/fence-feature/pick-target.d.ts +7 -0
- package/dist/fence-feature/pick-target.d.ts.map +1 -0
- package/dist/fence-feature/pick-target.js +52 -0
- package/dist/floor-opening/definition.d.ts +3 -0
- package/dist/floor-opening/definition.d.ts.map +1 -0
- package/dist/floor-opening/definition.js +41 -0
- package/dist/floor-opening/floorplan.d.ts +156 -0
- package/dist/floor-opening/floorplan.d.ts.map +1 -0
- package/dist/floor-opening/floorplan.js +63 -0
- package/dist/gutter/definition.d.ts.map +1 -1
- package/dist/gutter/definition.js +2 -2
- package/dist/imported-mesh/definition.d.ts.map +1 -1
- package/dist/imported-mesh/definition.js +2 -0
- package/dist/imported-mesh/geometry.d.ts +1 -1
- package/dist/imported-mesh/geometry.d.ts.map +1 -1
- package/dist/imported-mesh/geometry.js +40 -12
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -2
- package/dist/item/authored-face-host.d.ts +10 -0
- package/dist/item/authored-face-host.d.ts.map +1 -0
- package/dist/item/authored-face-host.js +87 -0
- package/dist/item/authored-params.d.ts +15 -0
- package/dist/item/authored-params.d.ts.map +1 -0
- package/dist/item/authored-params.js +72 -0
- package/dist/item/definition.d.ts +2 -2
- package/dist/item/definition.d.ts.map +1 -1
- package/dist/item/definition.js +33 -4
- package/dist/item/floorplan.d.ts +1 -1
- package/dist/item/floorplan.d.ts.map +1 -1
- package/dist/item/floorplan.js +35 -5
- package/dist/item/index.d.ts +1 -0
- package/dist/item/index.d.ts.map +1 -1
- package/dist/item/index.js +1 -0
- package/dist/item/model-loader.d.ts +2 -0
- package/dist/item/model-loader.d.ts.map +1 -1
- package/dist/item/model-loader.js +55 -23
- package/dist/item/move-tool.js +4 -4
- package/dist/item/paint.d.ts.map +1 -1
- package/dist/item/paint.js +5 -24
- package/dist/item/panel.d.ts +1 -3
- package/dist/item/panel.d.ts.map +1 -1
- package/dist/item/panel.js +20 -24
- package/dist/item/placement-notice.d.ts +14 -0
- package/dist/item/placement-notice.d.ts.map +1 -0
- package/dist/item/placement-notice.js +38 -0
- package/dist/item/plan-symbols.d.ts +67 -0
- package/dist/item/plan-symbols.d.ts.map +1 -0
- package/dist/item/plan-symbols.js +407 -0
- package/dist/item/renderer.d.ts +10 -0
- package/dist/item/renderer.d.ts.map +1 -1
- package/dist/item/renderer.js +64 -38
- package/dist/item/script-param-defaults.d.ts +12 -0
- package/dist/item/script-param-defaults.d.ts.map +1 -0
- package/dist/item/script-param-defaults.js +34 -0
- package/dist/lean-to-extension/definition.d.ts.map +1 -1
- package/dist/lean-to-extension/definition.js +1 -2
- package/dist/lean-to-extension/geometry.d.ts.map +1 -1
- package/dist/lean-to-extension/geometry.js +1 -1
- package/dist/lean-to-extension/layout.d.ts.map +1 -1
- package/dist/lean-to-extension/layout.js +2 -3
- package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
- package/dist/lean-to-extension/placement-validation.js +5 -5
- package/dist/lean-to-extension/tool.d.ts.map +1 -1
- package/dist/lean-to-extension/tool.js +5 -5
- package/dist/lineset/move-tool.d.ts.map +1 -1
- package/dist/lineset/move-tool.js +8 -2
- package/dist/liquid-line/move-tool.d.ts.map +1 -1
- package/dist/liquid-line/move-tool.js +8 -2
- package/dist/measurement/definition.js +1 -1
- package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
- package/dist/pipe-fitting/move-tool.js +8 -2
- package/dist/pipe-segment/move-tool.d.ts.map +1 -1
- package/dist/pipe-segment/move-tool.js +8 -2
- package/dist/procedural-item/animation.d.ts +8 -0
- package/dist/procedural-item/animation.d.ts.map +1 -0
- package/dist/procedural-item/animation.js +116 -0
- package/dist/procedural-item/definition.d.ts.map +1 -1
- package/dist/procedural-item/definition.js +74 -8
- package/dist/procedural-item/geometry.d.ts +5 -1
- package/dist/procedural-item/geometry.d.ts.map +1 -1
- package/dist/procedural-item/geometry.js +239 -15
- package/dist/procedural-item/renderer.d.ts.map +1 -1
- package/dist/procedural-item/renderer.js +272 -23
- package/dist/ridge-vent/panel.d.ts.map +1 -1
- package/dist/ridge-vent/panel.js +5 -23
- package/dist/ridge-vent/renderer.d.ts.map +1 -1
- package/dist/ridge-vent/renderer.js +9 -8
- package/dist/roof/definition.d.ts.map +1 -1
- package/dist/roof/definition.js +4 -1
- package/dist/roof/floorplan.d.ts +8 -0
- package/dist/roof/floorplan.d.ts.map +1 -1
- package/dist/roof/floorplan.js +194 -18
- package/dist/roof/panel-model.d.ts.map +1 -1
- package/dist/roof/panel-model.js +10 -6
- package/dist/roof/panel.d.ts.map +1 -1
- package/dist/roof/panel.js +3 -10
- package/dist/roof/renderer.d.ts.map +1 -1
- package/dist/roof/renderer.js +5 -2
- package/dist/roof-segment/panel.d.ts.map +1 -1
- package/dist/roof-segment/panel.js +5 -24
- package/dist/roof-segment/renderer.d.ts.map +1 -1
- package/dist/roof-segment/renderer.js +17 -8
- package/dist/separator/definition.d.ts +3 -0
- package/dist/separator/definition.d.ts.map +1 -0
- package/dist/separator/definition.js +39 -0
- package/dist/separator/renderer.d.ts +5 -0
- package/dist/separator/renderer.d.ts.map +1 -0
- package/dist/separator/renderer.js +36 -0
- package/dist/shared/duct-body-paint.d.ts +0 -4
- package/dist/shared/duct-body-paint.d.ts.map +1 -1
- package/dist/shared/duct-body-paint.js +1 -5
- package/dist/shared/item-interaction-actions.d.ts +6 -0
- package/dist/shared/item-interaction-actions.d.ts.map +1 -0
- package/dist/shared/item-interaction-actions.js +27 -0
- package/dist/shared/item-interactions.d.ts +9 -0
- package/dist/shared/item-interactions.d.ts.map +1 -0
- package/dist/shared/item-interactions.js +74 -0
- package/dist/shared/item-light-placement.d.ts +2 -0
- package/dist/shared/item-light-placement.d.ts.map +1 -0
- package/dist/shared/item-light-placement.js +3 -0
- package/dist/shared/move-roof-tool.js +2 -1
- package/dist/shared/node-batch/batchable.d.ts +12 -0
- package/dist/shared/node-batch/batchable.d.ts.map +1 -0
- package/dist/shared/node-batch/batchable.js +41 -0
- package/dist/shared/node-batch/candidates.d.ts +7 -5
- package/dist/shared/node-batch/candidates.d.ts.map +1 -1
- package/dist/shared/node-batch/candidates.js +43 -59
- package/dist/shared/node-batch/release.d.ts +8 -0
- package/dist/shared/node-batch/release.d.ts.map +1 -0
- package/dist/shared/node-batch/release.js +16 -0
- package/dist/shared/node-batch/system.d.ts.map +1 -1
- package/dist/shared/node-batch/system.js +17 -12
- package/dist/shared/node-batch/types.d.ts +4 -1
- package/dist/shared/node-batch/types.d.ts.map +1 -1
- package/dist/shared/opening-documentation.d.ts +13 -1
- package/dist/shared/opening-documentation.d.ts.map +1 -1
- package/dist/shared/opening-documentation.js +245 -59
- package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
- package/dist/shared/opening-guides-runtime.js +17 -14
- package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
- package/dist/shared/opening-placement-dimensions.js +3 -3
- package/dist/shared/opening-plane-offset.d.ts +23 -0
- package/dist/shared/opening-plane-offset.d.ts.map +1 -0
- package/dist/shared/opening-plane-offset.js +24 -0
- package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
- package/dist/shared/polygon-centroid-move.js +4 -1
- package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
- package/dist/shared/polygon-vertex-affordance.js +19 -15
- package/dist/shared/run-hangers.d.ts.map +1 -1
- package/dist/shared/run-hangers.js +5 -4
- package/dist/shared/scripted-opening-handles.d.ts +18 -0
- package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
- package/dist/shared/scripted-opening-handles.js +53 -0
- package/dist/shared/scripted-opening.d.ts +25 -0
- package/dist/shared/scripted-opening.d.ts.map +1 -0
- package/dist/shared/scripted-opening.js +72 -0
- package/dist/shared/slot-paint.d.ts +14 -2
- package/dist/shared/slot-paint.d.ts.map +1 -1
- package/dist/shared/slot-paint.js +29 -29
- package/dist/shared/surface-paint.d.ts.map +1 -1
- package/dist/shared/surface-paint.js +2 -5
- package/dist/shared/swap-preview-material.d.ts +11 -0
- package/dist/shared/swap-preview-material.d.ts.map +1 -0
- package/dist/shared/swap-preview-material.js +16 -0
- package/dist/shared/system-checks.d.ts.map +1 -1
- package/dist/shared/system-checks.js +5 -3
- package/dist/shared/wall-attach-target.d.ts +3 -10
- package/dist/shared/wall-attach-target.d.ts.map +1 -1
- package/dist/shared/wall-attach-target.js +3 -63
- package/dist/shared/wall-opening-ceiling.d.ts +5 -15
- package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
- package/dist/shared/wall-opening-ceiling.js +10 -18
- package/dist/shelf/definition.d.ts.map +1 -1
- package/dist/shelf/definition.js +1 -1
- package/dist/shelf/geometry.d.ts.map +1 -1
- package/dist/shelf/geometry.js +1 -2
- package/dist/shelf/paint.d.ts.map +1 -1
- package/dist/shelf/paint.js +4 -10
- package/dist/site/line-ribbon.d.ts +31 -0
- package/dist/site/line-ribbon.d.ts.map +1 -0
- package/dist/site/line-ribbon.js +117 -0
- package/dist/site/lot-mask.d.ts +18 -0
- package/dist/site/lot-mask.d.ts.map +1 -0
- package/dist/site/lot-mask.js +35 -0
- package/dist/site/panel.d.ts +10 -0
- package/dist/site/panel.d.ts.map +1 -0
- package/dist/site/panel.js +155 -0
- package/dist/site/parametrics.d.ts +7 -0
- package/dist/site/parametrics.d.ts.map +1 -1
- package/dist/site/parametrics.js +8 -0
- package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
- package/dist/site/recessed-slab-ground-holes.js +5 -2
- package/dist/site/renderer.d.ts.map +1 -1
- package/dist/site/renderer.js +150 -19
- package/dist/site/setbacks.d.ts +33 -0
- package/dist/site/setbacks.d.ts.map +1 -0
- package/dist/site/setbacks.js +204 -0
- package/dist/site/terrain-geometry.d.ts +28 -1
- package/dist/site/terrain-geometry.d.ts.map +1 -1
- package/dist/site/terrain-geometry.js +78 -4
- package/dist/site/terrain-holes.d.ts +15 -0
- package/dist/site/terrain-holes.d.ts.map +1 -0
- package/dist/site/terrain-holes.js +74 -0
- package/dist/site/terrain-mesh.d.ts +9 -2
- package/dist/site/terrain-mesh.d.ts.map +1 -1
- package/dist/site/terrain-mesh.js +36 -9
- package/dist/site/terrain-renderer.d.ts +9 -2
- package/dist/site/terrain-renderer.d.ts.map +1 -1
- package/dist/site/terrain-renderer.js +14 -4
- package/dist/slab/boundary-editor.d.ts +1 -1
- package/dist/slab/boundary-editor.d.ts.map +1 -1
- package/dist/slab/boundary-editor.js +13 -13
- package/dist/slab/definition.d.ts.map +1 -1
- package/dist/slab/definition.js +19 -3
- package/dist/slab/dependency-tracker.d.ts.map +1 -1
- package/dist/slab/dependency-tracker.js +67 -7
- package/dist/slab/elevation-limit.d.ts.map +1 -1
- package/dist/slab/elevation-limit.js +2 -2
- package/dist/slab/floorplan-affordances.d.ts +176 -4
- package/dist/slab/floorplan-affordances.d.ts.map +1 -1
- package/dist/slab/floorplan-affordances.js +0 -1
- package/dist/slab/floorplan-move.d.ts.map +1 -1
- package/dist/slab/floorplan-move.js +3 -4
- package/dist/slab/floorplan.d.ts +7 -0
- package/dist/slab/floorplan.d.ts.map +1 -1
- package/dist/slab/floorplan.js +22 -5
- package/dist/slab/geometry.d.ts.map +1 -1
- package/dist/slab/geometry.js +186 -76
- package/dist/slab/move-tool.js +7 -6
- package/dist/slab/paint.d.ts +18 -5
- package/dist/slab/paint.d.ts.map +1 -1
- package/dist/slab/paint.js +458 -9
- package/dist/slab/panel.d.ts.map +1 -1
- package/dist/slab/panel.js +28 -9
- package/dist/slab/placement-ownership.d.ts +2 -1
- package/dist/slab/placement-ownership.d.ts.map +1 -1
- package/dist/slab/placement-ownership.js +2 -2
- package/dist/slab/surface-split.d.ts +24 -0
- package/dist/slab/surface-split.d.ts.map +1 -0
- package/dist/slab/surface-split.js +389 -0
- package/dist/slab/tool.d.ts.map +1 -1
- package/dist/slab/tool.js +3 -3
- package/dist/stair/baluster-geometry.d.ts +21 -0
- package/dist/stair/baluster-geometry.d.ts.map +1 -0
- package/dist/stair/baluster-geometry.js +74 -0
- package/dist/stair/baluster-guard.d.ts +50 -0
- package/dist/stair/baluster-guard.d.ts.map +1 -0
- package/dist/stair/baluster-guard.js +71 -0
- package/dist/stair/boards-guard.d.ts +37 -0
- package/dist/stair/boards-guard.d.ts.map +1 -0
- package/dist/stair/boards-guard.js +61 -0
- package/dist/stair/cable-guard.d.ts +39 -0
- package/dist/stair/cable-guard.d.ts.map +1 -0
- package/dist/stair/cable-guard.js +105 -0
- package/dist/stair/construction-controls.d.ts +15 -0
- package/dist/stair/construction-controls.d.ts.map +1 -0
- package/dist/stair/construction-controls.js +29 -0
- package/dist/stair/continuous-railings.d.ts +10 -0
- package/dist/stair/continuous-railings.d.ts.map +1 -0
- package/dist/stair/continuous-railings.js +159 -0
- package/dist/stair/definition.d.ts.map +1 -1
- package/dist/stair/definition.js +16 -37
- package/dist/stair/documentation.d.ts +1 -1
- package/dist/stair/documentation.d.ts.map +1 -1
- package/dist/stair/documentation.js +10 -17
- package/dist/stair/floorplan-affordances.d.ts.map +1 -1
- package/dist/stair/floorplan-affordances.js +9 -25
- package/dist/stair/floorplan.d.ts +1 -23
- package/dist/stair/floorplan.d.ts.map +1 -1
- package/dist/stair/floorplan.js +102 -86
- package/dist/stair/glass-guard.d.ts +72 -0
- package/dist/stair/glass-guard.d.ts.map +1 -0
- package/dist/stair/glass-guard.js +167 -0
- package/dist/stair/guard-path.d.ts +119 -0
- package/dist/stair/guard-path.d.ts.map +1 -0
- package/dist/stair/guard-path.js +208 -0
- package/dist/stair/materials.d.ts +11 -0
- package/dist/stair/materials.d.ts.map +1 -0
- package/dist/stair/materials.js +51 -0
- package/dist/stair/metal-guard.d.ts +38 -0
- package/dist/stair/metal-guard.d.ts.map +1 -0
- package/dist/stair/metal-guard.js +79 -0
- package/dist/stair/paint.d.ts +32 -0
- package/dist/stair/paint.d.ts.map +1 -1
- package/dist/stair/paint.js +75 -36
- package/dist/stair/panel.d.ts.map +1 -1
- package/dist/stair/panel.js +154 -17
- package/dist/stair/parametrics.d.ts +1 -1
- package/dist/stair/parametrics.d.ts.map +1 -1
- package/dist/stair/parametrics.js +32 -15
- package/dist/stair/plan-entry.d.ts +31 -0
- package/dist/stair/plan-entry.d.ts.map +1 -0
- package/dist/stair/plan-entry.js +325 -0
- package/dist/stair/post-and-rail-guard.d.ts +31 -0
- package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
- package/dist/stair/post-and-rail-guard.js +63 -0
- package/dist/stair/railing-controls.d.ts +9 -0
- package/dist/stair/railing-controls.d.ts.map +1 -0
- package/dist/stair/railing-controls.js +49 -0
- package/dist/stair/renderer.d.ts.map +1 -1
- package/dist/stair/renderer.js +259 -259
- package/dist/stair/use-stair-render-data.d.ts +317 -0
- package/dist/stair/use-stair-render-data.d.ts.map +1 -0
- package/dist/stair/use-stair-render-data.js +73 -0
- package/dist/stair-segment/definition.d.ts.map +1 -1
- package/dist/stair-segment/definition.js +51 -10
- package/dist/stair-segment/panel.d.ts.map +1 -1
- package/dist/stair-segment/panel.js +36 -42
- package/dist/stair-segment/parametrics.d.ts +1 -1
- package/dist/stair-segment/parametrics.d.ts.map +1 -1
- package/dist/stair-segment/parametrics.js +21 -8
- package/dist/stair-segment/renderer.d.ts.map +1 -1
- package/dist/stair-segment/renderer.js +16 -28
- package/dist/turbine-vent/definition.d.ts.map +1 -1
- package/dist/turbine-vent/definition.js +2 -5
- package/dist/turbine-vent/paint.d.ts.map +1 -1
- package/dist/turbine-vent/paint.js +2 -5
- package/dist/turbine-vent/panel.d.ts.map +1 -1
- package/dist/turbine-vent/panel.js +5 -23
- package/dist/unit/unit-panel.d.ts.map +1 -1
- package/dist/unit/unit-panel.js +6 -1
- package/dist/wall/actions.d.ts.map +1 -1
- package/dist/wall/actions.js +7 -2
- package/dist/wall/construction-dimensions.js +8 -5
- package/dist/wall/contextual-dimensions.js +4 -4
- package/dist/wall/curtain-wall-materials.d.ts +1 -1
- package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
- package/dist/wall/curtain-wall-materials.js +2 -2
- package/dist/wall/curve-tool.d.ts.map +1 -1
- package/dist/wall/curve-tool.js +4 -0
- package/dist/wall/definition.d.ts.map +1 -1
- package/dist/wall/definition.js +41 -17
- package/dist/wall/floorplan-move.d.ts +1 -1
- package/dist/wall/floorplan-move.d.ts.map +1 -1
- package/dist/wall/floorplan-move.js +20 -83
- package/dist/wall/floorplan-tool.d.ts.map +1 -1
- package/dist/wall/floorplan-tool.js +10 -11
- package/dist/wall/floorplan.d.ts +3 -1
- package/dist/wall/floorplan.d.ts.map +1 -1
- package/dist/wall/floorplan.js +184 -21
- package/dist/wall/measurement.d.ts.map +1 -1
- package/dist/wall/measurement.js +5 -5
- package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
- package/dist/wall/move-endpoint-tool.js +20 -7
- package/dist/wall/move-shared.d.ts.map +1 -1
- package/dist/wall/move-shared.js +11 -7
- package/dist/wall/move-tool.d.ts.map +1 -1
- package/dist/wall/move-tool.js +118 -148
- package/dist/wall/paint.d.ts +26 -15
- package/dist/wall/paint.d.ts.map +1 -1
- package/dist/wall/paint.js +306 -117
- package/dist/wall/panel-model.d.ts +18 -0
- package/dist/wall/panel-model.d.ts.map +1 -1
- package/dist/wall/panel-model.js +77 -19
- package/dist/wall/panel.d.ts.map +1 -1
- package/dist/wall/panel.js +217 -41
- package/dist/wall/parametrics.d.ts.map +1 -1
- package/dist/wall/parametrics.js +3 -0
- package/dist/wall/rectangle-command.d.ts +111 -12
- package/dist/wall/rectangle-command.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.d.ts.map +1 -1
- package/dist/wall/rectangle-tool.js +26 -8
- package/dist/wall/renderer.d.ts.map +1 -1
- package/dist/wall/renderer.js +4 -2
- package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
- package/dist/wall/split-floorplan-layer.js +7 -7
- package/dist/wall/split-session.d.ts.map +1 -1
- package/dist/wall/split-session.js +7 -1
- package/dist/wall/system.d.ts.map +1 -1
- package/dist/wall/system.js +36 -4
- package/dist/wall/tool.d.ts.map +1 -1
- package/dist/wall/tool.js +105 -49
- package/dist/wall/treatment-level-data.d.ts +3 -2
- package/dist/wall/treatment-level-data.d.ts.map +1 -1
- package/dist/wall/treatment-level-data.js +17 -13
- package/dist/wall/treatments.d.ts +10 -10
- package/dist/wall/treatments.d.ts.map +1 -1
- package/dist/wall/treatments.js +67 -54
- package/dist/wall/wall-batch-system.d.ts +7 -0
- package/dist/wall/wall-batch-system.d.ts.map +1 -1
- package/dist/wall/wall-batch-system.js +35 -3
- package/dist/wall/wall-batch.d.ts +6 -0
- package/dist/wall/wall-batch.d.ts.map +1 -1
- package/dist/wall/wall-batch.js +7 -1
- package/dist/window/definition.d.ts.map +1 -1
- package/dist/window/definition.js +12 -4
- package/dist/window/floorplan-move.d.ts.map +1 -1
- package/dist/window/floorplan-move.js +3 -1
- package/dist/window/floorplan.d.ts.map +1 -1
- package/dist/window/floorplan.js +145 -60
- package/dist/window/mechanism.d.ts +4 -0
- package/dist/window/mechanism.d.ts.map +1 -0
- package/dist/window/mechanism.js +20 -0
- package/dist/window/move-tool.d.ts.map +1 -1
- package/dist/window/move-tool.js +79 -48
- package/dist/window/paint.d.ts.map +1 -1
- package/dist/window/paint.js +3 -0
- package/dist/window/panel.d.ts.map +1 -1
- package/dist/window/panel.js +32 -88
- package/dist/window/placement.d.ts +23 -0
- package/dist/window/placement.d.ts.map +1 -0
- package/dist/window/placement.js +66 -0
- package/dist/window/preview.d.ts.map +1 -1
- package/dist/window/preview.js +2 -0
- package/dist/window/renderer.d.ts.map +1 -1
- package/dist/window/renderer.js +3 -2
- package/dist/window/tool.d.ts.map +1 -1
- package/dist/window/tool.js +96 -24
- package/dist/window/window-math.d.ts +6 -14
- package/dist/window/window-math.d.ts.map +1 -1
- package/dist/window/window-math.js +14 -20
- package/dist/zone/contextual-dimensions.d.ts.map +1 -1
- package/dist/zone/contextual-dimensions.js +6 -28
- package/dist/zone/definition.d.ts.map +1 -1
- package/dist/zone/definition.js +3 -3
- package/dist/zone/floorplan-affordances.d.ts +200 -0
- package/dist/zone/floorplan-affordances.d.ts.map +1 -1
- package/dist/zone/floorplan.d.ts +1 -1
- package/dist/zone/floorplan.d.ts.map +1 -1
- package/dist/zone/floorplan.js +93 -53
- package/dist/zone/quantities-panel.d.ts.map +1 -1
- package/dist/zone/quantities-panel.js +3 -14
- package/dist/zone/quick-measurement.d.ts +2 -2
- package/dist/zone/quick-measurement.d.ts.map +1 -1
- package/dist/zone/quick-measurement.js +6 -5
- package/dist/zone/renderer.d.ts +1 -1
- package/dist/zone/renderer.d.ts.map +1 -1
- package/dist/zone/renderer.js +58 -146
- package/dist/zone/room-clear-dimensions.js +3 -3
- package/dist/zone/room-documentation.d.ts.map +1 -1
- package/dist/zone/room-documentation.js +2 -6
- package/package.json +11 -11
- package/dist/block/slots.d.ts +0 -4
- package/dist/block/slots.d.ts.map +0 -1
- package/dist/block/slots.js +0 -17
- package/dist/cabinet/slots.d.ts +0 -4
- package/dist/cabinet/slots.d.ts.map +0 -1
- package/dist/cabinet/slots.js +0 -24
- package/dist/ceiling/slots.d.ts +0 -6
- package/dist/ceiling/slots.d.ts.map +0 -1
- package/dist/ceiling/slots.js +0 -7
- package/dist/column/slots.d.ts +0 -9
- package/dist/column/slots.d.ts.map +0 -1
- package/dist/column/slots.js +0 -19
- package/dist/door/slots.d.ts +0 -9
- package/dist/door/slots.d.ts.map +0 -1
- package/dist/door/slots.js +0 -20
- package/dist/elevator/slots.d.ts +0 -8
- package/dist/elevator/slots.d.ts.map +0 -1
- package/dist/elevator/slots.js +0 -17
- package/dist/fence/slots.d.ts +0 -10
- package/dist/fence/slots.d.ts.map +0 -1
- package/dist/fence/slots.js +0 -23
- package/dist/item/__fixtures__/main-floorplan.d.ts +0 -26
- package/dist/item/__fixtures__/main-floorplan.d.ts.map +0 -1
- package/dist/item/__fixtures__/main-floorplan.js +0 -297
- package/dist/lean-to-extension/slots.d.ts +0 -5
- package/dist/lean-to-extension/slots.d.ts.map +0 -1
- package/dist/lean-to-extension/slots.js +0 -15
- package/dist/shelf/slots.d.ts +0 -9
- package/dist/shelf/slots.d.ts.map +0 -1
- package/dist/shelf/slots.js +0 -30
- package/dist/slab/slots.d.ts +0 -10
- package/dist/slab/slots.d.ts.map +0 -1
- package/dist/slab/slots.js +0 -20
- package/dist/stair/floor-stack.d.ts +0 -10
- package/dist/stair/floor-stack.d.ts.map +0 -1
- package/dist/stair/floor-stack.js +0 -115
- package/dist/stair/slots.d.ts +0 -7
- package/dist/stair/slots.d.ts.map +0 -1
- package/dist/stair/slots.js +0 -13
- package/dist/wall/drawing-mode.d.ts +0 -12
- package/dist/wall/drawing-mode.d.ts.map +0 -1
- package/dist/wall/drawing-mode.js +0 -38
- package/dist/wall/slots.d.ts +0 -10
- package/dist/wall/slots.d.ts.map +0 -1
- package/dist/wall/slots.js +0 -92
- package/dist/window/slots.d.ts +0 -5
- package/dist/window/slots.d.ts.map +0 -1
- package/dist/window/slots.js +0 -11
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { nodeMechanism, useInteractive, useScene } from '@pascal-app/core';
|
|
4
|
+
import { ActionMenuButton } from '@pascal-app/editor';
|
|
5
|
+
import { useViewer } from '@pascal-app/viewer';
|
|
6
|
+
import { Lightbulb, LightbulbOff } from 'lucide-react';
|
|
7
|
+
import { itemHasLights, itemLightsOn, toggleItemLights } from './item-interactions';
|
|
8
|
+
/**
|
|
9
|
+
* The light switch for a single selected item or procedural item. Play/Stop
|
|
10
|
+
* comes from the action menu's `capabilities.mechanism` button.
|
|
11
|
+
*/
|
|
12
|
+
export default function ItemInteractionActions() {
|
|
13
|
+
const selected = useViewer((s) => s.selection.selectedIds);
|
|
14
|
+
const node = useScene((s) => selected.length === 1 ? s.nodes[selected[0]] : undefined);
|
|
15
|
+
const hasLights = itemHasLights(node);
|
|
16
|
+
const lit = useInteractive((s) => (node && hasLights ? itemLightsOn(node, s) : false));
|
|
17
|
+
if (!(node && hasLights))
|
|
18
|
+
return null;
|
|
19
|
+
return (_jsx(ActionMenuButton
|
|
20
|
+
// E runs the mechanism when there is one, and only otherwise the light.
|
|
21
|
+
, {
|
|
22
|
+
// E runs the mechanism when there is one, and only otherwise the light.
|
|
23
|
+
keys: nodeMechanism(node) ? undefined : ['E'], label: lit ? 'Turn light off' : 'Turn light on', onClick: (event) => {
|
|
24
|
+
event.stopPropagation();
|
|
25
|
+
toggleItemLights(node);
|
|
26
|
+
}, pressed: lit, children: lit ? _jsx(Lightbulb, { className: "h-4 w-4" }) : _jsx(LightbulbOff, { className: "h-4 w-4" }) }));
|
|
27
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type AnyNode, type InteractiveState, type MechanismCapability } from '@pascal-app/core';
|
|
2
|
+
/** A catalog item's animation toggles: every toggle but the light switch. */
|
|
3
|
+
export declare const itemMechanism: MechanismCapability;
|
|
4
|
+
/** A procedural item's moving parts, all driven through its motion timeline. */
|
|
5
|
+
export declare const proceduralMechanism: MechanismCapability;
|
|
6
|
+
export declare function itemHasLights(node: AnyNode | undefined): boolean;
|
|
7
|
+
export declare function itemLightsOn(node: AnyNode, state: InteractiveState): boolean;
|
|
8
|
+
export declare function toggleItemLights(node: AnyNode): void;
|
|
9
|
+
//# sourceMappingURL=item-interactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-interactions.d.ts","sourceRoot":"","sources":["../../src/shared/item-interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAA;AA4BzB,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,mBAY3B,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,EAAE,mBAKjC,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAKhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAQ5E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,QAW7C"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { useInteractive, } from '@pascal-app/core';
|
|
2
|
+
import { operableParts } from '@pascal-app/core/procedural-items';
|
|
3
|
+
// Catalog light and animation effects both read the first toggle, so on a lamp
|
|
4
|
+
// that toggle is the light switch and any further toggles are the mechanisms.
|
|
5
|
+
function catalogToggles(interactive) {
|
|
6
|
+
const toggles = interactive.controls.flatMap((control, index) => control.kind === 'toggle' ? [index] : []);
|
|
7
|
+
const light = interactive.effects.some((effect) => effect.kind === 'light')
|
|
8
|
+
? (toggles[0] ?? -1)
|
|
9
|
+
: -1;
|
|
10
|
+
const mechanisms = interactive.effects.some((effect) => effect.kind === 'animation')
|
|
11
|
+
? toggles.filter((index) => index !== light)
|
|
12
|
+
: [];
|
|
13
|
+
return { light, mechanisms };
|
|
14
|
+
}
|
|
15
|
+
function motionPartIds(node) {
|
|
16
|
+
return node.type === 'procedural-item' ? operableParts(node.recipe).map((part) => part.id) : [];
|
|
17
|
+
}
|
|
18
|
+
function mechanismToggles(node) {
|
|
19
|
+
return node.type === 'item' && node.asset.interactive
|
|
20
|
+
? catalogToggles(node.asset.interactive).mechanisms
|
|
21
|
+
: [];
|
|
22
|
+
}
|
|
23
|
+
/** A catalog item's animation toggles: every toggle but the light switch. */
|
|
24
|
+
export const itemMechanism = {
|
|
25
|
+
has: (node) => mechanismToggles(node).length > 0,
|
|
26
|
+
isOn: (node, state) => {
|
|
27
|
+
const values = state.items[node.id]?.controlValues;
|
|
28
|
+
return mechanismToggles(node).some((index) => Boolean(values?.[index]));
|
|
29
|
+
},
|
|
30
|
+
set: (node, on) => {
|
|
31
|
+
if (node.type !== 'item' || !node.asset.interactive)
|
|
32
|
+
return;
|
|
33
|
+
const state = useInteractive.getState();
|
|
34
|
+
state.initItem(node.id, node.asset.interactive);
|
|
35
|
+
for (const index of mechanismToggles(node))
|
|
36
|
+
state.setControlValue(node.id, index, on);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
/** A procedural item's moving parts, all driven through its motion timeline. */
|
|
40
|
+
export const proceduralMechanism = {
|
|
41
|
+
has: (node) => motionPartIds(node).length > 0,
|
|
42
|
+
isOn: (node, state) => motionPartIds(node).some((partId) => state.procedural[node.id]?.parts[partId]),
|
|
43
|
+
set: (node, on) => useInteractive.getState().setProceduralParts(node.id, motionPartIds(node), on),
|
|
44
|
+
};
|
|
45
|
+
export function itemHasLights(node) {
|
|
46
|
+
if (node?.type === 'procedural-item')
|
|
47
|
+
return node.recipe.parts.some((part) => part.light);
|
|
48
|
+
if (node?.type === 'item' && node.asset.interactive)
|
|
49
|
+
return catalogToggles(node.asset.interactive).light >= 0;
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
export function itemLightsOn(node, state) {
|
|
53
|
+
if (node.type === 'procedural-item')
|
|
54
|
+
return state.procedural[node.id]?.lightsOn ?? state.lampDefault;
|
|
55
|
+
if (node.type === 'item' && node.asset.interactive) {
|
|
56
|
+
const { light } = catalogToggles(node.asset.interactive);
|
|
57
|
+
return light >= 0 && Boolean(state.items[node.id]?.controlValues[light]);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
export function toggleItemLights(node) {
|
|
62
|
+
const state = useInteractive.getState();
|
|
63
|
+
if (node.type === 'procedural-item') {
|
|
64
|
+
state.toggleProceduralLights(node.id);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (node.type !== 'item' || !node.asset.interactive)
|
|
68
|
+
return;
|
|
69
|
+
const { light } = catalogToggles(node.asset.interactive);
|
|
70
|
+
if (light < 0)
|
|
71
|
+
return;
|
|
72
|
+
state.initItem(node.id, node.asset.interactive);
|
|
73
|
+
state.setControlValue(node.id, light, !itemLightsOn(node, useInteractive.getState()));
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-light-placement.d.ts","sourceRoot":"","sources":["../../src/shared/item-light-placement.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAE3F"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { collectAlignmentAnchors, emitter, movingAlignmentAnchors, nodeRegistry, resolveAlignment, resolveSupportSlabPatch, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
3
|
-
import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, resolvePlanarCursorPosition,
|
|
3
|
+
import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, resolvePlanarCursorPosition, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
|
|
4
4
|
import { useViewer } from '@pascal-app/viewer';
|
|
5
5
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
6
6
|
import * as THREE from 'three';
|
|
7
|
+
import { snapFenceDraftPoint } from '../fence/drafting';
|
|
7
8
|
/** Figma-style alignment-snap threshold (meters), matching the other tools. */
|
|
8
9
|
const ALIGNMENT_THRESHOLD_M = 0.08;
|
|
9
10
|
function disableRaycastDuringDrag(root) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type AnyNode, type BatchableConfig } from '@pascal-app/core';
|
|
2
|
+
/** One packed allocation per node mesh, for geometry each rebuild replaces. */
|
|
3
|
+
export declare const nodeMeshBatchKey: (node: AnyNode, meshIndex: number) => string;
|
|
4
|
+
export declare const columnBatchable: BatchableConfig;
|
|
5
|
+
/** Ceiling undersides and slab bodies are trimmed by walls and rebuilt in place. */
|
|
6
|
+
export declare const surfaceBatchable: BatchableConfig;
|
|
7
|
+
export declare const itemBatchable: BatchableConfig;
|
|
8
|
+
export declare const doorBatchable: BatchableConfig;
|
|
9
|
+
export declare const windowBatchable: BatchableConfig;
|
|
10
|
+
/** Imported meshes and blocks build their own geometry per node, rebuilt in place. */
|
|
11
|
+
export declare const perNodeGeometryBatchable: BatchableConfig;
|
|
12
|
+
//# sourceMappingURL=batchable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchable.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/batchable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AAEzB,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,WAAW,MAAM,WAA8B,CAAA;AAE/F,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,eAI9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,eAgB3B,CAAA;AAID,eAAO,MAAM,aAAa,EAAE,eAG3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { itemClipRegistry, useInteractive, } from '@pascal-app/core';
|
|
2
|
+
/** One packed allocation per node mesh, for geometry each rebuild replaces. */
|
|
3
|
+
export const nodeMeshBatchKey = (node, meshIndex) => `${node.id}:${meshIndex}`;
|
|
4
|
+
export const columnBatchable = {
|
|
5
|
+
scope: 'level',
|
|
6
|
+
excluded: (node) => itemClipRegistry.has(node.id),
|
|
7
|
+
settled: (data) => !data.scriptedColumn || data.itemModelSettled === true,
|
|
8
|
+
};
|
|
9
|
+
/** Ceiling undersides and slab bodies are trimmed by walls and rebuilt in place. */
|
|
10
|
+
export const surfaceBatchable = {
|
|
11
|
+
scope: 'level',
|
|
12
|
+
batchKey: nodeMeshBatchKey,
|
|
13
|
+
waitsForWalls: true,
|
|
14
|
+
};
|
|
15
|
+
export const itemBatchable = {
|
|
16
|
+
scope: 'level',
|
|
17
|
+
// An animation effect or a registered clip means the item animates its own
|
|
18
|
+
// subtree (a fan's spin) — per-mesh transforms move under a static batch
|
|
19
|
+
// instance. Light effects drive separate light objects, so a lit porch or
|
|
20
|
+
// lamp still batches.
|
|
21
|
+
excluded: (node) => Boolean(node.asset?.interactive?.effects?.some((effect) => effect.kind === 'animation')) || itemClipRegistry.has(node.id),
|
|
22
|
+
// Items hold their dirty mark until the GLB settles. A GLB that ships clips
|
|
23
|
+
// autoplays its first one even without an interactive effect
|
|
24
|
+
// (ItemAnimation's no-effect fallback) — static batching would freeze it.
|
|
25
|
+
settled: (userData) => userData.itemModelSettled === true && userData.itemHasAnimations !== true,
|
|
26
|
+
};
|
|
27
|
+
// Mid-swing openings rebuild per tick off their animation record; the
|
|
28
|
+
// completion dirty mark re-joins them at the settled pose.
|
|
29
|
+
export const doorBatchable = {
|
|
30
|
+
scope: 'wall',
|
|
31
|
+
excluded: (node) => node.id in useInteractive.getState().doorAnimations,
|
|
32
|
+
};
|
|
33
|
+
export const windowBatchable = {
|
|
34
|
+
scope: 'wall',
|
|
35
|
+
excluded: (node) => node.id in useInteractive.getState().windowAnimations,
|
|
36
|
+
};
|
|
37
|
+
/** Imported meshes and blocks build their own geometry per node, rebuilt in place. */
|
|
38
|
+
export const perNodeGeometryBatchable = {
|
|
39
|
+
scope: 'level',
|
|
40
|
+
batchKey: nodeMeshBatchKey,
|
|
41
|
+
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { type AnyNode, type BatchableConfig } from '@pascal-app/core';
|
|
1
2
|
import type { BatchCandidate } from './types';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* each node's mounted subtree instead of a single wall mesh.
|
|
4
|
+
* Kinds that declare `capabilities.batchable`, re-read when a plugin
|
|
5
|
+
* registers. Walls keep their merged-geometry batch.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
export declare
|
|
7
|
+
export declare function batchableKinds(): ReadonlyMap<string, BatchableConfig>;
|
|
8
|
+
export declare function batchableConfig(node: AnyNode | undefined): BatchableConfig | undefined;
|
|
9
|
+
/** A wall-scoped node (door, window) moves with its host wall. */
|
|
10
|
+
export declare function isWallHosted(node: AnyNode | undefined): boolean;
|
|
9
11
|
export declare function collectBatchCandidate(nodeId: string): BatchCandidate | null;
|
|
10
12
|
export declare function hideBatchedNode(candidate: BatchCandidate): void;
|
|
11
13
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,eAAe,EAOrB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAWzD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAYrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAEtF;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAE/D;AAsDD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAsE3E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAyB5E;AAED,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAOzD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getRegistryVersion, nodeRegistry, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
|
|
2
2
|
import { hideFromScene, SCENE_LAYER, showInScene, useViewer } from '@pascal-app/viewer';
|
|
3
3
|
import { Matrix4 } from 'three';
|
|
4
4
|
import { isSlotPaintPreviewActive } from '../slot-paint';
|
|
@@ -7,15 +7,33 @@ import { isSlotPaintPreviewActive } from '../slot-paint';
|
|
|
7
7
|
* the wall batch's `toCandidate` (../../wall/wall-batch-system.tsx), walking
|
|
8
8
|
* each node's mounted subtree instead of a single wall mesh.
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
let batchKindsVersion = -1;
|
|
11
|
+
let batchKinds = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Kinds that declare `capabilities.batchable`, re-read when a plugin
|
|
14
|
+
* registers. Walls keep their merged-geometry batch.
|
|
15
|
+
*/
|
|
16
|
+
export function batchableKinds() {
|
|
17
|
+
const version = getRegistryVersion();
|
|
18
|
+
if (version !== batchKindsVersion) {
|
|
19
|
+
const kinds = new Map();
|
|
20
|
+
for (const [kind, definition] of nodeRegistry.entries()) {
|
|
21
|
+
const batchable = definition.capabilities?.batchable;
|
|
22
|
+
if (batchable)
|
|
23
|
+
kinds.set(kind, batchable);
|
|
24
|
+
}
|
|
25
|
+
batchKinds = kinds;
|
|
26
|
+
batchKindsVersion = version;
|
|
27
|
+
}
|
|
28
|
+
return batchKinds;
|
|
29
|
+
}
|
|
30
|
+
export function batchableConfig(node) {
|
|
31
|
+
return node ? batchableKinds().get(node.type) : undefined;
|
|
32
|
+
}
|
|
33
|
+
/** A wall-scoped node (door, window) moves with its host wall. */
|
|
34
|
+
export function isWallHosted(node) {
|
|
35
|
+
return batchableConfig(node)?.scope === 'wall';
|
|
36
|
+
}
|
|
19
37
|
const rootInverse = new Matrix4();
|
|
20
38
|
/** Source meshes currently draw-hidden per node, so reveal needs no candidate. */
|
|
21
39
|
const hiddenMeshesByNode = new Map();
|
|
@@ -42,22 +60,19 @@ function collectMeshes(object, out, hostedRoots) {
|
|
|
42
60
|
}
|
|
43
61
|
/**
|
|
44
62
|
* The level this node's batches live under, or null when the node is not in
|
|
45
|
-
* batchable scope.
|
|
46
|
-
*
|
|
63
|
+
* batchable scope. Level-scoped kinds qualify directly under a level; doors
|
|
64
|
+
* and windows through a wall that is itself parented to a level. Other
|
|
47
65
|
* hosting shapes (roof faces, blocks, wall-hosted items) move when their host
|
|
48
66
|
* changes without any signal the batch would see — they draw themselves.
|
|
49
67
|
*/
|
|
50
|
-
function resolveLevelId(node, nodes) {
|
|
68
|
+
function resolveLevelId(node, batchable, nodes) {
|
|
51
69
|
const parent = node.parentId ? nodes[node.parentId] : undefined;
|
|
52
70
|
if (!parent)
|
|
53
71
|
return null;
|
|
54
|
-
if (
|
|
55
|
-
node.type === 'column' ||
|
|
56
|
-
node.type === 'ceiling' ||
|
|
57
|
-
node.type === 'slab') {
|
|
72
|
+
if (batchable.scope === 'level') {
|
|
58
73
|
return parent.type === 'level' ? parent.id : null;
|
|
59
74
|
}
|
|
60
|
-
//
|
|
75
|
+
// Wall-hosted: host wall → its level. A hidden wall hides its openings
|
|
61
76
|
// through group visibility — batch instances hang off the level root and
|
|
62
77
|
// would keep drawing them.
|
|
63
78
|
if (parent.type !== 'wall' || parent.visible === false)
|
|
@@ -65,60 +80,29 @@ function resolveLevelId(node, nodes) {
|
|
|
65
80
|
const level = parent.parentId ? nodes[parent.parentId] : undefined;
|
|
66
81
|
return level?.type === 'level' ? level.id : null;
|
|
67
82
|
}
|
|
68
|
-
function isExcluded(node) {
|
|
69
|
-
if (node.type === 'item') {
|
|
70
|
-
const asset = node.asset;
|
|
71
|
-
if (asset?.interactive)
|
|
72
|
-
return true;
|
|
73
|
-
// A registered clip means the item animates its own subtree (a fan's
|
|
74
|
-
// spin) — per-mesh transforms move under a static batch instance.
|
|
75
|
-
if (itemClipRegistry.has(node.id))
|
|
76
|
-
return true;
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
if (node.type === 'door') {
|
|
80
|
-
// Mid-swing doors rebuild per tick off their animation record; the
|
|
81
|
-
// completion dirty mark re-joins them at the settled pose.
|
|
82
|
-
return node.id in useInteractive.getState().doorAnimations;
|
|
83
|
-
}
|
|
84
|
-
if (node.type === 'window') {
|
|
85
|
-
return node.id in useInteractive.getState().windowAnimations;
|
|
86
|
-
}
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
83
|
export function collectBatchCandidate(nodeId) {
|
|
90
84
|
const nodes = useScene.getState().nodes;
|
|
91
85
|
const node = nodes[nodeId];
|
|
92
|
-
|
|
86
|
+
const batchable = batchableConfig(node);
|
|
87
|
+
if (!node || !batchable || node.visible === false)
|
|
93
88
|
return null;
|
|
94
|
-
const levelId = resolveLevelId(node, nodes);
|
|
89
|
+
const levelId = resolveLevelId(node, batchable, nodes);
|
|
95
90
|
if (!levelId)
|
|
96
91
|
return null;
|
|
97
|
-
if (
|
|
92
|
+
if (batchable.excluded?.(node) || isSlotPaintPreviewActive(nodeId))
|
|
98
93
|
return null;
|
|
99
94
|
const group = sceneRegistry.nodes.get(nodeId);
|
|
100
95
|
if (!group)
|
|
101
96
|
return null;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// ships clips autoplays its first one even without an interactive effect
|
|
105
|
-
// (ItemAnimation's no-effect fallback) — static batching would freeze it.
|
|
106
|
-
if (node.type === 'item') {
|
|
107
|
-
const userData = group.userData;
|
|
108
|
-
if (userData.itemModelSettled !== true)
|
|
109
|
-
return null;
|
|
110
|
-
if (userData.itemHasAnimations === true)
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
97
|
+
if (batchable.settled && !batchable.settled(group.userData))
|
|
98
|
+
return null;
|
|
113
99
|
// A live override on the node (or, for hosted openings, on the host wall)
|
|
114
100
|
// means an in-flight gesture: transforms are moving under our feet and the
|
|
115
101
|
// commit's dirty mark has not landed yet.
|
|
116
102
|
const overrides = useLiveNodeOverrides.getState();
|
|
117
103
|
if (overrides.get(nodeId) || useLiveTransforms.getState().get(nodeId))
|
|
118
104
|
return null;
|
|
119
|
-
if (
|
|
120
|
-
node.parentId &&
|
|
121
|
-
overrides.get(node.parentId)) {
|
|
105
|
+
if (batchable.scope === 'wall' && node.parentId && overrides.get(node.parentId)) {
|
|
122
106
|
return null;
|
|
123
107
|
}
|
|
124
108
|
const levelRoot = sceneRegistry.nodes.get(levelId);
|
|
@@ -157,7 +141,7 @@ export function collectBatchCandidate(nodeId) {
|
|
|
157
141
|
entries.push({
|
|
158
142
|
nodeId,
|
|
159
143
|
levelId,
|
|
160
|
-
allocationKey:
|
|
144
|
+
allocationKey: batchable.batchKey?.(node, meshIndex),
|
|
161
145
|
mesh,
|
|
162
146
|
geometry: mesh.geometry,
|
|
163
147
|
material,
|
|
@@ -238,7 +222,7 @@ export function collectTintedNodes(nodeIds) {
|
|
|
238
222
|
if (tinted.has(id))
|
|
239
223
|
continue;
|
|
240
224
|
const node = nodes[id];
|
|
241
|
-
if (!node || (node
|
|
225
|
+
if (!node || !isWallHosted(node))
|
|
242
226
|
continue;
|
|
243
227
|
const wallId = node.parentId;
|
|
244
228
|
if (!wallId)
|
|
@@ -250,7 +234,7 @@ export function collectTintedNodes(nodeIds) {
|
|
|
250
234
|
}
|
|
251
235
|
export function getBatchableNodeIds() {
|
|
252
236
|
const out = new Set();
|
|
253
|
-
for (const kind of
|
|
237
|
+
for (const kind of batchableKinds().keys()) {
|
|
254
238
|
const ids = sceneRegistry.byType[kind];
|
|
255
239
|
if (ids)
|
|
256
240
|
for (const id of ids)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The node batch listens here; kept apart from `system.tsx` so renderers can import it. */
|
|
2
|
+
export declare function subscribeBatchReleases(listener: (nodeId: string) => void): () => void;
|
|
3
|
+
/**
|
|
4
|
+
* A renderer whose meshes start or stop moving inside a frame (a procedural
|
|
5
|
+
* motion) reports it here: the node draws itself, then rejoins once quiet.
|
|
6
|
+
*/
|
|
7
|
+
export declare function releaseFromBatch(nodeId: string): void;
|
|
8
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/release.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAKrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAErD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const listeners = new Set();
|
|
2
|
+
/** The node batch listens here; kept apart from `system.tsx` so renderers can import it. */
|
|
3
|
+
export function subscribeBatchReleases(listener) {
|
|
4
|
+
listeners.add(listener);
|
|
5
|
+
return () => {
|
|
6
|
+
listeners.delete(listener);
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A renderer whose meshes start or stop moving inside a frame (a procedural
|
|
11
|
+
* motion) reports it here: the node draws itself, then rejoins once quiet.
|
|
12
|
+
*/
|
|
13
|
+
export function releaseFromBatch(nodeId) {
|
|
14
|
+
for (const listener of listeners)
|
|
15
|
+
listener(nodeId);
|
|
16
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/system.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/system.tsx"],"names":[],"mappings":"AA2HA,wBAAgB,mBAAmB,SAkBlC;AAkCD,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CA4B7E;AAED,wBAAgB,mBAAmB,SAgBlC;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAA;CAAE,QAmB3D;AAqPD,eAAO,MAAM,eAAe,0CAG3B,CAAA"}
|
|
@@ -5,7 +5,8 @@ import { getPendingWallRebuildCount, isIsolationActive, publishPerfBatchStats, r
|
|
|
5
5
|
import { useFrame, useThree } from '@react-three/fiber';
|
|
6
6
|
import { useEffect, useRef } from 'react';
|
|
7
7
|
import { isSlotPaintPreviewActive, subscribeSlotPaintPreviews } from '../slot-paint';
|
|
8
|
-
import {
|
|
8
|
+
import { batchableConfig, collectBatchCandidate, collectTintedNodes, getBatchableNodeIds, hideBatchedNode, isWallHosted, revealAllBatchedHolds, revealBatchedNode, } from './candidates';
|
|
9
|
+
import { subscribeBatchReleases } from './release';
|
|
9
10
|
import { NodeBatchStore } from './store';
|
|
10
11
|
import { MIN_BATCH_ENTRIES, NODE_BATCH_SETTLE_MS } from './types';
|
|
11
12
|
/**
|
|
@@ -49,6 +50,7 @@ const waveDebug = { runs: 0, stale: 0, candidates: 0, joined: 0, nullCandidates:
|
|
|
49
50
|
let lastNodeChangeAtMs = 0;
|
|
50
51
|
let batchingSuspended = false;
|
|
51
52
|
let lastLevelMode;
|
|
53
|
+
let lastHideAbove;
|
|
52
54
|
let lastSelectedLevel;
|
|
53
55
|
const lastAppearance = {
|
|
54
56
|
shading: undefined,
|
|
@@ -88,6 +90,7 @@ export function resetNodeBatchState() {
|
|
|
88
90
|
lastNodeChangeAtMs = 0;
|
|
89
91
|
batchingSuspended = false;
|
|
90
92
|
lastLevelMode = undefined;
|
|
93
|
+
lastHideAbove = undefined;
|
|
91
94
|
lastSelectedLevel = undefined;
|
|
92
95
|
lastAppearance.shading = undefined;
|
|
93
96
|
lastAppearance.textures = undefined;
|
|
@@ -127,8 +130,7 @@ function releaseAll() {
|
|
|
127
130
|
}
|
|
128
131
|
export function subscribeBatchInteractions(invalidate) {
|
|
129
132
|
const changed = (nodeId) => {
|
|
130
|
-
|
|
131
|
-
if (!node || !BATCH_KINDS.has(node.type))
|
|
133
|
+
if (!batchableConfig(useScene.getState().nodes[nodeId]))
|
|
132
134
|
return;
|
|
133
135
|
releaseNode(nodeId);
|
|
134
136
|
changedNodes.add(nodeId);
|
|
@@ -145,6 +147,7 @@ export function subscribeBatchInteractions(invalidate) {
|
|
|
145
147
|
}
|
|
146
148
|
});
|
|
147
149
|
const unsubscribePreviews = subscribeSlotPaintPreviews(changed);
|
|
150
|
+
const unsubscribeReleases = subscribeBatchReleases(changed);
|
|
148
151
|
const unsubscribeMaterials = registerMaterialCacheCleanup(() => {
|
|
149
152
|
releaseAll();
|
|
150
153
|
for (const nodeId of getBatchableNodeIds())
|
|
@@ -154,6 +157,7 @@ export function subscribeBatchInteractions(invalidate) {
|
|
|
154
157
|
return () => {
|
|
155
158
|
unsubscribeTransforms();
|
|
156
159
|
unsubscribePreviews();
|
|
160
|
+
unsubscribeReleases();
|
|
157
161
|
unsubscribeMaterials();
|
|
158
162
|
};
|
|
159
163
|
}
|
|
@@ -166,16 +170,14 @@ export function captureChangedNodes() {
|
|
|
166
170
|
const node = nodes[id];
|
|
167
171
|
if (!node)
|
|
168
172
|
continue;
|
|
169
|
-
if (
|
|
173
|
+
if (batchableConfig(node))
|
|
170
174
|
changedNodes.add(id);
|
|
171
175
|
else if (node.type === 'wall' && Array.isArray(node.children)) {
|
|
172
176
|
// The wall edit moved its openings in level space; their own marks may
|
|
173
177
|
// never come.
|
|
174
178
|
for (const childId of node.children) {
|
|
175
|
-
|
|
176
|
-
if (child && (child.type === 'door' || child.type === 'window')) {
|
|
179
|
+
if (isWallHosted(nodes[childId]))
|
|
177
180
|
changedNodes.add(childId);
|
|
178
|
-
}
|
|
179
181
|
}
|
|
180
182
|
}
|
|
181
183
|
}
|
|
@@ -232,8 +234,11 @@ function processBatchFrame(invalidate, wakeRef) {
|
|
|
232
234
|
}
|
|
233
235
|
changedNodes.clear();
|
|
234
236
|
const viewer = useViewer.getState();
|
|
235
|
-
if (lastLevelMode !== viewer.levelMode ||
|
|
237
|
+
if (lastLevelMode !== viewer.levelMode ||
|
|
238
|
+
lastHideAbove !== viewer.hideLevelsAboveSelection ||
|
|
239
|
+
lastSelectedLevel !== viewer.selection.levelId) {
|
|
236
240
|
lastLevelMode = viewer.levelMode;
|
|
241
|
+
lastHideAbove = viewer.hideLevelsAboveSelection;
|
|
237
242
|
lastSelectedLevel = viewer.selection.levelId;
|
|
238
243
|
// Shadow-only sources were rejected and dropped from the previous join wave.
|
|
239
244
|
for (const nodeId of nodeIds)
|
|
@@ -365,12 +370,12 @@ function processBatchFrame(invalidate, wakeRef) {
|
|
|
365
370
|
for (const nodeId of staleNodes) {
|
|
366
371
|
if (store.has(nodeId))
|
|
367
372
|
continue;
|
|
373
|
+
const node = sceneNodes[nodeId];
|
|
368
374
|
// Overrides defer like tint/dirt — an in-flight gesture ends with a
|
|
369
375
|
// commit whose mark re-offers the node; dropping it here would strand it.
|
|
370
|
-
if ((
|
|
371
|
-
|
|
372
|
-
(wallsPending ||
|
|
373
|
-
surfaceLevelReadyAt.has(sceneNodes[nodeId].parentId ?? ''))) ||
|
|
376
|
+
if ((node &&
|
|
377
|
+
batchableConfig(node)?.waitsForWalls &&
|
|
378
|
+
(wallsPending || surfaceLevelReadyAt.has(node.parentId ?? ''))) ||
|
|
374
379
|
tinted.has(nodeId) ||
|
|
375
380
|
dirty.has(nodeId) ||
|
|
376
381
|
overrides.get(nodeId) !== undefined ||
|
|
@@ -7,7 +7,8 @@ import type { BufferGeometry, Material, Matrix4, Mesh, Object3D } from 'three';
|
|
|
7
7
|
* `(levelId, material, attribute-signature, castShadow, receiveShadow)`;
|
|
8
8
|
* membership changes are incremental instance adds/deletes.
|
|
9
9
|
*
|
|
10
|
-
* Batched kinds
|
|
10
|
+
* Batched kinds declare `capabilities.batchable`: items, columns, ceilings,
|
|
11
|
+
* slabs, procedural items, imported meshes and blocks (level-parented), doors
|
|
11
12
|
* and windows (wall-hosted, resolved to the host wall's level). Walls keep
|
|
12
13
|
* their own merged-geometry batch and cutaway lifecycle.
|
|
13
14
|
*
|
|
@@ -27,6 +28,8 @@ import type { BufferGeometry, Material, Matrix4, Mesh, Object3D } from 'three';
|
|
|
27
28
|
* openings (their level-space transforms move with the wall).
|
|
28
29
|
* - Doors/windows with an active animation record are excluded while it
|
|
29
30
|
* runs; the completion dirty mark re-joins them at the settled pose.
|
|
31
|
+
* Procedural items are excluded while a motion plays and whenever they
|
|
32
|
+
* carry part lights.
|
|
30
33
|
*/
|
|
31
34
|
/** One batchable mesh of one node. */
|
|
32
35
|
export type BatchEntry = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE9E
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,cAAc,CAAA;IACxB;;;OAGG;IACH,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;;;;OAQG;IACH,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,qBAAqB,EAAE,MAAM,GAAG,UAAU,EAAE,CAAA;IAC/E,+FAA+F;IAC/F,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,CACR,GAAG,CAAC,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAA;IACV,8EAA8E;IAC9E,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5B,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,qEAAqE;IACrE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,UAAU,IAAI,IAAI,CAAA;IAClB,KAAK,IAAI,cAAc,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAA;AAEpE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,MAAM,CAAA"}
|
|
@@ -15,6 +15,8 @@ export type OpeningDimensionDocumentation = {
|
|
|
15
15
|
};
|
|
16
16
|
export type OpeningFloorplanLevelData = {
|
|
17
17
|
markById: ReadonlyMap<string, string>;
|
|
18
|
+
/** The drafted-sheet numbering, resolved on first use so the editor plan never pays for it. */
|
|
19
|
+
draftingMarkById: () => ReadonlyMap<string, string>;
|
|
18
20
|
};
|
|
19
21
|
export declare function computeDoorFloorplanLevelData(args: {
|
|
20
22
|
siblings: ReadonlyArray<DoorNode>;
|
|
@@ -30,6 +32,7 @@ export declare function buildDoorFloorplanSchedule(args: {
|
|
|
30
32
|
levelId: string;
|
|
31
33
|
unit: ConstructionLinearUnit;
|
|
32
34
|
profile?: ConstructionLengthProfile;
|
|
35
|
+
drafting?: boolean;
|
|
33
36
|
}): FloorplanSchedule | null;
|
|
34
37
|
export declare function buildWindowFloorplanSchedule(args: {
|
|
35
38
|
siblings: ReadonlyArray<WindowNode>;
|
|
@@ -37,10 +40,19 @@ export declare function buildWindowFloorplanSchedule(args: {
|
|
|
37
40
|
levelId: string;
|
|
38
41
|
unit: ConstructionLinearUnit;
|
|
39
42
|
profile?: ConstructionLengthProfile;
|
|
43
|
+
drafting?: boolean;
|
|
40
44
|
}): FloorplanSchedule | null;
|
|
41
|
-
export declare
|
|
45
|
+
export declare const OPENING_TAG_HEIGHT: number;
|
|
46
|
+
export declare const OPENING_TAG_STROKE_WIDTH: number;
|
|
47
|
+
export declare const OPENING_TAG_FONT_SIZE: number;
|
|
48
|
+
export declare const OPENING_TAG_LEADER_WIDTH: number;
|
|
49
|
+
/** Clear distance from the wall face to the near edge of the tag. */
|
|
50
|
+
export declare const OPENING_TAG_STANDOFF: number;
|
|
51
|
+
export declare function buildOpeningMarkAnnotation(opening: OpeningNode, wall: WallNode, levelData: OpeningFloorplanLevelData | undefined, { preferredSide, stroke, drafting, }?: {
|
|
42
52
|
preferredSide?: -1 | 1;
|
|
43
53
|
stroke?: string;
|
|
54
|
+
/** Sheet drafting: tag outside the exterior face, door hexagon / window ellipse, paper sizes. */
|
|
55
|
+
drafting?: boolean;
|
|
44
56
|
}): FloorplanGeometry | null;
|
|
45
57
|
export declare function resolveOpeningDimensionDocumentation(opening: OpeningNode): OpeningDimensionDocumentation;
|
|
46
58
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAA;AAE9B,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGxC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gBAAgB,EAAE,uBAAuB,CAAA;IACzC,SAAS,EAAE,yBAAyB,CAAA;IACpC,cAAc,EAAE,YAAY,GAAG,cAAc,CAAA;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,+FAA+F;IAC/F,gBAAgB,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpD,CAAA;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CAmC3B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CA8C3B;AAwBD,eAAO,MAAM,kBAAkB,QAAmB,CAAA;AAClD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,eAAO,MAAM,qBAAqB,QAAqB,CAAA;AACvD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,QAAoB,CAAA;AAErD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,EACE,aAAkB,EAClB,MAAkB,EAClB,QAAgB,GACjB,GAAE;IACD,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAA;CACd,GACL,iBAAiB,GAAG,IAAI,CA2I1B;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,WAAW,GACnB,6BAA6B,CAoB/B"}
|