@weasel-js/core 1.11.0 → 1.11.1
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/CHANGELOG.md +427 -0
- package/README.md +1 -1
- package/dist/animation/index.js +3 -3
- package/dist/animation/rig/bindRig.js +1 -1
- package/dist/animation/rig/rigNode.js.map +1 -1
- package/dist/barrel/canvas.js +7 -3
- package/dist/barrel/interactions.js +5 -4
- package/dist/barrel/paths.js +3 -3
- package/dist/barrel/renderer.js +3 -2
- package/dist/barrel/routing.js +6 -11
- package/dist/barrel/scene.js +8 -5
- package/dist/barrel/viewport.js +4 -3
- package/dist/canvas/Canvas.js +3 -1
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js +17 -3
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
- package/dist/canvas/SceneCanvas/builtinToolSets.js +30 -0
- package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -0
- package/dist/canvas/SceneCanvas/canvasPassThrough.js +1 -0
- package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
- package/dist/canvas/SceneCanvas/coordTrace.js +5 -16
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +5 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +45 -5
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/props.js +1 -11
- package/dist/canvas/SceneCanvas/props.js.map +1 -1
- package/dist/canvas/SceneCanvas/toolRegistry.js +8 -4
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -11
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinTools.js +2 -9
- package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +93 -0
- package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js +7 -2
- package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasTools.js +8 -8
- package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useNodeKinds.js +1 -1
- package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +13 -2
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +1 -3
- package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneChrome.js +6 -7
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +5 -3
- package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
- package/dist/canvas/SceneCanvas/useScenePicking.js +2 -3
- package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +2 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js +3 -4
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
- package/dist/canvas/SceneCanvas.js +16 -14
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SurfaceCanvas.js +5 -22
- package/dist/canvas/SurfaceCanvas.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +9 -5
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/contextAttributes.js +14 -0
- package/dist/canvas/contextAttributes.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +9 -113
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/insert.js +4 -2
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/pathEditCommits.js +193 -0
- package/dist/canvas/deps/pathEditCommits.js.map +1 -0
- package/dist/canvas/deps/snap.js +12 -9
- package/dist/canvas/deps/snap.js.map +1 -1
- package/dist/canvas/deps/transformFollowers.js +20 -0
- package/dist/canvas/deps/transformFollowers.js.map +1 -0
- package/dist/canvas/derivedPath.js +20 -1
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/drawnBounds.js +29 -3
- package/dist/canvas/drawnBounds.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +9 -1
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/pathPainter.js +3 -2
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/shapePainter.js +1 -1
- package/dist/canvas/overlayRoleStrokes.js +12 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/pathOverlay.js +27 -7
- package/dist/canvas/pathOverlay.js.map +1 -1
- package/dist/canvas/renderDebugSnapshot.js +1 -0
- package/dist/canvas/renderDebugSnapshot.js.map +1 -1
- package/dist/canvas/renderSceneToPixels.js +6 -5
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/useCanvasPaint.js +2 -1
- package/dist/canvas/useCanvasPaint.js.map +1 -1
- package/dist/canvas/useInFlightBounds.js +52 -0
- package/dist/canvas/useInFlightBounds.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +7 -9
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/clipboard.d.ts +3 -2
- package/dist/{clone-DZDrfIlU.d.ts → clone-C3e0OTuF.d.ts} +8 -21
- package/dist/clone.d.ts +4 -3
- package/dist/core/geometry/autoPoseDescriptor.js +1 -1
- package/dist/core/ops/setDependsOn.js +37 -0
- package/dist/core/ops/setDependsOn.js.map +1 -0
- package/dist/core/ops/writtenBy.js +53 -0
- package/dist/core/ops/writtenBy.js.map +1 -0
- package/dist/core/pages/fitViewToPage.js +12 -1
- package/dist/core/pages/fitViewToPage.js.map +1 -1
- package/dist/core/pages/pageEdits.js +164 -0
- package/dist/core/pages/pageEdits.js.map +1 -0
- package/dist/core/pages/pages.js +30 -1
- package/dist/core/pages/pages.js.map +1 -1
- package/dist/core/scene/NodeRouting.js +8 -3
- package/dist/core/scene/NodeRouting.js.map +1 -1
- package/dist/core/scene/arrivalWindow.js.map +1 -1
- package/dist/core/scene/carryDescendants.js +51 -0
- package/dist/core/scene/carryDescendants.js.map +1 -0
- package/dist/core/scene/docValues.js +57 -0
- package/dist/core/scene/docValues.js.map +1 -0
- package/dist/core/scene/editPass.js +111 -0
- package/dist/core/scene/editPass.js.map +1 -0
- package/dist/core/scene/effectivePose.js +7 -1
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/fieldEdits.js +4 -1
- package/dist/core/scene/fieldEdits.js.map +1 -1
- package/dist/core/scene/historyFacade.js +1 -0
- package/dist/core/scene/historyFacade.js.map +1 -1
- package/dist/core/scene/layoutPass.js +28 -3
- package/dist/core/scene/layoutPass.js.map +1 -1
- package/dist/core/scene/recorder.js +28 -19
- package/dist/core/scene/recorder.js.map +1 -1
- package/dist/core/scene/scene.js +15 -9
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneChanges.js +13 -0
- package/dist/core/scene/sceneChanges.js.map +1 -0
- package/dist/core/scene/sceneEdits.js +8 -1
- package/dist/core/scene/sceneEdits.js.map +1 -1
- package/dist/core/scene/sceneMutators.js +1 -0
- package/dist/core/scene/sceneMutators.js.map +1 -1
- package/dist/core/scene/sceneRecording.js +20 -3
- package/dist/core/scene/sceneRecording.js.map +1 -1
- package/dist/core/scene/sceneSelection.js +4 -1
- package/dist/core/scene/sceneSelection.js.map +1 -1
- package/dist/core/scene/sceneState.js +11 -5
- package/dist/core/scene/sceneState.js.map +1 -1
- package/dist/core/scene/serialization.js +5 -3
- package/dist/core/scene/serialization.js.map +1 -1
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/scene/unitScopes.js +19 -1
- package/dist/core/scene/unitScopes.js.map +1 -1
- package/dist/core/selection/usePublishSceneSelection.js +6 -12
- package/dist/core/selection/usePublishSceneSelection.js.map +1 -1
- package/dist/core/shapeKinds.js +25 -11
- package/dist/core/shapeKinds.js.map +1 -1
- package/dist/{cornerHandles-Camw_yeu.d.ts → cornerHandles-BHuoMs1o.d.ts} +1 -1
- package/dist/debug/createDebugOverlayLayer.js +16 -111
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/createDebugSink.js +2 -1
- package/dist/debug/createDebugSink.js.map +1 -1
- package/dist/debug/defaultTheme.js +4 -2
- package/dist/debug/defaultTheme.js.map +1 -1
- package/dist/debug/features.js +17 -0
- package/dist/debug/features.js.map +1 -0
- package/dist/debug/overlayPanels.js +117 -0
- package/dist/debug/overlayPanels.js.map +1 -0
- package/dist/debug/parseDebugFlags.js +4 -13
- package/dist/debug/parseDebugFlags.js.map +1 -1
- package/dist/{depSchema-Cgfu_G9s.d.ts → depSchema-BpZNOv7q.d.ts} +114 -892
- package/dist/devtools/handlers.js +112 -0
- package/dist/devtools/handlers.js.map +1 -0
- package/dist/devtools/history.js +71 -0
- package/dist/devtools/history.js.map +1 -0
- package/dist/devtools/hook.js +74 -0
- package/dist/devtools/hook.js.map +1 -0
- package/dist/devtools/label.js +25 -0
- package/dist/devtools/label.js.map +1 -0
- package/dist/devtools/notices.js +58 -0
- package/dist/devtools/notices.js.map +1 -0
- package/dist/devtools/protocol.js +7 -0
- package/dist/devtools/protocol.js.map +1 -0
- package/dist/devtools/registry.js +90 -0
- package/dist/devtools/registry.js.map +1 -0
- package/dist/devtools/root.js +80 -0
- package/dist/devtools/root.js.map +1 -0
- package/dist/devtools/serialize.js +86 -0
- package/dist/devtools/serialize.js.map +1 -0
- package/dist/devtools/session.js +111 -0
- package/dist/devtools/session.js.map +1 -0
- package/dist/devtools/transport.js +67 -0
- package/dist/devtools/transport.js.map +1 -0
- package/dist/devtools/useDevtoolsRoot.js +81 -0
- package/dist/devtools/useDevtoolsRoot.js.map +1 -0
- package/dist/devtools-protocol.d.ts +435 -0
- package/dist/devtools-protocol.js +7 -0
- package/dist/devtools.d.ts +8 -0
- package/dist/devtools.js +12 -0
- package/dist/devtools.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js +16 -10
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +25 -2
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/measure/measureCommands.js +7 -5
- package/dist/features/measure/measureCommands.js.map +1 -1
- package/dist/features/paths/index.js +2 -2
- package/dist/features/paths/pathEditExtension.js.map +1 -1
- package/dist/features/paths/pathSnap/pathSnapSource.js +5 -5
- package/dist/features/paths/pathSnap/pathSnapSource.js.map +1 -1
- package/dist/features/paths/pathSnap/sceneIndex.js +10 -3
- package/dist/features/paths/pathSnap/sceneIndex.js.map +1 -1
- package/dist/features/selection/selectionPose.js +4 -1
- package/dist/features/selection/selectionPose.js.map +1 -1
- package/dist/features/snap/gather.js +9 -1
- package/dist/features/snap/gather.js.map +1 -1
- package/dist/features/snap/lazySession.js +17 -0
- package/dist/features/snap/lazySession.js.map +1 -0
- package/dist/features/snap/marks.js.map +1 -1
- package/dist/features/snap/probes2d.js +27 -19
- package/dist/features/snap/probes2d.js.map +1 -1
- package/dist/features/snap/readoutLayer.js.map +1 -1
- package/dist/features/snap/roles.js +2 -1
- package/dist/features/snap/roles.js.map +1 -1
- package/dist/features/snap/rotationSource.js +25 -8
- package/dist/features/snap/rotationSource.js.map +1 -1
- package/dist/features/snap/sceneSession2d.js +6 -4
- package/dist/features/snap/sceneSession2d.js.map +1 -1
- package/dist/features/snap/session2d.js +37 -23
- package/dist/features/snap/session2d.js.map +1 -1
- package/dist/features/snap/spanSnap.js +5 -2
- package/dist/features/snap/spanSnap.js.map +1 -1
- package/dist/icons.table.js +1 -1
- package/dist/icons.table.js.map +1 -1
- package/dist/icons.table.json +0 -10
- package/dist/index.d.ts +701 -696
- package/dist/index.js +35 -29
- package/dist/interactions/actions/align/action.js +6 -4
- package/dist/interactions/actions/align/action.js.map +1 -1
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/action.js +7 -1
- package/dist/interactions/actions/booleans/action.js.map +1 -1
- package/dist/interactions/actions/clone/action.js +1 -1
- package/dist/interactions/actions/clone/behaviors.js +4 -4
- package/dist/interactions/actions/clone/behaviors.js.map +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
- package/dist/interactions/actions/defaults/createPaintAction.js +1 -1
- package/dist/interactions/actions/defaults/delete.js +48 -39
- package/dist/interactions/actions/defaults/delete.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +1 -1
- package/dist/interactions/actions/defaults/group.js +2 -2
- package/dist/interactions/actions/defaults/ingest.js +7 -5
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +13 -38
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/distribute/action.js +6 -4
- package/dist/interactions/actions/distribute/action.js.map +1 -1
- package/dist/interactions/actions/drawnBoxes.js +2 -1
- package/dist/interactions/actions/drawnBoxes.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/action.js +3 -6
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/preview.js +41 -8
- package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
- package/dist/interactions/actions/flip/action.js +6 -4
- package/dist/interactions/actions/flip/action.js.map +1 -1
- package/dist/interactions/actions/gestureLifecycle.js +5 -2
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +1 -2
- package/dist/interactions/actions/insert/action.js.map +1 -1
- package/dist/interactions/actions/insert/commit.js +1 -1
- package/dist/interactions/actions/insert/parent.js +11 -0
- package/dist/interactions/actions/insert/parent.js.map +1 -0
- package/dist/interactions/actions/insert/placeAction.js +7 -2
- package/dist/interactions/actions/insert/placeAction.js.map +1 -1
- package/dist/interactions/actions/insert/session.js +5 -1
- package/dist/interactions/actions/insert/session.js.map +1 -1
- package/dist/interactions/actions/move/action.js +8 -4
- package/dist/interactions/actions/move/action.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +0 -1
- package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +1 -1
- package/dist/interactions/actions/move/capture.js +1 -1
- package/dist/interactions/actions/move/commit/index.js +0 -2
- package/dist/interactions/actions/move/commit/index.js.map +1 -1
- package/dist/interactions/actions/move/commit/layoutDrop.js +2 -2
- package/dist/interactions/actions/move/commit/layoutRelease.js +2 -2
- package/dist/interactions/actions/move/commit/reparent.js +11 -5
- package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
- package/dist/interactions/actions/move/frame.js +4 -10
- package/dist/interactions/actions/move/frame.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +20 -17
- package/dist/interactions/actions/move/landedDescendants.js.map +1 -1
- package/dist/interactions/actions/move/layout/container.js +2 -1
- package/dist/interactions/actions/move/layout/container.js.map +1 -1
- package/dist/interactions/actions/move/layout/dragged.js +1 -1
- package/dist/interactions/actions/move/layout/dropPass.js +18 -1
- package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
- package/dist/interactions/actions/move/layout/exits.js +5 -5
- package/dist/interactions/actions/move/layout/exits.js.map +1 -1
- package/dist/interactions/actions/move/session.js +14 -3
- package/dist/interactions/actions/move/session.js.map +1 -1
- package/dist/interactions/actions/move/translate.js +8 -37
- package/dist/interactions/actions/move/translate.js.map +1 -1
- package/dist/interactions/actions/moveNodes.js +87 -0
- package/dist/interactions/actions/moveNodes.js.map +1 -0
- package/dist/interactions/actions/planeInput.js.map +1 -1
- package/dist/interactions/actions/resize/action.js +83 -72
- package/dist/interactions/actions/resize/action.js.map +1 -1
- package/dist/interactions/actions/resize/commit.js +2 -1
- package/dist/interactions/actions/resize/commit.js.map +1 -1
- package/dist/interactions/actions/resize/session.js +2 -0
- package/dist/interactions/actions/resize/session.js.map +1 -1
- package/dist/interactions/actions/resolvePreviews.js +3 -3
- package/dist/interactions/actions/resolvePreviews.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +7 -4
- package/dist/interactions/actions/rotate/action.js.map +1 -1
- package/dist/interactions/actions/rotate/commit.js +2 -1
- package/dist/interactions/actions/rotate/commit.js.map +1 -1
- package/dist/interactions/actions/rotate/session.js +2 -0
- package/dist/interactions/actions/rotate/session.js.map +1 -1
- package/dist/interactions/actions/selectionSubtree.js +13 -2
- package/dist/interactions/actions/selectionSubtree.js.map +1 -1
- package/dist/interactions/actions/testUtils.js.map +1 -1
- package/dist/interactions/actions/transform-again/action.js +5 -6
- package/dist/interactions/actions/transform-again/action.js.map +1 -1
- package/dist/interactions/actions/transformFinish.js +106 -0
- package/dist/interactions/actions/transformFinish.js.map +1 -0
- package/dist/kitSettingsSchema.js +0 -4
- package/dist/kitSettingsSchema.js.map +1 -1
- package/dist/move.d.ts +5 -4
- package/dist/{options-p9GZMXbY.d.ts → options-DBxEryYq.d.ts} +1 -1
- package/dist/resize.d.ts +4 -3
- package/dist/routing.d.ts +1 -1
- package/dist/routing.js +2 -2
- package/dist/test-hook/createTestHook.js +1 -1
- package/dist/test-hook/createTestHook.js.map +1 -1
- package/dist/test-hook/useTestHook.js +2 -1
- package/dist/test-hook/useTestHook.js.map +1 -1
- package/dist/test-seams.d.ts +9 -5
- package/dist/tools/builtin/pen/penHandle.js +3 -5
- package/dist/tools/builtin/pen/penHandle.js.map +1 -1
- package/dist/tools/index.js +26 -0
- package/dist/{types-CHVXGfYm.d.ts → types-7puAuVD2.d.ts} +3 -262
- package/dist/types-BN9hbdMI.d.ts +184 -0
- package/dist/types-CniVctmk.d.ts +949 -0
- package/dist/types-oFeQ5VjV.d.ts +264 -0
- package/dist/version.js +1 -1
- package/package.json +35 -25
- package/dist/canvas/SceneCanvas/useBuiltinRigTools.js +0 -65
- package/dist/canvas/SceneCanvas/useBuiltinRigTools.js.map +0 -1
- package/dist/tools/builtin/bone/boneActions.js +0 -156
- package/dist/tools/builtin/bone/boneActions.js.map +0 -1
- package/dist/tools/builtin/bone/boneOverlay.js +0 -71
- package/dist/tools/builtin/bone/boneOverlay.js.map +0 -1
- package/dist/tools/builtin/bone/placedRig.js +0 -28
- package/dist/tools/builtin/bone/placedRig.js.map +0 -1
- package/dist/tools/builtin/bone/rigEditState.js +0 -30
- package/dist/tools/builtin/bone/rigEditState.js.map +0 -1
- package/dist/tools/builtin/bone/useBoneTool.js +0 -125
- package/dist/tools/builtin/bone/useBoneTool.js.map +0 -1
- package/dist/tools/builtin/weight/useWeightTool.js +0 -101
- package/dist/tools/builtin/weight/useWeightTool.js.map +0 -1
- package/dist/tools/builtin/weight/weightActions.js +0 -140
- package/dist/tools/builtin/weight/weightActions.js.map +0 -1
- package/dist/tools/builtin/weight/weightOverlay.js +0 -78
- package/dist/tools/builtin/weight/weightOverlay.js.map +0 -1
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { viewToTransform } from "../../../core/viewport/view.js";
|
|
2
|
-
import { worldToScreen } from "../../../core/viewport/viewTransform.js";
|
|
3
|
-
import { ellipsePath, linePath } from "@weasel-js/geom";
|
|
4
|
-
import { jointPositions } from "@weasel-js/animator";
|
|
5
|
-
|
|
6
|
-
//#region src/tools/builtin/bone/boneOverlay.ts
|
|
7
|
-
var BONE = "#4f9cf7";
|
|
8
|
-
var JOINT_FILL = "#ffffff";
|
|
9
|
-
var JOINT_RADIUS_PX = 4.5;
|
|
10
|
-
var dot = (x, y, r) => ellipsePath({
|
|
11
|
-
x: x - r,
|
|
12
|
-
y: y - r,
|
|
13
|
-
width: 2 * r,
|
|
14
|
-
height: 2 * r
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* A screen-space layer drawing a skeleton as bones and joints at a constant size: a line from
|
|
18
|
-
* each joint to its parent, a ring on each joint, and the active joint filled.
|
|
19
|
-
*/
|
|
20
|
-
function createBoneOverlay(source) {
|
|
21
|
-
return {
|
|
22
|
-
id: source.id,
|
|
23
|
-
label: "Bones",
|
|
24
|
-
space: "screen",
|
|
25
|
-
subscribe: source.subscribe,
|
|
26
|
-
draw: (_data, view) => {
|
|
27
|
-
const skeleton = source.skeleton();
|
|
28
|
-
if (!skeleton || skeleton.joints.length === 0) return [];
|
|
29
|
-
const t = viewToTransform(view);
|
|
30
|
-
const at = /* @__PURE__ */ new Map();
|
|
31
|
-
for (const [name, p] of jointPositions(skeleton)) {
|
|
32
|
-
const [x, y] = worldToScreen(p.x, p.y, t);
|
|
33
|
-
at.set(name, {
|
|
34
|
-
x,
|
|
35
|
-
y
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
const out = [];
|
|
39
|
-
for (const joint of skeleton.joints) {
|
|
40
|
-
if (joint.parent == null) continue;
|
|
41
|
-
out.push({
|
|
42
|
-
kind: "path",
|
|
43
|
-
path: linePath(at.get(joint.parent), at.get(joint.name)),
|
|
44
|
-
stroke: {
|
|
45
|
-
paint: { color: BONE },
|
|
46
|
-
width: 2
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
const active = source.active();
|
|
51
|
-
const r = source.jointRadiusPx?.() ?? JOINT_RADIUS_PX;
|
|
52
|
-
for (const [name, p] of at) out.push({
|
|
53
|
-
kind: "path",
|
|
54
|
-
path: dot(p.x, p.y, r),
|
|
55
|
-
fill: { paint: {
|
|
56
|
-
kind: "solid",
|
|
57
|
-
color: name === active ? BONE : JOINT_FILL
|
|
58
|
-
} },
|
|
59
|
-
stroke: {
|
|
60
|
-
paint: { color: BONE },
|
|
61
|
-
width: 1.5
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
return out;
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
//#endregion
|
|
70
|
-
export { JOINT_RADIUS_PX, createBoneOverlay };
|
|
71
|
-
//# sourceMappingURL=boneOverlay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boneOverlay.js","names":[],"sources":["../../../../src/tools/builtin/bone/boneOverlay.ts"],"sourcesContent":["import { ellipsePath, linePath } from '@weasel-js/geom';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport { viewToTransform } from 'core/viewport/view';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { jointPositions } from '@weasel-js/animator';\nimport type { Skeleton } from '@weasel-js/animator';\n\nconst BONE = '#4f9cf7';\nconst JOINT_FILL = '#ffffff';\nexport const JOINT_RADIUS_PX = 4.5;\n\nconst dot = (x: number, y: number, r: number) => ellipsePath({ x: x - r, y: y - r, width: 2 * r, height: 2 * r });\n\n/**\n * A screen-space layer drawing a skeleton as bones and joints at a constant size: a line from\n * each joint to its parent, a ring on each joint, and the active joint filled.\n */\nexport function createBoneOverlay(source: {\n id: string;\n /** The skeleton to draw, in the scene's space, or `null` for none. */\n skeleton(): Skeleton | null;\n active(): string | null;\n subscribe(fn: () => void): () => void;\n /** Joint dot radius in screen px, read each frame. Default `JOINT_RADIUS_PX`. */\n jointRadiusPx?: () => number | undefined;\n}): RenderLayer<unknown> {\n return {\n id: source.id,\n label: 'Bones',\n space: 'screen',\n subscribe: source.subscribe,\n draw: (_data, view) => {\n const skeleton = source.skeleton();\n if (!skeleton || skeleton.joints.length === 0) return [];\n const t = viewToTransform(view);\n const at = new Map<string, { x: number; y: number }>();\n for (const [name, p] of jointPositions(skeleton)) {\n const [x, y] = worldToScreen(p.x, p.y, t);\n at.set(name, { x, y });\n }\n const out: DrawCommand[] = [];\n for (const joint of skeleton.joints) {\n if (joint.parent == null) continue;\n out.push({\n kind: 'path',\n path: linePath(at.get(joint.parent)!, at.get(joint.name)!),\n stroke: { paint: { color: BONE }, width: 2 },\n });\n }\n const active = source.active();\n const r = source.jointRadiusPx?.() ?? JOINT_RADIUS_PX;\n for (const [name, p] of at) {\n out.push({\n kind: 'path',\n path: dot(p.x, p.y, r),\n fill: { paint: { kind: 'solid', color: name === active ? BONE : JOINT_FILL } },\n stroke: { paint: { color: BONE }, width: 1.5 },\n });\n }\n return out;\n },\n };\n}\n"],"mappings":";;;;;;AAQA,IAAM,OAAO;AACb,IAAM,aAAa;AACnB,IAAa,kBAAkB;AAE/B,IAAM,OAAO,GAAW,GAAW,MAAc,YAAY;CAAE,GAAG,IAAI;CAAG,GAAG,IAAI;CAAG,OAAO,IAAI;CAAG,QAAQ,IAAI;AAAE,CAAC;;;;;AAMhH,SAAgB,kBAAkB,QAQT;CACvB,OAAO;EACL,IAAI,OAAO;EACX,OAAO;EACP,OAAO;EACP,WAAW,OAAO;EAClB,OAAO,OAAO,SAAS;GACrB,MAAM,WAAW,OAAO,SAAS;GACjC,IAAI,CAAC,YAAY,SAAS,OAAO,WAAW,GAAG,OAAO,CAAC;GACvD,MAAM,IAAI,gBAAgB,IAAI;GAC9B,MAAM,qBAAK,IAAI,IAAsC;GACrD,KAAK,MAAM,CAAC,MAAM,MAAM,eAAe,QAAQ,GAAG;IAChD,MAAM,CAAC,GAAG,KAAK,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC;IACxC,GAAG,IAAI,MAAM;KAAE;KAAG;IAAE,CAAC;GACvB;GACA,MAAM,MAAqB,CAAC;GAC5B,KAAK,MAAM,SAAS,SAAS,QAAQ;IACnC,IAAI,MAAM,UAAU,MAAM;IAC1B,IAAI,KAAK;KACP,MAAM;KACN,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAI,GAAG,IAAI,MAAM,IAAI,CAAE;KACzD,QAAQ;MAAE,OAAO,EAAE,OAAO,KAAK;MAAG,OAAO;KAAE;IAC7C,CAAC;GACH;GACA,MAAM,SAAS,OAAO,OAAO;GAC7B,MAAM,IAAI,OAAO,gBAAgB,KAAK;GACtC,KAAK,MAAM,CAAC,MAAM,MAAM,IACtB,IAAI,KAAK;IACP,MAAM;IACN,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,OAAO;KAAE,MAAM;KAAS,OAAO,SAAS,SAAS,OAAO;IAAW,EAAE;IAC7E,QAAQ;KAAE,OAAO,EAAE,OAAO,KAAK;KAAG,OAAO;IAAI;GAC/C,CAAC;GAEH,OAAO;EACT;CACF;AACF"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { placeSkeleton } from "../../../animation/rig/rigNode.js";
|
|
2
|
-
import { pxExtent } from "@weasel-js/geom";
|
|
3
|
-
|
|
4
|
-
//#region src/tools/builtin/bone/placedRig.ts
|
|
5
|
-
var EMPTY = { joints: [] };
|
|
6
|
-
/** The rig at node `id`, an empty skeleton for a node that has none yet, or `null` when
|
|
7
|
-
* there is no such node. */
|
|
8
|
-
function placedRig(scene, id) {
|
|
9
|
-
const node = id === null ? void 0 : scene.get(id);
|
|
10
|
-
if (id === null || !node) return null;
|
|
11
|
-
const local = node.data?.skeleton ?? EMPTY;
|
|
12
|
-
return {
|
|
13
|
-
id,
|
|
14
|
-
skeleton: placeSkeleton(local, node.pose)
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
/** `px` screen pixels as a distance in the scene, at the view's current scale. */
|
|
18
|
-
function sceneReach(deps, px) {
|
|
19
|
-
const e = pxExtent(px, deps.view?.get().scale ?? {
|
|
20
|
-
x: 1,
|
|
21
|
-
y: 1
|
|
22
|
-
});
|
|
23
|
-
return Math.max(e.x, e.y);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
//#endregion
|
|
27
|
-
export { placedRig, sceneReach };
|
|
28
|
-
//# sourceMappingURL=placedRig.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"placedRig.js","names":[],"sources":["../../../../src/tools/builtin/bone/placedRig.ts"],"sourcesContent":["import { pxExtent } from '@weasel-js/geom';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport { placeSkeleton, type RigNodeData } from '../../../animation/rig/rigNode';\nimport type { Skeleton } from '@weasel-js/animator';\n\nconst EMPTY: Skeleton = { joints: [] };\n\n/** A rig node and its skeleton in the scene's space, as the rig tools edit and draw it. */\nexport interface PlacedRig {\n id: NodeId;\n skeleton: Skeleton;\n}\n\n/** The rig at node `id`, an empty skeleton for a node that has none yet, or `null` when\n * there is no such node. */\nexport function placedRig(\n scene: { get(id: NodeId): { pose: unknown; data?: unknown } | undefined },\n id: NodeId | null,\n): PlacedRig | null {\n const node = id === null ? undefined : scene.get(id);\n if (id === null || !node) return null;\n const local = (node.data as RigNodeData | null | undefined)?.skeleton ?? EMPTY;\n return { id, skeleton: placeSkeleton(local, node.pose) };\n}\n\n/** `px` screen pixels as a distance in the scene, at the view's current scale. */\nexport function sceneReach(deps: ActionDeps, px: number): number {\n const e = pxExtent(px, deps.view?.get().scale ?? { x: 1, y: 1 });\n return Math.max(e.x, e.y);\n}\n"],"mappings":";;;;AAMA,IAAM,QAAkB,EAAE,QAAQ,CAAC,EAAE;;;AAUrC,SAAgB,UACd,OACA,IACkB;CAClB,MAAM,OAAO,OAAO,OAAO,SAAY,MAAM,IAAI,EAAE;CACnD,IAAI,OAAO,QAAQ,CAAC,MAAM,OAAO;CACjC,MAAM,QAAS,KAAK,MAAyC,YAAY;CACzE,OAAO;EAAE;EAAI,UAAU,cAAc,OAAO,KAAK,IAAI;CAAE;AACzD;;AAGA,SAAgB,WAAW,MAAkB,IAAoB;CAC/D,MAAM,IAAI,SAAS,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAC/D,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC1B"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { createEmitter } from "@weasel-js/registry";
|
|
2
|
-
|
|
3
|
-
//#region src/tools/builtin/bone/rigEditState.ts
|
|
4
|
-
var NONE = /* @__PURE__ */ new Map();
|
|
5
|
-
/** A `RigEditState` with no joint active. Hand one to both tools so a joint picked with the
|
|
6
|
-
* bone tool is the one the weight tool paints. */
|
|
7
|
-
function createRigEditState() {
|
|
8
|
-
let active = null;
|
|
9
|
-
let painted = NONE;
|
|
10
|
-
const changed = createEmitter();
|
|
11
|
-
return {
|
|
12
|
-
active: () => active,
|
|
13
|
-
setActive(joint) {
|
|
14
|
-
if (joint === active) return;
|
|
15
|
-
active = joint;
|
|
16
|
-
changed.emit();
|
|
17
|
-
},
|
|
18
|
-
painted: () => painted,
|
|
19
|
-
paint(next) {
|
|
20
|
-
if ((next ?? NONE) === painted) return;
|
|
21
|
-
painted = next ?? NONE;
|
|
22
|
-
changed.emit();
|
|
23
|
-
},
|
|
24
|
-
listen: changed.subscribe
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
//#endregion
|
|
29
|
-
export { createRigEditState };
|
|
30
|
-
//# sourceMappingURL=rigEditState.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rigEditState.js","names":[],"sources":["../../../../src/tools/builtin/bone/rigEditState.ts"],"sourcesContent":["import type { Skin } from '@weasel-js/animator';\nimport { createEmitter } from '@weasel-js/registry';\nimport type { NodeId } from 'core/scene/types';\nimport type { PaintedSkins } from '../../../animation/rig/rigNode';\n\n/** What the bone and weight tools share between gestures: the joint they act on, and the\n * weights a stroke has painted and not yet written. */\nexport interface RigEditState extends PaintedSkins {\n /** The active joint's name, or `null`. */\n active(): string | null;\n setActive(joint: string | null): void;\n /** Weights a stroke of the weight tool has painted and not yet written, by node. Empty\n * between strokes. `useRigNode` given this state as `painting` binds them as they change. */\n painted(): ReadonlyMap<NodeId, Skin>;\n /** Replace the painted weights; `null` empties them. */\n paint(next: ReadonlyMap<NodeId, Skin> | null): void;\n /** Notified when the active joint or the painted weights change. Returns an unsubscribe. */\n listen(fn: () => void): () => void;\n}\n\nconst NONE: ReadonlyMap<NodeId, Skin> = new Map();\n\n/** A `RigEditState` with no joint active. Hand one to both tools so a joint picked with the\n * bone tool is the one the weight tool paints. */\nexport function createRigEditState(): RigEditState {\n let active: string | null = null;\n let painted = NONE;\n const changed = createEmitter();\n return {\n active: () => active,\n setActive(joint) {\n if (joint === active) return;\n active = joint;\n changed.emit();\n },\n painted: () => painted,\n paint(next) {\n if ((next ?? NONE) === painted) return;\n painted = next ?? NONE;\n changed.emit();\n },\n listen: changed.subscribe,\n };\n}\n"],"mappings":";;;AAoBA,IAAM,uBAAkC,IAAI,IAAI;;;AAIhD,SAAgB,qBAAmC;CACjD,IAAI,SAAwB;CAC5B,IAAI,UAAU;CACd,MAAM,UAAU,cAAc;CAC9B,OAAO;EACL,cAAc;EACd,UAAU,OAAO;GACf,IAAI,UAAU,QAAQ;GACtB,SAAS;GACT,QAAQ,KAAK;EACf;EACA,eAAe;EACf,MAAM,MAAM;GACV,KAAK,QAAQ,UAAU,SAAS;GAChC,UAAU,QAAQ;GAClB,QAAQ,KAAK;EACf;EACA,QAAQ,QAAQ;CAClB;AACF"}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { defineTool } from "../../overlayBinding.js";
|
|
2
|
-
import { placedRig } from "./placedRig.js";
|
|
3
|
-
import { createBoneActions } from "./boneActions.js";
|
|
4
|
-
import { createBoneOverlay } from "./boneOverlay.js";
|
|
5
|
-
import { createRigEditState } from "./rigEditState.js";
|
|
6
|
-
import { createEmitter } from "@weasel-js/registry";
|
|
7
|
-
import { useMemo, useRef } from "react";
|
|
8
|
-
import { useKitSettings, useLatest } from "@weasel-js/react";
|
|
9
|
-
|
|
10
|
-
//#region src/tools/builtin/bone/useBoneTool.ts
|
|
11
|
-
/**
|
|
12
|
-
* Draws and edits the skeleton in a node's `data.skeleton`. A drag on a joint moves it, with
|
|
13
|
-
* the joints under it; a drag from anywhere else draws a bone, from the active joint if there
|
|
14
|
-
* is one and from the press if not, and the new joint becomes the active one. A click picks
|
|
15
|
-
* the active joint or clears it, Delete removes it with everything under it, taking its
|
|
16
|
-
* weights out of every skin beneath the rig node, and Escape clears it. Each edit is one undo
|
|
17
|
-
* entry.
|
|
18
|
-
*/
|
|
19
|
-
function useBoneTool(options) {
|
|
20
|
-
const ownState = useMemo(() => createRigEditState(), []);
|
|
21
|
-
const state = options.state ?? ownState;
|
|
22
|
-
const opts = useLatest({
|
|
23
|
-
scene: options.scene,
|
|
24
|
-
rig: options.rig,
|
|
25
|
-
reach: options.reach ?? 10
|
|
26
|
-
});
|
|
27
|
-
/** The skeleton a drag is shaping, in the scene's space. */
|
|
28
|
-
const liveRef = useRef(null);
|
|
29
|
-
const env = useMemo(() => {
|
|
30
|
-
const changed = createEmitter();
|
|
31
|
-
return {
|
|
32
|
-
state,
|
|
33
|
-
scene: () => opts.current.scene,
|
|
34
|
-
reachPx: () => opts.current.reach,
|
|
35
|
-
placed: () => placedRig(opts.current.scene, opts.current.rig()),
|
|
36
|
-
shown: () => liveRef.current,
|
|
37
|
-
show(skeleton) {
|
|
38
|
-
liveRef.current = skeleton;
|
|
39
|
-
changed.emit();
|
|
40
|
-
},
|
|
41
|
-
listen(fn) {
|
|
42
|
-
const offOwn = changed.subscribe(fn);
|
|
43
|
-
const off = state.listen(fn);
|
|
44
|
-
return () => {
|
|
45
|
-
offOwn();
|
|
46
|
-
off();
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
}, [opts, state]);
|
|
51
|
-
const actions = useMemo(() => createBoneActions(env), [env]);
|
|
52
|
-
const kitSettings = useKitSettings();
|
|
53
|
-
const overlay = useMemo(() => createBoneOverlay({
|
|
54
|
-
id: "bone-tool-skeleton",
|
|
55
|
-
skeleton: () => env.shown() ?? env.placed()?.skeleton ?? null,
|
|
56
|
-
active: state.active,
|
|
57
|
-
subscribe: env.listen,
|
|
58
|
-
jointRadiusPx: () => kitSettings.get("targets.boneJointRadiusPx")
|
|
59
|
-
}), [
|
|
60
|
-
env,
|
|
61
|
-
state,
|
|
62
|
-
kitSettings
|
|
63
|
-
]);
|
|
64
|
-
const { keybinding } = options;
|
|
65
|
-
return useMemo(() => defineTool({
|
|
66
|
-
id: "bone",
|
|
67
|
-
capabilities: ["edits-page"],
|
|
68
|
-
hookName: "useBoneTool",
|
|
69
|
-
cursor: "crosshair",
|
|
70
|
-
presentation: {
|
|
71
|
-
label: "Bone",
|
|
72
|
-
icon: /* @icon */ "core:bone",
|
|
73
|
-
group: "shape"
|
|
74
|
-
},
|
|
75
|
-
...keybinding === null ? {} : { keybinding: keybinding ?? { key: "J" } },
|
|
76
|
-
actions,
|
|
77
|
-
overlay,
|
|
78
|
-
onDeactivate: () => env.show(null),
|
|
79
|
-
bindings: [
|
|
80
|
-
{
|
|
81
|
-
spec: {
|
|
82
|
-
kind: "click",
|
|
83
|
-
mods: {
|
|
84
|
-
shift: "optional",
|
|
85
|
-
alt: "optional"
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
actionId: "bone.pick"
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
spec: {
|
|
92
|
-
kind: "drag",
|
|
93
|
-
mods: {
|
|
94
|
-
shift: "optional",
|
|
95
|
-
alt: "optional"
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
actionId: "bone.drag"
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
spec: {
|
|
102
|
-
kind: "key",
|
|
103
|
-
key: ["Delete", "Backspace"]
|
|
104
|
-
},
|
|
105
|
-
actionId: "bone.remove"
|
|
106
|
-
},
|
|
107
|
-
{
|
|
108
|
-
spec: {
|
|
109
|
-
kind: "key",
|
|
110
|
-
key: "Escape"
|
|
111
|
-
},
|
|
112
|
-
actionId: "bone.clear"
|
|
113
|
-
}
|
|
114
|
-
]
|
|
115
|
-
}), [
|
|
116
|
-
actions,
|
|
117
|
-
overlay,
|
|
118
|
-
keybinding,
|
|
119
|
-
env
|
|
120
|
-
]);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
//#endregion
|
|
124
|
-
export { useBoneTool };
|
|
125
|
-
//# sourceMappingURL=useBoneTool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useBoneTool.js","names":[],"sources":["../../../../src/tools/builtin/bone/useBoneTool.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { useKitSettings, useLatest } from '@weasel-js/react';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { Skeleton } from '@weasel-js/animator';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { createBoneActions, type BoneEnv } from './boneActions';\nimport { createBoneOverlay } from './boneOverlay';\nimport { placedRig } from './placedRig';\nimport { createRigEditState, type RigEditState } from './rigEditState';\nimport { createEmitter } from '@weasel-js/registry';\nimport { icon } from '../../../icons.gen';\n\n/** Options for `useBoneTool`. */\nexport interface UseBoneToolOptions {\n scene: Scene<unknown, string, unknown>;\n /** The node whose data holds the skeleton, or will once a bone is drawn: usually read from\n * the selection. `null` leaves the tool with nothing to edit. */\n rig: () => NodeId | null;\n /** Shared with `useWeightTool`, so both act on one joint. Default: the tool's own. */\n state?: RigEditState;\n /** Override the default keybinding (`{ key: 'J' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** Screen px around a joint within which a press takes it. Default 10. */\n reach?: number;\n}\n\n/**\n * Draws and edits the skeleton in a node's `data.skeleton`. A drag on a joint moves it, with\n * the joints under it; a drag from anywhere else draws a bone, from the active joint if there\n * is one and from the press if not, and the new joint becomes the active one. A click picks\n * the active joint or clears it, Delete removes it with everything under it, taking its\n * weights out of every skin beneath the rig node, and Escape clears it. Each edit is one undo\n * entry.\n */\nexport function useBoneTool(options: UseBoneToolOptions): Tool {\n const ownState = useMemo(() => createRigEditState(), []);\n const state = options.state ?? ownState;\n const opts = useLatest({ scene: options.scene, rig: options.rig, reach: options.reach ?? 10 });\n /** The skeleton a drag is shaping, in the scene's space. */\n const liveRef = useRef<Skeleton | null>(null);\n\n const env = useMemo(() => {\n const changed = createEmitter();\n const tool: BoneEnv & { listen(fn: () => void): () => void } = {\n state,\n scene: () => opts.current.scene,\n reachPx: () => opts.current.reach,\n placed: () => placedRig(opts.current.scene, opts.current.rig()),\n shown: () => liveRef.current,\n show(skeleton) {\n liveRef.current = skeleton;\n changed.emit();\n },\n listen(fn) {\n const offOwn = changed.subscribe(fn);\n const off = state.listen(fn);\n return () => { offOwn(); off(); };\n },\n };\n return tool;\n }, [opts, state]);\n\n const actions = useMemo(() => createBoneActions(env), [env]);\n const kitSettings = useKitSettings();\n const overlay = useMemo(() => createBoneOverlay({\n id: 'bone-tool-skeleton',\n skeleton: () => env.shown() ?? env.placed()?.skeleton ?? null,\n active: state.active,\n subscribe: env.listen,\n jointRadiusPx: () => kitSettings.get('targets.boneJointRadiusPx'),\n }), [env, state, kitSettings]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool({\n id: 'bone',\n capabilities: ['edits-page'],\n hookName: 'useBoneTool',\n cursor: 'crosshair',\n presentation: { label: 'Bone', icon: icon('bone'), group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'J' } }),\n actions,\n overlay,\n onDeactivate: () => env.show(null),\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'bone.pick' },\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'bone.drag' },\n { spec: { kind: 'key', key: ['Delete', 'Backspace'] }, actionId: 'bone.remove' },\n { spec: { kind: 'key', key: 'Escape' }, actionId: 'bone.clear' },\n ],\n }), [actions, overlay, keybinding, env]);\n}\n"],"mappings":"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"}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { defineTool } from "../../overlayBinding.js";
|
|
2
|
-
import { placedRig } from "../bone/placedRig.js";
|
|
3
|
-
import { createBoneOverlay } from "../bone/boneOverlay.js";
|
|
4
|
-
import { createRigEditState } from "../bone/rigEditState.js";
|
|
5
|
-
import { createWeightActions, weighedPaths } from "./weightActions.js";
|
|
6
|
-
import { createWeightOverlay } from "./weightOverlay.js";
|
|
7
|
-
import { useMemo } from "react";
|
|
8
|
-
import { useKitSettings, useLatest } from "@weasel-js/react";
|
|
9
|
-
|
|
10
|
-
//#region src/tools/builtin/weight/useWeightTool.ts
|
|
11
|
-
/**
|
|
12
|
-
* Paints how much the active joint weighs each point of the paths under a rig node, into
|
|
13
|
-
* their `data.skin`. A click on a joint makes it the active one. A drag is a round brush:
|
|
14
|
-
* points under it follow the active joint more, the nearer the brush's center, and their
|
|
15
|
-
* other joints give way; with Alt held they follow it less. A click away from any joint is
|
|
16
|
-
* one dab. Every point shows as a dot colored by the active joint's share of it. A stroke is
|
|
17
|
-
* one undo entry, and until it ends its weights are in `state.painted()`, which `useRigNode`
|
|
18
|
-
* binds when given the same `state` as `painting`.
|
|
19
|
-
*/
|
|
20
|
-
function useWeightTool(options) {
|
|
21
|
-
const ownState = useMemo(() => createRigEditState(), []);
|
|
22
|
-
const state = options.state ?? ownState;
|
|
23
|
-
const opts = useLatest({
|
|
24
|
-
scene: options.scene,
|
|
25
|
-
rig: options.rig,
|
|
26
|
-
radius: options.radius ?? 24,
|
|
27
|
-
reach: options.reach ?? 10
|
|
28
|
-
});
|
|
29
|
-
const env = useMemo(() => ({
|
|
30
|
-
state,
|
|
31
|
-
scene: () => opts.current.scene,
|
|
32
|
-
placed: () => placedRig(opts.current.scene, opts.current.rig()),
|
|
33
|
-
reachPx: () => opts.current.reach,
|
|
34
|
-
radiusPx: () => opts.current.radius,
|
|
35
|
-
painted: state.painted,
|
|
36
|
-
paint: state.paint
|
|
37
|
-
}), [opts, state]);
|
|
38
|
-
const actions = useMemo(() => createWeightActions(env), [env]);
|
|
39
|
-
const kitSettings = useKitSettings();
|
|
40
|
-
const overlay = useMemo(() => [createWeightOverlay({
|
|
41
|
-
id: "weight-tool-points",
|
|
42
|
-
paths: () => weighedPaths(env),
|
|
43
|
-
active: state.active,
|
|
44
|
-
subscribe: state.listen,
|
|
45
|
-
pointRadiusPx: () => kitSettings.get("targets.weightPointRadiusPx")
|
|
46
|
-
}), createBoneOverlay({
|
|
47
|
-
id: "weight-tool-skeleton",
|
|
48
|
-
skeleton: () => env.placed()?.skeleton ?? null,
|
|
49
|
-
active: state.active,
|
|
50
|
-
subscribe: state.listen,
|
|
51
|
-
jointRadiusPx: () => kitSettings.get("targets.boneJointRadiusPx")
|
|
52
|
-
})], [
|
|
53
|
-
env,
|
|
54
|
-
state,
|
|
55
|
-
kitSettings
|
|
56
|
-
]);
|
|
57
|
-
const { keybinding } = options;
|
|
58
|
-
return useMemo(() => defineTool({
|
|
59
|
-
id: "weight",
|
|
60
|
-
capabilities: ["edits-page"],
|
|
61
|
-
hookName: "useWeightTool",
|
|
62
|
-
cursor: "crosshair",
|
|
63
|
-
presentation: {
|
|
64
|
-
label: "Weight",
|
|
65
|
-
icon: /* @icon */ "core:weight",
|
|
66
|
-
group: "shape"
|
|
67
|
-
},
|
|
68
|
-
...keybinding === null ? {} : { keybinding: keybinding ?? { key: "W" } },
|
|
69
|
-
actions,
|
|
70
|
-
overlay,
|
|
71
|
-
onDeactivate: () => env.paint(null),
|
|
72
|
-
bindings: [{
|
|
73
|
-
spec: {
|
|
74
|
-
kind: "click",
|
|
75
|
-
mods: {
|
|
76
|
-
shift: "optional",
|
|
77
|
-
alt: "optional"
|
|
78
|
-
}
|
|
79
|
-
},
|
|
80
|
-
actionId: "weight.click"
|
|
81
|
-
}, {
|
|
82
|
-
spec: {
|
|
83
|
-
kind: "drag",
|
|
84
|
-
mods: {
|
|
85
|
-
shift: "optional",
|
|
86
|
-
alt: "optional"
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
actionId: "weight.paint"
|
|
90
|
-
}]
|
|
91
|
-
}), [
|
|
92
|
-
actions,
|
|
93
|
-
overlay,
|
|
94
|
-
keybinding,
|
|
95
|
-
env
|
|
96
|
-
]);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
//#endregion
|
|
100
|
-
export { useWeightTool };
|
|
101
|
-
//# sourceMappingURL=useWeightTool.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useWeightTool.js","names":[],"sources":["../../../../src/tools/builtin/weight/useWeightTool.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useKitSettings, useLatest } from '@weasel-js/react';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { createBoneOverlay } from '../bone/boneOverlay';\nimport { placedRig } from '../bone/placedRig';\nimport { createRigEditState, type RigEditState } from '../bone/rigEditState';\nimport { createWeightActions, weighedPaths, type WeightEnv } from './weightActions';\nimport { createWeightOverlay } from './weightOverlay';\nimport { icon } from '../../../icons.gen';\n\n/** Options for `useWeightTool`. */\nexport interface UseWeightToolOptions {\n scene: Scene<unknown, string, unknown>;\n /** The node whose data holds the skeleton; the tool paints the paths under it. */\n rig: () => NodeId | null;\n /** Shared with `useBoneTool`, so both act on one joint. Default: the tool's own. */\n state?: RigEditState;\n /** Override the default keybinding (`{ key: 'W' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** The brush's radius in screen px. Default 24. */\n radius?: number;\n /** Screen px around a joint within which a click picks it. Default 10. */\n reach?: number;\n}\n\n/**\n * Paints how much the active joint weighs each point of the paths under a rig node, into\n * their `data.skin`. A click on a joint makes it the active one. A drag is a round brush:\n * points under it follow the active joint more, the nearer the brush's center, and their\n * other joints give way; with Alt held they follow it less. A click away from any joint is\n * one dab. Every point shows as a dot colored by the active joint's share of it. A stroke is\n * one undo entry, and until it ends its weights are in `state.painted()`, which `useRigNode`\n * binds when given the same `state` as `painting`.\n */\nexport function useWeightTool(options: UseWeightToolOptions): Tool {\n const ownState = useMemo(() => createRigEditState(), []);\n const state = options.state ?? ownState;\n const opts = useLatest({\n scene: options.scene, rig: options.rig, radius: options.radius ?? 24, reach: options.reach ?? 10,\n });\n const env = useMemo((): WeightEnv => ({\n state,\n scene: () => opts.current.scene,\n placed: () => placedRig(opts.current.scene, opts.current.rig()),\n reachPx: () => opts.current.reach,\n radiusPx: () => opts.current.radius,\n painted: state.painted,\n paint: state.paint,\n }), [opts, state]);\n\n const actions = useMemo(() => createWeightActions(env), [env]);\n const kitSettings = useKitSettings();\n const overlay = useMemo(() => [\n createWeightOverlay({\n id: 'weight-tool-points',\n paths: () => weighedPaths(env),\n active: state.active,\n subscribe: state.listen,\n pointRadiusPx: () => kitSettings.get('targets.weightPointRadiusPx'),\n }),\n createBoneOverlay({\n id: 'weight-tool-skeleton',\n skeleton: () => env.placed()?.skeleton ?? null,\n active: state.active,\n subscribe: state.listen,\n jointRadiusPx: () => kitSettings.get('targets.boneJointRadiusPx'),\n }),\n ], [env, state, kitSettings]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool({\n id: 'weight',\n capabilities: ['edits-page'],\n hookName: 'useWeightTool',\n cursor: 'crosshair',\n presentation: { label: 'Weight', icon: icon('weight'), group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'W' } }),\n actions,\n overlay,\n onDeactivate: () => env.paint(null),\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'weight.click' },\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'weight.paint' },\n ],\n }), [actions, overlay, keybinding, env]);\n}\n"],"mappings":"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"}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { createSetDataOp } from "../../../core/ops/setData.js";
|
|
2
|
-
import { defaultCommitAdapter } from "../../../interactions/actions/defaultCommitAdapter.js";
|
|
3
|
-
import { dataRestPath } from "../../../animation/rig/skinBinding.js";
|
|
4
|
-
import { sceneReach } from "../bone/placedRig.js";
|
|
5
|
-
import { ActionDisabledReason } from "@weasel-js/routing";
|
|
6
|
-
import { brushWeights, jointAt, setWeights, skinnable } from "@weasel-js/animator";
|
|
7
|
-
|
|
8
|
-
//#region src/tools/builtin/weight/weightActions.ts
|
|
9
|
-
/** Every path under the rig node, with what `env.painted()` holds for it in place of its
|
|
10
|
-
* `data.skin`. */
|
|
11
|
-
function weighedPaths(env) {
|
|
12
|
-
const rig = env.placed();
|
|
13
|
-
if (!rig) return [];
|
|
14
|
-
const scene = env.scene();
|
|
15
|
-
const painted = env.painted();
|
|
16
|
-
const out = [];
|
|
17
|
-
const walk = (parent) => {
|
|
18
|
-
for (const id of scene.childrenOf(parent)) {
|
|
19
|
-
const node = scene.get(id);
|
|
20
|
-
const rest = node && dataRestPath(node);
|
|
21
|
-
if (node && rest) {
|
|
22
|
-
const skin = painted.get(id) ?? node.data?.skin ?? {};
|
|
23
|
-
out.push({
|
|
24
|
-
id,
|
|
25
|
-
path: skinnable(rest),
|
|
26
|
-
skin
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
walk(id);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
walk(rig.id);
|
|
33
|
-
return out;
|
|
34
|
-
}
|
|
35
|
-
var eligible = { capability: "edits-page" };
|
|
36
|
-
var activeJoint = (env) => {
|
|
37
|
-
const name = env.state.active();
|
|
38
|
-
return name !== null && env.placed()?.skeleton.joints.some((j) => j.name === name) ? name : null;
|
|
39
|
-
};
|
|
40
|
-
/** One dab of the brush at `(x, y)`: what `env.painted()` becomes, or `null` if no point moved. */
|
|
41
|
-
function dab(env, deps, joint, x, y, mode) {
|
|
42
|
-
const radius = sceneReach(deps, env.radiusPx());
|
|
43
|
-
let next = null;
|
|
44
|
-
for (const { id, path, skin } of weighedPaths(env)) {
|
|
45
|
-
const hits = brushWeights(path.coords, x, y, radius, skin[joint], mode);
|
|
46
|
-
if (hits.size === 0) continue;
|
|
47
|
-
next ??= new Map(env.painted());
|
|
48
|
-
next.set(id, setWeights(skin, path.coords.length >> 1, joint, hits));
|
|
49
|
-
}
|
|
50
|
-
return next;
|
|
51
|
-
}
|
|
52
|
-
/** Write what a stroke painted into each node's `data.skin`, as one undo entry. */
|
|
53
|
-
function commitPainted(env, deps) {
|
|
54
|
-
const scene = env.scene();
|
|
55
|
-
const ops = [];
|
|
56
|
-
for (const [id, skin] of env.painted()) {
|
|
57
|
-
const data = scene.get(id)?.data;
|
|
58
|
-
if (data !== void 0) ops.push(createSetDataOp({
|
|
59
|
-
id,
|
|
60
|
-
from: data,
|
|
61
|
-
to: {
|
|
62
|
-
...data,
|
|
63
|
-
skin
|
|
64
|
-
},
|
|
65
|
-
label: "Paint weights"
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
if (ops.length > 0) {
|
|
69
|
-
if (deps.applyOps) deps.applyOps(ops, "Paint weights");
|
|
70
|
-
else scene.applyBatch(ops, "Paint weights", defaultCommitAdapter(scene, deps.selection?.adapterMethods));
|
|
71
|
-
}
|
|
72
|
-
env.paint(null);
|
|
73
|
-
}
|
|
74
|
-
/** The weight tool's actions: `weight.paint` and `weight.click`. */
|
|
75
|
-
function createWeightActions(env) {
|
|
76
|
-
const editing = () => env.placed() ? true : ActionDisabledReason.NotApplicable;
|
|
77
|
-
return [{
|
|
78
|
-
id: "weight.paint",
|
|
79
|
-
label: "Weight — paint the active joint's weights",
|
|
80
|
-
eligible,
|
|
81
|
-
requires: [
|
|
82
|
-
"view",
|
|
83
|
-
"selection",
|
|
84
|
-
"applyOps"
|
|
85
|
-
],
|
|
86
|
-
enabled: () => activeJoint(env) !== null ? true : ActionDisabledReason.NotApplicable,
|
|
87
|
-
invoker: {
|
|
88
|
-
timing: "ongoing",
|
|
89
|
-
start: ({ deps, drag, world, modifiers }) => {
|
|
90
|
-
const joint = activeJoint(env);
|
|
91
|
-
if (joint === null) return {};
|
|
92
|
-
const stroke = (x, y, alt) => {
|
|
93
|
-
const next = dab(env, deps, joint, x, y, alt ? "remove" : "add");
|
|
94
|
-
if (next) env.paint(next);
|
|
95
|
-
};
|
|
96
|
-
const press = drag?.start ?? world;
|
|
97
|
-
stroke(press.x, press.y, modifiers.alt);
|
|
98
|
-
return {
|
|
99
|
-
onMove: (move) => stroke(move.world.x, move.world.y, move.modifiers.alt),
|
|
100
|
-
onEnd: (_end, reason) => {
|
|
101
|
-
if (reason === "cancel") env.paint(null);
|
|
102
|
-
else commitPainted(env, deps);
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}, {
|
|
108
|
-
id: "weight.click",
|
|
109
|
-
label: "Weight — pick a joint, or dab its weight",
|
|
110
|
-
eligible,
|
|
111
|
-
requires: [
|
|
112
|
-
"view",
|
|
113
|
-
"selection",
|
|
114
|
-
"applyOps"
|
|
115
|
-
],
|
|
116
|
-
enabled: editing,
|
|
117
|
-
invoker: {
|
|
118
|
-
timing: "immediate",
|
|
119
|
-
run: (deps, params) => {
|
|
120
|
-
const p = params;
|
|
121
|
-
const rig = env.placed();
|
|
122
|
-
if (!rig || p?.pressX === void 0 || p.pressY === void 0) return;
|
|
123
|
-
const hit = jointAt(rig.skeleton, p.pressX, p.pressY, sceneReach(deps, env.reachPx()));
|
|
124
|
-
if (hit !== null) {
|
|
125
|
-
env.state.setActive(hit);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
const joint = activeJoint(env);
|
|
129
|
-
const next = joint === null ? null : dab(env, deps, joint, p.pressX, p.pressY, p.mods?.alt ? "remove" : "add");
|
|
130
|
-
if (!next) return;
|
|
131
|
-
env.paint(next);
|
|
132
|
-
commitPainted(env, deps);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}];
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
//#endregion
|
|
139
|
-
export { createWeightActions, weighedPaths };
|
|
140
|
-
//# sourceMappingURL=weightActions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"weightActions.js","names":[],"sources":["../../../../src/tools/builtin/weight/weightActions.ts"],"sourcesContent":["import type { Action, ActionDeps, InvocationCtx } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport type { Op } from '@weasel-js/history';\nimport { createSetDataOp } from 'core/ops/setData';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { defaultCommitAdapter } from 'interactions/actions/defaultCommitAdapter';\nimport type { RigNodeData } from '../../../animation/rig/rigNode';\nimport { jointAt } from '@weasel-js/animator';\nimport { skinnable, type Skin } from '@weasel-js/animator';\nimport { dataRestPath } from '../../../animation/rig/skinBinding';\nimport { brushWeights, setWeights } from '@weasel-js/animator';\nimport { sceneReach, type PlacedRig } from '../bone/placedRig';\nimport type { RigEditState } from '../bone/rigEditState';\n\n/** One path under the rig node, where it is drawn, with the weights now showing. */\nexport interface WeighedPath {\n id: NodeId;\n path: PolygonPath;\n skin: Skin;\n}\n\n/** What the weight tool's actions read and write, all of it the tool's own. */\nexport interface WeightEnv {\n scene(): Scene<unknown, string, unknown>;\n placed(): PlacedRig | null;\n state: RigEditState;\n /** Screen px around a joint within which a click picks it. */\n reachPx(): number;\n /** The brush's radius in screen px. */\n radiusPx(): number;\n /** Weights a stroke has painted and not yet committed, by node. */\n painted(): ReadonlyMap<NodeId, Skin>;\n paint(next: ReadonlyMap<NodeId, Skin> | null): void;\n}\n\n/** Every path under the rig node, with what `env.painted()` holds for it in place of its\n * `data.skin`. */\nexport function weighedPaths(env: Pick<WeightEnv, 'scene' | 'placed' | 'painted'>): WeighedPath[] {\n const rig = env.placed();\n if (!rig) return [];\n const scene = env.scene();\n const painted = env.painted();\n const out: WeighedPath[] = [];\n const walk = (parent: NodeId): void => {\n for (const id of scene.childrenOf(parent)) {\n const node = scene.get(id);\n const rest = node && dataRestPath(node);\n if (node && rest) {\n const skin = painted.get(id) ?? (node.data as RigNodeData | null | undefined)?.skin ?? {};\n out.push({ id, path: skinnable(rest), skin });\n }\n walk(id);\n }\n };\n walk(rig.id);\n return out;\n}\n\nconst eligible = { capability: 'edits-page' } as const;\n\nconst activeJoint = (env: WeightEnv): string | null => {\n const name = env.state.active();\n return name !== null && env.placed()?.skeleton.joints.some((j) => j.name === name) ? name : null;\n};\n\n/** One dab of the brush at `(x, y)`: what `env.painted()` becomes, or `null` if no point moved. */\nfunction dab(env: WeightEnv, deps: ActionDeps, joint: string, x: number, y: number, mode: 'add' | 'remove'): Map<NodeId, Skin> | null {\n const radius = sceneReach(deps, env.radiusPx());\n let next: Map<NodeId, Skin> | null = null;\n for (const { id, path, skin } of weighedPaths(env)) {\n const hits = brushWeights(path.coords, x, y, radius, skin[joint], mode);\n if (hits.size === 0) continue;\n next ??= new Map(env.painted());\n next.set(id, setWeights(skin, path.coords.length >> 1, joint, hits));\n }\n return next;\n}\n\n/** Write what a stroke painted into each node's `data.skin`, as one undo entry. */\nfunction commitPainted(env: WeightEnv, deps: ActionDeps): void {\n const scene = env.scene();\n const ops: Op[] = [];\n for (const [id, skin] of env.painted()) {\n const data = scene.get(id)?.data;\n if (data !== undefined) ops.push(createSetDataOp({ id, from: data, to: { ...(data as object), skin }, label: 'Paint weights' }));\n }\n if (ops.length > 0) {\n if (deps.applyOps) deps.applyOps(ops, 'Paint weights');\n else scene.applyBatch(ops, 'Paint weights', defaultCommitAdapter(scene, deps.selection?.adapterMethods));\n }\n env.paint(null);\n}\n\n/** The weight tool's actions: `weight.paint` and `weight.click`. */\nexport function createWeightActions(env: WeightEnv): Action[] {\n const editing = () => (env.placed() ? true : ActionDisabledReason.NotApplicable);\n return [\n {\n id: 'weight.paint',\n label: 'Weight — paint the active joint\\'s weights',\n eligible,\n requires: ['view', 'selection', 'applyOps'],\n enabled: () => (activeJoint(env) !== null ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'ongoing',\n start: ({ deps, drag, world, modifiers }: InvocationCtx) => {\n const joint = activeJoint(env);\n if (joint === null) return {};\n const stroke = (x: number, y: number, alt: boolean): void => {\n const next = dab(env, deps, joint, x, y, alt ? 'remove' : 'add');\n if (next) env.paint(next);\n };\n const press = drag?.start ?? world;\n stroke(press.x, press.y, modifiers.alt);\n return {\n onMove: (move: InvocationCtx) => stroke(move.world.x, move.world.y, move.modifiers.alt),\n // The dispatcher hands `onEnd` a context with empty deps.\n onEnd: (_end: InvocationCtx, reason: 'commit' | 'cancel') => {\n if (reason === 'cancel') env.paint(null);\n else commitPainted(env, deps);\n },\n };\n },\n },\n },\n {\n id: 'weight.click',\n label: 'Weight — pick a joint, or dab its weight',\n eligible,\n requires: ['view', 'selection', 'applyOps'],\n enabled: editing,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number; mods?: { alt?: boolean } } | undefined;\n const rig = env.placed();\n if (!rig || p?.pressX === undefined || p.pressY === undefined) return;\n const hit = jointAt(rig.skeleton, p.pressX, p.pressY, sceneReach(deps, env.reachPx()));\n if (hit !== null) {\n env.state.setActive(hit);\n return;\n }\n const joint = activeJoint(env);\n const next = joint === null ? null : dab(env, deps, joint, p.pressX, p.pressY, p.mods?.alt ? 'remove' : 'add');\n if (!next) return;\n env.paint(next);\n commitPainted(env, deps);\n },\n },\n },\n ];\n}\n"],"mappings":"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"}
|