@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
|
@@ -3,71 +3,135 @@
|
|
|
3
3
|
A specialized, deeply-integrated, GPU-driven particle engine for the v2 renderer.
|
|
4
4
|
Destiny-style: **one** simulation dispatch runs **all** particles of **all** emitters by
|
|
5
5
|
interpreting a compact per-emitter bytecode program (a shader VM). Effects are authored as
|
|
6
|
-
node graphs and lowered to that bytecode by a testable JS compiler.
|
|
6
|
+
node graphs and lowered to that bytecode by a testable JS compiler. Emitters are scene nodes, and
|
|
7
|
+
the decision to spawn is the GPU's.
|
|
7
8
|
|
|
8
9
|
## Goals (from the brief)
|
|
9
10
|
|
|
10
11
|
- Single simulation execution shader (data-driven VM, not one-pipeline-per-effect).
|
|
11
12
|
- Projection modes: camera-facing billboard (+ velocity-stretched, axis-locked, world-oriented).
|
|
12
|
-
- Depth sorting for correct transparency, built on the `csdldf` prefix scan
|
|
13
|
+
- Depth sorting for correct transparency, built on the `csdldf` prefix scan.
|
|
13
14
|
- Node-based composition → shader VM (compile graph → bytecode).
|
|
14
|
-
- Frustum
|
|
15
|
+
- Frustum culling of spawning (optional, flagged, sleep-when-culled + bounded catch-up).
|
|
15
16
|
- Flipbooks (atlas sub-rect + frame grid).
|
|
16
17
|
- Texture lookup via atlas (region table; mirrors meep `AtlasPatch` uv offset/scale).
|
|
17
18
|
- Soft-depth fade (flagged).
|
|
18
19
|
- `GPUDatabase` for CPU-managed, low-churn tables (emitters).
|
|
19
|
-
- Scene-node / bone attachment
|
|
20
|
+
- Scene-node / bone attachment: an emitter **is** a `Node3D`; its world matrix is its row of the
|
|
21
|
+
scene's `transforms` table, composed by the GPU hierarchy pass.
|
|
20
22
|
- Distinct per-particle lifecycle: **no** built-in age/position — the schema + program define state.
|
|
21
23
|
- Billboard renderer reuses engine shader chunks incl. lighting (forward-shaded, optional per emitter).
|
|
22
24
|
- Blend modes (alpha + additive) via a **single** premultiplied blend setup.
|
|
23
25
|
- `AnimationCurve` sampling during simulation (reuse `chunk_animation_curve_evaluate`).
|
|
26
|
+
- Spawning decided on the GPU, per emitter, with the CPU able to ask for bursts through the same path.
|
|
27
|
+
- No per-frame allocation on the CPU beyond the frame graph's own records.
|
|
24
28
|
|
|
25
29
|
## Layered architecture
|
|
26
30
|
|
|
27
31
|
```
|
|
28
|
-
authoring: NodeGraph (nodes+ports) ──compile──▶ Program (bytecode)
|
|
32
|
+
authoring: NodeGraph (nodes+ports) ──compile──▶ Program (bytecode: INIT + UPDATE)
|
|
29
33
|
standard node library │
|
|
30
34
|
▼
|
|
31
|
-
runtime CPU:
|
|
32
|
-
|
|
35
|
+
runtime CPU: ParticleEmitter (a Node3D) ── Scene ──▶ GPUSceneContext (transforms table)
|
|
36
|
+
EmitterRegistry ── GPUDatabase(emitters + emitter_state) ─┤ ProgramHeap ([header][constants][code])
|
|
37
|
+
GPUParticleSystem (owns every buffer, records the frame)
|
|
33
38
|
▼
|
|
34
39
|
runtime GPU: particle pool (array<u32>, uniform stride) + alive/dead lists + counters
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
├─
|
|
40
|
+
emitter state table (GPU-owned: generation, accumulator, age, sleep, pending)
|
|
41
|
+
┌─ spawn commands (CPU bursts → pending)
|
|
42
|
+
├─ emitter tick (per row: cull, integrate rate, take from budget → count)
|
|
43
|
+
├─ scan (csdldf) → emit dispatch
|
|
44
|
+
├─ emit (VM INIT program) ── per newborn: find emitter in scan, pop dead → init → append alive_new
|
|
45
|
+
├─ simulate (VM UPDATE program) ── update → (kill|orphan→dead | keep→alive_new)
|
|
38
46
|
├─ bucket (histogram → csdldf scan → scatter) ── alive → program-coherent sim list
|
|
39
|
-
├─
|
|
40
|
-
├─ sort (
|
|
47
|
+
├─ build indirect (dispatch + draw args)
|
|
48
|
+
├─ sort (histogram → csdldf scan → scatter) [render order]
|
|
41
49
|
└─ render (instanced billboard quads, forward + optional lighting + soft depth)
|
|
42
50
|
```
|
|
43
51
|
|
|
44
52
|
### Particle storage — single shared pool, uniform stride
|
|
45
53
|
|
|
46
54
|
All particles live in one `array<u32>` pool with a fixed `RECORD_WORDS` stride (config, default 32
|
|
47
|
-
words = 128 B). Word 0 is a reserved header holding the owning **emitter
|
|
48
|
-
occupy words `1..RECORD_WORDS`. A single
|
|
49
|
-
and **one** simulate dispatch cover every
|
|
55
|
+
words = 128 B). Word 0 is a reserved header holding the owning **emitter row** and that row's
|
|
56
|
+
**generation** (`data/particle_header.js`); user attributes occupy words `1..RECORD_WORDS`. A single
|
|
57
|
+
pool + single alive/dead lists means **one** emit dispatch and **one** simulate dispatch cover every
|
|
58
|
+
emitter — the Destiny single-shader property.
|
|
50
59
|
|
|
51
60
|
Lifecycle uses the canonical GPU dead-list / alive-list ping-pong:
|
|
52
61
|
- `dead_list`: stack of free slot indices (+ atomic count).
|
|
53
62
|
- `alive_list[2]`: ping-pong compact lists of live slot indices (+ counts).
|
|
54
|
-
- `counters`: atomics {alive_count, dead_count, spawn
|
|
63
|
+
- `counters`: atomics {alive_count, dead_count, spawn budget, …} + derived indirect dispatch/draw args.
|
|
55
64
|
|
|
56
|
-
Emit: pop dead → run
|
|
65
|
+
Emit: pop dead → run INIT → append `alive_new`. Simulate: read the **coherence list** last frame's
|
|
57
66
|
bucketing pass built from `alive_current` → run UPDATE → kill pushes to `dead`, survival appends to
|
|
58
|
-
`alive_new
|
|
67
|
+
`alive_new`. Swap lists each frame.
|
|
59
68
|
|
|
60
69
|
**The loop is strictly GPU-driven.** The build-indirect pass snapshots the padded length of the
|
|
61
70
|
coherence list into `counters[ALIVE_IN]` and writes the indirect dispatch args next frame's simulate
|
|
62
71
|
consumes (`dispatchWorkgroupsIndirect`) plus the indirect draw args this frame's render consumes
|
|
63
72
|
(`drawIndirect`, sized by the *unpadded* alive count); simulate bound-checks against the ALIVE_IN
|
|
64
|
-
snapshot.
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
73
|
+
snapshot. The sort's per-particle passes take the dispatch the bucket reset writes from the alive
|
|
74
|
+
count. Sizing any of this from a CPU readback is a correctness bug, not a shortcut: the readback is
|
|
75
|
+
inevitably stale, so a growing population orphans the tail of the alive list (slots leak into limbo)
|
|
76
|
+
and a shrinking one re-simulates stale entries — double-freeing slots so two live particles later
|
|
77
|
+
share one record. The emit pass's dead-list pop guards against wrapped counters
|
|
78
|
+
(`old == 0 || old > capacity`), so racing an exhausted pool drops spawns cleanly instead of handing
|
|
79
|
+
out garbage slots.
|
|
80
|
+
|
|
81
|
+
### Spawning is the GPU's decision
|
|
82
|
+
|
|
83
|
+
The CPU never walks the emitters per frame and never counts particles. Per frame:
|
|
84
|
+
|
|
85
|
+
1. **spawn commands** (`shaders/shader_particle_spawn_commands.js`, only when the host queued any):
|
|
86
|
+
one thread per `[row, count]` pair the host authored, `atomicAdd` into that row's `PENDING` in
|
|
87
|
+
the GPU-owned emitter state. This is `GPUParticleSystem#spawn` — the CPU's facade over the GPU
|
|
88
|
+
path, not a second path: a burst goes through the same budget, expansion and INIT program as the
|
|
89
|
+
emitter's rate. It is also the channel a VM opcode would use to spawn from the GPU (a sub-emitter
|
|
90
|
+
or trail would `atomicAdd` its target's `PENDING`).
|
|
91
|
+
2. **emitter tick** (`shaders/shader_particle_emitter_tick.js`): one thread per emitter table row,
|
|
92
|
+
walked with the table's page iterator so an unallocated page costs one word and a freed row one
|
|
93
|
+
bit. Per live row: recognise the row by generation (a mismatch starts the state over — new
|
|
94
|
+
emitter, or a reused row, with nothing for the CPU to clear); take `PENDING`; if the emitter opts
|
|
95
|
+
into culling, test its bounds sphere in world space (through its node's `global`) against the
|
|
96
|
+
camera frustum and sleep while culled, paying back a bounded catch-up on wake; integrate
|
|
97
|
+
`spawn_rate * dt`; turn the whole part of the accumulator into this frame's count, clamped by the
|
|
98
|
+
**spawn budget** the reset pass seeded from the dead count — so an emitter is only ever debited
|
|
99
|
+
for particles the pool can hold; write the count to `spawn_counts.elements[row]`.
|
|
100
|
+
3. **scan**: `graph_prefix_scan_csdldf` over the counts — each row's batch ends at its inclusive sum,
|
|
101
|
+
and the last sum is the number of particles born.
|
|
102
|
+
4. **spawn args**: `shader_prefix_sum_to_command` (the rasteriser's own) turns that total into the
|
|
103
|
+
emit dispatch.
|
|
104
|
+
5. **emit**: one thread per newborn, locating its emitter by `lower_bound_branchless` over the sums
|
|
105
|
+
and its batch fraction from the sum before — the meshes-to-meshlets expansion applied to
|
|
106
|
+
particles. No per-emitter cap, no thread loops over its particles.
|
|
107
|
+
|
|
108
|
+
The host contributes two numbers to all of that: the emitter table's element capacity (the scan's
|
|
109
|
+
length — static topology) and the length of the command list it wrote itself.
|
|
110
|
+
|
|
111
|
+
### The emitter state (`data/PARTICLE_EMITTER_STATE.js`)
|
|
112
|
+
|
|
113
|
+
What the GPU integrates per emitter — generation, accumulator, age, sleep, pending — is the
|
|
114
|
+
`emitter_state` table of the same database, one row per emitter at the emitter's row, **not**
|
|
115
|
+
fields of the emitter record. The record is CPU-shadowed and restaged whole whenever the author
|
|
116
|
+
changes a field, and that restage would overwrite an accumulator the GPU has been adding to for a
|
|
117
|
+
hundred frames. The scene's transforms table mixes CPU fields with a GPU-written `global` only
|
|
118
|
+
because `global` is recomputed from scratch every frame; nothing here is. In its own table the CPU
|
|
119
|
+
touches a row exactly twice — a zero record when the emitter's row is claimed, the table's own
|
|
120
|
+
zero-fill when it is released — and the database's resize copies pages on the GPU, so growth keeps
|
|
121
|
+
what the tick has written. Nothing in it is atomic: each row is one tick thread's, and the
|
|
122
|
+
spawn-command pass is handed one command per row (the system merges bursts on the CPU). The
|
|
123
|
+
emitter's `age` here is the VM's `EMITTER_AGE` builtin.
|
|
124
|
+
|
|
125
|
+
### Eight storage buffers
|
|
126
|
+
|
|
127
|
+
A compute stage gets eight storage buffers by default, and the design does not ask for more. Two
|
|
128
|
+
things keep every pass under it: the emitter record and the GPU-owned state are two tables of one
|
|
129
|
+
database buffer, read through one binding; and the VM's constants and code are one packed buffer —
|
|
130
|
+
`[header][constants][code]`, the header's first word saying where the code starts
|
|
131
|
+
(`ParticleConstants.PARTICLE_PROGRAM_HEADER_WORDS`). Emit and simulate bind exactly eight; their
|
|
132
|
+
wide-register variants bind nine, which is the one place the system spends past the default and is
|
|
133
|
+
still inside the ten the engine demands of an adapter. `particle_shaders_wgsl_validity.spec` pins
|
|
134
|
+
the count for every pass.
|
|
71
135
|
|
|
72
136
|
### The VM (`ParticleVM`)
|
|
73
137
|
|
|
@@ -75,16 +139,58 @@ Register machine, emulator-safe (bounded instruction loop + big `switch`, no sub
|
|
|
75
139
|
recursion, no data-dependent jumps — conditionals are predicated via CMP/SELECT, destruction via
|
|
76
140
|
`KILL`).
|
|
77
141
|
|
|
78
|
-
- Register file: `array<
|
|
79
|
-
|
|
80
|
-
|
|
142
|
+
- Register file: `array<f32>`, a register being one slot and a value of width *w* occupying *w*
|
|
143
|
+
consecutive ones. The interpreter reaches it through `vm_reg_read` / `vm_reg_write`, which a
|
|
144
|
+
**backing chunk** supplies, and the two backings are the two interpreters:
|
|
145
|
+
`vm/chunk_particle_vm_registers_fast.js` puts the file in `var<private>`
|
|
146
|
+
(`PARTICLE_VM_FAST_REGISTER_SLOTS`, dynamically indexed, so its size is the shader's register
|
|
147
|
+
footprint), and `vm/chunk_particle_vm_registers_wide.js` puts it in a storage buffer
|
|
148
|
+
(`PARTICLE_VM_REGISTER_SLOTS` — every slot an 8-bit operand base can name). See **Two
|
|
149
|
+
interpreters** below.
|
|
150
|
+
- Instruction: fixed **4×u32** words `[op | width << 8 | kinds << 16 | dst << 24, s0, s1, s2]`.
|
|
151
|
+
Word 0 packs the opcode (bits 0..7), the lane count (8..10), each source's `VM_KIND` (two bits per
|
|
152
|
+
slot at 16..21) and the destination slot (24..31). A source word means what its kind says: `REG`
|
|
153
|
+
is a base slot plus a swizzle, `IMM` is an `f32` bit pattern read in every lane, and `NONE` is a
|
|
154
|
+
raw field the opcode reads for itself (attribute word-offset+comp / curve handle / builtin id /
|
|
155
|
+
pool index).
|
|
81
156
|
- Constant pool: `array<vec4f>` per program, referenced by `LOAD_CONST`.
|
|
82
|
-
- Two entry sections per program: **
|
|
83
|
-
-
|
|
84
|
-
|
|
157
|
+
- Two entry sections per program: **INIT** and **UPDATE** (offsets in the emitter record). INIT
|
|
158
|
+
gives an already-allocated record its state; it has no say in whether the particle exists.
|
|
159
|
+
- Builtins (`LOAD_BUILTIN`): DT, EMITTER_AGE, EMITTER_POSITION, EMITTER_DIRECTION, EMITTER_UP,
|
|
160
|
+
PARTICLE_INDEX, SPAWN_FRACTION, TIME … assembled per-invocation by the host shader. The emitter's
|
|
161
|
+
position and axes are its node's `global` out of the scene database.
|
|
85
162
|
- `CURVE dst, handle, s0`: `dst.x = animation_curve_evaluate(curves[handle], s0.x)` — reuses the
|
|
86
163
|
engine's GPU AnimationCurve chunk + database.
|
|
87
164
|
|
|
165
|
+
#### Two interpreters
|
|
166
|
+
|
|
167
|
+
The register file normally lives in shader registers, which is what makes it fast and what makes it
|
|
168
|
+
small. An effect whose compiled program wants more slots than it holds is not an error and not an
|
|
169
|
+
authoring ceiling: the whole system swaps emit and simulate for variants whose file is a storage
|
|
170
|
+
buffer, and everything runs, slowly.
|
|
171
|
+
|
|
172
|
+
- **The trigger is the set, not the program.** `ProgramHeap` reports `max_register_count` over the
|
|
173
|
+
programs it holds, and `GPUParticleSystem` is where that number is compared against
|
|
174
|
+
`PARTICLE_VM_FAST_REGISTER_SLOTS` — the store has no opinion about what a register budget means,
|
|
175
|
+
and which backing a pass is compiled against is the VM's business. One hungry effect moves every
|
|
176
|
+
emitter onto the wide pair; there is one pipeline per pass and it is chosen once, per frame, in
|
|
177
|
+
`graph_particles`. It moves back when that effect is unregistered: the heap knows what it holds,
|
|
178
|
+
so the number is a maximum over the live set rather than a high-water mark.
|
|
179
|
+
- **The launch is bounded.** The wide passes need a register file per invocation in flight, so they
|
|
180
|
+
do not run one lane per particle — that would size the buffer by pool capacity. They launch
|
|
181
|
+
`PARTICLE_VM_WIDE_LAUNCH_LANES` lanes whatever the workload and walk their input with a grid-stride
|
|
182
|
+
loop, so the file is `LANES * SLOTS * 4` bytes and nothing else. The stride is a whole number of
|
|
183
|
+
workgroups, which is what keeps a wave inside one coherence bucket and the wave-uniform section
|
|
184
|
+
decode sound.
|
|
185
|
+
- **Slot-major, and never cleared.** `vm_registers[slot * LANES + lane]`, so a wave reading one slot
|
|
186
|
+
reads a coalesced run. The buffer is transient and no pass zeroes it: a register is undefined until
|
|
187
|
+
written, and a program that reads one first is corrupt. That is the one place the two backings are
|
|
188
|
+
not interchangeable — the fast file zeroes, so the reference executor and the fast VM agree on a
|
|
189
|
+
value the wide VM has no opinion about.
|
|
190
|
+
- **Held to the same bar.** `vm/chunk_particle_vm.spec.js` runs every parity case, fuzz included,
|
|
191
|
+
against BOTH backings; `shaders/particle_wide_register_passes.spec.js` runs the wide passes against
|
|
192
|
+
the fast ones under the emulator and exercises the grid-stride loop.
|
|
193
|
+
|
|
88
194
|
**Parity strategy.** The opcode numbers + operand semantics live in one source of truth
|
|
89
195
|
(`isa/ParticleVMISA.js`). Two executors implement it: a JS reference VM (`vm/ParticleVMReference.js`)
|
|
90
196
|
and a hand-written WGSL interpreter (`vm/chunk_particle_vm.js`). A spec runs identical programs
|
|
@@ -93,32 +199,110 @@ executors cover every opcode in the ISA table.
|
|
|
93
199
|
|
|
94
200
|
### Node graph → bytecode
|
|
95
201
|
|
|
96
|
-
A core `NodeGraph` holds particle nodes (ports + parameters) for
|
|
202
|
+
A core `NodeGraph` holds particle nodes (ports + parameters) for INIT and UPDATE. `compile()`:
|
|
97
203
|
1. topologically orders reachable nodes,
|
|
98
204
|
2. lowers each node to VM ops (nodes emit via a small builder that allocates result registers),
|
|
99
205
|
3. linear-scan register allocation with liveness,
|
|
100
206
|
4. interns constants into the pool,
|
|
101
207
|
5. resolves curve/attribute references,
|
|
102
|
-
6. emits `Program {
|
|
208
|
+
6. emits `Program { init, update, constants, reg_count, attributes, curves }`.
|
|
103
209
|
|
|
104
210
|
Standard node library: constants, attribute get/set, arithmetic/vector/math, random (uniform/sphere/
|
|
105
211
|
disk/cone), curve-sample, noise (curl), integrate, gravity, emit-shapes, compare/select, kill-if.
|
|
106
212
|
|
|
213
|
+
### Emitters are scene nodes
|
|
214
|
+
|
|
215
|
+
`ParticleEmitter extends Node3D`. Add one to a `Scene` — on its own or under a joint — and the
|
|
216
|
+
scene context's membership sweep gives it a `transforms` row like any node; the GPU hierarchy pass
|
|
217
|
+
composes its `global` from its own transform and its parents' every frame, animation included.
|
|
218
|
+
`GPUParticleSystem` sweeps the scene's node list when the scene's membership version moves, gives
|
|
219
|
+
each emitter node a row in the emitter table pointed at its `transforms` row, and retires the row
|
|
220
|
+
when the node leaves. Attaching an emitter to a bone is `joint.addChild(emitter)`; there is no
|
|
221
|
+
per-frame transform copy, and an emitter under a GPU-animated joint follows it — which the old
|
|
222
|
+
CPU-side copy of `transform_global` could not do, since the CPU never updates that matrix for a
|
|
223
|
+
node the GPU owns.
|
|
224
|
+
|
|
225
|
+
**The node knows nothing about the GPU.** A `ParticleEmitter` is a transform, an attribute
|
|
226
|
+
`layout`, a compiled `program`, a `texture` URL, and the emission parameters — all of it the
|
|
227
|
+
author's, all of it meaning the same thing with no device present, all of it what a saved effect is
|
|
228
|
+
made of. Everything the system assigns is a `GPUParticleEmitterContext`, held by the
|
|
229
|
+
`EmitterRegistry` against the emitter and reached through `registry.context(emitter)`: the table
|
|
230
|
+
row, the generation, the program placement, the node's `transforms` row, the atlas patch. So an
|
|
231
|
+
emitter cannot be saved with a row in it, cannot be given one by hand, and "is this emitter live?"
|
|
232
|
+
is asked of the registry rather than read off a `-1` that anything could have written. The record
|
|
233
|
+
writer is where the two meet — `write_emitter_record(record, emitter, context)`, next to the struct
|
|
234
|
+
it fills.
|
|
235
|
+
|
|
236
|
+
Restaging is driven by `Node3D#version`, the node's own change counter, which the renderer already
|
|
237
|
+
reads to decide whether a transform needs re-uploading; the context remembers the version its row
|
|
238
|
+
was staged from. An author who edits an emitter says so the way they say it for any node —
|
|
239
|
+
`needsUpdate = true` — and there is no second flag to forget. A change to the context itself (a
|
|
240
|
+
`transforms` row, a repacked atlas patch) moves no version, so the context marks itself instead.
|
|
241
|
+
|
|
107
242
|
### Emitter table (`GPUDatabase`)
|
|
108
243
|
|
|
109
|
-
One `emitters` table (CPU-managed, low churn). Row = `
|
|
110
|
-
constant-pool offset, spawn rate
|
|
111
|
-
(lighting/soft/sort/cull/blend/projection), render binding (attr offsets for
|
|
112
|
-
rotation/frame), atlas region + flipbook grid,
|
|
113
|
-
|
|
244
|
+
One `emitters` table (CPU-managed, low churn). Row = `PARTICLE_EMITTER_STRUCT`: program
|
|
245
|
+
offsets+lengths, constant-pool offset, seed, spawn rate, **node** (transforms row), **generation**,
|
|
246
|
+
bounds sphere, flags (lighting/soft/sort/cull/blend/projection), render binding (attr offsets for
|
|
247
|
+
position/size/color/rotation/frame/velocity), atlas region + flipbook grid, and the program id
|
|
248
|
+
the coherence pass buckets on. The atlas region is resolved, not authored: the emitter names an
|
|
249
|
+
image and the system packs it, the way `ShaderManager` packs the old engine's sprites, so a repack
|
|
250
|
+
moves every patch without any emitter changing. The seed is resolved too — an emitter left at 0 gets
|
|
251
|
+
its registration's generation, which no other emitter of the registry shares, rather than being
|
|
252
|
+
written to. Programs+constants live in a packed `ProgramHeap` buffer
|
|
253
|
+
(variable length → not a fixed-stride table).
|
|
254
|
+
|
|
255
|
+
The struct is the ONLY statement of that layout. The JS writer is the database's
|
|
256
|
+
`write_wgsl_type_value`, and the WGSL reader — the `ParticleEmitter` struct declaration plus
|
|
257
|
+
`database_read_..._element` — is generated from the same struct by the table descriptor. There is no
|
|
258
|
+
hand-packed word offset table to drift out of step with the shaders, and no hand-written reader.
|
|
259
|
+
The bucket histogram, which runs once per live particle and wants only `program_id`, reads it
|
|
260
|
+
through `chunk_read_field` rather than decoding a whole row.
|
|
261
|
+
|
|
262
|
+
**Editing the set at runtime is the point of using a table.** `EmitterRegistry.add` stages one
|
|
263
|
+
record and `remove` frees one row; neither touches the others. Rows are stable for an emitter's
|
|
264
|
+
lifetime because a live particle's record header holds the row of the emitter that spawned it —
|
|
265
|
+
renumbering a survivor would re-point its particles at somebody else. A removed row is handed back
|
|
266
|
+
to the next `add`, so the id space does not grow without bound.
|
|
267
|
+
|
|
268
|
+
**Generations make that reuse safe.** Every add takes the next value of one running counter, never
|
|
269
|
+
zero, and the particles of an emitter carry its generation in their header. The simulate pass kills
|
|
270
|
+
any particle whose generation is not its row's current one — the row is zero-filled (generation 0)
|
|
271
|
+
or a later tenant's — so a hard removal frees the emitter's particles within a frame, and a reused
|
|
272
|
+
row cannot adopt a stranger's. Graceful retirement (rate to zero, remove once the tail has died)
|
|
273
|
+
remains an author's choice rather than a correctness rule.
|
|
274
|
+
|
|
275
|
+
**Programs are edited the same way.** `ProgramHeap` is a pair of range allocators
|
|
276
|
+
(`OffsetAllocator`) over the two sections of the packed buffer, keyed by a `HashMap` on the bytecode
|
|
277
|
+
itself — `ParticleProgram` answers `equals`/`hash`, so content deduplication is the map's doing
|
|
278
|
+
rather than a stringified key's. `acquire` takes a reference and `release` gives one back, so the
|
|
279
|
+
last emitter of an effect is what unpacks it, and `EmitterRegistry.set_program` swaps an emitter onto
|
|
280
|
+
different bytecode while it is live. What makes that possible is that a program is **relocatable**:
|
|
281
|
+
instructions carry no absolute addresses and constant references are program-local, so the heap can
|
|
282
|
+
move one by copying its words and rewriting the placement.
|
|
283
|
+
|
|
284
|
+
Two things are deliberately NOT reclaimed. **Program ids** are reused rather than renumbered — they
|
|
285
|
+
are baked into every emitter record, so compacting them would mean rewriting the whole table — and
|
|
286
|
+
`bucketCount()` is sized from the id capacity, the set's peak, so it does not move every time an
|
|
287
|
+
effect comes or goes. An id below the peak with nothing in it is an empty bin, which rounds up to
|
|
288
|
+
zero workgroups and shifts nothing after it. **Section capacity** only rises: a repack (which happens
|
|
289
|
+
when a section has no contiguous run long enough) compacts what is live and grows only if it must,
|
|
290
|
+
so a set that peaked at a hundred effects does not pay for a resize every time it returns to three.
|
|
291
|
+
|
|
292
|
+
A repack is the one change no emitter announces, since it is not an edit to any of them.
|
|
293
|
+
`EmitterRegistry.flush` asks the heap once per frame — `placement_version` — and restages every row
|
|
294
|
+
when it has moved.
|
|
295
|
+
|
|
296
|
+
Every row of a frame is staged through one module-static record (`EmitterRegistry`), so a flush
|
|
297
|
+
allocates nothing however many rows it restages.
|
|
114
298
|
|
|
115
299
|
### Culling & attach
|
|
116
300
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
their
|
|
301
|
+
An emitter that sets `EMITTER_FLAG.CULL` has its bounds sphere — centre through its node's matrix,
|
|
302
|
+
radius scaled by the matrix's largest axis scale — tested against the camera frustum by the tick
|
|
303
|
+
pass, with the renderer's shared `chunk_sphere_intersects_frustum`. Culled emitters spawn nothing
|
|
304
|
+
and accrue sleep; on wake the tick adds a catch-up of at most `max_catchup_seconds` of rate. Live
|
|
305
|
+
particles keep simulating while their emitter is culled. HiZ occlusion is not written.
|
|
122
306
|
|
|
123
307
|
### Two orderings, and why they are separate
|
|
124
308
|
|
|
@@ -134,8 +318,15 @@ diverges, so a wave serially executes the union of the opcodes its lanes want; a
|
|
|
134
318
|
`v_movrels`/`v_movreld` behind a waterfall loop whose trip count is the number of *distinct*
|
|
135
319
|
register indices live in the wave. Grouping the wave by program collapses both at once.
|
|
136
320
|
|
|
137
|
-
The
|
|
138
|
-
|
|
321
|
+
The grouping is also **load-bearing**: the simulate shader reads its section parameters (code offset,
|
|
322
|
+
instruction count, constant offset) from the wave's first lane through `subgroupBroadcastFirst`
|
|
323
|
+
(`particle_wave_uniform`), which is what lets the driver fetch instruction words through the scalar
|
|
324
|
+
unit, branch the opcode switch on a scalar and index the register file through M0 without a
|
|
325
|
+
waterfall. A wave holding two programs would run one over the other's particles, so the coherence
|
|
326
|
+
pass is part of simulate's correctness. Emit keeps a per-lane decode: its waves span emitters.
|
|
327
|
+
|
|
328
|
+
The bucket key is the **program**, not the emitter: `ProgramHeap` deduplicates by content and hands
|
|
329
|
+
back a `program_id` the emitter record carries, so emitters compiled from the same graph share
|
|
139
330
|
one bucket. Each bucket is padded out to `PARTICLE_SIMULATE_WORKGROUP_SIZE` (64 — a multiple of both
|
|
140
331
|
plausible subgroup widths, so no shader needs to query `subgroup_size`), which is what makes the
|
|
141
332
|
grouping hold at wave granularity: an unpadded boundary lands mid-wave and that wave spans two
|
|
@@ -151,10 +342,12 @@ whose only cross-workgroup wait is CSDLDF's bounded spin-then-fallback) → scat
|
|
|
151
342
|
with the sentinel. Nothing reads back to the CPU; the only host-supplied number is the bucket count,
|
|
152
343
|
which is static topology.
|
|
153
344
|
|
|
154
|
-
**Render order** (`sort/`) — per-frame,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
345
|
+
**Render order** (`sort/`) — per-frame, particles sorted back-to-front by view depth so
|
|
346
|
+
premultiplied transparency composites correctly. Counting sort on a quantised view depth
|
|
347
|
+
(`PARTICLE_SORT_BUCKET_COUNT` bins over `GPUParticleSystem#sort_depth_range`): histogram from the
|
|
348
|
+
camera uniform's view matrix, `graph_prefix_scan_csdldf` the bin counts to offsets, scatter (index
|
|
349
|
+
payload). The sorted index list feeds the instanced draw. Both per-particle passes are bounded by
|
|
350
|
+
the alive counter and dispatched by the args the bucket reset wrote from it.
|
|
158
351
|
|
|
159
352
|
Reordering the render list for program coherence would break transparency; depth-sorting the
|
|
160
353
|
simulation list would destroy the coherence. They share no buffer and no counter slot —
|
|
@@ -169,102 +362,153 @@ expanded per instance (billboard/velocity-stretch/axis-lock/world modes). Fragme
|
|
|
169
362
|
(region + flipbook frame), optional forward lighting via `chunk_shade_standard_material_direct` +
|
|
170
363
|
IBL, optional soft-depth fade. Depth-tested, no depth write. Draws into the HDR color target.
|
|
171
364
|
|
|
365
|
+
### Drawing under the renderer: an AVBOIT side channel
|
|
366
|
+
|
|
367
|
+
Under `Renderer` the particles are not drawn by the billboard pass above. They go through the AVBOIT
|
|
368
|
+
transparency pipeline (`rasterize/native/avboit/`) as a **side channel** — the contract in
|
|
369
|
+
`AVBOITSideChannel.js` — so they composite order-independently with the transparent meshes and
|
|
370
|
+
against the opaque scene, through the same volume and the same accumulators. Quads are not packed
|
|
371
|
+
into meshlets; the orchestrator asks the channel for its contribution at the three points where the
|
|
372
|
+
meshlet buckets have just made theirs:
|
|
373
|
+
|
|
374
|
+
1. **occupancy** (`shader_particle_avboit_occupancy`): one thread per emitter row, the emitter's
|
|
375
|
+
bounds sphere (the culling sphere, through its node's `global`) as a view-depth interval, dilated
|
|
376
|
+
and OR-ed into the occupancy bits. Per emitter, not per particle — no contention, and a particle
|
|
377
|
+
that strays lands on a run boundary rather than anywhere wrong. Additive emitters mark nothing.
|
|
378
|
+
This gives `bounds_radius` teeth on an emitter that never opted into culling: a particle outside
|
|
379
|
+
the sphere still draws, but its extinction lands in whatever physical slice the warp put nearest,
|
|
380
|
+
so it occludes at slightly the wrong depth. The sphere should hold the effect.
|
|
381
|
+
2. **splat** (`shader_particle_avboit_splat`): the billboard quads rasterized at the volume's
|
|
382
|
+
resolution, coverage from the atlas alpha, extinction through `avboit_splat_slice` — the same
|
|
383
|
+
write path as a surface. Additive particles write nothing. A soft-depth particle is faded here
|
|
384
|
+
against the same scene depth the draw fades it against, one sample per voxel: what the volume
|
|
385
|
+
records has to be the coverage the accumulators are weighted by, or a card that fades out where
|
|
386
|
+
it meets the floor goes on darkening the floor through itself.
|
|
387
|
+
3. **draw** (`shader_particle_avboit_draw`): the quads at internal resolution, depth-tested read-only
|
|
388
|
+
against the scene (which lets the soft fade read the same depth), fog composited, transmittance
|
|
389
|
+
from the integral. Which of the two it is, is decided by coverage rather than by the blend enum,
|
|
390
|
+
so an additive emitter and a premultiplied sprite with no alpha take the same path — as they do
|
|
391
|
+
in the splat. A covering particle writes `color / norm / extinction` as a surface does, in-scatter
|
|
392
|
+
included, weighted by the coverage it took. An emitting one writes the fourth accumulator,
|
|
393
|
+
**emission**: light attenuated by the fog and by the volume in front of it, and carrying none of
|
|
394
|
+
the fog's own in-scatter, because the resolve adds emission outside the normalization and the
|
|
395
|
+
scene behind already has it. That accumulator is the one addition to AVBOIT's resolve for this.
|
|
396
|
+
The whole decision is `chunk_particle_avboit_contribution`, and it is spec'd on the emulator.
|
|
397
|
+
|
|
398
|
+
No sort: the volume makes order irrelevant, so this path reads the alive list and the draw args
|
|
399
|
+
straight from `simulate`. The billboard vertex stage is one chunk
|
|
400
|
+
(`chunk_particle_billboard_vertex`) shared by the standalone renderer and both AVBOIT passes.
|
|
401
|
+
`GPUParticleSystem` implements the three methods; `Renderer.feature_particles_enabled` runs
|
|
402
|
+
`simulate` before the transparency pass and hands the system to the orchestrator. MBOIT is legacy
|
|
403
|
+
and gets no particle path.
|
|
404
|
+
|
|
405
|
+
### Ownership: `GPUParticleSystem`
|
|
406
|
+
|
|
407
|
+
Constructed once against a `GPUSceneContext`, in the mould of `ReSTIRDI`. It owns every persistent
|
|
408
|
+
buffer — pool, alive lists, dead list, counters, both indirect-args buffers, the coherence and sort
|
|
409
|
+
scratch, the emitter database (both tables), the packed program buffer, the spawn-command ring — and grows the ones that depend on the emitter set inside `execute`. The
|
|
410
|
+
default atlas is a 1x1 white texel. `execute({graph, camera, scene_database, color, depth, dt})`
|
|
411
|
+
sweeps the scene, pushes what changed (on a command context opened only when something needs
|
|
412
|
+
one), and records the whole frame through `graph_particles`, returning the colour handle after
|
|
413
|
+
the draw. An integrator does not encode a particle pass by hand.
|
|
414
|
+
|
|
172
415
|
## File layout
|
|
173
416
|
|
|
174
417
|
```
|
|
175
|
-
src/
|
|
418
|
+
src/shade/renderer/particles/
|
|
176
419
|
DESIGN.md
|
|
177
|
-
ParticleConstants.js pool stride, reg count, limits
|
|
420
|
+
ParticleConstants.js pool stride, reg count, workgroup sizes, limits
|
|
178
421
|
isa/ParticleVMISA.js opcode table (single source of truth)
|
|
179
422
|
isa/ParticleProgram.js Program value type + (de)serialization to u32
|
|
180
423
|
isa/ParticleAssembler.js tiny assembler (build programs in tests/library)
|
|
181
424
|
vm/ParticleVMReference.js JS reference executor
|
|
182
425
|
vm/chunk_particle_vm.js WGSL interpreter CodeChunk (parity target)
|
|
426
|
+
vm/chunk_particle_vm_registers_fast.js register file in var<private> — the interpreter that runs
|
|
427
|
+
vm/chunk_particle_vm_registers_wide.js register file in storage — the fallback
|
|
428
|
+
shaders/chunk_particle_simulate_step.js one particle's simulate, shared by both simulate shaders
|
|
429
|
+
shaders/chunk_particle_emit_step.js one newborn's emit, shared by both emit shaders
|
|
183
430
|
graph/ParticleNodeDescription.js node type base (ports + lowering)
|
|
184
431
|
graph/ParticleNodeRegistry.js standard node library (a NodeRegistry)
|
|
185
432
|
graph/particle_graph_authoring.js authoring sugar over core/model/node-graph
|
|
186
433
|
graph/compile_particle_graph.js graph → Program (register alloc, const intern)
|
|
187
434
|
layout/ParticleLayout.js attribute schema ↔ record word offsets
|
|
188
|
-
data
|
|
435
|
+
data/PARTICLE_EMITTER_STRUCT.js the emitter row + flag/blend/projection encoding
|
|
436
|
+
data/particle_emitter_record.js emitter + context -> one row of that struct
|
|
437
|
+
data/PARTICLE_EMITTER_STATE.js the GPU-owned per-emitter state row (second table of the database)
|
|
438
|
+
data/PARTICLE_DATABASE_SPEC.js the GPUDatabase schema, and the emitter table's descriptor
|
|
439
|
+
data/PARTICLE_COUNTERS.js counter slot indices
|
|
440
|
+
data/particle_header.js record header encoding (row + generation), JS + WGSL
|
|
189
441
|
coherence/particle_program_buckets.js CPU reference for the simulation-order bucketing
|
|
190
442
|
coherence/shader_particle_bucket.js reset / histogram / pad / scatter / fill
|
|
191
443
|
coherence/graph_particle_bucket.js frame-graph wiring, around graph_prefix_scan_csdldf
|
|
192
|
-
runtime/
|
|
193
|
-
runtime/
|
|
194
|
-
runtime/
|
|
195
|
-
runtime/
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
444
|
+
runtime/ProgramHeap.js the one packed [header][constants][code] buffer, allocator-backed
|
|
445
|
+
runtime/ProgramPlacement.js where one program sits in it — what an emitter record carries
|
|
446
|
+
runtime/ParticleEmitter.js one emitter — a Node3D and an effect, with no GPU in it
|
|
447
|
+
runtime/GPUParticleEmitterContext.js what a registry assigns one: row, generation, placement, patch
|
|
448
|
+
runtime/EmitterRegistry.js GPUDatabase(emitters) + the live emitters + their contexts + the program heap
|
|
449
|
+
runtime/create_particle_effect.js layout + INIT/UPDATE graphs → compiled effect
|
|
450
|
+
shaders/shader_particle_spawn_commands.js CPU bursts → pending spawns
|
|
451
|
+
shaders/shader_particle_emitter_tick.js per-emitter spawn decision
|
|
452
|
+
shaders/shader_particle_emit.js per-newborn INIT, sized by the scan
|
|
453
|
+
shaders/shader_particle_simulate.js per-particle UPDATE + compaction + orphan kill
|
|
454
|
+
shaders/shader_particle_finalize.js reset counters (+ budget) / build indirect args
|
|
455
|
+
shaders/shader_particle_render.js billboard pipeline
|
|
456
|
+
shaders/chunk_particle_setup_context.js VM builtins from the emitter's node, + the RNG seed
|
|
457
|
+
shaders/chunk_particle_emitter_age.js the tick pass's running age, off the emitter_state table
|
|
458
|
+
shaders/chunk_particle_curve_disabled.js the no-curves-bound CURVE provider
|
|
459
|
+
shaders/chunk_particle_billboard_vertex.js the billboard vertex stage, shared by every draw
|
|
460
|
+
shaders/chunk_particle_emitter_world_sphere.js the culling / occupancy sphere
|
|
461
|
+
shaders/shader_particle_avboit_*.js occupancy / splat / draw through AVBOIT
|
|
462
|
+
sort/* render-order depth sort
|
|
463
|
+
graph_particles.js simulate (to the draw args) + the standalone sort and draw
|
|
464
|
+
graph_particles_avboit.js the AVBOIT side channel: occupancy, splat, draw
|
|
465
|
+
GPUParticleSystem.js the feature: owns the buffers, sweeps the scene, execute()
|
|
466
|
+
particle_test_fixtures.js scene + registry + database words, for the emulator specs
|
|
467
|
+
*.spec.js co-located tests (JS + emulator + software device)
|
|
201
468
|
```
|
|
202
469
|
|
|
203
470
|
## Testing
|
|
204
471
|
|
|
205
|
-
- Pure JS: layout packing, assembler, register allocator, node compiler,
|
|
206
|
-
bookkeeping (via `SoftwareGPUDevice`).
|
|
472
|
+
- Pure JS: layout packing, assembler, register allocator, node compiler, heap/emitter/registry
|
|
473
|
+
bookkeeping (via `SoftwareGPUDevice`), the header encoding.
|
|
207
474
|
- WGSL via emulator: VM opcode parity (JS vs WGSL), curve sampling, sort key/depth, atlas+flipbook
|
|
208
|
-
UV math, billboard expansion, soft-depth fade,
|
|
475
|
+
UV math, billboard expansion, soft-depth fade, and every compute pass on small fixtures — the tick
|
|
476
|
+
(rate integration, generations, pending, budget, culling, page-group walk), emit (expansion over
|
|
477
|
+
the scan, node position, orphans), simulate, spawn commands, finalize, bucket, sort. Fixtures
|
|
478
|
+
(`particle_test_fixtures.js`) build a real scene with a `GPUSceneContext` and a real registry, and
|
|
479
|
+
`gpu_database_words` lays both databases out the way the GPU holds them, so the shaders read rows
|
|
480
|
+
the real writers wrote.
|
|
481
|
+
- Multi-frame capstone (`particle_lifecycle.spec`): reset → commands → tick → (JS scan) → emit →
|
|
482
|
+
simulate across frames, with the GPU deciding to spawn, a CPU burst, the budget, and death.
|
|
483
|
+
- Orchestration on `SoftwareGPUDevice`: `GPUParticleSystem.spec` (scene sweep, growth, uploads only
|
|
484
|
+
when needed, the ring), `graph_particles.spec` (pass sequence, indirect sizing, the two orderings,
|
|
485
|
+
every persistent buffer imported exactly once), and the playground's `particle_scene.spec` (the
|
|
486
|
+
integration: geometry → hierarchy → particles → draw).
|
|
209
487
|
- Cross-parity meta-tests: every ISA opcode implemented by both executors.
|
|
210
488
|
|
|
211
489
|
End-to-end GPU is out of scope for node (no binary GPU dep); emulator + JS references give the
|
|
212
490
|
coverage the brief asks for.
|
|
213
491
|
|
|
214
|
-
## Implementation status
|
|
215
|
-
|
|
216
|
-
Built and tested (80 tests, 16 files):
|
|
217
|
-
|
|
218
|
-
- **VM** — ISA, program, assembler, JS reference executor, WGSL interpreter with full deterministic-
|
|
219
|
-
opcode parity (fuzz + hand-written) and known-answer RNG.
|
|
220
|
-
- **Node graph → bytecode** — layout, graph, node library, compiler (DAG-share, linear-scan register
|
|
221
|
-
alloc, error cases), verified on the reference VM.
|
|
222
|
-
- **Emitter data** — packed u32 layout + WGSL reader, flag/blend/projection encoding, transform
|
|
223
|
-
writer.
|
|
224
|
-
- **Simulate** (single execution shader) and **emit** (spawn) passes — verified through the emulator,
|
|
225
|
-
including a multi-effect run and the multi-frame lifecycle capstone (`particle_lifecycle.spec`).
|
|
226
|
-
- **Runtime** — ProgramArena, EmitterRegistry, ParticleSpawnScheduler (sleep-when-culled), the
|
|
227
|
-
GPUParticleSystem CPU model (bone-attach transform patching, free list, ping-pong).
|
|
228
|
-
- **Sort** — counting sort reference + histogram/scatter shaders bracketing `graph_prefix_scan_csdldf`.
|
|
229
|
-
- **Coherence** — CPU reference plus the five bucketing shaders, on the emulator and validated as
|
|
230
|
-
WGSL; the whole chain is run end to end against the reference, pinning that bucket boundaries land
|
|
231
|
-
on multiples of 64, that no workgroup of the result spans two programs, and that every input slot
|
|
232
|
-
survives exactly once. Orchestration is pinned twice on `SoftwareGPUDevice`: `graph_particles.spec`
|
|
233
|
-
records the real frame graph (pass order, indirect sizing, the two orderings in separate buffers,
|
|
234
|
-
and every persistent buffer imported exactly once — two imports of one buffer are two resource
|
|
235
|
-
entries the graph cannot tell apart), and the playground spec covers the hand-encoded equivalent.
|
|
236
|
-
- **Render math** — billboard modes, atlas/flipbook UV, soft fade, premultiplied blend.
|
|
237
|
-
- **Finalize** — reset + build-indirect passes.
|
|
238
|
-
- **Culling** — frustum sphere test.
|
|
239
|
-
|
|
240
|
-
Structural (production-patterned, not emulator-runnable — need a real device / framegraph execution):
|
|
241
|
-
the billboard **render pipeline** (`shader_particle_render`, assembly-verified), the **frame-graph
|
|
242
|
-
wiring** (`graph_particles`), the **animation-curve provider** (reuses the engine's curve chunk), and
|
|
243
|
-
the **prototype** effects.
|
|
244
|
-
|
|
245
492
|
### Emulator caveats discovered (all correct on real hardware)
|
|
246
493
|
|
|
247
|
-
The in-repo WGSL emulator (unit-test tool, not GPU parity) has
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
`
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
`graph_prefix_scan_csdldf`) and the billboard render pass (into the HDR colour + scene depth
|
|
267
|
-
attachments) — depth test on, no write, premultiplied blend.
|
|
268
|
-
4. For lit emitters, compile a simulate/render variant that swaps the disabled curve/lighting hooks
|
|
494
|
+
The in-repo WGSL emulator (unit-test tool, not GPU parity) has limitations the shaders are written
|
|
495
|
+
around, documented in the memory note: `switch` case bodies are dropped (use if/else); repeated
|
|
496
|
+
read-modify-write of one location across a loop is corrupted (RNG is verified in isolation, not
|
|
497
|
+
through the interpreter loop); u32 multiply is imprecise for large operands (PCG can't be checked
|
|
498
|
+
through it); `/` is FLOAT division, so integer division only truncates where the result is stored
|
|
499
|
+
straight into a typed array — `(n + 63u) / 64u * 64u` reads as 66 there and 64 on a device, and a
|
|
500
|
+
binary search's `mid` is a shift, not a divide; matrix column indexing (`m[0]`) is not evaluated,
|
|
501
|
+
so an axis scale is read as `m * vec4(1,0,0,0)`. `array<atomic<u32>>` bindings are modeled as
|
|
502
|
+
`{value}` objects in tests; a pass that binds the same buffer as plain `array<u32>` gets a
|
|
503
|
+
`Uint32Array`. The scene context writes a row's `global` one publish behind (the hierarchy pass
|
|
504
|
+
recomposes it on a device), so a node's matrix under the emulator is the one it had when its row
|
|
505
|
+
was seeded.
|
|
506
|
+
|
|
507
|
+
### Renderer integration
|
|
508
|
+
|
|
509
|
+
Done: `Renderer.feature_particles_enabled` (off by default), `Renderer.particles(scene_ctx)` creating
|
|
510
|
+
one system per scene context on first use, `simulate` recorded before the transparency pass and the
|
|
511
|
+
system passed to the AVBOIT orchestrator as its side channel. Remaining:
|
|
512
|
+
1. For lit emitters, compile a simulate/render variant that swaps the disabled curve/lighting hooks
|
|
269
513
|
for `chunk_particle_curve_animation` (+ bind `GPUAnimationManager.database.buffer`) and a
|
|
270
514
|
shading-chunk-backed lighting hook (+ the `SHADING_LIGHT_RESOURCE_GROUP`).
|