@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,17 +1,19 @@
1
1
  /**
2
- * The particle system's frame, recorded into the frame graph. {@link GPUParticleSystem} is what
3
- * calls these, with the buffers it owns; nothing else needs to.
2
+ * The simulation half of the particle system's frame, recorded into the frame graph.
3
+ * {@link GPUParticleSystem#execute} is what calls it, with the buffers it owns; nothing else needs
4
+ * to.
4
5
  *
5
- * Two halves. {@link graph_particles_simulate} is everything that moves particles:
6
+ * {@link graph_particles_simulate} is everything that moves particles:
6
7
  *
7
8
  * reset counters -> spawn commands -> emitter tick -> scan -> spawn args -> emit -> simulate
8
9
  * -> bucket -> build indirect
9
10
  *
10
11
  * and it leaves the frame's alive list, the pool and the indirect draw args as graph handles for
11
- * whoever draws. {@link graph_particles_render} is the standalone drawing: a depth sort and one
12
- * billboard draw straight over a colour target. Under the renderer the drawing is AVBOIT's instead
13
- * (`graph_particles_avboit.js`), which reads the same handles and needs no sort.
14
- * {@link graph_particles} is the two together, for a page with no transparency pipeline of its own.
12
+ * whoever draws. Nothing here depends on how they will be drawn, which is why the render mode
13
+ * ({@link ParticleRenderMode}) selects only what `execute` records AFTER this: the depth sort and
14
+ * the billboard draw (`sort/graph_particle_sort.js`, `graph_particles_billboard.js`), or nothing at
15
+ * all, because the AVBOIT orchestrator will draw them later off these same handles
16
+ * (`graph_particles_avboit.js`).
15
17
  *
16
18
  * ## Spawning is decided here, on the GPU
17
19
  *
@@ -30,18 +32,18 @@
30
32
  * ordering is camera-independent and changes only when emitters or their programs change.
31
33
  *
32
34
  * The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
33
- * different buffer, produced by different passes, and the standalone billboard draw is what
34
- * consumes it. Reordering the render list for coherence would break premultiplied transparency;
35
- * depth-sorting the simulation list would destroy the coherence. They share no buffer and no
36
- * counter slot.
35
+ * different buffer, produced by different passes, and the standalone billboard draw is the only
36
+ * thing that consumes it, so it is built only in that mode. Reordering the render list for
37
+ * coherence would break premultiplied transparency; depth-sorting the simulation list would destroy
38
+ * the coherence. They share no buffer and no counter slot.
37
39
  *
38
40
  * ## Nothing is sized from the CPU
39
41
  *
40
42
  * Simulate's workgroup count comes from `dispatch_args` (written by LAST frame's build-indirect
41
43
  * pass) via `dispatchWorkgroupsIndirect`, and its element bound from the `ALIVE_IN` counter
42
- * snapshot; the sort's two per-particle passes and the draw are sized the same way, from this
43
- * frame's alive count. A CPU count is inevitably stale and corrupts the pool (orphaned slots when
44
- * the population grows, double-freed slots when it shrinks).
44
+ * snapshot; the draw, and the sort's two per-particle passes when there is a sort, are sized the
45
+ * same way, from this frame's alive count. A CPU count is inevitably stale and corrupts the pool
46
+ * (orphaned slots when the population grows, double-freed slots when it shrinks).
45
47
  *
46
48
  * All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
47
49
  * buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
@@ -73,7 +75,11 @@
73
75
  * list the scan consumes
74
76
  * @param {number} params.emitters.group_count workgroups the tick needs to walk every page group
75
77
  * @param {number} params.capacity pool capacity in particles
76
- * @param {number} params.bucket_count distinct compiled programs — `GPUParticleSystem#bucketCount()`
78
+ * @param {number} params.bucket_count simulation-order buckets, one per program id the registry
79
+ * can hand out — `GPUParticleSystem#bucketCount()`
80
+ * @param {boolean} params.wide_registers run the VM over the wide (storage-backed) register file
81
+ * because some registered effect needs more slots than the fast interpreter's file holds. A
82
+ * whole-system choice, not a per-emitter one — see `runtime/ProgramHeap.js`.
77
83
  * @param {object} params.frame per-frame scalars
78
84
  * @param {number} params.frame.dt
79
85
  * @param {number} params.frame.time
@@ -82,7 +88,7 @@
82
88
  * @param {number} params.frame.spawn_command_count entries in `gpu.spawn_commands` this frame
83
89
  * @returns {ParticleSimulationHandles}
84
90
  */
85
- export function graph_particles_simulate({ graph, camera, scene_database, gpu, emitters, capacity, bucket_count, frame, }: {
91
+ export function graph_particles_simulate({ graph, camera, scene_database, gpu, emitters, capacity, bucket_count, wide_registers, frame, }: {
86
92
  graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
87
93
  camera: number;
88
94
  scene_database: number;
@@ -93,6 +99,7 @@ export function graph_particles_simulate({ graph, camera, scene_database, gpu, e
93
99
  };
94
100
  capacity: number;
95
101
  bucket_count: number;
102
+ wide_registers: boolean;
96
103
  frame: {
97
104
  dt: number;
98
105
  time: number;
@@ -101,59 +108,6 @@ export function graph_particles_simulate({ graph, camera, scene_database, gpu, e
101
108
  spawn_command_count: number;
102
109
  };
103
110
  }): ParticleSimulationHandles;
104
- /**
105
- * The standalone drawing: the depth sort, then one billboard draw over a colour target with
106
- * fixed-function blending.
107
- *
108
- * @param {object} params
109
- * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
110
- * @param {number} params.camera graph handle
111
- * @param {number} params.color graph handle of the colour target the billboards draw over
112
- * @param {number} params.depth graph handle of the scene depth, tested against and never written
113
- * @param {object} params.gpu the persistent buffers
114
- * @param {ParticleSimulationHandles} params.simulated what {@link graph_particles_simulate} returned
115
- * @param {number} params.sort_bucket_count depth bins the render sort quantises into
116
- * @param {object} params.frame
117
- * @param {number} params.frame.sort_near view depth the sort's first bin starts at
118
- * @param {number} params.frame.sort_far view depth the sort's last bin ends at
119
- * @param {object} params.render
120
- * @param {GPUTextureView} params.render.atlas sprite atlas
121
- * @param {GPUSampler} params.render.atlas_sampler
122
- * @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
123
- * the billboard pipeline for the frame's attachment formats
124
- * @returns {number} the colour handle after the draw
125
- */
126
- export function graph_particles_render({ graph, camera, color, depth, gpu, simulated, sort_bucket_count, frame, render, }: {
127
- graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
128
- camera: number;
129
- color: number;
130
- depth: number;
131
- gpu: object;
132
- simulated: ParticleSimulationHandles;
133
- sort_bucket_count: number;
134
- frame: {
135
- sort_near: number;
136
- sort_far: number;
137
- };
138
- render: {
139
- atlas: GPUTextureView;
140
- atlas_sampler: GPUSampler;
141
- obtain_pipeline: (color_format: string, depth_format: string) => object;
142
- };
143
- }): number;
144
- /**
145
- * The whole standalone frame: simulate, then sort and draw.
146
- *
147
- * @param {object} params every parameter of {@link graph_particles_simulate} and
148
- * {@link graph_particles_render}
149
- * @returns {{color: number, alive: number, pool: number, counters: number}}
150
- */
151
- export function graph_particles(params: object): {
152
- color: number;
153
- alive: number;
154
- pool: number;
155
- counters: number;
156
- };
157
111
  export type ParticleSimulationHandles = {
158
112
  /**
159
113
  * the particle pool, after this frame's INIT and UPDATE
@@ -1 +1 @@
1
- {"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAlBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,GAAG,EAAlB,MAAM;IACS,QAAQ;QACC,QAAQ,EAAhC,MAAM;QAEkB,WAAW,EAAnC,MAAM;;IACS,QAAQ,EAAvB,MAAM;IACS,YAAY,EAA3B,MAAM;IACS,KAAK;QACC,EAAE,EAAvB,MAAM;QACe,IAAI,EAAzB,MAAM;QACe,KAAK,EAA1B,MAAM;QACe,WAAW,EAAhC,MAAM;QACe,mBAAmB,EAAxC,MAAM;;IACJ,yBAAyB,CAgMrC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;WAjBW,OAAO,2DAA2D,EAAE,UAAU;YAC9E,MAAM;WACN,MAAM;WACN,MAAM;SACN,MAAM;eACN,yBAAyB;uBACzB,MAAM;;QAEe,SAAS,EAA9B,MAAM;QACe,QAAQ,EAA7B,MAAM;;;;;wCAIS,MAAM,gBAAgB,MAAM,KAAK,MAAM;;IAEpD,MAAM,CA6ClB;AAED;;;;;;GAMG;AACH,wCAJW,MAAM;WAEI,MAAM;WAAS,MAAM;UAAQ,MAAM;cAAY,MAAM;EAazE;;;;;UAnTa,MAAM;;;;WACN,MAAM;;;;cACN,MAAM;;;;eACN,MAAM;;;;uBACN,MAAM;;;;sBACN,MAAM"}
1
+ {"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAtBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,GAAG,EAAlB,MAAM;IACS,QAAQ;QACC,QAAQ,EAAhC,MAAM;QAEkB,WAAW,EAAnC,MAAM;;IACS,QAAQ,EAAvB,MAAM;IACS,YAAY,EAA3B,MAAM;IAEU,cAAc,EAA9B,OAAO;IAGQ,KAAK;QACC,EAAE,EAAvB,MAAM;QACe,IAAI,EAAzB,MAAM;QACe,KAAK,EAA1B,MAAM;QACe,WAAW,EAAhC,MAAM;QACe,mBAAmB,EAAxC,MAAM;;IACJ,yBAAyB,CA8OrC;;;;;UA9Qa,MAAM;;;;WACN,MAAM;;;;cACN,MAAM;;;;eACN,MAAM;;;;uBACN,MAAM;;;;sBACN,MAAM"}
@@ -2,8 +2,6 @@ import { assert } from "../../../core/assert.js";
2
2
  import { align_4 } from "../../../core/binary/align_4.js";
3
3
  import { noop } from "../../../core/function/noop.js";
4
4
  import { BufferResourceDescriptor } from "../../device/graph/BufferResourceDescriptor.js";
5
- import { TextureViewDescriptor } from "../../descriptor/texture/TextureViewDescriptor.js";
6
- import { DEFAULT_DEPTH_TEXTURE_VIEW } from "../depth/DEFAULT_DEPTH_TEXTURE_VIEW.js";
7
5
  import { INDIRECT_COMPUTE_COMMAND_DESCRIPTOR } from "../gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
8
6
  import { graph_prefix_scan_csdldf } from "../gpu_primitive/prefix_sum/v1/graph_prefix_scan_csdldf.js";
9
7
  import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
@@ -11,41 +9,48 @@ import { shader_prefix_sum_to_command } from "../rasterize/expand/mesh/shader_pr
11
9
  import { graph_compute_indirect_pass } from "../shader/graph/compute/graph_compute_indirect_pass.js";
12
10
  import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
13
11
  import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
14
- import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
12
+ import {
13
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
14
+ PARTICLE_VM_REGISTER_SLOTS,
15
+ PARTICLE_VM_WIDE_LAUNCH_LANES,
16
+ } from "./ParticleConstants.js";
15
17
  import { graph_particle_bucket } from "./coherence/graph_particle_bucket.js";
16
18
  import { shader_particle_emit } from "./shaders/shader_particle_emit.js";
19
+ import {
20
+ PARTICLE_EMIT_WIDE_WORKGROUP_COUNT,
21
+ shader_particle_emit_wide,
22
+ } from "./shaders/shader_particle_emit_wide.js";
17
23
  import { shader_particle_emitter_tick } from "./shaders/shader_particle_emitter_tick.js";
18
24
  import {
19
25
  shader_particle_build_indirect,
20
26
  shader_particle_reset_counters,
21
27
  } from "./shaders/shader_particle_finalize.js";
22
- import { PARTICLE_BILLBOARD_RESOURCES } from "./shaders/shader_particle_render.js";
23
28
  import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js";
29
+ import {
30
+ PARTICLE_SIMULATE_WIDE_WORKGROUP_COUNT,
31
+ shader_particle_simulate_wide,
32
+ } from "./shaders/shader_particle_simulate_wide.js";
24
33
  import {
25
34
  PARTICLE_SPAWN_COMMAND_WORKGROUP_SIZE,
26
35
  shader_particle_spawn_commands,
27
36
  } from "./shaders/shader_particle_spawn_commands.js";
28
- import {
29
- PARTICLE_SORT_WORKGROUP_SIZE,
30
- shader_particle_sort_histogram,
31
- shader_particle_sort_reset,
32
- shader_particle_sort_scatter,
33
- } from "./sort/shader_particle_sort.js";
34
37
 
35
38
  /**
36
- * The particle system's frame, recorded into the frame graph. {@link GPUParticleSystem} is what
37
- * calls these, with the buffers it owns; nothing else needs to.
39
+ * The simulation half of the particle system's frame, recorded into the frame graph.
40
+ * {@link GPUParticleSystem#execute} is what calls it, with the buffers it owns; nothing else needs
41
+ * to.
38
42
  *
39
- * Two halves. {@link graph_particles_simulate} is everything that moves particles:
43
+ * {@link graph_particles_simulate} is everything that moves particles:
40
44
  *
41
45
  * reset counters -> spawn commands -> emitter tick -> scan -> spawn args -> emit -> simulate
42
46
  * -> bucket -> build indirect
43
47
  *
44
48
  * and it leaves the frame's alive list, the pool and the indirect draw args as graph handles for
45
- * whoever draws. {@link graph_particles_render} is the standalone drawing: a depth sort and one
46
- * billboard draw straight over a colour target. Under the renderer the drawing is AVBOIT's instead
47
- * (`graph_particles_avboit.js`), which reads the same handles and needs no sort.
48
- * {@link graph_particles} is the two together, for a page with no transparency pipeline of its own.
49
+ * whoever draws. Nothing here depends on how they will be drawn, which is why the render mode
50
+ * ({@link ParticleRenderMode}) selects only what `execute` records AFTER this: the depth sort and
51
+ * the billboard draw (`sort/graph_particle_sort.js`, `graph_particles_billboard.js`), or nothing at
52
+ * all, because the AVBOIT orchestrator will draw them later off these same handles
53
+ * (`graph_particles_avboit.js`).
49
54
  *
50
55
  * ## Spawning is decided here, on the GPU
51
56
  *
@@ -64,18 +69,18 @@ import {
64
69
  * ordering is camera-independent and changes only when emitters or their programs change.
65
70
  *
66
71
  * The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
67
- * different buffer, produced by different passes, and the standalone billboard draw is what
68
- * consumes it. Reordering the render list for coherence would break premultiplied transparency;
69
- * depth-sorting the simulation list would destroy the coherence. They share no buffer and no
70
- * counter slot.
72
+ * different buffer, produced by different passes, and the standalone billboard draw is the only
73
+ * thing that consumes it, so it is built only in that mode. Reordering the render list for
74
+ * coherence would break premultiplied transparency; depth-sorting the simulation list would destroy
75
+ * the coherence. They share no buffer and no counter slot.
71
76
  *
72
77
  * ## Nothing is sized from the CPU
73
78
  *
74
79
  * Simulate's workgroup count comes from `dispatch_args` (written by LAST frame's build-indirect
75
80
  * pass) via `dispatchWorkgroupsIndirect`, and its element bound from the `ALIVE_IN` counter
76
- * snapshot; the sort's two per-particle passes and the draw are sized the same way, from this
77
- * frame's alive count. A CPU count is inevitably stale and corrupts the pool (orphaned slots when
78
- * the population grows, double-freed slots when it shrinks).
81
+ * snapshot; the draw, and the sort's two per-particle passes when there is a sort, are sized the
82
+ * same way, from this frame's alive count. A CPU count is inevitably stale and corrupts the pool
83
+ * (orphaned slots when the population grows, double-freed slots when it shrinks).
79
84
  *
80
85
  * All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
81
86
  * buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
@@ -109,7 +114,11 @@ import {
109
114
  * list the scan consumes
110
115
  * @param {number} params.emitters.group_count workgroups the tick needs to walk every page group
111
116
  * @param {number} params.capacity pool capacity in particles
112
- * @param {number} params.bucket_count distinct compiled programs — `GPUParticleSystem#bucketCount()`
117
+ * @param {number} params.bucket_count simulation-order buckets, one per program id the registry
118
+ * can hand out — `GPUParticleSystem#bucketCount()`
119
+ * @param {boolean} params.wide_registers run the VM over the wide (storage-backed) register file
120
+ * because some registered effect needs more slots than the fast interpreter's file holds. A
121
+ * whole-system choice, not a per-emitter one — see `runtime/ProgramHeap.js`.
113
122
  * @param {object} params.frame per-frame scalars
114
123
  * @param {number} params.frame.dt
115
124
  * @param {number} params.frame.time
@@ -126,6 +135,7 @@ export function graph_particles_simulate({
126
135
  emitters,
127
136
  capacity,
128
137
  bucket_count,
138
+ wide_registers = false,
129
139
  frame,
130
140
  }) {
131
141
  assert.defined(graph, "graph");
@@ -219,6 +229,20 @@ export function graph_particles_simulate({
219
229
  element_max_count: Math.max(1, emitters.capacity),
220
230
  });
221
231
 
232
+ // The wide interpreter's register file: one column per launched lane, slot-major, sized by the
233
+ // launch and NOT by the pool. Transient and deliberately uncleared — a program reads a register
234
+ // only after writing it, so what the last user left is unreadable by construction. See
235
+ // `vm/chunk_particle_vm_registers_wide.js`.
236
+ //
237
+ // Emit and simulate share it. They cannot overlap (simulate reads the alive list emit appends
238
+ // to), and the file carries nothing between particles, let alone between passes.
239
+ let vm_registers = wide_registers
240
+ ? create_buffer(graph, "particles/vm_registers", BufferResourceDescriptor.from(
241
+ PARTICLE_VM_WIDE_LAUNCH_LANES * PARTICLE_VM_REGISTER_SLOTS * 4,
242
+ GPUBufferUsage.STORAGE,
243
+ ))
244
+ : -1;
245
+
222
246
  // 5. That total, as the emit dispatch — the same one-thread pass that sizes meshlet expansion.
223
247
  const emit_command = graph_compute_pass({
224
248
  graph,
@@ -232,21 +256,37 @@ export function graph_particles_simulate({
232
256
 
233
257
  // 6. Emit — one thread per newborn, its emitter found in the scan. Newborns join the new alive
234
258
  // list.
259
+ //
260
+ // The wide variant does not consume `emit_command`: its launch is a constant, and it reads
261
+ // the scan's total in the shader as a loop bound instead. The command is still built above —
262
+ // it costs one workgroup and keeps the pass graph the same shape either way.
235
263
  {
236
- const out = graph_compute_indirect_pass({
237
- graph,
238
- shader: shader_particle_emit,
239
- bindings: {
240
- scene_database,
241
- emitter_database,
242
- program: gr_program,
243
- spawn_prefix,
244
- pool, alive_out: alive_write, dead, counters,
245
- settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index, u_capacity: capacity },
246
- },
247
- command: emit_command,
248
- });
264
+ const bindings = {
265
+ scene_database,
266
+ emitter_database,
267
+ program: gr_program,
268
+ spawn_prefix,
269
+ pool, alive_out: alive_write, dead, counters,
270
+ settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index, u_capacity: capacity },
271
+ };
272
+
273
+ const out = wide_registers
274
+ ? graph_compute_pass({
275
+ graph,
276
+ shader: shader_particle_emit_wide,
277
+ bindings: { ...bindings, vm_registers },
278
+ group_count: [PARTICLE_EMIT_WIDE_WORKGROUP_COUNT, 1, 1],
279
+ })
280
+ : graph_compute_indirect_pass({
281
+ graph,
282
+ shader: shader_particle_emit,
283
+ bindings,
284
+ command: emit_command,
285
+ });
286
+
249
287
  pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
288
+
289
+ if (wide_registers) { vm_registers = out.vm_registers; }
250
290
  }
251
291
 
252
292
  // 7. Simulate — one indirect dispatch runs every emitter's UPDATE over the program-coherent list
@@ -254,19 +294,34 @@ export function graph_particles_simulate({
254
294
  // slots into the dead list. The workgroup count comes from last frame's dispatch_args and the
255
295
  // list itself from last frame's sim_list — both read here and re-written in steps 8 and 9,
256
296
  // with insertion order keeping the read before the write.
297
+ //
298
+ // The wide variant ignores `gr_dispatch` for the same reason emit ignores its command: a
299
+ // bounded launch with a grid-stride loop, so the register file is sized by a constant rather
300
+ // than by the alive count. The list and its length are unchanged, and so is every guarantee
301
+ // that comes from reading the length on the GPU.
257
302
  {
258
- const out = graph_compute_indirect_pass({
259
- graph,
260
- shader: shader_particle_simulate,
261
- bindings: {
262
- scene_database,
263
- emitter_database,
264
- program: gr_program,
265
- pool, sim_list: gr_sim_list, alive_out: alive_write, dead, counters,
266
- settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index },
267
- },
268
- command: gr_dispatch,
269
- });
303
+ const bindings = {
304
+ scene_database,
305
+ emitter_database,
306
+ program: gr_program,
307
+ pool, sim_list: gr_sim_list, alive_out: alive_write, dead, counters,
308
+ settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index },
309
+ };
310
+
311
+ const out = wide_registers
312
+ ? graph_compute_pass({
313
+ graph,
314
+ shader: shader_particle_simulate_wide,
315
+ bindings: { ...bindings, vm_registers },
316
+ group_count: [PARTICLE_SIMULATE_WIDE_WORKGROUP_COUNT, 1, 1],
317
+ })
318
+ : graph_compute_indirect_pass({
319
+ graph,
320
+ shader: shader_particle_simulate,
321
+ bindings,
322
+ command: gr_dispatch,
323
+ });
324
+
270
325
  pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
271
326
  }
272
327
 
@@ -310,218 +365,6 @@ export function graph_particles_simulate({
310
365
  };
311
366
  }
312
367
 
313
- /**
314
- * The standalone drawing: the depth sort, then one billboard draw over a colour target with
315
- * fixed-function blending.
316
- *
317
- * @param {object} params
318
- * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
319
- * @param {number} params.camera graph handle
320
- * @param {number} params.color graph handle of the colour target the billboards draw over
321
- * @param {number} params.depth graph handle of the scene depth, tested against and never written
322
- * @param {object} params.gpu the persistent buffers
323
- * @param {ParticleSimulationHandles} params.simulated what {@link graph_particles_simulate} returned
324
- * @param {number} params.sort_bucket_count depth bins the render sort quantises into
325
- * @param {object} params.frame
326
- * @param {number} params.frame.sort_near view depth the sort's first bin starts at
327
- * @param {number} params.frame.sort_far view depth the sort's last bin ends at
328
- * @param {object} params.render
329
- * @param {GPUTextureView} params.render.atlas sprite atlas
330
- * @param {GPUSampler} params.render.atlas_sampler
331
- * @param {(color_format: string, depth_format: string) => object} params.render.obtain_pipeline
332
- * the billboard pipeline for the frame's attachment formats
333
- * @returns {number} the colour handle after the draw
334
- */
335
- export function graph_particles_render({
336
- graph,
337
- camera,
338
- color,
339
- depth,
340
- gpu,
341
- simulated,
342
- sort_bucket_count,
343
- frame,
344
- render,
345
- }) {
346
- assert.defined(simulated, "simulated");
347
-
348
- // 10. Sort — the render order: back-to-front by view depth, so premultiplied transparency
349
- // composites correctly. Its two per-particle passes take the dispatch the bucket reset
350
- // wrote from the alive count.
351
- const sorted = graph_particle_sort({
352
- graph,
353
- gpu,
354
- camera,
355
- emitter_database: simulated.emitter_database,
356
- pool: simulated.pool,
357
- alive: simulated.alive,
358
- counters: simulated.counters,
359
- dispatch_args: simulated.sim_dispatch_args,
360
- bucket_count: sort_bucket_count,
361
- near: frame.sort_near,
362
- far: frame.sort_far,
363
- });
364
-
365
- // 11. Render — one instanced billboard draw over the sorted list, sized by the draw args this
366
- // frame's build-indirect wrote.
367
- return graph_particle_render({
368
- graph,
369
- camera,
370
- color,
371
- depth,
372
- pool: simulated.pool,
373
- sorted,
374
- emitter_database: simulated.emitter_database,
375
- draw_args: simulated.draw_args,
376
- render,
377
- });
378
- }
379
-
380
- /**
381
- * The whole standalone frame: simulate, then sort and draw.
382
- *
383
- * @param {object} params every parameter of {@link graph_particles_simulate} and
384
- * {@link graph_particles_render}
385
- * @returns {{color: number, alive: number, pool: number, counters: number}}
386
- */
387
- export function graph_particles(params) {
388
- const simulated = graph_particles_simulate(params);
389
-
390
- const color = graph_particles_render({ ...params, simulated });
391
-
392
- return {
393
- color,
394
- alive: simulated.alive,
395
- pool: simulated.pool,
396
- counters: simulated.counters,
397
- };
398
- }
399
-
400
- /**
401
- * The depth sort: reset -> histogram -> csdldf scan -> scatter, into `gpu.sorted`.
402
- *
403
- * @returns {number} graph handle of the sorted slot list
404
- */
405
- function graph_particle_sort({ graph, gpu, camera, emitter_database, pool, alive, counters, dispatch_args, bucket_count, near, far }) {
406
- let histogram = graph_import_buffer(graph, gpu.sort_histogram, "particles/sort_histogram");
407
- let cursor = graph_import_buffer(graph, gpu.sort_cursor, "particles/sort_cursor");
408
- let keys = graph_import_buffer(graph, gpu.sort_keys, "particles/sort_keys");
409
- let sorted = graph_import_buffer(graph, gpu.sorted, "particles/sorted");
410
-
411
- // The reset's widest loop is the scan header plus the bins rounded up to a whole vec4.
412
- const reset_words = PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(bucket_count);
413
-
414
- {
415
- const out = graph_compute_pass({
416
- graph,
417
- shader: shader_particle_sort_reset,
418
- bindings: { histogram, cursor, settings: { u_bucket_count: bucket_count } },
419
- group_count: [Math.ceil(reset_words / PARTICLE_SORT_WORKGROUP_SIZE), 1, 1],
420
- });
421
- histogram = out.histogram;
422
- cursor = out.cursor;
423
- }
424
-
425
- // The counters are only read here, but an atomic read needs a read_write binding, and the
426
- // graph sees a write — so the handle is threaded through like any other.
427
- {
428
- const out = graph_compute_indirect_pass({
429
- graph,
430
- shader: shader_particle_sort_histogram,
431
- bindings: {
432
- camera, emitter_database, pool, alive, counters, keys, histogram,
433
- settings: { u_near: near, u_far: far, u_bucket_count: bucket_count },
434
- },
435
- command: dispatch_args,
436
- });
437
- keys = out.keys;
438
- histogram = out.histogram;
439
- counters = out.counters;
440
- }
441
-
442
- const scanned = graph_prefix_scan_csdldf({
443
- graph,
444
- data: histogram,
445
- element_max_count: bucket_count,
446
- });
447
-
448
- {
449
- const out = graph_compute_indirect_pass({
450
- graph,
451
- shader: shader_particle_sort_scatter,
452
- bindings: { keys, alive, scanned, counters, cursor, sorted },
453
- command: dispatch_args,
454
- });
455
- sorted = out.sorted;
456
- }
457
-
458
- return sorted;
459
- }
460
-
461
- /** The colour attachment's view: one mip, the one the frame draws into. */
462
- const COLOR_VIEW = TextureViewDescriptor.from({ mipLevelCount: 1, baseMipLevel: 0 });
463
-
464
- /**
465
- * The billboard draw: loads the colour target, depth-tests read-only against the scene, draws
466
- * `drawIndirect(draw_args)` instances over the sorted list.
467
- *
468
- * @returns {number} the colour handle after the draw
469
- */
470
- function graph_particle_render({ graph, camera, color, depth, pool, sorted, emitter_database, draw_args, render }) {
471
- const data = {};
472
-
473
- const pass = graph.add("Particle Billboard", data, (data, resources, context) => {
474
- const encoder = context.encoder;
475
-
476
- const color_texture = resources.get(data.color);
477
- const depth_texture = resources.get(data.depth);
478
-
479
- const pipeline = render.obtain_pipeline(color_texture.descriptor.format, depth_texture.descriptor.format);
480
-
481
- // Read by the soft-depth fade and tested against by the pass: the same view, read-only in
482
- // both roles.
483
- const depth_view = depth_texture.obtainView(DEFAULT_DEPTH_TEXTURE_VIEW);
484
-
485
- const bindings = PARTICLE_BILLBOARD_RESOURCES.generateBindings({
486
- camera: resources.get(data.camera),
487
- pool: resources.get(data.pool),
488
- draw_list: resources.get(data.sorted),
489
- emitter_database: resources.get(data.emitter_database),
490
- atlas: render.atlas,
491
- atlas_sampler: render.atlas_sampler,
492
- scene_depth: depth_view,
493
- }, encoder);
494
-
495
- const render_pass = encoder.constructRenderPass({
496
- label: "Particle Billboard",
497
- pipeline,
498
- bindings,
499
- colorAttachments: [{
500
- view: color_texture.obtainView(COLOR_VIEW),
501
- loadOp: "load",
502
- storeOp: "store",
503
- }],
504
- depthStencilAttachment: {
505
- view: depth_view,
506
- depthReadOnly: true,
507
- },
508
- });
509
-
510
- render_pass.drawIndirect(resources.get(data.draw_args), 0);
511
- render_pass.end();
512
- });
513
-
514
- data.camera = pass.read(camera);
515
- data.pool = pass.read(pool);
516
- data.sorted = pass.read(sorted);
517
- data.emitter_database = pass.read(emitter_database);
518
- data.draw_args = pass.read(draw_args);
519
- data.depth = pass.read(depth);
520
- data.color = pass.write(pass.read(color));
521
-
522
- return data.color;
523
- }
524
-
525
368
  /**
526
369
  * A transient buffer with no producing pass of its own, for a binding a shader both reads and
527
370
  * writes — the compute pass helpers create a buffer only for write-only bindings, and a
@@ -1 +1 @@
1
- {"version":3,"file":"graph_particles_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_avboit.js"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;GAYG;AACH;IATkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACoB,kBAAkB,EAA5C,UAAU,MAAM,CAAC;IACF,SAAS,EAAxB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,mBAAmB,EAAlC,MAAM;IACJ,MAAM,CAiDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH;IAZkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,IAAI,EAAnB,MAAM;IACwD,MAAM,EAApE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;IAC9B,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CA8EjE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAjBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IACnB,QAAQ,EAAnE,OAAO,2BAA2B,EAAE,cAAc;IACnC,MAAM,EAArB,MAAM;IACS,aAAa,EAA5B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,eAAe,EAA9B,MAAM;IACS,oBAAoB,EAAnC,MAAM;IACsE,YAAY,EAAxF;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IAC5C,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAoG/E"}
1
+ {"version":3,"file":"graph_particles_avboit.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles_avboit.js"],"names":[],"mappings":"AAqCA;;;;;;;;;;;;GAYG;AACH;IATkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACoB,kBAAkB,EAA5C,UAAU,MAAM,CAAC;IACF,SAAS,EAAxB,MAAM;IACS,cAAc,EAA7B,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,mBAAmB,EAAlC,MAAM;IACJ,MAAM,CAiDlB;AAED;;;;;;;;;;;;;;;GAeG;AACH;IAZkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,MAAM,EAArB,MAAM;IACS,IAAI,EAAnB,MAAM;IACwD,MAAM,EAApE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC;IAC9B,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CA8EjE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAjBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IACnB,QAAQ,EAAnE,OAAO,2BAA2B,EAAE,cAAc;IACnC,MAAM,EAArB,MAAM;IACS,aAAa,EAA5B,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,eAAe,EAA9B,MAAM;IACS,oBAAoB,EAAnC,MAAM;IACsE,YAAY,EAAxF;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC;IAC5C,KAAK;IACT,aAAa;IACjB,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,gBAAgB,EAA/B,MAAM;IACS,SAAS,EAAxB,MAAM;IACJ;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAoG/E"}
@@ -24,8 +24,9 @@ import {
24
24
  * GPU-driven: the draws are `drawIndirect` over the GPU's own alive count, and the occupancy walks
25
25
  * the emitter table's pages. Nothing here knows how many particles there are.
26
26
  *
27
- * Order does not matter to any of them — the volume and the accumulators are order-independent —
28
- * so the depth sort the standalone renderer needs is not run for this path.
27
+ * Order does not matter to any of them — the volume and the accumulators are order-independent — so
28
+ * the depth sort the standalone billboard draw needs is not run for this path, and its buffers are
29
+ * never made. That is what {@link ParticleRenderMode.AVBOIT} means.
29
30
  */
30
31
 
31
32
  /** The accumulators' view: one mip, the one the frame draws into. */