@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,37 @@
1
+ /**
2
+ * Loads the colour target, depth-tests read-only against the scene, and draws
3
+ * `drawIndirect(draw_args)` instances over `draw_list`.
4
+ *
5
+ * @param {object} params
6
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
7
+ * @param {number} params.camera graph handle of the camera uniform buffer
8
+ * @param {number} params.color graph handle of the colour target the billboards draw over
9
+ * @param {number} params.depth graph handle of the scene depth, tested against and never written
10
+ * @param {number} params.pool graph handle of the particle pool
11
+ * @param {number} params.draw_list graph handle of the slot list to draw, in draw order
12
+ * @param {number} params.emitter_database graph handle
13
+ * @param {number} params.draw_args graph handle of the indirect draw args: six vertices, one
14
+ * instance per live particle, written on-GPU by this frame's build-indirect pass
15
+ * @param {object} params.render
16
+ * @param {GPUTextureView} params.render.atlas sprite atlas
17
+ * @param {GPUSampler} params.render.atlas_sampler
18
+ * @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
19
+ * the billboard pipeline for the frame's attachment formats
20
+ * @returns {number} the colour handle after the draw
21
+ */
22
+ export function graph_particles_billboard({ graph, camera, color, depth, pool, draw_list, emitter_database, draw_args, render }: {
23
+ graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
24
+ camera: number;
25
+ color: number;
26
+ depth: number;
27
+ pool: number;
28
+ draw_list: number;
29
+ emitter_database: number;
30
+ draw_args: number;
31
+ render: {
32
+ atlas: GPUTextureView;
33
+ atlas_sampler: GPUSampler;
34
+ obtain_pipeline: (color_format: string, depth_format: string) => object;
35
+ };
36
+ }): number;
37
+ //# sourceMappingURL=graph_particles_billboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph_particles_billboard.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_billboard.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;WAhBW,OAAO,2DAA2D,EAAE,UAAU;YAC9E,MAAM;WACN,MAAM;WACN,MAAM;UACN,MAAM;eACN,MAAM;sBACN,MAAM;eACN,MAAM;;;;wCAKS,MAAM,gBAAgB,MAAM,KAAK,MAAM;;IAEpD,MAAM,CAuDlB"}
@@ -0,0 +1,93 @@
1
+ import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
2
+ import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.js";
3
+ import { PARTICLE_BILLBOARD_RESOURCES } from "./shaders/shader_particle_render.js";
4
+
5
+ /**
6
+ * The particle system's standalone drawing: one instanced billboard draw over a colour target with
7
+ * fixed-function blending, for {@link ParticleRenderMode.BILLBOARD}. The renderer's own path draws
8
+ * through `graph_particles_avboit.js` instead; these two files are the alternatives
9
+ * {@link GPUParticleSystem#execute} picks between, and both read the handles the simulation left.
10
+ *
11
+ * The draw list is a parameter rather than a buffer this file names, because what it must be is a
12
+ * property of the caller's blend state: premultiplied over-blending is order-dependent, so the
13
+ * standalone path hands in the back-to-front list `sort/graph_particle_sort.js` produced.
14
+ */
15
+
16
+ /** The colour attachment's view: one mip, the one the frame draws into. */
17
+ const COLOR_VIEW = TextureViewDescriptor.from({ mipLevelCount: 1, baseMipLevel: 0 });
18
+
19
+ /**
20
+ * Loads the colour target, depth-tests read-only against the scene, and draws
21
+ * `drawIndirect(draw_args)` instances over `draw_list`.
22
+ *
23
+ * @param {object} params
24
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
25
+ * @param {number} params.camera graph handle of the camera uniform buffer
26
+ * @param {number} params.color graph handle of the colour target the billboards draw over
27
+ * @param {number} params.depth graph handle of the scene depth, tested against and never written
28
+ * @param {number} params.pool graph handle of the particle pool
29
+ * @param {number} params.draw_list graph handle of the slot list to draw, in draw order
30
+ * @param {number} params.emitter_database graph handle
31
+ * @param {number} params.draw_args graph handle of the indirect draw args: six vertices, one
32
+ * instance per live particle, written on-GPU by this frame's build-indirect pass
33
+ * @param {object} params.render
34
+ * @param {GPUTextureView} params.render.atlas sprite atlas
35
+ * @param {GPUSampler} params.render.atlas_sampler
36
+ * @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
37
+ * the billboard pipeline for the frame's attachment formats
38
+ * @returns {number} the colour handle after the draw
39
+ */
40
+ export function graph_particles_billboard({ graph, camera, color, depth, pool, draw_list, emitter_database, draw_args, render }) {
41
+ const data = {};
42
+
43
+ const pass = graph.add("Particle Billboard", data, (data, resources, context) => {
44
+ const encoder = context.encoder;
45
+
46
+ const color_texture = resources.get(data.color);
47
+ const depth_texture = resources.get(data.depth);
48
+
49
+ const pipeline = render.obtain_pipeline(color_texture.descriptor.format, depth_texture.descriptor.format);
50
+
51
+ // Read by the soft-depth fade and tested against by the pass: the same view, read-only in
52
+ // both roles.
53
+ const depth_view = depth_texture.obtainView(DEFAULT_DEPTH_TEXTURE_VIEW);
54
+
55
+ const bindings = PARTICLE_BILLBOARD_RESOURCES.generateBindings({
56
+ camera: resources.get(data.camera),
57
+ pool: resources.get(data.pool),
58
+ draw_list: resources.get(data.draw_list),
59
+ emitter_database: resources.get(data.emitter_database),
60
+ atlas: render.atlas,
61
+ atlas_sampler: render.atlas_sampler,
62
+ scene_depth: depth_view,
63
+ }, encoder);
64
+
65
+ const render_pass = encoder.constructRenderPass({
66
+ label: "Particle Billboard",
67
+ pipeline,
68
+ bindings,
69
+ colorAttachments: [{
70
+ view: color_texture.obtainView(COLOR_VIEW),
71
+ loadOp: "load",
72
+ storeOp: "store",
73
+ }],
74
+ depthStencilAttachment: {
75
+ view: depth_view,
76
+ depthReadOnly: true,
77
+ },
78
+ });
79
+
80
+ render_pass.drawIndirect(resources.get(data.draw_args), 0);
81
+ render_pass.end();
82
+ });
83
+
84
+ data.camera = pass.read(camera);
85
+ data.pool = pass.read(pool);
86
+ data.draw_list = pass.read(draw_list);
87
+ data.emitter_database = pass.read(emitter_database);
88
+ data.draw_args = pass.read(draw_args);
89
+ data.depth = pass.read(depth);
90
+ data.color = pass.write(pass.read(color));
91
+
92
+ return data.color;
93
+ }
@@ -6,43 +6,63 @@
6
6
  * registers the program touches without a separate pass.
7
7
  */
8
8
  export class InstructionStream {
9
- /** @type {number[][]} */
9
+ /** @type {number[][]} four words each */
10
10
  instructions: number[][];
11
11
  /** @type {number} highest register index referenced, plus one */
12
12
  register_count: number;
13
13
  /**
14
- * Emit a raw instruction. Validates the opcode and tracks register usage. Prefer the typed
15
- * helpers below where they exist — they document the non-obvious operand packing.
14
+ * Emit an instruction. Validates the opcode and tracks register usage. Prefer the typed helpers
15
+ * below where they exist — they document the non-obvious operand packing.
16
+ *
17
+ * A source is what its slot's role in the ISA says: for a register-role slot, a register operand
18
+ * word — a slot index, or `vm_register(slot, pattern)` to read it through a swizzle — or a
19
+ * literal from `vm_immediate(value)`; for any other role, the raw value (an attribute offset, a
20
+ * component count, a builtin id, a curve handle, a pool index). The kinds word 0 carries follow
21
+ * from that, and register operands are stored in their canonical spelling.
16
22
  *
17
23
  * `width` is the lane count the operation spans. Left out, it is the opcode's natural width —
18
24
  * four for the element-wise ops, three for the ones that used to be spelled `.xyz`. Opcodes
19
25
  * whose lane count is fixed ignore it.
20
26
  *
21
27
  * @param {number} op
22
- * @param {number} [dst]
23
- * @param {number} [s0]
24
- * @param {number} [s1]
25
- * @param {number} [s2]
28
+ * @param {number} [dst] destination register; `0` for an opcode that writes none
29
+ * @param {number|{kind: number, word: number}} [s0]
30
+ * @param {number|{kind: number, word: number}} [s1]
31
+ * @param {number|{kind: number, word: number}} [s2]
26
32
  * @param {number} [width]
27
33
  * @returns {InstructionStream} this, for chaining
28
34
  */
29
- emit(op: number, dst?: number, s0?: number, s1?: number, s2?: number, width?: number): InstructionStream;
35
+ emit(op: number, dst?: number, s0?: number | {
36
+ kind: number;
37
+ word: number;
38
+ }, s1?: number | {
39
+ kind: number;
40
+ word: number;
41
+ }, s2?: number | {
42
+ kind: number;
43
+ word: number;
44
+ }, width?: number): InstructionStream;
45
+ /**
46
+ * Emit an instruction that is already encoded — the optimizer's way back into a stream, where the
47
+ * words are re-validated and the register count re-derived from what they touch.
48
+ *
49
+ * @param {ArrayLike<number>} words the four words of a single instruction
50
+ * @returns {InstructionStream} this, for chaining
51
+ */
52
+ emitWords(words: ArrayLike<number>): InstructionStream;
30
53
  /**
31
54
  * @param {number} dst
32
- * @param {number} src
55
+ * @param {number} src a register operand word
33
56
  * @param {number} [width]
34
57
  * @returns {InstructionStream}
35
58
  */
36
59
  mov(dst: number, src: number, width?: number): InstructionStream;
37
60
  /**
38
- * Widen a single-lane value into `width` lanes.
39
- *
40
- * A `SWIZZLE` whose every selector names lane 0 — no opcode of its own, because that is exactly
41
- * what one is. The compiler emits these where a narrow value meets a wider operation, which is
42
- * the broadcast the reductions and `CURVE` used to do implicitly by filling all four lanes.
61
+ * Widen a single-lane value into `width` lanes: a copy through the `.xxxx` swizzle. The compiler
62
+ * emits these where a narrow value meets a wider operation.
43
63
  *
44
64
  * @param {number} dst
45
- * @param {number} src
65
+ * @param {number} src register slot
46
66
  * @param {number} width
47
67
  * @returns {InstructionStream}
48
68
  */
@@ -67,14 +87,17 @@ export class InstructionStream {
67
87
  loadAttr(dst: number, word_offset: number, component_count: number, width?: number): InstructionStream;
68
88
  /**
69
89
  * The width is the component count and cannot differ from it: a store writes exactly the lanes
70
- * the register holds.
90
+ * the value holds.
71
91
  *
72
- * @param {number} src_register
92
+ * @param {number|{kind: number, word: number}} source a register operand word or a literal
73
93
  * @param {number} word_offset
74
94
  * @param {number} component_count
75
95
  * @returns {InstructionStream}
76
96
  */
77
- storeAttr(src_register: number, word_offset: number, component_count: number): InstructionStream;
97
+ storeAttr(source: number | {
98
+ kind: number;
99
+ word: number;
100
+ }, word_offset: number, component_count: number): InstructionStream;
78
101
  /**
79
102
  * @param {number} dst
80
103
  * @param {number} builtin_id
@@ -83,10 +106,13 @@ export class InstructionStream {
83
106
  */
84
107
  loadBuiltin(dst: number, builtin_id: number, width?: number): InstructionStream;
85
108
  /**
86
- * @param {number} condition_register
109
+ * @param {number|{kind: number, word: number}} condition a register operand word or a literal, read one lane
87
110
  * @returns {InstructionStream}
88
111
  */
89
- kill(condition_register: number): InstructionStream;
112
+ kill(condition: number | {
113
+ kind: number;
114
+ word: number;
115
+ }): InstructionStream;
90
116
  /**
91
117
  * One independent uniform draw in `[0, 1)` per lane — so `width` draws off the shared RNG.
92
118
  * Anything shaped (signed, a disk, a sphere) is arithmetic over these; see
@@ -100,11 +126,14 @@ export class InstructionStream {
100
126
  /**
101
127
  * @param {number} dst
102
128
  * @param {number} curve_handle
103
- * @param {number} t_register
129
+ * @param {number|{kind: number, word: number}} t a register operand word or a literal, read one lane
104
130
  * @param {number} [width]
105
131
  * @returns {InstructionStream}
106
132
  */
107
- curve(dst: number, curve_handle: number, t_register: number, width?: number): InstructionStream;
133
+ curve(dst: number, curve_handle: number, t: number | {
134
+ kind: number;
135
+ word: number;
136
+ }, width?: number): InstructionStream;
108
137
  /**
109
138
  * @returns {InstructionStream}
110
139
  */
@@ -1 +1 @@
1
- {"version":3,"file":"InstructionStream.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/InstructionStream.js"],"names":[],"mappings":"AAwBA;;;;;;GAMG;AACH;IACI,yBAAyB;IACzB,cADW,MAAM,EAAE,EAAE,CACH;IAClB,iEAAiE;IACjE,gBADW,MAAM,CACE;IAqBnB;;;;;;;;;;;;;;;OAeG;IACH,SARW,MAAM,QACN,MAAM,OACN,MAAM,OACN,MAAM,OACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CA+B7B;IAID;;;;;OAKG;IACH,SALW,MAAM,OACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;;;;OAWG;IACH,eALW,MAAM,OACN,MAAM,SACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;OAKG;IACH,eALW,MAAM,kBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;;OASG;IACH,cANW,MAAM,eACN,MAAM,mBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;;;;OAQG;IACH,wBALW,MAAM,eACN,MAAM,mBACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;OAKG;IACH,iBALW,MAAM,cACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;OAGG;IACH,yBAHW,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;OAQG;IACH,YAJW,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;OAMG;IACH,WANW,MAAM,gBACN,MAAM,cACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;OAEG;IACH,QAFa,iBAAiB,CAI7B;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,WAFa,WAAW,CAWvB;;CACJ"}
1
+ {"version":3,"file":"InstructionStream.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/InstructionStream.js"],"names":[],"mappings":"AAkCA;;;;;;GAMG;AACH;IACI,yCAAyC;IACzC,cADW,MAAM,EAAE,EAAE,CACH;IAClB,iEAAiE;IACjE,gBADW,MAAM,CACE;IAsBnB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SARW,MAAM,QACN,MAAM,OACN,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,OACnC,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,OACnC,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,UACnC,MAAM,GACJ,iBAAiB,CA6D7B;IAED;;;;;;OAMG;IACH,iBAHW,UAAU,MAAM,CAAC,GACf,iBAAiB,CAS7B;IAID;;;;;OAKG;IACH,SALW,MAAM,OACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;OAQG;IACH,eALW,MAAM,OACN,MAAM,SACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;OAKG;IACH,eALW,MAAM,kBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;;;;OASG;IACH,cANW,MAAM,eACN,MAAM,mBACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;;;;OAQG;IACH,kBALW,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,eACnC,MAAM,mBACN,MAAM,GACJ,iBAAiB,CAK7B;IAED;;;;;OAKG;IACH,iBALW,MAAM,cACN,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;OAGG;IACH,gBAHW,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,GACjC,iBAAiB,CAI7B;IAED;;;;;;;;OAQG;IACH,YAJW,MAAM,UACN,MAAM,GACJ,iBAAiB,CAI7B;IAED;;;;;;OAMG;IACH,WANW,MAAM,gBACN,MAAM,KACN,MAAM,GAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,UACnC,MAAM,GACJ,iBAAiB,CAI7B;IAED;;OAEG;IACH,QAFa,iBAAiB,CAI7B;IAED;;OAEG;IACH,gCAEC;IAED;;OAEG;IACH,WAFa,WAAW,CAWvB;;CACJ"}
@@ -1,13 +1,23 @@
1
1
  import { assert } from "../../../../core/assert.js";
2
- import { PARTICLE_VM_INSTRUCTION_WORDS, PARTICLE_VM_REGISTER_SLOTS } from "../ParticleConstants.js";
2
+ import { PARTICLE_VM_REGISTER_SLOTS } from "../ParticleConstants.js";
3
3
  import {
4
- pack_swizzle,
4
+ PARTICLE_VM_INSTRUCTION_WORDS,
5
+ VM_DST_MASK,
5
6
  VM_ISA,
7
+ VM_KIND,
6
8
  VM_MAX_WIDTH,
7
9
  VM_OP,
10
+ VM_OPERAND,
11
+ VM_SWIZZLE_BROADCAST,
8
12
  VM_WIDTH,
9
- vm_encode_word0,
10
- vm_visit_register_operands,
13
+ vm_decode_dst,
14
+ vm_decode_kind,
15
+ vm_decode_op,
16
+ vm_decode_width,
17
+ vm_kinds_problem,
18
+ vm_pack_instruction,
19
+ vm_register,
20
+ vm_visit_register_runs,
11
21
  } from "./ParticleVMISA.js";
12
22
 
13
23
  /**
@@ -30,7 +40,7 @@ function assert_component_count(component_count, mnemonic) {
30
40
  * registers the program touches without a separate pass.
31
41
  */
32
42
  export class InstructionStream {
33
- /** @type {number[][]} */
43
+ /** @type {number[][]} four words each */
34
44
  instructions = [];
35
45
  /** @type {number} highest register index referenced, plus one */
36
46
  register_count = 0;
@@ -47,7 +57,8 @@ export class InstructionStream {
47
57
  assert.lessThanOrEqual(
48
58
  base + span,
49
59
  PARTICLE_VM_REGISTER_SLOTS,
50
- `register range [${base}, ${base + span}) exceeds the ${PARTICLE_VM_REGISTER_SLOTS}-slot VM register file`
60
+ `register range [${base}, ${base + span}) exceeds the ${PARTICLE_VM_REGISTER_SLOTS} slots a VM `
61
+ + `instruction can address`
51
62
  );
52
63
  if (base + span > this.register_count) {
53
64
  this.register_count = base + span;
@@ -55,18 +66,24 @@ export class InstructionStream {
55
66
  }
56
67
 
57
68
  /**
58
- * Emit a raw instruction. Validates the opcode and tracks register usage. Prefer the typed
59
- * helpers below where they exist — they document the non-obvious operand packing.
69
+ * Emit an instruction. Validates the opcode and tracks register usage. Prefer the typed helpers
70
+ * below where they exist — they document the non-obvious operand packing.
71
+ *
72
+ * A source is what its slot's role in the ISA says: for a register-role slot, a register operand
73
+ * word — a slot index, or `vm_register(slot, pattern)` to read it through a swizzle — or a
74
+ * literal from `vm_immediate(value)`; for any other role, the raw value (an attribute offset, a
75
+ * component count, a builtin id, a curve handle, a pool index). The kinds word 0 carries follow
76
+ * from that, and register operands are stored in their canonical spelling.
60
77
  *
61
78
  * `width` is the lane count the operation spans. Left out, it is the opcode's natural width —
62
79
  * four for the element-wise ops, three for the ones that used to be spelled `.xyz`. Opcodes
63
80
  * whose lane count is fixed ignore it.
64
81
  *
65
82
  * @param {number} op
66
- * @param {number} [dst]
67
- * @param {number} [s0]
68
- * @param {number} [s1]
69
- * @param {number} [s2]
83
+ * @param {number} [dst] destination register; `0` for an opcode that writes none
84
+ * @param {number|{kind: number, word: number}} [s0]
85
+ * @param {number|{kind: number, word: number}} [s1]
86
+ * @param {number|{kind: number, word: number}} [s2]
70
87
  * @param {number} [width]
71
88
  * @returns {InstructionStream} this, for chaining
72
89
  */
@@ -74,6 +91,25 @@ export class InstructionStream {
74
91
  const meta = VM_ISA.get(op);
75
92
  assert.defined(meta, `unknown opcode ${op}`);
76
93
 
94
+ const kinds = [VM_KIND.NONE, VM_KIND.NONE, VM_KIND.NONE];
95
+ const sources = [0, 0, 0];
96
+
97
+ [s0, s1, s2].forEach((source, slot) => {
98
+ const role = meta.operands[slot];
99
+
100
+ if (typeof source === "object" && source !== null) {
101
+ assert.equal(source.kind, VM_KIND.IMM, `${meta.name} s${slot}: an operand object must be a literal`);
102
+ assert.equal(role, VM_OPERAND.REG, `${meta.name} s${slot} is ${role} and cannot take a literal`);
103
+ kinds[slot] = VM_KIND.IMM;
104
+ sources[slot] = source.word >>> 0;
105
+ return;
106
+ }
107
+
108
+ assert.isNonNegativeInteger(source, `${meta.name} s${slot}`);
109
+ kinds[slot] = role === VM_OPERAND.REG ? VM_KIND.REG : VM_KIND.NONE;
110
+ sources[slot] = source >>> 0;
111
+ });
112
+
77
113
  let requested = width === undefined ? meta.default_width : width;
78
114
 
79
115
  // The attribute ops measure themselves in components. A store's width IS its component
@@ -81,9 +117,9 @@ export class InstructionStream {
81
117
  // instruction was built; a load merely defaults to it, since widening a load is how a narrow
82
118
  // attribute reaches a wider operation.
83
119
  if (op === VM_OP.STORE_ATTR) {
84
- requested = s1;
120
+ requested = sources[2];
85
121
  } else if (op === VM_OP.LOAD_ATTR && width === undefined) {
86
- requested = s1;
122
+ requested = sources[1];
87
123
  }
88
124
 
89
125
  if (meta.width !== VM_WIDTH.NONE) {
@@ -91,21 +127,48 @@ export class InstructionStream {
91
127
  assert.lessThanOrEqual(requested, VM_MAX_WIDTH, `${meta.name} width`);
92
128
  }
93
129
 
94
- const word0 = vm_encode_word0(op, requested);
130
+ if (meta.dst) {
131
+ assert.isNonNegativeInteger(dst, `${meta.name} destination`);
132
+ assert.lessThanOrEqual(dst, VM_DST_MASK, `${meta.name} destination`);
133
+ } else {
134
+ // Nothing writes here, so a destination can only be a source that was put in the wrong
135
+ // slot — `KILL` and `STORE_ATTR` take theirs in s0.
136
+ assert.equal(dst, 0, `${meta.name} writes no destination; its source goes in s0`);
137
+ }
138
+
139
+ const words = vm_pack_instruction(op, requested, dst, kinds, sources);
95
140
 
96
- // Walked before the operands are narrowed to u32, so a nonsense index still trips the assert
97
- // that names it rather than wrapping into a plausible-looking slot.
98
- vm_visit_register_operands([word0, dst, s0, s1, s2], 0, (slot, span) => this.#use_register(slot, span));
141
+ const kinds_problem = vm_kinds_problem(words, 0);
142
+ assert.ok(kinds_problem === null, `${meta.name}: ${kinds_problem}`);
99
143
 
100
- this.instructions.push([word0, dst >>> 0, s0 >>> 0, s1 >>> 0, s2 >>> 0]);
144
+ // A nonsense index trips the assert that names it rather than wrapping into a plausible slot.
145
+ vm_visit_register_runs(words, 0, (slot, span) => this.#use_register(slot, span));
146
+
147
+ this.instructions.push(words);
101
148
  return this;
102
149
  }
103
150
 
151
+ /**
152
+ * Emit an instruction that is already encoded — the optimizer's way back into a stream, where the
153
+ * words are re-validated and the register count re-derived from what they touch.
154
+ *
155
+ * @param {ArrayLike<number>} words the four words of a single instruction
156
+ * @returns {InstructionStream} this, for chaining
157
+ */
158
+ emitWords(words) {
159
+ const word0 = words[0];
160
+ const source = (slot) => (vm_decode_kind(word0, slot) === VM_KIND.IMM
161
+ ? { kind: VM_KIND.IMM, word: words[1 + slot] }
162
+ : words[1 + slot]);
163
+
164
+ return this.emit(vm_decode_op(word0), vm_decode_dst(word0), source(0), source(1), source(2), vm_decode_width(word0));
165
+ }
166
+
104
167
  // --- typed helpers (packing that isn't obvious from `emit`) ---
105
168
 
106
169
  /**
107
170
  * @param {number} dst
108
- * @param {number} src
171
+ * @param {number} src a register operand word
109
172
  * @param {number} [width]
110
173
  * @returns {InstructionStream}
111
174
  */
@@ -114,19 +177,16 @@ export class InstructionStream {
114
177
  }
115
178
 
116
179
  /**
117
- * Widen a single-lane value into `width` lanes.
118
- *
119
- * A `SWIZZLE` whose every selector names lane 0 — no opcode of its own, because that is exactly
120
- * what one is. The compiler emits these where a narrow value meets a wider operation, which is
121
- * the broadcast the reductions and `CURVE` used to do implicitly by filling all four lanes.
180
+ * Widen a single-lane value into `width` lanes: a copy through the `.xxxx` swizzle. The compiler
181
+ * emits these where a narrow value meets a wider operation.
122
182
  *
123
183
  * @param {number} dst
124
- * @param {number} src
184
+ * @param {number} src register slot
125
185
  * @param {number} width
126
186
  * @returns {InstructionStream}
127
187
  */
128
188
  broadcast(dst, src, width) {
129
- return this.emit(VM_OP.SWIZZLE, dst, src, pack_swizzle(0, 0, 0, 0), 0, width);
189
+ return this.emit(VM_OP.MOV, dst, vm_register(src, VM_SWIZZLE_BROADCAST), 0, 0, width);
130
190
  }
131
191
 
132
192
  /**
@@ -156,16 +216,16 @@ export class InstructionStream {
156
216
 
157
217
  /**
158
218
  * The width is the component count and cannot differ from it: a store writes exactly the lanes
159
- * the register holds.
219
+ * the value holds.
160
220
  *
161
- * @param {number} src_register
221
+ * @param {number|{kind: number, word: number}} source a register operand word or a literal
162
222
  * @param {number} word_offset
163
223
  * @param {number} component_count
164
224
  * @returns {InstructionStream}
165
225
  */
166
- storeAttr(src_register, word_offset, component_count) {
226
+ storeAttr(source, word_offset, component_count) {
167
227
  assert_component_count(component_count, "STORE_ATTR");
168
- return this.emit(VM_OP.STORE_ATTR, src_register, word_offset, component_count, 0, component_count);
228
+ return this.emit(VM_OP.STORE_ATTR, 0, source, word_offset, component_count, component_count);
169
229
  }
170
230
 
171
231
  /**
@@ -179,11 +239,11 @@ export class InstructionStream {
179
239
  }
180
240
 
181
241
  /**
182
- * @param {number} condition_register
242
+ * @param {number|{kind: number, word: number}} condition a register operand word or a literal, read one lane
183
243
  * @returns {InstructionStream}
184
244
  */
185
- kill(condition_register) {
186
- return this.emit(VM_OP.KILL, condition_register);
245
+ kill(condition) {
246
+ return this.emit(VM_OP.KILL, 0, condition);
187
247
  }
188
248
 
189
249
  /**
@@ -202,12 +262,12 @@ export class InstructionStream {
202
262
  /**
203
263
  * @param {number} dst
204
264
  * @param {number} curve_handle
205
- * @param {number} t_register
265
+ * @param {number|{kind: number, word: number}} t a register operand word or a literal, read one lane
206
266
  * @param {number} [width]
207
267
  * @returns {InstructionStream}
208
268
  */
209
- curve(dst, curve_handle, t_register, width = undefined) {
210
- return this.emit(VM_OP.CURVE, dst, curve_handle, t_register, 0, width);
269
+ curve(dst, curve_handle, t, width = undefined) {
270
+ return this.emit(VM_OP.CURVE, dst, curve_handle, t, 0, width);
211
271
  }
212
272
 
213
273
  /**
@@ -237,4 +297,4 @@ export class InstructionStream {
237
297
 
238
298
  return words;
239
299
  }
240
- }
300
+ }
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * A compiled particle program: two instruction streams (INIT and UPDATE) plus a shared constant
3
- * pool. This is the value the node compiler emits and the runtime packs into the program arena.
3
+ * pool. This is the value the node compiler emits and the runtime packs into the program heap.
4
4
  *
5
5
  * Instruction streams are flat `Uint32Array`s, {@link PARTICLE_VM_INSTRUCTION_WORDS} words per
6
- * instruction. The constant pool is a flat `Float32Array`, 4 floats (one `vec4f`) per constant.
6
+ * instruction. The constant pool is a flat `Float32Array`, one float per word.
7
7
  */
8
8
  export class ParticleProgram {
9
9
  /**
@@ -30,12 +30,12 @@ export class ParticleProgram {
30
30
  */
31
31
  update: Uint32Array;
32
32
  /**
33
- * Constant pool, 4 floats (one `vec4f`) per entry.
33
+ * Constant pool, one float per word.
34
34
  * @type {Float32Array}
35
35
  */
36
36
  constants: Float32Array;
37
37
  /**
38
- * Number of vec4 registers the program needs.
38
+ * Register slots the program needs.
39
39
  * @type {number}
40
40
  */
41
41
  register_count: number;
@@ -46,10 +46,51 @@ export class ParticleProgram {
46
46
  /** @returns {number} words in the constant pool — it is addressed by word, not by `vec4` */
47
47
  get constant_word_count(): number;
48
48
  /**
49
- * Validate structural invariants (opcodes known, register indices in range, instruction budget,
50
- * constant references in range). Throws on the first problem. Intended for tests and asset
51
- * ingestion, not the hot path.
49
+ * The constant pool as the raw IEEE-754 words it is made of, without copying — a view of the
50
+ * same bytes, so writing through it writes the pool.
51
+ *
52
+ * This is the form the pool is compared, hashed and packed in, because it holds constants, not
53
+ * measurements. `-0` and `+0` are the same number and different constants — a `DIV` by each
54
+ * disagrees about the sign of the infinity it produces — and the assembler already keeps them
55
+ * apart, interning with `Object.is`; equality that read the pool as floats would put back
56
+ * together what interning took care to separate. Reading bits also keeps
57
+ * {@link ParticleProgram#equals} reflexive over a pool holding a NaN.
58
+ *
59
+ * @returns {Uint32Array}
52
60
  */
53
- validate(): void;
61
+ get constant_words(): Uint32Array;
62
+ /**
63
+ * Structural equality: the same two instruction streams, the same constant pool bit for bit,
64
+ * and the same register budget. Two programs that compare equal are one program — the VM would
65
+ * execute them identically.
66
+ *
67
+ * @param {ParticleProgram} other
68
+ * @returns {boolean}
69
+ */
70
+ equals(other: ParticleProgram): boolean;
71
+ /**
72
+ * Hash over everything {@link ParticleProgram#equals} compares, and in the same terms — the pool
73
+ * goes through the same bit view, so equal programs hash equally.
74
+ *
75
+ * @returns {number} int32
76
+ */
77
+ hash(): number;
78
+ /**
79
+ * Take on another program's code, becoming equal to it.
80
+ *
81
+ * The streams and the pool are duplicated rather than shared. A compiled program is treated as
82
+ * immutable, but nothing here enforces that — the optimizer's passes read and rewrite these
83
+ * arrays directly — so a copy that aliased the original would let a rewrite of one silently
84
+ * become a rewrite of both.
85
+ *
86
+ * @param {ParticleProgram} other
87
+ */
88
+ copy(other: ParticleProgram): void;
89
+ /**
90
+ * A second program equal to this one and sharing none of its storage.
91
+ *
92
+ * @returns {ParticleProgram}
93
+ */
94
+ clone(): ParticleProgram;
54
95
  }
55
96
  //# sourceMappingURL=ParticleProgram.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleProgram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleProgram.js"],"names":[],"mappings":"AAqBA;;;;;;GAMG;AACH;IA0BI;;;;;;OAMG;IACH;QAL+B,IAAI,EAAxB,WAAW;QACS,MAAM,EAA1B,WAAW;QACU,SAAS,EAA9B,YAAY;QACG,cAAc,EAA7B,MAAM;OAgBhB;IA7CD;;;OAGG;IACH,MAFU,WAAW,CAEhB;IAEL;;;OAGG;IACH,QAFU,WAAW,CAEd;IAEP;;;OAGG;IACH,WAFU,YAAY,CAEZ;IAEV;;;OAGG;IACH,gBAFU,MAAM,CAED;IAyBf,mEAAmE;IACnE,qCAEC;IAED,qEAAqE;IACrE,uCAEC;IAED,4FAA4F;IAC5F,kCAEC;IAED;;;;OAIG;IACH,iBAKC;CACJ"}
1
+ {"version":3,"file":"ParticleProgram.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/isa/ParticleProgram.js"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH;IA0BI;;;;;;OAMG;IACH;QAL+B,IAAI,EAAxB,WAAW;QACS,MAAM,EAA1B,WAAW;QACU,SAAS,EAA9B,YAAY;QACG,cAAc,EAA7B,MAAM;OAoBhB;IAjDD;;;OAGG;IACH,MAFU,WAAW,CAEhB;IAEL;;;OAGG;IACH,QAFU,WAAW,CAEd;IAEP;;;OAGG;IACH,WAFU,YAAY,CAEZ;IAEV;;;OAGG;IACH,gBAFU,MAAM,CAED;IA6Bf,mEAAmE;IACnE,qCAEC;IAED,qEAAqE;IACrE,uCAEC;IAED,4FAA4F;IAC5F,kCAEC;IAED;;;;;;;;;;;;OAYG;IACH,kCAGC;IAED;;;;;;;OAOG;IACH,cAHW,eAAe,GACb,OAAO,CAWnB;IAED;;;;;OAKG;IACH,QAFa,MAAM,CAalB;IAED;;;;;;;;;OASG;IACH,YAFW,eAAe,QAOzB;IAED;;;;OAIG;IACH,SAFa,eAAe,CAe3B;CACJ"}