@weasel-js/core 1.9.2 → 1.9.4
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 +393 -0
- package/README.md +2 -2
- package/dist/WeaselProvider.js +5 -5
- package/dist/affordances/composeAffordanceLayer.js +10 -20
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/cornerResize.js +25 -17
- package/dist/affordances/cornerResize.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +27 -20
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/rotationHandle.js +18 -18
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/behaviors/momentum.js +93 -55
- package/dist/animation/behaviors/momentum.js.map +1 -1
- package/dist/animation/loop.js +10 -12
- package/dist/animation/loop.js.map +1 -1
- package/dist/animation/reflow.js +8 -8
- package/dist/animation/reflow.js.map +1 -1
- package/dist/animation/stagger.js +64 -56
- package/dist/animation/stagger.js.map +1 -1
- package/dist/animation/timeline/booking.js +62 -54
- package/dist/animation/timeline/booking.js.map +1 -1
- package/dist/animation/timeline/createTimeline.js +85 -76
- package/dist/animation/timeline/createTimeline.js.map +1 -1
- package/dist/animation/timeline/sampleTrack.js +13 -5
- package/dist/animation/timeline/sampleTrack.js.map +1 -1
- package/dist/animation/useAnimator.js +45 -35
- package/dist/animation/useAnimator.js.map +1 -1
- package/dist/animation/wrappers/animateLifecycle.js +31 -24
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
- package/dist/animation/wrappers/animateOnSetPose.js +28 -26
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
- package/dist/animation/wrappers/instantPose.js +13 -0
- package/dist/animation/wrappers/instantPose.js.map +1 -0
- package/dist/{poseDescriptor-D-OH-tu5.d.ts → autoPoseDescriptor-Ct7yqivU.d.ts} +28 -3
- package/dist/barrel/chrome.js +16 -0
- package/dist/barrel/input.js +19 -0
- package/dist/barrel/interactions.js +42 -0
- package/dist/barrel/paint.js +18 -0
- package/dist/barrel/paths.js +19 -0
- package/dist/barrel/renderer.js +20 -0
- package/dist/barrel/routing.js +51 -0
- package/dist/barrel/text.js +18 -0
- package/dist/barrel/viewport.js +52 -0
- package/dist/builtins-DPcdghtB.d.ts +1223 -0
- package/dist/canvas/Canvas.js +363 -448
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +164 -165
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +37 -32
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +49 -43
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/MinimapCanvas.js +26 -25
- package/dist/canvas/MinimapCanvas.js.map +1 -1
- package/dist/canvas/NodeShape.js +59 -377
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js +50 -47
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +167 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +13 -13
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +67 -0
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +16 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/coordTrace.js +10 -0
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +146 -92
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +9 -8
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +1 -0
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/isDev.js +12 -0
- package/dist/canvas/SceneCanvas/isDev.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +29 -28
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/poseRegistrars.js +13 -0
- package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -0
- package/dist/canvas/SceneCanvas/props.js +38 -0
- package/dist/canvas/SceneCanvas/props.js.map +1 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +21 -62
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +46 -48
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +33 -33
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas.js +534 -788
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +45 -43
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +91 -0
- package/dist/canvas/buildSceneLayer.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +16 -19
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +68 -52
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/deps/changes.js +13 -0
- package/dist/canvas/deps/changes.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +28 -28
- package/dist/canvas/deps/insert.js +119 -91
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/slice.js +46 -45
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +10 -9
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/derivedPath.js +46 -23
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +7 -7
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/hud.module.js +1 -1
- package/dist/canvas/hud.module.js.map +1 -1
- package/dist/canvas/kitRequirements.js +2 -2
- package/dist/canvas/kitRequirements.js.map +1 -1
- package/dist/canvas/layerOrder.js +13 -6
- package/dist/canvas/layerOrder.js.map +1 -1
- package/dist/canvas/minimapMath.js +12 -10
- package/dist/canvas/minimapMath.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +34 -0
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/imagePainter.js +87 -0
- package/dist/canvas/nodeShapes/imagePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/memo.js +9 -0
- package/dist/canvas/nodeShapes/memo.js.map +1 -0
- package/dist/canvas/nodeShapes/nodePaint.js +57 -0
- package/dist/canvas/nodeShapes/nodePaint.js.map +1 -0
- package/dist/canvas/nodeShapes/pathPainter.js +38 -0
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/poseBox.js +20 -0
- package/dist/canvas/nodeShapes/poseBox.js.map +1 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +38 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/shapePainter.js +72 -0
- package/dist/canvas/nodeShapes/shapePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/textPainter.js +55 -0
- package/dist/canvas/nodeShapes/textPainter.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/paintCull.js +10 -11
- package/dist/canvas/paintCull.js.map +1 -1
- package/dist/canvas/pickWalk.js +52 -63
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/poseRotation.js +11 -23
- package/dist/canvas/poseRotation.js.map +1 -1
- package/dist/canvas/renderDebugSnapshot.js +5 -5
- package/dist/canvas/renderSceneToPixels.js +3 -1
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +66 -148
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +112 -0
- package/dist/canvas/sceneClipboard.js.map +1 -0
- package/dist/canvas/sceneSlotWiring.js +4 -4
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +39 -40
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/useCanvasRenderer.js +14 -6
- package/dist/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/canvas/useCanvasView.js +58 -0
- package/dist/canvas/useCanvasView.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +35 -26
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useSceneLayerList.js +21 -0
- package/dist/canvas/useSceneLayerList.js.map +1 -0
- package/dist/clipboard.d.ts +10 -6
- package/dist/clone.d.ts +4 -3
- package/dist/core/adapters/arrayAdapter.js +48 -39
- package/dist/core/adapters/arrayAdapter.js.map +1 -1
- package/dist/core/device/index.js +5 -4
- package/dist/core/device/useDeviceProfile.js +38 -44
- package/dist/core/device/useDeviceProfile.js.map +1 -1
- package/dist/core/device/watchDevicePixelRatio.js +17 -0
- package/dist/core/device/watchDevicePixelRatio.js.map +1 -0
- package/dist/core/fillInPoseFrame.js.map +1 -1
- package/dist/core/geometry/poseDescriptor.js +21 -19
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/poseFrame.js +44 -0
- package/dist/core/geometry/poseFrame.js.map +1 -0
- package/dist/core/geometry/poseRotation.js.map +1 -1
- package/dist/core/geometry/regionHit.js +9 -10
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/unionBounds.js +31 -29
- package/dist/core/geometry/unionBounds.js.map +1 -1
- package/dist/core/isPlainObject.js +2 -11
- package/dist/core/ops/arrange.js +1 -0
- package/dist/core/ops/arrange.js.map +1 -1
- package/dist/core/ops/create.js +10 -5
- package/dist/core/ops/create.js.map +1 -1
- package/dist/core/ops/delete.js +12 -24
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/ops/reorder/index.js +43 -40
- package/dist/core/ops/reorder/index.js.map +1 -1
- package/dist/core/ops/reorder/setChildOrder.js +34 -0
- package/dist/core/ops/reorder/setChildOrder.js.map +1 -0
- package/dist/core/paintKinds.js +5 -5
- package/dist/core/paintKinds.js.map +1 -1
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/appliedLog.js +37 -0
- package/dist/core/scene/appliedLog.js.map +1 -0
- package/dist/core/scene/arrivalWindow.js +101 -0
- package/dist/core/scene/arrivalWindow.js.map +1 -0
- package/dist/core/scene/derivedPath.js.map +1 -1
- package/dist/core/scene/historyFacade.js +84 -0
- package/dist/core/scene/historyFacade.js.map +1 -0
- package/dist/core/scene/kitOps.js +173 -0
- package/dist/core/scene/kitOps.js.map +1 -0
- package/dist/core/scene/layerStack.js +38 -0
- package/dist/core/scene/layerStack.js.map +1 -0
- package/dist/core/scene/lockGuard.js +37 -0
- package/dist/core/scene/lockGuard.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +5 -6
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/nodeMemo.js +45 -19
- package/dist/core/scene/nodeMemo.js.map +1 -1
- package/dist/core/scene/nodeStore.js +126 -0
- package/dist/core/scene/nodeStore.js.map +1 -0
- package/dist/core/scene/pickability.js +6 -0
- package/dist/core/scene/pickability.js.map +1 -0
- package/dist/core/scene/poseFeed.js +38 -38
- package/dist/core/scene/poseFeed.js.map +1 -1
- package/dist/core/scene/poseOverrides.js +34 -38
- package/dist/core/scene/poseOverrides.js.map +1 -1
- package/dist/core/scene/renderOrder.js +84 -0
- package/dist/core/scene/renderOrder.js.map +1 -0
- package/dist/core/scene/scene.js +289 -866
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/serialization.js +68 -0
- package/dist/core/scene/serialization.js.map +1 -0
- package/dist/core/scene/treeOrder.js +13 -0
- package/dist/core/scene/treeOrder.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/viewport/meanScale.js +1 -1
- package/dist/core/viewport/meanScale.js.map +1 -1
- package/dist/core/viewport/view.js +12 -12
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/zoomBounds.js +10 -8
- package/dist/core/viewport/zoomBounds.js.map +1 -1
- package/dist/{cornerHandles-BCrDp_mH.d.ts → cornerHandles-CtCb8a3G.d.ts} +1 -1
- package/dist/debug/createDebugOverlayLayer.js +14 -14
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/flag.js +2 -41
- package/dist/features/chrome-caps/useHoverTracking.js +22 -17
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/focus/gateLayer.js +3 -4
- package/dist/features/focus/gateLayer.js.map +1 -1
- package/dist/features/images/imageCache.js +19 -9
- package/dist/features/images/imageCache.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +14 -11
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/ingestion/index.js +1 -1
- package/dist/features/ingestion/registerKitHandlers.js +7 -7
- package/dist/features/ingestion/weaselJsonHandler.js +17 -14
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
- package/dist/features/meshPaint/lazyKind.js +201 -35
- package/dist/features/meshPaint/lazyKind.js.map +1 -1
- package/dist/features/meshPaint/meshPaint.js +82 -79
- package/dist/features/meshPaint/meshPaint.js.map +1 -1
- package/dist/features/minimap/createMinimapContribution.js +42 -42
- package/dist/features/minimap/layers.js +44 -62
- package/dist/features/minimap/layers.js.map +1 -1
- package/dist/features/parallax/createParallaxPlane.js +10 -14
- package/dist/features/parallax/createParallaxPlane.js.map +1 -1
- package/dist/features/paths/anchorEdits.js +19 -8
- package/dist/features/paths/anchorEdits.js.map +1 -1
- package/dist/features/paths/anchors.js +31 -26
- package/dist/features/paths/anchors.js.map +1 -1
- package/dist/features/paths/booleans.js +2 -2
- package/dist/features/paths/index.js +13 -11
- package/dist/features/paths/markerCommands.js +37 -36
- package/dist/features/paths/markerCommands.js.map +1 -1
- package/dist/features/paths/pathInWorld.js +19 -19
- package/dist/features/paths/pathInWorld.js.map +1 -1
- package/dist/features/paths/pathLayer.js.map +1 -1
- package/dist/features/paths/strokeToPath.js +40 -0
- package/dist/features/paths/strokeToPath.js.map +1 -0
- package/dist/features/paths/tessellate/stroke.js.map +1 -1
- package/dist/features/patterns/commandPaint.js +18 -0
- package/dist/features/patterns/commandPaint.js.map +1 -0
- package/dist/features/patterns/index.js +5 -17
- package/dist/features/patterns/index.js.map +1 -1
- package/dist/features/patterns/rasterizeTile.js +17 -0
- package/dist/features/patterns/rasterizeTile.js.map +1 -0
- package/dist/features/patterns/resolveSpec.js +52 -44
- package/dist/features/patterns/resolveSpec.js.map +1 -1
- package/dist/features/poseRun/usePoseRun.js +8 -3
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/selection/SelectionContext.js +5 -0
- package/dist/features/selection/SelectionContext.js.map +1 -1
- package/dist/features/selection/overlay.js +18 -18
- package/dist/features/selection/overlay.js.map +1 -1
- package/dist/features/text/domOffsets.js +82 -0
- package/dist/features/text/domOffsets.js.map +1 -0
- package/dist/features/text/domRuns.js +103 -131
- package/dist/features/text/domRuns.js.map +1 -1
- package/dist/features/text/hitTest.js +5 -2
- package/dist/features/text/hitTest.js.map +1 -1
- package/dist/features/text/isTextData.js +8 -0
- package/dist/features/text/isTextData.js.map +1 -0
- package/dist/features/text/overlayDirection.js +15 -0
- package/dist/features/text/overlayDirection.js.map +1 -0
- package/dist/features/text/runs/rangeStyle.js +32 -34
- package/dist/features/text/runs/rangeStyle.js.map +1 -1
- package/dist/features/text/textCommand.js +34 -33
- package/dist/features/text/textCommand.js.map +1 -1
- package/dist/features/text/textToPath.js +40 -40
- package/dist/features/text/textToPath.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +76 -82
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/text/useTextEdit.js +184 -160
- package/dist/features/text/useTextEdit.js.map +1 -1
- package/dist/features/tiling/createTiledLayer.js +24 -22
- package/dist/features/tiling/createTiledLayer.js.map +1 -1
- package/dist/index.d.ts +11010 -7700
- package/dist/index.js +316 -309
- package/dist/input/keyState.js +42 -43
- package/dist/input/keyState.js.map +1 -1
- package/dist/input/useKeyModifiers.js +11 -0
- package/dist/input/useKeyModifiers.js.map +1 -0
- package/dist/interactions/actions/align/align.js +8 -8
- package/dist/interactions/actions/clipboard/clipboardOps.js +34 -32
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/materializePaste.js +10 -7
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -1
- package/dist/interactions/actions/defaultCommitAdapter.js +20 -18
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
- package/dist/interactions/actions/defaults/align.js +9 -10
- package/dist/interactions/actions/defaults/align.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +59 -81
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/areaSelect.js +35 -38
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/clipboard.js +26 -10
- package/dist/interactions/actions/defaults/clipboard.js.map +1 -1
- package/dist/interactions/actions/defaults/clone.js +44 -60
- package/dist/interactions/actions/defaults/clone.js.map +1 -1
- package/dist/interactions/actions/defaults/copySubtree.js +40 -0
- package/dist/interactions/actions/defaults/copySubtree.js.map +1 -0
- package/dist/interactions/actions/defaults/distribute.js +14 -13
- package/dist/interactions/actions/defaults/distribute.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +17 -57
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/editAnchors.js +18 -18
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/flip.js +52 -46
- package/dist/interactions/actions/defaults/flip.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +43 -48
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +35 -33
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insert.js +50 -51
- package/dist/interactions/actions/defaults/insert.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +7 -7
- package/dist/interactions/actions/defaults/lassoSelect.js +67 -70
- package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/move.js +267 -249
- package/dist/interactions/actions/defaults/move.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +40 -68
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/nudgeSteps.js +37 -0
- package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -0
- package/dist/interactions/actions/defaults/reorder.js +2 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -1
- package/dist/interactions/actions/defaults/resize.js +104 -98
- package/dist/interactions/actions/defaults/resize.js.map +1 -1
- package/dist/interactions/actions/defaults/rotate.js +111 -110
- package/dist/interactions/actions/defaults/rotate.js.map +1 -1
- package/dist/interactions/actions/defaults/setFill.js +7 -7
- package/dist/interactions/actions/defaults/setFillOpacity.js +4 -4
- package/dist/interactions/actions/defaults/setStroke.js +12 -12
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +6 -6
- package/dist/interactions/actions/defaults/sliceOps.js +19 -19
- package/dist/interactions/actions/defaults/viewportDragPan.js +37 -26
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/geometry.js +28 -23
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/flip/helpers.js +30 -17
- package/dist/interactions/actions/flip/helpers.js.map +1 -1
- package/dist/interactions/actions/hitSelection.js +8 -0
- package/dist/interactions/actions/hitSelection.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +14 -18
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +5 -5
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +32 -21
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/gestureAdapter.js +32 -15
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +33 -0
- package/dist/interactions/actions/move/landedDescendants.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +18 -18
- package/dist/interactions/actions/poseDescriptorDep.js +16 -4
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +11 -6
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/previewOverrides.js +5 -5
- package/dist/interactions/actions/previewOverrides.js.map +1 -1
- package/dist/interactions/actions/selectionSubtree.js +69 -0
- package/dist/interactions/actions/selectionSubtree.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +66 -62
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragGesture.js +4 -7
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragPointOf.js +23 -0
- package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +21 -26
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +8 -6
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +8 -4
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
- package/dist/{math-Drrw4ewZ.d.ts → math-J-ACHyEg.d.ts} +1 -2
- package/dist/math.d.ts +2 -3
- package/dist/move.d.ts +12 -11
- package/dist/{originProjection-DEklpDc_.d.ts → originProjection-gHnOup4e.d.ts} +1 -1
- package/dist/{registerProgram-BMZRDgrh.d.ts → registerProgram-T9S_PfAX.d.ts} +18 -7
- package/dist/renderer/DrawCommand.js.map +1 -1
- package/dist/renderer/WeaselRenderer.js +75 -73
- package/dist/renderer/WeaselRenderer.js.map +1 -1
- package/dist/renderer/cache/GLImageCache.js +15 -5
- package/dist/renderer/cache/GLImageCache.js.map +1 -1
- package/dist/renderer/cache/GLMeshCache.js +23 -23
- package/dist/renderer/cache/GLMeshCache.js.map +1 -1
- package/dist/renderer/cache/GLTextureCache.js +18 -1
- package/dist/renderer/cache/GLTextureCache.js.map +1 -1
- package/dist/renderer/cache/cache.js.map +1 -1
- package/dist/renderer/cache/markerCommandCache.js.map +1 -1
- package/dist/renderer/cache/strokeMeshCache.js.map +1 -1
- package/dist/renderer/cullDrawCommands.js +11 -11
- package/dist/renderer/draw/batch.js +133 -0
- package/dist/renderer/draw/batch.js.map +1 -0
- package/dist/renderer/draw/clip.js +89 -0
- package/dist/renderer/draw/clip.js.map +1 -0
- package/dist/renderer/draw/customShader.js +230 -0
- package/dist/renderer/draw/customShader.js.map +1 -0
- package/dist/renderer/draw/drawTriangles.js +8 -0
- package/dist/renderer/draw/drawTriangles.js.map +1 -0
- package/dist/renderer/draw/effects.js +28 -0
- package/dist/renderer/draw/effects.js.map +1 -0
- package/dist/renderer/draw/flushBatch.js +35 -0
- package/dist/renderer/draw/flushBatch.js.map +1 -0
- package/dist/renderer/draw/gradient.js +90 -0
- package/dist/renderer/draw/gradient.js.map +1 -0
- package/dist/renderer/draw/image.js +38 -0
- package/dist/renderer/draw/image.js.map +1 -0
- package/dist/renderer/draw/mesh.js +16 -0
- package/dist/renderer/draw/mesh.js.map +1 -0
- package/dist/renderer/draw/paintBind.js +70 -0
- package/dist/renderer/draw/paintBind.js.map +1 -0
- package/dist/renderer/draw/pathPaint.js +142 -0
- package/dist/renderer/draw/pathPaint.js.map +1 -0
- package/dist/renderer/draw/scratchPass.js +83 -0
- package/dist/renderer/draw/scratchPass.js.map +1 -0
- package/dist/renderer/draw/stencil.js +28 -0
- package/dist/renderer/draw/stencil.js.map +1 -0
- package/dist/renderer/draw/text.js +167 -0
- package/dist/renderer/draw/text.js.map +1 -0
- package/dist/renderer/draw/uniforms.js +77 -0
- package/dist/renderer/draw/uniforms.js.map +1 -0
- package/dist/renderer/draw.js +60 -1116
- package/dist/renderer/draw.js.map +1 -1
- package/dist/renderer/effects/EffectTargets.js +3 -0
- package/dist/renderer/effects/EffectTargets.js.map +1 -1
- package/dist/renderer/effects/composite.js +7 -5
- package/dist/renderer/effects/composite.js.map +1 -1
- package/dist/renderer/index.js +18 -17
- package/dist/renderer/math/color.js +63 -83
- package/dist/renderer/math/color.js.map +1 -1
- package/dist/renderer/math/mat3.js +15 -11
- package/dist/renderer/math/mat3.js.map +1 -1
- package/dist/renderer/math/viewToMat3.js +1 -1
- package/dist/renderer/math/viewToMat3.js.map +1 -1
- package/dist/renderer/shaders/ShaderProgram.js +13 -13
- package/dist/renderer/shaders/ShaderProgram.js.map +1 -1
- package/dist/renderer/shaders/glyphPaint.js +3 -3
- package/dist/renderer/shaders/glyphPaint.js.map +1 -1
- package/dist/renderer/shaders/gradFill.js +2 -1
- package/dist/renderer/shaders/gradFill.js.map +1 -1
- package/dist/renderer/shaders/pathFill.js +2 -1
- package/dist/renderer/shaders/pathFill.js.map +1 -1
- package/dist/renderer/shaders/patternFill.js +2 -1
- package/dist/renderer/shaders/patternFill.js.map +1 -1
- package/dist/renderer/shaders/registerProgram.js.map +1 -1
- package/dist/renderer/strokeLengths.js.map +1 -1
- package/dist/renderer/textures/registerTexture.js +25 -5
- package/dist/renderer/textures/registerTexture.js.map +1 -1
- package/dist/renderer.d.ts +16 -15
- package/dist/renderer.js +17 -16
- package/dist/resize.d.ts +5 -6
- package/dist/resize.js +5 -5
- package/dist/style.css +1 -1
- package/dist/test-hook/install.js +12 -6
- package/dist/test-hook/install.js.map +1 -1
- package/dist/{test-seams-CuIxe0xY.d.ts → test-seams-DM2B87-g.d.ts} +4 -4
- package/dist/test-seams.d.ts +2 -2
- package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/hand/useHandTool.js +1 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
- package/dist/tools/builtin/lasso/useLassoTool.js +11 -11
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js +1 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +153 -103
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +13 -8
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js +1 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/selectionContributions.js +24 -23
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +51 -48
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/shared/pointerFollower.js +17 -0
- package/dist/tools/builtin/shared/pointerFollower.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +49 -54
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +22 -16
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +13 -2
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/tools/useKeybindings.js +14 -30
- package/dist/tools/useKeybindings.js.map +1 -1
- package/dist/{types-B_9g6hMM.d.ts → types-B4iJRHC3.d.ts} +5 -1
- package/dist/{types-A37hYkeR.d.ts → types-k-5Oqh-U.d.ts} +31 -7
- package/dist/util/color.js +3 -3
- package/dist/util/color.js.map +1 -1
- package/dist/util/paint.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +20 -18
- package/dist/autoPoseDescriptor-vCdt55xm.d.ts +0 -27
- package/dist/builtins-C-VgUlWI.d.ts +0 -4514
- package/dist/core/isPlainObject.js.map +0 -1
- package/dist/debug/flag.js.map +0 -1
- package/dist/interactions/actions/defaults/freshNodeId.js +0 -10
- package/dist/interactions/actions/defaults/freshNodeId.js.map +0 -1
- package/dist/renderer/shaders/imageFill.js +0 -14
- package/dist/renderer/shaders/imageFill.js.map +0 -1
- package/dist/tools/prefs.js +0 -47
- package/dist/tools/prefs.js.map +0 -1
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { dropPoseKeyedMemoSlots as e } from "./nodeMemo.js";
|
|
2
|
+
import { createDependentsIndex as t } from "./dependents.js";
|
|
3
|
+
import { dwarn as n } from "../../debug/flag.js";
|
|
4
|
+
import { restoreFn as r } from "./nodeFnFields.js";
|
|
5
|
+
//#region src/core/scene/nodeStore.ts
|
|
6
|
+
function i(i, a, o) {
|
|
7
|
+
let s = t(), c = /* @__PURE__ */ new Set();
|
|
8
|
+
function l(t) {
|
|
9
|
+
if (u(i.nodes.get(t)?.parent ?? null), s.isEmpty()) return;
|
|
10
|
+
let n = [t];
|
|
11
|
+
_(t, n);
|
|
12
|
+
for (let t of n) for (let n of s.transitiveDependentsOf(t)) {
|
|
13
|
+
let t = i.nodes.get(n);
|
|
14
|
+
t !== void 0 && e(t);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function u(t) {
|
|
18
|
+
if (c.size === 0) return;
|
|
19
|
+
let n = t;
|
|
20
|
+
for (; n !== null;) {
|
|
21
|
+
let t = i.nodes.get(n);
|
|
22
|
+
if (t === void 0) return;
|
|
23
|
+
if (c.has(n)) {
|
|
24
|
+
e(t);
|
|
25
|
+
for (let t of s.transitiveDependentsOf(n)) {
|
|
26
|
+
let n = i.nodes.get(t);
|
|
27
|
+
n !== void 0 && e(n);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
n = t.parent;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function d(e, t) {
|
|
34
|
+
t === "children" ? c.add(e) : c.delete(e);
|
|
35
|
+
}
|
|
36
|
+
function f(t, n) {
|
|
37
|
+
let r = p(t);
|
|
38
|
+
n === void 0 ? delete r.dependsOn : r.dependsOn = n, s.add(t, n === void 0 || n === "children" ? [] : n), d(t, n), e(p(t)), l(t);
|
|
39
|
+
}
|
|
40
|
+
function p(e) {
|
|
41
|
+
let t = i.nodes.get(e);
|
|
42
|
+
if (!t) throw Error(`Scene: unknown node id "${e}"`);
|
|
43
|
+
return t;
|
|
44
|
+
}
|
|
45
|
+
function m(e) {
|
|
46
|
+
if (e === null) return i.roots;
|
|
47
|
+
let t = p(e);
|
|
48
|
+
if (t.kind !== "container") throw Error(`Scene: parent "${e}" is not a container`);
|
|
49
|
+
return t.children;
|
|
50
|
+
}
|
|
51
|
+
function h(e) {
|
|
52
|
+
let t = p(e), n = m(t.parent), r = n.indexOf(e);
|
|
53
|
+
if (r < 0) throw Error(`Scene: node "${e}" not found in its parent's children`);
|
|
54
|
+
return n.splice(r, 1), a(), {
|
|
55
|
+
parent: t.parent,
|
|
56
|
+
index: r
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function g(e, t, n) {
|
|
60
|
+
let r = m(t), i = Math.max(0, Math.min(n, r.length));
|
|
61
|
+
r.splice(i, 0, e);
|
|
62
|
+
let o = p(e);
|
|
63
|
+
o.parent = t, a();
|
|
64
|
+
}
|
|
65
|
+
function _(e, t) {
|
|
66
|
+
let n = i.nodes.get(e);
|
|
67
|
+
if (n && n.kind === "container") for (let e of n.children) t.push(e), _(e, t);
|
|
68
|
+
}
|
|
69
|
+
function v(e) {
|
|
70
|
+
let t = [], n = /* @__PURE__ */ new Set();
|
|
71
|
+
function r(e) {
|
|
72
|
+
if (n.has(e)) return;
|
|
73
|
+
n.add(e), t.push(e);
|
|
74
|
+
let r = [];
|
|
75
|
+
_(e, r);
|
|
76
|
+
for (let e of r) n.has(e) || (n.add(e), t.push(e));
|
|
77
|
+
}
|
|
78
|
+
for (let t of e) r(t);
|
|
79
|
+
for (let e = 0; e < t.length; e++) for (let n of s.transitiveDependentsOf(t[e])) r(n);
|
|
80
|
+
return {
|
|
81
|
+
ids: t,
|
|
82
|
+
removing: n
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
let y = /* @__PURE__ */ new WeakMap();
|
|
86
|
+
function b(e, t, n) {
|
|
87
|
+
let r = i.nodes.get(t);
|
|
88
|
+
if (r === void 0) return;
|
|
89
|
+
let a = /* @__PURE__ */ new Map();
|
|
90
|
+
for (let t of o) {
|
|
91
|
+
let n = e[t.spec.field];
|
|
92
|
+
n !== void 0 && (t.spec.containersOnly && e.kind !== "container" || (t.write(r, n), a.set(t, n)));
|
|
93
|
+
}
|
|
94
|
+
n && a.size > 0 && y.set(n, a);
|
|
95
|
+
}
|
|
96
|
+
function x(e, t) {
|
|
97
|
+
if (!t) return;
|
|
98
|
+
let i = e;
|
|
99
|
+
for (let e of o) {
|
|
100
|
+
if (e.read(i) !== void 0) continue;
|
|
101
|
+
let a = t[e.spec.opKey];
|
|
102
|
+
a !== void 0 && r(e, i, a, "kit:remove", n);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
dependents: s,
|
|
107
|
+
childDerived: c,
|
|
108
|
+
invalidateDependents: l,
|
|
109
|
+
invalidateChildDerivedFrom: u,
|
|
110
|
+
trackChildDerived: d,
|
|
111
|
+
retarget: f,
|
|
112
|
+
requireNode: p,
|
|
113
|
+
siblingsOf: m,
|
|
114
|
+
detach: h,
|
|
115
|
+
attach: g,
|
|
116
|
+
descendants: _,
|
|
117
|
+
removalClosure: v,
|
|
118
|
+
addedFns: y,
|
|
119
|
+
patchNodeFunctions: b,
|
|
120
|
+
restoreNodeFunctions: x
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//#endregion
|
|
124
|
+
export { i as createNodeStore };
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=nodeStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeStore.js","names":["createNodeStore","dependents","createDependentsIndex","childDerived","invalidateDependents","invalidateChildDerivedFrom","state","id","subtree","src","dep","node","dropPoseKeyedMemoSlots","cursor","start","d","trackChildDerived","dependsOn","retarget","requireNode","n","siblingsOf","parent","p","detach","sibs","idx","invalidateOrder","attach","index","descendants","c","out","removalClosure","ids","removing","take","sub","s","root","rootIds","i","addedFns","patchNodeFunctions","attached","field","fnFields","fn","spec","payload","restoreNodeFunctions","keys","target","key","restoreFn","dwarn"],"sources":["../../../src/core/scene/nodeStore.ts"],"sourcesContent":["/**\n * The scene's node store: the tree links, the reverse index of who derives\n * from whom, and the function fields a node carries beside its data.\n *\n * Everything here reads and writes `state.nodes` and `state.roots` directly;\n * none of it records. The kit ops call it from both of their directions.\n */\nimport { dwarn } from 'debug/flag';\nimport { createDependentsIndex } from './dependents';\nimport { dropPoseKeyedMemoSlots } from './nodeMemo';\nimport { restoreFn, type FnBearingNode, type NodeFn, type NodeFnField } from './nodeFnFields';\nimport type { AddNodeSpec, Node, NodeId } from './types';\n\n/** What the store keeps of a scene's state. */\nexport interface NodeStoreState<TData, TLayer extends string, TPose> {\n nodes: Map<NodeId, Node<TData, TLayer, TPose>>;\n roots: NodeId[];\n}\n\nexport function createNodeStore<TData, TLayer extends string, TPose>(\n state: NodeStoreState<TData, TLayer, TPose>,\n /** Called on every edit to the tree's links. */\n invalidateOrder: () => void,\n fnFields: readonly NodeFnField[],\n) {\n /** Maintained from `kit:add` / `kit:remove` — the only two places a node is\n * created or destroyed, and unlike `add`/`remove` they replay on undo/redo.\n * Only explicit `dependsOn` id lists are registered here; `'children'` is\n * the ancestor walk in `invalidateDependents` instead. */\n const dependents = createDependentsIndex();\n\n /** Nodes carrying `dependsOn: 'children'`. Empty in every scene that has no\n * container hugging its contents, which is what keeps the ancestor walk off\n * the hot path. */\n const childDerived = new Set<NodeId>();\n\n /** Walks `id`'s whole subtree: under a composing pose strategy a container's\n * move carries every descendant, and whatever derives from one. */\n function invalidateDependents(id: NodeId): void {\n invalidateChildDerivedFrom(state.nodes.get(id)?.parent ?? null);\n if (dependents.isEmpty()) return;\n const subtree: NodeId[] = [id];\n descendants(id, subtree);\n for (const src of subtree) {\n for (const dep of dependents.transitiveDependentsOf(src)) {\n const node = state.nodes.get(dep);\n if (node !== undefined) dropPoseKeyedMemoSlots(node);\n }\n }\n }\n\n /** A `dependsOn: 'children'` container derives from nodes the reverse index\n * never sees, so its invalidation runs the other way: up the parent chain\n * from `start` inclusive, and on to each such ancestor's own dependents.\n *\n * Callers that removed or reparented a node pass the parent explicitly —\n * a gone node cannot say who its parent was. */\n function invalidateChildDerivedFrom(start: NodeId | null): void {\n if (childDerived.size === 0) return;\n let cursor = start;\n while (cursor !== null) {\n const node = state.nodes.get(cursor);\n if (node === undefined) return;\n if (childDerived.has(cursor)) {\n dropPoseKeyedMemoSlots(node);\n for (const dep of dependents.transitiveDependentsOf(cursor)) {\n const d = state.nodes.get(dep);\n if (d !== undefined) dropPoseKeyedMemoSlots(d);\n }\n }\n cursor = node.parent;\n }\n }\n\n /** Track (or forget) a node whose `dependsOn` is `'children'`. Paired with\n * `dependents.add` / `.remove` at every site a node is created or destroyed. */\n function trackChildDerived(id: NodeId, dependsOn: Node<TData, TLayer, TPose>['dependsOn']): void {\n if (dependsOn === 'children') childDerived.add(id);\n else childDerived.delete(id);\n }\n\n /** Point `id` at a different set of dependencies, keeping both indices and\n * every memo that reads them in step. Shared by `kit:setDependsOn`'s two\n * directions, which differ only in which value they install.\n *\n * `id`'s own memo is dropped as well as its dependents': its derivation now\n * reads different sources, and nothing else would clear it. */\n function retarget(id: NodeId, dependsOn: Node<TData, TLayer, TPose>['dependsOn']): void {\n const node = requireNode(id) as { dependsOn?: readonly NodeId[] | 'children' };\n if (dependsOn === undefined) delete node.dependsOn;\n else node.dependsOn = dependsOn;\n dependents.add(id, dependsOn === undefined || dependsOn === 'children' ? [] : dependsOn);\n trackChildDerived(id, dependsOn);\n dropPoseKeyedMemoSlots(requireNode(id));\n invalidateDependents(id);\n }\n\n function requireNode(id: NodeId): Node<TData, TLayer, TPose> {\n const n = state.nodes.get(id);\n if (!n) throw new Error(`Scene: unknown node id \"${id}\"`);\n return n;\n }\n\n function siblingsOf(parent: NodeId | null): NodeId[] {\n if (parent === null) return state.roots;\n const p = requireNode(parent);\n if (p.kind !== 'container') {\n throw new Error(`Scene: parent \"${parent}\" is not a container`);\n }\n return p.children;\n }\n\n function detach(id: NodeId): { parent: NodeId | null; index: number } {\n const node = requireNode(id);\n const sibs = siblingsOf(node.parent);\n const idx = sibs.indexOf(id);\n if (idx < 0) throw new Error(`Scene: node \"${id}\" not found in its parent's children`);\n sibs.splice(idx, 1);\n invalidateOrder();\n return { parent: node.parent, index: idx };\n }\n\n function attach(id: NodeId, parent: NodeId | null, index: number): void {\n const sibs = siblingsOf(parent);\n const i = Math.max(0, Math.min(index, sibs.length));\n sibs.splice(i, 0, id);\n const node = requireNode(id);\n (node as { parent: NodeId | null }).parent = parent;\n invalidateOrder();\n }\n\n function descendants(id: NodeId, out: NodeId[]): void {\n const n = state.nodes.get(id);\n if (!n || n.kind !== 'container') return;\n for (const c of n.children) {\n out.push(c);\n descendants(c, out);\n }\n }\n\n /** Everything removing `rootIds` takes with it: each root's subtree, then\n * every node deriving from any of those, then those nodes' subtrees in turn.\n * A dependent is not a descendant, so the second pass is a separate\n * reachability walk; `ids` grows as it runs, which is what carries the\n * cascade transitively and upward through a dependent's own ancestors.\n *\n * Published as {@link Scene.removalClosure}, which is what the delete op and\n * `buildDeleteOps` ask instead of rebuilding the walk from `dependsOn` and\n * `children` — a third cascade relation is then added here alone. */\n function removalClosure(rootIds: readonly NodeId[]): {\n ids: NodeId[];\n removing: Set<NodeId>;\n } {\n const ids: NodeId[] = [];\n const removing = new Set<NodeId>();\n function take(id: NodeId): void {\n if (removing.has(id)) return;\n removing.add(id);\n ids.push(id);\n const sub: NodeId[] = [];\n descendants(id, sub);\n for (const s of sub) {\n if (removing.has(s)) continue;\n removing.add(s);\n ids.push(s);\n }\n }\n for (const root of rootIds) take(root);\n for (let i = 0; i < ids.length; i++) {\n for (const dep of dependents.transitiveDependentsOf(ids[i])) take(dep);\n }\n return { ids, removing };\n }\n\n /** The functions a live `scene.add` attached, by the `kit:add` payload it\n * recorded: redo replays that payload without the spec. Keyed on the\n * payload rather than the node id because an id is reusable, and each\n * add of it owns its own functions. */\n const addedFns = new WeakMap<object, Map<NodeFnField, NodeFn>>();\n\n /** Post-patch the registry-keyed function fields onto a node after its\n * `kit:add` op runs. A function cannot travel through the serializable op\n * payload, so it is attached to the live node here, and kept against\n * `payload` for redo when there is one. `dependsOn` is plain data and\n * rides the payload instead. */\n function patchNodeFunctions(\n spec: AddNodeSpec<TData, TLayer, TPose>,\n id: NodeId,\n payload: object | null,\n ): void {\n const node = state.nodes.get(id) as FnBearingNode | undefined;\n if (node === undefined) return;\n const attached = new Map<NodeFnField, NodeFn>();\n for (const field of fnFields) {\n const fn = (spec as unknown as Record<string, unknown>)[field.spec.field] as NodeFn | undefined;\n if (fn === undefined) continue;\n if (field.spec.containersOnly && spec.kind !== 'container') continue;\n field.write(node, fn);\n attached.set(field, fn);\n }\n if (payload && attached.size > 0) addedFns.set(payload, attached);\n }\n\n /** Re-attach those fields to a node restored from a `kit:remove` snapshot.\n * In-session the clone already carries them; a persisted history does not,\n * so the registry keys are what is left. */\n function restoreNodeFunctions(\n node: Node<TData, TLayer, TPose>,\n keys: Record<string, string | undefined> | undefined,\n ): void {\n if (!keys) return;\n const target = node as unknown as FnBearingNode;\n for (const field of fnFields) {\n if (field.read(target) !== undefined) continue;\n const key = keys[field.spec.opKey];\n if (key === undefined) continue;\n restoreFn(field, target, key, 'kit:remove', dwarn);\n }\n }\n\n return {\n dependents, childDerived, invalidateDependents, invalidateChildDerivedFrom, trackChildDerived, retarget,\n requireNode, siblingsOf, detach, attach, descendants, removalClosure, addedFns, patchNodeFunctions,\n restoreNodeFunctions,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pickability.js","names":["pickability","n"],"sources":["../../../src/core/scene/pickability.ts"],"sourcesContent":["/** The `pickable` field of a node as a spread for `scene.add`: present only\n * when the node states it, so an unstated one keeps the scene's default. */\nexport const pickability = (n: { pickable?: boolean }): { pickable?: boolean } =>\n n.pickable !== undefined ? { pickable: n.pickable } : {};\n"],"mappings":";AAEA,IAAaA,KAAe,MAC1BC,EAAE,aAAa,KAAA,IAAuC,CAAC,IAA5B,EAAE,UAAUA,EAAE,SAAS"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import { effectivePose as e } from "./effectivePose.js";
|
|
2
|
+
import { createEmitter as t } from "@weasel-js/registry";
|
|
2
3
|
//#region src/core/scene/poseFeed.ts
|
|
3
|
-
var
|
|
4
|
-
function
|
|
5
|
-
let
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
let c = e(n, o);
|
|
11
|
-
s.set(r, {
|
|
4
|
+
var n = Object.freeze([]);
|
|
5
|
+
function r(r) {
|
|
6
|
+
let i = null, a = -1, o = -1, s = n, c = t(), l = c.emit, u = null, d = () => {
|
|
7
|
+
let t = i, n = [], a = [], o = [], s = /* @__PURE__ */ new Map();
|
|
8
|
+
for (let [i, o] of r.nodes) {
|
|
9
|
+
let c = e(r, o);
|
|
10
|
+
s.set(i, {
|
|
12
11
|
pose: c,
|
|
13
12
|
data: o.data,
|
|
14
13
|
layer: o.layer
|
|
15
14
|
});
|
|
16
|
-
let l = t.get(
|
|
17
|
-
l === void 0 ?
|
|
15
|
+
let l = t.get(i);
|
|
16
|
+
l === void 0 ? n.push({
|
|
18
17
|
node: o,
|
|
19
18
|
pose: c
|
|
20
19
|
}) : (l.pose !== c || l.data !== o.data || l.layer !== o.layer) && a.push({
|
|
@@ -23,56 +22,57 @@ function n(n) {
|
|
|
23
22
|
});
|
|
24
23
|
}
|
|
25
24
|
for (let e of t.keys()) s.has(e) || o.push(e);
|
|
26
|
-
return
|
|
27
|
-
added:
|
|
25
|
+
return i = s, {
|
|
26
|
+
added: n,
|
|
28
27
|
removed: o,
|
|
29
28
|
changed: a
|
|
30
29
|
};
|
|
31
|
-
},
|
|
32
|
-
...
|
|
33
|
-
removed:
|
|
34
|
-
changed:
|
|
30
|
+
}, f = () => (i = /* @__PURE__ */ new Map(), a = r.getVersion(), o = r.overrides.getGeneration(), s = r.overrides.ids(), {
|
|
31
|
+
...d(),
|
|
32
|
+
removed: n,
|
|
33
|
+
changed: n,
|
|
35
34
|
reset: !0
|
|
36
35
|
});
|
|
37
36
|
return {
|
|
38
37
|
subscribe(e) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
let t = c.subscribe(e);
|
|
39
|
+
if (u === null) {
|
|
40
|
+
let e = r.subscribe(l), t = r.overrides.subscribe(l);
|
|
41
|
+
u = () => {
|
|
42
42
|
e(), t();
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
return () => {
|
|
46
|
-
|
|
46
|
+
t(), c.size === 0 && u !== null && (u(), u = null);
|
|
47
47
|
};
|
|
48
48
|
},
|
|
49
49
|
read() {
|
|
50
|
-
if (
|
|
51
|
-
let
|
|
52
|
-
if (!l && !
|
|
53
|
-
added:
|
|
54
|
-
removed:
|
|
55
|
-
changed:
|
|
50
|
+
if (i === null) return f();
|
|
51
|
+
let t = r.getVersion(), c = r.overrides.getGeneration(), l = t !== a, u = c !== o;
|
|
52
|
+
if (!l && !u) return {
|
|
53
|
+
added: n,
|
|
54
|
+
removed: n,
|
|
55
|
+
changed: n,
|
|
56
56
|
reset: !1
|
|
57
57
|
};
|
|
58
|
-
let p = l ?
|
|
58
|
+
let p = l ? d() : {
|
|
59
59
|
added: [],
|
|
60
60
|
removed: [],
|
|
61
61
|
changed: []
|
|
62
62
|
};
|
|
63
|
-
if (
|
|
64
|
-
let t =
|
|
65
|
-
for (let e of
|
|
63
|
+
if (a = t, u) {
|
|
64
|
+
let t = r.overrides.ids(), n = new Set(t);
|
|
65
|
+
for (let e of s) n.add(e);
|
|
66
66
|
let i = new Set(p.changed.map((e) => e.node.id));
|
|
67
|
-
for (let t of
|
|
67
|
+
for (let t of n) {
|
|
68
68
|
if (i.has(t)) continue;
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
node:
|
|
72
|
-
pose: e(
|
|
69
|
+
let n = r.get(t);
|
|
70
|
+
n !== void 0 && p.changed.push({
|
|
71
|
+
node: n,
|
|
72
|
+
pose: e(r, n)
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
o = c, s = t;
|
|
76
76
|
}
|
|
77
77
|
return {
|
|
78
78
|
...p,
|
|
@@ -82,6 +82,6 @@ function n(n) {
|
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
84
|
//#endregion
|
|
85
|
-
export {
|
|
85
|
+
export { r as createPoseFeed };
|
|
86
86
|
|
|
87
87
|
//# sourceMappingURL=poseFeed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poseFeed.js","names":["EMPTY","createPoseFeed","seen","seenVersion","seenGeneration","seenOverridden","listeners","
|
|
1
|
+
{"version":3,"file":"poseFeed.js","names":["EMPTY","createPoseFeed","seen","seenVersion","seenGeneration","seenOverridden","listeners","createEmitter","notify","unwire","walk","prev","added","changed","removed","next","id","node","scene","pose","effectivePose","before","resetTo","off","fn","offScene","offOverrides","version","generation","committedMoved","overridesMoved","base","now","touched","already","n"],"sources":["../../../src/core/scene/poseFeed.ts"],"sourcesContent":["import { createEmitter } from '@weasel-js/registry';\nimport { effectivePose } from './effectivePose';\nimport type { Node, NodeId, Scene } from './types';\n\n/** A node and the pose a renderer should draw it at. `node.pose` beside it is\n * still the committed pose, so a host has both without a second channel. */\nexport interface FeedNode<TData, TLayer extends string, TPose> {\n node: Node<TData, TLayer, TPose>;\n pose: TPose;\n}\n\n/** What changed since the last `read()`. A node whose effective pose, data or\n * layer reference moved is `changed`; `reset` means every node is in `added`. */\nexport interface FeedDelta<TData, TLayer extends string, TPose> {\n added: readonly FeedNode<TData, TLayer, TPose>[];\n removed: readonly NodeId[];\n changed: readonly FeedNode<TData, TLayer, TPose>[];\n /** Discard the object map and rebuild. */\n reset: boolean;\n}\n\n/** A pull-based change feed over a scene. `subscribe` says something moved;\n * `read` says what, relative to the previous read. */\nexport interface PoseFeed<TData, TLayer extends string, TPose> {\n subscribe(fn: () => void): () => void;\n read(): FeedDelta<TData, TLayer, TPose>;\n}\n\nconst EMPTY = Object.freeze([]) as readonly never[];\n\n/** The three references a node carries that a renderer cares about. The node\n * object is mutated in place, so it is these — not the node — that move. */\ninterface Snapshot<TData, TLayer extends string, TPose> {\n pose: TPose;\n data: TData;\n layer: TLayer;\n}\n\n/** A {@link PoseFeed} over `scene`, reporting effective poses (committed pose\n * under any override). The first `read()` is a reset listing every node. */\nexport function createPoseFeed<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n): PoseFeed<TData, TLayer, TPose> {\n let seen: Map<NodeId, Snapshot<TData, TLayer, TPose>> | null = null;\n let seenVersion = -1;\n let seenGeneration = -1;\n let seenOverridden: readonly NodeId[] = EMPTY;\n\n const listeners = createEmitter();\n const notify = listeners.emit;\n let unwire: (() => void) | null = null;\n\n const walk = (): {\n added: FeedNode<TData, TLayer, TPose>[];\n removed: NodeId[];\n changed: FeedNode<TData, TLayer, TPose>[];\n } => {\n const prev = seen!;\n const added: FeedNode<TData, TLayer, TPose>[] = [];\n const changed: FeedNode<TData, TLayer, TPose>[] = [];\n const removed: NodeId[] = [];\n const next = new Map<NodeId, Snapshot<TData, TLayer, TPose>>();\n\n for (const [id, node] of scene.nodes) {\n const pose = effectivePose(scene, node);\n next.set(id, { pose, data: node.data, layer: node.layer });\n const before = prev.get(id);\n if (before === undefined) added.push({ node, pose });\n else if (before.pose !== pose || before.data !== node.data || before.layer !== node.layer) {\n changed.push({ node, pose });\n }\n }\n for (const id of prev.keys()) if (!next.has(id)) removed.push(id);\n\n seen = next;\n return { added, removed, changed };\n };\n\n const resetTo = (): FeedDelta<TData, TLayer, TPose> => {\n // An empty `seen` makes the walk report every node as added, and fills the\n // snapshot map in the same pass.\n seen = new Map();\n seenVersion = scene.getVersion();\n seenGeneration = scene.overrides.getGeneration();\n seenOverridden = scene.overrides.ids();\n return { ...walk(), removed: EMPTY, changed: EMPTY, reset: true };\n };\n\n return {\n subscribe(fn) {\n const off = listeners.subscribe(fn);\n if (unwire === null) {\n const offScene = scene.subscribe(notify);\n const offOverrides = scene.overrides.subscribe(notify);\n unwire = () => {\n offScene();\n offOverrides();\n };\n }\n return () => {\n off();\n if (listeners.size === 0 && unwire !== null) {\n unwire();\n unwire = null;\n }\n };\n },\n read() {\n if (seen === null) return resetTo();\n\n const version = scene.getVersion();\n const generation = scene.overrides.getGeneration();\n const committedMoved = version !== seenVersion;\n const overridesMoved = generation !== seenGeneration;\n\n if (!committedMoved && !overridesMoved) {\n return { added: EMPTY, removed: EMPTY, changed: EMPTY, reset: false };\n }\n\n const base = committedMoved\n ? walk()\n : {\n added: [] as FeedNode<TData, TLayer, TPose>[],\n removed: [] as NodeId[],\n changed: [] as FeedNode<TData, TLayer, TPose>[],\n };\n seenVersion = version;\n\n if (overridesMoved) {\n const now = scene.overrides.ids();\n const touched = new Set<NodeId>(now);\n for (const id of seenOverridden) touched.add(id); // a cleared override moved too\n const already = new Set(base.changed.map((n) => n.node.id));\n for (const id of touched) {\n if (already.has(id)) continue;\n const node = scene.get(id);\n if (node !== undefined) base.changed.push({ node, pose: effectivePose(scene, node) });\n }\n seenGeneration = generation;\n seenOverridden = now;\n }\n\n return { ...base, reset: false };\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,72 +1,68 @@
|
|
|
1
1
|
import { dropPoseKeyedMemoSlots as e } from "./nodeMemo.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createEmitter as t } from "@weasel-js/registry";
|
|
3
|
+
import { kit as n, last as r, mix as i, mul as a, patch as o } from "@msb235/blits";
|
|
3
4
|
//#region src/core/scene/poseOverrides.ts
|
|
4
|
-
var
|
|
5
|
-
function
|
|
6
|
-
let
|
|
7
|
-
pose:
|
|
8
|
-
alpha:
|
|
5
|
+
var s = Object.freeze({});
|
|
6
|
+
function c(c, l) {
|
|
7
|
+
let u = /* @__PURE__ */ new Map(), d = t(), f = 0, p = i(n({
|
|
8
|
+
pose: r(),
|
|
9
|
+
alpha: a()
|
|
9
10
|
}));
|
|
10
|
-
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
let
|
|
14
|
-
function
|
|
15
|
-
let n =
|
|
16
|
-
n && e(n),
|
|
11
|
+
p.cue({ patch: o(0, (e, t) => u.get(t) ?? s, { writes: ["pose", "alpha"] }) });
|
|
12
|
+
let m = 0;
|
|
13
|
+
p.sync(m);
|
|
14
|
+
let h = /* @__PURE__ */ new Map();
|
|
15
|
+
function g(t) {
|
|
16
|
+
let n = c(t);
|
|
17
|
+
n && e(n), l?.(t);
|
|
17
18
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
for (let e of u) e();
|
|
19
|
+
function _() {
|
|
20
|
+
f++, p.sync(++m), d.emit();
|
|
21
21
|
}
|
|
22
|
-
function
|
|
23
|
-
|
|
22
|
+
function v(e) {
|
|
23
|
+
h.delete(e), p.drop(e);
|
|
24
24
|
}
|
|
25
25
|
return {
|
|
26
26
|
set(e, t) {
|
|
27
|
-
|
|
27
|
+
u.set(e, t), g(e), _();
|
|
28
28
|
},
|
|
29
29
|
get(e) {
|
|
30
|
-
return
|
|
30
|
+
return u.get(e);
|
|
31
31
|
},
|
|
32
32
|
read(e) {
|
|
33
|
-
if (!
|
|
34
|
-
let t =
|
|
33
|
+
if (!u.has(e)) return;
|
|
34
|
+
let t = h.get(e);
|
|
35
35
|
return t === void 0 && (t = {
|
|
36
36
|
out: {},
|
|
37
37
|
at: -1
|
|
38
|
-
},
|
|
38
|
+
}, h.set(e, t)), t.at !== f && (p.probe(e, t.out), t.at = f), t.out;
|
|
39
39
|
},
|
|
40
40
|
has(e) {
|
|
41
|
-
return
|
|
41
|
+
return u.has(e);
|
|
42
42
|
},
|
|
43
43
|
ids() {
|
|
44
|
-
return [...
|
|
44
|
+
return [...u.keys()];
|
|
45
45
|
},
|
|
46
46
|
clear(e) {
|
|
47
|
-
|
|
47
|
+
u.delete(e) && (v(e), g(e), _());
|
|
48
48
|
},
|
|
49
49
|
clearAll() {
|
|
50
|
-
if (
|
|
51
|
-
for (let e of
|
|
52
|
-
|
|
50
|
+
if (u.size !== 0) {
|
|
51
|
+
for (let e of u.keys()) v(e), g(e);
|
|
52
|
+
u.clear(), _();
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
55
|
commit() {
|
|
56
|
-
for (let e of
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
subscribe(e) {
|
|
60
|
-
return u.add(e), () => {
|
|
61
|
-
u.delete(e);
|
|
62
|
-
};
|
|
56
|
+
for (let e of u.keys()) g(e);
|
|
57
|
+
_();
|
|
63
58
|
},
|
|
59
|
+
subscribe: d.subscribe,
|
|
64
60
|
getGeneration() {
|
|
65
|
-
return
|
|
61
|
+
return f;
|
|
66
62
|
}
|
|
67
63
|
};
|
|
68
64
|
}
|
|
69
65
|
//#endregion
|
|
70
|
-
export {
|
|
66
|
+
export { c as createPoseOverrides };
|
|
71
67
|
|
|
72
68
|
//# sourceMappingURL=poseOverrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poseOverrides.js","names":["NOTHING","createPoseOverrides","entries","listeners","generation","folded","mix","kit","last","mul","patch","id","clock","reads","invalidate","node","getNode","dropPoseKeyedMemoSlots","onInvalidate","published","
|
|
1
|
+
{"version":3,"file":"poseOverrides.js","names":["NOTHING","createPoseOverrides","entries","listeners","createEmitter","generation","folded","mix","kit","last","mul","patch","id","clock","reads","invalidate","node","getNode","dropPoseKeyedMemoSlots","onInvalidate","published","forget","entry","held"],"sources":["../../../src/core/scene/poseOverrides.ts"],"sourcesContent":["import { createEmitter } from '@weasel-js/registry';\nimport { kit, last, mix, mul, patch } from '@msb235/blits';\nimport { dropPoseKeyedMemoSlots } from './nodeMemo';\nimport type { NodeId, PoseOverride, PoseOverrides } from './types';\n\n/** What the table's voice says about a node it holds no entry for. */\nconst NOTHING: PoseOverride<never> = Object.freeze({});\n\n/**\n * Build a {@link PoseOverrides} map.\n *\n * `getNode` resolves an id to the node object the painter memo is keyed on —\n * the only thing this module needs from the scene, and the reason it doesn't\n * import one. `onInvalidate` lets the scene invalidate derived nodes from the\n * same chokepoint.\n *\n * What `read` answers is a blits mix folded per node. The entries a writer\n * `set`s are one voice on it, and the nodes holding an entry are the mix's\n * reach: a node outside it is never probed.\n */\nexport function createPoseOverrides<TPose>(\n getNode: (id: NodeId) => { data?: unknown } | undefined,\n onInvalidate?: (id: NodeId) => void,\n): PoseOverrides<TPose> {\n const entries = new Map<NodeId, PoseOverride<TPose>>();\n const listeners = createEmitter();\n let generation = 0;\n\n const folded = mix<NodeId, PoseOverride<TPose>>(\n kit<PoseOverride<TPose>>({ pose: last<NonNullable<TPose>>(), alpha: mul() }),\n );\n folded.cue({\n patch: patch<NodeId, PoseOverride<TPose>>(\n 0,\n (_phase, id) => entries.get(id) ?? (NOTHING as PoseOverride<TPose>),\n { writes: ['pose', 'alpha'] },\n ),\n });\n // Mix time only has to move between publishes, so a probe after one never\n // hands back the delta a probe before it cached.\n let clock = 0;\n folded.sync(clock);\n\n /** Per node: the object `read` folds into and returns, and the generation\n * it was last folded at. */\n const reads = new Map<NodeId, { out: PoseOverride<TPose>; at: number }>();\n\n function invalidate(id: NodeId): void {\n const node = getNode(id);\n if (node) dropPoseKeyedMemoSlots(node);\n onInvalidate?.(id);\n }\n\n function published(): void {\n generation++;\n folded.sync(++clock);\n listeners.emit();\n }\n\n function forget(id: NodeId): void {\n reads.delete(id);\n folded.drop(id);\n }\n\n return {\n set(id, entry) {\n entries.set(id, entry);\n invalidate(id);\n published();\n },\n get(id) {\n return entries.get(id);\n },\n read(id) {\n if (!entries.has(id)) return undefined;\n let held = reads.get(id);\n if (held === undefined) {\n held = { out: {}, at: -1 };\n reads.set(id, held);\n }\n if (held.at !== generation) {\n folded.probe(id, held.out);\n held.at = generation;\n }\n return held.out;\n },\n has(id) {\n return entries.has(id);\n },\n ids() {\n return [...entries.keys()];\n },\n clear(id) {\n if (!entries.delete(id)) return;\n forget(id);\n invalidate(id);\n published();\n },\n clearAll() {\n if (entries.size === 0) return;\n for (const id of entries.keys()) {\n forget(id);\n invalidate(id);\n }\n entries.clear();\n published();\n },\n commit() {\n for (const id of entries.keys()) invalidate(id);\n published();\n },\n subscribe: listeners.subscribe,\n getGeneration() {\n return generation;\n },\n };\n}\n"],"mappings":";;;;AAMA,IAAMA,IAA+B,OAAO,OAAO,CAAC,CAAC;AAcrD,SAAgBC,EACd,GACA,GACsB;CACtB,IAAMC,oBAAU,IAAI,IAAiC,GAC/CC,IAAYC,EAAc,GAC5BC,IAAa,GAEXC,IAASC,EACbC,EAAyB;EAAE,MAAMC,EAAyB;EAAG,OAAOC,EAAI;CAAE,CAAC,CAC7E;CACA,EAAO,IAAI,EACT,OAAOC,EACL,IACC,GAAQ,MAAOT,EAAQ,IAAIU,CAAE,KAAMZ,GACpC,EAAE,QAAQ,CAAC,QAAQ,OAAO,EAAE,CAC9B,EACF,CAAC;CAGD,IAAIa,IAAQ;CACZ,EAAO,KAAKA,CAAK;CAIjB,IAAMC,oBAAQ,IAAI,IAAsD;CAExE,SAASC,EAAW,GAAkB;EACpC,IAAMC,IAAOC,EAAQL,CAAE;EAEvB,AADII,KAAME,EAAuBF,CAAI,GACrCG,IAAeP,CAAE;CACnB;CAEA,SAASQ,IAAkB;EAGzB,AAFA,KACAd,EAAO,KAAK,EAAEO,CAAK,GACnBV,EAAU,KAAK;CACjB;CAEA,SAASkB,EAAO,GAAkB;EAEhC,AADAP,EAAM,OAAOF,CAAE,GACfN,EAAO,KAAKM,CAAE;CAChB;CAEA,OAAO;EACL,IAAI,GAAI,GAAO;GAGb,AAFAV,EAAQ,IAAIU,GAAIU,CAAK,GACrBP,EAAWH,CAAE,GACbQ,EAAU;EACZ;EACA,IAAI,GAAI;GACN,OAAOlB,EAAQ,IAAIU,CAAE;EACvB;EACA,KAAK,GAAI;GACP,IAAI,CAACV,EAAQ,IAAIU,CAAE,GAAG;GACtB,IAAIW,IAAOT,EAAM,IAAIF,CAAE;GASvB,OARIW,MAAS,KAAA,MACX,IAAO;IAAE,KAAK,CAAC;IAAG,IAAI;GAAG,GACzBT,EAAM,IAAIF,GAAIW,CAAI,IAEhBA,EAAK,OAAOlB,MACdC,EAAO,MAAMM,GAAIW,EAAK,GAAG,GACzB,EAAK,KAAKlB,IAELkB,EAAK;EACd;EACA,IAAI,GAAI;GACN,OAAOrB,EAAQ,IAAIU,CAAE;EACvB;EACA,MAAM;GACJ,OAAO,CAAC,GAAGV,EAAQ,KAAK,CAAC;EAC3B;EACA,MAAM,GAAI;GACR,AAAKA,EAAQ,OAAOU,CAAE,MACtBS,EAAOT,CAAE,GACTG,EAAWH,CAAE,GACbQ,EAAU;EACZ;EACA,WAAW;GACT,IAAIlB,EAAQ,SAAS,GACrB;SAAK,IAAMU,KAAMV,EAAQ,KAAK,GAE5B,AADAmB,EAAOT,CAAE,GACTG,EAAWH,CAAE;IAGf,AADAV,EAAQ,MAAM,GACdkB,EAAU;GAFV;EAGF;EACA,SAAS;GACP,KAAK,IAAMR,KAAMV,EAAQ,KAAK,GAAG,EAAWU,CAAE;GAC9C,EAAU;EACZ;EACA,WAAWT,EAAU;EACrB,gBAAgB;GACd,OAAOE;EACT;CACF;AACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//#region src/core/scene/renderOrder.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
function t() {
|
|
4
|
+
return e.layers.length === 1 ? c() : u();
|
|
5
|
+
}
|
|
6
|
+
function n() {
|
|
7
|
+
return e.layers.length === 1 ? l() : d();
|
|
8
|
+
}
|
|
9
|
+
let r = 0, i = { gen: 0 };
|
|
10
|
+
function a() {
|
|
11
|
+
r++;
|
|
12
|
+
}
|
|
13
|
+
let o = [];
|
|
14
|
+
function s() {
|
|
15
|
+
return i.gen !== r && (i = { gen: r }), i;
|
|
16
|
+
}
|
|
17
|
+
function c() {
|
|
18
|
+
let t = e.layers[0].id, n = [], r = [...e.roots].reverse();
|
|
19
|
+
for (; r.length > 0;) {
|
|
20
|
+
let i = r.pop(), a = e.nodes.get(i);
|
|
21
|
+
if (a && (a.layer === t && n.push(i), a.kind === "container")) for (let e = a.children.length - 1; e >= 0; e--) r.push(a.children[e]);
|
|
22
|
+
}
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
function l() {
|
|
26
|
+
let t = e.layers[0].id, n = [], r = [...e.roots].reverse();
|
|
27
|
+
for (; r.length > 0;) {
|
|
28
|
+
let i = r.pop(), a = e.nodes.get(i);
|
|
29
|
+
if (a && (a.layer === t && n.push(a), a.kind === "container")) for (let e = a.children.length - 1; e >= 0; e--) r.push(a.children[e]);
|
|
30
|
+
}
|
|
31
|
+
return n;
|
|
32
|
+
}
|
|
33
|
+
function u() {
|
|
34
|
+
let t = e.layers.map(() => []), n = [...e.roots].reverse();
|
|
35
|
+
for (; n.length > 0;) {
|
|
36
|
+
let r = n.pop(), i = e.nodes.get(r);
|
|
37
|
+
if (!i) continue;
|
|
38
|
+
let a = t[e.layerIndex.get(i.layer) ?? -1];
|
|
39
|
+
if (a && a.push(r), i.kind === "container") for (let e = i.children.length - 1; e >= 0; e--) n.push(i.children[e]);
|
|
40
|
+
}
|
|
41
|
+
let r = [];
|
|
42
|
+
for (let e of t) for (let t of e) r.push(t);
|
|
43
|
+
return r;
|
|
44
|
+
}
|
|
45
|
+
function d() {
|
|
46
|
+
let t = e.layers.map(() => []), n = [...e.roots].reverse();
|
|
47
|
+
for (; n.length > 0;) {
|
|
48
|
+
let r = n.pop(), i = e.nodes.get(r);
|
|
49
|
+
if (!i) continue;
|
|
50
|
+
let a = t[e.layerIndex.get(i.layer) ?? -1];
|
|
51
|
+
if (a && a.push(i), i.kind === "container") for (let e = i.children.length - 1; e >= 0; e--) n.push(i.children[e]);
|
|
52
|
+
}
|
|
53
|
+
let r = [];
|
|
54
|
+
for (let e of t) for (let t of e) r.push(t);
|
|
55
|
+
return r;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
ids() {
|
|
59
|
+
let e = s();
|
|
60
|
+
return e.ids ??= t();
|
|
61
|
+
},
|
|
62
|
+
nodes() {
|
|
63
|
+
let e = s();
|
|
64
|
+
return e.nodes ??= n();
|
|
65
|
+
},
|
|
66
|
+
nodesOnLayer(e) {
|
|
67
|
+
let t = s(), r = t.byLayer;
|
|
68
|
+
if (!r) {
|
|
69
|
+
r = /* @__PURE__ */ new Map();
|
|
70
|
+
for (let e of t.nodes ??= n()) {
|
|
71
|
+
let t = r.get(e.layer);
|
|
72
|
+
t || r.set(e.layer, t = []), t.push(e);
|
|
73
|
+
}
|
|
74
|
+
t.byLayer = r;
|
|
75
|
+
}
|
|
76
|
+
return r.get(e) ?? o;
|
|
77
|
+
},
|
|
78
|
+
invalidate: a
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { e as createRenderOrder };
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=renderOrder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderOrder.js","names":["createRenderOrder","walkIds","state","renderOrderFlat","renderOrderBucketed","walkNodes","renderOrderNodesFlat","renderOrderNodesBucketed","structureGeneration","orderCache","invalidate","EMPTY_NODES","currentOrderCache","only","out","stack","id","node","i","buckets","bucket","c","byLayer","layer"],"sources":["../../../src/core/scene/renderOrder.ts"],"sourcesContent":["/**\n * A scene's render order: its nodes layer-major, each layer in tree preorder,\n * cached until the structure changes.\n */\nimport type { Node, NodeId } from './types';\n\n/** What the walks read of a scene's state. */\nexport interface RenderOrderState<TData, TLayer extends string, TPose> {\n nodes: Map<NodeId, Node<TData, TLayer, TPose>>;\n roots: NodeId[];\n layers: { id: TLayer }[];\n layerIndex: Map<TLayer, number>;\n}\n\nexport interface RenderOrder<TData, TLayer extends string, TPose> {\n ids(): NodeId[];\n nodes(): Node<TData, TLayer, TPose>[];\n nodesOnLayer(layer: TLayer): readonly Node<TData, TLayer, TPose>[];\n /** Call on every structural edit; see the cache note below. */\n invalidate(): void;\n}\n\nexport function createRenderOrder<TData, TLayer extends string, TPose>(\n state: RenderOrderState<TData, TLayer, TPose>,\n): RenderOrder<TData, TLayer, TPose> {\n /**\n * Layer-major DFS-preorder ids, and the same sequence as nodes. Four walks\n * for two sequences, which wants explaining, because collapsing them is the\n * obvious cleanup and each collapse was measured to cost something:\n *\n * - ids vs nodes: projecting one from the other is a whole extra pass, worth\n * 20% of `renderOrder()` on a multi-layer scene.\n * - flat vs bucketed: a single layer needs no buckets and can compare the\n * layer id instead of indexing it, which is 1.4x. Behind a branch in one\n * function it also slows the bucketed path by 20% — the two shapes share\n * one optimized body, and whichever ran first wins it.\n *\n * All four emit the same order and `renderOrder.test.ts` holds them to it.\n */\n function walkIds(): NodeId[] {\n return state.layers.length === 1 ? renderOrderFlat() : renderOrderBucketed();\n }\n\n function walkNodes(): Node<TData, TLayer, TPose>[] {\n return state.layers.length === 1 ? renderOrderNodesFlat() : renderOrderNodesBucketed();\n }\n\n /**\n * Render order survives everything except a structural edit, so both walks\n * are cached against a counter the structural writers bump: `attach` and\n * `detach` (add / remove / reparent / reorder), `kit:setLayer` (which bucket\n * a node lands in), `rebuildLayerIndex` (the layer list itself), and\n * `loadState`. Pose and data edits leave order alone and must NOT invalidate\n * — they fire per frame during a drag, which is exactly when the cache pays.\n *\n * A missed bump is a silent wrong answer: nodes painted in the wrong z-order,\n * or unpickable. `renderOrder.test.ts` walks each structural op and asserts\n * the order moved.\n */\n let structureGeneration = 0;\n let orderCache: {\n gen: number;\n ids?: NodeId[];\n nodes?: Node<TData, TLayer, TPose>[];\n byLayer?: Map<TLayer, Node<TData, TLayer, TPose>[]>;\n } = { gen: 0 };\n\n function invalidate(): void {\n structureGeneration++;\n }\n\n const EMPTY_NODES: readonly Node<TData, TLayer, TPose>[] = [];\n\n function currentOrderCache(): typeof orderCache {\n if (orderCache.gen !== structureGeneration) {\n orderCache = { gen: structureGeneration };\n }\n return orderCache;\n }\n\n function renderOrderFlat(): NodeId[] {\n const only = state.layers[0].id;\n const out: NodeId[] = [];\n const stack: NodeId[] = [...state.roots].reverse();\n while (stack.length > 0) {\n const id = stack.pop()!;\n const node = state.nodes.get(id);\n if (!node) continue;\n if (node.layer === only) out.push(id);\n if (node.kind === 'container') {\n for (let i = node.children.length - 1; i >= 0; i--) {\n stack.push(node.children[i]);\n }\n }\n }\n return out;\n }\n\n function renderOrderNodesFlat(): Node<TData, TLayer, TPose>[] {\n const only = state.layers[0].id;\n const out: Node<TData, TLayer, TPose>[] = [];\n const stack: NodeId[] = [...state.roots].reverse();\n while (stack.length > 0) {\n const id = stack.pop()!;\n const node = state.nodes.get(id);\n if (!node) continue;\n if (node.layer === only) out.push(node);\n if (node.kind === 'container') {\n for (let i = node.children.length - 1; i >= 0; i--) {\n stack.push(node.children[i]);\n }\n }\n }\n return out;\n }\n\n /** One DFS of the tree, bucketed by layer: appending in preorder keeps each\n * bucket in preorder, so concatenating them is the layer-major sequence. */\n function renderOrderBucketed(): NodeId[] {\n const buckets: NodeId[][] = state.layers.map(() => []);\n const stack: NodeId[] = [...state.roots].reverse();\n while (stack.length > 0) {\n const id = stack.pop()!;\n const node = state.nodes.get(id);\n if (!node) continue;\n const bucket = buckets[state.layerIndex.get(node.layer) ?? -1];\n if (bucket) bucket.push(id);\n if (node.kind === 'container') {\n for (let i = node.children.length - 1; i >= 0; i--) {\n stack.push(node.children[i]);\n }\n }\n }\n const out: NodeId[] = [];\n for (const bucket of buckets) {\n for (const id of bucket) out.push(id);\n }\n return out;\n }\n\n function renderOrderNodesBucketed(): Node<TData, TLayer, TPose>[] {\n const buckets: Node<TData, TLayer, TPose>[][] = state.layers.map(() => []);\n const stack: NodeId[] = [...state.roots].reverse();\n while (stack.length > 0) {\n const id = stack.pop()!;\n const node = state.nodes.get(id);\n if (!node) continue;\n const bucket = buckets[state.layerIndex.get(node.layer) ?? -1];\n if (bucket) bucket.push(node);\n if (node.kind === 'container') {\n for (let i = node.children.length - 1; i >= 0; i--) {\n stack.push(node.children[i]);\n }\n }\n }\n const out: Node<TData, TLayer, TPose>[] = [];\n for (const bucket of buckets) {\n for (const node of bucket) out.push(node);\n }\n return out;\n }\n\n return {\n ids() {\n const c = currentOrderCache();\n return (c.ids ??= walkIds());\n },\n nodes() {\n const c = currentOrderCache();\n return (c.nodes ??= walkNodes());\n },\n nodesOnLayer(layer) {\n const c = currentOrderCache();\n let byLayer = c.byLayer;\n if (!byLayer) {\n byLayer = new Map();\n for (const node of (c.nodes ??= walkNodes())) {\n let bucket = byLayer.get(node.layer);\n if (!bucket) byLayer.set(node.layer, (bucket = []));\n bucket.push(node);\n }\n c.byLayer = byLayer;\n }\n return byLayer.get(layer) ?? EMPTY_NODES;\n },\n invalidate,\n };\n}\n"],"mappings":"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"}
|