@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
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The particle system's frame, recorded into the frame graph.
|
|
3
|
-
* calls
|
|
2
|
+
* The simulation half of the particle system's frame, recorded into the frame graph.
|
|
3
|
+
* {@link GPUParticleSystem#execute} is what calls it, with the buffers it owns; nothing else needs
|
|
4
|
+
* to.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
+
* {@link graph_particles_simulate} is everything that moves particles:
|
|
6
7
|
*
|
|
7
8
|
* reset counters -> spawn commands -> emitter tick -> scan -> spawn args -> emit -> simulate
|
|
8
9
|
* -> bucket -> build indirect
|
|
9
10
|
*
|
|
10
11
|
* and it leaves the frame's alive list, the pool and the indirect draw args as graph handles for
|
|
11
|
-
* whoever draws.
|
|
12
|
-
*
|
|
13
|
-
* (`
|
|
14
|
-
*
|
|
12
|
+
* whoever draws. Nothing here depends on how they will be drawn, which is why the render mode
|
|
13
|
+
* ({@link ParticleRenderMode}) selects only what `execute` records AFTER this: the depth sort and
|
|
14
|
+
* the billboard draw (`sort/graph_particle_sort.js`, `graph_particles_billboard.js`), or nothing at
|
|
15
|
+
* all, because the AVBOIT orchestrator will draw them later off these same handles
|
|
16
|
+
* (`graph_particles_avboit.js`).
|
|
15
17
|
*
|
|
16
18
|
* ## Spawning is decided here, on the GPU
|
|
17
19
|
*
|
|
@@ -30,18 +32,18 @@
|
|
|
30
32
|
* ordering is camera-independent and changes only when emitters or their programs change.
|
|
31
33
|
*
|
|
32
34
|
* The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
|
|
33
|
-
* different buffer, produced by different passes, and the standalone billboard draw is
|
|
34
|
-
* consumes it. Reordering the render list for
|
|
35
|
-
* depth-sorting the simulation list would destroy
|
|
36
|
-
* counter slot.
|
|
35
|
+
* different buffer, produced by different passes, and the standalone billboard draw is the only
|
|
36
|
+
* thing that consumes it, so it is built only in that mode. Reordering the render list for
|
|
37
|
+
* coherence would break premultiplied transparency; depth-sorting the simulation list would destroy
|
|
38
|
+
* the coherence. They share no buffer and no counter slot.
|
|
37
39
|
*
|
|
38
40
|
* ## Nothing is sized from the CPU
|
|
39
41
|
*
|
|
40
42
|
* Simulate's workgroup count comes from `dispatch_args` (written by LAST frame's build-indirect
|
|
41
43
|
* pass) via `dispatchWorkgroupsIndirect`, and its element bound from the `ALIVE_IN` counter
|
|
42
|
-
* snapshot; the sort's two per-particle passes
|
|
43
|
-
* frame's alive count. A CPU count is inevitably stale and corrupts the pool
|
|
44
|
-
* the population grows, double-freed slots when it shrinks).
|
|
44
|
+
* snapshot; the draw, and the sort's two per-particle passes when there is a sort, are sized the
|
|
45
|
+
* same way, from this frame's alive count. A CPU count is inevitably stale and corrupts the pool
|
|
46
|
+
* (orphaned slots when the population grows, double-freed slots when it shrinks).
|
|
45
47
|
*
|
|
46
48
|
* All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
|
|
47
49
|
* buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
|
|
@@ -73,7 +75,11 @@
|
|
|
73
75
|
* list the scan consumes
|
|
74
76
|
* @param {number} params.emitters.group_count workgroups the tick needs to walk every page group
|
|
75
77
|
* @param {number} params.capacity pool capacity in particles
|
|
76
|
-
* @param {number} params.bucket_count
|
|
78
|
+
* @param {number} params.bucket_count simulation-order buckets, one per program id the registry
|
|
79
|
+
* can hand out — `GPUParticleSystem#bucketCount()`
|
|
80
|
+
* @param {boolean} params.wide_registers run the VM over the wide (storage-backed) register file
|
|
81
|
+
* because some registered effect needs more slots than the fast interpreter's file holds. A
|
|
82
|
+
* whole-system choice, not a per-emitter one — see `runtime/ProgramHeap.js`.
|
|
77
83
|
* @param {object} params.frame per-frame scalars
|
|
78
84
|
* @param {number} params.frame.dt
|
|
79
85
|
* @param {number} params.frame.time
|
|
@@ -82,7 +88,7 @@
|
|
|
82
88
|
* @param {number} params.frame.spawn_command_count entries in `gpu.spawn_commands` this frame
|
|
83
89
|
* @returns {ParticleSimulationHandles}
|
|
84
90
|
*/
|
|
85
|
-
export function graph_particles_simulate({ graph, camera, scene_database, gpu, emitters, capacity, bucket_count, frame, }: {
|
|
91
|
+
export function graph_particles_simulate({ graph, camera, scene_database, gpu, emitters, capacity, bucket_count, wide_registers, frame, }: {
|
|
86
92
|
graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
87
93
|
camera: number;
|
|
88
94
|
scene_database: number;
|
|
@@ -93,6 +99,7 @@ export function graph_particles_simulate({ graph, camera, scene_database, gpu, e
|
|
|
93
99
|
};
|
|
94
100
|
capacity: number;
|
|
95
101
|
bucket_count: number;
|
|
102
|
+
wide_registers: boolean;
|
|
96
103
|
frame: {
|
|
97
104
|
dt: number;
|
|
98
105
|
time: number;
|
|
@@ -101,59 +108,6 @@ export function graph_particles_simulate({ graph, camera, scene_database, gpu, e
|
|
|
101
108
|
spawn_command_count: number;
|
|
102
109
|
};
|
|
103
110
|
}): ParticleSimulationHandles;
|
|
104
|
-
/**
|
|
105
|
-
* The standalone drawing: the depth sort, then one billboard draw over a colour target with
|
|
106
|
-
* fixed-function blending.
|
|
107
|
-
*
|
|
108
|
-
* @param {object} params
|
|
109
|
-
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
110
|
-
* @param {number} params.camera graph handle
|
|
111
|
-
* @param {number} params.color graph handle of the colour target the billboards draw over
|
|
112
|
-
* @param {number} params.depth graph handle of the scene depth, tested against and never written
|
|
113
|
-
* @param {object} params.gpu the persistent buffers
|
|
114
|
-
* @param {ParticleSimulationHandles} params.simulated what {@link graph_particles_simulate} returned
|
|
115
|
-
* @param {number} params.sort_bucket_count depth bins the render sort quantises into
|
|
116
|
-
* @param {object} params.frame
|
|
117
|
-
* @param {number} params.frame.sort_near view depth the sort's first bin starts at
|
|
118
|
-
* @param {number} params.frame.sort_far view depth the sort's last bin ends at
|
|
119
|
-
* @param {object} params.render
|
|
120
|
-
* @param {GPUTextureView} params.render.atlas sprite atlas
|
|
121
|
-
* @param {GPUSampler} params.render.atlas_sampler
|
|
122
|
-
* @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
|
|
123
|
-
* the billboard pipeline for the frame's attachment formats
|
|
124
|
-
* @returns {number} the colour handle after the draw
|
|
125
|
-
*/
|
|
126
|
-
export function graph_particles_render({ graph, camera, color, depth, gpu, simulated, sort_bucket_count, frame, render, }: {
|
|
127
|
-
graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
128
|
-
camera: number;
|
|
129
|
-
color: number;
|
|
130
|
-
depth: number;
|
|
131
|
-
gpu: object;
|
|
132
|
-
simulated: ParticleSimulationHandles;
|
|
133
|
-
sort_bucket_count: number;
|
|
134
|
-
frame: {
|
|
135
|
-
sort_near: number;
|
|
136
|
-
sort_far: number;
|
|
137
|
-
};
|
|
138
|
-
render: {
|
|
139
|
-
atlas: GPUTextureView;
|
|
140
|
-
atlas_sampler: GPUSampler;
|
|
141
|
-
obtain_pipeline: (color_format: string, depth_format: string) => object;
|
|
142
|
-
};
|
|
143
|
-
}): number;
|
|
144
|
-
/**
|
|
145
|
-
* The whole standalone frame: simulate, then sort and draw.
|
|
146
|
-
*
|
|
147
|
-
* @param {object} params every parameter of {@link graph_particles_simulate} and
|
|
148
|
-
* {@link graph_particles_render}
|
|
149
|
-
* @returns {{color: number, alive: number, pool: number, counters: number}}
|
|
150
|
-
*/
|
|
151
|
-
export function graph_particles(params: object): {
|
|
152
|
-
color: number;
|
|
153
|
-
alive: number;
|
|
154
|
-
pool: number;
|
|
155
|
-
counters: number;
|
|
156
|
-
};
|
|
157
111
|
export type ParticleSimulationHandles = {
|
|
158
112
|
/**
|
|
159
113
|
* the particle pool, after this frame's INIT and UPDATE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAtBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,GAAG,EAAlB,MAAM;IACS,QAAQ;QACC,QAAQ,EAAhC,MAAM;QAEkB,WAAW,EAAnC,MAAM;;IACS,QAAQ,EAAvB,MAAM;IACS,YAAY,EAA3B,MAAM;IAEU,cAAc,EAA9B,OAAO;IAGQ,KAAK;QACC,EAAE,EAAvB,MAAM;QACe,IAAI,EAAzB,MAAM;QACe,KAAK,EAA1B,MAAM;QACe,WAAW,EAAhC,MAAM;QACe,mBAAmB,EAAxC,MAAM;;IACJ,yBAAyB,CA8OrC;;;;;UA9Qa,MAAM;;;;WACN,MAAM;;;;cACN,MAAM;;;;eACN,MAAM;;;;uBACN,MAAM;;;;sBACN,MAAM"}
|
|
@@ -2,8 +2,6 @@ import { assert } from "../../../core/assert.js";
|
|
|
2
2
|
import { align_4 } from "../../../core/binary/align_4.js";
|
|
3
3
|
import { noop } from "../../../core/function/noop.js";
|
|
4
4
|
import { BufferResourceDescriptor } from "../../device/graph/BufferResourceDescriptor.js";
|
|
5
|
-
import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
|
|
6
|
-
import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.js";
|
|
7
5
|
import { INDIRECT_COMPUTE_COMMAND_DESCRIPTOR } from "../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
|
|
8
6
|
import { graph_prefix_scan_csdldf } from "../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
|
|
9
7
|
import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
|
|
@@ -11,41 +9,48 @@ import { shader_prefix_sum_to_command } from "../rasterize/expand/mesh/shader_pr
|
|
|
11
9
|
import { graph_compute_indirect_pass } from "../shader/graph/compute/graph_compute_indirect_pass.js";
|
|
12
10
|
import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
|
|
13
11
|
import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
|
|
14
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
PARTICLE_SIMULATE_WORKGROUP_SIZE,
|
|
14
|
+
PARTICLE_VM_REGISTER_SLOTS,
|
|
15
|
+
PARTICLE_VM_WIDE_LAUNCH_LANES,
|
|
16
|
+
} from "./ParticleConstants.js";
|
|
15
17
|
import { graph_particle_bucket } from "./coherence/graph_particle_bucket.js";
|
|
16
18
|
import { shader_particle_emit } from "./shaders/shader_particle_emit.js";
|
|
19
|
+
import {
|
|
20
|
+
PARTICLE_EMIT_WIDE_WORKGROUP_COUNT,
|
|
21
|
+
shader_particle_emit_wide,
|
|
22
|
+
} from "./shaders/shader_particle_emit_wide.js";
|
|
17
23
|
import { shader_particle_emitter_tick } from "./shaders/shader_particle_emitter_tick.js";
|
|
18
24
|
import {
|
|
19
25
|
shader_particle_build_indirect,
|
|
20
26
|
shader_particle_reset_counters,
|
|
21
27
|
} from "./shaders/shader_particle_finalize.js";
|
|
22
|
-
import { PARTICLE_BILLBOARD_RESOURCES } from "./shaders/shader_particle_render.js";
|
|
23
28
|
import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js";
|
|
29
|
+
import {
|
|
30
|
+
PARTICLE_SIMULATE_WIDE_WORKGROUP_COUNT,
|
|
31
|
+
shader_particle_simulate_wide,
|
|
32
|
+
} from "./shaders/shader_particle_simulate_wide.js";
|
|
24
33
|
import {
|
|
25
34
|
PARTICLE_SPAWN_COMMAND_WORKGROUP_SIZE,
|
|
26
35
|
shader_particle_spawn_commands,
|
|
27
36
|
} from "./shaders/shader_particle_spawn_commands.js";
|
|
28
|
-
import {
|
|
29
|
-
PARTICLE_SORT_WORKGROUP_SIZE,
|
|
30
|
-
shader_particle_sort_histogram,
|
|
31
|
-
shader_particle_sort_reset,
|
|
32
|
-
shader_particle_sort_scatter,
|
|
33
|
-
} from "./sort/shader_particle_sort.js";
|
|
34
37
|
|
|
35
38
|
/**
|
|
36
|
-
* The particle system's frame, recorded into the frame graph.
|
|
37
|
-
* calls
|
|
39
|
+
* The simulation half of the particle system's frame, recorded into the frame graph.
|
|
40
|
+
* {@link GPUParticleSystem#execute} is what calls it, with the buffers it owns; nothing else needs
|
|
41
|
+
* to.
|
|
38
42
|
*
|
|
39
|
-
*
|
|
43
|
+
* {@link graph_particles_simulate} is everything that moves particles:
|
|
40
44
|
*
|
|
41
45
|
* reset counters -> spawn commands -> emitter tick -> scan -> spawn args -> emit -> simulate
|
|
42
46
|
* -> bucket -> build indirect
|
|
43
47
|
*
|
|
44
48
|
* and it leaves the frame's alive list, the pool and the indirect draw args as graph handles for
|
|
45
|
-
* whoever draws.
|
|
46
|
-
*
|
|
47
|
-
* (`
|
|
48
|
-
*
|
|
49
|
+
* whoever draws. Nothing here depends on how they will be drawn, which is why the render mode
|
|
50
|
+
* ({@link ParticleRenderMode}) selects only what `execute` records AFTER this: the depth sort and
|
|
51
|
+
* the billboard draw (`sort/graph_particle_sort.js`, `graph_particles_billboard.js`), or nothing at
|
|
52
|
+
* all, because the AVBOIT orchestrator will draw them later off these same handles
|
|
53
|
+
* (`graph_particles_avboit.js`).
|
|
49
54
|
*
|
|
50
55
|
* ## Spawning is decided here, on the GPU
|
|
51
56
|
*
|
|
@@ -64,18 +69,18 @@ import {
|
|
|
64
69
|
* ordering is camera-independent and changes only when emitters or their programs change.
|
|
65
70
|
*
|
|
66
71
|
* The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
|
|
67
|
-
* different buffer, produced by different passes, and the standalone billboard draw is
|
|
68
|
-
* consumes it. Reordering the render list for
|
|
69
|
-
* depth-sorting the simulation list would destroy
|
|
70
|
-
* counter slot.
|
|
72
|
+
* different buffer, produced by different passes, and the standalone billboard draw is the only
|
|
73
|
+
* thing that consumes it, so it is built only in that mode. Reordering the render list for
|
|
74
|
+
* coherence would break premultiplied transparency; depth-sorting the simulation list would destroy
|
|
75
|
+
* the coherence. They share no buffer and no counter slot.
|
|
71
76
|
*
|
|
72
77
|
* ## Nothing is sized from the CPU
|
|
73
78
|
*
|
|
74
79
|
* Simulate's workgroup count comes from `dispatch_args` (written by LAST frame's build-indirect
|
|
75
80
|
* pass) via `dispatchWorkgroupsIndirect`, and its element bound from the `ALIVE_IN` counter
|
|
76
|
-
* snapshot; the sort's two per-particle passes
|
|
77
|
-
* frame's alive count. A CPU count is inevitably stale and corrupts the pool
|
|
78
|
-
* the population grows, double-freed slots when it shrinks).
|
|
81
|
+
* snapshot; the draw, and the sort's two per-particle passes when there is a sort, are sized the
|
|
82
|
+
* same way, from this frame's alive count. A CPU count is inevitably stale and corrupts the pool
|
|
83
|
+
* (orphaned slots when the population grows, double-freed slots when it shrinks).
|
|
79
84
|
*
|
|
80
85
|
* All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
|
|
81
86
|
* buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
|
|
@@ -109,7 +114,11 @@ import {
|
|
|
109
114
|
* list the scan consumes
|
|
110
115
|
* @param {number} params.emitters.group_count workgroups the tick needs to walk every page group
|
|
111
116
|
* @param {number} params.capacity pool capacity in particles
|
|
112
|
-
* @param {number} params.bucket_count
|
|
117
|
+
* @param {number} params.bucket_count simulation-order buckets, one per program id the registry
|
|
118
|
+
* can hand out — `GPUParticleSystem#bucketCount()`
|
|
119
|
+
* @param {boolean} params.wide_registers run the VM over the wide (storage-backed) register file
|
|
120
|
+
* because some registered effect needs more slots than the fast interpreter's file holds. A
|
|
121
|
+
* whole-system choice, not a per-emitter one — see `runtime/ProgramHeap.js`.
|
|
113
122
|
* @param {object} params.frame per-frame scalars
|
|
114
123
|
* @param {number} params.frame.dt
|
|
115
124
|
* @param {number} params.frame.time
|
|
@@ -126,6 +135,7 @@ export function graph_particles_simulate({
|
|
|
126
135
|
emitters,
|
|
127
136
|
capacity,
|
|
128
137
|
bucket_count,
|
|
138
|
+
wide_registers = false,
|
|
129
139
|
frame,
|
|
130
140
|
}) {
|
|
131
141
|
assert.defined(graph, "graph");
|
|
@@ -219,6 +229,20 @@ export function graph_particles_simulate({
|
|
|
219
229
|
element_max_count: Math.max(1, emitters.capacity),
|
|
220
230
|
});
|
|
221
231
|
|
|
232
|
+
// The wide interpreter's register file: one column per launched lane, slot-major, sized by the
|
|
233
|
+
// launch and NOT by the pool. Transient and deliberately uncleared — a program reads a register
|
|
234
|
+
// only after writing it, so what the last user left is unreadable by construction. See
|
|
235
|
+
// `vm/chunk_particle_vm_registers_wide.js`.
|
|
236
|
+
//
|
|
237
|
+
// Emit and simulate share it. They cannot overlap (simulate reads the alive list emit appends
|
|
238
|
+
// to), and the file carries nothing between particles, let alone between passes.
|
|
239
|
+
let vm_registers = wide_registers
|
|
240
|
+
? create_buffer(graph, "particles/vm_registers", BufferResourceDescriptor.from(
|
|
241
|
+
PARTICLE_VM_WIDE_LAUNCH_LANES * PARTICLE_VM_REGISTER_SLOTS * 4,
|
|
242
|
+
GPUBufferUsage.STORAGE,
|
|
243
|
+
))
|
|
244
|
+
: -1;
|
|
245
|
+
|
|
222
246
|
// 5. That total, as the emit dispatch — the same one-thread pass that sizes meshlet expansion.
|
|
223
247
|
const emit_command = graph_compute_pass({
|
|
224
248
|
graph,
|
|
@@ -232,21 +256,37 @@ export function graph_particles_simulate({
|
|
|
232
256
|
|
|
233
257
|
// 6. Emit — one thread per newborn, its emitter found in the scan. Newborns join the new alive
|
|
234
258
|
// list.
|
|
259
|
+
//
|
|
260
|
+
// The wide variant does not consume `emit_command`: its launch is a constant, and it reads
|
|
261
|
+
// the scan's total in the shader as a loop bound instead. The command is still built above —
|
|
262
|
+
// it costs one workgroup and keeps the pass graph the same shape either way.
|
|
235
263
|
{
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
264
|
+
const bindings = {
|
|
265
|
+
scene_database,
|
|
266
|
+
emitter_database,
|
|
267
|
+
program: gr_program,
|
|
268
|
+
spawn_prefix,
|
|
269
|
+
pool, alive_out: alive_write, dead, counters,
|
|
270
|
+
settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index, u_capacity: capacity },
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const out = wide_registers
|
|
274
|
+
? graph_compute_pass({
|
|
275
|
+
graph,
|
|
276
|
+
shader: shader_particle_emit_wide,
|
|
277
|
+
bindings: { ...bindings, vm_registers },
|
|
278
|
+
group_count: [PARTICLE_EMIT_WIDE_WORKGROUP_COUNT, 1, 1],
|
|
279
|
+
})
|
|
280
|
+
: graph_compute_indirect_pass({
|
|
281
|
+
graph,
|
|
282
|
+
shader: shader_particle_emit,
|
|
283
|
+
bindings,
|
|
284
|
+
command: emit_command,
|
|
285
|
+
});
|
|
286
|
+
|
|
249
287
|
pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
|
|
288
|
+
|
|
289
|
+
if (wide_registers) { vm_registers = out.vm_registers; }
|
|
250
290
|
}
|
|
251
291
|
|
|
252
292
|
// 7. Simulate — one indirect dispatch runs every emitter's UPDATE over the program-coherent list
|
|
@@ -254,19 +294,34 @@ export function graph_particles_simulate({
|
|
|
254
294
|
// slots into the dead list. The workgroup count comes from last frame's dispatch_args and the
|
|
255
295
|
// list itself from last frame's sim_list — both read here and re-written in steps 8 and 9,
|
|
256
296
|
// with insertion order keeping the read before the write.
|
|
297
|
+
//
|
|
298
|
+
// The wide variant ignores `gr_dispatch` for the same reason emit ignores its command: a
|
|
299
|
+
// bounded launch with a grid-stride loop, so the register file is sized by a constant rather
|
|
300
|
+
// than by the alive count. The list and its length are unchanged, and so is every guarantee
|
|
301
|
+
// that comes from reading the length on the GPU.
|
|
257
302
|
{
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
303
|
+
const bindings = {
|
|
304
|
+
scene_database,
|
|
305
|
+
emitter_database,
|
|
306
|
+
program: gr_program,
|
|
307
|
+
pool, sim_list: gr_sim_list, alive_out: alive_write, dead, counters,
|
|
308
|
+
settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index },
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const out = wide_registers
|
|
312
|
+
? graph_compute_pass({
|
|
313
|
+
graph,
|
|
314
|
+
shader: shader_particle_simulate_wide,
|
|
315
|
+
bindings: { ...bindings, vm_registers },
|
|
316
|
+
group_count: [PARTICLE_SIMULATE_WIDE_WORKGROUP_COUNT, 1, 1],
|
|
317
|
+
})
|
|
318
|
+
: graph_compute_indirect_pass({
|
|
319
|
+
graph,
|
|
320
|
+
shader: shader_particle_simulate,
|
|
321
|
+
bindings,
|
|
322
|
+
command: gr_dispatch,
|
|
323
|
+
});
|
|
324
|
+
|
|
270
325
|
pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
|
|
271
326
|
}
|
|
272
327
|
|
|
@@ -310,218 +365,6 @@ export function graph_particles_simulate({
|
|
|
310
365
|
};
|
|
311
366
|
}
|
|
312
367
|
|
|
313
|
-
/**
|
|
314
|
-
* The standalone drawing: the depth sort, then one billboard draw over a colour target with
|
|
315
|
-
* fixed-function blending.
|
|
316
|
-
*
|
|
317
|
-
* @param {object} params
|
|
318
|
-
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
319
|
-
* @param {number} params.camera graph handle
|
|
320
|
-
* @param {number} params.color graph handle of the colour target the billboards draw over
|
|
321
|
-
* @param {number} params.depth graph handle of the scene depth, tested against and never written
|
|
322
|
-
* @param {object} params.gpu the persistent buffers
|
|
323
|
-
* @param {ParticleSimulationHandles} params.simulated what {@link graph_particles_simulate} returned
|
|
324
|
-
* @param {number} params.sort_bucket_count depth bins the render sort quantises into
|
|
325
|
-
* @param {object} params.frame
|
|
326
|
-
* @param {number} params.frame.sort_near view depth the sort's first bin starts at
|
|
327
|
-
* @param {number} params.frame.sort_far view depth the sort's last bin ends at
|
|
328
|
-
* @param {object} params.render
|
|
329
|
-
* @param {GPUTextureView} params.render.atlas sprite atlas
|
|
330
|
-
* @param {GPUSampler} params.render.atlas_sampler
|
|
331
|
-
* @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
|
|
332
|
-
* the billboard pipeline for the frame's attachment formats
|
|
333
|
-
* @returns {number} the colour handle after the draw
|
|
334
|
-
*/
|
|
335
|
-
export function graph_particles_render({
|
|
336
|
-
graph,
|
|
337
|
-
camera,
|
|
338
|
-
color,
|
|
339
|
-
depth,
|
|
340
|
-
gpu,
|
|
341
|
-
simulated,
|
|
342
|
-
sort_bucket_count,
|
|
343
|
-
frame,
|
|
344
|
-
render,
|
|
345
|
-
}) {
|
|
346
|
-
assert.defined(simulated, "simulated");
|
|
347
|
-
|
|
348
|
-
// 10. Sort — the render order: back-to-front by view depth, so premultiplied transparency
|
|
349
|
-
// composites correctly. Its two per-particle passes take the dispatch the bucket reset
|
|
350
|
-
// wrote from the alive count.
|
|
351
|
-
const sorted = graph_particle_sort({
|
|
352
|
-
graph,
|
|
353
|
-
gpu,
|
|
354
|
-
camera,
|
|
355
|
-
emitter_database: simulated.emitter_database,
|
|
356
|
-
pool: simulated.pool,
|
|
357
|
-
alive: simulated.alive,
|
|
358
|
-
counters: simulated.counters,
|
|
359
|
-
dispatch_args: simulated.sim_dispatch_args,
|
|
360
|
-
bucket_count: sort_bucket_count,
|
|
361
|
-
near: frame.sort_near,
|
|
362
|
-
far: frame.sort_far,
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
// 11. Render — one instanced billboard draw over the sorted list, sized by the draw args this
|
|
366
|
-
// frame's build-indirect wrote.
|
|
367
|
-
return graph_particle_render({
|
|
368
|
-
graph,
|
|
369
|
-
camera,
|
|
370
|
-
color,
|
|
371
|
-
depth,
|
|
372
|
-
pool: simulated.pool,
|
|
373
|
-
sorted,
|
|
374
|
-
emitter_database: simulated.emitter_database,
|
|
375
|
-
draw_args: simulated.draw_args,
|
|
376
|
-
render,
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* The whole standalone frame: simulate, then sort and draw.
|
|
382
|
-
*
|
|
383
|
-
* @param {object} params every parameter of {@link graph_particles_simulate} and
|
|
384
|
-
* {@link graph_particles_render}
|
|
385
|
-
* @returns {{color: number, alive: number, pool: number, counters: number}}
|
|
386
|
-
*/
|
|
387
|
-
export function graph_particles(params) {
|
|
388
|
-
const simulated = graph_particles_simulate(params);
|
|
389
|
-
|
|
390
|
-
const color = graph_particles_render({ ...params, simulated });
|
|
391
|
-
|
|
392
|
-
return {
|
|
393
|
-
color,
|
|
394
|
-
alive: simulated.alive,
|
|
395
|
-
pool: simulated.pool,
|
|
396
|
-
counters: simulated.counters,
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* The depth sort: reset -> histogram -> csdldf scan -> scatter, into `gpu.sorted`.
|
|
402
|
-
*
|
|
403
|
-
* @returns {number} graph handle of the sorted slot list
|
|
404
|
-
*/
|
|
405
|
-
function graph_particle_sort({ graph, gpu, camera, emitter_database, pool, alive, counters, dispatch_args, bucket_count, near, far }) {
|
|
406
|
-
let histogram = graph_import_buffer(graph, gpu.sort_histogram, "particles/sort_histogram");
|
|
407
|
-
let cursor = graph_import_buffer(graph, gpu.sort_cursor, "particles/sort_cursor");
|
|
408
|
-
let keys = graph_import_buffer(graph, gpu.sort_keys, "particles/sort_keys");
|
|
409
|
-
let sorted = graph_import_buffer(graph, gpu.sorted, "particles/sorted");
|
|
410
|
-
|
|
411
|
-
// The reset's widest loop is the scan header plus the bins rounded up to a whole vec4.
|
|
412
|
-
const reset_words = PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(bucket_count);
|
|
413
|
-
|
|
414
|
-
{
|
|
415
|
-
const out = graph_compute_pass({
|
|
416
|
-
graph,
|
|
417
|
-
shader: shader_particle_sort_reset,
|
|
418
|
-
bindings: { histogram, cursor, settings: { u_bucket_count: bucket_count } },
|
|
419
|
-
group_count: [Math.ceil(reset_words / PARTICLE_SORT_WORKGROUP_SIZE), 1, 1],
|
|
420
|
-
});
|
|
421
|
-
histogram = out.histogram;
|
|
422
|
-
cursor = out.cursor;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// The counters are only read here, but an atomic read needs a read_write binding, and the
|
|
426
|
-
// graph sees a write — so the handle is threaded through like any other.
|
|
427
|
-
{
|
|
428
|
-
const out = graph_compute_indirect_pass({
|
|
429
|
-
graph,
|
|
430
|
-
shader: shader_particle_sort_histogram,
|
|
431
|
-
bindings: {
|
|
432
|
-
camera, emitter_database, pool, alive, counters, keys, histogram,
|
|
433
|
-
settings: { u_near: near, u_far: far, u_bucket_count: bucket_count },
|
|
434
|
-
},
|
|
435
|
-
command: dispatch_args,
|
|
436
|
-
});
|
|
437
|
-
keys = out.keys;
|
|
438
|
-
histogram = out.histogram;
|
|
439
|
-
counters = out.counters;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const scanned = graph_prefix_scan_csdldf({
|
|
443
|
-
graph,
|
|
444
|
-
data: histogram,
|
|
445
|
-
element_max_count: bucket_count,
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
{
|
|
449
|
-
const out = graph_compute_indirect_pass({
|
|
450
|
-
graph,
|
|
451
|
-
shader: shader_particle_sort_scatter,
|
|
452
|
-
bindings: { keys, alive, scanned, counters, cursor, sorted },
|
|
453
|
-
command: dispatch_args,
|
|
454
|
-
});
|
|
455
|
-
sorted = out.sorted;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
return sorted;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
/** The colour attachment's view: one mip, the one the frame draws into. */
|
|
462
|
-
const COLOR_VIEW = TextureViewDescriptor.from({ mipLevelCount: 1, baseMipLevel: 0 });
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* The billboard draw: loads the colour target, depth-tests read-only against the scene, draws
|
|
466
|
-
* `drawIndirect(draw_args)` instances over the sorted list.
|
|
467
|
-
*
|
|
468
|
-
* @returns {number} the colour handle after the draw
|
|
469
|
-
*/
|
|
470
|
-
function graph_particle_render({ graph, camera, color, depth, pool, sorted, emitter_database, draw_args, render }) {
|
|
471
|
-
const data = {};
|
|
472
|
-
|
|
473
|
-
const pass = graph.add("Particle Billboard", data, (data, resources, context) => {
|
|
474
|
-
const encoder = context.encoder;
|
|
475
|
-
|
|
476
|
-
const color_texture = resources.get(data.color);
|
|
477
|
-
const depth_texture = resources.get(data.depth);
|
|
478
|
-
|
|
479
|
-
const pipeline = render.obtain_pipeline(color_texture.descriptor.format, depth_texture.descriptor.format);
|
|
480
|
-
|
|
481
|
-
// Read by the soft-depth fade and tested against by the pass: the same view, read-only in
|
|
482
|
-
// both roles.
|
|
483
|
-
const depth_view = depth_texture.obtainView(DEFAULT_DEPTH_TEXTURE_VIEW);
|
|
484
|
-
|
|
485
|
-
const bindings = PARTICLE_BILLBOARD_RESOURCES.generateBindings({
|
|
486
|
-
camera: resources.get(data.camera),
|
|
487
|
-
pool: resources.get(data.pool),
|
|
488
|
-
draw_list: resources.get(data.sorted),
|
|
489
|
-
emitter_database: resources.get(data.emitter_database),
|
|
490
|
-
atlas: render.atlas,
|
|
491
|
-
atlas_sampler: render.atlas_sampler,
|
|
492
|
-
scene_depth: depth_view,
|
|
493
|
-
}, encoder);
|
|
494
|
-
|
|
495
|
-
const render_pass = encoder.constructRenderPass({
|
|
496
|
-
label: "Particle Billboard",
|
|
497
|
-
pipeline,
|
|
498
|
-
bindings,
|
|
499
|
-
colorAttachments: [{
|
|
500
|
-
view: color_texture.obtainView(COLOR_VIEW),
|
|
501
|
-
loadOp: "load",
|
|
502
|
-
storeOp: "store",
|
|
503
|
-
}],
|
|
504
|
-
depthStencilAttachment: {
|
|
505
|
-
view: depth_view,
|
|
506
|
-
depthReadOnly: true,
|
|
507
|
-
},
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
render_pass.drawIndirect(resources.get(data.draw_args), 0);
|
|
511
|
-
render_pass.end();
|
|
512
|
-
});
|
|
513
|
-
|
|
514
|
-
data.camera = pass.read(camera);
|
|
515
|
-
data.pool = pass.read(pool);
|
|
516
|
-
data.sorted = pass.read(sorted);
|
|
517
|
-
data.emitter_database = pass.read(emitter_database);
|
|
518
|
-
data.draw_args = pass.read(draw_args);
|
|
519
|
-
data.depth = pass.read(depth);
|
|
520
|
-
data.color = pass.write(pass.read(color));
|
|
521
|
-
|
|
522
|
-
return data.color;
|
|
523
|
-
}
|
|
524
|
-
|
|
525
368
|
/**
|
|
526
369
|
* A transient buffer with no producing pass of its own, for a binding a shader both reads and
|
|
527
370
|
* writes — the compute pass helpers create a buffer only for write-only bindings, and a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph_particles_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_avboit.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph_particles_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_avboit.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;GAYG;AACH;IATkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACoB,kBAAkB,EAA5C,UAAU,MAAM,CAAC;IACF,SAAS,EAAxB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,mBAAmB,EAAlC,MAAM;IACJ,MAAM,CAiDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH;IAZkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,IAAI,EAAnB,MAAM;IACwD,MAAM,EAApE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;IAC9B,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CA8EjE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAjBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IACnB,QAAQ,EAAnE,OAAO,2BAA2B,EAAE,cAAc;IACnC,MAAM,EAArB,MAAM;IACS,aAAa,EAA5B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,eAAe,EAA9B,MAAM;IACS,oBAAoB,EAAnC,MAAM;IACsE,YAAY,EAAxF;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IAC5C,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAoG/E"}
|
|
@@ -24,8 +24,9 @@ import {
|
|
|
24
24
|
* GPU-driven: the draws are `drawIndirect` over the GPU's own alive count, and the occupancy walks
|
|
25
25
|
* the emitter table's pages. Nothing here knows how many particles there are.
|
|
26
26
|
*
|
|
27
|
-
* Order does not matter to any of them — the volume and the accumulators are order-independent —
|
|
28
|
-
*
|
|
27
|
+
* Order does not matter to any of them — the volume and the accumulators are order-independent — so
|
|
28
|
+
* the depth sort the standalone billboard draw needs is not run for this path, and its buffers are
|
|
29
|
+
* never made. That is what {@link ParticleRenderMode.AVBOIT} means.
|
|
29
30
|
*/
|
|
30
31
|
|
|
31
32
|
/** The accumulators' view: one mip, the one the frame draws into. */
|