@woosh/meep-engine 3.15.0 → 3.17.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 +411 -0
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -0
- package/editor/particles/effect/ParticleEffectDocument.js +1010 -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/NodeGraphClipboard.d.ts +186 -0
- package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +201 -2
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +602 -7
- 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 +891 -82
- 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/actions/connection_bind_actions.d.ts +23 -0
- package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
- package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
- 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 +480 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -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 +632 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +161 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.js +1666 -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 +553 -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 +644 -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/binary/allocator/OffsetAllocator.d.ts +25 -16
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +10 -1
- package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
- package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
- package/src/core/collection/array/typed/float32_array_hash.js +38 -0
- 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/csr/CSRGraph.d.ts +8 -1
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
- package/src/core/graph/csr/CSRGraph.js +14 -6
- 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 +133 -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 +168 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +175 -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 +203 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +226 -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 +405 -0
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +159 -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 +436 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +93 -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 +176 -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 +561 -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 +191 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +35 -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 +109 -0
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +59 -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 +173 -0
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +46 -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 +534 -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 +70 -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 +716 -0
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +34 -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 +229 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +31 -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 +249 -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 +20 -8
- 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 +74 -66
- 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 +2078 -2045
- 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.js +10 -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 +26 -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 +49 -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 +360 -316
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +521 -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/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 +36 -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/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -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 +63 -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 +141 -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 +230 -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 +43 -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 +306 -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 +174 -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 +25 -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 +218 -204
- package/src/engine/intelligence/behavior/util/RotationBehavior.js +5 -5
- package/src/engine/intelligence/mcts/StateNode.js +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +7 -7
- package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
- package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -15
- package/src/engine/interpolation/pose_interpoland.d.ts +2 -2
- package/src/engine/interpolation/pose_interpoland.js +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +4 -4
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
- package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +39 -14
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +7 -7
- package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
- package/src/engine/network/adapters/TransformReplicationAdapter.js +19 -20
- package/src/engine/network/replication/Replicator.d.ts +5 -3
- package/src/engine/network/replication/Replicator.d.ts.map +1 -1
- package/src/engine/network/replication/Replicator.js +65 -16
- package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
- package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
- package/src/engine/physics/ccd/linear_sweep.js +9 -3
- package/src/engine/physics/constraint/solve_constraints.js +10 -10
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
- package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
- package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2334 -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 +68 -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 +6 -6
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +25 -6
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
- package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
- package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
- package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
- package/src/format/scene/gltf/gltf_component_type.js +3 -1
- package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
- package/src/format/texture/ktx2/ktx2_read.js +2 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
- package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
- package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
- package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
- package/src/generation/markers/MarkerNode.d.ts +3 -3
- package/src/generation/markers/MarkerNode.d.ts.map +1 -1
- package/src/generation/markers/MarkerNode.js +3 -3
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
- package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
- package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
- package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
- package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
- package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
- package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
- package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
- package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
- package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
- package/src/shade/playground/avboit/main.js +3 -3
- package/src/shade/playground/basis_textures/main.js +1 -1
- package/src/shade/playground/ground_seam/main.js +1 -1
- package/src/shade/playground/particle_editor/README.md +216 -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 +196 -181
- package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
- package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_scene.js +487 -670
- package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
- package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
- package/src/shade/playground/sponza_path_trace/main.js +1 -1
- package/src/shade/playground/volumetrics_froxel/main.js +917 -917
- package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
- package/src/shade/renderer/Renderer.d.ts +28 -0
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +152 -8
- package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
- package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
- package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
- package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
- package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
- package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
- package/src/shade/renderer/buffer/table/gpu_database_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 +361 -117
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +266 -87
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +919 -145
- package/src/shade/renderer/particles/ParticleConstants.d.ts +134 -5
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +148 -6
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
- package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
- 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 +167 -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_emitter_record.d.ts +37 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
- 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 +138 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -44
- 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 +33 -2
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -185
- 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 +469 -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 +244 -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 +81 -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 +294 -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 +524 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.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 +185 -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 +409 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -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 +58 -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 +49 -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 +186 -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 +312 -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 +342 -0
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +72 -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 +495 -0
- package/src/shade/renderer/particles/graph_particles.d.ts +98 -69
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +277 -81
- 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 +313 -0
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +83 -21
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +186 -48
- 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 +74 -21
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +131 -81
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +372 -22
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +694 -66
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +173 -0
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/particle_assembly.js +1214 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +48 -3
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +101 -5
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +199 -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 +477 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +371 -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 +764 -0
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +128 -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 +376 -0
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +43 -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 +337 -0
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +107 -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 +166 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +12 -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 +198 -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 +23 -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 +678 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -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 +63 -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 +87 -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 +392 -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 +361 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -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 +154 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +151 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
- package/src/shade/renderer/particles/particle_test_fixtures.js +229 -0
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +206 -64
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +404 -83
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +249 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +425 -0
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +77 -18
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +9 -6
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
- 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_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_emit_step.d.ts +28 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -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/chunk_particle_simulate_step.d.ts +35 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -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 +27 -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 +43 -68
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
- 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 +8 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +42 -56
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
- 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/graph_particle_sort.d.ts +51 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -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/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +6 -3
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +285 -154
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +264 -170
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -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/native/avboit/AVBOITSideChannel.d.ts +87 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +179 -0
- package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +27 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +9 -2
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +12 -3
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
- package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +25 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +69 -10
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +10 -4
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +4 -39
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
- package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
- package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
- package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
- 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/ComputeShaderEmulator.d.ts +34 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +115 -15
- 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 +18 -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.d.ts +0 -15
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
- package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
- package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
- package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
- package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
- 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.d.ts +0 -43
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
- package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -115
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -22
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
|
@@ -1,217 +1,991 @@
|
|
|
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
|
+
PARTICLE_VM_FAST_REGISTER_SLOTS,
|
|
13
|
+
} from "./ParticleConstants.js";
|
|
5
14
|
import { PARTICLE_COUNTER, PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
|
|
15
|
+
import { graph_particles_simulate } from "./graph_particles.js";
|
|
16
|
+
import {
|
|
17
|
+
graph_particle_avboit_draw,
|
|
18
|
+
graph_particle_avboit_occupancy,
|
|
19
|
+
graph_particle_avboit_splat,
|
|
20
|
+
} from "./graph_particles_avboit.js";
|
|
21
|
+
import { graph_particles_billboard } from "./graph_particles_billboard.js";
|
|
22
|
+
import { ParticleRenderMode } from "./ParticleRenderMode.js";
|
|
6
23
|
import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
|
|
7
|
-
import {
|
|
24
|
+
import { create_particle_billboard_pipeline } from "./shaders/shader_particle_render.js";
|
|
25
|
+
import { graph_particle_sort } from "./sort/graph_particle_sort.js";
|
|
26
|
+
|
|
27
|
+
const WORD = Uint32Array.BYTES_PER_ELEMENT;
|
|
28
|
+
|
|
29
|
+
const STORAGE = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;
|
|
30
|
+
const INDIRECT = GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC;
|
|
8
31
|
|
|
9
32
|
/**
|
|
10
|
-
* The GPU particle system feature
|
|
33
|
+
* The GPU particle system: a feature of a scene, in the mould of `ReSTIRDI` — construct once
|
|
34
|
+
* against a {@link GPUSceneContext}, and contribute the frame's passes through
|
|
35
|
+
* {@link execute}.
|
|
36
|
+
*
|
|
37
|
+
* ## What it owns
|
|
38
|
+
*
|
|
39
|
+
* Every piece of persistent GPU state: the particle pool, the ping-pong alive lists, the dead
|
|
40
|
+
* free-list, the counters, both indirect-args buffers, the simulation-order (coherence) scratch,
|
|
41
|
+
* the emitter database (the emitter table and the GPU-owned state table, one buffer), the packed
|
|
42
|
+
* program buffer, and the spawn-command ring. Buffers that depend on the emitter set — the
|
|
43
|
+
* coherence scratch on the number of distinct programs, the program buffer on the heap, the
|
|
44
|
+
* database on its own pages — are grown inside {@link execute}, the way ReSTIR's reservoirs follow
|
|
45
|
+
* the resolution. The render-order (sort) scratch is not in that list because it is not
|
|
46
|
+
* unconditional: see below.
|
|
47
|
+
*
|
|
48
|
+
* Every pass stays within the eight storage buffers a stage gets by default: the emitter record
|
|
49
|
+
* and the GPU-owned state are two tables of one database buffer, and the VM's constants and code
|
|
50
|
+
* are one packed buffer. The one exception is the wide-register fallback (below), whose emit and
|
|
51
|
+
* simulate passes bind a ninth for the register file — inside the ten the engine already demands of
|
|
52
|
+
* an adapter, but past the default.
|
|
53
|
+
*
|
|
54
|
+
* ## Two interpreters
|
|
55
|
+
*
|
|
56
|
+
* The VM's register file normally lives in shader registers, and is therefore small — see
|
|
57
|
+
* {@link ./ParticleConstants.js PARTICLE_VM_FAST_REGISTER_SLOTS}. An effect whose compiled program
|
|
58
|
+
* needs more than it holds does not fail: the whole system swaps emit and simulate for variants
|
|
59
|
+
* that keep the file in a storage buffer, which is far slower and effectively unbounded. The choice
|
|
60
|
+
* is per-frame, whole-system, and made here — the registry reports `max_register_count` over the
|
|
61
|
+
* effects it holds and this is where that number meets the VM's; nothing about authoring a graph has
|
|
62
|
+
* a register ceiling.
|
|
63
|
+
*
|
|
64
|
+
* ## Emitters are scene nodes
|
|
65
|
+
*
|
|
66
|
+
* There is no `addEmitter`. A {@link ParticleEmitter} is a {@link Node3D}: put it in the scene —
|
|
67
|
+
* on its own or under a joint — and the next {@link execute} finds it in the scene's node list,
|
|
68
|
+
* gives it a row in the emitter table pointed at the `transforms` row the scene context gave the
|
|
69
|
+
* node, and it starts spawning. Take it out of the scene and its row is retired and its particles
|
|
70
|
+
* freed. The sweep runs only when the scene's membership version moves, which is how per-frame
|
|
71
|
+
* upkeep stays proportional to what changed rather than to how many emitters there are.
|
|
11
72
|
*
|
|
12
|
-
*
|
|
13
|
-
* sort scratch, emitter/program/constant buffers, indirect args) and the CPU model (an
|
|
14
|
-
* {@link EmitterRegistry}, a {@link ParticleSpawnScheduler} and bone attachments). Mirrors the
|
|
15
|
-
* ReSTIR feature template: construct once, toggle with a flag, and contribute per-frame passes via
|
|
16
|
-
* {@link encode}.
|
|
73
|
+
* ## Spawning is the GPU's decision
|
|
17
74
|
*
|
|
18
|
-
*
|
|
75
|
+
* The CPU never counts particles or walks emitters per frame. The emitter tick pass integrates
|
|
76
|
+
* every emitter's rate on the GPU, and the emit dispatch is sized by a prefix scan of what it
|
|
77
|
+
* decided. The host's one way to ask for particles is {@link spawn}: a burst queued into a small
|
|
78
|
+
* command list that a pass adds to the emitter's pending spawns, on the same path as everything
|
|
79
|
+
* else. See `graph_particles.js` for the frame.
|
|
19
80
|
*
|
|
20
|
-
*
|
|
21
|
-
* alive count)
|
|
22
|
-
* 2. emit — run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
|
|
23
|
-
* 3. simulate — one dispatch runs every emitter's UPDATE over the coherence list built last frame,
|
|
24
|
-
* compacting survivors into the new alive list and freed slots into the dead list
|
|
25
|
-
* 4. bucket — regroup the new alive list by VM program, padded to whole workgroups, into the list
|
|
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
|
|
81
|
+
* ## Drawing, and the one thing the mode changes
|
|
31
82
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
83
|
+
* {@link execute} is the whole per-frame call, once per frame. It always records everything that
|
|
84
|
+
* moves particles and leaves the alive list and the indirect draw args as graph handles; what it
|
|
85
|
+
* records after that is the {@link ParticleRenderMode} it was given.
|
|
35
86
|
*
|
|
36
|
-
*
|
|
87
|
+
* `BILLBOARD` sorts the alive list back-to-front and draws it over a colour target, because
|
|
88
|
+
* premultiplied over-blending is order-dependent. `AVBOIT` records neither: under the renderer the
|
|
89
|
+
* system is an `AVBOITSideChannel`, and the transparency orchestrator asks it for its occupancy, its
|
|
90
|
+
* extinction and its draw at the three points where the transparent meshes have contributed theirs
|
|
91
|
+
* ({@link avboit_occupancy}, {@link avboit_splat}, {@link avboit_draw}). Those read the same handles
|
|
92
|
+
* and composite into a volume and a set of accumulators that are sums, so an ordering would buy
|
|
93
|
+
* nothing — and the sort is four passes and a scan over every live particle, plus two lists a word
|
|
94
|
+
* per particle each, which is why the mode also decides whether those buffers exist at all.
|
|
37
95
|
*
|
|
38
|
-
* ##
|
|
96
|
+
* ## Allocation
|
|
39
97
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
98
|
+
* The per-frame path allocates the frame graph's records and nothing else: emitter rows are
|
|
99
|
+
* staged through one shared record, spawn commands go into a preallocated ring, and the
|
|
100
|
+
* per-dispatch settings are reused objects. A command context is opened only on frames that have
|
|
101
|
+
* something to upload.
|
|
44
102
|
*/
|
|
45
103
|
export class GPUParticleSystem {
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Engine GraphicsContext.
|
|
107
|
+
* @type {object}
|
|
108
|
+
*/
|
|
109
|
+
graphics;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* The scene whose nodes the emitters are, and whose database their world matrices come from.
|
|
113
|
+
* @type {import("../scene/GPUSceneContext.js").GPUSceneContext}
|
|
114
|
+
*/
|
|
115
|
+
scene_context;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Maximum number of simultaneously live particles.
|
|
119
|
+
* @type {number}
|
|
120
|
+
*/
|
|
121
|
+
capacity;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @type {EmitterRegistry}
|
|
125
|
+
*/
|
|
126
|
+
registry;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Frames elapsed. Drives the alive-list ping-pong and the VM's frame builtin.
|
|
130
|
+
* @type {number}
|
|
131
|
+
*/
|
|
132
|
+
frame = 0;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Seconds since start, the VM's `TIME` builtin. Advanced by `dt` each {@link execute}.
|
|
136
|
+
* @type {number}
|
|
137
|
+
*/
|
|
138
|
+
time = 0;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Cap on how much missed time a culled emitter makes up for when it comes back into view.
|
|
142
|
+
* @type {number}
|
|
143
|
+
*/
|
|
144
|
+
max_catchup_seconds = 1;
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* View-depth range the render sort quantises: particles nearer than `[0]` share the front bin,
|
|
148
|
+
* farther than `[1]` the back one. Read only by {@link ParticleRenderMode.BILLBOARD}.
|
|
149
|
+
* @type {Float32Array}
|
|
150
|
+
*/
|
|
151
|
+
sort_depth_range = new Float32Array([0.1, 100]);
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Sprite atlas the billboards sample, and the sampler they sample it with. A 1x1 white texel by
|
|
155
|
+
* default, so an emitter with no art draws as a plain quad rather than nothing.
|
|
156
|
+
* @type {GPUTextureView}
|
|
157
|
+
*/
|
|
158
|
+
atlas;
|
|
159
|
+
|
|
160
|
+
/** @type {GPUSampler} */
|
|
161
|
+
atlas_sampler;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The persistent GPU buffers, by the names the graph functions bind them under. Exposed for
|
|
165
|
+
* inspection — a harness copying the counters out to display them — never for the frame loop,
|
|
166
|
+
* which reads nothing back. Entries that grow with the emitter set are replaced in place.
|
|
167
|
+
*
|
|
168
|
+
* @type {object}
|
|
169
|
+
*/
|
|
170
|
+
buffers = {};
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Distinct programs the coherence scratch is currently sized for.
|
|
174
|
+
* @type {number}
|
|
175
|
+
*/
|
|
176
|
+
#sim_bucket_capacity = 0;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The spawn-command ring: `[row, count]` pairs, filled by {@link spawn}, merged and uploaded on
|
|
180
|
+
* the next {@link execute}.
|
|
181
|
+
* @type {Uint32Array}
|
|
182
|
+
*/
|
|
183
|
+
#spawn_commands;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The emitter each ring entry was issued for, so an entry whose emitter has since left the
|
|
187
|
+
* scene — or whose row has gone to somebody else — is dropped at upload rather than delivered
|
|
188
|
+
* to the row's next tenant.
|
|
189
|
+
* @type {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
|
|
190
|
+
*/
|
|
191
|
+
#spawn_command_emitters;
|
|
192
|
+
|
|
193
|
+
/** @type {number} */
|
|
194
|
+
#spawn_command_count = 0;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Scratch for merging the ring: pending count by row. Grown with the emitter table, never per
|
|
198
|
+
* frame.
|
|
199
|
+
* @type {Uint32Array}
|
|
200
|
+
*/
|
|
201
|
+
#spawn_by_row = new Uint32Array(0);
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Emitter node -> the sweep that last saw it in the scene.
|
|
205
|
+
* @type {Map<import("./runtime/ParticleEmitter.js").ParticleEmitter, number>}
|
|
206
|
+
*/
|
|
207
|
+
#swept = new Map();
|
|
208
|
+
|
|
209
|
+
/** @type {number} */
|
|
210
|
+
#sweep = 0;
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* The 1x1 white texture {@link atlas} points at until a caller replaces it. Held so
|
|
214
|
+
* {@link destroy} can free it; a caller that assigns its own atlas owns that one.
|
|
215
|
+
* @type {GPUTexture|null}
|
|
216
|
+
*/
|
|
217
|
+
#default_atlas = null;
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* The scene membership version the emitter set was last reconciled against.
|
|
221
|
+
* @type {number}
|
|
222
|
+
*/
|
|
223
|
+
#instances_version = -1;
|
|
224
|
+
|
|
225
|
+
/** @type {object|null} */
|
|
226
|
+
#pipeline = null;
|
|
227
|
+
|
|
228
|
+
/** @type {string} */
|
|
229
|
+
#pipeline_key = "";
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Per-frame scalars handed to {@link graph_particles_simulate}, reused rather than rebuilt.
|
|
233
|
+
* @type {object}
|
|
234
|
+
*/
|
|
235
|
+
#frame = {
|
|
236
|
+
dt: 0, time: 0, index: 0, max_catchup: 1, spawn_command_count: 0,
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
/** @type {{capacity: number, group_count: number}} */
|
|
240
|
+
#emitters = { capacity: 0, group_count: 0 };
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* This frame's simulation, for the draw that follows it: the graph it was recorded into, the
|
|
244
|
+
* scene database handle it read, and the handles it produced. Reused, never reallocated.
|
|
245
|
+
* @type {{graph: object|null, scene_database: number, emitter_group_count: number, handles: object|null}}
|
|
246
|
+
*/
|
|
247
|
+
#simulated = { graph: null, scene_database: -1, emitter_group_count: 0, handles: null };
|
|
248
|
+
|
|
249
|
+
/** @type {object} */
|
|
250
|
+
#render = {
|
|
251
|
+
atlas: null,
|
|
252
|
+
atlas_sampler: null,
|
|
253
|
+
obtain_pipeline: (color_format, depth_format) => this.#obtain_pipeline(color_format, depth_format),
|
|
254
|
+
};
|
|
255
|
+
|
|
46
256
|
/**
|
|
47
257
|
* @param {object} graphics engine GraphicsContext (has `.device`)
|
|
258
|
+
* @param {import("../scene/GPUSceneContext.js").GPUSceneContext} scene_context
|
|
48
259
|
* @param {object} [options]
|
|
49
260
|
* @param {number} [options.capacity] max simultaneous particles
|
|
261
|
+
* @param {number} [options.spawn_command_capacity] most {@link spawn} calls one frame keeps
|
|
50
262
|
*/
|
|
51
|
-
constructor(graphics, { capacity = 1 << 16 } = {}) {
|
|
263
|
+
constructor(graphics, scene_context, { capacity = 1 << 16, spawn_command_capacity = 256 } = {}) {
|
|
52
264
|
assert.defined(graphics, "graphics");
|
|
265
|
+
assert.defined(scene_context, "scene_context");
|
|
266
|
+
assert.equal(scene_context.isGPUSceneContext, true, "scene_context.isGPUSceneContext !== true");
|
|
53
267
|
assert.isPositiveInteger(capacity, "capacity");
|
|
268
|
+
assert.isPositiveInteger(spawn_command_capacity, "spawn_command_capacity");
|
|
54
269
|
|
|
55
270
|
this.graphics = graphics;
|
|
271
|
+
this.scene_context = scene_context;
|
|
56
272
|
this.capacity = capacity;
|
|
57
273
|
|
|
58
|
-
this.registry = new EmitterRegistry();
|
|
59
|
-
this.scheduler = new ParticleSpawnScheduler();
|
|
274
|
+
this.registry = new EmitterRegistry(graphics.device);
|
|
60
275
|
|
|
61
|
-
|
|
62
|
-
this
|
|
276
|
+
this.#spawn_commands = new Uint32Array(spawn_command_capacity * PARTICLE_SPAWN_COMMAND_WORDS);
|
|
277
|
+
this.#spawn_command_emitters = new Array(spawn_command_capacity).fill(null);
|
|
63
278
|
|
|
64
|
-
|
|
65
|
-
this
|
|
279
|
+
this.#create_buffers();
|
|
280
|
+
this.#create_default_atlas();
|
|
281
|
+
}
|
|
66
282
|
|
|
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;
|
|
283
|
+
/**
|
|
284
|
+
* The buffer the emitter table lives in — what every emitter-reading pass binds.
|
|
285
|
+
* @returns {GPUBuffer}
|
|
286
|
+
*/
|
|
287
|
+
get emitter_database() {
|
|
288
|
+
return this.registry.database.buffer;
|
|
79
289
|
}
|
|
80
290
|
|
|
81
291
|
/**
|
|
82
|
-
*
|
|
83
|
-
* @
|
|
84
|
-
* @returns {number} emitter index
|
|
292
|
+
* The live emitters, in no particular order.
|
|
293
|
+
* @returns {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
|
|
85
294
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
this.emitters_dirty = true;
|
|
89
|
-
return index;
|
|
295
|
+
get emitters() {
|
|
296
|
+
return this.registry.emitters;
|
|
90
297
|
}
|
|
91
298
|
|
|
92
299
|
/**
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
300
|
+
* Number of simulation-order buckets — one per program id the registry can hand out, which is
|
|
301
|
+
* its peak number of distinct compiled programs rather than its current one.
|
|
302
|
+
*
|
|
303
|
+
* This is the coherence pass's only host-provided number, and it is static topology rather than
|
|
304
|
+
* per-frame state: it changes when an effect the set has never held is registered, not as
|
|
305
|
+
* particles are born and die. Everything the pass measures per frame stays on the GPU. Sizing it
|
|
306
|
+
* from the peak rather than the live count is what keeps it from moving every time an effect is
|
|
307
|
+
* unregistered — the bins of released ids are empty, and an empty bin rounds up to zero
|
|
308
|
+
* workgroups and shifts nothing after it.
|
|
309
|
+
*
|
|
310
|
+
* @returns {number}
|
|
97
311
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
312
|
+
bucketCount() {
|
|
313
|
+
return Math.max(1, this.registry.program_id_capacity);
|
|
100
314
|
}
|
|
101
315
|
|
|
102
316
|
/**
|
|
103
|
-
*
|
|
317
|
+
* Index of the alive list this frame reads from / writes to (ping-pong by frame parity).
|
|
318
|
+
* @returns {number}
|
|
319
|
+
*/
|
|
320
|
+
get alive_write_index() {
|
|
321
|
+
return 1 - (this.frame % 2);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Ask for `count` particles from an emitter, on top of its rate, on the next frame. Goes
|
|
326
|
+
* through the GPU path — the tick pass folds it into the emitter's accumulator, the budget and
|
|
327
|
+
* the culling apply — so it is a request, not a guarantee.
|
|
104
328
|
*
|
|
105
|
-
* @param {
|
|
106
|
-
* @param {
|
|
107
|
-
* @param {(emitterIndex: number) => boolean} [context.is_visible] cull predicate (sleep-culling)
|
|
108
|
-
* @returns {Uint32Array} spawn requests (emitter index per particle to create)
|
|
329
|
+
* @param {import("./runtime/ParticleEmitter.js").ParticleEmitter} emitter a registered emitter
|
|
330
|
+
* @param {number} count
|
|
109
331
|
*/
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
332
|
+
spawn(emitter, count) {
|
|
333
|
+
assert.defined(emitter, "emitter");
|
|
334
|
+
assert.isNonNegativeInteger(count, "count");
|
|
335
|
+
|
|
336
|
+
const context = this.registry.context(emitter);
|
|
337
|
+
|
|
338
|
+
assert.defined(context, "emitter is not in the scene");
|
|
339
|
+
|
|
340
|
+
const ring = this.#spawn_commands;
|
|
341
|
+
const base = this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS;
|
|
342
|
+
|
|
343
|
+
if (base >= ring.length) {
|
|
344
|
+
// the text is the key warn_limited counts on, so it carries no burst size: one message
|
|
345
|
+
// per ring size, not one per number a caller happens to ask for
|
|
346
|
+
warn_limited(`GPUParticleSystem: spawn command ring is full (${ring.length / PARTICLE_SPAWN_COMMAND_WORDS} per frame); dropping this frame's remaining bursts`);
|
|
347
|
+
return;
|
|
120
348
|
}
|
|
121
349
|
|
|
122
|
-
|
|
350
|
+
ring[base] = context.row;
|
|
351
|
+
ring[base + 1] = count;
|
|
352
|
+
this.#spawn_command_emitters[this.#spawn_command_count] = emitter;
|
|
353
|
+
this.#spawn_command_count++;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* The simulation half of the frame: reconcile the emitter set with the scene, push what changed
|
|
358
|
+
* to the GPU, and record every pass that moves particles — through to the indirect draw args.
|
|
359
|
+
* What it leaves as graph handles is what a draw consumes, whichever draw that turns out to be.
|
|
360
|
+
*
|
|
361
|
+
* @param {object} params see {@link execute}
|
|
362
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
363
|
+
* @param {number} params.camera
|
|
364
|
+
* @param {number} params.scene_database
|
|
365
|
+
* @param {number} params.dt
|
|
366
|
+
* @returns {import("./graph_particles.js").ParticleSimulationHandles}
|
|
367
|
+
*/
|
|
368
|
+
#simulate({ graph, camera, scene_database, dt }) {
|
|
369
|
+
this.#sync_membership();
|
|
370
|
+
this.#upload();
|
|
371
|
+
|
|
372
|
+
const frame = this.#frame;
|
|
373
|
+
frame.dt = dt;
|
|
374
|
+
frame.time = this.time;
|
|
375
|
+
frame.index = this.frame;
|
|
376
|
+
frame.max_catchup = this.max_catchup_seconds;
|
|
377
|
+
frame.spawn_command_count = this.#spawn_command_count;
|
|
378
|
+
|
|
379
|
+
const table = this.registry.table;
|
|
380
|
+
const emitters = this.#emitters;
|
|
381
|
+
emitters.capacity = table.element_capacity;
|
|
382
|
+
emitters.group_count = table.dispatch_group_count(PARTICLE_EMITTER_TICK_WORKGROUP_SIZE);
|
|
383
|
+
|
|
384
|
+
const buffers = this.buffers;
|
|
385
|
+
buffers.alive_write = buffers.alive[this.alive_write_index];
|
|
386
|
+
// The table's database owns and grows its own buffer; it is re-read every frame for that
|
|
387
|
+
// reason.
|
|
388
|
+
buffers.emitter_database = this.registry.database.buffer;
|
|
389
|
+
|
|
390
|
+
const simulated = graph_particles_simulate({
|
|
391
|
+
graph,
|
|
392
|
+
camera,
|
|
393
|
+
scene_database,
|
|
394
|
+
gpu: buffers,
|
|
395
|
+
emitters,
|
|
396
|
+
capacity: this.capacity,
|
|
397
|
+
bucket_count: this.bucketCount(),
|
|
398
|
+
// Whose register file the VM runs on is decided here, once, for the whole system: the
|
|
399
|
+
// registry reports what the hungriest registered effect needs and this compares it
|
|
400
|
+
// against what the fast file holds. Re-read every frame because registering an emitter —
|
|
401
|
+
// or unregistering the one hungry effect — can flip it either way.
|
|
402
|
+
wide_registers: this.registry.max_register_count > PARTICLE_VM_FAST_REGISTER_SLOTS,
|
|
403
|
+
frame,
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// Kept for the draw that follows, whichever it is, and for nothing past this frame.
|
|
407
|
+
const current = this.#simulated;
|
|
408
|
+
current.graph = graph;
|
|
409
|
+
current.scene_database = scene_database;
|
|
410
|
+
current.emitter_group_count = emitters.group_count;
|
|
411
|
+
current.handles = simulated;
|
|
412
|
+
|
|
413
|
+
// Consumed: the count was recorded into the graph, the words were uploaded.
|
|
414
|
+
this.#spawn_command_count = 0;
|
|
415
|
+
|
|
123
416
|
this.frame++;
|
|
124
|
-
|
|
417
|
+
this.time += dt;
|
|
418
|
+
|
|
419
|
+
return simulated;
|
|
125
420
|
}
|
|
126
421
|
|
|
127
422
|
/**
|
|
128
|
-
*
|
|
129
|
-
*
|
|
423
|
+
* The system's whole contribution to the frame: the simulation, then whatever `mode` says draws
|
|
424
|
+
* it.
|
|
425
|
+
*
|
|
426
|
+
* {@link ParticleRenderMode.BILLBOARD} adds the depth sort and one billboard draw over `color`
|
|
427
|
+
* with fixed-function blending, for a page with no transparency pipeline of its own.
|
|
428
|
+
* {@link ParticleRenderMode.AVBOIT} adds nothing: the orchestrator draws the particles later in
|
|
429
|
+
* the frame through {@link avboit_occupancy}, {@link avboit_splat} and {@link avboit_draw}, off
|
|
430
|
+
* the handles this just produced, and its accumulators are order-independent — so the sort is
|
|
431
|
+
* skipped and its buffers are never allocated. `color` comes straight back either way, so a
|
|
432
|
+
* caller can assign the result unconditionally and let the mode be the only difference.
|
|
433
|
+
*
|
|
434
|
+
* Call after the scene context has built for the frame (`GPUSceneContext#update`), so every
|
|
435
|
+
* emitter node has its `transforms` row, and after the hierarchy pass has run, so the rows'
|
|
436
|
+
* `global` matrices are this frame's.
|
|
437
|
+
*
|
|
438
|
+
* **Once per frame, not once per view.** This advances the simulation by `dt` and hands out
|
|
439
|
+
* handles into the graph it recorded into; a second view of the same scene records a second
|
|
440
|
+
* graph and would step the simulation twice. The renderer has one view per `render` call today,
|
|
441
|
+
* so this holds by construction; a second view of one scene needs the step and the handles
|
|
442
|
+
* separated — record the passes for the first graph, import the same buffers into the rest.
|
|
443
|
+
*
|
|
444
|
+
* @param {object} params
|
|
445
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
446
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
447
|
+
* @param {number} params.scene_database graph handle of the scene database — the one the
|
|
448
|
+
* hierarchy pass returned, so this reads the matrices it composed
|
|
449
|
+
* @param {number} params.dt seconds since the previous frame
|
|
450
|
+
* @param {ParticleRenderMode} [params.mode] who draws, and so whether there is a sort
|
|
451
|
+
* @param {number} [params.color] graph handle of the colour target to draw over. Required by
|
|
452
|
+
* `BILLBOARD`; returned untouched by `AVBOIT`
|
|
453
|
+
* @param {number} [params.depth] graph handle of the scene depth (tested, never written).
|
|
454
|
+
* Required by `BILLBOARD`
|
|
455
|
+
* @returns {number|undefined} the colour handle after the particle draw, or `color` unchanged
|
|
130
456
|
*/
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
457
|
+
execute({ graph, camera, scene_database, color, depth, dt, mode = ParticleRenderMode.BILLBOARD }) {
|
|
458
|
+
assert.defined(graph, "graph");
|
|
459
|
+
assert.isNumber(dt, "dt");
|
|
460
|
+
assert.enum(mode, ParticleRenderMode, "mode");
|
|
461
|
+
|
|
462
|
+
const billboard = mode === ParticleRenderMode.BILLBOARD;
|
|
463
|
+
|
|
464
|
+
// Checked before the simulation rather than at the draw: the simulation advances `frame` and
|
|
465
|
+
// `time` and writes the pool, and a throw after that leaves a frame half-stepped.
|
|
466
|
+
if (billboard) {
|
|
467
|
+
assert.isNonNegativeInteger(color, "color");
|
|
468
|
+
assert.isNonNegativeInteger(depth, "depth");
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
const simulated = this.#simulate({ graph, camera, scene_database, dt });
|
|
472
|
+
|
|
473
|
+
if (!billboard) {
|
|
474
|
+
// AVBOIT: the side channels draw these handles later in the frame, and the colour target
|
|
475
|
+
// is not this call's to touch.
|
|
476
|
+
return color;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// Allocated here rather than in the constructor: they are two words per particle plus the
|
|
480
|
+
// bins, and only this mode ever reads them. A system the renderer drives never makes them.
|
|
481
|
+
this.#ensure_sort_buffers();
|
|
482
|
+
|
|
483
|
+
// The render order: back-to-front by view depth, so premultiplied transparency composites
|
|
484
|
+
// correctly. Its two per-particle passes take the dispatch the coherence reset wrote from
|
|
485
|
+
// the GPU's own alive count.
|
|
486
|
+
const sorted = graph_particle_sort({
|
|
487
|
+
graph,
|
|
488
|
+
gpu: this.buffers,
|
|
489
|
+
camera,
|
|
490
|
+
emitter_database: simulated.emitter_database,
|
|
491
|
+
pool: simulated.pool,
|
|
492
|
+
alive: simulated.alive,
|
|
493
|
+
counters: simulated.counters,
|
|
494
|
+
dispatch_args: simulated.sim_dispatch_args,
|
|
495
|
+
bucket_count: PARTICLE_SORT_BUCKET_COUNT,
|
|
496
|
+
near: this.sort_depth_range[0],
|
|
497
|
+
far: this.sort_depth_range[1],
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const render = this.#render;
|
|
501
|
+
render.atlas = this.atlas;
|
|
502
|
+
render.atlas_sampler = this.atlas_sampler;
|
|
503
|
+
|
|
504
|
+
// One instanced billboard draw over the sorted list, sized by the draw args this frame's
|
|
505
|
+
// build-indirect wrote.
|
|
506
|
+
return graph_particles_billboard({
|
|
507
|
+
graph,
|
|
508
|
+
camera,
|
|
509
|
+
color,
|
|
510
|
+
depth,
|
|
511
|
+
pool: simulated.pool,
|
|
512
|
+
draw_list: sorted,
|
|
513
|
+
emitter_database: simulated.emitter_database,
|
|
514
|
+
draw_args: simulated.draw_args,
|
|
515
|
+
render,
|
|
516
|
+
});
|
|
137
517
|
}
|
|
138
518
|
|
|
139
519
|
/**
|
|
140
|
-
*
|
|
520
|
+
* What this frame's {@link simulate} left, checked against the graph a side-channel call names:
|
|
521
|
+
* the AVBOIT orchestrator records its passes into the same graph, later in the same frame.
|
|
141
522
|
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
|
|
523
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} graph
|
|
524
|
+
* @returns {{graph: object, scene_database: number, emitter_group_count: number, handles: import("./graph_particles.js").ParticleSimulationHandles}}
|
|
525
|
+
*/
|
|
526
|
+
#simulated_for(graph) {
|
|
527
|
+
const current = this.#simulated;
|
|
528
|
+
|
|
529
|
+
assert.equal(current.graph, graph, "the particles were not simulated into this graph this frame — call execute() before the transparency pipeline records");
|
|
530
|
+
|
|
531
|
+
return current;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* `AVBOITSideChannel#avboit_occupancy`: the emitters' bounds spheres, as depth slices.
|
|
145
536
|
*
|
|
146
|
-
* @
|
|
537
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
538
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
539
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
540
|
+
* @param {ArrayLike<number>} args.cluster_parameters the frame's depth curve
|
|
541
|
+
* @param {number} args.occupancy graph handle of the occupancy bits
|
|
542
|
+
* @returns {number} the occupancy handle after the write
|
|
147
543
|
*/
|
|
148
|
-
|
|
149
|
-
|
|
544
|
+
avboit_occupancy({ graph, camera, cluster_parameters, occupancy }) {
|
|
545
|
+
const current = this.#simulated_for(graph);
|
|
546
|
+
|
|
547
|
+
return graph_particle_avboit_occupancy({
|
|
548
|
+
graph,
|
|
549
|
+
camera,
|
|
550
|
+
cluster_parameters,
|
|
551
|
+
occupancy,
|
|
552
|
+
scene_database: current.scene_database,
|
|
553
|
+
emitter_database: current.handles.emitter_database,
|
|
554
|
+
emitter_group_count: current.emitter_group_count,
|
|
555
|
+
});
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/**
|
|
559
|
+
* `AVBOITSideChannel#avboit_splat`: the live particles' extinction, into the volume.
|
|
560
|
+
*
|
|
561
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
562
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
563
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
564
|
+
* @param {number} args.warp graph handle of the warp LUT
|
|
565
|
+
* @param {number} args.depth_texture graph handle of the scene depth
|
|
566
|
+
* @param {{extinction: number, overflow: number, dummy: number}} args.volume the voxel volume
|
|
567
|
+
* @returns {{extinction: number, overflow: number, dummy: number}} the volume after the write
|
|
568
|
+
*/
|
|
569
|
+
avboit_splat({ graph, camera, warp, depth_texture, volume }) {
|
|
570
|
+
const { handles } = this.#simulated_for(graph);
|
|
571
|
+
|
|
572
|
+
return graph_particle_avboit_splat({
|
|
573
|
+
graph,
|
|
574
|
+
camera,
|
|
575
|
+
warp,
|
|
576
|
+
depth_texture,
|
|
577
|
+
volume,
|
|
578
|
+
atlas: this.atlas,
|
|
579
|
+
atlas_sampler: this.atlas_sampler,
|
|
580
|
+
pool: handles.pool,
|
|
581
|
+
alive: handles.alive,
|
|
582
|
+
emitter_database: handles.emitter_database,
|
|
583
|
+
draw_args: handles.draw_args,
|
|
584
|
+
});
|
|
150
585
|
}
|
|
151
586
|
|
|
152
587
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
588
|
+
* `AVBOITSideChannel#avboit_draw`: the live particles, into the accumulators.
|
|
589
|
+
*
|
|
590
|
+
* @param {object} args see `AVBOITSideChannel`
|
|
591
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
|
|
592
|
+
* @param {import("../view/GPUViewContext.js").GPUViewContext} args.view_ctx
|
|
593
|
+
* @param {number} args.camera graph handle of the camera uniform buffer
|
|
594
|
+
* @param {number} args.depth_texture graph handle of the scene depth
|
|
595
|
+
* @param {number} args.warp graph handle of the warp LUT
|
|
596
|
+
* @param {number} args.integral graph handle of the integral texture
|
|
597
|
+
* @param {number} args.volumetrics_lut graph handle
|
|
598
|
+
* @param {number} args.volumetrics_metadata graph handle
|
|
599
|
+
* @param {{color: number, norm: number, extinction: number, emission: number}} args.accumulators
|
|
600
|
+
* @returns {{color: number, norm: number, extinction: number, emission: number}} after the draw
|
|
155
601
|
*/
|
|
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
|
-
|
|
602
|
+
avboit_draw({ graph, view_ctx, camera, depth_texture, warp, integral, volumetrics_lut, volumetrics_metadata, accumulators }) {
|
|
603
|
+
const { handles } = this.#simulated_for(graph);
|
|
604
|
+
|
|
605
|
+
return graph_particle_avboit_draw({
|
|
606
|
+
graph,
|
|
607
|
+
view_ctx,
|
|
608
|
+
camera,
|
|
609
|
+
depth_texture,
|
|
610
|
+
warp,
|
|
611
|
+
integral,
|
|
612
|
+
volumetrics_lut,
|
|
613
|
+
volumetrics_metadata,
|
|
614
|
+
accumulators,
|
|
615
|
+
atlas: this.atlas,
|
|
616
|
+
atlas_sampler: this.atlas_sampler,
|
|
617
|
+
pool: handles.pool,
|
|
618
|
+
alive: handles.alive,
|
|
619
|
+
emitter_database: handles.emitter_database,
|
|
620
|
+
draw_args: handles.draw_args,
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Bring the emitter set in line with the scene: emitter nodes that arrived get rows, nodes that
|
|
626
|
+
* left give theirs back. Runs only when the scene's membership version has moved.
|
|
627
|
+
*
|
|
628
|
+
* A node the scene context has not placed yet (no `transforms` row) is left for the next frame,
|
|
629
|
+
* and the version is not recorded, so the sweep runs again until every emitter is bound.
|
|
630
|
+
*/
|
|
631
|
+
#sync_membership() {
|
|
632
|
+
const scene = this.scene_context.scene;
|
|
633
|
+
const batch = scene.instances;
|
|
634
|
+
|
|
635
|
+
if (batch.version === this.#instances_version) {
|
|
636
|
+
return;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
const sweep = ++this.#sweep;
|
|
640
|
+
const nodes = batch.nodes;
|
|
641
|
+
const node_count = nodes.length;
|
|
642
|
+
const mapping = this.scene_context.id_mapping;
|
|
643
|
+
const registry = this.registry;
|
|
644
|
+
const swept = this.#swept;
|
|
645
|
+
|
|
646
|
+
let complete = true;
|
|
647
|
+
|
|
648
|
+
for (let i = 0; i < node_count; i++) {
|
|
649
|
+
const node = nodes[i];
|
|
650
|
+
|
|
651
|
+
if (node.isParticleEmitter !== true) {
|
|
652
|
+
continue;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
const transform_row = mapping.get(node.id);
|
|
656
|
+
|
|
657
|
+
if (transform_row === undefined) {
|
|
658
|
+
complete = false;
|
|
659
|
+
continue;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
if (registry.context(node) === undefined) {
|
|
663
|
+
registry.add(node, transform_row);
|
|
664
|
+
} else {
|
|
665
|
+
registry.set_transform_row(node, transform_row);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
swept.set(node, sweep);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
for (const [emitter, seen] of swept) {
|
|
672
|
+
if (seen !== sweep) {
|
|
673
|
+
registry.remove(emitter);
|
|
674
|
+
swept.delete(emitter);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
if (complete) {
|
|
679
|
+
this.#instances_version = batch.version;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* Push everything the CPU changed to the GPU: dirty emitter rows, the state buffer's growth,
|
|
685
|
+
* rebuilt program buffers, the spawn-command ring, and the coherence scratch's growth. A
|
|
686
|
+
* command context is opened only if something needs one.
|
|
687
|
+
*/
|
|
688
|
+
#upload() {
|
|
689
|
+
const registry = this.registry;
|
|
690
|
+
const device = this.graphics.device;
|
|
691
|
+
|
|
692
|
+
registry.flush();
|
|
693
|
+
|
|
694
|
+
// Both tables stage into the one database: the emitter rows the author changed, and the
|
|
695
|
+
// state rows claimed or released with them.
|
|
696
|
+
const rows_staged = registry.table.element_upload_buffer.position > 0
|
|
697
|
+
|| registry.state_table.element_upload_buffer.position > 0;
|
|
698
|
+
|
|
699
|
+
if (rows_staged) {
|
|
700
|
+
const cmd = ShadeGPUCommandContext.create(this.graphics, "particles/upload");
|
|
701
|
+
|
|
702
|
+
registry.database.update(cmd);
|
|
703
|
+
|
|
704
|
+
cmd.finish();
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
if (registry.programs_dirty) {
|
|
708
|
+
this.buffers.program = replace_data_buffer(device, this.buffers.program, "particles/program", registry.build_program());
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
this.#merge_spawn_commands();
|
|
712
|
+
|
|
713
|
+
if (this.#spawn_command_count > 0) {
|
|
714
|
+
device.queue.writeBuffer(
|
|
715
|
+
this.buffers.spawn_commands, 0,
|
|
716
|
+
this.#spawn_commands.buffer, 0,
|
|
717
|
+
this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS * WORD,
|
|
718
|
+
);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
this.#ensure_sim_buffers(this.bucketCount());
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Fold the ring down to one entry per row, dropping entries whose emitter no longer holds the
|
|
726
|
+
* row it was issued against.
|
|
727
|
+
*
|
|
728
|
+
* The spawn-command pass adds to a state row with a plain read-modify-write, so two entries
|
|
729
|
+
* naming one row would lose one; and a burst issued to an emitter that left the scene this
|
|
730
|
+
* frame must not land on the row's next tenant. Both are settled here, in place, over a few
|
|
731
|
+
* dozen entries at most.
|
|
732
|
+
*/
|
|
733
|
+
#merge_spawn_commands() {
|
|
734
|
+
const count = this.#spawn_command_count;
|
|
735
|
+
|
|
736
|
+
if (count === 0) {
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
const ring = this.#spawn_commands;
|
|
741
|
+
const emitters = this.#spawn_command_emitters;
|
|
742
|
+
|
|
743
|
+
let rows = this.#spawn_by_row;
|
|
744
|
+
const needed = Math.max(1, this.registry.table.element_capacity);
|
|
745
|
+
|
|
746
|
+
if (rows.length < needed) {
|
|
747
|
+
rows = new Uint32Array(needed);
|
|
748
|
+
this.#spawn_by_row = rows;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
for (let i = 0; i < count; i++) {
|
|
752
|
+
const emitter = emitters[i];
|
|
753
|
+
const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
|
|
754
|
+
const context = this.registry.context(emitter);
|
|
755
|
+
|
|
756
|
+
if (context !== undefined && context.row === row) {
|
|
757
|
+
rows[row] += ring[i * PARTICLE_SPAWN_COMMAND_WORDS + 1];
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
emitters[i] = null;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
let merged = 0;
|
|
764
|
+
|
|
765
|
+
for (let i = 0; i < count; i++) {
|
|
766
|
+
const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
|
|
767
|
+
const pending = rows[row];
|
|
768
|
+
|
|
769
|
+
if (pending === 0) {
|
|
770
|
+
continue;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
ring[merged * PARTICLE_SPAWN_COMMAND_WORDS] = row;
|
|
774
|
+
ring[merged * PARTICLE_SPAWN_COMMAND_WORDS + 1] = pending;
|
|
775
|
+
rows[row] = 0;
|
|
776
|
+
merged++;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
this.#spawn_command_count = merged;
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* The simulation-order scratch is sized from the number of distinct programs, which only ever
|
|
784
|
+
* grows (programs are never reclaimed, see {@link EmitterRegistry}). Reallocated when it does;
|
|
785
|
+
* nothing in these buffers outlives a frame, so nothing is copied.
|
|
786
|
+
*
|
|
787
|
+
* @param {number} buckets
|
|
788
|
+
*/
|
|
789
|
+
#ensure_sim_buffers(buckets) {
|
|
790
|
+
if (buckets <= this.#sim_bucket_capacity) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
const device = this.graphics.device;
|
|
795
|
+
const buffers = this.buffers;
|
|
796
|
+
const capacity = this.capacity;
|
|
797
|
+
|
|
798
|
+
for (const name of ["sim_list", "sim_keys", "sim_histogram", "sim_bucket_counts", "sim_cursor"]) {
|
|
799
|
+
buffers[name]?.destroy();
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// Padding rounds each bucket up to a whole workgroup, so it can add at most `workgroup - 1`
|
|
803
|
+
// entries per bucket; one whole workgroup per bucket is the bound.
|
|
804
|
+
buffers.sim_list = device.createBuffer({ label: "particles/sim_list", size: (capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * WORD, usage: STORAGE });
|
|
805
|
+
buffers.sim_keys = device.createBuffer({ label: "particles/sim_keys", size: capacity * WORD, usage: STORAGE });
|
|
806
|
+
// `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
|
|
807
|
+
// rounded up to a multiple of four.
|
|
808
|
+
buffers.sim_histogram = device.createBuffer({ label: "particles/sim_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(buckets)) * WORD, usage: STORAGE });
|
|
809
|
+
buffers.sim_bucket_counts = device.createBuffer({ label: "particles/sim_bucket_counts", size: buckets * WORD, usage: STORAGE });
|
|
810
|
+
buffers.sim_cursor = device.createBuffer({ label: "particles/sim_cursor", size: buckets * WORD, usage: STORAGE });
|
|
811
|
+
|
|
812
|
+
this.#sim_bucket_capacity = buckets;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* The render-order scratch, made on the first frame that actually sorts.
|
|
817
|
+
*
|
|
818
|
+
* Only {@link ParticleRenderMode.BILLBOARD} reads any of it, and the two per-particle lists are
|
|
819
|
+
* a word per particle each — at the renderer's default capacity, half a megabyte that AVBOIT
|
|
820
|
+
* would never touch. Nothing in them outlives a frame, so there is nothing to carry over and the
|
|
821
|
+
* first sorted frame is as correct as any later one.
|
|
822
|
+
*/
|
|
823
|
+
#ensure_sort_buffers() {
|
|
824
|
+
const buffers = this.buffers;
|
|
825
|
+
|
|
826
|
+
if (buffers.sorted !== undefined) {
|
|
827
|
+
return;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
const device = this.graphics.device;
|
|
831
|
+
const capacity = this.capacity;
|
|
832
|
+
|
|
833
|
+
buffers.sorted = device.createBuffer({ label: "particles/sorted", size: capacity * WORD, usage: STORAGE });
|
|
834
|
+
buffers.sort_keys = device.createBuffer({ label: "particles/sort_keys", size: capacity * WORD, usage: STORAGE });
|
|
835
|
+
buffers.sort_histogram = device.createBuffer({ label: "particles/sort_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(PARTICLE_SORT_BUCKET_COUNT)) * WORD, usage: STORAGE });
|
|
836
|
+
buffers.sort_cursor = device.createBuffer({ label: "particles/sort_cursor", size: PARTICLE_SORT_BUCKET_COUNT * WORD, usage: STORAGE });
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* The buffers whose size is fixed by the pool capacity, and the free list's initial contents.
|
|
841
|
+
*/
|
|
842
|
+
#create_buffers() {
|
|
843
|
+
const device = this.graphics.device;
|
|
844
|
+
const capacity = this.capacity;
|
|
845
|
+
const buffers = this.buffers;
|
|
846
|
+
|
|
847
|
+
buffers.pool = device.createBuffer({ label: "particles/pool", size: capacity * PARTICLE_RECORD_WORD_COUNT * WORD, usage: STORAGE });
|
|
848
|
+
buffers.alive = [
|
|
849
|
+
device.createBuffer({ label: "particles/alive_a", size: capacity * WORD, usage: STORAGE }),
|
|
850
|
+
device.createBuffer({ label: "particles/alive_b", size: capacity * WORD, usage: STORAGE }),
|
|
851
|
+
];
|
|
852
|
+
buffers.dead = device.createBuffer({ label: "particles/dead", size: capacity * WORD, usage: STORAGE });
|
|
853
|
+
buffers.counters = device.createBuffer({ label: "particles/counters", size: PARTICLE_COUNTER_COUNT * WORD, usage: STORAGE });
|
|
854
|
+
|
|
855
|
+
// Indirect args, written on-GPU. Zero-initialised (WebGPU spec), so the first frame's
|
|
856
|
+
// indirect dispatch/draw are no-ops until the first build-indirect has run.
|
|
857
|
+
buffers.dispatch_args = device.createBuffer({ label: "particles/dispatch_args", size: 3 * WORD, usage: INDIRECT });
|
|
858
|
+
buffers.draw_args = device.createBuffer({ label: "particles/draw_args", size: 4 * WORD, usage: INDIRECT });
|
|
859
|
+
buffers.sim_dispatch_args = device.createBuffer({ label: "particles/sim_dispatch_args", size: 3 * WORD, usage: INDIRECT });
|
|
860
|
+
|
|
861
|
+
buffers.spawn_commands = device.createBuffer({ label: "particles/spawn_commands", size: this.#spawn_commands.byteLength, usage: STORAGE });
|
|
862
|
+
|
|
863
|
+
// Every slot free, and the counters saying so.
|
|
864
|
+
const dead = new Uint32Array(capacity);
|
|
865
|
+
for (let i = 0; i < capacity; i++) {
|
|
194
866
|
dead[i] = i;
|
|
195
867
|
}
|
|
196
868
|
const counters = new Uint32Array(PARTICLE_COUNTER_COUNT);
|
|
197
|
-
counters[PARTICLE_COUNTER.DEAD] =
|
|
198
|
-
|
|
869
|
+
counters[PARTICLE_COUNTER.DEAD] = capacity;
|
|
870
|
+
|
|
871
|
+
device.queue.writeBuffer(buffers.dead, 0, dead);
|
|
872
|
+
device.queue.writeBuffer(buffers.counters, 0, counters);
|
|
199
873
|
}
|
|
200
874
|
|
|
201
875
|
/**
|
|
202
|
-
*
|
|
203
|
-
* @returns {{read: number, write: number}}
|
|
876
|
+
* A 1x1 white atlas and a linear sampler, so the system draws before anyone hands it art.
|
|
204
877
|
*/
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
878
|
+
#create_default_atlas() {
|
|
879
|
+
const device = this.graphics.device;
|
|
880
|
+
|
|
881
|
+
const texture = device.createTexture({
|
|
882
|
+
label: "particles/default_atlas",
|
|
883
|
+
size: [1, 1],
|
|
884
|
+
format: "rgba8unorm",
|
|
885
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
device.queue.writeTexture({ texture }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
|
|
889
|
+
|
|
890
|
+
// kept, not just viewed: a texture nothing holds is a texture nothing can free
|
|
891
|
+
this.#default_atlas = texture;
|
|
892
|
+
this.atlas = texture.createView();
|
|
893
|
+
this.atlas_sampler = device.createSampler({
|
|
894
|
+
label: "particles/atlas_sampler",
|
|
895
|
+
magFilter: "linear",
|
|
896
|
+
minFilter: "linear",
|
|
897
|
+
addressModeU: "clamp-to-edge",
|
|
898
|
+
addressModeV: "clamp-to-edge",
|
|
899
|
+
});
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/**
|
|
903
|
+
* @param {string} color_format
|
|
904
|
+
* @param {string} depth_format
|
|
905
|
+
* @returns {object} the billboard pipeline descriptor for these attachment formats
|
|
906
|
+
*/
|
|
907
|
+
#obtain_pipeline(color_format, depth_format) {
|
|
908
|
+
const key = `${color_format}/${depth_format}`;
|
|
909
|
+
|
|
910
|
+
if (this.#pipeline === null || this.#pipeline_key !== key) {
|
|
911
|
+
this.#pipeline = create_particle_billboard_pipeline({
|
|
912
|
+
color_format,
|
|
913
|
+
depth_format,
|
|
914
|
+
// reverse-Z, the engine convention
|
|
915
|
+
depth_compare: "greater",
|
|
916
|
+
});
|
|
917
|
+
this.#pipeline_key = key;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
return this.#pipeline;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* Sizes of the persistent buffers, in bytes, as they stand. Exposed for tests.
|
|
925
|
+
* @returns {Object<string, number>}
|
|
926
|
+
*/
|
|
927
|
+
bufferSizes() {
|
|
928
|
+
const sizes = {};
|
|
929
|
+
|
|
930
|
+
for (const [name, buffer] of Object.entries(this.buffers)) {
|
|
931
|
+
if (Array.isArray(buffer)) {
|
|
932
|
+
sizes[name] = buffer[0].size;
|
|
933
|
+
} else if (buffer !== undefined && buffer !== null) {
|
|
934
|
+
sizes[name] = buffer.size;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
return sizes;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
destroy() {
|
|
942
|
+
/*
|
|
943
|
+
The emitters go first, and they matter more than the buffers: they are the scene's nodes,
|
|
944
|
+
they outlive this system, and each is holding a row of the table about to be freed. A node
|
|
945
|
+
left holding one is stranded — the next system's membership sweep reads `row !== -1` as
|
|
946
|
+
"already mine", takes the moved branch rather than the arrived one, and never registers it.
|
|
947
|
+
Retiring them here puts every emitter back where it was before this system saw it.
|
|
948
|
+
*/
|
|
949
|
+
for (const emitter of this.registry.emitters.slice()) {
|
|
950
|
+
this.registry.remove(emitter);
|
|
951
|
+
}
|
|
952
|
+
this.#swept.clear();
|
|
953
|
+
this.#instances_version = -1;
|
|
954
|
+
|
|
955
|
+
for (const buffer of Object.values(this.buffers)) {
|
|
956
|
+
if (Array.isArray(buffer)) {
|
|
957
|
+
buffer.forEach((b) => b.destroy());
|
|
958
|
+
} else if (buffer !== undefined && buffer !== null) {
|
|
959
|
+
buffer.destroy();
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
this.buffers = {};
|
|
964
|
+
this.registry.database.destroy();
|
|
965
|
+
|
|
966
|
+
// the default atlas is this system's own; a page that replaced it owns what it put there
|
|
967
|
+
this.#default_atlas?.destroy();
|
|
968
|
+
this.#default_atlas = null;
|
|
208
969
|
}
|
|
209
970
|
}
|
|
210
971
|
|
|
211
972
|
/**
|
|
212
|
-
*
|
|
213
|
-
*
|
|
973
|
+
* A storage buffer holding `data`, replacing `previous` (destroyed) if it exists. The program
|
|
974
|
+
* buffer is monolithic — a program is variable-length, so there is no table to page it into — and
|
|
975
|
+
* is rebuilt whole on the rare frame the program heap changes.
|
|
976
|
+
*
|
|
977
|
+
* @param {GPUDevice} device
|
|
978
|
+
* @param {GPUBuffer|undefined} previous
|
|
979
|
+
* @param {string} label
|
|
980
|
+
* @param {Uint32Array} data
|
|
981
|
+
* @returns {GPUBuffer}
|
|
214
982
|
*/
|
|
215
|
-
function
|
|
216
|
-
|
|
983
|
+
function replace_data_buffer(device, previous, label, data) {
|
|
984
|
+
previous?.destroy();
|
|
985
|
+
|
|
986
|
+
const buffer = device.createBuffer({ label, size: Math.max(WORD, data.byteLength), usage: STORAGE });
|
|
987
|
+
|
|
988
|
+
device.queue.writeBuffer(buffer, 0, data);
|
|
989
|
+
|
|
990
|
+
return buffer;
|
|
217
991
|
}
|