@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.
Files changed (410) hide show
  1. package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  3. package/editor/particles/effect/ParticleEffectDocument.js +38 -17
  4. package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
  5. package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
  6. package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
  7. package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
  8. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  9. package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
  10. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  11. package/editor/view/node-graph/NodeGraphView.js +84 -8
  12. package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
  13. package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
  14. package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
  15. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
  16. package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
  17. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
  18. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
  19. package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
  20. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  21. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
  22. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
  23. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
  24. package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
  25. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
  26. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  27. package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
  28. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  29. package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
  30. package/editor/view/particles/effect/particle-editor.css +123 -35
  31. package/package.json +1 -1
  32. package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
  33. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  34. package/src/core/binary/allocator/OffsetAllocator.js +10 -1
  35. package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
  36. package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
  37. package/src/core/collection/array/typed/float32_array_hash.js +38 -0
  38. package/src/core/graph/csr/CSRGraph.d.ts +8 -1
  39. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  40. package/src/core/graph/csr/CSRGraph.js +14 -6
  41. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
  42. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
  43. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
  44. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
  45. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  46. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
  47. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
  48. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
  49. package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
  50. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
  51. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
  52. package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
  53. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
  54. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
  55. package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
  56. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
  57. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
  58. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
  59. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
  60. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
  61. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
  62. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
  63. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
  64. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
  65. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
  66. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
  67. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
  68. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
  69. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
  70. package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
  71. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
  72. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
  74. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
  75. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
  76. package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
  77. package/src/engine/animation/AnimationUtils.js +246 -246
  78. package/src/engine/animation/Animations.js +74 -74
  79. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
  80. package/src/engine/ecs/EventType.d.ts +0 -1
  81. package/src/engine/ecs/EventType.js +1 -26
  82. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
  83. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  84. package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
  85. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  86. package/src/engine/ecs/parent/EntityNode.js +4 -9
  87. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  88. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
  89. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
  90. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
  91. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
  92. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
  93. package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
  94. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
  95. package/src/engine/ecs/transform/t64_announce_change.js +12 -12
  96. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
  97. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
  98. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
  99. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  100. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
  101. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  102. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
  103. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  104. package/src/engine/graphics3/LightSystem.js +4 -8
  105. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  106. package/src/engine/graphics3/MeshSystem.js +9 -19
  107. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  108. package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
  109. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  110. package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
  111. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
  112. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  113. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
  114. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
  115. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  116. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  117. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  118. package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
  119. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
  120. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  121. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
  122. package/src/shade/playground/particle_editor/README.md +43 -2
  123. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  124. package/src/shade/playground/particle_system/particle_prototype.js +4 -5
  125. package/src/shade/playground/particle_system/particle_scene.js +4 -4
  126. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  127. package/src/shade/renderer/Renderer.js +13 -1
  128. package/src/shade/renderer/particles/DESIGN.md +104 -19
  129. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
  130. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  131. package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
  132. package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
  133. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  134. package/src/shade/renderer/particles/ParticleConstants.js +66 -23
  135. package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
  136. package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
  137. package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
  138. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  139. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
  140. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
  141. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
  142. package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
  143. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
  144. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
  145. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
  146. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
  148. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
  149. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
  151. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
  153. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
  155. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
  157. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
  158. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
  159. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
  160. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
  161. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
  162. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
  163. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
  164. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  165. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
  166. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
  167. package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
  168. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
  169. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
  170. package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
  171. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
  172. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
  173. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
  174. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
  175. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  176. package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
  177. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  178. package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
  179. package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
  180. package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
  181. package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
  182. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
  183. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  184. package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
  185. package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
  186. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  187. package/src/shade/renderer/particles/graph_particles.js +105 -262
  188. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  189. package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
  190. package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
  191. package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
  192. package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
  193. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
  194. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  195. package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
  196. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
  197. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  198. package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
  199. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
  200. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
  202. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
  203. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  204. package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
  205. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
  206. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
  207. package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
  208. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
  209. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  210. package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
  211. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
  212. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
  213. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
  214. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
  215. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
  216. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
  217. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
  218. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
  219. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
  220. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
  221. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
  222. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
  223. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
  224. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
  225. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
  226. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
  227. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
  228. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
  229. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
  230. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
  231. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
  232. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
  233. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
  234. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
  235. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
  236. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  237. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
  238. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
  239. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
  240. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
  241. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
  242. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  243. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
  244. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
  245. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  246. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
  247. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
  248. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
  249. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
  250. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
  251. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  252. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
  253. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
  254. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
  255. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
  256. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
  257. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  258. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
  259. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  260. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
  261. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  262. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
  263. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
  264. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
  265. package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
  266. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  267. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
  268. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  269. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
  270. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  271. package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
  272. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  273. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
  274. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
  275. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
  276. package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
  277. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
  279. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
  280. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
  281. package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
  282. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
  283. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  284. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
  285. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
  286. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
  287. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
  288. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
  289. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  290. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
  291. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +26 -0
  292. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  293. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
  294. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
  295. package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
  296. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
  297. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
  298. package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
  299. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
  300. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  301. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
  302. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
  303. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
  304. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
  305. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
  306. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
  307. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
  308. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
  309. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  310. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
  311. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
  312. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
  313. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
  314. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
  315. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  316. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
  317. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
  318. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
  319. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
  320. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
  321. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
  322. package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
  323. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
  324. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
  325. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
  326. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
  327. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  328. package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
  329. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  330. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
  331. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
  332. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
  333. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
  334. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
  335. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
  336. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
  337. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
  338. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
  339. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
  340. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
  341. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
  342. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
  343. package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
  344. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
  345. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
  346. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
  347. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
  348. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
  349. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
  350. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
  351. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
  352. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
  353. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
  354. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
  355. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
  356. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
  357. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
  358. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
  359. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
  360. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
  361. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
  362. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
  363. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
  364. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
  365. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
  366. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
  367. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
  368. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
  369. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
  370. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
  371. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
  372. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
  373. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
  374. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
  375. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
  376. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
  377. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
  378. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  379. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
  380. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  381. package/src/view/minimap/dom/MinimapCameraView.js +4 -9
  382. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
  383. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
  384. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
  385. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
  386. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
  387. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
  388. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
  389. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
  390. package/src/engine/ecs/transform/__probe.d.ts +0 -4
  391. package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
  392. package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
  393. package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
  394. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
  395. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
  396. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
  397. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
  398. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
  399. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
  400. package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
  401. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
  402. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
  403. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
  404. package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
  405. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
  406. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
  407. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
  408. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
  409. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
  410. 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"}