@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,156 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compose the flags word from feature toggles + blend + projection.
|
|
3
|
-
* @param {object} options
|
|
4
|
-
* @param {boolean} [options.lighting]
|
|
5
|
-
* @param {boolean} [options.soft_depth]
|
|
6
|
-
* @param {boolean} [options.sort]
|
|
7
|
-
* @param {boolean} [options.cull]
|
|
8
|
-
* @param {number} [options.blend] see {@link EMITTER_BLEND}
|
|
9
|
-
* @param {number} [options.projection] see {@link EMITTER_PROJECTION}
|
|
10
|
-
* @returns {number}
|
|
11
|
-
*/
|
|
12
|
-
export function make_emitter_flags({ lighting, soft_depth, sort, cull, blend, projection }?: {
|
|
13
|
-
lighting?: boolean;
|
|
14
|
-
soft_depth?: boolean;
|
|
15
|
-
sort?: boolean;
|
|
16
|
-
cull?: boolean;
|
|
17
|
-
blend?: number;
|
|
18
|
-
projection?: number;
|
|
19
|
-
}): number;
|
|
20
|
-
/** @param {number} flags @returns {number} the blend mode */
|
|
21
|
-
export function emitter_flags_blend(flags: number): number;
|
|
22
|
-
/** @param {number} flags @returns {number} the projection mode */
|
|
23
|
-
export function emitter_flags_projection(flags: number): number;
|
|
24
|
-
/**
|
|
25
|
-
* Write one emitter record into a shared `u32` view (and its `f32` alias) at record `index`.
|
|
26
|
-
*
|
|
27
|
-
* @param {Uint32Array} u32 view over the emitter buffer
|
|
28
|
-
* @param {Float32Array} f32 f32 alias over the same buffer
|
|
29
|
-
* @param {number} index emitter index
|
|
30
|
-
* @param {object} def emitter definition
|
|
31
|
-
* @param {number} def.spawn_offset
|
|
32
|
-
* @param {number} def.spawn_count
|
|
33
|
-
* @param {number} def.update_offset
|
|
34
|
-
* @param {number} def.update_count
|
|
35
|
-
* @param {number} def.constant_offset
|
|
36
|
-
* @param {number} def.seed
|
|
37
|
-
* @param {number} def.flags
|
|
38
|
-
* @param {number} def.spawn_rate
|
|
39
|
-
* @param {number[]} def.transform 16-element column-major matrix
|
|
40
|
-
* @param {number[]} [def.bounds_center] length-3
|
|
41
|
-
* @param {number} [def.bounds_radius]
|
|
42
|
-
* @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
|
|
43
|
-
* @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
44
|
-
* @param {number[]} [def.flipbook] length-2 [cols, rows]
|
|
45
|
-
* @param {number} [def.program_id] dense program id, the simulation-order bucket key
|
|
46
|
-
*/
|
|
47
|
-
export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
|
|
48
|
-
spawn_offset: number;
|
|
49
|
-
spawn_count: number;
|
|
50
|
-
update_offset: number;
|
|
51
|
-
update_count: number;
|
|
52
|
-
constant_offset: number;
|
|
53
|
-
seed: number;
|
|
54
|
-
flags: number;
|
|
55
|
-
spawn_rate: number;
|
|
56
|
-
transform: number[];
|
|
57
|
-
bounds_center?: number[];
|
|
58
|
-
bounds_radius?: number;
|
|
59
|
-
render?: object;
|
|
60
|
-
atlas_region?: number[];
|
|
61
|
-
flipbook?: number[];
|
|
62
|
-
program_id?: number;
|
|
63
|
-
}): void;
|
|
64
|
-
/**
|
|
65
|
-
* Overwrite just an emitter's world transform in a packed buffer.
|
|
66
|
-
*
|
|
67
|
-
* Used for scene-node / bone attachment: each frame the feature copies the attached `Node3D`'s
|
|
68
|
-
* world matrix (`transform_global`) into the emitter record and re-uploads the changed region, so
|
|
69
|
-
* the emitter spawns and simulates wherever the bone currently is. Cheaper than repacking the whole
|
|
70
|
-
* emitter set.
|
|
71
|
-
*
|
|
72
|
-
* @param {Float32Array} f32 f32 alias over the emitter buffer
|
|
73
|
-
* @param {number} index emitter index
|
|
74
|
-
* @param {ArrayLike<number>} matrix 16-element column-major world matrix
|
|
75
|
-
*/
|
|
76
|
-
export function write_emitter_transform(f32: Float32Array, index: number, matrix: ArrayLike<number>): void;
|
|
77
|
-
/**
|
|
78
|
-
* GPU memory layout for a single emitter record, addressed as `u32` words.
|
|
79
|
-
*
|
|
80
|
-
* Emitters are read on the GPU via explicit indexed access into an `array<u32>` (the same strategy
|
|
81
|
-
* GPUDatabase uses on-device) rather than an `array<Struct>` binding — this keeps the simulate/emit
|
|
82
|
-
* shaders trivially testable through the WGSL emulator. The word offsets here are the single source
|
|
83
|
-
* of truth shared by the JS packer ({@link pack_emitter}) and the WGSL reader
|
|
84
|
-
* ({@link ../data/chunk_particle_emitter.js}, which interpolates them).
|
|
85
|
-
*
|
|
86
|
-
* f32 fields are stored as their bit pattern and read back with `bitcast<f32>`.
|
|
87
|
-
*/
|
|
88
|
-
/** Word offsets within an emitter record. */
|
|
89
|
-
export const EMITTER_FIELD: Readonly<{
|
|
90
|
-
SPAWN_OFFSET: 0;
|
|
91
|
-
SPAWN_COUNT: 1;
|
|
92
|
-
UPDATE_OFFSET: 2;
|
|
93
|
-
UPDATE_COUNT: 3;
|
|
94
|
-
CONSTANT_OFFSET: 4;
|
|
95
|
-
SEED: 5;
|
|
96
|
-
FLAGS: 6;
|
|
97
|
-
SPAWN_RATE: 7;
|
|
98
|
-
TRANSFORM: 8;
|
|
99
|
-
BOUNDS_CENTER: 24;
|
|
100
|
-
BOUNDS_RADIUS: 27;
|
|
101
|
-
RENDER_POSITION: 28;
|
|
102
|
-
RENDER_SIZE: 29;
|
|
103
|
-
RENDER_COLOR: 30;
|
|
104
|
-
RENDER_ROTATION: 31;
|
|
105
|
-
RENDER_FRAME: 32;
|
|
106
|
-
ATLAS_REGION: 33;
|
|
107
|
-
FLIPBOOK: 37;
|
|
108
|
-
RENDER_VELOCITY: 39;
|
|
109
|
-
/**
|
|
110
|
-
* u32 — dense id of the compiled program this emitter runs, assigned by
|
|
111
|
-
* {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
|
|
112
|
-
*
|
|
113
|
-
* The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
|
|
114
|
-
* integer to index a bin with, which neither the emitter index (one bucket per emitter, even
|
|
115
|
-
* when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
|
|
116
|
-
* and sparse) gives it.
|
|
117
|
-
*/
|
|
118
|
-
PROGRAM_ID: 40;
|
|
119
|
-
}>;
|
|
120
|
-
/** Number of `u32` words per emitter record. */
|
|
121
|
-
export const EMITTER_STRIDE: 41;
|
|
122
|
-
/** Sentinel for an absent render-attribute binding. */
|
|
123
|
-
export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
|
|
124
|
-
/** Sentinel for "not attached to a scene node". */
|
|
125
|
-
export const EMITTER_ATTACH_NONE: 4294967295;
|
|
126
|
-
/**
|
|
127
|
-
* Emitter flag bits. Blend mode occupies bits [4,6), projection mode bits [6,9).
|
|
128
|
-
*/
|
|
129
|
-
export const EMITTER_FLAG: Readonly<{
|
|
130
|
-
LIGHTING: number;
|
|
131
|
-
SOFT_DEPTH: number;
|
|
132
|
-
SORT: number;
|
|
133
|
-
CULL: number;
|
|
134
|
-
}>;
|
|
135
|
-
/** Blend modes (stored in flag bits [4,6)). All expressed by one premultiplied blend pipeline. */
|
|
136
|
-
export const EMITTER_BLEND: Readonly<{
|
|
137
|
-
ALPHA: 0;
|
|
138
|
-
ADDITIVE: 1;
|
|
139
|
-
PREMULTIPLIED: 2;
|
|
140
|
-
}>;
|
|
141
|
-
/** Projection / orientation modes (stored in flag bits [6,9)). */
|
|
142
|
-
export const EMITTER_PROJECTION: Readonly<{
|
|
143
|
-
BILLBOARD: 0;
|
|
144
|
-
STRETCHED: 1;
|
|
145
|
-
HORIZONTAL: 2;
|
|
146
|
-
VERTICAL: 3;
|
|
147
|
-
FACING_WORLD: 4;
|
|
148
|
-
}>;
|
|
149
|
-
/** Shift/mask constants exposed for the WGSL reader to interpolate. */
|
|
150
|
-
export const EMITTER_FLAG_ENCODING: Readonly<{
|
|
151
|
-
BLEND_SHIFT: 4;
|
|
152
|
-
BLEND_MASK: number;
|
|
153
|
-
PROJECTION_SHIFT: 6;
|
|
154
|
-
PROJECTION_MASK: number;
|
|
155
|
-
}>;
|
|
156
|
-
//# sourceMappingURL=PARTICLE_EMITTER_LAYOUT.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Render channels an emitter can bind to one of its effect's per-particle attributes. The names
|
|
3
|
-
* match the `render_*` fields of {@link ../data/PARTICLE_EMITTER_STRUCT.js}.
|
|
4
|
-
*
|
|
5
|
-
* @type {string[]}
|
|
6
|
-
*/
|
|
7
|
-
export const EMITTER_RENDER_CHANNELS: string[];
|
|
8
|
-
/**
|
|
9
|
-
* One emitter: a compiled effect bound to instance parameters — world transform, spawn rate,
|
|
10
|
-
* blend / projection / feature flags, bounds sphere, render-attribute bindings, atlas region and
|
|
11
|
-
* flipbook grid.
|
|
12
|
-
*
|
|
13
|
-
* This is the CPU model of exactly one row of the emitter table
|
|
14
|
-
* ({@link ../data/PARTICLE_EMITTER_STRUCT.js}); {@link to_record} is the whole of the translation
|
|
15
|
-
* between the two. Fields are plain data with no setters — after changing any of them, set
|
|
16
|
-
* {@link dirty} so {@link ../runtime/EmitterRegistry.js} restages the row on its next flush. The
|
|
17
|
-
* flag rather than a setter per field because a row is restaged whole either way: one changed field
|
|
18
|
-
* and ten cost the same upload.
|
|
19
|
-
*
|
|
20
|
-
* Instances are created by {@link EmitterRegistry#add}, which assigns {@link id} and resolves the
|
|
21
|
-
* program placement. Constructing one directly gives you an emitter no table knows about.
|
|
22
|
-
*/
|
|
23
|
-
export class Emitter {
|
|
24
|
-
/**
|
|
25
|
-
* Build an emitter from a plain description. Every parameter is optional except the effect —
|
|
26
|
-
* an emitter with no program has nothing to run.
|
|
27
|
-
*
|
|
28
|
-
* @param {object} config
|
|
29
|
-
* @param {{layout: object, program: object}} config.effect compiled effect, see
|
|
30
|
-
* {@link ./create_particle_effect.js}
|
|
31
|
-
* @param {ArrayLike<number>} [config.transform] 16-element column-major local-to-world
|
|
32
|
-
* @param {number} [config.seed]
|
|
33
|
-
* @param {number} [config.spawn_rate] particles/second
|
|
34
|
-
* @param {object} [config.flags] passed to {@link make_emitter_flags}
|
|
35
|
-
* @param {{center?: ArrayLike<number>, radius?: number}} [config.bounds]
|
|
36
|
-
* @param {Object<string,string>} [config.render] render channel -> attribute name
|
|
37
|
-
* @param {ArrayLike<number>} [config.atlas_region] [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
38
|
-
* @param {ArrayLike<number>} [config.flipbook] [cols, rows]
|
|
39
|
-
* @param {object} [config.node] scene node to follow, see {@link attach_to}
|
|
40
|
-
* @returns {Emitter}
|
|
41
|
-
*/
|
|
42
|
-
static from(config: {
|
|
43
|
-
effect: {
|
|
44
|
-
layout: object;
|
|
45
|
-
program: object;
|
|
46
|
-
};
|
|
47
|
-
transform?: ArrayLike<number>;
|
|
48
|
-
seed?: number;
|
|
49
|
-
spawn_rate?: number;
|
|
50
|
-
flags?: object;
|
|
51
|
-
bounds?: {
|
|
52
|
-
center?: ArrayLike<number>;
|
|
53
|
-
radius?: number;
|
|
54
|
-
};
|
|
55
|
-
render?: {
|
|
56
|
-
[x: string]: string;
|
|
57
|
-
};
|
|
58
|
-
atlas_region?: ArrayLike<number>;
|
|
59
|
-
flipbook?: ArrayLike<number>;
|
|
60
|
-
node?: object;
|
|
61
|
-
}): Emitter;
|
|
62
|
-
/**
|
|
63
|
-
* Row this emitter occupies in the emitter table. Stable for the emitter's whole life — it is
|
|
64
|
-
* what every live particle's record header stores, so it cannot be renumbered while particles
|
|
65
|
-
* are in flight. `-1` until the registry assigns one.
|
|
66
|
-
*
|
|
67
|
-
* @type {number}
|
|
68
|
-
*/
|
|
69
|
-
id: number;
|
|
70
|
-
/**
|
|
71
|
-
* Compiled effect: the per-particle attribute layout plus the SPAWN/UPDATE bytecode.
|
|
72
|
-
*
|
|
73
|
-
* @type {{layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram}}
|
|
74
|
-
*/
|
|
75
|
-
effect: {
|
|
76
|
-
layout: import("../layout/ParticleLayout.js").ParticleLayout;
|
|
77
|
-
program: import("../isa/ParticleProgram.js").ParticleProgram;
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* Where this emitter's program sits in the shared arena, and the dense program id the
|
|
81
|
-
* simulation-order bucketing keys on. Assigned by {@link EmitterRegistry#add} from
|
|
82
|
-
* {@link ../runtime/ProgramArena.js}; emitters compiled from the same graph share one.
|
|
83
|
-
*
|
|
84
|
-
* @type {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
|
|
85
|
-
*/
|
|
86
|
-
placement: {
|
|
87
|
-
spawn_offset: number;
|
|
88
|
-
spawn_count: number;
|
|
89
|
-
update_offset: number;
|
|
90
|
-
update_count: number;
|
|
91
|
-
constant_offset: number;
|
|
92
|
-
program_id: number;
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Local-to-world, column-major.
|
|
96
|
-
* @type {Float32Array}
|
|
97
|
-
*/
|
|
98
|
-
transform: Float32Array;
|
|
99
|
-
/**
|
|
100
|
-
* Base RNG seed.
|
|
101
|
-
*
|
|
102
|
-
* Two emitters running one program produce identical particles from identical seeds, so leaving
|
|
103
|
-
* this at 0 is almost never what an author wants — {@link EmitterRegistry#add} reads 0 as
|
|
104
|
-
* "unset" and derives one from the row instead.
|
|
105
|
-
*
|
|
106
|
-
* @type {number}
|
|
107
|
-
*/
|
|
108
|
-
seed: number;
|
|
109
|
-
/**
|
|
110
|
-
* Continuous emission rate, particles per second. Consumed on the CPU by
|
|
111
|
-
* {@link ./ParticleSpawnScheduler.js} and carried in the record for shaders that want it.
|
|
112
|
-
* @type {number}
|
|
113
|
-
*/
|
|
114
|
-
spawn_rate: number;
|
|
115
|
-
/**
|
|
116
|
-
* Packed feature / blend / projection bits — see {@link make_emitter_flags}.
|
|
117
|
-
* @type {number}
|
|
118
|
-
*/
|
|
119
|
-
flags: number;
|
|
120
|
-
/**
|
|
121
|
-
* Bounding sphere in emitter-local space, used by the optional simulation culling.
|
|
122
|
-
* @type {Float32Array}
|
|
123
|
-
*/
|
|
124
|
-
bounds_center: Float32Array;
|
|
125
|
-
/**
|
|
126
|
-
* @type {number}
|
|
127
|
-
*/
|
|
128
|
-
bounds_radius: number;
|
|
129
|
-
/**
|
|
130
|
-
* Atlas sub-rect: uv offset `.xy`, uv scale `.zw`. Mirrors meep's `AtlasPatch`.
|
|
131
|
-
* @type {Float32Array}
|
|
132
|
-
*/
|
|
133
|
-
atlas_region: Float32Array;
|
|
134
|
-
/**
|
|
135
|
-
* Flipbook grid: columns, rows. `[1, 1]` is a single frame.
|
|
136
|
-
* @type {Float32Array}
|
|
137
|
-
*/
|
|
138
|
-
flipbook: Float32Array;
|
|
139
|
-
/** @type {number} record word offset of world position, or {@link EMITTER_ATTRIBUTE_ABSENT} */
|
|
140
|
-
render_position: number;
|
|
141
|
-
/** @type {number} record word offset of size */
|
|
142
|
-
render_size: number;
|
|
143
|
-
/** @type {number} record word offset of rgba colour */
|
|
144
|
-
render_color: number;
|
|
145
|
-
/** @type {number} record word offset of roll angle, radians */
|
|
146
|
-
render_rotation: number;
|
|
147
|
-
/** @type {number} record word offset of flipbook frame index */
|
|
148
|
-
render_frame: number;
|
|
149
|
-
/** @type {number} record word offset of velocity, read by the STRETCHED projection */
|
|
150
|
-
render_velocity: number;
|
|
151
|
-
/**
|
|
152
|
-
* Scene node (bone) this emitter follows, if any. While set, the system copies the node's world
|
|
153
|
-
* matrix into {@link transform} every frame, so the emitter spawns and simulates wherever the
|
|
154
|
-
* bone currently is.
|
|
155
|
-
*
|
|
156
|
-
* @type {{transform_global: {matrix: ArrayLike<number>}}|undefined}
|
|
157
|
-
*/
|
|
158
|
-
node: {
|
|
159
|
-
transform_global: {
|
|
160
|
-
matrix: ArrayLike<number>;
|
|
161
|
-
};
|
|
162
|
-
} | undefined;
|
|
163
|
-
/**
|
|
164
|
-
* Whether the table row is out of step with the fields above. Set it after changing anything;
|
|
165
|
-
* {@link EmitterRegistry#flush} clears it once the row has been staged for upload.
|
|
166
|
-
*
|
|
167
|
-
* @type {boolean}
|
|
168
|
-
*/
|
|
169
|
-
dirty: boolean;
|
|
170
|
-
/**
|
|
171
|
-
* Point the emitter at a scene node, or at nothing.
|
|
172
|
-
*
|
|
173
|
-
* @param {{transform_global: {matrix: ArrayLike<number>}}} [node]
|
|
174
|
-
*/
|
|
175
|
-
attach_to(node?: {
|
|
176
|
-
transform_global: {
|
|
177
|
-
matrix: ArrayLike<number>;
|
|
178
|
-
};
|
|
179
|
-
}): void;
|
|
180
|
-
/**
|
|
181
|
-
* Copy a world matrix into {@link transform} and mark the row for re-upload.
|
|
182
|
-
*
|
|
183
|
-
* @param {ArrayLike<number>} matrix 16-element column-major
|
|
184
|
-
*/
|
|
185
|
-
set_transform(matrix: ArrayLike<number>): void;
|
|
186
|
-
/**
|
|
187
|
-
* Bind render channels to per-particle attributes of this emitter's effect, by attribute name.
|
|
188
|
-
* Channels left out of `channels` keep whatever they had; a channel that was never bound stays
|
|
189
|
-
* at {@link EMITTER_ATTRIBUTE_ABSENT}, which the passes read as "this emitter has no such
|
|
190
|
-
* attribute" — the render pass substitutes a default, the sort pass treats the particle as
|
|
191
|
-
* being at the origin.
|
|
192
|
-
*
|
|
193
|
-
* The record stores word offsets rather than names because that is what the render and sort
|
|
194
|
-
* passes index a particle record with; resolving here is the only place a name is involved.
|
|
195
|
-
*
|
|
196
|
-
* @param {Object<string,string>} channels channel name (see {@link EMITTER_RENDER_CHANNELS}) ->
|
|
197
|
-
* attribute name in the effect's layout
|
|
198
|
-
*/
|
|
199
|
-
bind_render(channels: {
|
|
200
|
-
[x: string]: string;
|
|
201
|
-
}): void;
|
|
202
|
-
/**
|
|
203
|
-
* This emitter as the value the emitter table stores — every field of
|
|
204
|
-
* {@link ../data/PARTICLE_EMITTER_STRUCT.js}, none omitted.
|
|
205
|
-
*
|
|
206
|
-
* Omitting one would not write zeros: the serializer skips absent fields, and table pages are
|
|
207
|
-
* recycled buffers, so a skipped field keeps whatever the previous tenant of the slot left
|
|
208
|
-
* there.
|
|
209
|
-
*
|
|
210
|
-
* @returns {object}
|
|
211
|
-
*/
|
|
212
|
-
to_record(): object;
|
|
213
|
-
/**
|
|
214
|
-
* @readonly
|
|
215
|
-
* @type {boolean}
|
|
216
|
-
*/
|
|
217
|
-
readonly isEmitter: boolean;
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=Emitter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/Emitter.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,sCAFU,MAAM,EAAE,CAIf;AAEH;;;;;;;;;;;;;;GAcG;AACH;IAqNI;;;;;;;;;;;;;;;;;OAiBG;IACH;QAbqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QAEN,SAAS,GAApC,UAAU,MAAM,CAAC;QACD,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACiD,MAAM,GAA7D;YAAC,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACd,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACO,YAAY,GAAvC,UAAU,MAAM,CAAC;QACU,QAAQ,GAAnC,UAAU,MAAM,CAAC;QACD,IAAI,GAApB,MAAM;QACJ,OAAO,CAoDnB;IAvRD;;;;;;OAMG;IACH,IAFU,MAAM,CAER;IAER;;;;OAIG;IACH,QAFU;QAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,eAAe,CAAA;KAAC,CAE/H;IAEP;;;;;;OAMG;IACH,WAFU;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAErI;IAEV;;;OAGG;IACH,WAFU,YAAY,CAEiB;IAEvC;;;;;;;;OAQG;IACH,MAFU,MAAM,CAEP;IAET;;;;OAIG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,cAFU,YAAY,CAEwB;IAE9C;;;OAGG;IACH,UAFU,YAAY,CAEc;IAEpC,+FAA+F;IAC/F,iBADW,MAAM,CAC0B;IAC3C,gDAAgD;IAChD,aADW,MAAM,CACsB;IACvC,uDAAuD;IACvD,cADW,MAAM,CACuB;IACxC,+DAA+D;IAC/D,iBADW,MAAM,CAC0B;IAC3C,gEAAgE;IAChE,cADW,MAAM,CACuB;IACxC,sFAAsF;IACtF,iBADW,MAAM,CAC0B;IAE3C;;;;;;OAMG;IACH,MAFU;QAAC,gBAAgB,EAAE;YAAC,MAAM,EAAE,UAAU,MAAM,CAAC,CAAA;SAAC,CAAA;KAAC,GAAC,SAAS,CAE9D;IAEL;;;;;OAKG;IACH,OAFU,OAAO,CAEJ;IAEb;;;;OAIG;IACH,iBAFW;QAAC,gBAAgB,EAAE;YAAC,MAAM,EAAE,UAAU,MAAM,CAAC,CAAA;SAAC,CAAA;KAAC,QAIzD;IAED;;;;OAIG;IACH,sBAFW,UAAU,MAAM,CAAC,QAO3B;IAED;;;;;;;;;;;;OAYG;IACH;YAHkB,MAAM,GAAC,MAAM;aA2B9B;IAED;;;;;;;;;OASG;IACH,aAFa,MAAM,CAiClB;IAyEL;;;OAGG;IACH,oBAFU,OAAO,CAEU;CAN1B"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CPU-side spawn scheduling. Each frame it turns per-emitter spawn rates (and the cull/sleep state)
|
|
3
|
-
* into a flat list of spawn requests (packed emitter id + batch fraction per particle to create,
|
|
4
|
-
* see {@link spawn_request_pack}) that the emit pass consumes. Emitters are few and CPU-authored,
|
|
5
|
-
* so deciding *how many* to spawn on the CPU is cheap and keeps the GPU emit pass a simple
|
|
6
|
-
* "one thread per new particle".
|
|
7
|
-
*
|
|
8
|
-
* Sleep-when-culled: a culled emitter accumulates sleep time and spawns nothing. When it becomes
|
|
9
|
-
* visible again it emits a bounded catch-up burst approximating the spawns it missed, mirroring the
|
|
10
|
-
* catch-up in meep's ParticularEngine (but capped so a long occlusion can't spike the pool).
|
|
11
|
-
*
|
|
12
|
-
* State is keyed by {@link Emitter#id}, not by position in the emitter array: ids are stable and
|
|
13
|
-
* sparse, positions are neither, and a positional key would silently hand a new emitter the
|
|
14
|
-
* accumulator and sleep debt of whichever one used to sit at its index.
|
|
15
|
-
*/
|
|
16
|
-
export class ParticleSpawnScheduler {
|
|
17
|
-
/**
|
|
18
|
-
* @param {object} [options]
|
|
19
|
-
* @param {number} [options.max_catchup_seconds] cap on how much missed time a wake burst covers
|
|
20
|
-
*/
|
|
21
|
-
constructor({ max_catchup_seconds }?: {
|
|
22
|
-
max_catchup_seconds?: number;
|
|
23
|
-
});
|
|
24
|
-
/**
|
|
25
|
-
* Cap on how much missed time a wake-up burst covers, in seconds.
|
|
26
|
-
* @type {number}
|
|
27
|
-
*/
|
|
28
|
-
max_catchup_seconds: number;
|
|
29
|
-
/**
|
|
30
|
-
* Emitter id -> its bookkeeping.
|
|
31
|
-
* @type {Map<number, ParticleSpawnState>}
|
|
32
|
-
*/
|
|
33
|
-
state: Map<number, ParticleSpawnState>;
|
|
34
|
-
/**
|
|
35
|
-
* Drop bookkeeping for an emitter that is no longer registered, so a later emitter reusing that
|
|
36
|
-
* table row starts from zero instead of inheriting a stranger's accumulator.
|
|
37
|
-
*
|
|
38
|
-
* @param {number} id
|
|
39
|
-
*/
|
|
40
|
-
forget(id: number): void;
|
|
41
|
-
/**
|
|
42
|
-
* Produce this frame's spawn requests.
|
|
43
|
-
*
|
|
44
|
-
* @param {Iterable<import("./Emitter.js").Emitter>} emitters the live emitters
|
|
45
|
-
* @param {number} dt seconds
|
|
46
|
-
* @param {(emitter: import("./Emitter.js").Emitter) => boolean} [is_visible] cull predicate
|
|
47
|
-
* (default: all visible)
|
|
48
|
-
* @param {number} [capacity] optional hard cap on total requests this frame
|
|
49
|
-
* @returns {Uint32Array} flat list of packed spawn requests (emitter id + batch fraction),
|
|
50
|
-
* one per particle to spawn — see {@link spawn_request_pack}
|
|
51
|
-
*/
|
|
52
|
-
tick(emitters: Iterable<import("./Emitter.js").Emitter>, dt: number, is_visible?: (emitter: import("./Emitter.js").Emitter) => boolean, capacity?: number): Uint32Array;
|
|
53
|
-
#private;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Per-emitter spawn bookkeeping, carried across frames.
|
|
57
|
-
*/
|
|
58
|
-
declare class ParticleSpawnState {
|
|
59
|
-
/**
|
|
60
|
-
* Fractional particles owed. A rate of 0.5/s at 60fps owes 1/120 of a particle per frame; the
|
|
61
|
-
* whole part is emitted and the remainder carried, so the emitter fires once every two seconds
|
|
62
|
-
* rather than never.
|
|
63
|
-
* @type {number}
|
|
64
|
-
*/
|
|
65
|
-
accumulator: number;
|
|
66
|
-
/**
|
|
67
|
-
* Seconds spent culled since the emitter was last visible.
|
|
68
|
-
* @type {number}
|
|
69
|
-
*/
|
|
70
|
-
sleep_time: number;
|
|
71
|
-
/**
|
|
72
|
-
* @type {boolean}
|
|
73
|
-
*/
|
|
74
|
-
was_visible: boolean;
|
|
75
|
-
}
|
|
76
|
-
export {};
|
|
77
|
-
//# sourceMappingURL=ParticleSpawnScheduler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleSpawnScheduler.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;GAcG;AACH;IAcI;;;OAGG;IACH;QAF4B,mBAAmB,GAApC,MAAM;OAIhB;IAlBD;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,OAFU,IAAI,MAAM,EAAE,kBAAkB,CAAC,CAEvB;IA2BlB;;;;;OAKG;IACH,WAFW,MAAM,QAIhB;IAED;;;;;;;;;;OAUG;IACH,eARW,SAAS,OAAO,cAAc,EAAE,OAAO,CAAC,MACxC,MAAM,yBACI,OAAO,cAAc,EAAE,OAAO,KAAK,OAAO,aAEpD,MAAM,GACJ,WAAW,CA6CvB;;CACJ;AA9ID;;GAEG;AACH;IACI;;;;;OAKG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;OAEG;IACH,aAFU,OAAO,CAEE;CACtB"}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PARTICLE_PROGRAM_CODE_BASE_WORD,
|
|
3
|
-
PARTICLE_PROGRAM_HEADER_WORDS,
|
|
4
|
-
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
5
|
-
} from "../ParticleConstants.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Packs many compiled {@link ../isa/ParticleProgram.js} programs into one shared buffer — a header,
|
|
9
|
-
* every program's constant pool, then every program's instruction words — and hands back the
|
|
10
|
-
* offsets each emitter records.
|
|
11
|
-
*
|
|
12
|
-
* Data before code, behind a four-word header whose first word says where the code starts: the VM
|
|
13
|
-
* reads both sections through one binding (a storage buffer per stage is not free, and code and
|
|
14
|
-
* constants are read together), and an emitter's constant pool sits next to the pools of the
|
|
15
|
-
* programs it shares a wave with.
|
|
16
|
-
*
|
|
17
|
-
* Because VM instructions carry no absolute code addresses (control flow is branchless) and
|
|
18
|
-
* constant references are program-local (the VM adds the emitter's `constant_offset`), programs
|
|
19
|
-
* can be concatenated at any offset. INIT and UPDATE sections are laid out back-to-back per program.
|
|
20
|
-
*/
|
|
21
|
-
export class ProgramArena {
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Flat instruction words, every program's INIT and UPDATE sections concatenated.
|
|
25
|
-
* @type {number[]}
|
|
26
|
-
*/
|
|
27
|
-
instruction_words = [];
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Flat constant words (f32 bit patterns), every program's pool concatenated.
|
|
31
|
-
* @type {number[]}
|
|
32
|
-
*/
|
|
33
|
-
constant_words = [];
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Running instruction index — INIT/UPDATE offsets are in these units.
|
|
37
|
-
* @type {number}
|
|
38
|
-
*/
|
|
39
|
-
instruction_count = 0;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Running constant word index — the pool is addressed by word, so a scalar literal costs one
|
|
43
|
-
* rather than the four a `vec4` entry used to.
|
|
44
|
-
* @type {number}
|
|
45
|
-
*/
|
|
46
|
-
constant_word_count = 0;
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Content key -> the placement the first identical program got.
|
|
50
|
-
* @type {Map<string, {init_offset: number, init_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}>}
|
|
51
|
-
*/
|
|
52
|
-
programs = new Map();
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Number of distinct programs in the arena — and therefore the number of buckets the
|
|
56
|
-
* simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
|
|
57
|
-
* @returns {number}
|
|
58
|
-
*/
|
|
59
|
-
get program_count() {
|
|
60
|
-
return this.programs.size;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Append a program, or hand back the placement an identical one already has.
|
|
65
|
-
*
|
|
66
|
-
* Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
|
|
67
|
-
* separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
|
|
68
|
-
* they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
|
|
69
|
-
* the words is not a cost worth avoiding.
|
|
70
|
-
*
|
|
71
|
-
* The `program_id` it returns is what the emitter record carries and what the coherence pass
|
|
72
|
-
* buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
|
|
73
|
-
* emitters running one shared effect would become N buckets, each padded to a whole workgroup,
|
|
74
|
-
* which both wastes lanes and splits a run that was already program-coherent.
|
|
75
|
-
*
|
|
76
|
-
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
77
|
-
* @returns {{init_offset: number, init_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
|
|
78
|
-
*/
|
|
79
|
-
add(program) {
|
|
80
|
-
const key = program_content_key(program);
|
|
81
|
-
|
|
82
|
-
const existing = this.programs.get(key);
|
|
83
|
-
if (existing !== undefined) {
|
|
84
|
-
return existing;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const init_offset = this.instruction_count;
|
|
88
|
-
this.#append_instructions(program.init);
|
|
89
|
-
const init_count = program.init_instruction_count;
|
|
90
|
-
|
|
91
|
-
const update_offset = this.instruction_count;
|
|
92
|
-
this.#append_instructions(program.update);
|
|
93
|
-
const update_count = program.update_instruction_count;
|
|
94
|
-
|
|
95
|
-
const constant_offset = this.constant_word_count;
|
|
96
|
-
const constant_u32 = new Uint32Array(program.constants.buffer, program.constants.byteOffset, program.constants.length);
|
|
97
|
-
for (let i = 0; i < constant_u32.length; i++) {
|
|
98
|
-
this.constant_words.push(constant_u32[i]);
|
|
99
|
-
}
|
|
100
|
-
this.constant_word_count += program.constant_word_count;
|
|
101
|
-
|
|
102
|
-
const placement = {
|
|
103
|
-
init_offset, init_count, update_offset, update_count, constant_offset,
|
|
104
|
-
program_id: this.programs.size,
|
|
105
|
-
};
|
|
106
|
-
this.programs.set(key, placement);
|
|
107
|
-
|
|
108
|
-
return placement;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** @param {Uint32Array} words */
|
|
112
|
-
#append_instructions(words) {
|
|
113
|
-
for (let i = 0; i < words.length; i++) {
|
|
114
|
-
this.instruction_words.push(words[i]);
|
|
115
|
-
}
|
|
116
|
-
this.instruction_count += words.length / PARTICLE_VM_INSTRUCTION_WORDS;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* The packed buffer: `[header][constants][code]`. Word {@link PARTICLE_PROGRAM_CODE_BASE_WORD} of
|
|
121
|
-
* the header is the word index the code starts at, which moves every time a program's constants
|
|
122
|
-
* are appended — the emitter records never carry it, they carry offsets into each section.
|
|
123
|
-
*
|
|
124
|
-
* @returns {Uint32Array}
|
|
125
|
-
*/
|
|
126
|
-
build_program_buffer() {
|
|
127
|
-
const constants = this.constant_words;
|
|
128
|
-
const code = this.instruction_words;
|
|
129
|
-
|
|
130
|
-
const code_base = PARTICLE_PROGRAM_HEADER_WORDS + constants.length;
|
|
131
|
-
const buffer = new Uint32Array(code_base + code.length);
|
|
132
|
-
|
|
133
|
-
buffer[PARTICLE_PROGRAM_CODE_BASE_WORD] = code_base;
|
|
134
|
-
buffer.set(constants, PARTICLE_PROGRAM_HEADER_WORDS);
|
|
135
|
-
buffer.set(code, code_base);
|
|
136
|
-
|
|
137
|
-
return buffer;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* A key that is equal exactly when two programs would execute identically.
|
|
143
|
-
*
|
|
144
|
-
* Constants are keyed by their `u32` bit patterns rather than their float values, so `-0` and `0`
|
|
145
|
-
* — which stringify the same but differ in the buffer the shader reads — stay distinct.
|
|
146
|
-
*
|
|
147
|
-
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
148
|
-
* @returns {string}
|
|
149
|
-
*/
|
|
150
|
-
function program_content_key(program) {
|
|
151
|
-
const constants = program.constants;
|
|
152
|
-
const constant_u32 = new Uint32Array(constants.buffer, constants.byteOffset, constants.length);
|
|
153
|
-
|
|
154
|
-
return `${program.register_count}|${program.init.join(",")}|${program.update.join(",")}|${constant_u32.join(",")}`;
|
|
155
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The emitter table as the `array<u32>` a shader binds, built on the CPU.
|
|
3
|
-
*
|
|
4
|
-
* For the WGSL emulator: on a device the rows get there through the database's upload dispatch, and
|
|
5
|
-
* the software device records dispatches without running them, so a spec that wants to run
|
|
6
|
-
* `shader_particle_emit` (or simulate, or sort, or the bucket histogram) over real emitters has no
|
|
7
|
-
* other way to hand it their bytes. See
|
|
8
|
-
* {@link ../../buffer/table/gpu_database_emulator_image.js}.
|
|
9
|
-
*
|
|
10
|
-
* @param {Iterable<import("./Emitter.js").Emitter>} emitters registered emitters — each one's
|
|
11
|
-
* {@link Emitter#id} is the row it lands on, so the layout matches what the shaders index
|
|
12
|
-
* @returns {Uint32Array}
|
|
13
|
-
*/
|
|
14
|
-
export function emitter_database_image(emitters: Iterable<import("./Emitter.js").Emitter>): Uint32Array;
|
|
15
|
-
//# sourceMappingURL=emitter_database_image.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"emitter_database_image.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/emitter_database_image.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,iDAJW,SAAS,OAAO,cAAc,EAAE,OAAO,CAAC,GAEtC,WAAW,CAMvB"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @param {number} emitter_index
|
|
3
|
-
* @param {number} fraction in [0, 1]
|
|
4
|
-
* @returns {number} packed u32
|
|
5
|
-
*/
|
|
6
|
-
export function spawn_request_pack(emitter_index: number, fraction: number): number;
|
|
7
|
-
/**
|
|
8
|
-
* @param {number} packed
|
|
9
|
-
* @returns {number} emitter index
|
|
10
|
-
*/
|
|
11
|
-
export function spawn_request_emitter(packed: number): number;
|
|
12
|
-
/**
|
|
13
|
-
* @param {number} packed
|
|
14
|
-
* @returns {number} batch fraction in [0, 1]
|
|
15
|
-
*/
|
|
16
|
-
export function spawn_request_fraction(packed: number): number;
|
|
17
|
-
/**
|
|
18
|
-
* Encoding of one spawn request as a single `u32`.
|
|
19
|
-
*
|
|
20
|
-
* The emit pass needs two things per request: which emitter owns the new particle, and the
|
|
21
|
-
* particle's fraction within its emitter's batch this frame (`i / spawn_count`, the SPAWN_FRACTION
|
|
22
|
-
* VM builtin — used to spread a batch along spawn curves). Packing both into the one `u32` keeps
|
|
23
|
-
* the request stream a single buffer with unchanged upload paths.
|
|
24
|
-
*
|
|
25
|
-
* Layout: low 16 bits = emitter index, high 16 bits = batch fraction quantized to [0, 0xFFFF].
|
|
26
|
-
* The WGSL emit shader mirrors this exactly (shader_particle_emit).
|
|
27
|
-
*/
|
|
28
|
-
/** @type {number} */
|
|
29
|
-
export const SPAWN_REQUEST_EMITTER_MASK: number;
|
|
30
|
-
/** @type {number} */
|
|
31
|
-
export const SPAWN_REQUEST_FRACTION_SHIFT: number;
|
|
32
|
-
/** @type {number} */
|
|
33
|
-
export const SPAWN_REQUEST_FRACTION_MAX: number;
|
|
34
|
-
//# sourceMappingURL=spawn_request_encoding.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spawn_request_encoding.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/spawn_request_encoding.js"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,kDAJW,MAAM,YACN,MAAM,GACJ,MAAM,CASlB;AAED;;;GAGG;AACH,8CAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;GAGG;AACH,+CAHW,MAAM,GACJ,MAAM,CAIlB;AAjDD;;;;;;;;;;GAUG;AAEH,qBAAqB;AACrB,yCADW,MAAM,CACgC;AAEjD,qBAAqB;AACrB,2CADW,MAAM,CAC8B;AAE/C,qBAAqB;AACrB,yCADW,MAAM,CACgC"}
|