@woosh/meep-engine 3.16.0 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
- package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
- package/editor/particles/effect/ParticleEffectDocument.js +38 -17
- package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
- package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
- package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
- package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
- package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
- package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
- package/editor/view/node-graph/NodeGraphView.js +84 -8
- package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
- package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
- package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
- package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
- package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
- package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
- package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
- package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
- package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
- package/editor/view/particles/effect/particle-editor.css +123 -35
- package/package.json +1 -1
- package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
- package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
- package/src/core/binary/allocator/OffsetAllocator.js +10 -1
- package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
- package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
- package/src/core/collection/array/typed/float32_array_hash.js +38 -0
- package/src/core/graph/csr/CSRGraph.d.ts +8 -1
- package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
- package/src/core/graph/csr/CSRGraph.js +14 -6
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
- package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
- package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
- package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
- package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
- package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
- package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
- package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
- package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
- package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
- package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
- package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
- package/src/engine/animation/AnimationUtils.js +246 -246
- package/src/engine/animation/Animations.js +74 -74
- package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
- package/src/engine/ecs/EventType.d.ts +0 -1
- package/src/engine/ecs/EventType.js +1 -26
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
- package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
- package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
- package/src/engine/ecs/parent/EntityNode.js +4 -9
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
- package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
- package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
- package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
- package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
- package/src/engine/ecs/transform/t64_announce_change.js +12 -12
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
- package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
- package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
- package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
- package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
- package/src/engine/graphics3/LightSystem.js +4 -8
- package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
- package/src/engine/graphics3/MeshSystem.js +9 -19
- package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
- package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
- package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
- package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
- package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
- package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
- package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
- package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
- package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
- package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
- package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
- package/src/shade/playground/particle_editor/README.md +43 -2
- package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
- package/src/shade/playground/particle_system/particle_prototype.js +4 -5
- package/src/shade/playground/particle_system/particle_scene.js +4 -4
- package/src/shade/renderer/Renderer.d.ts.map +1 -1
- package/src/shade/renderer/Renderer.js +13 -1
- package/src/shade/renderer/particles/DESIGN.md +104 -19
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
- package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
- package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
- package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
- package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
- package/src/shade/renderer/particles/ParticleConstants.js +66 -23
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
- package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
- package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
- package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
- package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
- package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
- package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
- package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
- package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
- package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
- package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
- package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
- package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
- package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles.js +105 -262
- package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
- package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
- package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
- package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
- package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
- package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
- package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
- package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
- package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
- package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
- package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
- package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
- package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
- package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
- package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
- package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
- package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
- package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
- package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
- package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +26 -0
- package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
- package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
- package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
- package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
- package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
- package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
- package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
- package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
- package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
- package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
- package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
- package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
- package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
- package/src/view/minimap/dom/MinimapCameraView.js +4 -9
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
- package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
- package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
- package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
- package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
- package/src/engine/ecs/transform/__probe.d.ts +0 -4
- package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
- package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
- package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
- package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
- package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
- package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
- package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
- package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
- package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
- package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
- package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads the colour target, depth-tests read-only against the scene, and draws
|
|
3
|
+
* `drawIndirect(draw_args)` instances over `draw_list`.
|
|
4
|
+
*
|
|
5
|
+
* @param {object} params
|
|
6
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
7
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
8
|
+
* @param {number} params.color graph handle of the colour target the billboards draw over
|
|
9
|
+
* @param {number} params.depth graph handle of the scene depth, tested against and never written
|
|
10
|
+
* @param {number} params.pool graph handle of the particle pool
|
|
11
|
+
* @param {number} params.draw_list graph handle of the slot list to draw, in draw order
|
|
12
|
+
* @param {number} params.emitter_database graph handle
|
|
13
|
+
* @param {number} params.draw_args graph handle of the indirect draw args: six vertices, one
|
|
14
|
+
* instance per live particle, written on-GPU by this frame's build-indirect pass
|
|
15
|
+
* @param {object} params.render
|
|
16
|
+
* @param {GPUTextureView} params.render.atlas sprite atlas
|
|
17
|
+
* @param {GPUSampler} params.render.atlas_sampler
|
|
18
|
+
* @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
|
|
19
|
+
* the billboard pipeline for the frame's attachment formats
|
|
20
|
+
* @returns {number} the colour handle after the draw
|
|
21
|
+
*/
|
|
22
|
+
export function graph_particles_billboard({ graph, camera, color, depth, pool, draw_list, emitter_database, draw_args, render }: {
|
|
23
|
+
graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
|
|
24
|
+
camera: number;
|
|
25
|
+
color: number;
|
|
26
|
+
depth: number;
|
|
27
|
+
pool: number;
|
|
28
|
+
draw_list: number;
|
|
29
|
+
emitter_database: number;
|
|
30
|
+
draw_args: number;
|
|
31
|
+
render: {
|
|
32
|
+
atlas: GPUTextureView;
|
|
33
|
+
atlas_sampler: GPUSampler;
|
|
34
|
+
obtain_pipeline: (color_format: string, depth_format: string) => object;
|
|
35
|
+
};
|
|
36
|
+
}): number;
|
|
37
|
+
//# sourceMappingURL=graph_particles_billboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph_particles_billboard.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_billboard.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;WAhBW,OAAO,2DAA2D,EAAE,UAAU;YAC9E,MAAM;WACN,MAAM;WACN,MAAM;UACN,MAAM;eACN,MAAM;sBACN,MAAM;eACN,MAAM;;;;wCAKS,MAAM,gBAAgB,MAAM,KAAK,MAAM;;IAEpD,MAAM,CAuDlB"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
|
|
2
|
+
import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.js";
|
|
3
|
+
import { PARTICLE_BILLBOARD_RESOURCES } from "./shaders/shader_particle_render.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The particle system's standalone drawing: one instanced billboard draw over a colour target with
|
|
7
|
+
* fixed-function blending, for {@link ParticleRenderMode.BILLBOARD}. The renderer's own path draws
|
|
8
|
+
* through `graph_particles_avboit.js` instead; these two files are the alternatives
|
|
9
|
+
* {@link GPUParticleSystem#execute} picks between, and both read the handles the simulation left.
|
|
10
|
+
*
|
|
11
|
+
* The draw list is a parameter rather than a buffer this file names, because what it must be is a
|
|
12
|
+
* property of the caller's blend state: premultiplied over-blending is order-dependent, so the
|
|
13
|
+
* standalone path hands in the back-to-front list `sort/graph_particle_sort.js` produced.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** The colour attachment's view: one mip, the one the frame draws into. */
|
|
17
|
+
const COLOR_VIEW = TextureViewDescriptor.from({ mipLevelCount: 1, baseMipLevel: 0 });
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Loads the colour target, depth-tests read-only against the scene, and draws
|
|
21
|
+
* `drawIndirect(draw_args)` instances over `draw_list`.
|
|
22
|
+
*
|
|
23
|
+
* @param {object} params
|
|
24
|
+
* @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
|
|
25
|
+
* @param {number} params.camera graph handle of the camera uniform buffer
|
|
26
|
+
* @param {number} params.color graph handle of the colour target the billboards draw over
|
|
27
|
+
* @param {number} params.depth graph handle of the scene depth, tested against and never written
|
|
28
|
+
* @param {number} params.pool graph handle of the particle pool
|
|
29
|
+
* @param {number} params.draw_list graph handle of the slot list to draw, in draw order
|
|
30
|
+
* @param {number} params.emitter_database graph handle
|
|
31
|
+
* @param {number} params.draw_args graph handle of the indirect draw args: six vertices, one
|
|
32
|
+
* instance per live particle, written on-GPU by this frame's build-indirect pass
|
|
33
|
+
* @param {object} params.render
|
|
34
|
+
* @param {GPUTextureView} params.render.atlas sprite atlas
|
|
35
|
+
* @param {GPUSampler} params.render.atlas_sampler
|
|
36
|
+
* @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
|
|
37
|
+
* the billboard pipeline for the frame's attachment formats
|
|
38
|
+
* @returns {number} the colour handle after the draw
|
|
39
|
+
*/
|
|
40
|
+
export function graph_particles_billboard({ graph, camera, color, depth, pool, draw_list, emitter_database, draw_args, render }) {
|
|
41
|
+
const data = {};
|
|
42
|
+
|
|
43
|
+
const pass = graph.add("Particle Billboard", data, (data, resources, context) => {
|
|
44
|
+
const encoder = context.encoder;
|
|
45
|
+
|
|
46
|
+
const color_texture = resources.get(data.color);
|
|
47
|
+
const depth_texture = resources.get(data.depth);
|
|
48
|
+
|
|
49
|
+
const pipeline = render.obtain_pipeline(color_texture.descriptor.format, depth_texture.descriptor.format);
|
|
50
|
+
|
|
51
|
+
// Read by the soft-depth fade and tested against by the pass: the same view, read-only in
|
|
52
|
+
// both roles.
|
|
53
|
+
const depth_view = depth_texture.obtainView(DEFAULT_DEPTH_TEXTURE_VIEW);
|
|
54
|
+
|
|
55
|
+
const bindings = PARTICLE_BILLBOARD_RESOURCES.generateBindings({
|
|
56
|
+
camera: resources.get(data.camera),
|
|
57
|
+
pool: resources.get(data.pool),
|
|
58
|
+
draw_list: resources.get(data.draw_list),
|
|
59
|
+
emitter_database: resources.get(data.emitter_database),
|
|
60
|
+
atlas: render.atlas,
|
|
61
|
+
atlas_sampler: render.atlas_sampler,
|
|
62
|
+
scene_depth: depth_view,
|
|
63
|
+
}, encoder);
|
|
64
|
+
|
|
65
|
+
const render_pass = encoder.constructRenderPass({
|
|
66
|
+
label: "Particle Billboard",
|
|
67
|
+
pipeline,
|
|
68
|
+
bindings,
|
|
69
|
+
colorAttachments: [{
|
|
70
|
+
view: color_texture.obtainView(COLOR_VIEW),
|
|
71
|
+
loadOp: "load",
|
|
72
|
+
storeOp: "store",
|
|
73
|
+
}],
|
|
74
|
+
depthStencilAttachment: {
|
|
75
|
+
view: depth_view,
|
|
76
|
+
depthReadOnly: true,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
render_pass.drawIndirect(resources.get(data.draw_args), 0);
|
|
81
|
+
render_pass.end();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
data.camera = pass.read(camera);
|
|
85
|
+
data.pool = pass.read(pool);
|
|
86
|
+
data.draw_list = pass.read(draw_list);
|
|
87
|
+
data.emitter_database = pass.read(emitter_database);
|
|
88
|
+
data.draw_args = pass.read(draw_args);
|
|
89
|
+
data.depth = pass.read(depth);
|
|
90
|
+
data.color = pass.write(pass.read(color));
|
|
91
|
+
|
|
92
|
+
return data.color;
|
|
93
|
+
}
|
|
@@ -6,43 +6,63 @@
|
|
|
6
6
|
* registers the program touches without a separate pass.
|
|
7
7
|
*/
|
|
8
8
|
export class InstructionStream {
|
|
9
|
-
/** @type {number[][]} */
|
|
9
|
+
/** @type {number[][]} four words each */
|
|
10
10
|
instructions: number[][];
|
|
11
11
|
/** @type {number} highest register index referenced, plus one */
|
|
12
12
|
register_count: number;
|
|
13
13
|
/**
|
|
14
|
-
* Emit
|
|
15
|
-
*
|
|
14
|
+
* Emit an instruction. Validates the opcode and tracks register usage. Prefer the typed helpers
|
|
15
|
+
* below where they exist — they document the non-obvious operand packing.
|
|
16
|
+
*
|
|
17
|
+
* A source is what its slot's role in the ISA says: for a register-role slot, a register operand
|
|
18
|
+
* word — a slot index, or `vm_register(slot, pattern)` to read it through a swizzle — or a
|
|
19
|
+
* literal from `vm_immediate(value)`; for any other role, the raw value (an attribute offset, a
|
|
20
|
+
* component count, a builtin id, a curve handle, a pool index). The kinds word 0 carries follow
|
|
21
|
+
* from that, and register operands are stored in their canonical spelling.
|
|
16
22
|
*
|
|
17
23
|
* `width` is the lane count the operation spans. Left out, it is the opcode's natural width —
|
|
18
24
|
* four for the element-wise ops, three for the ones that used to be spelled `.xyz`. Opcodes
|
|
19
25
|
* whose lane count is fixed ignore it.
|
|
20
26
|
*
|
|
21
27
|
* @param {number} op
|
|
22
|
-
* @param {number} [dst]
|
|
23
|
-
* @param {number} [s0]
|
|
24
|
-
* @param {number} [s1]
|
|
25
|
-
* @param {number} [s2]
|
|
28
|
+
* @param {number} [dst] destination register; `0` for an opcode that writes none
|
|
29
|
+
* @param {number|{kind: number, word: number}} [s0]
|
|
30
|
+
* @param {number|{kind: number, word: number}} [s1]
|
|
31
|
+
* @param {number|{kind: number, word: number}} [s2]
|
|
26
32
|
* @param {number} [width]
|
|
27
33
|
* @returns {InstructionStream} this, for chaining
|
|
28
34
|
*/
|
|
29
|
-
emit(op: number, dst?: number, s0?: number
|
|
35
|
+
emit(op: number, dst?: number, s0?: number | {
|
|
36
|
+
kind: number;
|
|
37
|
+
word: number;
|
|
38
|
+
}, s1?: number | {
|
|
39
|
+
kind: number;
|
|
40
|
+
word: number;
|
|
41
|
+
}, s2?: number | {
|
|
42
|
+
kind: number;
|
|
43
|
+
word: number;
|
|
44
|
+
}, width?: number): InstructionStream;
|
|
45
|
+
/**
|
|
46
|
+
* Emit an instruction that is already encoded — the optimizer's way back into a stream, where the
|
|
47
|
+
* words are re-validated and the register count re-derived from what they touch.
|
|
48
|
+
*
|
|
49
|
+
* @param {ArrayLike<number>} words the four words of a single instruction
|
|
50
|
+
* @returns {InstructionStream} this, for chaining
|
|
51
|
+
*/
|
|
52
|
+
emitWords(words: ArrayLike<number>): InstructionStream;
|
|
30
53
|
/**
|
|
31
54
|
* @param {number} dst
|
|
32
|
-
* @param {number} src
|
|
55
|
+
* @param {number} src a register operand word
|
|
33
56
|
* @param {number} [width]
|
|
34
57
|
* @returns {InstructionStream}
|
|
35
58
|
*/
|
|
36
59
|
mov(dst: number, src: number, width?: number): InstructionStream;
|
|
37
60
|
/**
|
|
38
|
-
* Widen a single-lane value into `width` lanes.
|
|
39
|
-
*
|
|
40
|
-
* A `SWIZZLE` whose every selector names lane 0 — no opcode of its own, because that is exactly
|
|
41
|
-
* what one is. The compiler emits these where a narrow value meets a wider operation, which is
|
|
42
|
-
* the broadcast the reductions and `CURVE` used to do implicitly by filling all four lanes.
|
|
61
|
+
* Widen a single-lane value into `width` lanes: a copy through the `.xxxx` swizzle. The compiler
|
|
62
|
+
* emits these where a narrow value meets a wider operation.
|
|
43
63
|
*
|
|
44
64
|
* @param {number} dst
|
|
45
|
-
* @param {number} src
|
|
65
|
+
* @param {number} src register slot
|
|
46
66
|
* @param {number} width
|
|
47
67
|
* @returns {InstructionStream}
|
|
48
68
|
*/
|
|
@@ -67,14 +87,17 @@ export class InstructionStream {
|
|
|
67
87
|
loadAttr(dst: number, word_offset: number, component_count: number, width?: number): InstructionStream;
|
|
68
88
|
/**
|
|
69
89
|
* The width is the component count and cannot differ from it: a store writes exactly the lanes
|
|
70
|
-
* the
|
|
90
|
+
* the value holds.
|
|
71
91
|
*
|
|
72
|
-
* @param {number}
|
|
92
|
+
* @param {number|{kind: number, word: number}} source a register operand word or a literal
|
|
73
93
|
* @param {number} word_offset
|
|
74
94
|
* @param {number} component_count
|
|
75
95
|
* @returns {InstructionStream}
|
|
76
96
|
*/
|
|
77
|
-
storeAttr(
|
|
97
|
+
storeAttr(source: number | {
|
|
98
|
+
kind: number;
|
|
99
|
+
word: number;
|
|
100
|
+
}, word_offset: number, component_count: number): InstructionStream;
|
|
78
101
|
/**
|
|
79
102
|
* @param {number} dst
|
|
80
103
|
* @param {number} builtin_id
|
|
@@ -83,10 +106,13 @@ export class InstructionStream {
|
|
|
83
106
|
*/
|
|
84
107
|
loadBuiltin(dst: number, builtin_id: number, width?: number): InstructionStream;
|
|
85
108
|
/**
|
|
86
|
-
* @param {number}
|
|
109
|
+
* @param {number|{kind: number, word: number}} condition a register operand word or a literal, read one lane
|
|
87
110
|
* @returns {InstructionStream}
|
|
88
111
|
*/
|
|
89
|
-
kill(
|
|
112
|
+
kill(condition: number | {
|
|
113
|
+
kind: number;
|
|
114
|
+
word: number;
|
|
115
|
+
}): InstructionStream;
|
|
90
116
|
/**
|
|
91
117
|
* One independent uniform draw in `[0, 1)` per lane — so `width` draws off the shared RNG.
|
|
92
118
|
* Anything shaped (signed, a disk, a sphere) is arithmetic over these; see
|
|
@@ -100,11 +126,14 @@ export class InstructionStream {
|
|
|
100
126
|
/**
|
|
101
127
|
* @param {number} dst
|
|
102
128
|
* @param {number} curve_handle
|
|
103
|
-
* @param {number}
|
|
129
|
+
* @param {number|{kind: number, word: number}} t a register operand word or a literal, read one lane
|
|
104
130
|
* @param {number} [width]
|
|
105
131
|
* @returns {InstructionStream}
|
|
106
132
|
*/
|
|
107
|
-
curve(dst: number, curve_handle: number,
|
|
133
|
+
curve(dst: number, curve_handle: number, t: number | {
|
|
134
|
+
kind: number;
|
|
135
|
+
word: number;
|
|
136
|
+
}, width?: number): InstructionStream;
|
|
108
137
|
/**
|
|
109
138
|
* @returns {InstructionStream}
|
|
110
139
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstructionStream.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/InstructionStream.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InstructionStream.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/InstructionStream.js"],"names":[],"mappings":"AAkCA;;;;;;GAMG;AACH;IACI,yCAAyC;IACzC,cADW,MAAM,EAAE,EAAE,CACH;IAClB,iEAAiE;IACjE,gBADW,MAAM,CACE;IAsBnB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SARW,MAAM,QACN,MAAM,OACN,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,OACnC,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,OACnC,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,UACnC,MAAM,GACJ,iBAAiB,CA6D7B;IAED;;;;;;OAMG;IACH,iBAHW,UAAU,MAAM,CAAC,GACf,iBAAiB,CAS7B;IAID;;;;;OAKG;IACH,SALW,MAAM,OACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;OAQG;IACH,eALW,MAAM,OACN,MAAM,SACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;OAKG;IACH,eALW,MAAM,kBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;;OASG;IACH,cANW,MAAM,eACN,MAAM,mBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;;;;OAQG;IACH,kBALW,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,eACnC,MAAM,mBACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;OAKG;IACH,iBALW,MAAM,cACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;OAGG;IACH,gBAHW,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GACjC,iBAAiB,CAI7B;IAED;;;;;;;;OAQG;IACH,YAJW,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;OAMG;IACH,WANW,MAAM,gBACN,MAAM,KACN,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,UACnC,MAAM,GACJ,iBAAiB,CAI7B;IAED;;OAEG;IACH,QAFa,iBAAiB,CAI7B;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,WAFa,WAAW,CAWvB;;CACJ"}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { assert } from "../../../../core/assert.js";
|
|
2
|
-
import {
|
|
2
|
+
import { PARTICLE_VM_REGISTER_SLOTS } from "../ParticleConstants.js";
|
|
3
3
|
import {
|
|
4
|
-
|
|
4
|
+
PARTICLE_VM_INSTRUCTION_WORDS,
|
|
5
|
+
VM_DST_MASK,
|
|
5
6
|
VM_ISA,
|
|
7
|
+
VM_KIND,
|
|
6
8
|
VM_MAX_WIDTH,
|
|
7
9
|
VM_OP,
|
|
10
|
+
VM_OPERAND,
|
|
11
|
+
VM_SWIZZLE_BROADCAST,
|
|
8
12
|
VM_WIDTH,
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
vm_decode_dst,
|
|
14
|
+
vm_decode_kind,
|
|
15
|
+
vm_decode_op,
|
|
16
|
+
vm_decode_width,
|
|
17
|
+
vm_kinds_problem,
|
|
18
|
+
vm_pack_instruction,
|
|
19
|
+
vm_register,
|
|
20
|
+
vm_visit_register_runs,
|
|
11
21
|
} from "./ParticleVMISA.js";
|
|
12
22
|
|
|
13
23
|
/**
|
|
@@ -30,7 +40,7 @@ function assert_component_count(component_count, mnemonic) {
|
|
|
30
40
|
* registers the program touches without a separate pass.
|
|
31
41
|
*/
|
|
32
42
|
export class InstructionStream {
|
|
33
|
-
/** @type {number[][]} */
|
|
43
|
+
/** @type {number[][]} four words each */
|
|
34
44
|
instructions = [];
|
|
35
45
|
/** @type {number} highest register index referenced, plus one */
|
|
36
46
|
register_count = 0;
|
|
@@ -47,7 +57,8 @@ export class InstructionStream {
|
|
|
47
57
|
assert.lessThanOrEqual(
|
|
48
58
|
base + span,
|
|
49
59
|
PARTICLE_VM_REGISTER_SLOTS,
|
|
50
|
-
`register range [${base}, ${base + span}) exceeds the ${PARTICLE_VM_REGISTER_SLOTS}
|
|
60
|
+
`register range [${base}, ${base + span}) exceeds the ${PARTICLE_VM_REGISTER_SLOTS} slots a VM `
|
|
61
|
+
+ `instruction can address`
|
|
51
62
|
);
|
|
52
63
|
if (base + span > this.register_count) {
|
|
53
64
|
this.register_count = base + span;
|
|
@@ -55,18 +66,24 @@ export class InstructionStream {
|
|
|
55
66
|
}
|
|
56
67
|
|
|
57
68
|
/**
|
|
58
|
-
* Emit
|
|
59
|
-
*
|
|
69
|
+
* Emit an instruction. Validates the opcode and tracks register usage. Prefer the typed helpers
|
|
70
|
+
* below where they exist — they document the non-obvious operand packing.
|
|
71
|
+
*
|
|
72
|
+
* A source is what its slot's role in the ISA says: for a register-role slot, a register operand
|
|
73
|
+
* word — a slot index, or `vm_register(slot, pattern)` to read it through a swizzle — or a
|
|
74
|
+
* literal from `vm_immediate(value)`; for any other role, the raw value (an attribute offset, a
|
|
75
|
+
* component count, a builtin id, a curve handle, a pool index). The kinds word 0 carries follow
|
|
76
|
+
* from that, and register operands are stored in their canonical spelling.
|
|
60
77
|
*
|
|
61
78
|
* `width` is the lane count the operation spans. Left out, it is the opcode's natural width —
|
|
62
79
|
* four for the element-wise ops, three for the ones that used to be spelled `.xyz`. Opcodes
|
|
63
80
|
* whose lane count is fixed ignore it.
|
|
64
81
|
*
|
|
65
82
|
* @param {number} op
|
|
66
|
-
* @param {number} [dst]
|
|
67
|
-
* @param {number} [s0]
|
|
68
|
-
* @param {number} [s1]
|
|
69
|
-
* @param {number} [s2]
|
|
83
|
+
* @param {number} [dst] destination register; `0` for an opcode that writes none
|
|
84
|
+
* @param {number|{kind: number, word: number}} [s0]
|
|
85
|
+
* @param {number|{kind: number, word: number}} [s1]
|
|
86
|
+
* @param {number|{kind: number, word: number}} [s2]
|
|
70
87
|
* @param {number} [width]
|
|
71
88
|
* @returns {InstructionStream} this, for chaining
|
|
72
89
|
*/
|
|
@@ -74,6 +91,25 @@ export class InstructionStream {
|
|
|
74
91
|
const meta = VM_ISA.get(op);
|
|
75
92
|
assert.defined(meta, `unknown opcode ${op}`);
|
|
76
93
|
|
|
94
|
+
const kinds = [VM_KIND.NONE, VM_KIND.NONE, VM_KIND.NONE];
|
|
95
|
+
const sources = [0, 0, 0];
|
|
96
|
+
|
|
97
|
+
[s0, s1, s2].forEach((source, slot) => {
|
|
98
|
+
const role = meta.operands[slot];
|
|
99
|
+
|
|
100
|
+
if (typeof source === "object" && source !== null) {
|
|
101
|
+
assert.equal(source.kind, VM_KIND.IMM, `${meta.name} s${slot}: an operand object must be a literal`);
|
|
102
|
+
assert.equal(role, VM_OPERAND.REG, `${meta.name} s${slot} is ${role} and cannot take a literal`);
|
|
103
|
+
kinds[slot] = VM_KIND.IMM;
|
|
104
|
+
sources[slot] = source.word >>> 0;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
assert.isNonNegativeInteger(source, `${meta.name} s${slot}`);
|
|
109
|
+
kinds[slot] = role === VM_OPERAND.REG ? VM_KIND.REG : VM_KIND.NONE;
|
|
110
|
+
sources[slot] = source >>> 0;
|
|
111
|
+
});
|
|
112
|
+
|
|
77
113
|
let requested = width === undefined ? meta.default_width : width;
|
|
78
114
|
|
|
79
115
|
// The attribute ops measure themselves in components. A store's width IS its component
|
|
@@ -81,9 +117,9 @@ export class InstructionStream {
|
|
|
81
117
|
// instruction was built; a load merely defaults to it, since widening a load is how a narrow
|
|
82
118
|
// attribute reaches a wider operation.
|
|
83
119
|
if (op === VM_OP.STORE_ATTR) {
|
|
84
|
-
requested =
|
|
120
|
+
requested = sources[2];
|
|
85
121
|
} else if (op === VM_OP.LOAD_ATTR && width === undefined) {
|
|
86
|
-
requested =
|
|
122
|
+
requested = sources[1];
|
|
87
123
|
}
|
|
88
124
|
|
|
89
125
|
if (meta.width !== VM_WIDTH.NONE) {
|
|
@@ -91,21 +127,48 @@ export class InstructionStream {
|
|
|
91
127
|
assert.lessThanOrEqual(requested, VM_MAX_WIDTH, `${meta.name} width`);
|
|
92
128
|
}
|
|
93
129
|
|
|
94
|
-
|
|
130
|
+
if (meta.dst) {
|
|
131
|
+
assert.isNonNegativeInteger(dst, `${meta.name} destination`);
|
|
132
|
+
assert.lessThanOrEqual(dst, VM_DST_MASK, `${meta.name} destination`);
|
|
133
|
+
} else {
|
|
134
|
+
// Nothing writes here, so a destination can only be a source that was put in the wrong
|
|
135
|
+
// slot — `KILL` and `STORE_ATTR` take theirs in s0.
|
|
136
|
+
assert.equal(dst, 0, `${meta.name} writes no destination; its source goes in s0`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const words = vm_pack_instruction(op, requested, dst, kinds, sources);
|
|
95
140
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
vm_visit_register_operands([word0, dst, s0, s1, s2], 0, (slot, span) => this.#use_register(slot, span));
|
|
141
|
+
const kinds_problem = vm_kinds_problem(words, 0);
|
|
142
|
+
assert.ok(kinds_problem === null, `${meta.name}: ${kinds_problem}`);
|
|
99
143
|
|
|
100
|
-
|
|
144
|
+
// A nonsense index trips the assert that names it rather than wrapping into a plausible slot.
|
|
145
|
+
vm_visit_register_runs(words, 0, (slot, span) => this.#use_register(slot, span));
|
|
146
|
+
|
|
147
|
+
this.instructions.push(words);
|
|
101
148
|
return this;
|
|
102
149
|
}
|
|
103
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Emit an instruction that is already encoded — the optimizer's way back into a stream, where the
|
|
153
|
+
* words are re-validated and the register count re-derived from what they touch.
|
|
154
|
+
*
|
|
155
|
+
* @param {ArrayLike<number>} words the four words of a single instruction
|
|
156
|
+
* @returns {InstructionStream} this, for chaining
|
|
157
|
+
*/
|
|
158
|
+
emitWords(words) {
|
|
159
|
+
const word0 = words[0];
|
|
160
|
+
const source = (slot) => (vm_decode_kind(word0, slot) === VM_KIND.IMM
|
|
161
|
+
? { kind: VM_KIND.IMM, word: words[1 + slot] }
|
|
162
|
+
: words[1 + slot]);
|
|
163
|
+
|
|
164
|
+
return this.emit(vm_decode_op(word0), vm_decode_dst(word0), source(0), source(1), source(2), vm_decode_width(word0));
|
|
165
|
+
}
|
|
166
|
+
|
|
104
167
|
// --- typed helpers (packing that isn't obvious from `emit`) ---
|
|
105
168
|
|
|
106
169
|
/**
|
|
107
170
|
* @param {number} dst
|
|
108
|
-
* @param {number} src
|
|
171
|
+
* @param {number} src a register operand word
|
|
109
172
|
* @param {number} [width]
|
|
110
173
|
* @returns {InstructionStream}
|
|
111
174
|
*/
|
|
@@ -114,19 +177,16 @@ export class InstructionStream {
|
|
|
114
177
|
}
|
|
115
178
|
|
|
116
179
|
/**
|
|
117
|
-
* Widen a single-lane value into `width` lanes.
|
|
118
|
-
*
|
|
119
|
-
* A `SWIZZLE` whose every selector names lane 0 — no opcode of its own, because that is exactly
|
|
120
|
-
* what one is. The compiler emits these where a narrow value meets a wider operation, which is
|
|
121
|
-
* the broadcast the reductions and `CURVE` used to do implicitly by filling all four lanes.
|
|
180
|
+
* Widen a single-lane value into `width` lanes: a copy through the `.xxxx` swizzle. The compiler
|
|
181
|
+
* emits these where a narrow value meets a wider operation.
|
|
122
182
|
*
|
|
123
183
|
* @param {number} dst
|
|
124
|
-
* @param {number} src
|
|
184
|
+
* @param {number} src register slot
|
|
125
185
|
* @param {number} width
|
|
126
186
|
* @returns {InstructionStream}
|
|
127
187
|
*/
|
|
128
188
|
broadcast(dst, src, width) {
|
|
129
|
-
return this.emit(VM_OP.
|
|
189
|
+
return this.emit(VM_OP.MOV, dst, vm_register(src, VM_SWIZZLE_BROADCAST), 0, 0, width);
|
|
130
190
|
}
|
|
131
191
|
|
|
132
192
|
/**
|
|
@@ -156,16 +216,16 @@ export class InstructionStream {
|
|
|
156
216
|
|
|
157
217
|
/**
|
|
158
218
|
* The width is the component count and cannot differ from it: a store writes exactly the lanes
|
|
159
|
-
* the
|
|
219
|
+
* the value holds.
|
|
160
220
|
*
|
|
161
|
-
* @param {number}
|
|
221
|
+
* @param {number|{kind: number, word: number}} source a register operand word or a literal
|
|
162
222
|
* @param {number} word_offset
|
|
163
223
|
* @param {number} component_count
|
|
164
224
|
* @returns {InstructionStream}
|
|
165
225
|
*/
|
|
166
|
-
storeAttr(
|
|
226
|
+
storeAttr(source, word_offset, component_count) {
|
|
167
227
|
assert_component_count(component_count, "STORE_ATTR");
|
|
168
|
-
return this.emit(VM_OP.STORE_ATTR,
|
|
228
|
+
return this.emit(VM_OP.STORE_ATTR, 0, source, word_offset, component_count, component_count);
|
|
169
229
|
}
|
|
170
230
|
|
|
171
231
|
/**
|
|
@@ -179,11 +239,11 @@ export class InstructionStream {
|
|
|
179
239
|
}
|
|
180
240
|
|
|
181
241
|
/**
|
|
182
|
-
* @param {number}
|
|
242
|
+
* @param {number|{kind: number, word: number}} condition a register operand word or a literal, read one lane
|
|
183
243
|
* @returns {InstructionStream}
|
|
184
244
|
*/
|
|
185
|
-
kill(
|
|
186
|
-
return this.emit(VM_OP.KILL,
|
|
245
|
+
kill(condition) {
|
|
246
|
+
return this.emit(VM_OP.KILL, 0, condition);
|
|
187
247
|
}
|
|
188
248
|
|
|
189
249
|
/**
|
|
@@ -202,12 +262,12 @@ export class InstructionStream {
|
|
|
202
262
|
/**
|
|
203
263
|
* @param {number} dst
|
|
204
264
|
* @param {number} curve_handle
|
|
205
|
-
* @param {number}
|
|
265
|
+
* @param {number|{kind: number, word: number}} t a register operand word or a literal, read one lane
|
|
206
266
|
* @param {number} [width]
|
|
207
267
|
* @returns {InstructionStream}
|
|
208
268
|
*/
|
|
209
|
-
curve(dst, curve_handle,
|
|
210
|
-
return this.emit(VM_OP.CURVE, dst, curve_handle,
|
|
269
|
+
curve(dst, curve_handle, t, width = undefined) {
|
|
270
|
+
return this.emit(VM_OP.CURVE, dst, curve_handle, t, 0, width);
|
|
211
271
|
}
|
|
212
272
|
|
|
213
273
|
/**
|
|
@@ -237,4 +297,4 @@ export class InstructionStream {
|
|
|
237
297
|
|
|
238
298
|
return words;
|
|
239
299
|
}
|
|
240
|
-
}
|
|
300
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A compiled particle program: two instruction streams (INIT and UPDATE) plus a shared constant
|
|
3
|
-
* pool. This is the value the node compiler emits and the runtime packs into the program
|
|
3
|
+
* pool. This is the value the node compiler emits and the runtime packs into the program heap.
|
|
4
4
|
*
|
|
5
5
|
* Instruction streams are flat `Uint32Array`s, {@link PARTICLE_VM_INSTRUCTION_WORDS} words per
|
|
6
|
-
* instruction. The constant pool is a flat `Float32Array`,
|
|
6
|
+
* instruction. The constant pool is a flat `Float32Array`, one float per word.
|
|
7
7
|
*/
|
|
8
8
|
export class ParticleProgram {
|
|
9
9
|
/**
|
|
@@ -30,12 +30,12 @@ export class ParticleProgram {
|
|
|
30
30
|
*/
|
|
31
31
|
update: Uint32Array;
|
|
32
32
|
/**
|
|
33
|
-
* Constant pool,
|
|
33
|
+
* Constant pool, one float per word.
|
|
34
34
|
* @type {Float32Array}
|
|
35
35
|
*/
|
|
36
36
|
constants: Float32Array;
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Register slots the program needs.
|
|
39
39
|
* @type {number}
|
|
40
40
|
*/
|
|
41
41
|
register_count: number;
|
|
@@ -46,10 +46,51 @@ export class ParticleProgram {
|
|
|
46
46
|
/** @returns {number} words in the constant pool — it is addressed by word, not by `vec4` */
|
|
47
47
|
get constant_word_count(): number;
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
49
|
+
* The constant pool as the raw IEEE-754 words it is made of, without copying — a view of the
|
|
50
|
+
* same bytes, so writing through it writes the pool.
|
|
51
|
+
*
|
|
52
|
+
* This is the form the pool is compared, hashed and packed in, because it holds constants, not
|
|
53
|
+
* measurements. `-0` and `+0` are the same number and different constants — a `DIV` by each
|
|
54
|
+
* disagrees about the sign of the infinity it produces — and the assembler already keeps them
|
|
55
|
+
* apart, interning with `Object.is`; equality that read the pool as floats would put back
|
|
56
|
+
* together what interning took care to separate. Reading bits also keeps
|
|
57
|
+
* {@link ParticleProgram#equals} reflexive over a pool holding a NaN.
|
|
58
|
+
*
|
|
59
|
+
* @returns {Uint32Array}
|
|
52
60
|
*/
|
|
53
|
-
|
|
61
|
+
get constant_words(): Uint32Array;
|
|
62
|
+
/**
|
|
63
|
+
* Structural equality: the same two instruction streams, the same constant pool bit for bit,
|
|
64
|
+
* and the same register budget. Two programs that compare equal are one program — the VM would
|
|
65
|
+
* execute them identically.
|
|
66
|
+
*
|
|
67
|
+
* @param {ParticleProgram} other
|
|
68
|
+
* @returns {boolean}
|
|
69
|
+
*/
|
|
70
|
+
equals(other: ParticleProgram): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Hash over everything {@link ParticleProgram#equals} compares, and in the same terms — the pool
|
|
73
|
+
* goes through the same bit view, so equal programs hash equally.
|
|
74
|
+
*
|
|
75
|
+
* @returns {number} int32
|
|
76
|
+
*/
|
|
77
|
+
hash(): number;
|
|
78
|
+
/**
|
|
79
|
+
* Take on another program's code, becoming equal to it.
|
|
80
|
+
*
|
|
81
|
+
* The streams and the pool are duplicated rather than shared. A compiled program is treated as
|
|
82
|
+
* immutable, but nothing here enforces that — the optimizer's passes read and rewrite these
|
|
83
|
+
* arrays directly — so a copy that aliased the original would let a rewrite of one silently
|
|
84
|
+
* become a rewrite of both.
|
|
85
|
+
*
|
|
86
|
+
* @param {ParticleProgram} other
|
|
87
|
+
*/
|
|
88
|
+
copy(other: ParticleProgram): void;
|
|
89
|
+
/**
|
|
90
|
+
* A second program equal to this one and sharing none of its storage.
|
|
91
|
+
*
|
|
92
|
+
* @returns {ParticleProgram}
|
|
93
|
+
*/
|
|
94
|
+
clone(): ParticleProgram;
|
|
54
95
|
}
|
|
55
96
|
//# sourceMappingURL=ParticleProgram.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParticleProgram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleProgram.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ParticleProgram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleProgram.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH;IA0BI;;;;;;OAMG;IACH;QAL+B,IAAI,EAAxB,WAAW;QACS,MAAM,EAA1B,WAAW;QACU,SAAS,EAA9B,YAAY;QACG,cAAc,EAA7B,MAAM;OAoBhB;IAjDD;;;OAGG;IACH,MAFU,WAAW,CAEhB;IAEL;;;OAGG;IACH,QAFU,WAAW,CAEd;IAEP;;;OAGG;IACH,WAFU,YAAY,CAEZ;IAEV;;;OAGG;IACH,gBAFU,MAAM,CAED;IA6Bf,mEAAmE;IACnE,qCAEC;IAED,qEAAqE;IACrE,uCAEC;IAED,4FAA4F;IAC5F,kCAEC;IAED;;;;;;;;;;;;OAYG;IACH,kCAGC;IAED;;;;;;;OAOG;IACH,cAHW,eAAe,GACb,OAAO,CAWnB;IAED;;;;;OAKG;IACH,QAFa,MAAM,CAalB;IAED;;;;;;;;;OASG;IACH,YAFW,eAAe,QAOzB;IAED;;;;OAIG;IACH,SAFa,eAAe,CAe3B;CACJ"}
|