@woosh/meep-engine 3.14.5 → 3.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/README.md +6 -0
  2. package/editor/Editor.d.ts +162 -0
  3. package/editor/Editor.d.ts.map +1 -0
  4. package/editor/EditorCameraNavigation.d.ts +22 -0
  5. package/editor/EditorCameraNavigation.d.ts.map +1 -0
  6. package/editor/EditorKeyMap.d.ts +28 -0
  7. package/editor/EditorKeyMap.d.ts.map +1 -0
  8. package/editor/SelectionVisualizer.d.ts +37 -0
  9. package/editor/SelectionVisualizer.d.ts.map +1 -0
  10. package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
  11. package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
  12. package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
  13. package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
  14. package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
  15. package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
  16. package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
  17. package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
  18. package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
  19. package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
  20. package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
  21. package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
  22. package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
  23. package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
  24. package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
  25. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
  26. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
  27. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
  28. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
  29. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
  30. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
  31. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
  32. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
  33. package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
  34. package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
  35. package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
  36. package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
  37. package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
  38. package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
  39. package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
  40. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
  41. package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
  42. package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
  43. package/editor/camera/camera_framing.d.ts +33 -0
  44. package/editor/camera/camera_framing.d.ts.map +1 -0
  45. package/editor/clipboard.d.ts +19 -0
  46. package/editor/clipboard.d.ts.map +1 -0
  47. package/editor/ecs/EditorEntity.d.ts +16 -0
  48. package/editor/ecs/EditorEntity.d.ts.map +1 -0
  49. package/editor/ecs/EditorEntitySystem.d.ts +8 -0
  50. package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
  51. package/editor/ecs/component/TypeEditor.d.ts +7 -1
  52. package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
  53. package/editor/ecs/component/TypeEditor.js +5 -0
  54. package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
  55. package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
  56. package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
  57. package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
  58. package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
  59. package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
  60. package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
  61. package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
  62. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
  63. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
  64. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
  65. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
  66. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
  67. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
  68. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
  69. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
  70. package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
  71. package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
  72. package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
  73. package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
  74. package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
  75. package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
  76. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
  77. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
  78. package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
  79. package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
  80. package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
  81. package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
  82. package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
  83. package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
  84. package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
  85. package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
  86. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
  87. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
  88. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
  89. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
  90. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
  91. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
  92. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
  93. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
  94. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
  95. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
  96. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
  97. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
  98. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
  99. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
  100. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
  101. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
  102. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
  103. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
  104. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
  105. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
  106. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
  107. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
  108. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
  109. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
  110. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
  111. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
  112. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
  113. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
  114. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
  115. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
  116. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
  117. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
  118. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
  119. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
  120. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
  121. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
  122. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
  123. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
  124. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
  125. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
  126. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
  127. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
  128. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
  129. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
  130. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
  131. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
  132. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
  133. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
  134. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
  135. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
  136. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
  137. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
  138. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
  139. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
  140. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
  142. package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
  144. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
  145. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
  146. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
  147. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
  148. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
  149. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
  150. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
  151. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
  152. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
  153. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
  154. package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
  155. package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
  156. package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
  157. package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
  158. package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
  159. package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
  160. package/editor/enableEditor.d.ts +14 -0
  161. package/editor/enableEditor.d.ts.map +1 -0
  162. package/editor/entity_world_bounds.d.ts +17 -0
  163. package/editor/entity_world_bounds.d.ts.map +1 -0
  164. package/editor/library/MeshLibrary.d.ts +13 -0
  165. package/editor/library/MeshLibrary.d.ts.map +1 -0
  166. package/editor/particles/lut_ops.d.ts +34 -0
  167. package/editor/particles/lut_ops.d.ts.map +1 -0
  168. package/editor/particles/particleEditEvents.d.ts +11 -0
  169. package/editor/particles/particleEditEvents.d.ts.map +1 -0
  170. package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
  171. package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
  172. package/editor/persistence/EditorLayoutStore.d.ts +30 -0
  173. package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
  174. package/editor/persistence/SceneMetadata.d.ts +38 -0
  175. package/editor/persistence/SceneMetadata.d.ts.map +1 -0
  176. package/editor/persistence/SceneSlotManager.d.ts +40 -0
  177. package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
  178. package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
  179. package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
  180. package/editor/persistence/files.d.ts +24 -0
  181. package/editor/persistence/files.d.ts.map +1 -0
  182. package/editor/persistence/scene_import.d.ts +45 -0
  183. package/editor/persistence/scene_import.d.ts.map +1 -0
  184. package/editor/persistence/scene_serialization.d.ts +36 -0
  185. package/editor/persistence/scene_serialization.d.ts.map +1 -0
  186. package/editor/persistence/string_buffer_codec.d.ts +20 -0
  187. package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
  188. package/editor/process/DisableGameUIProcess.d.ts +8 -0
  189. package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
  190. package/editor/process/EditorProcess.d.ts +19 -0
  191. package/editor/process/EditorProcess.d.ts.map +1 -0
  192. package/editor/process/GridDisplayProcess.d.ts +35 -0
  193. package/editor/process/GridDisplayProcess.d.ts.map +1 -0
  194. package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
  195. package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
  196. package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
  197. package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
  198. package/editor/process/ProcessEngine.d.ts +30 -0
  199. package/editor/process/ProcessEngine.d.ts.map +1 -0
  200. package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
  201. package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
  202. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
  203. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
  204. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
  205. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
  206. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
  207. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
  208. package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
  209. package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
  210. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
  211. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
  212. package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
  213. package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
  214. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
  215. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
  216. package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
  217. package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
  218. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
  219. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
  220. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
  221. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
  222. package/editor/prototypeEditorShell.d.ts +13 -0
  223. package/editor/prototypeEditorShell.d.ts.map +1 -0
  224. package/editor/selection/editor_pick.d.ts +43 -0
  225. package/editor/selection/editor_pick.d.ts.map +1 -0
  226. package/editor/selection/screen_rect_frustum.d.ts +32 -0
  227. package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
  228. package/editor/templates/entity_templates.d.ts +19 -0
  229. package/editor/templates/entity_templates.d.ts.map +1 -0
  230. package/editor/tools/GridPaintTool.d.ts +18 -0
  231. package/editor/tools/GridPaintTool.d.ts.map +1 -0
  232. package/editor/tools/SelectionTool.d.ts +38 -0
  233. package/editor/tools/SelectionTool.d.ts.map +1 -0
  234. package/editor/tools/SelectionTool.js +2 -2
  235. package/editor/tools/TransformToolV2.d.ts +70 -0
  236. package/editor/tools/TransformToolV2.d.ts.map +1 -0
  237. package/editor/tools/engine/Tool.d.ts +88 -0
  238. package/editor/tools/engine/Tool.d.ts.map +1 -0
  239. package/editor/tools/engine/ToolEngine.d.ts +22 -0
  240. package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
  241. package/editor/tools/engine/ToolState.d.ts +7 -0
  242. package/editor/tools/engine/ToolState.d.ts.map +1 -0
  243. package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
  244. package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
  245. package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
  246. package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
  247. package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
  248. package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
  249. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
  250. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
  251. package/editor/tools/v2/GizmoNode.d.ts +21 -0
  252. package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
  253. package/editor/tools/v2/TransformControls.d.ts +219 -0
  254. package/editor/tools/v2/TransformControls.d.ts.map +1 -0
  255. package/editor/tools/v2/TransformMode.d.ts +7 -0
  256. package/editor/tools/v2/TransformMode.d.ts.map +1 -0
  257. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
  258. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
  259. package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
  260. package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
  261. package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
  262. package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
  263. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
  264. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
  265. package/editor/view/GridPickCoordinateView.d.ts +22 -0
  266. package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
  267. package/editor/view/ecs/ComponentControlView.d.ts +24 -0
  268. package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
  269. package/editor/view/ecs/EntityEditor.d.ts +25 -0
  270. package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
  271. package/editor/view/ecs/EntityList.d.ts +22 -0
  272. package/editor/view/ecs/EntityList.d.ts.map +1 -0
  273. package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
  274. package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
  275. package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
  276. package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
  277. package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
  278. package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
  279. package/editor/view/ecs/components/color/GaugeView.js +4 -4
  280. package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
  281. package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
  282. package/editor/view/ecs/components/common/NumberController.js +4 -4
  283. package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
  284. package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
  285. package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
  286. package/editor/view/library/MeshLibraryView.d.ts +16 -0
  287. package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
  288. package/editor/view/library/mesh_library_drag.d.ts +21 -0
  289. package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
  290. package/editor/view/library/model_thumbnail_source.d.ts +12 -0
  291. package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
  292. package/editor/view/makeEntityDecorators.d.ts +6 -0
  293. package/editor/view/makeEntityDecorators.d.ts.map +1 -0
  294. package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
  295. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  296. package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
  297. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  298. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  299. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  300. package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
  301. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  302. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  303. package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
  304. package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
  305. package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
  306. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  307. package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
  308. package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
  309. package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
  310. package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
  311. package/editor/view/prepareMeshLibrary.d.ts +7 -0
  312. package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
  313. package/editor/view/process/ProcessView.d.ts +14 -0
  314. package/editor/view/process/ProcessView.d.ts.map +1 -0
  315. package/editor/view/shell/EditorShellView.d.ts +18 -0
  316. package/editor/view/shell/EditorShellView.d.ts.map +1 -0
  317. package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
  318. package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
  319. package/editor/view/shell/ViewportPanelView.d.ts +18 -0
  320. package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
  321. package/editor/view/tools/ToolSettingsView.d.ts +22 -0
  322. package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
  323. package/editor/view/tools/ToolView.d.ts +13 -0
  324. package/editor/view/tools/ToolView.d.ts.map +1 -0
  325. package/editor/view/v2/SplitView.d.ts +2 -0
  326. package/editor/view/v2/SplitView.d.ts.map +1 -0
  327. package/package.json +9 -11
  328. package/samples/engine/README.md +113 -0
  329. package/samples/engine/first-scene/index.html +32 -0
  330. package/samples/engine/first-scene/main.js +152 -0
  331. package/src/core/assert.d.ts +2 -2
  332. package/src/core/binary/BitSet.d.ts +2 -2
  333. package/src/core/binary/BitSet.d.ts.map +1 -1
  334. package/src/core/binary/BitSet.js +1 -1
  335. package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
  336. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  337. package/src/core/bvh2/bvh3/BVH.js +4 -0
  338. package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
  339. package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
  340. package/src/core/bvh2/bvh3/BvhClient.js +4 -0
  341. package/src/core/collection/array/array_sort_quick.d.ts +1 -1
  342. package/src/core/collection/list/List.d.ts +7 -3
  343. package/src/core/collection/list/List.d.ts.map +1 -1
  344. package/src/core/collection/list/List.js +6 -2
  345. package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
  346. package/src/core/collection/table/RowFirstTableSpec.js +0 -4
  347. package/src/core/color/Color.d.ts +1 -0
  348. package/src/core/color/Color.d.ts.map +1 -1
  349. package/src/core/color/Color.js +4 -0
  350. package/src/core/events/signal/SignalBinding.d.ts +4 -0
  351. package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
  352. package/src/core/events/signal/SignalBinding.js +4 -0
  353. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
  354. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  355. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
  356. package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
  357. package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
  358. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  359. package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
  360. package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
  361. package/src/core/geom/3d/aabb/AABB3.js +17 -3
  362. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
  363. package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
  364. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
  365. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  366. package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
  367. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
  368. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
  369. package/src/core/geom/Vector1.d.ts +4 -0
  370. package/src/core/geom/Vector1.d.ts.map +1 -1
  371. package/src/core/geom/Vector1.js +4 -0
  372. package/src/core/geom/Vector2.d.ts +4 -0
  373. package/src/core/geom/Vector2.d.ts.map +1 -1
  374. package/src/core/geom/Vector2.js +4 -0
  375. package/src/core/geom/Vector3.d.ts +4 -0
  376. package/src/core/geom/Vector3.d.ts.map +1 -1
  377. package/src/core/geom/Vector3.js +4 -0
  378. package/src/core/geom/Vector4.d.ts +4 -0
  379. package/src/core/geom/Vector4.d.ts.map +1 -1
  380. package/src/core/geom/Vector4.js +4 -0
  381. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
  382. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
  383. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
  384. package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
  385. package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
  386. package/src/core/geom/packing/miniball/Subspan.js +2 -2
  387. package/src/core/math/interval/NumericInterval.d.ts +4 -0
  388. package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
  389. package/src/core/math/interval/NumericInterval.js +4 -0
  390. package/src/core/math/random/roundFair.d.ts +2 -2
  391. package/src/core/math/random/roundFair.d.ts.map +1 -1
  392. package/src/core/math/random/roundFair.js +1 -1
  393. package/src/core/model/BoundedValue.d.ts +4 -0
  394. package/src/core/model/BoundedValue.d.ts.map +1 -1
  395. package/src/core/model/BoundedValue.js +4 -0
  396. package/src/core/model/ObservedBoolean.d.ts +4 -0
  397. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  398. package/src/core/model/ObservedBoolean.js +4 -0
  399. package/src/core/model/ObservedInteger.d.ts +4 -0
  400. package/src/core/model/ObservedInteger.d.ts.map +1 -1
  401. package/src/core/model/ObservedInteger.js +4 -0
  402. package/src/core/model/ObservedString.d.ts +4 -0
  403. package/src/core/model/ObservedString.d.ts.map +1 -1
  404. package/src/core/model/ObservedString.js +4 -0
  405. package/src/core/model/stat/Stat.d.ts +7 -3
  406. package/src/core/model/stat/Stat.d.ts.map +1 -1
  407. package/src/core/model/stat/Stat.js +4 -0
  408. package/src/engine/Engine.d.ts.map +1 -1
  409. package/src/engine/Engine.js +65 -0
  410. package/src/engine/EngineHarness.d.ts +8 -1
  411. package/src/engine/EngineHarness.d.ts.map +1 -1
  412. package/src/engine/EngineHarness.js +10 -14
  413. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
  414. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  415. package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
  416. package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
  417. package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
  418. package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
  419. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
  420. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  421. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
  422. package/src/engine/control/first-person/DESIGN.md +20 -2
  423. package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
  424. package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
  425. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  426. package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
  427. package/src/engine/ecs/Entity.js +1 -1
  428. package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
  429. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  430. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  431. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  432. package/src/engine/ecs/EntityManager.js +27 -3
  433. package/src/engine/ecs/animation/Animation.d.ts +17 -3
  434. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  435. package/src/engine/ecs/animation/Animation.js +26 -6
  436. package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
  437. package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
  438. package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
  439. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
  440. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  441. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
  442. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
  443. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
  444. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
  445. package/src/engine/ecs/transform/Transform64.d.ts +4 -4
  446. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  447. package/src/engine/ecs/transform/Transform64.js +2 -2
  448. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
  449. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  450. package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
  451. package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
  452. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  453. package/src/engine/graphics/ecs/light/Light.js +51 -1
  454. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
  455. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
  456. package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
  457. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
  458. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
  459. package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
  460. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
  461. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
  462. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  463. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
  464. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
  465. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
  466. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
  467. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
  468. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
  469. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
  470. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
  471. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
  472. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
  473. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
  474. package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
  475. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
  476. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
  477. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
  478. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
  479. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
  480. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
  481. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
  482. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
  483. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
  484. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
  485. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
  486. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
  487. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
  488. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
  489. package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
  490. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
  491. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
  492. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
  493. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
  494. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
  495. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
  496. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
  497. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  498. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
  499. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
  500. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
  501. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
  502. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  503. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
  504. package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
  505. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  506. package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
  507. package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
  508. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
  509. package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
  510. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
  511. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  512. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
  513. package/src/engine/graphics3/DecalSystem.d.ts +8 -0
  514. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  515. package/src/engine/graphics3/DecalSystem.js +8 -0
  516. package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
  517. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  518. package/src/engine/graphics3/GraphicsEngine.js +22 -11
  519. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  520. package/src/engine/graphics3/LightSystem.js +11 -1
  521. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
  522. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
  523. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
  524. package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
  525. package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
  526. package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
  527. package/src/engine/network/NetworkSession.d.ts +60 -0
  528. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  529. package/src/engine/network/NetworkSession.js +141 -1
  530. package/src/engine/network/replication/Replicator.d.ts +18 -0
  531. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  532. package/src/engine/network/replication/Replicator.js +98 -0
  533. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  534. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  535. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  536. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  537. package/src/engine/sound/SoundEngine.d.ts +24 -0
  538. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  539. package/src/engine/sound/SoundEngine.js +29 -11
  540. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  541. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  542. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  543. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  544. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  545. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  546. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  547. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  548. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  549. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  550. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  551. package/src/shade/playground/particle_system/README.md +14 -3
  552. package/src/shade/playground/particle_system/index.html +1 -0
  553. package/src/shade/playground/particle_system/main.js +15 -2
  554. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  555. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  556. package/src/shade/playground/particle_system/particle_scene.js +126 -9
  557. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  558. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  559. package/src/shade/renderer/GraphicsContext.js +4 -0
  560. package/src/shade/renderer/Renderer.d.ts +1 -1
  561. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  562. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  563. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  564. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  565. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  566. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  567. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  568. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  569. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  570. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  571. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  572. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  573. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  574. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  575. package/src/shade/renderer/particles/DESIGN.md +66 -15
  576. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  577. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  578. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  579. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  580. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  581. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  582. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  583. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  584. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  585. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  586. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  587. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  588. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  589. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  590. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  591. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  592. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  593. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  594. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  595. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  596. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  597. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  598. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  599. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  600. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  601. package/src/shade/renderer/particles/graph_particles.js +60 -20
  602. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  603. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  604. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  605. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  606. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  607. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  608. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  609. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  610. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  611. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  612. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  613. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  614. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  615. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  616. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  617. package/src/view/DOM.d.ts +69 -0
  618. package/src/view/DOM.d.ts.map +1 -0
  619. package/src/view/DOM.js +2 -1
  620. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  621. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  622. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  623. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  624. package/src/view/elements/FrameRateView.d.ts +45 -0
  625. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  626. package/src/view/elements/FrameRateView.js +131 -0
  627. package/src/view/elements/SliderView.d.ts +37 -0
  628. package/src/view/elements/SliderView.d.ts.map +1 -0
  629. package/src/view/elements/SliderView.js +71 -0
  630. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  631. package/src/view/elements/navigation/ViewStack.js +1 -1
  632. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  633. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  634. package/src/view/tooltip/TooltipView.d.ts +5 -1
  635. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  636. package/src/view/tooltip/TooltipView.js +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"particle_scene.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_system/particle_scene.js"],"names":[],"mappings":"AAyEA;;;;;;;GAOG;AAEH;;;;;;;;GAQG;AACH;IAJqC,YAAY;IACrB,QAAQ,GAAzB,MAAM;IACJ,MAAM,CA8OlB;AA3QD;;;;GAIG;AACH,0CAA2C;AAE3C,wGAAwG;AACxG,sCAAuC;;;;;WAOzB,MAAM;;;;UACN,MAAM;;;;cACN,MAAM;;;;cACN,MAAM,EAAE;;;;UACR,MAAM,EAAE"}
1
+ {"version":3,"file":"particle_scene.d.ts","sourceRoot":"","sources":["../../../../../src/shade/playground/particle_system/particle_scene.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AAEH;;;;;;;;GAQG;AACH;IAJqC,YAAY;IACrB,QAAQ,GAAzB,MAAM;IACJ,MAAM,CAiUlB;AAjWD;;;;GAIG;AACH,0CAA2C;AAE3C,wGAAwG;AACxG,sCAAuC;;;;;WAOzB,MAAM;;;;UACN,MAAM;;;;;cACN,MAAM;;;;;gBAEN,MAAM;;;;cAEN,MAAM,EAAE;;;;UACR,MAAM,EAAE"}
@@ -4,7 +4,23 @@ import { m4_look_at } from "../../../core/geom/3d/mat4/m4_look_at.js";
4
4
  import { m4_multiply } from "../../../core/geom/3d/mat4/m4_multiply.js";
5
5
  import { ShadeGPUCommandContext } from "../../device/ShadeGPUCommandContext.js";
6
6
  import { CAMERA_UNIFORM_STRUCT } from "../../renderer/camera/CAMERA_UNIFORM_STRUCT.js";
7
- import { PARTICLE_RECORD_WORD_COUNT } from "../../renderer/particles/ParticleConstants.js";
7
+ import {
8
+ PARTICLE_RECORD_WORD_COUNT,
9
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
10
+ } from "../../renderer/particles/ParticleConstants.js";
11
+ import {
12
+ PREFIX_SCAN_CSDLDF_HEADER_WORDS,
13
+ PREFIX_SCAN_CSDLDF_PARTITION_SIZE,
14
+ shader_prefix_scan_csdldf,
15
+ } from "../../renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
16
+ import { build_indirect_compute_dispatch_command } from "../../renderer/gpu_primitive/indirect/IndirectComputeCommandBuildPass.js";
17
+ import {
18
+ shader_particle_bucket_fill,
19
+ shader_particle_bucket_histogram,
20
+ shader_particle_bucket_pad,
21
+ shader_particle_bucket_reset,
22
+ shader_particle_bucket_scatter,
23
+ } from "../../renderer/particles/coherence/shader_particle_bucket.js";
8
24
  import { PARTICLE_COUNTER_COUNT } from "../../renderer/particles/data/PARTICLE_COUNTERS.js";
9
25
  import { EMITTER_BLEND, EMITTER_PROJECTION } from "../../renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js";
10
26
  import { NodeGraph } from "../../../core/model/node-graph/NodeGraph.js";
@@ -23,10 +39,7 @@ import {
23
39
  shader_particle_build_indirect,
24
40
  shader_particle_reset_counters,
25
41
  } from "../../renderer/particles/shaders/shader_particle_finalize.js";
26
- import {
27
- PARTICLE_SIMULATE_WORKGROUP_SIZE,
28
- shader_particle_simulate,
29
- } from "../../renderer/particles/shaders/shader_particle_simulate.js";
42
+ import { shader_particle_simulate } from "../../renderer/particles/shaders/shader_particle_simulate.js";
30
43
 
31
44
  /**
32
45
  * The scene the particle playground draws, with every reference to the page removed: it takes a
@@ -50,6 +63,12 @@ import {
50
63
  * billboard draw via `drawIndirect`, both from args the build-indirect pass writes on the GPU. No
51
64
  * CPU readback participates in sizing anything — a stale CPU count would orphan alive-list entries
52
65
  * when the population grows and double-free slots when it shrinks.
66
+ *
67
+ * The four emitters run four distinct compiled programs, so this is also where the simulation-order
68
+ * bucketing has something to do: without it a simulate wave holds fire, smoke, spark and dust
69
+ * particles side by side, each wanting different opcodes out of the interpreter's switch. The
70
+ * bucketing passes are encoded directly here rather than through `graph_particles`, which is the
71
+ * frame-graph wiring of the same sequence.
53
72
  */
54
73
 
55
74
  /** Maximum simultaneous particles across every emitter — they share one pool. */
@@ -75,7 +94,10 @@ const STATS_OFFSET_DRAW_ARGS = 48;
75
94
  * @typedef {object} ParticleSceneStats
76
95
  * @property {number} alive particles alive at the end of the captured frame
77
96
  * @property {number} dead free slots left in the pool
78
- * @property {number} alive_in the snapshot next frame's simulate reads as its input length
97
+ * @property {number} alive_in the snapshot next frame's simulate reads as its input length — the
98
+ * PADDED length of the coherence list, so it is `sim_padded` from the captured frame, not `alive`
99
+ * @property {number} sim_padded length of the program-coherent list the coherence pass built this
100
+ * frame; the gap to `alive` is the lanes padding costs to keep each wave on one VM program
79
101
  * @property {number[]} dispatch simulate's indirect dispatch args, `[x, y, z]` workgroups
80
102
  * @property {number[]} draw the billboard draw's indirect args, `[vertices, instances]`
81
103
  */
@@ -148,6 +170,37 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
148
170
  const dispatch_args = device.createBuffer({ label: "particles/dispatch_args", size: 3 * 4, usage: args_usage });
149
171
  const draw_args = device.createBuffer({ label: "particles/draw_args", size: 4 * 4, usage: args_usage });
150
172
 
173
+ // --- simulation-order (coherence) buffers -------------------------------------------------
174
+ //
175
+ // A separate set from the render-order sort's, on purpose: one list is grouped by VM program and
176
+ // camera-independent, the other is back-to-front by view depth. Sharing a buffer between them
177
+ // would couple a camera-driven ordering to a program-driven one.
178
+ const sizes = system.bufferSizes();
179
+ const buckets = system.bucketCount();
180
+ const sim_list = device.createBuffer({ label: "particles/sim_list", size: sizes.sim_list, usage: storage });
181
+ const sim_keys = device.createBuffer({ label: "particles/sim_keys", size: sizes.sim_keys, usage: storage });
182
+ const sim_histogram = device.createBuffer({ label: "particles/sim_histogram", size: sizes.sim_histogram, usage: storage });
183
+ const sim_bucket_counts = device.createBuffer({ label: "particles/sim_bucket_counts", size: sizes.sim_bucket_counts, usage: storage });
184
+ const sim_cursor = device.createBuffer({ label: "particles/sim_cursor", size: sizes.sim_cursor, usage: storage });
185
+ const sim_dispatch_args = device.createBuffer({ label: "particles/sim_dispatch_args", size: sizes.sim_dispatch_args, usage: args_usage });
186
+
187
+ // Scratch the reused CSDLDF scan needs: the indirect command it is dispatched with, and its
188
+ // decoupled-lookback spine. One partition covers every plausible bucket count.
189
+ const scan_command = device.createBuffer({
190
+ label: "particles/sim_scan_command",
191
+ size: 3 * 4,
192
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT,
193
+ });
194
+ // Cleared at the top of every frame, not just on creation: the spine carries per-partition
195
+ // flags, and a stale FLAG_INCLUSIVE left over from last frame is read as this frame's answer.
196
+ // The frame-graph wiring gets this for free from `BufferResourceDescriptor.empty`; encoding by
197
+ // hand has to ask. Rounded to a 256-byte allocation rather than the 8 bytes one partition needs.
198
+ const scan_spine = device.createBuffer({
199
+ label: "particles/sim_scan_spine",
200
+ size: Math.max(256, Math.ceil(buckets / PREFIX_SCAN_CSDLDF_PARTITION_SIZE) * 2 * 4),
201
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
202
+ });
203
+
151
204
  const initial = system.initialFreeList();
152
205
  device.queue.writeBuffer(dead, 0, initial.dead);
153
206
  device.queue.writeBuffer(counters, 0, initial.counters);
@@ -205,7 +258,12 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
205
258
  capacity,
206
259
 
207
260
  /** Buffers a harness may inspect. Not for the frame loop, which never reads them back. */
208
- buffers: { pool, alive_a, alive_b, dead, counters, spawn_requests, emitters, program, constants, dispatch_args, draw_args },
261
+ buffers: {
262
+ pool, alive_a, alive_b, dead, counters, spawn_requests, emitters, program, constants,
263
+ dispatch_args, draw_args,
264
+ sim_list, sim_keys, sim_histogram, sim_bucket_counts, sim_cursor, sim_dispatch_args,
265
+ sim_scan_command: scan_command, sim_scan_spine: scan_spine,
266
+ },
209
267
 
210
268
  /**
211
269
  * Encode one whole frame: geometry, then emit + simulate + build-indirect, then the
@@ -259,13 +317,59 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
259
317
  encoder: cmd,
260
318
  bindings: {
261
319
  emitters, program, vm_constants: constants, pool,
262
- alive_in: alive_read, alive_out: alive_write, dead, counters,
320
+ sim_list, alive_out: alive_write, dead, counters,
263
321
  settings: { u_dt: dt, u_time: time, u_frame: system.frame },
264
322
  },
265
323
  command: dispatch_args,
266
324
  });
267
325
 
268
- // Snapshot the final alive count (next frame's simulate input) + write this frame's draw args.
326
+ // --- coherence: regroup the finished alive list by VM program for NEXT frame's simulate ---
327
+ //
328
+ // Reads the list emit and simulate have both finished appending to, and rewrites
329
+ // `sim_list` — the buffer simulate read a few lines above. Consecutive dispatches are
330
+ // ordered, so the read is complete before the write lands.
331
+ shader_particle_bucket_reset.dispatchThreads({
332
+ encoder: cmd,
333
+ bindings: { counters, histogram: sim_histogram, cursor: sim_cursor, sim_dispatch_args, u_bucket_count: buckets },
334
+ thread_count_x: bucket_reset_thread_count(buckets),
335
+ });
336
+
337
+ shader_particle_bucket_histogram.dispatchIndirect({
338
+ encoder: cmd,
339
+ bindings: { emitters, pool, alive: alive_write, keys: sim_keys, histogram: sim_histogram, counters },
340
+ command: sim_dispatch_args,
341
+ });
342
+
343
+ shader_particle_bucket_pad.dispatchThreads({
344
+ encoder: cmd,
345
+ bindings: { histogram: sim_histogram, bucket_counts: sim_bucket_counts, u_bucket_count: buckets },
346
+ thread_count_x: buckets,
347
+ });
348
+
349
+ // The same scan the radix sort runs its spine through, reused unmodified.
350
+ cmd.clearBuffer(scan_spine, 0, scan_spine.size);
351
+ build_indirect_compute_dispatch_command(
352
+ PREFIX_SCAN_CSDLDF_PARTITION_SIZE, cmd, sim_histogram, 0, scan_command, 0,
353
+ );
354
+ shader_prefix_scan_csdldf.dispatchIndirect({
355
+ encoder: cmd,
356
+ command: scan_command,
357
+ bindings: { scan_in: sim_histogram, spine: scan_spine },
358
+ });
359
+
360
+ shader_particle_bucket_scatter.dispatchIndirect({
361
+ encoder: cmd,
362
+ bindings: { keys: sim_keys, alive: alive_write, scanned: sim_histogram, cursor: sim_cursor, sim_list, counters },
363
+ command: sim_dispatch_args,
364
+ });
365
+
366
+ shader_particle_bucket_fill.dispatchThreads({
367
+ encoder: cmd,
368
+ bindings: { bucket_counts: sim_bucket_counts, scanned: sim_histogram, sim_list, counters, u_bucket_count: buckets },
369
+ thread_count_x: buckets * PARTICLE_SIMULATE_WORKGROUP_SIZE,
370
+ });
371
+
372
+ // Snapshot the padded list length (next frame's simulate input) + write this frame's draw args.
269
373
  shader_particle_build_indirect.dispatch({
270
374
  encoder: cmd,
271
375
  bindings: { counters, dispatch_args, draw_args, u_workgroup_size: PARTICLE_SIMULATE_WORKGROUP_SIZE },
@@ -320,6 +424,7 @@ export function create_particle_scene(graphics, { color_format, capacity = PARTI
320
424
  alive: words[0],
321
425
  dead: words[1],
322
426
  alive_in: words[4],
427
+ sim_padded: words[5],
323
428
  dispatch: [words[dispatch_base], words[dispatch_base + 1], words[dispatch_base + 2]],
324
429
  draw: [words[draw_base], words[draw_base + 1]],
325
430
  };
@@ -529,6 +634,18 @@ function translation(x, y, z) {
529
634
  return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1];
530
635
  }
531
636
 
637
+ /**
638
+ * Threads the bucket reset pass needs: enough to cover the scan's header plus its bins, rounded up
639
+ * to the whole `vec4` the last bin lands in (the scan reads whole `vec4`s, so the tail has to be
640
+ * cleared too or garbage joins the sums).
641
+ *
642
+ * @param {number} bucket_count
643
+ * @returns {number}
644
+ */
645
+ function bucket_reset_thread_count(bucket_count) {
646
+ return PREFIX_SCAN_CSDLDF_HEADER_WORDS + ((bucket_count + 3) & ~3);
647
+ }
648
+
532
649
  function data_buffer(device, label, data, usage) {
533
650
  const buffer = device.createBuffer({ label, size: Math.max(data.byteLength, 4), usage });
534
651
  device.queue.writeBuffer(buffer, 0, data);
@@ -118,6 +118,7 @@ export class GraphicsContext {
118
118
  readonly isGraphicsContext: boolean;
119
119
  #private;
120
120
  }
121
+ export type BinaryBuffer = import("../../core/binary/BinaryBuffer.js").BinaryBuffer;
121
122
  import { GPUGeometryManager } from "./geometry/GPUGeometryManager.js";
122
123
  import { GPUMaterialManager } from "./material/GPUMaterialManager.js";
123
124
  import { GPUSamplerManager } from "./GPUSamplerManager.js";
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AAwBA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;;;;OAQG;IACH,gGALW,oBAAoB,EAAE,cACtB;QAAC,MAAM,eAAe;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,QAmE9D;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;mCA9UkC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
1
+ {"version":3,"file":"GraphicsContext.d.ts","sourceRoot":"","sources":["../../../../src/shade/renderer/GraphicsContext.js"],"names":[],"mappings":"AA4BA;IAoJI,yBA8BC;IAjLD;;OAEG;IACH,YAFU,kBAAkB,CAEjB;IAEX;;OAEG;IACH,WAFU,kBAAkB,CAElB;IAOV;;OAEG;IACH,UAFU,iBAAiB,CAElB;IAET;;;OAGG;IACH,qDAOC;IAOD;;;OAGG;IACH,6CAEC;IAED;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,mBAFU,sBAAsB,CAEd;IAGlB;;OAEG;IACH,gBAFU,oBAAoB,CAEf;IAEf;;OAEG;IACH,UAFU,cAAc,CAEf;IAET;;;;OAIG;IACH,kBAFU,qBAAqB,CAEd;IAEjB;;OAEG;IACH,aAFU,gBAAgB,CAEd;IAQZ;;;OAGG;IACH,uBAFU,kBAAkB,CAEN;IAEtB;;;;OAIG;IACH,yBAFU,wBAAwB,CAEV;IAExB;;;OAGG;IACH,0BAFU,yBAAyB,CAEV;IAEzB;;;OAGG;IACH,oBAFU,mBAAmB,CAEV;IAUnB;;;OAGG;IACH,8BAEC;IAED,uBAMC;IAED;;;OAGG;IACH,wBAEC;IAkCD;;;;;;;;OAQG;IACH,gGALW,oBAAoB,EAAE,cACtB;QAAC,MAAM,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,QAmE9D;IAED;;;;OAIG;IACH,mDAFa,gBAAgB,CAI5B;IAED;;OAEG;IACH,+BAcC;IAED,4BAEC;IAED,eAmBC;IAED,gBAcC;IAGL;;;OAGG;IACH,4BAFU,OAAO,CAE0B;;CAN1C;2BAtUY,OAAO,mCAAmC,EAAE,YAAY;mCAZlC,kCAAkC;mCAGlC,kCAAkC;kCADnC,wBAAwB;2CAEf,mDAAmD;oCAH1D,2CAA2C;sCAXzC,6CAA6C;sCAC7C,6CAA6C;uCAF5C,8CAA8C;qCAIhD,0CAA0C;+BAchD,6BAA6B;sCACtB,4CAA4C;iCAbjD,+BAA+B;mCAC7B,gCAAgC;yCAC1B,sCAAsC;0CAErC,uCAAuC;oCAO7C,kCAAkC;iCARtB,8BAA8B"}
@@ -20,6 +20,10 @@ import { GPUTextureAllocator } from "./texture/GPUTextureAllocator.js";
20
20
  import { TextureManager } from "./texture/TextureManager.js";
21
21
  import { VirtualTextureManager } from "./texture/virtual/VirtualTextureManager.js";
22
22
 
23
+
24
+ /**
25
+ * @typedef {import("../../core/binary/BinaryBuffer.js").BinaryBuffer} BinaryBuffer
26
+ */
23
27
  const DEBUG_LOGGING = false;
24
28
 
25
29
  export class GraphicsContext {
@@ -11,7 +11,7 @@ export class Renderer {
11
11
  *
12
12
  * @returns {HTMLCanvasElement|OffscreenCanvas|undefined}
13
13
  */
14
- get canvas(): OffscreenCanvas | HTMLCanvasElement;
14
+ get canvas(): HTMLCanvasElement | OffscreenCanvas;
15
15
  /**
16
16
  * @type {GPUDevice}
17
17
  */
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Round-trips a {@link MeshletGeometry} through a `BinaryBuffer`.
3
+ *
4
+ * **This is the offline meshlet format**, and saying so is the point of this docblock: nothing
5
+ * documented it as the intended pipeline, so a consumer reasonably assumed
6
+ * {@link meshlet_geometry_build_from_geometry} was the only route from a `Geometry` to something
7
+ * the renderer draws — and paid 1.25 seconds of unbroken main thread per 200k-triangle level for
8
+ * it, at load, synchronously (GAP-008).
9
+ *
10
+ * The pipeline this supports: build the meshlets once in the asset build, serialize here, ship the
11
+ * bytes, and let the runtime deserialize and upload. `serialize_bvh` decides whether the BLAS
12
+ * travels with them or is rebuilt on load — carrying it costs bytes and saves the rebuild.
13
+ */
1
14
  export class MeshletGeometrySerializationAdapter extends BinaryClassSerializationAdapter<any> {
2
15
  constructor();
3
16
  klass: typeof MeshletGeometry;
@@ -1 +1 @@
1
- {"version":3,"file":"MeshletGeometrySerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js"],"names":[],"mappings":"AAMA;;IAGI,8BAAwB;IAGxB,uBAAqB;IAErB;;;OAGG;IACH,8BAFW,eAAe,QA6BzB;IAED;;;OAGG;IACH,gCAFW,eAAe,QAyCzB;CACJ;gDAzFM,uEAAuE;gCAE9C,sBAAsB"}
1
+ {"version":3,"file":"MeshletGeometrySerializationAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js"],"names":[],"mappings":"AAMA;;;;;;;;;;;;GAYG;AACH;;IAGI,8BAAwB;IAGxB,uBAAqB;IAErB;;;OAGG;IACH,8BAFW,eAAe,QA6BzB;IAED;;;OAGG;IACH,gCAFW,eAAe,QAyCzB;CACJ;gDAtGM,uEAAuE;gCAE9C,sBAAsB"}
@@ -4,6 +4,19 @@ import {
4
4
  import { blas_from_meshlets } from "./blas_from_meshlets.js";
5
5
  import { MeshletGeometry } from "./MeshletGeometry.js";
6
6
 
7
+ /**
8
+ * Round-trips a {@link MeshletGeometry} through a `BinaryBuffer`.
9
+ *
10
+ * **This is the offline meshlet format**, and saying so is the point of this docblock: nothing
11
+ * documented it as the intended pipeline, so a consumer reasonably assumed
12
+ * {@link meshlet_geometry_build_from_geometry} was the only route from a `Geometry` to something
13
+ * the renderer draws — and paid 1.25 seconds of unbroken main thread per 200k-triangle level for
14
+ * it, at load, synchronously (GAP-008).
15
+ *
16
+ * The pipeline this supports: build the meshlets once in the asset build, serialize here, ship the
17
+ * bytes, and let the runtime deserialize and upload. `serialize_bvh` decides whether the BLAS
18
+ * travels with them or is rebuilt on load — carrying it costs bytes and saves the rebuild.
19
+ */
7
20
  export class MeshletGeometrySerializationAdapter extends BinaryClassSerializationAdapter {
8
21
 
9
22
  version = 0
@@ -3,9 +3,27 @@
3
3
  * to fill an existing instance (e.g. a subclass of `MeshletGeometry`)
4
4
  * in place; otherwise a fresh instance is created and returned.
5
5
  *
6
+ * **This is synchronous, single-threaded, and it is not cheap — so at load time it belongs
7
+ * OFFLINE, not on the frame loop.** Measured converting one level's meshes: 3.3k triangles across
8
+ * 23 meshes took 53 ms, 7.5k across 30 took 74 ms, and **199k across 45 took 1,246 ms** — an
9
+ * unbroken second and a quarter of main thread, scaling linearly, on a level that is small.
10
+ * Reported from a port as GAP-008.
11
+ *
12
+ * **The offline route already exists and is the intended pipeline.**
13
+ * {@link MeshletGeometrySerializationAdapter} round-trips a `MeshletGeometry` to and from a
14
+ * `BinaryBuffer` losslessly, so an asset build can call this once, serialize the result beside the
15
+ * source mesh, and leave the runtime with a deserialize and an upload. Nothing about this function
16
+ * needs to run in a browser. If you are calling it from a level loader, that is the thing to change
17
+ * first — before reaching for a worker, which only moves the cost.
18
+ *
19
+ * A pooled worker-backed geometry service, with meshlet construction as one of the things it
20
+ * serves, is where this is going; it is not here yet, and it would not remove the reason to build
21
+ * offline.
22
+ *
6
23
  * @param {Geometry} geometry
7
24
  * @param {MeshletGeometry} [out]
8
25
  * @returns {MeshletGeometry}
26
+ * @see MeshletGeometrySerializationAdapter for the offline format
9
27
  */
10
28
  export function meshlet_geometry_build_from_geometry(geometry: Geometry, out?: MeshletGeometry): MeshletGeometry;
11
29
  import { MeshletGeometry } from "./MeshletGeometry.js";
@@ -1 +1 @@
1
- {"version":3,"file":"meshlet_geometry_build_from_geometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,+EAHW,eAAe,GACb,eAAe,CAoC3B;gCA7C+B,sBAAsB"}
1
+ {"version":3,"file":"meshlet_geometry_build_from_geometry.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,+EAJW,eAAe,GACb,eAAe,CAqC3B;gCA/D+B,sBAAsB"}
@@ -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