@woosh/meep-engine 3.16.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/particles/effect/ParticleEffectDocument.d.ts +21 -6
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +38 -17
- 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 +59 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +84 -8
- 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/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
- 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/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
- 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 +5 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
- package/editor/view/particles/effect/particle-editor.css +123 -35
- package/package.json +1 -1
- 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/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/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
- package/src/engine/animation/AnimationUtils.js +246 -246
- package/src/engine/animation/Animations.js +74 -74
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
- package/src/engine/ecs/EventType.d.ts +0 -1
- package/src/engine/ecs/EventType.js +1 -26
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +4 -9
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
- 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 +8 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
- package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_announce_change.js +12 -12
- 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/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +4 -8
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +9 -19
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
- package/src/shade/playground/particle_editor/README.md +43 -2
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +4 -5
- package/src/shade/playground/particle_system/particle_scene.js +4 -4
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +13 -1
- package/src/shade/renderer/particles/DESIGN.md +104 -19
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
- package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +66 -23
- 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/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
- 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/graph/ParticleGroupBuilder.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
- 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/simplex_reference.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
- 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_diagnostic.d.ts +28 -8
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
- 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 +7 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
- package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +105 -262
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
- 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 +51 -22
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
- 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 +23 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
- 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 +81 -42
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
- 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 +139 -59
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
- 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 +3 -2
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
- 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.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
- 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.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
- package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
- 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 +87 -102
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +26 -0
- 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 +5 -2
- 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_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_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_emit.d.ts +18 -9
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
- 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_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 +33 -101
- 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/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/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 +4 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
- 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/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/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 +49 -10
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +4 -9
- 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/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/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/ConnectionLayoutSpec.d.ts +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
- package/src/engine/ecs/transform/__probe.d.ts +0 -4
- package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
- package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
- package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
- 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/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/runtime/Emitter.d.ts +0 -219
- package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
- 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/shaders/chunk_particle_context.d.ts +0 -32
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { WebGPUExtensionType } from "../../../descriptor/WebGPUExtensionType.js";
|
|
2
|
+
import { atomic_u32, f32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
3
|
+
import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
|
|
4
|
+
import { ComputeShader } from "../../shader/ComputeShader.js";
|
|
5
|
+
import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
|
|
6
|
+
import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
|
|
7
|
+
import { PARTICLE_SIMULATE_WORKGROUP_SIZE, PARTICLE_VM_WIDE_LAUNCH_LANES } from "../ParticleConstants.js";
|
|
8
|
+
import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
|
|
9
|
+
import { chunk_particle_vm_registers_wide } from "../vm/chunk_particle_vm_registers_wide.js";
|
|
10
|
+
import { chunk_particle_curve_disabled } from "./chunk_particle_curve_disabled.js";
|
|
11
|
+
import { chunk_particle_simulate_step } from "./chunk_particle_simulate_step.js";
|
|
12
|
+
import { SIMULATE_SETTINGS } from "./shader_particle_simulate.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The simulate pass over the WIDE register file — the fallback interpreter.
|
|
16
|
+
*
|
|
17
|
+
* Same simulation as {@link ./shader_particle_simulate.js}, down to the shared
|
|
18
|
+
* {@link ./chunk_particle_simulate_step.js}: one dispatch, every live particle, the emitter's UPDATE
|
|
19
|
+
* program, compaction into the alive and free lists. Two things differ, and both follow from the
|
|
20
|
+
* register file living in a storage buffer.
|
|
21
|
+
*
|
|
22
|
+
* ## The launch is bounded, and the loop is grid-stride
|
|
23
|
+
*
|
|
24
|
+
* The fast pass runs one invocation per particle and sizes its dispatch indirectly from
|
|
25
|
+
* `counters[ALIVE_IN]`. This one cannot: it needs a register file per invocation in flight, so
|
|
26
|
+
* one-lane-per-particle would size the register buffer by pool capacity — a gigabyte at a million
|
|
27
|
+
* particles.
|
|
28
|
+
*
|
|
29
|
+
* So it launches exactly {@link ../ParticleConstants.js PARTICLE_VM_WIDE_LAUNCH_LANES} lanes,
|
|
30
|
+
* whatever the particle count, and each walks `sim_list` in strides of that. The register buffer is
|
|
31
|
+
* then sized by a constant this engine chose rather than by a number the pool decides. There is no
|
|
32
|
+
* indirect command and no CPU-side count: the launch is fixed, and the loop bound is still the
|
|
33
|
+
* on-GPU `counters[ALIVE_IN]` snapshot, read in the shader exactly as before. Every guarantee the
|
|
34
|
+
* fast pass's sizing comment describes holds here for the same reason.
|
|
35
|
+
*
|
|
36
|
+
* The stride is a whole number of workgroups, which is what keeps the coherence pass's bucketing
|
|
37
|
+
* intact: each iteration covers a workgroup-aligned span of `sim_list`, so a wave still sees one
|
|
38
|
+
* program and the wave-uniform section decode is still sound. That decode is worth keeping even
|
|
39
|
+
* here — it is what makes the instruction fetch and the opcode switch scalar. Only the register
|
|
40
|
+
* indexing goes per-lane, because in this backing it always is.
|
|
41
|
+
*
|
|
42
|
+
* ## Nine storage buffers
|
|
43
|
+
*
|
|
44
|
+
* The fast passes fit in the eight a stage gets by default; this one adds `vm_registers` and needs
|
|
45
|
+
* nine. That is inside what the engine already demands of an adapter — {@link
|
|
46
|
+
* ../../Renderer.js} refuses one offering fewer than ten — so it costs no new capability, but it is
|
|
47
|
+
* why the particle system's "everything fits in eight" note does not cover this shader.
|
|
48
|
+
*
|
|
49
|
+
* @type {ComputeShader}
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Workgroups this pass dispatches. Constant: the launch does not depend on the particle count.
|
|
54
|
+
* @type {number}
|
|
55
|
+
*/
|
|
56
|
+
export const PARTICLE_SIMULATE_WIDE_WORKGROUP_COUNT =
|
|
57
|
+
PARTICLE_VM_WIDE_LAUNCH_LANES / PARTICLE_SIMULATE_WORKGROUP_SIZE;
|
|
58
|
+
|
|
59
|
+
const resources = new ShaderResourceSetDescriptor();
|
|
60
|
+
|
|
61
|
+
resources.setImmediate('settings', SIMULATE_SETTINGS);
|
|
62
|
+
|
|
63
|
+
resources.createGroup()
|
|
64
|
+
.addStorageBuffer("scene_database", WebGPUArray.u32, false)
|
|
65
|
+
.addStorageBuffer("emitter_database", WebGPUArray.u32, false)
|
|
66
|
+
.addStorageBuffer("program", WebGPUArray.u32, false)
|
|
67
|
+
.addStorageBuffer("pool", WebGPUArray.u32, true)
|
|
68
|
+
.addStorageBuffer("sim_list", WebGPUArray.u32, false)
|
|
69
|
+
.addStorageBuffer("alive_out", WebGPUArray.u32, true)
|
|
70
|
+
.addStorageBuffer("dead", WebGPUArray.u32, true)
|
|
71
|
+
.addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true)
|
|
72
|
+
.addStorageBuffer("vm_registers", WebGPUArray.from(f32), true);
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
const body = CodeChunk.from(/* language=wgsl */ `
|
|
76
|
+
const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
|
|
77
|
+
const COUNTER_DEAD : u32 = ${PARTICLE_COUNTER.DEAD}u;
|
|
78
|
+
const COUNTER_ALIVE_IN : u32 = ${PARTICLE_COUNTER.ALIVE_IN}u;
|
|
79
|
+
|
|
80
|
+
@compute @workgroup_size(${PARTICLE_SIMULATE_WORKGROUP_SIZE}, 1, 1)
|
|
81
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
82
|
+
// This invocation's column of the register file. The launch is exactly
|
|
83
|
+
// PARTICLE_VM_WIDE_LAUNCH_LANES wide, so gid.x is in range by construction — that is the whole
|
|
84
|
+
// reason the launch is bounded.
|
|
85
|
+
particle_vm_bind_registers(gid.x);
|
|
86
|
+
|
|
87
|
+
// The exact input length, snapshotted on-GPU last frame — never a stale CPU value.
|
|
88
|
+
let alive_in = atomicLoad(&counters[COUNTER_ALIVE_IN]);
|
|
89
|
+
|
|
90
|
+
for (var i = gid.x; i < alive_in; i = i + PARTICLE_VM_WIDE_LAUNCH_LANES) {
|
|
91
|
+
let slot = sim_list[i];
|
|
92
|
+
|
|
93
|
+
let verdict = particle_simulate_one(
|
|
94
|
+
&scene_database, &emitter_database, &program, &pool,
|
|
95
|
+
slot,
|
|
96
|
+
settings.u_dt, settings.u_time, settings.u_frame,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
// A padding lane's verdict is SKIP and books nothing. Appending it would put the padding
|
|
100
|
+
// sentinel on the alive or the free list, and the free list would then hand 0xffffffff to a
|
|
101
|
+
// later emit as a record base.
|
|
102
|
+
if (verdict == PARTICLE_SIM_ALIVE) {
|
|
103
|
+
let a = atomicAdd(&counters[COUNTER_ALIVE], 1u);
|
|
104
|
+
alive_out[a] = slot;
|
|
105
|
+
} else if (verdict == PARTICLE_SIM_KILLED) {
|
|
106
|
+
let d = atomicAdd(&counters[COUNTER_DEAD], 1u);
|
|
107
|
+
dead[d] = slot;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
`, [
|
|
112
|
+
chunk_particle_simulate_step,
|
|
113
|
+
chunk_particle_vm_registers_wide,
|
|
114
|
+
chunk_particle_curve_disabled,
|
|
115
|
+
]);
|
|
116
|
+
|
|
117
|
+
body.addExtension(WebGPUExtensionType.Subgroups);
|
|
118
|
+
|
|
119
|
+
export const shader_particle_simulate_wide = ComputeShader.from({
|
|
120
|
+
label: "Particle Simulate (wide registers)",
|
|
121
|
+
resources,
|
|
122
|
+
body,
|
|
123
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-graph wiring for the RENDER order: the frame's alive list quantised by view depth and
|
|
3
|
+
* scattered back-to-front, into `gpu.sorted`, for a draw whose blending is order-dependent.
|
|
4
|
+
*
|
|
5
|
+
* reset -> histogram -> csdldf scan -> scatter. The two per-particle passes are indirect, sized by
|
|
6
|
+
* the same `sim_dispatch_args` the coherence reset wrote from the GPU's own alive count, so nothing
|
|
7
|
+
* here is sized by a host-side particle count.
|
|
8
|
+
*
|
|
9
|
+
* This is the ONLY producer of a depth ordering, and only {@link ParticleRenderMode.BILLBOARD} runs
|
|
10
|
+
* it. It must never be confused with the simulation order the coherence passes build (`coherence/`):
|
|
11
|
+
* that one groups by VM program so a wave runs one program, is camera-independent, and lives in a
|
|
12
|
+
* different buffer with a different counter slot. Depth-sorting it would destroy the coherence;
|
|
13
|
+
* running the padded coherence list through a blended draw would draw its sentinels.
|
|
14
|
+
*
|
|
15
|
+
* @param {object} params
|
|
16
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
17
|
+
* @param {object} params.gpu the persistent buffers owned by {@link GPUParticleSystem}
|
|
18
|
+
* @param {GPUBuffer} params.gpu.sort_histogram `{count, elements}` bins for the CSDLDF scan
|
|
19
|
+
* @param {GPUBuffer} params.gpu.sort_cursor per-bin scatter cursor
|
|
20
|
+
* @param {GPUBuffer} params.gpu.sort_keys per-alive-entry depth bin
|
|
21
|
+
* @param {GPUBuffer} params.gpu.sorted the back-to-front slot list this produces
|
|
22
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
23
|
+
* @param {number} params.emitter_database graph handle
|
|
24
|
+
* @param {number} params.pool graph handle of the particle pool
|
|
25
|
+
* @param {number} params.alive graph handle of this frame's compacted alive list
|
|
26
|
+
* @param {number} params.counters graph handle of the atomic counters
|
|
27
|
+
* @param {number} params.dispatch_args graph handle of one workgroup per live particle
|
|
28
|
+
* @param {number} params.bucket_count depth bins the sort quantises into
|
|
29
|
+
* @param {number} params.near view depth the first bin starts at
|
|
30
|
+
* @param {number} params.far view depth the last bin ends at
|
|
31
|
+
* @returns {number} graph handle of the sorted slot list
|
|
32
|
+
*/
|
|
33
|
+
export function graph_particle_sort({ graph, gpu, camera, emitter_database, pool, alive, counters, dispatch_args, bucket_count, near, far, }: {
|
|
34
|
+
graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
35
|
+
gpu: {
|
|
36
|
+
sort_histogram: GPUBuffer;
|
|
37
|
+
sort_cursor: GPUBuffer;
|
|
38
|
+
sort_keys: GPUBuffer;
|
|
39
|
+
sorted: GPUBuffer;
|
|
40
|
+
};
|
|
41
|
+
camera: number;
|
|
42
|
+
emitter_database: number;
|
|
43
|
+
pool: number;
|
|
44
|
+
alive: number;
|
|
45
|
+
counters: number;
|
|
46
|
+
dispatch_args: number;
|
|
47
|
+
bucket_count: number;
|
|
48
|
+
near: number;
|
|
49
|
+
far: number;
|
|
50
|
+
}): number;
|
|
51
|
+
//# sourceMappingURL=graph_particle_sort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph_particle_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/sort/graph_particle_sort.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH;IAjBqG,KAAK,EAA/F,OAAO,8DAA8D,EAAE,UAAU;IAClE,GAAG;QACI,cAAc;QACd,WAAW;QACX,SAAS;QACT,MAAM;;IACb,MAAM,EAArB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,aAAa,EAA5B,MAAM;IACS,YAAY,EAA3B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,GAAG,EAAlB,MAAM;IACJ,MAAM,CA2ElB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { assert } from "../../../../core/assert.js";
|
|
2
|
+
import { align_4 } from "../../../../core/binary/align_4.js";
|
|
3
|
+
import { graph_prefix_scan_csdldf } from "../../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
4
|
+
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
5
|
+
import { graph_compute_indirect_pass } from "../../shader/graph/compute/graph_compute_indirect_pass.js";
|
|
6
|
+
import { graph_compute_pass } from "../../shader/graph/compute/graph_compute_pass.js";
|
|
7
|
+
import { graph_import_buffer } from "../../shader/graph/graph_import_buffer.js";
|
|
8
|
+
import {
|
|
9
|
+
PARTICLE_SORT_WORKGROUP_SIZE,
|
|
10
|
+
shader_particle_sort_histogram,
|
|
11
|
+
shader_particle_sort_reset,
|
|
12
|
+
shader_particle_sort_scatter,
|
|
13
|
+
} from "./shader_particle_sort.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Frame-graph wiring for the RENDER order: the frame's alive list quantised by view depth and
|
|
17
|
+
* scattered back-to-front, into `gpu.sorted`, for a draw whose blending is order-dependent.
|
|
18
|
+
*
|
|
19
|
+
* reset -> histogram -> csdldf scan -> scatter. The two per-particle passes are indirect, sized by
|
|
20
|
+
* the same `sim_dispatch_args` the coherence reset wrote from the GPU's own alive count, so nothing
|
|
21
|
+
* here is sized by a host-side particle count.
|
|
22
|
+
*
|
|
23
|
+
* This is the ONLY producer of a depth ordering, and only {@link ParticleRenderMode.BILLBOARD} runs
|
|
24
|
+
* it. It must never be confused with the simulation order the coherence passes build (`coherence/`):
|
|
25
|
+
* that one groups by VM program so a wave runs one program, is camera-independent, and lives in a
|
|
26
|
+
* different buffer with a different counter slot. Depth-sorting it would destroy the coherence;
|
|
27
|
+
* running the padded coherence list through a blended draw would draw its sentinels.
|
|
28
|
+
*
|
|
29
|
+
* @param {object} params
|
|
30
|
+
* @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
31
|
+
* @param {object} params.gpu the persistent buffers owned by {@link GPUParticleSystem}
|
|
32
|
+
* @param {GPUBuffer} params.gpu.sort_histogram `{count, elements}` bins for the CSDLDF scan
|
|
33
|
+
* @param {GPUBuffer} params.gpu.sort_cursor per-bin scatter cursor
|
|
34
|
+
* @param {GPUBuffer} params.gpu.sort_keys per-alive-entry depth bin
|
|
35
|
+
* @param {GPUBuffer} params.gpu.sorted the back-to-front slot list this produces
|
|
36
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
37
|
+
* @param {number} params.emitter_database graph handle
|
|
38
|
+
* @param {number} params.pool graph handle of the particle pool
|
|
39
|
+
* @param {number} params.alive graph handle of this frame's compacted alive list
|
|
40
|
+
* @param {number} params.counters graph handle of the atomic counters
|
|
41
|
+
* @param {number} params.dispatch_args graph handle of one workgroup per live particle
|
|
42
|
+
* @param {number} params.bucket_count depth bins the sort quantises into
|
|
43
|
+
* @param {number} params.near view depth the first bin starts at
|
|
44
|
+
* @param {number} params.far view depth the last bin ends at
|
|
45
|
+
* @returns {number} graph handle of the sorted slot list
|
|
46
|
+
*/
|
|
47
|
+
export function graph_particle_sort({
|
|
48
|
+
graph,
|
|
49
|
+
gpu,
|
|
50
|
+
camera,
|
|
51
|
+
emitter_database,
|
|
52
|
+
pool,
|
|
53
|
+
alive,
|
|
54
|
+
counters,
|
|
55
|
+
dispatch_args,
|
|
56
|
+
bucket_count,
|
|
57
|
+
near,
|
|
58
|
+
far,
|
|
59
|
+
}) {
|
|
60
|
+
// The four buffers below are made on the first frame that sorts, not with the rest of the pool,
|
|
61
|
+
// because a system drawn through AVBOIT never sorts. Naming the missing one is worth a line:
|
|
62
|
+
// `graph_import_buffer` of an undefined buffer fails a long way from the cause.
|
|
63
|
+
for (const name of ["sort_histogram", "sort_cursor", "sort_keys", "sorted"]) {
|
|
64
|
+
assert.defined(gpu[name], `gpu.${name} — the render-order scratch was not allocated before the sort`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let histogram = graph_import_buffer(graph, gpu.sort_histogram, "particles/sort_histogram");
|
|
68
|
+
let cursor = graph_import_buffer(graph, gpu.sort_cursor, "particles/sort_cursor");
|
|
69
|
+
let keys = graph_import_buffer(graph, gpu.sort_keys, "particles/sort_keys");
|
|
70
|
+
let sorted = graph_import_buffer(graph, gpu.sorted, "particles/sorted");
|
|
71
|
+
|
|
72
|
+
// The reset's widest loop is the scan header plus the bins rounded up to a whole vec4.
|
|
73
|
+
const reset_words = PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(bucket_count);
|
|
74
|
+
|
|
75
|
+
{
|
|
76
|
+
const out = graph_compute_pass({
|
|
77
|
+
graph,
|
|
78
|
+
shader: shader_particle_sort_reset,
|
|
79
|
+
bindings: { histogram, cursor, settings: { u_bucket_count: bucket_count } },
|
|
80
|
+
group_count: [Math.ceil(reset_words / PARTICLE_SORT_WORKGROUP_SIZE), 1, 1],
|
|
81
|
+
});
|
|
82
|
+
histogram = out.histogram;
|
|
83
|
+
cursor = out.cursor;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The counters are only read here, but an atomic read needs a read_write binding, and the
|
|
87
|
+
// graph sees a write — so the handle is threaded through like any other.
|
|
88
|
+
{
|
|
89
|
+
const out = graph_compute_indirect_pass({
|
|
90
|
+
graph,
|
|
91
|
+
shader: shader_particle_sort_histogram,
|
|
92
|
+
bindings: {
|
|
93
|
+
camera, emitter_database, pool, alive, counters, keys, histogram,
|
|
94
|
+
settings: { u_near: near, u_far: far, u_bucket_count: bucket_count },
|
|
95
|
+
},
|
|
96
|
+
command: dispatch_args,
|
|
97
|
+
});
|
|
98
|
+
keys = out.keys;
|
|
99
|
+
histogram = out.histogram;
|
|
100
|
+
counters = out.counters;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const scanned = graph_prefix_scan_csdldf({
|
|
104
|
+
graph,
|
|
105
|
+
data: histogram,
|
|
106
|
+
element_max_count: bucket_count,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
{
|
|
110
|
+
const out = graph_compute_indirect_pass({
|
|
111
|
+
graph,
|
|
112
|
+
shader: shader_particle_sort_scatter,
|
|
113
|
+
bindings: { keys, alive, scanned, counters, cursor, sorted },
|
|
114
|
+
command: dispatch_args,
|
|
115
|
+
});
|
|
116
|
+
sorted = out.sorted;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return sorted;
|
|
120
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-invocation builtin inputs the host assembles before running a program.
|
|
3
|
+
*/
|
|
4
|
+
export const PARTICLE_VM_CONTEXT_STRUCT: WebGPUStruct;
|
|
5
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
6
|
+
//# sourceMappingURL=PARTICLE_VM_CONTEXT_STRUCT.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PARTICLE_VM_CONTEXT_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,sDASU;6BAdmB,mCAAmC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { f32, vec3f } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
|
|
2
|
+
import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Per-invocation builtin inputs the host assembles before running a program.
|
|
6
|
+
*/
|
|
7
|
+
export const PARTICLE_VM_CONTEXT_STRUCT = WebGPUStruct.from({
|
|
8
|
+
delta_time: f32,
|
|
9
|
+
emitter_age: f32,
|
|
10
|
+
time: f32,
|
|
11
|
+
spawn_fraction: f32,
|
|
12
|
+
particle_index: f32,
|
|
13
|
+
emitter_position: vec3f,
|
|
14
|
+
emitter_direction: vec3f,
|
|
15
|
+
emitter_up: vec3f,
|
|
16
|
+
}).pack();
|
|
@@ -24,7 +24,10 @@ export function u32_to_unit_f32(u: number): number;
|
|
|
24
24
|
* particle asked to be destroyed and the advanced RNG state so the caller can persist it.
|
|
25
25
|
*
|
|
26
26
|
* This is the CPU reference semantics — the WGSL interpreter is written to match it exactly, and the
|
|
27
|
-
* parity spec cross-checks them.
|
|
27
|
+
* parity spec cross-checks them. The shape is the interpreter's: every source is resolved, lane by
|
|
28
|
+
* lane as far as the opcode reads it, before the opcode runs, and the destination is written after,
|
|
29
|
+
* so a source may overlap the destination in any way and still mean what it held before the
|
|
30
|
+
* instruction.
|
|
28
31
|
*
|
|
29
32
|
* @param {object} params
|
|
30
33
|
* @param {Uint32Array} params.words instruction words for the section (SPAWN or UPDATE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleVMReference.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/ParticleVMReference.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ParticleVMReference.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/ParticleVMReference.js"],"names":[],"mappings":"AA0BA;;;;;;;GAOG;AACH,gCAHW,MAAM;WACK,MAAM;WAAS,MAAM;EAW1C;AAED;;;;;GAKG;AACH,mCAHW,MAAM,GACJ,MAAM,CAIlB;AAqED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;WATW,WAAW;eACX,YAAY;oBACZ,MAAM;YACN,WAAW;eACX,MAAM,EAAE,EAAE;gBACV,MAAM;2BACG,MAAM,KAAK,MAAM,KAAK,MAAM;;YACzB,OAAO;eAAa,MAAM;EA+RhD"}
|