@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
@@ -0,0 +1,116 @@
1
+ import { PARTICLE_SIMULATE_WORKGROUP_SIZE, PARTICLE_SIM_PAD_SLOT } from "../ParticleConstants.js";
2
+
3
+ /**
4
+ * CPU reference for the simulation-order bucketing — the readable statement of the answer the GPU
5
+ * passes in {@link ./shader_particle_bucket.js} have to produce, the same role
6
+ * {@link ../sort/particle_counting_sort.js} plays for the render-order depth sort.
7
+ *
8
+ * ## What it is for
9
+ *
10
+ * The simulate pass is one dispatch interpreting every emitter's compiled UPDATE bytecode over the
11
+ * whole alive list. The alive list comes out of compaction — survivors are appended with
12
+ * `atomicAdd(&counters[ALIVE])` — so its order says nothing about which emitter a particle belongs
13
+ * to, and a single wave routinely holds particles running different programs. That costs twice
14
+ * over: the interpreter's opcode `switch` diverges, so the wave serially executes the union of the
15
+ * opcodes its lanes want; and the VM register file is dynamically indexed, which on AMD compiles to
16
+ * a `v_movrels`/`v_movreld` waterfall whose trip count is the number of *distinct* register indices
17
+ * live in the wave.
18
+ *
19
+ * Grouping the list by program collapses both. Padding each group out to
20
+ * {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is what makes the grouping actually hold at wave
21
+ * granularity: an unpadded boundary lands mid-wave and that wave spans two programs again.
22
+ *
23
+ * ## What it is NOT
24
+ *
25
+ * This is the *simulation* order: camera-independent, changing only when emitters and their
26
+ * programs change. It is a different ordering from the *render* order in `../sort/`, which is
27
+ * back-to-front by view depth and exists so premultiplied transparency composites correctly. The
28
+ * two must stay in separate buffers and separate passes — reordering the render list for coherence
29
+ * breaks transparency, and depth-sorting the simulation list destroys the coherence.
30
+ *
31
+ * ## Indirection only
32
+ *
33
+ * Everything here permutes *indices into the pool*. Particle records never move: a slot is
34
+ * referenced by the dead (free) list and by the alive list across frames, so relocating a record
35
+ * would leave both pointing at the wrong particle.
36
+ */
37
+
38
+ /** @type {number} bucket granularity — one whole simulate workgroup, and so at least one whole wave */
39
+ const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
40
+
41
+ /**
42
+ * Round `value` up to a multiple of {@link PARTICLE_SIMULATE_WORKGROUP_SIZE}.
43
+ *
44
+ * Mirrors the WGSL, which does this with a mask rather than a divide — see
45
+ * {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} for why.
46
+ *
47
+ * @param {number} value
48
+ * @returns {number}
49
+ */
50
+ export function particle_bucket_round_up(value) {
51
+ return (value + (WG - 1)) & ~(WG - 1);
52
+ }
53
+
54
+ /**
55
+ * @typedef {object} ParticleProgramBucketLayout
56
+ * @property {number[]} counts particles per program, before padding
57
+ * @property {number[]} padded_counts each count rounded up to a whole workgroup
58
+ * @property {number[]} offsets first index of each program's run in the padded list
59
+ * @property {number} total length of the padded list — what sizes the simulate dispatch
60
+ */
61
+
62
+ /**
63
+ * Bucket sizes and start offsets, exactly as the GPU derives them: an atomic histogram, a round-up
64
+ * of each bin to a whole workgroup, and an exclusive prefix sum of the *padded* bins (the GPU takes
65
+ * that sum from `graph_prefix_scan_csdldf`, the same scan the radix sort runs its spine through).
66
+ *
67
+ * A program with no particles contributes nothing: `round_up(0)` is 0, so empty buckets neither
68
+ * consume a workgroup nor shift the offsets of the buckets after them.
69
+ *
70
+ * @param {ArrayLike<number>} programs program id of each alive entry
71
+ * @param {number} program_count number of distinct programs (the bucket count)
72
+ * @returns {ParticleProgramBucketLayout}
73
+ */
74
+ export function particle_program_bucket_layout(programs, program_count) {
75
+ const counts = new Array(program_count).fill(0);
76
+ for (let i = 0; i < programs.length; i++) {
77
+ counts[programs[i]]++;
78
+ }
79
+
80
+ const padded_counts = counts.map(particle_bucket_round_up);
81
+
82
+ const offsets = new Array(program_count);
83
+ let total = 0;
84
+ for (let b = 0; b < program_count; b++) {
85
+ offsets[b] = total;
86
+ total += padded_counts[b];
87
+ }
88
+
89
+ return { counts, padded_counts, offsets, total };
90
+ }
91
+
92
+ /**
93
+ * The simulate pass's input list: pool slot indices grouped by program, each group padded out to a
94
+ * workgroup boundary with {@link PARTICLE_SIM_PAD_SLOT}.
95
+ *
96
+ * Order within a bucket is arrival order here and arbitrary on the GPU (the scatter takes its rank
97
+ * from an atomic), which is fine — nothing downstream depends on the order of particles running the
98
+ * same program.
99
+ *
100
+ * @param {ArrayLike<number>} slots pool slot index of each alive entry
101
+ * @param {ArrayLike<number>} programs program id of each alive entry, parallel to `slots`
102
+ * @param {number} program_count number of distinct programs (the bucket count)
103
+ * @returns {number[]} the padded, program-coherent indirection list
104
+ */
105
+ export function particle_program_bucket_list(slots, programs, program_count) {
106
+ const layout = particle_program_bucket_layout(programs, program_count);
107
+
108
+ const list = new Array(layout.total).fill(PARTICLE_SIM_PAD_SLOT);
109
+
110
+ const cursor = layout.offsets.slice();
111
+ for (let i = 0; i < slots.length; i++) {
112
+ list[cursor[programs[i]]++] = slots[i];
113
+ }
114
+
115
+ return list;
116
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Per-frame reset, and the only place the bucketing decides how big it is.
3
+ *
4
+ * WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
5
+ * bins and the scatter would compound last frame's ranks.
6
+ *
7
+ * @type {ComputeShader}
8
+ */
9
+ export const shader_particle_bucket_reset: ComputeShader;
10
+ /**
11
+ * One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
12
+ * (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
13
+ * emitter index would split a run that was already coherent into one padded bucket per emitter.
14
+ *
15
+ * The emitter's program id is read by direct indexing rather than through
16
+ * `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
17
+ * word would be pure waste in a pass that touches every live particle.
18
+ *
19
+ * @type {ComputeShader}
20
+ */
21
+ export const shader_particle_bucket_histogram: ComputeShader;
22
+ /**
23
+ * Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
24
+ * pass (which needs to know where the real entries stop and the padding starts).
25
+ *
26
+ * This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
27
+ * bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
28
+ * the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
29
+ * no live particles costs no lanes and shifts nothing.
30
+ *
31
+ * @type {ComputeShader}
32
+ */
33
+ export const shader_particle_bucket_pad: ComputeShader;
34
+ /**
35
+ * Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
36
+ *
37
+ * Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
38
+ * needs: every lane in the bucket runs the same program, so which of them runs where changes
39
+ * nothing.
40
+ *
41
+ * @type {ComputeShader}
42
+ */
43
+ export const shader_particle_bucket_scatter: ComputeShader;
44
+ /**
45
+ * Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
46
+ *
47
+ * Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
48
+ * entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
49
+ * thread at all for a bucket whose particles all died.
50
+ *
51
+ * The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
52
+ * sizes next frame's simulate dispatch — the build-indirect pass reads it out of
53
+ * {@link PARTICLE_COUNTER.SIM_PADDED}.
54
+ *
55
+ * @type {ComputeShader}
56
+ */
57
+ export const shader_particle_bucket_fill: ComputeShader;
58
+ import { ComputeShader } from "../../shader/ComputeShader.js";
59
+ //# sourceMappingURL=shader_particle_bucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader_particle_bucket.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/coherence/shader_particle_bucket.js"],"names":[],"mappings":"AAwGA;;;;;;;GAOG;AACH,2CAFU,aAAa,CAyCpB;AAcH;;;;;;;;;;GAUG;AACH,+CAFU,aAAa,CAyBpB;AAYH;;;;;;;;;;GAUG;AACH,yCAFU,aAAa,CAmBpB;AAeH;;;;;;;;GAQG;AACH,6CAFU,aAAa,CAwBpB;AAcH;;;;;;;;;;;;GAYG;AACH,0CAFU,aAAa,CAiCpB;8BArV2B,+BAA+B"}
@@ -0,0 +1,344 @@
1
+ import { atomic_u32, u32 } from "../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../shader/type/WebGPUArray.js";
3
+ import { ComputeShader } from "../../shader/ComputeShader.js";
4
+ import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
5
+ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
6
+ import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
7
+ import {
8
+ PARTICLE_RECORD_HEADER_EMITTER,
9
+ PARTICLE_RECORD_WORD_COUNT,
10
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
11
+ PARTICLE_SIM_PAD_SLOT,
12
+ } from "../ParticleConstants.js";
13
+ import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
14
+ import { EMITTER_FIELD, EMITTER_STRIDE } from "../data/PARTICLE_EMITTER_LAYOUT.js";
15
+
16
+ /**
17
+ * Simulation-order bucketing — the passes that make each simulate wave run ONE VM program.
18
+ *
19
+ * ## Why
20
+ *
21
+ * The alive list is produced by compaction (`atomicAdd(&counters[ALIVE])`), so its order is
22
+ * arbitrary with respect to emitters and a single wave routinely holds particles running different
23
+ * programs. That costs twice: the interpreter's ~40-case opcode `switch` diverges, so the wave
24
+ * serially executes the union of the opcodes its lanes want; and `vm_reg[dst]` / `vm_reg[s0]` index
25
+ * a VGPR-resident register file dynamically, which AMD reaches with `v_movrels`/`v_movreld` behind
26
+ * a waterfall loop whose trip count is the number of DISTINCT register indices live in the wave.
27
+ * Grouping the wave by program collapses both at once.
28
+ *
29
+ * ## Shape
30
+ *
31
+ * The same three-phase shape the depth sort uses, with two small passes added for the padding:
32
+ *
33
+ * reset -> histogram -> pad -> graph_prefix_scan_csdldf -> scatter -> fill
34
+ *
35
+ * 0. {@link shader_particle_bucket_reset} — write the `{count}` header the scan sizes itself from,
36
+ * clear the bins and the scatter cursors, and build the indirect args the next two passes are
37
+ * dispatched with (one thread per alive particle, from the GPU's own alive count).
38
+ * 1. {@link shader_particle_bucket_histogram} — per alive entry, look up the owning emitter's
39
+ * program id and bump that bin.
40
+ * 2. {@link shader_particle_bucket_pad} — round every bin up to a whole simulate workgroup, keeping
41
+ * the raw count aside. Rounding BEFORE the scan is what puts every bucket boundary on a wave
42
+ * boundary; rounding after would leave the offsets unpadded and each boundary back mid-wave.
43
+ * 3. `graph_prefix_scan_csdldf`, reused as-is — inclusive prefix sums of the padded bins, so every
44
+ * bucket's start offset is a multiple of the workgroup size.
45
+ * 4. {@link shader_particle_bucket_scatter} — per alive entry, exclusive offset plus an atomic rank
46
+ * within the bucket, then write the pool slot there.
47
+ * 5. {@link shader_particle_bucket_fill} — write the padding sentinel into the tail of each bucket
48
+ * and publish the padded total, which sizes next frame's simulate dispatch.
49
+ *
50
+ * ## Invariants this file rests on
51
+ *
52
+ * - **Indirection only.** Everything here permutes indices into `pool`. Records never move: slots
53
+ * are referenced by the dead (free) list and across frames, and relocating one would leave both
54
+ * pointing at the wrong particle.
55
+ * - **No CPU readback.** Only the bucket COUNT is host-known, and that is static topology (it
56
+ * changes when the emitter set does, not per frame). Every per-frame quantity — the alive count,
57
+ * the bin sizes, the padded total — is produced and consumed on the GPU.
58
+ * - **This is not the render order.** `../sort/` produces the camera-dependent back-to-front list
59
+ * the billboard draw consumes. Separate buffers, separate passes, separate counter slots.
60
+ *
61
+ * @see ./particle_program_buckets.js for the CPU statement of the same answer.
62
+ */
63
+
64
+ /** @type {number} words of `{count, elements}` header in front of the scan's bins */
65
+ const HEADER = PREFIX_SCAN_CSDLDF_HEADER_WORDS;
66
+
67
+ const WG = PARTICLE_SIMULATE_WORKGROUP_SIZE;
68
+
69
+ /**
70
+ * Mask that rounds a count down to a whole workgroup; `(n + WG - 1) & PAD_MASK` rounds up.
71
+ *
72
+ * A mask rather than `(n + WG - 1u) / WG * WG` because the WGSL emulator's `/` is float division —
73
+ * the divide form would read differently there than on a device, and the round-up is exactly the
74
+ * property the specs have to pin. Correct only because {@link PARTICLE_SIMULATE_WORKGROUP_SIZE} is
75
+ * a power of two.
76
+ *
77
+ * @type {number}
78
+ */
79
+ const PAD_MASK = (~(WG - 1)) >>> 0;
80
+
81
+ /** log2 of the workgroup size — the fill pass splits its thread id into (bucket, lane) with it. */
82
+ const WG_LOG = Math.log2(WG);
83
+
84
+ /** Constants every pass in this file interpolates. */
85
+ const COMMON = /* wgsl */ `
86
+ const BUCKET_HEADER_WORDS : u32 = ${HEADER}u;
87
+ const BUCKET_ALIGNMENT : u32 = ${WG}u;
88
+ const BUCKET_PAD_MASK : u32 = ${PAD_MASK}u;
89
+ const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
90
+ const COUNTER_SIM_PADDED : u32 = ${PARTICLE_COUNTER.SIM_PADDED}u;
91
+ `;
92
+
93
+ // --- 0. reset ---------------------------------------------------------------------------------
94
+
95
+ const reset_resources = new ShaderResourceSetDescriptor();
96
+
97
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
98
+ reset_resources.setImmediate("u_bucket_count", u32);
99
+ reset_resources.createGroup()
100
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true) // atomics need read_write even for atomicLoad
101
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
102
+ .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
103
+ .addStorageBuffer("sim_dispatch_args", WebGPUArray.u32, true); // {x,y,z}
104
+
105
+ /**
106
+ * Per-frame reset, and the only place the bucketing decides how big it is.
107
+ *
108
+ * WebGPU zero-fills a buffer on CREATION only, so without this the scan would consume last frame's
109
+ * bins and the scatter would compound last frame's ranks.
110
+ *
111
+ * @type {ComputeShader}
112
+ */
113
+ export const shader_particle_bucket_reset = ComputeShader.from({
114
+ label: "Particle Bucket Reset",
115
+ resources: reset_resources,
116
+ body: CodeChunk.from(/* wgsl */ `
117
+ ${COMMON}
118
+
119
+ @compute @workgroup_size(${WG}, 1, 1)
120
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
121
+ let i = gid.x;
122
+
123
+ if (i == 0u) {
124
+ // The {count, elements} header the csdldf scan sizes itself from.
125
+ atomicStore(&histogram[0], u_bucket_count);
126
+
127
+ // One thread per alive particle for the histogram and the scatter. The alive count exists
128
+ // only on the GPU — the host's copy is a frame stale at best — so the dispatch that
129
+ // consumes it is built here rather than passed in.
130
+ let alive = atomicLoad(&counters[COUNTER_ALIVE]);
131
+ sim_dispatch_args[0] = (alive + BUCKET_ALIGNMENT - 1u) / BUCKET_ALIGNMENT;
132
+ sim_dispatch_args[1] = 1u;
133
+ sim_dispatch_args[2] = 1u;
134
+ }
135
+
136
+ // Header padding: never read by the scan, but it shares the buffer and the pool may have left
137
+ // something in it.
138
+ if (i > 0u && i < BUCKET_HEADER_WORDS) {
139
+ atomicStore(&histogram[i], 0u);
140
+ }
141
+
142
+ // The scan reads whole vec4s, so the bins are cleared up to the vec4 the last one lands in.
143
+ if (i < ((u_bucket_count + 3u) & 0xfffffffcu)) {
144
+ atomicStore(&histogram[BUCKET_HEADER_WORDS + i], 0u);
145
+ }
146
+
147
+ if (i < u_bucket_count) {
148
+ atomicStore(&cursor[i], 0u);
149
+ }
150
+ }
151
+ `),
152
+ });
153
+
154
+ // --- 1. histogram -----------------------------------------------------------------------------
155
+
156
+ const histogram_resources = new ShaderResourceSetDescriptor();
157
+
158
+ histogram_resources.createGroup()
159
+ .addStorageBuffer("emitters", WebGPUArray.u32, false)
160
+ .addStorageBuffer("pool", WebGPUArray.u32, false)
161
+ .addStorageBuffer("alive", WebGPUArray.u32, false)
162
+ .addStorageBuffer("keys", WebGPUArray.u32, true)
163
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
164
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
165
+
166
+ /**
167
+ * One bin per PROGRAM, not per emitter: emitters compiled from the same graph share a program id
168
+ * (see {@link ../runtime/ProgramArena.js}) and belong in one wave-coherent run. Keying on the
169
+ * emitter index would split a run that was already coherent into one padded bucket per emitter.
170
+ *
171
+ * The emitter's program id is read by direct indexing rather than through
172
+ * `particle_emitter_read` — decoding a whole 41-word record, transform matrix included, to reach one
173
+ * word would be pure waste in a pass that touches every live particle.
174
+ *
175
+ * @type {ComputeShader}
176
+ */
177
+ export const shader_particle_bucket_histogram = ComputeShader.from({
178
+ label: "Particle Bucket Histogram",
179
+ resources: histogram_resources,
180
+ body: CodeChunk.from(/* wgsl */ `
181
+ ${COMMON}
182
+ const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
183
+ const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
184
+ const PARTICLE_EMITTER_RECORD_WORDS : u32 = ${EMITTER_STRIDE}u;
185
+ const EMITTER_WORD_PROGRAM_ID : u32 = ${EMITTER_FIELD.PROGRAM_ID}u;
186
+
187
+ @compute @workgroup_size(${WG}, 1, 1)
188
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
189
+ let i = gid.x;
190
+ if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
191
+
192
+ let slot = alive[i];
193
+ let emitter_index = pool[slot * PARTICLE_RECORD_WORDS + PARTICLE_HEADER_EMITTER];
194
+ let program = emitters[emitter_index * PARTICLE_EMITTER_RECORD_WORDS + EMITTER_WORD_PROGRAM_ID];
195
+
196
+ keys[i] = program;
197
+ atomicAdd(&histogram[BUCKET_HEADER_WORDS + program], 1u);
198
+ }
199
+ `),
200
+ });
201
+
202
+ // --- 2. pad -----------------------------------------------------------------------------------
203
+
204
+ const pad_resources = new ShaderResourceSetDescriptor();
205
+
206
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
207
+ pad_resources.setImmediate("u_bucket_count", u32);
208
+ pad_resources.createGroup()
209
+ .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
210
+ .addStorageBuffer("bucket_counts", WebGPUArray.u32, true);
211
+
212
+ /**
213
+ * Round every bin up to a whole workgroup, keeping the raw count in `bucket_counts` for the fill
214
+ * pass (which needs to know where the real entries stop and the padding starts).
215
+ *
216
+ * This is THE step that makes the bucketing worth doing. Scanning the raw counts would put a
217
+ * bucket boundary at an arbitrary index, and the wave straddling it would span two programs again —
218
+ * the exact divergence the pass exists to remove. An empty bin rounds up to zero, so a program with
219
+ * no live particles costs no lanes and shifts nothing.
220
+ *
221
+ * @type {ComputeShader}
222
+ */
223
+ export const shader_particle_bucket_pad = ComputeShader.from({
224
+ label: "Particle Bucket Pad",
225
+ resources: pad_resources,
226
+ body: CodeChunk.from(/* wgsl */ `
227
+ ${COMMON}
228
+
229
+ @compute @workgroup_size(${WG}, 1, 1)
230
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
231
+ let b = gid.x;
232
+ if (b >= u_bucket_count) { return; }
233
+
234
+ let raw = atomicLoad(&histogram[BUCKET_HEADER_WORDS + b]);
235
+
236
+ bucket_counts[b] = raw;
237
+ atomicStore(&histogram[BUCKET_HEADER_WORDS + b], (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK);
238
+ }
239
+ `),
240
+ });
241
+
242
+ // --- 3. (graph_prefix_scan_csdldf) ------------------------------------------------------------
243
+ // --- 4. scatter -------------------------------------------------------------------------------
244
+
245
+ const scatter_resources = new ShaderResourceSetDescriptor();
246
+
247
+ scatter_resources.createGroup()
248
+ .addStorageBuffer("keys", WebGPUArray.u32, false)
249
+ .addStorageBuffer("alive", WebGPUArray.u32, false)
250
+ .addStorageBuffer("scanned", WebGPUArray.u32, false)
251
+ .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
252
+ .addStorageBuffer("sim_list", WebGPUArray.u32, true)
253
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
254
+
255
+ /**
256
+ * Place each alive entry's pool slot at its bucket's exclusive offset plus an atomic rank.
257
+ *
258
+ * Order within a bucket is therefore arbitrary, which is exactly as much order as the simulation
259
+ * needs: every lane in the bucket runs the same program, so which of them runs where changes
260
+ * nothing.
261
+ *
262
+ * @type {ComputeShader}
263
+ */
264
+ export const shader_particle_bucket_scatter = ComputeShader.from({
265
+ label: "Particle Bucket Scatter",
266
+ resources: scatter_resources,
267
+ body: CodeChunk.from(/* wgsl */ `
268
+ ${COMMON}
269
+
270
+ @compute @workgroup_size(${WG}, 1, 1)
271
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
272
+ let i = gid.x;
273
+ if (i >= atomicLoad(&counters[COUNTER_ALIVE])) { return; }
274
+
275
+ let bucket = keys[i];
276
+
277
+ // The scan is inclusive, so bucket b's exclusive offset is bucket b-1's inclusive value, one
278
+ // word earlier. For bucket 0 the index lands on the last header word — in bounds, and unused,
279
+ // because select() takes the 0 branch there.
280
+ let exclusive = select(0u, scanned[BUCKET_HEADER_WORDS + bucket - 1u], bucket > 0u);
281
+ let rank = atomicAdd(&cursor[bucket], 1u);
282
+
283
+ sim_list[exclusive + rank] = alive[i];
284
+ }
285
+ `),
286
+ });
287
+
288
+ // --- 5. fill ----------------------------------------------------------------------------------
289
+
290
+ const fill_resources = new ShaderResourceSetDescriptor();
291
+
292
+ // per-dispatch, four bytes, read-only: immediate data rather than a uniform buffer holding one u32
293
+ fill_resources.setImmediate("u_bucket_count", u32);
294
+ fill_resources.createGroup()
295
+ .addStorageBuffer("bucket_counts", WebGPUArray.u32, false)
296
+ .addStorageBuffer("scanned", WebGPUArray.u32, false)
297
+ .addStorageBuffer("sim_list", WebGPUArray.u32, true)
298
+ .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
299
+
300
+ /**
301
+ * Stamp the padding sentinel into the tail of every bucket, and publish the padded total.
302
+ *
303
+ * Dispatched over one workgroup per bucket — a bucket's padding is at most `BUCKET_ALIGNMENT - 1`
304
+ * entries, so a workgroup always covers it. It cannot ride along with the scatter, which has no
305
+ * thread at all for a bucket whose particles all died.
306
+ *
307
+ * The padded total is the last bucket's inclusive scan value. It, and not the alive count, is what
308
+ * sizes next frame's simulate dispatch — the build-indirect pass reads it out of
309
+ * {@link PARTICLE_COUNTER.SIM_PADDED}.
310
+ *
311
+ * @type {ComputeShader}
312
+ */
313
+ export const shader_particle_bucket_fill = ComputeShader.from({
314
+ label: "Particle Bucket Fill",
315
+ resources: fill_resources,
316
+ body: CodeChunk.from(/* wgsl */ `
317
+ ${COMMON}
318
+ const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
319
+
320
+ @compute @workgroup_size(${WG}, 1, 1)
321
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
322
+ // One workgroup per bucket. Shift and mask rather than / and %: the emulator's / is float
323
+ // division, and BUCKET_ALIGNMENT is a power of two anyway.
324
+ let bucket = gid.x >> ${WG_LOG}u;
325
+ let lane = gid.x & (BUCKET_ALIGNMENT - 1u);
326
+
327
+ if (gid.x == 0u) {
328
+ // Inclusive scan, so the last bucket's value is the whole padded length.
329
+ atomicStore(&counters[COUNTER_SIM_PADDED], scanned[BUCKET_HEADER_WORDS + u_bucket_count - 1u]);
330
+ }
331
+
332
+ if (bucket >= u_bucket_count) { return; }
333
+
334
+ let raw = bucket_counts[bucket];
335
+ let padded = (raw + BUCKET_ALIGNMENT - 1u) & BUCKET_PAD_MASK;
336
+ // The scan is inclusive, so subtracting this bucket's own (padded) size gives its start.
337
+ let start = scanned[BUCKET_HEADER_WORDS + bucket] - padded;
338
+
339
+ if (lane < padded - raw) {
340
+ sim_list[start + raw + lane] = PARTICLE_SIM_PAD_SLOT;
341
+ }
342
+ }
343
+ `),
344
+ });
@@ -10,15 +10,37 @@ export const PARTICLE_COUNTER: Readonly<{
10
10
  DEAD: 1;
11
11
  /** number of particles requested to spawn this frame */
12
12
  SPAWN: 2;
13
- /** length of the sorted index list */
13
+ /**
14
+ * Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
15
+ * depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
16
+ * ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
17
+ * Sharing one slot between the two would silently couple a camera-driven ordering to a
18
+ * program-driven one.
19
+ */
14
20
  SORTED: 3;
15
21
  /**
16
- * Snapshot of the previous frame's final ALIVE the exact length of the alive list the
17
- * simulate pass consumes this frame. Written by the build-indirect pass at the end of each
18
- * frame and NOT zeroed by the reset pass, so the loop stays fully GPU-driven (no CPU readback
19
- * can be trusted for dispatch sizing: a stale count orphans or double-simulates slots).
22
+ * The exact length of the index list the simulate pass consumes this frame the padded,
23
+ * program-coherent list the coherence pass built at the end of last frame, so this is
24
+ * {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
25
+ * multiple of the simulate workgroup size).
26
+ *
27
+ * Written by the build-indirect pass at the end of each frame, from the same value it derives
28
+ * the indirect dispatch args from — which is what makes the dispatch's thread count and the
29
+ * shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
30
+ * GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
31
+ * double-simulates slots).
20
32
  */
21
33
  ALIVE_IN: 4;
34
+ /**
35
+ * Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
36
+ * produced this frame — the SIMULATION order. Camera-independent; it changes only when the
37
+ * emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
38
+ * {@link ALIVE_IN} and dispatch args.
39
+ *
40
+ * Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
41
+ * reads a length of zero and does nothing, rather than re-running last frame's stale list.
42
+ */
43
+ SIM_PADDED: 5;
22
44
  }>;
23
45
  /** Number of `u32` atomic slots in the counters buffer. */
24
46
  export const PARTICLE_COUNTER_COUNT: 8;
@@ -1 +1 @@
1
- {"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD,sCAAsC;;IAEtC;;;;;OAKG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BAtCI,mCAAmC"}
1
+ {"version":3,"file":"PARTICLE_COUNTERS.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_COUNTERS.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACI,mDAAmD;;IAEnD,qCAAqC;;IAErC,wDAAwD;;IAExD;;;;;;OAMG;;IAEH;;;;;;;;;;;OAWG;;IAEH;;;;;;;;OAQG;;GAEJ;AAEH,2DAA2D;AAC3D,uCAAwC;AAExC;;;GAGG;AACH,0CAFU,YAAY,CAQG;6BA5DI,mCAAmC"}
@@ -13,15 +13,37 @@ export const PARTICLE_COUNTER = Object.freeze({
13
13
  DEAD: 1,
14
14
  /** number of particles requested to spawn this frame */
15
15
  SPAWN: 2,
16
- /** length of the sorted index list */
16
+ /**
17
+ * Length of the depth-sorted index list — the RENDER order (`../sort/`), back-to-front by view
18
+ * depth so premultiplied transparency composites correctly. Belongs to the camera-dependent
19
+ * ordering and to nothing else; the simulation order has its own slot, {@link SIM_PADDED}.
20
+ * Sharing one slot between the two would silently couple a camera-driven ordering to a
21
+ * program-driven one.
22
+ */
17
23
  SORTED: 3,
18
24
  /**
19
- * Snapshot of the previous frame's final ALIVE the exact length of the alive list the
20
- * simulate pass consumes this frame. Written by the build-indirect pass at the end of each
21
- * frame and NOT zeroed by the reset pass, so the loop stays fully GPU-driven (no CPU readback
22
- * can be trusted for dispatch sizing: a stale count orphans or double-simulates slots).
25
+ * The exact length of the index list the simulate pass consumes this frame the padded,
26
+ * program-coherent list the coherence pass built at the end of last frame, so this is
27
+ * {@link SIM_PADDED}'s value from then, NOT the alive count (padding makes it larger, and a
28
+ * multiple of the simulate workgroup size).
29
+ *
30
+ * Written by the build-indirect pass at the end of each frame, from the same value it derives
31
+ * the indirect dispatch args from — which is what makes the dispatch's thread count and the
32
+ * shader's bound agree by construction. NOT zeroed by the reset pass, so the loop stays fully
33
+ * GPU-driven (no CPU readback can be trusted for dispatch sizing: a stale count orphans or
34
+ * double-simulates slots).
23
35
  */
24
36
  ALIVE_IN: 4,
37
+ /**
38
+ * Length of the padded, program-coherent simulate input list the coherence pass (`../coherence/`)
39
+ * produced this frame — the SIMULATION order. Camera-independent; it changes only when the
40
+ * emitter/program set does. Read by the build-indirect pass, which turns it into next frame's
41
+ * {@link ALIVE_IN} and dispatch args.
42
+ *
43
+ * Zeroed by the reset pass: if the coherence passes are ever left out of a frame, simulate then
44
+ * reads a length of zero and does nothing, rather than re-running last frame's stale list.
45
+ */
46
+ SIM_PADDED: 5,
25
47
  });
26
48
 
27
49
  /** Number of `u32` atomic slots in the counters buffer. */
@@ -42,6 +42,7 @@ export function emitter_flags_projection(flags: number): number;
42
42
  * @param {object} [def.render] { position, size, color, rotation, frame } attribute word offsets
43
43
  * @param {number[]} [def.atlas_region] length-4 [uvOffsetX, uvOffsetY, uvScaleX, uvScaleY]
44
44
  * @param {number[]} [def.flipbook] length-2 [cols, rows]
45
+ * @param {number} [def.program_id] dense program id, the simulation-order bucket key
45
46
  */
46
47
  export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number, def: {
47
48
  spawn_offset: number;
@@ -58,6 +59,7 @@ export function pack_emitter(u32: Uint32Array, f32: Float32Array, index: number,
58
59
  render?: object;
59
60
  atlas_region?: number[];
60
61
  flipbook?: number[];
62
+ program_id?: number;
61
63
  }): void;
62
64
  /**
63
65
  * Overwrite just an emitter's world transform in a packed buffer.
@@ -104,9 +106,19 @@ export const EMITTER_FIELD: Readonly<{
104
106
  ATLAS_REGION: 33;
105
107
  FLIPBOOK: 37;
106
108
  RENDER_VELOCITY: 39;
109
+ /**
110
+ * u32 — dense id of the compiled program this emitter runs, assigned by
111
+ * {@link ../runtime/ProgramArena.js}. Emitters sharing a program share an id.
112
+ *
113
+ * The simulation-order bucketing (`coherence/`) histograms on this: it needs a small dense
114
+ * integer to index a bin with, which neither the emitter index (one bucket per emitter, even
115
+ * when they run the same code) nor `UPDATE_OFFSET` (an arena word offset, arbitrarily large
116
+ * and sparse) gives it.
117
+ */
118
+ PROGRAM_ID: 40;
107
119
  }>;
108
120
  /** Number of `u32` words per emitter record. */
109
- export const EMITTER_STRIDE: 40;
121
+ export const EMITTER_STRIDE: 41;
110
122
  /** Sentinel for an absent render-attribute binding. */
111
123
  export const EMITTER_ATTRIBUTE_ABSENT: 4294967295;
112
124
  /** Sentinel for "not attached to a scene node". */
@@ -1 +1 @@
1
- {"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AAiFA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,kCAnBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;SAwClB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AArMD;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}
1
+ {"version":3,"file":"PARTICLE_EMITTER_LAYOUT.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js"],"names":[],"mappings":"AA4FA;;;;;;;;;;GAUG;AACH;IAR6B,QAAQ,GAA1B,OAAO;IACW,UAAU,GAA5B,OAAO;IACW,IAAI,GAAtB,OAAO;IACW,IAAI,GAAtB,OAAO;IACU,KAAK,GAAtB,MAAM;IACW,UAAU,GAA3B,MAAM;IACJ,MAAM,CAWlB;AAED,6DAA6D;AAC7D,2CADY,MAAM,GAAkB,MAAM,CAGzC;AAED,kEAAkE;AAClE,gDADY,MAAM,GAAkB,MAAM,CAGzC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,kCApBW,WAAW,OACX,YAAY,SACZ,MAAM;IAEM,YAAY,EAAxB,MAAM;IACM,WAAW,EAAvB,MAAM;IACM,aAAa,EAAzB,MAAM;IACM,YAAY,EAAxB,MAAM;IACM,eAAe,EAA3B,MAAM;IACM,IAAI,EAAhB,MAAM;IACM,KAAK,EAAjB,MAAM;IACM,UAAU,EAAtB,MAAM;IACQ,SAAS,EAAvB,MAAM,EAAE;IACO,aAAa,GAA5B,MAAM,EAAE;IACK,aAAa,GAA1B,MAAM;IACO,MAAM,GAAnB,MAAM;IACS,YAAY,GAA3B,MAAM,EAAE;IACO,QAAQ,GAAvB,MAAM,EAAE;IACK,UAAU,GAAvB,MAAM;SA0ChB;AAED;;;;;;;;;;;GAWG;AACH,6CAJW,YAAY,SACZ,MAAM,UACN,UAAU,MAAM,CAAC,QAO3B;AAnND;;;;;;;;;;GAUG;AAEH,6CAA6C;AAC7C;;;;;;;;;;;;;;;;;;;;IA0BI;;;;;;;;OAQG;;GAEJ;AAEH,gDAAgD;AAChD,gCAAiC;AAEjC,uDAAuD;AACvD,kDAAmD;AAEnD,mDAAmD;AACnD,6CAA8C;AAE9C;;GAEG;AACH;;;;;GAKG;AAEH,kGAAkG;AAClG;;;;GAIG;AAKH,kEAAkE;AAClE;;;;;;GAMG;AAqCH,uEAAuE;AACvE;;;;;GAEG"}