@woosh/meep-engine 3.14.6 → 3.16.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 (1089) hide show
  1. package/editor/Editor.js +7 -7
  2. package/editor/actions/concrete/TransformModifyAction.d.ts +4 -4
  3. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  4. package/editor/actions/concrete/TransformModifyAction.js +4 -4
  5. package/editor/camera/camera_framing.js +7 -7
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts +20 -0
  7. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -0
  8. package/editor/ecs/component/editors/ecs/Transform64Editor.js +70 -0
  9. package/editor/ecs/component/prototypeObjectEditor.js +2 -2
  10. package/editor/ecs/component/registerEngineComponentEditors.js +3 -3
  11. package/editor/particles/effect/ParticleEffectDocument.d.ts +396 -0
  12. package/editor/particles/effect/ParticleEffectDocument.d.ts.map +1 -0
  13. package/editor/particles/effect/ParticleEffectDocument.js +989 -0
  14. package/editor/particles/effect/ParticleReferenceSimulation.d.ts +113 -0
  15. package/editor/particles/effect/ParticleReferenceSimulation.d.ts.map +1 -0
  16. package/editor/particles/effect/ParticleReferenceSimulation.js +377 -0
  17. package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts +35 -0
  18. package/editor/particles/effect/actions/ParticleGroupDefineAction.d.ts.map +1 -0
  19. package/editor/particles/effect/actions/ParticleGroupDefineAction.js +45 -0
  20. package/editor/particles/effect/make_starter_particle_effect.d.ts +23 -0
  21. package/editor/particles/effect/make_starter_particle_effect.d.ts.map +1 -0
  22. package/editor/particles/effect/make_starter_particle_effect.js +177 -0
  23. package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -1
  24. package/editor/persistence/buildNewSceneDataset.js +10 -8
  25. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.js +67 -67
  26. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  27. package/editor/process/symbolic/GridPositionSymbolicDisplay.js +6 -6
  28. package/editor/process/symbolic/LightSymbolicDisplay.js +172 -172
  29. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -1
  30. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.js +6 -3
  31. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.js +6 -6
  32. package/editor/selection/editor_pick.js +130 -130
  33. package/editor/templates/entity_templates.js +7 -7
  34. package/editor/tools/TransformToolV2.d.ts +3 -3
  35. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  36. package/editor/tools/TransformToolV2.js +58 -25
  37. package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -1
  38. package/editor/tools/paint/TerrainHeightPaintTool.js +11 -9
  39. package/editor/tools/v2/GizmoNode.js +2 -2
  40. package/editor/tools/v2/TransformControls.d.ts +3 -3
  41. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  42. package/editor/tools/v2/TransformControls.js +1003 -971
  43. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -1
  44. package/editor/tools/v2/handle/gizmo_drag_plane.js +6 -1
  45. package/editor/view/ecs/components/common/AutoCanvasView.js +17 -0
  46. package/editor/view/node-graph/NodeGraphEditorView.d.ts +143 -2
  47. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  48. package/editor/view/node-graph/NodeGraphEditorView.js +358 -6
  49. package/editor/view/node-graph/NodeGraphMinimapView.d.ts +120 -0
  50. package/editor/view/node-graph/NodeGraphMinimapView.d.ts.map +1 -0
  51. package/editor/view/node-graph/NodeGraphMinimapView.js +859 -0
  52. package/editor/view/node-graph/NodeGraphPaletteView.d.ts +112 -0
  53. package/editor/view/node-graph/NodeGraphPaletteView.d.ts.map +1 -0
  54. package/editor/view/node-graph/NodeGraphPaletteView.js +352 -0
  55. package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts +76 -0
  56. package/editor/view/node-graph/NodeGraphSearchMenuView.d.ts.map +1 -0
  57. package/editor/view/node-graph/NodeGraphSearchMenuView.js +247 -0
  58. package/editor/view/node-graph/NodeGraphView.d.ts +147 -5
  59. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  60. package/editor/view/node-graph/NodeGraphView.js +809 -76
  61. package/editor/view/node-graph/NodeIconView.d.ts +33 -0
  62. package/editor/view/node-graph/NodeIconView.d.ts.map +1 -0
  63. package/editor/view/node-graph/NodeIconView.js +54 -0
  64. package/editor/view/node-graph/NodeView.d.ts +71 -1
  65. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  66. package/editor/view/node-graph/NodeView.js +318 -17
  67. package/editor/view/node-graph/PortView.d.ts +41 -1
  68. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  69. package/editor/view/node-graph/PortView.js +121 -69
  70. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts +16 -3
  71. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  72. package/editor/view/node-graph/actions/ConnectionDeleteAction.js +29 -3
  73. package/editor/view/node-graph/actions/NodeCreateAction.d.ts +65 -0
  74. package/editor/view/node-graph/actions/NodeCreateAction.d.ts.map +1 -0
  75. package/editor/view/node-graph/actions/NodeCreateAction.js +108 -0
  76. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts +6 -0
  77. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  78. package/editor/view/node-graph/actions/NodeDeleteAction.js +24 -2
  79. package/editor/view/node-graph/connection_wire_geometry.d.ts +34 -0
  80. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  81. package/editor/view/node-graph/connection_wire_geometry.js +79 -3
  82. package/editor/view/node-graph/node-graph.css +678 -0
  83. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts +37 -0
  84. package/editor/view/particles/effect/ParticleCodeEditorView.d.ts.map +1 -0
  85. package/editor/view/particles/effect/ParticleCodeEditorView.js +479 -0
  86. package/editor/view/particles/effect/ParticleEffectEditorView.d.ts +61 -0
  87. package/editor/view/particles/effect/ParticleEffectEditorView.d.ts.map +1 -0
  88. package/editor/view/particles/effect/ParticleEffectEditorView.js +223 -0
  89. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts +25 -0
  90. package/editor/view/particles/effect/ParticleEmitterInspectorView.d.ts.map +1 -0
  91. package/editor/view/particles/effect/ParticleEmitterInspectorView.js +606 -0
  92. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts +156 -0
  93. package/editor/view/particles/effect/ParticleGraphEditorView.d.ts.map +1 -0
  94. package/editor/view/particles/effect/ParticleGraphEditorView.js +1636 -0
  95. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts +22 -0
  96. package/editor/view/particles/effect/ParticleNodeParametersView.d.ts.map +1 -0
  97. package/editor/view/particles/effect/ParticleNodeParametersView.js +520 -0
  98. package/editor/view/particles/effect/ParticlePreviewView.d.ts +52 -0
  99. package/editor/view/particles/effect/ParticlePreviewView.d.ts.map +1 -0
  100. package/editor/view/particles/effect/ParticlePreviewView.js +533 -0
  101. package/editor/view/particles/effect/particle-editor.css +556 -0
  102. package/editor/view/prepareMeshLibrary.d.ts.map +1 -1
  103. package/editor/view/prepareMeshLibrary.js +8 -4
  104. package/package.json +1 -1
  105. package/samples/engine/first-scene/main.js +152 -152
  106. package/samples/generation/generators/mir_generator_place_bases.js +3 -3
  107. package/src/core/assert.d.ts +28 -24
  108. package/src/core/assert.d.ts.map +1 -1
  109. package/src/core/assert.js +34 -26
  110. package/src/core/geom/3d/shape/PosedShape3D.d.ts +17 -0
  111. package/src/core/geom/3d/shape/PosedShape3D.d.ts.map +1 -1
  112. package/src/core/geom/3d/shape/PosedShape3D.js +34 -2
  113. package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts +17 -0
  114. package/src/core/graph/format/graphviz/graphviz_escape_html_label.d.ts.map +1 -0
  115. package/src/core/graph/format/graphviz/graphviz_escape_html_label.js +25 -0
  116. package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts +16 -0
  117. package/src/core/graph/format/graphviz/graphviz_escape_quoted.d.ts.map +1 -0
  118. package/src/core/graph/format/graphviz/graphviz_escape_quoted.js +24 -0
  119. package/src/core/model/node-graph/NodeGraph.d.ts +12 -0
  120. package/src/core/model/node-graph/NodeGraph.d.ts.map +1 -1
  121. package/src/core/model/node-graph/NodeGraph.js +21 -6
  122. package/src/core/model/node-graph/node/NodeDescription.d.ts +36 -0
  123. package/src/core/model/node-graph/node/NodeDescription.d.ts.map +1 -1
  124. package/src/core/model/node-graph/node/NodeDescription.js +41 -0
  125. package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts +119 -0
  126. package/src/core/model/node-graph/visual/ConnectionVisualData.d.ts.map +1 -0
  127. package/src/core/model/node-graph/visual/ConnectionVisualData.js +317 -0
  128. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts +4 -0
  129. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.d.ts.map +1 -1
  130. package/src/core/model/node-graph/visual/NodeDescriptionVisualRegistry.js +125 -22
  131. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts +91 -2
  132. package/src/core/model/node-graph/visual/NodeGraphVisualData.d.ts.map +1 -1
  133. package/src/core/model/node-graph/visual/NodeGraphVisualData.js +164 -113
  134. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts +162 -0
  135. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.d.ts.map +1 -0
  136. package/src/core/model/node-graph/visual/layout/LayoutBoxGraph.js +288 -0
  137. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts +109 -0
  138. package/src/core/model/node-graph/visual/layout/LayoutProblem.d.ts.map +1 -0
  139. package/src/core/model/node-graph/visual/layout/LayoutProblem.js +141 -0
  140. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts +149 -0
  141. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.d.ts.map +1 -0
  142. package/src/core/model/node-graph/visual/layout/NodeGraphLayoutOptions.js +175 -0
  143. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts +137 -0
  144. package/src/core/model/node-graph/visual/layout/RouteGrid.d.ts.map +1 -0
  145. package/src/core/model/node-graph/visual/layout/RouteGrid.js +242 -0
  146. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts +114 -0
  147. package/src/core/model/node-graph/visual/layout/RouteSearch.d.ts.map +1 -0
  148. package/src/core/model/node-graph/visual/layout/RouteSearch.js +300 -0
  149. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts +86 -0
  150. package/src/core/model/node-graph/visual/layout/RouteSet.d.ts.map +1 -0
  151. package/src/core/model/node-graph/visual/layout/RouteSet.js +168 -0
  152. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts +48 -0
  153. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.d.ts.map +1 -0
  154. package/src/core/model/node-graph/visual/layout/layout_assign_coordinates.js +555 -0
  155. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts +34 -0
  156. package/src/core/model/node-graph/visual/layout/layout_assign_layers.d.ts.map +1 -0
  157. package/src/core/model/node-graph/visual/layout/layout_assign_layers.js +202 -0
  158. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts +34 -0
  159. package/src/core/model/node-graph/visual/layout/layout_break_cycles.d.ts.map +1 -0
  160. package/src/core/model/node-graph/visual/layout/layout_break_cycles.js +254 -0
  161. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts +29 -0
  162. package/src/core/model/node-graph/visual/layout/layout_build_problem.d.ts.map +1 -0
  163. package/src/core/model/node-graph/visual/layout/layout_build_problem.js +184 -0
  164. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts +29 -0
  165. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.d.ts.map +1 -0
  166. package/src/core/model/node-graph/visual/layout/layout_insert_lanes.js +95 -0
  167. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts +56 -0
  168. package/src/core/model/node-graph/visual/layout/layout_node_graph.d.ts.map +1 -0
  169. package/src/core/model/node-graph/visual/layout/layout_node_graph.js +131 -0
  170. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts +36 -0
  171. package/src/core/model/node-graph/visual/layout/layout_order_layers.d.ts.map +1 -0
  172. package/src/core/model/node-graph/visual/layout/layout_order_layers.js +415 -0
  173. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts +21 -0
  174. package/src/core/model/node-graph/visual/layout/layout_orient_links.d.ts.map +1 -0
  175. package/src/core/model/node-graph/visual/layout/layout_orient_links.js +49 -0
  176. package/src/core/model/node-graph/visual/layout/route_connections.d.ts +41 -0
  177. package/src/core/model/node-graph/visual/layout/route_connections.d.ts.map +1 -0
  178. package/src/core/model/node-graph/visual/layout/route_connections.js +309 -0
  179. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts +33 -0
  180. package/src/core/model/node-graph/visual/layout/route_grid_build.d.ts.map +1 -0
  181. package/src/core/model/node-graph/visual/layout/route_grid_build.js +237 -0
  182. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts +25 -0
  183. package/src/core/model/node-graph/visual/layout/route_nudge.d.ts.map +1 -0
  184. package/src/core/model/node-graph/visual/layout/route_nudge.js +220 -0
  185. package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts +29 -0
  186. package/src/core/model/node-graph/visual/layout/route_to_spline.d.ts.map +1 -0
  187. package/src/core/model/node-graph/visual/layout/route_to_spline.js +120 -0
  188. package/src/engine/EngineHarness.d.ts.map +1 -1
  189. package/src/engine/EngineHarness.js +593 -586
  190. package/src/engine/EntityCreator.js +116 -116
  191. package/src/engine/achievements/AchievementManager.js +437 -437
  192. package/src/engine/animation/AnimatedActions.js +111 -111
  193. package/src/engine/animation/AnimationUtils.d.ts.map +1 -1
  194. package/src/engine/animation/AnimationUtils.js +246 -234
  195. package/src/engine/animation/Animations.d.ts +1 -0
  196. package/src/engine/animation/Animations.d.ts.map +1 -1
  197. package/src/engine/animation/Animations.js +13 -5
  198. package/src/engine/animation/clip/bind_property_writer.d.ts.map +1 -1
  199. package/src/engine/animation/clip/bind_property_writer.js +12 -5
  200. package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts +29 -0
  201. package/src/engine/animation/curve/binding/BoundTransform64Writer.d.ts.map +1 -0
  202. package/src/engine/animation/curve/binding/BoundTransform64Writer.js +80 -0
  203. package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +4 -4
  204. package/src/engine/asset/loaders/gltf_test_fixtures.d.ts.map +1 -1
  205. package/src/engine/asset/loaders/gltf_test_fixtures.js +5 -4
  206. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +12 -12
  207. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  208. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +77 -44
  209. package/src/engine/control/first-person/abilities/LedgeGrab.js +1 -1
  210. package/src/engine/control/first-person/abilities/Mantle.js +1 -1
  211. package/src/engine/control/first-person/abilities/Slide.js +1 -1
  212. package/src/engine/control/first-person/collision/KinematicMover.d.ts +5 -9
  213. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  214. package/src/engine/control/first-person/collision/KinematicMover.js +59 -29
  215. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +2 -2
  216. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -1
  217. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +7 -7
  218. package/src/engine/ecs/EventType.d.ts +1 -0
  219. package/src/engine/ecs/EventType.js +35 -10
  220. package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.d.ts.map +1 -1
  221. package/src/engine/ecs/dynamic_actions/actions/definition/SendRequestActionDescription.js +12 -4
  222. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts +4 -4
  223. package/src/engine/ecs/fow/FogOfWarRevealerSystem.d.ts.map +1 -1
  224. package/src/engine/ecs/fow/FogOfWarRevealerSystem.js +10 -11
  225. package/src/engine/ecs/grid/pick.js +1 -1
  226. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts +1 -1
  227. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +13 -13
  228. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +3 -3
  229. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts +10 -10
  230. package/src/engine/ecs/ik/InverseKinematicsSystem.d.ts.map +1 -1
  231. package/src/engine/ecs/ik/InverseKinematicsSystem.js +8 -8
  232. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +1 -1
  233. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +120 -97
  234. package/src/engine/ecs/ik/ik_bone_chain.d.ts +16 -5
  235. package/src/engine/ecs/ik/ik_bone_chain.d.ts.map +1 -1
  236. package/src/engine/ecs/ik/ik_bone_chain.js +16 -4
  237. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +7 -3
  238. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +1 -1
  239. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +20 -16
  240. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts +18 -0
  241. package/src/engine/ecs/ik/ik_write_local_rotation.d.ts.map +1 -0
  242. package/src/engine/ecs/ik/ik_write_local_rotation.js +30 -0
  243. package/src/engine/ecs/parent/EntityNode.d.ts +24 -6
  244. package/src/engine/ecs/parent/EntityNode.d.ts.map +1 -1
  245. package/src/engine/ecs/parent/EntityNode.js +54 -42
  246. package/src/engine/ecs/parent/EntityNodeFlags.d.ts +0 -1
  247. package/src/engine/ecs/parent/EntityNodeFlags.js +7 -8
  248. package/src/engine/ecs/speaker/VoiceSystem.d.ts +2 -2
  249. package/src/engine/ecs/speaker/VoiceSystem.d.ts.map +1 -1
  250. package/src/engine/ecs/speaker/VoiceSystem.js +4 -4
  251. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  252. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +2 -0
  253. package/src/engine/ecs/terrain/ecs/Terrain.d.ts +5 -2
  254. package/src/engine/ecs/terrain/ecs/Terrain.d.ts.map +1 -1
  255. package/src/engine/ecs/terrain/ecs/Terrain.js +7 -4
  256. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +3 -3
  257. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +7 -7
  258. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  259. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +84 -36
  260. package/src/engine/ecs/transform/TRANSFORM64_MIGRATION_PLAN_2026_09_04.md +513 -0
  261. package/src/engine/ecs/transform/Transform64.d.ts +48 -11
  262. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  263. package/src/engine/ecs/transform/Transform64.js +54 -15
  264. package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts +37 -0
  265. package/src/engine/ecs/transform/Transform64SerializationAdapter.d.ts.map +1 -0
  266. package/src/engine/ecs/transform/Transform64SerializationAdapter.js +75 -0
  267. package/src/engine/ecs/transform/__probe.d.ts +4 -0
  268. package/src/engine/ecs/transform/__probe.d.ts.map +1 -0
  269. package/src/engine/ecs/transform/t64_allocation_probe.d.ts +31 -0
  270. package/src/engine/ecs/transform/t64_allocation_probe.d.ts.map +1 -0
  271. package/src/engine/ecs/transform/t64_allocation_probe.js +78 -0
  272. package/src/engine/ecs/transform/t64_announce_change.d.ts +33 -0
  273. package/src/engine/ecs/transform/t64_announce_change.d.ts.map +1 -0
  274. package/src/engine/ecs/transform/t64_announce_change.js +39 -0
  275. package/src/engine/ecs/transform/t64_equals_components.d.ts +30 -0
  276. package/src/engine/ecs/transform/t64_equals_components.d.ts.map +1 -0
  277. package/src/engine/ecs/transform/t64_equals_components.js +59 -0
  278. package/src/engine/ecs/transform/t64_read_rotation.d.ts +13 -0
  279. package/src/engine/ecs/transform/t64_read_rotation.d.ts.map +1 -0
  280. package/src/engine/ecs/transform/t64_read_rotation.js +16 -0
  281. package/src/engine/ecs/transform/t64_read_translation.d.ts +14 -0
  282. package/src/engine/ecs/transform/t64_read_translation.d.ts.map +1 -0
  283. package/src/engine/ecs/transform/t64_read_translation.js +17 -0
  284. package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts +5 -5
  285. package/src/engine/ecs/transform-attachment/TransformAttachment.d.ts.map +1 -1
  286. package/src/engine/ecs/transform-attachment/TransformAttachment.js +4 -4
  287. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts +10 -10
  288. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.d.ts.map +1 -1
  289. package/src/engine/ecs/transform-attachment/TransformAttachmentSystem.js +71 -20
  290. package/src/engine/graphics/debug/createDebugLabel.js +3 -3
  291. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.d.ts.map +1 -1
  292. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +5 -4
  293. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  294. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +8 -3
  295. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts +6 -6
  296. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  297. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +25 -13
  298. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraLanderSystem.js +1 -1
  299. package/src/engine/graphics/ecs/mesh/setMesh.js +2 -2
  300. package/src/engine/graphics/ecs/path/entity/EntityPath.d.ts.map +1 -1
  301. package/src/engine/graphics/ecs/path/entity/EntityPath.js +21 -7
  302. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts +4 -4
  303. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.d.ts.map +1 -1
  304. package/src/engine/graphics/ecs/path/entity/EntityPathMarkerDefinition.js +4 -4
  305. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts +2 -2
  306. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.d.ts.map +1 -1
  307. package/src/engine/graphics/ecs/sprite/SpriteSystemPE.js +145 -135
  308. package/src/engine/graphics/geometry/MikkT/Build4RuleGroups.js +2 -2
  309. package/src/engine/graphics/geometry/MikkT/DegenEpilogue.js +1 -1
  310. package/src/engine/graphics/geometry/MikkT/DegenPrologue.js +1 -1
  311. package/src/engine/graphics/geometry/MikkT/EvalTspace.js +1 -1
  312. package/src/engine/graphics/geometry/MikkT/GenerateTSpaces.js +3 -3
  313. package/src/engine/graphics/render/frame_graph/CORRECTNESS_FIXES_2026_09_04.md +659 -0
  314. package/src/engine/graphics/render/frame_graph/FRAME_GRAPH_RECOMMENDATIONS.md +21 -5
  315. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts +45 -0
  316. package/src/engine/graphics/render/frame_graph/FrameGraph.d.ts.map +1 -1
  317. package/src/engine/graphics/render/frame_graph/FrameGraph.js +282 -60
  318. package/src/engine/graphics/render/frame_graph/FramePassBuilder.d.ts.map +1 -1
  319. package/src/engine/graphics/render/frame_graph/FramePassBuilder.js +20 -9
  320. package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts +12 -0
  321. package/src/engine/graphics/render/frame_graph/FramePassNode.d.ts.map +1 -1
  322. package/src/engine/graphics/render/frame_graph/FramePassNode.js +13 -0
  323. package/src/engine/graphics/render/frame_graph/FramePassResources.d.ts.map +1 -1
  324. package/src/engine/graphics/render/frame_graph/FramePassResources.js +5 -0
  325. package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts +19 -1
  326. package/src/engine/graphics/render/frame_graph/ResourceEntry.d.ts.map +1 -1
  327. package/src/engine/graphics/render/frame_graph/ResourceEntry.js +23 -1
  328. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts +15 -1
  329. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.d.ts.map +1 -1
  330. package/src/engine/graphics/render/frame_graph/backend/void/VoidRenderContext.js +33 -16
  331. package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.d.ts.map +1 -1
  332. package/src/engine/graphics/render/frame_graph/resource/RenderResourceManager.js +19 -1
  333. package/src/engine/graphics/sh3/path_tracer/populate_path_traced_scene_from_ecd.js +6 -6
  334. package/src/engine/graphics3/CameraSystem.d.ts +6 -6
  335. package/src/engine/graphics3/CameraSystem.d.ts.map +1 -1
  336. package/src/engine/graphics3/CameraSystem.js +170 -170
  337. package/src/engine/graphics3/DecalSystem.d.ts +6 -6
  338. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  339. package/src/engine/graphics3/DecalSystem.js +449 -449
  340. package/src/engine/graphics3/LightSystem.d.ts +6 -6
  341. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  342. package/src/engine/graphics3/LightSystem.js +234 -221
  343. package/src/engine/graphics3/MeshSystem.d.ts +6 -6
  344. package/src/engine/graphics3/MeshSystem.d.ts.map +1 -1
  345. package/src/engine/graphics3/MeshSystem.js +53 -22
  346. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts +20 -15
  347. package/src/engine/graphics3/ParticipatingMediaSystem.d.ts.map +1 -1
  348. package/src/engine/graphics3/ParticipatingMediaSystem.js +198 -184
  349. package/src/engine/graphics3/ParticleEmitterSystem.d.ts +6 -6
  350. package/src/engine/graphics3/ParticleEmitterSystem.d.ts.map +1 -1
  351. package/src/engine/graphics3/ParticleEmitterSystem.js +310 -289
  352. package/src/engine/graphics3/PickingSystem.d.ts +6 -6
  353. package/src/engine/graphics3/PickingSystem.d.ts.map +1 -1
  354. package/src/engine/graphics3/PickingSystem.js +273 -273
  355. package/src/engine/graphics3/ShadedGeometrySystem.d.ts +6 -6
  356. package/src/engine/graphics3/ShadedGeometrySystem.d.ts.map +1 -1
  357. package/src/engine/graphics3/ShadedGeometrySystem.js +180 -169
  358. package/src/engine/graphics3/TerrainSystem.d.ts.map +1 -1
  359. package/src/engine/graphics3/TerrainSystem.js +565 -566
  360. package/src/engine/graphics3/Trail3DSystem.d.ts +6 -6
  361. package/src/engine/graphics3/Trail3DSystem.d.ts.map +1 -1
  362. package/src/engine/graphics3/Trail3DSystem.js +221 -221
  363. package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
  364. package/src/engine/graphics3/camera_sync_from_transform.d.ts.map +1 -1
  365. package/src/engine/graphics3/camera_sync_from_transform.js +2 -1
  366. package/src/engine/graphics3/debug/gizmo_view_from_camera.js +4 -4
  367. package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts +6 -0
  368. package/src/engine/graphics3/particles/GPUParticularRenderer.d.ts.map +1 -1
  369. package/src/engine/graphics3/particles/GPUParticularRenderer.js +82 -53
  370. package/src/engine/graphics3/particles/particle_gpu_records.d.ts +12 -8
  371. package/src/engine/graphics3/particles/particle_gpu_records.d.ts.map +1 -1
  372. package/src/engine/graphics3/particles/particle_gpu_records.js +53 -45
  373. package/src/engine/graphics3/preview/make_model_preview_scene.js +1 -1
  374. package/src/engine/graphics3/shade_camera_projection_ray.js +4 -4
  375. package/src/engine/graphics3/shade_node_to_entity_composition.d.ts.map +1 -1
  376. package/src/engine/graphics3/shade_node_to_entity_composition.js +88 -84
  377. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts +7 -7
  378. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.d.ts.map +1 -1
  379. package/src/engine/grid/grid2transform/GridPosition2TransformSystem.js +8 -8
  380. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts +9 -8
  381. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.d.ts.map +1 -1
  382. package/src/engine/grid/transform2grid/Transform2GridPositionSystem.js +29 -8
  383. package/src/engine/input/ecs/controllers/KeyboardCameraController.js +2 -2
  384. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.d.ts.map +1 -1
  385. package/src/engine/intelligence/behavior/ecs/OrbitingBehavior.js +35 -21
  386. package/src/engine/intelligence/behavior/util/RotationBehavior.js +5 -5
  387. package/src/engine/intelligence/mcts/StateNode.js +1 -1
  388. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts +7 -7
  389. package/src/engine/interpolation/TransformPoseSerializationAdapter.d.ts.map +1 -1
  390. package/src/engine/interpolation/TransformPoseSerializationAdapter.js +14 -15
  391. package/src/engine/interpolation/pose_interpoland.d.ts +2 -2
  392. package/src/engine/interpolation/pose_interpoland.js +4 -4
  393. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts +4 -4
  394. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  395. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +39 -14
  396. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts +7 -7
  397. package/src/engine/network/adapters/TransformReplicationAdapter.d.ts.map +1 -1
  398. package/src/engine/network/adapters/TransformReplicationAdapter.js +19 -20
  399. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
  400. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  401. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
  402. package/src/engine/network/replication/Replicator.d.ts +5 -3
  403. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  404. package/src/engine/network/replication/Replicator.js +65 -16
  405. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +3 -3
  406. package/src/engine/physics/ccd/linear_sweep.d.ts.map +1 -1
  407. package/src/engine/physics/ccd/linear_sweep.js +9 -3
  408. package/src/engine/physics/constraint/solve_constraints.js +10 -10
  409. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +8 -8
  410. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -1
  411. package/src/engine/physics/ecs/ColliderObserverSystem.js +6 -6
  412. package/src/engine/physics/ecs/PhysicsSystem.d.ts +22 -32
  413. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  414. package/src/engine/physics/ecs/PhysicsSystem.js +2337 -2310
  415. package/src/engine/physics/ecs/find_non_finite_physics_state.js +6 -6
  416. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +7 -7
  417. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts.map +1 -1
  418. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.js +16 -8
  419. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +4 -4
  420. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -1
  421. package/src/engine/physics/fluid/ecs/FluidSystem.js +6 -6
  422. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts +2 -2
  423. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.d.ts.map +1 -1
  424. package/src/engine/physics/fluid/ecs/WorkerFluidSystem.js +4 -4
  425. package/src/engine/physics/fluid/ecs/fluid_reanchor_field.js +7 -7
  426. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +4 -4
  427. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +7 -7
  428. package/src/engine/physics/inertia/world_inverse_inertia.js +1 -1
  429. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -1
  430. package/src/engine/physics/integration/integrate_position.js +13 -12
  431. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.d.ts.map +1 -1
  432. package/src/engine/physics/inverse_kinematics/fabrik/fabrik_solve.js +23 -5
  433. package/src/engine/physics/narrowphase/compute_penetration.js +18 -14
  434. package/src/engine/physics/narrowphase/convex_convex_manifold.js +2 -2
  435. package/src/engine/physics/narrowphase/mesh_mesh_tet_manifold.js +9 -9
  436. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -1
  437. package/src/engine/physics/narrowphase/narrowphase_step.js +95 -68
  438. package/src/engine/physics/narrowphase/refine_ray_concave.js +1 -1
  439. package/src/engine/physics/narrowphase/refine_ray_hit.js +3 -3
  440. package/src/engine/physics/queries/overlap_shape.d.ts.map +1 -1
  441. package/src/engine/physics/queries/overlap_shape.js +19 -7
  442. package/src/engine/physics/queries/raycast.js +3 -3
  443. package/src/engine/physics/queries/shape_cast.d.ts.map +1 -1
  444. package/src/engine/physics/queries/shape_cast.js +628 -620
  445. package/src/engine/physics/solver/solve_contacts.js +10 -10
  446. package/src/engine/physics/vehicle/RaycastVehicle.d.ts +6 -5
  447. package/src/engine/physics/vehicle/RaycastVehicle.d.ts.map +1 -1
  448. package/src/engine/physics/vehicle/RaycastVehicle.js +10 -5
  449. package/src/engine/sound/ecs/SoundListenerSystem.d.ts +16 -4
  450. package/src/engine/sound/ecs/SoundListenerSystem.d.ts.map +1 -1
  451. package/src/engine/sound/ecs/SoundListenerSystem.js +70 -11
  452. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +7 -7
  453. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  454. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +343 -338
  455. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +2 -2
  456. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  457. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +356 -345
  458. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts +23 -2
  459. package/src/engine/sound/ecs/audio/SpatialAudioIndex.d.ts.map +1 -1
  460. package/src/engine/sound/ecs/audio/SpatialAudioIndex.js +174 -140
  461. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts +6 -6
  462. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  463. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +185 -184
  464. package/src/engine/sound/material/detector/terrain/TerrainSoundMaterialSurfaceDetector.js +1 -1
  465. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts +2 -1
  466. package/src/engine/sound/simulation/core/AcousticRegionIndex.d.ts.map +1 -1
  467. package/src/engine/sound/simulation/core/AcousticRegionIndex.js +4 -3
  468. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts +3 -2
  469. package/src/engine/sound/simulation/core/AcousticVolumeRegion.d.ts.map +1 -1
  470. package/src/engine/sound/simulation/core/AcousticVolumeRegion.js +6 -4
  471. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts +10 -6
  472. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.d.ts.map +1 -1
  473. package/src/engine/sound/simulation/ecs/AcousticSimulationSystem.js +32 -7
  474. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts +7 -7
  475. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.d.ts.map +1 -1
  476. package/src/engine/sound/simulation/ecs/AcousticVolumeSystem.js +6 -6
  477. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  478. package/src/engine/sound/sopra/runtime/EventInstance.js +8 -2
  479. package/src/format/scene/gltf/gltf_component_type.d.ts.map +1 -1
  480. package/src/format/scene/gltf/gltf_component_type.js +3 -1
  481. package/src/format/texture/ktx2/ktx2_read.d.ts.map +1 -1
  482. package/src/format/texture/ktx2/ktx2_read.js +2 -1
  483. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.d.ts.map +1 -1
  484. package/src/generation/grid/generation/GridTaskDensityMarkerDistribution.js +8 -1
  485. package/src/generation/markers/GridCellActionPlaceMarker.d.ts +4 -4
  486. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  487. package/src/generation/markers/GridCellActionPlaceMarker.js +16 -6
  488. package/src/generation/markers/MarkerNode.d.ts +3 -3
  489. package/src/generation/markers/MarkerNode.d.ts.map +1 -1
  490. package/src/generation/markers/MarkerNode.js +3 -3
  491. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts +4 -4
  492. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.d.ts.map +1 -1
  493. package/src/generation/markers/actions/MarkerNodeActionEntityPlacement.js +7 -7
  494. package/src/generation/markers/actions/MarkerNodeActionImaginary.d.ts.map +1 -1
  495. package/src/generation/markers/actions/MarkerNodeActionImaginary.js +20 -2
  496. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorClingToTerrain.js +1 -1
  497. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.d.ts.map +1 -1
  498. package/src/generation/markers/actions/placement/MarkerNodeEntityProcessorRandomRotation.js +13 -3
  499. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.d.ts.map +1 -1
  500. package/src/generation/markers/transform/MarkerNodeTransformRotateRandom.js +11 -1
  501. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.d.ts.map +1 -1
  502. package/src/generation/markers/transform/MarkerNodeTransformerAddPositionYFromFilter.js +8 -4
  503. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  504. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +13 -5
  505. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.d.ts.map +1 -1
  506. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilter.js +8 -2
  507. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.d.ts.map +1 -1
  508. package/src/generation/markers/transform/MarkerNodeTransformerYRotateByFilterGradient.js +16 -2
  509. package/src/shade/RENDERER_CONTRACT.md +584 -580
  510. package/src/shade/device/graph/BufferResourceDescriptor.d.ts.map +1 -1
  511. package/src/shade/device/graph/BufferResourceDescriptor.js +193 -184
  512. package/src/shade/device/graph/TextureResourceDescriptor.d.ts.map +1 -1
  513. package/src/shade/device/graph/TextureResourceDescriptor.js +12 -0
  514. package/src/shade/device/mock/SoftwareGPUDevice.d.ts.map +1 -1
  515. package/src/shade/device/mock/SoftwareGPUDevice.js +8 -0
  516. package/src/shade/playground/avboit/README.md +117 -0
  517. package/src/shade/playground/avboit/index.html +215 -0
  518. package/src/shade/playground/avboit/main.d.ts +2 -0
  519. package/src/shade/playground/avboit/main.d.ts.map +1 -0
  520. package/src/shade/playground/avboit/main.js +875 -0
  521. package/src/shade/playground/basis_textures/main.js +1 -1
  522. package/src/shade/playground/ground_seam/main.js +1 -1
  523. package/src/shade/playground/particle_editor/README.md +175 -0
  524. package/src/shade/playground/particle_editor/index.html +76 -0
  525. package/src/shade/playground/particle_editor/main.d.ts +2 -0
  526. package/src/shade/playground/particle_editor/main.d.ts.map +1 -0
  527. package/src/shade/playground/particle_editor/main.js +139 -0
  528. package/src/shade/playground/particle_system/README.md +92 -62
  529. package/src/shade/playground/particle_system/index.html +67 -21
  530. package/src/shade/playground/particle_system/main.js +247 -102
  531. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.d.ts +21 -18
  532. package/src/shade/playground/particle_system/particle_prototype.d.ts.map +1 -0
  533. package/src/shade/{renderer/particles → playground/particle_system}/particle_prototype.js +197 -181
  534. package/src/shade/playground/particle_system/particle_scene.d.ts +136 -20
  535. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  536. package/src/shade/playground/particle_system/particle_scene.js +487 -670
  537. package/src/shade/playground/skinned_blas_refit/sweep_views.js +2 -2
  538. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.d.ts.map +1 -1
  539. package/src/shade/playground/skinned_blas_refit/verify_instance_bounds.js +2 -1
  540. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.d.ts.map +1 -1
  541. package/src/shade/playground/skinned_blas_refit/verify_skinned_blas_refit.js +2 -1
  542. package/src/shade/playground/sponza_path_trace/main.js +1 -1
  543. package/src/shade/playground/volumetrics_froxel/main.js +917 -917
  544. package/src/shade/playground/volumetrics_froxel/measure.js +559 -559
  545. package/src/shade/renderer/Renderer.d.ts +44 -0
  546. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  547. package/src/shade/renderer/Renderer.js +169 -36
  548. package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
  549. package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
  550. package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
  551. package/src/shade/renderer/atmosphere/GPUSky.d.ts.map +1 -1
  552. package/src/shade/renderer/atmosphere/GPUSky.js +4 -2
  553. package/src/shade/renderer/buffer/graph_read_buffer.d.ts.map +1 -1
  554. package/src/shade/renderer/buffer/graph_read_buffer.js +8 -1
  555. package/src/shade/renderer/buffer/table/GPUTypedTable.js +1 -1
  556. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts +30 -0
  557. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.d.ts.map +1 -1
  558. package/src/shade/renderer/buffer/table/GPUTypedTableDescriptor.js +84 -0
  559. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts +27 -0
  560. package/src/shade/renderer/buffer/table/gpu_database_emulator_image.d.ts.map +1 -0
  561. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts +24 -0
  562. package/src/shade/renderer/buffer/table/gpu_database_words.d.ts.map +1 -0
  563. package/src/shade/renderer/buffer/table/gpu_database_words.js +92 -0
  564. package/src/shade/renderer/camera/Camera.d.ts +2 -2
  565. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  566. package/src/shade/renderer/camera/Camera.js +11 -5
  567. package/src/shade/renderer/camera/GPUCameraContext.d.ts.map +1 -1
  568. package/src/shade/renderer/camera/GPUCameraContext.js +2 -1
  569. package/src/shade/renderer/camera/OrbitalCameraController.d.ts +3 -3
  570. package/src/shade/renderer/camera/OrbitalCameraController.d.ts.map +1 -1
  571. package/src/shade/renderer/camera/OrbitalCameraController.js +31 -16
  572. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts +2 -2
  573. package/src/shade/renderer/camera/orbital/OrbitalCameraController.d.ts.map +1 -1
  574. package/src/shade/renderer/camera/orbital/OrbitalCameraController.js +4 -3
  575. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts +10 -5
  576. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.d.ts.map +1 -1
  577. package/src/shade/renderer/camera/orbital/OrbitalCameraRig.js +8 -4
  578. package/src/shade/renderer/extension/FrameContext.d.ts.map +1 -1
  579. package/src/shade/renderer/extension/FrameContext.js +5 -0
  580. package/src/shade/renderer/extension/FrameRecord.d.ts +16 -0
  581. package/src/shade/renderer/extension/FrameRecord.d.ts.map +1 -1
  582. package/src/shade/renderer/extension/FrameRecord.js +31 -0
  583. package/src/shade/renderer/extension/GBufferTextures.d.ts +11 -0
  584. package/src/shade/renderer/extension/GBufferTextures.d.ts.map +1 -1
  585. package/src/shade/renderer/extension/GBufferTextures.js +14 -0
  586. package/src/shade/renderer/geometry/attribute/gpu_vertex_buffer_layout_from_spec.js +1 -1
  587. package/src/shade/renderer/geometry/util/geometry_stripify.js +6 -6
  588. package/src/shade/renderer/geometry/virtual/format/prototypeVGEOFormatViewer.js +8 -8
  589. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.d.ts.map +1 -1
  590. package/src/shade/renderer/global_illumination/lpv/lpv_visualise_probes.js +14 -5
  591. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.d.ts.map +1 -1
  592. package/src/shade/renderer/global_illumination/probe/octahedral/GPUProbeAtlas.js +17 -9
  593. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts +2 -1
  594. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.d.ts.map +1 -1
  595. package/src/shade/renderer/global_illumination/probe/octahedral/border/graph_lpv_paint_border_depth.js +4 -1
  596. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts +2 -1
  597. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.d.ts.map +1 -1
  598. package/src/shade/renderer/global_illumination/probe/octahedral/convolve/graph_lvp_atlas_to_sh.js +11 -1
  599. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts +1 -1
  600. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.d.ts.map +1 -1
  601. package/src/shade/renderer/global_illumination/probe/octahedral/graph_lpv_shade.js +4 -2
  602. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.d.ts.map +1 -1
  603. package/src/shade/renderer/global_illumination/sharc/SpatialHashRadianceCache.js +5 -1
  604. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.d.ts.map +1 -1
  605. package/src/shade/renderer/light/cluster/cull/graph_cull_lights.js +35 -11
  606. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  607. package/src/shade/renderer/particles/DESIGN.md +271 -112
  608. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +251 -86
  609. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  610. package/src/shade/renderer/particles/GPUParticleSystem.js +822 -146
  611. package/src/shade/renderer/particles/ParticleConstants.d.ts +96 -3
  612. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  613. package/src/shade/renderer/particles/ParticleConstants.js +103 -4
  614. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +5 -4
  615. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -1
  616. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +11 -15
  617. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +2 -2
  618. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -1
  619. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +20 -15
  620. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +7 -8
  621. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  622. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +7 -17
  623. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts +56 -0
  624. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.d.ts.map +1 -0
  625. package/src/shade/renderer/particles/data/PARTICLE_DATABASE_SPEC.js +68 -0
  626. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts +39 -0
  627. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.d.ts.map +1 -0
  628. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STATE.js +52 -0
  629. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts +83 -0
  630. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.d.ts.map +1 -0
  631. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_STRUCT.js +166 -0
  632. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts +21 -5
  633. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  634. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +44 -85
  635. package/src/shade/renderer/particles/data/particle_header.d.ts +62 -0
  636. package/src/shade/renderer/particles/data/particle_header.d.ts.map +1 -0
  637. package/src/shade/renderer/particles/data/particle_header.js +103 -0
  638. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts +179 -0
  639. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.d.ts.map +1 -0
  640. package/src/shade/renderer/particles/graph/ParticleGroupBuilder.js +303 -0
  641. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +120 -1
  642. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -1
  643. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +90 -1
  644. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts +283 -0
  645. package/src/shade/renderer/particles/graph/ParticleNodeGroup.d.ts.map +1 -0
  646. package/src/shade/renderer/particles/graph/ParticleNodeGroup.js +419 -0
  647. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +44 -2
  648. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  649. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +476 -40
  650. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts +188 -0
  651. package/src/shade/renderer/particles/graph/ParticleValueType.d.ts.map +1 -0
  652. package/src/shade/renderer/particles/graph/ParticleValueType.js +287 -0
  653. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +16 -9
  654. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  655. package/src/shade/renderer/particles/graph/compile_particle_graph.js +464 -205
  656. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts +11 -0
  657. package/src/shade/renderer/particles/graph/flatten_particle_graph.d.ts.map +1 -0
  658. package/src/shade/renderer/particles/graph/flatten_particle_graph.js +213 -0
  659. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts +27 -0
  660. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.d.ts.map +1 -0
  661. package/src/shade/renderer/particles/graph/groups/particle_builtin_groups.js +75 -0
  662. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts +83 -0
  663. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.d.ts.map +1 -0
  664. package/src/shade/renderer/particles/graph/groups/particle_groups_geometry.js +319 -0
  665. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts +22 -0
  666. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.d.ts.map +1 -0
  667. package/src/shade/renderer/particles/graph/groups/particle_groups_noise.js +517 -0
  668. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts +70 -0
  669. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.d.ts.map +1 -0
  670. package/src/shade/renderer/particles/graph/groups/particle_groups_utility.js +161 -0
  671. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts +8 -0
  672. package/src/shade/renderer/particles/graph/groups/simplex_reference.d.ts.map +1 -0
  673. package/src/shade/renderer/particles/graph/groups/simplex_reference.js +159 -0
  674. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts +88 -0
  675. package/src/shade/renderer/particles/graph/infer_particle_graph_types.d.ts.map +1 -0
  676. package/src/shade/renderer/particles/graph/infer_particle_graph_types.js +234 -0
  677. package/src/shade/renderer/particles/graph/make_particle_group.d.ts +98 -0
  678. package/src/shade/renderer/particles/graph/make_particle_group.d.ts.map +1 -0
  679. package/src/shade/renderer/particles/graph/make_particle_group.js +427 -0
  680. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +11 -4
  681. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -1
  682. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +121 -108
  683. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts +38 -0
  684. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.d.ts.map +1 -0
  685. package/src/shade/renderer/particles/graph/particle_graph_diagnostic.js +25 -0
  686. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts +29 -0
  687. package/src/shade/renderer/particles/graph/particle_graph_distributions.d.ts.map +1 -0
  688. package/src/shade/renderer/particles/graph/particle_graph_distributions.js +170 -0
  689. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts +87 -0
  690. package/src/shade/renderer/particles/graph/particle_graph_json.d.ts.map +1 -0
  691. package/src/shade/renderer/particles/graph/particle_graph_json.js +196 -0
  692. package/src/shade/renderer/particles/graph/particle_group_json.d.ts +86 -0
  693. package/src/shade/renderer/particles/graph/particle_group_json.d.ts.map +1 -0
  694. package/src/shade/renderer/particles/graph/particle_group_json.js +182 -0
  695. package/src/shade/renderer/particles/graph/particle_group_library.d.ts +33 -0
  696. package/src/shade/renderer/particles/graph/particle_group_library.d.ts.map +1 -0
  697. package/src/shade/renderer/particles/graph/particle_group_library.js +75 -0
  698. package/src/shade/renderer/particles/graph/particle_node_library.d.ts +37 -0
  699. package/src/shade/renderer/particles/graph/particle_node_library.d.ts.map +1 -0
  700. package/src/shade/renderer/particles/graph/particle_node_library.js +64 -0
  701. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts +146 -0
  702. package/src/shade/renderer/particles/graph/particle_node_parameters.d.ts.map +1 -0
  703. package/src/shade/renderer/particles/graph/particle_node_parameters.js +234 -0
  704. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts +30 -0
  705. package/src/shade/renderer/particles/graph/particle_node_presentation.d.ts.map +1 -0
  706. package/src/shade/renderer/particles/graph/particle_node_presentation.js +286 -0
  707. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts +66 -0
  708. package/src/shade/renderer/particles/graph/validate_particle_graph.d.ts.map +1 -0
  709. package/src/shade/renderer/particles/graph/validate_particle_graph.js +439 -0
  710. package/src/shade/renderer/particles/graph_particles.d.ts +143 -68
  711. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  712. package/src/shade/renderer/particles/graph_particles.js +424 -71
  713. package/src/shade/renderer/particles/graph_particles_avboit.d.ts +107 -0
  714. package/src/shade/renderer/particles/graph_particles_avboit.d.ts.map +1 -0
  715. package/src/shade/renderer/particles/graph_particles_avboit.js +312 -0
  716. package/src/shade/renderer/particles/isa/InstructionStream.d.ts +41 -8
  717. package/src/shade/renderer/particles/isa/InstructionStream.d.ts.map +1 -1
  718. package/src/shade/renderer/particles/isa/InstructionStream.js +111 -33
  719. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts +13 -10
  720. package/src/shade/renderer/particles/isa/ParticleAssembler.d.ts.map +1 -1
  721. package/src/shade/renderer/particles/isa/ParticleAssembler.js +30 -26
  722. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts +27 -15
  723. package/src/shade/renderer/particles/isa/ParticleProgram.d.ts.map +1 -1
  724. package/src/shade/renderer/particles/isa/ParticleProgram.js +139 -34
  725. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts +117 -9
  726. package/src/shade/renderer/particles/isa/ParticleVMISA.d.ts.map +1 -1
  727. package/src/shade/renderer/particles/isa/ParticleVMISA.js +296 -37
  728. package/src/shade/renderer/particles/isa/particle_assembly.d.ts +149 -0
  729. package/src/shade/renderer/particles/isa/particle_assembly.d.ts.map +1 -0
  730. package/src/shade/renderer/particles/isa/particle_assembly.js +999 -0
  731. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts +25 -3
  732. package/src/shade/renderer/particles/layout/ParticleLayout.d.ts.map +1 -1
  733. package/src/shade/renderer/particles/layout/ParticleLayout.js +33 -5
  734. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts +160 -0
  735. package/src/shade/renderer/particles/optimizer/optimize_particle_program.d.ts.map +1 -0
  736. package/src/shade/renderer/particles/optimizer/optimize_particle_program.js +478 -0
  737. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts +291 -0
  738. package/src/shade/renderer/particles/optimizer/particle_program_analysis.d.ts.map +1 -0
  739. package/src/shade/renderer/particles/optimizer/particle_program_analysis.js +647 -0
  740. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts +95 -0
  741. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.d.ts.map +1 -0
  742. package/src/shade/renderer/particles/optimizer/particle_program_equivalence.js +213 -0
  743. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts +16 -0
  744. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.d.ts.map +1 -0
  745. package/src/shade/renderer/particles/optimizer/particle_program_fuzz.js +223 -0
  746. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts +121 -0
  747. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.d.ts.map +1 -0
  748. package/src/shade/renderer/particles/optimizer/particle_vm_semantics.js +206 -0
  749. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts +11 -0
  750. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.d.ts.map +1 -0
  751. package/src/shade/renderer/particles/optimizer/pass_dedup_constants.js +197 -0
  752. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts +4 -0
  753. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.d.ts.map +1 -0
  754. package/src/shade/renderer/particles/optimizer/pass_eliminate_dead_code.js +51 -0
  755. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts +4 -0
  756. package/src/shade/renderer/particles/optimizer/pass_fold_constants.d.ts.map +1 -0
  757. package/src/shade/renderer/particles/optimizer/pass_fold_constants.js +561 -0
  758. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts +4 -0
  759. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.d.ts.map +1 -0
  760. package/src/shade/renderer/particles/optimizer/pass_narrow_widths.js +72 -0
  761. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts +4 -0
  762. package/src/shade/renderer/particles/optimizer/pass_pack_registers.d.ts.map +1 -0
  763. package/src/shade/renderer/particles/optimizer/pass_pack_registers.js +86 -0
  764. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts +4 -0
  765. package/src/shade/renderer/particles/optimizer/pass_peephole.d.ts.map +1 -0
  766. package/src/shade/renderer/particles/optimizer/pass_peephole.js +271 -0
  767. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts +4 -0
  768. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.d.ts.map +1 -0
  769. package/src/shade/renderer/particles/optimizer/pass_propagate_copies.js +268 -0
  770. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts +4 -0
  771. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.d.ts.map +1 -0
  772. package/src/shade/renderer/particles/optimizer/pass_share_subexpressions.js +151 -0
  773. package/src/shade/renderer/particles/particle_test_fixtures.d.ts +131 -0
  774. package/src/shade/renderer/particles/particle_test_fixtures.d.ts.map +1 -0
  775. package/src/shade/renderer/particles/particle_test_fixtures.js +203 -0
  776. package/src/shade/renderer/particles/runtime/Emitter.d.ts +219 -0
  777. package/src/shade/renderer/particles/runtime/Emitter.d.ts.map +1 -0
  778. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +128 -60
  779. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  780. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +286 -117
  781. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts +264 -0
  782. package/src/shade/renderer/particles/runtime/ParticleEmitter.d.ts.map +1 -0
  783. package/src/shade/renderer/particles/runtime/ParticleEmitter.js +404 -0
  784. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts +49 -15
  785. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.d.ts.map +1 -1
  786. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +51 -18
  787. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  788. package/src/shade/renderer/particles/runtime/ProgramArena.js +72 -32
  789. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
  790. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  791. package/src/shade/renderer/particles/runtime/create_particle_effect.js +4 -4
  792. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts +15 -0
  793. package/src/shade/renderer/particles/runtime/emitter_database_image.d.ts.map +1 -0
  794. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts +17 -0
  795. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.d.ts.map +1 -0
  796. package/src/shade/renderer/particles/shaders/chunk_particle_avboit_contribution.js +75 -0
  797. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts +20 -0
  798. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.d.ts.map +1 -0
  799. package/src/shade/renderer/particles/shaders/chunk_particle_billboard_vertex.js +94 -0
  800. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts +15 -5
  801. package/src/shade/renderer/particles/shaders/chunk_particle_context.d.ts.map +1 -1
  802. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts +1 -2
  803. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.d.ts.map +1 -1
  804. package/src/shade/renderer/particles/shaders/chunk_particle_curve_animation.js +1 -2
  805. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts +11 -0
  806. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.d.ts.map +1 -0
  807. package/src/shade/renderer/particles/shaders/chunk_particle_curve_disabled.js +13 -0
  808. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts +17 -0
  809. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.d.ts.map +1 -0
  810. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_age.js +22 -0
  811. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts +14 -0
  812. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.d.ts.map +1 -0
  813. package/src/shade/renderer/particles/shaders/chunk_particle_emitter_world_sphere.js +23 -0
  814. package/src/shade/renderer/particles/shaders/chunk_particle_render_math.js +1 -1
  815. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts +18 -0
  816. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.d.ts.map +1 -0
  817. package/src/shade/renderer/particles/shaders/chunk_particle_scene_view_depth.js +24 -0
  818. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts +26 -0
  819. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.d.ts.map +1 -0
  820. package/src/shade/renderer/particles/shaders/chunk_particle_setup_context.js +59 -0
  821. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts +14 -0
  822. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.d.ts.map +1 -0
  823. package/src/shade/renderer/particles/shaders/shader_particle_avboit_draw.js +153 -0
  824. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts +3 -0
  825. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.d.ts.map +1 -0
  826. package/src/shade/renderer/particles/shaders/shader_particle_avboit_occupancy.js +124 -0
  827. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts +19 -0
  828. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.d.ts.map +1 -0
  829. package/src/shade/renderer/particles/shaders/shader_particle_avboit_splat.js +147 -0
  830. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts +18 -8
  831. package/src/shade/renderer/particles/shaders/shader_particle_emit.d.ts.map +1 -1
  832. package/src/shade/renderer/particles/shaders/shader_particle_emit.js +72 -37
  833. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts +5 -0
  834. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.d.ts.map +1 -0
  835. package/src/shade/renderer/particles/shaders/shader_particle_emitter_tick.js +216 -0
  836. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  837. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +7 -3
  838. package/src/shade/renderer/particles/shaders/shader_particle_render.d.ts.map +1 -1
  839. package/src/shade/renderer/particles/shaders/shader_particle_render.js +132 -197
  840. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  841. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +78 -24
  842. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts +26 -0
  843. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.d.ts.map +1 -0
  844. package/src/shade/renderer/particles/shaders/shader_particle_spawn_commands.js +66 -0
  845. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +1 -1
  846. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  847. package/src/shade/renderer/particles/sort/shader_particle_sort.js +21 -36
  848. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts +2 -2
  849. package/src/shade/renderer/particles/vm/ParticleVMReference.d.ts.map +1 -1
  850. package/src/shade/renderer/particles/vm/ParticleVMReference.js +100 -90
  851. package/src/shade/renderer/particles/vm/chunk_particle_vm.d.ts.map +1 -1
  852. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +270 -138
  853. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
  854. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  855. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
  856. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts +1 -2
  857. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.d.ts.map +1 -1
  858. package/src/shade/renderer/postprocess/denoise/debug/graph_pass_debug_reprojection.js +0 -3
  859. package/src/shade/renderer/postprocess/dof/gather/DepthOfFieldU.js +1 -1
  860. package/src/shade/renderer/postprocess/dof/raymarch/DepthOfField.js +1 -1
  861. package/src/shade/renderer/postprocess/nss/NSS.d.ts +1 -1
  862. package/src/shade/renderer/postprocess/nss/NSS.d.ts.map +1 -1
  863. package/src/shade/renderer/postprocess/nss/NSS.js +3 -2
  864. package/src/shade/renderer/postprocess/nss/generate_NSS_WEIGHTS_ACTUAL.js +3 -2
  865. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
  866. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  867. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
  868. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
  869. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
  870. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
  871. package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
  872. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
  873. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
  874. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
  875. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
  876. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
  877. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
  878. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
  879. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
  880. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
  881. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
  882. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
  883. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
  884. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
  885. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
  886. package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
  887. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
  888. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
  889. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
  890. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts +87 -0
  891. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.d.ts.map +1 -0
  892. package/src/shade/renderer/rasterize/native/avboit/AVBOITSideChannel.js +61 -0
  893. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +107 -0
  894. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
  895. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
  896. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +642 -0
  897. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +534 -0
  898. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
  899. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
  900. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
  901. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
  902. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
  903. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
  904. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +45 -0
  905. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
  906. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +139 -0
  907. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
  908. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
  909. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
  910. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
  911. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
  912. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
  913. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
  914. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
  915. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
  916. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
  917. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
  918. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
  919. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
  920. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
  921. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
  922. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
  923. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
  924. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
  925. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
  926. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
  927. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
  928. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
  929. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
  930. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
  931. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
  932. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
  933. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
  934. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
  935. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
  936. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
  937. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
  938. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
  939. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
  940. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
  941. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
  942. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
  943. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts +18 -0
  944. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.d.ts.map +1 -0
  945. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_splat_slice.js +58 -0
  946. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts +20 -0
  947. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
  948. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
  949. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
  950. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
  951. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
  952. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
  953. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
  954. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
  955. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
  956. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
  957. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
  958. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
  959. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
  960. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
  961. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
  962. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
  963. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
  964. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +141 -0
  965. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
  966. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +994 -0
  967. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
  968. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
  969. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
  970. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
  971. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
  972. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
  973. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
  974. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
  975. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
  976. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
  977. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
  978. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
  979. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
  980. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
  981. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
  982. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
  983. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
  984. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +87 -0
  985. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
  986. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
  987. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +202 -0
  988. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
  989. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
  990. package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
  991. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  992. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +665 -722
  993. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
  994. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
  995. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
  996. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts +7 -2
  997. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.d.ts.map +1 -1
  998. package/src/shade/renderer/rasterize/standard/graph_rasterize_scene.js +16 -2
  999. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts +3 -3
  1000. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.d.ts.map +1 -1
  1001. package/src/shade/renderer/scene/optimization/geometry/geometry_deduplicate.js +29 -23
  1002. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts +2 -2
  1003. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.d.ts.map +1 -1
  1004. package/src/shade/renderer/scene/optimization/geometry/internal/anchor_grow_topological.js +3 -3
  1005. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts +4 -4
  1006. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.d.ts.map +1 -1
  1007. package/src/shade/renderer/scene/optimization/geometry/internal/cover_greedy.js +2 -2
  1008. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts +2 -2
  1009. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.d.ts.map +1 -1
  1010. package/src/shade/renderer/scene/optimization/geometry/internal/match_refit_validate.js +2 -2
  1011. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts +7 -7
  1012. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.d.ts.map +1 -1
  1013. package/src/shade/renderer/scene/optimization/geometry/internal/match_solve_transform.js +79 -71
  1014. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.d.ts.map +1 -1
  1015. package/src/shade/renderer/shader/chunk/math/chunk_lower_bound_branchless.js +3 -1
  1016. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts +13 -3
  1017. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.d.ts.map +1 -1
  1018. package/src/shade/renderer/shader/chunk/random/chunk_hash_to_float01.js +15 -5
  1019. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts +8 -0
  1020. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.d.ts.map +1 -1
  1021. package/src/shade/renderer/shader/chunk/random/chunk_random_uint.js +15 -5
  1022. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts +7 -0
  1023. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.d.ts.map +1 -1
  1024. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg.js +17 -7
  1025. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts +17 -0
  1026. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.d.ts.map +1 -0
  1027. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_advance.js +26 -0
  1028. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts +15 -0
  1029. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.d.ts.map +1 -0
  1030. package/src/shade/renderer/shader/chunk/random/pcg/chunk_pcg_output.js +26 -0
  1031. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  1032. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +8 -2
  1033. package/src/shade/renderer/shadow/map/PointLightShadowmap.d.ts.map +1 -1
  1034. package/src/shade/renderer/shadow/map/PointLightShadowmap.js +7 -2
  1035. package/src/shade/renderer/shadow/map/SpotLightShadowmap.d.ts.map +1 -1
  1036. package/src/shade/renderer/shadow/map/SpotLightShadowmap.js +3 -15
  1037. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.d.ts.map +1 -1
  1038. package/src/shade/renderer/shadow/map/TetrahedronPointLightShadowmap.js +10 -4
  1039. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.d.ts.map +1 -1
  1040. package/src/shade/renderer/shadow/vsm/GPUViewShadowMaps.js +7 -2
  1041. package/src/shade/renderer/volumetrics/GPUViewVolumetrics.js +2 -2
  1042. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts +3 -3
  1043. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.d.ts.map +1 -1
  1044. package/src/shade/renderer/volumetrics/ParticipatingMediaVolume.js +3 -3
  1045. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.d.ts.map +1 -1
  1046. package/src/shade/wgsl/emulator/WGSLJavaScriptCompiler.js +66 -5
  1047. package/src/shade/wgsl/emulator/WGSLLanguageCore.d.ts.map +1 -1
  1048. package/src/shade/wgsl/emulator/WGSLLanguageCore.js +35 -4
  1049. package/src/view/minimap/Minimap.d.ts.map +1 -1
  1050. package/src/view/minimap/Minimap.js +227 -225
  1051. package/src/view/minimap/MinimapCanvasView.js +3 -3
  1052. package/src/view/minimap/MinimapMarker.d.ts +45 -0
  1053. package/src/view/minimap/MinimapMarker.d.ts.map +1 -0
  1054. package/src/view/minimap/MinimapMarker.js +80 -0
  1055. package/src/view/minimap/MinimapMarkerCollection.d.ts +6 -5
  1056. package/src/view/minimap/MinimapMarkerCollection.d.ts.map +1 -1
  1057. package/src/view/minimap/MinimapMarkerCollection.js +6 -6
  1058. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts +19 -0
  1059. package/src/view/minimap/MinimapMarkerSerializationAdapter.d.ts.map +1 -0
  1060. package/src/view/minimap/MinimapMarkerSerializationAdapter.js +42 -0
  1061. package/src/view/minimap/dom/MinimapCameraView.d.ts +1 -1
  1062. package/src/view/minimap/dom/MinimapCameraView.d.ts.map +1 -1
  1063. package/src/view/minimap/dom/MinimapCameraView.js +23 -4
  1064. package/src/view/minimap/dom/MinimapMarkerView.js +3 -3
  1065. package/src/view/minimap/gl/MarkerGL.js +3 -3
  1066. package/src/view/util/DomLayoutFrame.d.ts +53 -0
  1067. package/src/view/util/DomLayoutFrame.d.ts.map +1 -0
  1068. package/src/view/util/DomLayoutFrame.js +122 -0
  1069. package/src/core/model/node-graph/visual/layout/BoxLayoutSpec.js +0 -19
  1070. package/src/core/model/node-graph/visual/layout/ConnectedBoxLayouter.js +0 -241
  1071. package/src/core/model/node-graph/visual/layout/ConnectionEndpointLayoutSpec.js +0 -40
  1072. package/src/core/model/node-graph/visual/layout/ConnectionLayoutSpec.js +0 -28
  1073. package/src/engine/ecs/util/hideEntityGracefully.js +0 -196
  1074. package/src/shade/renderer/particles/cull/chunk_particle_cull.js +0 -38
  1075. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +0 -214
  1076. package/src/shade/renderer/particles/particle_prototype.d.ts.map +0 -1
  1077. package/src/shade/renderer/particles/runtime/ParticleSpawnScheduler.js +0 -86
  1078. package/src/shade/renderer/particles/runtime/spawn_request_encoding.js +0 -52
  1079. package/src/shade/renderer/particles/shaders/chunk_particle_context.js +0 -58
  1080. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
  1081. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
  1082. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
  1083. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
  1084. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
  1085. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
  1086. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
  1087. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
  1088. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
  1089. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
@@ -1,217 +1,893 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { PARTICLE_RECORD_WORD_COUNT, PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
2
+ import { align_4 } from "../../../core/binary/align_4.js";
3
+ import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
4
+ import { warn_limited } from "../../util/warn_limited.js";
3
5
  import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
4
- import { EMITTER_STRIDE, write_emitter_transform } from "./data/PARTICLE_EMITTER_LAYOUT.js";
6
+ import {
7
+ PARTICLE_EMITTER_TICK_WORKGROUP_SIZE,
8
+ PARTICLE_RECORD_WORD_COUNT,
9
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
10
+ PARTICLE_SORT_BUCKET_COUNT,
11
+ PARTICLE_SPAWN_COMMAND_WORDS,
12
+ } from "./ParticleConstants.js";
5
13
  import { PARTICLE_COUNTER, PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
14
+ import { graph_particles_render, graph_particles_simulate } from "./graph_particles.js";
15
+ import {
16
+ graph_particle_avboit_draw,
17
+ graph_particle_avboit_occupancy,
18
+ graph_particle_avboit_splat,
19
+ } from "./graph_particles_avboit.js";
6
20
  import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
7
- import { ParticleSpawnScheduler } from "./runtime/ParticleSpawnScheduler.js";
21
+ import { create_particle_billboard_pipeline } from "./shaders/shader_particle_render.js";
22
+
23
+ const WORD = Uint32Array.BYTES_PER_ELEMENT;
24
+
25
+ const STORAGE = GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST | GPUBufferUsage.COPY_SRC;
26
+ const INDIRECT = GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC;
8
27
 
9
28
  /**
10
- * The GPU particle system feature.
29
+ * The GPU particle system: a feature of a scene, in the mould of `ReSTIRDI` — construct once
30
+ * against a {@link GPUSceneContext}, and contribute the frame's passes through
31
+ * {@link execute}.
32
+ *
33
+ * ## What it owns
34
+ *
35
+ * Every piece of persistent GPU state: the particle pool, the ping-pong alive lists, the dead
36
+ * free-list, the counters, both indirect-args buffers, the simulation-order (coherence) and
37
+ * render-order (sort) scratch, the emitter database (the emitter table and the GPU-owned state
38
+ * table, one buffer), the packed program buffer, and the spawn-command ring. Buffers that depend
39
+ * on the emitter set — the coherence scratch on the number of distinct programs, the program
40
+ * buffer on the arena, the database on its own pages — are grown inside {@link execute}, the way
41
+ * ReSTIR's reservoirs follow the resolution.
11
42
  *
12
- * Owns the persistent GPU state (particle pool, ping-pong alive lists, dead free-list, counters,
13
- * sort scratch, emitter/program/constant buffers, indirect args) and the CPU model (an
14
- * {@link EmitterRegistry}, a {@link ParticleSpawnScheduler} and bone attachments). Mirrors the
15
- * ReSTIR feature template: construct once, toggle with a flag, and contribute per-frame passes via
16
- * {@link encode}.
43
+ * Every pass stays within the eight storage buffers a stage gets by default: the emitter record
44
+ * and the GPU-owned state are two tables of one database buffer, and the VM's constants and code
45
+ * are one packed buffer.
17
46
  *
18
- * ## Frame sequence (encode)
47
+ * ## Emitters are scene nodes
19
48
  *
20
- * 1. reset counters (snapshot the previous alive count as this frame's simulate input, zero the new
21
- * alive count)
22
- * 2. emit run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
23
- * 3. simulate one dispatch runs every emitter's UPDATE over the coherence list built last frame,
24
- * compacting survivors into the new alive list and freed slots into the dead list
25
- * 4. bucket regroup the new alive list by VM program, padded to whole workgroups, into the list
26
- * NEXT frame's simulate consumes (`coherence/`)
27
- * 5. build indirect — derive next frame's simulate dispatch from the padded list length and this
28
- * frame's render draw instance count from the alive count
29
- * 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
30
- * 7. render — one instanced billboard draw over the sorted list
49
+ * There is no `addEmitter`. A {@link ParticleEmitter} is a {@link Node3D}: put it in the scene —
50
+ * on its own or under a joint — and the next {@link execute} finds it in the scene's node list,
51
+ * gives it a row in the emitter table pointed at the `transforms` row the scene context gave the
52
+ * node, and it starts spawning. Take it out of the scene and its row is retired and its particles
53
+ * freed. The sweep runs only when the scene's membership version moves, which is how per-frame
54
+ * upkeep stays proportional to what changed rather than to how many emitters there are.
31
55
  *
32
- * Steps 4 and 6 are two different orderings of the same particles and share nothing: the
33
- * simulation order is program-coherent and camera-independent, the render order is back-to-front
34
- * and changes with the camera. Separate buffers, separate passes, separate counter slots.
56
+ * ## Spawning is the GPU's decision
35
57
  *
36
- * The alive lists ping-pong by frame parity, exactly like the ReSTIR reservoirs.
58
+ * The CPU never counts particles or walks emitters per frame. The emitter tick pass integrates
59
+ * every emitter's rate on the GPU, and the emit dispatch is sized by a prefix scan of what it
60
+ * decided. The host's one way to ask for particles is {@link spawn}: a burst queued into a small
61
+ * command list that a pass adds to the emitter's pending spawns, on the same path as everything
62
+ * else. See `graph_particles.js` for the frame.
37
63
  *
38
- * ## CPU update
64
+ * ## Drawing
39
65
  *
40
- * {@link update} runs before encode: it patches bone-attached emitters' transforms from their scene
41
- * nodes and asks the scheduler for this frame's spawn requests (respecting cull/sleep). Keeping
42
- * spawn *counting* on the CPU (emitters are few) keeps the GPU emit pass a trivial one-thread-per-
43
- * particle kernel.
66
+ * {@link simulate} records everything that moves particles and leaves the alive list and the
67
+ * indirect draw args as graph handles. Two things draw them. Under the renderer the system is an
68
+ * `AVBOITSideChannel`: the transparency orchestrator asks it for its occupancy, its extinction and
69
+ * its draw at the three points where the transparent meshes have contributed theirs
70
+ * ({@link avboit_occupancy}, {@link avboit_splat}, {@link avboit_draw}), and the particles
71
+ * composite order-independently with them. A page without that pipeline calls {@link execute},
72
+ * which sorts and draws the billboards straight over a colour target.
73
+ *
74
+ * ## Allocation
75
+ *
76
+ * The per-frame path allocates the frame graph's records and nothing else: emitter rows are
77
+ * staged through one shared record, spawn commands go into a preallocated ring, and the
78
+ * per-dispatch settings are reused objects. A command context is opened only on frames that have
79
+ * something to upload.
44
80
  */
45
81
  export class GPUParticleSystem {
82
+
83
+ /**
84
+ * Engine GraphicsContext.
85
+ * @type {object}
86
+ */
87
+ graphics;
88
+
89
+ /**
90
+ * The scene whose nodes the emitters are, and whose database their world matrices come from.
91
+ * @type {import("../scene/GPUSceneContext.js").GPUSceneContext}
92
+ */
93
+ scene_context;
94
+
95
+ /**
96
+ * Maximum number of simultaneously live particles.
97
+ * @type {number}
98
+ */
99
+ capacity;
100
+
101
+ /**
102
+ * @type {EmitterRegistry}
103
+ */
104
+ registry;
105
+
106
+ /**
107
+ * Frames elapsed. Drives the alive-list ping-pong and the VM's frame builtin.
108
+ * @type {number}
109
+ */
110
+ frame = 0;
111
+
112
+ /**
113
+ * Seconds since start, the VM's `TIME` builtin. Advanced by `dt` each {@link execute}.
114
+ * @type {number}
115
+ */
116
+ time = 0;
117
+
118
+ /**
119
+ * Cap on how much missed time a culled emitter makes up for when it comes back into view.
120
+ * @type {number}
121
+ */
122
+ max_catchup_seconds = 1;
123
+
124
+ /**
125
+ * View-depth range the render sort quantises: particles nearer than `[0]` share the front bin,
126
+ * farther than `[1]` the back one.
127
+ * @type {Float32Array}
128
+ */
129
+ sort_depth_range = new Float32Array([0.1, 100]);
130
+
131
+ /**
132
+ * Sprite atlas the billboards sample, and the sampler they sample it with. A 1x1 white texel by
133
+ * default, so an emitter with no art draws as a plain quad rather than nothing.
134
+ * @type {GPUTextureView}
135
+ */
136
+ atlas;
137
+
138
+ /** @type {GPUSampler} */
139
+ atlas_sampler;
140
+
141
+ /**
142
+ * The persistent GPU buffers, by the names {@link graph_particles} binds them under. Exposed for
143
+ * inspection — a harness copying the counters out to display them — never for the frame loop,
144
+ * which reads nothing back. Entries that grow with the emitter set are replaced in place.
145
+ *
146
+ * @type {object}
147
+ */
148
+ buffers = {};
149
+
150
+ /**
151
+ * Distinct programs the coherence scratch is currently sized for.
152
+ * @type {number}
153
+ */
154
+ #sim_bucket_capacity = 0;
155
+
156
+ /**
157
+ * The spawn-command ring: `[row, count]` pairs, filled by {@link spawn}, merged and uploaded on
158
+ * the next {@link execute}.
159
+ * @type {Uint32Array}
160
+ */
161
+ #spawn_commands;
162
+
163
+ /**
164
+ * The emitter each ring entry was issued for, so an entry whose emitter has since left the
165
+ * scene — or whose row has gone to somebody else — is dropped at upload rather than delivered
166
+ * to the row's next tenant.
167
+ * @type {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
168
+ */
169
+ #spawn_command_emitters;
170
+
171
+ /** @type {number} */
172
+ #spawn_command_count = 0;
173
+
174
+ /**
175
+ * Scratch for merging the ring: pending count by row. Grown with the emitter table, never per
176
+ * frame.
177
+ * @type {Uint32Array}
178
+ */
179
+ #spawn_by_row = new Uint32Array(0);
180
+
181
+ /**
182
+ * Emitter node -> the sweep that last saw it in the scene.
183
+ * @type {Map<import("./runtime/ParticleEmitter.js").ParticleEmitter, number>}
184
+ */
185
+ #swept = new Map();
186
+
187
+ /** @type {number} */
188
+ #sweep = 0;
189
+
190
+ /**
191
+ * The 1x1 white texture {@link atlas} points at until a caller replaces it. Held so
192
+ * {@link destroy} can free it; a caller that assigns its own atlas owns that one.
193
+ * @type {GPUTexture|null}
194
+ */
195
+ #default_atlas = null;
196
+
197
+ /**
198
+ * The scene membership version the emitter set was last reconciled against.
199
+ * @type {number}
200
+ */
201
+ #instances_version = -1;
202
+
203
+ /** @type {object|null} */
204
+ #pipeline = null;
205
+
206
+ /** @type {string} */
207
+ #pipeline_key = "";
208
+
209
+ /**
210
+ * Per-frame scalars handed to {@link graph_particles}, reused rather than rebuilt.
211
+ * @type {object}
212
+ */
213
+ #frame = {
214
+ dt: 0, time: 0, index: 0, max_catchup: 1, spawn_command_count: 0, sort_near: 0.1, sort_far: 100,
215
+ };
216
+
217
+ /** @type {{capacity: number, group_count: number}} */
218
+ #emitters = { capacity: 0, group_count: 0 };
219
+
220
+ /**
221
+ * This frame's simulation, for the draw that follows it: the graph it was recorded into, the
222
+ * scene database handle it read, and the handles it produced. Reused, never reallocated.
223
+ * @type {{graph: object|null, scene_database: number, emitter_group_count: number, handles: object|null}}
224
+ */
225
+ #simulated = { graph: null, scene_database: -1, emitter_group_count: 0, handles: null };
226
+
227
+ /** @type {object} */
228
+ #render = {
229
+ atlas: null,
230
+ atlas_sampler: null,
231
+ obtain_pipeline: (color_format, depth_format) => this.#obtain_pipeline(color_format, depth_format),
232
+ };
233
+
46
234
  /**
47
235
  * @param {object} graphics engine GraphicsContext (has `.device`)
236
+ * @param {import("../scene/GPUSceneContext.js").GPUSceneContext} scene_context
48
237
  * @param {object} [options]
49
238
  * @param {number} [options.capacity] max simultaneous particles
239
+ * @param {number} [options.spawn_command_capacity] most {@link spawn} calls one frame keeps
50
240
  */
51
- constructor(graphics, { capacity = 1 << 16 } = {}) {
241
+ constructor(graphics, scene_context, { capacity = 1 << 16, spawn_command_capacity = 256 } = {}) {
52
242
  assert.defined(graphics, "graphics");
243
+ assert.defined(scene_context, "scene_context");
244
+ assert.equal(scene_context.isGPUSceneContext, true, "scene_context.isGPUSceneContext !== true");
53
245
  assert.isPositiveInteger(capacity, "capacity");
246
+ assert.isPositiveInteger(spawn_command_capacity, "spawn_command_capacity");
54
247
 
55
248
  this.graphics = graphics;
249
+ this.scene_context = scene_context;
56
250
  this.capacity = capacity;
57
251
 
58
- this.registry = new EmitterRegistry();
59
- this.scheduler = new ParticleSpawnScheduler();
252
+ this.registry = new EmitterRegistry(graphics.device);
60
253
 
61
- /** @type {Map<number, object>} emitter index -> scene Node3D */
62
- this.attachments = new Map();
254
+ this.#spawn_commands = new Uint32Array(spawn_command_capacity * PARTICLE_SPAWN_COMMAND_WORDS);
255
+ this.#spawn_command_emitters = new Array(spawn_command_capacity).fill(null);
63
256
 
64
- /** @type {number} */
65
- this.frame = 0;
257
+ this.#create_buffers();
258
+ this.#create_default_atlas();
259
+ }
66
260
 
67
- /** built lazily on first encode */
68
- this.buffers = undefined;
69
- /** CPU shadow of the packed emitter buffer (for in-place transform patching) */
70
- this.emitter_cpu = undefined;
71
- this.emitters_dirty = true;
72
- /**
73
- * Distinct compiled programs across the emitter set — the number of buckets the coherence
74
- * pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
75
- * is a safe upper bound (programs can be shared, never invented).
76
- * @type {number|undefined}
77
- */
78
- this.program_count = undefined;
261
+ /**
262
+ * The buffer the emitter table lives in — what every emitter-reading pass binds.
263
+ * @returns {GPUBuffer}
264
+ */
265
+ get emitter_database() {
266
+ return this.registry.database.buffer;
79
267
  }
80
268
 
81
269
  /**
82
- * Register an emitter.
83
- * @param {object} config see {@link EmitterRegistry#add}
84
- * @returns {number} emitter index
270
+ * The live emitters, in no particular order.
271
+ * @returns {import("./runtime/ParticleEmitter.js").ParticleEmitter[]}
85
272
  */
86
- addEmitter(config) {
87
- const index = this.registry.add(config);
88
- this.emitters_dirty = true;
89
- return index;
273
+ get emitters() {
274
+ return this.registry.emitters;
90
275
  }
91
276
 
92
277
  /**
93
- * Attach an emitter to a scene node (bone). Each frame the emitter's transform is copied from
94
- * `node.transform_global.matrix` so it follows the bone.
95
- * @param {number} emitter_index
96
- * @param {object} node a Node3D with `transform_global.matrix` (column-major 16)
278
+ * Number of simulation-order buckets one per distinct compiled program.
279
+ *
280
+ * This is the coherence pass's only host-provided number, and it is static topology rather than
281
+ * per-frame state: it changes when a new effect is registered, not as particles are born and
282
+ * die. Everything the pass measures per frame stays on the GPU.
283
+ *
284
+ * @returns {number}
97
285
  */
98
- attachToNode(emitter_index, node) {
99
- this.attachments.set(emitter_index, node);
286
+ bucketCount() {
287
+ return Math.max(1, this.registry.program_count);
100
288
  }
101
289
 
102
290
  /**
103
- * Per-frame CPU preparation. Returns the spawn requests for this frame.
291
+ * Index of the alive list this frame reads from / writes to (ping-pong by frame parity).
292
+ * @returns {number}
293
+ */
294
+ get alive_write_index() {
295
+ return 1 - (this.frame % 2);
296
+ }
297
+
298
+ /**
299
+ * Ask for `count` particles from an emitter, on top of its rate, on the next frame. Goes
300
+ * through the GPU path — the tick pass folds it into the emitter's accumulator, the budget and
301
+ * the culling apply — so it is a request, not a guarantee.
104
302
  *
105
- * @param {number} dt seconds
106
- * @param {object} [context]
107
- * @param {(emitterIndex: number) => boolean} [context.is_visible] cull predicate (sleep-culling)
108
- * @returns {Uint32Array} spawn requests (emitter index per particle to create)
109
- */
110
- update(dt, { is_visible } = {}) {
111
- // Bone attachment: patch attached emitters' transforms from their scene nodes.
112
- if (this.emitter_cpu !== undefined && this.attachments.size > 0) {
113
- const f32 = new Float32Array(this.emitter_cpu.buffer);
114
- for (const [index, node] of this.attachments) {
115
- const matrix = node?.transform_global?.matrix;
116
- if (matrix !== undefined) {
117
- write_emitter_transform(f32, index, matrix);
118
- }
119
- }
303
+ * @param {import("./runtime/ParticleEmitter.js").ParticleEmitter} emitter a registered emitter
304
+ * @param {number} count
305
+ */
306
+ spawn(emitter, count) {
307
+ assert.defined(emitter, "emitter");
308
+ assert.notEqual(emitter.row, -1, "emitter is not in the scene");
309
+ assert.isNonNegativeInteger(count, "count");
310
+
311
+ const ring = this.#spawn_commands;
312
+ const base = this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS;
313
+
314
+ if (base >= ring.length) {
315
+ // the text is the key warn_limited counts on, so it carries no burst size: one message
316
+ // per ring size, not one per number a caller happens to ask for
317
+ warn_limited(`GPUParticleSystem: spawn command ring is full (${ring.length / PARTICLE_SPAWN_COMMAND_WORDS} per frame); dropping this frame's remaining bursts`);
318
+ return;
120
319
  }
121
320
 
122
- const requests = this.scheduler.tick(this.registry.emitters, dt, is_visible, this.capacity);
321
+ ring[base] = emitter.row;
322
+ ring[base + 1] = count;
323
+ this.#spawn_command_emitters[this.#spawn_command_count] = emitter;
324
+ this.#spawn_command_count++;
325
+ }
326
+
327
+ /**
328
+ * The simulation half of the frame: reconcile the emitter set with the scene, push what changed
329
+ * to the GPU, and record every pass that moves particles — through to the indirect draw args.
330
+ * What it leaves as graph handles is what a draw consumes: {@link execute} draws them
331
+ * standalone, and the AVBOIT side-channel methods below draw them through the renderer's
332
+ * transparency pipeline.
333
+ *
334
+ * Call after the scene context has built for the frame (`GPUSceneContext#update`), so every
335
+ * emitter node has its `transforms` row, and after the hierarchy pass has run, so the rows'
336
+ * `global` matrices are this frame's.
337
+ *
338
+ * **Once per frame, not once per view.** This advances the simulation by `dt` and hands out
339
+ * handles into the graph it recorded into; a second view of the same scene records a second
340
+ * graph and would step the simulation twice. The renderer has one view per `render` call today,
341
+ * so this holds by construction; a second view of one scene needs the step and the handles
342
+ * separated — record the passes for the first graph, import the same buffers into the rest.
343
+ *
344
+ * @param {object} params
345
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
346
+ * @param {number} params.camera graph handle of the camera uniform buffer
347
+ * @param {number} params.scene_database graph handle of the scene database — the one the
348
+ * hierarchy pass returned, so this reads the matrices it composed
349
+ * @param {number} params.dt seconds since the previous frame
350
+ * @returns {import("./graph_particles.js").ParticleSimulationHandles}
351
+ */
352
+ simulate({ graph, camera, scene_database, dt }) {
353
+ assert.defined(graph, "graph");
354
+ assert.isNumber(dt, "dt");
355
+
356
+ this.#sync_membership();
357
+ this.#upload();
358
+
359
+ const frame = this.#frame;
360
+ frame.dt = dt;
361
+ frame.time = this.time;
362
+ frame.index = this.frame;
363
+ frame.max_catchup = this.max_catchup_seconds;
364
+ frame.spawn_command_count = this.#spawn_command_count;
365
+ frame.sort_near = this.sort_depth_range[0];
366
+ frame.sort_far = this.sort_depth_range[1];
367
+
368
+ const table = this.registry.table;
369
+ const emitters = this.#emitters;
370
+ emitters.capacity = table.element_capacity;
371
+ emitters.group_count = table.dispatch_group_count(PARTICLE_EMITTER_TICK_WORKGROUP_SIZE);
372
+
373
+ const buffers = this.buffers;
374
+ buffers.alive_write = buffers.alive[this.alive_write_index];
375
+ // The table's database owns and grows its own buffer; it is re-read every frame for that
376
+ // reason.
377
+ buffers.emitter_database = this.registry.database.buffer;
378
+
379
+ const simulated = graph_particles_simulate({
380
+ graph,
381
+ camera,
382
+ scene_database,
383
+ gpu: buffers,
384
+ emitters,
385
+ capacity: this.capacity,
386
+ bucket_count: this.bucketCount(),
387
+ frame,
388
+ });
389
+
390
+ // Kept for the draw that follows, whichever it is, and for nothing past this frame.
391
+ const current = this.#simulated;
392
+ current.graph = graph;
393
+ current.scene_database = scene_database;
394
+ current.emitter_group_count = emitters.group_count;
395
+ current.handles = simulated;
396
+
397
+ // Consumed: the count was recorded into the graph, the words were uploaded.
398
+ this.#spawn_command_count = 0;
399
+
123
400
  this.frame++;
124
- return requests;
401
+ this.time += dt;
402
+
403
+ return simulated;
125
404
  }
126
405
 
127
406
  /**
128
- * Rebuild the packed emitter/program/constant buffers when the emitter set changes.
129
- * @returns {{emitters: Uint32Array, program: Uint32Array, constants: Uint32Array}}
407
+ * The whole standalone frame: {@link simulate}, then the depth sort and one billboard draw over
408
+ * a colour target with fixed-function blending. For a page without the renderer's transparency
409
+ * pipeline; under the renderer the drawing is AVBOIT's.
410
+ *
411
+ * @param {object} params every parameter of {@link simulate}, plus a target to draw over
412
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
413
+ * @param {number} params.camera graph handle of the camera uniform buffer
414
+ * @param {number} params.scene_database graph handle of the scene database
415
+ * @param {number} params.dt seconds since the previous frame
416
+ * @param {number} params.color graph handle of the colour target to draw over
417
+ * @param {number} params.depth graph handle of the scene depth (tested, never written)
418
+ * @returns {number} the colour handle after the particle draw
130
419
  */
131
- buildEmitterData() {
132
- const built = this.registry.build();
133
- this.emitter_cpu = built.emitters;
134
- this.program_count = built.program_count;
135
- this.emitters_dirty = false;
136
- return built;
420
+ execute({ graph, camera, scene_database, color, depth, dt }) {
421
+ const simulated = this.simulate({ graph, camera, scene_database, dt });
422
+
423
+ const render = this.#render;
424
+ render.atlas = this.atlas;
425
+ render.atlas_sampler = this.atlas_sampler;
426
+
427
+ return graph_particles_render({
428
+ graph,
429
+ camera,
430
+ color,
431
+ depth,
432
+ gpu: this.buffers,
433
+ simulated,
434
+ sort_bucket_count: PARTICLE_SORT_BUCKET_COUNT,
435
+ frame: this.#frame,
436
+ render,
437
+ });
137
438
  }
138
439
 
139
440
  /**
140
- * Number of simulation-order buckets one per distinct compiled program.
441
+ * What this frame's {@link simulate} left, checked against the graph a side-channel call names:
442
+ * the AVBOIT orchestrator records its passes into the same graph, later in the same frame.
141
443
  *
142
- * This is the coherence pass's only host-provided number, and it is static topology rather than
143
- * per-frame state: it changes when the emitter set changes, not as particles are born and die.
144
- * Everything the pass measures per frame stays on the GPU.
444
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} graph
445
+ * @returns {{graph: object, scene_database: number, emitter_group_count: number, handles: import("./graph_particles.js").ParticleSimulationHandles}}
446
+ */
447
+ #simulated_for(graph) {
448
+ const current = this.#simulated;
449
+
450
+ assert.equal(current.graph, graph, "the particles were not simulated into this graph this frame — call simulate() before the transparency pipeline records");
451
+
452
+ return current;
453
+ }
454
+
455
+ /**
456
+ * `AVBOITSideChannel#avboit_occupancy`: the emitters' bounds spheres, as depth slices.
145
457
  *
146
- * @returns {number}
458
+ * @param {object} args see `AVBOITSideChannel`
459
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
460
+ * @param {number} args.camera graph handle of the camera uniform buffer
461
+ * @param {ArrayLike<number>} args.cluster_parameters the frame's depth curve
462
+ * @param {number} args.occupancy graph handle of the occupancy bits
463
+ * @returns {number} the occupancy handle after the write
147
464
  */
148
- bucketCount() {
149
- return Math.max(1, this.program_count ?? this.registry.count);
465
+ avboit_occupancy({ graph, camera, cluster_parameters, occupancy }) {
466
+ const current = this.#simulated_for(graph);
467
+
468
+ return graph_particle_avboit_occupancy({
469
+ graph,
470
+ camera,
471
+ cluster_parameters,
472
+ occupancy,
473
+ scene_database: current.scene_database,
474
+ emitter_database: current.handles.emitter_database,
475
+ emitter_group_count: current.emitter_group_count,
476
+ });
150
477
  }
151
478
 
152
479
  /**
153
- * Sizes of the persistent buffers, in bytes. Exposed for tests and allocation.
154
- * @returns {object}
480
+ * `AVBOITSideChannel#avboit_splat`: the live particles' extinction, into the volume.
481
+ *
482
+ * @param {object} args see `AVBOITSideChannel`
483
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
484
+ * @param {number} args.camera graph handle of the camera uniform buffer
485
+ * @param {number} args.warp graph handle of the warp LUT
486
+ * @param {number} args.depth_texture graph handle of the scene depth
487
+ * @param {{extinction: number, overflow: number, dummy: number}} args.volume the voxel volume
488
+ * @returns {{extinction: number, overflow: number, dummy: number}} the volume after the write
155
489
  */
156
- bufferSizes() {
157
- const u32 = 4;
158
- const buckets = this.bucketCount();
159
-
160
- return {
161
- pool: this.capacity * PARTICLE_RECORD_WORD_COUNT * u32,
162
- alive_list: this.capacity * u32,
163
- dead_list: this.capacity * u32,
164
- counters: PARTICLE_COUNTER_COUNT * u32,
165
- // render order (sort/)
166
- sorted: this.capacity * u32,
167
- keys: this.capacity * u32,
168
- emitter_record: EMITTER_STRIDE * u32,
169
-
170
- // simulation order (coherence/) — a separate set of buffers on purpose; sharing any of
171
- // them with the render order would couple a camera-driven ordering to a program-driven
172
- // one.
173
- //
174
- // Padding rounds each bucket up to a whole workgroup, so it can add at most
175
- // `workgroup - 1` entries per bucket; one whole workgroup per bucket is the bound.
176
- sim_list: (this.capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * u32,
177
- sim_keys: this.capacity * u32,
178
- // `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
179
- // rounded up to a multiple of four.
180
- sim_histogram: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(buckets)) * u32,
181
- sim_bucket_counts: buckets * u32,
182
- sim_cursor: buckets * u32,
183
- sim_dispatch_args: 3 * u32,
184
- };
185
- }
186
-
187
- /**
188
- * The initial dead-list contents (all slots free) and counter values for a fresh pool.
189
- * @returns {{dead: Uint32Array, counters: Uint32Array}}
190
- */
191
- initialFreeList() {
192
- const dead = new Uint32Array(this.capacity);
193
- for (let i = 0; i < this.capacity; i++) {
490
+ avboit_splat({ graph, camera, warp, depth_texture, volume }) {
491
+ const { handles } = this.#simulated_for(graph);
492
+
493
+ return graph_particle_avboit_splat({
494
+ graph,
495
+ camera,
496
+ warp,
497
+ depth_texture,
498
+ volume,
499
+ atlas: this.atlas,
500
+ atlas_sampler: this.atlas_sampler,
501
+ pool: handles.pool,
502
+ alive: handles.alive,
503
+ emitter_database: handles.emitter_database,
504
+ draw_args: handles.draw_args,
505
+ });
506
+ }
507
+
508
+ /**
509
+ * `AVBOITSideChannel#avboit_draw`: the live particles, into the accumulators.
510
+ *
511
+ * @param {object} args see `AVBOITSideChannel`
512
+ * @param {import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} args.graph
513
+ * @param {import("../view/GPUViewContext.js").GPUViewContext} args.view_ctx
514
+ * @param {number} args.camera graph handle of the camera uniform buffer
515
+ * @param {number} args.depth_texture graph handle of the scene depth
516
+ * @param {number} args.warp graph handle of the warp LUT
517
+ * @param {number} args.integral graph handle of the integral texture
518
+ * @param {number} args.volumetrics_lut graph handle
519
+ * @param {number} args.volumetrics_metadata graph handle
520
+ * @param {{color: number, norm: number, extinction: number, emission: number}} args.accumulators
521
+ * @returns {{color: number, norm: number, extinction: number, emission: number}} after the draw
522
+ */
523
+ avboit_draw({ graph, view_ctx, camera, depth_texture, warp, integral, volumetrics_lut, volumetrics_metadata, accumulators }) {
524
+ const { handles } = this.#simulated_for(graph);
525
+
526
+ return graph_particle_avboit_draw({
527
+ graph,
528
+ view_ctx,
529
+ camera,
530
+ depth_texture,
531
+ warp,
532
+ integral,
533
+ volumetrics_lut,
534
+ volumetrics_metadata,
535
+ accumulators,
536
+ atlas: this.atlas,
537
+ atlas_sampler: this.atlas_sampler,
538
+ pool: handles.pool,
539
+ alive: handles.alive,
540
+ emitter_database: handles.emitter_database,
541
+ draw_args: handles.draw_args,
542
+ });
543
+ }
544
+
545
+ /**
546
+ * Bring the emitter set in line with the scene: emitter nodes that arrived get rows, nodes that
547
+ * left give theirs back. Runs only when the scene's membership version has moved.
548
+ *
549
+ * A node the scene context has not placed yet (no `transforms` row) is left for the next frame,
550
+ * and the version is not recorded, so the sweep runs again until every emitter is bound.
551
+ */
552
+ #sync_membership() {
553
+ const scene = this.scene_context.scene;
554
+ const batch = scene.instances;
555
+
556
+ if (batch.version === this.#instances_version) {
557
+ return;
558
+ }
559
+
560
+ const sweep = ++this.#sweep;
561
+ const nodes = batch.nodes;
562
+ const node_count = nodes.length;
563
+ const mapping = this.scene_context.id_mapping;
564
+ const registry = this.registry;
565
+ const swept = this.#swept;
566
+
567
+ let complete = true;
568
+
569
+ for (let i = 0; i < node_count; i++) {
570
+ const node = nodes[i];
571
+
572
+ if (node.isParticleEmitter !== true) {
573
+ continue;
574
+ }
575
+
576
+ const transform_row = mapping.get(node.id);
577
+
578
+ if (transform_row === undefined) {
579
+ complete = false;
580
+ continue;
581
+ }
582
+
583
+ if (node.row === -1) {
584
+ registry.add(node, transform_row);
585
+ } else {
586
+ registry.set_transform_row(node, transform_row);
587
+ }
588
+
589
+ swept.set(node, sweep);
590
+ }
591
+
592
+ for (const [emitter, seen] of swept) {
593
+ if (seen !== sweep) {
594
+ registry.remove(emitter);
595
+ swept.delete(emitter);
596
+ }
597
+ }
598
+
599
+ if (complete) {
600
+ this.#instances_version = batch.version;
601
+ }
602
+ }
603
+
604
+ /**
605
+ * Push everything the CPU changed to the GPU: dirty emitter rows, the state buffer's growth,
606
+ * rebuilt program buffers, the spawn-command ring, and the coherence scratch's growth. A
607
+ * command context is opened only if something needs one.
608
+ */
609
+ #upload() {
610
+ const registry = this.registry;
611
+ const device = this.graphics.device;
612
+
613
+ registry.flush();
614
+
615
+ // Both tables stage into the one database: the emitter rows the author changed, and the
616
+ // state rows claimed or released with them.
617
+ const rows_staged = registry.table.element_upload_buffer.position > 0
618
+ || registry.state_table.element_upload_buffer.position > 0;
619
+
620
+ if (rows_staged) {
621
+ const cmd = ShadeGPUCommandContext.create(this.graphics, "particles/upload");
622
+
623
+ registry.database.update(cmd);
624
+
625
+ cmd.finish();
626
+ }
627
+
628
+ if (registry.programs_dirty) {
629
+ this.buffers.program = replace_data_buffer(device, this.buffers.program, "particles/program", registry.build_program());
630
+ }
631
+
632
+ this.#merge_spawn_commands();
633
+
634
+ if (this.#spawn_command_count > 0) {
635
+ device.queue.writeBuffer(
636
+ this.buffers.spawn_commands, 0,
637
+ this.#spawn_commands.buffer, 0,
638
+ this.#spawn_command_count * PARTICLE_SPAWN_COMMAND_WORDS * WORD,
639
+ );
640
+ }
641
+
642
+ this.#ensure_sim_buffers(this.bucketCount());
643
+ }
644
+
645
+ /**
646
+ * Fold the ring down to one entry per row, dropping entries whose emitter no longer holds the
647
+ * row it was issued against.
648
+ *
649
+ * The spawn-command pass adds to a state row with a plain read-modify-write, so two entries
650
+ * naming one row would lose one; and a burst issued to an emitter that left the scene this
651
+ * frame must not land on the row's next tenant. Both are settled here, in place, over a few
652
+ * dozen entries at most.
653
+ */
654
+ #merge_spawn_commands() {
655
+ const count = this.#spawn_command_count;
656
+
657
+ if (count === 0) {
658
+ return;
659
+ }
660
+
661
+ const ring = this.#spawn_commands;
662
+ const emitters = this.#spawn_command_emitters;
663
+
664
+ let rows = this.#spawn_by_row;
665
+ const needed = Math.max(1, this.registry.table.element_capacity);
666
+
667
+ if (rows.length < needed) {
668
+ rows = new Uint32Array(needed);
669
+ this.#spawn_by_row = rows;
670
+ }
671
+
672
+ for (let i = 0; i < count; i++) {
673
+ const emitter = emitters[i];
674
+ const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
675
+
676
+ if (emitter.row === row) {
677
+ rows[row] += ring[i * PARTICLE_SPAWN_COMMAND_WORDS + 1];
678
+ }
679
+
680
+ emitters[i] = null;
681
+ }
682
+
683
+ let merged = 0;
684
+
685
+ for (let i = 0; i < count; i++) {
686
+ const row = ring[i * PARTICLE_SPAWN_COMMAND_WORDS];
687
+ const pending = rows[row];
688
+
689
+ if (pending === 0) {
690
+ continue;
691
+ }
692
+
693
+ ring[merged * PARTICLE_SPAWN_COMMAND_WORDS] = row;
694
+ ring[merged * PARTICLE_SPAWN_COMMAND_WORDS + 1] = pending;
695
+ rows[row] = 0;
696
+ merged++;
697
+ }
698
+
699
+ this.#spawn_command_count = merged;
700
+ }
701
+
702
+ /**
703
+ * The simulation-order scratch is sized from the number of distinct programs, which only ever
704
+ * grows (programs are never reclaimed, see {@link EmitterRegistry}). Reallocated when it does;
705
+ * nothing in these buffers outlives a frame, so nothing is copied.
706
+ *
707
+ * @param {number} buckets
708
+ */
709
+ #ensure_sim_buffers(buckets) {
710
+ if (buckets <= this.#sim_bucket_capacity) {
711
+ return;
712
+ }
713
+
714
+ const device = this.graphics.device;
715
+ const buffers = this.buffers;
716
+ const capacity = this.capacity;
717
+
718
+ for (const name of ["sim_list", "sim_keys", "sim_histogram", "sim_bucket_counts", "sim_cursor"]) {
719
+ buffers[name]?.destroy();
720
+ }
721
+
722
+ // Padding rounds each bucket up to a whole workgroup, so it can add at most `workgroup - 1`
723
+ // entries per bucket; one whole workgroup per bucket is the bound.
724
+ buffers.sim_list = device.createBuffer({ label: "particles/sim_list", size: (capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * WORD, usage: STORAGE });
725
+ buffers.sim_keys = device.createBuffer({ label: "particles/sim_keys", size: capacity * WORD, usage: STORAGE });
726
+ // `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
727
+ // rounded up to a multiple of four.
728
+ buffers.sim_histogram = device.createBuffer({ label: "particles/sim_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(buckets)) * WORD, usage: STORAGE });
729
+ buffers.sim_bucket_counts = device.createBuffer({ label: "particles/sim_bucket_counts", size: buckets * WORD, usage: STORAGE });
730
+ buffers.sim_cursor = device.createBuffer({ label: "particles/sim_cursor", size: buckets * WORD, usage: STORAGE });
731
+
732
+ this.#sim_bucket_capacity = buckets;
733
+ }
734
+
735
+ /**
736
+ * The buffers whose size is fixed by the pool capacity, and the free list's initial contents.
737
+ */
738
+ #create_buffers() {
739
+ const device = this.graphics.device;
740
+ const capacity = this.capacity;
741
+ const buffers = this.buffers;
742
+
743
+ buffers.pool = device.createBuffer({ label: "particles/pool", size: capacity * PARTICLE_RECORD_WORD_COUNT * WORD, usage: STORAGE });
744
+ buffers.alive = [
745
+ device.createBuffer({ label: "particles/alive_a", size: capacity * WORD, usage: STORAGE }),
746
+ device.createBuffer({ label: "particles/alive_b", size: capacity * WORD, usage: STORAGE }),
747
+ ];
748
+ buffers.dead = device.createBuffer({ label: "particles/dead", size: capacity * WORD, usage: STORAGE });
749
+ buffers.counters = device.createBuffer({ label: "particles/counters", size: PARTICLE_COUNTER_COUNT * WORD, usage: STORAGE });
750
+
751
+ // Indirect args, written on-GPU. Zero-initialised (WebGPU spec), so the first frame's
752
+ // indirect dispatch/draw are no-ops until the first build-indirect has run.
753
+ buffers.dispatch_args = device.createBuffer({ label: "particles/dispatch_args", size: 3 * WORD, usage: INDIRECT });
754
+ buffers.draw_args = device.createBuffer({ label: "particles/draw_args", size: 4 * WORD, usage: INDIRECT });
755
+ buffers.sim_dispatch_args = device.createBuffer({ label: "particles/sim_dispatch_args", size: 3 * WORD, usage: INDIRECT });
756
+
757
+ // Render order.
758
+ buffers.sorted = device.createBuffer({ label: "particles/sorted", size: capacity * WORD, usage: STORAGE });
759
+ buffers.sort_keys = device.createBuffer({ label: "particles/sort_keys", size: capacity * WORD, usage: STORAGE });
760
+ buffers.sort_histogram = device.createBuffer({ label: "particles/sort_histogram", size: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + align_4(PARTICLE_SORT_BUCKET_COUNT)) * WORD, usage: STORAGE });
761
+ buffers.sort_cursor = device.createBuffer({ label: "particles/sort_cursor", size: PARTICLE_SORT_BUCKET_COUNT * WORD, usage: STORAGE });
762
+
763
+ buffers.spawn_commands = device.createBuffer({ label: "particles/spawn_commands", size: this.#spawn_commands.byteLength, usage: STORAGE });
764
+
765
+ // Every slot free, and the counters saying so.
766
+ const dead = new Uint32Array(capacity);
767
+ for (let i = 0; i < capacity; i++) {
194
768
  dead[i] = i;
195
769
  }
196
770
  const counters = new Uint32Array(PARTICLE_COUNTER_COUNT);
197
- counters[PARTICLE_COUNTER.DEAD] = this.capacity;
198
- return { dead, counters };
771
+ counters[PARTICLE_COUNTER.DEAD] = capacity;
772
+
773
+ device.queue.writeBuffer(buffers.dead, 0, dead);
774
+ device.queue.writeBuffer(buffers.counters, 0, counters);
199
775
  }
200
776
 
201
777
  /**
202
- * Index of the alive list this frame reads from / writes to (ping-pong by frame parity).
203
- * @returns {{read: number, write: number}}
778
+ * A 1x1 white atlas and a linear sampler, so the system draws before anyone hands it art.
204
779
  */
205
- aliveListIndices() {
206
- const read = this.frame % 2;
207
- return { read, write: 1 - read };
780
+ #create_default_atlas() {
781
+ const device = this.graphics.device;
782
+
783
+ const texture = device.createTexture({
784
+ label: "particles/default_atlas",
785
+ size: [1, 1],
786
+ format: "rgba8unorm",
787
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,
788
+ });
789
+
790
+ device.queue.writeTexture({ texture }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
791
+
792
+ // kept, not just viewed: a texture nothing holds is a texture nothing can free
793
+ this.#default_atlas = texture;
794
+ this.atlas = texture.createView();
795
+ this.atlas_sampler = device.createSampler({
796
+ label: "particles/atlas_sampler",
797
+ magFilter: "linear",
798
+ minFilter: "linear",
799
+ addressModeU: "clamp-to-edge",
800
+ addressModeV: "clamp-to-edge",
801
+ });
802
+ }
803
+
804
+ /**
805
+ * @param {string} color_format
806
+ * @param {string} depth_format
807
+ * @returns {object} the billboard pipeline descriptor for these attachment formats
808
+ */
809
+ #obtain_pipeline(color_format, depth_format) {
810
+ const key = `${color_format}/${depth_format}`;
811
+
812
+ if (this.#pipeline === null || this.#pipeline_key !== key) {
813
+ this.#pipeline = create_particle_billboard_pipeline({
814
+ color_format,
815
+ depth_format,
816
+ // reverse-Z, the engine convention
817
+ depth_compare: "greater",
818
+ });
819
+ this.#pipeline_key = key;
820
+ }
821
+
822
+ return this.#pipeline;
823
+ }
824
+
825
+ /**
826
+ * Sizes of the persistent buffers, in bytes, as they stand. Exposed for tests.
827
+ * @returns {Object<string, number>}
828
+ */
829
+ bufferSizes() {
830
+ const sizes = {};
831
+
832
+ for (const [name, buffer] of Object.entries(this.buffers)) {
833
+ if (Array.isArray(buffer)) {
834
+ sizes[name] = buffer[0].size;
835
+ } else if (buffer !== undefined && buffer !== null) {
836
+ sizes[name] = buffer.size;
837
+ }
838
+ }
839
+
840
+ return sizes;
841
+ }
842
+
843
+ destroy() {
844
+ /*
845
+ The emitters go first, and they matter more than the buffers: they are the scene's nodes,
846
+ they outlive this system, and each is holding a row of the table about to be freed. A node
847
+ left holding one is stranded — the next system's membership sweep reads `row !== -1` as
848
+ "already mine", takes the moved branch rather than the arrived one, and never registers it.
849
+ Retiring them here puts every emitter back where it was before this system saw it.
850
+ */
851
+ for (const emitter of this.registry.emitters.slice()) {
852
+ this.registry.remove(emitter);
853
+ }
854
+ this.#swept.clear();
855
+ this.#instances_version = -1;
856
+
857
+ for (const buffer of Object.values(this.buffers)) {
858
+ if (Array.isArray(buffer)) {
859
+ buffer.forEach((b) => b.destroy());
860
+ } else if (buffer !== undefined && buffer !== null) {
861
+ buffer.destroy();
862
+ }
863
+ }
864
+
865
+ this.buffers = {};
866
+ this.registry.database.destroy();
867
+
868
+ // the default atlas is this system's own; a page that replaced it owns what it put there
869
+ this.#default_atlas?.destroy();
870
+ this.#default_atlas = null;
208
871
  }
209
872
  }
210
873
 
211
874
  /**
212
- * @param {number} value
213
- * @returns {number} `value` rounded up to a multiple of four
875
+ * A storage buffer holding `data`, replacing `previous` (destroyed) if it exists. The program
876
+ * buffer is monolithic a program is variable-length, so there is no table to page it into — and
877
+ * is rebuilt whole on the rare frame the arena grows.
878
+ *
879
+ * @param {GPUDevice} device
880
+ * @param {GPUBuffer|undefined} previous
881
+ * @param {string} label
882
+ * @param {Uint32Array} data
883
+ * @returns {GPUBuffer}
214
884
  */
215
- function round_up_4(value) {
216
- return (value + 3) & ~3;
885
+ function replace_data_buffer(device, previous, label, data) {
886
+ previous?.destroy();
887
+
888
+ const buffer = device.createBuffer({ label, size: Math.max(WORD, data.byteLength), usage: STORAGE });
889
+
890
+ device.queue.writeBuffer(buffer, 0, data);
891
+
892
+ return buffer;
217
893
  }