@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,25 @@
|
|
|
1
|
+
//#region src/canvas/renderNeeds.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Set(), r = (e) => {
|
|
4
|
+
e && n.add(e.fill ?? "solid");
|
|
5
|
+
}, i = (e) => {
|
|
6
|
+
for (let n of e) if (n.kind === "group") i(n.children);
|
|
7
|
+
else if (n.kind === "path") r(n.fill), r(n.stroke?.paint);
|
|
8
|
+
else if (n.kind === "text") for (let e of n.runs) {
|
|
9
|
+
let n = `${e.fontFamily}|${e.fontWeight}|${e.fontStyle}`;
|
|
10
|
+
t.has(n) || t.set(n, {
|
|
11
|
+
family: e.fontFamily,
|
|
12
|
+
weight: e.fontWeight,
|
|
13
|
+
style: e.fontStyle
|
|
14
|
+
}), r(e.fill), r(e.stroke?.paint);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
return i(e), {
|
|
18
|
+
fonts: [...t.values()],
|
|
19
|
+
paintKinds: [...n]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { e as renderNeeds };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=renderNeeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderNeeds.js","names":["renderNeeds","fonts","kinds","paint","p","walk","c","list","r","key","commands"],"sources":["../../src/canvas/renderNeeds.ts"],"sourcesContent":["import type { FillStyle } from '@weasel-js/paint';\nimport type { FontRequest } from '@weasel-js/font';\nimport type { DrawCommand } from '../renderer/DrawCommand';\n\n/** What drawing a command list loads on demand: the faces its text is set in\n * and the paint kinds its fills and strokes name. */\nexport interface RenderNeeds {\n /** Each `(family, weight, style)` a text run is set in, once, in the order\n * met. */\n fonts: FontRequest[];\n /** Each paint kind a fill or stroke names, once, in the order met —\n * registered ones included. */\n paintKinds: string[];\n}\n\n/**\n * The fonts and paint kinds `commands` draw with, read off the commands\n * themselves: text runs, path fills and strokes, run fills and strokes, and\n * everything under a group. What `warmRender({ render })` loads, and nothing\n * more. Images, sprites and shaders load nothing on demand, so they add\n * nothing.\n */\nexport function renderNeeds(commands: readonly DrawCommand[]): RenderNeeds {\n const fonts = new Map<string, FontRequest>();\n const kinds = new Set<string>();\n const paint = (p: FillStyle | null | undefined) => {\n if (p) kinds.add(p.fill ?? 'solid');\n };\n const walk = (list: readonly DrawCommand[]) => {\n for (const c of list) {\n if (c.kind === 'group') walk(c.children);\n else if (c.kind === 'path') {\n paint(c.fill);\n paint(c.stroke?.paint);\n } else if (c.kind === 'text') {\n for (const r of c.runs) {\n const key = `${r.fontFamily}|${r.fontWeight}|${r.fontStyle}`;\n if (!fonts.has(key)) fonts.set(key, { family: r.fontFamily, weight: r.fontWeight, style: r.fontStyle });\n paint(r.fill);\n paint(r.stroke?.paint);\n }\n }\n }\n };\n walk(commands);\n return { fonts: [...fonts.values()], paintKinds: [...kinds] };\n}\n"],"mappings":";AAsBA,SAAgBA,EAAY,GAA+C;CACzE,IAAMC,oBAAQ,IAAI,IAAyB,GACrCC,oBAAQ,IAAI,IAAY,GACxBC,KAAS,MAAoC;EACjD,AAAIC,KAAGF,EAAM,IAAIE,EAAE,QAAQ,OAAO;CACpC,GACMC,KAAQ,MAAiC;EAC7C,KAAK,IAAMC,KAAKC,GACd,IAAID,EAAE,SAAS,SAAS,EAAKA,EAAE,QAAQ;OAClC,IAAIA,EAAE,SAAS,QAElB,AADAH,EAAMG,EAAE,IAAI,GACZH,EAAMG,EAAE,QAAQ,KAAK;OAChB,IAAIA,EAAE,SAAS,QACpB,KAAK,IAAME,KAAKF,EAAE,MAAM;GACtB,IAAMG,IAAM,GAAGD,EAAE,WAAW,GAAGA,EAAE,WAAW,GAAGA,EAAE;GAGjD,AAFKP,EAAM,IAAIQ,CAAG,KAAGR,EAAM,IAAIQ,GAAK;IAAE,QAAQD,EAAE;IAAY,QAAQA,EAAE;IAAY,OAAOA,EAAE;GAAU,CAAC,GACtGL,EAAMK,EAAE,IAAI,GACZL,EAAMK,EAAE,QAAQ,KAAK;EACvB;CAGN;CAEA,OADAH,EAAKK,CAAQ,GACN;EAAE,OAAO,CAAC,GAAGT,EAAM,OAAO,CAAC;EAAG,YAAY,CAAC,GAAGC,CAAK;CAAE;AAC9D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { isPaintKindKnown as e, warmPaintKinds as t } from "../core/paintKinds.js";
|
|
2
|
+
import { WeaselRenderer as n } from "../renderer/WeaselRenderer.js";
|
|
3
|
+
import { viewToMat3 as r } from "../renderer/math/viewToMat3.js";
|
|
4
|
+
import { defaultDrawOne as i } from "./defaultDrawOne.js";
|
|
5
|
+
import { buildSceneViewCommands as a } from "./sceneViewRender.js";
|
|
6
|
+
import { renderNeeds as o } from "./renderNeeds.js";
|
|
7
|
+
import { warmFonts as s } from "@weasel-js/font";
|
|
8
|
+
//#region src/canvas/renderSceneToPixels.ts
|
|
9
|
+
function c(e) {
|
|
10
|
+
let { sourceRect: t, scale: n } = e;
|
|
11
|
+
for (let [e, r] of [
|
|
12
|
+
["sourceRect.width", t.width],
|
|
13
|
+
["sourceRect.height", t.height],
|
|
14
|
+
["scale.x", n.x],
|
|
15
|
+
["scale.y", n.y]
|
|
16
|
+
]) if (!Number.isFinite(r) || r <= 0) throw Error(`renderSceneToPixels: ${e} must be a positive finite number, got ${r}`);
|
|
17
|
+
for (let [e, n] of [["sourceRect.x", t.x], ["sourceRect.y", t.y]]) if (!Number.isFinite(n)) throw Error(`renderSceneToPixels: ${e} must be a finite number, got ${n}`);
|
|
18
|
+
let r = Math.max(1, Math.round(t.width * n.x)), o = Math.max(1, Math.round(t.height * n.y)), s = {
|
|
19
|
+
x: t.x,
|
|
20
|
+
y: t.y,
|
|
21
|
+
scale: {
|
|
22
|
+
x: n.x,
|
|
23
|
+
y: n.y
|
|
24
|
+
}
|
|
25
|
+
}, c = e.resolveImage, l = e.drawOne ?? ((e, t, n, r) => i(e, t, n, {
|
|
26
|
+
...r,
|
|
27
|
+
resolveImage: c
|
|
28
|
+
})), u = [];
|
|
29
|
+
return e.background !== void 0 && u.push({
|
|
30
|
+
kind: "path",
|
|
31
|
+
path: {
|
|
32
|
+
kind: "rect",
|
|
33
|
+
x: 0,
|
|
34
|
+
y: 0,
|
|
35
|
+
width: r,
|
|
36
|
+
height: o
|
|
37
|
+
},
|
|
38
|
+
fill: {
|
|
39
|
+
fill: "solid",
|
|
40
|
+
color: e.background
|
|
41
|
+
}
|
|
42
|
+
}), u.push(...a(e.scene, s, l, void 0, e.alphaFor, void 0, void 0, e.colorOverrides)), e.overlay && u.push(...e.overlay), {
|
|
43
|
+
width: r,
|
|
44
|
+
height: o,
|
|
45
|
+
view: s,
|
|
46
|
+
commands: u
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function l(e, t) {
|
|
50
|
+
if (typeof OffscreenCanvas < "u") return new OffscreenCanvas(e, t);
|
|
51
|
+
if (typeof document < "u") {
|
|
52
|
+
let n = document.createElement("canvas");
|
|
53
|
+
return n.width = e, n.height = t, n;
|
|
54
|
+
}
|
|
55
|
+
throw Error("renderSceneToPixels: no canvas source in this environment — supply `gl` or `createCanvas`");
|
|
56
|
+
}
|
|
57
|
+
function u(e, t, n) {
|
|
58
|
+
let r = t * 4, i = new Uint8ClampedArray(e.length);
|
|
59
|
+
for (let t = 0; t < n; t++) i.set(e.subarray((n - 1 - t) * r, (n - t) * r), t * r);
|
|
60
|
+
return i;
|
|
61
|
+
}
|
|
62
|
+
function d(e) {
|
|
63
|
+
for (let t = 0; t < e.length; t += 4) {
|
|
64
|
+
let n = e[t + 3];
|
|
65
|
+
if (n === 0 || n === 255) continue;
|
|
66
|
+
let r = 255 / n;
|
|
67
|
+
e[t] = e[t] * r, e[t + 1] = e[t + 1] * r, e[t + 2] = e[t + 2] * r;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function f(e = {}) {
|
|
71
|
+
if (e.gl && e.createCanvas) throw Error("raster session: `gl` and `createCanvas` are mutually exclusive");
|
|
72
|
+
let t = null, i = e.gl, a = null, o = !1;
|
|
73
|
+
function s(n, r) {
|
|
74
|
+
if (e.gl || (t ? (t.width < n && (t.width = n), t.height < r && (t.height = r)) : (t = (e.createCanvas ?? l)(n, r), t.width = n, t.height = r, i = t.getContext("webgl2", {
|
|
75
|
+
preserveDrawingBuffer: !0,
|
|
76
|
+
stencil: !0
|
|
77
|
+
}) ?? void 0)), !i || typeof i.enable != "function") throw Error("raster session: WebGL2 is unavailable — supply `gl` or a WebGL2-capable `createCanvas`");
|
|
78
|
+
if (p(i)) throw Error("raster session: the WebGL2 context is lost — dispose this session and open another");
|
|
79
|
+
return i;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
render(e) {
|
|
83
|
+
if (o) throw Error("raster session: render() on a disposed session");
|
|
84
|
+
let t = c(e), { width: i, height: l } = t, f = s(i, l), m = (e.flattenTolerancePx ?? .25) / Math.max(e.scale.x, e.scale.y);
|
|
85
|
+
if (a ? (a.resize({
|
|
86
|
+
width: i,
|
|
87
|
+
height: l,
|
|
88
|
+
dpr: 1
|
|
89
|
+
}), a.setFlattenTolerance(m)) : a = new n({
|
|
90
|
+
gl: f,
|
|
91
|
+
width: i,
|
|
92
|
+
height: l,
|
|
93
|
+
dpr: 1,
|
|
94
|
+
imageMinification: "mipmap",
|
|
95
|
+
flattenTolerance: m,
|
|
96
|
+
bakeBudget: Infinity
|
|
97
|
+
}), a.render(t.commands, r(t.view)), p(f)) throw Error("raster session: the WebGL2 context was lost during render");
|
|
98
|
+
let h = new Uint8Array(i * l * 4);
|
|
99
|
+
f.readPixels(0, 0, i, l, f.RGBA, f.UNSIGNED_BYTE, h);
|
|
100
|
+
let g = u(h, i, l);
|
|
101
|
+
return d(g), {
|
|
102
|
+
width: i,
|
|
103
|
+
height: l,
|
|
104
|
+
data: g
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
dispose() {
|
|
108
|
+
o || (o = !0, a?.dispose(), a = null, t = null, i = void 0);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function p(e) {
|
|
113
|
+
return typeof e.isContextLost == "function" && e.isContextLost() === !0;
|
|
114
|
+
}
|
|
115
|
+
function m(n = {}) {
|
|
116
|
+
let { families: r, paintKinds: i } = n;
|
|
117
|
+
if (n.render || n.commands) {
|
|
118
|
+
let t;
|
|
119
|
+
try {
|
|
120
|
+
t = n.render ? c(n.render).commands : [];
|
|
121
|
+
} catch (e) {
|
|
122
|
+
return Promise.reject(e);
|
|
123
|
+
}
|
|
124
|
+
let a = o([...t, ...n.commands ?? []]);
|
|
125
|
+
r ??= a.fonts, i ??= a.paintKinds.filter(e);
|
|
126
|
+
}
|
|
127
|
+
return Promise.all([s(r), t(i)]).then(() => void 0);
|
|
128
|
+
}
|
|
129
|
+
function h(e) {
|
|
130
|
+
let { gl: t, createCanvas: n, ...r } = e, i = f({
|
|
131
|
+
gl: t,
|
|
132
|
+
createCanvas: n
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
return i.render(r);
|
|
136
|
+
} finally {
|
|
137
|
+
i.dispose();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//#endregion
|
|
141
|
+
export { f as createRasterSession, c as planPixelRender, h as renderSceneToPixels, m as warmRender };
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=renderSceneToPixels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderSceneToPixels.js","names":["planPixelRender","args","label","v","sourceRect","scale","width","height","view","resolveImage","drawOne","defaultDrawOne","node","pose","ctx","commands","buildSceneViewCommands","defaultCreateCanvas","c","flipRows","rowBytes","out","raw","y","unpremultiply","i","data","a","inv","createRasterSession","options","canvas","gl","renderer","disposed","contextFor","isLost","plan","flattenTolerance","WeaselRenderer","viewToMat3","warmRender","opts","planned","err","needs","renderNeeds","isPaintKindKnown","warmFonts","families","warmPaintKinds","paintKinds","renderSceneToPixels","renderArgs","session"],"sources":["../../src/canvas/renderSceneToPixels.ts"],"sourcesContent":["/**\n * `renderSceneToPixels` — headless rasterization of a scene-space rect to\n * raw RGBA pixels at an explicit, per-axis scale.\n *\n * One renderer, two callers: this path drives the same WebGL2 pipeline\n * (`WeaselRenderer` + `buildSceneViewCommands`) as the on-screen view — it is\n * NOT a second renderer. Print, thumbnail, and export callers get the same\n * pixels the screen would produce at that scale.\n *\n * Environment contract:\n * - Density arrives exclusively via `scale` (output pixels per scene unit,\n * per axis — anisotropic values are first-class). This function never\n * reads `window.devicePixelRatio`.\n * - Rounding policy: output width = max(1, round(sourceRect.width × scale.x)),\n * height analogously. The scene-space rect is authoritative; the pixel\n * grid derives from it. When round() lands below rect × scale, the\n * rightmost/bottom sub-pixel band of scene content is cropped; when it\n * rounds up, that band is instead padded (the `background` fill, or\n * transparent, covers the pad).\n * - Context lifetime: each call opens a `RasterSession` — one\n * `WeaselRenderer` — and disposes it before returning, freeing every GL\n * object it created, caches included. Rendering in bulk, open one session\n * with `createRasterSession` and render through it: programs compile once\n * and bitmaps upload once for the whole batch, and `dispose()` frees them.\n * With a caller-supplied `gl`, the context itself is caller-owned: it is\n * never disposed here, and its drawing buffer must be at least\n * width × height pixels (the render targets the bottom-left region).\n * Auto-created canvases (`OffscreenCanvas` when available, else a detached\n * DOM canvas) are discarded with the session; a session grows its own\n * canvas to the largest render so far.\n * - Context loss: throws — a lost context cannot produce pixels, and the\n * silent-noop convention of the screen path would return all-zero bytes.\n * - Output: top-down row order, NON-premultiplied (\"straight\") RGBA. The GL\n * framebuffer is premultiplied (blendFunc ONE, ONE_MINUS_SRC_ALPHA) and\n * bottom-up; readback flips and unpremultiplies. Over an opaque\n * `background` both transforms are visually moot but still applied.\n * - Determinism: same context + same inputs → same bytes. Cross-driver /\n * cross-machine byte equality is NOT guaranteed (GL rasterization varies);\n * do not build golden-image tests on committed bytes.\n * - Image quality: image textures upload with mipmaps\n * (`imageMinification: 'mipmap'`) so minified bitmaps don't moiré, and\n * curve tessellation runs at an output-scale tolerance\n * (`flattenTolerancePx`, default 0.25 output px). A bitmap node's source\n * pixels are sampled exactly once, directly to the output grid.\n */\nimport { WeaselRenderer } from '../renderer/WeaselRenderer';\nimport { viewToMat3 } from '../renderer/math/viewToMat3';\nimport type { DrawCommand } from '../renderer/DrawCommand';\nimport type { View } from '../core/viewport/view';\nimport type { Node, Scene } from 'core/scene/types';\nimport { buildSceneViewCommands, type SceneViewDrawOne } from './sceneViewRender';\nimport type { ColorOverrideRegistry } from '../animation/colorRegistry';\nimport { defaultDrawOne } from './defaultDrawOne';\nimport { warmFonts, type FontRequest } from '@weasel-js/font';\nimport { isPaintKindKnown, warmPaintKinds } from '../core/paintKinds';\nimport { renderNeeds } from './renderNeeds';\n\n/** Plain RGBA raster — structurally `ImageData`-compatible ({ width, height,\n * data }), deliberately free of printer/dpi/physical-unit concepts. */\nexport interface RasterImage {\n width: number;\n height: number;\n /** Top-down, straight (non-premultiplied) RGBA, 4 bytes per pixel. */\n data: Uint8ClampedArray;\n}\n\n/** Minimal canvas contract for `createCanvas` injection: `OffscreenCanvas`,\n * an HTML canvas, or a test fake. */\nexport interface HeadlessCanvasLike {\n width: number;\n height: number;\n getContext(contextId: 'webgl2', options?: WebGLContextAttributes): unknown;\n}\n\n/** What to render, at what resolution, and with which quality settings. */\nexport interface RenderSceneToPixelsArgs<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** Scene-space rect to render (origin + size in scene units). Output pixel\n * dimensions follow from rect × scale (round, min 1 — see module doc). */\n sourceRect: { x: number; y: number; width: number; height: number };\n /** Output pixels per scene unit, per axis. Anisotropic values supported. */\n scale: { x: number; y: number };\n /** Per-node draw callback. Default: `defaultDrawOne` with `resolveImage`\n * merged into the `NodePaintCtx` the scene walk supplies. Custom `drawOne`\n * callers that still want resolver injection should call\n * `defaultDrawOne(node, pose, view, { ...ctx, resolveImage })` themselves —\n * dropping the walk's `ctx` drops derived geometry with it. */\n drawOne?: SceneViewDrawOne<TData, TLayer, TPose>;\n /** Bitmap resolver for image nodes — lets consumers reuse their own decode\n * caches. `undefined` results paint the deterministic grey placeholder\n * outline (see `NodePaintCtx.resolveImage`). */\n resolveImage?: (node: Node<TData, TLayer, TPose>) => ImageBitmap | undefined;\n /** Per-id alpha multiplier, mirroring `<SceneCanvas>`'s scene-slot\n * `alphaFor`. Pass the same function the on-screen canvas uses so an\n * export matches what the user is looking at. Defaults to `() => 1`. */\n alphaFor?: (id: string) => number;\n /** Animated vertex colors to paint, typically an animator's\n * `colorOverrides`, so an export shows the frame on screen. */\n colorOverrides?: ColorOverrideRegistry;\n /** Background fill (any CSS color accepted by the renderer). Default:\n * fully transparent. Passing a color is always valid. */\n background?: string;\n /** Caller-owned WebGL2 context to render with. Mutually exclusive with\n * `createCanvas`. Never disposed by this call. */\n gl?: WebGL2RenderingContext;\n /** One-shot canvas factory (DOM canvas, OffscreenCanvas, or test fake).\n * Mutually exclusive with `gl`. Default: `OffscreenCanvas` when\n * available, else `document.createElement('canvas')`. */\n createCanvas?: (widthPx: number, heightPx: number) => HeadlessCanvasLike;\n /** Max curve-flattening error in OUTPUT pixels. Default 0.25. Converted to\n * world units against the larger scale axis and passed to the renderer's\n * `flattenTolerance`. Explicitly passing 0.25 is always valid. */\n flattenTolerancePx?: number;\n /** Commands drawn over the scene in output-pixel space — origin at the\n * output's top-left, one unit per output pixel. Annotations, watermarks,\n * and `renderDebugSnapshot`'s overlay ride here. */\n overlay?: readonly DrawCommand[];\n}\n\n/** The result of planning a headless render: how big the output is, the view\n * that maps the source rect onto it, and the commands to draw. */\nexport interface PixelRenderPlan {\n width: number;\n height: number;\n view: View;\n commands: DrawCommand[];\n}\n\n/** Pure planning half of `renderSceneToPixels`: output dimensions, the\n * anisotropic `View`, and the full command list (background + view-wrapped\n * scene). Exported for tests and for callers targeting their own renderer. */\nexport function planPixelRender<TData, TLayer extends string, TPose>(\n args: Omit<RenderSceneToPixelsArgs<TData, TLayer, TPose>, 'gl' | 'createCanvas' | 'flattenTolerancePx'>,\n): PixelRenderPlan {\n const { sourceRect, scale } = args;\n for (const [label, v] of [\n ['sourceRect.width', sourceRect.width], ['sourceRect.height', sourceRect.height],\n ['scale.x', scale.x], ['scale.y', scale.y],\n ] as const) {\n if (!Number.isFinite(v) || v <= 0) {\n throw new Error(`renderSceneToPixels: ${label} must be a positive finite number, got ${v}`);\n }\n }\n for (const [label, v] of [\n ['sourceRect.x', sourceRect.x], ['sourceRect.y', sourceRect.y],\n ] as const) {\n if (!Number.isFinite(v)) {\n throw new Error(`renderSceneToPixels: ${label} must be a finite number, got ${v}`);\n }\n }\n const width = Math.max(1, Math.round(sourceRect.width * scale.x));\n const height = Math.max(1, Math.round(sourceRect.height * scale.y));\n const view: View = { x: sourceRect.x, y: sourceRect.y, scale: { x: scale.x, y: scale.y } };\n\n const resolveImage = args.resolveImage as ((n: Node<unknown, string, unknown>) => ImageBitmap | undefined) | undefined;\n const drawOne: SceneViewDrawOne<TData, TLayer, TPose> =\n args.drawOne ?? ((node, pose, view, ctx) => defaultDrawOne(node, pose, view, { ...ctx, resolveImage }));\n\n const commands: DrawCommand[] = [];\n if (args.background !== undefined) {\n // Screen-space (pre-view) fill so rounding can never leave uncovered\n // edge pixels.\n commands.push({\n kind: 'path',\n path: { kind: 'rect', x: 0, y: 0, width, height },\n fill: { fill: 'solid', color: args.background },\n });\n }\n commands.push(...buildSceneViewCommands(\n args.scene, view, drawOne, undefined, args.alphaFor, undefined, undefined, args.colorOverrides,\n ));\n if (args.overlay) commands.push(...args.overlay);\n return { width, height, view, commands };\n}\n\nfunction defaultCreateCanvas(width: number, height: number): HeadlessCanvasLike {\n if (typeof OffscreenCanvas !== 'undefined') {\n return new OffscreenCanvas(width, height);\n }\n if (typeof document !== 'undefined') {\n const c = document.createElement('canvas');\n c.width = width;\n c.height = height;\n return c;\n }\n throw new Error('renderSceneToPixels: no canvas source in this environment — supply `gl` or `createCanvas`');\n}\n\n/** Flip GL's bottom-up readback rows into top-down image order. */\nfunction flipRows(raw: Uint8Array, width: number, height: number): Uint8ClampedArray {\n const rowBytes = width * 4;\n const out = new Uint8ClampedArray(raw.length);\n for (let y = 0; y < height; y++) {\n out.set(raw.subarray((height - 1 - y) * rowBytes, (height - y) * rowBytes), y * rowBytes);\n }\n return out;\n}\n\n/** Convert premultiplied RGBA to straight RGBA in place. */\nfunction unpremultiply(data: Uint8ClampedArray): void {\n for (let i = 0; i < data.length; i += 4) {\n const a = data[i + 3];\n if (a === 0 || a === 255) continue;\n const inv = 255 / a;\n data[i] = data[i] * inv;\n data[i + 1] = data[i + 1] * inv;\n data[i + 2] = data[i + 2] * inv;\n }\n}\n\n/** Where a {@link RasterSession} draws. Pass `gl` or `createCanvas`, or\n * neither for the default canvas source. */\nexport interface RasterSessionOptions {\n /** Caller-owned WebGL2 context. The session never disposes it. Its drawing\n * buffer must be at least as large as every render the session does. */\n gl?: WebGL2RenderingContext;\n /** Canvas factory, called once, at the size of the first render. The\n * session grows the canvas when a later render needs more room and never\n * shrinks it. Default: `OffscreenCanvas` when available, else a detached\n * DOM canvas. */\n createCanvas?: (widthPx: number, heightPx: number) => HeadlessCanvasLike;\n}\n\n/** One render through a {@link RasterSession}: everything\n * `renderSceneToPixels` takes except where to draw. */\nexport type RasterRenderArgs<TData, TLayer extends string, TPose> =\n Omit<RenderSceneToPixelsArgs<TData, TLayer, TPose>, 'gl' | 'createCanvas'>;\n\n/** One renderer and its GPU caches, kept across any number of headless\n * renders. Scenes, source rects and scales may differ per render. */\nexport interface RasterSession {\n /** Same contract as `renderSceneToPixels`. Throws once disposed. */\n render<TData, TLayer extends string, TPose>(args: RasterRenderArgs<TData, TLayer, TPose>): RasterImage;\n /** Free every GL resource the session created — programs, geometry, and\n * the texture and mesh caches — and drop its own canvas. A caller-owned\n * context stays open. Idempotent. */\n dispose(): void;\n}\n\n/**\n * Open a raster session: one `WeaselRenderer` that many headless renders\n * share, for a consumer producing thumbnails or pages in bulk. Programs\n * compile once, and a bitmap or recurring mesh uploads once, rather than per\n * render. `renderSceneToPixels` is a session opened for one render.\n *\n * The renderer is created on the first render, so opening a session costs\n * nothing and fails nothing. Each render draws into the bottom-left\n * `width × height` of the buffer and reads that region back.\n */\nexport function createRasterSession(options: RasterSessionOptions = {}): RasterSession {\n if (options.gl && options.createCanvas) {\n throw new Error('raster session: `gl` and `createCanvas` are mutually exclusive');\n }\n let canvas: HeadlessCanvasLike | null = null;\n let gl: WebGL2RenderingContext | undefined = options.gl;\n let renderer: WeaselRenderer | null = null;\n let disposed = false;\n\n function contextFor(width: number, height: number): WebGL2RenderingContext {\n if (!options.gl) {\n if (!canvas) {\n canvas = (options.createCanvas ?? defaultCreateCanvas)(width, height);\n canvas.width = width;\n canvas.height = height;\n // Same context attributes as the screen path (Canvas.tsx).\n gl = (canvas.getContext('webgl2', { preserveDrawingBuffer: true, stencil: true }) as WebGL2RenderingContext | null) ?? undefined;\n } else {\n if (canvas.width < width) canvas.width = width;\n if (canvas.height < height) canvas.height = height;\n }\n }\n if (!gl || typeof (gl as Partial<WebGL2RenderingContext>).enable !== 'function') {\n throw new Error('raster session: WebGL2 is unavailable — supply `gl` or a WebGL2-capable `createCanvas`');\n }\n if (isLost(gl)) {\n throw new Error('raster session: the WebGL2 context is lost — dispose this session and open another');\n }\n return gl;\n }\n\n return {\n render(args) {\n if (disposed) throw new Error('raster session: render() on a disposed session');\n const plan = planPixelRender(args);\n const { width, height } = plan;\n const ctx = contextFor(width, height);\n const flattenTolerance = (args.flattenTolerancePx ?? 0.25) / Math.max(args.scale.x, args.scale.y);\n if (!renderer) {\n renderer = new WeaselRenderer({\n gl: ctx,\n width,\n height,\n dpr: 1,\n imageMinification: 'mipmap',\n flattenTolerance,\n // Dynamic canvas-SDF glyphs must all bake inline — this path is\n // synchronous with no notify-and-redraw, and print must be complete.\n bakeBudget: Infinity,\n });\n } else {\n renderer.resize({ width, height, dpr: 1 });\n renderer.setFlattenTolerance(flattenTolerance);\n }\n renderer.render(plan.commands, viewToMat3(plan.view));\n if (isLost(ctx)) {\n throw new Error('raster session: the WebGL2 context was lost during render');\n }\n const raw = new Uint8Array(width * height * 4);\n ctx.readPixels(0, 0, width, height, ctx.RGBA, ctx.UNSIGNED_BYTE, raw);\n const data = flipRows(raw, width, height);\n unpremultiply(data);\n return { width, height, data };\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n renderer?.dispose();\n renderer = null;\n canvas = null;\n gl = undefined;\n },\n };\n}\n\nfunction isLost(gl: WebGL2RenderingContext): boolean {\n return typeof gl.isContextLost === 'function' && gl.isContextLost() === true;\n}\n\n/** What {@link warmRender} loads. */\nexport interface WarmRenderOptions<TData = unknown, TLayer extends string = string, TPose = unknown> {\n /** The render about to happen, as `renderSceneToPixels` or\n * `RasterSession.render` will take it. Its commands are built the way the\n * render builds them, and only the faces and paint kinds they draw with\n * load. */\n render?: RasterRenderArgs<TData, TLayer, TPose>;\n /** Commands about to be drawn, read the same way as `render`'s. Both may be\n * given; what either needs loads. */\n commands?: readonly DrawCommand[];\n /** Fonts to load in place of the ones derived — family names or single\n * variants, as `warmFonts` takes them. */\n families?: readonly (string | FontRequest)[];\n /** Paint kinds to load in place of the ones derived, as `warmPaintKinds`\n * takes them. */\n paintKinds?: readonly string[];\n}\n\n/**\n * Load everything a synchronous render would otherwise draw as nothing — the\n * lazily registered font atlases and the paint kinds loaded on demand — so\n * that a `renderSceneToPixels` or `RasterSession.render` issued after it\n * resolves is complete.\n *\n * Pass the render (`{ render: args }`) or its commands, and only what they\n * draw with loads: each face their text is set in, through the same\n * resolution the renderer does, and each paint kind they name. A rejection\n * then means something this render needs failed to load. `families` and\n * `paintKinds` replace either derived list.\n *\n * With neither `render` nor `commands`, an omitted list loads everything\n * registered: every font family and every kind that has a loader — which\n * fails when any one of them does, and fetches what nothing draws.\n */\nexport function warmRender<TData, TLayer extends string, TPose>(\n opts: WarmRenderOptions<TData, TLayer, TPose> = {},\n): Promise<void> {\n let { families, paintKinds } = opts;\n if (opts.render || opts.commands) {\n let planned: DrawCommand[];\n try {\n planned = opts.render ? planPixelRender(opts.render).commands : [];\n } catch (err) {\n return Promise.reject(err);\n }\n const needs = renderNeeds([...planned, ...(opts.commands ?? [])]);\n families ??= needs.fonts;\n // A kind nothing registered draws nothing whether or not this waits.\n paintKinds ??= needs.paintKinds.filter(isPaintKindKnown);\n }\n return Promise.all([warmFonts(families), warmPaintKinds(paintKinds)]).then(() => undefined);\n}\n\n/**\n * Render part of a scene to raw pixels, with no canvas mounted and no React\n * involved — for export, thumbnails, print, and pixel-diff tests.\n *\n * Output size follows from the source rect and the requested scale, so\n * rendering the same region at a higher scale is a real resolution increase\n * rather than an upscale: curves are re-flattened and glyphs re-rasterized for\n * the output resolution.\n *\n * Synchronous, so nothing lands mid-render: a paint kind loaded on demand\n * (`mesh-gradient`, or one declared with `registerPaintKindLoader`) that has\n * not loaded yet draws nothing, and neither does text set in a font atlas\n * still fetching — one registered `{ lazy: true }` is not fetched until text\n * first asks for it. `await warmRender({ render: args })` first.\n *\n * Each call opens a {@link RasterSession} and disposes it before returning.\n * Rendering many scenes, open one with `createRasterSession` instead.\n */\nexport function renderSceneToPixels<TData, TLayer extends string, TPose>(\n args: RenderSceneToPixelsArgs<TData, TLayer, TPose>,\n): RasterImage {\n const { gl, createCanvas, ...renderArgs } = args;\n const session = createRasterSession({ gl, createCanvas });\n try {\n return session.render(renderArgs);\n } finally {\n session.dispose();\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { composeWorldPose as e, frameAtOrAbove as t } from "../core/scene/composeFrame.js";
|
|
2
|
+
import { definesFrame as n, effectivePose as r } from "../core/scene/effectivePose.js";
|
|
3
|
+
import { asNodeId as i } from "../core/scene/types.js";
|
|
4
|
+
import { poseDescriptorForNode as a, translatePoseViaDescriptor as o, visualBoundsViaDescriptor as s } from "../core/geometry/poseDescriptor.js";
|
|
5
|
+
import { AUTO_POSE_DESCRIPTOR as c } from "../interactions/actions/resize/autoPoseDescriptor.js";
|
|
6
|
+
import { fnFieldsOfNode as l } from "../core/scene/nodeFnFields.js";
|
|
7
|
+
import { applyOpsTo as u } from "../core/applyOps.js";
|
|
8
|
+
import { hitTestArea as d, hitTestLassoPolygon as f, regionPickOptions as p } from "./deps/hitTestArea.js";
|
|
9
|
+
import { useMemo as m } from "react";
|
|
10
|
+
//#region src/canvas/sceneAdapter.ts
|
|
11
|
+
var h = 0;
|
|
12
|
+
function g() {
|
|
13
|
+
return `n${(h++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
14
|
+
}
|
|
15
|
+
var _ = 0;
|
|
16
|
+
function v() {
|
|
17
|
+
return `paste-${(_++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
18
|
+
}
|
|
19
|
+
function y(e) {
|
|
20
|
+
return Array.isArray(e) ? [...e] : typeof e == "object" && e ? { ...e } : e;
|
|
21
|
+
}
|
|
22
|
+
function b(m, h = {}) {
|
|
23
|
+
let _ = () => {
|
|
24
|
+
let e = /* @__PURE__ */ new Set();
|
|
25
|
+
for (let t of m.layers) t.visible && e.add(t.id);
|
|
26
|
+
return e;
|
|
27
|
+
}, b = h.selection, x = b?.getSelection ?? b?.get ?? (() => []), S = b?.setSelection ?? b?.set ?? (() => {}), C = h.poseDescriptor ?? c, w = (e) => s(e, C), T = (e, t, n, r) => o(e, t, n, r === void 0 ? C : a(C, r)), E = h.poseComposition, D = E !== void 0 && E.closure !== "identity", O = E ? { poseComposition: E } : {}, k = (e) => e ? {
|
|
28
|
+
...O,
|
|
29
|
+
...p(e, void 0, void 0)
|
|
30
|
+
} : O;
|
|
31
|
+
if (D && h.cascadeContainerPose) throw Error("sceneToAdapter: poseComposition and cascadeContainerPose contradict each other. Under a composing strategy a child's pose is already relative to its parent, so the cascade would move every descendant twice. Drop cascadeContainerPose.");
|
|
32
|
+
let A = {
|
|
33
|
+
getNode(e) {
|
|
34
|
+
return m.get(i(e));
|
|
35
|
+
},
|
|
36
|
+
getNodes() {
|
|
37
|
+
let e = _(), t = [];
|
|
38
|
+
for (let n of m.renderOrderNodes()) e.has(n.layer) && t.push(n);
|
|
39
|
+
return t;
|
|
40
|
+
},
|
|
41
|
+
getPose(e) {
|
|
42
|
+
let t = i(e), n = m.get(t);
|
|
43
|
+
if (!n) throw Error(`sceneToAdapter: unknown node "${e}"`);
|
|
44
|
+
return r(m, n);
|
|
45
|
+
},
|
|
46
|
+
getParent(e) {
|
|
47
|
+
return m.get(i(e))?.parent ?? null;
|
|
48
|
+
},
|
|
49
|
+
definesFrame(e) {
|
|
50
|
+
let t = m.get(i(e));
|
|
51
|
+
return t === void 0 || n(t);
|
|
52
|
+
},
|
|
53
|
+
getWorldPose(t) {
|
|
54
|
+
return D ? e(A, t, E.compose) : A.getPose(t);
|
|
55
|
+
},
|
|
56
|
+
...D ? { composePose: E.compose } : {},
|
|
57
|
+
setPose(e, t) {
|
|
58
|
+
if (h.cascadeContainerPose) {
|
|
59
|
+
let n = m.get(i(e));
|
|
60
|
+
if (n && n.kind === "container") {
|
|
61
|
+
let r = a(C, n), o = r.getBounds(n.pose), s = r.getBounds(t), c = s.x - o.x, l = s.y - o.y;
|
|
62
|
+
if (c !== 0 || l !== 0) {
|
|
63
|
+
let n = [], r = (e) => {
|
|
64
|
+
for (let t of m.childrenOf(i(e))) n.push(t), r(t);
|
|
65
|
+
};
|
|
66
|
+
r(e), m.batch("move container", () => {
|
|
67
|
+
m.setPose(i(e), t);
|
|
68
|
+
for (let e of n) {
|
|
69
|
+
let t = m.get(i(e));
|
|
70
|
+
t && m.setPose(i(e), T(t.pose, c, l, t));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
m.setPose(i(e), t);
|
|
78
|
+
},
|
|
79
|
+
setParent(e, t) {
|
|
80
|
+
m.move(i(e), t === null ? null : i(t));
|
|
81
|
+
},
|
|
82
|
+
getChildren(e) {
|
|
83
|
+
return e === null ? [...m.roots] : [...m.childrenOf(i(e))];
|
|
84
|
+
},
|
|
85
|
+
setChildOrder(e, t) {
|
|
86
|
+
m.batch("Reorder", () => {
|
|
87
|
+
for (let n = 0; n < t.length; n++) (e === null ? m.roots : m.childrenOf(i(e)))[n] !== t[n] && m.reorder(i(t[n]), n);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
getLayers() {
|
|
91
|
+
return m.layers.map((e) => ({
|
|
92
|
+
id: e.id,
|
|
93
|
+
visible: e.visible,
|
|
94
|
+
parallax: e.parallax
|
|
95
|
+
}));
|
|
96
|
+
},
|
|
97
|
+
getLayout(e) {
|
|
98
|
+
let t = m.layoutOf(i(e));
|
|
99
|
+
return t !== null || !h.layouts ? t : typeof h.layouts == "function" ? h.layouts(e) : h.layouts[e] ?? null;
|
|
100
|
+
},
|
|
101
|
+
applyOps(e, t) {
|
|
102
|
+
t === void 0 ? u(this, e) : m.applyBatch(e, t, this);
|
|
103
|
+
},
|
|
104
|
+
insertNode(e, t) {
|
|
105
|
+
m.add({
|
|
106
|
+
kind: e.kind,
|
|
107
|
+
layer: e.layer,
|
|
108
|
+
pose: e.pose,
|
|
109
|
+
data: e.data,
|
|
110
|
+
id: e.id,
|
|
111
|
+
...t === void 0 ? {} : { index: t },
|
|
112
|
+
...e.parent === null ? {} : { parent: e.parent },
|
|
113
|
+
...e.dependsOn === void 0 ? {} : { dependsOn: e.dependsOn },
|
|
114
|
+
...l(e)
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
removeNode(e) {
|
|
118
|
+
m.remove(i(e));
|
|
119
|
+
},
|
|
120
|
+
setData(e, t) {
|
|
121
|
+
m.update(i(e), { data: t });
|
|
122
|
+
},
|
|
123
|
+
setLayout(e, t) {
|
|
124
|
+
m.setLayout(i(e), t);
|
|
125
|
+
},
|
|
126
|
+
getRemovalClosure(e) {
|
|
127
|
+
return [...m.removalClosure(e.map(i))];
|
|
128
|
+
},
|
|
129
|
+
getSelection: x,
|
|
130
|
+
setSelection: S,
|
|
131
|
+
hitTestArea(e, t) {
|
|
132
|
+
return d(m, e, k(t), C, { includeContainers: !0 });
|
|
133
|
+
},
|
|
134
|
+
hitTestLasso(e, t, n) {
|
|
135
|
+
return f(m, e, t, k(n), C, { includeContainers: !0 });
|
|
136
|
+
},
|
|
137
|
+
...h.commitInsert ? { commitInsert: (e) => {
|
|
138
|
+
let t = h.commitInsert(e);
|
|
139
|
+
if (!t) return null;
|
|
140
|
+
let n = h.insertLayer ?? "default";
|
|
141
|
+
return {
|
|
142
|
+
kind: "leaf",
|
|
143
|
+
id: i(t.id ?? g()),
|
|
144
|
+
layer: n,
|
|
145
|
+
pose: t.pose,
|
|
146
|
+
data: t.data,
|
|
147
|
+
parent: null
|
|
148
|
+
};
|
|
149
|
+
} } : {},
|
|
150
|
+
snapshotSelection(e) {
|
|
151
|
+
let n = new Set(e), r = /* @__PURE__ */ new Set(), a = [], o = (e, n) => {
|
|
152
|
+
if (!D) return e.pose;
|
|
153
|
+
if (n) return A.getWorldPose(e.id);
|
|
154
|
+
let i = t(A, e.parent);
|
|
155
|
+
return i !== null && r.has(i) ? e.pose : A.getWorldPose(e.id);
|
|
156
|
+
}, s = (e) => e.dependsOn === "children" && e.derivePose ? {
|
|
157
|
+
dependsOn: e.dependsOn,
|
|
158
|
+
derivePose: e.derivePose
|
|
159
|
+
} : {}, c = (e, t = !1) => {
|
|
160
|
+
if (r.has(e)) return;
|
|
161
|
+
let n = m.get(i(e));
|
|
162
|
+
if (n) {
|
|
163
|
+
if (r.add(e), n.kind === "container") {
|
|
164
|
+
a.push({
|
|
165
|
+
kind: "container",
|
|
166
|
+
id: n.id,
|
|
167
|
+
layer: n.layer,
|
|
168
|
+
parent: n.parent,
|
|
169
|
+
pose: y(o(n, t)),
|
|
170
|
+
data: y(n.data),
|
|
171
|
+
children: [...n.children],
|
|
172
|
+
...n.clipFromPose ? { clipFromPose: n.clipFromPose } : {},
|
|
173
|
+
...s(n)
|
|
174
|
+
});
|
|
175
|
+
for (let t of m.childrenOf(i(e))) c(t);
|
|
176
|
+
} else a.push({
|
|
177
|
+
kind: "leaf",
|
|
178
|
+
id: n.id,
|
|
179
|
+
layer: n.layer,
|
|
180
|
+
parent: n.parent,
|
|
181
|
+
pose: y(o(n, t)),
|
|
182
|
+
data: y(n.data)
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
for (let t of e) m.ancestorsOf(i(t)).some((e) => n.has(e)) || c(t, !0);
|
|
187
|
+
return { items: a };
|
|
188
|
+
},
|
|
189
|
+
commitPaste(e, t, r) {
|
|
190
|
+
let a = e.items;
|
|
191
|
+
if (a.length === 0) return [];
|
|
192
|
+
let o = /* @__PURE__ */ new Map();
|
|
193
|
+
for (let e of a) o.set(e.id, i(v()));
|
|
194
|
+
let s = (e) => e.parent === null || !o.has(e.parent), c = new Map(a.map((e) => [e.id, e])), l = (e) => {
|
|
195
|
+
if (!D) return !1;
|
|
196
|
+
let t = e.parent === null ? void 0 : c.get(e.parent);
|
|
197
|
+
for (; t !== void 0;) {
|
|
198
|
+
if (n(t)) return !0;
|
|
199
|
+
t = t.parent === null ? void 0 : c.get(t.parent);
|
|
200
|
+
}
|
|
201
|
+
return !1;
|
|
202
|
+
}, u = t.dx, d = t.dy;
|
|
203
|
+
if (r?.dropPoint) {
|
|
204
|
+
let e = Infinity, t = Infinity;
|
|
205
|
+
for (let n of a) {
|
|
206
|
+
if (!s(n)) continue;
|
|
207
|
+
let r = w(n.pose);
|
|
208
|
+
r.x < e && (e = r.x), r.y < t && (t = r.y);
|
|
209
|
+
}
|
|
210
|
+
Number.isFinite(e) && Number.isFinite(t) && (u = r.dropPoint.worldX - e, d = r.dropPoint.worldY - t);
|
|
211
|
+
}
|
|
212
|
+
let f = [];
|
|
213
|
+
for (let e of a) {
|
|
214
|
+
let t = {
|
|
215
|
+
id: o.get(e.id),
|
|
216
|
+
layer: e.layer,
|
|
217
|
+
parent: s(e) ? null : o.get(e.parent),
|
|
218
|
+
pose: l(e) ? y(e.pose) : T(y(e.pose), u, d),
|
|
219
|
+
data: y(e.data)
|
|
220
|
+
};
|
|
221
|
+
e.kind === "container" ? f.push({
|
|
222
|
+
...t,
|
|
223
|
+
kind: "container",
|
|
224
|
+
children: e.children.filter((e) => o.has(e)).map((e) => o.get(e)),
|
|
225
|
+
...e.clipFromPose ? { clipFromPose: e.clipFromPose } : {},
|
|
226
|
+
...e.dependsOn === "children" && e.derivePose ? {
|
|
227
|
+
dependsOn: e.dependsOn,
|
|
228
|
+
derivePose: e.derivePose
|
|
229
|
+
} : {}
|
|
230
|
+
}) : f.push({
|
|
231
|
+
...t,
|
|
232
|
+
kind: "leaf"
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return f;
|
|
236
|
+
},
|
|
237
|
+
getPasteOffset() {
|
|
238
|
+
return {
|
|
239
|
+
dx: 12,
|
|
240
|
+
dy: 12
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
return A;
|
|
245
|
+
}
|
|
246
|
+
function x(e, t = {}) {
|
|
247
|
+
let { selection: n, commitInsert: r, insertLayer: i, layouts: a, poseDescriptor: o, cascadeContainerPose: s, poseComposition: c } = t;
|
|
248
|
+
return m(() => b(e, {
|
|
249
|
+
selection: n,
|
|
250
|
+
commitInsert: r,
|
|
251
|
+
insertLayer: i,
|
|
252
|
+
layouts: a,
|
|
253
|
+
poseDescriptor: o,
|
|
254
|
+
cascadeContainerPose: s,
|
|
255
|
+
poseComposition: c
|
|
256
|
+
}), [
|
|
257
|
+
e,
|
|
258
|
+
n,
|
|
259
|
+
r,
|
|
260
|
+
i,
|
|
261
|
+
a,
|
|
262
|
+
o,
|
|
263
|
+
s,
|
|
264
|
+
c
|
|
265
|
+
]);
|
|
266
|
+
}
|
|
267
|
+
//#endregion
|
|
268
|
+
export { b as sceneToAdapter, x as useSceneAdapter };
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=sceneAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneAdapter.js","names":["adapterFallbackIdCounter","adapterFallbackId","pasteIdCounter","pasteNodeId","copyField","value","sceneToAdapter","visibleLayers","out","layer","scene","sel","options","getSelection","setSelection","d","AUTO_POSE_DESCRIPTOR","poseBounds","visualBoundsViaDescriptor","p","translate","translatePoseViaDescriptor","dx","dy","node","poseDescriptorForNode","composition","composes","pickOpts","pickOptsFor","view","regionPickOptions","adapter","asNodeId","id","visible","nid","effectivePose","n","definesFrame","composeWorldPose","g","before","after","pose","descIds","collect","cid","rootId","cn","parentId","i","ids","l","declared","label","applyOpsTo","ops","index","fnFieldsOfNode","layout","hitTestArea","rect","hitTestLassoPolygon","polygon","mode","created","bounds","idSet","taken","items","poseFor","isRoot","frame","frameAtOrAbove","derivation","capture","a","src","clipboard","idMap","item","byId","ridesPastedFrame","offset","ctx","minX","minY","b","base","c","useSceneAdapter","useMemo","selection","commitInsert","insertLayer","layouts","poseDescriptor","cascadeContainerPose","poseComposition"],"sources":["../../src/canvas/sceneAdapter.ts"],"sourcesContent":["/**\n * Synthesize a `<Canvas>`-compatible adapter from a `Scene` primitive.\n *\n * The Scene owns nodes/poses/parenting and auto-records ops on every mutation.\n * `<SceneCanvas>` calls `sceneToAdapter(scene)` and forwards the result to\n * `<Canvas>`'s `adapter` prop. Selection and hit-testing are not part of the\n * Scene model — Canvas's internal `useSelection` and pose-derived pickEvery\n * cover those.\n *\n * Pose semantics match the rest of the kit: `getPose` / `setPose` return /\n * write **local** coordinates (relative to parent). The Scene stores pose on\n * each node directly; world composition (when needed) is the renderer's job\n * via `composeWorldPose`, not the adapter's.\n */\nimport { useMemo } from 'react';\nimport type {\n AreaSelectAdapter,\n ClipboardSnapshot,\n InsertAdapter,\n LassoHitMode,\n LassoSelectAdapter,\n RegionPickView,\n LayerEnumerableAdapter,\n MoveAdapter,\n ResizeAdapter,\n RotateAdapter,\n} from 'core/adapters/types';\nimport type { LayoutStrategy } from '../layout/types';\nimport type { Op } from 'core/ops/types';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport { definesFrame, effectivePose } from 'core/scene/effectivePose';\nimport { fnFieldsOfNode } from 'core/scene/nodeFnFields';\nimport { asNodeId } from 'core/scene/types';\nimport { applyOpsTo } from 'core/applyOps';\nimport { hitTestArea, hitTestLassoPolygon, regionPickOptions } from 'canvas/deps/hitTestArea';\nimport type { ScenePickSourceOptions } from 'canvas/pickWalk';\nimport {\n poseDescriptorForNode,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n type PoseDescriptor,\n} from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport { composeWorldPose, frameAtOrAbove, type PoseComposition } from 'features/groups/composePose';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\n\n/** Minimal selection contract `sceneToAdapter` needs to wire `getSelection` /\n * `setSelection`. Matches `useSelection().adapterMethods` plus an imperative\n * read; pass `useSelection()` itself or `selection.adapterMethods`. */\nexport interface SceneAdapterSelection {\n get?(): string[];\n set?(ids: string[]): void;\n getSelection?(): string[];\n setSelection?(ids: string[]): void;\n}\n\n/** Sibling z-order surface used by reorder ops. Inlined here (rather than\n * pulled from `core/ops/reorder` to avoid import cycles); the `null` parent\n * channel addresses the root sibling list. */\n/** @internal */\ninterface ReorderAdapter {\n getChildren(parentId: string | null): string[];\n setChildOrder(parentId: string | null, ids: string[]): void;\n}\n\n/** Everything the interaction layer can ask of a scene, as one type: the\n * move, resize, rotate, selection, layer and reorder contracts combined.\n * `<SceneCanvas>` synthesizes one of these, which is why most consumers never\n * touch an adapter directly. */\nexport type SceneCanvasAdapter<TData, TLayer extends string, TPose> =\n & MoveAdapter<Node<TData, TLayer, TPose>, TPose>\n & ResizeAdapter<Node<TData, TLayer, TPose>, TPose>\n & RotateAdapter<Node<TData, TLayer, TPose>, TPose>\n & AreaSelectAdapter\n & LassoSelectAdapter\n & LayerEnumerableAdapter<TLayer>\n & ReorderAdapter\n & Partial<InsertAdapter<Node<TData, TLayer, TPose>>>\n // Tighten the parts that are optional on the underlying adapter contracts\n // but unconditionally provided by a scene-backed adapter. Anything that\n // routes scene mutations through this adapter (kit InsertOps, hierarchical\n // hooks like useNest, etc.) can rely on these being present.\n & {\n getParent(id: string): string | null;\n /** The node's pose with every ancestor's frame folded in. Equal to\n * `getPose` unless a `poseComposition` is configured. */\n getWorldPose(id: string): TPose;\n /** Whether `id`'s pose is a frame its children are expressed in — see\n * `definesFrame`. */\n definesFrame(id: string): boolean;\n /** Present only when a composing strategy is configured; the render\n * walk feature-detects it. */\n composePose?(parent: TPose, child: TPose): TPose;\n getSelection(): string[];\n setSelection(ids: string[]): void;\n insertNode(node: Node<TData, TLayer, TPose>, index?: number): void;\n removeNode(id: string): void;\n /** Replace a node's `data` — what a `setData` op writes through. */\n setData(id: string, data: TData): void;\n /** Swap a container's layout — what a `setLayout` op writes through. */\n setLayout(id: string, layout: LayoutStrategy<TPose> | string | null): void;\n getRemovalClosure(ids: readonly string[]): string[];\n applyOps(ops: Op[], label?: string): void;\n snapshotSelection(ids: string[]): ClipboardSnapshot;\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: { dropPoint?: { worldX: number; worldY: number } },\n ): Node<TData, TLayer, TPose>[];\n getPasteOffset(clipboard: ClipboardSnapshot): { dx: number; dy: number };\n };\n\n/** Optional extras for the synthesized adapter. Pass `commitInsert` to wire\n * the insert gesture into a Scene-owned canvas; the returned object becomes\n * a leaf on the layer named by `layer` (default `'default'`). */\nexport interface SceneToAdapterOptions<TData, TLayer extends string, TPose> {\n /** Factory for new objects. Returning `null` aborts the insert. */\n commitInsert?: (bounds: Bounds) => {\n pose: TPose;\n data: TData;\n id?: string;\n } | null;\n /** Layer to place inserted nodes on. Defaults to the trivial-form layer. */\n insertLayer?: TLayer;\n /** Selection source for `AreaSelectAdapter.getSelection` / `setSelection`.\n * Pass the result of `useSelection()` (or its `adapterMethods`). When\n * omitted, `getSelection` returns `[]` and `setSelection` is a noop —\n * fine for read-only or selection-less canvases, but the marquee gesture\n * won't update any external selection state. */\n selection?: SceneAdapterSelection;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n /** Layout strategies keyed by container node id, for containers whose\n * scene node declares none (`ContainerNode.layout` wins). `move` runs its\n * layout-aware pass on them; for inserts, deletes and resizes to reach\n * them too, install them with `useLayoutArrivals`. Pass either a static\n * map, or a `getLayout(id)` function for dynamic resolution. */\n layouts?:\n | Record<string, LayoutStrategy<TPose>>\n | ((containerId: string) => LayoutStrategy<TPose> | null);\n /** When true, `setPose` on a container translates every descendant by the\n * same delta, through the pose descriptor. Scene v1 stores absolute poses,\n * so without it children stay behind. */\n cascadeContainerPose?: boolean;\n /** How a child's stored pose folds into its parent's frame. Omit for the\n * absolute-pose model, where a parent contributes no transform. Supplying a\n * composing strategy makes a container's pose a **frame**: rotating the\n * container rotates its contents, and `setPose` on it must not also\n * translate them, so it cannot be combined with `cascadeContainerPose`. */\n poseComposition?: PoseComposition<TPose>;\n}\n\n// Fallback id generator for `commitInsert` when the consumer factory omits\n// `created.id`. Mirrors `scene.ts`'s `defaultGenerateId` shape; module-scoped\n// counter keeps ids unique across adapters in a session.\nlet adapterFallbackIdCounter = 0;\nfunction adapterFallbackId(): string {\n return `n${(adapterFallbackIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// Fresh ids for pasted nodes. The scene's own `generateId` isn't reachable\n// from the adapter, so `commitPaste` mints ids in the same shape as\n// `defaultGenerateId` with a `paste-` prefix (module-scoped counter + random\n// suffix keeps them unique across adapters and repeated pastes). Accepted\n// risk: the counter is per-tab, so cross-tab paste (the OS-clipboard path)\n// leans on the random suffix alone for uniqueness — a collision makes\n// `scene.add` throw rather than silently overwrite.\nlet pasteIdCounter = 0;\nfunction pasteNodeId(): string {\n return `paste-${(pasteIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n// Copy one node field (pose / data / children) so clipboard snapshots don't\n// alias live scene state. Spread-level copy per the clipboard contract:\n// mutating a snapshot's pose/data/children must not touch the scene.\nfunction copyField<T>(value: T): T {\n if (Array.isArray(value)) return [...value] as T;\n if (value !== null && typeof value === 'object') return { ...(value as object) } as T;\n return value;\n}\n\n/** Derive the adapter for a scene. Reads go straight to the scene; writes are\n * ops applied through its history, so anything done through the adapter is\n * undoable. */\nexport function sceneToAdapter<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n options: SceneToAdapterOptions<TData, TLayer, TPose> = {},\n): SceneCanvasAdapter<TData, TLayer, TPose> {\n const visibleLayers = (): Set<TLayer> => {\n const out = new Set<TLayer>();\n for (const layer of scene.layers) {\n if (layer.visible) out.add(layer.id);\n }\n return out;\n };\n\n const sel = options.selection;\n const getSelection = sel?.getSelection ?? sel?.get ?? (() => [] as string[]);\n const setSelection = sel?.setSelection ?? sel?.set ?? (() => {});\n const d = (options.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const poseBounds = (p: TPose): Bounds => visualBoundsViaDescriptor(p, d);\n const translate = (p: TPose, dx: number, dy: number, node?: unknown): TPose =>\n translatePoseViaDescriptor(\n p, dx, dy, node === undefined ? d : poseDescriptorForNode(d, node),\n );\n\n const composition = options.poseComposition;\n const composes = composition !== undefined && composition.closure !== 'identity';\n const pickOpts: ScenePickSourceOptions<unknown> = composition\n ? { poseComposition: composition as PoseComposition<unknown> }\n : {};\n // The asking view's layer gate and camera, over the adapter's own options.\n const pickOptsFor = (view: RegionPickView | undefined): ScenePickSourceOptions<unknown> =>\n (view ? { ...pickOpts, ...regionPickOptions(view, undefined, undefined) } : pickOpts);\n if (composes && options.cascadeContainerPose) {\n throw new Error(\n 'sceneToAdapter: poseComposition and cascadeContainerPose contradict each other. ' +\n 'Under a composing strategy a child\\'s pose is already relative to its parent, so ' +\n 'the cascade would move every descendant twice. Drop cascadeContainerPose.',\n );\n }\n\n const adapter: SceneCanvasAdapter<TData, TLayer, TPose> = {\n getNode(id) {\n return scene.get(asNodeId(id));\n },\n getNodes() {\n const visible = visibleLayers();\n const out: Node<TData, TLayer, TPose>[] = [];\n for (const n of scene.renderOrderNodes()) {\n if (visible.has(n.layer)) out.push(n);\n }\n return out;\n },\n getPose(id) {\n const nid = asNodeId(id);\n const n = scene.get(nid);\n if (!n) throw new Error(`sceneToAdapter: unknown node \"${id}\"`);\n return effectivePose(scene, n);\n },\n getParent(id) {\n const n = scene.get(asNodeId(id));\n return n?.parent ?? null;\n },\n definesFrame(id) {\n const n = scene.get(asNodeId(id));\n return n === undefined || definesFrame(n);\n },\n getWorldPose(id) {\n if (!composes) return adapter.getPose(id);\n return composeWorldPose(adapter, id, composition!.compose);\n },\n // Only present when it would do something: the render walk skips the fold\n // entirely when this is absent, which is the absolute-pose path.\n ...(composes ? { composePose: composition!.compose } : {}),\n setPose(id, pose) {\n // Container cascade (opt-in): under scene v1's absolute-pose semantics,\n // moving a container needs to translate every descendant by the same\n // delta so children visually stay attached. The whole cascade lands as\n // one scene.batch so undo collapses to a single step.\n if (options.cascadeContainerPose) {\n const node = scene.get(asNodeId(id));\n if (node && node.kind === 'container') {\n const g = poseDescriptorForNode(d, node);\n const before = g.getBounds(node.pose);\n const after = g.getBounds(pose);\n const dx = after.x - before.x;\n const dy = after.y - before.y;\n if (dx !== 0 || dy !== 0) {\n const descIds: string[] = [];\n const collect = (rootId: string): void => {\n for (const cid of scene.childrenOf(asNodeId(rootId))) {\n descIds.push(cid);\n collect(cid);\n }\n };\n collect(id);\n scene.batch('move container', () => {\n scene.setPose(asNodeId(id), pose);\n for (const cid of descIds) {\n const cn = scene.get(asNodeId(cid));\n if (!cn) continue;\n scene.setPose(asNodeId(cid), translate(cn.pose, dx, dy, cn));\n }\n });\n return;\n }\n }\n }\n scene.setPose(asNodeId(id), pose);\n },\n setParent(id, parentId) {\n scene.move(asNodeId(id), parentId === null ? null : asNodeId(parentId));\n },\n getChildren(id) {\n // Reorder ops call this with parentId === null to mean \"root siblings.\"\n // The kit's existing callers always pass a string, so this widening is\n // additive — falls through to scene.childrenOf for the typed path and\n // returns scene.roots for the null path.\n if (id === null) return [...scene.roots];\n return [...scene.childrenOf(asNodeId(id))];\n },\n setChildOrder(parentId, ids) {\n // Batched reorder: each scene.reorder call is its own kit:move log\n // entry, but scene.batch wraps them into one undo unit + one notify.\n scene.batch('Reorder', () => {\n for (let i = 0; i < ids.length; i++) {\n // Skip ids that are already in the target slot to avoid useless\n // log entries.\n const current = parentId === null\n ? scene.roots\n : scene.childrenOf(asNodeId(parentId));\n if (current[i] === ids[i]) continue;\n scene.reorder(asNodeId(ids[i]), i);\n }\n });\n },\n getLayers() {\n return scene.layers.map((l) => ({ id: l.id, visible: l.visible, parallax: l.parallax }));\n },\n getLayout(id) {\n const declared = scene.layoutOf(asNodeId(id));\n if (declared !== null || !options.layouts) return declared;\n return typeof options.layouts === 'function'\n ? options.layouts(id)\n : options.layouts[id] ?? null;\n },\n // Unified applyOps: when a label is supplied the ops are wrapped in a\n // batch checkpoint (history-aware path used by Move/Resize/Rotate/Insert/\n // Delete tools). When a journal is active (via scene's getActiveJournal\n // option), scene.applyBatch routes to the journal instead of recording a\n // new parent-history entry. Without a label the ops are applied transiently\n // via applyOpsTo (AreaSelectAdapter contract — no checkpoint).\n applyOps(ops: Op[], label?: string) {\n if (label !== undefined) {\n scene.applyBatch(ops, label, this);\n } else {\n applyOpsTo(this, ops);\n }\n },\n // Node-mutation surface used by kit InsertOps / DeleteOps (e.g.\n // useNest wrapping the selection in a new container node, or its\n // inverse). Re-adds via the full structural spec so the round-trip\n // survives undo/redo; removes by id.\n insertNode(node: Node<TData, TLayer, TPose>, index?: number) {\n scene.add({\n kind: node.kind,\n layer: node.layer,\n pose: node.pose,\n data: node.data,\n id: node.id,\n ...(index !== undefined ? { index } : {}),\n ...(node.parent !== null ? { parent: node.parent } : {}),\n // Derivation travels with the node, or undo of a delete brings an\n // edge back as a static path that never follows its endpoints again.\n ...(node.dependsOn !== undefined ? { dependsOn: node.dependsOn } : {}),\n ...fnFieldsOfNode(node),\n });\n },\n removeNode(id: string) {\n scene.remove(asNodeId(id));\n },\n setData(id: string, data: TData) {\n scene.update(asNodeId(id), { data });\n },\n setLayout(id: string, layout: LayoutStrategy<TPose> | string | null) {\n scene.setLayout(asNodeId(id), layout);\n },\n getRemovalClosure(ids: readonly string[]): string[] {\n return [...scene.removalClosure(ids.map(asNodeId))];\n },\n // AreaSelectAdapter surface — included unconditionally so plain\n // `useSelectTool(sceneToAdapter(scene, { selection }))` Just Works for the\n // marquee gesture. `applyOps` (above) dispatches transiently when called\n // without a label, matching the AreaSelectAdapter contract.\n getSelection,\n setSelection,\n // The live marquee's and lasso's own hit-tests. Containers come back:\n // this adapter's consumer has nothing to fold children into them.\n hitTestArea(rect: Bounds, view?: RegionPickView) {\n return hitTestArea(\n scene as unknown as Scene<unknown, string, unknown>,\n rect,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n hitTestLasso(polygon, mode: LassoHitMode, view?: RegionPickView) {\n return hitTestLassoPolygon(\n scene as unknown as Scene<unknown, string, unknown>,\n polygon,\n mode,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n // commitInsert (gesture-time leaf insert) is opt-in: present only when\n // `options.commitInsert` is. The full insertNode/removeNode mutators\n // above are always present so kit-side InsertOp / DeleteOp round-trip\n // through scene.add / scene.remove regardless.\n //\n // Contract: this is a pure factory — it constructs a Node spec but does\n // NOT touch the scene. `useInsert`'s onEnd dispatches an `InsertOp`\n // whose apply() calls `adapter.insertNode` → `scene.add`, which is the\n // sole insertion path. Calling `scene.add` here too would double-insert,\n // and the second add throws on id collision (silently dropping the\n // gesture's pointer-up cleanup and breaking the next drag).\n ...(options.commitInsert\n ? {\n commitInsert: (bounds: { x: number; y: number; width: number; height: number }) => {\n const created = options.commitInsert!(bounds);\n if (!created) return null;\n const layer = (options.insertLayer ?? ('default' as TLayer));\n const id = asNodeId(created.id ?? adapterFallbackId());\n return {\n kind: 'leaf',\n id,\n layer,\n pose: created.pose,\n data: created.data,\n parent: null,\n } as Node<TData, TLayer, TPose>;\n },\n }\n : {}),\n // Clipboard seam (`useClipboardOps` / the paste ingestion path).\n //\n // `snapshotSelection` captures adapter-shaped node copies; `commitPaste`\n // is a pure factory like `commitInsert` above — it mints fresh nodes but\n // NEVER touches the scene. Insertion happens via the hook's InsertOps\n // (one per created node, parents before children), which is what makes a\n // whole paste a single undo entry.\n snapshotSelection(ids: string[]): ClipboardSnapshot {\n const idSet = new Set(ids);\n const taken = new Set<string>();\n const items: Node<TData, TLayer, TPose>[] = [];\n // DFS from one snapshot root: push the node, then its subtree —\n // parents-before-children, so paste can re-insert in array order.\n // A stored pose is relative to its frame, and a node whose frame is not\n // copied with it lands somewhere else entirely on paste. Capture those in\n // world coordinates: every root, and under an envelope root, the nodes\n // sharing the frame the root left behind.\n const poseFor = (n: Node<TData, TLayer, TPose>, isRoot: boolean): TPose => {\n if (!composes) return n.pose;\n if (isRoot) return adapter.getWorldPose(n.id);\n const frame = frameAtOrAbove(adapter, n.parent);\n return frame !== null && taken.has(frame) ? n.pose : adapter.getWorldPose(n.id);\n };\n // Only a derivation over `'children'` survives the copy: an id list\n // would still name the originals.\n const derivation = (n: Node<TData, TLayer, TPose>) =>\n n.dependsOn === 'children' && n.derivePose\n ? { dependsOn: n.dependsOn, derivePose: n.derivePose }\n : {};\n\n const capture = (id: string, isRoot = false): void => {\n if (taken.has(id)) return;\n const n = scene.get(asNodeId(id));\n if (!n) return;\n taken.add(id);\n if (n.kind === 'container') {\n items.push({\n kind: 'container',\n id: n.id,\n layer: n.layer,\n parent: n.parent,\n pose: copyField(poseFor(n, isRoot)),\n data: copyField(n.data),\n children: [...n.children],\n ...(n.clipFromPose ? { clipFromPose: n.clipFromPose } : {}),\n ...derivation(n),\n });\n for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);\n } else {\n items.push({\n kind: 'leaf',\n id: n.id,\n layer: n.layer,\n parent: n.parent,\n pose: copyField(poseFor(n, isRoot)),\n data: copyField(n.data),\n });\n }\n };\n for (const id of ids) {\n // Dedupe: an id whose ancestor is also selected is already covered\n // by that ancestor's subtree walk.\n if (scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a))) continue;\n capture(id, true);\n }\n return { items };\n },\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: { dropPoint?: { worldX: number; worldY: number } },\n ): Node<TData, TLayer, TPose>[] {\n // Snapshot items are adapter-shaped node copies: what snapshotSelection\n // captures, and what commitPaste itself returns (`useClipboardOps`\n // feeds `created` back in as the next cascade source).\n const src = clipboard.items as Node<TData, TLayer, TPose>[];\n if (src.length === 0) return [];\n const idMap = new Map<string, NodeId>();\n for (const item of src) idMap.set(item.id, asNodeId(pasteNodeId()));\n // Items whose captured parent isn't part of the snapshot become roots\n // of the pasted cluster.\n const isRoot = (item: Node<TData, TLayer, TPose>): boolean =>\n item.parent === null || !idMap.has(item.parent);\n // Under a composing strategy a node inside a pasted frame rides it, and\n // offsetting it as well would move it twice.\n const byId = new Map(src.map((item) => [item.id, item]));\n const ridesPastedFrame = (item: Node<TData, TLayer, TPose>): boolean => {\n if (!composes) return false;\n let p = item.parent === null ? undefined : byId.get(item.parent);\n while (p !== undefined) {\n if (definesFrame(p)) return true;\n p = p.parent === null ? undefined : byId.get(p.parent);\n }\n return false;\n };\n // Scene v1 poses are absolute (see the cascade notes above), so the\n // delta applies to EVERY pasted node — the cluster translates rigidly,\n // descendants staying attached to their parents.\n let dx = offset.dx;\n let dy = offset.dy;\n if (ctx?.dropPoint) {\n // Drop-point policy: land the cluster origin (min corner of the root\n // items' bounds) on the drop point; `offset` is ignored.\n let minX = Infinity;\n let minY = Infinity;\n for (const item of src) {\n if (!isRoot(item)) continue;\n const b = poseBounds(item.pose);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n }\n if (Number.isFinite(minX) && Number.isFinite(minY)) {\n dx = ctx.dropPoint.worldX - minX;\n dy = ctx.dropPoint.worldY - minY;\n }\n }\n const out: Node<TData, TLayer, TPose>[] = [];\n for (const item of src) {\n const base = {\n id: idMap.get(item.id)!,\n layer: item.layer,\n parent: isRoot(item) ? null : idMap.get(item.parent as string)!,\n pose: ridesPastedFrame(item) ? copyField(item.pose) : translate(copyField(item.pose), dx, dy),\n data: copyField(item.data),\n };\n if (item.kind === 'container') {\n out.push({\n ...base,\n kind: 'container',\n children: item.children.filter((c) => idMap.has(c)).map((c) => idMap.get(c)!),\n ...(item.clipFromPose ? { clipFromPose: item.clipFromPose } : {}),\n ...(item.dependsOn === 'children' && item.derivePose\n ? { dependsOn: item.dependsOn, derivePose: item.derivePose }\n : {}),\n });\n } else {\n out.push({ ...base, kind: 'leaf' });\n }\n }\n // `src` is parents-before-children (snapshotSelection's DFS order),\n // and this loop preserves it — children re-attach to freshly-inserted\n // parents when the hook's InsertOps apply in order.\n return out;\n },\n // Constant cascade: the hook re-snapshots the just-created items, so\n // repeated pastes stack +12/+12 each time.\n getPasteOffset(): { dx: number; dy: number } {\n return { dx: 12, dy: 12 };\n },\n };\n\n return adapter;\n}\n\n/**\n * React-hook wrapper around `sceneToAdapter`. Memoizes on every option, so\n * the adapter keeps its identity across renders unless one of them changes.\n */\nexport function useSceneAdapter<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n options: SceneToAdapterOptions<TData, TLayer, TPose> = {},\n): SceneCanvasAdapter<TData, TLayer, TPose> {\n const {\n selection, commitInsert, insertLayer, layouts, poseDescriptor, cascadeContainerPose, poseComposition,\n } = options;\n return useMemo(\n () => sceneToAdapter(scene, {\n selection, commitInsert, insertLayer, layouts, poseDescriptor, cascadeContainerPose, poseComposition,\n }),\n [scene, selection, commitInsert, insertLayer, layouts, poseDescriptor, cascadeContainerPose, poseComposition],\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { isLayerVisible as e } from "../core/layers/render.js";
|
|
2
|
+
//#region src/canvas/sceneLayerPaint.ts
|
|
3
|
+
function t(e) {
|
|
4
|
+
return `scene:${e}`;
|
|
5
|
+
}
|
|
6
|
+
function n(t, n) {
|
|
7
|
+
let r = n.layers ? n.layers(t) : t, i = n.layerOrder, a = i ? i.map((e) => r.find((t) => t.id === e)).filter((e) => e !== void 0) : r, o = n.layerVisibility ?? {};
|
|
8
|
+
return a.filter((t) => e(t, o));
|
|
9
|
+
}
|
|
10
|
+
function r() {
|
|
11
|
+
let e = null;
|
|
12
|
+
return (r, i) => {
|
|
13
|
+
let a = [
|
|
14
|
+
r,
|
|
15
|
+
i.layers,
|
|
16
|
+
i.layerVisibility,
|
|
17
|
+
i.layerOrder
|
|
18
|
+
];
|
|
19
|
+
if (e && e.inputs.every((e, t) => e === a[t])) return e.gate;
|
|
20
|
+
let o = new Map(r.map((e) => [e.id, e])), s = new Set(n(r, i)), c = (e) => {
|
|
21
|
+
let n = o.get(t(e)) ?? o.get("scene");
|
|
22
|
+
return n === void 0 || s.has(n);
|
|
23
|
+
};
|
|
24
|
+
return e = {
|
|
25
|
+
inputs: a,
|
|
26
|
+
gate: c
|
|
27
|
+
}, c;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function i(e, n) {
|
|
31
|
+
let { layerVisibility: r, layerOrder: i } = n;
|
|
32
|
+
return r === void 0 && i === void 0 ? e : (i ? i.map((n) => e.find((e) => t(e.id) === n)).filter((e) => e !== void 0) : e).filter((e) => r?.[t(e.id)] !== !1);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { r as createSceneLayerGate, n as paintedLayers, i as paintedSceneLayers, t as sceneLayerKey };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=sceneLayerPaint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneLayerPaint.js","names":["sceneLayerKey","layerId","paintedLayers","narrowed","view","surface","order","sequence","l","id","visibility","isLayerVisible","createSceneLayerGate","last","inputs","v","i","byId","drawn","gate","carrier","paintedSceneLayers","layerVisibility","layerOrder","layers","key"],"sources":["../../src/canvas/sceneLayerPaint.ts"],"sourcesContent":["/**\n * Which scene layers a view paints.\n *\n * A view's `layerVisibility` / `layerOrder` name render layers, and `<Canvas>`\n * paints a scene as one render layer per scene layer, keyed `scene:<layerId>`.\n * Picking, marquee and select-all ask about scene layers, so this is where one\n * namespace is read in terms of the other.\n */\nimport { isLayerVisible, type RenderLayer } from 'core/layers/render';\n\n/** The render-layer id a scene layer paints under. */\nexport function sceneLayerKey(layerId: string): string {\n return `scene:${layerId}`;\n}\n\n/** Per-view layer settings, in `<Canvas>`'s vocabulary. */\nexport interface ViewLayerPaint {\n /** Narrows the surface's stack before the other two apply. */\n layers?: (surface: readonly RenderLayer<unknown>[]) => readonly RenderLayer<unknown>[];\n layerVisibility?: Record<string, boolean>;\n layerOrder?: readonly string[];\n}\n\n/** The layers a view draws, in the order it draws them — the two gates\n * `drawLayers` applies, over whatever `layers` narrowed to. */\nexport function paintedLayers(\n surface: readonly RenderLayer<unknown>[],\n view: ViewLayerPaint,\n): readonly RenderLayer<unknown>[] {\n const narrowed = view.layers ? view.layers(surface) : surface;\n const order = view.layerOrder;\n const sequence = order\n ? order\n .map((id) => narrowed.find((l) => l.id === id))\n .filter((l): l is RenderLayer<unknown> => l !== undefined)\n : narrowed;\n const visibility = view.layerVisibility ?? {};\n return sequence.filter((l) => isLayerVisible(l, visibility));\n}\n\n/**\n * A gate answering \"does this scene layer reach the screen in this view\",\n * rebuilt only when the surface's stack or the view's settings change — it is\n * asked once per pick candidate.\n *\n * A scene layer is painted when the render layer carrying it is: its own\n * `scene:<id>`, or the bundled `scene` layer an adapter without layers gets.\n * A surface carrying neither paints the scene some other way, which is not\n * this gate's to judge, so it passes.\n */\nexport function createSceneLayerGate(): (\n surface: readonly RenderLayer<unknown>[],\n view: ViewLayerPaint,\n) => (layerId: string) => boolean {\n let last: { inputs: readonly unknown[]; gate: (layerId: string) => boolean } | null = null;\n return (surface, view) => {\n const inputs = [surface, view.layers, view.layerVisibility, view.layerOrder];\n if (last && last.inputs.every((v, i) => v === inputs[i])) return last.gate;\n const byId = new Map(surface.map((l) => [l.id, l]));\n const drawn = new Set(paintedLayers(surface, view));\n const gate = (layerId: string): boolean => {\n const carrier = byId.get(sceneLayerKey(layerId)) ?? byId.get('scene');\n return carrier === undefined || drawn.has(carrier);\n };\n last = { inputs, gate };\n return gate;\n };\n}\n\n/** Scene layers in the order a view paints them, for a view that walks the\n * scene itself rather than a render-layer stack. Keyed as `<SceneCanvas>`\n * keys them, so one map serves both. */\nexport function paintedSceneLayers<T extends { id: string }>(\n layers: readonly T[],\n view: Pick<ViewLayerPaint, 'layerVisibility' | 'layerOrder'>,\n): readonly T[] {\n const { layerVisibility, layerOrder } = view;\n if (layerVisibility === undefined && layerOrder === undefined) return layers;\n const sequence = layerOrder\n ? layerOrder\n .map((key) => layers.find((l) => sceneLayerKey(l.id) === key))\n .filter((l): l is T => l !== undefined)\n : layers;\n return sequence.filter((l) => layerVisibility?.[sceneLayerKey(l.id)] !== false);\n}\n"],"mappings":";;AAWA,SAAgBA,EAAc,GAAyB;CACrD,OAAO,SAASC;AAClB;AAYA,SAAgBC,EACd,GACA,GACiC;CACjC,IAAMC,IAAWC,EAAK,SAASA,EAAK,OAAOC,CAAO,IAAIA,GAChDC,IAAQF,EAAK,YACbG,IAAWD,IACbA,EACC,KAAK,MAAOH,EAAS,MAAM,MAAMK,EAAE,OAAOC,CAAE,CAAC,CAAC,CAC9C,QAAQ,MAAiCD,MAAM,KAAA,CAAS,IACzDL,GACEO,IAAaN,EAAK,mBAAmB,CAAC;CAC5C,OAAOG,EAAS,QAAQ,MAAMI,EAAeH,GAAGE,CAAU,CAAC;AAC7D;AAYA,SAAgBE,IAGkB;CAChC,IAAIC,IAAkF;CACtF,QAAQ,GAAS,MAAS;EACxB,IAAMC,IAAS;GAACT;GAASD,EAAK;GAAQA,EAAK;GAAiBA,EAAK;EAAU;EAC3E,IAAIS,KAAQA,EAAK,OAAO,OAAO,GAAG,MAAME,MAAMD,EAAOE,EAAE,GAAG,OAAOH,EAAK;EACtE,IAAMI,IAAO,IAAI,IAAIZ,EAAQ,KAAK,MAAM,CAACG,EAAE,IAAIA,CAAC,CAAC,CAAC,GAC5CU,IAAQ,IAAI,IAAIhB,EAAcG,GAASD,CAAI,CAAC,GAC5Ce,KAAQ,MAA6B;GACzC,IAAMC,IAAUH,EAAK,IAAIjB,EAAcC,CAAO,CAAC,KAAKgB,EAAK,IAAI,OAAO;GACpE,OAAOG,MAAY,KAAA,KAAaF,EAAM,IAAIE,CAAO;EACnD;EAEA,OADA,IAAO;GAAE;GAAQ;EAAK,GACfD;CACT;AACF;AAKA,SAAgBE,EACd,GACA,GACc;CACd,IAAM,EAAE,oBAAiB,kBAAejB;CAOxC,OANIkB,MAAoB,KAAA,KAAaC,MAAe,KAAA,IAAkBC,KACrDD,IACbA,EACC,KAAK,MAAQC,EAAO,MAAM,MAAMxB,EAAcQ,EAAE,EAAE,MAAMiB,CAAG,CAAC,CAAC,CAC7D,QAAQ,MAAcjB,MAAM,KAAA,CAAS,IACtCgB,EAAA,CACY,QAAQ,MAAMF,IAAkBtB,EAAcQ,EAAE,EAAE,OAAO,EAAK;AAChF"}
|