@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
@@ -7,9 +7,27 @@ import { MeshletGeometry } from "./MeshletGeometry.js";
7
7
  * to fill an existing instance (e.g. a subclass of `MeshletGeometry`)
8
8
  * in place; otherwise a fresh instance is created and returned.
9
9
  *
10
+ * **This is synchronous, single-threaded, and it is not cheap — so at load time it belongs
11
+ * OFFLINE, not on the frame loop.** Measured converting one level's meshes: 3.3k triangles across
12
+ * 23 meshes took 53 ms, 7.5k across 30 took 74 ms, and **199k across 45 took 1,246 ms** — an
13
+ * unbroken second and a quarter of main thread, scaling linearly, on a level that is small.
14
+ * Reported from a port as GAP-008.
15
+ *
16
+ * **The offline route already exists and is the intended pipeline.**
17
+ * {@link MeshletGeometrySerializationAdapter} round-trips a `MeshletGeometry` to and from a
18
+ * `BinaryBuffer` losslessly, so an asset build can call this once, serialize the result beside the
19
+ * source mesh, and leave the runtime with a deserialize and an upload. Nothing about this function
20
+ * needs to run in a browser. If you are calling it from a level loader, that is the thing to change
21
+ * first — before reaching for a worker, which only moves the cost.
22
+ *
23
+ * A pooled worker-backed geometry service, with meshlet construction as one of the things it
24
+ * serves, is where this is going; it is not here yet, and it would not remove the reason to build
25
+ * offline.
26
+ *
10
27
  * @param {Geometry} geometry
11
28
  * @param {MeshletGeometry} [out]
12
29
  * @returns {MeshletGeometry}
30
+ * @see MeshletGeometrySerializationAdapter for the offline format
13
31
  */
14
32
  export function meshlet_geometry_build_from_geometry(geometry, out = new MeshletGeometry()) {
15
33
  assert.defined(geometry, 'geometry');
@@ -1,3 +1,6 @@
1
+ /**
2
+ * @typedef {import("../../../../core/geom/3d/aabb/AABB3.js").AABB3} AABB3
3
+ */
1
4
  export class LightProbeVolume {
2
5
  /**
3
6
  *
@@ -51,5 +54,6 @@ export class LightProbeVolume {
51
54
  }): void;
52
55
  #private;
53
56
  }
57
+ export type AABB3 = import("../../../../core/geom/3d/aabb/AABB3.js").AABB3;
54
58
  import { TetrahedralMesh } from "../../../../core/geom/3d/tetrahedra/TetrahedralMesh.js";
55
59
  //# sourceMappingURL=LightProbeVolume.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LightProbeVolume.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/lpv/LightProbeVolume.js"],"names":[],"mappings":"AASA;IASI;;;OAGG;IACH,iCAEC;IAKD;;;OAGG;IACH,4BAEC;IAUD,iCAMC;IAdD;;;OAGG;IACH,8BAEC;IAUD;;;OAGG;IACH,0BAEC;IAID;;;OAGG;IACH,sBAEC;IAED,eAEC;IAED;;;;;OAKG;IACH,aAJW,MAAM,KACN,MAAM,KACN,MAAM,UAehB;IAED;;;OAGG;IACH,oBAFW,MAAM,QAiBhB;IAuBD,mBAUC;IAED;;;;OAIG;IACH,sCAFW,UAAQ;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAA;KAAC,QAchD;;CACJ;gCAjK+B,wDAAwD"}
1
+ {"version":3,"file":"LightProbeVolume.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/global_illumination/lpv/LightProbeVolume.js"],"names":[],"mappings":"AAUA;;GAEG;AACH;IASI;;;OAGG;IACH,iCAEC;IAKD;;;OAGG;IACH,4BAEC;IAUD,iCAMC;IAdD;;;OAGG;IACH,8BAEC;IAUD;;;OAGG;IACH,0BAEC;IAID;;;OAGG;IACH,sBAEC;IAED,eAEC;IAED;;;;;OAKG;IACH,aAJW,MAAM,KACN,MAAM,KACN,MAAM,UAehB;IAED;;;OAGG;IACH,oBAFW,MAAM,QAiBhB;IAuBD,mBAUC;IAED;;;;OAIG;IACH,mBAHW,KAAK,cACL,UAAQ;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAC;QAAC,CAAC,EAAC,MAAM,CAAA;KAAC,QAchD;;CACJ;oBAjKY,OAAO,wCAAwC,EAAE,KAAK;gCAJnC,wDAAwD"}
@@ -7,6 +7,10 @@ import {
7
7
  } from "../../../../core/geom/3d/tetrahedra/delaunay/grid/tetrahedral_mesh_build_from_grid.js";
8
8
  import { TetrahedralMesh } from "../../../../core/geom/3d/tetrahedra/TetrahedralMesh.js";
9
9
 
10
+
11
+ /**
12
+ * @typedef {import("../../../../core/geom/3d/aabb/AABB3.js").AABB3} AABB3
13
+ */
10
14
  export class LightProbeVolume {
11
15
  #mesh = new TetrahedralMesh();
12
16
  #positions = new Float32Array(0);
@@ -4,6 +4,18 @@
4
4
  * @type {number}
5
5
  */
6
6
  export const PREFIX_SCAN_CSDLDF_PARTITION_SIZE: number;
7
+ /**
8
+ * `u32` words of header that sit in front of the scanned elements.
9
+ *
10
+ * The scan reads its element count from word 0 and its `elements` member is `@align(16)`, so the
11
+ * first element lands at word 4 and words 1..3 are padding the scan never reads. A caller that
12
+ * binds the same buffer flat as an `array<u32>` — every producer of a histogram this scan consumes
13
+ * does — has to step over the header by hand, and this is the number to step by. Derived from the
14
+ * struct so the two cannot drift apart.
15
+ *
16
+ * @type {number}
17
+ */
18
+ export const PREFIX_SCAN_CSDLDF_HEADER_WORDS: number;
7
19
  /**
8
20
  * Chained Scan with Decoupled Lookback Decoupled Fallback
9
21
  * @see https://escholarship.org/content/qt0bk9z4bt/qt0bk9z4bt.pdf
@@ -1 +1 @@
1
- {"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;AA+StD;;;;;GAKG;AACH,wCAFU,aAAa,CAMpB;8BAjU2B,kCAAkC"}
1
+ {"version":3,"file":"shader_prefix_scan_csdldf.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,gDAFU,MAAM,CAEsC;AAOtD;;;;;;;;;;GAUG;AACH,8CAFU,MAAM,CAE6E;AA0S7F;;;;;GAKG;AACH,wCAFU,aAAa,CAMpB;8BA9U2B,kCAAkC"}
@@ -19,6 +19,19 @@ const DATA_STRUCT = WebGPUStruct.from({
19
19
  elements: WebGPUArray.from(vec4u),
20
20
  });
21
21
 
22
+ /**
23
+ * `u32` words of header that sit in front of the scanned elements.
24
+ *
25
+ * The scan reads its element count from word 0 and its `elements` member is `@align(16)`, so the
26
+ * first element lands at word 4 and words 1..3 are padding the scan never reads. A caller that
27
+ * binds the same buffer flat as an `array<u32>` — every producer of a histogram this scan consumes
28
+ * does — has to step over the header by hand, and this is the number to step by. Derived from the
29
+ * struct so the two cannot drift apart.
30
+ *
31
+ * @type {number}
32
+ */
33
+ export const PREFIX_SCAN_CSDLDF_HEADER_WORDS = DATA_STRUCT.get("elements").offset / u32.size;
34
+
22
35
  const resources = new ShaderResourceSetDescriptor();
23
36
  resources.createGroup()
24
37
  .addStorageBuffer("scan_in", DATA_STRUCT, true)
@@ -8,7 +8,7 @@
8
8
  export function parse_rgbe(buffer: ArrayBuffer, type?: BinaryDataType.Float16 | BinaryDataType.Float32): {
9
9
  width: number;
10
10
  height: number;
11
- data: Uint16Array | Float32Array;
11
+ data: Float32Array | Uint16Array;
12
12
  header: string;
13
13
  gamma: number;
14
14
  exposure: number;
@@ -13,7 +13,7 @@ export class TinyGltf {
13
13
  * @readonly
14
14
  * @type {TextureFormat}
15
15
  */
16
- static readonly "__#221@#UNCOMPRESSED_TARGET": TextureFormat;
16
+ static readonly "__#222@#UNCOMPRESSED_TARGET": TextureFormat;
17
17
  /**
18
18
  * @param {AssetManager} assetManager
19
19
  * @param {AssetRequestScope} [scope]
@@ -35,6 +35,7 @@ runtime GPU: particle pool (array<u32>, uniform stride) + alive/dead lists + cou
35
35
  ┌─ resolve emitter transforms (bone attach)
36
36
  ├─ emit (VM SPAWN program) ── pop dead → init → append alive_new
37
37
  ├─ simulate (VM UPDATE program) ── update → (kill→dead | keep→alive_new + depth key)
38
+ ├─ bucket (histogram → csdldf scan → scatter) ── alive → program-coherent sim list
38
39
  ├─ compact/indirect-args
39
40
  ├─ sort (radix: histogram → csdldf scan → scatter) [transparent]
40
41
  └─ render (instanced billboard quads, forward + optional lighting + soft depth)
@@ -52,14 +53,16 @@ Lifecycle uses the canonical GPU dead-list / alive-list ping-pong:
52
53
  - `alive_list[2]`: ping-pong compact lists of live slot indices (+ counts).
53
54
  - `counters`: atomics {alive_count, dead_count, spawn cursor…} + derived indirect dispatch/draw args.
54
55
 
55
- Emit: pop dead → run SPAWN → append `alive_new`. Simulate: read `alive_current` run UPDATE
56
- kill pushes to `dead`, survival appends to `alive_new` and writes a depth sort key. Swap lists each
57
- frame.
56
+ Emit: pop dead → run SPAWN → append `alive_new`. Simulate: read the **coherence list** last frame's
57
+ bucketing pass built from `alive_current` → run UPDATE → kill pushes to `dead`, survival appends to
58
+ `alive_new` and writes a depth sort key. Swap lists each frame.
58
59
 
59
- **The loop is strictly GPU-driven.** The build-indirect pass snapshots the frame's final alive count
60
- into `counters[ALIVE_IN]` and writes the indirect dispatch args next frame's simulate consumes
61
- (`dispatchWorkgroupsIndirect`) plus the indirect draw args this frame's render consumes
62
- (`drawIndirect`); simulate bound-checks against the ALIVE_IN snapshot. Sizing any of this from a CPU
60
+ **The loop is strictly GPU-driven.** The build-indirect pass snapshots the padded length of the
61
+ coherence list into `counters[ALIVE_IN]` and writes the indirect dispatch args next frame's simulate
62
+ consumes (`dispatchWorkgroupsIndirect`) plus the indirect draw args this frame's render consumes
63
+ (`drawIndirect`, sized by the *unpadded* alive count); simulate bound-checks against the ALIVE_IN
64
+ snapshot. Because both come from one value and a padded length is a whole number of workgroups, the
65
+ dispatch's thread count and the shader's bound agree exactly. Sizing any of this from a CPU
63
66
  readback is a correctness bug, not a shortcut: the readback is inevitably stale, so a growing
64
67
  population orphans the tail of the alive list (slots leak into limbo) and a shrinking one
65
68
  re-simulates stale entries — double-freeing slots so two live particles later share one record. The
@@ -117,11 +120,45 @@ time; on wake, spawn-count is caught up (bounded steps, like meep's `ParticularE
117
120
  attached to a bone read `node.global` from the scene transforms table (GPU-side) each frame to derive
118
121
  their world transform, after `graph_scene_update_transform_hierarchy` has run.
119
122
 
120
- ### Sorting
121
-
122
- Per-frame, transparent emitters' particles are sorted back-to-front by view depth. LSD radix sort on
123
- a 32-bit key (quantized view depth): per digit build histogram, `graph_prefix_scan_csdldf` the bin
124
- counts to offsets, scatter (index payload). Sorted index list feeds the instanced draw.
123
+ ### Two orderings, and why they are separate
124
+
125
+ There are two independent permutations of the live particles each frame. They are produced by
126
+ different passes into different buffers and must not be conflated or derived from one another.
127
+
128
+ **Simulation order** (`coherence/`) — camera-independent, changes only when emitters or their
129
+ programs change. The alive list comes out of compaction (`atomicAdd(&counters[ALIVE])`), so its
130
+ order says nothing about which emitter a particle belongs to and a wave routinely holds particles
131
+ running different VM programs. That costs twice: the interpreter's ~40-case opcode `switch`
132
+ diverges, so a wave serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` /
133
+ `vm_reg[s0]` index a VGPR-resident register file dynamically, which AMD reaches with
134
+ `v_movrels`/`v_movreld` behind a waterfall loop whose trip count is the number of *distinct*
135
+ register indices live in the wave. Grouping the wave by program collapses both at once.
136
+
137
+ The bucket key is the **program**, not the emitter: `ProgramArena` deduplicates by content and hands
138
+ back a dense `program_id` the emitter record carries, so emitters compiled from the same graph share
139
+ one bucket. Each bucket is padded out to `PARTICLE_SIMULATE_WORKGROUP_SIZE` (64 — a multiple of both
140
+ plausible subgroup widths, so no shader needs to query `subgroup_size`), which is what makes the
141
+ grouping hold at wave granularity: an unpadded boundary lands mid-wave and that wave spans two
142
+ programs again. Padding entries carry `PARTICLE_SIM_PAD_SLOT` and the simulate shader drops them
143
+ *before* the compaction atomics, so they never enter the alive or dead list.
144
+
145
+ It is an **indirection** list. Particle records never move: slots are referenced by the dead list and
146
+ across frames, so relocating a record would leave both pointing at the wrong particle.
147
+
148
+ The three-phase shape is the depth sort's, with the padding added: histogram (atomic per bucket) →
149
+ round each bin up to a whole workgroup → `graph_prefix_scan_csdldf` (reused as-is — the one scan here
150
+ whose only cross-workgroup wait is CSDLDF's bounded spin-then-fallback) → scatter → fill the tails
151
+ with the sentinel. Nothing reads back to the CPU; the only host-supplied number is the bucket count,
152
+ which is static topology.
153
+
154
+ **Render order** (`sort/`) — per-frame, transparent emitters' particles sorted back-to-front by view
155
+ depth so premultiplied transparency composites correctly. LSD radix sort on a 32-bit key (quantized
156
+ view depth): per digit — build histogram, `graph_prefix_scan_csdldf` the bin counts to offsets,
157
+ scatter (index payload). Sorted index list feeds the instanced draw.
158
+
159
+ Reordering the render list for program coherence would break transparency; depth-sorting the
160
+ simulation list would destroy the coherence. They share no buffer and no counter slot —
161
+ `PARTICLE_COUNTER.SORTED` belongs to the render order, `SIM_PADDED` to the simulation order.
125
162
 
126
163
  ### Rendering
127
164
 
@@ -149,6 +186,9 @@ src/webgpu/renderer/particles/
149
186
  graph/compile_particle_graph.js graph → Program (register alloc, const intern)
150
187
  layout/ParticleLayout.js attribute schema ↔ record word offsets
151
188
  data/*_STRUCT.js EMITTER_STRUCT, counters, render binding, sort key
189
+ coherence/particle_program_buckets.js CPU reference for the simulation-order bucketing
190
+ coherence/shader_particle_bucket.js reset / histogram / pad / scatter / fill
191
+ coherence/graph_particle_bucket.js frame-graph wiring, around graph_prefix_scan_csdldf
152
192
  runtime/ParticlePool.js pool + alive/dead lists + counters (buffers)
153
193
  runtime/ProgramArena.js packed program+const buffer
154
194
  runtime/ParticleAtlas.js sprite atlas texture + region table
@@ -186,6 +226,13 @@ Built and tested (80 tests, 16 files):
186
226
  - **Runtime** — ProgramArena, EmitterRegistry, ParticleSpawnScheduler (sleep-when-culled), the
187
227
  GPUParticleSystem CPU model (bone-attach transform patching, free list, ping-pong).
188
228
  - **Sort** — counting sort reference + histogram/scatter shaders bracketing `graph_prefix_scan_csdldf`.
229
+ - **Coherence** — CPU reference plus the five bucketing shaders, on the emulator and validated as
230
+ WGSL; the whole chain is run end to end against the reference, pinning that bucket boundaries land
231
+ on multiples of 64, that no workgroup of the result spans two programs, and that every input slot
232
+ survives exactly once. Orchestration is pinned twice on `SoftwareGPUDevice`: `graph_particles.spec`
233
+ records the real frame graph (pass order, indirect sizing, the two orderings in separate buffers,
234
+ and every persistent buffer imported exactly once — two imports of one buffer are two resource
235
+ entries the graph cannot tell apart), and the playground spec covers the hand-encoded equivalent.
189
236
  - **Render math** — billboard modes, atlas/flipbook UV, soft fade, premultiplied blend.
190
237
  - **Finalize** — reset + build-indirect passes.
191
238
  - **Culling** — frustum sphere test.
@@ -197,11 +244,15 @@ the **prototype** effects.
197
244
 
198
245
  ### Emulator caveats discovered (all correct on real hardware)
199
246
 
200
- The in-repo WGSL emulator (unit-test tool, not GPU parity) has three limitations the shaders are
247
+ The in-repo WGSL emulator (unit-test tool, not GPU parity) has four limitations the shaders are
201
248
  written around, documented in the memory note: `switch` case bodies are dropped (use if/else);
202
249
  repeated read-modify-write of one location across a loop is corrupted (RNG is verified in isolation,
203
- not through the interpreter loop); and u32 multiply is imprecise for large operands (PCG can't be
204
- checked through it). `array<atomic<u32>>` bindings are modeled as `{value}` objects in tests.
250
+ not through the interpreter loop); u32 multiply is imprecise for large operands (PCG can't be
251
+ checked through it); and `/` is FLOAT division, so integer division only truncates where the result
252
+ is stored straight into a typed array — `(n + 63u) / 64u * 64u` reads as 66 there and 64 on a
253
+ device. The coherence pass's round-up is a mask (`(n + 63u) & 0xffffffc0u`) for exactly that reason,
254
+ and the fill pass splits its thread id with `>>` and `&` rather than `/` and `%`.
255
+ `array<atomic<u32>>` bindings are modeled as `{value}` objects in tests.
205
256
 
206
257
  ### Renderer integration (remaining hook-up)
207
258
 
@@ -12,11 +12,18 @@
12
12
  * 1. reset counters (snapshot the previous alive count as this frame's simulate input, zero the new
13
13
  * alive count)
14
14
  * 2. emit — run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
15
- * 3. simulate — one dispatch runs every emitter's UPDATE over the previous alive list, compacting
16
- * survivors into the new alive list and freed slots into the dead list
17
- * 4. build indirect derive the render draw's instance count from the new alive count
18
- * 5. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
19
- * 6. renderone instanced billboard draw over the sorted list
15
+ * 3. simulate — one dispatch runs every emitter's UPDATE over the coherence list built last frame,
16
+ * compacting survivors into the new alive list and freed slots into the dead list
17
+ * 4. bucketregroup the new alive list by VM program, padded to whole workgroups, into the list
18
+ * NEXT frame's simulate consumes (`coherence/`)
19
+ * 5. build indirect derive next frame's simulate dispatch from the padded list length and this
20
+ * frame's render draw instance count from the alive count
21
+ * 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
22
+ * 7. render — one instanced billboard draw over the sorted list
23
+ *
24
+ * Steps 4 and 6 are two different orderings of the same particles and share nothing: the
25
+ * simulation order is program-coherent and camera-independent, the render order is back-to-front
26
+ * and changes with the camera. Separate buffers, separate passes, separate counter slots.
20
27
  *
21
28
  * The alive lists ping-pong by frame parity, exactly like the ReSTIR reservoirs.
22
29
  *
@@ -49,6 +56,13 @@ export class GPUParticleSystem {
49
56
  /** CPU shadow of the packed emitter buffer (for in-place transform patching) */
50
57
  emitter_cpu: Uint32Array;
51
58
  emitters_dirty: boolean;
59
+ /**
60
+ * Distinct compiled programs across the emitter set — the number of buckets the coherence
61
+ * pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
62
+ * is a safe upper bound (programs can be shared, never invented).
63
+ * @type {number|undefined}
64
+ */
65
+ program_count: number | undefined;
52
66
  /**
53
67
  * Register an emitter.
54
68
  * @param {object} config see {@link EmitterRegistry#add}
@@ -82,6 +96,16 @@ export class GPUParticleSystem {
82
96
  program: Uint32Array;
83
97
  constants: Uint32Array;
84
98
  };
99
+ /**
100
+ * Number of simulation-order buckets — one per distinct compiled program.
101
+ *
102
+ * This is the coherence pass's only host-provided number, and it is static topology rather than
103
+ * per-frame state: it changes when the emitter set changes, not as particles are born and die.
104
+ * Everything the pass measures per frame stays on the GPU.
105
+ *
106
+ * @returns {number}
107
+ */
108
+ bucketCount(): number;
85
109
  /**
86
110
  * Sizes of the persistent buffers, in bytes. Exposed for tests and allocation.
87
111
  * @returns {object}
@@ -1 +1 @@
1
- {"version":3,"file":"GPUParticleSystem.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/GPUParticleSystem.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH;IACI;;;;OAIG;IACH,sBAJW,MAAM;QAEW,QAAQ,GAAzB,MAAM;OAuBhB;IAjBG,cAAwB;IACxB,iBAAwB;IAExB,0BAAqC;IACrC,kCAA6C;IAE7C,gEAAgE;IAChE,aADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACF;IAE5B,qBAAqB;IACrB,OADW,MAAM,CACH;IAEd,mCAAmC;IACnC,aAAwB;IACxB,gFAAgF;IAChF,yBAA4B;IAC5B,wBAA0B;IAG9B;;;;OAIG;IACH,mBAHW,MAAM,GACJ,MAAM,CAMlB;IAED;;;;;OAKG;IACH,4BAHW,MAAM,QACN,MAAM,QAIhB;IAED;;;;;;;OAOG;IACH,WALW,MAAM;oCAES,MAAM,KAAK,OAAO;QAC/B,WAAW,CAiBvB;IAED;;;OAGG;IACH,oBAFa;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAC,CAOjF;IAED;;;OAGG;IACH,eAFa,MAAM,CAalB;IAED;;;OAGG;IACH;cAFoB,WAAW;kBAAY,WAAW;MAUrD;IAED;;;OAGG;IACH;cAFoB,MAAM;eAAS,MAAM;MAKxC;CACJ;gCA7J+B,8BAA8B;uCACvB,qCAAqC"}
1
+ {"version":3,"file":"GPUParticleSystem.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/GPUParticleSystem.js"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH;IACI;;;;OAIG;IACH,sBAJW,MAAM;QAEW,QAAQ,GAAzB,MAAM;OA8BhB;IAxBG,cAAwB;IACxB,iBAAwB;IAExB,0BAAqC;IACrC,kCAA6C;IAE7C,gEAAgE;IAChE,aADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACF;IAE5B,qBAAqB;IACrB,OADW,MAAM,CACH;IAEd,mCAAmC;IACnC,aAAwB;IACxB,gFAAgF;IAChF,yBAA4B;IAC5B,wBAA0B;IAC1B;;;;;OAKG;IACH,eAFU,MAAM,GAAC,SAAS,CAEI;IAGlC;;;;OAIG;IACH,mBAHW,MAAM,GACJ,MAAM,CAMlB;IAED;;;;;OAKG;IACH,4BAHW,MAAM,QACN,MAAM,QAIhB;IAED;;;;;;;OAOG;IACH,WALW,MAAM;oCAES,MAAM,KAAK,OAAO;QAC/B,WAAW,CAiBvB;IAED;;;OAGG;IACH,oBAFa;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAC,CAQjF;IAED;;;;;;;;OAQG;IACH,eAFa,MAAM,CAIlB;IAED;;;OAGG;IACH,eAFa,MAAM,CA+BlB;IAED;;;OAGG;IACH;cAFoB,WAAW;kBAAY,WAAW;MAUrD;IAED;;;OAGG;IACH;cAFoB,MAAM;eAAS,MAAM;MAKxC;CACJ;gCA3M+B,8BAA8B;uCACvB,qCAAqC"}
@@ -1,5 +1,6 @@
1
1
  import { assert } from "../../../core/assert.js";
2
- import { PARTICLE_RECORD_WORD_COUNT } from "./ParticleConstants.js";
2
+ import { PARTICLE_RECORD_WORD_COUNT, PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./ParticleConstants.js";
3
+ import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
3
4
  import { EMITTER_STRIDE, write_emitter_transform } from "./data/PARTICLE_EMITTER_LAYOUT.js";
4
5
  import { PARTICLE_COUNTER, PARTICLE_COUNTER_COUNT } from "./data/PARTICLE_COUNTERS.js";
5
6
  import { EmitterRegistry } from "./runtime/EmitterRegistry.js";
@@ -19,11 +20,18 @@ import { ParticleSpawnScheduler } from "./runtime/ParticleSpawnScheduler.js";
19
20
  * 1. reset counters (snapshot the previous alive count as this frame's simulate input, zero the new
20
21
  * alive count)
21
22
  * 2. emit — run SPAWN for each scheduled spawn request (pop dead -> init -> append alive)
22
- * 3. simulate — one dispatch runs every emitter's UPDATE over the previous alive list, compacting
23
- * survivors into the new alive list and freed slots into the dead list
24
- * 4. build indirect derive the render draw's instance count from the new alive count
25
- * 5. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
26
- * 6. renderone instanced billboard draw over the sorted list
23
+ * 3. simulate — one dispatch runs every emitter's UPDATE over the coherence list built last frame,
24
+ * compacting survivors into the new alive list and freed slots into the dead list
25
+ * 4. bucketregroup the new alive list by VM program, padded to whole workgroups, into the list
26
+ * NEXT frame's simulate consumes (`coherence/`)
27
+ * 5. build indirect derive next frame's simulate dispatch from the padded list length and this
28
+ * frame's render draw instance count from the alive count
29
+ * 6. sort (optional) — histogram -> csdldf scan -> scatter to a back-to-front index list
30
+ * 7. render — one instanced billboard draw over the sorted list
31
+ *
32
+ * Steps 4 and 6 are two different orderings of the same particles and share nothing: the
33
+ * simulation order is program-coherent and camera-independent, the render order is back-to-front
34
+ * and changes with the camera. Separate buffers, separate passes, separate counter slots.
27
35
  *
28
36
  * The alive lists ping-pong by frame parity, exactly like the ReSTIR reservoirs.
29
37
  *
@@ -61,6 +69,13 @@ export class GPUParticleSystem {
61
69
  /** CPU shadow of the packed emitter buffer (for in-place transform patching) */
62
70
  this.emitter_cpu = undefined;
63
71
  this.emitters_dirty = true;
72
+ /**
73
+ * Distinct compiled programs across the emitter set — the number of buckets the coherence
74
+ * pass sorts into. Known only after {@link buildEmitterData}; until then the emitter count
75
+ * is a safe upper bound (programs can be shared, never invented).
76
+ * @type {number|undefined}
77
+ */
78
+ this.program_count = undefined;
64
79
  }
65
80
 
66
81
  /**
@@ -116,24 +131,56 @@ export class GPUParticleSystem {
116
131
  buildEmitterData() {
117
132
  const built = this.registry.build();
118
133
  this.emitter_cpu = built.emitters;
134
+ this.program_count = built.program_count;
119
135
  this.emitters_dirty = false;
120
136
  return built;
121
137
  }
122
138
 
139
+ /**
140
+ * Number of simulation-order buckets — one per distinct compiled program.
141
+ *
142
+ * This is the coherence pass's only host-provided number, and it is static topology rather than
143
+ * per-frame state: it changes when the emitter set changes, not as particles are born and die.
144
+ * Everything the pass measures per frame stays on the GPU.
145
+ *
146
+ * @returns {number}
147
+ */
148
+ bucketCount() {
149
+ return Math.max(1, this.program_count ?? this.registry.count);
150
+ }
151
+
123
152
  /**
124
153
  * Sizes of the persistent buffers, in bytes. Exposed for tests and allocation.
125
154
  * @returns {object}
126
155
  */
127
156
  bufferSizes() {
128
157
  const u32 = 4;
158
+ const buckets = this.bucketCount();
159
+
129
160
  return {
130
161
  pool: this.capacity * PARTICLE_RECORD_WORD_COUNT * u32,
131
162
  alive_list: this.capacity * u32,
132
163
  dead_list: this.capacity * u32,
133
164
  counters: PARTICLE_COUNTER_COUNT * u32,
165
+ // render order (sort/)
134
166
  sorted: this.capacity * u32,
135
167
  keys: this.capacity * u32,
136
168
  emitter_record: EMITTER_STRIDE * u32,
169
+
170
+ // simulation order (coherence/) — a separate set of buffers on purpose; sharing any of
171
+ // them with the render order would couple a camera-driven ordering to a program-driven
172
+ // one.
173
+ //
174
+ // Padding rounds each bucket up to a whole workgroup, so it can add at most
175
+ // `workgroup - 1` entries per bucket; one whole workgroup per bucket is the bound.
176
+ sim_list: (this.capacity + buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE) * u32,
177
+ sim_keys: this.capacity * u32,
178
+ // `{count, elements}` for the CSDLDF scan; the scan reads whole vec4s, so the bins are
179
+ // rounded up to a multiple of four.
180
+ sim_histogram: (PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(buckets)) * u32,
181
+ sim_bucket_counts: buckets * u32,
182
+ sim_cursor: buckets * u32,
183
+ sim_dispatch_args: 3 * u32,
137
184
  };
138
185
  }
139
186
 
@@ -160,3 +207,11 @@ export class GPUParticleSystem {
160
207
  return { read, write: 1 - read };
161
208
  }
162
209
  }
210
+
211
+ /**
212
+ * @param {number} value
213
+ * @returns {number} `value` rounded up to a multiple of four
214
+ */
215
+ function round_up_4(value) {
216
+ return (value + 3) & ~3;
217
+ }
@@ -42,4 +42,35 @@ export const PARTICLE_VM_INSTRUCTION_WORDS: number;
42
42
  * @type {number}
43
43
  */
44
44
  export const PARTICLE_VM_MAX_INSTRUCTIONS: number;
45
+ /**
46
+ * Threads per workgroup in the simulate dispatch — and therefore the granularity the simulate input
47
+ * list is bucketed to (see `coherence/`).
48
+ *
49
+ * 64 is a multiple of both subgroup widths a WebGPU implementation plausibly reports (32 on NVIDIA
50
+ * and RDNA wave32, 64 on GCN wave64), so aligning a bucket to it aligns it to a wave without the
51
+ * shader ever having to query `subgroup_size`. It is also a power of two, which is what lets the
52
+ * round-up be a mask rather than a divide — the WGSL emulator's `/` is float division, so an
53
+ * integer-truncating round-up would read differently there than on a device.
54
+ *
55
+ * Lives here rather than in the simulate shader because the bucketing passes, the CPU reference and
56
+ * the indirect-args pass all have to agree on it; `shaders/shader_particle_simulate.js` re-exports
57
+ * it for callers that think of it as that pass's property.
58
+ *
59
+ * @type {number}
60
+ */
61
+ export const PARTICLE_SIMULATE_WORKGROUP_SIZE: number;
62
+ /**
63
+ * Slot value carried by a padding entry in the simulate input list.
64
+ *
65
+ * Bucketing pads each program's run out to {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} so no wave ever
66
+ * spans two VM programs; the entries that padding adds name no particle. The simulate shader must
67
+ * recognise this and return BEFORE the compaction atomics, so a padding lane never appends to the
68
+ * alive list and never pushes a slot onto the dead (free) list.
69
+ *
70
+ * `0xffffffff` is not a reachable slot index: a slot index addresses `pool` at
71
+ * `slot * PARTICLE_RECORD_WORD_COUNT`, so a pool with 2^32-1 slots would need 512 GiB.
72
+ *
73
+ * @type {number}
74
+ */
75
+ export const PARTICLE_SIM_PAD_SLOT: number;
45
76
  //# sourceMappingURL=ParticleConstants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParticleConstants.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/ParticleConstants.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;GAIG;AACH,2CAFU,MAAM,CAEgC"}
1
+ {"version":3,"file":"ParticleConstants.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/particles/ParticleConstants.js"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,6CAFU,MAAM,CAEgC;AAEhD;;;GAGG;AACH,8CAFU,MAAM,CAEiC;AAEjD;;;GAGG;AACH,yCAFU,MAAM,CAE6B;AAE7C;;;GAGG;AACH,4CAFU,MAAM,CAE+B;AAE/C;;;;GAIG;AACH,2CAFU,MAAM,CAEgC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,+CAFU,MAAM,CAEmC;AAEnD;;;;;;;;;;;;GAYG;AACH,oCAFU,MAAM,CAEgC"}
@@ -48,3 +48,36 @@ export const PARTICLE_VM_INSTRUCTION_WORDS = 5;
48
48
  * @type {number}
49
49
  */
50
50
  export const PARTICLE_VM_MAX_INSTRUCTIONS = 256;
51
+
52
+ /**
53
+ * Threads per workgroup in the simulate dispatch — and therefore the granularity the simulate input
54
+ * list is bucketed to (see `coherence/`).
55
+ *
56
+ * 64 is a multiple of both subgroup widths a WebGPU implementation plausibly reports (32 on NVIDIA
57
+ * and RDNA wave32, 64 on GCN wave64), so aligning a bucket to it aligns it to a wave without the
58
+ * shader ever having to query `subgroup_size`. It is also a power of two, which is what lets the
59
+ * round-up be a mask rather than a divide — the WGSL emulator's `/` is float division, so an
60
+ * integer-truncating round-up would read differently there than on a device.
61
+ *
62
+ * Lives here rather than in the simulate shader because the bucketing passes, the CPU reference and
63
+ * the indirect-args pass all have to agree on it; `shaders/shader_particle_simulate.js` re-exports
64
+ * it for callers that think of it as that pass's property.
65
+ *
66
+ * @type {number}
67
+ */
68
+ export const PARTICLE_SIMULATE_WORKGROUP_SIZE = 64;
69
+
70
+ /**
71
+ * Slot value carried by a padding entry in the simulate input list.
72
+ *
73
+ * Bucketing pads each program's run out to {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} so no wave ever
74
+ * spans two VM programs; the entries that padding adds name no particle. The simulate shader must
75
+ * recognise this and return BEFORE the compaction atomics, so a padding lane never appends to the
76
+ * alive list and never pushes a slot onto the dead (free) list.
77
+ *
78
+ * `0xffffffff` is not a reachable slot index: a slot index addresses `pool` at
79
+ * `slot * PARTICLE_RECORD_WORD_COUNT`, so a pool with 2^32-1 slots would need 512 GiB.
80
+ *
81
+ * @type {number}
82
+ */
83
+ export const PARTICLE_SIM_PAD_SLOT = 0xffffffff;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Frame-graph wiring for the simulation-order bucketing: turns the frame's freshly compacted alive
3
+ * list into the program-coherent, workgroup-padded list NEXT frame's simulate consumes.
4
+ *
5
+ * Runs at the end of the frame, after emit and simulate have both finished appending to the alive
6
+ * list and before the build-indirect pass, which reads the padded length this produces
7
+ * ({@link PARTICLE_COUNTER.SIM_PADDED}) and turns it into next frame's dispatch args and bound.
8
+ *
9
+ * Six passes, the middle one being `graph_prefix_scan_csdldf` reused unchanged — the same scan the
10
+ * radix sort runs its spine through. Reusing it is deliberate: it is the one prefix scan in this
11
+ * codebase whose only cross-workgroup wait is CSDLDF's own bounded-spin-then-fallback, so the pass
12
+ * makes progress on a scheduler that offers no fairness guarantee. A hand-rolled scan here would be
13
+ * a second place to get that wrong.
14
+ *
15
+ * Nothing on this path reads back to the CPU. The only host-supplied number is `bucket_count`, and
16
+ * that is static topology — it changes when the emitter set does, never as particles are born and
17
+ * die. The per-frame quantities (the alive count, the bin sizes, the padded total) are produced and
18
+ * consumed entirely on the GPU, including the dispatch size of the two per-particle passes, which
19
+ * the reset pass writes into `sim_dispatch_args` from the GPU's own alive count.
20
+ *
21
+ * @param {object} params
22
+ * @param {import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph} params.graph
23
+ * @param {object} params.gpu persistent buffers owned by the feature (GPUBuffer instances)
24
+ * @param {GPUBuffer} params.gpu.sim_list the padded, program-coherent index list this produces
25
+ * @param {GPUBuffer} params.gpu.sim_keys per-alive-entry program id
26
+ * @param {GPUBuffer} params.gpu.sim_histogram `{count, elements}` bins for the CSDLDF scan
27
+ * @param {GPUBuffer} params.gpu.sim_bucket_counts raw (unpadded) per-bucket counts
28
+ * @param {GPUBuffer} params.gpu.sim_cursor per-bucket scatter cursor
29
+ * @param {GPUBuffer} params.gpu.sim_dispatch_args indirect args for the two per-particle passes
30
+ * @param {number} params.emitters graph handle of the packed emitter records
31
+ * @param {number} params.pool graph handle of the particle pool
32
+ * @param {number} params.alive graph handle of this frame's compacted alive list
33
+ * @param {number} params.counters graph handle of the atomic counters
34
+ * @param {number} params.sim_list graph handle of the list this rewrites. Passed in rather than
35
+ * imported here because the simulate pass reads it earlier in the same frame: importing the same
36
+ * GPUBuffer twice makes two resource entries the graph cannot see are the same memory, so the read
37
+ * and the write end up on separate dependency chains
38
+ * @param {number} params.bucket_count number of distinct compiled programs
39
+ * @returns {{counters: number, sim_list: number}} the threaded handles downstream passes must read
40
+ */
41
+ export function graph_particle_bucket({ graph, gpu, emitters, pool, alive, counters, sim_list, bucket_count }: {
42
+ graph: import("../../../../engine/graphics/render/frame_graph/FrameGraph.js").FrameGraph;
43
+ gpu: {
44
+ sim_list: GPUBuffer;
45
+ sim_keys: GPUBuffer;
46
+ sim_histogram: GPUBuffer;
47
+ sim_bucket_counts: GPUBuffer;
48
+ sim_cursor: GPUBuffer;
49
+ sim_dispatch_args: GPUBuffer;
50
+ };
51
+ emitters: number;
52
+ pool: number;
53
+ alive: number;
54
+ counters: number;
55
+ sim_list: number;
56
+ bucket_count: number;
57
+ }): {
58
+ counters: number;
59
+ sim_list: number;
60
+ };
61
+ //# sourceMappingURL=graph_particle_bucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph_particle_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/coherence/graph_particle_bucket.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH;IAnBqG,KAAK,EAA/F,OAAO,8DAA8D,EAAE,UAAU;IAClE,GAAG;QACI,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,iBAAiB;QACjB,UAAU;QACV,iBAAiB;;IACxB,QAAQ,EAAvB,MAAM;IACS,IAAI,EAAnB,MAAM;IACS,KAAK,EAApB,MAAM;IACS,QAAQ,EAAvB,MAAM;IACS,QAAQ,EAAvB,MAAM;IAIS,YAAY,EAA3B,MAAM;IACJ;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAqGhD"}