@woosh/meep-engine 3.16.0 → 3.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/editor/particles/effect/ParticleEffectDocument.d.ts +21 -6
  2. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -1
  3. package/editor/particles/effect/ParticleEffectDocument.js +38 -17
  4. package/editor/view/node-graph/NodeGraphClipboard.d.ts +186 -0
  5. package/editor/view/node-graph/NodeGraphClipboard.d.ts.map +1 -0
  6. package/editor/view/node-graph/NodeGraphClipboard.js +231 -0
  7. package/editor/view/node-graph/NodeGraphEditorView.d.ts +59 -1
  8. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  9. package/editor/view/node-graph/NodeGraphEditorView.js +248 -5
  10. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  11. package/editor/view/node-graph/NodeGraphView.js +84 -8
  12. package/editor/view/node-graph/actions/connection_bind_actions.d.ts +23 -0
  13. package/editor/view/node-graph/actions/connection_bind_actions.d.ts.map +1 -0
  14. package/editor/view/node-graph/actions/connection_bind_actions.js +39 -0
  15. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -1
  16. package/editor/view/particles/effect/ParticleCodeEditorView.js +4 -3
  17. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts +20 -0
  18. package/editor/view/particles/effect/ParticleCurveEditorView.d.ts.map +1 -0
  19. package/editor/view/particles/effect/ParticleCurveEditorView.js +574 -0
  20. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -1
  21. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +27 -1
  22. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts +24 -0
  23. package/editor/view/particles/effect/ParticleGradientEditorView.d.ts.map +1 -0
  24. package/editor/view/particles/effect/ParticleGradientEditorView.js +472 -0
  25. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +5 -0
  26. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -1
  27. package/editor/view/particles/effect/ParticleGraphEditorView.js +61 -31
  28. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -1
  29. package/editor/view/particles/effect/ParticleNodeParametersView.js +33 -0
  30. package/editor/view/particles/effect/particle-editor.css +123 -35
  31. package/package.json +1 -1
  32. package/src/core/binary/allocator/OffsetAllocator.d.ts +25 -16
  33. package/src/core/binary/allocator/OffsetAllocator.d.ts.map +1 -1
  34. package/src/core/binary/allocator/OffsetAllocator.js +10 -1
  35. package/src/core/collection/array/typed/float32_array_hash.d.ts +21 -0
  36. package/src/core/collection/array/typed/float32_array_hash.d.ts.map +1 -0
  37. package/src/core/collection/array/typed/float32_array_hash.js +38 -0
  38. package/src/core/graph/csr/CSRGraph.d.ts +8 -1
  39. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -1
  40. package/src/core/graph/csr/CSRGraph.js +14 -6
  41. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +24 -0
  42. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -1
  43. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +27 -0
  44. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +26 -0
  45. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -1
  46. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +28 -0
  47. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +92 -3
  48. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -1
  49. package/src/core/model/node-graph/visual/layout/RouteGrid.js +405 -242
  50. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +50 -5
  51. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -1
  52. package/src/core/model/node-graph/visual/layout/RouteSearch.js +160 -24
  53. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +7 -0
  54. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -1
  55. package/src/core/model/node-graph/visual/layout/RouteSet.js +8 -0
  56. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +9 -3
  57. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -1
  58. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +7 -0
  59. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +9 -3
  60. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -1
  61. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +17 -3
  62. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +9 -6
  63. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -1
  64. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +49 -7
  65. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +11 -1
  66. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -1
  67. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +135 -16
  68. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +29 -0
  69. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -1
  70. package/src/core/model/node-graph/visual/layout/route_connections.js +716 -309
  71. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +3 -2
  72. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -1
  73. package/src/core/model/node-graph/visual/layout/route_grid_build.js +7 -15
  74. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +6 -0
  75. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -1
  76. package/src/core/model/node-graph/visual/layout/route_nudge.js +42 -13
  77. package/src/engine/animation/AnimationUtils.js +246 -246
  78. package/src/engine/animation/Animations.js +74 -74
  79. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2078 -2078
  80. package/src/engine/ecs/EventType.d.ts +0 -1
  81. package/src/engine/ecs/EventType.js +1 -26
  82. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +1 -1
  83. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -1
  84. package/src/engine/ecs/ik/ik_write_local_rotation.js +3 -7
  85. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  86. package/src/engine/ecs/parent/EntityNode.js +4 -9
  87. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  88. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +360 -364
  89. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts +41 -0
  90. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.d.ts.map +1 -0
  91. package/src/engine/ecs/transform/TRANSFORM64_EVENT_CHANGE.js +40 -0
  92. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +8 -0
  93. package/src/engine/ecs/transform/t64_announce_change.d.ts +10 -7
  94. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -1
  95. package/src/engine/ecs/transform/t64_announce_change.js +12 -12
  96. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts +30 -0
  97. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.d.ts.map +1 -0
  98. package/src/engine/ecs/transform-attachment/TRANSFORM_ATTACHMENT_EVENT_CHANGE.js +29 -0
  99. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  100. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +13 -21
  101. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  102. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +4 -8
  103. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  104. package/src/engine/graphics3/LightSystem.js +4 -8
  105. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  106. package/src/engine/graphics3/MeshSystem.js +9 -19
  107. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  108. package/src/engine/graphics3/ParticleEmitterSystem.js +4 -8
  109. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  110. package/src/engine/graphics3/ShadedGeometrySystem.js +4 -10
  111. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +1 -1
  112. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  113. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +4 -8
  114. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +218 -218
  115. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  116. package/src/engine/physics/ecs/PhysicsSystem.js +2 -5
  117. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  118. package/src/engine/sound/ecs/SoundListenerSystem.js +6 -8
  119. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +0 -4
  120. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  121. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +5 -11
  122. package/src/shade/playground/particle_editor/README.md +43 -2
  123. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -1
  124. package/src/shade/playground/particle_system/particle_prototype.js +4 -5
  125. package/src/shade/playground/particle_system/particle_scene.js +4 -4
  126. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  127. package/src/shade/renderer/Renderer.js +13 -1
  128. package/src/shade/renderer/particles/DESIGN.md +104 -19
  129. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +64 -50
  130. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  131. package/src/shade/renderer/particles/GPUParticleSystem.js +176 -78
  132. package/src/shade/renderer/particles/ParticleConstants.d.ts +59 -23
  133. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  134. package/src/shade/renderer/particles/ParticleConstants.js +66 -23
  135. package/src/shade/renderer/particles/ParticleRenderMode.d.ts +19 -0
  136. package/src/shade/renderer/particles/ParticleRenderMode.d.ts.map +1 -0
  137. package/src/shade/renderer/particles/ParticleRenderMode.js +33 -0
  138. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -1
  139. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +167 -166
  140. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts +37 -0
  141. package/src/shade/renderer/particles/data/particle_emitter_record.d.ts.map +1 -0
  142. package/src/shade/renderer/particles/data/particle_emitter_record.js +109 -0
  143. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +3 -3
  144. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -303
  145. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +18 -0
  146. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  147. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +152 -133
  148. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +0 -11
  149. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  150. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +720 -621
  151. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  152. package/src/shade/renderer/particles/graph/compile_particle_graph.js +8 -3
  153. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -1
  154. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +244 -213
  155. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -1
  156. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +6 -0
  157. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -1
  158. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +294 -319
  159. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -1
  160. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +524 -517
  161. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts +22 -0
  162. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.d.ts.map +1 -0
  163. package/src/shade/renderer/particles/graph/groups/particle_groups_psrdnoise.js +517 -0
  164. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -1
  165. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +185 -159
  166. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -1
  167. package/src/shade/renderer/particles/graph/make_particle_group.js +2 -20
  168. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts +17 -0
  169. package/src/shade/renderer/particles/graph/particle_compare_ops.d.ts.map +1 -0
  170. package/src/shade/renderer/particles/graph/particle_compare_ops.js +22 -0
  171. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +28 -8
  172. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -1
  173. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +49 -25
  174. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +40 -0
  175. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -1
  176. package/src/shade/renderer/particles/graph/particle_node_parameters.js +312 -234
  177. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -1
  178. package/src/shade/renderer/particles/graph/particle_node_presentation.js +59 -3
  179. package/src/shade/renderer/particles/graph/particle_ramp.d.ts +230 -0
  180. package/src/shade/renderer/particles/graph/particle_ramp.d.ts.map +1 -0
  181. package/src/shade/renderer/particles/graph/particle_ramp.js +403 -0
  182. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +7 -1
  183. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -1
  184. package/src/shade/renderer/particles/graph/validate_particle_graph.js +66 -10
  185. package/src/shade/renderer/particles/graph_particles.d.ts +23 -69
  186. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  187. package/src/shade/renderer/particles/graph_particles.js +105 -262
  188. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -1
  189. package/src/shade/renderer/particles/graph_particles_avboit.js +3 -2
  190. package/src/shade/renderer/particles/graph_particles_billboard.d.ts +37 -0
  191. package/src/shade/renderer/particles/graph_particles_billboard.d.ts.map +1 -0
  192. package/src/shade/renderer/particles/graph_particles_billboard.js +93 -0
  193. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +51 -22
  194. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  195. package/src/shade/renderer/particles/isa/InstructionStream.js +98 -38
  196. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +49 -8
  197. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  198. package/src/shade/renderer/particles/isa/ParticleProgram.js +95 -150
  199. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +306 -64
  200. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  201. package/src/shade/renderer/particles/isa/ParticleVMISA.js +505 -136
  202. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +36 -12
  203. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -1
  204. package/src/shade/renderer/particles/isa/particle_assembly.js +354 -139
  205. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts +9 -0
  206. package/src/shade/renderer/particles/isa/validate_particle_program.d.ts.map +1 -0
  207. package/src/shade/renderer/particles/isa/validate_particle_program.js +128 -0
  208. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +23 -0
  209. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  210. package/src/shade/renderer/particles/layout/ParticleLayout.js +68 -0
  211. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts +77 -0
  212. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.d.ts.map +1 -0
  213. package/src/shade/renderer/particles/optimizer/dag/optimize_particle_program_vector.js +219 -0
  214. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts +83 -0
  215. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.d.ts.map +1 -0
  216. package/src/shade/renderer/particles/optimizer/dag/particle_vector_extract.js +283 -0
  217. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts +133 -0
  218. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.d.ts.map +1 -0
  219. package/src/shade/renderer/particles/optimizer/dag/particle_vector_graph.js +334 -0
  220. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts +117 -0
  221. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.d.ts.map +1 -0
  222. package/src/shade/renderer/particles/optimizer/dag/particle_vector_groups.js +70 -0
  223. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts +97 -0
  224. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.d.ts.map +1 -0
  225. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lift.js +462 -0
  226. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts +116 -0
  227. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.d.ts.map +1 -0
  228. package/src/shade/renderer/particles/optimizer/dag/particle_vector_lower.js +687 -0
  229. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts +57 -0
  230. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.d.ts.map +1 -0
  231. package/src/shade/renderer/particles/optimizer/dag/particle_vector_pack.js +860 -0
  232. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts +115 -0
  233. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.d.ts.map +1 -0
  234. package/src/shade/renderer/particles/optimizer/dag/particle_vector_rules.js +264 -0
  235. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +81 -42
  236. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -1
  237. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +477 -478
  238. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts +100 -0
  239. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.d.ts.map +1 -0
  240. package/src/shade/renderer/particles/optimizer/particle_integer_bounds.js +236 -0
  241. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +139 -59
  242. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -1
  243. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +764 -647
  244. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +40 -7
  245. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -1
  246. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +376 -213
  247. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +30 -3
  248. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -1
  249. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +337 -223
  250. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +24 -38
  251. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -1
  252. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +166 -206
  253. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts +99 -0
  254. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.d.ts.map +1 -0
  255. package/src/shade/renderer/particles/optimizer/pass_allocate_registers.js +313 -0
  256. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +3 -2
  257. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -1
  258. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +198 -197
  259. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -1
  260. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +19 -0
  261. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -1
  262. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +678 -561
  263. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts +22 -0
  264. package/src/shade/renderer/particles/optimizer/pass_inline_constants.d.ts.map +1 -0
  265. package/src/shade/renderer/particles/optimizer/pass_inline_constants.js +221 -0
  266. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -1
  267. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +63 -72
  268. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -1
  269. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +87 -86
  270. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -1
  271. package/src/shade/renderer/particles/optimizer/pass_peephole.js +392 -271
  272. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -1
  273. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +361 -268
  274. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts +4 -0
  275. package/src/shade/renderer/particles/optimizer/pass_schedule.d.ts.map +1 -0
  276. package/src/shade/renderer/particles/optimizer/pass_schedule.js +244 -0
  277. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -1
  278. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +154 -151
  279. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +20 -0
  280. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -1
  281. package/src/shade/renderer/particles/particle_test_fixtures.js +229 -203
  282. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +99 -25
  283. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  284. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +438 -286
  285. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts +109 -0
  286. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.d.ts.map +1 -0
  287. package/src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js +127 -0
  288. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +87 -102
  289. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -1
  290. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +184 -163
  291. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +26 -0
  292. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  293. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts +130 -0
  294. package/src/shade/renderer/particles/runtime/ProgramHeap.d.ts.map +1 -0
  295. package/src/shade/renderer/particles/runtime/ProgramHeap.js +595 -0
  296. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts +91 -0
  297. package/src/shade/renderer/particles/runtime/ProgramPlacement.d.ts.map +1 -0
  298. package/src/shade/renderer/particles/runtime/ProgramPlacement.js +106 -0
  299. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +5 -2
  300. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  301. package/src/shade/renderer/particles/runtime/create_particle_effect.js +22 -19
  302. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts +28 -0
  303. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.d.ts.map +1 -0
  304. package/src/shade/renderer/particles/shaders/chunk_particle_emit_step.js +136 -0
  305. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts +35 -0
  306. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.d.ts.map +1 -0
  307. package/src/shade/renderer/particles/shaders/chunk_particle_simulate_step.js +133 -0
  308. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -9
  309. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  310. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +20 -80
  311. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts +33 -0
  312. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.d.ts.map +1 -0
  313. package/src/shade/renderer/particles/shaders/shader_particle_emit_wide.js +114 -0
  314. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +8 -0
  315. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  316. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +33 -101
  317. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts +45 -0
  318. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.d.ts.map +1 -0
  319. package/src/shade/renderer/particles/shaders/shader_particle_simulate_wide.js +123 -0
  320. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts +51 -0
  321. package/src/shade/renderer/particles/sort/graph_particle_sort.d.ts.map +1 -0
  322. package/src/shade/renderer/particles/sort/graph_particle_sort.js +120 -0
  323. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts +6 -0
  324. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.d.ts.map +1 -0
  325. package/src/shade/renderer/particles/vm/PARTICLE_VM_CONTEXT_STRUCT.js +16 -0
  326. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +4 -1
  327. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  328. package/src/shade/renderer/particles/vm/ParticleVMReference.js +261 -140
  329. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  330. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +217 -255
  331. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts +43 -0
  332. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.d.ts.map +1 -0
  333. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_fast.js +55 -0
  334. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts +62 -0
  335. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.d.ts.map +1 -0
  336. package/src/shade/renderer/particles/vm/chunk_particle_vm_registers_wide.js +86 -0
  337. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts +22 -0
  338. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.d.ts.map +1 -0
  339. package/src/shade/renderer/shader/chunk/math/chunk_mod_v3f.js +32 -0
  340. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts +9 -0
  341. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.d.ts.map +1 -0
  342. package/src/shade/renderer/shader/chunk/math/chunk_mod_v4f.js +19 -0
  343. package/src/shade/renderer/shader/chunk/noise/psrdnoise/README.md +65 -0
  344. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts +24 -0
  345. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.d.ts.map +1 -0
  346. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2.js +83 -0
  347. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts +25 -0
  348. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.d.ts.map +1 -0
  349. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_hash.js +42 -0
  350. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts +31 -0
  351. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.d.ts.map +1 -0
  352. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise2_kernel.js +80 -0
  353. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts +26 -0
  354. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.d.ts.map +1 -0
  355. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3.js +109 -0
  356. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts +38 -0
  357. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.d.ts.map +1 -0
  358. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_kernel.js +129 -0
  359. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts +21 -0
  360. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.d.ts.map +1 -0
  361. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_permute.js +35 -0
  362. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts +19 -0
  363. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.d.ts.map +1 -0
  364. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_skew.js +28 -0
  365. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts +13 -0
  366. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.d.ts.map +1 -0
  367. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_psrdnoise3_unskew.js +22 -0
  368. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts +22 -0
  369. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.d.ts.map +1 -0
  370. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise2.js +59 -0
  371. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts +23 -0
  372. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.d.ts.map +1 -0
  373. package/src/shade/renderer/shader/chunk/noise/psrdnoise/chunk_srdnoise3.js +74 -0
  374. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts +34 -1
  375. package/src/shade/wgsl/emulator/ComputeShaderEmulator.d.ts.map +1 -1
  376. package/src/shade/wgsl/emulator/ComputeShaderEmulator.js +41 -1
  377. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts +3 -2
  378. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  379. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +49 -10
  380. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  381. package/src/view/minimap/dom/MinimapCameraView.js +4 -9
  382. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts +0 -15
  383. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.d.ts.map +0 -1
  384. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts +0 -45
  385. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.d.ts.map +0 -1
  386. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts +0 -24
  387. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.d.ts.map +0 -1
  388. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts +0 -19
  389. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.d.ts.map +0 -1
  390. package/src/engine/ecs/transform/__probe.d.ts +0 -4
  391. package/src/engine/ecs/transform/__probe.d.ts.map +0 -1
  392. package/src/engine/ecs/util/hideEntityGracefully.d.ts +0 -9
  393. package/src/engine/ecs/util/hideEntityGracefully.d.ts.map +0 -1
  394. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +0 -27
  395. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +0 -1
  396. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts +0 -14
  397. package/src/shade/renderer/particles/cull/chunk_particle_cull.d.ts.map +0 -1
  398. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +0 -156
  399. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +0 -1
  400. package/src/shade/renderer/particles/runtime/Emitter.d.ts +0 -219
  401. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +0 -1
  402. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +0 -77
  403. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +0 -1
  404. package/src/shade/renderer/particles/runtime/ProgramArena.js +0 -155
  405. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +0 -15
  406. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +0 -1
  407. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts +0 -34
  408. package/src/shade/renderer/particles/runtime/spawn_request_encoding.d.ts.map +0 -1
  409. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +0 -32
  410. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +0 -1
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Everything the GPU side knows about one {@link ./ParticleEmitter.js} that the emitter itself has
3
+ * no business knowing.
4
+ *
5
+ * An emitter is a scene node and a description of an effect: what to run, how fast, how big, which
6
+ * attribute is the colour. None of that depends on a device. The rest — which row of the emitter
7
+ * table it was given, which tenancy of that row it is, where its program was placed in the program
8
+ * heap, which `transforms` row its node ended up in, where its texture was packed into the atlas —
9
+ * is the particle system's bookkeeping, true only while the emitter is registered and only for the
10
+ * registry that registered it. Kept on the emitter it would travel with a saved effect, mean
11
+ * nothing when loaded, and be there for an author to set to a number the table has never heard of.
12
+ *
13
+ * So it lives here, in an object the registry owns and hands out ({@link ./EmitterRegistry.js#context}),
14
+ * and an emitter that no registry holds simply has none. That is also what makes "is this emitter
15
+ * live?" a question with one answer — the presence of a context — rather than a `row` of `-1` that
16
+ * anything could have written.
17
+ *
18
+ * Fields are set by the registry. Reading them is what a caller wants (the spawn ring addresses an
19
+ * emitter by row, a spec reads the generation a particle header should carry); writing them outside
20
+ * of {@link ./EmitterRegistry.js} desynchronises the context from the table it describes.
21
+ */
22
+ export class GPUParticleEmitterContext {
23
+ /**
24
+ * Row this emitter occupies in the emitter table. Stable for as long as the emitter is
25
+ * registered — it is what every live particle's record header stores, so it cannot be
26
+ * renumbered while particles are in flight.
27
+ *
28
+ * Not to be confused with {@link ./ParticleEmitter.js Node3D#id}, which is the node's own
29
+ * identity and the key the scene context maps to a `transforms` row.
30
+ *
31
+ * @type {number}
32
+ */
33
+ row: number;
34
+ /**
35
+ * Which tenancy of {@link row} this is. Distinct from every other the registry has ever handed
36
+ * out, and never zero. Stamped into every particle the emitter spawns, and what lets the
37
+ * simulate pass tell those particles from a later tenant's.
38
+ *
39
+ * @type {number}
40
+ */
41
+ generation: number;
42
+ /**
43
+ * Row of the scene database's `transforms` table the emitter's node occupies, as the scene
44
+ * context reported it — what the record's `node` field carries. `0` (the scene root) until
45
+ * bound, so an emitter registered before its node is placed still reads a valid row.
46
+ *
47
+ * @type {number}
48
+ */
49
+ transform_row: number;
50
+ /**
51
+ * Where this emitter's program sits in the shared {@link ./ProgramHeap.js}, and the program id
52
+ * the simulation-order bucketing keys on. Emitters compiled from the same graph hold the same
53
+ * object — which is also why it is held rather than copied out: the heap rewrites its offsets in
54
+ * place when it moves the program.
55
+ *
56
+ * @type {import("./ProgramPlacement.js").ProgramPlacement|null}
57
+ */
58
+ placement: import("./ProgramPlacement.js").ProgramPlacement | null;
59
+ /**
60
+ * Where {@link ./ParticleEmitter.js#texture} landed in the particle system's atlas: uv offset
61
+ * `.xy`, uv scale `.zw`. Mirrors meep's `AtlasPatch`.
62
+ *
63
+ * Resolved, never authored. The emitter names an image; which sheet it is packed into and where
64
+ * is the system's answer, and it changes without the emitter changing — a repack moves every
65
+ * patch. `[0, 0, 1, 1]` is the whole sheet, which is what an emitter with no texture of its own
66
+ * gets: the default atlas is a single white texel.
67
+ *
68
+ * @type {Float32Array}
69
+ */
70
+ atlas_region: Float32Array;
71
+ /**
72
+ * The emitter's {@link ../../scene/Node3D.js Node3D#version} as of the last time its row was
73
+ * staged, or `-1` for a row that must be restaged whatever the emitter says.
74
+ *
75
+ * This is the whole of the dirty tracking: {@link ./EmitterRegistry.js#flush} restages an
76
+ * emitter whose version has moved since. A node already counts its own changes for the
77
+ * renderer, and a second flag on the emitter saying the same thing would be one more thing to
78
+ * forget to set — so the emitter carries none, and an author who changes a field marks it the
79
+ * way they mark any node change, with `needsUpdate = true`.
80
+ *
81
+ * The version is the node's, so it also moves when the node merely moves, and the row is
82
+ * restaged for a change it does not hold. That costs one row: an emitter that moved is an
83
+ * emitter whose `transforms` row the scene context is uploading this frame anyway.
84
+ *
85
+ * A version of `-1` is unreachable for a node — the counter starts at 0 and only rises — so it
86
+ * is safe as the "not staged" sentinel, and it is what the fields above are set back to when
87
+ * one of *them* changes, since those move without the emitter moving.
88
+ *
89
+ * @type {number}
90
+ */
91
+ staged_version: number;
92
+ /**
93
+ * @param {import("./ParticleEmitter.js").ParticleEmitter} emitter the emitter this describes
94
+ * @returns {boolean} whether the table row is out of step with `emitter`
95
+ */
96
+ is_stale(emitter: import("./ParticleEmitter.js").ParticleEmitter): boolean;
97
+ /**
98
+ * Mark the row as needing to be restaged on the next flush, for a change the emitter's version
99
+ * does not record — one of this context's own fields.
100
+ */
101
+ invalidate(): void;
102
+ /**
103
+ * Record that the table row now holds `emitter` as it currently is.
104
+ *
105
+ * @param {import("./ParticleEmitter.js").ParticleEmitter} emitter
106
+ */
107
+ staged(emitter: import("./ParticleEmitter.js").ParticleEmitter): void;
108
+ }
109
+ //# sourceMappingURL=GPUParticleEmitterContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GPUParticleEmitterContext.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/GPUParticleEmitterContext.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAEI;;;;;;;;;OASG;IACH,KAFU,MAAM,CAEP;IAET;;;;;;OAMG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;OAMG;IACH,eAFU,MAAM,CAEE;IAElB;;;;;;;OAOG;IACH,WAFU,OAAO,uBAAuB,EAAE,gBAAgB,GAAC,IAAI,CAE9C;IAEjB;;;;;;;;;;OAUG;IACH,cAFU,YAAY,CAEwB;IAE9C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,gBAFU,MAAM,CAEI;IAEpB;;;OAGG;IACH,kBAHW,OAAO,sBAAsB,EAAE,eAAe,GAC5C,OAAO,CAInB;IAED;;;OAGG;IACH,mBAEC;IAED;;;;OAIG;IACH,gBAFW,OAAO,sBAAsB,EAAE,eAAe,QAMxD;CACJ"}
@@ -0,0 +1,127 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * Everything the GPU side knows about one {@link ./ParticleEmitter.js} that the emitter itself has
5
+ * no business knowing.
6
+ *
7
+ * An emitter is a scene node and a description of an effect: what to run, how fast, how big, which
8
+ * attribute is the colour. None of that depends on a device. The rest — which row of the emitter
9
+ * table it was given, which tenancy of that row it is, where its program was placed in the program
10
+ * heap, which `transforms` row its node ended up in, where its texture was packed into the atlas —
11
+ * is the particle system's bookkeeping, true only while the emitter is registered and only for the
12
+ * registry that registered it. Kept on the emitter it would travel with a saved effect, mean
13
+ * nothing when loaded, and be there for an author to set to a number the table has never heard of.
14
+ *
15
+ * So it lives here, in an object the registry owns and hands out ({@link ./EmitterRegistry.js#context}),
16
+ * and an emitter that no registry holds simply has none. That is also what makes "is this emitter
17
+ * live?" a question with one answer — the presence of a context — rather than a `row` of `-1` that
18
+ * anything could have written.
19
+ *
20
+ * Fields are set by the registry. Reading them is what a caller wants (the spawn ring addresses an
21
+ * emitter by row, a spec reads the generation a particle header should carry); writing them outside
22
+ * of {@link ./EmitterRegistry.js} desynchronises the context from the table it describes.
23
+ */
24
+ export class GPUParticleEmitterContext {
25
+
26
+ /**
27
+ * Row this emitter occupies in the emitter table. Stable for as long as the emitter is
28
+ * registered — it is what every live particle's record header stores, so it cannot be
29
+ * renumbered while particles are in flight.
30
+ *
31
+ * Not to be confused with {@link ./ParticleEmitter.js Node3D#id}, which is the node's own
32
+ * identity and the key the scene context maps to a `transforms` row.
33
+ *
34
+ * @type {number}
35
+ */
36
+ row = -1;
37
+
38
+ /**
39
+ * Which tenancy of {@link row} this is. Distinct from every other the registry has ever handed
40
+ * out, and never zero. Stamped into every particle the emitter spawns, and what lets the
41
+ * simulate pass tell those particles from a later tenant's.
42
+ *
43
+ * @type {number}
44
+ */
45
+ generation = 0;
46
+
47
+ /**
48
+ * Row of the scene database's `transforms` table the emitter's node occupies, as the scene
49
+ * context reported it — what the record's `node` field carries. `0` (the scene root) until
50
+ * bound, so an emitter registered before its node is placed still reads a valid row.
51
+ *
52
+ * @type {number}
53
+ */
54
+ transform_row = 0;
55
+
56
+ /**
57
+ * Where this emitter's program sits in the shared {@link ./ProgramHeap.js}, and the program id
58
+ * the simulation-order bucketing keys on. Emitters compiled from the same graph hold the same
59
+ * object — which is also why it is held rather than copied out: the heap rewrites its offsets in
60
+ * place when it moves the program.
61
+ *
62
+ * @type {import("./ProgramPlacement.js").ProgramPlacement|null}
63
+ */
64
+ placement = null;
65
+
66
+ /**
67
+ * Where {@link ./ParticleEmitter.js#texture} landed in the particle system's atlas: uv offset
68
+ * `.xy`, uv scale `.zw`. Mirrors meep's `AtlasPatch`.
69
+ *
70
+ * Resolved, never authored. The emitter names an image; which sheet it is packed into and where
71
+ * is the system's answer, and it changes without the emitter changing — a repack moves every
72
+ * patch. `[0, 0, 1, 1]` is the whole sheet, which is what an emitter with no texture of its own
73
+ * gets: the default atlas is a single white texel.
74
+ *
75
+ * @type {Float32Array}
76
+ */
77
+ atlas_region = new Float32Array([0, 0, 1, 1]);
78
+
79
+ /**
80
+ * The emitter's {@link ../../scene/Node3D.js Node3D#version} as of the last time its row was
81
+ * staged, or `-1` for a row that must be restaged whatever the emitter says.
82
+ *
83
+ * This is the whole of the dirty tracking: {@link ./EmitterRegistry.js#flush} restages an
84
+ * emitter whose version has moved since. A node already counts its own changes for the
85
+ * renderer, and a second flag on the emitter saying the same thing would be one more thing to
86
+ * forget to set — so the emitter carries none, and an author who changes a field marks it the
87
+ * way they mark any node change, with `needsUpdate = true`.
88
+ *
89
+ * The version is the node's, so it also moves when the node merely moves, and the row is
90
+ * restaged for a change it does not hold. That costs one row: an emitter that moved is an
91
+ * emitter whose `transforms` row the scene context is uploading this frame anyway.
92
+ *
93
+ * A version of `-1` is unreachable for a node — the counter starts at 0 and only rises — so it
94
+ * is safe as the "not staged" sentinel, and it is what the fields above are set back to when
95
+ * one of *them* changes, since those move without the emitter moving.
96
+ *
97
+ * @type {number}
98
+ */
99
+ staged_version = -1;
100
+
101
+ /**
102
+ * @param {import("./ParticleEmitter.js").ParticleEmitter} emitter the emitter this describes
103
+ * @returns {boolean} whether the table row is out of step with `emitter`
104
+ */
105
+ is_stale(emitter) {
106
+ return this.staged_version !== emitter.version;
107
+ }
108
+
109
+ /**
110
+ * Mark the row as needing to be restaged on the next flush, for a change the emitter's version
111
+ * does not record — one of this context's own fields.
112
+ */
113
+ invalidate() {
114
+ this.staged_version = -1;
115
+ }
116
+
117
+ /**
118
+ * Record that the table row now holds `emitter` as it currently is.
119
+ *
120
+ * @param {import("./ParticleEmitter.js").ParticleEmitter} emitter
121
+ */
122
+ staged(emitter) {
123
+ assert.defined(emitter, 'emitter');
124
+
125
+ this.staged_version = emitter.version;
126
+ }
127
+ }
@@ -1,10 +1,3 @@
1
- /**
2
- * An empty staging record with every field of {@link ../data/PARTICLE_EMITTER_STRUCT.js} present,
3
- * typed arrays for the vector fields so {@link ParticleEmitter#write_record} can copy into them.
4
- *
5
- * @returns {object}
6
- */
7
- export function create_emitter_record(): object;
8
1
  /**
9
2
  * Render channels an emitter can bind to one of its effect's per-particle attributes. The names
10
3
  * match the `render_*` fields of {@link ../data/PARTICLE_EMITTER_STRUCT.js}.
@@ -38,47 +31,55 @@ export const EMITTER_RENDER_CHANNEL_COMPONENTS: {
38
31
  * particles, within a frame, because the emitter's table row is retired with it and its particles
39
32
  * carry that row's generation. There is no transform of its own to keep in step with anything.
40
33
  *
41
- * The rest is the CPU model of one row of the emitter table
42
- * ({@link ../data/PARTICLE_EMITTER_STRUCT.js}): the compiled effect and its placement in the
43
- * program arena, spawn rate, blend / projection / feature flags, bounds sphere, render-attribute
44
- * bindings, atlas region and flipbook grid. {@link write_record} is the whole of the translation
45
- * between the two. Fields are plain data with no setters — after changing any of them, set
46
- * {@link dirty} so {@link ./EmitterRegistry.js} restages the row on its next flush. A flag rather
47
- * than a setter per field because a row is restaged whole either way: one changed field and ten
48
- * cost the same upload.
34
+ * The rest is a description of an effect and nothing else: the attribute {@link layout} and the
35
+ * compiled {@link program}, the {@link texture} to draw with, spawn rate, blend / projection /
36
+ * feature flags, bounds sphere, render-attribute bindings and flipbook grid. Every one of those is
37
+ * the author's, means the same thing with no device present, and is what a saved effect is made of.
49
38
  *
50
- * What is NOT here is anything the GPU integrates per frame — spawn accumulator, age, sleep. That
51
- * is {@link ../data/PARTICLE_EMITTER_STATE.js}, and it stays on the GPU.
39
+ * **Nothing here is the GPU's.** Which table row the emitter was given, which tenancy of it, where
40
+ * its program was placed in the program heap, which `transforms` row its node ended up in, where
41
+ * its texture was packed into the atlas — all of that is
42
+ * {@link ./GPUParticleEmitterContext.js GPUParticleEmitterContext}, held by the
43
+ * {@link ./EmitterRegistry.js} that registered the emitter and reachable through
44
+ * {@link ./EmitterRegistry.js#context}. An emitter no registry holds has none, which is also how
45
+ * "is this emitter live?" is asked. Nor is anything the GPU integrates per frame here — spawn
46
+ * accumulator, age, sleep are {@link ../data/PARTICLE_EMITTER_STATE.js}, and they stay on the GPU.
52
47
  *
53
- * Instances become live through a {@link ./EmitterRegistry.js}, which assigns {@link row} and
54
- * {@link generation} and resolves the program placement. Constructing one directly gives you an
55
- * emitter no table knows about.
48
+ * Fields are plain data with no setters. After changing any of them, set `needsUpdate = true` — the
49
+ * node's own change counter, the same one the renderer reads to decide whether a transform needs
50
+ * re-uploading — and {@link ./EmitterRegistry.js#flush} restages the row on its next flush. One
51
+ * counter rather than a setter per field because a row is restaged whole either way: one changed
52
+ * field and ten cost the same upload.
56
53
  */
57
54
  export class ParticleEmitter extends Node3D {
58
55
  /**
59
- * Build an emitter from a plain description. Every parameter is optional except the effect —
60
- * an emitter with no program has nothing to run.
56
+ * Build an emitter from a plain description. Every parameter is optional except the compiled
57
+ * effect — an emitter with no program has nothing to run.
58
+ *
59
+ * `layout` and `program` are the two halves of what {@link ./create_particle_effect.js} returns,
60
+ * so an effect goes in by spreading it: `ParticleEmitter.from({ ...effect, spawn_rate: 100 })`.
61
61
  *
62
62
  * @param {object} config
63
- * @param {{layout: object, program: object}} config.effect compiled effect, see
64
- * {@link ./create_particle_effect.js}
63
+ * @param {import("../layout/ParticleLayout.js").ParticleLayout} config.layout per-particle
64
+ * attribute schema
65
+ * @param {import("../isa/ParticleProgram.js").ParticleProgram} config.program compiled INIT /
66
+ * UPDATE bytecode
65
67
  * @param {ArrayLike<number>} [config.position] local translation, `[x, y, z]`
68
+ * @param {string|null} [config.texture] image URL to draw with
66
69
  * @param {number} [config.seed]
67
70
  * @param {number} [config.spawn_rate] particles/second
68
71
  * @param {object} [config.flags] passed to {@link make_emitter_flags}
69
72
  * @param {{center?: ArrayLike<number>, radius?: number}} [config.bounds]
70
73
  * @param {Object<string,string>} [config.render] render channel -> attribute name
71
- * @param {ArrayLike<number>} [config.atlas_region] [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
72
74
  * @param {ArrayLike<number>} [config.flipbook] [cols, rows]
73
75
  * @param {string} [config.name]
74
76
  * @returns {ParticleEmitter}
75
77
  */
76
78
  static from(config: {
77
- effect: {
78
- layout: object;
79
- program: object;
80
- };
79
+ layout: import("../layout/ParticleLayout.js").ParticleLayout;
80
+ program: import("../isa/ParticleProgram.js").ParticleProgram;
81
81
  position?: ArrayLike<number>;
82
+ texture?: string | null;
82
83
  seed?: number;
83
84
  spawn_rate?: number;
84
85
  flags?: object;
@@ -89,67 +90,41 @@ export class ParticleEmitter extends Node3D {
89
90
  render?: {
90
91
  [x: string]: string;
91
92
  };
92
- atlas_region?: ArrayLike<number>;
93
93
  flipbook?: ArrayLike<number>;
94
94
  name?: string;
95
95
  }): ParticleEmitter;
96
96
  /**
97
- * Row this emitter occupies in the emitter table. Stable for the emitter's whole life — it is
98
- * what every live particle's record header stores, so it cannot be renumbered while particles
99
- * are in flight. `-1` until the registry assigns one.
97
+ * The per-particle attribute schema: which named attributes a particle of this emitter has, how
98
+ * wide each is, and what word of the record it sits at.
100
99
  *
101
- * Not to be confused with {@link Node3D#id}, which is the node's own identity and the key the
102
- * scene context maps to a `transforms` row.
103
- *
104
- * @type {number}
100
+ * @type {import("../layout/ParticleLayout.js").ParticleLayout}
105
101
  */
106
- row: number;
102
+ layout: import("../layout/ParticleLayout.js").ParticleLayout;
107
103
  /**
108
- * Which tenancy of {@link row} this emitter is. Assigned by the registry, distinct from every
109
- * other emitter it has ever assigned, never zero. Stamped into every particle the emitter
110
- * spawns, and what lets the simulate pass tell those particles from a later tenant's.
104
+ * The compiled INIT/UPDATE bytecode run for every particle of this emitter.
111
105
  *
112
- * @type {number}
106
+ * @type {import("../isa/ParticleProgram.js").ParticleProgram}
113
107
  */
114
- generation: number;
108
+ program: import("../isa/ParticleProgram.js").ParticleProgram;
115
109
  /**
116
- * Row of the scene database's `transforms` table this node occupies, as the scene context
117
- * reported it — what the record's `node` field carries. `0` (the scene root) until bound, so
118
- * an emitter that is registered before its node is placed still reads a valid row.
110
+ * Image to draw the particles with, by URL, or `null` to draw against the default atlas — a
111
+ * single white texel, so an untextured emitter is a flat quad of its colour.
119
112
  *
120
- * @type {number}
121
- */
122
- transform_row: number;
123
- /**
124
- * Compiled effect: the per-particle attribute layout plus the INIT/UPDATE bytecode.
113
+ * A URL rather than a texture, and no uv rect: the particle system packs every emitter's image
114
+ * into one sheet so that a hundred effects sharing a puff of smoke pay for one image, and where
115
+ * a given image lands in that sheet is the system's answer, not the author's — it changes on
116
+ * every repack, without the emitter changing. The resolved patch is
117
+ * {@link ./GPUParticleEmitterContext.js#atlas_region}.
125
118
  *
126
- * @type {{layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram}}
119
+ * @type {string|null}
127
120
  */
128
- effect: {
129
- layout: import("../layout/ParticleLayout.js").ParticleLayout;
130
- program: import("../isa/ParticleProgram.js").ParticleProgram;
131
- };
132
- /**
133
- * Where this emitter's program sits in the shared arena, and the dense program id the
134
- * simulation-order bucketing keys on. Assigned by {@link EmitterRegistry#add} from
135
- * {@link ../runtime/ProgramArena.js}; emitters compiled from the same graph share one.
136
- *
137
- * @type {{init_offset: number, init_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
138
- */
139
- placement: {
140
- init_offset: number;
141
- init_count: number;
142
- update_offset: number;
143
- update_count: number;
144
- constant_offset: number;
145
- program_id: number;
146
- };
121
+ texture: string | null;
147
122
  /**
148
123
  * Base RNG seed.
149
124
  *
150
- * Two emitters running one program produce identical particles from identical seeds, so leaving
151
- * this at 0 is almost never what an author wants — {@link EmitterRegistry#add} reads 0 as
152
- * "unset" and derives one from the generation instead.
125
+ * Two emitters running one program produce identical particles from identical seeds. `0` reads
126
+ * as "unset", and the row written for such an emitter takes its registration's generation
127
+ * instead, which no other emitter of that registry shares.
153
128
  *
154
129
  * @type {number}
155
130
  */
@@ -186,12 +161,8 @@ export class ParticleEmitter extends Node3D {
186
161
  */
187
162
  bounds_radius: number;
188
163
  /**
189
- * Atlas sub-rect: uv offset `.xy`, uv scale `.zw`. Mirrors meep's `AtlasPatch`.
190
- * @type {Float32Array}
191
- */
192
- atlas_region: Float32Array;
193
- /**
194
- * Flipbook grid: columns, rows. `[1, 1]` is a single frame.
164
+ * Flipbook grid: columns, rows, over whatever region {@link texture} was packed into. `[1, 1]`
165
+ * is a single frame.
195
166
  * @type {Float32Array}
196
167
  */
197
168
  flipbook: Float32Array;
@@ -207,13 +178,6 @@ export class ParticleEmitter extends Node3D {
207
178
  render_frame: number;
208
179
  /** @type {number} record word offset of velocity, read by the STRETCHED projection */
209
180
  render_velocity: number;
210
- /**
211
- * Whether the table row is out of step with the fields above. Set it after changing anything;
212
- * {@link EmitterRegistry#flush} clears it once the row has been staged for upload.
213
- *
214
- * @type {boolean}
215
- */
216
- dirty: boolean;
217
181
  get type(): string;
218
182
  /**
219
183
  * Bind render channels to per-particle attributes of this emitter's effect, by attribute name.
@@ -232,28 +196,49 @@ export class ParticleEmitter extends Node3D {
232
196
  [x: string]: string;
233
197
  }): void;
234
198
  /**
235
- * Fill `record` with this emitter as the value the emitter table stores — every field of
236
- * {@link ../data/PARTICLE_EMITTER_STRUCT.js}, none omitted.
199
+ * Structural equality over everything an emitter *is*: where it sits, what it runs, what it
200
+ * draws with, and how it is bound to the renderer. Two emitters that compare equal describe one
201
+ * effect in one place, and one row would serve both.
237
202
  *
238
- * Omitting one would not write zeros: the serializer skips absent fields, and table pages are
239
- * recycled buffers, so a skipped field keeps whatever the previous tenant of the slot left
240
- * there.
203
+ * The node's identity is not part of it — `id`, parent and children say where an emitter is in
204
+ * a scene, not what it is — and neither is anything the GPU assigned it, which is not here to
205
+ * be compared. {@link transform_global} is left out too, being derived from
206
+ * {@link transform_local} and the parent chain.
241
207
  *
242
- * Writes into a caller-supplied object rather than returning a fresh one so the registry can
243
- * stage every row of a frame through one module-static record — the table serializes it
244
- * synchronously, so nothing outlives the call.
208
+ * @param {ParticleEmitter} other
209
+ * @returns {boolean}
210
+ */
211
+ equals(other: ParticleEmitter): boolean;
212
+ /**
213
+ * Hash over everything {@link equals} compares, in the same terms — the compiled program hashes
214
+ * by its own bytecode rather than by object identity, so two emitters separately compiled from
215
+ * one graph hash equally, as they compare equally.
216
+ *
217
+ * @returns {number} int32
218
+ */
219
+ hash(): number;
220
+ /**
221
+ * Make this emitter a copy of `other`: same effect, same settings, same placement.
222
+ *
223
+ * The layout and the compiled program are shared rather than duplicated — both are immutable
224
+ * once compiled, and sharing them is what puts two emitters of one effect on one program id in
225
+ * the program heap, hence in one simulation bucket.
245
226
  *
246
- * @param {object} record the staging object, see {@link create_emitter_record}
247
- * @returns {object} `record`
227
+ * What is not copied is the node's identity and its place in a scene ({@link Node3D#id},
228
+ * parent, children), and anything a registry gave the original: a copy is a second emitter, not
229
+ * a second reference to the first one's table row.
230
+ *
231
+ * @param {ParticleEmitter} other
248
232
  */
249
- write_record(record: object): object;
233
+ copy(other: ParticleEmitter): void;
250
234
  /**
251
- * This emitter as a fresh record object. {@link write_record} into a shared one is what the
252
- * per-frame path uses; this is for tests and one-off inspection.
235
+ * A second emitter equal to this one, and registered with nothing. Its subtree is cloned the
236
+ * way {@link Node3D#clone} clones one — overridden only because the base builds a plain
237
+ * `Node3D`, which would keep the transform and drop the effect.
253
238
  *
254
- * @returns {object}
239
+ * @returns {ParticleEmitter}
255
240
  */
256
- to_record(): object;
241
+ clone(): ParticleEmitter;
257
242
  /**
258
243
  * @readonly
259
244
  * @type {boolean}
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleEmitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ParticleEmitter.js"],"names":[],"mappings":"AAiXA;;;;;GAKG;AACH,yCAFa,MAAM,CA8BlB;AA/YD;;;;;GAKG;AACH,sCAFU,MAAM,EAAE,CAIf;AAEH;;;;;;;;;;;;GAYG;AACH;QAFiB,MAAM,GAAE,MAAM;EAS5B;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH;IAqOI;;;;;;;;;;;;;;;;;OAiBG;IACH;QAbqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QAEN,QAAQ,GAAnC,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,eAAe,CAqD3B;IAxSD;;;;;;;;;OASG;IACH,KAFU,MAAM,CAEP;IAET;;;;;;OAMG;IACH,YAFU,MAAM,CAED;IAEf;;;;;;OAMG;IACH,eAFU,MAAM,CAEE;IAElB;;;;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,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAEnI;IAEV;;;;;;;;OAQG;IACH,MAFU,MAAM,CAEP;IAET;;;;OAIG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;;;;OAcG;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;;;;;OAKG;IACH,OAFU,OAAO,CAEJ;IAEb,mBAEC;IAED;;;;;;;;;;;;OAYG;IACH;YAHkB,MAAM,GAAC,MAAM;aA2B9B;IAED;;;;;;;;;;;;;;OAcG;IACH,qBAHW,MAAM,GACJ,MAAM,CAkClB;IAED;;;;;OAKG;IACH,aAFa,MAAM,CAIlB;IA0EL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;CAN1C;uBAxWsB,uBAAuB"}
1
+ {"version":3,"file":"ParticleEmitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ParticleEmitter.js"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,sCAFU,MAAM,EAAE,CAIf;AAEH;;;;;;;;;;;;GAYG;AACH;QAFiB,MAAM,GAAE,MAAM;EAS5B;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH;IA+QI;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH;QAfwE,MAAM,EAAnE,OAAO,6BAA6B,EAAE,cAAc;QAEQ,OAAO,EAAnE,OAAO,2BAA2B,EAAE,eAAe;QAExB,QAAQ,GAAnC,UAAU,MAAM,CAAC;QACI,OAAO,GAA5B,MAAM,GAAC,IAAI;QACK,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,QAAQ,GAAnC,UAAU,MAAM,CAAC;QACD,IAAI,GAApB,MAAM;QACJ,eAAe,CAqD3B;IAvVD;;;;;OAKG;IACH,QAFU,OAAO,6BAA6B,EAAE,cAAc,CAEvD;IAEP;;;;OAIG;IACH,SAFU,OAAO,2BAA2B,EAAE,eAAe,CAErD;IAER;;;;;;;;;;;OAWG;IACH,SAFU,MAAM,GAAC,IAAI,CAEN;IAEf;;;;;;;;OAQG;IACH,MAFU,MAAM,CAEP;IAET;;;;OAIG;IACH,YAFU,MAAM,CAED;IAEf;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;;;;;OAcG;IACH,eAFU,YAAY,CAEc;IAEpC;;OAEG;IACH,eAFU,MAAM,CAEE;IAElB;;;;OAIG;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,mBAEC;IAED;;;;;;;;;;;;OAYG;IACH;YAHkB,MAAM,GAAC,MAAM;aA2B9B;IAED;;;;;;;;;;;;OAYG;IACH,cAHW,eAAe,GACb,OAAO,CAwBnB;IAED;;;;;;OAMG;IACH,QAFa,MAAM,CA0BlB;IAED;;;;;;;;;;;;OAYG;IACH,YAFW,eAAe,QAyBzB;IAED;;;;;;OAMG;IACH,SAFa,eAAe,CAgB3B;IA+EL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;CAN1C;uBA3ZsB,uBAAuB"}