@reekon-tools/boldr-cad 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -9
- package/dist/app/edit.d.ts +12 -1
- package/dist/app/edit.js +96 -11
- package/dist/app/edit.js.map +1 -1
- package/dist/app/state.d.ts +31 -4
- package/dist/app/state.js +31 -2
- package/dist/app/state.js.map +1 -1
- package/dist/data/memory.d.ts +5 -0
- package/dist/data/memory.js +2 -2
- package/dist/data/memory.js.map +1 -1
- package/dist/data/provider.d.ts +19 -7
- package/dist/data/sync.d.ts +7 -2
- package/dist/data/sync.js +115 -64
- package/dist/data/sync.js.map +1 -1
- package/dist/editor/actions.d.ts +1 -2
- package/dist/editor/actions.js +391 -113
- package/dist/editor/actions.js.map +1 -1
- package/dist/editor/confirm.d.ts +23 -0
- package/dist/editor/confirm.js +35 -0
- package/dist/editor/confirm.js.map +1 -0
- package/dist/editor/elevation.d.ts +191 -90
- package/dist/editor/elevation.js +812 -616
- package/dist/editor/elevation.js.map +1 -1
- package/dist/editor/face.d.ts +73 -0
- package/dist/editor/face.js +269 -0
- package/dist/editor/face.js.map +1 -0
- package/dist/editor/files.d.ts +6 -0
- package/dist/editor/files.js +50 -4
- package/dist/editor/files.js.map +1 -1
- package/dist/editor/gestures.d.ts +18 -3
- package/dist/editor/gestures.js +145 -30
- package/dist/editor/gestures.js.map +1 -1
- package/dist/editor/keypad.d.ts +19 -4
- package/dist/editor/keypad.js +39 -9
- package/dist/editor/keypad.js.map +1 -1
- package/dist/editor/keys.js +36 -4
- package/dist/editor/keys.js.map +1 -1
- package/dist/editor/laser.d.ts +20 -4
- package/dist/editor/laser.js +104 -21
- package/dist/editor/laser.js.map +1 -1
- package/dist/editor/linkActions.d.ts +49 -0
- package/dist/editor/linkActions.js +210 -0
- package/dist/editor/linkActions.js.map +1 -0
- package/dist/editor/linkFollow.d.ts +2 -0
- package/dist/editor/linkFollow.js +53 -0
- package/dist/editor/linkFollow.js.map +1 -0
- package/dist/editor/linkWrite.d.ts +13 -0
- package/dist/editor/linkWrite.js +84 -0
- package/dist/editor/linkWrite.js.map +1 -0
- package/dist/editor/links.d.ts +84 -0
- package/dist/editor/links.js +130 -0
- package/dist/editor/links.js.map +1 -0
- package/dist/editor/markup.d.ts +29 -3
- package/dist/editor/markup.js +95 -10
- package/dist/editor/markup.js.map +1 -1
- package/dist/editor/mode.d.ts +40 -2
- package/dist/editor/mode.js +71 -4
- package/dist/editor/mode.js.map +1 -1
- package/dist/editor/ports.d.ts +36 -6
- package/dist/editor/ports.js +10 -1
- package/dist/editor/ports.js.map +1 -1
- package/dist/editor/project.d.ts +38 -6
- package/dist/editor/project.js +167 -27
- package/dist/editor/project.js.map +1 -1
- package/dist/editor/selection.d.ts +10 -0
- package/dist/editor/selection.js +62 -8
- package/dist/editor/selection.js.map +1 -1
- package/dist/editor/status.js +3 -0
- package/dist/editor/status.js.map +1 -1
- package/dist/editor/tooltips.d.ts +5 -0
- package/dist/editor/tooltips.js +48 -0
- package/dist/editor/tooltips.js.map +1 -0
- package/dist/editor/view3d.d.ts +17 -0
- package/dist/editor/view3d.js +135 -0
- package/dist/editor/view3d.js.map +1 -0
- package/dist/editor/view3dState.d.ts +39 -0
- package/dist/editor/view3dState.js +44 -0
- package/dist/editor/view3dState.js.map +1 -0
- package/dist/export/dxf.js +1 -1
- package/dist/export/dxf.js.map +1 -1
- package/dist/export/pdf.js +17 -12
- package/dist/export/pdf.js.map +1 -1
- package/dist/export/plan.d.ts +23 -6
- package/dist/export/plan.js +127 -44
- package/dist/export/plan.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model/constraints.js +15 -4
- package/dist/model/constraints.js.map +1 -1
- package/dist/model/demo.js +3 -3
- package/dist/model/demo.js.map +1 -1
- package/dist/model/elevation.d.ts +6 -9
- package/dist/model/elevation.js +5 -13
- package/dist/model/elevation.js.map +1 -1
- package/dist/model/faces.d.ts +58 -0
- package/dist/model/faces.js +197 -0
- package/dist/model/faces.js.map +1 -0
- package/dist/model/facesolve.d.ts +72 -0
- package/dist/model/facesolve.js +369 -0
- package/dist/model/facesolve.js.map +1 -0
- package/dist/model/history.d.ts +3 -2
- package/dist/model/history.js +17 -11
- package/dist/model/history.js.map +1 -1
- package/dist/model/images.d.ts +18 -0
- package/dist/model/images.js +26 -0
- package/dist/model/images.js.map +1 -0
- package/dist/model/links.d.ts +46 -0
- package/dist/model/links.js +73 -0
- package/dist/model/links.js.map +1 -0
- package/dist/model/markup.d.ts +46 -0
- package/dist/model/markup.js +71 -0
- package/dist/model/markup.js.map +1 -0
- package/dist/model/measurement.d.ts +11 -0
- package/dist/model/measurement.js +24 -0
- package/dist/model/measurement.js.map +1 -0
- package/dist/model/openings.d.ts +4 -0
- package/dist/model/openings.js +4 -0
- package/dist/model/openings.js.map +1 -1
- package/dist/model/planGeom.d.ts +72 -2
- package/dist/model/planGeom.js +184 -10
- package/dist/model/planGeom.js.map +1 -1
- package/dist/model/project.js +3 -2
- package/dist/model/project.js.map +1 -1
- package/dist/model/projectfile.js +2 -1
- package/dist/model/projectfile.js.map +1 -1
- package/dist/model/rooms.js +2 -2
- package/dist/model/rooms.js.map +1 -1
- package/dist/model/settings.d.ts +6 -0
- package/dist/model/settings.js +2 -2
- package/dist/model/settings.js.map +1 -1
- package/dist/model/sketch.d.ts +14 -0
- package/dist/model/sketch.js +143 -24
- package/dist/model/sketch.js.map +1 -1
- package/dist/model/smooth.d.ts +6 -0
- package/dist/model/smooth.js +52 -0
- package/dist/model/smooth.js.map +1 -0
- package/dist/model/store.d.ts +12 -0
- package/dist/model/store.js +35 -3
- package/dist/model/store.js.map +1 -1
- package/dist/model/types.d.ts +173 -8
- package/dist/model/wallfaces.d.ts +32 -0
- package/dist/model/wallfaces.js +133 -20
- package/dist/model/wallfaces.js.map +1 -1
- package/dist/model/wallshape.d.ts +15 -0
- package/dist/model/wallshape.js +89 -0
- package/dist/model/wallshape.js.map +1 -0
- package/dist/react/BottomBar.d.ts +9 -5
- package/dist/react/BottomBar.js +213 -24
- package/dist/react/BottomBar.js.map +1 -1
- package/dist/react/Buttons.d.ts +13 -2
- package/dist/react/Buttons.js +37 -5
- package/dist/react/Buttons.js.map +1 -1
- package/dist/react/CadEditor.d.ts +46 -3
- package/dist/react/CadEditor.js +77 -20
- package/dist/react/CadEditor.js.map +1 -1
- package/dist/react/ConfirmSheet.d.ts +4 -0
- package/dist/react/ConfirmSheet.js +31 -0
- package/dist/react/ConfirmSheet.js.map +1 -0
- package/dist/react/ConflictSheet.d.ts +2 -1
- package/dist/react/ConflictSheet.js +16 -8
- package/dist/react/ConflictSheet.js.map +1 -1
- package/dist/react/Drawer.d.ts +8 -2
- package/dist/react/Drawer.js +167 -38
- package/dist/react/Drawer.js.map +1 -1
- package/dist/react/Duck.d.ts +13 -0
- package/dist/react/Duck.js +45 -0
- package/dist/react/Duck.js.map +1 -0
- package/dist/react/Empty3D.d.ts +2 -0
- package/dist/react/Empty3D.js +39 -0
- package/dist/react/Empty3D.js.map +1 -0
- package/dist/react/FitScroll.d.ts +6 -0
- package/dist/react/FitScroll.js +14 -0
- package/dist/react/FitScroll.js.map +1 -0
- package/dist/react/Icon.native.d.ts +6 -0
- package/dist/react/Icon.native.js +4 -0
- package/dist/react/Icon.native.js.map +1 -1
- package/dist/react/Icon.web.d.ts +6 -0
- package/dist/react/Icon.web.js +4 -0
- package/dist/react/Icon.web.js.map +1 -1
- package/dist/react/KeypadSheet.d.ts +9 -2
- package/dist/react/KeypadSheet.js +174 -42
- package/dist/react/KeypadSheet.js.map +1 -1
- package/dist/react/LaserTray.js +8 -5
- package/dist/react/LaserTray.js.map +1 -1
- package/dist/react/MarkupPanel.d.ts +8 -0
- package/dist/react/MarkupPanel.js +67 -0
- package/dist/react/MarkupPanel.js.map +1 -0
- package/dist/react/PageThumb.native.d.ts +7 -2
- package/dist/react/PageThumb.native.js +19 -7
- package/dist/react/PageThumb.native.js.map +1 -1
- package/dist/react/PageThumb.web.d.ts +3 -2
- package/dist/react/PageThumb.web.js +4 -4
- package/dist/react/PageThumb.web.js.map +1 -1
- package/dist/react/PlanCanvas.native.d.ts +1 -1
- package/dist/react/PlanCanvas.native.js +134 -36
- package/dist/react/PlanCanvas.native.js.map +1 -1
- package/dist/react/PlanCanvas.web.js +16 -5
- package/dist/react/PlanCanvas.web.js.map +1 -1
- package/dist/react/Popovers.d.ts +12 -6
- package/dist/react/Popovers.js +53 -26
- package/dist/react/Popovers.js.map +1 -1
- package/dist/react/Rail.d.ts +24 -0
- package/dist/react/Rail.js +324 -34
- package/dist/react/Rail.js.map +1 -1
- package/dist/react/ShapeMenu.d.ts +7 -0
- package/dist/react/ShapeMenu.js +58 -0
- package/dist/react/ShapeMenu.js.map +1 -0
- package/dist/react/Sheet.d.ts +14 -4
- package/dist/react/Sheet.js +54 -9
- package/dist/react/Sheet.js.map +1 -1
- package/dist/react/Slider.d.ts +18 -0
- package/dist/react/Slider.js +27 -0
- package/dist/react/Slider.js.map +1 -0
- package/dist/react/Toast.js +14 -6
- package/dist/react/Toast.js.map +1 -1
- package/dist/react/ToolTip.d.ts +7 -0
- package/dist/react/ToolTip.js +43 -0
- package/dist/react/ToolTip.js.map +1 -0
- package/dist/react/TopBar.d.ts +6 -3
- package/dist/react/TopBar.js +48 -17
- package/dist/react/TopBar.js.map +1 -1
- package/dist/react/Tween.d.ts +7 -0
- package/dist/react/Tween.js +26 -0
- package/dist/react/Tween.js.map +1 -0
- package/dist/react/Tween.native.d.ts +6 -0
- package/dist/react/Tween.native.js +43 -0
- package/dist/react/Tween.native.js.map +1 -0
- package/dist/react/View3D.native.d.ts +4 -0
- package/dist/react/View3D.native.js +103 -0
- package/dist/react/View3D.native.js.map +1 -0
- package/dist/react/View3D.web.d.ts +4 -0
- package/dist/react/View3D.web.js +151 -0
- package/dist/react/View3D.web.js.map +1 -0
- package/dist/react/View3DHost.d.ts +143 -0
- package/dist/react/View3DHost.js +377 -0
- package/dist/react/View3DHost.js.map +1 -0
- package/dist/react/corners.d.ts +7 -0
- package/dist/react/corners.js +51 -0
- package/dist/react/corners.js.map +1 -0
- package/dist/react/easing.d.ts +15 -0
- package/dist/react/easing.js +10 -0
- package/dist/react/easing.js.map +1 -0
- package/dist/react/host.d.ts +7 -2
- package/dist/react/host.js +8 -3
- package/dist/react/host.js.map +1 -1
- package/dist/react/hostKeypad.d.ts +56 -0
- package/dist/react/hostKeypad.js +5 -0
- package/dist/react/hostKeypad.js.map +1 -0
- package/dist/react/motion.d.ts +77 -0
- package/dist/react/motion.js +173 -0
- package/dist/react/motion.js.map +1 -0
- package/dist/react/ports.js +90 -8
- package/dist/react/ports.js.map +1 -1
- package/dist/react/saving.d.ts +15 -0
- package/dist/react/saving.js +76 -0
- package/dist/react/saving.js.map +1 -0
- package/dist/react/store.d.ts +38 -1
- package/dist/react/store.js +31 -1
- package/dist/react/store.js.map +1 -1
- package/dist/react/theme.d.ts +10 -0
- package/dist/react/theme.js +8 -0
- package/dist/react/theme.js.map +1 -1
- package/dist/react/topRow.d.ts +22 -0
- package/dist/react/topRow.js +61 -0
- package/dist/react/topRow.js.map +1 -0
- package/dist/react/touch.d.ts +6 -0
- package/dist/react/touch.js +9 -0
- package/dist/react/touch.js.map +1 -0
- package/dist/render/ctx.d.ts +8 -0
- package/dist/render/draw.d.ts +33 -1
- package/dist/render/draw.js +593 -215
- package/dist/render/draw.js.map +1 -1
- package/dist/render/elevation.d.ts +65 -43
- package/dist/render/elevation.js +414 -140
- package/dist/render/elevation.js.map +1 -1
- package/dist/render/figmaIcons.d.ts +12 -0
- package/dist/render/figmaIcons.js +21 -0
- package/dist/render/figmaIcons.js.map +1 -0
- package/dist/render/hit.d.ts +22 -2
- package/dist/render/hit.js +168 -25
- package/dist/render/hit.js.map +1 -1
- package/dist/render/icons.js +69 -10
- package/dist/render/icons.js.map +1 -1
- package/dist/render/linkTile.d.ts +15 -0
- package/dist/render/linkTile.js +369 -0
- package/dist/render/linkTile.js.map +1 -0
- package/dist/render/markup.d.ts +11 -0
- package/dist/render/markup.js +112 -0
- package/dist/render/markup.js.map +1 -0
- package/dist/render/navigate.d.ts +88 -0
- package/dist/render/navigate.js +100 -0
- package/dist/render/navigate.js.map +1 -0
- package/dist/render/snap.d.ts +20 -1
- package/dist/render/snap.js +118 -25
- package/dist/render/snap.js.map +1 -1
- package/dist/render/squircle.d.ts +8 -0
- package/dist/render/squircle.js +71 -0
- package/dist/render/squircle.js.map +1 -0
- package/dist/render/view.d.ts +115 -2
- package/dist/render/view.js +244 -19
- package/dist/render/view.js.map +1 -1
- package/dist/skia/SkiaDrawCtx.d.ts +30 -2
- package/dist/skia/SkiaDrawCtx.js +198 -43
- package/dist/skia/SkiaDrawCtx.js.map +1 -1
- package/dist/skia/host.d.ts +18 -2
- package/dist/skia/host.js +46 -1
- package/dist/skia/host.js.map +1 -1
- package/dist/solver/equations.js +37 -2
- package/dist/solver/equations.js.map +1 -1
- package/dist/solver/gauss-newton.d.ts +17 -0
- package/dist/solver/gauss-newton.js +144 -36
- package/dist/solver/gauss-newton.js.map +1 -1
- package/dist/solver/linalg.d.ts +45 -2
- package/dist/solver/linalg.js +164 -10
- package/dist/solver/linalg.js.map +1 -1
- package/dist/solver/types.d.ts +5 -0
- package/dist/tools/annotate.d.ts +57 -1
- package/dist/tools/annotate.js +64 -43
- package/dist/tools/annotate.js.map +1 -1
- package/dist/tools/chamfer.d.ts +12 -0
- package/dist/tools/chamfer.js +114 -0
- package/dist/tools/chamfer.js.map +1 -0
- package/dist/tools/corner.d.ts +38 -0
- package/dist/tools/corner.js +99 -0
- package/dist/tools/corner.js.map +1 -0
- package/dist/tools/dim.d.ts +86 -9
- package/dist/tools/dim.js +581 -96
- package/dist/tools/dim.js.map +1 -1
- package/dist/tools/elevation.js +1 -1
- package/dist/tools/elevation.js.map +1 -1
- package/dist/tools/fillet.d.ts +9 -0
- package/dist/tools/fillet.js +86 -0
- package/dist/tools/fillet.js.map +1 -0
- package/dist/tools/freehand.d.ts +3 -2
- package/dist/tools/freehand.js +19 -12
- package/dist/tools/freehand.js.map +1 -1
- package/dist/tools/index.js +14 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/line.d.ts +8 -3
- package/dist/tools/line.js +66 -30
- package/dist/tools/line.js.map +1 -1
- package/dist/tools/modify.d.ts +13 -0
- package/dist/tools/modify.js +105 -25
- package/dist/tools/modify.js.map +1 -1
- package/dist/tools/openings.js +22 -15
- package/dist/tools/openings.js.map +1 -1
- package/dist/tools/registry.d.ts +8 -0
- package/dist/tools/registry.js +42 -2
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/select.d.ts +77 -3
- package/dist/tools/select.js +560 -74
- package/dist/tools/select.js.map +1 -1
- package/dist/tools/shapes.d.ts +14 -0
- package/dist/tools/shapes.js +154 -75
- package/dist/tools/shapes.js.map +1 -1
- package/dist/units/format.d.ts +10 -2
- package/dist/units/format.js +18 -3
- package/dist/units/format.js.map +1 -1
- package/dist/view3d/build.d.ts +35 -0
- package/dist/view3d/build.js +630 -0
- package/dist/view3d/build.js.map +1 -0
- package/dist/view3d/camera.d.ts +60 -0
- package/dist/view3d/camera.js +84 -0
- package/dist/view3d/camera.js.map +1 -0
- package/dist/view3d/fatLines.d.ts +11 -0
- package/dist/view3d/fatLines.js +83 -0
- package/dist/view3d/fatLines.js.map +1 -0
- package/dist/view3d/lines.d.ts +17 -0
- package/dist/view3d/lines.js +271 -0
- package/dist/view3d/lines.js.map +1 -0
- package/dist/view3d/mesh.d.ts +51 -0
- package/dist/view3d/mesh.js +101 -0
- package/dist/view3d/mesh.js.map +1 -0
- package/dist/view3d/poly.d.ts +16 -0
- package/dist/view3d/poly.js +109 -0
- package/dist/view3d/poly.js.map +1 -0
- package/dist/view3d/viewer.d.ts +86 -0
- package/dist/view3d/viewer.js +350 -0
- package/dist/view3d/viewer.js.map +1 -0
- package/package.json +15 -2
- package/src/app/edit.ts +83 -12
- package/src/app/main.ts +11 -5
- package/src/app/state.ts +38 -5
- package/src/data/memory.ts +2 -2
- package/src/data/provider.ts +15 -7
- package/src/data/sync.ts +87 -50
- package/src/editor/actions.ts +292 -83
- package/src/editor/confirm.ts +58 -0
- package/src/editor/elevation.ts +698 -478
- package/src/editor/face.ts +227 -0
- package/src/editor/files.ts +40 -4
- package/src/editor/gestures.ts +147 -31
- package/src/editor/keypad.ts +43 -11
- package/src/editor/keys.ts +25 -5
- package/src/editor/laser.ts +98 -20
- package/src/editor/linkActions.ts +194 -0
- package/src/editor/linkFollow.ts +43 -0
- package/src/editor/linkWrite.ts +77 -0
- package/src/editor/links.ts +181 -0
- package/src/editor/markup.ts +92 -8
- package/src/editor/mode.ts +83 -7
- package/src/editor/ports.ts +37 -6
- package/src/editor/project.ts +155 -26
- package/src/editor/selection.ts +54 -8
- package/src/editor/status.ts +2 -0
- package/src/editor/tooltips.ts +47 -0
- package/src/editor/view3d.ts +119 -0
- package/src/editor/view3dState.ts +61 -0
- package/src/export/dxf.ts +1 -1
- package/src/export/pdf.ts +15 -7
- package/src/export/plan.ts +119 -35
- package/src/index.ts +5 -0
- package/src/input/keyboard.ts +2 -4
- package/src/model/constraints.ts +13 -4
- package/src/model/demo.ts +3 -3
- package/src/model/elevation.ts +6 -16
- package/src/model/faces.ts +153 -0
- package/src/model/facesolve.ts +322 -0
- package/src/model/history.ts +19 -11
- package/src/model/images.ts +35 -0
- package/src/model/links.ts +77 -0
- package/src/model/markup.ts +80 -0
- package/src/model/measurement.ts +26 -0
- package/src/model/openings.ts +6 -0
- package/src/model/planGeom.ts +174 -8
- package/src/model/project.ts +3 -2
- package/src/model/projectfile.ts +2 -1
- package/src/model/rooms.ts +1 -1
- package/src/model/settings.ts +8 -2
- package/src/model/sketch.ts +101 -14
- package/src/model/smooth.ts +51 -0
- package/src/model/store.ts +35 -4
- package/src/model/types.ts +170 -8
- package/src/model/wallfaces.ts +126 -17
- package/src/model/wallshape.ts +97 -0
- package/src/react/BottomBar.tsx +263 -46
- package/src/react/Buttons.tsx +50 -9
- package/src/react/CadEditor.tsx +133 -30
- package/src/react/ConfirmSheet.tsx +38 -0
- package/src/react/ConflictSheet.tsx +19 -12
- package/src/react/Drawer.tsx +213 -110
- package/src/react/Duck.tsx +50 -0
- package/src/react/Empty3D.tsx +32 -0
- package/src/react/FitScroll.tsx +19 -0
- package/src/react/Icon.native.tsx +5 -0
- package/src/react/Icon.web.tsx +5 -0
- package/src/react/KeypadSheet.tsx +253 -60
- package/src/react/LaserTray.tsx +12 -8
- package/src/react/MarkupPanel.tsx +150 -0
- package/src/react/PageThumb.native.tsx +18 -7
- package/src/react/PageThumb.web.tsx +4 -4
- package/src/react/PlanCanvas.native.tsx +151 -34
- package/src/react/PlanCanvas.web.tsx +15 -5
- package/src/react/Popovers.tsx +116 -51
- package/src/react/Rail.tsx +360 -27
- package/src/react/ShapeMenu.tsx +66 -0
- package/src/react/Sheet.tsx +56 -11
- package/src/react/Slider.tsx +48 -0
- package/src/react/Toast.tsx +16 -9
- package/src/react/ToolTip.tsx +49 -0
- package/src/react/TopBar.tsx +97 -39
- package/src/react/Tween.native.tsx +36 -0
- package/src/react/Tween.tsx +24 -0
- package/src/react/View3D.native.tsx +131 -0
- package/src/react/View3D.web.tsx +131 -0
- package/src/react/View3DHost.ts +367 -0
- package/src/react/corners.ts +52 -0
- package/src/react/easing.ts +14 -0
- package/src/react/host.ts +8 -3
- package/src/react/hostKeypad.ts +66 -0
- package/src/react/motion.tsx +239 -0
- package/src/react/ports.ts +78 -9
- package/src/react/saving.ts +80 -0
- package/src/react/store.ts +35 -3
- package/src/react/theme.ts +8 -0
- package/src/react/topRow.ts +71 -0
- package/src/react/touch.ts +10 -0
- package/src/render/ctx.ts +8 -0
- package/src/render/draw.ts +437 -175
- package/src/render/elevation.ts +349 -143
- package/src/render/figmaIcons.ts +22 -0
- package/src/render/hit.ts +140 -21
- package/src/render/icons.ts +69 -10
- package/src/render/linkTile.ts +297 -0
- package/src/render/markup.ts +91 -0
- package/src/render/navigate.ts +114 -0
- package/src/render/snap.ts +105 -22
- package/src/render/squircle.ts +73 -0
- package/src/render/view.ts +255 -19
- package/src/skia/SkiaDrawCtx.ts +163 -41
- package/src/skia/host.ts +46 -1
- package/src/solver/equations.ts +37 -2
- package/src/solver/gauss-newton.ts +125 -28
- package/src/solver/linalg.ts +141 -5
- package/src/solver/types.ts +5 -0
- package/src/styles.css +91 -42
- package/src/tools/annotate.ts +58 -29
- package/src/tools/chamfer.ts +103 -0
- package/src/tools/corner.ts +99 -0
- package/src/tools/dim.ts +524 -92
- package/src/tools/elevation.ts +1 -1
- package/src/tools/fillet.ts +82 -0
- package/src/tools/freehand.ts +20 -16
- package/src/tools/index.ts +17 -4
- package/src/tools/line.ts +59 -23
- package/src/tools/modify.ts +86 -24
- package/src/tools/openings.ts +8 -13
- package/src/tools/registry.ts +27 -2
- package/src/tools/select.ts +424 -75
- package/src/tools/shapes.ts +119 -58
- package/src/ui/ctx.ts +2 -1
- package/src/ui/domPorts.ts +23 -4
- package/src/ui/drawer.ts +6 -26
- package/src/ui/elevation.ts +10 -101
- package/src/ui/keypad.ts +8 -14
- package/src/ui/laser.ts +2 -2
- package/src/ui/menu.ts +63 -17
- package/src/ui/noteinput.ts +3 -3
- package/src/ui/opacity.ts +108 -0
- package/src/ui/palette.ts +67 -12
- package/src/ui/rail.ts +21 -7
- package/src/ui/topbar.ts +4 -14
- package/src/units/format.ts +18 -3
- package/src/view3d/build.ts +607 -0
- package/src/view3d/camera.ts +113 -0
- package/src/view3d/fatLines.ts +83 -0
- package/src/view3d/lines.ts +258 -0
- package/src/view3d/mesh.ts +111 -0
- package/src/view3d/poly.ts +104 -0
- package/src/view3d/viewer.ts +348 -0
- package/dist/react/ElevCanvas.native.d.ts +0 -3
- package/dist/react/ElevCanvas.native.js +0 -58
- package/dist/react/ElevCanvas.native.js.map +0 -1
- package/dist/react/ElevCanvas.web.d.ts +0 -4
- package/dist/react/ElevCanvas.web.js +0 -44
- package/dist/react/ElevCanvas.web.js.map +0 -1
- package/dist/react/ElevationSheet.d.ts +0 -2
- package/dist/react/ElevationSheet.js +0 -38
- package/dist/react/ElevationSheet.js.map +0 -1
- package/dist/render/elevationView.d.ts +0 -3
- package/dist/render/elevationView.js +0 -100
- package/dist/render/elevationView.js.map +0 -1
- package/src/react/ElevCanvas.native.tsx +0 -68
- package/src/react/ElevCanvas.web.tsx +0 -42
- package/src/react/ElevationSheet.tsx +0 -88
- package/src/render/elevationView.ts +0 -73
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { area, clipBand, clipHalf, tidy } from './poly';
|
|
2
|
+
const EPS = 1e-6, TAU = 2 * Math.PI;
|
|
3
|
+
/** Corners straighter than this (radians) aren't drawn: a curved wall is drawn as gently angled stretches. */
|
|
4
|
+
const STRAIGHT = (10 * Math.PI) / 180;
|
|
5
|
+
/** Intervals in order, touching and overlapping ones joined, empty ones gone. */
|
|
6
|
+
export function mergeIv(iv) {
|
|
7
|
+
const s = iv.filter(([a, b]) => b - a > EPS).sort((p, q) => p[0] - q[0]), out = [];
|
|
8
|
+
for (const [a, b] of s) {
|
|
9
|
+
const last = out[out.length - 1];
|
|
10
|
+
if (last && a <= last[1] + EPS)
|
|
11
|
+
last[1] = Math.max(last[1], b);
|
|
12
|
+
else
|
|
13
|
+
out.push([a, b]);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
const solid = (iv, z) => iv.some(([a, b]) => z > a && z < b);
|
|
18
|
+
/**
|
|
19
|
+
* Cell `c` split across a band (within `half` of the line through `o` along unit `u`): what's inside it solid on up to
|
|
20
|
+
* `top`, the parts either side as they were.
|
|
21
|
+
*/
|
|
22
|
+
export function raiseIn(c, o, u, half, top) {
|
|
23
|
+
const inside = tidy(clipBand(c.poly, o, u, half));
|
|
24
|
+
if (inside.length < 3 || area(inside) < 1e-6)
|
|
25
|
+
return [c];
|
|
26
|
+
const nx = -u.y, ny = u.x, k = nx * o.x + ny * o.y, hi = c.iv.length ? c.iv[c.iv.length - 1][1] : 0;
|
|
27
|
+
const out = [{ poly: inside, iv: mergeIv([...c.iv, [hi, Math.max(hi, top)]]) }];
|
|
28
|
+
for (const side of [tidy(clipHalf(c.poly, -nx, -ny, -(k + half))), tidy(clipHalf(c.poly, nx, ny, k - half))]) {
|
|
29
|
+
if (side.length >= 3 && area(side) > 1e-6)
|
|
30
|
+
out.push({ poly: side, iv: c.iv });
|
|
31
|
+
}
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Whether there's an edge at a height along a cell's side, from what's solid just above and below it in the cell (ca,
|
|
36
|
+
* cb) and across the side (na, nb): not when nothing or everything is, nor when the solid's face there is flat.
|
|
37
|
+
*/
|
|
38
|
+
function crease(ca, cb, na, nb) {
|
|
39
|
+
const n = +ca + +cb + +na + +nb;
|
|
40
|
+
if (n === 0 || n === 4)
|
|
41
|
+
return false;
|
|
42
|
+
if (n === 2 && ((ca && cb) || (na && nb) || (cb && nb) || (ca && na)))
|
|
43
|
+
return false;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
/** Whether wedges of solid round a point (start angle and span each) make a corner there, seen from above. */
|
|
47
|
+
function corner(ws) {
|
|
48
|
+
const total = ws.reduce((s, w) => s + w.span, 0);
|
|
49
|
+
if (total < 1e-3 || total > TAU - 1e-2)
|
|
50
|
+
return false;
|
|
51
|
+
// the wedges that run on into each other, joined
|
|
52
|
+
const s = ws.map(w => ({ start: ((w.start % TAU) + TAU) % TAU, span: w.span })).sort((p, q) => p.start - q.start), runs = [];
|
|
53
|
+
for (const w of s) {
|
|
54
|
+
const last = runs[runs.length - 1];
|
|
55
|
+
if (last && Math.abs(last.start + last.span - w.start) < 1e-3)
|
|
56
|
+
last.span += w.span;
|
|
57
|
+
else
|
|
58
|
+
runs.push({ ...w });
|
|
59
|
+
}
|
|
60
|
+
if (runs.length > 1 && Math.abs(runs[runs.length - 1].start + runs[runs.length - 1].span - TAU - runs[0].start) < 1e-3) {
|
|
61
|
+
const last = runs.pop();
|
|
62
|
+
runs[0] = { start: last.start, span: last.span + runs[0].span };
|
|
63
|
+
}
|
|
64
|
+
return !(runs.length === 1 && Math.abs(runs[0].span - Math.PI) < STRAIGHT);
|
|
65
|
+
}
|
|
66
|
+
const near = (p, q) => Math.abs(p.x - q.x) < 1e-5 && Math.abs(p.y - q.y) < 1e-5;
|
|
67
|
+
/** How far round something to look for what's near it: a touch more than `near` allows. */
|
|
68
|
+
const REACH = 2e-5;
|
|
69
|
+
/**
|
|
70
|
+
* Items found by where they are: each is kept in the squares (`size` inches across) its box covers, so what might meet a
|
|
71
|
+
* box is found in the squares that box covers, not by asking everything. Asking every cell edge about every other made
|
|
72
|
+
* the outlines cost the square of the plan: most of the build on a big one, and a phone builds again as the cutaway
|
|
73
|
+
* turns.
|
|
74
|
+
*/
|
|
75
|
+
class Grid {
|
|
76
|
+
size;
|
|
77
|
+
at = new Map();
|
|
78
|
+
seen;
|
|
79
|
+
stamp = 0;
|
|
80
|
+
constructor(size, count) {
|
|
81
|
+
this.size = size;
|
|
82
|
+
this.seen = new Uint32Array(count);
|
|
83
|
+
}
|
|
84
|
+
/** Item `id` (0 up to the count) covers x0 to x1, y0 to y1. */
|
|
85
|
+
add(id, x0, y0, x1, y1) {
|
|
86
|
+
const s = this.size;
|
|
87
|
+
for (let i = Math.floor(x0 / s), i1 = Math.floor(x1 / s); i <= i1; i++) {
|
|
88
|
+
for (let j = Math.floor(y0 / s), j1 = Math.floor(y1 / s); j <= j1; j++) {
|
|
89
|
+
const k = square(i, j), list = this.at.get(k);
|
|
90
|
+
if (list)
|
|
91
|
+
list.push(id);
|
|
92
|
+
else
|
|
93
|
+
this.at.set(k, [id]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** The items whose boxes might meet x0 to x1, y0 to y1: each once, in the order of their ids (as a scan would meet them). */
|
|
98
|
+
near(x0, y0, x1, y1) {
|
|
99
|
+
const s = this.size, out = [];
|
|
100
|
+
this.stamp++;
|
|
101
|
+
for (let i = Math.floor(x0 / s), i1 = Math.floor(x1 / s); i <= i1; i++) {
|
|
102
|
+
for (let j = Math.floor(y0 / s), j1 = Math.floor(y1 / s); j <= j1; j++) {
|
|
103
|
+
const list = this.at.get(square(i, j));
|
|
104
|
+
if (list)
|
|
105
|
+
for (const id of list)
|
|
106
|
+
if (this.seen[id] !== this.stamp) {
|
|
107
|
+
this.seen[id] = this.stamp;
|
|
108
|
+
out.push(id);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out.sort((p, q) => p - q);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** A grid square's key (plans reach nowhere near 2^20 squares from the origin). */
|
|
116
|
+
const square = (i, j) => (i + 1048576) * 2097152 + (j + 1048576);
|
|
117
|
+
/** The box round points `ps`: x0, y0, x1, y1. */
|
|
118
|
+
function boxOf(ps) {
|
|
119
|
+
let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
|
|
120
|
+
for (const p of ps) {
|
|
121
|
+
x0 = Math.min(x0, p.x);
|
|
122
|
+
y0 = Math.min(y0, p.y);
|
|
123
|
+
x1 = Math.max(x1, p.x);
|
|
124
|
+
y1 = Math.max(y1, p.y);
|
|
125
|
+
}
|
|
126
|
+
return [x0, y0, x1, y1];
|
|
127
|
+
}
|
|
128
|
+
/** Squares of the grids the outlines are worked out on: about a wall's length, and an inch for points. */
|
|
129
|
+
const EDGE_SQ = 24, POINT_SQ = 1;
|
|
130
|
+
/** The outlines of `cells`, as line segments: x, y, z of one end, then the other, for each. */
|
|
131
|
+
export function cellLines(cells) {
|
|
132
|
+
const out = [];
|
|
133
|
+
const seg = (a, za, b, zb) => out.push(a.x, a.y, za, b.x, b.y, zb);
|
|
134
|
+
const edges = cells.flatMap((c, ci) => c.poly.map((a, i) => ({ ci, a, b: c.poly[(i + 1) % c.poly.length] })));
|
|
135
|
+
const byEdge = new Grid(EDGE_SQ, edges.length);
|
|
136
|
+
edges.forEach((e, i) => byEdge.add(i, Math.min(e.a.x, e.b.x), Math.min(e.a.y, e.b.y), Math.max(e.a.x, e.b.x), Math.max(e.a.y, e.b.y)));
|
|
137
|
+
// along the cells' sides
|
|
138
|
+
for (const e of edges) {
|
|
139
|
+
const dx = e.b.x - e.a.x, dy = e.b.y - e.a.y, L2 = dx * dx + dy * dy, L = Math.sqrt(L2);
|
|
140
|
+
if (L < EPS)
|
|
141
|
+
continue;
|
|
142
|
+
// the stretches of it another cell's side runs along, the other way (the cell across it)
|
|
143
|
+
const shared = [];
|
|
144
|
+
const x0 = Math.min(e.a.x, e.b.x) - REACH, y0 = Math.min(e.a.y, e.b.y) - REACH, x1 = Math.max(e.a.x, e.b.x) + REACH, y1 = Math.max(e.a.y, e.b.y) + REACH;
|
|
145
|
+
for (const k of byEdge.near(x0, y0, x1, y1)) {
|
|
146
|
+
const f = edges[k];
|
|
147
|
+
if (f.ci === e.ci)
|
|
148
|
+
continue;
|
|
149
|
+
const off = (p) => Math.abs((p.x - e.a.x) * dy - (p.y - e.a.y) * dx) / L;
|
|
150
|
+
if (off(f.a) > 1e-5 || off(f.b) > 1e-5 || (f.b.x - f.a.x) * dx + (f.b.y - f.a.y) * dy >= 0)
|
|
151
|
+
continue;
|
|
152
|
+
const ta = ((f.a.x - e.a.x) * dx + (f.a.y - e.a.y) * dy) / L2, tb = ((f.b.x - e.a.x) * dx + (f.b.y - e.a.y) * dy) / L2;
|
|
153
|
+
const t0 = Math.max(0, Math.min(ta, tb)), t1 = Math.min(1, Math.max(ta, tb));
|
|
154
|
+
if (t1 - t0 > 1e-9)
|
|
155
|
+
shared.push({ t0, t1, ci: f.ci });
|
|
156
|
+
}
|
|
157
|
+
const cuts = [...new Set([0, 1, ...shared.flatMap(s => [s.t0, s.t1])])].sort((p, q) => p - q);
|
|
158
|
+
const c = cells[e.ci];
|
|
159
|
+
for (let k = 0; k + 1 < cuts.length; k++) {
|
|
160
|
+
const t0 = cuts[k], t1 = cuts[k + 1];
|
|
161
|
+
if (t1 - t0 < 1e-9)
|
|
162
|
+
continue;
|
|
163
|
+
const m = (t0 + t1) / 2, across = shared.find(s => s.t0 <= m && s.t1 >= m), n = across ? cells[across.ci] : null;
|
|
164
|
+
// (each stretch once: from the cell with nothing across it, or the first of the two)
|
|
165
|
+
if (across && across.ci < e.ci)
|
|
166
|
+
continue;
|
|
167
|
+
const P = { x: e.a.x + dx * t0, y: e.a.y + dy * t0 }, Q = { x: e.a.x + dx * t1, y: e.a.y + dy * t1 };
|
|
168
|
+
const zs = [...new Set([...c.iv.flat(), ...(n ? n.iv.flat() : [])])];
|
|
169
|
+
for (const z of zs) {
|
|
170
|
+
const up = z + 1e-4, down = z - 1e-4;
|
|
171
|
+
if (crease(solid(c.iv, up), solid(c.iv, down), !!n && solid(n.iv, up), !!n && solid(n.iv, down)))
|
|
172
|
+
seg(P, z, Q, z);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// up the corners
|
|
177
|
+
const points = [], byPoint = new Grid(POINT_SQ, edges.length);
|
|
178
|
+
for (const c of cells) {
|
|
179
|
+
for (const p of c.poly) {
|
|
180
|
+
if (byPoint.near(p.x - REACH, p.y - REACH, p.x + REACH, p.y + REACH).some(k => near(p, points[k])))
|
|
181
|
+
continue;
|
|
182
|
+
byPoint.add(points.length, p.x, p.y, p.x, p.y);
|
|
183
|
+
points.push(p);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const byCell = new Grid(EDGE_SQ, cells.length);
|
|
187
|
+
cells.forEach((c, i) => { const [x0, y0, x1, y1] = boxOf(c.poly); byCell.add(i, x0, y0, x1, y1); });
|
|
188
|
+
for (const v of points) {
|
|
189
|
+
const ws = [];
|
|
190
|
+
for (const ci of byCell.near(v.x - REACH, v.y - REACH, v.x + REACH, v.y + REACH)) {
|
|
191
|
+
const c = cells[ci], n = c.poly.length, j = c.poly.findIndex(p => near(p, v));
|
|
192
|
+
if (j >= 0) {
|
|
193
|
+
const prev = c.poly[(j + n - 1) % n], next = c.poly[(j + 1) % n];
|
|
194
|
+
const start = Math.atan2(next.y - v.y, next.x - v.x), end = Math.atan2(prev.y - v.y, prev.x - v.x);
|
|
195
|
+
const span = (((end - start) % TAU) + TAU) % TAU;
|
|
196
|
+
if (span > 1e-6)
|
|
197
|
+
ws.push({ start, span, iv: c.iv });
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
// (on one of its sides, not at a corner: a half turn of it)
|
|
201
|
+
for (let i = 0; i < n; i++) {
|
|
202
|
+
const a = c.poly[i], b = c.poly[(i + 1) % n], dx = b.x - a.x, dy = b.y - a.y, L2 = dx * dx + dy * dy;
|
|
203
|
+
if (L2 < EPS)
|
|
204
|
+
continue;
|
|
205
|
+
const t = ((v.x - a.x) * dx + (v.y - a.y) * dy) / L2, off = Math.abs((v.x - a.x) * dy - (v.y - a.y) * dx) / Math.sqrt(L2);
|
|
206
|
+
if (off < 1e-5 && t > 1e-6 && t < 1 - 1e-6) {
|
|
207
|
+
ws.push({ start: Math.atan2(dy, dx), span: Math.PI, iv: c.iv });
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const zs = [...new Set(ws.flatMap(w => w.iv.flat()))].sort((p, q) => p - q);
|
|
213
|
+
let from = null;
|
|
214
|
+
for (let k = 0; k + 1 < zs.length; k++) {
|
|
215
|
+
const mid = (zs[k] + zs[k + 1]) / 2, on = corner(ws.filter(w => solid(w.iv, mid)));
|
|
216
|
+
if (on && from == null)
|
|
217
|
+
from = zs[k];
|
|
218
|
+
if (!on && from != null) {
|
|
219
|
+
seg(v, from, v, zs[k]);
|
|
220
|
+
from = null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (from != null)
|
|
224
|
+
seg(v, from, v, zs[zs.length - 1]);
|
|
225
|
+
}
|
|
226
|
+
return simplify(out);
|
|
227
|
+
}
|
|
228
|
+
/** Lines closer together than this (inches) read as one: where many walls meet, only one is drawn. */
|
|
229
|
+
const CLOSE = 1;
|
|
230
|
+
/**
|
|
231
|
+
* Fewer lines where many walls meet: of corners up the walls standing closer than CLOSE, one; and none of the scraps
|
|
232
|
+
* of edge shorter than that between them.
|
|
233
|
+
*/
|
|
234
|
+
function simplify(segs) {
|
|
235
|
+
const out = [], up = [];
|
|
236
|
+
for (let i = 0; i < segs.length; i += 6) {
|
|
237
|
+
const [ax, ay, az, bx, by, bz] = segs.slice(i, i + 6);
|
|
238
|
+
if (Math.abs(ax - bx) < 1e-6 && Math.abs(ay - by) < 1e-6) {
|
|
239
|
+
up.push([ax, ay, Math.min(az, bz), Math.max(az, bz)]);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (Math.abs(az - bz) < 1e-6 && Math.hypot(bx - ax, by - ay) < CLOSE / 2)
|
|
243
|
+
continue;
|
|
244
|
+
out.push(ax, ay, az, bx, by, bz);
|
|
245
|
+
}
|
|
246
|
+
// the longest first: a short corner beside a longer one is the one let go
|
|
247
|
+
up.sort((p, q) => q[3] - q[2] - (p[3] - p[2]));
|
|
248
|
+
const kept = [], byKept = new Grid(CLOSE, up.length);
|
|
249
|
+
for (const v of up) {
|
|
250
|
+
const twin = byKept.near(v[0] - CLOSE, v[1] - CLOSE, v[0] + CLOSE, v[1] + CLOSE)
|
|
251
|
+
.some(i => { const k = kept[i]; return Math.hypot(k[0] - v[0], k[1] - v[1]) < CLOSE && Math.min(k[3], v[3]) - Math.max(k[2], v[2]) > 0.5 * (v[3] - v[2]); });
|
|
252
|
+
if (twin)
|
|
253
|
+
continue;
|
|
254
|
+
byKept.add(kept.length, v[0], v[1], v[0], v[1]);
|
|
255
|
+
kept.push(v);
|
|
256
|
+
out.push(v[0], v[1], v[2], v[0], v[1], v[3]);
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
/** A box's twelve edges (a cabinet: `poly` its four corners), from z0 to z1, and round it at each of `rings`. */
|
|
261
|
+
export function boxLines(poly, z0, z1, rings = []) {
|
|
262
|
+
const out = [];
|
|
263
|
+
for (let i = 0; i < poly.length; i++) {
|
|
264
|
+
const a = poly[i], b = poly[(i + 1) % poly.length];
|
|
265
|
+
for (const z of [z0, z1, ...rings])
|
|
266
|
+
out.push(a.x, a.y, z, b.x, b.y, z);
|
|
267
|
+
out.push(a.x, a.y, z0, a.x, a.y, z1);
|
|
268
|
+
}
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.js","sourceRoot":"","sources":["../../src/view3d/lines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { XY } from '../model/types';
|
|
2
|
+
/** What a surface is drawn with. 'pick': not drawn, only there to be tapped (a doorway). */
|
|
3
|
+
export type Mat3 = 'wall' | 'top' | 'floor' | 'cab' | 'counter' | 'glass' | 'door' | 'frame' | 'pick';
|
|
4
|
+
export declare const MATS: readonly Mat3[];
|
|
5
|
+
/** What a part is, as a tap picks it: a straight wall, a curved one, a space's floor, a cabinet, a door or window. */
|
|
6
|
+
export type PartKind = 'wall' | 'curve' | 'floor' | 'cab' | 'opening';
|
|
7
|
+
/**
|
|
8
|
+
* One thing in the 3D view, as triangles grouped by what they're drawn with. Plan inches: x and y as on the plan, z up
|
|
9
|
+
* from the floor.
|
|
10
|
+
*/
|
|
11
|
+
export interface Part3 {
|
|
12
|
+
kind: PartKind;
|
|
13
|
+
id: string;
|
|
14
|
+
/** x, y, z of each vertex */
|
|
15
|
+
pos: number[];
|
|
16
|
+
/** the surface's normal at each vertex */
|
|
17
|
+
nrm: number[];
|
|
18
|
+
/** triangles, as vertex index triples, for each material */
|
|
19
|
+
tris: Partial<Record<Mat3, number[]>>;
|
|
20
|
+
}
|
|
21
|
+
export type V3 = [number, number, number];
|
|
22
|
+
/** Makes a part's triangles: flat faces, polygons laid flat, and upright prisms. */
|
|
23
|
+
export declare class PartBuilder implements Part3 {
|
|
24
|
+
readonly kind: PartKind;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
pos: number[];
|
|
27
|
+
nrm: number[];
|
|
28
|
+
tris: Partial<Record<Mat3, number[]>>;
|
|
29
|
+
constructor(kind: PartKind, id: string);
|
|
30
|
+
private vert;
|
|
31
|
+
private tri;
|
|
32
|
+
/**
|
|
33
|
+
* A flat four-cornered face that faces `n`: its corners in order around it, either way round (it's turned to face
|
|
34
|
+
* n). `ns`: a normal for each corner instead, for a curved surface shaded smooth.
|
|
35
|
+
*/
|
|
36
|
+
quad(mat: Mat3, a: V3, b: V3, c: V3, d: V3, n: V3, ns?: [V3, V3, V3, V3]): void;
|
|
37
|
+
/**
|
|
38
|
+
* A flat convex face with corners `pts` in order round it (some may lie along its sides: the corners of the faces
|
|
39
|
+
* beside it, so the two meet without a seam), facing n: triangles fanned from its middle.
|
|
40
|
+
*/
|
|
41
|
+
fan(mat: Mat3, pts: V3[], n: V3): void;
|
|
42
|
+
/** Polygon `poly` (counter-clockwise) laid flat at height z, facing up or down. */
|
|
43
|
+
cap(mat: Mat3, poly: XY[], z: number, up?: boolean): void;
|
|
44
|
+
/**
|
|
45
|
+
* An upright prism: polygon `poly` (counter-clockwise) from z0 up to z1 — its sides, its top (`top`: what it's
|
|
46
|
+
* drawn with; null, no top) and its underside (by default only when it's off the floor).
|
|
47
|
+
*/
|
|
48
|
+
prism(poly: XY[], z0: number, z1: number, side: Mat3, top: Mat3 | null, bottom?: Mat3 | null): void;
|
|
49
|
+
/** Whether nothing was made. */
|
|
50
|
+
get empty(): boolean;
|
|
51
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { triangulate } from './poly';
|
|
2
|
+
export const MATS = ['wall', 'top', 'floor', 'cab', 'counter', 'glass', 'door', 'frame', 'pick'];
|
|
3
|
+
/** Makes a part's triangles: flat faces, polygons laid flat, and upright prisms. */
|
|
4
|
+
export class PartBuilder {
|
|
5
|
+
kind;
|
|
6
|
+
id;
|
|
7
|
+
pos = [];
|
|
8
|
+
nrm = [];
|
|
9
|
+
tris = {};
|
|
10
|
+
constructor(kind, id) {
|
|
11
|
+
this.kind = kind;
|
|
12
|
+
this.id = id;
|
|
13
|
+
}
|
|
14
|
+
vert(p, n) {
|
|
15
|
+
this.pos.push(p[0], p[1], p[2]);
|
|
16
|
+
this.nrm.push(n[0], n[1], n[2]);
|
|
17
|
+
return this.pos.length / 3 - 1;
|
|
18
|
+
}
|
|
19
|
+
tri(mat, a, b, c) {
|
|
20
|
+
(this.tris[mat] ??= []).push(a, b, c);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A flat four-cornered face that faces `n`: its corners in order around it, either way round (it's turned to face
|
|
24
|
+
* n). `ns`: a normal for each corner instead, for a curved surface shaded smooth.
|
|
25
|
+
*/
|
|
26
|
+
quad(mat, a, b, c, d, n, ns) {
|
|
27
|
+
const ux = b[0] - a[0], uy = b[1] - a[1], uz = b[2] - a[2], vx = d[0] - a[0], vy = d[1] - a[1], vz = d[2] - a[2];
|
|
28
|
+
const cx = uy * vz - uz * vy, cy = uz * vx - ux * vz, cz = ux * vy - uy * vx;
|
|
29
|
+
let pts = [a, b, c, d], nn = ns ?? [n, n, n, n];
|
|
30
|
+
// (counter-clockwise, seen from where it faces)
|
|
31
|
+
if (cx * n[0] + cy * n[1] + cz * n[2] < 0) {
|
|
32
|
+
pts = [a, d, c, b];
|
|
33
|
+
nn = [nn[0], nn[3], nn[2], nn[1]];
|
|
34
|
+
}
|
|
35
|
+
const i = pts.map((p, k) => this.vert(p, nn[k]));
|
|
36
|
+
this.tri(mat, i[0], i[1], i[2]);
|
|
37
|
+
this.tri(mat, i[0], i[2], i[3]);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* A flat convex face with corners `pts` in order round it (some may lie along its sides: the corners of the faces
|
|
41
|
+
* beside it, so the two meet without a seam), facing n: triangles fanned from its middle.
|
|
42
|
+
*/
|
|
43
|
+
fan(mat, pts, n) {
|
|
44
|
+
if (pts.length < 3)
|
|
45
|
+
return;
|
|
46
|
+
const c = [0, 0, 0];
|
|
47
|
+
let nx = 0, ny = 0, nz = 0;
|
|
48
|
+
for (let i = 0; i < pts.length; i++) {
|
|
49
|
+
const a = pts[i], b = pts[(i + 1) % pts.length];
|
|
50
|
+
for (let k = 0; k < 3; k++)
|
|
51
|
+
c[k] += a[k] / pts.length;
|
|
52
|
+
// (the way round the corners run: Newell's normal)
|
|
53
|
+
nx += (a[1] - b[1]) * (a[2] + b[2]);
|
|
54
|
+
ny += (a[2] - b[2]) * (a[0] + b[0]);
|
|
55
|
+
nz += (a[0] - b[0]) * (a[1] + b[1]);
|
|
56
|
+
}
|
|
57
|
+
const ring = nx * n[0] + ny * n[1] + nz * n[2] < 0 ? [...pts].reverse() : pts;
|
|
58
|
+
const ic = this.vert(c, n), is = ring.map(p => this.vert(p, n));
|
|
59
|
+
for (let i = 0; i < is.length; i++)
|
|
60
|
+
this.tri(mat, ic, is[i], is[(i + 1) % is.length]);
|
|
61
|
+
}
|
|
62
|
+
/** Polygon `poly` (counter-clockwise) laid flat at height z, facing up or down. */
|
|
63
|
+
cap(mat, poly, z, up = true) {
|
|
64
|
+
const t = triangulate(poly);
|
|
65
|
+
if (!t.length)
|
|
66
|
+
return;
|
|
67
|
+
const n = [0, 0, up ? 1 : -1], base = this.pos.length / 3;
|
|
68
|
+
for (const p of poly)
|
|
69
|
+
this.vert([p.x, p.y, z], n);
|
|
70
|
+
for (const [a, b, c] of t) {
|
|
71
|
+
if (up)
|
|
72
|
+
this.tri(mat, base + a, base + b, base + c);
|
|
73
|
+
else
|
|
74
|
+
this.tri(mat, base + a, base + c, base + b);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* An upright prism: polygon `poly` (counter-clockwise) from z0 up to z1 — its sides, its top (`top`: what it's
|
|
79
|
+
* drawn with; null, no top) and its underside (by default only when it's off the floor).
|
|
80
|
+
*/
|
|
81
|
+
prism(poly, z0, z1, side, top, bottom = z0 > 1e-6 ? side : null) {
|
|
82
|
+
if (z1 - z0 < 1e-6 || poly.length < 3)
|
|
83
|
+
return;
|
|
84
|
+
for (let i = 0, n = poly.length; i < n; i++) {
|
|
85
|
+
const a = poly[i], b = poly[(i + 1) % n], dx = b.x - a.x, dy = b.y - a.y, L = Math.hypot(dx, dy);
|
|
86
|
+
if (L < 1e-9)
|
|
87
|
+
continue;
|
|
88
|
+
// outward is to the right of a counter-clockwise outline
|
|
89
|
+
this.quad(side, [a.x, a.y, z0], [b.x, b.y, z0], [b.x, b.y, z1], [a.x, a.y, z1], [dy / L, -dx / L, 0]);
|
|
90
|
+
}
|
|
91
|
+
if (top)
|
|
92
|
+
this.cap(top, poly, z1, true);
|
|
93
|
+
if (bottom)
|
|
94
|
+
this.cap(bottom, poly, z0, false);
|
|
95
|
+
}
|
|
96
|
+
/** Whether nothing was made. */
|
|
97
|
+
get empty() {
|
|
98
|
+
return !this.pos.length;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=mesh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh.js","sourceRoot":"","sources":["../../src/view3d/mesh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { XY } from '../model/types';
|
|
2
|
+
/** Signed area: positive when the points run counter-clockwise. */
|
|
3
|
+
export declare function area(p: XY[]): number;
|
|
4
|
+
/** The points running counter-clockwise, without repeats (a point the same as the one before it). */
|
|
5
|
+
export declare function tidy(p: XY[]): XY[];
|
|
6
|
+
/** The part of `p` where n · point ≤ c (one side of a line), as a polygon — empty when none of it is. */
|
|
7
|
+
export declare function clipHalf(p: XY[], nx: number, ny: number, c: number): XY[];
|
|
8
|
+
/** The part of `p` within `half` of the line through `o` along unit `u` (a wall's band, its thickness wide). */
|
|
9
|
+
export declare function clipBand(p: XY[], o: XY, u: XY, half: number): XY[];
|
|
10
|
+
/** The part of `p` from `s0` to `s1` along unit `u` measured from `o` (a wall between two cuts across it). */
|
|
11
|
+
export declare function clipSpan(p: XY[], o: XY, u: XY, s0: number, s1: number): XY[];
|
|
12
|
+
/**
|
|
13
|
+
* Triangles covering polygon `p` (counter-clockwise, no repeats — see tidy), as index triples into it, each
|
|
14
|
+
* counter-clockwise. Ear clipping: a floor's outline is a simple polygon, convex or not.
|
|
15
|
+
*/
|
|
16
|
+
export declare function triangulate(p: XY[]): [number, number, number][];
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Flat polygons for the 3D view: clipping one to a half-plane (a wall cut at a door's edge, a wall's share of a corner)
|
|
3
|
+
and cutting one into triangles (a floor, a wall's top). Plan inches, y up; counter-clockwise is positive.
|
|
4
|
+
*/
|
|
5
|
+
/** Points closer than this (inches) are the same point. */
|
|
6
|
+
const EPS = 1e-6;
|
|
7
|
+
/** Signed area: positive when the points run counter-clockwise. */
|
|
8
|
+
export function area(p) {
|
|
9
|
+
let a = 0;
|
|
10
|
+
for (let i = 0, n = p.length; i < n; i++) {
|
|
11
|
+
const q = p[i], r = p[(i + 1) % n];
|
|
12
|
+
a += q.x * r.y - r.x * q.y;
|
|
13
|
+
}
|
|
14
|
+
return a / 2;
|
|
15
|
+
}
|
|
16
|
+
/** The points running counter-clockwise, without repeats (a point the same as the one before it). */
|
|
17
|
+
export function tidy(p) {
|
|
18
|
+
const out = [];
|
|
19
|
+
for (const q of p) {
|
|
20
|
+
const last = out[out.length - 1];
|
|
21
|
+
if (!last || Math.abs(last.x - q.x) > EPS || Math.abs(last.y - q.y) > EPS)
|
|
22
|
+
out.push({ x: q.x, y: q.y });
|
|
23
|
+
}
|
|
24
|
+
while (out.length > 1 && Math.abs(out[0].x - out[out.length - 1].x) <= EPS && Math.abs(out[0].y - out[out.length - 1].y) <= EPS)
|
|
25
|
+
out.pop();
|
|
26
|
+
return area(out) < 0 ? out.reverse() : out;
|
|
27
|
+
}
|
|
28
|
+
/** The part of `p` where n · point ≤ c (one side of a line), as a polygon — empty when none of it is. */
|
|
29
|
+
export function clipHalf(p, nx, ny, c) {
|
|
30
|
+
const out = [];
|
|
31
|
+
for (let i = 0, n = p.length; i < n; i++) {
|
|
32
|
+
const a = p[i], b = p[(i + 1) % n];
|
|
33
|
+
const da = nx * a.x + ny * a.y - c, db = nx * b.x + ny * b.y - c;
|
|
34
|
+
if (da <= 0)
|
|
35
|
+
out.push(a);
|
|
36
|
+
if ((da < 0 && db > 0) || (da > 0 && db < 0)) {
|
|
37
|
+
const t = da / (da - db);
|
|
38
|
+
out.push({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/** The part of `p` within `half` of the line through `o` along unit `u` (a wall's band, its thickness wide). */
|
|
44
|
+
export function clipBand(p, o, u, half) {
|
|
45
|
+
const nx = -u.y, ny = u.x, c = nx * o.x + ny * o.y;
|
|
46
|
+
return clipHalf(clipHalf(p, nx, ny, c + half), -nx, -ny, -c + half);
|
|
47
|
+
}
|
|
48
|
+
/** The part of `p` from `s0` to `s1` along unit `u` measured from `o` (a wall between two cuts across it). */
|
|
49
|
+
export function clipSpan(p, o, u, s0, s1) {
|
|
50
|
+
const c = u.x * o.x + u.y * o.y;
|
|
51
|
+
return clipHalf(clipHalf(p, u.x, u.y, c + s1), -u.x, -u.y, -(c + s0));
|
|
52
|
+
}
|
|
53
|
+
/** Whether `p` is inside triangle a b c (counter-clockwise), off its edges. */
|
|
54
|
+
function inside(p, a, b, c) {
|
|
55
|
+
const s = (q, r) => (r.x - q.x) * (p.y - q.y) - (r.y - q.y) * (p.x - q.x);
|
|
56
|
+
return s(a, b) > EPS && s(b, c) > EPS && s(c, a) > EPS;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Triangles covering polygon `p` (counter-clockwise, no repeats — see tidy), as index triples into it, each
|
|
60
|
+
* counter-clockwise. Ear clipping: a floor's outline is a simple polygon, convex or not.
|
|
61
|
+
*/
|
|
62
|
+
export function triangulate(p) {
|
|
63
|
+
const idx = p.map((_, i) => i), tris = [];
|
|
64
|
+
const cross = (i0, i1, i2) => {
|
|
65
|
+
const a = p[i0], b = p[i1], c = p[i2];
|
|
66
|
+
return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
|
|
67
|
+
};
|
|
68
|
+
let guard = 0;
|
|
69
|
+
while (idx.length > 3 && guard++ < 100000) {
|
|
70
|
+
let cut = false;
|
|
71
|
+
for (let i = 0; i < idx.length; i++) {
|
|
72
|
+
const i0 = idx[(i + idx.length - 1) % idx.length], i1 = idx[i], i2 = idx[(i + 1) % idx.length];
|
|
73
|
+
if (cross(i0, i1, i2) <= EPS)
|
|
74
|
+
continue;
|
|
75
|
+
let blocked = false;
|
|
76
|
+
for (const j of idx) {
|
|
77
|
+
if (j !== i0 && j !== i1 && j !== i2 && inside(p[j], p[i0], p[i1], p[i2])) {
|
|
78
|
+
blocked = true;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (blocked)
|
|
83
|
+
continue;
|
|
84
|
+
tris.push([i0, i1, i2]);
|
|
85
|
+
idx.splice(i, 1);
|
|
86
|
+
cut = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
if (cut)
|
|
90
|
+
continue;
|
|
91
|
+
// no ear left (points in a row, or rounding): drop the flattest corner, keeping it if it covers anything
|
|
92
|
+
let best = 0, flat = Infinity;
|
|
93
|
+
for (let i = 0; i < idx.length; i++) {
|
|
94
|
+
const c = Math.abs(cross(idx[(i + idx.length - 1) % idx.length], idx[i], idx[(i + 1) % idx.length]));
|
|
95
|
+
if (c < flat) {
|
|
96
|
+
flat = c;
|
|
97
|
+
best = i;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const i0 = idx[(best + idx.length - 1) % idx.length], i1 = idx[best], i2 = idx[(best + 1) % idx.length];
|
|
101
|
+
if (cross(i0, i1, i2) > EPS)
|
|
102
|
+
tris.push([i0, i1, i2]);
|
|
103
|
+
idx.splice(best, 1);
|
|
104
|
+
}
|
|
105
|
+
if (idx.length === 3 && cross(idx[0], idx[1], idx[2]) > EPS)
|
|
106
|
+
tris.push([idx[0], idx[1], idx[2]]);
|
|
107
|
+
return tris;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=poly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poly.js","sourceRoot":"","sources":["../../src/view3d/poly.ts"],"names":[],"mappings":"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"}
|