@woosh/meep-engine 3.14.5 → 3.14.6

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 (636) hide show
  1. package/README.md +6 -0
  2. package/editor/Editor.d.ts +162 -0
  3. package/editor/Editor.d.ts.map +1 -0
  4. package/editor/EditorCameraNavigation.d.ts +22 -0
  5. package/editor/EditorCameraNavigation.d.ts.map +1 -0
  6. package/editor/EditorKeyMap.d.ts +28 -0
  7. package/editor/EditorKeyMap.d.ts.map +1 -0
  8. package/editor/SelectionVisualizer.d.ts +37 -0
  9. package/editor/SelectionVisualizer.d.ts.map +1 -0
  10. package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
  11. package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
  12. package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
  13. package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
  14. package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
  15. package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
  16. package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
  17. package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
  18. package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
  19. package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
  20. package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
  21. package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
  22. package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
  23. package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
  24. package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
  25. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
  26. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
  27. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
  28. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
  29. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
  30. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
  31. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
  32. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
  33. package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
  34. package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
  35. package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
  36. package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
  37. package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
  38. package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
  39. package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
  40. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
  41. package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
  42. package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
  43. package/editor/camera/camera_framing.d.ts +33 -0
  44. package/editor/camera/camera_framing.d.ts.map +1 -0
  45. package/editor/clipboard.d.ts +19 -0
  46. package/editor/clipboard.d.ts.map +1 -0
  47. package/editor/ecs/EditorEntity.d.ts +16 -0
  48. package/editor/ecs/EditorEntity.d.ts.map +1 -0
  49. package/editor/ecs/EditorEntitySystem.d.ts +8 -0
  50. package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
  51. package/editor/ecs/component/TypeEditor.d.ts +7 -1
  52. package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
  53. package/editor/ecs/component/TypeEditor.js +5 -0
  54. package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
  55. package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
  56. package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
  57. package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
  58. package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
  59. package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
  60. package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
  61. package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
  62. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
  63. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
  64. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
  65. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
  66. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
  67. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
  68. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
  69. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
  70. package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
  71. package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
  72. package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
  73. package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
  74. package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
  75. package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
  76. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
  77. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
  78. package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
  79. package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
  80. package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
  81. package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
  82. package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
  83. package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
  84. package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
  85. package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
  86. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
  87. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
  88. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
  89. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
  90. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
  91. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
  92. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
  93. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
  94. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
  95. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
  96. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
  97. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
  98. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
  99. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
  100. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
  101. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
  102. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
  103. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
  104. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
  105. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
  106. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
  107. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
  108. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
  109. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
  110. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
  111. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
  112. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
  113. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
  114. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
  115. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
  116. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
  117. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
  118. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
  119. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
  120. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
  121. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
  122. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
  123. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
  124. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
  125. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
  126. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
  127. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
  128. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
  129. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
  130. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
  131. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
  132. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
  133. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
  134. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
  135. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
  136. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
  137. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
  138. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
  139. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
  140. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
  142. package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
  144. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
  145. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
  146. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
  147. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
  148. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
  149. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
  150. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
  151. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
  152. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
  153. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
  154. package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
  155. package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
  156. package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
  157. package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
  158. package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
  159. package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
  160. package/editor/enableEditor.d.ts +14 -0
  161. package/editor/enableEditor.d.ts.map +1 -0
  162. package/editor/entity_world_bounds.d.ts +17 -0
  163. package/editor/entity_world_bounds.d.ts.map +1 -0
  164. package/editor/library/MeshLibrary.d.ts +13 -0
  165. package/editor/library/MeshLibrary.d.ts.map +1 -0
  166. package/editor/particles/lut_ops.d.ts +34 -0
  167. package/editor/particles/lut_ops.d.ts.map +1 -0
  168. package/editor/particles/particleEditEvents.d.ts +11 -0
  169. package/editor/particles/particleEditEvents.d.ts.map +1 -0
  170. package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
  171. package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
  172. package/editor/persistence/EditorLayoutStore.d.ts +30 -0
  173. package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
  174. package/editor/persistence/SceneMetadata.d.ts +38 -0
  175. package/editor/persistence/SceneMetadata.d.ts.map +1 -0
  176. package/editor/persistence/SceneSlotManager.d.ts +40 -0
  177. package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
  178. package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
  179. package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
  180. package/editor/persistence/files.d.ts +24 -0
  181. package/editor/persistence/files.d.ts.map +1 -0
  182. package/editor/persistence/scene_import.d.ts +45 -0
  183. package/editor/persistence/scene_import.d.ts.map +1 -0
  184. package/editor/persistence/scene_serialization.d.ts +36 -0
  185. package/editor/persistence/scene_serialization.d.ts.map +1 -0
  186. package/editor/persistence/string_buffer_codec.d.ts +20 -0
  187. package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
  188. package/editor/process/DisableGameUIProcess.d.ts +8 -0
  189. package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
  190. package/editor/process/EditorProcess.d.ts +19 -0
  191. package/editor/process/EditorProcess.d.ts.map +1 -0
  192. package/editor/process/GridDisplayProcess.d.ts +35 -0
  193. package/editor/process/GridDisplayProcess.d.ts.map +1 -0
  194. package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
  195. package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
  196. package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
  197. package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
  198. package/editor/process/ProcessEngine.d.ts +30 -0
  199. package/editor/process/ProcessEngine.d.ts.map +1 -0
  200. package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
  201. package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
  202. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
  203. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
  204. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
  205. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
  206. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
  207. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
  208. package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
  209. package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
  210. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
  211. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
  212. package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
  213. package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
  214. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
  215. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
  216. package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
  217. package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
  218. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
  219. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
  220. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
  221. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
  222. package/editor/prototypeEditorShell.d.ts +13 -0
  223. package/editor/prototypeEditorShell.d.ts.map +1 -0
  224. package/editor/selection/editor_pick.d.ts +43 -0
  225. package/editor/selection/editor_pick.d.ts.map +1 -0
  226. package/editor/selection/screen_rect_frustum.d.ts +32 -0
  227. package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
  228. package/editor/templates/entity_templates.d.ts +19 -0
  229. package/editor/templates/entity_templates.d.ts.map +1 -0
  230. package/editor/tools/GridPaintTool.d.ts +18 -0
  231. package/editor/tools/GridPaintTool.d.ts.map +1 -0
  232. package/editor/tools/SelectionTool.d.ts +38 -0
  233. package/editor/tools/SelectionTool.d.ts.map +1 -0
  234. package/editor/tools/SelectionTool.js +2 -2
  235. package/editor/tools/TransformToolV2.d.ts +70 -0
  236. package/editor/tools/TransformToolV2.d.ts.map +1 -0
  237. package/editor/tools/engine/Tool.d.ts +88 -0
  238. package/editor/tools/engine/Tool.d.ts.map +1 -0
  239. package/editor/tools/engine/ToolEngine.d.ts +22 -0
  240. package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
  241. package/editor/tools/engine/ToolState.d.ts +7 -0
  242. package/editor/tools/engine/ToolState.d.ts.map +1 -0
  243. package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
  244. package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
  245. package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
  246. package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
  247. package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
  248. package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
  249. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
  250. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
  251. package/editor/tools/v2/GizmoNode.d.ts +21 -0
  252. package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
  253. package/editor/tools/v2/TransformControls.d.ts +219 -0
  254. package/editor/tools/v2/TransformControls.d.ts.map +1 -0
  255. package/editor/tools/v2/TransformMode.d.ts +7 -0
  256. package/editor/tools/v2/TransformMode.d.ts.map +1 -0
  257. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
  258. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
  259. package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
  260. package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
  261. package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
  262. package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
  263. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
  264. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
  265. package/editor/view/GridPickCoordinateView.d.ts +22 -0
  266. package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
  267. package/editor/view/ecs/ComponentControlView.d.ts +24 -0
  268. package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
  269. package/editor/view/ecs/EntityEditor.d.ts +25 -0
  270. package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
  271. package/editor/view/ecs/EntityList.d.ts +22 -0
  272. package/editor/view/ecs/EntityList.d.ts.map +1 -0
  273. package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
  274. package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
  275. package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
  276. package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
  277. package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
  278. package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
  279. package/editor/view/ecs/components/color/GaugeView.js +4 -4
  280. package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
  281. package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
  282. package/editor/view/ecs/components/common/NumberController.js +4 -4
  283. package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
  284. package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
  285. package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
  286. package/editor/view/library/MeshLibraryView.d.ts +16 -0
  287. package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
  288. package/editor/view/library/mesh_library_drag.d.ts +21 -0
  289. package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
  290. package/editor/view/library/model_thumbnail_source.d.ts +12 -0
  291. package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
  292. package/editor/view/makeEntityDecorators.d.ts +6 -0
  293. package/editor/view/makeEntityDecorators.d.ts.map +1 -0
  294. package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
  295. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  296. package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
  297. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  298. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  299. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  300. package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
  301. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  302. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  303. package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
  304. package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
  305. package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
  306. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  307. package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
  308. package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
  309. package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
  310. package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
  311. package/editor/view/prepareMeshLibrary.d.ts +7 -0
  312. package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
  313. package/editor/view/process/ProcessView.d.ts +14 -0
  314. package/editor/view/process/ProcessView.d.ts.map +1 -0
  315. package/editor/view/shell/EditorShellView.d.ts +18 -0
  316. package/editor/view/shell/EditorShellView.d.ts.map +1 -0
  317. package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
  318. package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
  319. package/editor/view/shell/ViewportPanelView.d.ts +18 -0
  320. package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
  321. package/editor/view/tools/ToolSettingsView.d.ts +22 -0
  322. package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
  323. package/editor/view/tools/ToolView.d.ts +13 -0
  324. package/editor/view/tools/ToolView.d.ts.map +1 -0
  325. package/editor/view/v2/SplitView.d.ts +2 -0
  326. package/editor/view/v2/SplitView.d.ts.map +1 -0
  327. package/package.json +9 -11
  328. package/samples/engine/README.md +113 -0
  329. package/samples/engine/first-scene/index.html +32 -0
  330. package/samples/engine/first-scene/main.js +152 -0
  331. package/src/core/assert.d.ts +2 -2
  332. package/src/core/binary/BitSet.d.ts +2 -2
  333. package/src/core/binary/BitSet.d.ts.map +1 -1
  334. package/src/core/binary/BitSet.js +1 -1
  335. package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
  336. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  337. package/src/core/bvh2/bvh3/BVH.js +4 -0
  338. package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
  339. package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
  340. package/src/core/bvh2/bvh3/BvhClient.js +4 -0
  341. package/src/core/collection/array/array_sort_quick.d.ts +1 -1
  342. package/src/core/collection/list/List.d.ts +7 -3
  343. package/src/core/collection/list/List.d.ts.map +1 -1
  344. package/src/core/collection/list/List.js +6 -2
  345. package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
  346. package/src/core/collection/table/RowFirstTableSpec.js +0 -4
  347. package/src/core/color/Color.d.ts +1 -0
  348. package/src/core/color/Color.d.ts.map +1 -1
  349. package/src/core/color/Color.js +4 -0
  350. package/src/core/events/signal/SignalBinding.d.ts +4 -0
  351. package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
  352. package/src/core/events/signal/SignalBinding.js +4 -0
  353. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
  354. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  355. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
  356. package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
  357. package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
  358. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  359. package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
  360. package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
  361. package/src/core/geom/3d/aabb/AABB3.js +17 -3
  362. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
  363. package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
  364. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
  365. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  366. package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
  367. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
  368. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
  369. package/src/core/geom/Vector1.d.ts +4 -0
  370. package/src/core/geom/Vector1.d.ts.map +1 -1
  371. package/src/core/geom/Vector1.js +4 -0
  372. package/src/core/geom/Vector2.d.ts +4 -0
  373. package/src/core/geom/Vector2.d.ts.map +1 -1
  374. package/src/core/geom/Vector2.js +4 -0
  375. package/src/core/geom/Vector3.d.ts +4 -0
  376. package/src/core/geom/Vector3.d.ts.map +1 -1
  377. package/src/core/geom/Vector3.js +4 -0
  378. package/src/core/geom/Vector4.d.ts +4 -0
  379. package/src/core/geom/Vector4.d.ts.map +1 -1
  380. package/src/core/geom/Vector4.js +4 -0
  381. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
  382. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
  383. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
  384. package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
  385. package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
  386. package/src/core/geom/packing/miniball/Subspan.js +2 -2
  387. package/src/core/math/interval/NumericInterval.d.ts +4 -0
  388. package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
  389. package/src/core/math/interval/NumericInterval.js +4 -0
  390. package/src/core/math/random/roundFair.d.ts +2 -2
  391. package/src/core/math/random/roundFair.d.ts.map +1 -1
  392. package/src/core/math/random/roundFair.js +1 -1
  393. package/src/core/model/BoundedValue.d.ts +4 -0
  394. package/src/core/model/BoundedValue.d.ts.map +1 -1
  395. package/src/core/model/BoundedValue.js +4 -0
  396. package/src/core/model/ObservedBoolean.d.ts +4 -0
  397. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  398. package/src/core/model/ObservedBoolean.js +4 -0
  399. package/src/core/model/ObservedInteger.d.ts +4 -0
  400. package/src/core/model/ObservedInteger.d.ts.map +1 -1
  401. package/src/core/model/ObservedInteger.js +4 -0
  402. package/src/core/model/ObservedString.d.ts +4 -0
  403. package/src/core/model/ObservedString.d.ts.map +1 -1
  404. package/src/core/model/ObservedString.js +4 -0
  405. package/src/core/model/stat/Stat.d.ts +7 -3
  406. package/src/core/model/stat/Stat.d.ts.map +1 -1
  407. package/src/core/model/stat/Stat.js +4 -0
  408. package/src/engine/Engine.d.ts.map +1 -1
  409. package/src/engine/Engine.js +65 -0
  410. package/src/engine/EngineHarness.d.ts +8 -1
  411. package/src/engine/EngineHarness.d.ts.map +1 -1
  412. package/src/engine/EngineHarness.js +10 -14
  413. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
  414. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  415. package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
  416. package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
  417. package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
  418. package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
  419. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
  420. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  421. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
  422. package/src/engine/control/first-person/DESIGN.md +20 -2
  423. package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
  424. package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
  425. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  426. package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
  427. package/src/engine/ecs/Entity.js +1 -1
  428. package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
  429. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  430. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  431. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  432. package/src/engine/ecs/EntityManager.js +27 -3
  433. package/src/engine/ecs/animation/Animation.d.ts +17 -3
  434. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  435. package/src/engine/ecs/animation/Animation.js +26 -6
  436. package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
  437. package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
  438. package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
  439. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
  440. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  441. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
  442. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
  443. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
  444. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
  445. package/src/engine/ecs/transform/Transform64.d.ts +4 -4
  446. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  447. package/src/engine/ecs/transform/Transform64.js +2 -2
  448. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
  449. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  450. package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
  451. package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
  452. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  453. package/src/engine/graphics/ecs/light/Light.js +51 -1
  454. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
  455. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
  456. package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
  457. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
  458. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
  459. package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
  460. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
  461. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
  462. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  463. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
  464. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
  465. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
  466. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
  467. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
  468. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
  469. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
  470. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
  471. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
  472. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
  473. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
  474. package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
  475. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
  476. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
  477. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
  478. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
  479. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
  480. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
  481. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
  482. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
  483. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
  484. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
  485. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
  486. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
  487. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
  488. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
  489. package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
  490. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
  491. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
  492. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
  493. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
  494. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
  495. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
  496. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
  497. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  498. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
  499. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
  500. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
  501. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
  502. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  503. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
  504. package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
  505. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  506. package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
  507. package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
  508. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
  509. package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
  510. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
  511. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  512. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
  513. package/src/engine/graphics3/DecalSystem.d.ts +8 -0
  514. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  515. package/src/engine/graphics3/DecalSystem.js +8 -0
  516. package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
  517. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  518. package/src/engine/graphics3/GraphicsEngine.js +22 -11
  519. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  520. package/src/engine/graphics3/LightSystem.js +11 -1
  521. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
  522. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
  523. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
  524. package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
  525. package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
  526. package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
  527. package/src/engine/network/NetworkSession.d.ts +60 -0
  528. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  529. package/src/engine/network/NetworkSession.js +141 -1
  530. package/src/engine/network/replication/Replicator.d.ts +18 -0
  531. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  532. package/src/engine/network/replication/Replicator.js +98 -0
  533. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  534. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  535. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  536. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  537. package/src/engine/sound/SoundEngine.d.ts +24 -0
  538. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  539. package/src/engine/sound/SoundEngine.js +29 -11
  540. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  541. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  542. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  543. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  544. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  545. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  546. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  547. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  548. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  549. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  550. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  551. package/src/shade/playground/particle_system/README.md +14 -3
  552. package/src/shade/playground/particle_system/index.html +1 -0
  553. package/src/shade/playground/particle_system/main.js +15 -2
  554. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  555. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  556. package/src/shade/playground/particle_system/particle_scene.js +126 -9
  557. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  558. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  559. package/src/shade/renderer/GraphicsContext.js +4 -0
  560. package/src/shade/renderer/Renderer.d.ts +1 -1
  561. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  562. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  563. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  564. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  565. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  566. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  567. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  568. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  569. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  570. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  571. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  572. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  573. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  574. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  575. package/src/shade/renderer/particles/DESIGN.md +66 -15
  576. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  577. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  578. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  579. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  580. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  581. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  582. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  583. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  584. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  585. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  586. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  587. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  588. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  589. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  590. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  591. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  592. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  593. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  594. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  595. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  596. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  597. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  598. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  599. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  600. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  601. package/src/shade/renderer/particles/graph_particles.js +60 -20
  602. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  603. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  604. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  605. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  606. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  607. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  608. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  609. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  610. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  611. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  612. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  613. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  614. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  615. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  616. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  617. package/src/view/DOM.d.ts +69 -0
  618. package/src/view/DOM.d.ts.map +1 -0
  619. package/src/view/DOM.js +2 -1
  620. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  621. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  622. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  623. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  624. package/src/view/elements/FrameRateView.d.ts +45 -0
  625. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  626. package/src/view/elements/FrameRateView.js +131 -0
  627. package/src/view/elements/SliderView.d.ts +37 -0
  628. package/src/view/elements/SliderView.d.ts.map +1 -0
  629. package/src/view/elements/SliderView.js +71 -0
  630. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  631. package/src/view/elements/navigation/ViewStack.js +1 -1
  632. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  633. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  634. package/src/view/tooltip/TooltipView.d.ts +5 -1
  635. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  636. package/src/view/tooltip/TooltipView.js +4 -0
@@ -36,10 +36,21 @@ export const EMITTER_FIELD = Object.freeze({
36
36
  FLIPBOOK: 37, // vec2<f32> — grid columns, rows (37..38)
37
37
 
38
38
  RENDER_VELOCITY: 39, // u32 — attribute word offset of velocity (STRETCHED projection; or ABSENT)
39
+
40
+ /**
41
+ * u32 — dense id of the compiled program this emitter runs, assigned by
42
+ * {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
43
+ *
44
+ * The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
45
+ * integer to index a bin with, which neither the emitter index (one bucket per emitter, even
46
+ * when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
47
+ * and sparse) gives it.
48
+ */
49
+ PROGRAM_ID: 40,
39
50
  });
40
51
 
41
52
  /** Number of `u32` words per emitter record. */
42
- export const EMITTER_STRIDE = 40;
53
+ export const EMITTER_STRIDE = 41;
43
54
 
44
55
  /** Sentinel for an absent render-attribute binding. */
45
56
  export const EMITTER_ATTRIBUTE_ABSENT = 0xffffffff;
@@ -137,6 +148,7 @@ export const EMITTER_FLAG_ENCODING = Object.freeze({
137
148
  * @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
138
149
  * @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
139
150
  * @param {number[]} [def.flipbook] length-2 [cols, rows]
151
+ * @param {number} [def.program_id] dense program id, the simulation-order bucket key
140
152
  */
141
153
  export function pack_emitter(u32, f32, index, def) {
142
154
  const base = index * EMITTER_STRIDE;
@@ -176,6 +188,8 @@ export function pack_emitter(u32, f32, index, def) {
176
188
  const flipbook = def.flipbook ?? [1, 1];
177
189
  f32[base + EMITTER_FIELD.FLIPBOOK] = flipbook[0];
178
190
  f32[base + EMITTER_FIELD.FLIPBOOK + 1] = flipbook[1];
191
+
192
+ u32[base + EMITTER_FIELD.PROGRAM_ID] = (def.program_id ?? 0) >>> 0;
179
193
  }
180
194
 
181
195
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chunk_particle_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/chunk_particle_emitter.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,qCAFU,SAAS,CAoEhB;0BAjFuB,oCAAoC"}
1
+ {"version":3,"file":"chunk_particle_emitter.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/chunk_particle_emitter.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,qCAFU,SAAS,CAuEhB;0BApFuB,oCAAoC"}
@@ -40,6 +40,7 @@ struct ParticleEmitter {
40
40
  render_velocity : u32,
41
41
  atlas_region : vec4<f32>,
42
42
  flipbook : vec2<f32>,
43
+ program_id : u32,
43
44
  }
44
45
 
45
46
  fn particle_emitter_read(e : ptr<storage, array<u32>, read>, index : u32) -> ParticleEmitter {
@@ -74,6 +75,8 @@ fn particle_emitter_read(e : ptr<storage, array<u32>, read>, index : u32) -> Par
74
75
 
75
76
  r.atlas_region = vec4<f32>(bitcast<f32>((*e)[b + ${F.ATLAS_REGION}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 1}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 2}u]), bitcast<f32>((*e)[b + ${F.ATLAS_REGION + 3}u]));
76
77
  r.flipbook = vec2<f32>(bitcast<f32>((*e)[b + ${F.FLIPBOOK}u]), bitcast<f32>((*e)[b + ${F.FLIPBOOK + 1}u]));
78
+
79
+ r.program_id = (*e)[b + ${F.PROGRAM_ID}u];
77
80
  return r;
78
81
  }
79
82
 
@@ -5,20 +5,32 @@
5
5
  *
6
6
  * The passes run in dependency order:
7
7
  *
8
- * reset counters -> emit (spawn) -> simulate (advance + compact) -> build indirect args
8
+ * reset counters -> emit (spawn) -> simulate (advance + compact) -> bucket -> build indirect args
9
9
  *
10
10
  * with the depth sort + billboard render appended by the caller (the render pass needs the frame's
11
11
  * colour + depth attachments, which live in the caller's graph). Alive lists ping-pong by frame
12
- * parity: `alive_read` is the previous frame's survivors (this frame's simulate input), `alive_write`
13
- * receives this frame's survivors + newborns.
12
+ * parity: `alive_write` receives this frame's survivors + newborns.
13
+ *
14
+ * ## Two orderings, kept apart
15
+ *
16
+ * Simulate does NOT read the alive list. It reads `sim_list`, the program-coherent indirection list
17
+ * the bucketing pass (`coherence/`) built from last frame's alive list: the same pool slots
18
+ * regrouped so each wave runs one VM program, with every run padded out to a whole workgroup. That
19
+ * ordering is camera-independent and changes only when emitters or their programs change.
20
+ *
21
+ * The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
22
+ * different buffer, produced by different passes, and the billboard draw is what consumes it.
23
+ * Reordering the render list for coherence would break premultiplied transparency; depth-sorting the
24
+ * simulation list would destroy the coherence. They share no buffer and no counter slot.
14
25
  *
15
26
  * The simulate pass is fully GPU-driven: its workgroup count comes from `dispatch_args` (written by
16
27
  * LAST frame's build-indirect pass) via `dispatchWorkgroupsIndirect`, and its element bound comes
17
- * from the `ALIVE_IN` counter snapshot — never from a CPU count. A CPU count is inevitably stale and
18
- * corrupts the pool (orphaned slots when the population grows, double-freed slots when it shrinks).
19
- * Only the spawn count is CPU-provided, because the CPU authored the spawn-request list and knows its
20
- * exact length. The caller renders with `drawIndirect(draw_args)`, which build-indirect writes THIS
21
- * frame, so the instance count is exact too.
28
+ * from the `ALIVE_IN` counter snapshot — never from a CPU count. Both are derived from one value,
29
+ * the padded list length, so the thread count and the bound agree by construction. A CPU count is
30
+ * inevitably stale and corrupts the pool (orphaned slots when the population grows, double-freed
31
+ * slots when it shrinks). Only the spawn count is CPU-provided, because the CPU authored the
32
+ * spawn-request list and knows its exact length. The caller renders with `drawIndirect(draw_args)`,
33
+ * which build-indirect writes THIS frame, so the instance count is exact too.
22
34
  *
23
35
  * All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
24
36
  * buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
@@ -34,21 +46,30 @@
34
46
  * @param {GPUBuffer} params.gpu.program
35
47
  * @param {GPUBuffer} params.gpu.constants
36
48
  * @param {GPUBuffer} params.gpu.pool
37
- * @param {GPUBuffer} params.gpu.alive_read previous-frame alive list
38
- * @param {GPUBuffer} params.gpu.alive_write this-frame alive list
49
+ * @param {GPUBuffer} params.gpu.alive_read the other half of the ping-pong. These passes no longer
50
+ * read it simulate's input is `sim_list` — but the caller keeps swapping the two so this frame's
51
+ * render is not read-after-written by next frame's emit, which would serialise them
52
+ * @param {GPUBuffer} params.gpu.alive_write this-frame alive list: survivors + newborns
39
53
  * @param {GPUBuffer} params.gpu.dead free-list stack
40
54
  * @param {GPUBuffer} params.gpu.counters atomic counters
41
55
  * @param {GPUBuffer} params.gpu.spawn_requests
42
56
  * @param {GPUBuffer} params.gpu.dispatch_args indirect simulate dispatch (usage must include INDIRECT)
43
57
  * @param {GPUBuffer} params.gpu.draw_args indirect billboard draw (usage must include INDIRECT)
58
+ * @param {GPUBuffer} params.gpu.sim_list program-coherent simulate input, rebuilt here for next frame
59
+ * @param {GPUBuffer} params.gpu.sim_keys see {@link graph_particle_bucket}
60
+ * @param {GPUBuffer} params.gpu.sim_histogram see {@link graph_particle_bucket}
61
+ * @param {GPUBuffer} params.gpu.sim_bucket_counts see {@link graph_particle_bucket}
62
+ * @param {GPUBuffer} params.gpu.sim_cursor see {@link graph_particle_bucket}
63
+ * @param {GPUBuffer} params.gpu.sim_dispatch_args see {@link graph_particle_bucket} (usage must include INDIRECT)
44
64
  * @param {number} params.capacity pool capacity in particles (bounds the emit pass's free-list pops)
65
+ * @param {number} params.bucket_count distinct compiled programs — `GPUParticleSystem#bucketCount()`
45
66
  * @param {object} params.frame per-frame scalars
46
67
  * @param {number} params.frame.dt
47
68
  * @param {number} params.frame.time
48
69
  * @param {number} params.frame.index
49
70
  * @param {number} params.frame.spawn_count number of spawn requests this frame (CPU-authored, exact)
50
71
  */
51
- export function graph_particles({ graph, gpu, capacity, frame }: {
72
+ export function graph_particles({ graph, gpu, capacity, bucket_count, frame }: {
52
73
  graph: import("../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
53
74
  gpu: {
54
75
  emitters: GPUBuffer;
@@ -62,8 +83,15 @@ export function graph_particles({ graph, gpu, capacity, frame }: {
62
83
  spawn_requests: GPUBuffer;
63
84
  dispatch_args: GPUBuffer;
64
85
  draw_args: GPUBuffer;
86
+ sim_list: GPUBuffer;
87
+ sim_keys: GPUBuffer;
88
+ sim_histogram: GPUBuffer;
89
+ sim_bucket_counts: GPUBuffer;
90
+ sim_cursor: GPUBuffer;
91
+ sim_dispatch_args: GPUBuffer;
65
92
  };
66
93
  capacity: number;
94
+ bucket_count: number;
67
95
  frame: {
68
96
  dt: number;
69
97
  time: number;
@@ -1 +1 @@
1
- {"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH;IApBkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,GAAG;QACI,QAAQ;QACR,OAAO;QACP,SAAS;QACT,IAAI;QACJ,UAAU;QACV,WAAW;QACX,IAAI;QACJ,QAAQ;QACR,cAAc;QACd,aAAa;QACb,SAAS;;IAChB,QAAQ,EAAvB,MAAM;IACS,KAAK;QACC,EAAE,EAAvB,MAAM;QACe,IAAI,EAAzB,MAAM;QACe,KAAK,EAA1B,MAAM;QACe,WAAW,EAAhC,MAAM;;;;;;;;EAsFhB"}
1
+ {"version":3,"file":"graph_particles.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/graph_particles.js"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsEG;AACH;IA7BkG,KAAK,EAA5F,OAAO,2DAA2D,EAAE,UAAU;IAC/D,GAAG;QACI,QAAQ;QACR,OAAO;QACP,SAAS;QACT,IAAI;QACJ,UAAU;QAGV,WAAW;QACX,IAAI;QACJ,QAAQ;QACR,cAAc;QACd,aAAa;QACb,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,iBAAiB;QACjB,UAAU;QACV,iBAAiB;;IACxB,QAAQ,EAAvB,MAAM;IACS,YAAY,EAA3B,MAAM;IACS,KAAK;QACC,EAAE,EAAvB,MAAM;QACe,IAAI,EAAzB,MAAM;QACe,KAAK,EAA1B,MAAM;QACe,WAAW,EAAhC,MAAM;;;;;;;;EAwGhB"}
@@ -1,9 +1,10 @@
1
1
  import { graph_compute_indirect_pass } from "../shader/graph/compute/graph_compute_indirect_pass.js";
2
2
  import { graph_compute_pass } from "../shader/graph/compute/graph_compute_pass.js";
3
3
  import { graph_import_buffer } from "../shader/graph/graph_import_buffer.js";
4
+ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
5
+ import { graph_particle_bucket } from "./coherence/graph_particle_bucket.js";
4
6
  import { PARTICLE_EMIT_WORKGROUP_SIZE, shader_particle_emit } from "./shaders/shader_particle_emit.js";
5
7
  import {
6
- PARTICLE_SIMULATE_WORKGROUP_SIZE,
7
8
  shader_particle_build_indirect,
8
9
  shader_particle_reset_counters,
9
10
  } from "./shaders/shader_particle_finalize.js";
@@ -16,20 +17,32 @@ import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js"
16
17
  *
17
18
  * The passes run in dependency order:
18
19
  *
19
- * reset counters -> emit (spawn) -> simulate (advance + compact) -> build indirect args
20
+ * reset counters -> emit (spawn) -> simulate (advance + compact) -> bucket -> build indirect args
20
21
  *
21
22
  * with the depth sort + billboard render appended by the caller (the render pass needs the frame's
22
23
  * colour + depth attachments, which live in the caller's graph). Alive lists ping-pong by frame
23
- * parity: `alive_read` is the previous frame's survivors (this frame's simulate input), `alive_write`
24
- * receives this frame's survivors + newborns.
24
+ * parity: `alive_write` receives this frame's survivors + newborns.
25
+ *
26
+ * ## Two orderings, kept apart
27
+ *
28
+ * Simulate does NOT read the alive list. It reads `sim_list`, the program-coherent indirection list
29
+ * the bucketing pass (`coherence/`) built from last frame's alive list: the same pool slots
30
+ * regrouped so each wave runs one VM program, with every run padded out to a whole workgroup. That
31
+ * ordering is camera-independent and changes only when emitters or their programs change.
32
+ *
33
+ * The RENDER ordering — back-to-front by view depth, from `sort/` — is a different list in a
34
+ * different buffer, produced by different passes, and the billboard draw is what consumes it.
35
+ * Reordering the render list for coherence would break premultiplied transparency; depth-sorting the
36
+ * simulation list would destroy the coherence. They share no buffer and no counter slot.
25
37
  *
26
38
  * The simulate pass is fully GPU-driven: its workgroup count comes from `dispatch_args` (written by
27
39
  * LAST frame's build-indirect pass) via `dispatchWorkgroupsIndirect`, and its element bound comes
28
- * from the `ALIVE_IN` counter snapshot — never from a CPU count. A CPU count is inevitably stale and
29
- * corrupts the pool (orphaned slots when the population grows, double-freed slots when it shrinks).
30
- * Only the spawn count is CPU-provided, because the CPU authored the spawn-request list and knows its
31
- * exact length. The caller renders with `drawIndirect(draw_args)`, which build-indirect writes THIS
32
- * frame, so the instance count is exact too.
40
+ * from the `ALIVE_IN` counter snapshot — never from a CPU count. Both are derived from one value,
41
+ * the padded list length, so the thread count and the bound agree by construction. A CPU count is
42
+ * inevitably stale and corrupts the pool (orphaned slots when the population grows, double-freed
43
+ * slots when it shrinks). Only the spawn count is CPU-provided, because the CPU authored the
44
+ * spawn-request list and knows its exact length. The caller renders with `drawIndirect(draw_args)`,
45
+ * which build-indirect writes THIS frame, so the instance count is exact too.
33
46
  *
34
47
  * All persistent buffers are imported (owned by the feature, not the graph). Writing an imported
35
48
  * buffer marks the pass a side-effect so it always executes, and returns a renamed handle downstream
@@ -45,25 +58,34 @@ import { shader_particle_simulate } from "./shaders/shader_particle_simulate.js"
45
58
  * @param {GPUBuffer} params.gpu.program
46
59
  * @param {GPUBuffer} params.gpu.constants
47
60
  * @param {GPUBuffer} params.gpu.pool
48
- * @param {GPUBuffer} params.gpu.alive_read previous-frame alive list
49
- * @param {GPUBuffer} params.gpu.alive_write this-frame alive list
61
+ * @param {GPUBuffer} params.gpu.alive_read the other half of the ping-pong. These passes no longer
62
+ * read it simulate's input is `sim_list` — but the caller keeps swapping the two so this frame's
63
+ * render is not read-after-written by next frame's emit, which would serialise them
64
+ * @param {GPUBuffer} params.gpu.alive_write this-frame alive list: survivors + newborns
50
65
  * @param {GPUBuffer} params.gpu.dead free-list stack
51
66
  * @param {GPUBuffer} params.gpu.counters atomic counters
52
67
  * @param {GPUBuffer} params.gpu.spawn_requests
53
68
  * @param {GPUBuffer} params.gpu.dispatch_args indirect simulate dispatch (usage must include INDIRECT)
54
69
  * @param {GPUBuffer} params.gpu.draw_args indirect billboard draw (usage must include INDIRECT)
70
+ * @param {GPUBuffer} params.gpu.sim_list program-coherent simulate input, rebuilt here for next frame
71
+ * @param {GPUBuffer} params.gpu.sim_keys see {@link graph_particle_bucket}
72
+ * @param {GPUBuffer} params.gpu.sim_histogram see {@link graph_particle_bucket}
73
+ * @param {GPUBuffer} params.gpu.sim_bucket_counts see {@link graph_particle_bucket}
74
+ * @param {GPUBuffer} params.gpu.sim_cursor see {@link graph_particle_bucket}
75
+ * @param {GPUBuffer} params.gpu.sim_dispatch_args see {@link graph_particle_bucket} (usage must include INDIRECT)
55
76
  * @param {number} params.capacity pool capacity in particles (bounds the emit pass's free-list pops)
77
+ * @param {number} params.bucket_count distinct compiled programs — `GPUParticleSystem#bucketCount()`
56
78
  * @param {object} params.frame per-frame scalars
57
79
  * @param {number} params.frame.dt
58
80
  * @param {number} params.frame.time
59
81
  * @param {number} params.frame.index
60
82
  * @param {number} params.frame.spawn_count number of spawn requests this frame (CPU-authored, exact)
61
83
  */
62
- export function graph_particles({ graph, gpu, capacity, frame }) {
84
+ export function graph_particles({ graph, gpu, capacity, bucket_count, frame }) {
63
85
  const gr_emitters = graph_import_buffer(graph, gpu.emitters, "particles/emitters");
64
86
  const gr_program = graph_import_buffer(graph, gpu.program, "particles/program");
65
87
  const gr_constants = graph_import_buffer(graph, gpu.constants, "particles/constants");
66
- const gr_alive_read = graph_import_buffer(graph, gpu.alive_read, "particles/alive_read");
88
+ const gr_sim_list = graph_import_buffer(graph, gpu.sim_list, "particles/sim_list");
67
89
  const gr_spawn = graph_import_buffer(graph, gpu.spawn_requests, "particles/spawn_requests");
68
90
  const gr_dispatch = graph_import_buffer(graph, gpu.dispatch_args, "particles/dispatch_args");
69
91
  const gr_draw = graph_import_buffer(graph, gpu.draw_args, "particles/draw_args");
@@ -76,7 +98,7 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
76
98
  let alive_write = graph_import_buffer(graph, gpu.alive_write, "particles/alive_write");
77
99
  let dead = graph_import_buffer(graph, gpu.dead, "particles/dead");
78
100
 
79
- // 1. Reset the alive/spawn/sorted counters (the dead count + ALIVE_IN snapshot persist).
101
+ // 1. Reset the alive/spawn/sorted/sim-padded counters (dead count + ALIVE_IN snapshot persist).
80
102
  counters = graph_compute_pass({
81
103
  graph,
82
104
  shader: shader_particle_reset_counters,
@@ -102,17 +124,18 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
102
124
  pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
103
125
  }
104
126
 
105
- // 3. Simulate — one indirect dispatch runs every emitter's UPDATE over the previous alive list,
106
- // compacting survivors into the new alive list and freed slots into the dead list. The
107
- // workgroup count comes from LAST frame's dispatch_args (read here, re-written in step 4 —
108
- // insertion order keeps the read before the write).
127
+ // 3. Simulate — one indirect dispatch runs every emitter's UPDATE over the program-coherent list
128
+ // the bucketing pass built LAST frame, compacting survivors into the new alive list and freed
129
+ // slots into the dead list. The workgroup count comes from last frame's dispatch_args and the
130
+ // list itself from last frame's sim_list — both read here and re-written in steps 4 and 5,
131
+ // with insertion order keeping the read before the write.
109
132
  {
110
133
  const out = graph_compute_indirect_pass({
111
134
  graph,
112
135
  shader: shader_particle_simulate,
113
136
  bindings: {
114
137
  emitters: gr_emitters, program: gr_program, vm_constants: gr_constants,
115
- pool, alive_in: gr_alive_read, alive_out: alive_write, dead, counters,
138
+ pool, sim_list: gr_sim_list, alive_out: alive_write, dead, counters,
116
139
  settings: { u_dt: frame.dt, u_time: frame.time, u_frame: frame.index },
117
140
  },
118
141
  command: gr_dispatch,
@@ -120,7 +143,24 @@ export function graph_particles({ graph, gpu, capacity, frame }) {
120
143
  pool = out.pool; alive_write = out.alive_out; dead = out.dead; counters = out.counters;
121
144
  }
122
145
 
123
- // 4. Snapshot the final alive count (next frame's simulate input length) and build the indirect
146
+ // 4. Bucket — regroup the frame's alive list by VM program, padded to whole workgroups, into the
147
+ // list NEXT frame's simulate consumes. Must follow BOTH emit and simulate, since both append
148
+ // to the alive list.
149
+ // `gr_sim_list` is handed over rather than re-imported: two imports of one GPUBuffer are two
150
+ // resource entries the graph cannot tell apart, which would put simulate's read of the list
151
+ // and this pass's rewrite of it on unrelated dependency chains.
152
+ counters = graph_particle_bucket({
153
+ graph,
154
+ gpu,
155
+ emitters: gr_emitters,
156
+ pool,
157
+ alive: alive_write,
158
+ counters,
159
+ sim_list: gr_sim_list,
160
+ bucket_count,
161
+ }).counters;
162
+
163
+ // 5. Snapshot the padded list length (next frame's simulate input length) and build the indirect
124
164
  // dispatch args for next frame + the indirect draw args for this frame's render.
125
165
  const indirect = graph_compute_pass({
126
166
  graph,
@@ -50,12 +50,19 @@ export class EmitterRegistry {
50
50
  }): number;
51
51
  /**
52
52
  * Pack all emitters + their programs into upload-ready buffers.
53
- * @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array }}
53
+ *
54
+ * `program_count` is the number of DISTINCT programs across the emitter set — the bucket count
55
+ * the simulation-order coherence pass histograms into. It is CPU-known and low-churn (it only
56
+ * changes when the emitter set does), which is why that pass can size its histogram, its cursor
57
+ * and its padding dispatch on the host without any of the per-frame counts ever leaving the GPU.
58
+ *
59
+ * @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array, program_count: number }}
54
60
  */
55
61
  build(): {
56
62
  emitters: Uint32Array;
57
63
  program: Uint32Array;
58
64
  constants: Uint32Array;
65
+ program_count: number;
59
66
  };
60
67
  /**
61
68
  * The scene-node row an emitter is attached to (for bone attachment), or the "none" sentinel.
@@ -1 +1 @@
1
- {"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH;IAEQ,uBAAuB;IACvB,UADW,MAAM,EAAE,CACD;IAGtB,sDAAsD;IACtD,oBAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QAZqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QACf,SAAS,GAA3B,MAAM,EAAE;QACQ,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACwC,MAAM,GAApD;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACL,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACF,YAAY,GAA9B,MAAM,EAAE;QACU,QAAQ,GAA1B,MAAM,EAAE;QACQ,UAAU,GAA1B,MAAM;QACJ,MAAM,CASlB;IAED;;;OAGG;IACH;kBAFyB,WAAW;iBAAW,WAAW;mBAAa,WAAW;MAwCjF;IAED;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;CACJ"}
1
+ {"version":3,"file":"EmitterRegistry.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/EmitterRegistry.js"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH;IAEQ,uBAAuB;IACvB,UADW,MAAM,EAAE,CACD;IAGtB,sDAAsD;IACtD,oBAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH;QAZqD,MAAM,EAAhD;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAC;QACf,SAAS,GAA3B,MAAM,EAAE;QACQ,IAAI,GAApB,MAAM;QACU,UAAU,GAA1B,MAAM;QACU,KAAK,GAArB,MAAM;QACwC,MAAM,GAApD;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAC;QACL,MAAM;gBAA9B,MAAM,GAAC,MAAM;;QACF,YAAY,GAA9B,MAAM,EAAE;QACU,QAAQ,GAA1B,MAAM,EAAE;QACQ,UAAU,GAA1B,MAAM;QACJ,MAAM,CASlB;IAED;;;;;;;;;OASG;IACH;kBAFyB,WAAW;iBAAW,WAAW;mBAAa,WAAW;uBAAiB,MAAM;MAyCxG;IAED;;;;OAIG;IACH,iBAHW,MAAM,GACJ,MAAM,CAIlB;CACJ"}
@@ -57,7 +57,13 @@ export class EmitterRegistry {
57
57
 
58
58
  /**
59
59
  * Pack all emitters + their programs into upload-ready buffers.
60
- * @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array }}
60
+ *
61
+ * `program_count` is the number of DISTINCT programs across the emitter set — the bucket count
62
+ * the simulation-order coherence pass histograms into. It is CPU-known and low-churn (it only
63
+ * changes when the emitter set does), which is why that pass can size its histogram, its cursor
64
+ * and its padding dispatch on the host without any of the per-frame counts ever leaving the GPU.
65
+ *
66
+ * @returns {{ emitters: Uint32Array, program: Uint32Array, constants: Uint32Array, program_count: number }}
61
67
  */
62
68
  build() {
63
69
  const arena = new ProgramArena();
@@ -96,6 +102,7 @@ export class EmitterRegistry {
96
102
  emitters,
97
103
  program: arena.build_instruction_buffer(),
98
104
  constants: arena.build_constant_buffer(),
105
+ program_count: Math.max(1, arena.program_count),
99
106
  };
100
107
  }
101
108
 
@@ -15,10 +15,29 @@ export class ProgramArena {
15
15
  instruction_count: number;
16
16
  /** @type {number} running vec4 constant index */
17
17
  constant_count: number;
18
+ /** @type {Map<string, object>} content key -> the placement the first identical program got */
19
+ programs: Map<string, object>;
18
20
  /**
19
- * Append a program.
21
+ * Number of distinct programs in the arena — and therefore the number of buckets the
22
+ * simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
23
+ * @returns {number}
24
+ */
25
+ get program_count(): number;
26
+ /**
27
+ * Append a program, or hand back the placement an identical one already has.
28
+ *
29
+ * Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
30
+ * separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
31
+ * they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
32
+ * the words is not a cost worth avoiding.
33
+ *
34
+ * The `program_id` it returns is what the emitter record carries and what the coherence pass
35
+ * buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
36
+ * emitters running one shared effect would become N buckets, each padded to a whole workgroup,
37
+ * which both wastes lanes and splits a run that was already program-coherent.
38
+ *
20
39
  * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
21
- * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
40
+ * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
22
41
  */
23
42
  add(program: import("../isa/ParticleProgram.js").ParticleProgram): {
24
43
  spawn_offset: number;
@@ -26,6 +45,7 @@ export class ProgramArena {
26
45
  update_offset: number;
27
46
  update_count: number;
28
47
  constant_offset: number;
48
+ program_id: number;
29
49
  };
30
50
  /** @returns {Uint32Array} the packed instruction buffer (at least length 1) */
31
51
  build_instruction_buffer(): Uint32Array;
@@ -1 +1 @@
1
- {"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;IAG3B;;;;OAIG;IACH,aAHW,OAAO,2BAA2B,EAAE,eAAe;sBAClC,MAAM;qBAAe,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;yBAAmB,MAAM;MAmB5H;IAUD,+EAA+E;IAC/E,4BADc,WAAW,CAGxB;IAED,yFAAyF;IACzF,yBADc,WAAW,CAGxB;;CACJ"}
1
+ {"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;IACvB,+FAA+F;IAC/F,UADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACL;IAG7B;;;;OAIG;IACH,4BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,aAHW,OAAO,2BAA2B,EAAE,eAAe;sBAClC,MAAM;qBAAe,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;yBAAmB,MAAM;oBAAc,MAAM;MAgChJ;IAUD,+EAA+E;IAC/E,4BADc,WAAW,CAGxB;IAED,yFAAyF;IACzF,yBADc,WAAW,CAGxB;;CACJ"}
@@ -18,14 +18,43 @@ export class ProgramArena {
18
18
  this.instruction_count = 0;
19
19
  /** @type {number} running vec4 constant index */
20
20
  this.constant_count = 0;
21
+ /** @type {Map<string, object>} content key -> the placement the first identical program got */
22
+ this.programs = new Map();
21
23
  }
22
24
 
23
25
  /**
24
- * Append a program.
26
+ * Number of distinct programs in the arena — and therefore the number of buckets the
27
+ * simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
28
+ * @returns {number}
29
+ */
30
+ get program_count() {
31
+ return this.programs.size;
32
+ }
33
+
34
+ /**
35
+ * Append a program, or hand back the placement an identical one already has.
36
+ *
37
+ * Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
38
+ * separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
39
+ * they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
40
+ * the words is not a cost worth avoiding.
41
+ *
42
+ * The `program_id` it returns is what the emitter record carries and what the coherence pass
43
+ * buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
44
+ * emitters running one shared effect would become N buckets, each padded to a whole workgroup,
45
+ * which both wastes lanes and splits a run that was already program-coherent.
46
+ *
25
47
  * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
26
- * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
48
+ * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
27
49
  */
28
50
  add(program) {
51
+ const key = program_content_key(program);
52
+
53
+ const existing = this.programs.get(key);
54
+ if (existing !== undefined) {
55
+ return existing;
56
+ }
57
+
29
58
  const spawn_offset = this.instruction_count;
30
59
  this.#append_instructions(program.spawn);
31
60
  const spawn_count = program.spawn_instruction_count;
@@ -41,7 +70,13 @@ export class ProgramArena {
41
70
  }
42
71
  this.constant_count += program.constant_count;
43
72
 
44
- return { spawn_offset, spawn_count, update_offset, update_count, constant_offset };
73
+ const placement = {
74
+ spawn_offset, spawn_count, update_offset, update_count, constant_offset,
75
+ program_id: this.programs.size,
76
+ };
77
+ this.programs.set(key, placement);
78
+
79
+ return placement;
45
80
  }
46
81
 
47
82
  /** @param {Uint32Array} words */
@@ -62,3 +97,19 @@ export class ProgramArena {
62
97
  return new Uint32Array(this.constant_words.length > 0 ? this.constant_words : [0, 0, 0, 0]);
63
98
  }
64
99
  }
100
+
101
+ /**
102
+ * A key that is equal exactly when two programs would execute identically.
103
+ *
104
+ * Constants are keyed by their `u32` bit patterns rather than their float values, so `-0` and `0`
105
+ * — which stringify the same but differ in the buffer the shader reads — stay distinct.
106
+ *
107
+ * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
108
+ * @returns {string}
109
+ */
110
+ function program_content_key(program) {
111
+ const constants = program.constants;
112
+ const constant_u32 = new Uint32Array(constants.buffer, constants.byteOffset, constants.length);
113
+
114
+ return `${program.register_count}|${program.spawn.join(",")}|${program.update.join(",")}|${constant_u32.join(",")}`;
115
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"AA4BA,2DAYG;AAaH,2DA0BG;;8BA7E2B,+BAA+B;iDAIZ,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"AAoCA,2DAaG;AAaH,2DAmCG;;8BA/F2B,+BAA+B;iDAIZ,+BAA+B"}
@@ -9,16 +9,24 @@ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./shader_particle_simulate.js"
9
9
  /**
10
10
  * Small housekeeping passes that keep the pipeline GPU-driven:
11
11
  *
12
- * - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted counters at the top of
13
- * the frame (the dead count and the ALIVE_IN snapshot persist across frames).
14
- * - {@link shader_particle_build_indirect} — read the frame's final alive count and (a) snapshot it
15
- * into {@link PARTICLE_COUNTER.ALIVE_IN} the exact input length for NEXT frame's simulate, (b)
16
- * write the indirect dispatch args next frame's simulate consumes, and (c) write the indirect draw
17
- * args for THIS frame's billboard render. Nothing round-trips to the CPU. Sizing the dispatch or
18
- * draw from a stale CPU readback instead is a correctness bug: when the alive count grows the tail
19
- * of the list is never simulated (slots leak into limbo), and when it shrinks stale entries beyond
20
- * the written range get re-simulated a dead slot is pushed to the free list twice and later
21
- * popped twice, leaving two live particles sharing one record.
12
+ * - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted / sim-padded counters
13
+ * at the top of the frame (the dead count and the ALIVE_IN snapshot persist across frames).
14
+ * - {@link shader_particle_build_indirect} — turn the frame's two final counts into next frame's
15
+ * input contract: (a) snapshot the coherence pass's padded list length into
16
+ * {@link PARTICLE_COUNTER.ALIVE_IN} — the exact input length for NEXT frame's simulate, (b) write
17
+ * the indirect dispatch args next frame's simulate consumes, from that SAME value, and (c) write
18
+ * the indirect draw args for THIS frame's billboard render, from the alive count. Nothing
19
+ * round-trips to the CPU. Sizing the dispatch or draw from a stale CPU readback instead is a
20
+ * correctness bug: when the alive count grows the tail of the list is never simulated (slots leak
21
+ * into limbo), and when it shrinks stale entries beyond the written range get re-simulated — a
22
+ * dead slot is pushed to the free list twice and later popped twice, leaving two live particles
23
+ * sharing one record.
24
+ *
25
+ * The two lengths are deliberately different quantities and must not be conflated. Simulate consumes
26
+ * the SIMULATION order: the program-coherent list from `../coherence/`, padded so no wave spans two
27
+ * VM programs, and therefore longer than the alive count and always a whole number of workgroups.
28
+ * The billboard draw consumes the RENDER order: one instance per live particle, unpadded — a
29
+ * padding entry drawn as an instance would read a garbage record.
22
30
  */
23
31
 
24
32
  // --- reset ---
@@ -36,6 +44,7 @@ fn main() {
36
44
  atomicStore(&counters[${PARTICLE_COUNTER.ALIVE}u], 0u);
37
45
  atomicStore(&counters[${PARTICLE_COUNTER.SPAWN}u], 0u);
38
46
  atomicStore(&counters[${PARTICLE_COUNTER.SORTED}u], 0u);
47
+ atomicStore(&counters[${PARTICLE_COUNTER.SIM_PADDED}u], 0u);
39
48
  }
40
49
  `),
41
50
  });
@@ -61,16 +70,25 @@ export const shader_particle_build_indirect = ComputeShader.from({
61
70
  fn main() {
62
71
  let alive = atomicLoad(&counters[${PARTICLE_COUNTER.ALIVE}u]);
63
72
 
64
- // Snapshot: this frame's final alive count is next frame's exact simulate input length.
65
- atomicStore(&counters[${PARTICLE_COUNTER.ALIVE_IN}u], alive);
73
+ // The length of the padded, program-coherent list the coherence pass just built — NOT the alive
74
+ // count. Padding makes it longer, and a whole number of workgroups.
75
+ let sim_length = atomicLoad(&counters[${PARTICLE_COUNTER.SIM_PADDED}u]);
76
+
77
+ // Snapshot: that list is next frame's simulate input, and this is its exact length.
78
+ atomicStore(&counters[${PARTICLE_COUNTER.ALIVE_IN}u], sim_length);
66
79
 
67
- // Simulate dispatch (consumed NEXT frame): one thread per alive particle, whole workgroups.
68
- let groups = (alive + u_workgroup_size - 1u) / max(u_workgroup_size, 1u);
80
+ // Simulate dispatch (consumed NEXT frame): one thread per entry of that same list. Derived from
81
+ // the same value as the bound above, so thread count and bound agree by construction — and
82
+ // because a padded length is a whole number of workgroups, they agree exactly: every thread the
83
+ // dispatch launches has an entry, real or sentinel.
84
+ let groups = (sim_length + u_workgroup_size - 1u) / max(u_workgroup_size, 1u);
69
85
  dispatch_args[0] = groups;
70
86
  dispatch_args[1] = 1u;
71
87
  dispatch_args[2] = 1u;
72
88
 
73
89
  // Instanced billboard draw (consumed THIS frame): 6 verts per particle, one instance per alive.
90
+ // The render list is the unpadded one — an instance per padding entry would read a garbage
91
+ // record.
74
92
  draw_args[0] = 6u;
75
93
  draw_args[1] = alive;
76
94
  draw_args[2] = 0u;
@@ -1,26 +1,5 @@
1
- /**
2
- * The particle simulate pass — Destiny-style single execution shader.
3
- *
4
- * One dispatch processes the entire alive list across every emitter. Per particle: read its owning
5
- * emitter, set up the VM context + RNG, run that emitter's compiled UPDATE program over the record,
6
- * then compact — killed particles are pushed back to the dead (free) list, survivors are appended to
7
- * the new alive list. There is exactly one pipeline regardless of how many distinct effects exist,
8
- * because behaviour is data (the bytecode program), not code.
9
- *
10
- * The input length is read from `counters[ALIVE_IN]` — the previous frame's final alive count,
11
- * snapshotted on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count
12
- * is inevitably stale (readback latency) and corrupts the pool: under-counting orphans the tail of
13
- * the alive list (slots leak into limbo), over-counting re-simulates stale entries and double-frees
14
- * their slots. Dispatch this shader with `dispatchWorkgroupsIndirect` using the args the
15
- * build-indirect pass wrote last frame, so thread count and bound agree by construction.
16
- *
17
- * All structured reads go through `array<u32>` for emulator-testability. Curve sampling uses the
18
- * pluggable `particle_vm_sample_curve` — here the no-op provider; the feature swaps in the
19
- * animation-database-backed one.
20
- *
21
- * @type {ComputeShader}
22
- */
23
- export const PARTICLE_SIMULATE_WORKGROUP_SIZE: ComputeShader;
1
+ export { PARTICLE_SIMULATE_WORKGROUP_SIZE };
24
2
  export const shader_particle_simulate: ComputeShader;
3
+ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "../ParticleConstants.js";
25
4
  import { ComputeShader } from "../../shader/ComputeShader.js";
26
5
  //# sourceMappingURL=shader_particle_simulate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,+CAHU,aAAa,CAG4B;AAuEnD,qDAIG;8BA7G2B,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAyIA,qDAIG;iDAjII,yBAAyB;8BATF,+BAA+B"}