@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,156 +0,0 @@
1
- /**
2
- * Compose the flags word from feature toggles + blend + projection.
3
- * @param {object} options
4
- * @param {boolean} [options.lighting]
5
- * @param {boolean} [options.soft_depth]
6
- * @param {boolean} [options.sort]
7
- * @param {boolean} [options.cull]
8
- * @param {number} [options.blend] see {@link EMITTER_BLEND}
9
- * @param {number} [options.projection] see {@link EMITTER_PROJECTION}
10
- * @returns {number}
11
- */
12
- export function make_emitter_flags({ lighting, soft_depth, sort, cull, blend, projection }?: {
13
- lighting?: boolean;
14
- soft_depth?: boolean;
15
- sort?: boolean;
16
- cull?: boolean;
17
- blend?: number;
18
- projection?: number;
19
- }): number;
20
- /** @param {number} flags @returns {number} the blend mode */
21
- export function emitter_flags_blend(flags: number): number;
22
- /** @param {number} flags @returns {number} the projection mode */
23
- export function emitter_flags_projection(flags: number): number;
24
- /**
25
- * Write one emitter record into a shared `u32` view (and its `f32` alias) at record `index`.
26
- *
27
- * @param {Uint32Array} u32 view over the emitter buffer
28
- * @param {Float32Array} f32 f32 alias over the same buffer
29
- * @param {number} index emitter index
30
- * @param {object} def emitter definition
31
- * @param {number} def.spawn_offset
32
- * @param {number} def.spawn_count
33
- * @param {number} def.update_offset
34
- * @param {number} def.update_count
35
- * @param {number} def.constant_offset
36
- * @param {number} def.seed
37
- * @param {number} def.flags
38
- * @param {number} def.spawn_rate
39
- * @param {number[]} def.transform 16-element column-major matrix
40
- * @param {number[]} [def.bounds_center] length-3
41
- * @param {number} [def.bounds_radius]
42
- * @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
43
- * @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
44
- * @param {number[]} [def.flipbook] length-2 [cols, rows]
45
- * @param {number} [def.program_id] dense program id, the simulation-order bucket key
46
- */
47
- export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
48
- spawn_offset: number;
49
- spawn_count: number;
50
- update_offset: number;
51
- update_count: number;
52
- constant_offset: number;
53
- seed: number;
54
- flags: number;
55
- spawn_rate: number;
56
- transform: number[];
57
- bounds_center?: number[];
58
- bounds_radius?: number;
59
- render?: object;
60
- atlas_region?: number[];
61
- flipbook?: number[];
62
- program_id?: number;
63
- }): void;
64
- /**
65
- * Overwrite just an emitter's world transform in a packed buffer.
66
- *
67
- * Used for scene-node / bone attachment: each frame the feature copies the attached `Node3D`'s
68
- * world matrix (`transform_global`) into the emitter record and re-uploads the changed region, so
69
- * the emitter spawns and simulates wherever the bone currently is. Cheaper than repacking the whole
70
- * emitter set.
71
- *
72
- * @param {Float32Array} f32 f32 alias over the emitter buffer
73
- * @param {number} index emitter index
74
- * @param {ArrayLike<number>} matrix 16-element column-major world matrix
75
- */
76
- export function write_emitter_transform(f32: Float32Array, index: number, matrix: ArrayLike<number>): void;
77
- /**
78
- * GPU memory layout for a single emitter record, addressed as `u32` words.
79
- *
80
- * Emitters are read on the GPU via explicit indexed access into an `array<u32>` (the same strategy
81
- * GPUDatabase uses on-device) rather than an `array<Struct>` binding — this keeps the simulate/emit
82
- * shaders trivially testable through the WGSL emulator. The word offsets here are the single source
83
- * of truth shared by the JS packer ({@link pack_emitter}) and the WGSL reader
84
- * ({@link ../data/chunk_particle_emitter.js}, which interpolates them).
85
- *
86
- * f32 fields are stored as their bit pattern and read back with `bitcast<f32>`.
87
- */
88
- /** Word offsets within an emitter record. */
89
- export const EMITTER_FIELD: Readonly<{
90
- SPAWN_OFFSET: 0;
91
- SPAWN_COUNT: 1;
92
- UPDATE_OFFSET: 2;
93
- UPDATE_COUNT: 3;
94
- CONSTANT_OFFSET: 4;
95
- SEED: 5;
96
- FLAGS: 6;
97
- SPAWN_RATE: 7;
98
- TRANSFORM: 8;
99
- BOUNDS_CENTER: 24;
100
- BOUNDS_RADIUS: 27;
101
- RENDER_POSITION: 28;
102
- RENDER_SIZE: 29;
103
- RENDER_COLOR: 30;
104
- RENDER_ROTATION: 31;
105
- RENDER_FRAME: 32;
106
- ATLAS_REGION: 33;
107
- FLIPBOOK: 37;
108
- RENDER_VELOCITY: 39;
109
- /**
110
- * u32 — dense id of the compiled program this emitter runs, assigned by
111
- * {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
112
- *
113
- * The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
114
- * integer to index a bin with, which neither the emitter index (one bucket per emitter, even
115
- * when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
116
- * and sparse) gives it.
117
- */
118
- PROGRAM_ID: 40;
119
- }>;
120
- /** Number of `u32` words per emitter record. */
121
- export const EMITTER_STRIDE: 41;
122
- /** Sentinel for an absent render-attribute binding. */
123
- export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
124
- /** Sentinel for "not attached to a scene node". */
125
- export const EMITTER_ATTACH_NONE: 4294967295;
126
- /**
127
- * Emitter flag bits. Blend mode occupies bits [4,6), projection mode bits [6,9).
128
- */
129
- export const EMITTER_FLAG: Readonly<{
130
- LIGHTING: number;
131
- SOFT_DEPTH: number;
132
- SORT: number;
133
- CULL: number;
134
- }>;
135
- /** Blend modes (stored in flag bits [4,6)). All expressed by one premultiplied blend pipeline. */
136
- export const EMITTER_BLEND: Readonly<{
137
- ALPHA: 0;
138
- ADDITIVE: 1;
139
- PREMULTIPLIED: 2;
140
- }>;
141
- /** Projection / orientation modes (stored in flag bits [6,9)). */
142
- export const EMITTER_PROJECTION: Readonly<{
143
- BILLBOARD: 0;
144
- STRETCHED: 1;
145
- HORIZONTAL: 2;
146
- VERTICAL: 3;
147
- FACING_WORLD: 4;
148
- }>;
149
- /** Shift/mask constants exposed for the WGSL reader to interpolate. */
150
- export const EMITTER_FLAG_ENCODING: Readonly<{
151
- BLEND_SHIFT: 4;
152
- BLEND_MASK: number;
153
- PROJECTION_SHIFT: 6;
154
- PROJECTION_MASK: number;
155
- }>;
156
- //# sourceMappingURL=PARTICLE_EMITTER_LAYOUT.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
@@ -1,219 +0,0 @@
1
- /**
2
- * Render channels an emitter can bind to one of its effect's per-particle attributes. The names
3
- * match the `render_*` fields of {@link ../data/PARTICLE_EMITTER_STRUCT.js}.
4
- *
5
- * @type {string[]}
6
- */
7
- export const EMITTER_RENDER_CHANNELS: string[];
8
- /**
9
- * One emitter: a compiled effect bound to instance parameters — world transform, spawn rate,
10
- * blend / projection / feature flags, bounds sphere, render-attribute bindings, atlas region and
11
- * flipbook grid.
12
- *
13
- * This is the CPU model of exactly one row of the emitter table
14
- * ({@link ../data/PARTICLE_EMITTER_STRUCT.js}); {@link to_record} is the whole of the translation
15
- * between the two. Fields are plain data with no setters — after changing any of them, set
16
- * {@link dirty} so {@link ../runtime/EmitterRegistry.js} restages the row on its next flush. The
17
- * flag rather than a setter per field because a row is restaged whole either way: one changed field
18
- * and ten cost the same upload.
19
- *
20
- * Instances are created by {@link EmitterRegistry#add}, which assigns {@link id} and resolves the
21
- * program placement. Constructing one directly gives you an emitter no table knows about.
22
- */
23
- export class Emitter {
24
- /**
25
- * Build an emitter from a plain description. Every parameter is optional except the effect —
26
- * an emitter with no program has nothing to run.
27
- *
28
- * @param {object} config
29
- * @param {{layout: object, program: object}} config.effect compiled effect, see
30
- * {@link ./create_particle_effect.js}
31
- * @param {ArrayLike<number>} [config.transform] 16-element column-major local-to-world
32
- * @param {number} [config.seed]
33
- * @param {number} [config.spawn_rate] particles/second
34
- * @param {object} [config.flags] passed to {@link make_emitter_flags}
35
- * @param {{center?: ArrayLike<number>, radius?: number}} [config.bounds]
36
- * @param {Object<string,string>} [config.render] render channel -> attribute name
37
- * @param {ArrayLike<number>} [config.atlas_region] [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
38
- * @param {ArrayLike<number>} [config.flipbook] [cols, rows]
39
- * @param {object} [config.node] scene node to follow, see {@link attach_to}
40
- * @returns {Emitter}
41
- */
42
- static from(config: {
43
- effect: {
44
- layout: object;
45
- program: object;
46
- };
47
- transform?: ArrayLike<number>;
48
- seed?: number;
49
- spawn_rate?: number;
50
- flags?: object;
51
- bounds?: {
52
- center?: ArrayLike<number>;
53
- radius?: number;
54
- };
55
- render?: {
56
- [x: string]: string;
57
- };
58
- atlas_region?: ArrayLike<number>;
59
- flipbook?: ArrayLike<number>;
60
- node?: object;
61
- }): Emitter;
62
- /**
63
- * Row this emitter occupies in the emitter table. Stable for the emitter's whole life — it is
64
- * what every live particle's record header stores, so it cannot be renumbered while particles
65
- * are in flight. `-1` until the registry assigns one.
66
- *
67
- * @type {number}
68
- */
69
- id: number;
70
- /**
71
- * Compiled effect: the per-particle attribute layout plus the SPAWN/UPDATE bytecode.
72
- *
73
- * @type {{layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram}}
74
- */
75
- effect: {
76
- layout: import("../layout/ParticleLayout.js").ParticleLayout;
77
- program: import("../isa/ParticleProgram.js").ParticleProgram;
78
- };
79
- /**
80
- * Where this emitter's program sits in the shared arena, and the dense program id the
81
- * simulation-order bucketing keys on. Assigned by {@link EmitterRegistry#add} from
82
- * {@link ../runtime/ProgramArena.js}; emitters compiled from the same graph share one.
83
- *
84
- * @type {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
85
- */
86
- placement: {
87
- spawn_offset: number;
88
- spawn_count: number;
89
- update_offset: number;
90
- update_count: number;
91
- constant_offset: number;
92
- program_id: number;
93
- };
94
- /**
95
- * Local-to-world, column-major.
96
- * @type {Float32Array}
97
- */
98
- transform: Float32Array;
99
- /**
100
- * Base RNG seed.
101
- *
102
- * Two emitters running one program produce identical particles from identical seeds, so leaving
103
- * this at 0 is almost never what an author wants — {@link EmitterRegistry#add} reads 0 as
104
- * "unset" and derives one from the row instead.
105
- *
106
- * @type {number}
107
- */
108
- seed: number;
109
- /**
110
- * Continuous emission rate, particles per second. Consumed on the CPU by
111
- * {@link ./ParticleSpawnScheduler.js} and carried in the record for shaders that want it.
112
- * @type {number}
113
- */
114
- spawn_rate: number;
115
- /**
116
- * Packed feature / blend / projection bits — see {@link make_emitter_flags}.
117
- * @type {number}
118
- */
119
- flags: number;
120
- /**
121
- * Bounding sphere in emitter-local space, used by the optional simulation culling.
122
- * @type {Float32Array}
123
- */
124
- bounds_center: Float32Array;
125
- /**
126
- * @type {number}
127
- */
128
- bounds_radius: number;
129
- /**
130
- * Atlas sub-rect: uv offset `.xy`, uv scale `.zw`. Mirrors meep's `AtlasPatch`.
131
- * @type {Float32Array}
132
- */
133
- atlas_region: Float32Array;
134
- /**
135
- * Flipbook grid: columns, rows. `[1, 1]` is a single frame.
136
- * @type {Float32Array}
137
- */
138
- flipbook: Float32Array;
139
- /** @type {number} record word offset of world position, or {@link EMITTER_ATTRIBUTE_ABSENT} */
140
- render_position: number;
141
- /** @type {number} record word offset of size */
142
- render_size: number;
143
- /** @type {number} record word offset of rgba colour */
144
- render_color: number;
145
- /** @type {number} record word offset of roll angle, radians */
146
- render_rotation: number;
147
- /** @type {number} record word offset of flipbook frame index */
148
- render_frame: number;
149
- /** @type {number} record word offset of velocity, read by the STRETCHED projection */
150
- render_velocity: number;
151
- /**
152
- * Scene node (bone) this emitter follows, if any. While set, the system copies the node's world
153
- * matrix into {@link transform} every frame, so the emitter spawns and simulates wherever the
154
- * bone currently is.
155
- *
156
- * @type {{transform_global: {matrix: ArrayLike<number>}}|undefined}
157
- */
158
- node: {
159
- transform_global: {
160
- matrix: ArrayLike<number>;
161
- };
162
- } | undefined;
163
- /**
164
- * Whether the table row is out of step with the fields above. Set it after changing anything;
165
- * {@link EmitterRegistry#flush} clears it once the row has been staged for upload.
166
- *
167
- * @type {boolean}
168
- */
169
- dirty: boolean;
170
- /**
171
- * Point the emitter at a scene node, or at nothing.
172
- *
173
- * @param {{transform_global: {matrix: ArrayLike<number>}}} [node]
174
- */
175
- attach_to(node?: {
176
- transform_global: {
177
- matrix: ArrayLike<number>;
178
- };
179
- }): void;
180
- /**
181
- * Copy a world matrix into {@link transform} and mark the row for re-upload.
182
- *
183
- * @param {ArrayLike<number>} matrix 16-element column-major
184
- */
185
- set_transform(matrix: ArrayLike<number>): void;
186
- /**
187
- * Bind render channels to per-particle attributes of this emitter's effect, by attribute name.
188
- * Channels left out of `channels` keep whatever they had; a channel that was never bound stays
189
- * at {@link EMITTER_ATTRIBUTE_ABSENT}, which the passes read as "this emitter has no such
190
- * attribute" — the render pass substitutes a default, the sort pass treats the particle as
191
- * being at the origin.
192
- *
193
- * The record stores word offsets rather than names because that is what the render and sort
194
- * passes index a particle record with; resolving here is the only place a name is involved.
195
- *
196
- * @param {Object<string,string>} channels channel name (see {@link EMITTER_RENDER_CHANNELS}) ->
197
- * attribute name in the effect's layout
198
- */
199
- bind_render(channels: {
200
- [x: string]: string;
201
- }): void;
202
- /**
203
- * This emitter as the value the emitter table stores — every field of
204
- * {@link ../data/PARTICLE_EMITTER_STRUCT.js}, none omitted.
205
- *
206
- * Omitting one would not write zeros: the serializer skips absent fields, and table pages are
207
- * recycled buffers, so a skipped field keeps whatever the previous tenant of the slot left
208
- * there.
209
- *
210
- * @returns {object}
211
- */
212
- to_record(): object;
213
- /**
214
- * @readonly
215
- * @type {boolean}
216
- */
217
- readonly isEmitter: boolean;
218
- }
219
- //# sourceMappingURL=Emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/Emitter.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,sCAFU,MAAM,EAAE,CAIf;AAEH;;;;;;;;;;;;;;GAcG;AACH;IAqNI;;;;;;;;;;;;;;;;;OAiBG;IACH;QAbqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QAEN,SAAS,GAApC,UAAU,MAAM,CAAC;QACD,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACiD,MAAM,GAA7D;YAAC,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACd,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACO,YAAY,GAAvC,UAAU,MAAM,CAAC;QACU,QAAQ,GAAnC,UAAU,MAAM,CAAC;QACD,IAAI,GAApB,MAAM;QACJ,OAAO,CAoDnB;IAvRD;;;;;;OAMG;IACH,IAFU,MAAM,CAER;IAER;;;;OAIG;IACH,QAFU;QAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,eAAe,CAAA;KAAC,CAE/H;IAEP;;;;;;OAMG;IACH,WAFU;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAErI;IAEV;;;OAGG;IACH,WAFU,YAAY,CAEiB;IAEvC;;;;;;;;OAQG;IACH,MAFU,MAAM,CAEP;IAET;;;;OAIG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,eAFU,YAAY,CAEc;IAEpC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,cAFU,YAAY,CAEwB;IAE9C;;;OAGG;IACH,UAFU,YAAY,CAEc;IAEpC,+FAA+F;IAC/F,iBADW,MAAM,CAC0B;IAC3C,gDAAgD;IAChD,aADW,MAAM,CACsB;IACvC,uDAAuD;IACvD,cADW,MAAM,CACuB;IACxC,+DAA+D;IAC/D,iBADW,MAAM,CAC0B;IAC3C,gEAAgE;IAChE,cADW,MAAM,CACuB;IACxC,sFAAsF;IACtF,iBADW,MAAM,CAC0B;IAE3C;;;;;;OAMG;IACH,MAFU;QAAC,gBAAgB,EAAE;YAAC,MAAM,EAAE,UAAU,MAAM,CAAC,CAAA;SAAC,CAAA;KAAC,GAAC,SAAS,CAE9D;IAEL;;;;;OAKG;IACH,OAFU,OAAO,CAEJ;IAEb;;;;OAIG;IACH,iBAFW;QAAC,gBAAgB,EAAE;YAAC,MAAM,EAAE,UAAU,MAAM,CAAC,CAAA;SAAC,CAAA;KAAC,QAIzD;IAED;;;;OAIG;IACH,sBAFW,UAAU,MAAM,CAAC,QAO3B;IAED;;;;;;;;;;;;OAYG;IACH;YAHkB,MAAM,GAAC,MAAM;aA2B9B;IAED;;;;;;;;;OASG;IACH,aAFa,MAAM,CAiClB;IAyEL;;;OAGG;IACH,oBAFU,OAAO,CAEU;CAN1B"}
@@ -1,77 +0,0 @@
1
- /**
2
- * CPU-side spawn scheduling. Each frame it turns per-emitter spawn rates (and the cull/sleep state)
3
- * into a flat list of spawn requests (packed emitter id + batch fraction per particle to create,
4
- * see {@link spawn_request_pack}) that the emit pass consumes. Emitters are few and CPU-authored,
5
- * so deciding *how many* to spawn on the CPU is cheap and keeps the GPU emit pass a simple
6
- * "one thread per new particle".
7
- *
8
- * Sleep-when-culled: a culled emitter accumulates sleep time and spawns nothing. When it becomes
9
- * visible again it emits a bounded catch-up burst approximating the spawns it missed, mirroring the
10
- * catch-up in meep's ParticularEngine (but capped so a long occlusion can't spike the pool).
11
- *
12
- * State is keyed by {@link Emitter#id}, not by position in the emitter array: ids are stable and
13
- * sparse, positions are neither, and a positional key would silently hand a new emitter the
14
- * accumulator and sleep debt of whichever one used to sit at its index.
15
- */
16
- export class ParticleSpawnScheduler {
17
- /**
18
- * @param {object} [options]
19
- * @param {number} [options.max_catchup_seconds] cap on how much missed time a wake burst covers
20
- */
21
- constructor({ max_catchup_seconds }?: {
22
- max_catchup_seconds?: number;
23
- });
24
- /**
25
- * Cap on how much missed time a wake-up burst covers, in seconds.
26
- * @type {number}
27
- */
28
- max_catchup_seconds: number;
29
- /**
30
- * Emitter id -> its bookkeeping.
31
- * @type {Map<number, ParticleSpawnState>}
32
- */
33
- state: Map<number, ParticleSpawnState>;
34
- /**
35
- * Drop bookkeeping for an emitter that is no longer registered, so a later emitter reusing that
36
- * table row starts from zero instead of inheriting a stranger's accumulator.
37
- *
38
- * @param {number} id
39
- */
40
- forget(id: number): void;
41
- /**
42
- * Produce this frame's spawn requests.
43
- *
44
- * @param {Iterable<import("./Emitter.js").Emitter>} emitters the live emitters
45
- * @param {number} dt seconds
46
- * @param {(emitter: import("./Emitter.js").Emitter) => boolean} [is_visible] cull predicate
47
- * (default: all visible)
48
- * @param {number} [capacity] optional hard cap on total requests this frame
49
- * @returns {Uint32Array} flat list of packed spawn requests (emitter id + batch fraction),
50
- * one per particle to spawn — see {@link spawn_request_pack}
51
- */
52
- tick(emitters: Iterable<import("./Emitter.js").Emitter>, dt: number, is_visible?: (emitter: import("./Emitter.js").Emitter) => boolean, capacity?: number): Uint32Array;
53
- #private;
54
- }
55
- /**
56
- * Per-emitter spawn bookkeeping, carried across frames.
57
- */
58
- declare class ParticleSpawnState {
59
- /**
60
- * Fractional particles owed. A rate of 0.5/s at 60fps owes 1/120 of a particle per frame; the
61
- * whole part is emitted and the remainder carried, so the emitter fires once every two seconds
62
- * rather than never.
63
- * @type {number}
64
- */
65
- accumulator: number;
66
- /**
67
- * Seconds spent culled since the emitter was last visible.
68
- * @type {number}
69
- */
70
- sleep_time: number;
71
- /**
72
- * @type {boolean}
73
- */
74
- was_visible: boolean;
75
- }
76
- export {};
77
- //# sourceMappingURL=ParticleSpawnScheduler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ParticleSpawnScheduler.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;GAcG;AACH;IAcI;;;OAGG;IACH;QAF4B,mBAAmB,GAApC,MAAM;OAIhB;IAlBD;;;OAGG;IACH,qBAFU,MAAM,CAEQ;IAExB;;;OAGG;IACH,OAFU,IAAI,MAAM,EAAE,kBAAkB,CAAC,CAEvB;IA2BlB;;;;;OAKG;IACH,WAFW,MAAM,QAIhB;IAED;;;;;;;;;;OAUG;IACH,eARW,SAAS,OAAO,cAAc,EAAE,OAAO,CAAC,MACxC,MAAM,yBACI,OAAO,cAAc,EAAE,OAAO,KAAK,OAAO,aAEpD,MAAM,GACJ,WAAW,CA6CvB;;CACJ;AA9ID;;GAEG;AACH;IACI;;;;;OAKG;IACH,aAFU,MAAM,CAEA;IAEhB;;;OAGG;IACH,YAFU,MAAM,CAED;IAEf;;OAEG;IACH,aAFU,OAAO,CAEE;CACtB"}
@@ -1,155 +0,0 @@
1
- import {
2
- PARTICLE_PROGRAM_CODE_BASE_WORD,
3
- PARTICLE_PROGRAM_HEADER_WORDS,
4
- PARTICLE_VM_INSTRUCTION_WORDS,
5
- } from "../ParticleConstants.js";
6
-
7
- /**
8
- * Packs many compiled {@link ../isa/ParticleProgram.js} programs into one shared buffer — a header,
9
- * every program's constant pool, then every program's instruction words — and hands back the
10
- * offsets each emitter records.
11
- *
12
- * Data before code, behind a four-word header whose first word says where the code starts: the VM
13
- * reads both sections through one binding (a storage buffer per stage is not free, and code and
14
- * constants are read together), and an emitter's constant pool sits next to the pools of the
15
- * programs it shares a wave with.
16
- *
17
- * Because VM instructions carry no absolute code addresses (control flow is branchless) and
18
- * constant references are program-local (the VM adds the emitter's `constant_offset`), programs
19
- * can be concatenated at any offset. INIT and UPDATE sections are laid out back-to-back per program.
20
- */
21
- export class ProgramArena {
22
-
23
- /**
24
- * Flat instruction words, every program's INIT and UPDATE sections concatenated.
25
- * @type {number[]}
26
- */
27
- instruction_words = [];
28
-
29
- /**
30
- * Flat constant words (f32 bit patterns), every program's pool concatenated.
31
- * @type {number[]}
32
- */
33
- constant_words = [];
34
-
35
- /**
36
- * Running instruction index — INIT/UPDATE offsets are in these units.
37
- * @type {number}
38
- */
39
- instruction_count = 0;
40
-
41
- /**
42
- * Running constant word index — the pool is addressed by word, so a scalar literal costs one
43
- * rather than the four a `vec4` entry used to.
44
- * @type {number}
45
- */
46
- constant_word_count = 0;
47
-
48
- /**
49
- * Content key -> the placement the first identical program got.
50
- * @type {Map<string, {init_offset: number, init_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}>}
51
- */
52
- programs = new Map();
53
-
54
- /**
55
- * Number of distinct programs in the arena — and therefore the number of buckets the
56
- * simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
57
- * @returns {number}
58
- */
59
- get program_count() {
60
- return this.programs.size;
61
- }
62
-
63
- /**
64
- * Append a program, or hand back the placement an identical one already has.
65
- *
66
- * Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
67
- * separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
68
- * they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
69
- * the words is not a cost worth avoiding.
70
- *
71
- * The `program_id` it returns is what the emitter record carries and what the coherence pass
72
- * buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
73
- * emitters running one shared effect would become N buckets, each padded to a whole workgroup,
74
- * which both wastes lanes and splits a run that was already program-coherent.
75
- *
76
- * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
77
- * @returns {{init_offset: number, init_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
78
- */
79
- add(program) {
80
- const key = program_content_key(program);
81
-
82
- const existing = this.programs.get(key);
83
- if (existing !== undefined) {
84
- return existing;
85
- }
86
-
87
- const init_offset = this.instruction_count;
88
- this.#append_instructions(program.init);
89
- const init_count = program.init_instruction_count;
90
-
91
- const update_offset = this.instruction_count;
92
- this.#append_instructions(program.update);
93
- const update_count = program.update_instruction_count;
94
-
95
- const constant_offset = this.constant_word_count;
96
- const constant_u32 = new Uint32Array(program.constants.buffer, program.constants.byteOffset, program.constants.length);
97
- for (let i = 0; i < constant_u32.length; i++) {
98
- this.constant_words.push(constant_u32[i]);
99
- }
100
- this.constant_word_count += program.constant_word_count;
101
-
102
- const placement = {
103
- init_offset, init_count, update_offset, update_count, constant_offset,
104
- program_id: this.programs.size,
105
- };
106
- this.programs.set(key, placement);
107
-
108
- return placement;
109
- }
110
-
111
- /** @param {Uint32Array} words */
112
- #append_instructions(words) {
113
- for (let i = 0; i < words.length; i++) {
114
- this.instruction_words.push(words[i]);
115
- }
116
- this.instruction_count += words.length / PARTICLE_VM_INSTRUCTION_WORDS;
117
- }
118
-
119
- /**
120
- * The packed buffer: `[header][constants][code]`. Word {@link PARTICLE_PROGRAM_CODE_BASE_WORD} of
121
- * the header is the word index the code starts at, which moves every time a program's constants
122
- * are appended — the emitter records never carry it, they carry offsets into each section.
123
- *
124
- * @returns {Uint32Array}
125
- */
126
- build_program_buffer() {
127
- const constants = this.constant_words;
128
- const code = this.instruction_words;
129
-
130
- const code_base = PARTICLE_PROGRAM_HEADER_WORDS + constants.length;
131
- const buffer = new Uint32Array(code_base + code.length);
132
-
133
- buffer[PARTICLE_PROGRAM_CODE_BASE_WORD] = code_base;
134
- buffer.set(constants, PARTICLE_PROGRAM_HEADER_WORDS);
135
- buffer.set(code, code_base);
136
-
137
- return buffer;
138
- }
139
- }
140
-
141
- /**
142
- * A key that is equal exactly when two programs would execute identically.
143
- *
144
- * Constants are keyed by their `u32` bit patterns rather than their float values, so `-0` and `0`
145
- * — which stringify the same but differ in the buffer the shader reads — stay distinct.
146
- *
147
- * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
148
- * @returns {string}
149
- */
150
- function program_content_key(program) {
151
- const constants = program.constants;
152
- const constant_u32 = new Uint32Array(constants.buffer, constants.byteOffset, constants.length);
153
-
154
- return `${program.register_count}|${program.init.join(",")}|${program.update.join(",")}|${constant_u32.join(",")}`;
155
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * The emitter table as the `array<u32>` a shader binds, built on the CPU.
3
- *
4
- * For the WGSL emulator: on a device the rows get there through the database's upload dispatch, and
5
- * the software device records dispatches without running them, so a spec that wants to run
6
- * `shader_particle_emit` (or simulate, or sort, or the bucket histogram) over real emitters has no
7
- * other way to hand it their bytes. See
8
- * {@link ../../buffer/table/gpu_database_emulator_image.js}.
9
- *
10
- * @param {Iterable<import("./Emitter.js").Emitter>} emitters registered emitters — each one's
11
- * {@link Emitter#id} is the row it lands on, so the layout matches what the shaders index
12
- * @returns {Uint32Array}
13
- */
14
- export function emitter_database_image(emitters: Iterable<import("./Emitter.js").Emitter>): Uint32Array;
15
- //# sourceMappingURL=emitter_database_image.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emitter_database_image.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/emitter_database_image.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,iDAJW,SAAS,OAAO,cAAc,EAAE,OAAO,CAAC,GAEtC,WAAW,CAMvB"}
@@ -1,34 +0,0 @@
1
- /**
2
- * @param {number} emitter_index
3
- * @param {number} fraction in [0, 1]
4
- * @returns {number} packed u32
5
- */
6
- export function spawn_request_pack(emitter_index: number, fraction: number): number;
7
- /**
8
- * @param {number} packed
9
- * @returns {number} emitter index
10
- */
11
- export function spawn_request_emitter(packed: number): number;
12
- /**
13
- * @param {number} packed
14
- * @returns {number} batch fraction in [0, 1]
15
- */
16
- export function spawn_request_fraction(packed: number): number;
17
- /**
18
- * Encoding of one spawn request as a single `u32`.
19
- *
20
- * The emit pass needs two things per request: which emitter owns the new particle, and the
21
- * particle's fraction within its emitter's batch this frame (`i / spawn_count`, the SPAWN_FRACTION
22
- * VM builtin — used to spread a batch along spawn curves). Packing both into the one `u32` keeps
23
- * the request stream a single buffer with unchanged upload paths.
24
- *
25
- * Layout: low 16 bits = emitter index, high 16 bits = batch fraction quantized to [0, 0xFFFF].
26
- * The WGSL emit shader mirrors this exactly (shader_particle_emit).
27
- */
28
- /** @type {number} */
29
- export const SPAWN_REQUEST_EMITTER_MASK: number;
30
- /** @type {number} */
31
- export const SPAWN_REQUEST_FRACTION_SHIFT: number;
32
- /** @type {number} */
33
- export const SPAWN_REQUEST_FRACTION_MAX: number;
34
- //# sourceMappingURL=spawn_request_encoding.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spawn_request_encoding.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/spawn_request_encoding.js"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,kDAJW,MAAM,YACN,MAAM,GACJ,MAAM,CASlB;AAED;;;GAGG;AACH,8CAHW,MAAM,GACJ,MAAM,CAIlB;AAED;;;GAGG;AACH,+CAHW,MAAM,GACJ,MAAM,CAIlB;AAjDD;;;;;;;;;;GAUG;AAEH,qBAAqB;AACrB,yCADW,MAAM,CACgC;AAEjD,qBAAqB;AACrB,2CADW,MAAM,CAC8B;AAE/C,qBAAqB;AACrB,yCADW,MAAM,CACgC"}