@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
|
@@ -3,9 +3,24 @@ import {
|
|
|
3
3
|
PARTICLE_VM_MAX_INSTRUCTIONS,
|
|
4
4
|
} from "../ParticleConstants.js";
|
|
5
5
|
import {
|
|
6
|
+
VM_DEST,
|
|
7
|
+
VM_DST_MASK,
|
|
8
|
+
VM_DST_SHIFT,
|
|
9
|
+
VM_ISA,
|
|
10
|
+
VM_KIND,
|
|
11
|
+
VM_KIND_BITS,
|
|
12
|
+
VM_KIND_MASK,
|
|
13
|
+
VM_KIND_SHIFT,
|
|
14
|
+
VM_MAX_WIDTH,
|
|
6
15
|
VM_OP,
|
|
7
|
-
|
|
8
|
-
|
|
16
|
+
VM_OP_MASK,
|
|
17
|
+
VM_OPERAND_BASE_MASK,
|
|
18
|
+
VM_OPERAND_SWIZZLE_SHIFT,
|
|
19
|
+
VM_SWIZZLE_IDENTITY,
|
|
20
|
+
VM_WIDTH,
|
|
21
|
+
VM_WIDTH_MASK,
|
|
22
|
+
VM_WIDTH_SHIFT,
|
|
23
|
+
vm_dest_width,
|
|
9
24
|
vm_operation_width,
|
|
10
25
|
} from "../isa/ParticleVMISA.js";
|
|
11
26
|
|
|
@@ -38,6 +53,73 @@ export function u32_to_unit_f32(u) {
|
|
|
38
53
|
return (u >>> 8) * (1 / 16777216);
|
|
39
54
|
}
|
|
40
55
|
|
|
56
|
+
// --- the opcode rules as dense tables ------------------------------------------------------------
|
|
57
|
+
//
|
|
58
|
+
// The editor's preview runs this executor for every live particle every frame, so its speed is that
|
|
59
|
+
// preview's frame rate, and a few thousand instructions a particle leave no room for a map lookup an
|
|
60
|
+
// instruction. Everything the loop needs to know about an opcode is read out of the ISA once, here,
|
|
61
|
+
// into arrays indexed by opcode number; the ISA stays the one place the rules are written.
|
|
62
|
+
|
|
63
|
+
/** One past the largest opcode number. @type {number} */
|
|
64
|
+
const OP_COUNT = VM_OP_MASK + 1;
|
|
65
|
+
|
|
66
|
+
/** `1` where the opcode is defined. @type {Uint8Array} */
|
|
67
|
+
const OP_DEFINED = new Uint8Array(OP_COUNT);
|
|
68
|
+
|
|
69
|
+
/** The lane count the opcode always operates on, or `-1` where the instruction's width field says. @type {Int8Array} */
|
|
70
|
+
const OP_WIDTH = new Int8Array(OP_COUNT);
|
|
71
|
+
|
|
72
|
+
/** The lanes the opcode always writes, or `-1` for as many as it operates on. @type {Int8Array} */
|
|
73
|
+
const OP_DEST = new Int8Array(OP_COUNT);
|
|
74
|
+
|
|
75
|
+
/** Bit `n` set where source slot `n` is read one lane whatever the width. @type {Uint8Array} */
|
|
76
|
+
const OP_SCALAR = new Uint8Array(OP_COUNT);
|
|
77
|
+
|
|
78
|
+
for (const [op, meta] of VM_ISA) {
|
|
79
|
+
OP_DEFINED[op] = 1;
|
|
80
|
+
OP_WIDTH[op] = meta.width === VM_WIDTH.VARIABLE ? -1 : vm_operation_width(op, 0);
|
|
81
|
+
OP_DEST[op] = meta.dest === VM_DEST.WIDTH ? -1 : vm_dest_width(op, 0);
|
|
82
|
+
|
|
83
|
+
for (const slot of meta.scalar_operands) {
|
|
84
|
+
OP_SCALAR[op] |= 1 << slot;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// --- module-local copies of what the loop reads per instruction ----------------------------------
|
|
89
|
+
//
|
|
90
|
+
// An imported binding is a live lookup on every read under some module loaders (vitest's among
|
|
91
|
+
// them), and the loop below reads a dozen of them per instruction. Copied once here, they are plain
|
|
92
|
+
// constants to the JIT, and the opcode switch can be a jump table.
|
|
93
|
+
|
|
94
|
+
const {
|
|
95
|
+
ABS, ACOS, ADD, ASIN, ATAN2, CLAMP, CMP_EQ, CMP_GE, CMP_GT, CMP_LE, CMP_LT, COS, CROSS, CURVE,
|
|
96
|
+
DISTANCE, DIV, DOT, EXP, FLOOR, FRACT, HALT, KILL, LENGTH, LOAD_ATTR, LOAD_BUILTIN, LOAD_CONST,
|
|
97
|
+
LOG, MAD, MAX, MIN, MIX, MOV, MUL, NEG, NOP, NORMALIZE, POW, RANDOM, RSQRT, SELECT, SIN,
|
|
98
|
+
SMOOTHSTEP, SQRT, STEP, STORE_ATTR, SUB, TAN,
|
|
99
|
+
} = VM_OP;
|
|
100
|
+
const KIND_REG = VM_KIND.REG;
|
|
101
|
+
const KIND_IMM = VM_KIND.IMM;
|
|
102
|
+
const OPCODE_MASK = VM_OP_MASK;
|
|
103
|
+
const WIDTH_SHIFT = VM_WIDTH_SHIFT;
|
|
104
|
+
const WIDTH_MASK = VM_WIDTH_MASK;
|
|
105
|
+
const DST_SHIFT = VM_DST_SHIFT;
|
|
106
|
+
const DST_MASK = VM_DST_MASK;
|
|
107
|
+
const KIND_SHIFT = VM_KIND_SHIFT;
|
|
108
|
+
const KIND_BITS = VM_KIND_BITS;
|
|
109
|
+
const KIND_MASK = VM_KIND_MASK;
|
|
110
|
+
const OPERAND_BASE_MASK = VM_OPERAND_BASE_MASK;
|
|
111
|
+
const OPERAND_SWIZZLE_SHIFT = VM_OPERAND_SWIZZLE_SHIFT;
|
|
112
|
+
const SWIZZLE_IDENTITY = VM_SWIZZLE_IDENTITY;
|
|
113
|
+
const INSTRUCTION_WORDS = PARTICLE_VM_INSTRUCTION_WORDS;
|
|
114
|
+
const MAX_INSTRUCTIONS = PARTICLE_VM_MAX_INSTRUCTIONS;
|
|
115
|
+
const MAX_WIDTH = VM_MAX_WIDTH;
|
|
116
|
+
|
|
117
|
+
/** Scratch for reading a literal's bits as the `f32` they are. */
|
|
118
|
+
const LITERAL_F32 = new Float32Array(1);
|
|
119
|
+
|
|
120
|
+
/** @type {Uint32Array} the same four bytes */
|
|
121
|
+
const LITERAL_U32 = new Uint32Array(LITERAL_F32.buffer);
|
|
122
|
+
|
|
41
123
|
/**
|
|
42
124
|
* Execute one section of a particle program against a single particle record.
|
|
43
125
|
*
|
|
@@ -45,7 +127,10 @@ export function u32_to_unit_f32(u) {
|
|
|
45
127
|
* particle asked to be destroyed and the advanced RNG state so the caller can persist it.
|
|
46
128
|
*
|
|
47
129
|
* This is the CPU reference semantics — the WGSL interpreter is written to match it exactly, and the
|
|
48
|
-
* parity spec cross-checks them.
|
|
130
|
+
* parity spec cross-checks them. The shape is the interpreter's: every source is resolved, lane by
|
|
131
|
+
* lane as far as the opcode reads it, before the opcode runs, and the destination is written after,
|
|
132
|
+
* so a source may overlap the destination in any way and still mean what it held before the
|
|
133
|
+
* instruction.
|
|
49
134
|
*
|
|
50
135
|
* @param {object} params
|
|
51
136
|
* @param {Uint32Array} params.words instruction words for the section (SPAWN or UPDATE)
|
|
@@ -81,228 +166,264 @@ export function execute_particle_vm({
|
|
|
81
166
|
return u32_to_unit_f32(r.value);
|
|
82
167
|
};
|
|
83
168
|
|
|
84
|
-
|
|
169
|
+
// The three resolved sources and the result, one f32 per lane. Only the lanes an opcode reads
|
|
170
|
+
// are resolved and only the lanes it writes are stored, so nothing here is ever cleared.
|
|
171
|
+
const a = new Float32Array(MAX_WIDTH);
|
|
172
|
+
const b = new Float32Array(MAX_WIDTH);
|
|
173
|
+
const c = new Float32Array(MAX_WIDTH);
|
|
174
|
+
const d = new Float32Array(MAX_WIDTH);
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Resolve a source by the kind its word carries: a register run read through its swizzle, or
|
|
178
|
+
* the one `f32` a literal is in every lane. The only place the kinds are read; every opcode
|
|
179
|
+
* below sees a value, so no opcode has a tagged mode of its own.
|
|
180
|
+
*
|
|
181
|
+
* @param {Float32Array} into
|
|
182
|
+
* @param {number} kind
|
|
183
|
+
* @param {number} word
|
|
184
|
+
* @param {number} lanes
|
|
185
|
+
*/
|
|
186
|
+
const gather = (into, kind, word, lanes) => {
|
|
187
|
+
if (kind === KIND_REG) {
|
|
188
|
+
const base = word & OPERAND_BASE_MASK;
|
|
189
|
+
const pattern = ((word >>> OPERAND_SWIZZLE_SHIFT) & 0xff) ^ SWIZZLE_IDENTITY;
|
|
190
|
+
|
|
191
|
+
for (let i = 0; i < lanes; i++) {
|
|
192
|
+
into[i] = reg[base + ((pattern >>> (2 * i)) & 3)];
|
|
193
|
+
}
|
|
194
|
+
} else if (kind === KIND_IMM) {
|
|
195
|
+
LITERAL_U32[0] = word;
|
|
196
|
+
const value = LITERAL_F32[0];
|
|
197
|
+
|
|
198
|
+
for (let i = 0; i < lanes; i++) {
|
|
199
|
+
into[i] = value;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const instruction_count = Math.min(words.length / INSTRUCTION_WORDS, MAX_INSTRUCTIONS);
|
|
85
205
|
|
|
86
206
|
for (let pc = 0; pc < instruction_count; pc++) {
|
|
87
|
-
const base = pc *
|
|
207
|
+
const base = pc * INSTRUCTION_WORDS;
|
|
88
208
|
const word0 = words[base];
|
|
89
|
-
const op =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
209
|
+
const op = word0 & OPCODE_MASK;
|
|
210
|
+
|
|
211
|
+
if (OP_DEFINED[op] === 0) {
|
|
212
|
+
throw new Error(`ParticleVMReference: unhandled opcode ${op} at pc ${pc}`);
|
|
213
|
+
}
|
|
94
214
|
|
|
95
215
|
/** Lanes this instruction spans. Fixed-width opcodes ignore the encoded field. */
|
|
96
|
-
const
|
|
216
|
+
const fixed_width = OP_WIDTH[op];
|
|
217
|
+
const w = fixed_width < 0 ? (word0 >>> WIDTH_SHIFT) & WIDTH_MASK : fixed_width;
|
|
218
|
+
const dst = (word0 >>> DST_SHIFT) & DST_MASK;
|
|
219
|
+
const kinds = word0 >>> KIND_SHIFT;
|
|
220
|
+
const scalar = OP_SCALAR[op];
|
|
221
|
+
const s0 = words[base + 1];
|
|
222
|
+
const s1 = words[base + 2];
|
|
223
|
+
const s2 = words[base + 3];
|
|
97
224
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
const b = s1;
|
|
102
|
-
const c = s2;
|
|
225
|
+
gather(a, kinds & KIND_MASK, s0, (scalar & 1) !== 0 ? 1 : w);
|
|
226
|
+
gather(b, (kinds >>> KIND_BITS) & KIND_MASK, s1, (scalar & 2) !== 0 ? 1 : w);
|
|
227
|
+
gather(c, (kinds >>> (2 * KIND_BITS)) & KIND_MASK, s2, (scalar & 4) !== 0 ? 1 : w);
|
|
103
228
|
|
|
104
229
|
switch (op) {
|
|
105
|
-
case
|
|
230
|
+
case HALT:
|
|
106
231
|
return { killed, rng_state: state };
|
|
107
|
-
case
|
|
232
|
+
case NOP:
|
|
108
233
|
break;
|
|
109
234
|
|
|
110
|
-
case
|
|
111
|
-
for (let i = 0; i < w; i++)
|
|
235
|
+
case MOV:
|
|
236
|
+
for (let i = 0; i < w; i++) d[i] = a[i];
|
|
112
237
|
break;
|
|
113
238
|
|
|
114
|
-
case
|
|
115
|
-
// The pool is addressed by word, so the operand is where the value starts
|
|
116
|
-
|
|
117
|
-
for (let i = 0; i < w; i++) reg[d + i] = constants[s0 + i];
|
|
239
|
+
case LOAD_CONST:
|
|
240
|
+
// The pool is addressed by word, so the operand is where the value starts.
|
|
241
|
+
for (let i = 0; i < w; i++) d[i] = constants[s0 + i];
|
|
118
242
|
break;
|
|
119
|
-
}
|
|
120
243
|
|
|
121
|
-
case
|
|
244
|
+
case LOAD_ATTR:
|
|
122
245
|
// Lanes past the attribute's component count read zero — a one-component attribute
|
|
123
246
|
// asked for at width 3 is (x, 0, 0), which is what widening it costs: nothing.
|
|
124
|
-
|
|
125
|
-
for (let i = 0; i < w; i++) reg[d + i] = i < comp ? record_f32[off + i] : 0;
|
|
247
|
+
for (let i = 0; i < w; i++) d[i] = i < s1 ? record_f32[s0 + i] : 0;
|
|
126
248
|
break;
|
|
127
|
-
}
|
|
128
249
|
|
|
129
|
-
case
|
|
130
|
-
|
|
131
|
-
for (let i = 0; i < comp; i++) record_f32[off + i] = reg[src + i];
|
|
250
|
+
case STORE_ATTR:
|
|
251
|
+
for (let i = 0; i < s2; i++) record_f32[s1 + i] = a[i];
|
|
132
252
|
break;
|
|
133
|
-
}
|
|
134
253
|
|
|
135
|
-
case
|
|
254
|
+
case LOAD_BUILTIN: {
|
|
136
255
|
const v = builtins[s0] ?? [0, 0, 0, 0];
|
|
137
|
-
for (let i = 0; i < w; i++)
|
|
256
|
+
for (let i = 0; i < w; i++) d[i] = v[i] ?? 0;
|
|
138
257
|
break;
|
|
139
258
|
}
|
|
140
259
|
|
|
141
|
-
case
|
|
142
|
-
if (
|
|
260
|
+
case KILL:
|
|
261
|
+
if (a[0] > 0) killed = true;
|
|
143
262
|
break;
|
|
144
263
|
|
|
145
|
-
case
|
|
146
|
-
for (let i = 0; i < w; i++)
|
|
147
|
-
break;
|
|
148
|
-
case VM_OP.SUB:
|
|
149
|
-
for (let i = 0; i < w; i++) reg[d + i] = reg[a + i] - reg[b + i];
|
|
264
|
+
case ADD:
|
|
265
|
+
for (let i = 0; i < w; i++) d[i] = a[i] + b[i];
|
|
150
266
|
break;
|
|
151
|
-
case
|
|
152
|
-
for (let i = 0; i < w; i++)
|
|
267
|
+
case SUB:
|
|
268
|
+
for (let i = 0; i < w; i++) d[i] = a[i] - b[i];
|
|
153
269
|
break;
|
|
154
|
-
case
|
|
155
|
-
for (let i = 0; i < w; i++)
|
|
270
|
+
case MUL:
|
|
271
|
+
for (let i = 0; i < w; i++) d[i] = a[i] * b[i];
|
|
156
272
|
break;
|
|
157
|
-
case
|
|
158
|
-
for (let i = 0; i < w; i++)
|
|
273
|
+
case DIV:
|
|
274
|
+
for (let i = 0; i < w; i++) d[i] = a[i] / b[i];
|
|
159
275
|
break;
|
|
160
|
-
case
|
|
161
|
-
for (let i = 0; i < w; i++)
|
|
276
|
+
case MAD:
|
|
277
|
+
for (let i = 0; i < w; i++) d[i] = a[i] * b[i] + c[i];
|
|
162
278
|
break;
|
|
163
|
-
case
|
|
164
|
-
for (let i = 0; i < w; i++)
|
|
279
|
+
case MIN:
|
|
280
|
+
for (let i = 0; i < w; i++) d[i] = Math.min(a[i], b[i]);
|
|
165
281
|
break;
|
|
166
|
-
case
|
|
167
|
-
for (let i = 0; i < w; i++)
|
|
282
|
+
case MAX:
|
|
283
|
+
for (let i = 0; i < w; i++) d[i] = Math.max(a[i], b[i]);
|
|
168
284
|
break;
|
|
169
|
-
case
|
|
170
|
-
for (let i = 0; i < w; i++)
|
|
285
|
+
case MIX:
|
|
286
|
+
for (let i = 0; i < w; i++) d[i] = a[i] + (b[i] - a[i]) * c[i];
|
|
171
287
|
break;
|
|
172
|
-
case
|
|
173
|
-
|
|
174
|
-
for (let i = 0; i < w; i++) reg[d + i] = reg[a + i] * scale;
|
|
288
|
+
case CLAMP:
|
|
289
|
+
for (let i = 0; i < w; i++) d[i] = Math.min(Math.max(a[i], b[i]), c[i]);
|
|
175
290
|
break;
|
|
176
|
-
}
|
|
177
291
|
|
|
178
|
-
case
|
|
179
|
-
for (let i = 0; i < w; i++)
|
|
292
|
+
case NEG:
|
|
293
|
+
for (let i = 0; i < w; i++) d[i] = -a[i];
|
|
294
|
+
break;
|
|
295
|
+
case ABS:
|
|
296
|
+
for (let i = 0; i < w; i++) d[i] = Math.abs(a[i]);
|
|
180
297
|
break;
|
|
181
|
-
case
|
|
182
|
-
for (let i = 0; i < w; i++)
|
|
298
|
+
case FLOOR:
|
|
299
|
+
for (let i = 0; i < w; i++) d[i] = Math.floor(a[i]);
|
|
183
300
|
break;
|
|
184
|
-
case
|
|
185
|
-
for (let i = 0; i < w; i++)
|
|
301
|
+
case FRACT:
|
|
302
|
+
for (let i = 0; i < w; i++) d[i] = a[i] - Math.floor(a[i]);
|
|
186
303
|
break;
|
|
187
|
-
case
|
|
188
|
-
for (let i = 0; i < w; i++)
|
|
304
|
+
case SQRT:
|
|
305
|
+
for (let i = 0; i < w; i++) d[i] = Math.sqrt(a[i]);
|
|
189
306
|
break;
|
|
190
|
-
case
|
|
191
|
-
for (let i = 0; i < w; i++)
|
|
307
|
+
case SIN:
|
|
308
|
+
for (let i = 0; i < w; i++) d[i] = Math.sin(a[i]);
|
|
192
309
|
break;
|
|
193
|
-
case
|
|
194
|
-
for (let i = 0; i < w; i++)
|
|
310
|
+
case COS:
|
|
311
|
+
for (let i = 0; i < w; i++) d[i] = Math.cos(a[i]);
|
|
195
312
|
break;
|
|
196
|
-
case
|
|
197
|
-
for (let i = 0; i < w; i++)
|
|
313
|
+
case EXP:
|
|
314
|
+
for (let i = 0; i < w; i++) d[i] = Math.exp(a[i]);
|
|
198
315
|
break;
|
|
199
|
-
case
|
|
200
|
-
for (let i = 0; i < w; i++)
|
|
316
|
+
case LOG:
|
|
317
|
+
for (let i = 0; i < w; i++) d[i] = Math.log(a[i]);
|
|
201
318
|
break;
|
|
202
|
-
case
|
|
203
|
-
for (let i = 0; i < w; i++)
|
|
319
|
+
case POW:
|
|
320
|
+
for (let i = 0; i < w; i++) d[i] = Math.pow(a[i], b[i]);
|
|
204
321
|
break;
|
|
205
|
-
case
|
|
206
|
-
for (let i = 0; i < w; i++)
|
|
322
|
+
case STEP:
|
|
323
|
+
for (let i = 0; i < w; i++) d[i] = b[i] < a[i] ? 0 : 1;
|
|
207
324
|
break;
|
|
208
|
-
case
|
|
209
|
-
for (let i = 0; i < w; i++)
|
|
325
|
+
case SMOOTHSTEP:
|
|
326
|
+
for (let i = 0; i < w; i++) d[i] = smoothstep(a[i], b[i], c[i]);
|
|
210
327
|
break;
|
|
211
|
-
|
|
212
|
-
|
|
328
|
+
// WGSL's `inverseSqrt`. Spelled as the reciprocal of a root rather than approximated,
|
|
329
|
+
// because the reference is the definition the hardware's estimate is measured against.
|
|
330
|
+
case RSQRT:
|
|
331
|
+
for (let i = 0; i < w; i++) d[i] = 1 / Math.sqrt(a[i]);
|
|
332
|
+
break;
|
|
333
|
+
case TAN:
|
|
334
|
+
for (let i = 0; i < w; i++) d[i] = Math.tan(a[i]);
|
|
335
|
+
break;
|
|
336
|
+
case ASIN:
|
|
337
|
+
for (let i = 0; i < w; i++) d[i] = Math.asin(a[i]);
|
|
338
|
+
break;
|
|
339
|
+
case ACOS:
|
|
340
|
+
for (let i = 0; i < w; i++) d[i] = Math.acos(a[i]);
|
|
341
|
+
break;
|
|
342
|
+
// `y` first, as `Math.atan2` and WGSL's `atan2` both take it.
|
|
343
|
+
case ATAN2:
|
|
344
|
+
for (let i = 0; i < w; i++) d[i] = Math.atan2(a[i], b[i]);
|
|
213
345
|
break;
|
|
214
346
|
|
|
215
|
-
// The reductions write a single lane
|
|
216
|
-
//
|
|
217
|
-
case
|
|
347
|
+
// The reductions write a single lane; whatever wants the result wider reads it through
|
|
348
|
+
// an `.xxxx` swizzle.
|
|
349
|
+
case DOT: {
|
|
218
350
|
let dp = 0;
|
|
219
|
-
for (let i = 0; i < w; i++) dp +=
|
|
220
|
-
|
|
351
|
+
for (let i = 0; i < w; i++) dp += a[i] * b[i];
|
|
352
|
+
d[0] = dp;
|
|
221
353
|
break;
|
|
222
354
|
}
|
|
223
|
-
case
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
reg[d] = ay * bz - az * by;
|
|
228
|
-
reg[d + 1] = az * bx - ax * bz;
|
|
229
|
-
reg[d + 2] = ax * by - ay * bx;
|
|
355
|
+
case CROSS:
|
|
356
|
+
d[0] = a[1] * b[2] - a[2] * b[1];
|
|
357
|
+
d[1] = a[2] * b[0] - a[0] * b[2];
|
|
358
|
+
d[2] = a[0] * b[1] - a[1] * b[0];
|
|
230
359
|
// A fourth lane, if asked for, is the zero the opcode used to append.
|
|
231
|
-
|
|
360
|
+
d[3] = 0;
|
|
232
361
|
break;
|
|
233
|
-
|
|
234
|
-
case VM_OP.LENGTH: {
|
|
362
|
+
case LENGTH: {
|
|
235
363
|
let sum = 0;
|
|
236
|
-
for (let i = 0; i < w; i++) sum +=
|
|
237
|
-
|
|
364
|
+
for (let i = 0; i < w; i++) sum += a[i] * a[i];
|
|
365
|
+
d[0] = Math.sqrt(sum);
|
|
238
366
|
break;
|
|
239
367
|
}
|
|
240
|
-
case
|
|
368
|
+
case NORMALIZE: {
|
|
241
369
|
let sum = 0;
|
|
242
|
-
for (let i = 0; i < w; i++) sum +=
|
|
370
|
+
for (let i = 0; i < w; i++) sum += a[i] * a[i];
|
|
243
371
|
const len = Math.sqrt(sum);
|
|
244
372
|
const inv = len > 0 ? 1 / len : 0;
|
|
245
|
-
for (let i = 0; i < w; i++)
|
|
373
|
+
for (let i = 0; i < w; i++) d[i] = a[i] * inv;
|
|
246
374
|
break;
|
|
247
375
|
}
|
|
248
|
-
case
|
|
376
|
+
case DISTANCE: {
|
|
249
377
|
let sum = 0;
|
|
250
378
|
for (let i = 0; i < w; i++) {
|
|
251
|
-
const e =
|
|
379
|
+
const e = a[i] - b[i];
|
|
252
380
|
sum += e * e;
|
|
253
381
|
}
|
|
254
|
-
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
case VM_OP.SWIZZLE: {
|
|
258
|
-
// Selected lanes are read before any is written, so an in-place swizzle is safe.
|
|
259
|
-
const pattern = s1;
|
|
260
|
-
const l0 = reg[a + (pattern & 3)];
|
|
261
|
-
const l1 = reg[a + ((pattern >> 2) & 3)];
|
|
262
|
-
const l2 = reg[a + ((pattern >> 4) & 3)];
|
|
263
|
-
const l3 = reg[a + ((pattern >> 6) & 3)];
|
|
264
|
-
if (w > 0) reg[d] = l0;
|
|
265
|
-
if (w > 1) reg[d + 1] = l1;
|
|
266
|
-
if (w > 2) reg[d + 2] = l2;
|
|
267
|
-
if (w > 3) reg[d + 3] = l3;
|
|
382
|
+
d[0] = Math.sqrt(sum);
|
|
268
383
|
break;
|
|
269
384
|
}
|
|
270
385
|
|
|
271
|
-
case
|
|
272
|
-
for (let i = 0; i < w; i++)
|
|
386
|
+
case CMP_LT:
|
|
387
|
+
for (let i = 0; i < w; i++) d[i] = a[i] < b[i] ? 1 : 0;
|
|
273
388
|
break;
|
|
274
|
-
case
|
|
275
|
-
for (let i = 0; i < w; i++)
|
|
389
|
+
case CMP_LE:
|
|
390
|
+
for (let i = 0; i < w; i++) d[i] = a[i] <= b[i] ? 1 : 0;
|
|
276
391
|
break;
|
|
277
|
-
case
|
|
278
|
-
for (let i = 0; i < w; i++)
|
|
392
|
+
case CMP_GT:
|
|
393
|
+
for (let i = 0; i < w; i++) d[i] = a[i] > b[i] ? 1 : 0;
|
|
279
394
|
break;
|
|
280
|
-
case
|
|
281
|
-
for (let i = 0; i < w; i++)
|
|
395
|
+
case CMP_GE:
|
|
396
|
+
for (let i = 0; i < w; i++) d[i] = a[i] >= b[i] ? 1 : 0;
|
|
282
397
|
break;
|
|
283
|
-
case
|
|
284
|
-
for (let i = 0; i < w; i++)
|
|
398
|
+
case CMP_EQ:
|
|
399
|
+
for (let i = 0; i < w; i++) d[i] = a[i] === b[i] ? 1 : 0;
|
|
285
400
|
break;
|
|
286
|
-
case
|
|
287
|
-
for (let i = 0; i < w; i++)
|
|
401
|
+
case SELECT:
|
|
402
|
+
for (let i = 0; i < w; i++) d[i] = c[i] > 0.5 ? b[i] : a[i];
|
|
288
403
|
break;
|
|
289
404
|
|
|
290
|
-
// One draw per lane. Draw counts are part of the program's meaning — the
|
|
291
|
-
// sequence, so one fewer moves every value after it
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
for (let i = 0; i < w; i++) reg[d + i] = draw_unit();
|
|
405
|
+
// One draw per lane, in lane order. Draw counts are part of the program's meaning — the
|
|
406
|
+
// draws are a sequence, so one fewer moves every value after it.
|
|
407
|
+
case RANDOM:
|
|
408
|
+
for (let i = 0; i < w; i++) d[i] = draw_unit();
|
|
295
409
|
break;
|
|
296
410
|
|
|
297
|
-
case
|
|
298
|
-
const v = sampleCurve(s0,
|
|
299
|
-
for (let i = 0; i < w; i++)
|
|
411
|
+
case CURVE: {
|
|
412
|
+
const v = sampleCurve(s0, b[0]);
|
|
413
|
+
for (let i = 0; i < w; i++) d[i] = v;
|
|
300
414
|
break;
|
|
301
415
|
}
|
|
302
416
|
|
|
303
417
|
default:
|
|
304
418
|
throw new Error(`ParticleVMReference: unhandled opcode ${op} at pc ${pc}`);
|
|
305
419
|
}
|
|
420
|
+
|
|
421
|
+
const fixed_dest = OP_DEST[op];
|
|
422
|
+
const dest = fixed_dest < 0 ? w : fixed_dest;
|
|
423
|
+
|
|
424
|
+
for (let i = 0; i < dest; i++) {
|
|
425
|
+
reg[dst + i] = d[i];
|
|
426
|
+
}
|
|
306
427
|
}
|
|
307
428
|
|
|
308
429
|
return { killed, rng_state: state };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk_particle_vm.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/chunk_particle_vm.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chunk_particle_vm.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/vm/chunk_particle_vm.js"],"names":[],"mappings":"AA6UA;;;GAGG;AACH,gCAFU,SAAS,CAEmG;0BAhV5F,oCAAoC"}
|