@woosh/meep-engine 3.15.0 → 3.16.0
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/editor/Editor.js +7 -7
- package/editor/actions/concrete/TransformModifyAction.d.ts +4 -4
- package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
- package/editor/actions/concrete/TransformModifyAction.js +4 -4
- package/editor/camera/camera_framing.js +7 -7
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts +20 -0
- package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -0
- package/editor/ecs/component/editors/ecs/Transform64Editor.js +70 -0
- package/editor/ecs/component/prototypeObjectEditor.js +2 -2
- package/editor/ecs/component/registerEngineComponentEditors.js +3 -3
- package/editor/particles/effect/ParticleEffectDocument.d.ts +396 -0
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -0
- package/editor/particles/effect/ParticleEffectDocument.js +989 -0
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts +113 -0
- package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -0
- package/editor/particles/effect/ParticleReferenceSimulation.js +377 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts +35 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts.map +1 -0
- package/editor/particles/effect/actions/ParticleGroupDefineAction.js +45 -0
- package/editor/particles/effect/make_starter_particle_effect.d.ts +23 -0
- package/editor/particles/effect/make_starter_particle_effect.d.ts.map +1 -0
- package/editor/particles/effect/make_starter_particle_effect.js +177 -0
- package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -1
- package/editor/persistence/buildNewSceneDataset.js +10 -8
- package/editor/process/symbolic/AudioEmitterSymbolicDisplay.js +67 -67
- package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
- package/editor/process/symbolic/GridPositionSymbolicDisplay.js +6 -6
- package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -1
- package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.js +6 -3
- package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.js +6 -6
- package/editor/selection/editor_pick.js +130 -130
- package/editor/templates/entity_templates.js +7 -7
- package/editor/tools/TransformToolV2.d.ts +3 -3
- package/editor/tools/TransformToolV2.d.ts.map +1 -1
- package/editor/tools/TransformToolV2.js +58 -25
- package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -1
- package/editor/tools/paint/TerrainHeightPaintTool.js +11 -9
- package/editor/tools/v2/GizmoNode.js +2 -2
- package/editor/tools/v2/TransformControls.d.ts +3 -3
- package/editor/tools/v2/TransformControls.d.ts.map +1 -1
- package/editor/tools/v2/TransformControls.js +1003 -971
- package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
- package/editor/tools/v2/handle/gizmo_drag_plane.js +6 -1
- package/editor/view/ecs/components/common/AutoCanvasView.js +17 -0
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +143 -2
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +358 -6
- package/editor/view/node-graph/NodeGraphMinimapView.d.ts +120 -0
- package/editor/view/node-graph/NodeGraphMinimapView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphMinimapView.js +859 -0
- package/editor/view/node-graph/NodeGraphPaletteView.d.ts +112 -0
- package/editor/view/node-graph/NodeGraphPaletteView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphPaletteView.js +352 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts +76 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphSearchMenuView.js +247 -0
- package/editor/view/node-graph/NodeGraphView.d.ts +147 -5
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +809 -76
- package/editor/view/node-graph/NodeIconView.d.ts +33 -0
- package/editor/view/node-graph/NodeIconView.d.ts.map +1 -0
- package/editor/view/node-graph/NodeIconView.js +54 -0
- package/editor/view/node-graph/NodeView.d.ts +71 -1
- package/editor/view/node-graph/NodeView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeView.js +318 -17
- package/editor/view/node-graph/PortView.d.ts +41 -1
- package/editor/view/node-graph/PortView.d.ts.map +1 -1
- package/editor/view/node-graph/PortView.js +121 -69
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts +16 -3
- package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/ConnectionDeleteAction.js +29 -3
- package/editor/view/node-graph/actions/NodeCreateAction.d.ts +65 -0
- package/editor/view/node-graph/actions/NodeCreateAction.d.ts.map +1 -0
- package/editor/view/node-graph/actions/NodeCreateAction.js +108 -0
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts +6 -0
- package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
- package/editor/view/node-graph/actions/NodeDeleteAction.js +24 -2
- package/editor/view/node-graph/connection_wire_geometry.d.ts +34 -0
- package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
- package/editor/view/node-graph/connection_wire_geometry.js +79 -3
- package/editor/view/node-graph/node-graph.css +678 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts +37 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.js +479 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.d.ts +61 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleEffectEditorView.js +223 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +25 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +606 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +156 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1636 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +22 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleNodeParametersView.js +520 -0
- package/editor/view/particles/effect/ParticlePreviewView.d.ts +52 -0
- package/editor/view/particles/effect/ParticlePreviewView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticlePreviewView.js +533 -0
- package/editor/view/particles/effect/particle-editor.css +556 -0
- package/editor/view/prepareMeshLibrary.d.ts.map +1 -1
- package/editor/view/prepareMeshLibrary.js +8 -4
- package/package.json +1 -1
- package/samples/engine/first-scene/main.js +152 -152
- package/samples/generation/generators/mir_generator_place_bases.js +3 -3
- package/src/core/assert.d.ts +28 -24
- package/src/core/assert.d.ts.map +1 -1
- package/src/core/assert.js +34 -26
- package/src/core/geom/3d/shape/PosedShape3D.d.ts +17 -0
- package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
- package/src/core/geom/3d/shape/PosedShape3D.js +34 -2
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts +17 -0
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts.map +1 -0
- package/src/core/graph/format/graphviz/graphviz_escape_html_label.js +25 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts +16 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts.map +1 -0
- package/src/core/graph/format/graphviz/graphviz_escape_quoted.js +24 -0
- package/src/core/model/node-graph/NodeGraph.d.ts +12 -0
- package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
- package/src/core/model/node-graph/NodeGraph.js +21 -6
- package/src/core/model/node-graph/node/NodeDescription.d.ts +36 -0
- package/src/core/model/node-graph/node/NodeDescription.d.ts.map +1 -1
- package/src/core/model/node-graph/node/NodeDescription.js +41 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts +119 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/ConnectionVisualData.js +317 -0
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts +4 -0
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.js +125 -22
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +91 -2
- package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/NodeGraphVisualData.js +164 -113
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts +162 -0
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.js +288 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +109 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.js +141 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +149 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +175 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +137 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.js +242 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +114 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.js +300 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +86 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.js +168 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts +48 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +555 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts +34 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_layers.js +202 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts +34 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_break_cycles.js +254 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +184 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +95 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +56 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +131 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +36 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.js +415 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts +21 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/layout_orient_links.js +49 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts +41 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_connections.js +309 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +33 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +237 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +25 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.js +220 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts.map +1 -0
- package/src/core/model/node-graph/visual/layout/route_to_spline.js +120 -0
- package/src/engine/EngineHarness.d.ts.map +1 -1
- package/src/engine/EngineHarness.js +593 -586
- package/src/engine/EntityCreator.js +116 -116
- package/src/engine/achievements/AchievementManager.js +437 -437
- package/src/engine/animation/AnimatedActions.js +111 -111
- package/src/engine/animation/AnimationUtils.d.ts.map +1 -1
- package/src/engine/animation/AnimationUtils.js +246 -234
- package/src/engine/animation/Animations.d.ts +1 -0
- package/src/engine/animation/Animations.d.ts.map +1 -1
- package/src/engine/animation/Animations.js +13 -5
- package/src/engine/animation/clip/bind_property_writer.d.ts.map +1 -1
- package/src/engine/animation/clip/bind_property_writer.js +12 -5
- package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts +29 -0
- package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts.map +1 -0
- package/src/engine/animation/curve/binding/BoundTransform64Writer.js +80 -0
- package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +4 -4
- package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +1 -1
- package/src/engine/asset/loaders/gltf_test_fixtures.js +5 -4
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +12 -12
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +77 -44
- package/src/engine/control/first-person/abilities/LedgeGrab.js +1 -1
- package/src/engine/control/first-person/abilities/Mantle.js +1 -1
- package/src/engine/control/first-person/abilities/Slide.js +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.d.ts +5 -9
- package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
- package/src/engine/control/first-person/collision/KinematicMover.js +59 -29
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +2 -2
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
- package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +7 -7
- package/src/engine/ecs/EventType.d.ts +1 -0
- package/src/engine/ecs/EventType.js +35 -10
- package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.d.ts.map +1 -1
- package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.js +12 -4
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +4 -4
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
- package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +10 -11
- package/src/engine/ecs/grid/pick.js +1 -1
- package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts +1 -1
- package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +13 -13
- package/src/engine/ecs/gui/hud/testHudEdgeStick.js +3 -3
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +10 -10
- package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
- package/src/engine/ecs/ik/InverseKinematicsSystem.js +8 -8
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +1 -1
- package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +120 -97
- package/src/engine/ecs/ik/ik_bone_chain.d.ts +16 -5
- package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_bone_chain.js +16 -4
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +7 -3
- package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_probe_terrain_contact.js +20 -16
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +18 -0
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -0
- package/src/engine/ecs/ik/ik_write_local_rotation.js +30 -0
- package/src/engine/ecs/parent/EntityNode.d.ts +24 -6
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +54 -42
- package/src/engine/ecs/parent/EntityNodeFlags.d.ts +0 -1
- package/src/engine/ecs/parent/EntityNodeFlags.js +7 -8
- package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
- package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
- package/src/engine/ecs/speaker/VoiceSystem.js +4 -4
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
- package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts +5 -2
- package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/Terrain.js +7 -4
- package/src/engine/ecs/terrain/ecs/TerrainSystem.js +3 -3
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +7 -7
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +84 -36
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +513 -0
- package/src/engine/ecs/transform/Transform64.d.ts +48 -11
- package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
- package/src/engine/ecs/transform/Transform64.js +54 -15
- package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts +37 -0
- package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts.map +1 -0
- package/src/engine/ecs/transform/Transform64SerializationAdapter.js +75 -0
- package/src/engine/ecs/transform/__probe.d.ts +4 -0
- package/src/engine/ecs/transform/__probe.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_allocation_probe.d.ts +31 -0
- package/src/engine/ecs/transform/t64_allocation_probe.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_allocation_probe.js +78 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts +33 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_announce_change.js +39 -0
- package/src/engine/ecs/transform/t64_equals_components.d.ts +30 -0
- package/src/engine/ecs/transform/t64_equals_components.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_equals_components.js +59 -0
- package/src/engine/ecs/transform/t64_read_rotation.d.ts +13 -0
- package/src/engine/ecs/transform/t64_read_rotation.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_rotation.js +16 -0
- package/src/engine/ecs/transform/t64_read_translation.d.ts +14 -0
- package/src/engine/ecs/transform/t64_read_translation.d.ts.map +1 -0
- package/src/engine/ecs/transform/t64_read_translation.js +17 -0
- package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts +5 -5
- package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachment.js +4 -4
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +10 -10
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +71 -20
- package/src/engine/graphics/debug/createDebugLabel.js +3 -3
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +5 -4
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +8 -3
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +6 -6
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +25 -13
- package/src/engine/graphics/ecs/camera/topdown/TopDownCameraLanderSystem.js +1 -1
- package/src/engine/graphics/ecs/mesh/setMesh.js +2 -2
- package/src/engine/graphics/ecs/path/entity/EntityPath.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/entity/EntityPath.js +21 -7
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts +4 -4
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts.map +1 -1
- package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.js +4 -4
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +2 -2
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +145 -135
- package/src/engine/graphics/geometry/MikkT/Build4RuleGroups.js +2 -2
- package/src/engine/graphics/geometry/MikkT/DegenEpilogue.js +1 -1
- package/src/engine/graphics/geometry/MikkT/DegenPrologue.js +1 -1
- package/src/engine/graphics/geometry/MikkT/EvalTspace.js +1 -1
- package/src/engine/graphics/geometry/MikkT/GenerateTSpaces.js +3 -3
- package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +659 -0
- package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +21 -5
- package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +45 -0
- package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FrameGraph.js +282 -60
- package/src/engine/graphics/render/frame_graph/FramePassBuilder.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassBuilder.js +20 -9
- package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts +12 -0
- package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassNode.js +13 -0
- package/src/engine/graphics/render/frame_graph/FramePassResources.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/FramePassResources.js +5 -0
- package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts +19 -1
- package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/ResourceEntry.js +23 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts +15 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.js +33 -16
- package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.d.ts.map +1 -1
- package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.js +19 -1
- package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +6 -6
- package/src/engine/graphics3/CameraSystem.d.ts +6 -6
- package/src/engine/graphics3/CameraSystem.d.ts.map +1 -1
- package/src/engine/graphics3/CameraSystem.js +170 -170
- package/src/engine/graphics3/DecalSystem.d.ts +6 -6
- package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
- package/src/engine/graphics3/DecalSystem.js +449 -449
- package/src/engine/graphics3/LightSystem.d.ts +6 -6
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +234 -221
- package/src/engine/graphics3/MeshSystem.d.ts +6 -6
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +53 -22
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +20 -15
- package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticipatingMediaSystem.js +198 -184
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts +6 -6
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +310 -289
- package/src/engine/graphics3/PickingSystem.d.ts +6 -6
- package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
- package/src/engine/graphics3/PickingSystem.js +273 -273
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -6
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +180 -169
- package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
- package/src/engine/graphics3/TerrainSystem.js +565 -566
- package/src/engine/graphics3/Trail3DSystem.d.ts +6 -6
- package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
- package/src/engine/graphics3/Trail3DSystem.js +221 -221
- package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
- package/src/engine/graphics3/camera_sync_from_transform.d.ts.map +1 -1
- package/src/engine/graphics3/camera_sync_from_transform.js +2 -1
- package/src/engine/graphics3/debug/gizmo_view_from_camera.js +4 -4
- package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts +6 -0
- package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts.map +1 -1
- package/src/engine/graphics3/particles/GPUParticularRenderer.js +82 -53
- package/src/engine/graphics3/particles/particle_gpu_records.d.ts +12 -8
- package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
- package/src/engine/graphics3/particles/particle_gpu_records.js +53 -45
- package/src/engine/graphics3/preview/make_model_preview_scene.js +1 -1
- package/src/engine/graphics3/shade_camera_projection_ray.js +4 -4
- package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +1 -1
- package/src/engine/graphics3/shade_node_to_entity_composition.js +88 -84
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +7 -7
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
- package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +8 -8
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +9 -8
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +29 -8
- package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.d.ts.map +1 -1
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +35 -21
- package/src/engine/intelligence/behavior/util/RotationBehavior.js +5 -5
- package/src/engine/intelligence/mcts/StateNode.js +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +7 -7
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -15
- package/src/engine/interpolation/pose_interpoland.d.ts +2 -2
- package/src/engine/interpolation/pose_interpoland.js +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +39 -14
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +7 -7
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/TransformReplicationAdapter.js +19 -20
- package/src/engine/network/replication/Replicator.d.ts +5 -3
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +65 -16
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +9 -3
- package/src/engine/physics/constraint/solve_constraints.js +10 -10
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2337 -2310
- package/src/engine/physics/ecs/find_non_finite_physics_state.js +6 -6
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +7 -7
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +16 -8
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +4 -4
- package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/FluidSystem.js +6 -6
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts +2 -2
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts.map +1 -1
- package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +4 -4
- package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +7 -7
- package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +4 -4
- package/src/engine/physics/fluid/effector/WakeFluidEffector.js +7 -7
- package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
- package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
- package/src/engine/physics/integration/integrate_position.js +13 -12
- package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.d.ts.map +1 -1
- package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.js +23 -5
- package/src/engine/physics/narrowphase/compute_penetration.js +18 -14
- package/src/engine/physics/narrowphase/convex_convex_manifold.js +2 -2
- package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +9 -9
- package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
- package/src/engine/physics/narrowphase/narrowphase_step.js +95 -68
- package/src/engine/physics/narrowphase/refine_ray_concave.js +1 -1
- package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -3
- package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
- package/src/engine/physics/queries/overlap_shape.js +19 -7
- package/src/engine/physics/queries/raycast.js +3 -3
- package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
- package/src/engine/physics/queries/shape_cast.js +628 -620
- package/src/engine/physics/solver/solve_contacts.js +10 -10
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts +6 -5
- package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
- package/src/engine/physics/vehicle/RaycastVehicle.js +10 -5
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts +16 -4
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +70 -11
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +7 -7
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +343 -338
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +2 -2
- package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/LiveEmitterSet.js +356 -345
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +23 -2
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -1
- package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +174 -140
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts +6 -6
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +185 -184
- package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +1 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts +2 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/AcousticRegionIndex.js +4 -3
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts +3 -2
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts.map +1 -1
- package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +6 -4
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +10 -6
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +32 -7
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
- package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
- package/src/format/scene/gltf/gltf_component_type.js +3 -1
- package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
- package/src/format/texture/ktx2/ktx2_read.js +2 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
- package/src/generation/markers/MarkerNode.d.ts +3 -3
- package/src/generation/markers/MarkerNode.d.ts.map +1 -1
- package/src/generation/markers/MarkerNode.js +3 -3
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
- package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
- package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
- package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
- package/src/shade/playground/avboit/main.js +3 -3
- package/src/shade/playground/basis_textures/main.js +1 -1
- package/src/shade/playground/ground_seam/main.js +1 -1
- package/src/shade/playground/particle_editor/README.md +175 -0
- package/src/shade/playground/particle_editor/index.html +76 -0
- package/src/shade/playground/particle_editor/main.d.ts +2 -0
- package/src/shade/playground/particle_editor/main.d.ts.map +1 -0
- package/src/shade/playground/particle_editor/main.js +139 -0
- package/src/shade/playground/particle_system/README.md +92 -62
- package/src/shade/playground/particle_system/index.html +67 -21
- package/src/shade/playground/particle_system/main.js +247 -102
- package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.d.ts +21 -18
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -0
- package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.js +197 -181
- package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +487 -670
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
- package/src/shade/playground/sponza_path_trace/main.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +917 -917
- package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
- package/src/shade/renderer/Renderer.d.ts +28 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +140 -8
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
- package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
- package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +27 -0
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.d.ts +24 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.d.ts.map +1 -0
- package/src/shade/renderer/buffer/table/gpu_database_words.js +92 -0
- package/src/shade/renderer/camera/Camera.d.ts +2 -2
- package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
- package/src/shade/renderer/camera/Camera.js +11 -5
- package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
- package/src/shade/renderer/camera/GPUCameraContext.js +2 -1
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts +3 -3
- package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/OrbitalCameraController.js +31 -16
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +2 -2
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +4 -3
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +10 -5
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
- package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +8 -4
- package/src/shade/renderer/extension/FrameContext.d.ts.map +1 -1
- package/src/shade/renderer/extension/FrameContext.js +5 -0
- package/src/shade/renderer/extension/FrameRecord.d.ts +16 -0
- package/src/shade/renderer/extension/FrameRecord.d.ts.map +1 -1
- package/src/shade/renderer/extension/FrameRecord.js +31 -0
- package/src/shade/renderer/extension/GBufferTextures.d.ts +11 -0
- package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
- package/src/shade/renderer/extension/GBufferTextures.js +14 -0
- package/src/shade/renderer/geometry/attribute/gpu_vertex_buffer_layout_from_spec.js +1 -1
- package/src/shade/renderer/geometry/util/geometry_stripify.js +6 -6
- package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +8 -8
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +14 -5
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +17 -9
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.js +4 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts +2 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +11 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.js +4 -2
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
- package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +5 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
- package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +35 -11
- package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
- package/src/shade/renderer/particles/DESIGN.md +271 -112
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +251 -86
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +822 -146
- package/src/shade/renderer/particles/ParticleConstants.d.ts +96 -3
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +103 -4
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +5 -4
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +11 -15
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +2 -2
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -1
- package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +20 -15
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +7 -8
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +7 -17
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +56 -0
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +68 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +39 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +52 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +83 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +166 -0
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts +21 -5
- package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/chunk_particle_emitter.js +44 -85
- package/src/shade/renderer/particles/data/particle_header.d.ts +62 -0
- package/src/shade/renderer/particles/data/particle_header.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/particle_header.js +103 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +179 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +120 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +90 -1
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts +283 -0
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleNodeGroup.js +419 -0
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +44 -2
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +476 -40
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +188 -0
- package/src/shade/renderer/particles/graph/ParticleValueType.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -0
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +16 -9
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +464 -205
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts +11 -0
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/flatten_particle_graph.js +213 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts +27 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +75 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +83 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +319 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts +22 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +517 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts +70 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_utility.js +161 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts +8 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +159 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +88 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +234 -0
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts +98 -0
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/make_particle_group.js +427 -0
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +11 -4
- package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_authoring.js +121 -108
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +38 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +25 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts +29 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +87 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_graph_json.js +196 -0
- package/src/shade/renderer/particles/graph/particle_group_json.d.ts +86 -0
- package/src/shade/renderer/particles/graph/particle_group_json.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_group_json.js +182 -0
- package/src/shade/renderer/particles/graph/particle_group_library.d.ts +33 -0
- package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_group_library.js +75 -0
- package/src/shade/renderer/particles/graph/particle_node_library.d.ts +37 -0
- package/src/shade/renderer/particles/graph/particle_node_library.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_library.js +64 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +146 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +234 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts +30 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +286 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +66 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +439 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +143 -68
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +424 -71
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts +107 -0
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph_particles_avboit.js +312 -0
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +41 -8
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +111 -33
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +13 -10
- package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleAssembler.js +30 -26
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +27 -15
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +139 -34
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +117 -9
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +296 -37
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +149 -0
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_assembly.js +999 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +25 -3
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +33 -5
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +160 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +478 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +291 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +647 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +95 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +213 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +16 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +223 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +121 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +206 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +11 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +197 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +561 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +72 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +86 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +271 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +268 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +151 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +131 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
- package/src/shade/renderer/particles/particle_test_fixtures.js +203 -0
- package/src/shade/renderer/particles/runtime/Emitter.d.ts +219 -0
- package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +128 -60
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +286 -117
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +264 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +404 -0
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +49 -15
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +51 -18
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +72 -32
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +4 -4
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +15 -0
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +17 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +75 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts +20 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +94 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +15 -5
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +1 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +1 -2
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +11 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +13 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts +17 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.js +22 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +14 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +23 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts +18 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.js +24 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +26 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +59 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +14 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +153 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts +3 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +124 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts +19 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +147 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -8
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +72 -37
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts +5 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +216 -0
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +7 -3
- package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_render.js +132 -197
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +78 -24
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts +26 -0
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.js +66 -0
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
- package/src/shade/renderer/particles/sort/shader_particle_sort.js +21 -36
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +2 -2
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +100 -90
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +270 -138
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +1 -2
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +0 -3
- package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +1 -1
- package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
- package/src/shade/renderer/postprocess/nss/NSS.js +3 -2
- package/src/shade/renderer/postprocess/nss/generate_NSS_WEIGHTS_ACTUAL.js +3 -2
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +87 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +179 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +27 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +9 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +12 -3
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +25 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +69 -10
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +10 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +4 -39
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts +13 -3
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.js +15 -5
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts +8 -0
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/chunk_random_uint.js +15 -5
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts +7 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.js +17 -7
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts +17 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.js +26 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts +15 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.js +26 -0
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +8 -2
- package/src/shade/renderer/shadow/map/PointLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/PointLightShadowmap.js +7 -2
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +3 -15
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.d.ts.map +1 -1
- package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +10 -4
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +1 -1
- package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +7 -2
- package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +2 -2
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +3 -3
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
- package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +3 -3
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +66 -5
- package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLLanguageCore.js +35 -4
- package/src/view/minimap/Minimap.d.ts.map +1 -1
- package/src/view/minimap/Minimap.js +227 -225
- package/src/view/minimap/MinimapCanvasView.js +3 -3
- package/src/view/minimap/MinimapMarker.d.ts +45 -0
- package/src/view/minimap/MinimapMarker.d.ts.map +1 -0
- package/src/view/minimap/MinimapMarker.js +80 -0
- package/src/view/minimap/MinimapMarkerCollection.d.ts +6 -5
- package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
- package/src/view/minimap/MinimapMarkerCollection.js +6 -6
- package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts +19 -0
- package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts.map +1 -0
- package/src/view/minimap/MinimapMarkerSerializationAdapter.js +42 -0
- package/src/view/minimap/dom/MinimapCameraView.d.ts +1 -1
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +23 -4
- package/src/view/minimap/dom/MinimapMarkerView.js +3 -3
- package/src/view/minimap/gl/MarkerGL.js +3 -3
- package/src/view/util/DomLayoutFrame.d.ts +53 -0
- package/src/view/util/DomLayoutFrame.d.ts.map +1 -0
- package/src/view/util/DomLayoutFrame.js +122 -0
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
- package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
- package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +0 -214
- package/src/shade/renderer/particles/particle_prototype.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
- package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
|
@@ -0,0 +1,659 @@
|
|
|
1
|
+
# FrameGraph — correctness and invariant fixes, 2026-09-04
|
|
2
|
+
|
|
3
|
+
Working ledger for the confirmed **correctness** and **invariant** findings of the FrameGraph audit
|
|
4
|
+
of 2026-09-04. The allocation and performance findings from the same audit are **out of scope here**
|
|
5
|
+
— they have their own plan and their own numbers.
|
|
6
|
+
|
|
7
|
+
Companion to `FRAME_GRAPH_RECOMMENDATIONS.md`, which records the earlier round; nothing marked DONE
|
|
8
|
+
or WITHDRAWN there is re-litigated below.
|
|
9
|
+
|
|
10
|
+
**Why these matter more than the assert count suggests.** meep ships raw source and the consuming
|
|
11
|
+
project strips assertions (`README.md:249`, "Shipping a build" — `@rollup/plugin-strip`'s defaults
|
|
12
|
+
already cover `assert.*`). So in a shipped game `validate()` never runs, `FramePassResources.get()`'s
|
|
13
|
+
declaration check never runs, and every defect below is **silent**. That is the reason to fix them
|
|
14
|
+
rather than leave them to the asserts.
|
|
15
|
+
|
|
16
|
+
**The constraint that shapes every fix here.** The strip matcher is
|
|
17
|
+
`^(?:console\.\w+|assert\.\w+)$` and it deletes the whole `ExpressionStatement`, arguments included.
|
|
18
|
+
A check moved out of `assert.*` into a differently-named helper or an inline `if (…) throw` stops
|
|
19
|
+
being stripped and becomes permanent production cost. So: new checks go in as `assert.*` calls, or
|
|
20
|
+
as plain `if`-throws only where the check must survive stripping and the cost is deliberate.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Every finding, and where it went
|
|
25
|
+
|
|
26
|
+
The audit's 28 correctness/invariant findings, against the sections below. Two of the audit's own IDs
|
|
27
|
+
collapse into one section where they are the same defect seen from two ends.
|
|
28
|
+
|
|
29
|
+
| audit finding | § | status |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `lifetime-ignores-side-effect-passes` (+ its 3 duplicates) | 2 | DONE |
|
|
32
|
+
| `resource-entry-destroy-never-nulls` | 3 | DONE |
|
|
33
|
+
| `execute-leaks-transients-when-a-pass-throws` | 4 | DONE |
|
|
34
|
+
| `void-context-cannot-hold-two-transients` | 1 | DONE |
|
|
35
|
+
| `bare-assert-ships-to-production` | 7 | DONE |
|
|
36
|
+
| `sky-lut-superseded-read` | 18 | DONE (module not wired) |
|
|
37
|
+
| `probe-atlas-drops-versioned-handles` | 19 | DONE |
|
|
38
|
+
| `paint-border-depth-returns-void` | 19 | DONE |
|
|
39
|
+
| `rasterize-handles-dropped-at-call-site` | 22 | DONE |
|
|
40
|
+
| `gbuffer-albedo-superseded-not-republished` | 23 | DONE |
|
|
41
|
+
| `import-aliasing-defeats-validate` | 15 | DONE, as detection |
|
|
42
|
+
| `unparented-transient-never-allocated` | 5 | DONE |
|
|
43
|
+
| `resources-get-checks-declaration-not-allocation` | 6 | DONE |
|
|
44
|
+
| `validate-runs-as-an-assert-argument` | 13 | **WITHDRAWN** |
|
|
45
|
+
| `signal-swallow-defeats-one-shot-guards` | 14 | DOCUMENTED |
|
|
46
|
+
| `resource-manager-identity-keyed` | 1 | DONE |
|
|
47
|
+
| `pool-drops-resource-on-perkey-overflow` | 9 | DONE |
|
|
48
|
+
| `texture-equals-missing-type-check` | 8 | DONE |
|
|
49
|
+
| `graph-read-buffer-defaults-to-pooled-size` | 16 | DONE |
|
|
50
|
+
| `atlas-to-sh-undeclared-read` | 19 | DONE |
|
|
51
|
+
| `side-door-resource-access` | 20 | DONE at the named site |
|
|
52
|
+
| `profiler-recorder-leaked-on-pass-throw` | 21 | DONE, unpinned |
|
|
53
|
+
| `dot-html-label-unescaped-names` | 10 | DONE |
|
|
54
|
+
| `dot-tooltip-wrong-escaper` | 10 | DONE |
|
|
55
|
+
| `dot-fill-colours-are-linear-light` | 10 | DONE |
|
|
56
|
+
| `double-write-same-handle-mints-orphan-version` | 11 | DONE |
|
|
57
|
+
| `frame-context-describe-skips-open-guard` | 12 | DONE |
|
|
58
|
+
| `debug-reprojection-spurious-read` | 17 | DONE (module dead) |
|
|
59
|
+
| `shadow-atlas-imported-per-cascade-job` | 24 | **DEFERRED** |
|
|
60
|
+
|
|
61
|
+
One withdrawn, one deferred, three fixed without a test that can pin them — each says why in its own
|
|
62
|
+
section rather than here.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 1. The void backend cannot hold two live transients — **DONE**
|
|
67
|
+
|
|
68
|
+
`VoidRenderContext.createResource` returned `null` for every descriptor while
|
|
69
|
+
`RenderResourceManager` keys its live-descriptor table by resource *identity*
|
|
70
|
+
(`RenderResourceManager.js:50`), so the second concurrently-live transient in any graph collided
|
|
71
|
+
with the first and threw `Resource is already associated with a live descriptor` from the allocation
|
|
72
|
+
preamble at `FrameGraph.js:624` — before any pass callback, so the error was not even decorated with
|
|
73
|
+
a pass name.
|
|
74
|
+
|
|
75
|
+
That is why `FrameGraph.spec.js` hand-rolls its own `DummyRenderer` for every test that allocates and
|
|
76
|
+
uses `VoidRenderContext.INSTANCE` only for the empty graph: the shipped device-free backend could not
|
|
77
|
+
execute the one graph shape a resource-lifetime test needs. It is the cause of which "no spec pins
|
|
78
|
+
lifetimes" is the symptom, so it had to land first.
|
|
79
|
+
|
|
80
|
+
Fixed by handing back a distinct token per call — `{ void_resource: <n> }` from a per-context
|
|
81
|
+
counter. `INSTANCE` is kept: with distinct tokens there is no poisoned entry to survive into a later
|
|
82
|
+
test, and two specs already import it.
|
|
83
|
+
|
|
84
|
+
`RenderResourceManager.get` now rejects a `null`/`undefined` from `createResource` explicitly, naming
|
|
85
|
+
the backend class and the descriptor, so a backend that forgets fails at the point of the mistake
|
|
86
|
+
rather than on the next allocation with a message about corruption. This is deliberately a plain
|
|
87
|
+
`if`-throw and not an `assert.*`: it guards the manager's own identity-keyed invariant against a
|
|
88
|
+
third-party backend, and it must survive stripping.
|
|
89
|
+
|
|
90
|
+
Also covers the `resource-manager-identity-keyed` finding, which named the same pair of files.
|
|
91
|
+
Re-keying the live table by descriptor rather than by identity was **not** done: identity keying is
|
|
92
|
+
what makes the double-release guard possible, and with the backend fixed there is no live case that
|
|
93
|
+
needs it.
|
|
94
|
+
|
|
95
|
+
Pinned by `backend/void/VoidRenderContext.spec.js` — three tests, all red before the change: a
|
|
96
|
+
two-transient graph executing against a fresh context, distinct tokens per call, and the named-backend
|
|
97
|
+
failure message.
|
|
98
|
+
|
|
99
|
+
Commit: `9a9483bcb`
|
|
100
|
+
|
|
101
|
+
## 2. `compile()` and `execute()` disagreed about which passes exist — **DONE**
|
|
102
|
+
|
|
103
|
+
The headline defect, raised independently by four reviewers. `compile()`'s lifetime loop skipped any
|
|
104
|
+
pass with `ref_count === 0` (`FrameGraph.js:576`); `execute()` ran a pass whenever `can_execute()`
|
|
105
|
+
said so (`ref_count > 0 || has_side_effects`, `FramePassNode.js:116`). A pass that only reads and
|
|
106
|
+
calls `make_side_effect()` — the shape of *every* readback helper in the tree — therefore never
|
|
107
|
+
became any resource's `entry.last`, so the transients it reads went back to the pool after an
|
|
108
|
+
earlier pass. The pool re-issues within the frame, matching on approximate size and a usage
|
|
109
|
+
superset, so a later pass could be handed the same buffer and write into it before the reader
|
|
110
|
+
encoded.
|
|
111
|
+
|
|
112
|
+
Live on the readback path: `graph_read_buffer.js:110-113` and `graph_inspect_gpu_buffer.js:130-134`
|
|
113
|
+
are both `read` + `make_side_effect` with no write.
|
|
114
|
+
|
|
115
|
+
Fixed as **one shared survivor predicate**, not the one-word change the audit suggested.
|
|
116
|
+
`compile()` now builds `#surviving_passes` from `can_execute()` and computes lifetimes over exactly
|
|
117
|
+
that array; `execute()` iterates the same array and no longer asks the question a second time. The
|
|
118
|
+
two cannot drift apart again because there is only one answer.
|
|
119
|
+
|
|
120
|
+
Pinned by `FrameGraph.lifetimes.spec.js` — "a side-effect pass that only reads keeps the transient
|
|
121
|
+
it reads alive" (asserts both `entry.last` and that a later same-shape allocation does *not* get
|
|
122
|
+
handed the producer's resource), and "compile() and execute() agree on which passes run".
|
|
123
|
+
|
|
124
|
+
Commit: `3983273c9`
|
|
125
|
+
|
|
126
|
+
## 3. `ResourceEntry.destroy()` never cleared the handle — **DONE**
|
|
127
|
+
|
|
128
|
+
`destroy()` called `resources.release(this.resource)` and left the field pointing at a resource the
|
|
129
|
+
pool had taken back, so any sweep filtered on `resource !== null` — which is the obvious filter for
|
|
130
|
+
item 4 below — would release each already-released entry a second time. The pool hands the same
|
|
131
|
+
object straight back out, so by then the stale handle may belong to a live entry, and
|
|
132
|
+
`TransientResourcePool.release` checks `bound.has(resource)`, which is **true** for the new owner.
|
|
133
|
+
The sweep would pool a resource still in use, silently, with no assert left in a shipped build to
|
|
134
|
+
notice.
|
|
135
|
+
|
|
136
|
+
`destroy()` now nulls the field, and `create()` asserts the entry is empty before allocating.
|
|
137
|
+
|
|
138
|
+
Landed in the same commit as item 2, as it had to be: on its own, nulling the field turns a
|
|
139
|
+
stale-but-live handle into a null dereference inside a pass.
|
|
140
|
+
|
|
141
|
+
Note on the production path: the manager the renderer actually uses is
|
|
142
|
+
`shade/renderer/ResourceManager.js` (`GraphicsExecutionContext.js:30` overwrites the base), **not**
|
|
143
|
+
`frame_graph/resource/RenderResourceManager.js`. Its `release` returns false silently for an
|
|
144
|
+
unbound resource, so the real hazard here is aliasing, not a thrown error.
|
|
145
|
+
|
|
146
|
+
Pinned by "a transient holds no resource handle once the graph has released it".
|
|
147
|
+
|
|
148
|
+
Commit: `3983273c9`
|
|
149
|
+
|
|
150
|
+
## 4. `execute()` leaked every live transient when a pass threw — **DONE**
|
|
151
|
+
|
|
152
|
+
No cleanup path at all: the failure was decorated and rethrown, so the per-pass release scan never
|
|
153
|
+
ran for the failing pass or any pass after it. A render loop that catches and carries on — the usual
|
|
154
|
+
shape — leaks a full set of the graph's transients per failing frame.
|
|
155
|
+
|
|
156
|
+
`execute()`'s pass loop is now wrapped, and on the way out `#release_live_transients` walks the
|
|
157
|
+
registry once, releasing every `isTransient() && resource !== null` entry before re-raising.
|
|
158
|
+
|
|
159
|
+
Two placement decisions, both deliberate:
|
|
160
|
+
|
|
161
|
+
- The sweep is in a `catch` around the whole loop, **not** in a `finally` around the pass body. That
|
|
162
|
+
inner `finally` belongs to the `onPassBegin`/`onPassEnd` bracket and runs once per pass; a release
|
|
163
|
+
scan there would run on the success path too.
|
|
164
|
+
- `onExecuted` stays success-only, and now says so on the field. It means "the frame's work is
|
|
165
|
+
recorded", which a failed frame has not done. It has no subscribers anywhere in the tree, so the
|
|
166
|
+
contract was still free to choose.
|
|
167
|
+
|
|
168
|
+
Pinned by "a pass that throws does not leak the transients allocated before it" (asserts the pool
|
|
169
|
+
re-issues both objects afterwards) and "the leak sweep does not release a transient twice", which is
|
|
170
|
+
the regression guard for item 3.
|
|
171
|
+
|
|
172
|
+
Commit: `b0ee342de`
|
|
173
|
+
|
|
174
|
+
## 5. A transient created outside a pass was allocated by nobody — **DONE**
|
|
175
|
+
|
|
176
|
+
`FrameGraph.create_resource()` is public, and a transient created through it rather than through
|
|
177
|
+
`FramePassBuilder.create` appears in no pass's `resource_creates`, so nothing allocated it: the pass
|
|
178
|
+
was handed `null`, and — once item 2 made lifetimes cover the passes that actually run — the release
|
|
179
|
+
scan then tried to hand `null` back to the pool.
|
|
180
|
+
|
|
181
|
+
Item 2 is what surfaced it. Before that fix the shape was masked by the very defect being fixed: the
|
|
182
|
+
side-effect reader had `ref_count === 0`, so `entry.last` was never set and the release scan never
|
|
183
|
+
reached the entry. `RenderExtensionRegistry.spec.js:448` went red the moment lifetimes were correct,
|
|
184
|
+
which is why this had to land in the same commit rather than after it.
|
|
185
|
+
|
|
186
|
+
Fixed by allocating such an entry at its **first surviving user**. `compile()` fills a new
|
|
187
|
+
`FramePassNode.resource_allocates` — the pass's own creates, plus any unparented transient it is the
|
|
188
|
+
first survivor to touch — and `execute()` allocates from that list instead of from `resource_creates`.
|
|
189
|
+
The entry then has the same lifetime any other transient has.
|
|
190
|
+
|
|
191
|
+
Refusing the shape instead was rejected: `validate()` already blesses reading a transient no pass
|
|
192
|
+
writes ("the reader is then the pass about to fill it"), the extension surface hands the graph out
|
|
193
|
+
through `FrameContext.graph`, and three specs already record this way.
|
|
194
|
+
|
|
195
|
+
`ResourceEntry.producer` changes meaning from "pass that created this" to "surviving pass that
|
|
196
|
+
allocates this", which is the definition the audit's own note asked for and is documented on the
|
|
197
|
+
field. It was previously a dead write.
|
|
198
|
+
|
|
199
|
+
Pinned by "a transient created on the graph rather than by a pass is allocated by its first user",
|
|
200
|
+
which also asserts it is allocated exactly once and released at the end.
|
|
201
|
+
|
|
202
|
+
Commit: `3983273c9`
|
|
203
|
+
|
|
204
|
+
## 6. `FramePassResources.get()` checked declaration, never allocation — **DONE**
|
|
205
|
+
|
|
206
|
+
`get()` asserted the pass had declared a read/write/create of the handle, and never that anything
|
|
207
|
+
had put a resource behind it, so a pass could be handed `null` and the failure would surface later
|
|
208
|
+
inside a bind-group build, naming the consumer rather than the missing producer.
|
|
209
|
+
|
|
210
|
+
`get()` now also asserts `entry.resource` is non-null, naming the resource and the pass. Kept as an
|
|
211
|
+
`assert.*` so it strips: with item 5 landed there is no reachable way to hit it, and it is a
|
|
212
|
+
development-time diagnostic rather than a production guard.
|
|
213
|
+
|
|
214
|
+
The audit's second half — build a per-pass `Map<id, ResourceEntry>` in `compile()` and replace the
|
|
215
|
+
three `includes()` scans — is an **allocation/performance** change and belongs to that plan, not
|
|
216
|
+
here.
|
|
217
|
+
|
|
218
|
+
Commit: `3983273c9`
|
|
219
|
+
|
|
220
|
+
## 7. Seventeen bare `assert(` calls shipped past the strip — **DONE**
|
|
221
|
+
|
|
222
|
+
`assert.ok === assert` (`assert.js`), so `assert(cond, msg)` is a legal spelling that behaves
|
|
223
|
+
identically in development. Its callee is an **Identifier** rather than a MemberExpression, so
|
|
224
|
+
`@rollup/plugin-strip`'s default matcher `^(?:console\.\w+|assert\.\w+)$` never matched it and every
|
|
225
|
+
one of them survived into a shipped build.
|
|
226
|
+
|
|
227
|
+
The worst was `gpu_vertex_buffer_layout_from_spec.js:45` —
|
|
228
|
+
`assert(layout.validate(console.error), 'layout invalid')`, which is `FrameGraph.js:505`'s exact
|
|
229
|
+
shape on the wrong side of the matcher: a whole validator running on every vertex-buffer layout
|
|
230
|
+
build in a shipped game, and still able to throw there.
|
|
231
|
+
|
|
232
|
+
Seventeen one-character edits, `assert(` → `assert.ok(`, across `geometry_stripify.js` (6), the
|
|
233
|
+
MikkT files (8), `StateNode.js`, `GPUTypedTable.js` and the layout builder. The census matched the
|
|
234
|
+
audit's exactly.
|
|
235
|
+
|
|
236
|
+
**The rule inverts inside `assert.js` itself**, and that half landed too. Its own
|
|
237
|
+
`assert.isNumber` / `assert.defined` / `assert.ok` calls are the implementation, not a development
|
|
238
|
+
check, so stripping them leaves a module that still exports functions which no longer check
|
|
239
|
+
anything — silently, in any bundle that retains it. Nineteen internal calls now go through the
|
|
240
|
+
helpers' local names, which is what the top half of the file already did (`notEqual` calls `assert`,
|
|
241
|
+
not `assert.ok`); `isNumber`, `isString`, `isInteger` and `defined` were converted from anonymous
|
|
242
|
+
property assignments to named declarations so the rest could reach them.
|
|
243
|
+
|
|
244
|
+
Pinned by `core/assert_strip_contract.spec.js`, in the house style of `teardown_contract.spec.js`:
|
|
245
|
+
an acorn parse rather than a text match, because a bare `assert(` in a comment is not a call and a
|
|
246
|
+
file with its own local `assert` (`meshopt_clusterizer.js`, 37 of them) is not calling this one. Two
|
|
247
|
+
tests — no file importing `core/assert.js` calls it as a bare identifier, and `assert.js` contains no
|
|
248
|
+
`assert.*` call of its own.
|
|
249
|
+
|
|
250
|
+
Commit: `3ddc6745e`
|
|
251
|
+
|
|
252
|
+
## 8. A cross-type hash collision crashed the descriptor pool — **DONE**
|
|
253
|
+
|
|
254
|
+
`RenderResourceManager` holds textures and buffers in **one** `ImmutableObjectPool`, so the two
|
|
255
|
+
descriptor types share a hash table and a probe of one can land in a bucket holding the other.
|
|
256
|
+
`shade/device/graph/TextureResourceDescriptor.equals` never called `super.equals`, and its first act
|
|
257
|
+
was `isArrayEqualStrict(this.resolution, other.resolution)` — so a texture stored and then probed
|
|
258
|
+
with a buffer dereferenced `other.resolution.length` on undefined and threw a `TypeError` out of the
|
|
259
|
+
lookup instead of missing the cache. `BufferResourceDescriptor.equals` already got this right, so
|
|
260
|
+
only one direction was unsafe.
|
|
261
|
+
|
|
262
|
+
`equals` now starts with the identity shortcut and `super.equals(other)`.
|
|
263
|
+
|
|
264
|
+
`BufferResourceDescriptor.hash` made that collision far likelier than it had to be: `size ^ usage` is
|
|
265
|
+
symmetric, so `(x, y)` and `(y, x)` land on one value, and it omitted `ensure_cleared` entirely
|
|
266
|
+
although `equals` compares it — two descriptors that are *not* equal sharing every bucket. Replaced
|
|
267
|
+
with `combine_hash(size, usage, ensure_cleared[0], ensure_cleared[1])`.
|
|
268
|
+
|
|
269
|
+
Pinned by `shade/device/graph/resource_descriptor_equality.spec.js`, four tests, all red before: the
|
|
270
|
+
cross-type comparison in both directions, a real collision driven through an `ImmutableObjectPool`,
|
|
271
|
+
the clear-range hash, and the size/usage swap.
|
|
272
|
+
|
|
273
|
+
Verified against the suites outside `frame_graph` that read these classes:
|
|
274
|
+
`graph_radix_sort.spec.js`, `graph_bvh_build_lbvh.spec.js`,
|
|
275
|
+
`graph_rasterize_meshes_transparent_avboit.spec.js` and `sgpt_topology.spec.js`.
|
|
276
|
+
|
|
277
|
+
Commit: `19356c711`
|
|
278
|
+
|
|
279
|
+
## 9. `release()` dropped a resource the pool would not keep — **DONE**
|
|
280
|
+
|
|
281
|
+
`RenderResourceManager.release` removed the resource from the live-descriptor table and then ignored
|
|
282
|
+
the return of `ImmutableObjectPool.add`. `add` returns false **without firing `onRemoved`** when the
|
|
283
|
+
per-key bucket is full — unlike the global-capacity eviction path, which routes through `onRemoved`
|
|
284
|
+
to `destroyResource`. So the resource was neither pooled, nor destroyed, nor tracked. Leaked, and
|
|
285
|
+
leaked exactly under the pressure where leaking hurts: more same-shape transients alive at once than
|
|
286
|
+
the bucket holds, every frame.
|
|
287
|
+
|
|
288
|
+
`release` now destroys what the pool refuses. Of the two remedies the audit offered, this is the one
|
|
289
|
+
that keeps responsibilities straight: the pool's answer is "not mine", and deciding a GPU resource's
|
|
290
|
+
fate belongs to its owner.
|
|
291
|
+
|
|
292
|
+
Pinned by `resource/RenderResourceManager.spec.js` — over-subscribe one descriptor, release
|
|
293
|
+
everything, and assert that every resource is either handed back out again or destroyed. Red before
|
|
294
|
+
with 22 of 32 unaccounted for. The spec deliberately does not name the pool's capacity.
|
|
295
|
+
|
|
296
|
+
Commit: `614bc3a84`
|
|
297
|
+
|
|
298
|
+
## 10. The DOT export escaped for the wrong syntax, three ways — **DONE**
|
|
299
|
+
|
|
300
|
+
Three low-severity findings, one commit, because they are the same mistake: `exportToDot` writes
|
|
301
|
+
**HTML-like** labels (`label=<...>`) and treated them as quoted strings.
|
|
302
|
+
|
|
303
|
+
- **Names went in raw.** `graph.add("shadow & vsm")` makes graphviz refuse the *whole file*, not
|
|
304
|
+
just that node — so the debugging tool fails exactly when someone names a pass descriptively.
|
|
305
|
+
- **The one escaper present was the wrong one.** `graphviz_escape_string` was applied to the
|
|
306
|
+
descriptor `type` sitting inches away in the same template: a record-label escaper whose
|
|
307
|
+
backslashes are not processed inside markup at all, and which leaves `&`, `<` and `>` alone.
|
|
308
|
+
- **Every tooltip was mangled.** `tooltip` is a plain quoted attribute where `{`, `}` and `|` are
|
|
309
|
+
ordinary characters, so the size/format/usage line — the reason to hover — rendered its
|
|
310
|
+
backslashes literally in 100% of dumps.
|
|
311
|
+
|
|
312
|
+
Added `graphviz_escape_html_label` (`&`, `<`, `>`) and `graphviz_escape_quoted` (`\`, `"`, newline)
|
|
313
|
+
beside the existing record-label escaper, each with its own spec, and pointed each call site at the
|
|
314
|
+
one for the syntax it writes. `graphviz_escape_string` is unchanged: it *is* the record-label
|
|
315
|
+
escaper, and `convert_graph_to_dot_string.js` still uses it.
|
|
316
|
+
|
|
317
|
+
**Fill colours** were the third: `okhsv_to_linear_srgb` quantized straight to bytes into a field
|
|
318
|
+
GraphViz reads as gamma-encoded sRGB. Read back the way GraphViz reads it, an imported resource's
|
|
319
|
+
saturation measured **0.46** against the **0.2** the code chose — so the deliberately quiet
|
|
320
|
+
imported-vs-transient distinction read as a large colour difference. The transfer function is now
|
|
321
|
+
applied before quantizing.
|
|
322
|
+
|
|
323
|
+
Pinned by `FrameGraph.dot.spec.js`, four tests, all red before. The colour one asserts through the
|
|
324
|
+
inverse — decode the emitted hex as sRGB, convert back to OkHSV, and check the saturation is the one
|
|
325
|
+
the code asked for — rather than re-implementing the forward path.
|
|
326
|
+
|
|
327
|
+
The audit also flagged `csm_debug_draw_preview.js:111,138` as the same bug. **Not a defect there**:
|
|
328
|
+
that output goes into a `Color` handed to the engine's own debug draw, which works in linear light.
|
|
329
|
+
The DOT case is different only because GraphViz reads its input as sRGB.
|
|
330
|
+
|
|
331
|
+
Commit: `020269b17`
|
|
332
|
+
|
|
333
|
+
## 11. A double write minted an orphan version — **DONE**
|
|
334
|
+
|
|
335
|
+
`FramePassBuilder.write` branched on `node.creates(resource)` rather than on whether this pass had
|
|
336
|
+
already produced a version of that entry, so a second `write()` of the same original handle — or of
|
|
337
|
+
the handle the first write just handed back — took the clone path again. The first clone is a node
|
|
338
|
+
nobody can read (the caller only kept the last) and `resource_writes` is one longer than the pass's
|
|
339
|
+
logical writes.
|
|
340
|
+
|
|
341
|
+
Nothing reported it. The orphan is unreferenced by construction, so the cull loop reaches it and
|
|
342
|
+
cancels the extra reference count, and `validate()` sees a well-formed graph.
|
|
343
|
+
|
|
344
|
+
`write()` now returns the version this pass already produced for that entry, checked by resource ID
|
|
345
|
+
across `resource_writes`. That subsumes the `creates` branch — a created resource is already in
|
|
346
|
+
`resource_writes` — so the two cases became one. Skipping the second implicit `read()` is part of the
|
|
347
|
+
fix rather than a side effect: the pass is not reading two versions.
|
|
348
|
+
|
|
349
|
+
Idempotent rather than asserting, of the audit's two options: no recorded caller intends a second
|
|
350
|
+
write, and returning the version they already have is what they meant.
|
|
351
|
+
|
|
352
|
+
Pinned by `FramePassBuilder.spec.js`, four tests: the double write, re-writing the returned handle,
|
|
353
|
+
a created resource written again, and — the guard against over-correcting — two *different* passes
|
|
354
|
+
writing one resource still producing a version each.
|
|
355
|
+
|
|
356
|
+
Commit: `2ba63294b`
|
|
357
|
+
|
|
358
|
+
## 12. `FrameContext.describe()` skipped the open guard — **DONE**
|
|
359
|
+
|
|
360
|
+
`FrameRecord.read` and `publish` both assert `frame.is_open`, and `FrameContext.is_open` documents
|
|
361
|
+
why. `describe(handle)` took a raw handle rather than going through a record, which was the one way
|
|
362
|
+
around the check — and it answers from a graph that may already have executed and released its
|
|
363
|
+
transients. An extension calling it from an async continuation got a descriptor from last frame:
|
|
364
|
+
plausible, wrong, and silent.
|
|
365
|
+
|
|
366
|
+
Now asserts the same thing, in the same words.
|
|
367
|
+
|
|
368
|
+
Pinned in `FrameContext.spec.js`.
|
|
369
|
+
|
|
370
|
+
Commit: `2ba63294b`
|
|
371
|
+
|
|
372
|
+
## 13. `validate()` runs as an `assert.ok` argument — **DOCUMENTED, deliberate**
|
|
373
|
+
|
|
374
|
+
The audit read this as a hazard: either the gate always runs, or it silently disappears. The second
|
|
375
|
+
is the intent, and it is load-bearing.
|
|
376
|
+
|
|
377
|
+
`@rollup/plugin-strip` deletes a matched call *together with its arguments*, so under the strip the
|
|
378
|
+
consuming project applies, the whole gate — the O(passes × reads) walk, the two
|
|
379
|
+
`Int32Array(registry.length)` allocations, and the retained `console.error` — leaves the build. That
|
|
380
|
+
is what makes a development-only check over five-plus graphs a frame affordable.
|
|
381
|
+
|
|
382
|
+
The audit's suggested fix — hoist to `const valid = this.validate(problem_consumer)` — would be a
|
|
383
|
+
**regression**: it leaves the walk running in every shipped build and strips only the assert that
|
|
384
|
+
reads the result.
|
|
385
|
+
|
|
386
|
+
A comment now says so at the call site, so the next reader does not "complete" it. No code change.
|
|
387
|
+
|
|
388
|
+
**WITHDRAWN** as a defect.
|
|
389
|
+
|
|
390
|
+
## 14. Signal swallows a listener's exception — **DOCUMENTED**
|
|
391
|
+
|
|
392
|
+
`onPassBegin` / `onPassEnd` / `onExecuted` hand every listener the live graph, and `Signal` catches
|
|
393
|
+
whatever a handler throws (`Signal.js:511-514`). So the one-shot state assertions protect callers but
|
|
394
|
+
not listeners — the one place the graph actively invites third-party code in — and an `expect()`
|
|
395
|
+
inside a listener can never fail a test.
|
|
396
|
+
|
|
397
|
+
Not a live defect: no in-tree listener misbehaves, and the verifier majority called it a hardening
|
|
398
|
+
point rather than a bug. Changing the signature to withhold the graph would break the signal
|
|
399
|
+
convention for a hazard nobody has hit.
|
|
400
|
+
|
|
401
|
+
Recorded on all three fields instead: a listener is a read-only observer, its exceptions are
|
|
402
|
+
swallowed, and an assertion inside one cannot fail a test — assert after the dispatch, as
|
|
403
|
+
`FrameGraph.pass_signals.spec.js` already does.
|
|
404
|
+
|
|
405
|
+
Commit: `2ba63294b`
|
|
406
|
+
|
|
407
|
+
## 15. Import aliasing defeats `validate()` — **DONE, as detection**
|
|
408
|
+
|
|
409
|
+
`import_resource` has no identity check, so importing one `GPUTexture` twice gives it two
|
|
410
|
+
independent `ResourceEntry` version chains. Everything `validate()` reasons about — versions,
|
|
411
|
+
supersession, `producer` ordering — is scoped to a single entry, so every read/write hazard between
|
|
412
|
+
them is invisible, and `is_valid_resource` answers about the wrong chain. Live: `view_ctx.camera.
|
|
413
|
+
buffer.buffer` is imported seven times and `hierarchical_z_buffer.texture` three times into one
|
|
414
|
+
`Shading` graph.
|
|
415
|
+
|
|
416
|
+
Landed exactly as the brief scopes it: a new `FrameGraph.report_resource_aliasing(problem_consumer)`
|
|
417
|
+
that names each physical resource held under more than one entry, and **changes no entry
|
|
418
|
+
allocation**.
|
|
419
|
+
|
|
420
|
+
It is deliberately **not** wired into `compile()`. None of the live duplicate imports produces an
|
|
421
|
+
incorrect frame today — the sites happen to be ordered safely, and their passes write imported
|
|
422
|
+
resources, so they are side-effect passes that never cull — and failing `compile()` on them would
|
|
423
|
+
break the renderer over a hazard that is structural rather than live. Collapsing them into one entry
|
|
424
|
+
is the other half of the audit's fix, and it changes which handle every one of those callers gets
|
|
425
|
+
back; both are decisions of their own, and this reports the shape so either can be taken with the
|
|
426
|
+
numbers in hand.
|
|
427
|
+
|
|
428
|
+
Pinned by `FrameGraph.aliasing.spec.js`, four tests. One of them is the argument for the whole
|
|
429
|
+
finding: two entries for one texture, a genuine stale read across them, `validate()` returning true
|
|
430
|
+
with no problems, and the aliasing report naming it.
|
|
431
|
+
|
|
432
|
+
The camera-7×/HZB-3× counts are the audit's; they are not re-measured here, because building the
|
|
433
|
+
live `Shading` graph needs a device.
|
|
434
|
+
|
|
435
|
+
Commit: `0c5f37541`
|
|
436
|
+
|
|
437
|
+
## 16. `graph_read_buffer` defaulted its size from the pooled allocation — **DONE**
|
|
438
|
+
|
|
439
|
+
With `size` omitted, the readback read `source.size` off the concrete `GPUBuffer` the transient pool
|
|
440
|
+
handed back. The pool matches **approximately** — any pooled buffer at least as large as the request,
|
|
441
|
+
within a slack bound — so the number of bytes copied out was a function of pool state rather than of
|
|
442
|
+
the resource the caller named. The same call reads a different number of bytes run to run, and
|
|
443
|
+
everything past the descriptor's size is the previous tenant's data.
|
|
444
|
+
|
|
445
|
+
The VT feedback path (`VirtualTextureManager.js:1226`, no `size`) stays correct today only because
|
|
446
|
+
the pass hand-clears the whole physical buffer first and the walk treats 0 as empty. Remove either
|
|
447
|
+
and it is reading somebody else's bytes.
|
|
448
|
+
|
|
449
|
+
Now `resources.getDescriptor(buffer).size - offset`. `FramePassResources.getDescriptor` already
|
|
450
|
+
existed for exactly this.
|
|
451
|
+
|
|
452
|
+
Pinned by `graph_read_buffer.spec.js` — a device-free context whose `createResource` deliberately
|
|
453
|
+
over-allocates 4×, plus the explicit-size and offset cases. Red at 1024 bytes for a 256-byte
|
|
454
|
+
resource.
|
|
455
|
+
|
|
456
|
+
Commit: `a8fc3770b`
|
|
457
|
+
|
|
458
|
+
## 17. The debug reprojection pass read something it never binds — **DONE**
|
|
459
|
+
|
|
460
|
+
`graph_pass_debug_reprojection` recorded `read(input)` for a resource `execute_reproject` never
|
|
461
|
+
touches, which pins that resource's whole producing chain into the frame through culling. Enabling a
|
|
462
|
+
debug overlay therefore changed what the rest of the frame executed — the opposite of what a debug
|
|
463
|
+
overlay is for.
|
|
464
|
+
|
|
465
|
+
The module is **dead**: no call sites anywhere, and already recorded as such in
|
|
466
|
+
`shade/device/PASS_ENCODER_PROPOSAL_2026_08_31.md`. Fixed rather than deleted, because deleting it is
|
|
467
|
+
a call for whoever owns the denoiser; the `input` parameter and its read are gone, so reviving the
|
|
468
|
+
module does not revive the defect.
|
|
469
|
+
|
|
470
|
+
One thing left alone deliberately: `create("fake history", ...)` at the same site allocates a
|
|
471
|
+
full-resolution `rgba8unorm` texture nothing ever binds. It is equally dead, but it is also a *write*,
|
|
472
|
+
so removing it changes whether the pass can be culled — a decision for whoever revives this, and it
|
|
473
|
+
is not one of the audit's findings.
|
|
474
|
+
|
|
475
|
+
Pinned by `graph_pass_debug_reprojection.spec.js`, which asserts the recorded read set.
|
|
476
|
+
|
|
477
|
+
Commit: `a8fc3770b`
|
|
478
|
+
|
|
479
|
+
## 18. The sky LUT was read at the version the image pass had superseded — **DONE**
|
|
480
|
+
|
|
481
|
+
`GPUSky.update()` imported the transmittance LUT, wrote it through `graph_image_pass` while
|
|
482
|
+
discarding the versioned handle that pass returns, and then bound the original v0 handle to the
|
|
483
|
+
multiscatter compute pass. That is the superseded read `validate()` was built to reject, so
|
|
484
|
+
`compile()` throws in a dev build; with assertions stripped, the multiscatter dispatch samples a
|
|
485
|
+
texture with no recorded dependency on the pass that filled it, leaving the graph free to reorder or
|
|
486
|
+
cull the producer.
|
|
487
|
+
|
|
488
|
+
**The module is not wired.** Nothing constructs `GPUSky`, and its only reference —
|
|
489
|
+
`GPUViewSkyContext` — has no callers either. Confirmed before spending time on it, as the brief
|
|
490
|
+
asked. Fixed anyway, because it was one line and a revival should not revive the defect.
|
|
491
|
+
|
|
492
|
+
Pinned by `GPUSky.spec.js` on `SoftwareGPUDevice` (with `subgroups` required, which the mock grants
|
|
493
|
+
because it runs no WGSL): `update()` must not throw, and before the fix it threw
|
|
494
|
+
`FrameGraph 'sky update': the recorded graph is invalid`.
|
|
495
|
+
|
|
496
|
+
Commit: `ec4773428`
|
|
497
|
+
|
|
498
|
+
## 19. The probe atlas dropped every versioned handle — **DONE**
|
|
499
|
+
|
|
500
|
+
`GPUProbeAtlas.graph_update` imported the depth and radiance atlases once each, wrote them through
|
|
501
|
+
helpers whose renamed handles it discarded, and then handed the **original v0** handles to the
|
|
502
|
+
border paints and the convolution — at least three superseded reads per bake. Same defect as item 3
|
|
503
|
+
of `FRAME_GRAPH_RECOMMENDATIONS`, unfixed here.
|
|
504
|
+
|
|
505
|
+
Two helpers made it unfixable at the call site, so both changed first:
|
|
506
|
+
|
|
507
|
+
- `graph_lpv_paint_border_depth` wrote the atlas through a `graph_compute_pass` and **returned
|
|
508
|
+
nothing** (its own medium finding, `paint-border-depth-returns-void`). It now returns the handle.
|
|
509
|
+
- `graph_lpv_shade` did not merely discard its result — it returned `radiance: atlas_radiance`, the
|
|
510
|
+
handle it was *given*, so even a caller that threaded it got the pre-write version. It now returns
|
|
511
|
+
what its compute pass produced.
|
|
512
|
+
|
|
513
|
+
`GPUProbeAtlas` then threads both atlases through the whole chain, including the returned
|
|
514
|
+
`t_radiance`, which callers were previously handed at v0.
|
|
515
|
+
|
|
516
|
+
**`graph_lvp_atlas_to_sh` landed with it**, because it is the reader at the end of that chain. It
|
|
517
|
+
bound the radiance atlas by reaching into the captured `GPUProbeAtlas` inside `execute` rather than
|
|
518
|
+
through a declared handle, so the graph contained no edge from the fill passes to the convolution:
|
|
519
|
+
culling was free to elide them (they survive today only because they write an imported resource),
|
|
520
|
+
`validate()` could not check the read, `FramePassResources.get`'s declaration assertion was bypassed
|
|
521
|
+
rather than enforced, and the DOT/JSON exports and the profiler's topology showed no dependency. It
|
|
522
|
+
now takes `atlas_radiance` and declares `pass.read`.
|
|
523
|
+
|
|
524
|
+
Pinned by `lpv_atlas_handles.spec.js`, four tests, three red before: the helper returns a handle, a
|
|
525
|
+
reader threaded onto it validates, a reader left on the pre-border handle is reported as a
|
|
526
|
+
superseded read, and the convolution declares its read.
|
|
527
|
+
|
|
528
|
+
**What is not pinned:** the composition inside `graph_update` itself. It needs a live scene with
|
|
529
|
+
materials, geometry and a BVH, which is out of reach device-free — so the spec pins each helper's
|
|
530
|
+
contract instead. Saying so rather than pretending, as the brief asks.
|
|
531
|
+
|
|
532
|
+
Commit: `4dc41ed6f`
|
|
533
|
+
|
|
534
|
+
## 20. Passes bound buffers through captured objects — **DONE at the named site**
|
|
535
|
+
|
|
536
|
+
`graph_cull_lights` bound the camera uniform and the light database off the JS objects its `execute`
|
|
537
|
+
closures captured, so both culling passes appeared in the graph with **no inputs at all**: culling,
|
|
538
|
+
ordering and `validate()` reason about declared handles only, and the DOT/JSON exports and the
|
|
539
|
+
profiler's topology showed nothing. Both buffers are now imported once per call and threaded, which
|
|
540
|
+
is the rule `graph_particles.js` already states in its header — "every persistent buffer is imported
|
|
541
|
+
exactly once: two imports of one buffer are two resource entries the graph cannot tell apart".
|
|
542
|
+
|
|
543
|
+
Pinned by `graph_cull_lights.spec.js` (on `SoftwareGPUDevice`): both passes declare both reads, and
|
|
544
|
+
the call imports each buffer once, asserted through `report_resource_aliasing` from item 15.
|
|
545
|
+
|
|
546
|
+
**The extent, as the brief asks for rather than a sweep.** A census over `src/shade` for a binding
|
|
547
|
+
whose value is a property of a captured object — `x.buffer`, `.gpu_buffer`, `.buffer_data`,
|
|
548
|
+
`.buffer_probes`, `.buffer_metadata`, `.scene_database_buffer` — finds **~120 sites across 52 files**
|
|
549
|
+
(a handful of which are device-mock code rather than graph helpers). The verifier majority downgraded
|
|
550
|
+
this from an invariant violation to an observability point, and they are right for the tree as it
|
|
551
|
+
stands: insertion-order execution plus the imported-write side-effect rule make the stale read
|
|
552
|
+
unreachable today, and no buffer read this way is written inside the same graph. It becomes a real
|
|
553
|
+
defect the moment one of them is. The ones worth doing first are the buffers something *does* write
|
|
554
|
+
in-graph — the scene database and the emitter database.
|
|
555
|
+
|
|
556
|
+
Commit: `7fa65c3bc`
|
|
557
|
+
|
|
558
|
+
## 21. A throwing pass stranded the profiler's frame recorder — **DONE, unpinned**
|
|
559
|
+
|
|
560
|
+
The profiler's whole teardown hung off `command_ctx.finish()`, the statement after `encodeGraph`.
|
|
561
|
+
A throwing pass therefore left: the recorder still subscribed to a dead graph, holding the whole
|
|
562
|
+
61-pass frame graph and every pass closure in it reachable; one `GPUQuerySet` of 2048 timestamps and
|
|
563
|
+
its two 16 KB resolve/readback buffers never destroyed; `profiling_absorbed` never settled; and the
|
|
564
|
+
session's frame accounting silently short a frame. A render loop that catches and carries on repeats
|
|
565
|
+
that every failing frame until the device complains.
|
|
566
|
+
|
|
567
|
+
`render_to_target` now holds the pass failure, runs `finish()` and the `profiling_absorbed` hookup on
|
|
568
|
+
both paths, and re-raises. A teardown failure does **not** replace the pass failure that caused it —
|
|
569
|
+
a partial command buffer can legitimately refuse to close after an aborted pass, and the pass failure
|
|
570
|
+
is what the caller needs — but a teardown failure on the success path still propagates normally.
|
|
571
|
+
|
|
572
|
+
**Not pinned by a test.** `Renderer.render_to_target` needs a device, a scene with materials,
|
|
573
|
+
geometry and a BVH, and a canvas; nothing in the tree constructs a `Renderer`, and building a harness
|
|
574
|
+
for it is a piece of work in its own right rather than part of this fix. Saying so rather than
|
|
575
|
+
pretending.
|
|
576
|
+
|
|
577
|
+
Commit: `7fa65c3bc`
|
|
578
|
+
|
|
579
|
+
## 22. The rasterizer's advanced handles were dropped at the call site — **DONE**
|
|
580
|
+
|
|
581
|
+
`FRAME_GRAPH_RECOMMENDATIONS` item 3 threaded depth and colour through the sub-helpers, but
|
|
582
|
+
`graph_rasterize_scene` still returned only the bucket buffer. So `Renderer` called
|
|
583
|
+
`graph_import_texture` a *second* time on the very `GPUTextureContext` objects the job had just
|
|
584
|
+
written — `#vis_render_target.color_attachments[0]/[1]` and `texture_depth_current` — giving one
|
|
585
|
+
physical texture two unrelated `ResourceEntry` chains and leaving no dependency edge at all from the
|
|
586
|
+
rasterization passes to their consumers.
|
|
587
|
+
|
|
588
|
+
It draws correctly today only because writing an imported resource marks a pass a side-effect that
|
|
589
|
+
culling may not touch, so insertion order saves the picture. `Renderer.js` carries a TODO to make
|
|
590
|
+
those viz targets transient; the moment that lands, the rasterization passes lose `has_side_effects`,
|
|
591
|
+
nothing in the graph reads the versions they wrote, and `compile()` culls the entire opaque +
|
|
592
|
+
alpha-tested chain — an empty G-buffer with no diagnostic.
|
|
593
|
+
|
|
594
|
+
`graph_rasterize_scene` now returns `{buckets, depth, color_targets}`, mirroring
|
|
595
|
+
`graph_rasterize_scene_fast_raw` which has done so all along, and the Renderer destructures them
|
|
596
|
+
instead of re-importing. Three imports removed from the `Shading` graph.
|
|
597
|
+
|
|
598
|
+
**Not pinned by a test**, for the same reason as item 21: recording it needs a `RasterizationJob`
|
|
599
|
+
with a live view context, scene, materials and render target. The contract change is small and the
|
|
600
|
+
call site is the only consumer that reads the return; `execute_rasterization_jobs.js` ignores it.
|
|
601
|
+
|
|
602
|
+
Commit: `5efd86114`
|
|
603
|
+
|
|
604
|
+
## 23. The G-buffer record kept naming the pre-AO albedo — **DONE**
|
|
605
|
+
|
|
606
|
+
The AO composite writes the albedo target and the renderer updated only its local
|
|
607
|
+
`gr_texture_material_albedo_ao`, leaving `record_gbuffer.albedo` on the superseded version while
|
|
608
|
+
`GBufferTextures` is declared readable at `AfterLighting`, `AfterTransparency` and `BeforePresent`.
|
|
609
|
+
An extension reading it from `AfterLighting` on gets a handle an earlier pass has already replaced:
|
|
610
|
+
`validate()` rejects it in a dev build, and a stripped build reads it silently.
|
|
611
|
+
|
|
612
|
+
Latent rather than live — both shipped consumers (`GPUDecalRenderer`, `GPUTerrainSplatRenderer`)
|
|
613
|
+
publish back into the record and therefore run at `AfterGBuffer`, before the composite — but a record
|
|
614
|
+
must always name the handle that currently *is* the G-buffer, the same way `record_scene_color.color`
|
|
615
|
+
is re-stated three times through the frame.
|
|
616
|
+
|
|
617
|
+
The audit's suggested one-line reassignment does not work: `GBufferTextures.is_writable_at` restricts
|
|
618
|
+
publication to `AfterGBuffer`, and the composite runs well after it. **Relaxing that would have been
|
|
619
|
+
the wrong fix** — the freeze is deliberate and documented, and it is about *extensions*: publishing
|
|
620
|
+
into the G-buffer record once shading has run is meaningless. So the renderer got an internal path
|
|
621
|
+
instead: `FrameRecord.republish()`, everything `publish()` checks except the phase, and
|
|
622
|
+
`GBufferTextures.republish_albedo()` on top of it. The superseded-handle check is kept, which is the
|
|
623
|
+
one that matters here.
|
|
624
|
+
|
|
625
|
+
Pinned in `FrameContext.spec.js`: extension publication into the frozen record still throws,
|
|
626
|
+
`republish_albedo` succeeds and the record then reads back the new handle, and re-stating with a
|
|
627
|
+
superseded handle is refused.
|
|
628
|
+
|
|
629
|
+
Commit: `5efd86114`
|
|
630
|
+
|
|
631
|
+
## 24. The shadow atlas is imported once per cascade job — **DEFERRED**
|
|
632
|
+
|
|
633
|
+
A directional map's cascades are recorded into one graph, but each job runs `graph_rasterize_scene`,
|
|
634
|
+
which imports `job.render_target.depth_attachment` for itself. All the cascades share
|
|
635
|
+
`GPUSceneShadowmapContext`'s single `#render_target`, so N cascades produce N independent
|
|
636
|
+
`ResourceEntry` chains for one physical atlas and the graph records no relationship between the
|
|
637
|
+
cascade writes at all.
|
|
638
|
+
|
|
639
|
+
Correct today, and explicitly rather than accidentally: the cascades are viewport-scissored, and
|
|
640
|
+
`graph_meshlets_rasterize.js` detects the restricted viewport and replaces the full-attachment depth
|
|
641
|
+
clear with a `texture_fill_rectangle` over the cascade rect. Every write is to an imported resource,
|
|
642
|
+
so every pass side-effects and survives culling.
|
|
643
|
+
|
|
644
|
+
**What blocks it.** The audit says this depends on item 22, and item 22 has landed — but landing it
|
|
645
|
+
was only half of what this needs. `graph_rasterize_scene` now *returns* the depth handle; it still
|
|
646
|
+
cannot *accept* one. Threading the atlas in means `RasterizationJob` carrying graph handles instead
|
|
647
|
+
of `GPUTextureContext` objects, and that is the job model all four rasterization entry points share.
|
|
648
|
+
That is a design change, not a local fix, and the brief for this pass rules out a refactor of that
|
|
649
|
+
size.
|
|
650
|
+
|
|
651
|
+
What is available in the meantime: `FrameGraph.report_resource_aliasing` (item 15) names exactly this
|
|
652
|
+
condition, so the N-entries-per-atlas shape can be measured before anyone decides to change the job
|
|
653
|
+
model.
|
|
654
|
+
|
|
655
|
+
One correction to the finding's own tail, worth recording so the next reader does not act on it: if
|
|
656
|
+
the atlas were made transient the breakage would **not** be "only the last cascade is sampled". The
|
|
657
|
+
atlas is sampled from outside the graph entirely — the lighting shader reads `this.texture`,
|
|
658
|
+
published by `#write_shadow_records` — so a transient atlas would break outright. The
|
|
659
|
+
N-entries-per-atlas structure is what would let that happen quietly.
|