@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.
Files changed (365) hide show
  1. package/CHANGELOG.md +427 -0
  2. package/README.md +1 -1
  3. package/dist/animation/index.js +3 -3
  4. package/dist/animation/rig/bindRig.js +1 -1
  5. package/dist/animation/rig/rigNode.js.map +1 -1
  6. package/dist/barrel/canvas.js +7 -3
  7. package/dist/barrel/interactions.js +5 -4
  8. package/dist/barrel/paths.js +3 -3
  9. package/dist/barrel/renderer.js +3 -2
  10. package/dist/barrel/routing.js +6 -11
  11. package/dist/barrel/scene.js +8 -5
  12. package/dist/barrel/viewport.js +4 -3
  13. package/dist/canvas/Canvas.js +3 -1
  14. package/dist/canvas/Canvas.js.map +1 -1
  15. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +17 -3
  16. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
  17. package/dist/canvas/SceneCanvas/builtinToolSets.js +30 -0
  18. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -0
  19. package/dist/canvas/SceneCanvas/canvasPassThrough.js +1 -0
  20. package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
  21. package/dist/canvas/SceneCanvas/coordTrace.js +5 -16
  22. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  23. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +5 -0
  24. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  25. package/dist/canvas/SceneCanvas/features.js +45 -5
  26. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  27. package/dist/canvas/SceneCanvas/props.js +1 -11
  28. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  29. package/dist/canvas/SceneCanvas/toolRegistry.js +8 -4
  30. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
  31. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -11
  32. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  33. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  34. package/dist/canvas/SceneCanvas/useBuiltinTools.js +2 -9
  35. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
  36. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +93 -0
  37. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js.map +1 -0
  38. package/dist/canvas/SceneCanvas/useCanvasSelection.js +7 -2
  39. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
  40. package/dist/canvas/SceneCanvas/useCanvasTools.js +8 -8
  41. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
  42. package/dist/canvas/SceneCanvas/useNodeKinds.js +1 -1
  43. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -1
  44. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +13 -2
  45. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
  46. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +1 -3
  47. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
  48. package/dist/canvas/SceneCanvas/useSceneChrome.js +6 -7
  49. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  50. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +5 -3
  51. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
  52. package/dist/canvas/SceneCanvas/useScenePicking.js +2 -3
  53. package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
  54. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +2 -1
  55. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  56. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +3 -4
  57. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  58. package/dist/canvas/SceneCanvas.js +16 -14
  59. package/dist/canvas/SceneCanvas.js.map +1 -1
  60. package/dist/canvas/SurfaceCanvas.js +5 -22
  61. package/dist/canvas/SurfaceCanvas.js.map +1 -1
  62. package/dist/canvas/canvasRenderer.js +9 -5
  63. package/dist/canvas/canvasRenderer.js.map +1 -1
  64. package/dist/canvas/contextAttributes.js +14 -0
  65. package/dist/canvas/contextAttributes.js.map +1 -0
  66. package/dist/canvas/deps/editAnchors.js +9 -113
  67. package/dist/canvas/deps/editAnchors.js.map +1 -1
  68. package/dist/canvas/deps/insert.js +4 -2
  69. package/dist/canvas/deps/insert.js.map +1 -1
  70. package/dist/canvas/deps/pathEditCommits.js +193 -0
  71. package/dist/canvas/deps/pathEditCommits.js.map +1 -0
  72. package/dist/canvas/deps/snap.js +12 -9
  73. package/dist/canvas/deps/snap.js.map +1 -1
  74. package/dist/canvas/deps/transformFollowers.js +20 -0
  75. package/dist/canvas/deps/transformFollowers.js.map +1 -0
  76. package/dist/canvas/derivedPath.js +20 -1
  77. package/dist/canvas/derivedPath.js.map +1 -1
  78. package/dist/canvas/drawnBounds.js +29 -3
  79. package/dist/canvas/drawnBounds.js.map +1 -1
  80. package/dist/canvas/nodeShapes/derivedPainter.js +9 -1
  81. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  82. package/dist/canvas/nodeShapes/pathPainter.js +3 -2
  83. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  84. package/dist/canvas/nodeShapes/shapePainter.js +1 -1
  85. package/dist/canvas/overlayRoleStrokes.js +12 -0
  86. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  87. package/dist/canvas/pathOverlay.js +27 -7
  88. package/dist/canvas/pathOverlay.js.map +1 -1
  89. package/dist/canvas/renderDebugSnapshot.js +1 -0
  90. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  91. package/dist/canvas/renderSceneToPixels.js +6 -5
  92. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  93. package/dist/canvas/sceneAdapter.js.map +1 -1
  94. package/dist/canvas/useCanvasPaint.js +2 -1
  95. package/dist/canvas/useCanvasPaint.js.map +1 -1
  96. package/dist/canvas/useInFlightBounds.js +52 -0
  97. package/dist/canvas/useInFlightBounds.js.map +1 -0
  98. package/dist/canvas/useViewHelpers.js +7 -9
  99. package/dist/canvas/useViewHelpers.js.map +1 -1
  100. package/dist/clipboard.d.ts +3 -2
  101. package/dist/{clone-DZDrfIlU.d.ts → clone-C3e0OTuF.d.ts} +8 -21
  102. package/dist/clone.d.ts +4 -3
  103. package/dist/core/geometry/autoPoseDescriptor.js +1 -1
  104. package/dist/core/ops/setDependsOn.js +37 -0
  105. package/dist/core/ops/setDependsOn.js.map +1 -0
  106. package/dist/core/ops/writtenBy.js +53 -0
  107. package/dist/core/ops/writtenBy.js.map +1 -0
  108. package/dist/core/pages/fitViewToPage.js +12 -1
  109. package/dist/core/pages/fitViewToPage.js.map +1 -1
  110. package/dist/core/pages/pageEdits.js +164 -0
  111. package/dist/core/pages/pageEdits.js.map +1 -0
  112. package/dist/core/pages/pages.js +30 -1
  113. package/dist/core/pages/pages.js.map +1 -1
  114. package/dist/core/scene/NodeRouting.js +8 -3
  115. package/dist/core/scene/NodeRouting.js.map +1 -1
  116. package/dist/core/scene/arrivalWindow.js.map +1 -1
  117. package/dist/core/scene/carryDescendants.js +51 -0
  118. package/dist/core/scene/carryDescendants.js.map +1 -0
  119. package/dist/core/scene/docValues.js +57 -0
  120. package/dist/core/scene/docValues.js.map +1 -0
  121. package/dist/core/scene/editPass.js +111 -0
  122. package/dist/core/scene/editPass.js.map +1 -0
  123. package/dist/core/scene/effectivePose.js +7 -1
  124. package/dist/core/scene/effectivePose.js.map +1 -1
  125. package/dist/core/scene/fieldEdits.js +4 -1
  126. package/dist/core/scene/fieldEdits.js.map +1 -1
  127. package/dist/core/scene/historyFacade.js +1 -0
  128. package/dist/core/scene/historyFacade.js.map +1 -1
  129. package/dist/core/scene/layoutPass.js +28 -3
  130. package/dist/core/scene/layoutPass.js.map +1 -1
  131. package/dist/core/scene/recorder.js +28 -19
  132. package/dist/core/scene/recorder.js.map +1 -1
  133. package/dist/core/scene/scene.js +15 -9
  134. package/dist/core/scene/scene.js.map +1 -1
  135. package/dist/core/scene/sceneChanges.js +13 -0
  136. package/dist/core/scene/sceneChanges.js.map +1 -0
  137. package/dist/core/scene/sceneEdits.js +8 -1
  138. package/dist/core/scene/sceneEdits.js.map +1 -1
  139. package/dist/core/scene/sceneMutators.js +1 -0
  140. package/dist/core/scene/sceneMutators.js.map +1 -1
  141. package/dist/core/scene/sceneRecording.js +20 -3
  142. package/dist/core/scene/sceneRecording.js.map +1 -1
  143. package/dist/core/scene/sceneSelection.js +4 -1
  144. package/dist/core/scene/sceneSelection.js.map +1 -1
  145. package/dist/core/scene/sceneState.js +11 -5
  146. package/dist/core/scene/sceneState.js.map +1 -1
  147. package/dist/core/scene/serialization.js +5 -3
  148. package/dist/core/scene/serialization.js.map +1 -1
  149. package/dist/core/scene/types.js.map +1 -1
  150. package/dist/core/scene/unitScopes.js +19 -1
  151. package/dist/core/scene/unitScopes.js.map +1 -1
  152. package/dist/core/selection/usePublishSceneSelection.js +6 -12
  153. package/dist/core/selection/usePublishSceneSelection.js.map +1 -1
  154. package/dist/core/shapeKinds.js +25 -11
  155. package/dist/core/shapeKinds.js.map +1 -1
  156. package/dist/{cornerHandles-Camw_yeu.d.ts → cornerHandles-BHuoMs1o.d.ts} +1 -1
  157. package/dist/debug/createDebugOverlayLayer.js +16 -111
  158. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  159. package/dist/debug/createDebugSink.js +2 -1
  160. package/dist/debug/createDebugSink.js.map +1 -1
  161. package/dist/debug/defaultTheme.js +4 -2
  162. package/dist/debug/defaultTheme.js.map +1 -1
  163. package/dist/debug/features.js +17 -0
  164. package/dist/debug/features.js.map +1 -0
  165. package/dist/debug/overlayPanels.js +117 -0
  166. package/dist/debug/overlayPanels.js.map +1 -0
  167. package/dist/debug/parseDebugFlags.js +4 -13
  168. package/dist/debug/parseDebugFlags.js.map +1 -1
  169. package/dist/{depSchema-Cgfu_G9s.d.ts → depSchema-BpZNOv7q.d.ts} +114 -892
  170. package/dist/devtools/handlers.js +112 -0
  171. package/dist/devtools/handlers.js.map +1 -0
  172. package/dist/devtools/history.js +71 -0
  173. package/dist/devtools/history.js.map +1 -0
  174. package/dist/devtools/hook.js +74 -0
  175. package/dist/devtools/hook.js.map +1 -0
  176. package/dist/devtools/label.js +25 -0
  177. package/dist/devtools/label.js.map +1 -0
  178. package/dist/devtools/notices.js +58 -0
  179. package/dist/devtools/notices.js.map +1 -0
  180. package/dist/devtools/protocol.js +7 -0
  181. package/dist/devtools/protocol.js.map +1 -0
  182. package/dist/devtools/registry.js +90 -0
  183. package/dist/devtools/registry.js.map +1 -0
  184. package/dist/devtools/root.js +80 -0
  185. package/dist/devtools/root.js.map +1 -0
  186. package/dist/devtools/serialize.js +86 -0
  187. package/dist/devtools/serialize.js.map +1 -0
  188. package/dist/devtools/session.js +111 -0
  189. package/dist/devtools/session.js.map +1 -0
  190. package/dist/devtools/transport.js +67 -0
  191. package/dist/devtools/transport.js.map +1 -0
  192. package/dist/devtools/useDevtoolsRoot.js +81 -0
  193. package/dist/devtools/useDevtoolsRoot.js.map +1 -0
  194. package/dist/devtools-protocol.d.ts +435 -0
  195. package/dist/devtools-protocol.js +7 -0
  196. package/dist/devtools.d.ts +8 -0
  197. package/dist/devtools.js +12 -0
  198. package/dist/devtools.js.map +1 -0
  199. package/dist/features/chrome-caps/useHoverTracking.js +16 -10
  200. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  201. package/dist/features/ingestion/contentHandlers.js +25 -2
  202. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  203. package/dist/features/measure/measureCommands.js +7 -5
  204. package/dist/features/measure/measureCommands.js.map +1 -1
  205. package/dist/features/paths/index.js +2 -2
  206. package/dist/features/paths/pathEditExtension.js.map +1 -1
  207. package/dist/features/paths/pathSnap/pathSnapSource.js +5 -5
  208. package/dist/features/paths/pathSnap/pathSnapSource.js.map +1 -1
  209. package/dist/features/paths/pathSnap/sceneIndex.js +10 -3
  210. package/dist/features/paths/pathSnap/sceneIndex.js.map +1 -1
  211. package/dist/features/selection/selectionPose.js +4 -1
  212. package/dist/features/selection/selectionPose.js.map +1 -1
  213. package/dist/features/snap/gather.js +9 -1
  214. package/dist/features/snap/gather.js.map +1 -1
  215. package/dist/features/snap/lazySession.js +17 -0
  216. package/dist/features/snap/lazySession.js.map +1 -0
  217. package/dist/features/snap/marks.js.map +1 -1
  218. package/dist/features/snap/probes2d.js +27 -19
  219. package/dist/features/snap/probes2d.js.map +1 -1
  220. package/dist/features/snap/readoutLayer.js.map +1 -1
  221. package/dist/features/snap/roles.js +2 -1
  222. package/dist/features/snap/roles.js.map +1 -1
  223. package/dist/features/snap/rotationSource.js +25 -8
  224. package/dist/features/snap/rotationSource.js.map +1 -1
  225. package/dist/features/snap/sceneSession2d.js +6 -4
  226. package/dist/features/snap/sceneSession2d.js.map +1 -1
  227. package/dist/features/snap/session2d.js +37 -23
  228. package/dist/features/snap/session2d.js.map +1 -1
  229. package/dist/features/snap/spanSnap.js +5 -2
  230. package/dist/features/snap/spanSnap.js.map +1 -1
  231. package/dist/icons.table.js +1 -1
  232. package/dist/icons.table.js.map +1 -1
  233. package/dist/icons.table.json +0 -10
  234. package/dist/index.d.ts +701 -696
  235. package/dist/index.js +35 -29
  236. package/dist/interactions/actions/align/action.js +6 -4
  237. package/dist/interactions/actions/align/action.js.map +1 -1
  238. package/dist/interactions/actions/align/align.js.map +1 -1
  239. package/dist/interactions/actions/booleans/action.js +7 -1
  240. package/dist/interactions/actions/booleans/action.js.map +1 -1
  241. package/dist/interactions/actions/clone/action.js +1 -1
  242. package/dist/interactions/actions/clone/behaviors.js +4 -4
  243. package/dist/interactions/actions/clone/behaviors.js.map +1 -1
  244. package/dist/interactions/actions/defaults/bendSegment.js +1 -1
  245. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  246. package/dist/interactions/actions/defaults/createPaintAction.js +1 -1
  247. package/dist/interactions/actions/defaults/delete.js +48 -39
  248. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  249. package/dist/interactions/actions/defaults/duplicate.js +1 -1
  250. package/dist/interactions/actions/defaults/group.js +2 -2
  251. package/dist/interactions/actions/defaults/ingest.js +7 -5
  252. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  253. package/dist/interactions/actions/defaults/nudge.js +13 -38
  254. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  255. package/dist/interactions/actions/distribute/action.js +6 -4
  256. package/dist/interactions/actions/distribute/action.js.map +1 -1
  257. package/dist/interactions/actions/drawnBoxes.js +2 -1
  258. package/dist/interactions/actions/drawnBoxes.js.map +1 -1
  259. package/dist/interactions/actions/edit-anchors/action.js +3 -6
  260. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  261. package/dist/interactions/actions/edit-anchors/preview.js +41 -8
  262. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
  263. package/dist/interactions/actions/flip/action.js +6 -4
  264. package/dist/interactions/actions/flip/action.js.map +1 -1
  265. package/dist/interactions/actions/gestureLifecycle.js +5 -2
  266. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  267. package/dist/interactions/actions/insert/action.js +1 -2
  268. package/dist/interactions/actions/insert/action.js.map +1 -1
  269. package/dist/interactions/actions/insert/commit.js +1 -1
  270. package/dist/interactions/actions/insert/parent.js +11 -0
  271. package/dist/interactions/actions/insert/parent.js.map +1 -0
  272. package/dist/interactions/actions/insert/placeAction.js +7 -2
  273. package/dist/interactions/actions/insert/placeAction.js.map +1 -1
  274. package/dist/interactions/actions/insert/session.js +5 -1
  275. package/dist/interactions/actions/insert/session.js.map +1 -1
  276. package/dist/interactions/actions/move/action.js +8 -4
  277. package/dist/interactions/actions/move/action.js.map +1 -1
  278. package/dist/interactions/actions/move/behaviors/layoutDrop.js +0 -1
  279. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
  280. package/dist/interactions/actions/move/behaviors/snapToContainer.js +1 -1
  281. package/dist/interactions/actions/move/capture.js +1 -1
  282. package/dist/interactions/actions/move/commit/index.js +0 -2
  283. package/dist/interactions/actions/move/commit/index.js.map +1 -1
  284. package/dist/interactions/actions/move/commit/layoutDrop.js +2 -2
  285. package/dist/interactions/actions/move/commit/layoutRelease.js +2 -2
  286. package/dist/interactions/actions/move/commit/reparent.js +11 -5
  287. package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
  288. package/dist/interactions/actions/move/frame.js +4 -10
  289. package/dist/interactions/actions/move/frame.js.map +1 -1
  290. package/dist/interactions/actions/move/landedDescendants.js +20 -17
  291. package/dist/interactions/actions/move/landedDescendants.js.map +1 -1
  292. package/dist/interactions/actions/move/layout/container.js +2 -1
  293. package/dist/interactions/actions/move/layout/container.js.map +1 -1
  294. package/dist/interactions/actions/move/layout/dragged.js +1 -1
  295. package/dist/interactions/actions/move/layout/dropPass.js +18 -1
  296. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
  297. package/dist/interactions/actions/move/layout/exits.js +5 -5
  298. package/dist/interactions/actions/move/layout/exits.js.map +1 -1
  299. package/dist/interactions/actions/move/session.js +14 -3
  300. package/dist/interactions/actions/move/session.js.map +1 -1
  301. package/dist/interactions/actions/move/translate.js +8 -37
  302. package/dist/interactions/actions/move/translate.js.map +1 -1
  303. package/dist/interactions/actions/moveNodes.js +87 -0
  304. package/dist/interactions/actions/moveNodes.js.map +1 -0
  305. package/dist/interactions/actions/planeInput.js.map +1 -1
  306. package/dist/interactions/actions/resize/action.js +83 -72
  307. package/dist/interactions/actions/resize/action.js.map +1 -1
  308. package/dist/interactions/actions/resize/commit.js +2 -1
  309. package/dist/interactions/actions/resize/commit.js.map +1 -1
  310. package/dist/interactions/actions/resize/session.js +2 -0
  311. package/dist/interactions/actions/resize/session.js.map +1 -1
  312. package/dist/interactions/actions/resolvePreviews.js +3 -3
  313. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  314. package/dist/interactions/actions/rotate/action.js +7 -4
  315. package/dist/interactions/actions/rotate/action.js.map +1 -1
  316. package/dist/interactions/actions/rotate/commit.js +2 -1
  317. package/dist/interactions/actions/rotate/commit.js.map +1 -1
  318. package/dist/interactions/actions/rotate/session.js +2 -0
  319. package/dist/interactions/actions/rotate/session.js.map +1 -1
  320. package/dist/interactions/actions/selectionSubtree.js +13 -2
  321. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  322. package/dist/interactions/actions/testUtils.js.map +1 -1
  323. package/dist/interactions/actions/transform-again/action.js +5 -6
  324. package/dist/interactions/actions/transform-again/action.js.map +1 -1
  325. package/dist/interactions/actions/transformFinish.js +106 -0
  326. package/dist/interactions/actions/transformFinish.js.map +1 -0
  327. package/dist/kitSettingsSchema.js +0 -4
  328. package/dist/kitSettingsSchema.js.map +1 -1
  329. package/dist/move.d.ts +5 -4
  330. package/dist/{options-p9GZMXbY.d.ts → options-DBxEryYq.d.ts} +1 -1
  331. package/dist/resize.d.ts +4 -3
  332. package/dist/routing.d.ts +1 -1
  333. package/dist/routing.js +2 -2
  334. package/dist/test-hook/createTestHook.js +1 -1
  335. package/dist/test-hook/createTestHook.js.map +1 -1
  336. package/dist/test-hook/useTestHook.js +2 -1
  337. package/dist/test-hook/useTestHook.js.map +1 -1
  338. package/dist/test-seams.d.ts +9 -5
  339. package/dist/tools/builtin/pen/penHandle.js +3 -5
  340. package/dist/tools/builtin/pen/penHandle.js.map +1 -1
  341. package/dist/tools/index.js +26 -0
  342. package/dist/{types-CHVXGfYm.d.ts → types-7puAuVD2.d.ts} +3 -262
  343. package/dist/types-BN9hbdMI.d.ts +184 -0
  344. package/dist/types-CniVctmk.d.ts +949 -0
  345. package/dist/types-oFeQ5VjV.d.ts +264 -0
  346. package/dist/version.js +1 -1
  347. package/package.json +35 -25
  348. package/dist/canvas/SceneCanvas/useBuiltinRigTools.js +0 -65
  349. package/dist/canvas/SceneCanvas/useBuiltinRigTools.js.map +0 -1
  350. package/dist/tools/builtin/bone/boneActions.js +0 -156
  351. package/dist/tools/builtin/bone/boneActions.js.map +0 -1
  352. package/dist/tools/builtin/bone/boneOverlay.js +0 -71
  353. package/dist/tools/builtin/bone/boneOverlay.js.map +0 -1
  354. package/dist/tools/builtin/bone/placedRig.js +0 -28
  355. package/dist/tools/builtin/bone/placedRig.js.map +0 -1
  356. package/dist/tools/builtin/bone/rigEditState.js +0 -30
  357. package/dist/tools/builtin/bone/rigEditState.js.map +0 -1
  358. package/dist/tools/builtin/bone/useBoneTool.js +0 -125
  359. package/dist/tools/builtin/bone/useBoneTool.js.map +0 -1
  360. package/dist/tools/builtin/weight/useWeightTool.js +0 -101
  361. package/dist/tools/builtin/weight/useWeightTool.js.map +0 -1
  362. package/dist/tools/builtin/weight/weightActions.js +0 -140
  363. package/dist/tools/builtin/weight/weightActions.js.map +0 -1
  364. package/dist/tools/builtin/weight/weightOverlay.js +0 -78
  365. 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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"}