@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,203 +1,229 @@
|
|
|
1
|
-
import { SoftwareGPUDevice } from "../../device/mock/SoftwareGPUDevice.js";
|
|
2
|
-
import { GraphicsContext } from "../GraphicsContext.js";
|
|
3
|
-
import { gpu_database_words } from "../buffer/table/gpu_database_words.js";
|
|
4
|
-
import { Scene } from "../scene/Scene.js";
|
|
5
|
-
import { SceneManager } from "../scene/SceneManager.js";
|
|
6
|
-
import { PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
|
|
7
|
-
import { PARTICLE_EMITTER_STATE_DESCRIPTOR } from "./data/PARTICLE_DATABASE_SPEC.js";
|
|
8
|
-
import { PARTICLE_EMITTER_STATE_STRUCT } from "./data/PARTICLE_EMITTER_STATE.js";
|
|
9
|
-
import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
|
|
10
|
-
import { ParticleEmitter } from "./runtime/ParticleEmitter.js";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Shared scaffolding for the particle specs that run shaders under the WGSL emulator.
|
|
14
|
-
*
|
|
15
|
-
* An emitter is a scene node, so a shader that reads one needs two databases laid out the way the
|
|
16
|
-
* GPU would hold them: the scene's (for the node's world matrix) and the particle system's (for the
|
|
17
|
-
* emitter row). Both are real `GPUDatabase`s on the software device, filled through the real
|
|
18
|
-
* {@link GPUSceneContext} and {@link EmitterRegistry}, and serialised by
|
|
19
|
-
* {@link gpu_database_words} — so a spec exercises the actual writers, and the only thing standing
|
|
20
|
-
* in for the GPU is the upload.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @typedef {object} ParticleSceneFixture
|
|
25
|
-
* @property {SoftwareGPUDevice} device
|
|
26
|
-
* @property {GraphicsContext} graphics
|
|
27
|
-
* @property {Scene} scene
|
|
28
|
-
* @property {import("../scene/GPUSceneContext.js").GPUSceneContext} scene_context
|
|
29
|
-
* @property {EmitterRegistry} registry
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* A scene with a GPU context and an emitter registry, both on a fresh software device.
|
|
34
|
-
*
|
|
35
|
-
* @returns {ParticleSceneFixture}
|
|
36
|
-
*/
|
|
37
|
-
export function particle_scene_fixture() {
|
|
38
|
-
const device = new SoftwareGPUDevice({ requiredFeatures: ["subgroups"] });
|
|
39
|
-
const graphics = new GraphicsContext(device);
|
|
40
|
-
const scene = new Scene();
|
|
41
|
-
const scene_context = new SceneManager(graphics).obtain(scene);
|
|
42
|
-
const registry = new EmitterRegistry(device);
|
|
43
|
-
|
|
44
|
-
return { device, graphics, scene, scene_context, registry };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Put an emitter in the scene and register it, the way the system does: the node gets its
|
|
49
|
-
* `transforms` row from the scene context's sweep, and the emitter record points at that row.
|
|
50
|
-
*
|
|
51
|
-
* @param {ParticleSceneFixture} fixture
|
|
52
|
-
* @param {ParticleEmitter|object} config a {@link ParticleEmitter}, or what {@link ParticleEmitter.from} accepts
|
|
53
|
-
* @param {import("../scene/Node3D.js").Node3D} [parent] node to hang the emitter under, itself already in the scene
|
|
54
|
-
* @returns {ParticleEmitter}
|
|
55
|
-
*/
|
|
56
|
-
export function place_emitter(fixture, config, parent) {
|
|
57
|
-
const emitter = config.isParticleEmitter === true ? config : ParticleEmitter.from(config);
|
|
58
|
-
|
|
59
|
-
if (parent !== undefined) {
|
|
60
|
-
parent.addChild(emitter);
|
|
61
|
-
parent.updateMatrices();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
fixture.scene.add(emitter);
|
|
65
|
-
fixture.scene_context.build();
|
|
66
|
-
|
|
67
|
-
const transform_row = fixture.scene_context.id_mapping.get(emitter.id);
|
|
68
|
-
|
|
69
|
-
fixture.registry.add(emitter, transform_row);
|
|
70
|
-
|
|
71
|
-
return emitter;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
return
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* @
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* @returns {{
|
|
106
|
-
*/
|
|
107
|
-
export function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* @
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
*
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
1
|
+
import { SoftwareGPUDevice } from "../../device/mock/SoftwareGPUDevice.js";
|
|
2
|
+
import { GraphicsContext } from "../GraphicsContext.js";
|
|
3
|
+
import { gpu_database_words } from "../buffer/table/gpu_database_words.js";
|
|
4
|
+
import { Scene } from "../scene/Scene.js";
|
|
5
|
+
import { SceneManager } from "../scene/SceneManager.js";
|
|
6
|
+
import { PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
|
|
7
|
+
import { PARTICLE_EMITTER_STATE_DESCRIPTOR } from "./data/PARTICLE_DATABASE_SPEC.js";
|
|
8
|
+
import { PARTICLE_EMITTER_STATE_STRUCT } from "./data/PARTICLE_EMITTER_STATE.js";
|
|
9
|
+
import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
|
|
10
|
+
import { ParticleEmitter } from "./runtime/ParticleEmitter.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Shared scaffolding for the particle specs that run shaders under the WGSL emulator.
|
|
14
|
+
*
|
|
15
|
+
* An emitter is a scene node, so a shader that reads one needs two databases laid out the way the
|
|
16
|
+
* GPU would hold them: the scene's (for the node's world matrix) and the particle system's (for the
|
|
17
|
+
* emitter row). Both are real `GPUDatabase`s on the software device, filled through the real
|
|
18
|
+
* {@link GPUSceneContext} and {@link EmitterRegistry}, and serialised by
|
|
19
|
+
* {@link gpu_database_words} — so a spec exercises the actual writers, and the only thing standing
|
|
20
|
+
* in for the GPU is the upload.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {object} ParticleSceneFixture
|
|
25
|
+
* @property {SoftwareGPUDevice} device
|
|
26
|
+
* @property {GraphicsContext} graphics
|
|
27
|
+
* @property {Scene} scene
|
|
28
|
+
* @property {import("../scene/GPUSceneContext.js").GPUSceneContext} scene_context
|
|
29
|
+
* @property {EmitterRegistry} registry
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A scene with a GPU context and an emitter registry, both on a fresh software device.
|
|
34
|
+
*
|
|
35
|
+
* @returns {ParticleSceneFixture}
|
|
36
|
+
*/
|
|
37
|
+
export function particle_scene_fixture() {
|
|
38
|
+
const device = new SoftwareGPUDevice({ requiredFeatures: ["subgroups"] });
|
|
39
|
+
const graphics = new GraphicsContext(device);
|
|
40
|
+
const scene = new Scene();
|
|
41
|
+
const scene_context = new SceneManager(graphics).obtain(scene);
|
|
42
|
+
const registry = new EmitterRegistry(device);
|
|
43
|
+
|
|
44
|
+
return { device, graphics, scene, scene_context, registry };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Put an emitter in the scene and register it, the way the system does: the node gets its
|
|
49
|
+
* `transforms` row from the scene context's sweep, and the emitter record points at that row.
|
|
50
|
+
*
|
|
51
|
+
* @param {ParticleSceneFixture} fixture
|
|
52
|
+
* @param {ParticleEmitter|object} config a {@link ParticleEmitter}, or what {@link ParticleEmitter.from} accepts
|
|
53
|
+
* @param {import("../scene/Node3D.js").Node3D} [parent] node to hang the emitter under, itself already in the scene
|
|
54
|
+
* @returns {ParticleEmitter}
|
|
55
|
+
*/
|
|
56
|
+
export function place_emitter(fixture, config, parent) {
|
|
57
|
+
const emitter = config.isParticleEmitter === true ? config : ParticleEmitter.from(config);
|
|
58
|
+
|
|
59
|
+
if (parent !== undefined) {
|
|
60
|
+
parent.addChild(emitter);
|
|
61
|
+
parent.updateMatrices();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fixture.scene.add(emitter);
|
|
65
|
+
fixture.scene_context.build();
|
|
66
|
+
|
|
67
|
+
const transform_row = fixture.scene_context.id_mapping.get(emitter.id);
|
|
68
|
+
|
|
69
|
+
fixture.registry.add(emitter, transform_row);
|
|
70
|
+
|
|
71
|
+
return emitter;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* What the fixture's registry assigned an emitter: its table row, its generation, the heap
|
|
76
|
+
* placement of its program, the atlas patch. The emitter carries none of it — see
|
|
77
|
+
* {@link ./runtime/GPUParticleEmitterContext.js} — so a spec that wants the row a particle header
|
|
78
|
+
* should carry asks the registry, the way the passes' own callers do.
|
|
79
|
+
*
|
|
80
|
+
* @param {ParticleSceneFixture} fixture
|
|
81
|
+
* @param {ParticleEmitter} emitter
|
|
82
|
+
* @returns {import("./runtime/GPUParticleEmitterContext.js").GPUParticleEmitterContext}
|
|
83
|
+
*/
|
|
84
|
+
export function emitter_context(fixture, emitter) {
|
|
85
|
+
return fixture.registry.context(emitter);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The emitter table row an emitter was given — {@link emitter_context}`.row`, which specs index
|
|
90
|
+
* per-emitter buffers with often enough to be worth naming.
|
|
91
|
+
*
|
|
92
|
+
* @param {ParticleSceneFixture} fixture
|
|
93
|
+
* @param {ParticleEmitter} emitter
|
|
94
|
+
* @returns {number}
|
|
95
|
+
*/
|
|
96
|
+
export function emitter_row(fixture, emitter) {
|
|
97
|
+
return emitter_context(fixture, emitter).row;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The two databases as the `array<u32>` buffers the particle shaders bind. Call after the last
|
|
102
|
+
* change to either; it flushes both.
|
|
103
|
+
*
|
|
104
|
+
* @param {ParticleSceneFixture} fixture
|
|
105
|
+
* @returns {{scene_database: Uint32Array, emitter_database: Uint32Array}}
|
|
106
|
+
*/
|
|
107
|
+
export function particle_database_words(fixture) {
|
|
108
|
+
fixture.scene_context.build();
|
|
109
|
+
fixture.registry.flush();
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
scene_database: gpu_database_words(fixture.scene_context.scene_database, fixture.graphics),
|
|
113
|
+
emitter_database: gpu_database_words(fixture.registry.database, fixture.graphics),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* An `array<atomic<u32>>` the way the emulator models one: a `{value}` object per word.
|
|
119
|
+
*
|
|
120
|
+
* @param {number} length
|
|
121
|
+
* @param {number} [fill]
|
|
122
|
+
* @returns {{value: number}[]}
|
|
123
|
+
*/
|
|
124
|
+
export function atomic_words(length, fill = 0) {
|
|
125
|
+
return Array.from({ length }, () => ({ value: fill }));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* A counters buffer, every slot zero.
|
|
130
|
+
*
|
|
131
|
+
* @returns {{value: number}[]}
|
|
132
|
+
*/
|
|
133
|
+
export function particle_counters() {
|
|
134
|
+
return atomic_words(PARTICLE_COUNTER_COUNT);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Where a row of the `emitter_state` table sits in the serialised database, in words — the same
|
|
139
|
+
* arithmetic the table's generated readers do.
|
|
140
|
+
*
|
|
141
|
+
* @param {Uint32Array} emitter_database the database as {@link particle_database_words} lays it out
|
|
142
|
+
* @param {number} row
|
|
143
|
+
* @returns {number}
|
|
144
|
+
*/
|
|
145
|
+
function emitter_state_base(emitter_database, row) {
|
|
146
|
+
const descriptor = PARTICLE_EMITTER_STATE_DESCRIPTOR;
|
|
147
|
+
const per_page = descriptor.elements_per_page;
|
|
148
|
+
const page_address = emitter_database[descriptor.page_lookup_address + Math.floor(row / per_page)];
|
|
149
|
+
|
|
150
|
+
if (page_address === 0xffffffff) {
|
|
151
|
+
throw new Error(`emitter state row ${row} is on a page the database has not allocated`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return page_address + descriptor.page_header_words + (row % per_page) * (descriptor.packed_element_size_bytes / 4);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** @type {Object<string, number>} word offset of each state field within its row */
|
|
158
|
+
const STATE_FIELD_WORD = Object.fromEntries(
|
|
159
|
+
PARTICLE_EMITTER_STATE_STRUCT.fields.map((field) => [field.name, field.offset / 4]),
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* One emitter's GPU-owned state, read back out of the serialised database.
|
|
164
|
+
*
|
|
165
|
+
* @param {Uint32Array} emitter_database
|
|
166
|
+
* @param {number} row
|
|
167
|
+
* @returns {{generation: number, accumulator: number, age: number, sleep: number, pending: number}}
|
|
168
|
+
*/
|
|
169
|
+
export function emitter_state_read(emitter_database, row) {
|
|
170
|
+
const base = emitter_state_base(emitter_database, row);
|
|
171
|
+
const floats = new Float32Array(emitter_database.buffer, emitter_database.byteOffset, emitter_database.length);
|
|
172
|
+
|
|
173
|
+
return {
|
|
174
|
+
generation: emitter_database[base + STATE_FIELD_WORD.generation],
|
|
175
|
+
accumulator: floats[base + STATE_FIELD_WORD.accumulator],
|
|
176
|
+
age: floats[base + STATE_FIELD_WORD.age],
|
|
177
|
+
sleep: floats[base + STATE_FIELD_WORD.sleep],
|
|
178
|
+
pending: emitter_database[base + STATE_FIELD_WORD.pending],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Overwrite some of one emitter's state fields in the serialised database — what a previous tick
|
|
184
|
+
* would have left there.
|
|
185
|
+
*
|
|
186
|
+
* @param {Uint32Array} emitter_database
|
|
187
|
+
* @param {number} row
|
|
188
|
+
* @param {{generation?: number, accumulator?: number, age?: number, sleep?: number, pending?: number}} fields
|
|
189
|
+
*/
|
|
190
|
+
export function emitter_state_write(emitter_database, row, fields) {
|
|
191
|
+
const base = emitter_state_base(emitter_database, row);
|
|
192
|
+
const floats = new Float32Array(emitter_database.buffer, emitter_database.byteOffset, emitter_database.length);
|
|
193
|
+
|
|
194
|
+
if (fields.generation !== undefined) emitter_database[base + STATE_FIELD_WORD.generation] = fields.generation;
|
|
195
|
+
if (fields.accumulator !== undefined) floats[base + STATE_FIELD_WORD.accumulator] = fields.accumulator;
|
|
196
|
+
if (fields.age !== undefined) floats[base + STATE_FIELD_WORD.age] = fields.age;
|
|
197
|
+
if (fields.sleep !== undefined) floats[base + STATE_FIELD_WORD.sleep] = fields.sleep;
|
|
198
|
+
if (fields.pending !== undefined) emitter_database[base + STATE_FIELD_WORD.pending] = fields.pending;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* A `{count, elements}` collection as the emulator binds one — the shape both the emitter tick's
|
|
203
|
+
* output and the emit pass's input take.
|
|
204
|
+
*
|
|
205
|
+
* @param {number} count
|
|
206
|
+
* @param {ArrayLike<number>} [elements] defaults to `count` zeros
|
|
207
|
+
* @returns {{count: number, elements: Uint32Array}}
|
|
208
|
+
*/
|
|
209
|
+
export function u32_collection(count, elements) {
|
|
210
|
+
return { count, elements: elements === undefined ? new Uint32Array(count) : Uint32Array.from(elements) };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* The CSDLDF scan's stand-in: inclusive prefix sums over a collection's elements, in place, the
|
|
215
|
+
* count left alone.
|
|
216
|
+
*
|
|
217
|
+
* @param {{count: number, elements: Uint32Array}} collection
|
|
218
|
+
* @returns {{count: number, elements: Uint32Array}} the same object
|
|
219
|
+
*/
|
|
220
|
+
export function inclusive_scan(collection) {
|
|
221
|
+
let running = 0;
|
|
222
|
+
|
|
223
|
+
for (let i = 0; i < collection.count; i++) {
|
|
224
|
+
running += collection.elements[i];
|
|
225
|
+
collection.elements[i] = running;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return collection;
|
|
229
|
+
}
|
|
@@ -12,15 +12,21 @@
|
|
|
12
12
|
* particles of a removed emitter — which carry its generation — cannot be mistaken for the new
|
|
13
13
|
* tenant's. The simulate pass kills them on sight; see {@link ../data/particle_header.js}.
|
|
14
14
|
*
|
|
15
|
+
* **None of that bookkeeping is on the emitter.** An emitter is a scene node and a description of
|
|
16
|
+
* an effect, with nothing in it that depends on a device; the row, the generation, the program
|
|
17
|
+
* placement, the node's `transforms` row and the atlas patch are a
|
|
18
|
+
* {@link ./GPUParticleEmitterContext.js} this registry holds against the emitter and hands out
|
|
19
|
+
* through {@link EmitterRegistry#context}. Registering an emitter creates one, removing it destroys
|
|
20
|
+
* one, and an emitter with no context here is an emitter this registry does not have.
|
|
21
|
+
*
|
|
15
22
|
* The GPU-owned per-emitter state is the database's second table, claimed and released here at the
|
|
16
23
|
* emitter's row and never written by the CPU otherwise.
|
|
17
24
|
*
|
|
18
25
|
* Programs are the one thing NOT in the database: they are variable-length and shared, so they go
|
|
19
|
-
* into a packed {@link
|
|
20
|
-
*
|
|
21
|
-
* program id, which is what the simulation-order bucketing buckets on
|
|
22
|
-
*
|
|
23
|
-
* compacting them would mean rewriting the whole table to save a few hundred words.
|
|
26
|
+
* into a packed {@link ProgramHeap} buffer and the emitter record carries offsets into it. The heap
|
|
27
|
+
* is content-deduplicated and reference-counted — two emitters compiled from the same graph land on
|
|
28
|
+
* one program id, which is what the simulation-order bucketing buckets on, and the last emitter of
|
|
29
|
+
* an effect is what releases it.
|
|
24
30
|
*/
|
|
25
31
|
export class EmitterRegistry {
|
|
26
32
|
/**
|
|
@@ -33,11 +39,11 @@ export class EmitterRegistry {
|
|
|
33
39
|
database: GPUDatabase;
|
|
34
40
|
/**
|
|
35
41
|
* Packed instruction + constant buffers for every distinct program in the set.
|
|
36
|
-
* @type {
|
|
42
|
+
* @type {ProgramHeap}
|
|
37
43
|
*/
|
|
38
|
-
|
|
44
|
+
programs: ProgramHeap;
|
|
39
45
|
/**
|
|
40
|
-
* The live emitters, in no particular order — {@link
|
|
46
|
+
* The live emitters, in no particular order — the row in {@link context} is the identity.
|
|
41
47
|
* @type {ParticleEmitter[]}
|
|
42
48
|
*/
|
|
43
49
|
emitters: ParticleEmitter[];
|
|
@@ -49,14 +55,17 @@ export class EmitterRegistry {
|
|
|
49
55
|
*/
|
|
50
56
|
by_row: ParticleEmitter[];
|
|
51
57
|
/**
|
|
52
|
-
* Whether {@link
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
58
|
+
* Whether {@link programs} has changed since {@link build_program} last packed it. The buffer is
|
|
59
|
+
* monolithic (a program is variable-length, so there is no table to page it into), so any change
|
|
60
|
+
* means re-uploading it whole — which is why the heap dedupes by content, and why this is
|
|
61
|
+
* separate from the per-row dirtiness the table tracks.
|
|
62
|
+
*
|
|
63
|
+
* Read off the heap's own version rather than kept as a flag: there is then no path that changes
|
|
64
|
+
* the programs and forgets to say so.
|
|
56
65
|
*
|
|
57
|
-
* @
|
|
66
|
+
* @returns {boolean}
|
|
58
67
|
*/
|
|
59
|
-
programs_dirty: boolean;
|
|
68
|
+
get programs_dirty(): boolean;
|
|
60
69
|
/**
|
|
61
70
|
* The emitter table.
|
|
62
71
|
* @returns {GPUTypedTable}
|
|
@@ -73,12 +82,37 @@ export class EmitterRegistry {
|
|
|
73
82
|
*/
|
|
74
83
|
get count(): number;
|
|
75
84
|
/**
|
|
76
|
-
* Number of distinct compiled programs
|
|
77
|
-
* pass histograms into.
|
|
78
|
-
*
|
|
85
|
+
* Number of distinct compiled programs registered.
|
|
79
86
|
* @returns {number}
|
|
80
87
|
*/
|
|
81
88
|
get program_count(): number;
|
|
89
|
+
/**
|
|
90
|
+
* Number of buckets the simulation-order coherence pass histograms into: every live program id
|
|
91
|
+
* is below it. See {@link ProgramHeap#program_id_capacity}.
|
|
92
|
+
*
|
|
93
|
+
* @returns {number}
|
|
94
|
+
*/
|
|
95
|
+
get program_id_capacity(): number;
|
|
96
|
+
/**
|
|
97
|
+
* Register slots the hungriest registered effect needs — a property of the whole set, since
|
|
98
|
+
* there is one simulate pipeline and it is chosen once. What a caller does with the number (pick
|
|
99
|
+
* a register backing, refuse the effect, warn an author) is the caller's; see
|
|
100
|
+
* {@link ProgramHeap#max_register_count}.
|
|
101
|
+
*
|
|
102
|
+
* @returns {number}
|
|
103
|
+
*/
|
|
104
|
+
get max_register_count(): number;
|
|
105
|
+
/**
|
|
106
|
+
* What this registry assigned an emitter: its table row, generation, program placement, the
|
|
107
|
+
* `transforms` row of its node and its atlas patch.
|
|
108
|
+
*
|
|
109
|
+
* `undefined` for an emitter this registry does not hold — which is the way to ask whether one
|
|
110
|
+
* is live, there being no `-1` on the emitter to read instead.
|
|
111
|
+
*
|
|
112
|
+
* @param {ParticleEmitter} emitter
|
|
113
|
+
* @returns {GPUParticleEmitterContext|undefined}
|
|
114
|
+
*/
|
|
115
|
+
context(emitter: ParticleEmitter): GPUParticleEmitterContext | undefined;
|
|
82
116
|
/**
|
|
83
117
|
* Register an emitter and give it a table row.
|
|
84
118
|
*
|
|
@@ -97,9 +131,30 @@ export class EmitterRegistry {
|
|
|
97
131
|
* them the next time it sees them. Retiring an emitter gently — spawn rate to zero, remove once
|
|
98
132
|
* its particles have died — remains available to an author who wants the tail to play out.
|
|
99
133
|
*
|
|
134
|
+
* The emitter itself comes out of this unchanged: what it loses is its context, which is
|
|
135
|
+
* everything being registered gave it. Its program goes with the context — the heap counts
|
|
136
|
+
* references, so an effect is only unpacked when its last emitter leaves.
|
|
137
|
+
*
|
|
100
138
|
* @param {ParticleEmitter} emitter
|
|
101
139
|
*/
|
|
102
140
|
remove(emitter: ParticleEmitter): void;
|
|
141
|
+
/**
|
|
142
|
+
* Give a registered emitter different bytecode to run: its old program loses a reference, the new
|
|
143
|
+
* one gains one, and its row is restaged with the new placement.
|
|
144
|
+
*
|
|
145
|
+
* This is the runtime edit the emitter table has always allowed and the program buffer used not
|
|
146
|
+
* to — an author reworking an effect in the editor changes the program of an emitter that is
|
|
147
|
+
* already live, and the effect it used to run goes away with the last emitter that ran it.
|
|
148
|
+
*
|
|
149
|
+
* The attribute {@link ../layout/ParticleLayout.js layout} is NOT part of this and must not
|
|
150
|
+
* change with it: particles already in flight are laid out the old way, and new bytecode reading
|
|
151
|
+
* them at new offsets would read somebody else's field. Re-laying-out an effect means new
|
|
152
|
+
* emitters.
|
|
153
|
+
*
|
|
154
|
+
* @param {ParticleEmitter} emitter
|
|
155
|
+
* @param {import("../isa/ParticleProgram.js").ParticleProgram} program
|
|
156
|
+
*/
|
|
157
|
+
set_program(emitter: ParticleEmitter, program: import("../isa/ParticleProgram.js").ParticleProgram): void;
|
|
103
158
|
/**
|
|
104
159
|
* Look up a live emitter by its table row.
|
|
105
160
|
*
|
|
@@ -115,21 +170,39 @@ export class EmitterRegistry {
|
|
|
115
170
|
* @param {number} transform_row
|
|
116
171
|
*/
|
|
117
172
|
set_transform_row(emitter: ParticleEmitter, transform_row: number): void;
|
|
173
|
+
/**
|
|
174
|
+
* Point an emitter's record at the patch its texture was packed into: uv offset `.xy`, uv scale
|
|
175
|
+
* `.zw`. The row is restaged on the next flush.
|
|
176
|
+
*
|
|
177
|
+
* For whoever owns the atlas to call, on registration and again after every repack — a repack
|
|
178
|
+
* moves every patch, and an emitter left holding the old one draws the wrong image.
|
|
179
|
+
*
|
|
180
|
+
* @param {ParticleEmitter} emitter
|
|
181
|
+
* @param {ArrayLike<number>} region [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
|
|
182
|
+
*/
|
|
183
|
+
set_atlas_region(emitter: ParticleEmitter, region: ArrayLike<number>): void;
|
|
118
184
|
/**
|
|
119
185
|
* Restage the table rows of every emitter whose fields have moved since the last flush.
|
|
120
186
|
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
187
|
+
* "Moved" is the node's own change counter: an emitter is restaged when its
|
|
188
|
+
* {@link ../../scene/Node3D.js Node3D#version} is not the one its row was staged from, or when
|
|
189
|
+
* something in its context changed. So an author marks an edited emitter the way they mark any
|
|
190
|
+
* edited node, with `needsUpdate = true`, and there is no second flag to forget.
|
|
191
|
+
*
|
|
192
|
+
* Cheap to call every frame: an emitter that has not changed costs one integer comparison, and
|
|
193
|
+
* the table coalesces repeated writes to one row within a frame anyway. Walks the context map
|
|
194
|
+
* rather than the emitter list so that a pass over the set is not also a lookup per emitter.
|
|
195
|
+
* Stages through the one module-static record, so a frame's restaging allocates nothing however
|
|
196
|
+
* many rows it touches.
|
|
124
197
|
*/
|
|
125
198
|
flush(): void;
|
|
126
199
|
/**
|
|
127
200
|
* The packed program buffer — header, constant pools, code — rebuilt whole.
|
|
128
201
|
*
|
|
129
|
-
* Call when {@link programs_dirty}; it
|
|
130
|
-
* variable-length, so there is no table to page it into), so this is a full rebuild — the
|
|
131
|
-
*
|
|
132
|
-
*
|
|
202
|
+
* Call when {@link programs_dirty}; it answers the flag. The buffer is monolithic (a program is
|
|
203
|
+
* variable-length, so there is no table to page it into), so this is a full rebuild — the heap's
|
|
204
|
+
* content deduplication is what keeps it rare (it changes only when an effect the set has never
|
|
205
|
+
* seen is registered, or when the sections are repacked to make room for one).
|
|
133
206
|
*
|
|
134
207
|
* @returns {Uint32Array}
|
|
135
208
|
*/
|
|
@@ -137,6 +210,7 @@ export class EmitterRegistry {
|
|
|
137
210
|
#private;
|
|
138
211
|
}
|
|
139
212
|
import { GPUDatabase } from "../../buffer/table/GPUDatabase.js";
|
|
140
|
-
import {
|
|
213
|
+
import { ProgramHeap } from "./ProgramHeap.js";
|
|
141
214
|
import { ParticleEmitter } from "./ParticleEmitter.js";
|
|
215
|
+
import { GPUParticleEmitterContext } from "./GPUParticleEmitterContext.js";
|
|
142
216
|
//# sourceMappingURL=EmitterRegistry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IAwEI;;OAEG;IACH,+BASC;IAlFD;;OAEG;IACH,UAFU,WAAW,CAEZ;IAET;;;OAGG;IACH,UAFU,WAAW,CAEQ;IAE7B;;;OAGG;IACH,UAFU,eAAe,EAAE,CAEb;IAEd;;;;;OAKG;IACH,QAFU,eAAe,EAAE,CAEf;IAEZ;;;;;;;;;;OAUG;IACH,8BAEC;IA8CD;;;OAGG;IACH,2BAEC;IAED;;;;OAIG;IACH,iCAEC;IAED;;OAEG;IACH,oBAEC;IAED;;;OAGG;IACH,4BAEC;IAED;;;;;OAKG;IACH,kCAEC;IAED;;;;;;;OAOG;IACH,iCAEC;IAED;;;;;;;;;OASG;IACH,iBAHW,eAAe,GACb,yBAAyB,GAAC,SAAS,CAI/C;IAED;;;;;;;;OAQG;IACH,YANW,eAAe,GAAC,MAAM,kBAEtB,MAAM,GAEJ,eAAe,CA8B3B;IAED;;;;;;;;;;;;;OAaG;IACH,gBAFW,eAAe,QA4BzB;IAED;;;;;;;;;;;;;;;OAeG;IACH,qBAHW,eAAe,WACf,OAAO,2BAA2B,EAAE,eAAe,QAqB7D;IAED;;;;;OAKG;IACH,SAHW,MAAM,GACJ,eAAe,GAAC,SAAS,CAIrC;IAED;;;;;;OAMG;IACH,2BAHW,eAAe,iBACf,MAAM,QAehB;IAED;;;;;;;;;OASG;IACH,0BAHW,eAAe,UACf,UAAU,MAAM,CAAC,QAoB3B;IAED;;;;;;;;;;;;;OAaG;IACH,cAoBC;IAED;;;;;;;;;OASG;IACH,iBAFa,WAAW,CAMvB;;CACJ;4BApb2B,mCAAmC;4BAYnC,kBAAkB;gCADd,sBAAsB;0CADZ,gCAAgC"}
|