@weasel-js/core 1.6.1 → 1.7.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 +1006 -0
- package/README.md +28 -9
- package/dist/WeaselProvider.js +15 -0
- package/dist/WeaselProvider.js.map +1 -0
- package/dist/affordances/composeAffordanceLayer.js +224 -0
- package/dist/affordances/composeAffordanceLayer.js.map +1 -0
- package/dist/affordances/cornerResize.js +69 -0
- package/dist/affordances/cornerResize.js.map +1 -0
- package/dist/affordances/hitAffordanceRegions.js +138 -0
- package/dist/affordances/hitAffordanceRegions.js.map +1 -0
- package/dist/affordances/pathAnchors.js +66 -0
- package/dist/affordances/pathAnchors.js.map +1 -0
- package/dist/affordances/rotationHandle.js +103 -0
- package/dist/affordances/rotationHandle.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +118 -0
- package/dist/animation/behaviors/momentum.js.map +1 -0
- package/dist/animation/colorHelpers.js +135 -0
- package/dist/animation/colorHelpers.js.map +1 -0
- package/dist/animation/colorRegistry.js +37 -0
- package/dist/animation/colorRegistry.js.map +1 -0
- package/dist/animation/index.js +20 -0
- package/dist/animation/loop.js +62 -0
- package/dist/animation/loop.js.map +1 -0
- package/dist/animation/observe.js +23 -0
- package/dist/animation/observe.js.map +1 -0
- package/dist/animation/poseHelpers.js +50 -0
- package/dist/animation/poseHelpers.js.map +1 -0
- package/dist/animation/reflow.js +121 -0
- package/dist/animation/reflow.js.map +1 -0
- package/dist/animation/rig/bindRig.js +74 -0
- package/dist/animation/rig/bindRig.js.map +1 -0
- package/dist/animation/rig/blendPoses.js +43 -0
- package/dist/animation/rig/blendPoses.js.map +1 -0
- package/dist/animation/rig/mirrorPose.js +19 -0
- package/dist/animation/rig/mirrorPose.js.map +1 -0
- package/dist/animation/rig/resolveSkeleton.js +33 -0
- package/dist/animation/rig/resolveSkeleton.js.map +1 -0
- package/dist/animation/rig/solveIk.js +103 -0
- package/dist/animation/rig/solveIk.js.map +1 -0
- package/dist/animation/rig/types.js +12 -0
- package/dist/animation/rig/types.js.map +1 -0
- package/dist/animation/rig/useRig.js +23 -0
- package/dist/animation/rig/useRig.js.map +1 -0
- package/dist/animation/slew.js +27 -0
- package/dist/animation/slew.js.map +1 -0
- package/dist/animation/stagger.js +138 -0
- package/dist/animation/stagger.js.map +1 -0
- package/dist/animation/timeline/booking.js +106 -0
- package/dist/animation/timeline/booking.js.map +1 -0
- package/dist/animation/timeline/createTimeline.js +116 -0
- package/dist/animation/timeline/createTimeline.js.map +1 -0
- package/dist/animation/timeline/sampleTrack.js +29 -0
- package/dist/animation/timeline/sampleTrack.js.map +1 -0
- package/dist/animation/useAnimator.js +329 -0
- package/dist/animation/useAnimator.js.map +1 -0
- package/dist/animation/wrappers/animateLifecycle.js +40 -0
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
- package/dist/animation/wrappers/animateOnSetPose.js +44 -0
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
- package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
- package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
- package/dist/canvas/Canvas.js +608 -0
- package/dist/canvas/Canvas.js.map +1 -0
- package/dist/canvas/CanvasView.js +255 -0
- package/dist/canvas/CanvasView.js.map +1 -0
- package/dist/canvas/CursorCoordsHud.js +75 -0
- package/dist/canvas/CursorCoordsHud.js.map +1 -0
- package/dist/canvas/DrawCanvas.js +67 -0
- package/dist/canvas/DrawCanvas.js.map +1 -0
- package/dist/canvas/MinimapCanvas.js +139 -0
- package/dist/canvas/MinimapCanvas.js.map +1 -0
- package/dist/canvas/ModalityHud.js +66 -0
- package/dist/canvas/ModalityHud.js.map +1 -0
- package/dist/canvas/NodeShape.js +391 -0
- package/dist/canvas/NodeShape.js.map +1 -0
- package/dist/canvas/PickHud.js +93 -0
- package/dist/canvas/PickHud.js.map +1 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
- package/dist/canvas/SceneCanvas/features.js +97 -0
- package/dist/canvas/SceneCanvas/features.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +992 -0
- package/dist/canvas/SceneCanvas.js.map +1 -0
- package/dist/canvas/SceneViewCanvas.js +54 -0
- package/dist/canvas/SceneViewCanvas.js.map +1 -0
- package/dist/canvas/accentColor.js +9 -0
- package/dist/canvas/accentColor.js.map +1 -0
- package/dist/canvas/affordanceAt.js +63 -0
- package/dist/canvas/affordanceAt.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +65 -0
- package/dist/canvas/buildSceneTree.js.map +1 -0
- package/dist/canvas/canvasRenderer.js +89 -0
- package/dist/canvas/canvasRenderer.js.map +1 -0
- package/dist/canvas/colorOverrides.js +16 -0
- package/dist/canvas/colorOverrides.js.map +1 -0
- package/dist/canvas/defaultDrawOne.js +43 -0
- package/dist/canvas/defaultDrawOne.js.map +1 -0
- package/dist/canvas/deps/areaSelect.js +19 -0
- package/dist/canvas/deps/areaSelect.js.map +1 -0
- package/dist/canvas/deps/debug.js +9 -0
- package/dist/canvas/deps/debug.js.map +1 -0
- package/dist/canvas/deps/dispatcher.js +11 -0
- package/dist/canvas/deps/dispatcher.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +101 -0
- package/dist/canvas/deps/editAnchors.js.map +1 -0
- package/dist/canvas/deps/geometryProjection.js +11 -0
- package/dist/canvas/deps/geometryProjection.js.map +1 -0
- package/dist/canvas/deps/hitTestArea.js +51 -0
- package/dist/canvas/deps/hitTestArea.js.map +1 -0
- package/dist/canvas/deps/ingestion.js +31 -0
- package/dist/canvas/deps/ingestion.js.map +1 -0
- package/dist/canvas/deps/insert.js +116 -0
- package/dist/canvas/deps/insert.js.map +1 -0
- package/dist/canvas/deps/lassoSelect.js +20 -0
- package/dist/canvas/deps/lassoSelect.js.map +1 -0
- package/dist/canvas/deps/layout.js +34 -0
- package/dist/canvas/deps/layout.js.map +1 -0
- package/dist/canvas/deps/nodeAtPoint.js +19 -0
- package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
- package/dist/canvas/deps/poseComposition.js +11 -0
- package/dist/canvas/deps/poseComposition.js.map +1 -0
- package/dist/canvas/deps/poseDescriptor.js +12 -0
- package/dist/canvas/deps/poseDescriptor.js.map +1 -0
- package/dist/canvas/deps/resizePolicy.js +35 -0
- package/dist/canvas/deps/resizePolicy.js.map +1 -0
- package/dist/canvas/deps/slice.js +99 -0
- package/dist/canvas/deps/slice.js.map +1 -0
- package/dist/canvas/deps/snap.js +11 -0
- package/dist/canvas/deps/snap.js.map +1 -0
- package/dist/canvas/deps/textEdit.js +21 -0
- package/dist/canvas/deps/textEdit.js.map +1 -0
- package/dist/canvas/deps/view.js +43 -0
- package/dist/canvas/deps/view.js.map +1 -0
- package/dist/canvas/derivedPath.js +47 -0
- package/dist/canvas/derivedPath.js.map +1 -0
- package/dist/canvas/drawEnvelope.js +22 -0
- package/dist/canvas/drawEnvelope.js.map +1 -0
- package/dist/canvas/getNodeAtPoint.js +18 -0
- package/dist/canvas/getNodeAtPoint.js.map +1 -0
- package/dist/canvas/hostAnchor.js +29 -0
- package/dist/canvas/hostAnchor.js.map +1 -0
- package/dist/canvas/hud.module.js +18 -0
- package/dist/canvas/hud.module.js.map +1 -0
- package/dist/canvas/insertPreviewExtent.js +103 -0
- package/dist/canvas/insertPreviewExtent.js.map +1 -0
- package/dist/canvas/kitRequirements.js +177 -0
- package/dist/canvas/kitRequirements.js.map +1 -0
- package/dist/canvas/layerOrder.js +66 -0
- package/dist/canvas/layerOrder.js.map +1 -0
- package/dist/canvas/layerSlots.js +14 -0
- package/dist/canvas/layerSlots.js.map +1 -0
- package/dist/canvas/minimapMath.js +80 -0
- package/dist/canvas/minimapMath.js.map +1 -0
- package/dist/canvas/mountedCanvases.js +20 -0
- package/dist/canvas/mountedCanvases.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js +17 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -0
- package/dist/canvas/paintCull.js +20 -0
- package/dist/canvas/paintCull.js.map +1 -0
- package/dist/canvas/pickWalk.js +158 -0
- package/dist/canvas/pickWalk.js.map +1 -0
- package/dist/canvas/planeClips.js +30 -0
- package/dist/canvas/planeClips.js.map +1 -0
- package/dist/canvas/poseRotation.js +35 -0
- package/dist/canvas/poseRotation.js.map +1 -0
- package/dist/canvas/rasterToPng.js +21 -0
- package/dist/canvas/rasterToPng.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +32 -0
- package/dist/canvas/renderDebugSnapshot.js.map +1 -0
- package/dist/canvas/renderNeeds.js +25 -0
- package/dist/canvas/renderNeeds.js.map +1 -0
- package/dist/canvas/renderSceneToPixels.js +143 -0
- package/dist/canvas/renderSceneToPixels.js.map +1 -0
- package/dist/canvas/sceneAdapter.js +270 -0
- package/dist/canvas/sceneAdapter.js.map +1 -0
- package/dist/canvas/sceneLayerPaint.js +37 -0
- package/dist/canvas/sceneLayerPaint.js.map +1 -0
- package/dist/canvas/sceneSlotWiring.js +20 -0
- package/dist/canvas/sceneSlotWiring.js.map +1 -0
- package/dist/canvas/sceneViewRender.js +72 -0
- package/dist/canvas/sceneViewRender.js.map +1 -0
- package/dist/canvas/slopsDebugLayer.js +61 -0
- package/dist/canvas/slopsDebugLayer.js.map +1 -0
- package/dist/canvas/surfaceContribution.js +15 -0
- package/dist/canvas/surfaceContribution.js.map +1 -0
- package/dist/canvas/toolPreview.js +39 -0
- package/dist/canvas/toolPreview.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +11 -0
- package/dist/canvas/useCanvasRenderer.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +60 -0
- package/dist/canvas/useFrameLoop.js.map +1 -0
- package/dist/canvas/useHostAnchor.js +71 -0
- package/dist/canvas/useHostAnchor.js.map +1 -0
- package/dist/canvas/useLateContentRedraw.js +21 -0
- package/dist/canvas/useLateContentRedraw.js.map +1 -0
- package/dist/canvas/useRedrawOn.js +21 -0
- package/dist/canvas/useRedrawOn.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +120 -0
- package/dist/canvas/useViewHelpers.js.map +1 -0
- package/dist/canvas/viewInputs.js +17 -0
- package/dist/canvas/viewInputs.js.map +1 -0
- package/dist/canvas/viewRegistry.js +61 -0
- package/dist/canvas/viewRegistry.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js +14 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -0
- package/dist/clipboard.d.ts +10 -5
- package/dist/clipboard.js +3 -5
- package/dist/clone.d.ts +3 -3
- package/dist/clone.js +2 -5
- package/dist/core/adapters/arrayAdapter.js +85 -0
- package/dist/core/adapters/arrayAdapter.js.map +1 -0
- package/dist/core/adapters/useArrayAdapter.js +13 -0
- package/dist/core/adapters/useArrayAdapter.js.map +1 -0
- package/dist/core/applyOps.js +12 -0
- package/dist/core/applyOps.js.map +1 -0
- package/dist/core/device/index.js +4 -0
- package/dist/core/device/targets.js +17 -0
- package/dist/core/device/targets.js.map +1 -0
- package/dist/core/device/useDeviceProfile.js +75 -0
- package/dist/core/device/useDeviceProfile.js.map +1 -0
- package/dist/core/fillInPoseFrame.js +102 -0
- package/dist/core/fillInPoseFrame.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +98 -0
- package/dist/core/geometry/poseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseRotation.js +58 -0
- package/dist/core/geometry/poseRotation.js.map +1 -0
- package/dist/core/geometry/regionHit.js +102 -0
- package/dist/core/geometry/regionHit.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +60 -0
- package/dist/core/geometry/unionBounds.js.map +1 -0
- package/dist/core/gradient.js +136 -0
- package/dist/core/gradient.js.map +1 -0
- package/dist/core/isPlainObject.js +11 -0
- package/dist/core/isPlainObject.js.map +1 -0
- package/dist/core/layers/render.js +150 -0
- package/dist/core/layers/render.js.map +1 -0
- package/dist/core/markerInset.js +24 -0
- package/dist/core/markerInset.js.map +1 -0
- package/dist/core/mixed.js +6 -0
- package/dist/core/mixed.js.map +1 -0
- package/dist/core/ops/arrange.js +31 -0
- package/dist/core/ops/arrange.js.map +1 -0
- package/dist/core/ops/create.js +32 -0
- package/dist/core/ops/create.js.map +1 -0
- package/dist/core/ops/createHistory.js +20 -0
- package/dist/core/ops/createHistory.js.map +1 -0
- package/dist/core/ops/delete.js +89 -0
- package/dist/core/ops/delete.js.map +1 -0
- package/dist/core/ops/registry.js +17 -0
- package/dist/core/ops/registry.js.map +1 -0
- package/dist/core/ops/reorder/algorithms.js +55 -0
- package/dist/core/ops/reorder/algorithms.js.map +1 -0
- package/dist/core/ops/reorder/index.js +140 -0
- package/dist/core/ops/reorder/index.js.map +1 -0
- package/dist/core/ops/reparent.js +52 -0
- package/dist/core/ops/reparent.js.map +1 -0
- package/dist/core/ops/select.js +34 -0
- package/dist/core/ops/select.js.map +1 -0
- package/dist/core/ops/setData.js +34 -0
- package/dist/core/ops/setData.js.map +1 -0
- package/dist/core/ops/setLayer.js +34 -0
- package/dist/core/ops/setLayer.js.map +1 -0
- package/dist/core/ops/setLayout.js +31 -0
- package/dist/core/ops/setLayout.js.map +1 -0
- package/dist/core/ops/setPath.js +57 -0
- package/dist/core/ops/setPath.js.map +1 -0
- package/dist/core/ops/setText.js +34 -0
- package/dist/core/ops/setText.js.map +1 -0
- package/dist/core/ops/slot.js +37 -0
- package/dist/core/ops/slot.js.map +1 -0
- package/dist/core/ops/transform.js +42 -0
- package/dist/core/ops/transform.js.map +1 -0
- package/dist/core/paintKinds.js +156 -0
- package/dist/core/paintKinds.js.map +1 -0
- package/dist/core/scene/NodeProperties.js +20 -0
- package/dist/core/scene/NodeProperties.js.map +1 -0
- package/dist/core/scene/NodeRouting.js +24 -0
- package/dist/core/scene/NodeRouting.js.map +1 -0
- package/dist/core/scene/arrivals.js +12 -0
- package/dist/core/scene/arrivals.js.map +1 -0
- package/dist/core/scene/composeFrame.js +29 -0
- package/dist/core/scene/composeFrame.js.map +1 -0
- package/dist/core/scene/depMemo.js +18 -0
- package/dist/core/scene/depMemo.js.map +1 -0
- package/dist/core/scene/dependents.js +66 -0
- package/dist/core/scene/dependents.js.map +1 -0
- package/dist/core/scene/derivedPath.js +31 -0
- package/dist/core/scene/derivedPath.js.map +1 -0
- package/dist/core/scene/effectivePose.js +78 -0
- package/dist/core/scene/effectivePose.js.map +1 -0
- package/dist/core/scene/kitRegistry.js +33 -0
- package/dist/core/scene/kitRegistry.js.map +1 -0
- package/dist/core/scene/layoutPass.js +96 -0
- package/dist/core/scene/layoutPass.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +83 -0
- package/dist/core/scene/nodeFnFields.js.map +1 -0
- package/dist/core/scene/nodeMemo.js +28 -0
- package/dist/core/scene/nodeMemo.js.map +1 -0
- package/dist/core/scene/poseFeed.js +87 -0
- package/dist/core/scene/poseFeed.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +52 -0
- package/dist/core/scene/poseOverrides.js.map +1 -0
- package/dist/core/scene/poseSnapshot.js +54 -0
- package/dist/core/scene/poseSnapshot.js.map +1 -0
- package/dist/core/scene/scene.js +1271 -0
- package/dist/core/scene/scene.js.map +1 -0
- package/dist/core/scene/types.js +6 -0
- package/dist/core/scene/types.js.map +1 -0
- package/dist/core/scene/useScene.js +32 -0
- package/dist/core/scene/useScene.js.map +1 -0
- package/dist/core/selection/chromeState.js +31 -0
- package/dist/core/selection/chromeState.js.map +1 -0
- package/dist/core/selection/selectionTarget.js +6 -0
- package/dist/core/selection/selectionTarget.js.map +1 -0
- package/dist/core/selection/useSelection.js +71 -0
- package/dist/core/selection/useSelection.js.map +1 -0
- package/dist/core/shapeKinds.js +54 -0
- package/dist/core/shapeKinds.js.map +1 -0
- package/dist/core/strokeMarkerShapes.js +139 -0
- package/dist/core/strokeMarkerShapes.js.map +1 -0
- package/dist/core/strokeMarkers.js +28 -0
- package/dist/core/strokeMarkers.js.map +1 -0
- package/dist/core/stylus/stylus.js +39 -0
- package/dist/core/stylus/stylus.js.map +1 -0
- package/dist/core/stylus/usePointerStylus.js +51 -0
- package/dist/core/stylus/usePointerStylus.js.map +1 -0
- package/dist/core/usePaintKinds.js +17 -0
- package/dist/core/usePaintKinds.js.map +1 -0
- package/dist/core/viewport/clampView.js +24 -0
- package/dist/core/viewport/clampView.js.map +1 -0
- package/dist/core/viewport/clientToWorld.js +8 -0
- package/dist/core/viewport/clientToWorld.js.map +1 -0
- package/dist/core/viewport/createVelocityTracker.js +39 -0
- package/dist/core/viewport/createVelocityTracker.js.map +1 -0
- package/dist/core/viewport/fitToBounds.js +18 -0
- package/dist/core/viewport/fitToBounds.js.map +1 -0
- package/dist/core/viewport/fitViewToBounds.js +36 -0
- package/dist/core/viewport/fitViewToBounds.js.map +1 -0
- package/dist/core/viewport/interpolateView.js +34 -0
- package/dist/core/viewport/interpolateView.js.map +1 -0
- package/dist/core/viewport/meanScale.js +8 -0
- package/dist/core/viewport/meanScale.js.map +1 -0
- package/dist/core/viewport/parallax.js +111 -0
- package/dist/core/viewport/parallax.js.map +1 -0
- package/dist/core/viewport/pxExtent.js +42 -0
- package/dist/core/viewport/pxExtent.js.map +1 -0
- package/dist/core/viewport/sceneNodeClientRect.js +18 -0
- package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
- package/dist/core/viewport/screenSlop.js +27 -0
- package/dist/core/viewport/screenSlop.js.map +1 -0
- package/dist/core/viewport/useAutoCenter.js +32 -0
- package/dist/core/viewport/useAutoCenter.js.map +1 -0
- package/dist/core/viewport/useCanvasSize.js +29 -0
- package/dist/core/viewport/useCanvasSize.js.map +1 -0
- package/dist/core/viewport/useDecayLoop.js +63 -0
- package/dist/core/viewport/useDecayLoop.js.map +1 -0
- package/dist/core/viewport/useVelocityTracker.js +10 -0
- package/dist/core/viewport/useVelocityTracker.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +63 -0
- package/dist/core/viewport/useViewAnimation.js.map +1 -0
- package/dist/core/viewport/view.js +37 -0
- package/dist/core/viewport/view.js.map +1 -0
- package/dist/core/viewport/viewTransform.js +11 -0
- package/dist/core/viewport/viewTransform.js.map +1 -0
- package/dist/core/viewport/viewportWorldRect.js +13 -0
- package/dist/core/viewport/viewportWorldRect.js.map +1 -0
- package/dist/core/viewport/wheelHandler.js +30 -0
- package/dist/core/viewport/wheelHandler.js.map +1 -0
- package/dist/core/viewport/zoomAt.js +22 -0
- package/dist/core/viewport/zoomAt.js.map +1 -0
- package/dist/core/viewport/zoomBounds.js +20 -0
- package/dist/core/viewport/zoomBounds.js.map +1 -0
- package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
- package/dist/debug/createDebugOverlayLayer.js +358 -0
- package/dist/debug/createDebugOverlayLayer.js.map +1 -0
- package/dist/debug/createDebugSink.js +83 -0
- package/dist/debug/createDebugSink.js.map +1 -0
- package/dist/debug/defaultTheme.js +31 -0
- package/dist/debug/defaultTheme.js.map +1 -0
- package/dist/debug/flag.js +41 -0
- package/dist/debug/flag.js.map +1 -0
- package/dist/debug/frameStats.js +16 -0
- package/dist/debug/frameStats.js.map +1 -0
- package/dist/debug/parseDebugFlags.js +32 -0
- package/dist/debug/parseDebugFlags.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
- package/dist/features/chrome-caps/conditions.js +36 -0
- package/dist/features/chrome-caps/conditions.js.map +1 -0
- package/dist/features/chrome-caps/defaults.js +26 -0
- package/dist/features/chrome-caps/defaults.js.map +1 -0
- package/dist/features/chrome-caps/index.js +7 -0
- package/dist/features/chrome-caps/resolve.js +23 -0
- package/dist/features/chrome-caps/resolve.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js +27 -0
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
- package/dist/features/cursor/paintedCursorLayer.js +60 -0
- package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
- package/dist/features/focus/gateLayer.js +14 -0
- package/dist/features/focus/gateLayer.js.map +1 -0
- package/dist/features/focus/useCanvasFocus.js +29 -0
- package/dist/features/focus/useCanvasFocus.js.map +1 -0
- package/dist/features/groups/children.js +23 -0
- package/dist/features/groups/children.js.map +1 -0
- package/dist/features/groups/composePose.js +67 -0
- package/dist/features/groups/composePose.js.map +1 -0
- package/dist/features/groups/nestedHit.js +40 -0
- package/dist/features/groups/nestedHit.js.map +1 -0
- package/dist/features/groups/unionOfChildren.js +15 -0
- package/dist/features/groups/unionOfChildren.js.map +1 -0
- package/dist/features/images/imageCache.js +94 -0
- package/dist/features/images/imageCache.js.map +1 -0
- package/dist/features/ingestion/contentHandlers.js +37 -0
- package/dist/features/ingestion/contentHandlers.js.map +1 -0
- package/dist/features/ingestion/imageHandler.js +45 -0
- package/dist/features/ingestion/imageHandler.js.map +1 -0
- package/dist/features/ingestion/index.js +8 -0
- package/dist/features/ingestion/openFilePicker.js +15 -0
- package/dist/features/ingestion/openFilePicker.js.map +1 -0
- package/dist/features/ingestion/registerKitHandlers.js +26 -0
- package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
- package/dist/features/ingestion/svgHandler.js +58 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +39 -0
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
- package/dist/features/longPress/longPressFeedback.js +96 -0
- package/dist/features/longPress/longPressFeedback.js.map +1 -0
- package/dist/features/meshPaint/bake.js +79 -0
- package/dist/features/meshPaint/bake.js.map +1 -0
- package/dist/features/meshPaint/bakeCache.js +59 -0
- package/dist/features/meshPaint/bakeCache.js.map +1 -0
- package/dist/features/meshPaint/handles.js +86 -0
- package/dist/features/meshPaint/handles.js.map +1 -0
- package/dist/features/meshPaint/lazyKind.js +1298 -0
- package/dist/features/meshPaint/lazyKind.js.map +1 -0
- package/dist/features/meshPaint/meshPaint.js +236 -0
- package/dist/features/meshPaint/meshPaint.js.map +1 -0
- package/dist/features/meshPaint/meshShader.js +6 -0
- package/dist/features/meshPaint/meshShader.js.map +1 -0
- package/dist/features/meshPaint/register.js +7 -0
- package/dist/features/meshPaint/register.js.map +1 -0
- package/dist/features/meshPaint/surface.js +110 -0
- package/dist/features/meshPaint/surface.js.map +1 -0
- package/dist/features/minimap/actions.js +53 -0
- package/dist/features/minimap/actions.js.map +1 -0
- package/dist/features/minimap/createMinimapContribution.js +96 -0
- package/dist/features/minimap/createMinimapContribution.js.map +1 -0
- package/dist/features/minimap/layers.js +103 -0
- package/dist/features/minimap/layers.js.map +1 -0
- package/dist/features/modes/modeLayers.js +113 -0
- package/dist/features/modes/modeLayers.js.map +1 -0
- package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
- package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
- package/dist/features/parallax/createParallaxLayer.js +26 -0
- package/dist/features/parallax/createParallaxLayer.js.map +1 -0
- package/dist/features/parallax/createParallaxPlane.js +26 -0
- package/dist/features/parallax/createParallaxPlane.js.map +1 -0
- package/dist/features/paths/anchorEdits.js +156 -0
- package/dist/features/paths/anchorEdits.js.map +1 -0
- package/dist/features/paths/anchors.js +154 -0
- package/dist/features/paths/anchors.js.map +1 -0
- package/dist/features/paths/booleans.js +2 -0
- package/dist/features/paths/index.js +15 -0
- package/dist/features/paths/markerCommands.js +116 -0
- package/dist/features/paths/markerCommands.js.map +1 -0
- package/dist/features/paths/markerSites.js +59 -0
- package/dist/features/paths/markerSites.js.map +1 -0
- package/dist/features/paths/markers.js +95 -0
- package/dist/features/paths/markers.js.map +1 -0
- package/dist/features/paths/nearestAnchor.js +36 -0
- package/dist/features/paths/nearestAnchor.js.map +1 -0
- package/dist/features/paths/originProjection.js +16 -0
- package/dist/features/paths/originProjection.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
- package/dist/features/paths/pathInWorld.js +41 -0
- package/dist/features/paths/pathInWorld.js.map +1 -0
- package/dist/features/paths/pathLayer.js +44 -0
- package/dist/features/paths/pathLayer.js.map +1 -0
- package/dist/features/paths/penPreviewLayer.js +220 -0
- package/dist/features/paths/penPreviewLayer.js.map +1 -0
- package/dist/features/paths/poseDescriptor.js +44 -0
- package/dist/features/paths/poseDescriptor.js.map +1 -0
- package/dist/features/paths/tessellate/stroke.js +230 -0
- package/dist/features/paths/tessellate/stroke.js.map +1 -0
- package/dist/features/patterns/index.js +23 -0
- package/dist/features/patterns/index.js.map +1 -0
- package/dist/features/patterns/patterns-builtin.js +38 -0
- package/dist/features/patterns/patterns-builtin.js.map +1 -0
- package/dist/features/patterns/resolveSpec.js +57 -0
- package/dist/features/patterns/resolveSpec.js.map +1 -0
- package/dist/features/patterns/tileGeometry.js +158 -0
- package/dist/features/patterns/tileGeometry.js.map +1 -0
- package/dist/features/pointer/PointerContext.js +45 -0
- package/dist/features/pointer/PointerContext.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +70 -0
- package/dist/features/poseRun/usePoseRun.js.map +1 -0
- package/dist/features/selection/SelectionContext.js +46 -0
- package/dist/features/selection/SelectionContext.js.map +1 -0
- package/dist/features/selection/overlay.js +442 -0
- package/dist/features/selection/overlay.js.map +1 -0
- package/dist/features/simulation/createSimulation.js +61 -0
- package/dist/features/simulation/createSimulation.js.map +1 -0
- package/dist/features/simulation/types.js +6 -0
- package/dist/features/simulation/types.js.map +1 -0
- package/dist/features/simulation/useSimulation.js +74 -0
- package/dist/features/simulation/useSimulation.js.map +1 -0
- package/dist/features/text/domRuns.js +258 -0
- package/dist/features/text/domRuns.js.map +1 -0
- package/dist/features/text/fitTextPose.js +38 -0
- package/dist/features/text/fitTextPose.js.map +1 -0
- package/dist/features/text/hitTest.js +45 -0
- package/dist/features/text/hitTest.js.map +1 -0
- package/dist/features/text/renderLabel.js +14 -0
- package/dist/features/text/renderLabel.js.map +1 -0
- package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
- package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
- package/dist/features/text/runs/flagRange.js +53 -0
- package/dist/features/text/runs/flagRange.js.map +1 -0
- package/dist/features/text/runs/rangeStyle.js +135 -0
- package/dist/features/text/runs/rangeStyle.js.map +1 -0
- package/dist/features/text/textCommand.js +59 -0
- package/dist/features/text/textCommand.js.map +1 -0
- package/dist/features/text/textLayer.js +35 -0
- package/dist/features/text/textLayer.js.map +1 -0
- package/dist/features/text/textToPath.js +181 -0
- package/dist/features/text/textToPath.js.map +1 -0
- package/dist/features/text/useSceneTextEdit.js +138 -0
- package/dist/features/text/useSceneTextEdit.js.map +1 -0
- package/dist/features/text/useTextEdit.js +465 -0
- package/dist/features/text/useTextEdit.js.map +1 -0
- package/dist/features/tiling/createTiledLayer.js +63 -0
- package/dist/features/tiling/createTiledLayer.js.map +1 -0
- package/dist/features/tiling/tiledProject.js +14 -0
- package/dist/features/tiling/tiledProject.js.map +1 -0
- package/dist/features/viewports/viewResolver.js +59 -0
- package/dist/features/viewports/viewResolver.js.map +1 -0
- package/dist/features/viewports/viewportLayer.js +58 -0
- package/dist/features/viewports/viewportLayer.js.map +1 -0
- package/dist/icons/ArrowIcon.js +23 -0
- package/dist/icons/ArrowIcon.js.map +1 -0
- package/dist/icons/EllipseIcon.js +21 -0
- package/dist/icons/EllipseIcon.js.map +1 -0
- package/dist/icons/EyedropperIcon.js +49 -0
- package/dist/icons/EyedropperIcon.js.map +1 -0
- package/dist/icons/HandIcon.js +59 -0
- package/dist/icons/HandIcon.js.map +1 -0
- package/dist/icons/ImageIcon.js +34 -0
- package/dist/icons/ImageIcon.js.map +1 -0
- package/dist/icons/LassoIcon.js +22 -0
- package/dist/icons/LassoIcon.js.map +1 -0
- package/dist/icons/LineIcon.js +22 -0
- package/dist/icons/LineIcon.js.map +1 -0
- package/dist/icons/PenIcon.js +36 -0
- package/dist/icons/PenIcon.js.map +1 -0
- package/dist/icons/PencilIcon.js +25 -0
- package/dist/icons/PencilIcon.js.map +1 -0
- package/dist/icons/PolygonIcon.js +19 -0
- package/dist/icons/PolygonIcon.js.map +1 -0
- package/dist/icons/RectIcon.js +37 -0
- package/dist/icons/RectIcon.js.map +1 -0
- package/dist/icons/SelectIcon.js +20 -0
- package/dist/icons/SelectIcon.js.map +1 -0
- package/dist/icons/StarIcon.js +19 -0
- package/dist/icons/StarIcon.js.map +1 -0
- package/dist/icons/TextIcon.js +19 -0
- package/dist/icons/TextIcon.js.map +1 -0
- package/dist/icons/UnknownIcon.js +33 -0
- package/dist/icons/UnknownIcon.js.map +1 -0
- package/dist/icons/_base.js +12 -0
- package/dist/icons/_base.js.map +1 -0
- package/dist/index.css +2 -86
- package/dist/index.d.ts +2349 -2609
- package/dist/index.js +312 -13
- package/dist/input/keyState.js +76 -0
- package/dist/input/keyState.js.map +1 -0
- package/dist/input/useKeyState.js +22 -0
- package/dist/input/useKeyState.js.map +1 -0
- package/dist/interactions/actions/actionShortcuts.js +32 -0
- package/dist/interactions/actions/actionShortcuts.js.map +1 -0
- package/dist/interactions/actions/align/align.js +81 -0
- package/dist/interactions/actions/align/align.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +120 -0
- package/dist/interactions/actions/booleans/booleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +20 -0
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
- package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
- package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
- package/dist/interactions/actions/defaults/align.js +71 -0
- package/dist/interactions/actions/defaults/align.js.map +1 -0
- package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
- package/dist/interactions/actions/defaults/areaSelect.js +75 -0
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/booleans.js +52 -0
- package/dist/interactions/actions/defaults/booleans.js.map +1 -0
- package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
- package/dist/interactions/actions/defaults/clearSelection.js +19 -0
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/clipboard.js +78 -0
- package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
- package/dist/interactions/actions/defaults/clone.js +96 -0
- package/dist/interactions/actions/defaults/clone.js.map +1 -0
- package/dist/interactions/actions/defaults/createOutlines.js +47 -0
- package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
- package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
- package/dist/interactions/actions/defaults/delete.js +61 -0
- package/dist/interactions/actions/defaults/delete.js.map +1 -0
- package/dist/interactions/actions/defaults/distribute.js +66 -0
- package/dist/interactions/actions/defaults/distribute.js.map +1 -0
- package/dist/interactions/actions/defaults/duplicate.js +83 -0
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
- package/dist/interactions/actions/defaults/editAnchors.js +100 -0
- package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/escape.js +26 -0
- package/dist/interactions/actions/defaults/escape.js.map +1 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/flip.js +119 -0
- package/dist/interactions/actions/defaults/flip.js.map +1 -0
- package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
- package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
- package/dist/interactions/actions/defaults/group.js +131 -0
- package/dist/interactions/actions/defaults/group.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/ingest.js +58 -0
- package/dist/interactions/actions/defaults/ingest.js.map +1 -0
- package/dist/interactions/actions/defaults/insert.js +288 -0
- package/dist/interactions/actions/defaults/insert.js.map +1 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
- package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
- package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/move.js +656 -0
- package/dist/interactions/actions/defaults/move.js.map +1 -0
- package/dist/interactions/actions/defaults/nudge.js +110 -0
- package/dist/interactions/actions/defaults/nudge.js.map +1 -0
- package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
- package/dist/interactions/actions/defaults/reorder.js +143 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -0
- package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/resize.js +332 -0
- package/dist/interactions/actions/defaults/resize.js.map +1 -0
- package/dist/interactions/actions/defaults/rotate.js +181 -0
- package/dist/interactions/actions/defaults/rotate.js.map +1 -0
- package/dist/interactions/actions/defaults/selectAll.js +27 -0
- package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
- package/dist/interactions/actions/defaults/setFill.js +27 -0
- package/dist/interactions/actions/defaults/setFill.js.map +1 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/setStroke.js +36 -0
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/slice.js +39 -0
- package/dist/interactions/actions/defaults/slice.js.map +1 -0
- package/dist/interactions/actions/defaults/sliceOps.js +60 -0
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
- package/dist/interactions/actions/defaults/toolActivate.js +35 -0
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
- package/dist/interactions/actions/defaults/undoRedo.js +51 -0
- package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +42 -0
- package/dist/interactions/actions/distribute/distribute.js.map +1 -0
- package/dist/interactions/actions/distribute/plan.js +29 -0
- package/dist/interactions/actions/distribute/plan.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/handles.js +43 -0
- package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +35 -0
- package/dist/interactions/actions/flip/helpers.js.map +1 -0
- package/dist/interactions/actions/geometryProjection.js +18 -0
- package/dist/interactions/actions/geometryProjection.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +44 -0
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +37 -0
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +84 -0
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
- package/dist/interactions/actions/planeInput.js +168 -0
- package/dist/interactions/actions/planeInput.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +9 -0
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
- package/dist/interactions/actions/poseFrame.js +38 -0
- package/dist/interactions/actions/poseFrame.js.map +1 -0
- package/dist/interactions/actions/previewOverrides.js +25 -0
- package/dist/interactions/actions/previewOverrides.js.map +1 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/index.js +8 -0
- package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
- package/dist/interactions/actions/resize/cornerHandles.js +72 -0
- package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js +60 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -0
- package/dist/interactions/actions/resolvePreviews.js +61 -0
- package/dist/interactions/actions/resolvePreviews.js.map +1 -0
- package/dist/interactions/actions/rotate/geometry.js +46 -0
- package/dist/interactions/actions/rotate/geometry.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +27 -0
- package/dist/interactions/actions/rotate/handle.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js +42 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +142 -0
- package/dist/interactions/actions/useStandardActions.js.map +1 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
- package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
- package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
- package/dist/interactions/gestures/shared/originProjection.js +42 -0
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
- package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
- package/dist/interactions/gestures/shared/snap.js +24 -0
- package/dist/interactions/gestures/shared/snap.js.map +1 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
- package/dist/layout/arrivals.js +36 -0
- package/dist/layout/arrivals.js.map +1 -0
- package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
- package/dist/math.d.ts +4 -5
- package/dist/math.js +6 -4
- package/dist/mesh.d.ts +268 -0
- package/dist/mesh.js +7 -0
- package/dist/move.d.ts +7 -48
- package/dist/move.js +3 -142
- package/dist/originProjection-BSn4xiEy.d.ts +57 -0
- package/dist/patterns-builtin.js +3 -3
- package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
- package/dist/registerProgram-ateHDGjw.d.ts +193 -0
- package/dist/renderer/DrawCommand.js +6 -0
- package/dist/renderer/DrawCommand.js.map +1 -0
- package/dist/renderer/WeaselRenderer.js +328 -0
- package/dist/renderer/WeaselRenderer.js.map +1 -0
- package/dist/renderer/cache/GLImageCache.js +64 -0
- package/dist/renderer/cache/GLImageCache.js.map +1 -0
- package/dist/renderer/cache/GLMeshCache.js +102 -0
- package/dist/renderer/cache/GLMeshCache.js.map +1 -0
- package/dist/renderer/cache/GLTextureCache.js +51 -0
- package/dist/renderer/cache/GLTextureCache.js.map +1 -0
- package/dist/renderer/cache/GradientRampAtlas.js +82 -0
- package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
- package/dist/renderer/cache/cache.js +13 -0
- package/dist/renderer/cache/cache.js.map +1 -0
- package/dist/renderer/cache/markerCommandCache.js +59 -0
- package/dist/renderer/cache/markerCommandCache.js.map +1 -0
- package/dist/renderer/cache/outlineMeshCache.js +15 -0
- package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
- package/dist/renderer/cache/strokeMeshCache.js +44 -0
- package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
- package/dist/renderer/cullDrawCommands.js +89 -0
- package/dist/renderer/cullDrawCommands.js.map +1 -0
- package/dist/renderer/draw.js +1109 -0
- package/dist/renderer/draw.js.map +1 -0
- package/dist/renderer/drawBatch.js +168 -0
- package/dist/renderer/drawBatch.js.map +1 -0
- package/dist/renderer/effects/EffectTargets.js +45 -0
- package/dist/renderer/effects/EffectTargets.js.map +1 -0
- package/dist/renderer/effects/builtins.js +31 -0
- package/dist/renderer/effects/builtins.js.map +1 -0
- package/dist/renderer/effects/composite.js +9 -0
- package/dist/renderer/effects/composite.js.map +1 -0
- package/dist/renderer/effects/effectPrelude.js +10 -0
- package/dist/renderer/effects/effectPrelude.js.map +1 -0
- package/dist/renderer/effects/types.js +10 -0
- package/dist/renderer/effects/types.js.map +1 -0
- package/dist/renderer/index.js +19 -0
- package/dist/renderer/math/color.js +341 -0
- package/dist/renderer/math/color.js.map +1 -0
- package/dist/renderer/math/mat3.js +71 -0
- package/dist/renderer/math/mat3.js.map +1 -0
- package/dist/renderer/math/patternSpace.js +22 -0
- package/dist/renderer/math/patternSpace.js.map +1 -0
- package/dist/renderer/math/viewToMat3.js +19 -0
- package/dist/renderer/math/viewToMat3.js.map +1 -0
- package/dist/renderer/paintResources.js +18 -0
- package/dist/renderer/paintResources.js.map +1 -0
- package/dist/renderer/paintScratch.js +37 -0
- package/dist/renderer/paintScratch.js.map +1 -0
- package/dist/renderer/shaders/ShaderProgram.js +74 -0
- package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
- package/dist/renderer/shaders/batchFill.js +118 -0
- package/dist/renderer/shaders/batchFill.js.map +1 -0
- package/dist/renderer/shaders/customPrelude.js +34 -0
- package/dist/renderer/shaders/customPrelude.js.map +1 -0
- package/dist/renderer/shaders/extractUniformNames.js +184 -0
- package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
- package/dist/renderer/shaders/glyphPaint.js +61 -0
- package/dist/renderer/shaders/glyphPaint.js.map +1 -0
- package/dist/renderer/shaders/gradFill.js +30 -0
- package/dist/renderer/shaders/gradFill.js.map +1 -0
- package/dist/renderer/shaders/imageFill.js +14 -0
- package/dist/renderer/shaders/imageFill.js.map +1 -0
- package/dist/renderer/shaders/pathFill.js +13 -0
- package/dist/renderer/shaders/pathFill.js.map +1 -0
- package/dist/renderer/shaders/patternFill.js +24 -0
- package/dist/renderer/shaders/patternFill.js.map +1 -0
- package/dist/renderer/shaders/registerProgram.js +18 -0
- package/dist/renderer/shaders/registerProgram.js.map +1 -0
- package/dist/renderer/spriteSheet.js +14 -0
- package/dist/renderer/spriteSheet.js.map +1 -0
- package/dist/renderer/state/GroupState.js +77 -0
- package/dist/renderer/state/GroupState.js.map +1 -0
- package/dist/renderer/syntheticItalic.js +6 -0
- package/dist/renderer/syntheticItalic.js.map +1 -0
- package/dist/renderer/textures/registerTexture.js +14 -0
- package/dist/renderer/textures/registerTexture.js.map +1 -0
- package/dist/renderer.d.ts +18 -20
- package/dist/renderer.js +18 -13
- package/dist/resize.d.ts +10 -46
- package/dist/resize.js +7 -5
- package/dist/routing.d.ts +1 -1
- package/dist/routing.js +2 -3
- package/dist/scheduling/useVisibleRaf.js +69 -0
- package/dist/scheduling/useVisibleRaf.js.map +1 -0
- package/dist/test-hook/createTestHook.js +39 -0
- package/dist/test-hook/createTestHook.js.map +1 -0
- package/dist/test-hook/install.js +12 -0
- package/dist/test-hook/install.js.map +1 -0
- package/dist/test-seams-fYf6m5pu.d.ts +356 -0
- package/dist/test-seams.d.ts +6 -0
- package/dist/test-seams.js +3 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
- package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
- package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
- package/dist/tools/builtin/hand/useHandTool.js +31 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
- package/dist/tools/builtin/image/useImageTool.js +41 -0
- package/dist/tools/builtin/image/useImageTool.js.map +1 -0
- package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
- package/dist/tools/builtin/line/useLineTool.js +33 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -0
- package/dist/tools/builtin/pen/usePenTool.js +414 -0
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
- package/dist/tools/builtin/pickTopMostHit.js +45 -0
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
- package/dist/tools/builtin/rect/useRectTool.js +32 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +109 -0
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
- package/dist/tools/builtin/select/useSelectTool.js +162 -0
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
- package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
- package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +263 -0
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
- package/dist/tools/builtin/star/useStarTool.js +82 -0
- package/dist/tools/builtin/star/useStarTool.js.map +1 -0
- package/dist/tools/builtin/text/useTextTool.js +177 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -0
- package/dist/tools/overlayBinding.js +8 -0
- package/dist/tools/overlayBinding.js.map +1 -0
- package/dist/tools/prefs.js +47 -0
- package/dist/tools/prefs.js.map +1 -0
- package/dist/tools/useKeybindings.js +66 -0
- package/dist/tools/useKeybindings.js.map +1 -0
- package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
- package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
- package/dist/util/color.js +26 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/constrainTo45.js +17 -0
- package/dist/util/constrainTo45.js.map +1 -0
- package/dist/util/paint.js +72 -0
- package/dist/util/paint.js.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +31 -18
- package/dist/chunk-44EWMJV2.js +0 -128
- package/dist/chunk-44EWMJV2.js.map +0 -1
- package/dist/chunk-4RJP2N2L.js +0 -143
- package/dist/chunk-4RJP2N2L.js.map +0 -1
- package/dist/chunk-BJN5ZRIJ.js +0 -167
- package/dist/chunk-BJN5ZRIJ.js.map +0 -1
- package/dist/chunk-D4AAWR64.js +0 -28
- package/dist/chunk-D4AAWR64.js.map +0 -1
- package/dist/chunk-DOBSZOPR.js +0 -29
- package/dist/chunk-DOBSZOPR.js.map +0 -1
- package/dist/chunk-H6N2JSZ3.js +0 -248
- package/dist/chunk-H6N2JSZ3.js.map +0 -1
- package/dist/chunk-HPFJUUTF.js +0 -167
- package/dist/chunk-HPFJUUTF.js.map +0 -1
- package/dist/chunk-L5YNZYEG.js +0 -648
- package/dist/chunk-L5YNZYEG.js.map +0 -1
- package/dist/chunk-MZAIDI6D.js +0 -32492
- package/dist/chunk-MZAIDI6D.js.map +0 -1
- package/dist/chunk-PNNZSYRD.js +0 -318
- package/dist/chunk-PNNZSYRD.js.map +0 -1
- package/dist/chunk-RMR4QMM6.js +0 -250
- package/dist/chunk-RMR4QMM6.js.map +0 -1
- package/dist/clipboard.js.map +0 -1
- package/dist/clone.js.map +0 -1
- package/dist/grid-BXdz8GF2.d.ts +0 -158
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/insert.d.ts +0 -37
- package/dist/insert.js +0 -81
- package/dist/insert.js.map +0 -1
- package/dist/math.js.map +0 -1
- package/dist/move.js.map +0 -1
- package/dist/options-CzjxFoYZ.d.ts +0 -67
- package/dist/path-JEV2c5If.d.ts +0 -48
- package/dist/patterns-builtin.js.map +0 -1
- package/dist/renderer.css +0 -86
- package/dist/renderer.css.map +0 -1
- package/dist/renderer.js.map +0 -1
- package/dist/resize.js.map +0 -1
- package/dist/routing.js.map +0 -1
- package/dist/types-D2tTKEU0.d.ts +0 -18
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { springPose as e, tweenPose as t } from "./poseHelpers.js";
|
|
2
|
+
import { sampleTrack as n } from "./timeline/sampleTrack.js";
|
|
3
|
+
import { ColorOverrideRegistry as r } from "./colorRegistry.js";
|
|
4
|
+
import { useAnimator as i } from "./useAnimator.js";
|
|
5
|
+
import { animateOnSetPose as a } from "./wrappers/animateOnSetPose.js";
|
|
6
|
+
import { animateLifecycle as o } from "./wrappers/animateLifecycle.js";
|
|
7
|
+
import { createReflowTransition as s, useAnimatedReflow as c } from "./reflow.js";
|
|
8
|
+
import { momentum as l } from "./behaviors/momentum.js";
|
|
9
|
+
import { createSlew as u, slewToward as d } from "./slew.js";
|
|
10
|
+
import { cycleVertexColors as f, rainbowVertexColors as p, solidVertexColors as m, springVertexColors as h, staggerVertexColors as g, tweenVertexColors as _ } from "./colorHelpers.js";
|
|
11
|
+
import { IDENTITY_JOINT as v } from "./rig/types.js";
|
|
12
|
+
import { blendPoses as y } from "./rig/blendPoses.js";
|
|
13
|
+
import { mirrorPose as b } from "./rig/mirrorPose.js";
|
|
14
|
+
import { resolveSkeleton as x } from "./rig/resolveSkeleton.js";
|
|
15
|
+
import { bindRig as S, rigidRigApply as C } from "./rig/bindRig.js";
|
|
16
|
+
import { solveIk as w } from "./rig/solveIk.js";
|
|
17
|
+
import { useRig as T } from "./rig/useRig.js";
|
|
18
|
+
import { hexToOklchDeg as E, hslToSrgb as D, interpolateSrgb as O, lerpColorArray as k, lerpOklab as A, lerpOklch as j, linearSrgbToOklab as M, linearToSrgb as N, oklabToLinearSrgb as P, oklabToOklch as F, oklabToSrgbU8 as I, oklchDegToHex as L, oklchToOklab as R, srgbFloatToOklab as z, srgbToHsl as B, srgbToLinear as V, srgbU8ToOklab as H } from "@weasel-js/paint";
|
|
19
|
+
import { EASINGS as U, SPRING_PRESETS as W, cubicBezierEasing as G, easeIn as K, easeInBack as q, easeInBounce as J, easeInCirc as Y, easeInCubic as X, easeInElastic as Z, easeInExpo as Q, easeInOut as $, easeInOutBack as ee, easeInOutBounce as te, easeInOutCirc as ne, easeInOutCubic as re, easeInOutElastic as ie, easeInOutExpo as ae, easeInOutQuad as oe, easeInOutQuart as se, easeInOutQuint as ce, easeInOutSine as le, easeInQuad as ue, easeInQuart as de, easeInQuint as fe, easeInSine as pe, easeOut as me, easeOutBack as he, easeOutBounce as ge, easeOutCirc as _e, easeOutCubic as ve, easeOutElastic as ye, easeOutExpo as be, easeOutQuad as xe, easeOutQuart as Se, easeOutQuint as Ce, easeOutSine as we, linear as Te, resolveEasing as Ee } from "@weasel-js/geom";
|
|
20
|
+
export { r as ColorOverrideRegistry, U as EASINGS, v as IDENTITY_JOINT, W as SPRING_PRESETS, o as animateLifecycle, a as animateOnSetPose, S as bindRig, y as blendPoses, s as createReflowTransition, u as createSlew, G as cubicBezierEasing, f as cycleVertexColors, K as easeIn, q as easeInBack, J as easeInBounce, Y as easeInCirc, X as easeInCubic, Z as easeInElastic, Q as easeInExpo, $ as easeInOut, ee as easeInOutBack, te as easeInOutBounce, ne as easeInOutCirc, re as easeInOutCubic, ie as easeInOutElastic, ae as easeInOutExpo, oe as easeInOutQuad, se as easeInOutQuart, ce as easeInOutQuint, le as easeInOutSine, ue as easeInQuad, de as easeInQuart, fe as easeInQuint, pe as easeInSine, me as easeOut, he as easeOutBack, ge as easeOutBounce, _e as easeOutCirc, ve as easeOutCubic, ye as easeOutElastic, be as easeOutExpo, xe as easeOutQuad, Se as easeOutQuart, Ce as easeOutQuint, we as easeOutSine, E as hexToOklchDeg, D as hslToSrgb, O as interpolateSrgb, k as lerpColorArray, A as lerpOklab, j as lerpOklch, Te as linear, M as linearSrgbToOklab, N as linearToSrgb, b as mirrorPose, l as momentum, P as oklabToLinearSrgb, F as oklabToOklch, I as oklabToSrgbU8, L as oklchDegToHex, R as oklchToOklab, p as rainbowVertexColors, Ee as resolveEasing, x as resolveSkeleton, C as rigidRigApply, n as sampleTrack, d as slewToward, m as solidVertexColors, w as solveIk, e as springPose, h as springVertexColors, z as srgbFloatToOklab, B as srgbToHsl, V as srgbToLinear, H as srgbU8ToOklab, g as staggerVertexColors, t as tweenPose, _ as tweenVertexColors, c as useAnimatedReflow, i as useAnimator, T as useRig };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
//#region src/animation/loop.ts
|
|
2
|
+
function e(e, t, n = {}) {
|
|
3
|
+
let r = n.count ?? Infinity, i = 0, a = !1, o = null, s = e({
|
|
4
|
+
kind: "loop",
|
|
5
|
+
cancelKey: n.cancelKey,
|
|
6
|
+
label: n.label
|
|
7
|
+
});
|
|
8
|
+
s.setOnCancel(() => {
|
|
9
|
+
a = !0, o?.cancel(), o = null;
|
|
10
|
+
});
|
|
11
|
+
let c = () => {
|
|
12
|
+
if (!a) {
|
|
13
|
+
if (i >= r) {
|
|
14
|
+
o = null, a = !0, s.finish(), n.onDone?.();
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
o = t(i++, c);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
return c(), {
|
|
21
|
+
id: s.id,
|
|
22
|
+
cancel: () => s.cancel(),
|
|
23
|
+
pause: () => {
|
|
24
|
+
s.pause(), o?.pause();
|
|
25
|
+
},
|
|
26
|
+
resume: () => {
|
|
27
|
+
s.resume(), o?.resume();
|
|
28
|
+
},
|
|
29
|
+
setTimeScale: (e) => {
|
|
30
|
+
s.setTimeScale(e), o?.setTimeScale(e);
|
|
31
|
+
},
|
|
32
|
+
timeScale: () => s.timeScale(),
|
|
33
|
+
isPaused: () => s.isPaused()
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function t(t, n, r) {
|
|
37
|
+
let i = r.direction ?? "restart";
|
|
38
|
+
return e((e) => n({
|
|
39
|
+
...e,
|
|
40
|
+
kind: "tweenLoop"
|
|
41
|
+
}), (e, n) => {
|
|
42
|
+
let a = i === "reverse" || i === "alternate" && e % 2 == 1, o = a ? r.to : r.from, s = a ? r.from : r.to;
|
|
43
|
+
return t.tween({
|
|
44
|
+
from: o,
|
|
45
|
+
to: s,
|
|
46
|
+
ms: r.ms,
|
|
47
|
+
easing: r.easing,
|
|
48
|
+
interpolate: r.interpolate,
|
|
49
|
+
onTick: r.onTick,
|
|
50
|
+
onDone: n
|
|
51
|
+
});
|
|
52
|
+
}, {
|
|
53
|
+
count: r.count,
|
|
54
|
+
onDone: r.onDone,
|
|
55
|
+
cancelKey: r.cancelKey,
|
|
56
|
+
label: r.label
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { e as createLoop, t as createTweenLoop };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","names":["createLoop","max","opts","iteration","cancelled","current","supervisor","createSupervisor","next","factory","s","createTweenLoop","direction","o","flipped","i","from","to","animator"],"sources":["../../src/animation/loop.ts"],"sourcesContent":["import type { SupervisorFactory } from './supervisor';\nimport type {\n AnimationHandle,\n Animator,\n LoopFactory,\n LoopOptions,\n TweenLoopOptions,\n} from './types';\n\n/**\n * Loop primitive. Repeatedly invokes `factory(i, next)` to produce a child\n * animation. The factory is responsible for wiring its returned handle's\n * `onDone` to call `next` — that's how the loop advances. Pause/resume/\n * setTimeScale delegate to the current child; cancel stops the in-flight\n * child and prevents future iterations.\n *\n * The loop is registered with the animator under a supervisor entry, so\n * `animator.cancel(handle)`, `animator.cancelKey(key)`, and\n * `animator.isActive(key)` all work for it.\n */\nexport function createLoop(\n createSupervisor: SupervisorFactory,\n factory: LoopFactory,\n opts: LoopOptions = {},\n): AnimationHandle {\n const max = opts.count ?? Infinity;\n let iteration = 0;\n let cancelled = false;\n let current: AnimationHandle | null = null;\n\n const supervisor = createSupervisor({ kind: 'loop', cancelKey: opts.cancelKey, label: opts.label });\n supervisor.setOnCancel(() => {\n // External cancel path (animator.cancel/cancelKey or handle.cancel).\n // Mark cancelled so `next` short-circuits; tear down the current child.\n cancelled = true;\n current?.cancel();\n current = null;\n });\n\n const next = (): void => {\n if (cancelled) return;\n if (iteration >= max) {\n current = null;\n // Natural completion: deregister the supervisor so isActive() goes\n // false. `cancelled` makes a late `next` a no-op.\n cancelled = true;\n supervisor.finish();\n opts.onDone?.();\n return;\n }\n const i = iteration++;\n current = factory(i, next);\n };\n\n next();\n\n return {\n id: supervisor.id,\n cancel: () => supervisor.cancel(),\n pause: () => {\n supervisor.pause();\n current?.pause();\n },\n resume: () => {\n supervisor.resume();\n current?.resume();\n },\n setTimeScale: (s) => {\n supervisor.setTimeScale(s);\n current?.setTimeScale(s);\n },\n timeScale: () => supervisor.timeScale(),\n isPaused: () => supervisor.isPaused(),\n };\n}\n\n/**\n * Sugar over `createLoop` for the common case of looping a tween between two\n * values. `direction` controls per-iteration from/to:\n * - `restart` (default): from→to every iteration\n * - `reverse`: to→from every iteration\n * - `alternate`: even iterations from→to, odd iterations to→from\n */\nexport function createTweenLoop<T>(\n animator: Animator,\n createSupervisor: SupervisorFactory,\n opts: TweenLoopOptions<T>,\n): AnimationHandle {\n const direction = opts.direction ?? 'restart';\n return createLoop(\n (o) => createSupervisor({ ...o, kind: 'tweenLoop' }),\n (i, next) => {\n const flipped = direction === 'reverse' || (direction === 'alternate' && i % 2 === 1);\n const from = flipped ? opts.to : opts.from;\n const to = flipped ? opts.from : opts.to;\n return animator.tween({\n from,\n to,\n ms: opts.ms,\n easing: opts.easing,\n interpolate: opts.interpolate,\n onTick: opts.onTick,\n onDone: next,\n });\n },\n { count: opts.count, onDone: opts.onDone, cancelKey: opts.cancelKey, label: opts.label },\n );\n}\n"],"mappings":";AAoBA,SAAgBA,EACd,GACA,GACA,IAAoB,CAAC,GACJ;CACjB,IAAMC,IAAMC,EAAK,SAAS,UACtBC,IAAY,GACZC,IAAY,IACZC,IAAkC,MAEhCC,IAAaC,EAAiB;EAAE,MAAM;EAAQ,WAAWL,EAAK;EAAW,OAAOA,EAAK;CAAM,CAAC;CAClG,EAAW,kBAAkB;EAK3B,AAFA,IAAY,IACZG,GAAS,OAAO,GAChB,IAAU;CACZ,CAAC;CAED,IAAMG,UAAmB;EACvB,IAAI,IACJ;OAAIL,KAAaF,GAAK;IAMpB,AALA,IAAU,MAGV,IAAY,IACZK,EAAW,OAAO,GAClBJ,EAAK,SAAS;IACd;GACF;GAEA,IAAUO,EAAQ,KAAGD,CAAI;EAFzB;CAGF;CAIA,OAFAA,EAAK,GAEE;EACL,IAAIF,EAAW;EACf,cAAcA,EAAW,OAAO;EAChC,aAAa;GAEX,AADAA,EAAW,MAAM,GACjBD,GAAS,MAAM;EACjB;EACA,cAAc;GAEZ,AADAC,EAAW,OAAO,GAClBD,GAAS,OAAO;EAClB;EACA,eAAe,MAAM;GAEnB,AADAC,EAAW,aAAaI,CAAC,GACzBL,GAAS,aAAaK,CAAC;EACzB;EACA,iBAAiBJ,EAAW,UAAU;EACtC,gBAAgBA,EAAW,SAAS;CACtC;AACF;AASA,SAAgBK,EACd,GACA,GACA,GACiB;CACjB,IAAMC,IAAYV,EAAK,aAAa;CACpC,OAAOF,GACJ,MAAMO,EAAiB;EAAE,GAAGM;EAAG,MAAM;CAAY,CAAC,IAClD,GAAG,MAAS;EACX,IAAMC,IAAUF,MAAc,aAAcA,MAAc,eAAeG,IAAI,KAAM,GAC7EC,IAAOF,IAAUZ,EAAK,KAAKA,EAAK,MAChCe,IAAKH,IAAUZ,EAAK,OAAOA,EAAK;EACtC,OAAOgB,EAAS,MAAM;GACpB;GACA;GACA,IAAIhB,EAAK;GACT,QAAQA,EAAK;GACb,aAAaA,EAAK;GAClB,QAAQA,EAAK;GACb,QAAQM;EACV,CAAC;CACH,GACA;EAAE,OAAON,EAAK;EAAO,QAAQA,EAAK;EAAQ,WAAWA,EAAK;EAAW,OAAOA,EAAK;CAAM,CACzF;AACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/animation/observe.ts
|
|
2
|
+
var e = class {
|
|
3
|
+
listeners = /* @__PURE__ */ new Set();
|
|
4
|
+
get watched() {
|
|
5
|
+
return this.listeners.size > 0;
|
|
6
|
+
}
|
|
7
|
+
add(e) {
|
|
8
|
+
return this.listeners.add(e), () => {
|
|
9
|
+
this.listeners.delete(e);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
emit(e) {
|
|
13
|
+
for (let t of this.listeners) try {
|
|
14
|
+
t(e);
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.error("useAnimator: watch listener threw", e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { e as AnimatorEventHub };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=observe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observe.js","names":["AnimatorEventHub","listener","event","err"],"sources":["../../src/animation/observe.ts"],"sourcesContent":["import type { AnimatorEvent, AnimatorListener } from './types';\n\n/** The listener set behind `animator.watch`. Every emit site checks `watched`\n * first and builds its event only then, so an unwatched animator allocates\n * nothing for observability. */\nexport class AnimatorEventHub {\n private readonly listeners = new Set<AnimatorListener>();\n\n get watched(): boolean {\n return this.listeners.size > 0;\n }\n\n add(listener: AnimatorListener): () => void {\n this.listeners.add(listener);\n return () => { this.listeners.delete(listener); };\n }\n\n emit(event: AnimatorEvent): void {\n for (const listener of this.listeners) {\n try { listener(event); } catch (err) { console.error('useAnimator: watch listener threw', err); }\n }\n }\n}\n"],"mappings":";AAKA,IAAaA,IAAb,MAA8B;CAC5B,4BAA6B,IAAI,IAAsB;CAEvD,IAAI,UAAmB;EACrB,OAAO,KAAK,UAAU,OAAO;CAC/B;CAEA,IAAI,GAAwC;EAE1C,OADA,KAAK,UAAU,IAAIC,CAAQ,SACd;GAAE,KAAK,UAAU,OAAOA,CAAQ;EAAG;CAClD;CAEA,KAAK,GAA4B;EAC/B,KAAK,IAAMA,KAAY,KAAK,WAC1B,IAAI;GAAE,EAASC,CAAK;EAAG,SAASC,GAAK;GAAE,QAAQ,MAAM,qCAAqCA,CAAG;EAAG;CAEpG;AACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createTransformOp as e } from "../core/ops/transform.js";
|
|
2
|
+
import { RECT_POSE_DESCRIPTOR as t } from "../core/geometry/poseDescriptor.js";
|
|
3
|
+
//#region src/animation/poseHelpers.ts
|
|
4
|
+
var n = (e) => `pose:${e}`;
|
|
5
|
+
function r(t, n, r, i, a) {
|
|
6
|
+
if (!t.applyOps) return;
|
|
7
|
+
let o = e({
|
|
8
|
+
id: n,
|
|
9
|
+
from: r,
|
|
10
|
+
to: i,
|
|
11
|
+
label: a
|
|
12
|
+
});
|
|
13
|
+
t.applyOps([o], a);
|
|
14
|
+
}
|
|
15
|
+
function i(e, i, a) {
|
|
16
|
+
let o = a.geometry ?? t;
|
|
17
|
+
if (!o.lerp) throw Error("tweenPose: geometry has no lerp; supply geometry: { ..., lerp }");
|
|
18
|
+
let s = o.lerp, c = i.getPose(a.id), l = a.recordOp ?? !0, u = a.opLabel ?? "animate";
|
|
19
|
+
return l && r(i, a.id, c, a.to, u), e.tween({
|
|
20
|
+
from: c,
|
|
21
|
+
to: a.to,
|
|
22
|
+
ms: a.ms,
|
|
23
|
+
easing: a.easing,
|
|
24
|
+
cancelKey: n(a.id),
|
|
25
|
+
interpolate: (e, t, n) => s(e, t, n),
|
|
26
|
+
onTick: (e) => i.setPose(a.id, e),
|
|
27
|
+
onDone: a.onDone
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function a(e, i, a) {
|
|
31
|
+
let o = a.geometry ?? t;
|
|
32
|
+
if (!o.lerp) throw Error("springPose: geometry has no lerp; supply geometry: { ..., lerp }");
|
|
33
|
+
let s = o.lerp, c = i.getPose(a.id), l = a.recordOp ?? !0, u = a.opLabel ?? "animate";
|
|
34
|
+
return l && r(i, a.id, c, a.to, u), e.spring({
|
|
35
|
+
from: 0,
|
|
36
|
+
to: 1,
|
|
37
|
+
preset: a.preset,
|
|
38
|
+
stiffness: a.stiffness,
|
|
39
|
+
damping: a.damping,
|
|
40
|
+
mass: a.mass,
|
|
41
|
+
cancelKey: n(a.id),
|
|
42
|
+
interpolate: (e, t, n) => e + (t - e) * n,
|
|
43
|
+
onTick: (e) => i.setPose(a.id, s(c, a.to, e)),
|
|
44
|
+
onDone: a.onDone
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { a as springPose, i as tweenPose };
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=poseHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poseHelpers.js","names":["cancelKeyFor","id","recordTransformOp","adapter","op","createTransformOp","label","tweenPose","geometry","opts","RECT_POSE_DESCRIPTOR","lerp","from","recordOp","animator","a","b","t","value","springPose","progress"],"sources":["../../src/animation/poseHelpers.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { SceneAdapter } from 'core/adapters/types';\nimport type { AnimationHandle, Animator, EasingSpec, SpringPresetName } from './types';\n\n/** Options for `tweenPose`. */\nexport interface TweenPoseOptions<TPose> {\n id: string;\n to: TPose;\n ms: number;\n easing?: EasingSpec;\n /** Pose descriptor with a `lerp(from, to, t)` method. Defaults to\n * `RECT_POSE_DESCRIPTOR`, which interpolates x/y/width/height linearly. */\n geometry?: PoseDescriptor<TPose>;\n /** When true (default), emit a transform op before the tween so undo\n * restores the pre-animation pose. */\n recordOp?: boolean;\n /** Label for the recorded op. Default: `'animate'`. */\n opLabel?: string;\n onDone?: () => void;\n}\n\n/** Options for `springPose`. */\nexport interface SpringPoseOptions<TPose> {\n id: string;\n to: TPose;\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n geometry?: PoseDescriptor<TPose>;\n recordOp?: boolean;\n opLabel?: string;\n onDone?: () => void;\n}\n\nconst cancelKeyFor = (id: string): string => `pose:${id}`;\n\nfunction recordTransformOp<TPose>(\n adapter: SceneAdapter<{ id: string }, TPose>,\n id: string,\n from: TPose,\n to: TPose,\n label: string,\n): void {\n if (!adapter.applyOps) return;\n const op = createTransformOp<TPose>({ id, from, to, label });\n adapter.applyOps([op], label);\n}\n\n/**\n * Animate one node's pose to `to` over `ms`, writing each frame through the\n * adapter.\n *\n * Unlike the color helpers this really does move the node. Undo therefore has\n * to be considered: by default a single transform op covering the whole\n * animation is recorded up front, so one undo returns the node to where it\n * started rather than replaying frames.\n */\nexport function tweenPose<TNode extends { id: string }, TPose>(\n animator: Animator,\n adapter: SceneAdapter<TNode, TPose>,\n opts: TweenPoseOptions<TPose>,\n): AnimationHandle {\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('tweenPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n if (recordOp) recordTransformOp(adapter as never, opts.id, from, opts.to, label);\n return animator.tween<TPose>({\n from,\n to: opts.to,\n ms: opts.ms,\n easing: opts.easing,\n cancelKey: cancelKeyFor(opts.id),\n interpolate: (a, b, t) => lerp(a, b, t),\n onTick: (value) => adapter.setPose(opts.id, value),\n onDone: opts.onDone,\n });\n}\n\n/** `tweenPose` driven by a spring instead of a duration. Same op-recording\n * behavior. */\nexport function springPose<TNode extends { id: string }, TPose>(\n animator: Animator,\n adapter: SceneAdapter<TNode, TPose>,\n opts: SpringPoseOptions<TPose>,\n): AnimationHandle {\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('springPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n if (recordOp) recordTransformOp(adapter as never, opts.id, from, opts.to, label);\n // For pose springs: integrate progress (0..1) as the spring's value, then\n // use lerp(from, to, progress) for the actual visual write. This avoids\n // requiring full add/subtract/scale/magnitude on TPose.\n const progressLerp = (a: number, b: number, t: number) => a + (b - a) * t;\n return animator.spring<number>({\n from: 0,\n to: 1,\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n cancelKey: cancelKeyFor(opts.id),\n interpolate: progressLerp,\n onTick: (progress) => adapter.setPose(opts.id, lerp(from, opts.to, progress)),\n onDone: opts.onDone,\n });\n}\n"],"mappings":";;;AAoCA,IAAMA,KAAgB,MAAuB,QAAQC;AAErD,SAASC,EACP,GACA,GACA,GACA,GACA,GACM;CACN,IAAI,CAACC,EAAQ,UAAU;CACvB,IAAMC,IAAKC,EAAyB;EAAE;EAAI;EAAM;EAAI;CAAM,CAAC;CAC3D,EAAQ,SAAS,CAACD,CAAE,GAAGE,CAAK;AAC9B;AAWA,SAAgBC,EACd,GACA,GACA,GACiB;CACjB,IAAMC,IAAYC,EAAK,YAAaC;CACpC,IAAI,CAACF,EAAS,MACZ,MAAU,MAAM,iEAAiE;CAEnF,IAAMG,IAAOH,EAAS,MAChBI,IAAOT,EAAQ,QAAQM,EAAK,EAAE,GAC9BI,IAAWJ,EAAK,YAAY,IAC5BH,IAAQG,EAAK,WAAW;CAE9B,OADII,KAAUX,EAAkBC,GAAkBM,EAAK,IAAIG,GAAMH,EAAK,IAAIH,CAAK,GACxEQ,EAAS,MAAa;EAC3B;EACA,IAAIL,EAAK;EACT,IAAIA,EAAK;EACT,QAAQA,EAAK;EACb,WAAWT,EAAaS,EAAK,EAAE;EAC/B,cAAc,GAAG,GAAG,MAAME,EAAKI,GAAGC,GAAGC,CAAC;EACtC,SAAS,MAAUd,EAAQ,QAAQM,EAAK,IAAIS,CAAK;EACjD,QAAQT,EAAK;CACf,CAAC;AACH;AAIA,SAAgBU,EACd,GACA,GACA,GACiB;CACjB,IAAMX,IAAYC,EAAK,YAAaC;CACpC,IAAI,CAACF,EAAS,MACZ,MAAU,MAAM,kEAAkE;CAEpF,IAAMG,IAAOH,EAAS,MAChBI,IAAOT,EAAQ,QAAQM,EAAK,EAAE,GAC9BI,IAAWJ,EAAK,YAAY,IAC5BH,IAAQG,EAAK,WAAW;CAM9B,OALII,KAAUX,EAAkBC,GAAkBM,EAAK,IAAIG,GAAMH,EAAK,IAAIH,CAAK,GAKxEQ,EAAS,OAAe;EAC7B,MAAM;EACN,IAAI;EACJ,QAAQL,EAAK;EACb,WAAWA,EAAK;EAChB,SAASA,EAAK;EACd,MAAMA,EAAK;EACX,WAAWT,EAAaS,EAAK,EAAE;EAC/B,cAToB,GAAW,GAAW,MAAcM,KAAKC,IAAID,KAAKE;EAUtE,SAAS,MAAad,EAAQ,QAAQM,EAAK,IAAIE,EAAKC,GAAMH,EAAK,IAAIW,CAAQ,CAAC;EAC5E,QAAQX,EAAK;CACf,CAAC;AACH"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { documentPose as e, effectivePose as t } from "../core/scene/effectivePose.js";
|
|
2
|
+
import { RECT_POSE_DESCRIPTOR as n } from "../core/geometry/poseDescriptor.js";
|
|
3
|
+
import { useEffect as r, useMemo as i } from "react";
|
|
4
|
+
import { useLatest as a } from "@weasel-js/react";
|
|
5
|
+
//#region src/animation/reflow.ts
|
|
6
|
+
var o = (e) => `reflow:${e}`;
|
|
7
|
+
function s(e, t) {
|
|
8
|
+
if (Object.is(e, t)) return !0;
|
|
9
|
+
if (typeof e != "object" || typeof t != "object" || e === null || t === null || Array.isArray(e) !== Array.isArray(t)) return !1;
|
|
10
|
+
let n = Object.keys(e);
|
|
11
|
+
if (n.length !== Object.keys(t).length) return !1;
|
|
12
|
+
for (let r of n) if (!s(e[r], t[r])) return !1;
|
|
13
|
+
return !0;
|
|
14
|
+
}
|
|
15
|
+
function c(r, i, a) {
|
|
16
|
+
let c = /* @__PURE__ */ new Map(), l = !1, u = null, d = () => {
|
|
17
|
+
u ||= i.onTick(() => {
|
|
18
|
+
l && (l = !1, r.overrides.commit());
|
|
19
|
+
});
|
|
20
|
+
}, f = () => {
|
|
21
|
+
c.size > 0 || !u || (u(), u = null);
|
|
22
|
+
}, p = (e, t) => {
|
|
23
|
+
c.get(e) === t && c.delete(e);
|
|
24
|
+
let n = e;
|
|
25
|
+
r.overrides.get(n) === t.entry && r.overrides.clear(n), l = !0;
|
|
26
|
+
}, m = (e, t, c, u) => {
|
|
27
|
+
let m = t.entry.pose;
|
|
28
|
+
if (t.target = c, t.settling = u, s(m, c)) {
|
|
29
|
+
t.handle?.cancel(), t.handle = null, t.entry.pose = c, u && p(e, t), r.overrides.commit(), f();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let h = a(), g = (h.geometry ?? n).lerp;
|
|
33
|
+
if (!g) throw Error("useAnimatedReflow: geometry has no lerp; supply geometry: { ..., lerp }");
|
|
34
|
+
let _ = (e) => {
|
|
35
|
+
t.entry.pose = g(m, c, e), l = !0;
|
|
36
|
+
}, v = () => {
|
|
37
|
+
t.handle = null, t.settling && (p(e, t), f());
|
|
38
|
+
}, y = o(e), b = h.label ?? "reflow";
|
|
39
|
+
d(), t.handle = h.spring ? i.spring({
|
|
40
|
+
from: 0,
|
|
41
|
+
to: 1,
|
|
42
|
+
...h.spring,
|
|
43
|
+
cancelKey: y,
|
|
44
|
+
label: b,
|
|
45
|
+
onTick: _,
|
|
46
|
+
onDone: v
|
|
47
|
+
}) : i.tween({
|
|
48
|
+
from: 0,
|
|
49
|
+
to: 1,
|
|
50
|
+
ms: h.ms ?? 200,
|
|
51
|
+
easing: h.easing,
|
|
52
|
+
cancelKey: y,
|
|
53
|
+
label: b,
|
|
54
|
+
onTick: _,
|
|
55
|
+
onDone: v
|
|
56
|
+
}), r.overrides.commit();
|
|
57
|
+
}, h = (e) => {
|
|
58
|
+
let t = c.get(e);
|
|
59
|
+
if (!t) return;
|
|
60
|
+
c.delete(e), t.handle?.cancel();
|
|
61
|
+
let n = e;
|
|
62
|
+
r.overrides.get(n) === t.entry && (r.overrides.clear(n), r.overrides.commit()), f();
|
|
63
|
+
}, g = (e, n, i, a) => {
|
|
64
|
+
if (i) a !== void 0 && (i.entry.pose = a);
|
|
65
|
+
else {
|
|
66
|
+
let o = a ?? t(r, n);
|
|
67
|
+
i = {
|
|
68
|
+
entry: { pose: o },
|
|
69
|
+
target: o,
|
|
70
|
+
settling: !1,
|
|
71
|
+
handle: null
|
|
72
|
+
}, c.set(e, i);
|
|
73
|
+
}
|
|
74
|
+
return r.overrides.get(e) !== i.entry && r.overrides.set(e, i.entry), i;
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
glide(e, t, n) {
|
|
78
|
+
let i = r.get(e);
|
|
79
|
+
if (!i) return;
|
|
80
|
+
let a = n?.from, o = c.get(e);
|
|
81
|
+
o && a === void 0 && !o.settling && s(o.target, t) || m(e, g(e, i, o, a), t, !1);
|
|
82
|
+
},
|
|
83
|
+
settle(t, n) {
|
|
84
|
+
let i = n?.from, a = c.get(t);
|
|
85
|
+
if (!a && i === void 0) return;
|
|
86
|
+
let o = r.get(t);
|
|
87
|
+
if (!o) {
|
|
88
|
+
h(t);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let l = e(r, o);
|
|
92
|
+
if (a && i === void 0) {
|
|
93
|
+
if (a.settling && s(a.target, l)) return;
|
|
94
|
+
m(t, a, l, !0);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
m(t, g(t, o, a, i), l, !0);
|
|
98
|
+
},
|
|
99
|
+
stop: h,
|
|
100
|
+
poseOf: (e) => c.get(e)?.entry.pose,
|
|
101
|
+
dispose() {
|
|
102
|
+
for (let e of [...c.keys()]) h(e);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function l(e, t, n = {}) {
|
|
107
|
+
return c(e, t, () => n);
|
|
108
|
+
}
|
|
109
|
+
function u(e, t, n) {
|
|
110
|
+
let o = a(n || {}), s = !!n, l = i(() => s ? c(e, t, () => o.current) : null, [
|
|
111
|
+
s,
|
|
112
|
+
e,
|
|
113
|
+
t,
|
|
114
|
+
o
|
|
115
|
+
]);
|
|
116
|
+
return r(() => () => l?.dispose(), [l]), l;
|
|
117
|
+
}
|
|
118
|
+
//#endregion
|
|
119
|
+
export { l as createReflowTransition, u as useAnimatedReflow };
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=reflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflow.js","names":["keyFor","id","samePose","a","b","ka","k","makeReflow","glides","dirty","unsubscribe","subscribe","animator","scene","unsubscribeIfIdle","release","g","nid","run","from","to","settling","o","read","lerp","RECT_POSE_DESCRIPTOR","onTick","p","onDone","cancelKey","label","stop","claim","start","effectivePose","node","opts","pose","home","documentPose","createReflowTransition","useAnimatedReflow","latest","useLatest","enabled","reflow","useMemo","useEffect"],"sources":["../../src/animation/reflow.ts"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../core/geometry/poseDescriptor';\nimport { documentPose, effectivePose, type PosedNode, type PoseSource } from '../core/scene/effectivePose';\nimport type { NodeId, PoseOverride, PoseOverrides } from '../core/scene/types';\nimport type { ReflowTransition } from '../layout/types';\nimport type { AnimationHandle, Animator, EasingSpec, SpringPresetName } from './types';\n\n/** How a reflowed sibling travels: a duration and easing, or a spring. */\nexport interface ReflowTransitionOptions<TPose> {\n /** Default 200. Ignored under `spring`. */\n ms?: number;\n easing?: EasingSpec;\n /** Travel on a spring instead of a duration. A retarget restarts it from\n * the pose on screen, so position stays continuous and velocity does not\n * carry over. */\n spring?: {\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n };\n /** Supplies the `lerp` between two poses. Default `RECT_POSE_DESCRIPTOR`. */\n geometry?: PoseDescriptor<TPose>;\n /** Names each glide in `animator.watch` and `live()`. Default `'reflow'`. */\n label?: string;\n}\n\n/** A {@link ReflowTransition} the animator drives. `dispose` drops every\n * override it holds; the transition stays usable afterward. */\nexport interface AnimatedReflow<TPose = unknown> extends ReflowTransition<TPose> {\n dispose(): void;\n}\n\n/** The part of a scene a reflow transition reads and overrides. */\nexport interface ReflowScene<TPose> extends PoseSource<TPose> {\n readonly overrides: PoseOverrides<TPose>;\n}\n\ninterface Glide<TPose> {\n entry: PoseOverride<TPose>;\n target: TPose;\n settling: boolean;\n handle: AnimationHandle | null;\n}\n\n/** The animator's cancel-key for one node's glide. */\nconst keyFor = (id: string): string => `reflow:${id}`;\n\nfunction samePose(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n if (ka.length !== Object.keys(b).length) return false;\n for (const k of ka) {\n if (!samePose((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\nfunction makeReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n read: () => ReflowTransitionOptions<TPose>,\n): AnimatedReflow<TPose> {\n const glides = new Map<string, Glide<TPose>>();\n let dirty = false;\n let unsubscribe: (() => void) | null = null;\n\n // Ticks only mark the frame dirty; one commit per animator frame publishes\n // every glide at once.\n const subscribe = (): void => {\n if (unsubscribe) return;\n unsubscribe = animator.onTick(() => {\n if (!dirty) return;\n dirty = false;\n scene.overrides.commit();\n });\n };\n const unsubscribeIfIdle = (): void => {\n if (glides.size > 0 || !unsubscribe) return;\n unsubscribe();\n unsubscribe = null;\n };\n\n const release = (id: string, g: Glide<TPose>): void => {\n if (glides.get(id) === g) glides.delete(id);\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) scene.overrides.clear(nid);\n dirty = true;\n };\n\n const run = (id: string, g: Glide<TPose>, to: TPose, settling: boolean): void => {\n const from = g.entry.pose as TPose;\n g.target = to;\n g.settling = settling;\n if (samePose(from, to)) {\n g.handle?.cancel();\n g.handle = null;\n g.entry.pose = to;\n if (settling) release(id, g);\n scene.overrides.commit();\n unsubscribeIfIdle();\n return;\n }\n const o = read();\n const lerp = (o.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>)).lerp;\n if (!lerp) throw new Error('useAnimatedReflow: geometry has no lerp; supply geometry: { ..., lerp }');\n const onTick = (p: number): void => {\n g.entry.pose = lerp(from, to, p);\n dirty = true;\n };\n const onDone = (): void => {\n g.handle = null;\n if (!g.settling) return;\n release(id, g);\n unsubscribeIfIdle();\n };\n const cancelKey = keyFor(id);\n const label = o.label ?? 'reflow';\n subscribe();\n // The shared key is what retargets: the new animation interrupts the old.\n g.handle = o.spring\n ? animator.spring<number>({ from: 0, to: 1, ...o.spring, cancelKey, label, onTick, onDone })\n : animator.tween<number>({ from: 0, to: 1, ms: o.ms ?? 200, easing: o.easing, cancelKey, label, onTick, onDone });\n scene.overrides.commit();\n };\n\n const stop = (id: string): void => {\n const g = glides.get(id);\n if (!g) return;\n glides.delete(id);\n g.handle?.cancel();\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) {\n scene.overrides.clear(nid);\n scene.overrides.commit();\n }\n unsubscribeIfIdle();\n };\n\n // The glide for `id`, created if absent, starting from `from` when given,\n // and published over whatever override is showing the node.\n const claim = (\n id: string,\n node: PosedNode<TPose>,\n g: Glide<TPose> | undefined,\n from: TPose | undefined,\n ): Glide<TPose> => {\n if (!g) {\n const start = from ?? effectivePose(scene, node);\n g = { entry: { pose: start }, target: start, settling: false, handle: null };\n glides.set(id, g);\n } else if (from !== undefined) {\n g.entry.pose = from;\n }\n if (scene.overrides.get(id as NodeId) !== g.entry) scene.overrides.set(id as NodeId, g.entry);\n return g;\n };\n\n return {\n glide(id, pose, opts) {\n const node = scene.get(id as NodeId);\n if (!node) return;\n const from = opts?.from;\n const g = glides.get(id);\n if (g && from === undefined && !g.settling && samePose(g.target, pose)) return;\n run(id, claim(id, node, g, from), pose, false);\n },\n settle(id, opts) {\n const from = opts?.from;\n const g = glides.get(id);\n if (!g && from === undefined) return;\n const node = scene.get(id as NodeId);\n if (!node) { stop(id); return; }\n const home = documentPose(scene, node);\n if (g && from === undefined) {\n if (g.settling && samePose(g.target, home)) return;\n run(id, g, home, true);\n return;\n }\n run(id, claim(id, node, g, from), home, true);\n },\n stop,\n poseOf: (id) => glides.get(id)?.entry.pose,\n dispose() {\n for (const id of [...glides.keys()]) stop(id);\n },\n };\n}\n\n/**\n * A reflow transition over `animator`: each glide is a tween (or spring) of\n * its own, keyed `reflow:<id>`, so a new target for a node interrupts the\n * glide it is on and `animator.cancelKey` reaches one node's. See\n * {@link useAnimatedReflow} for the hook form.\n */\nexport function createReflowTransition<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> = {},\n): AnimatedReflow<TPose> {\n return makeReflow(scene, animator, () => opts);\n}\n\n/**\n * Opt a canvas's layout reflow into animation: pass the result to\n * `<SceneCanvas reflowTransition>` and siblings a drag displaces glide to\n * their slots instead of snapping. `null` (or `false`) turns it off, and\n * whatever it was holding snaps home. Option changes apply from the next\n * glide on, without rebuilding.\n */\nexport function useAnimatedReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> | null | false | undefined,\n): AnimatedReflow<TPose> | null {\n const latest = useLatest(opts || {});\n const enabled = !!opts;\n const reflow = useMemo(\n () => (enabled ? makeReflow(scene, animator, () => latest.current) : null),\n [enabled, scene, animator, latest],\n );\n useEffect(() => () => reflow?.dispose(), [reflow]);\n return reflow;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { mat3 as e } from "../../renderer/math/mat3.js";
|
|
2
|
+
import { AUTO_POSE_DESCRIPTOR as t } from "../../interactions/actions/resize/autoPoseDescriptor.js";
|
|
3
|
+
import { resolveSkeleton as n } from "./resolveSkeleton.js";
|
|
4
|
+
//#region src/animation/rig/bindRig.ts
|
|
5
|
+
function r(t) {
|
|
6
|
+
return (n, { rest: r, fromRest: i }) => {
|
|
7
|
+
let a = t.getBounds(r), o = a.x + a.width / 2, s = a.y + a.height / 2, [c, l] = e.apply(i, o, s), u = t.translate ? t.translate(r, c - o, l - s) : t.remapBounds(r, a, {
|
|
8
|
+
...a,
|
|
9
|
+
x: a.x + c - o,
|
|
10
|
+
y: a.y + l - s
|
|
11
|
+
});
|
|
12
|
+
if (!t.withRotation) return u;
|
|
13
|
+
let d = t.getRotation?.(r) ?? 0, f = Math.cos(d), p = Math.sin(d);
|
|
14
|
+
return t.withRotation(u, Math.atan2(i[1] * f + i[4] * p, i[0] * f + i[3] * p));
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function i(i) {
|
|
18
|
+
let { scene: a, skeleton: o } = i, s = i.apply ?? r(i.descriptor ?? t), c = n(o, {}), l = [];
|
|
19
|
+
for (let [t, n] of Object.entries(i.bindings)) {
|
|
20
|
+
let r = c.get(t);
|
|
21
|
+
if (!r) throw Error(`bindRig: the skeleton has no joint "${t}".`);
|
|
22
|
+
let i = e.invert(r);
|
|
23
|
+
if (!i) throw Error(`bindRig: joint "${t}" is singular at the bind pose.`);
|
|
24
|
+
for (let e of typeof n == "string" ? [n] : n) {
|
|
25
|
+
let n = a.get(e);
|
|
26
|
+
if (!n) throw Error(`bindRig: joint "${t}" is bound to node "${e}", which the scene lacks.`);
|
|
27
|
+
l.push({
|
|
28
|
+
node: e,
|
|
29
|
+
joint: t,
|
|
30
|
+
rest: n.pose,
|
|
31
|
+
restWorld: r,
|
|
32
|
+
restInverse: i,
|
|
33
|
+
entry: { pose: n.pose }
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
let u = c, d = !1, f = () => {
|
|
38
|
+
if (d) {
|
|
39
|
+
d = !1;
|
|
40
|
+
for (let e of l) a.overrides.clear(e.node);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
skeleton: o,
|
|
45
|
+
pose(t, r) {
|
|
46
|
+
let i = n(o, t);
|
|
47
|
+
if (r) for (let [t, n] of i) i.set(t, e.multiply(r, n));
|
|
48
|
+
u = i;
|
|
49
|
+
let c = /* @__PURE__ */ new Map();
|
|
50
|
+
for (let t of l) {
|
|
51
|
+
let n = i.get(t.joint), r = c.get(t.joint);
|
|
52
|
+
r || (r = e.multiply(n, t.restInverse), c.set(t.joint, r)), t.entry.pose = s(n, {
|
|
53
|
+
joint: t.joint,
|
|
54
|
+
node: t.node,
|
|
55
|
+
rest: t.rest,
|
|
56
|
+
restWorld: t.restWorld,
|
|
57
|
+
fromRest: r
|
|
58
|
+
}), d || a.overrides.set(t.node, t.entry);
|
|
59
|
+
}
|
|
60
|
+
d = !0, a.overrides.commit();
|
|
61
|
+
},
|
|
62
|
+
world: () => u,
|
|
63
|
+
bake(e = "Bake rig pose") {
|
|
64
|
+
d && (a.batch(e, () => {
|
|
65
|
+
for (let e of l) e.entry.pose !== void 0 && a.setPose(e.node, e.entry.pose);
|
|
66
|
+
}), f());
|
|
67
|
+
},
|
|
68
|
+
release: f
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { i as bindRig, r as rigidRigApply };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=bindRig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindRig.js","names":["rigidRigApply","b","descriptor","rest","cx","cy","nx","ny","mat3","fromRest","moved","r0","ux","uy","bindRig","options","apply","AUTO_POSE_DESCRIPTOR","restWorlds","resolveSkeleton","skeleton","bound","joint","ids","restWorld","restInverse","node","scene","world","installed","release","local","pose","root","name","m","w","delta","label"],"sources":["../../../src/animation/rig/bindRig.ts"],"sourcesContent":["import type { PoseDescriptor } from '../../core/geometry/poseDescriptor';\nimport type { NodeId, PoseOverride, PoseOverrides } from '../../core/scene/types';\nimport { AUTO_POSE_DESCRIPTOR } from '../../interactions/actions/resize/autoPoseDescriptor';\nimport { mat3, type GlMat3 } from '../../renderer/math/mat3';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport type { Pose, Skeleton } from './types';\n\n/** The part of a scene a rig writes to. */\nexport interface RigScene<TPose> {\n get(id: NodeId): { pose: TPose } | undefined;\n readonly overrides: PoseOverrides<TPose>;\n setPose(id: NodeId, pose: TPose): void;\n batch<T>(label: string, fn: () => T): T;\n}\n\n/** What a `RigApply` knows about the node it is posing. */\nexport interface RigApplyContext<TPose> {\n /** The joint the node rides. */\n joint: string;\n node: NodeId;\n /** The node's document pose when the rig was bound — where it sits at the\n * bind pose. */\n rest: TPose;\n /** The joint's world transform at the bind pose. */\n restWorld: GlMat3;\n /** `world * inverse(restWorld)`: the motion since the bind pose, in world\n * space. Carrying `rest` by it is what welding the node to the joint means. */\n fromRest: GlMat3;\n}\n\n/** Turns a joint's world transform into a pose for one bound node. The only\n * part of a rig that knows the scene's pose shape. */\nexport type RigApply<TPose> = (world: GlMat3, ctx: RigApplyContext<TPose>) => TPose;\n\n/** Options for `bindRig`. */\nexport interface BindRigOptions<TPose> {\n scene: RigScene<TPose>;\n skeleton: Skeleton;\n /** Joint name → the node or nodes that ride it. Each node keeps the offset\n * from its joint that it has at the bind pose. */\n bindings: Readonly<Record<string, NodeId | readonly NodeId[]>>;\n /** Default: {@link rigidRigApply} over `descriptor`. */\n apply?: RigApply<TPose>;\n /** The descriptor the default `apply` reads and writes poses through.\n * Default `AUTO_POSE_DESCRIPTOR`. */\n descriptor?: PoseDescriptor<TPose>;\n}\n\n/** A skeleton bound to scene nodes, as `bindRig` returns it. */\nexport interface Rig {\n readonly skeleton: Skeleton;\n /**\n * Resolve `pose` and move every bound node to it, through the scene's pose\n * overrides — no history entry, no document write, no version bump — then\n * commit them. The per-frame write. `root` places the rig in the world, and\n * may mirror it.\n */\n pose(pose: Pose, root?: GlMat3): void;\n /** The joint world transforms the last `pose` resolved, root applied. */\n world(): ReadonlyMap<string, GlMat3>;\n /** Write the current frame into the bound nodes' document poses as one\n * undo entry, and drop the overrides. Later frames stay relative to the\n * bind-time rest, so baking does not compound. */\n bake(label?: string): void;\n /** Drop the overrides; the nodes show their document poses again until the\n * next `pose`. */\n release(): void;\n}\n\n/**\n * Carries a node rigidly with its joint: the rest pose's center moves by\n * `fromRest`, and its rotation turns with the rest pose's x-axis. Scale in the\n * joint chain moves positions but not sizes — the pose model holds no shear,\n * and a sized pose under anisotropic scale would need one. Write an `apply`\n * that reads `world` to size nodes from joint scale.\n */\nexport function rigidRigApply<TPose>(descriptor: PoseDescriptor<TPose>): RigApply<TPose> {\n return (_world, { rest, fromRest }) => {\n const b = descriptor.getBounds(rest);\n const cx = b.x + b.width / 2;\n const cy = b.y + b.height / 2;\n const [nx, ny] = mat3.apply(fromRest, cx, cy);\n const moved = descriptor.translate\n ? descriptor.translate(rest, nx - cx, ny - cy)\n : descriptor.remapBounds(rest, b, { ...b, x: b.x + nx - cx, y: b.y + ny - cy });\n if (!descriptor.withRotation) return moved;\n const r0 = descriptor.getRotation?.(rest) ?? 0;\n const ux = Math.cos(r0);\n const uy = Math.sin(r0);\n return descriptor.withRotation(\n moved,\n Math.atan2(fromRest[1] * ux + fromRest[4] * uy, fromRest[0] * ux + fromRest[3] * uy),\n );\n };\n}\n\ninterface Bound<TPose> {\n node: NodeId;\n joint: string;\n rest: TPose;\n restWorld: GlMat3;\n restInverse: GlMat3;\n entry: PoseOverride<TPose>;\n}\n\n/**\n * Bind a skeleton's joints to scene nodes. Nodes are written in world space\n * and the rig resolves its own hierarchy, so bound nodes are best left\n * unparented, or under containers whose pose does not compose into theirs;\n * the scene's tree stays free to order and group them for drawing.\n */\nexport function bindRig<TPose>(options: BindRigOptions<TPose>): Rig {\n const { scene, skeleton } = options;\n const apply = options.apply ?? rigidRigApply(options.descriptor ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>));\n const restWorlds = resolveSkeleton(skeleton, {});\n\n const bound: Bound<TPose>[] = [];\n for (const [joint, ids] of Object.entries(options.bindings)) {\n const restWorld = restWorlds.get(joint);\n if (!restWorld) throw new Error(`bindRig: the skeleton has no joint \"${joint}\".`);\n const restInverse = mat3.invert(restWorld);\n if (!restInverse) throw new Error(`bindRig: joint \"${joint}\" is singular at the bind pose.`);\n for (const node of typeof ids === 'string' ? [ids] : (ids as readonly NodeId[])) {\n const n = scene.get(node);\n if (!n) throw new Error(`bindRig: joint \"${joint}\" is bound to node \"${node}\", which the scene lacks.`);\n bound.push({ node, joint, rest: n.pose, restWorld, restInverse, entry: { pose: n.pose } });\n }\n }\n\n let world: ReadonlyMap<string, GlMat3> = restWorlds;\n let installed = false;\n\n const release = () => {\n if (!installed) return;\n installed = false;\n for (const b of bound) scene.overrides.clear(b.node);\n };\n\n return {\n skeleton,\n pose(pose, root) {\n const local = resolveSkeleton(skeleton, pose);\n if (root) for (const [name, m] of local) local.set(name, mat3.multiply(root, m));\n world = local;\n const fromRest = new Map<string, GlMat3>();\n for (const b of bound) {\n const w = local.get(b.joint)!;\n let delta = fromRest.get(b.joint);\n if (!delta) {\n delta = mat3.multiply(w, b.restInverse);\n fromRest.set(b.joint, delta);\n }\n b.entry.pose = apply(w, { joint: b.joint, node: b.node, rest: b.rest, restWorld: b.restWorld, fromRest: delta });\n if (!installed) scene.overrides.set(b.node, b.entry);\n }\n installed = true;\n scene.overrides.commit();\n },\n world: () => world,\n bake(label = 'Bake rig pose') {\n if (!installed) return;\n scene.batch(label, () => {\n for (const b of bound) if (b.entry.pose !== undefined) scene.setPose(b.node, b.entry.pose);\n });\n release();\n },\n release,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { IDENTITY_JOINT as e } from "./types.js";
|
|
2
|
+
//#region src/animation/rig/blendPoses.ts
|
|
3
|
+
var t = Math.PI * 2;
|
|
4
|
+
function n(e, n) {
|
|
5
|
+
let r = (n - e) % t;
|
|
6
|
+
return r > Math.PI && (r -= t), r < -Math.PI && (r += t), r;
|
|
7
|
+
}
|
|
8
|
+
var r = [
|
|
9
|
+
"x",
|
|
10
|
+
"y",
|
|
11
|
+
"scaleX",
|
|
12
|
+
"scaleY"
|
|
13
|
+
];
|
|
14
|
+
function i(t, i) {
|
|
15
|
+
if (t.length !== i.length) throw Error("blendPoses: poses and weights must have the same length");
|
|
16
|
+
let a = i.reduce((e, t) => e + t, 0);
|
|
17
|
+
if (a === 0) return {};
|
|
18
|
+
let o = i.map((e) => e / a), s = /* @__PURE__ */ new Set();
|
|
19
|
+
for (let e of t) for (let t of Object.keys(e)) s.add(t);
|
|
20
|
+
let c = {};
|
|
21
|
+
for (let i of s) {
|
|
22
|
+
let a = {};
|
|
23
|
+
for (let n of r) {
|
|
24
|
+
let r = 0;
|
|
25
|
+
for (let a = 0; a < t.length; a += 1) {
|
|
26
|
+
let s = t[a][i]?.[n];
|
|
27
|
+
r += (s ?? e[n]) * o[a];
|
|
28
|
+
}
|
|
29
|
+
a[n] = r;
|
|
30
|
+
}
|
|
31
|
+
let s = t[0][i]?.rotation ?? 0, l = 0;
|
|
32
|
+
for (let e = 0; e < t.length; e += 1) {
|
|
33
|
+
let r = t[e][i]?.rotation ?? 0;
|
|
34
|
+
l += n(s, r) * o[e];
|
|
35
|
+
}
|
|
36
|
+
a.rotation = s + l, c[i] = a;
|
|
37
|
+
}
|
|
38
|
+
return c;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { i as blendPoses };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=blendPoses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blendPoses.js","names":["TAU","shortestDelta","d","b","a","FIELDS","blendPoses","poses","weights","total","s","w","norm","names","p","k","out","name","joint","field","acc","i","v","IDENTITY_JOINT","base","rot"],"sources":["../../../src/animation/rig/blendPoses.ts"],"sourcesContent":["import { IDENTITY_JOINT, type JointTransform, type Pose } from './types';\n\nconst TAU = Math.PI * 2;\n\n/** Shortest signed angular delta from `a` to `b`, in (-PI, PI]. */\nfunction shortestDelta(a: number, b: number): number {\n let d = (b - a) % TAU;\n if (d > Math.PI) d -= TAU;\n if (d < -Math.PI) d += TAU;\n return d;\n}\n\nconst FIELDS: (keyof JointTransform)[] = ['x', 'y', 'scaleX', 'scaleY'];\n\n/**\n * Weighted blend of poses. Weights are normalized, so `[1, 1]` means an even\n * mix. A joint absent from a pose contributes its identity delta, and a field\n * absent from a joint contributes that field's identity — 0 for translation and\n * rotation, 1 for scale. Blending scale toward 0 for an absent field would\n * collapse the joint, which is the bug this avoids.\n *\n * Rotation blends the short way around the circle, so 0.1 and TAU-0.1 average\n * to 0 rather than to PI.\n *\n * This doubles as the interpolator for a `SampledTrack<Pose>`: interpolating\n * between two poses at `u` is `blendPoses([a, b], [1 - u, u])`.\n */\nexport function blendPoses(poses: Pose[], weights: number[]): Pose {\n if (poses.length !== weights.length) {\n throw new Error('blendPoses: poses and weights must have the same length');\n }\n const total = weights.reduce((s, w) => s + w, 0);\n if (total === 0) return {};\n const norm = weights.map((w) => w / total);\n\n const names = new Set<string>();\n for (const p of poses) for (const k of Object.keys(p)) names.add(k);\n\n const out: Pose = {};\n for (const name of names) {\n const joint: Partial<JointTransform> = {};\n\n for (const field of FIELDS) {\n let acc = 0;\n for (let i = 0; i < poses.length; i += 1) {\n const v = poses[i][name]?.[field];\n acc += (v ?? IDENTITY_JOINT[field]) * norm[i];\n }\n joint[field] = acc;\n }\n\n // Rotation accumulates as a delta from the first pose's value so wrapping\n // is handled once, against a fixed reference.\n const base = poses[0][name]?.rotation ?? 0;\n let rot = 0;\n for (let i = 0; i < poses.length; i += 1) {\n const v = poses[i][name]?.rotation ?? 0;\n rot += shortestDelta(base, v) * norm[i];\n }\n joint.rotation = base + rot;\n\n out[name] = joint;\n }\n return out;\n}\n"],"mappings":";;AAEA,IAAMA,IAAM,KAAK,KAAK;AAGtB,SAASC,EAAc,GAAW,GAAmB;CACnD,IAAIC,KAAKC,IAAIC,KAAKJ;CAGlB,OAFIE,IAAI,KAAK,OAAI,KAAKF,IAClBE,IAAI,CAAC,KAAK,OAAI,KAAKF,IAChBE;AACT;AAEA,IAAMG,IAAmC;CAAC;CAAK;CAAK;CAAU;AAAQ;AAetE,SAAgBC,EAAW,GAAe,GAAyB;CACjE,IAAIC,EAAM,WAAWC,EAAQ,QAC3B,MAAU,MAAM,yDAAyD;CAE3E,IAAMC,IAAQD,EAAQ,QAAQ,GAAG,MAAME,IAAIC,GAAG,CAAC;CAC/C,IAAIF,MAAU,GAAG,OAAO,CAAC;CACzB,IAAMG,IAAOJ,EAAQ,KAAK,MAAMG,IAAIF,CAAK,GAEnCI,oBAAQ,IAAI,IAAY;CAC9B,KAAK,IAAMC,KAAKP,GAAO,KAAK,IAAMQ,KAAK,OAAO,KAAKD,CAAC,GAAG,EAAM,IAAIC,CAAC;CAElE,IAAMC,IAAY,CAAC;CACnB,KAAK,IAAMC,KAAQJ,GAAO;EACxB,IAAMK,IAAiC,CAAC;EAExC,KAAK,IAAMC,KAASd,GAAQ;GAC1B,IAAIe,IAAM;GACV,KAAK,IAAIC,IAAI,GAAGA,IAAId,EAAM,QAAQ,KAAK,GAAG;IACxC,IAAMe,IAAIf,EAAMc,EAAE,CAACJ,EAAK,GAAGE;IAC3B,MAAQG,KAAKC,EAAeJ,MAAUP,EAAKS;GAC7C;GACA,EAAMF,KAASC;EACjB;EAIA,IAAMI,IAAOjB,EAAM,EAAE,CAACU,EAAK,EAAE,YAAY,GACrCQ,IAAM;EACV,KAAK,IAAIJ,IAAI,GAAGA,IAAId,EAAM,QAAQ,KAAK,GAAG;GACxC,IAAMe,IAAIf,EAAMc,EAAE,CAACJ,EAAK,EAAE,YAAY;GACtC,KAAOhB,EAAcuB,GAAMF,CAAC,IAAIV,EAAKS;EACvC;EAGA,AAFA,EAAM,WAAWG,IAAOC,GAExB,EAAIR,KAAQC;CACd;CACA,OAAOF;AACT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/animation/rig/mirrorPose.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
let n = {}, r = /* @__PURE__ */ new Map();
|
|
4
|
+
for (let t of e.joints) r.set(t.name, t.bind);
|
|
5
|
+
let i = /* @__PURE__ */ new Set([...r.keys(), ...Object.keys(t)]);
|
|
6
|
+
for (let e of i) {
|
|
7
|
+
let i = r.get(e), a = t[e];
|
|
8
|
+
n[e] = {
|
|
9
|
+
...a,
|
|
10
|
+
x: -2 * (i?.x ?? 0) - (a?.x ?? 0),
|
|
11
|
+
rotation: -2 * (i?.rotation ?? 0) - (a?.rotation ?? 0)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
return n;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { e as mirrorPose };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=mirrorPose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirrorPose.js","names":["mirrorPose","out","binds","joint","skeleton","names","pose","name","bind","d"],"sources":["../../../src/animation/rig/mirrorPose.ts"],"sourcesContent":["import type { JointTransform, Pose, Skeleton } from './types';\n\n/**\n * `pose` reflected across the rig's y axis, as deltas against the same\n * skeleton — so the mirrored pose still blends, samples and resolves like any\n * other.\n *\n * Reflecting a joint chain is conjugation: every local transform `T·R·S`\n * becomes `F·T·R·S·F` with `F` the flip, which is again a plain transform\n * with `x` and `rotation` negated. Every resolved joint is then exactly the\n * original's reflection, which is how a rig faces the other way without a\n * negative scale anywhere — a scene pose such as `RectPose` has no term to\n * carry one. The negation applies to bind plus delta, so the delta for a\n * joint the pose leaves at its bind is nonzero whenever the bind is.\n *\n * Applying it twice gives the original pose back.\n */\nexport function mirrorPose(skeleton: Skeleton, pose: Pose): Pose {\n const out: Pose = {};\n const binds = new Map<string, JointTransform>();\n for (const joint of skeleton.joints) binds.set(joint.name, joint.bind);\n const names = new Set([...binds.keys(), ...Object.keys(pose)]);\n for (const name of names) {\n const bind = binds.get(name);\n const d = pose[name];\n out[name] = {\n ...d,\n x: -2 * (bind?.x ?? 0) - (d?.x ?? 0),\n rotation: -2 * (bind?.rotation ?? 0) - (d?.rotation ?? 0),\n };\n }\n return out;\n}\n"],"mappings":";AAiBA,SAAgBA,EAAW,GAAoB,GAAkB;CAC/D,IAAMC,IAAY,CAAC,GACbC,oBAAQ,IAAI,IAA4B;CAC9C,KAAK,IAAMC,KAASC,EAAS,QAAQ,EAAM,IAAID,EAAM,MAAMA,EAAM,IAAI;CACrE,IAAME,oBAAQ,IAAI,IAAI,CAAC,GAAGH,EAAM,KAAK,GAAG,GAAG,OAAO,KAAKI,CAAI,CAAC,CAAC;CAC7D,KAAK,IAAMC,KAAQF,GAAO;EACxB,IAAMG,IAAON,EAAM,IAAIK,CAAI,GACrBE,IAAIH,EAAKC;EACf,EAAIA,KAAQ;GACV,GAAGE;GACH,GAAG,MAAMD,GAAM,KAAK,MAAMC,GAAG,KAAK;GAClC,UAAU,MAAMD,GAAM,YAAY,MAAMC,GAAG,YAAY;EACzD;CACF;CACA,OAAOR;AACT"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { mat3 as e } from "../../renderer/math/mat3.js";
|
|
2
|
+
//#region src/animation/rig/resolveSkeleton.ts
|
|
3
|
+
function t(e, t) {
|
|
4
|
+
return t ? {
|
|
5
|
+
x: e.x + (t.x ?? 0),
|
|
6
|
+
y: e.y + (t.y ?? 0),
|
|
7
|
+
rotation: e.rotation + (t.rotation ?? 0),
|
|
8
|
+
scaleX: e.scaleX * (t.scaleX ?? 1),
|
|
9
|
+
scaleY: e.scaleY * (t.scaleY ?? 1)
|
|
10
|
+
} : e;
|
|
11
|
+
}
|
|
12
|
+
function n(e) {
|
|
13
|
+
let t = Math.cos(e.rotation), n = Math.sin(e.rotation), r = /* @__PURE__ */ new Float32Array(9);
|
|
14
|
+
return r[0] = t * e.scaleX, r[1] = n * e.scaleX, r[2] = 0, r[3] = -n * e.scaleY, r[4] = t * e.scaleY, r[5] = 0, r[6] = e.x, r[7] = e.y, r[8] = 1, r;
|
|
15
|
+
}
|
|
16
|
+
function r(r, i) {
|
|
17
|
+
let a = /* @__PURE__ */ new Map();
|
|
18
|
+
for (let o of r.joints) {
|
|
19
|
+
let r = n(t(o.bind, i[o.name]));
|
|
20
|
+
if (o.parent == null) {
|
|
21
|
+
a.set(o.name, r);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
let s = a.get(o.parent);
|
|
25
|
+
if (!s) throw Error(`resolveSkeleton: joint "${o.name}" names parent "${o.parent}", which has not been resolved. Skeleton.joints must be in topological order.`);
|
|
26
|
+
a.set(o.name, e.multiply(s, r));
|
|
27
|
+
}
|
|
28
|
+
return a;
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { t as compose, r as resolveSkeleton, n as toMat3 };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=resolveSkeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveSkeleton.js","names":["compose","delta","bind","toMat3","c","t","s","m","resolveSkeleton","out","joint","skeleton","local","pose","parent","mat3"],"sources":["../../../src/animation/rig/resolveSkeleton.ts"],"sourcesContent":["import { mat3, type GlMat3 } from '../../renderer/math/mat3';\nimport type { JointTransform, Pose, Skeleton } from './types';\n\n/** bind + delta, field by field. Scale is multiplicative, the rest additive. */\nexport function compose(bind: JointTransform, delta: Partial<JointTransform> | undefined): JointTransform {\n if (!delta) return bind;\n return {\n x: bind.x + (delta.x ?? 0),\n y: bind.y + (delta.y ?? 0),\n rotation: bind.rotation + (delta.rotation ?? 0),\n scaleX: bind.scaleX * (delta.scaleX ?? 1),\n scaleY: bind.scaleY * (delta.scaleY ?? 1),\n };\n}\n\n/** TRS as a GlMat3: translate * rotate * scale, applied to a column vector. */\nexport function toMat3(t: JointTransform): GlMat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const m = new Float32Array(9) as GlMat3;\n m[0] = c * t.scaleX; m[1] = s * t.scaleX; m[2] = 0;\n m[3] = -s * t.scaleY; m[4] = c * t.scaleY; m[5] = 0;\n m[6] = t.x; m[7] = t.y; m[8] = 1;\n return m;\n}\n\n/**\n * Resolve every joint's world transform by walking the skeleton once and\n * composing each joint onto its already-resolved parent.\n *\n * `skeleton.joints` must be in topological order — a joint whose parent has not\n * been resolved yet throws rather than silently resolving against identity,\n * because that failure is otherwise invisible until a limb renders in the wrong\n * place.\n */\nexport function resolveSkeleton(skeleton: Skeleton, pose: Pose): Map<string, GlMat3> {\n const out = new Map<string, GlMat3>();\n for (const joint of skeleton.joints) {\n const local = toMat3(compose(joint.bind, pose[joint.name]));\n if (joint.parent == null) {\n out.set(joint.name, local);\n continue;\n }\n const parent = out.get(joint.parent);\n if (!parent) {\n throw new Error(\n `resolveSkeleton: joint \"${joint.name}\" names parent \"${joint.parent}\", which has not ` +\n 'been resolved. Skeleton.joints must be in topological order.',\n );\n }\n out.set(joint.name, mat3.multiply(parent, local));\n }\n return out;\n}\n"],"mappings":";;AAIA,SAAgBA,EAAQ,GAAsB,GAA4D;CAExG,OADKC,IACE;EACL,GAAGC,EAAK,KAAKD,EAAM,KAAK;EACxB,GAAGC,EAAK,KAAKD,EAAM,KAAK;EACxB,UAAUC,EAAK,YAAYD,EAAM,YAAY;EAC7C,QAAQC,EAAK,UAAUD,EAAM,UAAU;EACvC,QAAQC,EAAK,UAAUD,EAAM,UAAU;CACzC,IAPmBC;AAQrB;AAGA,SAAgBC,EAAO,GAA2B;CAChD,IAAMC,IAAI,KAAK,IAAIC,EAAE,QAAQ,GACvBC,IAAI,KAAK,IAAID,EAAE,QAAQ,GACvBE,oBAAI,IAAI,aAAa,CAAC;CAI5B,OAHA,EAAE,KAAKH,IAAIC,EAAE,QAAS,EAAE,KAAKC,IAAID,EAAE,QAAS,EAAE,KAAK,GACnD,EAAE,KAAK,CAACC,IAAID,EAAE,QAAQ,EAAE,KAAKD,IAAIC,EAAE,QAAS,EAAE,KAAK,GACnD,EAAE,KAAKA,EAAE,GAAa,EAAE,KAAKA,EAAE,GAAa,EAAE,KAAK,GAC5CE;AACT;AAWA,SAAgBC,EAAgB,GAAoB,GAAiC;CACnF,IAAMC,oBAAM,IAAI,IAAoB;CACpC,KAAK,IAAMC,KAASC,EAAS,QAAQ;EACnC,IAAMC,IAAQT,EAAOH,EAAQU,EAAM,MAAMG,EAAKH,EAAM,KAAK,CAAC;EAC1D,IAAIA,EAAM,UAAU,MAAM;GACxB,EAAI,IAAIA,EAAM,MAAME,CAAK;GACzB;EACF;EACA,IAAME,IAASL,EAAI,IAAIC,EAAM,MAAM;EACnC,IAAI,CAACI,GACH,MAAU,MACR,2BAA2BJ,EAAM,KAAK,kBAAkBA,EAAM,OAAO,8EAEvE;EAEF,EAAI,IAAIA,EAAM,MAAMK,EAAK,SAASD,GAAQF,CAAK,CAAC;CAClD;CACA,OAAOH;AACT"}
|