@woosh/meep-engine 3.14.5 → 3.15.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 (788) 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/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
  531. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  532. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
  533. package/src/engine/network/replication/Replicator.d.ts +18 -0
  534. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  535. package/src/engine/network/replication/Replicator.js +98 -0
  536. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  537. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  538. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  539. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  540. package/src/engine/sound/SoundEngine.d.ts +24 -0
  541. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  542. package/src/engine/sound/SoundEngine.js +29 -11
  543. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  544. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  545. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  546. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  547. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  548. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  549. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  550. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  551. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  552. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  553. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  554. package/src/shade/RENDERER_CONTRACT.md +584 -580
  555. package/src/shade/playground/avboit/README.md +117 -0
  556. package/src/shade/playground/avboit/index.html +215 -0
  557. package/src/shade/playground/avboit/main.d.ts +2 -0
  558. package/src/shade/playground/avboit/main.d.ts.map +1 -0
  559. package/src/shade/playground/avboit/main.js +875 -0
  560. package/src/shade/playground/particle_system/README.md +14 -3
  561. package/src/shade/playground/particle_system/index.html +1 -0
  562. package/src/shade/playground/particle_system/main.js +15 -2
  563. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  564. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  565. package/src/shade/playground/particle_system/particle_scene.js +126 -9
  566. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  567. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  568. package/src/shade/renderer/GraphicsContext.js +4 -0
  569. package/src/shade/renderer/Renderer.d.ts +17 -1
  570. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  571. package/src/shade/renderer/Renderer.js +29 -28
  572. package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
  573. package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
  574. package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
  575. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  576. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  577. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  578. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  579. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  580. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  581. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  582. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  583. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  584. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  585. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  586. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  587. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  588. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  589. package/src/shade/renderer/particles/DESIGN.md +66 -15
  590. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  591. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  592. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  593. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  594. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  595. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  596. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  597. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  598. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  599. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  600. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  601. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  602. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  603. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  604. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  605. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  606. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  607. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  608. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  609. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  610. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  611. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  612. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  613. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  614. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  615. package/src/shade/renderer/particles/graph_particles.js +60 -20
  616. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  617. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  618. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  619. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  620. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  621. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  622. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  623. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  624. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  625. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  626. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  627. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  628. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  629. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  630. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
  631. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  632. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
  633. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
  634. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  635. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
  636. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
  637. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
  638. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
  639. package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
  640. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
  641. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
  642. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
  643. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
  644. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
  645. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
  646. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
  647. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
  648. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
  649. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
  650. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
  651. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
  652. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
  653. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
  654. package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
  655. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
  656. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
  657. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
  658. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +107 -0
  659. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
  660. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
  661. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +463 -0
  662. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +509 -0
  663. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
  664. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
  665. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
  666. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
  667. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
  668. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
  669. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +38 -0
  670. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
  671. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +130 -0
  672. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
  673. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
  674. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
  675. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
  676. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
  677. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
  678. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
  679. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
  680. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
  681. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
  682. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
  683. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
  684. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
  685. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
  686. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
  687. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
  688. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
  689. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
  690. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
  691. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
  692. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
  693. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
  694. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
  695. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
  696. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
  697. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
  698. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
  699. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
  700. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
  701. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
  702. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
  703. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
  704. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
  705. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
  706. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
  707. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
  708. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts +20 -0
  709. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
  710. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
  711. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
  712. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
  713. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
  714. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
  715. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
  716. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
  717. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
  718. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
  719. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
  720. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
  721. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
  722. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
  723. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
  724. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
  725. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
  726. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +117 -0
  727. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
  728. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +935 -0
  729. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
  730. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
  731. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
  732. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
  733. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
  734. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
  735. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
  736. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
  737. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
  738. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
  739. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
  740. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
  741. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
  742. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
  743. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
  744. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
  745. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
  746. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +81 -0
  747. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
  748. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
  749. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +237 -0
  750. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
  751. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
  752. package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
  753. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  754. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +665 -722
  755. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
  756. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
  757. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
  758. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  759. package/src/view/DOM.d.ts +69 -0
  760. package/src/view/DOM.d.ts.map +1 -0
  761. package/src/view/DOM.js +2 -1
  762. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  763. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  764. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  765. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  766. package/src/view/elements/FrameRateView.d.ts +45 -0
  767. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  768. package/src/view/elements/FrameRateView.js +131 -0
  769. package/src/view/elements/SliderView.d.ts +37 -0
  770. package/src/view/elements/SliderView.d.ts.map +1 -0
  771. package/src/view/elements/SliderView.js +71 -0
  772. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  773. package/src/view/elements/navigation/ViewStack.js +1 -1
  774. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  775. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  776. package/src/view/tooltip/TooltipView.d.ts +5 -1
  777. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  778. package/src/view/tooltip/TooltipView.js +4 -0
  779. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
  780. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
  781. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
  782. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
  783. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
  784. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
  785. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
  786. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
  787. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
  788. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
@@ -0,0 +1,344 @@
1
+ import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { ComputeShader } from "../../shader/ComputeShader.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
7
+ import {
8
+ PARTICLE_RECORD_HEADER_EMITTER,
9
+ PARTICLE_RECORD_WORD_COUNT,
10
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
11
+ PARTICLE_SIM_PAD_SLOT,
12
+ } from "../ParticleConstants.js";
13
+ import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
14
+ import { EMITTER_FIELD, EMITTER_STRIDE } from "../data/PARTICLE_EMITTER_LAYOUT.js";
15
+
16
+ /**
17
+ * Simulation-order bucketing — the passes that make each simulate wave run ONE VM program.
18
+ *
19
+ * ## Why
20
+ *
21
+ * The alive list is produced by compaction (`atomicAdd(&counters[ALIVE])`), so its order is
22
+ * arbitrary with respect to emitters and a single wave routinely holds particles running different
23
+ * programs. That costs twice: the interpreter's ~40-case opcode `switch` diverges, so the wave
24
+ * serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` / `vm_reg[s0]` index
25
+ * a VGPR-resident register file dynamically, which AMD reaches with `v_movrels`/`v_movreld` behind
26
+ * a waterfall loop whose trip count is the number of DISTINCT register indices live in the wave.
27
+ * Grouping the wave by program collapses both at once.
28
+ *
29
+ * ## Shape
30
+ *
31
+ * The same three-phase shape the depth sort uses, with two small passes added for the padding:
32
+ *
33
+ * reset -> histogram -> pad -> graph_prefix_scan_csdldf -> scatter -> fill
34
+ *
35
+ * 0. {@link shader_particle_bucket_reset} — write the `{count}` header the scan sizes itself from,
36
+ * clear the bins and the scatter cursors, and build the indirect args the next two passes are
37
+ * dispatched with (one thread per alive particle, from the GPU's own alive count).
38
+ * 1. {@link shader_particle_bucket_histogram} — per alive entry, look up the owning emitter's
39
+ * program id and bump that bin.
40
+ * 2. {@link shader_particle_bucket_pad} — round every bin up to a whole simulate workgroup, keeping
41
+ * the raw count aside. Rounding BEFORE the scan is what puts every bucket boundary on a wave
42
+ * boundary; rounding after would leave the offsets unpadded and each boundary back mid-wave.
43
+ * 3. `graph_prefix_scan_csdldf`, reused as-is — inclusive prefix sums of the padded bins, so every
44
+ * bucket's start offset is a multiple of the workgroup size.
45
+ * 4. {@link shader_particle_bucket_scatter} — per alive entry, exclusive offset plus an atomic rank
46
+ * within the bucket, then write the pool slot there.
47
+ * 5. {@link shader_particle_bucket_fill} — write the padding sentinel into the tail of each bucket
48
+ * and publish the padded total, which sizes next frame's simulate dispatch.
49
+ *
50
+ * ## Invariants this file rests on
51
+ *
52
+ * - **Indirection only.** Everything here permutes indices into `pool`. Records never move: slots
53
+ * are referenced by the dead (free) list and across frames, and relocating one would leave both
54
+ * pointing at the wrong particle.
55
+ * - **No CPU readback.** Only the bucket COUNT is host-known, and that is static topology (it
56
+ * changes when the emitter set does, not per frame). Every per-frame quantity — the alive count,
57
+ * the bin sizes, the padded total — is produced and consumed on the GPU.
58
+ * - **This is not the render order.** `../sort/` produces the camera-dependent back-to-front list
59
+ * the billboard draw consumes. Separate buffers, separate passes, separate counter slots.
60
+ *
61
+ * @see ./particle_program_buckets.js for the CPU statement of the same answer.
62
+ */
63
+
64
+ /** @type {number} words of `{count, elements}` header in front of the scan's bins */
65
+ const HEADER = PREFIX_SCAN_CSDLDF_HEADER_WORDS;
66
+
67
+ const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
68
+
69
+ /**
70
+ * Mask that rounds a count down to a whole workgroup; `(n + WG - 1) & PAD_MASK` rounds up.
71
+ *
72
+ * A mask rather than `(n + WG - 1u) / WG * WG` because the WGSL emulator's `/` is float division —
73
+ * the divide form would read differently there than on a device, and the round-up is exactly the
74
+ * property the specs have to pin. Correct only because {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is
75
+ * a power of two.
76
+ *
77
+ * @type {number}
78
+ */
79
+ const PAD_MASK = (~(WG - 1)) >>> 0;
80
+
81
+ /** log2 of the workgroup size — the fill pass splits its thread id into (bucket, lane) with it. */
82
+ const WG_LOG = Math.log2(WG);
83
+
84
+ /** Constants every pass in this file interpolates. */
85
+ const COMMON = /* wgsl */ `
86
+ const BUCKET_HEADER_WORDS : u32 = ${HEADER}u;
87
+ const BUCKET_ALIGNMENT : u32 = ${WG}u;
88
+ const BUCKET_PAD_MASK : u32 = ${PAD_MASK}u;
89
+ const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
90
+ const COUNTER_SIM_PADDED : u32 = ${PARTICLE_COUNTER.SIM_PADDED}u;
91
+ `;
92
+
93
+ // --- 0. reset ---------------------------------------------------------------------------------
94
+
95
+ const reset_resources = new ShaderResourceSetDescriptor();
96
+
97
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
98
+ reset_resources.setImmediate("u_bucket_count", u32);
99
+ reset_resources.createGroup()
100
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true) // atomics need read_write even for atomicLoad
101
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
102
+ .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
103
+ .addStorageBuffer("sim_dispatch_args", WebGPUArray.u32, true); // {x,y,z}
104
+
105
+ /**
106
+ * Per-frame reset, and the only place the bucketing decides how big it is.
107
+ *
108
+ * WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
109
+ * bins and the scatter would compound last frame's ranks.
110
+ *
111
+ * @type {ComputeShader}
112
+ */
113
+ export const shader_particle_bucket_reset = ComputeShader.from({
114
+ label: "Particle Bucket Reset",
115
+ resources: reset_resources,
116
+ body: CodeChunk.from(/* wgsl */ `
117
+ ${COMMON}
118
+
119
+ @compute @workgroup_size(${WG}, 1, 1)
120
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
121
+ let i = gid.x;
122
+
123
+ if (i == 0u) {
124
+ // The {count, elements} header the csdldf scan sizes itself from.
125
+ atomicStore(&histogram[0], u_bucket_count);
126
+
127
+ // One thread per alive particle for the histogram and the scatter. The alive count exists
128
+ // only on the GPU — the host's copy is a frame stale at best — so the dispatch that
129
+ // consumes it is built here rather than passed in.
130
+ let alive = atomicLoad(&counters[COUNTER_ALIVE]);
131
+ sim_dispatch_args[0] = (alive + BUCKET_ALIGNMENT - 1u) / BUCKET_ALIGNMENT;
132
+ sim_dispatch_args[1] = 1u;
133
+ sim_dispatch_args[2] = 1u;
134
+ }
135
+
136
+ // Header padding: never read by the scan, but it shares the buffer and the pool may have left
137
+ // something in it.
138
+ if (i > 0u && i < BUCKET_HEADER_WORDS) {
139
+ atomicStore(&histogram[i], 0u);
140
+ }
141
+
142
+ // The scan reads whole vec4s, so the bins are cleared up to the vec4 the last one lands in.
143
+ if (i < ((u_bucket_count + 3u) & 0xfffffffcu)) {
144
+ atomicStore(&histogram[BUCKET_HEADER_WORDS + i], 0u);
145
+ }
146
+
147
+ if (i < u_bucket_count) {
148
+ atomicStore(&cursor[i], 0u);
149
+ }
150
+ }
151
+ `),
152
+ });
153
+
154
+ // --- 1. histogram -----------------------------------------------------------------------------
155
+
156
+ const histogram_resources = new ShaderResourceSetDescriptor();
157
+
158
+ histogram_resources.createGroup()
159
+ .addStorageBuffer("emitters", WebGPUArray.u32, false)
160
+ .addStorageBuffer("pool", WebGPUArray.u32, false)
161
+ .addStorageBuffer("alive", WebGPUArray.u32, false)
162
+ .addStorageBuffer("keys", WebGPUArray.u32, true)
163
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
164
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
165
+
166
+ /**
167
+ * One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
168
+ * (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
169
+ * emitter index would split a run that was already coherent into one padded bucket per emitter.
170
+ *
171
+ * The emitter's program id is read by direct indexing rather than through
172
+ * `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
173
+ * word would be pure waste in a pass that touches every live particle.
174
+ *
175
+ * @type {ComputeShader}
176
+ */
177
+ export const shader_particle_bucket_histogram = ComputeShader.from({
178
+ label: "Particle Bucket Histogram",
179
+ resources: histogram_resources,
180
+ body: CodeChunk.from(/* wgsl */ `
181
+ ${COMMON}
182
+ const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
183
+ const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
184
+ const PARTICLE_EMITTER_RECORD_WORDS : u32 = ${EMITTER_STRIDE}u;
185
+ const EMITTER_WORD_PROGRAM_ID : u32 = ${EMITTER_FIELD.PROGRAM_ID}u;
186
+
187
+ @compute @workgroup_size(${WG}, 1, 1)
188
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
189
+ let i = gid.x;
190
+ if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
191
+
192
+ let slot = alive[i];
193
+ let emitter_index = pool[slot * PARTICLE_RECORD_WORDS + PARTICLE_HEADER_EMITTER];
194
+ let program = emitters[emitter_index * PARTICLE_EMITTER_RECORD_WORDS + EMITTER_WORD_PROGRAM_ID];
195
+
196
+ keys[i] = program;
197
+ atomicAdd(&histogram[BUCKET_HEADER_WORDS + program], 1u);
198
+ }
199
+ `),
200
+ });
201
+
202
+ // --- 2. pad -----------------------------------------------------------------------------------
203
+
204
+ const pad_resources = new ShaderResourceSetDescriptor();
205
+
206
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
207
+ pad_resources.setImmediate("u_bucket_count", u32);
208
+ pad_resources.createGroup()
209
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
210
+ .addStorageBuffer("bucket_counts", WebGPUArray.u32, true);
211
+
212
+ /**
213
+ * Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
214
+ * pass (which needs to know where the real entries stop and the padding starts).
215
+ *
216
+ * This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
217
+ * bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
218
+ * the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
219
+ * no live particles costs no lanes and shifts nothing.
220
+ *
221
+ * @type {ComputeShader}
222
+ */
223
+ export const shader_particle_bucket_pad = ComputeShader.from({
224
+ label: "Particle Bucket Pad",
225
+ resources: pad_resources,
226
+ body: CodeChunk.from(/* wgsl */ `
227
+ ${COMMON}
228
+
229
+ @compute @workgroup_size(${WG}, 1, 1)
230
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
231
+ let b = gid.x;
232
+ if (b >= u_bucket_count) { return; }
233
+
234
+ let raw = atomicLoad(&histogram[BUCKET_HEADER_WORDS + b]);
235
+
236
+ bucket_counts[b] = raw;
237
+ atomicStore(&histogram[BUCKET_HEADER_WORDS + b], (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK);
238
+ }
239
+ `),
240
+ });
241
+
242
+ // --- 3. (graph_prefix_scan_csdldf) ------------------------------------------------------------
243
+ // --- 4. scatter -------------------------------------------------------------------------------
244
+
245
+ const scatter_resources = new ShaderResourceSetDescriptor();
246
+
247
+ scatter_resources.createGroup()
248
+ .addStorageBuffer("keys", WebGPUArray.u32, false)
249
+ .addStorageBuffer("alive", WebGPUArray.u32, false)
250
+ .addStorageBuffer("scanned", WebGPUArray.u32, false)
251
+ .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
252
+ .addStorageBuffer("sim_list", WebGPUArray.u32, true)
253
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
254
+
255
+ /**
256
+ * Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
257
+ *
258
+ * Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
259
+ * needs: every lane in the bucket runs the same program, so which of them runs where changes
260
+ * nothing.
261
+ *
262
+ * @type {ComputeShader}
263
+ */
264
+ export const shader_particle_bucket_scatter = ComputeShader.from({
265
+ label: "Particle Bucket Scatter",
266
+ resources: scatter_resources,
267
+ body: CodeChunk.from(/* wgsl */ `
268
+ ${COMMON}
269
+
270
+ @compute @workgroup_size(${WG}, 1, 1)
271
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
272
+ let i = gid.x;
273
+ if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
274
+
275
+ let bucket = keys[i];
276
+
277
+ // The scan is inclusive, so bucket b's exclusive offset is bucket b-1's inclusive value, one
278
+ // word earlier. For bucket 0 the index lands on the last header word — in bounds, and unused,
279
+ // because select() takes the 0 branch there.
280
+ let exclusive = select(0u, scanned[BUCKET_HEADER_WORDS + bucket - 1u], bucket > 0u);
281
+ let rank = atomicAdd(&cursor[bucket], 1u);
282
+
283
+ sim_list[exclusive + rank] = alive[i];
284
+ }
285
+ `),
286
+ });
287
+
288
+ // --- 5. fill ----------------------------------------------------------------------------------
289
+
290
+ const fill_resources = new ShaderResourceSetDescriptor();
291
+
292
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
293
+ fill_resources.setImmediate("u_bucket_count", u32);
294
+ fill_resources.createGroup()
295
+ .addStorageBuffer("bucket_counts", WebGPUArray.u32, false)
296
+ .addStorageBuffer("scanned", WebGPUArray.u32, false)
297
+ .addStorageBuffer("sim_list", WebGPUArray.u32, true)
298
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
299
+
300
+ /**
301
+ * Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
302
+ *
303
+ * Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
304
+ * entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
305
+ * thread at all for a bucket whose particles all died.
306
+ *
307
+ * The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
308
+ * sizes next frame's simulate dispatch — the build-indirect pass reads it out of
309
+ * {@link PARTICLE_COUNTER.SIM_PADDED}.
310
+ *
311
+ * @type {ComputeShader}
312
+ */
313
+ export const shader_particle_bucket_fill = ComputeShader.from({
314
+ label: "Particle Bucket Fill",
315
+ resources: fill_resources,
316
+ body: CodeChunk.from(/* wgsl */ `
317
+ ${COMMON}
318
+ const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
319
+
320
+ @compute @workgroup_size(${WG}, 1, 1)
321
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
322
+ // One workgroup per bucket. Shift and mask rather than / and %: the emulator's / is float
323
+ // division, and BUCKET_ALIGNMENT is a power of two anyway.
324
+ let bucket = gid.x >> ${WG_LOG}u;
325
+ let lane = gid.x & (BUCKET_ALIGNMENT - 1u);
326
+
327
+ if (gid.x == 0u) {
328
+ // Inclusive scan, so the last bucket's value is the whole padded length.
329
+ atomicStore(&counters[COUNTER_SIM_PADDED], scanned[BUCKET_HEADER_WORDS + u_bucket_count - 1u]);
330
+ }
331
+
332
+ if (bucket >= u_bucket_count) { return; }
333
+
334
+ let raw = bucket_counts[bucket];
335
+ let padded = (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK;
336
+ // The scan is inclusive, so subtracting this bucket's own (padded) size gives its start.
337
+ let start = scanned[BUCKET_HEADER_WORDS + bucket] - padded;
338
+
339
+ if (lane < padded - raw) {
340
+ sim_list[start + raw + lane] = PARTICLE_SIM_PAD_SLOT;
341
+ }
342
+ }
343
+ `),
344
+ });
@@ -10,15 +10,37 @@ export const PARTICLE_COUNTER: Readonly<{
10
10
  DEAD: 1;
11
11
  /** number of particles requested to spawn this frame */
12
12
  SPAWN: 2;
13
- /** length of the sorted index list */
13
+ /**
14
+ * Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
15
+ * depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
16
+ * ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
17
+ * Sharing one slot between the two would silently couple a camera-driven ordering to a
18
+ * program-driven one.
19
+ */
14
20
  SORTED: 3;
15
21
  /**
16
- * Snapshot of the previous frame's final ALIVE the exact length of the alive list the
17
- * simulate pass consumes this frame. Written by the build-indirect pass at the end of each
18
- * frame and NOT zeroed by the reset pass, so the loop stays fully GPU-driven (no CPU readback
19
- * can be trusted for dispatch sizing: a stale count orphans or double-simulates slots).
22
+ * The exact length of the index list the simulate pass consumes this frame the padded,
23
+ * program-coherent list the coherence pass built at the end of last frame, so this is
24
+ * {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
25
+ * multiple of the simulate workgroup size).
26
+ *
27
+ * Written by the build-indirect pass at the end of each frame, from the same value it derives
28
+ * the indirect dispatch args from — which is what makes the dispatch's thread count and the
29
+ * shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
30
+ * GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
31
+ * double-simulates slots).
20
32
  */
21
33
  ALIVE_IN: 4;
34
+ /**
35
+ * Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
36
+ * produced this frame — the SIMULATION order. Camera-independent; it changes only when the
37
+ * emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
38
+ * {@link ALIVE_IN} and dispatch args.
39
+ *
40
+ * Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
41
+ * reads a length of zero and does nothing, rather than re-running last frame's stale list.
42
+ */
43
+ SIM_PADDED: 5;
22
44
  }>;
23
45
  /** Number of `u32` atomic slots in the counters buffer. */
24
46
  export const PARTICLE_COUNTER_COUNT: 8;
@@ -1 +1 @@
1
- {"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD,sCAAsC;;IAEtC;;;;;OAKG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BAtCI,mCAAmC"}
1
+ {"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD;;;;;;OAMG;;IAEH;;;;;;;;;;;OAWG;;IAEH;;;;;;;;OAQG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BA5DI,mCAAmC"}
@@ -13,15 +13,37 @@ export const PARTICLE_COUNTER = Object.freeze({
13
13
  DEAD: 1,
14
14
  /** number of particles requested to spawn this frame */
15
15
  SPAWN: 2,
16
- /** length of the sorted index list */
16
+ /**
17
+ * Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
18
+ * depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
19
+ * ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
20
+ * Sharing one slot between the two would silently couple a camera-driven ordering to a
21
+ * program-driven one.
22
+ */
17
23
  SORTED: 3,
18
24
  /**
19
- * Snapshot of the previous frame's final ALIVE the exact length of the alive list the
20
- * simulate pass consumes this frame. Written by the build-indirect pass at the end of each
21
- * frame and NOT zeroed by the reset pass, so the loop stays fully GPU-driven (no CPU readback
22
- * can be trusted for dispatch sizing: a stale count orphans or double-simulates slots).
25
+ * The exact length of the index list the simulate pass consumes this frame the padded,
26
+ * program-coherent list the coherence pass built at the end of last frame, so this is
27
+ * {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
28
+ * multiple of the simulate workgroup size).
29
+ *
30
+ * Written by the build-indirect pass at the end of each frame, from the same value it derives
31
+ * the indirect dispatch args from — which is what makes the dispatch's thread count and the
32
+ * shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
33
+ * GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
34
+ * double-simulates slots).
23
35
  */
24
36
  ALIVE_IN: 4,
37
+ /**
38
+ * Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
39
+ * produced this frame — the SIMULATION order. Camera-independent; it changes only when the
40
+ * emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
41
+ * {@link ALIVE_IN} and dispatch args.
42
+ *
43
+ * Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
44
+ * reads a length of zero and does nothing, rather than re-running last frame's stale list.
45
+ */
46
+ SIM_PADDED: 5,
25
47
  });
26
48
 
27
49
  /** Number of `u32` atomic slots in the counters buffer. */
@@ -42,6 +42,7 @@ export function emitter_flags_projection(flags: number): number;
42
42
  * @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
43
43
  * @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
44
44
  * @param {number[]} [def.flipbook] length-2 [cols, rows]
45
+ * @param {number} [def.program_id] dense program id, the simulation-order bucket key
45
46
  */
46
47
  export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
47
48
  spawn_offset: number;
@@ -58,6 +59,7 @@ export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number,
58
59
  render?: object;
59
60
  atlas_region?: number[];
60
61
  flipbook?: number[];
62
+ program_id?: number;
61
63
  }): void;
62
64
  /**
63
65
  * Overwrite just an emitter's world transform in a packed buffer.
@@ -104,9 +106,19 @@ export const EMITTER_FIELD: Readonly<{
104
106
  ATLAS_REGION: 33;
105
107
  FLIPBOOK: 37;
106
108
  RENDER_VELOCITY: 39;
109
+ /**
110
+ * u32 — dense id of the compiled program this emitter runs, assigned by
111
+ * {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
112
+ *
113
+ * The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
114
+ * integer to index a bin with, which neither the emitter index (one bucket per emitter, even
115
+ * when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
116
+ * and sparse) gives it.
117
+ */
118
+ PROGRAM_ID: 40;
107
119
  }>;
108
120
  /** Number of `u32` words per emitter record. */
109
- export const EMITTER_STRIDE: 40;
121
+ export const EMITTER_STRIDE: 41;
110
122
  /** Sentinel for an absent render-attribute binding. */
111
123
  export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
112
124
  /** Sentinel for "not attached to a scene node". */
@@ -1 +1 @@
1
- {"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AAiFA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,kCAnBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;SAwClB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AArMD;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
1
+ {"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
@@ -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"}