@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
@@ -1,29 +1,123 @@
1
1
  /**
2
- * Pack an opcode and its width into an instruction's first word.
2
+ * Pack word 0.
3
+ *
3
4
  * @param {number} op
4
5
  * @param {number} width lane count, `0..4`
6
+ * @param {number} dst destination register, `0..255`
7
+ * @param {number} kinds the three source kinds as one field — see {@link vm_pack_kinds}
5
8
  * @returns {number}
6
9
  */
7
- export function vm_encode_word0(op: number, width: number): number;
10
+ export function vm_encode_word0(op: number, width: number, dst: number, kinds: number): number;
8
11
  /**
9
- * @param {number} word0
10
- * @returns {number} opcode
12
+ * The three source kinds as the one field {@link vm_encode_word0} takes.
13
+ *
14
+ * @param {number} s0
15
+ * @param {number} s1
16
+ * @param {number} s2
17
+ * @returns {number}
11
18
  */
19
+ export function vm_pack_kinds(s0: number, s1: number, s2: number): number;
20
+ /** @param {number} word0 @returns {number} opcode */
12
21
  export function vm_decode_op(word0: number): number;
22
+ /** @param {number} word0 @returns {number} lane count */
23
+ export function vm_decode_width(word0: number): number;
24
+ /** @param {number} word0 @returns {number} destination register */
25
+ export function vm_decode_dst(word0: number): number;
26
+ /** @param {number} word0 @returns {number} the three source kinds as one field */
27
+ export function vm_decode_kinds(word0: number): number;
13
28
  /**
14
29
  * @param {number} word0
15
- * @returns {number} lane count
30
+ * @param {number} slot source slot, `0..2`
31
+ * @returns {number} a {@link VM_KIND}
16
32
  */
17
- export function vm_decode_width(word0: number): number;
33
+ export function vm_decode_kind(word0: number, slot: number): number;
34
+ /** @returns {number} word 0 with its width replaced */
35
+ export function vm_with_width(word0: any, width: any): number;
36
+ /** @returns {number} word 0 with its destination replaced */
37
+ export function vm_with_dst(word0: any, dst: any): number;
38
+ /** @returns {number} word 0 with one source's kind replaced */
39
+ export function vm_with_kind(word0: any, slot: any, kind: any): number;
40
+ /**
41
+ * Pack a swizzle pattern from four lane selectors: selector `i` in bits `[2i, 2i+2)`, values
42
+ * 0=x, 1=y, 2=z, 3=w.
43
+ *
44
+ * @param {number} x
45
+ * @param {number} y
46
+ * @param {number} z
47
+ * @param {number} w
48
+ * @returns {number}
49
+ */
50
+ export function pack_swizzle(x: number, y: number, z: number, w: number): number;
51
+ /**
52
+ * @param {number} pattern
53
+ * @param {number} lane
54
+ * @returns {number} the lane the pattern selects for output lane `lane`
55
+ */
56
+ export function swizzle_selector(pattern: number, lane: number): number;
57
+ /**
58
+ * A register operand word: a base slot read through a pattern.
59
+ *
60
+ * The pattern is stored XOR {@link VM_SWIZZLE_IDENTITY}, so the identity is a zero byte and a bare
61
+ * slot index is the run at that slot. Nothing else about the word depends on that choice; read the
62
+ * pattern back with {@link vm_operand_pattern} rather than the bits.
63
+ *
64
+ * @param {number} base first register slot
65
+ * @param {number} [pattern] a packed swizzle; the run as it lies when left out
66
+ * @returns {number}
67
+ */
68
+ export function vm_register(base: number, pattern?: number): number;
69
+ /** @param {number} word a register operand @returns {number} its base slot */
70
+ export function vm_operand_base(word: number): number;
71
+ /** @param {number} word a register operand @returns {number} its swizzle, as {@link pack_swizzle} packs one */
72
+ export function vm_operand_pattern(word: number): number;
18
73
  /**
19
- * The lane count an opcode actually operates on, given the width its instruction carries.
74
+ * @param {number} word a register operand
75
+ * @param {number} lane
76
+ * @returns {number} the slot lane `lane` of the operand reads
77
+ */
78
+ export function vm_operand_slot(word: number, lane: number): number;
79
+ /** @returns {number} the operand moved to another base, keeping its swizzle */
80
+ export function vm_operand_with_base(word: any, base: any): number;
81
+ /**
82
+ * How far into the file a register operand reaches when `lanes` lanes of it are read: one past the
83
+ * widest selector among them. The selectors above `lanes` are never read and do not count.
84
+ *
85
+ * @param {number} word a register operand
86
+ * @param {number} lanes how many lanes the instruction reads of it
87
+ * @returns {number}
88
+ */
89
+ export function vm_operand_span(word: number, lanes: number): number;
90
+ /**
91
+ * The canonical spelling of a register operand read at `lanes` lanes: the base is the lowest slot
92
+ * any lane reads, and selectors above the lanes read are the identity, since they name nothing. So
93
+ * `r0.yz` is `r1`, `r0.zy` is `r1.yx`, and a broadcast of lane 3 is the run at lane 3 — one
94
+ * spelling per meaning, which is what lets two instructions be compared word for word.
20
95
  *
21
- * Opcodes whose width is fixed ignore the field entirely, so a malformed program cannot talk a
22
- * `CROSS` into reading two lanes.
96
+ * @param {number} word a register operand
97
+ * @param {number} lanes how many lanes the instruction reads of it
98
+ * @returns {number}
99
+ */
100
+ export function vm_canonical_register(word: number, lanes: number): number;
101
+ /** @param {number} value @returns {number} the `f32` bit pattern the value rounds to */
102
+ export function vm_f32_bits(value: number): number;
103
+ /** @param {number} bits @returns {number} the `f32` those bits are */
104
+ export function vm_f32_value(bits: number): number;
105
+ /**
106
+ * A literal source operand, as `InstructionStream.emit` takes one in a source slot.
107
+ *
108
+ * @param {number} value
109
+ * @returns {{kind: number, word: number}}
110
+ */
111
+ export function vm_immediate(value: number): {
112
+ kind: number;
113
+ word: number;
114
+ };
115
+ /**
116
+ * Widths are read out of the opcode's metadata; see {@link VM_ISA}.
23
117
  *
24
118
  * @param {number} op
25
119
  * @param {number} width the instruction's width field
26
- * @returns {number}
120
+ * @returns {number} the lane count the opcode actually operates on
27
121
  */
28
122
  export function vm_operation_width(op: number, width: number): number;
29
123
  /**
@@ -34,65 +128,157 @@ export function vm_operation_width(op: number, width: number): number;
34
128
  */
35
129
  export function vm_dest_width(op: number, width: number): number;
36
130
  /**
131
+ * The four words of an instruction, with every register operand in its canonical spelling.
132
+ *
133
+ * Both the assembler's `InstructionStream.emit` and the assembly parser build instructions here, so
134
+ * the one encoding rule that is a choice rather than a fact — how a swizzle is spelled — is made in
135
+ * one place: selectors above the lanes an operand is read at are the identity, and a run of
136
+ * consecutive selectors is the identity at a higher base. Two instructions that mean the same thing
137
+ * then have the same words, which is what lets the optimizer compare them.
138
+ *
37
139
  * @param {number} op
38
- * @returns {string} mnemonic, or `OP_<n>` if unknown
140
+ * @param {number} width lane count, `0..4`
141
+ * @param {number} dst destination register
142
+ * @param {number[]} kinds a {@link VM_KIND} per source slot
143
+ * @param {number[]} sources the three source words
144
+ * @returns {number[]}
39
145
  */
40
- export function vm_op_name(op: number): string;
146
+ export function vm_pack_instruction(op: number, width: number, dst: number, kinds: number[], sources: number[]): number[];
41
147
  /**
42
- * Pack a swizzle pattern from four lane selectors into the 8-bit form used by the `SWIZZLE` opcode.
43
- * Selector values: 0=x, 1=y, 2=z, 3=w.
44
- * @param {number} x
45
- * @param {number} y
46
- * @param {number} z
47
- * @param {number} w
48
- * @returns {number}
148
+ * An encoded instruction, re-spelled canonically — what a pass wants after it has moved an operand.
149
+ *
150
+ * @param {ArrayLike<number>} words the four words of a single instruction
151
+ * @returns {number[]}
152
+ */
153
+ export function vm_repack_instruction(words: ArrayLike<number>): number[];
154
+ /**
155
+ * @typedef {object} ParticleVMOperand
156
+ * @property {number} slot source slot, `0..2`
157
+ * @property {number} kind a {@link VM_KIND}, never `NONE`
158
+ * @property {number} word the source word as encoded
159
+ * @property {number} lanes how many lanes the instruction reads of it: the operation's width, or one
160
+ * for a slot the ISA marks scalar
161
+ * @property {number} span register slots the operand reaches from its base, for a register; `0` for a
162
+ * literal
49
163
  */
50
- export function pack_swizzle(x: number, y: number, z: number, w: number): number;
51
164
  /**
52
- * How many registers a `SWIZZLE` pattern reaches into, counting from the source's base: one past
53
- * the largest lane any of its four selectors names.
165
+ * Visit every source operand of an instruction — every slot whose kind is not `NONE` — with how
166
+ * many lanes the opcode reads of it and how far into the file it reaches.
54
167
  *
55
- * A swizzle's source span has nothing to do with the instruction's width — a four-lane broadcast
56
- * reads one register and a three-lane reversal reads four — so it is the only operand whose extent
57
- * has to be read out of the pattern itself.
168
+ * The rules for the reach are not uniform and live here rather than in each caller: a source is
169
+ * read as wide as the operation runs unless the ISA marks that slot scalar, and a register operand
170
+ * reaches as far as its widest selector among the lanes read.
58
171
  *
59
- * @param {number} pattern
60
- * @returns {number}
172
+ * @param {ArrayLike<number>} words an instruction stream
173
+ * @param {number} base index of the instruction's first word
174
+ * @param {function(ParticleVMOperand):void} visit the one object is reused between calls; copy it
175
+ * to keep it
61
176
  */
62
- export function swizzle_span(pattern: number): number;
177
+ export function vm_visit_operands(words: ArrayLike<number>, base: number, visit: (arg0: ParticleVMOperand) => void): void;
63
178
  /**
64
- * Visit every register operand of an instruction as the slot it starts at and how many consecutive
65
- * slots it reaches from there.
66
- *
67
- * Registers hold single floats, so an operand's base index says nothing on its own about how much
68
- * of the file it touches: a `vec3` at r0 occupies r0, r1 and r2. Anyone sizing a register file or
69
- * bounds-checking one needs the reach rather than the base, and the rules for it are not uniform —
70
- * so they live here, in one place, instead of being re-derived by each caller until they disagree:
179
+ * Visit every run of the register file an instruction touches, as the slot it starts at and how
180
+ * many consecutive slots it reaches: the destination as far as the opcode writes, and each register
181
+ * source as far as its selectors read. What anyone sizing or bounds-checking the file wants; a
182
+ * literal is not a run of the file and is not visited.
71
183
  *
72
- * - a destination reaches as far as the opcode writes, which for the reductions is one lane;
73
- * - a source reaches as far as the operation runs, unless the ISA marks that slot scalar;
74
- * - a `SWIZZLE` source reaches as far as its pattern names, which the width cannot tell you;
75
- * - the source `STORE_ATTR` and `KILL` keep in the destination slot reaches as far as they read.
184
+ * @param {ArrayLike<number>} words an instruction stream
185
+ * @param {number} base index of the instruction's first word
186
+ * @param {function(number, number):void} visit called `(slot, span)` per run
187
+ */
188
+ export function vm_visit_register_runs(words: ArrayLike<number>, base: number, visit: (arg0: number, arg1: number) => void): void;
189
+ /**
190
+ * Whether the kind bits of an instruction agree with what its opcode reads: a register-role slot
191
+ * carries a register or a literal, every other slot carries nothing. Both the assembler and
192
+ * `ParticleProgram.validate` ask here rather than each restating the rule.
76
193
  *
77
194
  * @param {ArrayLike<number>} words an instruction stream
78
195
  * @param {number} base index of the instruction's first word
79
- * @param {function(number, number):void} visit called `(slot, span)` per register operand
196
+ * @returns {string|null} what is wrong, or `null` when nothing is
80
197
  */
81
- export function vm_visit_register_operands(words: ArrayLike<number>, base: number, visit: (arg0: number, arg1: number) => void): void;
198
+ export function vm_kinds_problem(words: ArrayLike<number>, base: number): string | null;
82
199
  /**
83
- * Operand slot roles, used for documentation, assembler validation and disassembly.
200
+ * The kinds an opcode's sources carry when every register-role slot holds a register: the default
201
+ * an assembler starts from, before any literal is marked.
202
+ *
203
+ * @param {number} op
204
+ * @returns {number} a kinds field for {@link vm_encode_word0}
205
+ */
206
+ export function vm_register_kinds(op: number): number;
207
+ /**
208
+ * Particle VM instruction-set architecture — the single source of truth.
209
+ *
210
+ * Both executors (the JS reference in {@link ../vm/ParticleVMReference.js} and the WGSL interpreter
211
+ * in {@link ../vm/chunk_particle_vm.js}) implement exactly this table, and the parity spec asserts
212
+ * that neither drifts from it. The assembler and node compiler emit against these opcode numbers.
213
+ *
214
+ * ## Encoding
215
+ *
216
+ * Every instruction is {@link PARTICLE_VM_INSTRUCTION_WORDS} `u32` words — the size of one
217
+ * `vec4<u32>`, so the four loads that fetch it are one 16-byte load by the time a shader compiler is
218
+ * done with them:
219
+ *
220
+ * [ op | width << 8 | kinds << 16 | dst << 24, s0, s1, s2 ]
221
+ *
222
+ * Word 0 packs the opcode (bits 0..7), the lane count the operation spans (8..10), the kind of each
223
+ * source (two bits per slot at 16..21) and the destination register (24..31). The other three words
224
+ * are the sources. Registers hold single floats, so a `vec3` value is three consecutive slots and an
225
+ * `ADD` with width 3 adds three lanes; widths are what stop every value costing four registers.
226
+ *
227
+ * ## Operands
228
+ *
229
+ * A source word means what its kind says — see {@link VM_KIND}:
230
+ *
231
+ * - `NONE`: not an operand the VM resolves — an unused slot, or a raw field the opcode reads for
232
+ * itself: an attribute offset, a component count, a builtin id, a curve handle, a pool index.
233
+ * - `REG`: a register operand. Bits 0..7 are the first slot, bits 8..15 a swizzle — see below.
234
+ * - `IMM`: the word IS the `f32` bit pattern of a literal, read in every lane. A scalar or a
235
+ * lane-uniform vector costs no register and no load; only a vector whose lanes differ still goes
236
+ * through the pool with `LOAD_CONST`.
237
+ *
238
+ * The kinds exist so the interpreter can resolve every source the same way, before the opcode runs
239
+ * and without consulting a table: it reads the kind, gathers the lanes, and the opcode body sees
240
+ * three four-lane values whatever they came from. A kind is encoding, not an opcode mode.
241
+ *
242
+ * ## Swizzles
243
+ *
244
+ * Every register operand carries a swizzle: four two-bit lane selectors in bits 8..15, packed as
245
+ * {@link pack_swizzle} packs them, and stored XOR the identity pattern `.xyzw`
246
+ * ({@link VM_SWIZZLE_IDENTITY}). That choice is what makes a bare slot index a register operand:
247
+ * with a zero swizzle byte lane `c` reads slot `base + c`, the run as it lies, and `r5.xxxx` is the
248
+ * same word with the selectors that name lane 0 four times. Lane `c` of an operand reads slot
249
+ * `base + selector[c]`, so an operand reaches as far into the file as its widest selector below the
250
+ * instruction's width — never further, whatever the selectors above the width say.
251
+ *
252
+ * Swizzles are why there is no `SWIZZLE` opcode and no `SCALE`: a permutation or a broadcast is a
253
+ * `MOV` whose source is swizzled, and a vector times a scalar is `MUL v, s.xxxx`. Both were
254
+ * opcodes that existed to do what an operand can now say for itself, which is the direction the
255
+ * ISA takes whenever it can — see {@link VM_OP} for the holes they left.
256
+ *
257
+ * ## Resolution before execution
258
+ *
259
+ * The interpreter reads every source lane before it writes any destination lane. Operands may
260
+ * therefore overlap the destination in any way — `MOV.2 r0, r0.yx` swaps two slots in place — and
261
+ * there is no aliasing rule for a program to break. The reductions write one lane whatever they
262
+ * read (see {@link VM_DEST}); a few opcodes fix their lane count (see {@link VM_WIDTH}).
263
+ *
264
+ * There is no control flow: conditionals are `CMP` + `SELECT` and destruction is `KILL`, which
265
+ * keeps the interpreter a flat `switch` inside a bounded loop.
266
+ */
267
+ /** Words per instruction. Four, so an instruction is one `vec4<u32>` fetch. @type {number} */
268
+ export const PARTICLE_VM_INSTRUCTION_WORDS: number;
269
+ /**
270
+ * Operand slot roles: what an opcode reads a source slot as. Used for assembler validation,
271
+ * disassembly and for deriving each slot's {@link VM_KIND }.
84
272
  */
85
273
  export type VM_OPERAND = string;
86
274
  export namespace VM_OPERAND {
87
275
  let NONE: string;
88
276
  let REG: string;
89
- let DST: string;
90
277
  let CONST: string;
91
278
  let ATTR_OFFSET: string;
92
279
  let COMP: string;
93
280
  let BUILTIN: string;
94
281
  let CURVE: string;
95
- let SWIZZLE: string;
96
282
  }
97
283
  /**
98
284
  * Builtin inputs the host shader assembles per-invocation and the VM reads via `LOAD_BUILTIN`.
@@ -119,7 +305,8 @@ export const VM_BUILTIN_COMPONENTS: {
119
305
  [x: number]: number;
120
306
  };
121
307
  /**
122
- * Opcodes. Numbers are stable wire values — never renumber, only append.
308
+ * Opcodes. Numbers are stable wire values — never renumber, only append. 19 was `SCALE` and 45 was
309
+ * `SWIZZLE`; both are spelled by an operand swizzle now and the numbers stay unused.
123
310
  */
124
311
  export type VM_OP = number;
125
312
  export namespace VM_OP {
@@ -140,7 +327,6 @@ export namespace VM_OP {
140
327
  export let MAX: number;
141
328
  export let MIX: number;
142
329
  export let CLAMP: number;
143
- export let SCALE: number;
144
330
  export let NEG: number;
145
331
  export let ABS: number;
146
332
  export let FLOOR: number;
@@ -153,13 +339,16 @@ export namespace VM_OP {
153
339
  export let POW: number;
154
340
  export let STEP: number;
155
341
  export let SMOOTHSTEP: number;
342
+ export let RSQRT: number;
343
+ export let TAN: number;
344
+ export let ASIN: number;
345
+ export let ACOS: number;
346
+ export let ATAN2: number;
156
347
  export let DOT: number;
157
348
  export let CROSS: number;
158
349
  export let LENGTH: number;
159
350
  export let NORMALIZE: number;
160
351
  export let DISTANCE: number;
161
- let SWIZZLE_1: number;
162
- export { SWIZZLE_1 as SWIZZLE };
163
352
  export let CMP_LT: number;
164
353
  export let CMP_LE: number;
165
354
  export let CMP_GT: number;
@@ -193,36 +382,89 @@ export namespace VM_DEST {
193
382
  export { ONE_1 as ONE };
194
383
  }
195
384
  /**
196
- * Widest an operation may be. Registers hold scalars; four is what a `vec4` value needs and what
197
- * the two-bit selectors in a `SWIZZLE` pattern can address.
385
+ * Widest an operation may be. Registers hold scalars; four is what a `vec4` value needs and what a
386
+ * two-bit lane selector can address.
198
387
  * @type {number}
199
388
  */
200
389
  export const VM_MAX_WIDTH: number;
390
+ /** Mask selecting the opcode out of word 0. @type {number} */
391
+ export const VM_OP_MASK: number;
392
+ /** Bit position of the width field in word 0. @type {number} */
393
+ export const VM_WIDTH_SHIFT: number;
394
+ /** Mask selecting the width out of word 0, once shifted down. @type {number} */
395
+ export const VM_WIDTH_MASK: number;
201
396
  /**
202
- * Bit position of the width field inside an instruction's first word.
203
- *
204
- * The word holds `op | (width << VM_WIDTH_SHIFT)`. Widths ride in the opcode's spare high bits
205
- * rather than a sixth instruction word: the code section is read through the same storage binding as
206
- * the constants and is fetched every instruction, so a 20% longer stream is the one cost the
207
- * interpreter pays on every single dispatch.
208
- *
397
+ * What a source word means. Wire values; never renumber.
398
+ */
399
+ export type VM_KIND = number;
400
+ export namespace VM_KIND {
401
+ let NONE_3: number;
402
+ export { NONE_3 as NONE };
403
+ let REG_1: number;
404
+ export { REG_1 as REG };
405
+ export let IMM: number;
406
+ }
407
+ /**
408
+ * Bit position of the first source's kind in word 0. Source `n` has its two kind bits at
409
+ * `VM_KIND_SHIFT + 2n`, so the three together are bits 16..21.
209
410
  * @type {number}
210
411
  */
211
- export const VM_WIDTH_SHIFT: number;
212
- /** Mask selecting the opcode out of an instruction's first word. @type {number} */
213
- export const VM_OP_MASK: number;
214
- /** Mask selecting the width out of an instruction's first word, once shifted down. @type {number} */
215
- export const VM_WIDTH_MASK: number;
412
+ export const VM_KIND_SHIFT: number;
413
+ /** Bits per kind field. @type {number} */
414
+ export const VM_KIND_BITS: number;
415
+ /** Mask selecting one kind field, once shifted down. @type {number} */
416
+ export const VM_KIND_MASK: number;
417
+ /** Bit position of the destination register in word 0. @type {number} */
418
+ export const VM_DST_SHIFT: number;
419
+ /** Mask selecting the destination register out of word 0, once shifted down. @type {number} */
420
+ export const VM_DST_MASK: number;
421
+ /** The pattern that reads a run as it lies: `.xyzw`. @type {number} */
422
+ export const VM_SWIZZLE_IDENTITY: number;
423
+ /** The pattern that reads lane 0 in every lane: `.xxxx`. @type {number} */
424
+ export const VM_SWIZZLE_BROADCAST: number;
425
+ /** Mask selecting the base slot out of a register operand word. @type {number} */
426
+ export const VM_OPERAND_BASE_MASK: number;
427
+ /** Bit position of the swizzle byte in a register operand word. @type {number} */
428
+ export const VM_OPERAND_SWIZZLE_SHIFT: number;
216
429
  /**
217
- * Per-opcode metadata: mnemonic + the role of each of the three operand slots `[s0, s1, s2]`.
430
+ * Per-opcode metadata: mnemonic, whether it writes a destination, and the role of each source slot.
218
431
  *
219
432
  * Keyed by opcode number. Used by the assembler for validation/disassembly and by the parity
220
433
  * meta-test to enforce that every opcode is handled by both executors.
221
- * @type {Map<number, {name: string, dst: boolean, operands: [string, string, string]}>}
434
+ * @type {Map<number, {name: string, dst: boolean, operands: [string, string, string], width: string, dest: string, default_width: number, min_width: number, scalar_operands: number[]}>}
222
435
  */
223
436
  export const VM_ISA: Map<number, {
224
437
  name: string;
225
438
  dst: boolean;
226
439
  operands: [string, string, string];
440
+ width: string;
441
+ dest: string;
442
+ default_width: number;
443
+ min_width: number;
444
+ scalar_operands: number[];
227
445
  }>;
446
+ export type ParticleVMOperand = {
447
+ /**
448
+ * source slot, `0..2`
449
+ */
450
+ slot: number;
451
+ /**
452
+ * a {@link VM_KIND }, never `NONE`
453
+ */
454
+ kind: number;
455
+ /**
456
+ * the source word as encoded
457
+ */
458
+ word: number;
459
+ /**
460
+ * how many lanes the instruction reads of it: the operation's width, or one
461
+ * for a slot the ISA marks scalar
462
+ */
463
+ lanes: number;
464
+ /**
465
+ * register slots the operand reaches from its base, for a register; `0` for a
466
+ * literal
467
+ */
468
+ span: number;
469
+ };
228
470
  //# sourceMappingURL=ParticleVMISA.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleVMISA.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleVMISA.js"],"names":[],"mappings":"AAiNA;;;;;GAKG;AACH,oCAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;GAGG;AACH,oCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;GAGG;AACH,uCAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;GASG;AACH,uCAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAelB;AAED;;;;;GAKG;AACH,kCAJW,MAAM,SACN,MAAM,GACJ,MAAM,CAclB;AA4HD;;;GAGG;AACH,+BAHW,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;GAQG;AACH,gCANW,MAAM,KACN,MAAM,KACN,MAAM,KACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AACH,sCAHW,MAAM,GACJ,MAAM,CAclB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,kDAJW,UAAU,MAAM,CAAC,QACjB,MAAM,gBACG,MAAM,QAAE,MAAM,KAAE,IAAI,QA+BvC;;;;yBA/cS,MAAM;;;;;;;;;;;;;;;yBAyBN,MAAM;;;;;;;;;;;AAwBhB;;;;;;GAMG;AACH;QAFiB,MAAM,GAAE,MAAM;EAW5B;;;;oBAIO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAwDN,MAAM;;;;;;;;;;;sBAeN,MAAM;;;;;;;;AAWhB;;;;GAIG;AACH,2BAFU,MAAM,CAEc;AAE9B;;;;;;;;;GASG;AACH,6BAFU,MAAM,CAEgB;AAEhC,mFAAmF;AACnF,yBADyE,MAAM,CAChD;AAE/B,qGAAqG;AACrG,4BAD2F,MAAM,CAChE;AA6EjC;;;;;;GAMG;AACH,qBAFU,IAAI,MAAM,EAAE;IAAC,MAAM,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAC,CAAC,CAEvD"}
1
+ {"version":3,"file":"ParticleVMISA.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleVMISA.js"],"names":[],"mappings":"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"}