@woosh/meep-engine 3.14.6 → 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/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
- package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
- 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/RENDERER_CONTRACT.md +584 -580
- 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/README.md +117 -0
- package/src/shade/playground/avboit/index.html +215 -0
- package/src/shade/playground/avboit/main.d.ts +2 -0
- package/src/shade/playground/avboit/main.d.ts.map +1 -0
- package/src/shade/playground/avboit/main.js +875 -0
- 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 +44 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +169 -36
- package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
- package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
- package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
- 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/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
- package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
- 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/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
- package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
- package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
- package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
- package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
- 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_CONSTANTS.d.ts +107 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +642 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +534 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +45 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +139 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
- 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/chunk_avboit_transmission_tint.d.ts +20 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +141 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +994 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +87 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +202 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +665 -722
- package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
- package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
- 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
- package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
- package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
- package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
- package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
|
@@ -1,217 +1,893 @@
|
|
|
1
1
|
import { assert } from "../../../core/assert.js";
|
|
2
|
-
import {
|
|
2
|
+
import { align_4 } from "../../../core/binary/align_4.js";
|
|
3
|
+
import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
|
|
4
|
+
import { warn_limited } from "../../util/warn_limited.js";
|
|
3
5
|
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
4
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
PARTICLE_EMITTER_TICK_WORKGROUP_SIZE,
|
|
8
|
+
PARTICLE_RECORD_WORD_COUNT,
|
|
9
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
10
|
+
PARTICLE_SORT_BUCKET_COUNT,
|
|
11
|
+
PARTICLE_SPAWN_COMMAND_WORDS,
|
|
12
|
+
} from "./ParticleConstants.js";
|
|
5
13
|
import { PARTICLE_COUNTER, PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
|
|
14
|
+
import { graph_particles_render, graph_particles_simulate } from "./graph_particles.js";
|
|
15
|
+
import {
|
|
16
|
+
graph_particle_avboit_draw,
|
|
17
|
+
graph_particle_avboit_occupancy,
|
|
18
|
+
graph_particle_avboit_splat,
|
|
19
|
+
} from "./graph_particles_avboit.js";
|
|
6
20
|
import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
|
|
7
|
-
import {
|
|
21
|
+
import { create_particle_billboard_pipeline } from "./shaders/shader_particle_render.js";
|
|
22
|
+
|
|
23
|
+
const WORD = Uint32Array.BYTES_PER_ELEMENT;
|
|
24
|
+
|
|
25
|
+
const STORAGE = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;
|
|
26
|
+
const INDIRECT = GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC;
|
|
8
27
|
|
|
9
28
|
/**
|
|
10
|
-
* The GPU particle system feature
|
|
29
|
+
* The GPU particle system: a feature of a scene, in the mould of `ReSTIRDI` — construct once
|
|
30
|
+
* against a {@link GPUSceneContext}, and contribute the frame's passes through
|
|
31
|
+
* {@link execute}.
|
|
32
|
+
*
|
|
33
|
+
* ## What it owns
|
|
34
|
+
*
|
|
35
|
+
* Every piece of persistent GPU state: the particle pool, the ping-pong alive lists, the dead
|
|
36
|
+
* free-list, the counters, both indirect-args buffers, the simulation-order (coherence) and
|
|
37
|
+
* render-order (sort) scratch, the emitter database (the emitter table and the GPU-owned state
|
|
38
|
+
* table, one buffer), the packed program buffer, and the spawn-command ring. Buffers that depend
|
|
39
|
+
* on the emitter set — the coherence scratch on the number of distinct programs, the program
|
|
40
|
+
* buffer on the arena, the database on its own pages — are grown inside {@link execute}, the way
|
|
41
|
+
* ReSTIR's reservoirs follow the resolution.
|
|
11
42
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* ReSTIR feature template: construct once, toggle with a flag, and contribute per-frame passes via
|
|
16
|
-
* {@link encode}.
|
|
43
|
+
* Every pass stays within the eight storage buffers a stage gets by default: the emitter record
|
|
44
|
+
* and the GPU-owned state are two tables of one database buffer, and the VM's constants and code
|
|
45
|
+
* are one packed buffer.
|
|
17
46
|
*
|
|
18
|
-
* ##
|
|
47
|
+
* ## Emitters are scene nodes
|
|
19
48
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* NEXT frame's simulate consumes (`coherence/`)
|
|
27
|
-
* 5. build indirect — derive next frame's simulate dispatch from the padded list length and this
|
|
28
|
-
* frame's render draw instance count from the alive count
|
|
29
|
-
* 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
|
|
30
|
-
* 7. render — one instanced billboard draw over the sorted list
|
|
49
|
+
* There is no `addEmitter`. A {@link ParticleEmitter} is a {@link Node3D}: put it in the scene —
|
|
50
|
+
* on its own or under a joint — and the next {@link execute} finds it in the scene's node list,
|
|
51
|
+
* gives it a row in the emitter table pointed at the `transforms` row the scene context gave the
|
|
52
|
+
* node, and it starts spawning. Take it out of the scene and its row is retired and its particles
|
|
53
|
+
* freed. The sweep runs only when the scene's membership version moves, which is how per-frame
|
|
54
|
+
* upkeep stays proportional to what changed rather than to how many emitters there are.
|
|
31
55
|
*
|
|
32
|
-
*
|
|
33
|
-
* simulation order is program-coherent and camera-independent, the render order is back-to-front
|
|
34
|
-
* and changes with the camera. Separate buffers, separate passes, separate counter slots.
|
|
56
|
+
* ## Spawning is the GPU's decision
|
|
35
57
|
*
|
|
36
|
-
* The
|
|
58
|
+
* The CPU never counts particles or walks emitters per frame. The emitter tick pass integrates
|
|
59
|
+
* every emitter's rate on the GPU, and the emit dispatch is sized by a prefix scan of what it
|
|
60
|
+
* decided. The host's one way to ask for particles is {@link spawn}: a burst queued into a small
|
|
61
|
+
* command list that a pass adds to the emitter's pending spawns, on the same path as everything
|
|
62
|
+
* else. See `graph_particles.js` for the frame.
|
|
37
63
|
*
|
|
38
|
-
* ##
|
|
64
|
+
* ## Drawing
|
|
39
65
|
*
|
|
40
|
-
* {@link
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
66
|
+
* {@link simulate} records everything that moves particles and leaves the alive list and the
|
|
67
|
+
* indirect draw args as graph handles. Two things draw them. Under the renderer the system is an
|
|
68
|
+
* `AVBOITSideChannel`: the transparency orchestrator asks it for its occupancy, its extinction and
|
|
69
|
+
* its draw at the three points where the transparent meshes have contributed theirs
|
|
70
|
+
* ({@link avboit_occupancy}, {@link avboit_splat}, {@link avboit_draw}), and the particles
|
|
71
|
+
* composite order-independently with them. A page without that pipeline calls {@link execute},
|
|
72
|
+
* which sorts and draws the billboards straight over a colour target.
|
|
73
|
+
*
|
|
74
|
+
* ## Allocation
|
|
75
|
+
*
|
|
76
|
+
* The per-frame path allocates the frame graph's records and nothing else: emitter rows are
|
|
77
|
+
* staged through one shared record, spawn commands go into a preallocated ring, and the
|
|
78
|
+
* per-dispatch settings are reused objects. A command context is opened only on frames that have
|
|
79
|
+
* something to upload.
|
|
44
80
|
*/
|
|
45
81
|
export class GPUParticleSystem {
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Engine GraphicsContext.
|
|
85
|
+
* @type {object}
|
|
86
|
+
*/
|
|
87
|
+
graphics;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The scene whose nodes the emitters are, and whose database their world matrices come from.
|
|
91
|
+
* @type {import("../scene/GPUSceneContext.js").GPUSceneContext}
|
|
92
|
+
*/
|
|
93
|
+
scene_context;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Maximum number of simultaneously live particles.
|
|
97
|
+
* @type {number}
|
|
98
|
+
*/
|
|
99
|
+
capacity;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @type {EmitterRegistry}
|
|
103
|
+
*/
|
|
104
|
+
registry;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Frames elapsed. Drives the alive-list ping-pong and the VM's frame builtin.
|
|
108
|
+
* @type {number}
|
|
109
|
+
*/
|
|
110
|
+
frame = 0;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Seconds since start, the VM's `TIME` builtin. Advanced by `dt` each {@link execute}.
|
|
114
|
+
* @type {number}
|
|
115
|
+
*/
|
|
116
|
+
time = 0;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Cap on how much missed time a culled emitter makes up for when it comes back into view.
|
|
120
|
+
* @type {number}
|
|
121
|
+
*/
|
|
122
|
+
max_catchup_seconds = 1;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* View-depth range the render sort quantises: particles nearer than `[0]` share the front bin,
|
|
126
|
+
* farther than `[1]` the back one.
|
|
127
|
+
* @type {Float32Array}
|
|
128
|
+
*/
|
|
129
|
+
sort_depth_range = new Float32Array([0.1, 100]);
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Sprite atlas the billboards sample, and the sampler they sample it with. A 1x1 white texel by
|
|
133
|
+
* default, so an emitter with no art draws as a plain quad rather than nothing.
|
|
134
|
+
* @type {GPUTextureView}
|
|
135
|
+
*/
|
|
136
|
+
atlas;
|
|
137
|
+
|
|
138
|
+
/** @type {GPUSampler} */
|
|
139
|
+
atlas_sampler;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* The persistent GPU buffers, by the names {@link graph_particles} binds them under. Exposed for
|
|
143
|
+
* inspection — a harness copying the counters out to display them — never for the frame loop,
|
|
144
|
+
* which reads nothing back. Entries that grow with the emitter set are replaced in place.
|
|
145
|
+
*
|
|
146
|
+
* @type {object}
|
|
147
|
+
*/
|
|
148
|
+
buffers = {};
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Distinct programs the coherence scratch is currently sized for.
|
|
152
|
+
* @type {number}
|
|
153
|
+
*/
|
|
154
|
+
#sim_bucket_capacity = 0;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* The spawn-command ring: `[row, count]` pairs, filled by {@link spawn}, merged and uploaded on
|
|
158
|
+
* the next {@link execute}.
|
|
159
|
+
* @type {Uint32Array}
|
|
160
|
+
*/
|
|
161
|
+
#spawn_commands;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The emitter each ring entry was issued for, so an entry whose emitter has since left the
|
|
165
|
+
* scene — or whose row has gone to somebody else — is dropped at upload rather than delivered
|
|
166
|
+
* to the row's next tenant.
|
|
167
|
+
* @type {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
|
|
168
|
+
*/
|
|
169
|
+
#spawn_command_emitters;
|
|
170
|
+
|
|
171
|
+
/** @type {number} */
|
|
172
|
+
#spawn_command_count = 0;
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Scratch for merging the ring: pending count by row. Grown with the emitter table, never per
|
|
176
|
+
* frame.
|
|
177
|
+
* @type {Uint32Array}
|
|
178
|
+
*/
|
|
179
|
+
#spawn_by_row = new Uint32Array(0);
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Emitter node -> the sweep that last saw it in the scene.
|
|
183
|
+
* @type {Map<import("./runtime/ParticleEmitter.js").ParticleEmitter, number>}
|
|
184
|
+
*/
|
|
185
|
+
#swept = new Map();
|
|
186
|
+
|
|
187
|
+
/** @type {number} */
|
|
188
|
+
#sweep = 0;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* The 1x1 white texture {@link atlas} points at until a caller replaces it. Held so
|
|
192
|
+
* {@link destroy} can free it; a caller that assigns its own atlas owns that one.
|
|
193
|
+
* @type {GPUTexture|null}
|
|
194
|
+
*/
|
|
195
|
+
#default_atlas = null;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* The scene membership version the emitter set was last reconciled against.
|
|
199
|
+
* @type {number}
|
|
200
|
+
*/
|
|
201
|
+
#instances_version = -1;
|
|
202
|
+
|
|
203
|
+
/** @type {object|null} */
|
|
204
|
+
#pipeline = null;
|
|
205
|
+
|
|
206
|
+
/** @type {string} */
|
|
207
|
+
#pipeline_key = "";
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Per-frame scalars handed to {@link graph_particles}, reused rather than rebuilt.
|
|
211
|
+
* @type {object}
|
|
212
|
+
*/
|
|
213
|
+
#frame = {
|
|
214
|
+
dt: 0, time: 0, index: 0, max_catchup: 1, spawn_command_count: 0, sort_near: 0.1, sort_far: 100,
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/** @type {{capacity: number, group_count: number}} */
|
|
218
|
+
#emitters = { capacity: 0, group_count: 0 };
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* This frame's simulation, for the draw that follows it: the graph it was recorded into, the
|
|
222
|
+
* scene database handle it read, and the handles it produced. Reused, never reallocated.
|
|
223
|
+
* @type {{graph: object|null, scene_database: number, emitter_group_count: number, handles: object|null}}
|
|
224
|
+
*/
|
|
225
|
+
#simulated = { graph: null, scene_database: -1, emitter_group_count: 0, handles: null };
|
|
226
|
+
|
|
227
|
+
/** @type {object} */
|
|
228
|
+
#render = {
|
|
229
|
+
atlas: null,
|
|
230
|
+
atlas_sampler: null,
|
|
231
|
+
obtain_pipeline: (color_format, depth_format) => this.#obtain_pipeline(color_format, depth_format),
|
|
232
|
+
};
|
|
233
|
+
|
|
46
234
|
/**
|
|
47
235
|
* @param {object} graphics engine GraphicsContext (has `.device`)
|
|
236
|
+
* @param {import("../scene/GPUSceneContext.js").GPUSceneContext} scene_context
|
|
48
237
|
* @param {object} [options]
|
|
49
238
|
* @param {number} [options.capacity] max simultaneous particles
|
|
239
|
+
* @param {number} [options.spawn_command_capacity] most {@link spawn} calls one frame keeps
|
|
50
240
|
*/
|
|
51
|
-
constructor(graphics, { capacity = 1 << 16 } = {}) {
|
|
241
|
+
constructor(graphics, scene_context, { capacity = 1 << 16, spawn_command_capacity = 256 } = {}) {
|
|
52
242
|
assert.defined(graphics, "graphics");
|
|
243
|
+
assert.defined(scene_context, "scene_context");
|
|
244
|
+
assert.equal(scene_context.isGPUSceneContext, true, "scene_context.isGPUSceneContext !== true");
|
|
53
245
|
assert.isPositiveInteger(capacity, "capacity");
|
|
246
|
+
assert.isPositiveInteger(spawn_command_capacity, "spawn_command_capacity");
|
|
54
247
|
|
|
55
248
|
this.graphics = graphics;
|
|
249
|
+
this.scene_context = scene_context;
|
|
56
250
|
this.capacity = capacity;
|
|
57
251
|
|
|
58
|
-
this.registry = new EmitterRegistry();
|
|
59
|
-
this.scheduler = new ParticleSpawnScheduler();
|
|
252
|
+
this.registry = new EmitterRegistry(graphics.device);
|
|
60
253
|
|
|
61
|
-
|
|
62
|
-
this
|
|
254
|
+
this.#spawn_commands = new Uint32Array(spawn_command_capacity * PARTICLE_SPAWN_COMMAND_WORDS);
|
|
255
|
+
this.#spawn_command_emitters = new Array(spawn_command_capacity).fill(null);
|
|
63
256
|
|
|
64
|
-
|
|
65
|
-
this
|
|
257
|
+
this.#create_buffers();
|
|
258
|
+
this.#create_default_atlas();
|
|
259
|
+
}
|
|
66
260
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
* Distinct compiled programs across the emitter set — the number of buckets the coherence
|
|
74
|
-
* pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
|
|
75
|
-
* is a safe upper bound (programs can be shared, never invented).
|
|
76
|
-
* @type {number|undefined}
|
|
77
|
-
*/
|
|
78
|
-
this.program_count = undefined;
|
|
261
|
+
/**
|
|
262
|
+
* The buffer the emitter table lives in — what every emitter-reading pass binds.
|
|
263
|
+
* @returns {GPUBuffer}
|
|
264
|
+
*/
|
|
265
|
+
get emitter_database() {
|
|
266
|
+
return this.registry.database.buffer;
|
|
79
267
|
}
|
|
80
268
|
|
|
81
269
|
/**
|
|
82
|
-
*
|
|
83
|
-
* @
|
|
84
|
-
* @returns {number} emitter index
|
|
270
|
+
* The live emitters, in no particular order.
|
|
271
|
+
* @returns {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
|
|
85
272
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
this.emitters_dirty = true;
|
|
89
|
-
return index;
|
|
273
|
+
get emitters() {
|
|
274
|
+
return this.registry.emitters;
|
|
90
275
|
}
|
|
91
276
|
|
|
92
277
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
278
|
+
* Number of simulation-order buckets — one per distinct compiled program.
|
|
279
|
+
*
|
|
280
|
+
* This is the coherence pass's only host-provided number, and it is static topology rather than
|
|
281
|
+
* per-frame state: it changes when a new effect is registered, not as particles are born and
|
|
282
|
+
* die. Everything the pass measures per frame stays on the GPU.
|
|
283
|
+
*
|
|
284
|
+
* @returns {number}
|
|
97
285
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
286
|
+
bucketCount() {
|
|
287
|
+
return Math.max(1, this.registry.program_count);
|
|
100
288
|
}
|
|
101
289
|
|
|
102
290
|
/**
|
|
103
|
-
*
|
|
291
|
+
* Index of the alive list this frame reads from / writes to (ping-pong by frame parity).
|
|
292
|
+
* @returns {number}
|
|
293
|
+
*/
|
|
294
|
+
get alive_write_index() {
|
|
295
|
+
return 1 - (this.frame % 2);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Ask for `count` particles from an emitter, on top of its rate, on the next frame. Goes
|
|
300
|
+
* through the GPU path — the tick pass folds it into the emitter's accumulator, the budget and
|
|
301
|
+
* the culling apply — so it is a request, not a guarantee.
|
|
104
302
|
*
|
|
105
|
-
* @param {
|
|
106
|
-
* @param {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
303
|
+
* @param {import("./runtime/ParticleEmitter.js").ParticleEmitter} emitter a registered emitter
|
|
304
|
+
* @param {number} count
|
|
305
|
+
*/
|
|
306
|
+
spawn(emitter, count) {
|
|
307
|
+
assert.defined(emitter, "emitter");
|
|
308
|
+
assert.notEqual(emitter.row, -1, "emitter is not in the scene");
|
|
309
|
+
assert.isNonNegativeInteger(count, "count");
|
|
310
|
+
|
|
311
|
+
const ring = this.#spawn_commands;
|
|
312
|
+
const base = this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS;
|
|
313
|
+
|
|
314
|
+
if (base >= ring.length) {
|
|
315
|
+
// the text is the key warn_limited counts on, so it carries no burst size: one message
|
|
316
|
+
// per ring size, not one per number a caller happens to ask for
|
|
317
|
+
warn_limited(`GPUParticleSystem: spawn command ring is full (${ring.length / PARTICLE_SPAWN_COMMAND_WORDS} per frame); dropping this frame's remaining bursts`);
|
|
318
|
+
return;
|
|
120
319
|
}
|
|
121
320
|
|
|
122
|
-
|
|
321
|
+
ring[base] = emitter.row;
|
|
322
|
+
ring[base + 1] = count;
|
|
323
|
+
this.#spawn_command_emitters[this.#spawn_command_count] = emitter;
|
|
324
|
+
this.#spawn_command_count++;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* The simulation half of the frame: reconcile the emitter set with the scene, push what changed
|
|
329
|
+
* to the GPU, and record every pass that moves particles — through to the indirect draw args.
|
|
330
|
+
* What it leaves as graph handles is what a draw consumes: {@link execute} draws them
|
|
331
|
+
* standalone, and the AVBOIT side-channel methods below draw them through the renderer's
|
|
332
|
+
* transparency pipeline.
|
|
333
|
+
*
|
|
334
|
+
* Call after the scene context has built for the frame (`GPUSceneContext#update`), so every
|
|
335
|
+
* emitter node has its `transforms` row, and after the hierarchy pass has run, so the rows'
|
|
336
|
+
* `global` matrices are this frame's.
|
|
337
|
+
*
|
|
338
|
+
* **Once per frame, not once per view.** This advances the simulation by `dt` and hands out
|
|
339
|
+
* handles into the graph it recorded into; a second view of the same scene records a second
|
|
340
|
+
* graph and would step the simulation twice. The renderer has one view per `render` call today,
|
|
341
|
+
* so this holds by construction; a second view of one scene needs the step and the handles
|
|
342
|
+
* separated — record the passes for the first graph, import the same buffers into the rest.
|
|
343
|
+
*
|
|
344
|
+
* @param {object} params
|
|
345
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
346
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
347
|
+
* @param {number} params.scene_database graph handle of the scene database — the one the
|
|
348
|
+
* hierarchy pass returned, so this reads the matrices it composed
|
|
349
|
+
* @param {number} params.dt seconds since the previous frame
|
|
350
|
+
* @returns {import("./graph_particles.js").ParticleSimulationHandles}
|
|
351
|
+
*/
|
|
352
|
+
simulate({ graph, camera, scene_database, dt }) {
|
|
353
|
+
assert.defined(graph, "graph");
|
|
354
|
+
assert.isNumber(dt, "dt");
|
|
355
|
+
|
|
356
|
+
this.#sync_membership();
|
|
357
|
+
this.#upload();
|
|
358
|
+
|
|
359
|
+
const frame = this.#frame;
|
|
360
|
+
frame.dt = dt;
|
|
361
|
+
frame.time = this.time;
|
|
362
|
+
frame.index = this.frame;
|
|
363
|
+
frame.max_catchup = this.max_catchup_seconds;
|
|
364
|
+
frame.spawn_command_count = this.#spawn_command_count;
|
|
365
|
+
frame.sort_near = this.sort_depth_range[0];
|
|
366
|
+
frame.sort_far = this.sort_depth_range[1];
|
|
367
|
+
|
|
368
|
+
const table = this.registry.table;
|
|
369
|
+
const emitters = this.#emitters;
|
|
370
|
+
emitters.capacity = table.element_capacity;
|
|
371
|
+
emitters.group_count = table.dispatch_group_count(PARTICLE_EMITTER_TICK_WORKGROUP_SIZE);
|
|
372
|
+
|
|
373
|
+
const buffers = this.buffers;
|
|
374
|
+
buffers.alive_write = buffers.alive[this.alive_write_index];
|
|
375
|
+
// The table's database owns and grows its own buffer; it is re-read every frame for that
|
|
376
|
+
// reason.
|
|
377
|
+
buffers.emitter_database = this.registry.database.buffer;
|
|
378
|
+
|
|
379
|
+
const simulated = graph_particles_simulate({
|
|
380
|
+
graph,
|
|
381
|
+
camera,
|
|
382
|
+
scene_database,
|
|
383
|
+
gpu: buffers,
|
|
384
|
+
emitters,
|
|
385
|
+
capacity: this.capacity,
|
|
386
|
+
bucket_count: this.bucketCount(),
|
|
387
|
+
frame,
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Kept for the draw that follows, whichever it is, and for nothing past this frame.
|
|
391
|
+
const current = this.#simulated;
|
|
392
|
+
current.graph = graph;
|
|
393
|
+
current.scene_database = scene_database;
|
|
394
|
+
current.emitter_group_count = emitters.group_count;
|
|
395
|
+
current.handles = simulated;
|
|
396
|
+
|
|
397
|
+
// Consumed: the count was recorded into the graph, the words were uploaded.
|
|
398
|
+
this.#spawn_command_count = 0;
|
|
399
|
+
|
|
123
400
|
this.frame++;
|
|
124
|
-
|
|
401
|
+
this.time += dt;
|
|
402
|
+
|
|
403
|
+
return simulated;
|
|
125
404
|
}
|
|
126
405
|
|
|
127
406
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
407
|
+
* The whole standalone frame: {@link simulate}, then the depth sort and one billboard draw over
|
|
408
|
+
* a colour target with fixed-function blending. For a page without the renderer's transparency
|
|
409
|
+
* pipeline; under the renderer the drawing is AVBOIT's.
|
|
410
|
+
*
|
|
411
|
+
* @param {object} params every parameter of {@link simulate}, plus a target to draw over
|
|
412
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
413
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
414
|
+
* @param {number} params.scene_database graph handle of the scene database
|
|
415
|
+
* @param {number} params.dt seconds since the previous frame
|
|
416
|
+
* @param {number} params.color graph handle of the colour target to draw over
|
|
417
|
+
* @param {number} params.depth graph handle of the scene depth (tested, never written)
|
|
418
|
+
* @returns {number} the colour handle after the particle draw
|
|
130
419
|
*/
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
420
|
+
execute({ graph, camera, scene_database, color, depth, dt }) {
|
|
421
|
+
const simulated = this.simulate({ graph, camera, scene_database, dt });
|
|
422
|
+
|
|
423
|
+
const render = this.#render;
|
|
424
|
+
render.atlas = this.atlas;
|
|
425
|
+
render.atlas_sampler = this.atlas_sampler;
|
|
426
|
+
|
|
427
|
+
return graph_particles_render({
|
|
428
|
+
graph,
|
|
429
|
+
camera,
|
|
430
|
+
color,
|
|
431
|
+
depth,
|
|
432
|
+
gpu: this.buffers,
|
|
433
|
+
simulated,
|
|
434
|
+
sort_bucket_count: PARTICLE_SORT_BUCKET_COUNT,
|
|
435
|
+
frame: this.#frame,
|
|
436
|
+
render,
|
|
437
|
+
});
|
|
137
438
|
}
|
|
138
439
|
|
|
139
440
|
/**
|
|
140
|
-
*
|
|
441
|
+
* What this frame's {@link simulate} left, checked against the graph a side-channel call names:
|
|
442
|
+
* the AVBOIT orchestrator records its passes into the same graph, later in the same frame.
|
|
141
443
|
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
|
|
444
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} graph
|
|
445
|
+
* @returns {{graph: object, scene_database: number, emitter_group_count: number, handles: import("./graph_particles.js").ParticleSimulationHandles}}
|
|
446
|
+
*/
|
|
447
|
+
#simulated_for(graph) {
|
|
448
|
+
const current = this.#simulated;
|
|
449
|
+
|
|
450
|
+
assert.equal(current.graph, graph, "the particles were not simulated into this graph this frame — call simulate() before the transparency pipeline records");
|
|
451
|
+
|
|
452
|
+
return current;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* `AVBOITSideChannel#avboit_occupancy`: the emitters' bounds spheres, as depth slices.
|
|
145
457
|
*
|
|
146
|
-
* @
|
|
458
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
459
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
460
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
461
|
+
* @param {ArrayLike<number>} args.cluster_parameters the frame's depth curve
|
|
462
|
+
* @param {number} args.occupancy graph handle of the occupancy bits
|
|
463
|
+
* @returns {number} the occupancy handle after the write
|
|
147
464
|
*/
|
|
148
|
-
|
|
149
|
-
|
|
465
|
+
avboit_occupancy({ graph, camera, cluster_parameters, occupancy }) {
|
|
466
|
+
const current = this.#simulated_for(graph);
|
|
467
|
+
|
|
468
|
+
return graph_particle_avboit_occupancy({
|
|
469
|
+
graph,
|
|
470
|
+
camera,
|
|
471
|
+
cluster_parameters,
|
|
472
|
+
occupancy,
|
|
473
|
+
scene_database: current.scene_database,
|
|
474
|
+
emitter_database: current.handles.emitter_database,
|
|
475
|
+
emitter_group_count: current.emitter_group_count,
|
|
476
|
+
});
|
|
150
477
|
}
|
|
151
478
|
|
|
152
479
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
480
|
+
* `AVBOITSideChannel#avboit_splat`: the live particles' extinction, into the volume.
|
|
481
|
+
*
|
|
482
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
483
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
484
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
485
|
+
* @param {number} args.warp graph handle of the warp LUT
|
|
486
|
+
* @param {number} args.depth_texture graph handle of the scene depth
|
|
487
|
+
* @param {{extinction: number, overflow: number, dummy: number}} args.volume the voxel volume
|
|
488
|
+
* @returns {{extinction: number, overflow: number, dummy: number}} the volume after the write
|
|
155
489
|
*/
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
490
|
+
avboit_splat({ graph, camera, warp, depth_texture, volume }) {
|
|
491
|
+
const { handles } = this.#simulated_for(graph);
|
|
492
|
+
|
|
493
|
+
return graph_particle_avboit_splat({
|
|
494
|
+
graph,
|
|
495
|
+
camera,
|
|
496
|
+
warp,
|
|
497
|
+
depth_texture,
|
|
498
|
+
volume,
|
|
499
|
+
atlas: this.atlas,
|
|
500
|
+
atlas_sampler: this.atlas_sampler,
|
|
501
|
+
pool: handles.pool,
|
|
502
|
+
alive: handles.alive,
|
|
503
|
+
emitter_database: handles.emitter_database,
|
|
504
|
+
draw_args: handles.draw_args,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* `AVBOITSideChannel#avboit_draw`: the live particles, into the accumulators.
|
|
510
|
+
*
|
|
511
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
512
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
513
|
+
* @param {import("../view/GPUViewContext.js").GPUViewContext} args.view_ctx
|
|
514
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
515
|
+
* @param {number} args.depth_texture graph handle of the scene depth
|
|
516
|
+
* @param {number} args.warp graph handle of the warp LUT
|
|
517
|
+
* @param {number} args.integral graph handle of the integral texture
|
|
518
|
+
* @param {number} args.volumetrics_lut graph handle
|
|
519
|
+
* @param {number} args.volumetrics_metadata graph handle
|
|
520
|
+
* @param {{color: number, norm: number, extinction: number, emission: number}} args.accumulators
|
|
521
|
+
* @returns {{color: number, norm: number, extinction: number, emission: number}} after the draw
|
|
522
|
+
*/
|
|
523
|
+
avboit_draw({ graph, view_ctx, camera, depth_texture, warp, integral, volumetrics_lut, volumetrics_metadata, accumulators }) {
|
|
524
|
+
const { handles } = this.#simulated_for(graph);
|
|
525
|
+
|
|
526
|
+
return graph_particle_avboit_draw({
|
|
527
|
+
graph,
|
|
528
|
+
view_ctx,
|
|
529
|
+
camera,
|
|
530
|
+
depth_texture,
|
|
531
|
+
warp,
|
|
532
|
+
integral,
|
|
533
|
+
volumetrics_lut,
|
|
534
|
+
volumetrics_metadata,
|
|
535
|
+
accumulators,
|
|
536
|
+
atlas: this.atlas,
|
|
537
|
+
atlas_sampler: this.atlas_sampler,
|
|
538
|
+
pool: handles.pool,
|
|
539
|
+
alive: handles.alive,
|
|
540
|
+
emitter_database: handles.emitter_database,
|
|
541
|
+
draw_args: handles.draw_args,
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Bring the emitter set in line with the scene: emitter nodes that arrived get rows, nodes that
|
|
547
|
+
* left give theirs back. Runs only when the scene's membership version has moved.
|
|
548
|
+
*
|
|
549
|
+
* A node the scene context has not placed yet (no `transforms` row) is left for the next frame,
|
|
550
|
+
* and the version is not recorded, so the sweep runs again until every emitter is bound.
|
|
551
|
+
*/
|
|
552
|
+
#sync_membership() {
|
|
553
|
+
const scene = this.scene_context.scene;
|
|
554
|
+
const batch = scene.instances;
|
|
555
|
+
|
|
556
|
+
if (batch.version === this.#instances_version) {
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
const sweep = ++this.#sweep;
|
|
561
|
+
const nodes = batch.nodes;
|
|
562
|
+
const node_count = nodes.length;
|
|
563
|
+
const mapping = this.scene_context.id_mapping;
|
|
564
|
+
const registry = this.registry;
|
|
565
|
+
const swept = this.#swept;
|
|
566
|
+
|
|
567
|
+
let complete = true;
|
|
568
|
+
|
|
569
|
+
for (let i = 0; i < node_count; i++) {
|
|
570
|
+
const node = nodes[i];
|
|
571
|
+
|
|
572
|
+
if (node.isParticleEmitter !== true) {
|
|
573
|
+
continue;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
const transform_row = mapping.get(node.id);
|
|
577
|
+
|
|
578
|
+
if (transform_row === undefined) {
|
|
579
|
+
complete = false;
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
if (node.row === -1) {
|
|
584
|
+
registry.add(node, transform_row);
|
|
585
|
+
} else {
|
|
586
|
+
registry.set_transform_row(node, transform_row);
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
swept.set(node, sweep);
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
for (const [emitter, seen] of swept) {
|
|
593
|
+
if (seen !== sweep) {
|
|
594
|
+
registry.remove(emitter);
|
|
595
|
+
swept.delete(emitter);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (complete) {
|
|
600
|
+
this.#instances_version = batch.version;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Push everything the CPU changed to the GPU: dirty emitter rows, the state buffer's growth,
|
|
606
|
+
* rebuilt program buffers, the spawn-command ring, and the coherence scratch's growth. A
|
|
607
|
+
* command context is opened only if something needs one.
|
|
608
|
+
*/
|
|
609
|
+
#upload() {
|
|
610
|
+
const registry = this.registry;
|
|
611
|
+
const device = this.graphics.device;
|
|
612
|
+
|
|
613
|
+
registry.flush();
|
|
614
|
+
|
|
615
|
+
// Both tables stage into the one database: the emitter rows the author changed, and the
|
|
616
|
+
// state rows claimed or released with them.
|
|
617
|
+
const rows_staged = registry.table.element_upload_buffer.position > 0
|
|
618
|
+
|| registry.state_table.element_upload_buffer.position > 0;
|
|
619
|
+
|
|
620
|
+
if (rows_staged) {
|
|
621
|
+
const cmd = ShadeGPUCommandContext.create(this.graphics, "particles/upload");
|
|
622
|
+
|
|
623
|
+
registry.database.update(cmd);
|
|
624
|
+
|
|
625
|
+
cmd.finish();
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
if (registry.programs_dirty) {
|
|
629
|
+
this.buffers.program = replace_data_buffer(device, this.buffers.program, "particles/program", registry.build_program());
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
this.#merge_spawn_commands();
|
|
633
|
+
|
|
634
|
+
if (this.#spawn_command_count > 0) {
|
|
635
|
+
device.queue.writeBuffer(
|
|
636
|
+
this.buffers.spawn_commands, 0,
|
|
637
|
+
this.#spawn_commands.buffer, 0,
|
|
638
|
+
this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS * WORD,
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
this.#ensure_sim_buffers(this.bucketCount());
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/**
|
|
646
|
+
* Fold the ring down to one entry per row, dropping entries whose emitter no longer holds the
|
|
647
|
+
* row it was issued against.
|
|
648
|
+
*
|
|
649
|
+
* The spawn-command pass adds to a state row with a plain read-modify-write, so two entries
|
|
650
|
+
* naming one row would lose one; and a burst issued to an emitter that left the scene this
|
|
651
|
+
* frame must not land on the row's next tenant. Both are settled here, in place, over a few
|
|
652
|
+
* dozen entries at most.
|
|
653
|
+
*/
|
|
654
|
+
#merge_spawn_commands() {
|
|
655
|
+
const count = this.#spawn_command_count;
|
|
656
|
+
|
|
657
|
+
if (count === 0) {
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
const ring = this.#spawn_commands;
|
|
662
|
+
const emitters = this.#spawn_command_emitters;
|
|
663
|
+
|
|
664
|
+
let rows = this.#spawn_by_row;
|
|
665
|
+
const needed = Math.max(1, this.registry.table.element_capacity);
|
|
666
|
+
|
|
667
|
+
if (rows.length < needed) {
|
|
668
|
+
rows = new Uint32Array(needed);
|
|
669
|
+
this.#spawn_by_row = rows;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
for (let i = 0; i < count; i++) {
|
|
673
|
+
const emitter = emitters[i];
|
|
674
|
+
const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
|
|
675
|
+
|
|
676
|
+
if (emitter.row === row) {
|
|
677
|
+
rows[row] += ring[i * PARTICLE_SPAWN_COMMAND_WORDS + 1];
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
emitters[i] = null;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
let merged = 0;
|
|
684
|
+
|
|
685
|
+
for (let i = 0; i < count; i++) {
|
|
686
|
+
const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
|
|
687
|
+
const pending = rows[row];
|
|
688
|
+
|
|
689
|
+
if (pending === 0) {
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
ring[merged * PARTICLE_SPAWN_COMMAND_WORDS] = row;
|
|
694
|
+
ring[merged * PARTICLE_SPAWN_COMMAND_WORDS + 1] = pending;
|
|
695
|
+
rows[row] = 0;
|
|
696
|
+
merged++;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
this.#spawn_command_count = merged;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
/**
|
|
703
|
+
* The simulation-order scratch is sized from the number of distinct programs, which only ever
|
|
704
|
+
* grows (programs are never reclaimed, see {@link EmitterRegistry}). Reallocated when it does;
|
|
705
|
+
* nothing in these buffers outlives a frame, so nothing is copied.
|
|
706
|
+
*
|
|
707
|
+
* @param {number} buckets
|
|
708
|
+
*/
|
|
709
|
+
#ensure_sim_buffers(buckets) {
|
|
710
|
+
if (buckets <= this.#sim_bucket_capacity) {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
const device = this.graphics.device;
|
|
715
|
+
const buffers = this.buffers;
|
|
716
|
+
const capacity = this.capacity;
|
|
717
|
+
|
|
718
|
+
for (const name of ["sim_list", "sim_keys", "sim_histogram", "sim_bucket_counts", "sim_cursor"]) {
|
|
719
|
+
buffers[name]?.destroy();
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// Padding rounds each bucket up to a whole workgroup, so it can add at most `workgroup - 1`
|
|
723
|
+
// entries per bucket; one whole workgroup per bucket is the bound.
|
|
724
|
+
buffers.sim_list = device.createBuffer({ label: "particles/sim_list", size: (capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * WORD, usage: STORAGE });
|
|
725
|
+
buffers.sim_keys = device.createBuffer({ label: "particles/sim_keys", size: capacity * WORD, usage: STORAGE });
|
|
726
|
+
// `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
|
|
727
|
+
// rounded up to a multiple of four.
|
|
728
|
+
buffers.sim_histogram = device.createBuffer({ label: "particles/sim_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(buckets)) * WORD, usage: STORAGE });
|
|
729
|
+
buffers.sim_bucket_counts = device.createBuffer({ label: "particles/sim_bucket_counts", size: buckets * WORD, usage: STORAGE });
|
|
730
|
+
buffers.sim_cursor = device.createBuffer({ label: "particles/sim_cursor", size: buckets * WORD, usage: STORAGE });
|
|
731
|
+
|
|
732
|
+
this.#sim_bucket_capacity = buckets;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* The buffers whose size is fixed by the pool capacity, and the free list's initial contents.
|
|
737
|
+
*/
|
|
738
|
+
#create_buffers() {
|
|
739
|
+
const device = this.graphics.device;
|
|
740
|
+
const capacity = this.capacity;
|
|
741
|
+
const buffers = this.buffers;
|
|
742
|
+
|
|
743
|
+
buffers.pool = device.createBuffer({ label: "particles/pool", size: capacity * PARTICLE_RECORD_WORD_COUNT * WORD, usage: STORAGE });
|
|
744
|
+
buffers.alive = [
|
|
745
|
+
device.createBuffer({ label: "particles/alive_a", size: capacity * WORD, usage: STORAGE }),
|
|
746
|
+
device.createBuffer({ label: "particles/alive_b", size: capacity * WORD, usage: STORAGE }),
|
|
747
|
+
];
|
|
748
|
+
buffers.dead = device.createBuffer({ label: "particles/dead", size: capacity * WORD, usage: STORAGE });
|
|
749
|
+
buffers.counters = device.createBuffer({ label: "particles/counters", size: PARTICLE_COUNTER_COUNT * WORD, usage: STORAGE });
|
|
750
|
+
|
|
751
|
+
// Indirect args, written on-GPU. Zero-initialised (WebGPU spec), so the first frame's
|
|
752
|
+
// indirect dispatch/draw are no-ops until the first build-indirect has run.
|
|
753
|
+
buffers.dispatch_args = device.createBuffer({ label: "particles/dispatch_args", size: 3 * WORD, usage: INDIRECT });
|
|
754
|
+
buffers.draw_args = device.createBuffer({ label: "particles/draw_args", size: 4 * WORD, usage: INDIRECT });
|
|
755
|
+
buffers.sim_dispatch_args = device.createBuffer({ label: "particles/sim_dispatch_args", size: 3 * WORD, usage: INDIRECT });
|
|
756
|
+
|
|
757
|
+
// Render order.
|
|
758
|
+
buffers.sorted = device.createBuffer({ label: "particles/sorted", size: capacity * WORD, usage: STORAGE });
|
|
759
|
+
buffers.sort_keys = device.createBuffer({ label: "particles/sort_keys", size: capacity * WORD, usage: STORAGE });
|
|
760
|
+
buffers.sort_histogram = device.createBuffer({ label: "particles/sort_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(PARTICLE_SORT_BUCKET_COUNT)) * WORD, usage: STORAGE });
|
|
761
|
+
buffers.sort_cursor = device.createBuffer({ label: "particles/sort_cursor", size: PARTICLE_SORT_BUCKET_COUNT * WORD, usage: STORAGE });
|
|
762
|
+
|
|
763
|
+
buffers.spawn_commands = device.createBuffer({ label: "particles/spawn_commands", size: this.#spawn_commands.byteLength, usage: STORAGE });
|
|
764
|
+
|
|
765
|
+
// Every slot free, and the counters saying so.
|
|
766
|
+
const dead = new Uint32Array(capacity);
|
|
767
|
+
for (let i = 0; i < capacity; i++) {
|
|
194
768
|
dead[i] = i;
|
|
195
769
|
}
|
|
196
770
|
const counters = new Uint32Array(PARTICLE_COUNTER_COUNT);
|
|
197
|
-
counters[PARTICLE_COUNTER.DEAD] =
|
|
198
|
-
|
|
771
|
+
counters[PARTICLE_COUNTER.DEAD] = capacity;
|
|
772
|
+
|
|
773
|
+
device.queue.writeBuffer(buffers.dead, 0, dead);
|
|
774
|
+
device.queue.writeBuffer(buffers.counters, 0, counters);
|
|
199
775
|
}
|
|
200
776
|
|
|
201
777
|
/**
|
|
202
|
-
*
|
|
203
|
-
* @returns {{read: number, write: number}}
|
|
778
|
+
* A 1x1 white atlas and a linear sampler, so the system draws before anyone hands it art.
|
|
204
779
|
*/
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
780
|
+
#create_default_atlas() {
|
|
781
|
+
const device = this.graphics.device;
|
|
782
|
+
|
|
783
|
+
const texture = device.createTexture({
|
|
784
|
+
label: "particles/default_atlas",
|
|
785
|
+
size: [1, 1],
|
|
786
|
+
format: "rgba8unorm",
|
|
787
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
788
|
+
});
|
|
789
|
+
|
|
790
|
+
device.queue.writeTexture({ texture }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
|
|
791
|
+
|
|
792
|
+
// kept, not just viewed: a texture nothing holds is a texture nothing can free
|
|
793
|
+
this.#default_atlas = texture;
|
|
794
|
+
this.atlas = texture.createView();
|
|
795
|
+
this.atlas_sampler = device.createSampler({
|
|
796
|
+
label: "particles/atlas_sampler",
|
|
797
|
+
magFilter: "linear",
|
|
798
|
+
minFilter: "linear",
|
|
799
|
+
addressModeU: "clamp-to-edge",
|
|
800
|
+
addressModeV: "clamp-to-edge",
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* @param {string} color_format
|
|
806
|
+
* @param {string} depth_format
|
|
807
|
+
* @returns {object} the billboard pipeline descriptor for these attachment formats
|
|
808
|
+
*/
|
|
809
|
+
#obtain_pipeline(color_format, depth_format) {
|
|
810
|
+
const key = `${color_format}/${depth_format}`;
|
|
811
|
+
|
|
812
|
+
if (this.#pipeline === null || this.#pipeline_key !== key) {
|
|
813
|
+
this.#pipeline = create_particle_billboard_pipeline({
|
|
814
|
+
color_format,
|
|
815
|
+
depth_format,
|
|
816
|
+
// reverse-Z, the engine convention
|
|
817
|
+
depth_compare: "greater",
|
|
818
|
+
});
|
|
819
|
+
this.#pipeline_key = key;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
return this.#pipeline;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Sizes of the persistent buffers, in bytes, as they stand. Exposed for tests.
|
|
827
|
+
* @returns {Object<string, number>}
|
|
828
|
+
*/
|
|
829
|
+
bufferSizes() {
|
|
830
|
+
const sizes = {};
|
|
831
|
+
|
|
832
|
+
for (const [name, buffer] of Object.entries(this.buffers)) {
|
|
833
|
+
if (Array.isArray(buffer)) {
|
|
834
|
+
sizes[name] = buffer[0].size;
|
|
835
|
+
} else if (buffer !== undefined && buffer !== null) {
|
|
836
|
+
sizes[name] = buffer.size;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
return sizes;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
destroy() {
|
|
844
|
+
/*
|
|
845
|
+
The emitters go first, and they matter more than the buffers: they are the scene's nodes,
|
|
846
|
+
they outlive this system, and each is holding a row of the table about to be freed. A node
|
|
847
|
+
left holding one is stranded — the next system's membership sweep reads `row !== -1` as
|
|
848
|
+
"already mine", takes the moved branch rather than the arrived one, and never registers it.
|
|
849
|
+
Retiring them here puts every emitter back where it was before this system saw it.
|
|
850
|
+
*/
|
|
851
|
+
for (const emitter of this.registry.emitters.slice()) {
|
|
852
|
+
this.registry.remove(emitter);
|
|
853
|
+
}
|
|
854
|
+
this.#swept.clear();
|
|
855
|
+
this.#instances_version = -1;
|
|
856
|
+
|
|
857
|
+
for (const buffer of Object.values(this.buffers)) {
|
|
858
|
+
if (Array.isArray(buffer)) {
|
|
859
|
+
buffer.forEach((b) => b.destroy());
|
|
860
|
+
} else if (buffer !== undefined && buffer !== null) {
|
|
861
|
+
buffer.destroy();
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
this.buffers = {};
|
|
866
|
+
this.registry.database.destroy();
|
|
867
|
+
|
|
868
|
+
// the default atlas is this system's own; a page that replaced it owns what it put there
|
|
869
|
+
this.#default_atlas?.destroy();
|
|
870
|
+
this.#default_atlas = null;
|
|
208
871
|
}
|
|
209
872
|
}
|
|
210
873
|
|
|
211
874
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
875
|
+
* A storage buffer holding `data`, replacing `previous` (destroyed) if it exists. The program
|
|
876
|
+
* buffer is monolithic — a program is variable-length, so there is no table to page it into — and
|
|
877
|
+
* is rebuilt whole on the rare frame the arena grows.
|
|
878
|
+
*
|
|
879
|
+
* @param {GPUDevice} device
|
|
880
|
+
* @param {GPUBuffer|undefined} previous
|
|
881
|
+
* @param {string} label
|
|
882
|
+
* @param {Uint32Array} data
|
|
883
|
+
* @returns {GPUBuffer}
|
|
214
884
|
*/
|
|
215
|
-
function
|
|
216
|
-
|
|
885
|
+
function replace_data_buffer(device, previous, label, data) {
|
|
886
|
+
previous?.destroy();
|
|
887
|
+
|
|
888
|
+
const buffer = device.createBuffer({ label, size: Math.max(WORD, data.byteLength), usage: STORAGE });
|
|
889
|
+
|
|
890
|
+
device.queue.writeBuffer(buffer, 0, data);
|
|
891
|
+
|
|
892
|
+
return buffer;
|
|
217
893
|
}
|