@woosh/meep-engine 3.14.4 → 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 (717) 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/mat4/m4_rigidity_defect.d.ts +30 -0
  363. package/src/core/geom/3d/mat4/m4_rigidity_defect.d.ts.map +1 -0
  364. package/src/core/geom/3d/mat4/m4_rigidity_defect.js +71 -0
  365. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
  366. package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
  367. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
  368. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  369. package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
  370. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
  371. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
  372. package/src/core/geom/Vector1.d.ts +4 -0
  373. package/src/core/geom/Vector1.d.ts.map +1 -1
  374. package/src/core/geom/Vector1.js +4 -0
  375. package/src/core/geom/Vector2.d.ts +4 -0
  376. package/src/core/geom/Vector2.d.ts.map +1 -1
  377. package/src/core/geom/Vector2.js +4 -0
  378. package/src/core/geom/Vector3.d.ts +4 -0
  379. package/src/core/geom/Vector3.d.ts.map +1 -1
  380. package/src/core/geom/Vector3.js +4 -0
  381. package/src/core/geom/Vector4.d.ts +4 -0
  382. package/src/core/geom/Vector4.d.ts.map +1 -1
  383. package/src/core/geom/Vector4.js +4 -0
  384. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
  385. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
  386. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
  387. package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
  388. package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
  389. package/src/core/geom/packing/miniball/Subspan.js +2 -2
  390. package/src/core/math/interval/NumericInterval.d.ts +4 -0
  391. package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
  392. package/src/core/math/interval/NumericInterval.js +4 -0
  393. package/src/core/math/random/roundFair.d.ts +2 -2
  394. package/src/core/math/random/roundFair.d.ts.map +1 -1
  395. package/src/core/math/random/roundFair.js +1 -1
  396. package/src/core/model/BoundedValue.d.ts +4 -0
  397. package/src/core/model/BoundedValue.d.ts.map +1 -1
  398. package/src/core/model/BoundedValue.js +4 -0
  399. package/src/core/model/ObservedBoolean.d.ts +4 -0
  400. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  401. package/src/core/model/ObservedBoolean.js +4 -0
  402. package/src/core/model/ObservedInteger.d.ts +4 -0
  403. package/src/core/model/ObservedInteger.d.ts.map +1 -1
  404. package/src/core/model/ObservedInteger.js +4 -0
  405. package/src/core/model/ObservedString.d.ts +4 -0
  406. package/src/core/model/ObservedString.d.ts.map +1 -1
  407. package/src/core/model/ObservedString.js +4 -0
  408. package/src/core/model/stat/Stat.d.ts +7 -3
  409. package/src/core/model/stat/Stat.d.ts.map +1 -1
  410. package/src/core/model/stat/Stat.js +4 -0
  411. package/src/engine/Engine.d.ts.map +1 -1
  412. package/src/engine/Engine.js +65 -0
  413. package/src/engine/EngineHarness.d.ts +8 -1
  414. package/src/engine/EngineHarness.d.ts.map +1 -1
  415. package/src/engine/EngineHarness.js +10 -14
  416. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
  417. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  418. package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
  419. package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
  420. package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
  421. package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
  422. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
  423. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  424. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
  425. package/src/engine/control/first-person/DESIGN.md +20 -2
  426. package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
  427. package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
  428. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  429. package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
  430. package/src/engine/ecs/Entity.js +1 -1
  431. package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
  432. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  433. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  434. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  435. package/src/engine/ecs/EntityManager.js +27 -3
  436. package/src/engine/ecs/animation/Animation.d.ts +17 -3
  437. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  438. package/src/engine/ecs/animation/Animation.js +26 -6
  439. package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
  440. package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
  441. package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
  442. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
  443. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  444. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
  445. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
  446. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
  447. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
  448. package/src/engine/ecs/transform/Transform64.d.ts +4 -4
  449. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  450. package/src/engine/ecs/transform/Transform64.js +2 -2
  451. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
  452. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  453. package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
  454. package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
  455. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  456. package/src/engine/graphics/ecs/light/Light.js +51 -1
  457. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
  458. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
  459. package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
  460. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
  461. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
  462. package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
  463. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
  464. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
  465. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  466. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
  467. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
  468. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
  469. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
  470. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
  471. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
  472. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
  473. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
  474. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
  475. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
  476. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
  477. package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
  478. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
  479. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
  480. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
  481. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
  482. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
  483. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
  484. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
  485. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
  486. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
  487. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
  488. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
  489. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
  490. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
  491. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
  492. package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
  493. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
  494. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
  495. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
  496. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
  497. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
  498. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
  499. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
  500. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  501. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
  502. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
  503. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
  504. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
  505. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  506. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
  507. package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
  508. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  509. package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
  510. package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
  511. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
  512. package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
  513. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
  514. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  515. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
  516. package/src/engine/graphics3/DecalSystem.d.ts +8 -0
  517. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  518. package/src/engine/graphics3/DecalSystem.js +8 -0
  519. package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
  520. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  521. package/src/engine/graphics3/GraphicsEngine.js +22 -11
  522. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  523. package/src/engine/graphics3/LightSystem.js +11 -1
  524. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
  525. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
  526. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
  527. package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
  528. package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
  529. package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
  530. package/src/engine/network/NetworkSession.d.ts +60 -0
  531. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  532. package/src/engine/network/NetworkSession.js +141 -1
  533. package/src/engine/network/orchestrator/NetworkPeer.d.ts +56 -8
  534. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  535. package/src/engine/network/orchestrator/NetworkPeer.js +263 -67
  536. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +6 -1
  537. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  538. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +6 -0
  539. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +13 -7
  540. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  541. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +103 -138
  542. package/src/engine/network/replication/Replicator.d.ts +47 -6
  543. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  544. package/src/engine/network/replication/Replicator.js +362 -107
  545. package/src/engine/network/sim/ActionLog.d.ts +2 -0
  546. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  547. package/src/engine/network/sim/ActionLog.js +2 -0
  548. package/src/engine/network/sim/ActionRecordCursor.d.ts +82 -0
  549. package/src/engine/network/sim/ActionRecordCursor.d.ts.map +1 -0
  550. package/src/engine/network/sim/ActionRecordCursor.js +120 -0
  551. package/src/engine/network/sim/RewindEngine.d.ts.map +1 -1
  552. package/src/engine/network/sim/RewindEngine.js +13 -29
  553. package/src/engine/network/sim/SimActionExecutor.d.ts +2 -3
  554. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  555. package/src/engine/network/sim/SimActionExecutor.js +10 -11
  556. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  557. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  558. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  559. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  560. package/src/engine/sound/SoundEngine.d.ts +24 -0
  561. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  562. package/src/engine/sound/SoundEngine.js +29 -11
  563. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  564. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  565. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  566. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  567. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  568. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  569. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  570. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  571. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  572. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  573. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  574. package/src/shade/playground/particle_system/README.md +14 -3
  575. package/src/shade/playground/particle_system/index.html +1 -0
  576. package/src/shade/playground/particle_system/main.js +15 -2
  577. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  578. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  579. package/src/shade/playground/particle_system/particle_scene.js +164 -46
  580. package/src/shade/playground/skinned_mesh_soup/README.md +39 -18
  581. package/src/shade/playground/skinned_mesh_soup/index.html +9 -6
  582. package/src/shade/playground/skinned_mesh_soup/main.d.ts.map +1 -1
  583. package/src/shade/playground/skinned_mesh_soup/main.js +16 -13
  584. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts +8 -2
  585. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.d.ts.map +1 -1
  586. package/src/shade/playground/skinned_mesh_soup/verify_clone_vertices.js +23 -4
  587. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  588. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  589. package/src/shade/renderer/GraphicsContext.js +4 -0
  590. package/src/shade/renderer/Renderer.d.ts +1 -1
  591. package/src/shade/renderer/animation/GPUAnimationManager.d.ts.map +1 -1
  592. package/src/shade/renderer/animation/GPUAnimationManager.js +1958 -1796
  593. package/src/shade/renderer/animation/SKINNING_FRAME_PLAN.md +357 -0
  594. package/src/shade/renderer/animation/skin_bind_transform.d.ts +25 -0
  595. package/src/shade/renderer/animation/skin_bind_transform.d.ts.map +1 -0
  596. package/src/shade/renderer/animation/skin_bind_transform.js +33 -0
  597. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts +67 -0
  598. package/src/shade/renderer/animation/skin_clip_scale_conflicts.d.ts.map +1 -0
  599. package/src/shade/renderer/animation/skin_clip_scale_conflicts.js +199 -0
  600. package/src/shade/renderer/animation/skin_frame_defect.d.ts +34 -0
  601. package/src/shade/renderer/animation/skin_frame_defect.d.ts.map +1 -0
  602. package/src/shade/renderer/animation/skin_frame_defect.js +132 -0
  603. package/src/shade/renderer/animation/skin_joint_matrix.d.ts +24 -0
  604. package/src/shade/renderer/animation/skin_joint_matrix.d.ts.map +1 -0
  605. package/src/shade/renderer/animation/skin_joint_matrix.js +46 -0
  606. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts +70 -0
  607. package/src/shade/renderer/animation/skin_normalize_mesh_frame.d.ts.map +1 -0
  608. package/src/shade/renderer/animation/skin_normalize_mesh_frame.js +216 -0
  609. package/src/shade/renderer/animation/skin_test_fixtures.d.ts +86 -0
  610. package/src/shade/renderer/animation/skin_test_fixtures.d.ts.map +1 -0
  611. package/src/shade/renderer/animation/skin_test_fixtures.js +250 -0
  612. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts +18 -4
  613. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.d.ts.map +1 -1
  614. package/src/shade/renderer/animation/skinning/chunk_skin_blend_mesh_local.js +18 -4
  615. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  616. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  617. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  618. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  619. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  620. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  621. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  622. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  623. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  624. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  625. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  626. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  627. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  628. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  629. package/src/shade/renderer/particles/DESIGN.md +71 -20
  630. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  631. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  632. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  633. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  634. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  635. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  636. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  637. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  638. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  639. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  640. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  641. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  642. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  643. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  644. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  645. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  646. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  647. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  648. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  649. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  650. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  651. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  652. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  653. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts +43 -0
  654. package/src/shade/renderer/particles/graph/ParticleNodeDescription.d.ts.map +1 -0
  655. package/src/shade/renderer/particles/graph/ParticleNodeDescription.js +44 -0
  656. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts +33 -59
  657. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.d.ts.map +1 -1
  658. package/src/shade/renderer/particles/graph/ParticleNodeRegistry.js +185 -118
  659. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts +15 -10
  660. package/src/shade/renderer/particles/graph/compile_particle_graph.d.ts.map +1 -1
  661. package/src/shade/renderer/particles/graph/compile_particle_graph.js +205 -170
  662. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts +44 -0
  663. package/src/shade/renderer/particles/graph/particle_graph_authoring.d.ts.map +1 -0
  664. package/src/shade/renderer/particles/graph/particle_graph_authoring.js +108 -0
  665. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  666. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  667. package/src/shade/renderer/particles/graph_particles.js +60 -20
  668. package/src/shade/renderer/particles/particle_prototype.d.ts.map +1 -1
  669. package/src/shade/renderer/particles/particle_prototype.js +181 -180
  670. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  671. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  672. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  673. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  674. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  675. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  676. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts +4 -4
  677. package/src/shade/renderer/particles/runtime/create_particle_effect.d.ts.map +1 -1
  678. package/src/shade/renderer/particles/runtime/create_particle_effect.js +19 -19
  679. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  680. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  681. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  682. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  683. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  684. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  685. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  686. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  687. package/src/shade/renderer/particles/vm/chunk_particle_vm.js +1 -1
  688. package/src/shade/renderer/scene/SkinnedMesh.d.ts +11 -0
  689. package/src/shade/renderer/scene/SkinnedMesh.d.ts.map +1 -1
  690. package/src/shade/renderer/scene/SkinnedMesh.js +11 -0
  691. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts +33 -3
  692. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.d.ts.map +1 -1
  693. package/src/shade/renderer/shader/chunk/geometry/quaternion/dual/chunk_dual_quat_from_m4.js +58 -37
  694. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  695. package/src/view/DOM.d.ts +69 -0
  696. package/src/view/DOM.d.ts.map +1 -0
  697. package/src/view/DOM.js +2 -1
  698. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  699. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  700. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  701. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  702. package/src/view/elements/FrameRateView.d.ts +45 -0
  703. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  704. package/src/view/elements/FrameRateView.js +131 -0
  705. package/src/view/elements/SliderView.d.ts +37 -0
  706. package/src/view/elements/SliderView.d.ts.map +1 -0
  707. package/src/view/elements/SliderView.js +71 -0
  708. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  709. package/src/view/elements/navigation/ViewStack.js +1 -1
  710. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  711. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  712. package/src/view/tooltip/TooltipView.d.ts +5 -1
  713. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  714. package/src/view/tooltip/TooltipView.js +4 -0
  715. package/src/shade/renderer/particles/graph/ParticleGraph.d.ts +0 -54
  716. package/src/shade/renderer/particles/graph/ParticleGraph.d.ts.map +0 -1
  717. package/src/shade/renderer/particles/graph/ParticleGraph.js +0 -99
@@ -15,10 +15,29 @@ export class ProgramArena {
15
15
  instruction_count: number;
16
16
  /** @type {number} running vec4 constant index */
17
17
  constant_count: number;
18
+ /** @type {Map<string, object>} content key -> the placement the first identical program got */
19
+ programs: Map<string, object>;
18
20
  /**
19
- * Append a program.
21
+ * Number of distinct programs in the arena — and therefore the number of buckets the
22
+ * simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
23
+ * @returns {number}
24
+ */
25
+ get program_count(): number;
26
+ /**
27
+ * Append a program, or hand back the placement an identical one already has.
28
+ *
29
+ * Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
30
+ * separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
31
+ * they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
32
+ * the words is not a cost worth avoiding.
33
+ *
34
+ * The `program_id` it returns is what the emitter record carries and what the coherence pass
35
+ * buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
36
+ * emitters running one shared effect would become N buckets, each padded to a whole workgroup,
37
+ * which both wastes lanes and splits a run that was already program-coherent.
38
+ *
20
39
  * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
21
- * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
40
+ * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
22
41
  */
23
42
  add(program: import("../isa/ParticleProgram.js").ParticleProgram): {
24
43
  spawn_offset: number;
@@ -26,6 +45,7 @@ export class ProgramArena {
26
45
  update_offset: number;
27
46
  update_count: number;
28
47
  constant_offset: number;
48
+ program_id: number;
29
49
  };
30
50
  /** @returns {Uint32Array} the packed instruction buffer (at least length 1) */
31
51
  build_instruction_buffer(): Uint32Array;
@@ -1 +1 @@
1
- {"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;IAG3B;;;;OAIG;IACH,aAHW,OAAO,2BAA2B,EAAE,eAAe;sBAClC,MAAM;qBAAe,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;yBAAmB,MAAM;MAmB5H;IAUD,+EAA+E;IAC/E,4BADc,WAAW,CAGxB;IAED,yFAAyF;IACzF,yBADc,WAAW,CAGxB;;CACJ"}
1
+ {"version":3,"file":"ProgramArena.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/ProgramArena.js"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH;IAEQ,8CAA8C;IAC9C,mBADW,MAAM,EAAE,CACQ;IAC3B,8DAA8D;IAC9D,gBADW,MAAM,EAAE,CACK;IACxB,yFAAyF;IACzF,mBADW,MAAM,CACS;IAC1B,iDAAiD;IACjD,gBADW,MAAM,CACM;IACvB,+FAA+F;IAC/F,UADW,IAAI,MAAM,EAAE,MAAM,CAAC,CACL;IAG7B;;;;OAIG;IACH,4BAEC;IAED;;;;;;;;;;;;;;;OAeG;IACH,aAHW,OAAO,2BAA2B,EAAE,eAAe;sBAClC,MAAM;qBAAe,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;yBAAmB,MAAM;oBAAc,MAAM;MAgChJ;IAUD,+EAA+E;IAC/E,4BADc,WAAW,CAGxB;IAED,yFAAyF;IACzF,yBADc,WAAW,CAGxB;;CACJ"}
@@ -18,14 +18,43 @@ export class ProgramArena {
18
18
  this.instruction_count = 0;
19
19
  /** @type {number} running vec4 constant index */
20
20
  this.constant_count = 0;
21
+ /** @type {Map<string, object>} content key -> the placement the first identical program got */
22
+ this.programs = new Map();
21
23
  }
22
24
 
23
25
  /**
24
- * Append a program.
26
+ * Number of distinct programs in the arena — and therefore the number of buckets the
27
+ * simulation-order pass histograms into. Program ids are dense in `[0, program_count)`.
28
+ * @returns {number}
29
+ */
30
+ get program_count() {
31
+ return this.programs.size;
32
+ }
33
+
34
+ /**
35
+ * Append a program, or hand back the placement an identical one already has.
36
+ *
37
+ * Deduplication is by CONTENT, not object identity: two emitters that authored the same graph
38
+ * separately compile to distinct {@link ParticleProgram} objects holding the same bytecode, and
39
+ * they should still land in one simulation bucket. Emitters are few and long-lived, so hashing
40
+ * the words is not a cost worth avoiding.
41
+ *
42
+ * The `program_id` it returns is what the emitter record carries and what the coherence pass
43
+ * buckets on. Keying on the emitter index instead would be simpler but strictly worse: N
44
+ * emitters running one shared effect would become N buckets, each padded to a whole workgroup,
45
+ * which both wastes lanes and splits a run that was already program-coherent.
46
+ *
25
47
  * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
26
- * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number}}
48
+ * @returns {{spawn_offset: number, spawn_count: number, update_offset: number, update_count: number, constant_offset: number, program_id: number}}
27
49
  */
28
50
  add(program) {
51
+ const key = program_content_key(program);
52
+
53
+ const existing = this.programs.get(key);
54
+ if (existing !== undefined) {
55
+ return existing;
56
+ }
57
+
29
58
  const spawn_offset = this.instruction_count;
30
59
  this.#append_instructions(program.spawn);
31
60
  const spawn_count = program.spawn_instruction_count;
@@ -41,7 +70,13 @@ export class ProgramArena {
41
70
  }
42
71
  this.constant_count += program.constant_count;
43
72
 
44
- return { spawn_offset, spawn_count, update_offset, update_count, constant_offset };
73
+ const placement = {
74
+ spawn_offset, spawn_count, update_offset, update_count, constant_offset,
75
+ program_id: this.programs.size,
76
+ };
77
+ this.programs.set(key, placement);
78
+
79
+ return placement;
45
80
  }
46
81
 
47
82
  /** @param {Uint32Array} words */
@@ -62,3 +97,19 @@ export class ProgramArena {
62
97
  return new Uint32Array(this.constant_words.length > 0 ? this.constant_words : [0, 0, 0, 0]);
63
98
  }
64
99
  }
100
+
101
+ /**
102
+ * A key that is equal exactly when two programs would execute identically.
103
+ *
104
+ * Constants are keyed by their `u32` bit patterns rather than their float values, so `-0` and `0`
105
+ * — which stringify the same but differ in the buffer the shader reads — stay distinct.
106
+ *
107
+ * @param {import("../isa/ParticleProgram.js").ParticleProgram} program
108
+ * @returns {string}
109
+ */
110
+ function program_content_key(program) {
111
+ const constants = program.constants;
112
+ const constant_u32 = new Uint32Array(constants.buffer, constants.byteOffset, constants.length);
113
+
114
+ return `${program.register_count}|${program.spawn.join(",")}|${program.update.join(",")}|${constant_u32.join(",")}`;
115
+ }
@@ -7,14 +7,14 @@
7
7
  *
8
8
  * @param {object} params
9
9
  * @param {import("../layout/ParticleLayout.js").ParticleLayout} params.layout
10
- * @param {import("../graph/ParticleGraph.js").ParticleGraph} [params.spawn]
11
- * @param {import("../graph/ParticleGraph.js").ParticleGraph} [params.update]
10
+ * @param {NodeGraph} [params.spawn]
11
+ * @param {NodeGraph} [params.update]
12
12
  * @returns {{ layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram }}
13
13
  */
14
14
  export function create_particle_effect({ layout, spawn, update }: {
15
15
  layout: import("../layout/ParticleLayout.js").ParticleLayout;
16
- spawn?: import("../graph/ParticleGraph.js").ParticleGraph;
17
- update?: import("../graph/ParticleGraph.js").ParticleGraph;
16
+ spawn?: NodeGraph;
17
+ update?: NodeGraph;
18
18
  }): {
19
19
  layout: import("../layout/ParticleLayout.js").ParticleLayout;
20
20
  program: import("../isa/ParticleProgram.js").ParticleProgram;
@@ -1 +1 @@
1
- {"version":3,"file":"create_particle_effect.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/create_particle_effect.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH;IALwE,MAAM,EAAnE,OAAO,6BAA6B,EAAE,cAAc;IACO,KAAK,GAAhE,OAAO,2BAA2B,EAAE,aAAa;IACU,MAAM,GAAjE,OAAO,2BAA2B,EAAE,aAAa;;YACrC,OAAO,6BAA6B,EAAE,cAAc;aAAW,OAAO,2BAA2B,EAAE,eAAe;EAKxI"}
1
+ {"version":3,"file":"create_particle_effect.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/runtime/create_particle_effect.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH;IALwE,MAAM,EAAnE,OAAO,6BAA6B,EAAE,cAAc;IACjC,KAAK;IACL,MAAM;;YACb,OAAO,6BAA6B,EAAE,cAAc;aAAW,OAAO,2BAA2B,EAAE,eAAe;EAKxI"}
@@ -1,19 +1,19 @@
1
- import { compile_particle_effect } from "../graph/compile_particle_graph.js";
2
-
3
- /**
4
- * Compile a particle effect: a per-particle attribute {@link ../layout/ParticleLayout.js} plus SPAWN
5
- * and UPDATE node graphs, lowered to VM bytecode.
6
- *
7
- * The returned value bundles the layout with the compiled program so the {@link ./EmitterRegistry.js}
8
- * can resolve render-attribute names to record offsets and pack the program into the arena.
9
- *
10
- * @param {object} params
11
- * @param {import("../layout/ParticleLayout.js").ParticleLayout} params.layout
12
- * @param {import("../graph/ParticleGraph.js").ParticleGraph} [params.spawn]
13
- * @param {import("../graph/ParticleGraph.js").ParticleGraph} [params.update]
14
- * @returns {{ layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram }}
15
- */
16
- export function create_particle_effect({ layout, spawn, update }) {
17
- const program = compile_particle_effect({ spawn, update, layout });
18
- return { layout, program };
19
- }
1
+ import { compile_particle_effect } from "../graph/compile_particle_graph.js";
2
+
3
+ /**
4
+ * Compile a particle effect: a per-particle attribute {@link ../layout/ParticleLayout.js} plus SPAWN
5
+ * and UPDATE node graphs, lowered to VM bytecode.
6
+ *
7
+ * The returned value bundles the layout with the compiled program so the {@link ./EmitterRegistry.js}
8
+ * can resolve render-attribute names to record offsets and pack the program into the arena.
9
+ *
10
+ * @param {object} params
11
+ * @param {import("../layout/ParticleLayout.js").ParticleLayout} params.layout
12
+ * @param {NodeGraph} [params.spawn]
13
+ * @param {NodeGraph} [params.update]
14
+ * @returns {{ layout: import("../layout/ParticleLayout.js").ParticleLayout, program: import("../isa/ParticleProgram.js").ParticleProgram }}
15
+ */
16
+ export function create_particle_effect({ layout, spawn, update }) {
17
+ const program = compile_particle_effect({ spawn, update, layout });
18
+ return { layout, program };
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"AA4BA,2DAYG;AAaH,2DA0BG;;8BA7E2B,+BAA+B;iDAIZ,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_finalize.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_finalize.js"],"names":[],"mappings":"AAoCA,2DAaG;AAaH,2DAmCG;;8BA/F2B,+BAA+B;iDAIZ,+BAA+B"}
@@ -9,16 +9,24 @@ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "./shader_particle_simulate.js"
9
9
  /**
10
10
  * Small housekeeping passes that keep the pipeline GPU-driven:
11
11
  *
12
- * - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted counters at the top of
13
- * the frame (the dead count and the ALIVE_IN snapshot persist across frames).
14
- * - {@link shader_particle_build_indirect} — read the frame's final alive count and (a) snapshot it
15
- * into {@link PARTICLE_COUNTER.ALIVE_IN} the exact input length for NEXT frame's simulate, (b)
16
- * write the indirect dispatch args next frame's simulate consumes, and (c) write the indirect draw
17
- * args for THIS frame's billboard render. Nothing round-trips to the CPU. Sizing the dispatch or
18
- * draw from a stale CPU readback instead is a correctness bug: when the alive count grows the tail
19
- * of the list is never simulated (slots leak into limbo), and when it shrinks stale entries beyond
20
- * the written range get re-simulated a dead slot is pushed to the free list twice and later
21
- * popped twice, leaving two live particles sharing one record.
12
+ * - {@link shader_particle_reset_counters} — zero the alive / spawn / sorted / sim-padded counters
13
+ * at the top of the frame (the dead count and the ALIVE_IN snapshot persist across frames).
14
+ * - {@link shader_particle_build_indirect} — turn the frame's two final counts into next frame's
15
+ * input contract: (a) snapshot the coherence pass's padded list length into
16
+ * {@link PARTICLE_COUNTER.ALIVE_IN} — the exact input length for NEXT frame's simulate, (b) write
17
+ * the indirect dispatch args next frame's simulate consumes, from that SAME value, and (c) write
18
+ * the indirect draw args for THIS frame's billboard render, from the alive count. Nothing
19
+ * round-trips to the CPU. Sizing the dispatch or draw from a stale CPU readback instead is a
20
+ * correctness bug: when the alive count grows the tail of the list is never simulated (slots leak
21
+ * into limbo), and when it shrinks stale entries beyond the written range get re-simulated — a
22
+ * dead slot is pushed to the free list twice and later popped twice, leaving two live particles
23
+ * sharing one record.
24
+ *
25
+ * The two lengths are deliberately different quantities and must not be conflated. Simulate consumes
26
+ * the SIMULATION order: the program-coherent list from `../coherence/`, padded so no wave spans two
27
+ * VM programs, and therefore longer than the alive count and always a whole number of workgroups.
28
+ * The billboard draw consumes the RENDER order: one instance per live particle, unpadded — a
29
+ * padding entry drawn as an instance would read a garbage record.
22
30
  */
23
31
 
24
32
  // --- reset ---
@@ -36,6 +44,7 @@ fn main() {
36
44
  atomicStore(&counters[${PARTICLE_COUNTER.ALIVE}u], 0u);
37
45
  atomicStore(&counters[${PARTICLE_COUNTER.SPAWN}u], 0u);
38
46
  atomicStore(&counters[${PARTICLE_COUNTER.SORTED}u], 0u);
47
+ atomicStore(&counters[${PARTICLE_COUNTER.SIM_PADDED}u], 0u);
39
48
  }
40
49
  `),
41
50
  });
@@ -61,16 +70,25 @@ export const shader_particle_build_indirect = ComputeShader.from({
61
70
  fn main() {
62
71
  let alive = atomicLoad(&counters[${PARTICLE_COUNTER.ALIVE}u]);
63
72
 
64
- // Snapshot: this frame's final alive count is next frame's exact simulate input length.
65
- atomicStore(&counters[${PARTICLE_COUNTER.ALIVE_IN}u], alive);
73
+ // The length of the padded, program-coherent list the coherence pass just built — NOT the alive
74
+ // count. Padding makes it longer, and a whole number of workgroups.
75
+ let sim_length = atomicLoad(&counters[${PARTICLE_COUNTER.SIM_PADDED}u]);
76
+
77
+ // Snapshot: that list is next frame's simulate input, and this is its exact length.
78
+ atomicStore(&counters[${PARTICLE_COUNTER.ALIVE_IN}u], sim_length);
66
79
 
67
- // Simulate dispatch (consumed NEXT frame): one thread per alive particle, whole workgroups.
68
- let groups = (alive + u_workgroup_size - 1u) / max(u_workgroup_size, 1u);
80
+ // Simulate dispatch (consumed NEXT frame): one thread per entry of that same list. Derived from
81
+ // the same value as the bound above, so thread count and bound agree by construction — and
82
+ // because a padded length is a whole number of workgroups, they agree exactly: every thread the
83
+ // dispatch launches has an entry, real or sentinel.
84
+ let groups = (sim_length + u_workgroup_size - 1u) / max(u_workgroup_size, 1u);
69
85
  dispatch_args[0] = groups;
70
86
  dispatch_args[1] = 1u;
71
87
  dispatch_args[2] = 1u;
72
88
 
73
89
  // Instanced billboard draw (consumed THIS frame): 6 verts per particle, one instance per alive.
90
+ // The render list is the unpadded one — an instance per padding entry would read a garbage
91
+ // record.
74
92
  draw_args[0] = 6u;
75
93
  draw_args[1] = alive;
76
94
  draw_args[2] = 0u;
@@ -1,26 +1,5 @@
1
- /**
2
- * The particle simulate pass — Destiny-style single execution shader.
3
- *
4
- * One dispatch processes the entire alive list across every emitter. Per particle: read its owning
5
- * emitter, set up the VM context + RNG, run that emitter's compiled UPDATE program over the record,
6
- * then compact — killed particles are pushed back to the dead (free) list, survivors are appended to
7
- * the new alive list. There is exactly one pipeline regardless of how many distinct effects exist,
8
- * because behaviour is data (the bytecode program), not code.
9
- *
10
- * The input length is read from `counters[ALIVE_IN]` — the previous frame's final alive count,
11
- * snapshotted on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count
12
- * is inevitably stale (readback latency) and corrupts the pool: under-counting orphans the tail of
13
- * the alive list (slots leak into limbo), over-counting re-simulates stale entries and double-frees
14
- * their slots. Dispatch this shader with `dispatchWorkgroupsIndirect` using the args the
15
- * build-indirect pass wrote last frame, so thread count and bound agree by construction.
16
- *
17
- * All structured reads go through `array<u32>` for emulator-testability. Curve sampling uses the
18
- * pluggable `particle_vm_sample_curve` — here the no-op provider; the feature swaps in the
19
- * animation-database-backed one.
20
- *
21
- * @type {ComputeShader}
22
- */
23
- export const PARTICLE_SIMULATE_WORKGROUP_SIZE: ComputeShader;
1
+ export { PARTICLE_SIMULATE_WORKGROUP_SIZE };
24
2
  export const shader_particle_simulate: ComputeShader;
3
+ import { PARTICLE_SIMULATE_WORKGROUP_SIZE } from "../ParticleConstants.js";
25
4
  import { ComputeShader } from "../../shader/ComputeShader.js";
26
5
  //# sourceMappingURL=shader_particle_simulate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,+CAHU,aAAa,CAG4B;AAuEnD,qDAIG;8BA7G2B,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_simulate.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/shaders/shader_particle_simulate.js"],"names":[],"mappings":";AAyIA,qDAIG;iDAjII,yBAAyB;8BATF,+BAA+B"}
@@ -7,6 +7,8 @@ import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourc
7
7
  import {
8
8
  PARTICLE_RECORD_HEADER_EMITTER,
9
9
  PARTICLE_RECORD_WORD_COUNT,
10
+ PARTICLE_SIMULATE_WORKGROUP_SIZE,
11
+ PARTICLE_SIM_PAD_SLOT,
10
12
  PARTICLE_VM_INSTRUCTION_WORDS,
11
13
  } from "../ParticleConstants.js";
12
14
  import { PARTICLE_COUNTER } from "../data/PARTICLE_COUNTERS.js";
@@ -15,18 +17,37 @@ import { chunk_particle_context, chunk_particle_curve_disabled } from "./chunk_p
15
17
  /**
16
18
  * The particle simulate pass — Destiny-style single execution shader.
17
19
  *
18
- * One dispatch processes the entire alive list across every emitter. Per particle: read its owning
20
+ * One dispatch processes every live particle across every emitter. Per particle: read its owning
19
21
  * emitter, set up the VM context + RNG, run that emitter's compiled UPDATE program over the record,
20
22
  * then compact — killed particles are pushed back to the dead (free) list, survivors are appended to
21
23
  * the new alive list. There is exactly one pipeline regardless of how many distinct effects exist,
22
24
  * because behaviour is data (the bytecode program), not code.
23
25
  *
24
- * The input length is read from `counters[ALIVE_IN]` — the previous frame's final alive count,
25
- * snapshotted on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count
26
- * is inevitably stale (readback latency) and corrupts the pool: under-counting orphans the tail of
27
- * the alive list (slots leak into limbo), over-counting re-simulates stale entries and double-frees
28
- * their slots. Dispatch this shader with `dispatchWorkgroupsIndirect` using the args the
29
- * build-indirect pass wrote last frame, so thread count and bound agree by construction.
26
+ * ## The input list
27
+ *
28
+ * `sim_list` is NOT the raw alive list. It is the program-coherent indirection list the coherence
29
+ * pass (`../coherence/`) built at the end of last frame: the same pool slots, reordered so that
30
+ * particles running one VM program sit together, each run padded out to a whole workgroup. That is
31
+ * what keeps a wave from spanning two programs, which would make the interpreter's opcode `switch`
32
+ * diverge and multiply the register file's `v_movrels` waterfall by the number of distinct register
33
+ * indices in the wave.
34
+ *
35
+ * Padding entries carry {@link PARTICLE_SIM_PAD_SLOT} and are dropped BEFORE the compaction
36
+ * atomics, so a padding lane never appends to the alive list and never pushes a slot onto the free
37
+ * list — pushing the sentinel would put `0xffffffff` on the free list for a later emit to hand out
38
+ * as a record base. Returning early is safe for the lanes that remain: padding only ever appears in
39
+ * the tail of a bucket, and every real lane in that wave belongs to that one bucket, so the `switch`
40
+ * the survivors execute is uniform regardless.
41
+ *
42
+ * ## Sizing
43
+ *
44
+ * The input length is read from `counters[ALIVE_IN]` — the padded length of that list, snapshotted
45
+ * on the GPU by the build-indirect pass — NOT from a CPU uniform. A CPU-provided count is inevitably
46
+ * stale (readback latency) and corrupts the pool: under-counting orphans the tail of the list (slots
47
+ * leak into limbo), over-counting re-simulates stale entries and double-frees their slots. Dispatch
48
+ * this shader with `dispatchWorkgroupsIndirect` using the args the build-indirect pass wrote last
49
+ * frame from that same value, so thread count and bound agree by construction — and, because the
50
+ * padded length is a whole number of workgroups, agree exactly.
30
51
  *
31
52
  * All structured reads go through `array<u32>` for emulator-testability. Curve sampling uses the
32
53
  * pluggable `particle_vm_sample_curve` — here the no-op provider; the feature swaps in the
@@ -35,7 +56,7 @@ import { chunk_particle_context, chunk_particle_curve_disabled } from "./chunk_p
35
56
  * @type {ComputeShader}
36
57
  */
37
58
 
38
- export const PARTICLE_SIMULATE_WORKGROUP_SIZE = 64;
59
+ export { PARTICLE_SIMULATE_WORKGROUP_SIZE };
39
60
 
40
61
  /**
41
62
  * Per-dispatch, 12 bytes, read-only — see shader_particle_emit for why the three travel
@@ -58,7 +79,7 @@ resources.createGroup()
58
79
  .addStorageBuffer("program", WebGPUArray.u32, false)
59
80
  .addStorageBuffer("vm_constants", WebGPUArray.u32, false)
60
81
  .addStorageBuffer("pool", WebGPUArray.u32, true)
61
- .addStorageBuffer("alive_in", WebGPUArray.u32, false)
82
+ .addStorageBuffer("sim_list", WebGPUArray.u32, false)
62
83
  .addStorageBuffer("alive_out", WebGPUArray.u32, true)
63
84
  .addStorageBuffer("dead", WebGPUArray.u32, true)
64
85
  .addStorageBuffer("counters", WebGPUArray.from(atomic_u32), true);
@@ -71,14 +92,22 @@ const PARTICLE_INSTRUCTION_WORDS : u32 = ${PARTICLE_VM_INSTRUCTION_WORDS}u;
71
92
  const COUNTER_ALIVE : u32 = ${PARTICLE_COUNTER.ALIVE}u;
72
93
  const COUNTER_DEAD : u32 = ${PARTICLE_COUNTER.DEAD}u;
73
94
  const COUNTER_ALIVE_IN : u32 = ${PARTICLE_COUNTER.ALIVE_IN}u;
95
+ const PARTICLE_SIM_PAD_SLOT : u32 = ${PARTICLE_SIM_PAD_SLOT}u;
74
96
 
75
97
  @compute @workgroup_size(${PARTICLE_SIMULATE_WORKGROUP_SIZE}, 1, 1)
76
98
  fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
77
99
  let i = gid.x;
78
- // The exact alive-list length, snapshotted on-GPU last frame — never a stale CPU value.
100
+ // The exact input length, snapshotted on-GPU last frame — never a stale CPU value.
79
101
  if (i >= atomicLoad(&counters[COUNTER_ALIVE_IN])) { return; }
80
102
 
81
- let slot = alive_in[i];
103
+ let slot = sim_list[i];
104
+
105
+ // A lane the coherence pass padded the bucket out with. Leave BEFORE the compaction atomics
106
+ // below: appending here would put the sentinel on the alive or the free list, and the free list
107
+ // would then hand 0xffffffff to an emit as a record base. The lanes that stay all belong to the
108
+ // one bucket this wave covers, so their program — and the interpreter's switch — is uniform.
109
+ if (slot == PARTICLE_SIM_PAD_SLOT) { return; }
110
+
82
111
  let record_base = slot * PARTICLE_RECORD_WORDS;
83
112
  let emitter_index = pool[record_base + PARTICLE_HEADER_EMITTER];
84
113
 
@@ -1,23 +1,12 @@
1
+ export const PARTICLE_SORT_WORKGROUP_SIZE: 64;
1
2
  /**
2
- * Depth-sort shaders. Three passes bracket a `csdldf` prefix scan:
3
- *
4
- * 0. {@link shader_particle_sort_reset} every frame, write the histogram's `{count}` field
5
- * (= bucket count, which the csdldf scan reads to size itself) and zero the histogram bins and
6
- * the scatter cursor. Without this the scan consumes garbage counts and the scatter compounds
7
- * last frame's ranks — the buffers are only zeroed by WebGPU on CREATION, not per frame.
8
- * 1. {@link shader_particle_sort_histogram} — per alive particle, project its render position into
9
- * view space, quantise the depth into a back-to-front bucket (far first), store the bucket in
10
- * `keys`, and atomically bump the per-bucket `histogram`.
11
- * 2. graph_prefix_scan_csdldf turns the histogram into inclusive prefix sums.
12
- * 3. {@link shader_particle_sort_scatter} — per particle, read its bucket, take the exclusive
13
- * offset from the scanned histogram and an atomic per-bucket rank, and write the particle's slot
14
- * into `sorted` at that position.
3
+ * Dispatch this over `PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(bucket_count)` threads, not over
4
+ * `bucket_count`: its widest loop is the scan header plus the bins rounded up to the whole vec4 the
5
+ * last bin lands in. Under-dispatching leaves the tail of that vec4 holding last frame's counts,
6
+ * and the scan adds them in.
15
7
  *
16
- * The `csdldf` scan uses subgroup ops and isn't runnable under the emulator; the reset, histogram
17
- * and scatter passes are, and the CPU reference {@link ./particle_counting_sort.js} pins the
18
- * algorithm.
8
+ * @type {ComputeShader}
19
9
  */
20
- export const PARTICLE_SORT_WORKGROUP_SIZE: 64;
21
10
  export const shader_particle_sort_reset: ComputeShader;
22
11
  export const shader_particle_sort_histogram: ComputeShader;
23
12
  export const shader_particle_sort_scatter: ComputeShader;
@@ -1 +1 @@
1
- {"version":3,"file":"shader_particle_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/sort/shader_particle_sort.js"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,8CAA+C;AAkC/C,uDAIG;AAyEH,2DAIG;AAqCH,yDAIG;8BAvL2B,+BAA+B"}
1
+ {"version":3,"file":"shader_particle_sort.d.ts","sourceRoot":"","sources":["../../../../../../src/shade/renderer/particles/sort/shader_particle_sort.js"],"names":[],"mappings":"AAsDA,8CAA+C;AAgD/C;;;;;;;GAOG;AACH,yCAFU,aAAa,CAMpB;AA0EH,2DAIG;AAyCH,yDAIG;8BA1O2B,+BAA+B"}
@@ -4,6 +4,7 @@ import { WebGPUStruct } from "../../shader/type/WebGPUStruct.js";
4
4
  import { ComputeShader } from "../../shader/ComputeShader.js";
5
5
  import { CodeChunk } from "../../shader/compiler/CodeChunk.js";
6
6
  import { ShaderResourceSetDescriptor } from "../../shader/resource/ShaderResourceSetDescriptor.js";
7
+ import { PREFIX_SCAN_CSDLDF_HEADER_WORDS } from "../../gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js";
7
8
  import { PARTICLE_RECORD_HEADER_EMITTER, PARTICLE_RECORD_WORD_COUNT } from "../ParticleConstants.js";
8
9
  import { EMITTER_ATTRIBUTE_ABSENT } from "../data/PARTICLE_EMITTER_LAYOUT.js";
9
10
  import { chunk_particle_emitter } from "../data/chunk_particle_emitter.js";
@@ -11,10 +12,11 @@ import { chunk_particle_emitter } from "../data/chunk_particle_emitter.js";
11
12
  /**
12
13
  * Depth-sort shaders. Three passes bracket a `csdldf` prefix scan:
13
14
  *
14
- * 0. {@link shader_particle_sort_reset} — every frame, write the histogram's `{count}` field
15
- * (= bucket count, which the csdldf scan reads to size itself) and zero the histogram bins and
16
- * the scatter cursor. Without this the scan consumes garbage counts and the scatter compounds
17
- * last frame's ranks — the buffers are only zeroed by WebGPU on CREATION, not per frame.
15
+ * 0. {@link shader_particle_sort_reset} — every frame, write the histogram's `{count, elements}`
16
+ * header (the bucket count the csdldf scan sizes itself from), clear the header padding and the
17
+ * bins, and zero the scatter cursor. Without this the scan consumes garbage counts and the
18
+ * scatter compounds last frame's ranks — the buffers are only zeroed by WebGPU on CREATION, not
19
+ * per frame.
18
20
  * 1. {@link shader_particle_sort_histogram} — per alive particle, project its render position into
19
21
  * view space, quantise the depth into a back-to-front bucket (far first), store the bucket in
20
22
  * `keys`, and atomically bump the per-bucket `histogram`.
@@ -23,11 +25,33 @@ import { chunk_particle_emitter } from "../data/chunk_particle_emitter.js";
23
25
  * offset from the scanned histogram and an atomic per-bucket rank, and write the particle's slot
24
26
  * into `sorted` at that position.
25
27
  *
28
+ * ## The buffer the four passes share
29
+ *
30
+ * The histogram IS the scan's `{count: u32, elements: array<vec4u>}`, bound flat here as
31
+ * `array<atomic<u32>>` because these passes need atomics on it. `elements` is `@align(16)`, so bin
32
+ * `b` is word {@link PREFIX_SCAN_CSDLDF_HEADER_WORDS}` + b` and words 1..3 are padding the scan
33
+ * never reads. Every pass below steps over that header by hand; the reset clears whole vec4s of
34
+ * bins, because whole vec4s is what the scan loads.
35
+ *
36
+ * ## This is the render order
37
+ *
38
+ * The camera-dependent back-to-front list the billboard draw consumes. `../coherence/` produces the
39
+ * simulation order from the same three-phase shape — different buffers, different passes, different
40
+ * counter slots (`PARTICLE_COUNTER.SORTED` against `PARTICLE_COUNTER.SIM_PADDED`), on purpose.
41
+ *
26
42
  * The `csdldf` scan uses subgroup ops and isn't runnable under the emulator; the reset, histogram
27
43
  * and scatter passes are, and the CPU reference {@link ./particle_counting_sort.js} pins the
28
44
  * algorithm.
29
45
  */
30
46
 
47
+ /** @type {number} words of `{count, elements}` header in front of the scan's bins */
48
+ const HEADER = PREFIX_SCAN_CSDLDF_HEADER_WORDS;
49
+
50
+ /** The header stride every pass in this file interpolates. */
51
+ const COMMON = /* wgsl */ `
52
+ const SORT_HEADER_WORDS : u32 = ${HEADER}u;
53
+ `;
54
+
31
55
  export const PARTICLE_SORT_WORKGROUP_SIZE = 64;
32
56
 
33
57
  // --- reset pass ---
@@ -48,20 +72,42 @@ reset_resources.createGroup()
48
72
  .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true)
49
73
  .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true);
50
74
  const reset_body = CodeChunk.from(/* wgsl */ `
75
+ ${COMMON}
76
+
51
77
  @compute @workgroup_size(${PARTICLE_SORT_WORKGROUP_SIZE}, 1, 1)
52
78
  fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
53
79
  let i = gid.x;
80
+
54
81
  if (i == 0u) {
55
82
  // The {count, elements} header the csdldf scan sizes itself from.
56
83
  atomicStore(&histogram[0], settings.u_bucket_count);
57
84
  }
85
+
86
+ // Header padding: never read by the scan, but it shares the buffer and the pool may have left
87
+ // something in it.
88
+ if (i > 0u && i < SORT_HEADER_WORDS) {
89
+ atomicStore(&histogram[i], 0u);
90
+ }
91
+
92
+ // The scan reads whole vec4s, so the bins are cleared up to the vec4 the last one lands in.
93
+ if (i < ((settings.u_bucket_count + 3u) & 0xfffffffcu)) {
94
+ atomicStore(&histogram[SORT_HEADER_WORDS + i], 0u);
95
+ }
96
+
58
97
  if (i < settings.u_bucket_count) {
59
- atomicStore(&histogram[1u + i], 0u);
60
98
  atomicStore(&cursor[i], 0u);
61
99
  }
62
100
  }
63
101
  `);
64
102
 
103
+ /**
104
+ * Dispatch this over `PREFIX_SCAN_CSDLDF_HEADER_WORDS + round_up_4(bucket_count)` threads, not over
105
+ * `bucket_count`: its widest loop is the scan header plus the bins rounded up to the whole vec4 the
106
+ * last bin lands in. Under-dispatching leaves the tail of that vec4 holding last frame's counts,
107
+ * and the scan adds them in.
108
+ *
109
+ * @type {ComputeShader}
110
+ */
65
111
  export const shader_particle_sort_reset = ComputeShader.from({
66
112
  label: "Particle Sort Reset",
67
113
  resources: reset_resources,
@@ -105,6 +151,7 @@ histogram_resources.createGroup()
105
151
  .addStorageBuffer("keys", WebGPUArray.u32, true)
106
152
  .addStorageBuffer("histogram", WebGPUArray.from(atomic_u32), true);
107
153
  const histogram_body = CodeChunk.from(/* wgsl */ `
154
+ ${COMMON}
108
155
  const PARTICLE_RECORD_WORDS : u32 = ${PARTICLE_RECORD_WORD_COUNT}u;
109
156
  const PARTICLE_HEADER_EMITTER : u32 = ${PARTICLE_RECORD_HEADER_EMITTER}u;
110
157
  const PARTICLE_ATTRIBUTE_ABSENT : u32 = ${EMITTER_ATTRIBUTE_ABSENT}u;
@@ -135,7 +182,7 @@ fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
135
182
  let bucket = min(u32(clamped * f32(settings.u_bucket_count)), settings.u_bucket_count - 1u);
136
183
 
137
184
  keys[i] = bucket;
138
- atomicAdd(&histogram[1u + bucket], 1u);
185
+ atomicAdd(&histogram[SORT_HEADER_WORDS + bucket], 1u);
139
186
  }
140
187
  `, [chunk_particle_emitter]);
141
188
 
@@ -166,15 +213,19 @@ scatter_resources.createGroup()
166
213
  .addStorageBuffer("cursor", WebGPUArray.from(atomic_u32), true)
167
214
  .addStorageBuffer("sorted", WebGPUArray.u32, true);
168
215
  const scatter_body = CodeChunk.from(/* wgsl */ `
216
+ ${COMMON}
217
+
169
218
  @compute @workgroup_size(${PARTICLE_SORT_WORKGROUP_SIZE}, 1, 1)
170
219
  fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
171
220
  let i = gid.x;
172
221
  if (i >= settings.u_count) { return; }
173
222
 
174
223
  let bucket = keys[i];
175
- // Exclusive offset = inclusive prefix sum up to bucket-1. With the count field at index 0 the
176
- // scanned inclusive value for bucket b lives at index (1+b), so bucket b-1 is at index b.
177
- let exclusive = select(0u, scanned[bucket], bucket > 0u);
224
+
225
+ // The scan is inclusive, so bucket b's exclusive offset is bucket b-1's inclusive value, one
226
+ // word earlier. For bucket 0 the index lands on the last header word — in bounds, and unused,
227
+ // because select() takes the 0 branch there.
228
+ let exclusive = select(0u, scanned[SORT_HEADER_WORDS + bucket - 1u], bucket > 0u);
178
229
  let rank = atomicAdd(&cursor[bucket], 1u);
179
230
  sorted[exclusive + rank] = alive[i];
180
231
  }
@@ -33,7 +33,7 @@ import { VM_BUILTIN, VM_OP, VM_RANDOM_MODE } from "../isa/ParticleVMISA.js";
33
33
 
34
34
  const R = PARTICLE_VM_REGISTER_COUNT;
35
35
 
36
- const source = /* wgsl */ `
36
+ const source = /* language=wgsl */ `
37
37
  const PARTICLE_VM_REGISTER_COUNT : u32 = ${R}u;
38
38
  const PARTICLE_VM_MAX_INSTRUCTIONS : u32 = ${PARTICLE_VM_MAX_INSTRUCTIONS}u;
39
39
  const PARTICLE_VM_TWO_PI : f32 = 6.28318530717958647692;
@@ -28,6 +28,17 @@
28
28
  * see {@link chunk_skin_blend_mesh_local} for why it goes into each
29
29
  * matrix rather than onto the blended position.
30
30
  *
31
+ * **`transform_global` on a skinned mesh is the engine's, not the
32
+ * asset's.** It cancels out of the rendered position, so glTF declares
33
+ * it meaningless — and the one meaning it does have is the frame the
34
+ * clone's vertices are written in, which the fold above requires to be
35
+ * rigid against the skin. {@link GPUAnimationManager#register_skin}
36
+ * therefore overwrites it, by way of
37
+ * {@link skin_normalize_mesh_frame}, with the skin's own bind
38
+ * transform. Whatever the file put there is discarded, and anything
39
+ * reading this expecting the file's value is reading the wrong thing.
40
+ * See `renderer/animation/SKINNING_FRAME_PLAN.md`.
41
+ *
31
42
  * The mesh's **skin id** — a row in a GPU table — lives in
32
43
  * {@link GPUMeshSkinningContext} and nowhere else. The CPU-side
33
44
  * {@link Skin} it was registered with is a different thing, pure data
@@ -1 +1 @@
1
- {"version":3,"file":"SkinnedMesh.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/SkinnedMesh.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH;IAEI;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAFU,OAAK,IAAI,CAEP;IAEZ;;OAEG;IACH,SAFa,WAAW,CAMvB;IAED;;OAEG;IACH,YAFW,WAAW,QAYrB;IA4CL;;;OAGG;IACH,wBAFU,OAAO,CAEkB;CANlC;qBAnJoB,WAAW"}
1
+ {"version":3,"file":"SkinnedMesh.d.ts","sourceRoot":"","sources":["../../../../../src/shade/renderer/scene/SkinnedMesh.js"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH;IAEI;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAFU,OAAK,IAAI,CAEP;IAEZ;;OAEG;IACH,SAFa,WAAW,CAMvB;IAED;;OAEG;IACH,YAFW,WAAW,QAYrB;IA4CL;;;OAGG;IACH,wBAFU,OAAO,CAEkB;CANlC;qBA9JoB,WAAW"}