@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,283 @@
|
|
|
1
|
+
import { assert } from "../../../../../core/assert.js";
|
|
2
|
+
import { PV } from "./particle_vector_graph.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Choose one node per class — the instruction-count half of the optimizer.
|
|
6
|
+
*
|
|
7
|
+
* Most classes hold one node and there is nothing to choose. The ones that hold two are where a
|
|
8
|
+
* rewrite's worth was not local: `a * b + c` as a `MAD` costs one instruction and as `MUL` then
|
|
9
|
+
* `ADD` costs two, but the `MAD` only SAVES one if nothing else reads the product. So the cost that
|
|
10
|
+
* matters is the DAG cost — every distinct node counted once, which is exactly the instruction count
|
|
11
|
+
* — and not the tree cost, which would count a shared subexpression once per reader and talk itself
|
|
12
|
+
* into duplicating work.
|
|
13
|
+
*
|
|
14
|
+
* ## Why this is a greedy and not an exact solver
|
|
15
|
+
*
|
|
16
|
+
* DAG-cost extraction is NP-hard in general (reduction from minimum set cover), and the literature's
|
|
17
|
+
* answer at this scale is an ILP. That would mean a solver, and there is no solver in this tree and
|
|
18
|
+
* no appetite for vendoring one. What is here instead is the standard two-step: a bottom-up
|
|
19
|
+
* relaxation to a consistent choice, then hill-climbing on the classes that actually have a choice,
|
|
20
|
+
* each flip scored by re-measuring the whole reachable set.
|
|
21
|
+
*
|
|
22
|
+
* ## The climb does nothing today, and that is worth saying
|
|
23
|
+
*
|
|
24
|
+
* With the one alternative there is — `MAD` beside `MUL` then `ADD` — the seed is already optimal,
|
|
25
|
+
* and it was measured to be: over the whole effect corpus, switching the climb off changes neither an
|
|
26
|
+
* instruction nor a slot. The reason is that a `MAD` is never WORSE than the pair. Choosing it costs
|
|
27
|
+
* one instruction and leaves the product to be counted only if something else still reads it, so its
|
|
28
|
+
* DAG cost is at most the pair's, and the bottom-up relaxation — which prefers it on tree cost, where
|
|
29
|
+
* it is strictly cheaper — lands on the answer without help.
|
|
30
|
+
*
|
|
31
|
+
* The climb stays because the seed's agreement is a property of THAT rule and not of the pipeline. A
|
|
32
|
+
* rule whose alternative is dearer where it is shared — a fused operation that costs more than one
|
|
33
|
+
* instruction, an operation with a wider destination — has a tree cost that says the wrong thing, and
|
|
34
|
+
* the climb is what corrects it. `./particle_vector_extract.spec.js` exercises exactly that, through the
|
|
35
|
+
* `node_cost` the caller may pass, so the machinery is held to its purpose rather than to the one
|
|
36
|
+
* rule that happens not to need it.
|
|
37
|
+
*
|
|
38
|
+
* The relaxation is also what keeps extraction honest about cycles. A class can only be given a cost
|
|
39
|
+
* through nodes whose children already have one, so a node that could only be reached through its own
|
|
40
|
+
* class never gets a finite cost and is never chosen, whatever the rules did.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* What a node costs. Everything is one instruction except a literal, which is usually an operand
|
|
45
|
+
* rather than an instruction — priced below one so that folding is preferred, and above zero so that
|
|
46
|
+
* a fold is not preferred over a value that was already going to be computed anyway.
|
|
47
|
+
*
|
|
48
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorNode} node
|
|
49
|
+
* @returns {number}
|
|
50
|
+
*/
|
|
51
|
+
export function particle_vector_node_cost(node) {
|
|
52
|
+
return node.op === PV.CONST ? 0.5 : 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @typedef {object} ParticleValueExtraction
|
|
57
|
+
* @property {Map<number, number>} choice per class, the node chosen for it
|
|
58
|
+
* @property {number[]} order the demanded classes, every class after the ones it reads
|
|
59
|
+
* @property {number} cost the DAG cost of that choice
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
64
|
+
* @param {number[]} roots classes the program has to compute
|
|
65
|
+
* @param {object} [options]
|
|
66
|
+
* @param {function(import("./particle_vector_graph.js").ParticleVectorNode): number} [options.node_cost]
|
|
67
|
+
* @param {number} [options.max_rounds] hill-climbing sweeps over the classes that have a choice
|
|
68
|
+
* @param {number} [options.max_evaluations] flips to score before settling for what is in hand; a
|
|
69
|
+
* guard so a pathological program cannot make extraction the slow part of a build
|
|
70
|
+
* @returns {ParticleValueExtraction}
|
|
71
|
+
*/
|
|
72
|
+
export function extract_particle_values(graph, roots, {
|
|
73
|
+
node_cost = particle_vector_node_cost,
|
|
74
|
+
max_rounds = 8,
|
|
75
|
+
max_evaluations = 4096,
|
|
76
|
+
} = {}) {
|
|
77
|
+
const choice = seed_choice(graph, node_cost);
|
|
78
|
+
const canonical = [...new Set(roots.map(root => graph.find(root)))];
|
|
79
|
+
|
|
80
|
+
let reached = reachable(graph, canonical, choice);
|
|
81
|
+
let cost = dag_cost(graph, reached, choice, node_cost);
|
|
82
|
+
let evaluations = 0;
|
|
83
|
+
|
|
84
|
+
for (let round = 0; round < max_rounds && evaluations < max_evaluations; round++) {
|
|
85
|
+
let improved = false;
|
|
86
|
+
|
|
87
|
+
// Only the classes that are both reachable and hold more than one node are a decision; with
|
|
88
|
+
// one alternative-generating rule that is a handful of products per program.
|
|
89
|
+
for (const id of [...reached].sort((a, b) => a - b)) {
|
|
90
|
+
const members = graph.members(id);
|
|
91
|
+
|
|
92
|
+
if (members.length < 2 || evaluations >= max_evaluations) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const before = choice.get(id);
|
|
97
|
+
|
|
98
|
+
for (const member of members) {
|
|
99
|
+
if (member === before) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
evaluations++;
|
|
104
|
+
choice.set(id, member);
|
|
105
|
+
|
|
106
|
+
const trial_reached = reachable(graph, canonical, choice);
|
|
107
|
+
const trial_cost = dag_cost(graph, trial_reached, choice, node_cost);
|
|
108
|
+
|
|
109
|
+
// Strictly better only, so the climb cannot walk in a circle over spellings that cost
|
|
110
|
+
// the same — and so a class it settles on is a class it had a reason to move.
|
|
111
|
+
if (trial_cost < cost) {
|
|
112
|
+
improved = true;
|
|
113
|
+
reached = trial_reached;
|
|
114
|
+
cost = trial_cost;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
choice.set(id, before);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!improved) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return { choice, order: topological(graph, reached, choice), cost };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* A consistent choice to start from: per class, the node whose own cost plus its children's is least,
|
|
132
|
+
* relaxed until nothing moves.
|
|
133
|
+
*
|
|
134
|
+
* This is the TREE cost, which over-counts sharing — but it is only a starting point, and it is the
|
|
135
|
+
* one starting point guaranteed to be well-founded, since a class only gets a cost once some node in
|
|
136
|
+
* it has children that all have one.
|
|
137
|
+
*
|
|
138
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
139
|
+
* @param {function(import("./particle_vector_graph.js").ParticleVectorNode): number} node_cost
|
|
140
|
+
* @returns {Map<number, number>} per class, the node chosen
|
|
141
|
+
*/
|
|
142
|
+
function seed_choice(graph, node_cost) {
|
|
143
|
+
/** @type {Map<number, number>} */
|
|
144
|
+
const choice = new Map();
|
|
145
|
+
/** @type {Map<number, number>} */
|
|
146
|
+
const cost = new Map();
|
|
147
|
+
|
|
148
|
+
// Classes are visited oldest first and a node's children are almost always older than it, so this
|
|
149
|
+
// settles in two sweeps for anything the rules build; the loop is what covers the "almost".
|
|
150
|
+
for (let changed = true; changed;) {
|
|
151
|
+
changed = false;
|
|
152
|
+
|
|
153
|
+
for (const [id, members] of graph.class_nodes) {
|
|
154
|
+
for (const member of members) {
|
|
155
|
+
const node = graph.node(member);
|
|
156
|
+
let total = node_cost(node);
|
|
157
|
+
|
|
158
|
+
for (const child of node.children) {
|
|
159
|
+
const child_cost = cost.get(graph.find(child));
|
|
160
|
+
|
|
161
|
+
if (child_cost === undefined) {
|
|
162
|
+
total = Infinity;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
total += child_cost;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (total < (cost.get(id) ?? Infinity)) {
|
|
170
|
+
cost.set(id, total);
|
|
171
|
+
choice.set(id, member);
|
|
172
|
+
changed = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return choice;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
183
|
+
* @param {Map<number, number>} choice
|
|
184
|
+
* @param {number} id a canonical class
|
|
185
|
+
* @returns {import("./particle_vector_graph.js").ParticleVectorNode}
|
|
186
|
+
*/
|
|
187
|
+
function chosen(graph, choice, id) {
|
|
188
|
+
const node = choice.get(id);
|
|
189
|
+
|
|
190
|
+
assert.defined(node, `particle value extraction: class ${id} has no node whose cost is finite`);
|
|
191
|
+
|
|
192
|
+
return graph.node(node);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
197
|
+
* @param {number[]} roots canonical class ids
|
|
198
|
+
* @param {Map<number, number>} choice
|
|
199
|
+
* @returns {Set<number>} every class the roots reach through the chosen nodes
|
|
200
|
+
*/
|
|
201
|
+
function reachable(graph, roots, choice) {
|
|
202
|
+
const seen = new Set();
|
|
203
|
+
const stack = [...roots];
|
|
204
|
+
|
|
205
|
+
while (stack.length > 0) {
|
|
206
|
+
const id = stack.pop();
|
|
207
|
+
|
|
208
|
+
if (seen.has(id)) {
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
seen.add(id);
|
|
213
|
+
|
|
214
|
+
for (const child of chosen(graph, choice, id).children) {
|
|
215
|
+
stack.push(graph.find(child));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return seen;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
224
|
+
* @param {Set<number>} reached
|
|
225
|
+
* @param {Map<number, number>} choice
|
|
226
|
+
* @param {function(import("./particle_vector_graph.js").ParticleVectorNode): number} node_cost
|
|
227
|
+
* @returns {number} every distinct chosen node counted once — the instruction count, near enough
|
|
228
|
+
*/
|
|
229
|
+
function dag_cost(graph, reached, choice, node_cost) {
|
|
230
|
+
let total = 0;
|
|
231
|
+
|
|
232
|
+
for (const id of reached) {
|
|
233
|
+
total += node_cost(chosen(graph, choice, id));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return total;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @param {import("./particle_vector_graph.js").ParticleVectorGraph} graph
|
|
241
|
+
* @param {Set<number>} reached
|
|
242
|
+
* @param {Map<number, number>} choice
|
|
243
|
+
* @returns {number[]} the reached classes, every one after the classes its chosen node reads
|
|
244
|
+
*/
|
|
245
|
+
function topological(graph, reached, choice) {
|
|
246
|
+
/** @type {number[]} */
|
|
247
|
+
const order = [];
|
|
248
|
+
const done = new Set();
|
|
249
|
+
|
|
250
|
+
for (const root of [...reached].sort((a, b) => a - b)) {
|
|
251
|
+
if (done.has(root)) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const stack = [{ id: root, next: 0 }];
|
|
256
|
+
|
|
257
|
+
while (stack.length > 0) {
|
|
258
|
+
const frame = stack[stack.length - 1];
|
|
259
|
+
const children = chosen(graph, choice, frame.id).children;
|
|
260
|
+
|
|
261
|
+
if (done.has(frame.id)) {
|
|
262
|
+
stack.pop();
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (frame.next < children.length) {
|
|
267
|
+
const child = graph.find(children[frame.next++]);
|
|
268
|
+
|
|
269
|
+
if (!done.has(child)) {
|
|
270
|
+
stack.push({ id: child, next: 0 });
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
done.add(frame.id);
|
|
277
|
+
order.push(frame.id);
|
|
278
|
+
stack.pop();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return order;
|
|
283
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node kinds with no opcode of their own. Above every {@link VM_OP } number.
|
|
3
|
+
*/
|
|
4
|
+
export type PV = number;
|
|
5
|
+
export namespace PV {
|
|
6
|
+
let CONST: number;
|
|
7
|
+
let ATTR: number;
|
|
8
|
+
let BUILD: number;
|
|
9
|
+
}
|
|
10
|
+
export class ParticleVectorGraph {
|
|
11
|
+
/**
|
|
12
|
+
* @param {object} [params]
|
|
13
|
+
* @param {ParticleVectorRule[]} [params.rules]
|
|
14
|
+
*/
|
|
15
|
+
constructor({ rules, share_window }?: {
|
|
16
|
+
rules?: ParticleVectorRule[];
|
|
17
|
+
});
|
|
18
|
+
/** @type {ParticleVectorRule[]} */
|
|
19
|
+
rules: ParticleVectorRule[];
|
|
20
|
+
/**
|
|
21
|
+
* How far back a value may have been computed and still be reused rather than recomputed.
|
|
22
|
+
*
|
|
23
|
+
* Sharing is not free on a machine with forty-eight registers. A value computed once and read
|
|
24
|
+
* a thousand instructions later occupies its run for all of them: `curl3` measures at 57
|
|
25
|
+
* slots with sharing unbounded and 33 with none — for 1,100 instructions either way. So the
|
|
26
|
+
* question is never whether to share but WHICH sharings are free, and the pass pipeline
|
|
27
|
+
* answers it without seeming to think about it: its common-subexpression pass can only reuse
|
|
28
|
+
* a value still in its register, so it takes the sharing that extends no live range and
|
|
29
|
+
* recomputes the rest. This is that policy with a number on it, and the number is a rung of
|
|
30
|
+
* the ladder in `./optimize_particle_program_vector.js` rather than a constant, because how
|
|
31
|
+
* much sharing a program can afford is a property of the program.
|
|
32
|
+
*
|
|
33
|
+
* @type {number}
|
|
34
|
+
*/
|
|
35
|
+
share_window: number;
|
|
36
|
+
/** @type {ParticleVectorNode[]} */
|
|
37
|
+
nodes: ParticleVectorNode[];
|
|
38
|
+
/** @type {Map<string, number>} */
|
|
39
|
+
interned: Map<string, number>;
|
|
40
|
+
/** @type {number[]} per node, the class it was created as */
|
|
41
|
+
class_of: number[];
|
|
42
|
+
/** @type {Uint32Array} union-find over class ids */
|
|
43
|
+
parent: Uint32Array;
|
|
44
|
+
/** @type {Map<number, number[]>} per class root, the nodes in it */
|
|
45
|
+
class_nodes: Map<number, number[]>;
|
|
46
|
+
/** @type {Map<number, number>} per class root, the magnitude bound on the integer it holds */
|
|
47
|
+
class_bound: Map<number, number>;
|
|
48
|
+
/** @returns {number} */
|
|
49
|
+
get size(): number;
|
|
50
|
+
/**
|
|
51
|
+
* @param {number} id
|
|
52
|
+
* @returns {number} the class root
|
|
53
|
+
*/
|
|
54
|
+
find(id: number): number;
|
|
55
|
+
/** @param {number} id @returns {ParticleVectorNode} */
|
|
56
|
+
node(id: number): ParticleVectorNode;
|
|
57
|
+
/** @param {number} id @returns {number[]} */
|
|
58
|
+
members(id: number): number[];
|
|
59
|
+
/** @param {number} id @returns {number} */
|
|
60
|
+
width_of(id: number): number;
|
|
61
|
+
/** @param {number} id @returns {number} */
|
|
62
|
+
bound_of(id: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* The literal a value is, lane by lane — `null` where it is not one.
|
|
65
|
+
*
|
|
66
|
+
* @param {number} id
|
|
67
|
+
* @returns {number[]|null}
|
|
68
|
+
*/
|
|
69
|
+
constants_of(id: number): number[] | null;
|
|
70
|
+
/**
|
|
71
|
+
* The literal one lane of a value is.
|
|
72
|
+
*
|
|
73
|
+
* @param {number} id
|
|
74
|
+
* @param {number} lane
|
|
75
|
+
* @returns {number|null}
|
|
76
|
+
*/
|
|
77
|
+
constant_at(id: number, lane: number): number | null;
|
|
78
|
+
/**
|
|
79
|
+
* A vector of literals.
|
|
80
|
+
*
|
|
81
|
+
* @param {...number} values one per lane, at least one
|
|
82
|
+
* @returns {number} a class
|
|
83
|
+
*/
|
|
84
|
+
constant(...values: number[]): number;
|
|
85
|
+
/**
|
|
86
|
+
* Build a value — or find the one that already means this, or the better one a rule knows.
|
|
87
|
+
*
|
|
88
|
+
* @param {Partial<ParticleVectorNode>} shape
|
|
89
|
+
* @returns {number} a class
|
|
90
|
+
*/
|
|
91
|
+
make({ op, width, operand_width, children, patterns, imm }: Partial<ParticleVectorNode>): number;
|
|
92
|
+
/**
|
|
93
|
+
* Record that a node means the same as an existing class — for a rewrite whose worth is not
|
|
94
|
+
* local, and which extraction should therefore be the one to take or leave.
|
|
95
|
+
*
|
|
96
|
+
* @param {number} id
|
|
97
|
+
* @param {number} alternative
|
|
98
|
+
*/
|
|
99
|
+
add_alternative(id: number, alternative: number): void;
|
|
100
|
+
#private;
|
|
101
|
+
}
|
|
102
|
+
export type ParticleVectorNode = {
|
|
103
|
+
/**
|
|
104
|
+
* a {@link VM_OP } or a {@link PV }
|
|
105
|
+
*/
|
|
106
|
+
op: number;
|
|
107
|
+
/**
|
|
108
|
+
* lanes the VALUE has, `1..4`
|
|
109
|
+
*/
|
|
110
|
+
width: number;
|
|
111
|
+
/**
|
|
112
|
+
* lanes each source is read at, which is the instruction's width
|
|
113
|
+
* field. The same as `width` for anything lanewise; three for a `CROSS`, and the operand's own
|
|
114
|
+
* width for a reduction, which reads many lanes to write one.
|
|
115
|
+
*/
|
|
116
|
+
operand_width: number;
|
|
117
|
+
/**
|
|
118
|
+
* the values its sources read, one per source
|
|
119
|
+
*/
|
|
120
|
+
children: number[];
|
|
121
|
+
/**
|
|
122
|
+
* per source, the swizzle it reads that value through — or, for
|
|
123
|
+
* `BUILD`, the single lane it takes
|
|
124
|
+
*/
|
|
125
|
+
patterns: number[];
|
|
126
|
+
/**
|
|
127
|
+
* static fields: literal bits, a record word, a builtin id, a curve handle,
|
|
128
|
+
* the first draw of a `RANDOM`
|
|
129
|
+
*/
|
|
130
|
+
imm: number[];
|
|
131
|
+
};
|
|
132
|
+
export type ParticleVectorRule = (graph: ParticleVectorGraph, node: ParticleVectorNode) => number;
|
|
133
|
+
//# sourceMappingURL=particle_vector_graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particle_vector_graph.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js"],"names":[],"mappings":";;;iBA+CU,MAAM;;;;;;AAmChB;IACI;;;OAGG;IACH;QAFyC,KAAK,GAAnC,kBAAkB,EAAE;OAiC9B;IA9BG,mCAAmC;IACnC,OADW,kBAAkB,EAAE,CACb;IAClB;;;;;;;;;;;;;;OAcG;IACH,cAFU,MAAM,CAEgB;IAChC,mCAAmC;IACnC,OADW,kBAAkB,EAAE,CAChB;IACf,kCAAkC;IAClC,UADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACL;IACzB,6DAA6D;IAC7D,UADW,MAAM,EAAE,CACD;IAClB,oDAAoD;IACpD,QADW,WAAW,CACU;IAChC,oEAAoE;IACpE,aADW,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC,CACJ;IAC5B,8FAA8F;IAC9F,aADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACF;IAGhC,wBAAwB;IACxB,mBAEC;IAED;;;OAGG;IACH,SAHW,MAAM,GACJ,MAAM,CAMlB;IAED,uDAAuD;IACvD,SADY,MAAM,GAAe,kBAAkB,CAGlD;IAED,6CAA6C;IAC7C,YADY,MAAM,GAAe,MAAM,EAAE,CAGxC;IAED,2CAA2C;IAC3C,aADY,MAAM,GAAe,MAAM,CAGtC;IAED,2CAA2C;IAC3C,aADY,MAAM,GAAe,MAAM,CAGtC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,GACJ,MAAM,EAAE,GAAC,IAAI,CAUzB;IAED;;;;;;OAMG;IACH,gBAJW,MAAM,QACN,MAAM,GACJ,MAAM,GAAC,IAAI,CAMvB;IAED;;;;;OAKG;IACH,oBAHc,MAAM,KACP,MAAM,CAUlB;IAED;;;;;OAKG;IACH,4DAHW,QAAQ,kBAAkB,CAAC,GACzB,MAAM,CAkDlB;IAED;;;;;;OAMG;IACH,oBAHW,MAAM,eACN,MAAM,QAgChB;;CAwCJ;;;;;QAjRa,MAAM;;;;WACN,MAAM;;;;;;mBACN,MAAM;;;;cAGN,MAAM,EAAE;;;;;cACR,MAAM,EAAE;;;;;SAER,MAAM,EAAE;;yCAMX,mBAAmB,QACnB,kBAAkB,KAChB,MAAM"}
|