@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
package/dist/site/parametrics.js
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspector descriptor for site.
|
|
3
|
+
*
|
|
4
|
+
* `customPanel` mounts `<SitePanel>` — address autocomplete, the parcel
|
|
5
|
+
* lookup, setbacks and the front-edge picker need async network state and
|
|
6
|
+
* feet↔metres conversion that the auto-derived field kinds don't cover.
|
|
7
|
+
*/
|
|
1
8
|
export const siteParametrics = {
|
|
2
9
|
groups: [],
|
|
10
|
+
customPanel: () => import('./panel'),
|
|
3
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recessed-slab-ground-holes.d.ts","sourceRoot":"","sources":["../../src/site/recessed-slab-ground-holes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"recessed-slab-ground-holes.d.ts","sourceRoot":"","sources":["../../src/site/recessed-slab-ground-holes.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAMb,MAAM,kBAAkB,CAAA;AAEzB,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CA8ChC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRenderableSlabPolygon, } from '@pascal-app/core';
|
|
1
|
+
import { getRenderableSlabPolygon, isFloorPlate, } from '@pascal-app/core';
|
|
2
2
|
export function getRecessedSlabGroundHoles(nodes) {
|
|
3
3
|
const nodeList = Object.values(nodes);
|
|
4
4
|
const levelIndexById = new Map();
|
|
@@ -25,7 +25,10 @@ export function getRecessedSlabGroundHoles(nodes) {
|
|
|
25
25
|
pushByLevel(slabsByLevel, levelId, node);
|
|
26
26
|
}
|
|
27
27
|
return nodeList
|
|
28
|
-
.filter((node) => node.type === 'slab' &&
|
|
28
|
+
.filter((node) => node.type === 'slab' &&
|
|
29
|
+
node.visible &&
|
|
30
|
+
node.polygon.length >= 3 &&
|
|
31
|
+
(node.recessed === true || (isFloorPlate(node) && node.elevation < -1e-4)))
|
|
29
32
|
.filter((slab) => {
|
|
30
33
|
if (!Number.isFinite(lowestLevelIndex))
|
|
31
34
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/site/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/site/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAWd,MAAM,kBAAkB,CAAA;AA0JzB,eAAO,MAAM,YAAY,GAAI,UAAU;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,uCA6fxD,CAAA;AAED,eAAe,YAAY,CAAA"}
|
package/dist/site/renderer.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { terrainFieldOf, unionPolygons, useLiveNodeOverrides, useLiveTerrain, useRegistry, useScene, } from '@pascal-app/core';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { sightTriangle, streetCorners, terrainContours, terrainFieldOf, unionPolygons, useLiveNodeOverrides, useLiveTerrain, useRegistry, useScene, } from '@pascal-app/core';
|
|
4
4
|
import { backdropGradient, deepSkyColor, getSceneTheme, horizonHazeColor, NodeRenderer, useImmersiveXRPresentation, useNodeEvents, useSceneAtmosphere, useSceneGroundReplacement, useViewer, } from '@pascal-app/viewer';
|
|
5
5
|
import { useEffect, useMemo, useRef } from 'react';
|
|
6
|
-
import { BufferAttribute, BufferGeometry, Path, Shape, ShapeGeometry } from 'three';
|
|
6
|
+
import { BufferAttribute, BufferGeometry, DoubleSide, Path, Shape, ShapeGeometry, } from 'three';
|
|
7
7
|
import { cameraPosition, color, mix, positionWorld, smoothstep, float as tslFloat, vec2, } from 'three/tsl';
|
|
8
8
|
import { MeshLambertNodeMaterial } from 'three/webgpu';
|
|
9
|
+
import { buildPatternedRibbon, PROPERTY_LINE_PATTERN, SETBACK_LINE_PATTERN, updateRibbonHeights, } from './line-ribbon';
|
|
9
10
|
import { getRecessedSlabGroundHoles } from './recessed-slab-ground-holes';
|
|
11
|
+
import { resolveFrontEdge, setbackEnvelope } from './setbacks';
|
|
10
12
|
import { buildDrapedPolyline, terrainGridKey, updateDrapedHeights, } from './terrain-drape';
|
|
11
|
-
import { HORIZON_PLANE_Y,
|
|
13
|
+
import { HORIZON_PLANE_Y, terrainBlockBase } from './terrain-geometry';
|
|
12
14
|
import { TerrainRenderer } from './terrain-renderer';
|
|
13
15
|
const Y_OFFSET = 0.01;
|
|
14
16
|
// The horizon disc is presentation-only — clicks must fall through to the
|
|
@@ -41,13 +43,15 @@ const createBoundaryLineGeometry = (points, field) => {
|
|
|
41
43
|
geometry.setAttribute('uv', new BufferAttribute(uvs, 2));
|
|
42
44
|
return { geometry, ring };
|
|
43
45
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
function redrapeRibbons(r, field) {
|
|
47
|
+
if (!r)
|
|
48
|
+
return;
|
|
49
|
+
updateRibbonHeights(r.property, field, Y_OFFSET);
|
|
50
|
+
if (r.envelope)
|
|
51
|
+
updateRibbonHeights(r.envelope, field, Y_OFFSET + 0.01);
|
|
52
|
+
for (const g of r.triangles)
|
|
53
|
+
updateRibbonHeights(g, field, Y_OFFSET + 0.012);
|
|
54
|
+
}
|
|
51
55
|
function markPositionsDirty(geometry) {
|
|
52
56
|
const attribute = geometry.getAttribute('position');
|
|
53
57
|
attribute.needsUpdate = true;
|
|
@@ -202,10 +206,11 @@ export const SiteRenderer = ({ node }) => {
|
|
|
202
206
|
addSlabHoles(shape, slabPolygons);
|
|
203
207
|
return shape;
|
|
204
208
|
}, [polygonPoints, slabPolygons]);
|
|
205
|
-
//
|
|
206
|
-
//
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
+
// With terrain the lot is a block — its ground cut to the property line, its
|
|
210
|
+
// skirt dropping to one flat base — and the disc lies just under that base, so
|
|
211
|
+
// nothing of it caps the lot and nothing of the block stands proud of it from
|
|
212
|
+
// the far side. The recessed slabs are still punched: a basement can go deeper.
|
|
213
|
+
const horizonY = useMemo(() => (terrainGrid ? terrainBlockBase(terrainGrid) - 0.02 : HORIZON_PLANE_Y), [terrainGrid]);
|
|
209
214
|
const horizonGeometry = useMemo(() => {
|
|
210
215
|
if (!fadeBounds || groundReplaced)
|
|
211
216
|
return null;
|
|
@@ -218,10 +223,9 @@ export const SiteRenderer = ({ node }) => {
|
|
|
218
223
|
shape.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);
|
|
219
224
|
}
|
|
220
225
|
shape.closePath();
|
|
221
|
-
|
|
222
|
-
addSlabHoles(shape, holes, fadeBounds.cx, fadeBounds.cz);
|
|
226
|
+
addSlabHoles(shape, slabPolygons, fadeBounds.cx, fadeBounds.cz);
|
|
223
227
|
return new ShapeGeometry(shape);
|
|
224
|
-
}, [fadeBounds, slabPolygons,
|
|
228
|
+
}, [fadeBounds, slabPolygons, groundReplaced]);
|
|
225
229
|
useEffect(() => () => horizonGeometry?.dispose(), [horizonGeometry]);
|
|
226
230
|
useEffect(() => () => horizonMaterial?.dispose(), [horizonMaterial]);
|
|
227
231
|
// Boundary line geometry, subdivided against the terrain grid when there is one.
|
|
@@ -243,6 +247,70 @@ export const SiteRenderer = ({ node }) => {
|
|
|
243
247
|
}, [polygonPoints, terrainKey, node.id]);
|
|
244
248
|
useEffect(() => () => boundary?.geometry.dispose(), [boundary]);
|
|
245
249
|
const lineGeometry = boundary?.geometry ?? null;
|
|
250
|
+
// A site with drafted setbacks draws the PROPERTY LINE as the standard line —
|
|
251
|
+
// dark, thick, a long dash and two dots — and the SETBACK lines in black
|
|
252
|
+
// dashes, both ribbons lying on the draped ground (line-ribbon.ts). Any other
|
|
253
|
+
// site keeps the plain amber boundary. Keyed on the same grid as the
|
|
254
|
+
// boundary; a dab mid-stroke moves the thin ring only, the ribbons follow
|
|
255
|
+
// on the commit.
|
|
256
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: keyed on the grid, not the field — see above.
|
|
257
|
+
const ribbons = useMemo(() => {
|
|
258
|
+
const setbacks = node.setbacks;
|
|
259
|
+
if (!setbacks || !boundary || !polygonPoints || polygonPoints.length < 3)
|
|
260
|
+
return null;
|
|
261
|
+
const field = useLiveTerrain.getState().fieldOf(node.id) ?? persistedField;
|
|
262
|
+
const property = buildPatternedRibbon(boundary.ring.positions, PROPERTY_LINE_PATTERN, 0.22);
|
|
263
|
+
let envelopeGeometry = null;
|
|
264
|
+
const triangleGeometries = [];
|
|
265
|
+
const points = polygonPoints.map(([x, z]) => [x ?? 0, z ?? 0]);
|
|
266
|
+
const front = resolveFrontEdge(points, node.frontEdge, node.northRotation ?? 0);
|
|
267
|
+
const streetEdges = node.streetEdges ?? [];
|
|
268
|
+
const sightTriangleM = typeof node.sightTriangleFt === 'number' && node.sightTriangleFt > 0
|
|
269
|
+
? node.sightTriangleFt * 0.3048
|
|
270
|
+
: 0;
|
|
271
|
+
const envelope = setbackEnvelope(points, setbacks, front, { streetEdges, sightTriangleM });
|
|
272
|
+
if (envelope.length >= 3) {
|
|
273
|
+
const draped = buildDrapedPolyline({
|
|
274
|
+
points: envelope,
|
|
275
|
+
field,
|
|
276
|
+
lift: Y_OFFSET + 0.01,
|
|
277
|
+
closed: true,
|
|
278
|
+
});
|
|
279
|
+
envelopeGeometry = buildPatternedRibbon(draped.positions, SETBACK_LINE_PATTERN, 0.1);
|
|
280
|
+
}
|
|
281
|
+
// the corner sight triangles, dashed like the setbacks
|
|
282
|
+
if (sightTriangleM > 0) {
|
|
283
|
+
for (const [a, b] of streetCorners(points, [front, ...streetEdges])) {
|
|
284
|
+
const tri = sightTriangle(points, a, b, sightTriangleM);
|
|
285
|
+
if (!tri)
|
|
286
|
+
continue;
|
|
287
|
+
const draped = buildDrapedPolyline({
|
|
288
|
+
points: [tri.corner, tri.a, tri.b],
|
|
289
|
+
field,
|
|
290
|
+
lift: Y_OFFSET + 0.012,
|
|
291
|
+
closed: true,
|
|
292
|
+
});
|
|
293
|
+
triangleGeometries.push(buildPatternedRibbon(draped.positions, SETBACK_LINE_PATTERN, 0.08));
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return { property, envelope: envelopeGeometry, triangles: triangleGeometries };
|
|
297
|
+
}, [
|
|
298
|
+
boundary,
|
|
299
|
+
polygonPoints,
|
|
300
|
+
node.setbacks,
|
|
301
|
+
node.frontEdge,
|
|
302
|
+
node.streetEdges,
|
|
303
|
+
node.sightTriangleFt,
|
|
304
|
+
node.northRotation,
|
|
305
|
+
terrainKey,
|
|
306
|
+
node.id,
|
|
307
|
+
]);
|
|
308
|
+
useEffect(() => () => {
|
|
309
|
+
ribbons?.property.dispose();
|
|
310
|
+
ribbons?.envelope?.dispose();
|
|
311
|
+
for (const g of ribbons?.triangles ?? [])
|
|
312
|
+
g.dispose();
|
|
313
|
+
}, [ribbons]);
|
|
246
314
|
// Per-dab height rewrite, imperative for the same reason `TerrainRenderer`'s
|
|
247
315
|
// upload is: a stroke pushes dozens of patches a second, and routing each through
|
|
248
316
|
// a React render would rebuild the ring's buffers at pointer rate. The XZ of every
|
|
@@ -252,6 +320,8 @@ export const SiteRenderer = ({ node }) => {
|
|
|
252
320
|
// polygon edit without resubscribing.
|
|
253
321
|
const boundaryRef = useRef(null);
|
|
254
322
|
boundaryRef.current = boundary;
|
|
323
|
+
const ribbonsRef = useRef(null);
|
|
324
|
+
ribbonsRef.current = ribbons;
|
|
255
325
|
useEffect(() => {
|
|
256
326
|
let lastPatch = useLiveTerrain.getState().strokeOf(node.id)?.lastPatch ?? null;
|
|
257
327
|
return useLiveTerrain.subscribe((state) => {
|
|
@@ -268,6 +338,7 @@ export const SiteRenderer = ({ node }) => {
|
|
|
268
338
|
const field = terrainFieldOf({ id: node.id, terrain: node.terrain });
|
|
269
339
|
updateDrapedHeights(current.ring, field, Y_OFFSET);
|
|
270
340
|
markPositionsDirty(current.geometry);
|
|
341
|
+
redrapeRibbons(ribbonsRef.current, field);
|
|
271
342
|
}
|
|
272
343
|
return;
|
|
273
344
|
}
|
|
@@ -276,8 +347,68 @@ export const SiteRenderer = ({ node }) => {
|
|
|
276
347
|
lastPatch = stroke.lastPatch;
|
|
277
348
|
updateDrapedHeights(current.ring, stroke.field, Y_OFFSET);
|
|
278
349
|
markPositionsDirty(current.geometry);
|
|
350
|
+
// the property and setback ribbons follow the same dab
|
|
351
|
+
redrapeRibbons(ribbonsRef.current, stroke.field);
|
|
279
352
|
});
|
|
280
353
|
}, [node.id, node.terrain]);
|
|
354
|
+
// The CONTOUR LINES on the ground (toggleable in 3D, drawn as faint,
|
|
355
|
+
// translucent near-black lines): the site's surveyed lines (the dossier's 3DEP set) at the
|
|
356
|
+
// site-plan interval, else the heightfield's own contours; each draped
|
|
357
|
+
// on the ground and merged into one line-segments buffer. Rebuilt on the
|
|
358
|
+
// terrain COMMIT (the persisted field), not per dab.
|
|
359
|
+
const contourGeometry = useMemo(() => {
|
|
360
|
+
if (!node.contours3d)
|
|
361
|
+
return null;
|
|
362
|
+
const intervalIn = node.contourIntervalIn ?? 12;
|
|
363
|
+
if (!(intervalIn > 0))
|
|
364
|
+
return null;
|
|
365
|
+
const field = persistedField;
|
|
366
|
+
const lot = (polygonPoints ?? []);
|
|
367
|
+
const stepFt = intervalIn / 12;
|
|
368
|
+
const surveyed = node.terrainContours;
|
|
369
|
+
const multiple = (a, b) => Math.abs(a / b - Math.round(a / b)) < 1e-9;
|
|
370
|
+
let lines = [];
|
|
371
|
+
if (surveyed && surveyed.lines.length > 0 && multiple(stepFt, surveyed.intervalFt)) {
|
|
372
|
+
lines = surveyed.lines.filter((l) => multiple(l.elevationFt, stepFt)).map((l) => l.points);
|
|
373
|
+
}
|
|
374
|
+
else if (field) {
|
|
375
|
+
lines = terrainContours(field, intervalIn * 0.0254, lot).map((c) => c.points);
|
|
376
|
+
}
|
|
377
|
+
const chunks = [];
|
|
378
|
+
let total = 0;
|
|
379
|
+
for (const points of lines) {
|
|
380
|
+
if (points.length < 2)
|
|
381
|
+
continue;
|
|
382
|
+
const draped = buildDrapedPolyline({ points, field, lift: Y_OFFSET + 0.005, closed: false });
|
|
383
|
+
const n = draped.positions.length / 3;
|
|
384
|
+
if (n < 2)
|
|
385
|
+
continue;
|
|
386
|
+
const seg = new Float32Array((n - 1) * 6);
|
|
387
|
+
for (let i = 0; i < n - 1; i++) {
|
|
388
|
+
seg[i * 6] = draped.positions[i * 3] ?? 0;
|
|
389
|
+
seg[i * 6 + 1] = draped.positions[i * 3 + 1] ?? 0;
|
|
390
|
+
seg[i * 6 + 2] = draped.positions[i * 3 + 2] ?? 0;
|
|
391
|
+
seg[i * 6 + 3] = draped.positions[i * 3 + 3] ?? 0;
|
|
392
|
+
seg[i * 6 + 4] = draped.positions[i * 3 + 4] ?? 0;
|
|
393
|
+
seg[i * 6 + 5] = draped.positions[i * 3 + 5] ?? 0;
|
|
394
|
+
}
|
|
395
|
+
chunks.push(seg);
|
|
396
|
+
total += seg.length;
|
|
397
|
+
}
|
|
398
|
+
if (total === 0)
|
|
399
|
+
return null;
|
|
400
|
+
const merged = new Float32Array(total);
|
|
401
|
+
let at = 0;
|
|
402
|
+
for (const c of chunks) {
|
|
403
|
+
merged.set(c, at);
|
|
404
|
+
at += c.length;
|
|
405
|
+
}
|
|
406
|
+
const geometry = new BufferGeometry();
|
|
407
|
+
geometry.setAttribute('position', new BufferAttribute(merged, 3));
|
|
408
|
+
geometry.computeBoundingSphere();
|
|
409
|
+
return geometry;
|
|
410
|
+
}, [node.contours3d, node.contourIntervalIn, node.terrainContours, persistedField, polygonPoints]);
|
|
411
|
+
useEffect(() => () => contourGeometry?.dispose(), [contourGeometry]);
|
|
281
412
|
const groundGeometry = useMemo(() => {
|
|
282
413
|
if (!groundShape)
|
|
283
414
|
return null;
|
|
@@ -300,6 +431,6 @@ export const SiteRenderer = ({ node }) => {
|
|
|
300
431
|
if (!(node && lineGeometry)) {
|
|
301
432
|
return null;
|
|
302
433
|
}
|
|
303
|
-
return (_jsxs("group", { ref: ref, ...handlers, children: [(node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))), showSiteSurfaces && showTerrain && _jsx(TerrainRenderer, { material: groundMaterial, site: node }), showSiteSurfaces && groundGeometry && !showTerrain && (_jsx("mesh", { geometry: groundGeometry, material: groundMaterial, position: [0, -0.05, 0], receiveShadow: true, rotation: [-Math.PI / 2, 0, 0] })), !immersiveXR && horizonGeometry && horizonMaterial && fadeBounds && (_jsx("mesh", { geometry: horizonGeometry, material: horizonMaterial, position: [fadeBounds.cx,
|
|
434
|
+
return (_jsxs("group", { ref: ref, ...handlers, children: [(node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId))), showSiteSurfaces && showTerrain && (_jsx(TerrainRenderer, { holes: slabPolygons, material: groundMaterial, polygon: polygonPoints, site: node })), showSiteSurfaces && groundGeometry && !showTerrain && (_jsx("mesh", { geometry: groundGeometry, material: groundMaterial, position: [0, -0.05, 0], receiveShadow: true, rotation: [-Math.PI / 2, 0, 0] })), !immersiveXR && horizonGeometry && horizonMaterial && fadeBounds && (_jsx("mesh", { geometry: horizonGeometry, material: horizonMaterial, position: [fadeBounds.cx, horizonY, fadeBounds.cz], raycast: noopRaycast, receiveShadow: true, rotation: [-Math.PI / 2, 0, 0], userData: { pascalExport: 'strip' } })), showSiteSurfaces && ribbons && (_jsxs(_Fragment, { children: [_jsx("mesh", { frustumCulled: false, geometry: ribbons.property, raycast: noopRaycast, renderOrder: 9, children: _jsx("meshBasicMaterial", { color: "#1c1917", depthWrite: false, side: DoubleSide, toneMapped: false }) }), ribbons.envelope && (_jsx("mesh", { frustumCulled: false, geometry: ribbons.envelope, raycast: noopRaycast, renderOrder: 9, children: _jsx("meshBasicMaterial", { color: "#000000", depthWrite: false, opacity: 0.85, side: DoubleSide, toneMapped: false, transparent: true }) })), ribbons.triangles.map((g, i) => (_jsx("mesh", { frustumCulled: false, geometry: g, raycast: noopRaycast, renderOrder: 9, children: _jsx("meshBasicMaterial", { color: "#000000", depthWrite: false, opacity: 0.85, side: DoubleSide, toneMapped: false, transparent: true }) }, i))), _jsx("line", { frustumCulled: false, geometry: lineGeometry, renderOrder: 8, children: _jsx("lineBasicMaterial", { color: "#1c1917", opacity: 0.5, transparent: true }) })] })), showSiteSurfaces && !ribbons && (_jsx("line", { frustumCulled: false, geometry: lineGeometry, renderOrder: 9, children: _jsx("lineBasicMaterial", { color: "#f59e0b", linewidth: 2, opacity: 0.6, transparent: true }) })), showSiteSurfaces && contourGeometry && (_jsx("lineSegments", { frustumCulled: false, geometry: contourGeometry, raycast: noopRaycast, renderOrder: 8, children: _jsx("lineBasicMaterial", { color: "#000000", depthWrite: false, opacity: 0.22, toneMapped: false, transparent: true }) }))] }));
|
|
304
435
|
};
|
|
305
436
|
export default SiteRenderer;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The setback envelope in the 3D site — the same rules the site plan draws
|
|
3
|
+
* (packages/editor/src/lib/floorplan/site-plan/geometry.ts: front edge,
|
|
4
|
+
* edge roles, per-role setbacks, offset-line intersections), ported here
|
|
5
|
+
* because the nodes package cannot import the editor. Pure. When the site
|
|
6
|
+
* has setbacks, the 3D view draws them black and dashed.
|
|
7
|
+
*/
|
|
8
|
+
export type Pt = readonly [number, number];
|
|
9
|
+
export type EdgeRole = 'front' | 'rear' | 'left' | 'right' | 'street';
|
|
10
|
+
export type SetbackInputs = {
|
|
11
|
+
front: number;
|
|
12
|
+
side: number;
|
|
13
|
+
rear: number;
|
|
14
|
+
left?: number;
|
|
15
|
+
right?: number;
|
|
16
|
+
/** A corner lot's second street side; absent = the front setback. */
|
|
17
|
+
streetSide?: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function polygonArea(points: readonly Pt[]): number;
|
|
20
|
+
export declare function isCounterClockwise(points: readonly Pt[]): boolean;
|
|
21
|
+
/** Unit normal of edge i pointing OUT of the polygon (away from its centroid). */
|
|
22
|
+
export declare function outwardNormal(points: readonly Pt[], i: number): Pt;
|
|
23
|
+
/** The most north-facing edge (plan up = −z = north, turned by `northRotation`). */
|
|
24
|
+
export declare function mostNorthFacingEdge(points: readonly Pt[], northRotation?: number): number;
|
|
25
|
+
export declare function resolveFrontEdge(points: readonly Pt[], frontEdge: number | undefined, northRotation?: number): number;
|
|
26
|
+
export declare function classifyEdges(points: readonly Pt[], frontIndex: number, streetEdges?: readonly number[]): EdgeRole[];
|
|
27
|
+
export declare function setbackForRole(setbacks: SetbackInputs, role: EdgeRole): number;
|
|
28
|
+
/** The buildable envelope: every edge pushed inward by its role's setback (see the editor's copy for the rules). */
|
|
29
|
+
export declare function setbackEnvelope(points: readonly Pt[], setbacks: SetbackInputs, frontIndex: number, options?: {
|
|
30
|
+
streetEdges?: readonly number[];
|
|
31
|
+
sightTriangleM?: number;
|
|
32
|
+
}): Pt[];
|
|
33
|
+
//# sourceMappingURL=setbacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setbacks.d.ts","sourceRoot":"","sources":["../../src/site/setbacks.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AACH,MAAM,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAC1C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AACrE,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAID,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,MAAM,CAQzD;AAYD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAEjE;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAwBlE;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,SAAI,GAAG,MAAM,CAcpF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,SAAI,GAChB,MAAM,CASR;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,SAAS,MAAM,EAAO,GAClC,QAAQ,EAAE,CAmDZ;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAa9E;AAED,oHAAoH;AACpH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,EAAE,EAAE,EACrB,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,EAAE,EAAE,CAwDN"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { arcRuns, insetPolygon, sightTriangle, streetCorners } from '@pascal-app/core';
|
|
2
|
+
const EPS = 1e-9;
|
|
3
|
+
export function polygonArea(points) {
|
|
4
|
+
let a = 0;
|
|
5
|
+
for (let i = 0; i < points.length; i++) {
|
|
6
|
+
const p = points[i];
|
|
7
|
+
const q = points[(i + 1) % points.length];
|
|
8
|
+
a += p[0] * q[1] - q[0] * p[1];
|
|
9
|
+
}
|
|
10
|
+
return Math.abs(a) / 2;
|
|
11
|
+
}
|
|
12
|
+
function signedArea(points) {
|
|
13
|
+
let a = 0;
|
|
14
|
+
for (let i = 0; i < points.length; i++) {
|
|
15
|
+
const p = points[i];
|
|
16
|
+
const q = points[(i + 1) % points.length];
|
|
17
|
+
a += p[0] * q[1] - q[0] * p[1];
|
|
18
|
+
}
|
|
19
|
+
return a / 2;
|
|
20
|
+
}
|
|
21
|
+
export function isCounterClockwise(points) {
|
|
22
|
+
return signedArea(points) > 0;
|
|
23
|
+
}
|
|
24
|
+
/** Unit normal of edge i pointing OUT of the polygon (away from its centroid). */
|
|
25
|
+
export function outwardNormal(points, i) {
|
|
26
|
+
const n = points.length;
|
|
27
|
+
const p = points[i];
|
|
28
|
+
const q = points[(i + 1) % n];
|
|
29
|
+
const dx = q[0] - p[0];
|
|
30
|
+
const dy = q[1] - p[1];
|
|
31
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
32
|
+
let nx = -dy / len;
|
|
33
|
+
let ny = dx / len;
|
|
34
|
+
let cx = 0;
|
|
35
|
+
let cy = 0;
|
|
36
|
+
for (const pt of points) {
|
|
37
|
+
cx += pt[0];
|
|
38
|
+
cy += pt[1];
|
|
39
|
+
}
|
|
40
|
+
cx /= n;
|
|
41
|
+
cy /= n;
|
|
42
|
+
const mx = (p[0] + q[0]) / 2;
|
|
43
|
+
const my = (p[1] + q[1]) / 2;
|
|
44
|
+
if ((mx - cx) * nx + (my - cy) * ny < 0) {
|
|
45
|
+
nx = -nx;
|
|
46
|
+
ny = -ny;
|
|
47
|
+
}
|
|
48
|
+
return [nx, ny];
|
|
49
|
+
}
|
|
50
|
+
/** The most north-facing edge (plan up = −z = north, turned by `northRotation`). */
|
|
51
|
+
export function mostNorthFacingEdge(points, northRotation = 0) {
|
|
52
|
+
let best = 0;
|
|
53
|
+
let bestScore = Number.POSITIVE_INFINITY;
|
|
54
|
+
for (let i = 0; i < points.length; i++) {
|
|
55
|
+
const [nx, ny] = outwardNormal(points, i);
|
|
56
|
+
// heading of the outward normal, degrees clockwise from north
|
|
57
|
+
const heading = (((Math.atan2(nx, -ny) - northRotation) * 180) / Math.PI + 360) % 360;
|
|
58
|
+
const off = Math.min(heading, 360 - heading);
|
|
59
|
+
if (off < bestScore) {
|
|
60
|
+
bestScore = off;
|
|
61
|
+
best = i;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return best;
|
|
65
|
+
}
|
|
66
|
+
export function resolveFrontEdge(points, frontEdge, northRotation = 0) {
|
|
67
|
+
if (typeof frontEdge === 'number' &&
|
|
68
|
+
Number.isInteger(frontEdge) &&
|
|
69
|
+
frontEdge >= 0 &&
|
|
70
|
+
frontEdge < points.length)
|
|
71
|
+
return frontEdge;
|
|
72
|
+
return mostNorthFacingEdge(points, northRotation);
|
|
73
|
+
}
|
|
74
|
+
export function classifyEdges(points, frontIndex, streetEdges = []) {
|
|
75
|
+
const n = points.length;
|
|
76
|
+
const roles = new Array(n).fill('left');
|
|
77
|
+
if (n === 0)
|
|
78
|
+
return roles;
|
|
79
|
+
const front = ((frontIndex % n) + n) % n;
|
|
80
|
+
const fn = outwardNormal(points, front);
|
|
81
|
+
// a corner lot's other street edges (the parcel fabric's frontage) are
|
|
82
|
+
// 'street' — they take the street-side setback, never a side yard, and
|
|
83
|
+
// the rear is never one of them
|
|
84
|
+
const street = new Set(streetEdges.map((i) => ((i % n) + n) % n));
|
|
85
|
+
street.delete(front);
|
|
86
|
+
let rear = -1;
|
|
87
|
+
let rearDot = Number.POSITIVE_INFINITY;
|
|
88
|
+
for (let i = 0; i < n; i++) {
|
|
89
|
+
if (i === front || street.has(i))
|
|
90
|
+
continue;
|
|
91
|
+
const ni = outwardNormal(points, i);
|
|
92
|
+
const dot = fn[0] * ni[0] + fn[1] * ni[1];
|
|
93
|
+
if (dot < rearDot) {
|
|
94
|
+
rearDot = dot;
|
|
95
|
+
rear = i;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const fp = points[front];
|
|
99
|
+
const fq = points[(front + 1) % n];
|
|
100
|
+
const dx = fq[0] - fp[0];
|
|
101
|
+
const dy = fq[1] - fp[1];
|
|
102
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
103
|
+
const ux = dx / len;
|
|
104
|
+
const uy = dy / len;
|
|
105
|
+
const fmx = (fp[0] + fq[0]) / 2;
|
|
106
|
+
const fmy = (fp[1] + fq[1]) / 2;
|
|
107
|
+
for (let i = 0; i < n; i++) {
|
|
108
|
+
if (i === front) {
|
|
109
|
+
roles[i] = 'front';
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (street.has(i)) {
|
|
113
|
+
roles[i] = 'street';
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (i === rear) {
|
|
117
|
+
roles[i] = 'rear';
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const p = points[i];
|
|
121
|
+
const q = points[(i + 1) % n];
|
|
122
|
+
const mx = (p[0] + q[0]) / 2 - fmx;
|
|
123
|
+
const my = (p[1] + q[1]) / 2 - fmy;
|
|
124
|
+
roles[i] = mx * ux + my * uy < 0 ? 'left' : 'right';
|
|
125
|
+
}
|
|
126
|
+
return roles;
|
|
127
|
+
}
|
|
128
|
+
export function setbackForRole(setbacks, role) {
|
|
129
|
+
switch (role) {
|
|
130
|
+
case 'front':
|
|
131
|
+
return setbacks.front;
|
|
132
|
+
case 'street':
|
|
133
|
+
return setbacks.streetSide ?? setbacks.front;
|
|
134
|
+
case 'rear':
|
|
135
|
+
return setbacks.rear;
|
|
136
|
+
case 'left':
|
|
137
|
+
return setbacks.left ?? setbacks.side;
|
|
138
|
+
case 'right':
|
|
139
|
+
return setbacks.right ?? setbacks.side;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** The buildable envelope: every edge pushed inward by its role's setback (see the editor's copy for the rules). */
|
|
143
|
+
export function setbackEnvelope(points, setbacks, frontIndex, options = {}) {
|
|
144
|
+
const n = points.length;
|
|
145
|
+
if (n < 3)
|
|
146
|
+
return [];
|
|
147
|
+
const streetEdges = options.streetEdges ?? [];
|
|
148
|
+
const roles = classifyEdges(points, frontIndex, streetEdges);
|
|
149
|
+
// A radius drawn as a run of short edges takes ONE role. A curb return
|
|
150
|
+
// is street frontage: a run carrying, or touching, a front / street edge
|
|
151
|
+
// is front / street all along (otherwise the last sliver of the return
|
|
152
|
+
// became a side yard, and the envelope jutted out toward the corner); a
|
|
153
|
+
// run carrying the rear is rear; else each sliver keeps its own side.
|
|
154
|
+
const runs = arcRuns(points);
|
|
155
|
+
const runRole = new Map();
|
|
156
|
+
const streetLike = (r) => r === 'front' || r === 'street';
|
|
157
|
+
for (let i = 0; i < n; i++) {
|
|
158
|
+
const r = roles[i];
|
|
159
|
+
const g = runs[i];
|
|
160
|
+
const have = runRole.get(g);
|
|
161
|
+
if (streetLike(r) || (r === 'rear' && !(have && streetLike(have))))
|
|
162
|
+
runRole.set(g, r);
|
|
163
|
+
else if (!have)
|
|
164
|
+
runRole.set(g, r);
|
|
165
|
+
}
|
|
166
|
+
for (let i = 0; i < n; i++) {
|
|
167
|
+
const g = runs[i];
|
|
168
|
+
const have = runRole.get(g);
|
|
169
|
+
if (streetLike(have))
|
|
170
|
+
continue;
|
|
171
|
+
const before = roles[(i - 1 + n) % n];
|
|
172
|
+
const after = roles[(i + 1) % n];
|
|
173
|
+
const members = runs.filter((x) => x === g).length;
|
|
174
|
+
if (members > 1) {
|
|
175
|
+
if (runs[(i - 1 + n) % n] !== g && streetLike(before))
|
|
176
|
+
runRole.set(g, before);
|
|
177
|
+
else if (runs[(i + 1) % n] !== g && streetLike(after))
|
|
178
|
+
runRole.set(g, after);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const distances = [];
|
|
182
|
+
for (let i = 0; i < n; i++) {
|
|
183
|
+
const role = runRole.get(runs[i]) ?? roles[i];
|
|
184
|
+
const d = setbackForRole(setbacks, role === 'left' || role === 'right' ? roles[i] : role);
|
|
185
|
+
if (!Number.isFinite(d) || d < 0)
|
|
186
|
+
return [];
|
|
187
|
+
distances.push(d);
|
|
188
|
+
}
|
|
189
|
+
// the corner sight triangles keep the envelope out of the clear-vision
|
|
190
|
+
// zone at each street intersection (the hypotenuse is a half-plane)
|
|
191
|
+
const keepOut = [];
|
|
192
|
+
if (options.sightTriangleM && options.sightTriangleM > 0) {
|
|
193
|
+
for (const [a, b] of streetCorners(points, [frontIndex, ...streetEdges])) {
|
|
194
|
+
const tri = sightTriangle(points, a, b, options.sightTriangleM);
|
|
195
|
+
if (tri)
|
|
196
|
+
keepOut.push({ a: tri.a, b: tri.b, inside: tri.corner });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// the true inward offset (core setback-envelope.ts): straight where the
|
|
200
|
+
// lot is straight, concentric round a radius, clipped where the offsets
|
|
201
|
+
// cross — the industry-standard setback for pie shapes, radius corners
|
|
202
|
+
// and odd lots
|
|
203
|
+
return insetPolygon(points, distances, { keepOut });
|
|
204
|
+
}
|
|
@@ -32,6 +32,14 @@ import { type HeightPatch, type TerrainField } from '@pascal-app/core';
|
|
|
32
32
|
* one. Two readers, one number.
|
|
33
33
|
*/
|
|
34
34
|
export declare const HORIZON_PLANE_Y = -0.07;
|
|
35
|
+
/**
|
|
36
|
+
* How far the skirt's base hangs below the lowest thing it must close over.
|
|
37
|
+
*
|
|
38
|
+
* Only the top edge is visually load-bearing; the base just has to be out of sight
|
|
39
|
+
* under the horizon disc. A metre reads as earth thickness from a grazing camera
|
|
40
|
+
* without being tall enough to poke out of a neighbouring excavation.
|
|
41
|
+
*/
|
|
42
|
+
export declare const SKIRT_DROP = 1;
|
|
35
43
|
/** One vertex per sample, row-major — index `r * cols + c` matches the field. */
|
|
36
44
|
export type TerrainMeshBuffers = {
|
|
37
45
|
/** xyz per sample, length `cols * rows * 3`. */
|
|
@@ -68,6 +76,11 @@ export type TerrainSkirtBuffers = {
|
|
|
68
76
|
positions: Float32Array;
|
|
69
77
|
normals: Float32Array;
|
|
70
78
|
indices: Uint32Array;
|
|
79
|
+
/**
|
|
80
|
+
* When the skirt follows the lot's property line (`skirtRing`): its x, z pairs,
|
|
81
|
+
* counter-clockwise. Absent, the skirt runs round the field's own rectangle.
|
|
82
|
+
*/
|
|
83
|
+
ring?: Float32Array;
|
|
71
84
|
};
|
|
72
85
|
/**
|
|
73
86
|
* The field's own footprint, as a polygon to punch out of the horizon disc.
|
|
@@ -89,7 +102,21 @@ export type TerrainSkirtBuffers = {
|
|
|
89
102
|
* decides whether a pit is visible, and that is a property to assert, not to eyeball.
|
|
90
103
|
*/
|
|
91
104
|
export declare function terrainFootprint(field: TerrainField): Array<[number, number]>;
|
|
92
|
-
|
|
105
|
+
/**
|
|
106
|
+
* The base of the lot as a block: one flat level under the field's lowest
|
|
107
|
+
* point (and under the horizon plane), so the skirt along the property line
|
|
108
|
+
* reads as earth whose thickness follows the slope, and the horizon disc can
|
|
109
|
+
* sit just beneath it without cutting into the lot anywhere.
|
|
110
|
+
*/
|
|
111
|
+
export declare function terrainBlockBase(field: TerrainField): number;
|
|
112
|
+
/**
|
|
113
|
+
* The lot's property line as the skirt walks it: counter-clockwise in x, z (the
|
|
114
|
+
* field perimeter's own direction, so one winding and one normal formula serve
|
|
115
|
+
* both), a point at least every half grid cell so the top edge follows the
|
|
116
|
+
* ground between samples. Empty when the polygon is not a ring.
|
|
117
|
+
*/
|
|
118
|
+
export declare function skirtRing(field: TerrainField, polygon: ReadonlyArray<readonly [number, number]>): Float32Array;
|
|
119
|
+
export declare function buildTerrainSkirt(field: TerrainField, ring?: Float32Array | null): TerrainSkirtBuffers;
|
|
93
120
|
/**
|
|
94
121
|
* Rewrite the whole skirt in place.
|
|
95
122
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terrain-geometry.d.ts","sourceRoot":"","sources":["../../src/site/terrain-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"terrain-geometry.d.ts","sourceRoot":"","sources":["../../src/site/terrain-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAIhB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAA;AAEzB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAA;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,IAAI,CAAA;AAE3B,iFAAiF;AACjF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gDAAgD;IAChD,SAAS,EAAE,YAAY,CAAA;IACvB,gDAAgD;IAChD,OAAO,EAAE,YAAY,CAAA;IACrB,+CAA+C;IAC/C,GAAG,EAAE,YAAY,CAAA;IACjB,2CAA2C;IAC3C,OAAO,EAAE,WAAW,CAAA;CACrB,CAAA;AAOD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,kBAAkB,CAkCxE;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+EAA+E;IAC/E,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,YAAY,CAAA;IACrB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,YAAY,CAAA;CACpB,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAY7E;AAwBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAO5D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAChD,YAAY,CAmBd;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,GACzB,mBAAmB,CAwBrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CA6B1F;AAgDD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAoBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,WAAW,GACjB,IAAI,CA8BN"}
|