@woosh/meep-engine 3.14.5 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (788) hide show
  1. package/README.md +6 -0
  2. package/editor/Editor.d.ts +162 -0
  3. package/editor/Editor.d.ts.map +1 -0
  4. package/editor/EditorCameraNavigation.d.ts +22 -0
  5. package/editor/EditorCameraNavigation.d.ts.map +1 -0
  6. package/editor/EditorKeyMap.d.ts +28 -0
  7. package/editor/EditorKeyMap.d.ts.map +1 -0
  8. package/editor/SelectionVisualizer.d.ts +37 -0
  9. package/editor/SelectionVisualizer.d.ts.map +1 -0
  10. package/editor/actions/concrete/ActionInvalidateSampler.d.ts +18 -0
  11. package/editor/actions/concrete/ActionInvalidateSampler.d.ts.map +1 -0
  12. package/editor/actions/concrete/ActionUpdateTexture.d.ts +12 -0
  13. package/editor/actions/concrete/ActionUpdateTexture.d.ts.map +1 -0
  14. package/editor/actions/concrete/ActionUpdateTexture.js +1 -1
  15. package/editor/actions/concrete/ArrayCopyAction.d.ts +20 -0
  16. package/editor/actions/concrete/ArrayCopyAction.d.ts.map +1 -0
  17. package/editor/actions/concrete/ComponentAddAction.d.ts +15 -0
  18. package/editor/actions/concrete/ComponentAddAction.d.ts.map +1 -0
  19. package/editor/actions/concrete/ComponentRemoveAction.d.ts +11 -0
  20. package/editor/actions/concrete/ComponentRemoveAction.d.ts.map +1 -0
  21. package/editor/actions/concrete/EntityCreateAction.d.ts +18 -0
  22. package/editor/actions/concrete/EntityCreateAction.d.ts.map +1 -0
  23. package/editor/actions/concrete/EntityRemoveAction.d.ts +11 -0
  24. package/editor/actions/concrete/EntityRemoveAction.d.ts.map +1 -0
  25. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts +47 -0
  26. package/editor/actions/concrete/ModifyPatchSampler2DAction.d.ts.map +1 -0
  27. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts +38 -0
  28. package/editor/actions/concrete/ModifyPatchTextureArray2DAction.d.ts.map +1 -0
  29. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts +23 -0
  30. package/editor/actions/concrete/PaintTerrainOverlayAction.d.ts.map +1 -0
  31. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts +32 -0
  32. package/editor/actions/concrete/PatchTerrainHeightAction.d.ts.map +1 -0
  33. package/editor/actions/concrete/SelectionAddAction.d.ts +19 -0
  34. package/editor/actions/concrete/SelectionAddAction.d.ts.map +1 -0
  35. package/editor/actions/concrete/SelectionClearAction.d.ts +9 -0
  36. package/editor/actions/concrete/SelectionClearAction.d.ts.map +1 -0
  37. package/editor/actions/concrete/SelectionRemoveAction.d.ts +10 -0
  38. package/editor/actions/concrete/SelectionRemoveAction.d.ts.map +1 -0
  39. package/editor/actions/concrete/TransformModifyAction.d.ts +17 -0
  40. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -0
  41. package/editor/actions/concrete/WriteGridValueAction.d.ts +14 -0
  42. package/editor/actions/concrete/WriteGridValueAction.d.ts.map +1 -0
  43. package/editor/camera/camera_framing.d.ts +33 -0
  44. package/editor/camera/camera_framing.d.ts.map +1 -0
  45. package/editor/clipboard.d.ts +19 -0
  46. package/editor/clipboard.d.ts.map +1 -0
  47. package/editor/ecs/EditorEntity.d.ts +16 -0
  48. package/editor/ecs/EditorEntity.d.ts.map +1 -0
  49. package/editor/ecs/EditorEntitySystem.d.ts +8 -0
  50. package/editor/ecs/EditorEntitySystem.d.ts.map +1 -0
  51. package/editor/ecs/component/TypeEditor.d.ts +7 -1
  52. package/editor/ecs/component/TypeEditor.d.ts.map +1 -1
  53. package/editor/ecs/component/TypeEditor.js +5 -0
  54. package/editor/ecs/component/editors/ColorEditor.d.ts +7 -0
  55. package/editor/ecs/component/editors/ColorEditor.d.ts.map +1 -0
  56. package/editor/ecs/component/editors/HTMLElementEditor.d.ts +7 -0
  57. package/editor/ecs/component/editors/HTMLElementEditor.d.ts.map +1 -0
  58. package/editor/ecs/component/editors/ImagePathEditor.d.ts +7 -0
  59. package/editor/ecs/component/editors/ImagePathEditor.d.ts.map +1 -0
  60. package/editor/ecs/component/editors/LargeStringEditor.d.ts +16 -0
  61. package/editor/ecs/component/editors/LargeStringEditor.d.ts.map +1 -0
  62. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts +7 -0
  63. package/editor/ecs/component/editors/NumericIntervalEditor.d.ts.map +1 -0
  64. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts +7 -0
  65. package/editor/ecs/component/editors/ObservedBooleanEditor.d.ts.map +1 -0
  66. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts +7 -0
  67. package/editor/ecs/component/editors/ObservedEnumEditor.d.ts.map +1 -0
  68. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts +7 -0
  69. package/editor/ecs/component/editors/ObservedIntegerEditor.d.ts.map +1 -0
  70. package/editor/ecs/component/editors/ObservedStringEditor.d.ts +7 -0
  71. package/editor/ecs/component/editors/ObservedStringEditor.d.ts.map +1 -0
  72. package/editor/ecs/component/editors/Sampler2DEditor.d.ts +7 -0
  73. package/editor/ecs/component/editors/Sampler2DEditor.d.ts.map +1 -0
  74. package/editor/ecs/component/editors/collection/ListEditor.d.ts +8 -0
  75. package/editor/ecs/component/editors/collection/ListEditor.d.ts.map +1 -0
  76. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts +12 -0
  77. package/editor/ecs/component/editors/common/BitFlagsEditor.d.ts.map +1 -0
  78. package/editor/ecs/component/editors/common/EnumEditor.d.ts +8 -0
  79. package/editor/ecs/component/editors/common/EnumEditor.d.ts.map +1 -0
  80. package/editor/ecs/component/editors/common/makeV3_editor.d.ts +15 -0
  81. package/editor/ecs/component/editors/common/makeV3_editor.d.ts.map +1 -0
  82. package/editor/ecs/component/editors/common/noEditor.d.ts +3 -0
  83. package/editor/ecs/component/editors/common/noEditor.d.ts.map +1 -0
  84. package/editor/ecs/component/editors/common/two_way_sync.d.ts +22 -0
  85. package/editor/ecs/component/editors/common/two_way_sync.d.ts.map +1 -0
  86. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts +7 -0
  87. package/editor/ecs/component/editors/ecs/GridObstacleEditor.d.ts.map +1 -0
  88. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts +14 -0
  89. package/editor/ecs/component/editors/ecs/MinimapMarkerEditor.d.ts.map +1 -0
  90. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts +20 -0
  91. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.d.ts.map +1 -0
  92. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts +12 -0
  93. package/editor/ecs/component/editors/ecs/ParameterTrackEditor.d.ts.map +1 -0
  94. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts +14 -0
  95. package/editor/ecs/component/editors/ecs/ParameterTrackSetEditor.d.ts.map +1 -0
  96. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts +52 -0
  97. package/editor/ecs/component/editors/ecs/ParticleEmitterEditor.d.ts.map +1 -0
  98. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts +47 -0
  99. package/editor/ecs/component/editors/ecs/ParticleEmitterLayerEditor.d.ts.map +1 -0
  100. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts +21 -0
  101. package/editor/ecs/component/editors/ecs/SGMeshEditor.d.ts.map +1 -0
  102. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts +26 -0
  103. package/editor/ecs/component/editors/ecs/ShadedGeometryEditor.d.ts.map +1 -0
  104. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts +16 -0
  105. package/editor/ecs/component/editors/ecs/SimulationStepDefinitionEditor.d.ts.map +1 -0
  106. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts +15 -0
  107. package/editor/ecs/component/editors/ecs/Trail2DEditor.d.ts.map +1 -0
  108. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts +42 -0
  109. package/editor/ecs/component/editors/ecs/Trail3DEditor.d.ts.map +1 -0
  110. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts +20 -0
  111. package/editor/ecs/component/editors/ecs/TransformEditor.d.ts.map +1 -0
  112. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts +8 -0
  113. package/editor/ecs/component/editors/ecs/buildGridObstaclePreview.d.ts.map +1 -0
  114. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts +19 -0
  115. package/editor/ecs/component/editors/ecs/terrain/SplatMappingEditor.d.ts.map +1 -0
  116. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts +27 -0
  117. package/editor/ecs/component/editors/ecs/terrain/TerrainEditor.d.ts.map +1 -0
  118. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts +16 -0
  119. package/editor/ecs/component/editors/ecs/terrain/TerrainLayerEditor.d.ts.map +1 -0
  120. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts +19 -0
  121. package/editor/ecs/component/editors/ecs/terrain/TerrainLayersEditor.d.ts.map +1 -0
  122. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts +18 -0
  123. package/editor/ecs/component/editors/ecs/terrain/TerrainOverlayEditor.d.ts.map +1 -0
  124. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts +6 -0
  125. package/editor/ecs/component/editors/geom/QuaternionEditor.d.ts.map +1 -0
  126. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts +7 -0
  127. package/editor/ecs/component/editors/geom/Vector1Editor.d.ts.map +1 -0
  128. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts +6 -0
  129. package/editor/ecs/component/editors/geom/Vector2Editor.d.ts.map +1 -0
  130. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts +6 -0
  131. package/editor/ecs/component/editors/geom/Vector3Editor.d.ts.map +1 -0
  132. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts +6 -0
  133. package/editor/ecs/component/editors/geom/Vector4Editor.d.ts.map +1 -0
  134. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts +8 -0
  135. package/editor/ecs/component/editors/primitive/ArrayEditor.d.ts.map +1 -0
  136. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts +7 -0
  137. package/editor/ecs/component/editors/primitive/BooleanEditor.d.ts.map +1 -0
  138. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts +7 -0
  139. package/editor/ecs/component/editors/primitive/FunctionEditor.d.ts.map +1 -0
  140. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts +8 -0
  141. package/editor/ecs/component/editors/primitive/NumberEditor.d.ts.map +1 -0
  142. package/editor/ecs/component/editors/primitive/StringEditor.d.ts +7 -0
  143. package/editor/ecs/component/editors/primitive/StringEditor.d.ts.map +1 -0
  144. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts +28 -0
  145. package/editor/ecs/component/editors/shade/MeshletGeometryEditor.d.ts.map +1 -0
  146. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts +29 -0
  147. package/editor/ecs/component/editors/shade/ShadeImageEditor.d.ts.map +1 -0
  148. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts +28 -0
  149. package/editor/ecs/component/editors/shade/ShadeMaterialEditor.d.ts.map +1 -0
  150. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts +41 -0
  151. package/editor/ecs/component/editors/shade/ShadeTextureEditor.d.ts.map +1 -0
  152. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts +31 -0
  153. package/editor/ecs/component/editors/shade/StandardShadeMaterialEditor.d.ts.map +1 -0
  154. package/editor/ecs/component/prototypeObjectEditor.d.ts +2 -0
  155. package/editor/ecs/component/prototypeObjectEditor.d.ts.map +1 -0
  156. package/editor/ecs/component/registerBasicTypeEditors.d.ts +11 -0
  157. package/editor/ecs/component/registerBasicTypeEditors.d.ts.map +1 -0
  158. package/editor/ecs/component/registerEngineComponentEditors.d.ts +8 -0
  159. package/editor/ecs/component/registerEngineComponentEditors.d.ts.map +1 -0
  160. package/editor/enableEditor.d.ts +14 -0
  161. package/editor/enableEditor.d.ts.map +1 -0
  162. package/editor/entity_world_bounds.d.ts +17 -0
  163. package/editor/entity_world_bounds.d.ts.map +1 -0
  164. package/editor/library/MeshLibrary.d.ts +13 -0
  165. package/editor/library/MeshLibrary.d.ts.map +1 -0
  166. package/editor/particles/lut_ops.d.ts +34 -0
  167. package/editor/particles/lut_ops.d.ts.map +1 -0
  168. package/editor/particles/particleEditEvents.d.ts +11 -0
  169. package/editor/particles/particleEditEvents.d.ts.map +1 -0
  170. package/editor/particles/rebuildParticleEmitter.d.ts +11 -0
  171. package/editor/particles/rebuildParticleEmitter.d.ts.map +1 -0
  172. package/editor/persistence/EditorLayoutStore.d.ts +30 -0
  173. package/editor/persistence/EditorLayoutStore.d.ts.map +1 -0
  174. package/editor/persistence/SceneMetadata.d.ts +38 -0
  175. package/editor/persistence/SceneMetadata.d.ts.map +1 -0
  176. package/editor/persistence/SceneSlotManager.d.ts +40 -0
  177. package/editor/persistence/SceneSlotManager.d.ts.map +1 -0
  178. package/editor/persistence/buildNewSceneDataset.d.ts +10 -0
  179. package/editor/persistence/buildNewSceneDataset.d.ts.map +1 -0
  180. package/editor/persistence/files.d.ts +24 -0
  181. package/editor/persistence/files.d.ts.map +1 -0
  182. package/editor/persistence/scene_import.d.ts +45 -0
  183. package/editor/persistence/scene_import.d.ts.map +1 -0
  184. package/editor/persistence/scene_serialization.d.ts +36 -0
  185. package/editor/persistence/scene_serialization.d.ts.map +1 -0
  186. package/editor/persistence/string_buffer_codec.d.ts +20 -0
  187. package/editor/persistence/string_buffer_codec.d.ts.map +1 -0
  188. package/editor/process/DisableGameUIProcess.d.ts +8 -0
  189. package/editor/process/DisableGameUIProcess.d.ts.map +1 -0
  190. package/editor/process/EditorProcess.d.ts +19 -0
  191. package/editor/process/EditorProcess.d.ts.map +1 -0
  192. package/editor/process/GridDisplayProcess.d.ts +35 -0
  193. package/editor/process/GridDisplayProcess.d.ts.map +1 -0
  194. package/editor/process/ObstacleGridDisplayProcess.d.ts +13 -0
  195. package/editor/process/ObstacleGridDisplayProcess.d.ts.map +1 -0
  196. package/editor/process/ParticleEmitterRebuildProcess.d.ts +66 -0
  197. package/editor/process/ParticleEmitterRebuildProcess.d.ts.map +1 -0
  198. package/editor/process/ProcessEngine.d.ts +30 -0
  199. package/editor/process/ProcessEngine.d.ts.map +1 -0
  200. package/editor/process/SymbolicDisplayProcess.d.ts +23 -0
  201. package/editor/process/SymbolicDisplayProcess.d.ts.map +1 -0
  202. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts +17 -0
  203. package/editor/process/symbolic/AudioEmitterSymbolicDisplay.d.ts.map +1 -0
  204. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts +25 -0
  205. package/editor/process/symbolic/CameraSymbolicDisplay.d.ts.map +1 -0
  206. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts +19 -0
  207. package/editor/process/symbolic/GridPositionSymbolicDisplay.d.ts.map +1 -0
  208. package/editor/process/symbolic/LightSymbolicDisplay.d.ts +19 -0
  209. package/editor/process/symbolic/LightSymbolicDisplay.d.ts.map +1 -0
  210. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts +18 -0
  211. package/editor/process/symbolic/ParticleEmitterSymbolicDisplay.d.ts.map +1 -0
  212. package/editor/process/symbolic/PathSymbolicDisplay.d.ts +20 -0
  213. package/editor/process/symbolic/PathSymbolicDisplay.d.ts.map +1 -0
  214. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts +25 -0
  215. package/editor/process/symbolic/PositionedMarkerSymbolicDisplay.d.ts.map +1 -0
  216. package/editor/process/symbolic/SymbolicDisplay.d.ts +48 -0
  217. package/editor/process/symbolic/SymbolicDisplay.d.ts.map +1 -0
  218. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts +13 -0
  219. package/editor/process/symbolic/gizmo_draw_wire_box_oriented.d.ts.map +1 -0
  220. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts +18 -0
  221. package/editor/process/symbolic/gizmo_draw_wire_circle.d.ts.map +1 -0
  222. package/editor/prototypeEditorShell.d.ts +13 -0
  223. package/editor/prototypeEditorShell.d.ts.map +1 -0
  224. package/editor/selection/editor_pick.d.ts +43 -0
  225. package/editor/selection/editor_pick.d.ts.map +1 -0
  226. package/editor/selection/screen_rect_frustum.d.ts +32 -0
  227. package/editor/selection/screen_rect_frustum.d.ts.map +1 -0
  228. package/editor/templates/entity_templates.d.ts +19 -0
  229. package/editor/templates/entity_templates.d.ts.map +1 -0
  230. package/editor/tools/GridPaintTool.d.ts +18 -0
  231. package/editor/tools/GridPaintTool.d.ts.map +1 -0
  232. package/editor/tools/SelectionTool.d.ts +38 -0
  233. package/editor/tools/SelectionTool.d.ts.map +1 -0
  234. package/editor/tools/SelectionTool.js +2 -2
  235. package/editor/tools/TransformToolV2.d.ts +70 -0
  236. package/editor/tools/TransformToolV2.d.ts.map +1 -0
  237. package/editor/tools/engine/Tool.d.ts +88 -0
  238. package/editor/tools/engine/Tool.d.ts.map +1 -0
  239. package/editor/tools/engine/ToolEngine.d.ts +22 -0
  240. package/editor/tools/engine/ToolEngine.d.ts.map +1 -0
  241. package/editor/tools/engine/ToolState.d.ts +7 -0
  242. package/editor/tools/engine/ToolState.d.ts.map +1 -0
  243. package/editor/tools/paint/TerrainHeightPaintTool.d.ts +18 -0
  244. package/editor/tools/paint/TerrainHeightPaintTool.d.ts.map +1 -0
  245. package/editor/tools/paint/TerrainPaintTool.d.ts +82 -0
  246. package/editor/tools/paint/TerrainPaintTool.d.ts.map +1 -0
  247. package/editor/tools/paint/TerrainTexturePaintTool.d.ts +19 -0
  248. package/editor/tools/paint/TerrainTexturePaintTool.d.ts.map +1 -0
  249. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts +139 -0
  250. package/editor/tools/v2/BlenderCameraOrientationGizmo.d.ts.map +1 -0
  251. package/editor/tools/v2/GizmoNode.d.ts +21 -0
  252. package/editor/tools/v2/GizmoNode.d.ts.map +1 -0
  253. package/editor/tools/v2/TransformControls.d.ts +219 -0
  254. package/editor/tools/v2/TransformControls.d.ts.map +1 -0
  255. package/editor/tools/v2/TransformMode.d.ts +7 -0
  256. package/editor/tools/v2/TransformMode.d.ts.map +1 -0
  257. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts +37 -0
  258. package/editor/tools/v2/handle/gizmo_drag_plane.d.ts.map +1 -0
  259. package/editor/tools/v2/handle/gizmo_draw.d.ts +14 -0
  260. package/editor/tools/v2/handle/gizmo_draw.d.ts.map +1 -0
  261. package/editor/tools/v2/handle/gizmo_handles.d.ts +160 -0
  262. package/editor/tools/v2/handle/gizmo_handles.d.ts.map +1 -0
  263. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts +103 -0
  264. package/editor/tools/v2/handle/gizmo_ray_shapes.d.ts.map +1 -0
  265. package/editor/view/GridPickCoordinateView.d.ts +22 -0
  266. package/editor/view/GridPickCoordinateView.d.ts.map +1 -0
  267. package/editor/view/ecs/ComponentControlView.d.ts +24 -0
  268. package/editor/view/ecs/ComponentControlView.d.ts.map +1 -0
  269. package/editor/view/ecs/EntityEditor.d.ts +25 -0
  270. package/editor/view/ecs/EntityEditor.d.ts.map +1 -0
  271. package/editor/view/ecs/EntityList.d.ts +22 -0
  272. package/editor/view/ecs/EntityList.d.ts.map +1 -0
  273. package/editor/view/ecs/HierarchicalEntityListView.d.ts +25 -0
  274. package/editor/view/ecs/HierarchicalEntityListView.d.ts.map +1 -0
  275. package/editor/view/ecs/components/DatGuiController.d.ts +2 -0
  276. package/editor/view/ecs/components/DatGuiController.d.ts.map +1 -0
  277. package/editor/view/ecs/components/color/GaugeView.d.ts +9 -5
  278. package/editor/view/ecs/components/color/GaugeView.d.ts.map +1 -1
  279. package/editor/view/ecs/components/color/GaugeView.js +4 -4
  280. package/editor/view/ecs/components/common/NumberController.d.ts +9 -5
  281. package/editor/view/ecs/components/common/NumberController.d.ts.map +1 -1
  282. package/editor/view/ecs/components/common/NumberController.js +4 -4
  283. package/editor/view/ecs/components/common/NumericIntervalController.d.ts +10 -0
  284. package/editor/view/ecs/components/common/NumericIntervalController.d.ts.map +1 -0
  285. package/editor/view/ecs/components/common/TextController.d.ts.map +1 -1
  286. package/editor/view/library/MeshLibraryView.d.ts +16 -0
  287. package/editor/view/library/MeshLibraryView.d.ts.map +1 -0
  288. package/editor/view/library/mesh_library_drag.d.ts +21 -0
  289. package/editor/view/library/mesh_library_drag.d.ts.map +1 -0
  290. package/editor/view/library/model_thumbnail_source.d.ts +12 -0
  291. package/editor/view/library/model_thumbnail_source.d.ts.map +1 -0
  292. package/editor/view/makeEntityDecorators.d.ts +6 -0
  293. package/editor/view/makeEntityDecorators.d.ts.map +1 -0
  294. package/editor/view/node-graph/NodeGraphCamera.d.ts.map +1 -1
  295. package/editor/view/node-graph/NodeGraphEditorView.d.ts.map +1 -1
  296. package/editor/view/node-graph/NodeGraphSelection.d.ts.map +1 -1
  297. package/editor/view/node-graph/NodeGraphView.d.ts.map +1 -1
  298. package/editor/view/node-graph/NodeView.d.ts.map +1 -1
  299. package/editor/view/node-graph/PortView.d.ts.map +1 -1
  300. package/editor/view/node-graph/actions/ConnectionCreateAction.d.ts.map +1 -1
  301. package/editor/view/node-graph/actions/ConnectionDeleteAction.d.ts.map +1 -1
  302. package/editor/view/node-graph/actions/NodeDeleteAction.d.ts.map +1 -1
  303. package/editor/view/node-graph/actions/NodeParameterSetAction.d.ts.map +1 -1
  304. package/editor/view/node-graph/actions/NodesMoveAction.d.ts.map +1 -1
  305. package/editor/view/node-graph/actions/SelectionSetAction.d.ts.map +1 -1
  306. package/editor/view/node-graph/connection_wire_geometry.d.ts.map +1 -1
  307. package/editor/view/particles/ColorLutGradientView.d.ts +19 -0
  308. package/editor/view/particles/ColorLutGradientView.d.ts.map +1 -0
  309. package/editor/view/particles/ScalarLutCurveView.d.ts +19 -0
  310. package/editor/view/particles/ScalarLutCurveView.d.ts.map +1 -0
  311. package/editor/view/prepareMeshLibrary.d.ts +7 -0
  312. package/editor/view/prepareMeshLibrary.d.ts.map +1 -0
  313. package/editor/view/process/ProcessView.d.ts +14 -0
  314. package/editor/view/process/ProcessView.d.ts.map +1 -0
  315. package/editor/view/shell/EditorShellView.d.ts +18 -0
  316. package/editor/view/shell/EditorShellView.d.ts.map +1 -0
  317. package/editor/view/shell/SceneTreePanelView.d.ts +17 -0
  318. package/editor/view/shell/SceneTreePanelView.d.ts.map +1 -0
  319. package/editor/view/shell/ViewportPanelView.d.ts +18 -0
  320. package/editor/view/shell/ViewportPanelView.d.ts.map +1 -0
  321. package/editor/view/tools/ToolSettingsView.d.ts +22 -0
  322. package/editor/view/tools/ToolSettingsView.d.ts.map +1 -0
  323. package/editor/view/tools/ToolView.d.ts +13 -0
  324. package/editor/view/tools/ToolView.d.ts.map +1 -0
  325. package/editor/view/v2/SplitView.d.ts +2 -0
  326. package/editor/view/v2/SplitView.d.ts.map +1 -0
  327. package/package.json +9 -11
  328. package/samples/engine/README.md +113 -0
  329. package/samples/engine/first-scene/index.html +32 -0
  330. package/samples/engine/first-scene/main.js +152 -0
  331. package/src/core/assert.d.ts +2 -2
  332. package/src/core/binary/BitSet.d.ts +2 -2
  333. package/src/core/binary/BitSet.d.ts.map +1 -1
  334. package/src/core/binary/BitSet.js +1 -1
  335. package/src/core/bvh2/bvh3/BVH.d.ts +4 -0
  336. package/src/core/bvh2/bvh3/BVH.d.ts.map +1 -1
  337. package/src/core/bvh2/bvh3/BVH.js +4 -0
  338. package/src/core/bvh2/bvh3/BvhClient.d.ts +4 -0
  339. package/src/core/bvh2/bvh3/BvhClient.d.ts.map +1 -1
  340. package/src/core/bvh2/bvh3/BvhClient.js +4 -0
  341. package/src/core/collection/array/array_sort_quick.d.ts +1 -1
  342. package/src/core/collection/list/List.d.ts +7 -3
  343. package/src/core/collection/list/List.d.ts.map +1 -1
  344. package/src/core/collection/list/List.js +6 -2
  345. package/src/core/collection/table/RowFirstTableSpec.d.ts.map +1 -1
  346. package/src/core/collection/table/RowFirstTableSpec.js +0 -4
  347. package/src/core/color/Color.d.ts +1 -0
  348. package/src/core/color/Color.d.ts.map +1 -1
  349. package/src/core/color/Color.js +4 -0
  350. package/src/core/events/signal/SignalBinding.d.ts +4 -0
  351. package/src/core/events/signal/SignalBinding.d.ts.map +1 -1
  352. package/src/core/events/signal/SignalBinding.js +4 -0
  353. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts +5 -1
  354. package/src/core/geom/2d/quad-tree/QuadTreeDatum.d.ts.map +1 -1
  355. package/src/core/geom/2d/quad-tree/QuadTreeDatum.js +4 -0
  356. package/src/core/geom/3d/SurfacePoint3.d.ts +2 -2
  357. package/src/core/geom/3d/SurfacePoint3.d.ts.map +1 -1
  358. package/src/core/geom/3d/SurfacePoint3.js +1 -1
  359. package/src/core/geom/3d/aabb/AABB3.d.ts +63 -7
  360. package/src/core/geom/3d/aabb/AABB3.d.ts.map +1 -1
  361. package/src/core/geom/3d/aabb/AABB3.js +17 -3
  362. package/src/core/geom/3d/plane/plane3_compute_intersection_objects.js +2 -2
  363. package/src/core/geom/3d/ray/Ray3.d.ts +4 -4
  364. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +10 -3
  365. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  366. package/src/core/geom/3d/shape/AbstractShape3D.js +9 -2
  367. package/src/core/geom/3d/shape/TransformedShape3D.d.ts +2 -2
  368. package/src/core/geom/3d/sphere/harmonics/sh3_rotate.d.ts +1 -1
  369. package/src/core/geom/Vector1.d.ts +4 -0
  370. package/src/core/geom/Vector1.d.ts.map +1 -1
  371. package/src/core/geom/Vector1.js +4 -0
  372. package/src/core/geom/Vector2.d.ts +4 -0
  373. package/src/core/geom/Vector2.d.ts.map +1 -1
  374. package/src/core/geom/Vector2.js +4 -0
  375. package/src/core/geom/Vector3.d.ts +4 -0
  376. package/src/core/geom/Vector3.d.ts.map +1 -1
  377. package/src/core/geom/Vector3.js +4 -0
  378. package/src/core/geom/Vector4.d.ts +4 -0
  379. package/src/core/geom/Vector4.d.ts.map +1 -1
  380. package/src/core/geom/Vector4.js +4 -0
  381. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts +6 -2
  382. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.d.ts.map +1 -1
  383. package/src/core/geom/packing/max-rect/MaxRectanglesPacker.js +4 -0
  384. package/src/core/geom/packing/miniball/Subspan.d.ts +4 -4
  385. package/src/core/geom/packing/miniball/Subspan.d.ts.map +1 -1
  386. package/src/core/geom/packing/miniball/Subspan.js +2 -2
  387. package/src/core/math/interval/NumericInterval.d.ts +4 -0
  388. package/src/core/math/interval/NumericInterval.d.ts.map +1 -1
  389. package/src/core/math/interval/NumericInterval.js +4 -0
  390. package/src/core/math/random/roundFair.d.ts +2 -2
  391. package/src/core/math/random/roundFair.d.ts.map +1 -1
  392. package/src/core/math/random/roundFair.js +1 -1
  393. package/src/core/model/BoundedValue.d.ts +4 -0
  394. package/src/core/model/BoundedValue.d.ts.map +1 -1
  395. package/src/core/model/BoundedValue.js +4 -0
  396. package/src/core/model/ObservedBoolean.d.ts +4 -0
  397. package/src/core/model/ObservedBoolean.d.ts.map +1 -1
  398. package/src/core/model/ObservedBoolean.js +4 -0
  399. package/src/core/model/ObservedInteger.d.ts +4 -0
  400. package/src/core/model/ObservedInteger.d.ts.map +1 -1
  401. package/src/core/model/ObservedInteger.js +4 -0
  402. package/src/core/model/ObservedString.d.ts +4 -0
  403. package/src/core/model/ObservedString.d.ts.map +1 -1
  404. package/src/core/model/ObservedString.js +4 -0
  405. package/src/core/model/stat/Stat.d.ts +7 -3
  406. package/src/core/model/stat/Stat.d.ts.map +1 -1
  407. package/src/core/model/stat/Stat.js +4 -0
  408. package/src/engine/Engine.d.ts.map +1 -1
  409. package/src/engine/Engine.js +65 -0
  410. package/src/engine/EngineHarness.d.ts +8 -1
  411. package/src/engine/EngineHarness.d.ts.map +1 -1
  412. package/src/engine/EngineHarness.js +10 -14
  413. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts +2 -2
  414. package/src/engine/animation/clip/ecd_bind_animation_curve.d.ts.map +1 -1
  415. package/src/engine/animation/clip/ecd_bind_animation_curve.js +4 -4
  416. package/src/engine/asset/loaders/async_traverse_three_object.d.ts +2 -2
  417. package/src/engine/asset/loaders/async_traverse_three_object.d.ts.map +1 -1
  418. package/src/engine/asset/loaders/async_traverse_three_object.js +1 -1
  419. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts +7 -3
  420. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.d.ts.map +1 -1
  421. package/src/engine/asset/loaders/image/codec/ThreadedImageDecoder.js +33 -3
  422. package/src/engine/control/first-person/DESIGN.md +20 -2
  423. package/src/engine/control/first-person/DESIGN_COLLISION.md +17 -0
  424. package/src/engine/control/first-person/collision/KinematicMover.d.ts +58 -11
  425. package/src/engine/control/first-person/collision/KinematicMover.d.ts.map +1 -1
  426. package/src/engine/control/first-person/collision/KinematicMover.js +97 -20
  427. package/src/engine/ecs/Entity.js +1 -1
  428. package/src/engine/ecs/EntityComponentDataset.d.ts +2 -2
  429. package/src/engine/ecs/EntityComponentDataset.d.ts.map +1 -1
  430. package/src/engine/ecs/EntityComponentDataset.js +1 -1
  431. package/src/engine/ecs/EntityManager.d.ts.map +1 -1
  432. package/src/engine/ecs/EntityManager.js +27 -3
  433. package/src/engine/ecs/animation/Animation.d.ts +17 -3
  434. package/src/engine/ecs/animation/Animation.d.ts.map +1 -1
  435. package/src/engine/ecs/animation/Animation.js +26 -6
  436. package/src/engine/ecs/terrain/TerrainPreview.d.ts +4 -0
  437. package/src/engine/ecs/terrain/TerrainPreview.d.ts.map +1 -1
  438. package/src/engine/ecs/terrain/TerrainPreview.js +4 -0
  439. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts +4 -4
  440. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.d.ts.map +1 -1
  441. package/src/engine/ecs/terrain/ecs/cling/ClingToTerrainSystem.js +2 -2
  442. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts +3 -2
  443. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.d.ts.map +1 -1
  444. package/src/engine/ecs/terrain/ecs/makeTerrainWorkerProxy.js +25 -2
  445. package/src/engine/ecs/transform/Transform64.d.ts +4 -4
  446. package/src/engine/ecs/transform/Transform64.d.ts.map +1 -1
  447. package/src/engine/ecs/transform/Transform64.js +2 -2
  448. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts +26 -0
  449. package/src/engine/graphics/ecs/decal/v2/Decal.d.ts.map +1 -1
  450. package/src/engine/graphics/ecs/decal/v2/Decal.js +26 -0
  451. package/src/engine/graphics/ecs/light/Light.d.ts +38 -1
  452. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  453. package/src/engine/graphics/ecs/light/Light.js +51 -1
  454. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts +3 -3
  455. package/src/engine/graphics/ecs/mesh/copyToVector3.d.ts.map +1 -1
  456. package/src/engine/graphics/ecs/mesh/copyToVector3.js +2 -2
  457. package/src/engine/graphics/ecs/mesh/setMesh.d.ts +2 -2
  458. package/src/engine/graphics/ecs/mesh/setMesh.d.ts.map +1 -1
  459. package/src/engine/graphics/ecs/mesh/setMesh.js +1 -1
  460. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts +2 -2
  461. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.d.ts.map +1 -1
  462. package/src/engine/graphics/geometry/buffered/computeBufferAttributeHash.js +1 -1
  463. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts +3 -3
  464. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.d.ts.map +1 -1
  465. package/src/engine/graphics/geometry/buffered/computeGeometryEquality.js +2 -2
  466. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts +2 -2
  467. package/src/engine/graphics/geometry/buffered/computeGeometryHash.d.ts.map +1 -1
  468. package/src/engine/graphics/geometry/buffered/computeGeometryHash.js +1 -1
  469. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts +2 -2
  470. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.d.ts.map +1 -1
  471. package/src/engine/graphics/geometry/buffered/compute_buffer_geometry_byte_size.js +1 -1
  472. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts +2 -2
  473. package/src/engine/graphics/geometry/compute_geometry_polycount.d.ts.map +1 -1
  474. package/src/engine/graphics/geometry/compute_geometry_polycount.js +1 -1
  475. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts +3 -3
  476. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.d.ts.map +1 -1
  477. package/src/engine/graphics/geometry/ribbon/copyAttributeV3.js +2 -2
  478. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts +4 -4
  479. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.d.ts.map +1 -1
  480. package/src/engine/graphics/geometry/ribbon/copyAttributeValue.js +3 -3
  481. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts +3 -3
  482. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.d.ts.map +1 -1
  483. package/src/engine/graphics/geometry/ribbon/equalAttributeV3.js +2 -2
  484. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts +4 -4
  485. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.d.ts.map +1 -1
  486. package/src/engine/graphics/geometry/ribbon/equalAttributeValue.js +3 -3
  487. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts +2 -2
  488. package/src/engine/graphics/geometry/scaleGeometryToBox.d.ts.map +1 -1
  489. package/src/engine/graphics/geometry/scaleGeometryToBox.js +1 -1
  490. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts +2 -2
  491. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.d.ts.map +1 -1
  492. package/src/engine/graphics/impostors/card_cluster/FacePlaneAssignment.js +1 -1
  493. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts +2 -2
  494. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.d.ts.map +1 -1
  495. package/src/engine/graphics/impostors/octahedral/ImpostorDescription.js +1 -1
  496. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +4 -12
  497. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  498. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +2 -2
  499. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts +5 -20
  500. package/src/engine/graphics/particles/particular/engine/emitter/ParticleLayer.d.ts.map +1 -1
  501. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +24 -24
  502. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  503. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +16 -16
  504. package/src/engine/graphics/render/layers/RenderLayer.d.ts +4 -4
  505. package/src/engine/graphics/render/layers/RenderLayer.d.ts.map +1 -1
  506. package/src/engine/graphics/render/layers/RenderLayer.js +2 -2
  507. package/src/engine/graphics/render/make_bvh_visibility_builder.js +1 -1
  508. package/src/engine/graphics/render/visibility/VisibilityComputer.d.ts +1 -1
  509. package/src/engine/graphics/render/visibility/VisibilityComputer.js +1 -1
  510. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts +2 -2
  511. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  512. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +1 -1
  513. package/src/engine/graphics3/DecalSystem.d.ts +8 -0
  514. package/src/engine/graphics3/DecalSystem.d.ts.map +1 -1
  515. package/src/engine/graphics3/DecalSystem.js +8 -0
  516. package/src/engine/graphics3/GraphicsEngine.d.ts +19 -8
  517. package/src/engine/graphics3/GraphicsEngine.d.ts.map +1 -1
  518. package/src/engine/graphics3/GraphicsEngine.js +22 -11
  519. package/src/engine/graphics3/LightSystem.d.ts.map +1 -1
  520. package/src/engine/graphics3/LightSystem.js +11 -1
  521. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts +4 -0
  522. package/src/engine/input/devices/gamepad/GamepadStickCalibration.d.ts.map +1 -1
  523. package/src/engine/input/devices/gamepad/GamepadStickCalibration.js +4 -0
  524. package/src/engine/navigation/mesh/NavigationMesh.d.ts +90 -9
  525. package/src/engine/navigation/mesh/NavigationMesh.d.ts.map +1 -1
  526. package/src/engine/navigation/mesh/NavigationMesh.js +80 -8
  527. package/src/engine/network/NetworkSession.d.ts +60 -0
  528. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  529. package/src/engine/network/NetworkSession.js +141 -1
  530. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +48 -0
  531. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  532. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +246 -3
  533. package/src/engine/network/replication/Replicator.d.ts +18 -0
  534. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  535. package/src/engine/network/replication/Replicator.js +98 -0
  536. package/src/engine/physics/ecs/PhysicsSystem.d.ts +27 -0
  537. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -1
  538. package/src/engine/physics/ecs/PhysicsSystem.js +27 -0
  539. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  540. package/src/engine/sound/SoundEngine.d.ts +24 -0
  541. package/src/engine/sound/SoundEngine.d.ts.map +1 -1
  542. package/src/engine/sound/SoundEngine.js +29 -11
  543. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts +12 -4
  544. package/src/engine/sound/simulation/configureAcousticSimulation.d.ts.map +1 -1
  545. package/src/engine/sound/simulation/configureAcousticSimulation.js +10 -4
  546. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts +3 -1
  547. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.d.ts.map +1 -1
  548. package/src/engine/sound/simulation/ecs/AcousticProbeFieldSystem.js +27 -1
  549. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts +34 -0
  550. package/src/engine/sound/simulation/render/ProbeReverbRenderer.d.ts.map +1 -1
  551. package/src/engine/sound/simulation/render/ProbeReverbRenderer.js +61 -2
  552. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  553. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +9 -0
  554. package/src/shade/RENDERER_CONTRACT.md +584 -580
  555. package/src/shade/playground/avboit/README.md +117 -0
  556. package/src/shade/playground/avboit/index.html +215 -0
  557. package/src/shade/playground/avboit/main.d.ts +2 -0
  558. package/src/shade/playground/avboit/main.d.ts.map +1 -0
  559. package/src/shade/playground/avboit/main.js +875 -0
  560. package/src/shade/playground/particle_system/README.md +14 -3
  561. package/src/shade/playground/particle_system/index.html +1 -0
  562. package/src/shade/playground/particle_system/main.js +15 -2
  563. package/src/shade/playground/particle_system/particle_scene.d.ts +11 -2
  564. package/src/shade/playground/particle_system/particle_scene.d.ts.map +1 -1
  565. package/src/shade/playground/particle_system/particle_scene.js +126 -9
  566. package/src/shade/renderer/GraphicsContext.d.ts +1 -0
  567. package/src/shade/renderer/GraphicsContext.d.ts.map +1 -1
  568. package/src/shade/renderer/GraphicsContext.js +4 -0
  569. package/src/shade/renderer/Renderer.d.ts +17 -1
  570. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  571. package/src/shade/renderer/Renderer.js +29 -28
  572. package/src/shade/renderer/ShadeTransparencyMode.d.ts +13 -0
  573. package/src/shade/renderer/ShadeTransparencyMode.d.ts.map +1 -0
  574. package/src/shade/renderer/ShadeTransparencyMode.js +30 -0
  575. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts +13 -0
  576. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.d.ts.map +1 -1
  577. package/src/shade/renderer/geometry/MeshletGeometrySerializationAdapter.js +13 -0
  578. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts +18 -0
  579. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.d.ts.map +1 -1
  580. package/src/shade/renderer/geometry/meshlet_geometry_build_from_geometry.js +18 -0
  581. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts +4 -0
  582. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.d.ts.map +1 -1
  583. package/src/shade/renderer/global_illumination/lpv/LightProbeVolume.js +4 -0
  584. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts +12 -0
  585. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.d.ts.map +1 -1
  586. package/src/shade/renderer/gpu_primitive/prefix_sum/v1/shader_prefix_scan_csdldf.js +13 -0
  587. package/src/shade/renderer/light/environment/rgbe/parse_rgbe.d.ts +1 -1
  588. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  589. package/src/shade/renderer/particles/DESIGN.md +66 -15
  590. package/src/shade/renderer/particles/GPUParticleSystem.d.ts +29 -5
  591. package/src/shade/renderer/particles/GPUParticleSystem.d.ts.map +1 -1
  592. package/src/shade/renderer/particles/GPUParticleSystem.js +61 -6
  593. package/src/shade/renderer/particles/ParticleConstants.d.ts +31 -0
  594. package/src/shade/renderer/particles/ParticleConstants.d.ts.map +1 -1
  595. package/src/shade/renderer/particles/ParticleConstants.js +33 -0
  596. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts +61 -0
  597. package/src/shade/renderer/particles/coherence/graph_particle_bucket.d.ts.map +1 -0
  598. package/src/shade/renderer/particles/coherence/graph_particle_bucket.js +179 -0
  599. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts +63 -0
  600. package/src/shade/renderer/particles/coherence/particle_program_buckets.d.ts.map +1 -0
  601. package/src/shade/renderer/particles/coherence/particle_program_buckets.js +116 -0
  602. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts +59 -0
  603. package/src/shade/renderer/particles/coherence/shader_particle_bucket.d.ts.map +1 -0
  604. package/src/shade/renderer/particles/coherence/shader_particle_bucket.js +344 -0
  605. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts +27 -5
  606. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.d.ts.map +1 -1
  607. package/src/shade/renderer/particles/data/PARTICLE_COUNTERS.js +27 -5
  608. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts +13 -1
  609. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.d.ts.map +1 -1
  610. package/src/shade/renderer/particles/data/PARTICLE_EMITTER_LAYOUT.js +15 -1
  611. package/src/shade/renderer/particles/data/chunk_particle_emitter.d.ts.map +1 -1
  612. package/src/shade/renderer/particles/data/chunk_particle_emitter.js +3 -0
  613. package/src/shade/renderer/particles/graph_particles.d.ts +39 -11
  614. package/src/shade/renderer/particles/graph_particles.d.ts.map +1 -1
  615. package/src/shade/renderer/particles/graph_particles.js +60 -20
  616. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts +8 -1
  617. package/src/shade/renderer/particles/runtime/EmitterRegistry.d.ts.map +1 -1
  618. package/src/shade/renderer/particles/runtime/EmitterRegistry.js +8 -1
  619. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts +22 -2
  620. package/src/shade/renderer/particles/runtime/ProgramArena.d.ts.map +1 -1
  621. package/src/shade/renderer/particles/runtime/ProgramArena.js +54 -3
  622. package/src/shade/renderer/particles/shaders/shader_particle_finalize.d.ts.map +1 -1
  623. package/src/shade/renderer/particles/shaders/shader_particle_finalize.js +32 -14
  624. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts +2 -23
  625. package/src/shade/renderer/particles/shaders/shader_particle_simulate.d.ts.map +1 -1
  626. package/src/shade/renderer/particles/shaders/shader_particle_simulate.js +40 -11
  627. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts +6 -17
  628. package/src/shade/renderer/particles/sort/shader_particle_sort.d.ts.map +1 -1
  629. package/src/shade/renderer/particles/sort/shader_particle_sort.js +60 -9
  630. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts +9 -0
  631. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.d.ts.map +1 -1
  632. package/src/shade/renderer/path_tracer/accumulating/AccumulatingPathTracer.js +26 -0
  633. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts +7 -2
  634. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.d.ts.map +1 -1
  635. package/src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js +12 -1
  636. package/src/shade/renderer/rasterize/expand/shader_filter_triangle_by_material_side.js +1 -1
  637. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts +3 -0
  638. package/src/shade/renderer/rasterize/forward/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +1 -0
  639. package/src/shade/renderer/rasterize/{native/oit → forward}/FORWARD_VERTEX_SHADER_STRUCT.js +4 -4
  640. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts +3 -0
  641. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +1 -0
  642. package/src/shade/renderer/rasterize/forward/SHADING_SCENE_RESOURCE_GROUP.js +17 -0
  643. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.d.ts +1 -1
  644. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_brick4.d.ts.map +1 -0
  645. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_brick4.js +16 -16
  646. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.d.ts +1 -1
  647. package/src/shade/renderer/rasterize/forward/chunk_forward_shade_standard_fragment_ibl.d.ts.map +1 -0
  648. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_forward_shade_standard_fragment_ibl.js +17 -17
  649. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.d.ts +1 -1
  650. package/src/shade/renderer/rasterize/forward/chunk_material_side_should_draw.d.ts.map +1 -0
  651. package/src/shade/renderer/rasterize/{native/oit → forward}/chunk_material_side_should_draw.js +2 -2
  652. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts +3 -0
  653. package/src/shade/renderer/rasterize/forward/vertex_shader_chunk.d.ts.map +1 -0
  654. package/src/shade/renderer/rasterize/{native/oit → forward}/vertex_shader_chunk.js +4 -4
  655. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts +27 -0
  656. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.d.ts.map +1 -0
  657. package/src/shade/renderer/rasterize/native/avboit/AVBOITSettings.js +27 -0
  658. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts +107 -0
  659. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.d.ts.map +1 -0
  660. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_CONSTANTS.js +120 -0
  661. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_LEDGER.md +463 -0
  662. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_PLAN_2026_09_03.md +509 -0
  663. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts +15 -0
  664. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.d.ts.map +1 -0
  665. package/src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js +33 -0
  666. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts +20 -0
  667. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.d.ts.map +1 -0
  668. package/src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js +38 -0
  669. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts +38 -0
  670. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.d.ts.map +1 -0
  671. package/src/shade/renderer/rasterize/native/avboit/avboit_draw_fragment_body.js +130 -0
  672. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts +37 -0
  673. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.d.ts.map +1 -0
  674. package/src/shade/renderer/rasterize/native/avboit/avboit_spec_support.js +73 -0
  675. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts +9 -0
  676. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.d.ts.map +1 -0
  677. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_counts_to_extinction.js +17 -0
  678. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts +11 -0
  679. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.d.ts.map +1 -0
  680. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_dilate_word.js +18 -0
  681. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts +9 -0
  682. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.d.ts.map +1 -0
  683. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_counts.js +17 -0
  684. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts +9 -0
  685. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.d.ts.map +1 -0
  686. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_extinction_to_transmittance.js +17 -0
  687. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts +15 -0
  688. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.d.ts.map +1 -0
  689. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_fold_pairs.js +25 -0
  690. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts +17 -0
  691. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.d.ts.map +1 -0
  692. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_integral_depth_coordinate.js +35 -0
  693. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts +11 -0
  694. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.d.ts.map +1 -0
  695. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_range.js +21 -0
  696. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts +9 -0
  697. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.d.ts.map +1 -0
  698. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_occupancy_word_mask.js +26 -0
  699. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts +11 -0
  700. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.d.ts.map +1 -0
  701. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_overflows.js +22 -0
  702. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts +10 -0
  703. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.d.ts.map +1 -0
  704. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_pack_counts.js +21 -0
  705. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts +10 -0
  706. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.d.ts.map +1 -0
  707. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_sample_transmittance.js +32 -0
  708. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts +20 -0
  709. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.d.ts.map +1 -0
  710. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmission_tint.js +27 -0
  711. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts +10 -0
  712. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.d.ts.map +1 -0
  713. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_transmittance_to_extinction.js +18 -0
  714. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts +9 -0
  715. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.d.ts.map +1 -0
  716. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_unpack_counts.js +21 -0
  717. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts +9 -0
  718. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.d.ts.map +1 -0
  719. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_physical.js +23 -0
  720. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts +13 -0
  721. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.d.ts.map +1 -0
  722. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_view_depth_to_virtual.js +27 -0
  723. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts +22 -0
  724. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.d.ts.map +1 -0
  725. package/src/shade/renderer/rasterize/native/avboit/chunk_avboit_warp.js +38 -0
  726. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts +117 -0
  727. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.d.ts.map +1 -0
  728. package/src/shade/renderer/rasterize/native/avboit/graph_rasterize_meshes_transparent_avboit.js +935 -0
  729. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts +8 -0
  730. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.d.ts.map +1 -0
  731. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_build_warp.js +135 -0
  732. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts +3 -0
  733. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.d.ts.map +1 -0
  734. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_brick4.js +101 -0
  735. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts +3 -0
  736. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.d.ts.map +1 -0
  737. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_draw_ibl.js +96 -0
  738. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts +3 -0
  739. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.d.ts.map +1 -0
  740. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_integrate.js +83 -0
  741. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts +9 -0
  742. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.d.ts.map +1 -0
  743. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_occupancy.js +119 -0
  744. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts +3 -0
  745. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.d.ts.map +1 -0
  746. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_resolve.js +81 -0
  747. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts +15 -0
  748. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.d.ts.map +1 -0
  749. package/src/shade/renderer/rasterize/native/avboit/shader_avboit_splat.js +237 -0
  750. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts +22 -0
  751. package/src/shade/renderer/rasterize/native/material_draw_indirect.d.ts.map +1 -0
  752. package/src/shade/renderer/rasterize/native/material_draw_indirect.js +69 -0
  753. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.d.ts.map +1 -1
  754. package/src/shade/renderer/rasterize/native/oit/graph_rasterize_meshes_transparent_oit.js +665 -722
  755. package/src/shade/renderer/rasterize/native/oit/shader_oit_generate_moments.js +3 -3
  756. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments.js +4 -4
  757. package/src/shade/renderer/rasterize/native/oit/shader_oit_resolve_moments_ibl.js +4 -4
  758. package/src/shade/wgsl/emulator/CPUBitmapData.d.ts +1 -1
  759. package/src/view/DOM.d.ts +69 -0
  760. package/src/view/DOM.d.ts.map +1 -0
  761. package/src/view/DOM.js +2 -1
  762. package/src/view/common/LocalizedLabelView.d.ts +50 -0
  763. package/src/view/common/LocalizedLabelView.d.ts.map +1 -0
  764. package/src/view/controller/controls/GuiControl.d.ts +19 -0
  765. package/src/view/controller/controls/GuiControl.d.ts.map +1 -0
  766. package/src/view/elements/FrameRateView.d.ts +45 -0
  767. package/src/view/elements/FrameRateView.d.ts.map +1 -0
  768. package/src/view/elements/FrameRateView.js +131 -0
  769. package/src/view/elements/SliderView.d.ts +37 -0
  770. package/src/view/elements/SliderView.d.ts.map +1 -0
  771. package/src/view/elements/SliderView.js +71 -0
  772. package/src/view/elements/navigation/ViewStack.d.ts +1 -1
  773. package/src/view/elements/navigation/ViewStack.js +1 -1
  774. package/src/view/elements/notify/NotificationView.d.ts +22 -0
  775. package/src/view/elements/notify/NotificationView.d.ts.map +1 -0
  776. package/src/view/tooltip/TooltipView.d.ts +5 -1
  777. package/src/view/tooltip/TooltipView.d.ts.map +1 -1
  778. package/src/view/tooltip/TooltipView.js +4 -0
  779. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts +0 -3
  780. package/src/shade/renderer/rasterize/native/oit/FORWARD_VERTEX_SHADER_STRUCT.d.ts.map +0 -1
  781. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts +0 -3
  782. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.d.ts.map +0 -1
  783. package/src/shade/renderer/rasterize/native/oit/SHADING_SCENE_RESOURCE_GROUP.js +0 -17
  784. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_brick4.d.ts.map +0 -1
  785. package/src/shade/renderer/rasterize/native/oit/chunk_forward_shade_standard_fragment_ibl.d.ts.map +0 -1
  786. package/src/shade/renderer/rasterize/native/oit/chunk_material_side_should_draw.d.ts.map +0 -1
  787. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts +0 -3
  788. package/src/shade/renderer/rasterize/native/oit/vertex_shader_chunk.d.ts.map +0 -1
@@ -0,0 +1,509 @@
1
+ # Adaptive voxel-based order-independent transparency (AVBOIT) — implementation plan
2
+
3
+ **Status:** implemented, default mode, device tier in progress — revision 4
4
+ **Date:** 2026-09-03
5
+ **Author:** Alex Goldring / Company Named Limited, with Claude
6
+ **Scope:** `src/shade/renderer/rasterize/native/avboit/` (new), `src/shade/renderer/ShadeTransparencyMode.js`
7
+ (new), `src/shade/renderer/Renderer.js` (one field, one call site),
8
+ `src/shade/renderer/rasterize/bucket/prepare_meshlet_draw_commands_by_material.js` (two extra return values)
9
+ **Source:** Drobot, M. — *Adaptive Voxel-Based Order Independent Transparency*, Advances in Real-Time Rendering in
10
+ Games, SIGGRAPH 2025 (talk deck, 60 pages, `AVBOIT_SIG2025_MDROBOT-final.pdf`)
11
+ **Ledger:** [`AVBOIT_LEDGER.md`](./AVBOIT_LEDGER.md) — what actually landed, step by step, and what each step found
12
+
13
+ > **Revision 2** (ledger entries 12 and 14) amends §3.5, §4 and §7 on the transmission tint. Revision 1
14
+ > derived a per-channel transmittance from the base colour unconditionally, and called that the OpenPBR
15
+ > default; it is glTF's reading, OpenPBR's transmission colour defaults to white, and the engine's other
16
+ > paths transmit untinted. The first real renders showed a red pane under AVBOIT and clear glass under
17
+ > MBOIT and the path tracer, which a mode switch the contract calls safe to flip must not do. The tint is
18
+ > kept and off by default, switched at runtime through `Renderer.avboit`.
19
+ >
20
+ > **Revision 3** (ledger entry 15): AVBOIT is the default (§0, §3.10); the slice floor is set by
21
+ > `AVBOIT_VIRTUAL_SLICES_MAX = 4096` (§3.2, §9); the draw discards fragments the volume calls extinct before
22
+ > shading them (§3.8); §6's software-device tier is a recorder, not an end-to-end runner, and the plan no
23
+ > longer expects a full-orchestrator spec from it; §7's phase-2 list is decided item by item.
24
+ >
25
+ > **Revision 4** (ledger entry 18) is the review against the engine. The depth curve is the engine's own log
26
+ > slicing (§3.2) rather than a second one; the bit fold reuses the Morton decode; the integral samples through
27
+ > the sampler the draw already binds; the per-material draw loop is one shared module for both pipelines; and
28
+ > the chunks follow the one-function-per-file convention (§5).
29
+
30
+ ---
31
+
32
+ ## 0. The one thing this document is about
33
+
34
+ A second transparency pipeline, selected by `Renderer.transparency_mode`, that sits next to the existing
35
+ moment-based one and shares everything up to the draw commands. It replaces the *transmittance function*
36
+ (four power moments per pixel) with a *voxelized extinction volume* at reduced resolution, integrated along
37
+ view rays into a 3D transmittance lookup, with the depth axis adaptively packed so that the 128 physical slices
38
+ land where transparent geometry actually is.
39
+
40
+ Everything else — material filtering, meshlet expansion, HZB culling, indirect draw commands, forward shading,
41
+ volumetric compositing, the final composite onto the scene colour — is the same as MBOIT, and is reused rather
42
+ than copied where the existing code allows it.
43
+
44
+ What this document is **not**: a survey of OIT techniques (the deck has one, slides 10–20). *Revision 3:*
45
+ AVBOIT is the default, on the strength of the first real renders (ledger entries 12 and 15): it held the
46
+ stacked-card case the way the reference did and MBOIT did not. MBOIT stays selectable.
47
+
48
+ ---
49
+
50
+ ## 1. What is there now
51
+
52
+ `src/shade/renderer/rasterize/native/oit/` is MBOIT, wired at a single call site
53
+ ([`Renderer.js:2222-2249`](../../../Renderer.js)), guarded by the private `#feature_enabled_transparencies`.
54
+ Its orchestrator [`graph_rasterize_meshes_transparent_oit.js`](../oit/graph_rasterize_meshes_transparent_oit.js)
55
+ records, per frame:
56
+
57
+ 1. `filter_materials_by_bucket` twice — `(Transparent, Triangles, Front)` and `(…, Double)`;
58
+ `ShadeDrawSide.Back` transparent materials are dropped ([`:545-561`](../oit/graph_rasterize_meshes_transparent_oit.js)).
59
+ 2. `graph_prepare_meshlet_draw_commands_by_material` twice — copy bucket, HZB mesh filter, expand to meshlets,
60
+ HZB meshlet filter, count/scan/sort by material, build one indirect draw command per material.
61
+ 3. `MBOIT/generate moments` twice (front clears, double loads) — additive MRT into `r32float` + `rgba32float`,
62
+ which is what puts `float32-blendable` on the device floor
63
+ ([`Renderer.js:1160`](../../../Renderer.js), [`RENDERER_CONTRACT.md` §2](../../../../RENDERER_CONTRACT.md)).
64
+ 4. `MBOIT/resolve moments` twice — full forward shading, moments reconstruct transmittance, premultiplied
65
+ colour × transmittance added into an `rgba16float` accumulator.
66
+ 5. `shader_oit_blend` — one image pass onto the scene colour with `one / src-alpha` blending.
67
+
68
+ Per-fragment inputs, depth conventions and the material coupling for transmission are described in the two
69
+ shaders this plan mirrors: [`shader_oit_generate_moments.js`](../oit/shader_oit_generate_moments.js) (coverage,
70
+ Fresnel for `transmission_factor > 0`, `OIT_COVERAGE_MAX`) and
71
+ [`shader_oit_resolve_moments_ibl.js`](../oit/shader_oit_resolve_moments_ibl.js) (shading, volumetrics with
72
+ `get_view_space_depth`, the additive output).
73
+
74
+ Mode switches in `Renderer` follow one shape — an enum file next to `ShadeIndirectLightingMode.js`, a public
75
+ field, a ternary at the call site — and the cleanest instance is `dof_algorithm`
76
+ ([`Renderer.js:2321-2336`](../../../Renderer.js)).
77
+
78
+ ---
79
+
80
+ ## 2. The algorithm, as the deck presents it
81
+
82
+ The talk's own summary of VBOIT (slide 48) and what the adaptive extension adds (slides 93–97):
83
+
84
+ **VBOIT.**
85
+ 1. Fit a log depth curve over the slices.
86
+ 2. Clear a volumetric extinction buffer at reduced resolution (1/8 of the frame in XY).
87
+ 3. Splat every transparent fragment into it — extinction `-log(1 - α)` in a normalized 8-bit fixed point, added
88
+ with atomics, packed several fields per `u32`. *Linear* splatting (split by slice fraction between two
89
+ adjacent slices) removes the aliasing that point splatting shows.
90
+ 4. Integrate extinction along each view ray into a 3D transmittance-integral texture. Stop a ray when it
91
+ saturates, or when the splat detected an overflow (the first overflowing slice is kept with an atomic min).
92
+ 5. Draw transparencies in any order at full resolution: look the integral up at the fragment's depth, with a
93
+ two-slice bias toward the camera so a surface does not occlude itself; weight the fragment by that
94
+ transmittance; accumulate weighted colour, weighted α (the normalization denominator) and total extinction.
95
+ 6. Resolve: `background × exp(-Σ extinction) + Σ(colour × w) / Σ(α × w) × (1 - exp(-Σ extinction))`.
96
+
97
+ **Adaptive.** Before splatting, voxelize the *bounds* of transparent geometry into a 1-bit-per-slice
98
+ occupancy at a high *virtual* slice resolution. If more slices are occupied than there are physical slices,
99
+ halve the virtual resolution and repeat. A prefix sum over the occupied slices gives a 1D depth-warp LUT that
100
+ maps virtual depth to a physical slice, skipping empty depth ranges; the LUT is sampled at splat and at draw.
101
+ The result is a depth axis whose precision goes where the geometry is, at no per-sample cost.
102
+
103
+ **Colour.** RGB extinction is kept in a second buffer (10|10|10 packed), and the talk's measured cost of RGB
104
+ over monochrome is ~1.1× — practical, where MBOIT/WBOIT have no clean split.
105
+
106
+ Known limits (slides 86–92): two events in the same slice degenerate to weighted blending, and the two-slice
107
+ sample bias means events closer than that do not occlude each other. Slice separation is the whole game, which
108
+ is what the adaptive packing buys.
109
+
110
+ ---
111
+
112
+ ## 3. Design for meep
113
+
114
+ ### 3.1 Frame-graph passes
115
+
116
+ All recorded under `graph.push_scope("transparencies")` by the new orchestrator
117
+ `graph_rasterize_meshes_transparent_avboit(...)`, taking the same argument object as the MBOIT one and
118
+ returning the resource ID of the composited colour.
119
+
120
+ | # | Pass | Kind | Reads | Writes |
121
+ |---|------|------|-------|--------|
122
+ | 1 | draw-command prep × 2 (shared) | compute | buckets, HZB, camera | meshlets, draw commands, *meshlet collection*, *iterator command* |
123
+ | 2 | `AVBOIT/occupancy` × 2 | compute, indirect | meshlet collection, meshlet metadata, scene database, camera | `occupancy` bits |
124
+ | 3 | `AVBOIT/build warp` | compute, 1 workgroup | occupancy, camera | `warp` LUT + header |
125
+ | 4 | `AVBOIT/splat` × 2 | render, 1/8 res | draw commands, meshlets, warp | `extinction` (atomics), `overflow` (atomics) |
126
+ | 5 | `AVBOIT/integrate` | compute, per voxel column | extinction, overflow, warp | `integral` 3D texture |
127
+ | 6 | `AVBOIT/draw` × 2 | render, internal res | draw commands, meshlets, depth, warp, integral, lights, volumetrics | `accum_color`, `accum_norm`, `accum_ext` |
128
+ | 7 | `AVBOIT/resolve` | image | scene colour, the three accumulators | composited colour (new transient) |
129
+
130
+ Step 1 is `graph_prepare_meshlet_draw_commands_by_material`, extended to also return the HZB-filtered meshlet
131
+ collection (the one with a `count` header) and the indirect dispatch command it already builds over it. The
132
+ sorted meshlet buffer the draw uses is a bare `array<MeshletDefinition>` with no count
133
+ ([`shader_sort_meshlets_by_material.js:20`](../../bucket/shader_sort_meshlets_by_material.js)), so the
134
+ occupancy pass cannot iterate it on its own; the collection before sorting can. The two extra return values are
135
+ additive and MBOIT ignores them.
136
+
137
+ The front and double-sided variants of steps 4 and 6 exist for the same reason as in MBOIT: different
138
+ `cullMode`, so a different pipeline, threaded through `rp_rewrite_for_primitive_state`.
139
+
140
+ ### 3.2 Depth curve and virtual slices
141
+
142
+ Let `z` be the fragment's view-space depth (`get_view_space_depth`, positive, world units). *Revision 4:* the
143
+ curve is the engine's log depth slicing — `cluster_depth_to_z_slice`, the same function the light clusters
144
+ and the froxels use — with parameters from `build_light_cluster_parameters` built once per frame by
145
+ `avboit_build_depth_curve`:
146
+
147
+ ```
148
+ slice(z) = log2(z · B + O) · scale clamped to [0, V_max]
149
+ ```
150
+
151
+ `build_light_cluster_parameters` takes a near offset and a `scale`; `scale` is the linearization the deck
152
+ describes (larger flattens the curve toward linear), and AVBOIT chooses it so that `O` is zero — pure log
153
+ from `near + AVBOIT_DEPTH_CURVE_NEAR_OFFSET` — because the adaptive warp makes near-plane precision free.
154
+ The parameters are built for `V_max`; the coordinate at the active resolution `V` is `slice × V / V_max`.
155
+ Revisions 1–3 carried a curve of their own with the same shape and a `z0` knob; it was a reinvention.
156
+
157
+ `V` starts at `AVBOIT_VIRTUAL_SLICES_MAX = 4096` (128 words of occupancy bits; 1024 until revision 3) and
158
+ halves until the occupied count fits `AVBOIT_PHYSICAL_SLICES = 128`. Halving keeps the curve fixed and doubles slice thickness, so the
159
+ occupancy at the coarser level is exactly the OR of adjacent pairs — no re-voxelization, which is what the deck
160
+ notes too ("coverage data doesn't need to be regenerated"). The loop terminates at `V = P` in the worst case
161
+ (three halvings from 1024).
162
+
163
+ ### 3.3 Occupancy prepass
164
+
165
+ One thread per surviving meshlet (indirect over the filtered collection's count). The world AABB is projected
166
+ with `aabb3_project(bounds, node.global)` exactly as the HZB filter does
167
+ ([`shader_hzb_meshlet_filter_1way.js`](../../cull/hzb/shader_hzb_meshlet_filter_1way.js)), then again with
168
+ `camera.view_matrix`; the view-space depth range is `[-max.z, -min.z]` (the camera looks down −Z; see
169
+ `chunk_volumetrics_sun_optical_depth.js:123`). Entirely in front of `near` → skip. Otherwise clamp to
170
+ `[near, far]`, map both ends through `t()`, dilate by one virtual slice each side, and `atomicOr` the bits of
171
+ that range into `occupancy: array<atomic<u32>, 32>`.
172
+
173
+ Only the Z axis is voxelized. The deck also keeps XY tile occupancy to skip empty tiles in clear and
174
+ integration; that is an optimization on passes that cost ~0.25 ms at our resolution and is out of scope (§7).
175
+
176
+ ### 3.4 Warp LUT build
177
+
178
+ A single-invocation compute shader (`@workgroup_size(1)`) — the work is a few thousand bit operations, and a
179
+ single lane keeps the whole thing runnable in the WGSL emulator, whose barriers are no-ops and which has no
180
+ workgroup-cooperative dispatch. This is not a fallback for a subgroup path; a 1 K-entry prefix sum is not a
181
+ workload.
182
+
183
+ Per level, in order: dilate the occupancy by one slice each side *at this level* (a fragment on the edge of a
184
+ meshlet's bounds linear-splats half its extinction one slice out, and that slice has to belong to the same run
185
+ — dilating only at the finest level can shrink to nothing after halving), count, and either accept or halve the
186
+ undilated bits and repeat.
187
+
188
+ Output, `AVBOIT_WARP_STRUCT`:
189
+
190
+ ```
191
+ virtual_count u32 V
192
+ occupied_count u32 physical slices in use, ≤ P
193
+ physical_count u32 P
194
+ voxel_width, voxel_height u32 extinction resolution
195
+ depth_near, depth_far, depth_z0 f32 the curve, copied so every consumer reads one place
196
+ lut array<u32, V_max + 1> lut[v] = (prefix(v) << 1) | occupied(v); lut[V] = occupied_count << 1
197
+ ```
198
+
199
+ The warp itself is a continuous, monotonic, piecewise-linear map from virtual to physical depth:
200
+
201
+ ```
202
+ φ(v_f) = prefix(v) + occupied(v) × frac(v_f), v = min(floor(v_f), V - 1)
203
+ ```
204
+
205
+ Slope 1 inside an occupied run, flat across a gap. Flat is the property that makes the deck's "filterable"
206
+ begin/end flags unnecessary here: a sample that falls in a gap lands exactly on the boundary between the two
207
+ runs, and with the integral stored at slice *boundaries* (§3.6) that reads the previous run's full total and
208
+ none of the next run's — which is the right answer for empty space.
209
+
210
+ ### 3.5 Splat
211
+
212
+ A render pass at `ceil(internal / AVBOIT_VOXEL_DOWNSCALE)` with the shared `vertex_shader_chunk`, no depth
213
+ attachment, and a `r8unorm` transient colour attachment with `writeMask: 0` because WebGPU wants at least one
214
+ attachment and the fragment shader has no outputs. No depth test against the opaque scene is needed: a splat
215
+ behind an opaque surface lies at greater depth than any visible transparent fragment, and the integral at a
216
+ depth only contains slices in front of it.
217
+
218
+ The fragment computes `opacity` exactly as the MBOIT generate pass does (alpha, or Fresnel when
219
+ `transmission_factor > 0`), then, new to this path, an RGB self-transmittance:
220
+
221
+ ```
222
+ coverage = min(opacity, OIT_COVERAGE_MAX)
223
+ tint = mix(vec3(1), base_colour, transmission_factor) // clamped ≥ 1e-3
224
+ T_self = (1 - coverage) × tint
225
+ e = saturate(-log(T_self) / AVBOIT_EXTINCTION_MAX) // AVBOIT_EXTINCTION_MAX = ln 256
226
+ ```
227
+
228
+ so a plain alpha-blended material behaves exactly as under MBOIT (`tint = 1`) and a transmissive one filters
229
+ the background per channel, which the scalar moment path cannot do and the deck lists as the reason RGB OIT is
230
+ worth having.
231
+
232
+ *Revision 2:* the tint weight is `transmission_factor × tint_from_base_color`, where the flag comes from
233
+ `Renderer.avboit.transmission_tint_from_base_color` through the warp header, and is **off by default**. Base
234
+ colour as transmission colour is glTF's semantics; the engine's material has no transmission colour, and its
235
+ forward shader and path tracer transmit untinted, so the default keeps every mode agreeing on what an asset
236
+ means. The RGB plumbing stays and costs nothing while it waits for a real transmission colour.
237
+
238
+ Depth: `p_f = φ(t(z) × V)`; linear splat with `c = p_f - 0.5`, `(1 - frac c)` into `floor(c)` and `frac c`
239
+ into the next slice, each clamped to `[0, P - 1]`. Each slice gets one `atomicAdd` of the three 8-bit counts
240
+ packed 10|10|10 into a `u32` (§3.7). The returned previous value is checked per channel; a field that crosses
241
+ 255 records the slice in `overflow` — three `array<atomic<u32>>` planes, one per channel, holding
242
+ `P - slice` under `atomicMax` so that the buffer's zero-clear reads as "no overflow" and no fill pass is needed.
243
+
244
+ ### 3.6 Integration
245
+
246
+ One thread per voxel column. Walks `s = 0 … P - 1`, keeps a running RGB extinction, and stores it into
247
+ `integral[x, y, s]` *before* adding slice `s` — an exclusive prefix, so texel `s` holds the integral at the
248
+ near boundary of slice `s`, and the texture has `P + 1` depth texels with `integral[P]` holding the total. Per
249
+ channel, once `s` reaches that channel's first overflow slice the running value is pinned at 1.0. Values are
250
+ saturated at 1.0 throughout.
251
+
252
+ Format: `rgba8unorm`, 3D, `STORAGE_BINDING | TEXTURE_BINDING`, sampled trilinearly. Eight bits is what the deck
253
+ ships and what the splat already quantizes to; `rgba16float` is a one-constant change if a smoke gradient shows
254
+ banding, at twice the memory (§9).
255
+
256
+ Layout of `extinction`: column-major with slice fastest, `index = (y × W + x) × P + s`, so the integration
257
+ reads 512 contiguous bytes per column.
258
+
259
+ ### 3.7 Packing and precision
260
+
261
+ Three 8-bit values in 10-bit fields, as the deck does: two guard bits per field so that four saturating events
262
+ in one slice can pile up before a carry corrupts the low bits of the neighbouring channel, and overflow is
263
+ flagged the first time a field's sum exceeds 255 — past which the ray is extinct anyway. A carry out of the top
264
+ field lands in the two unused bits.
265
+
266
+ `AVBOIT_EXTINCTION_MAX = ln 256`: the fixed-point unit is `ln 256 / 255 ≈ 0.0217` of extinction, so the
267
+ finest non-zero occlusion a single event can register is ~2.2 % and full saturation is `T = 1/256`. The
268
+ resolve does *not* depend on this quantization for the surfaces' own alpha — the accumulators are float and
269
+ carry the exact `-log(1 - α)` — only the relative ordering weights do.
270
+
271
+ ### 3.8 Draw
272
+
273
+ A copy of the MBOIT resolve shader's shape — same vertex chunk, same material/scene/light groups, same forward
274
+ shading and inline volumetric composite — with the moment lookup replaced by
275
+
276
+ ```
277
+ v_s = max(t(z) × V - AVBOIT_SAMPLE_BIAS_SLICES, 0) // bias in virtual slices, see below
278
+ w = (φ(v_s) + 0.5) / (P + 1)
279
+ E = textureSampleLevel(integral, linear, vec3(uv, w), 0).rgb
280
+ T = exp(-E × AVBOIT_EXTINCTION_MAX)
281
+ ```
282
+
283
+ and, before any of the shading, a discard when `T ≤ 1/256` in every channel — the volume already calls the
284
+ fragment extinct, so its shading would be multiplied away; what its own extinction would have added to the
285
+ total is bounded by that same `1/256` (revision 3, `AVBOIT_EXTINCT_TRANSMITTANCE`). Then three additive
286
+ `rgba16float` targets:
287
+
288
+ ```
289
+ accum_color += colour × coverage × T (premultiplied, as MBOIT)
290
+ accum_norm += (1 - T_self) × T per channel
291
+ accum_ext += -log(T_self) per channel
292
+ ```
293
+
294
+ The bias is applied in *virtual* space before the warp, not in physical space after it: inside a run the two
295
+ are identical, and at the start of a run the virtual bias walks into the gap, where φ is flat and the sample
296
+ reads the previous run's total — instead of reading two slices into a run that may be arbitrarily far away.
297
+ With the splat and storage conventions above the analytic minimum that avoids any self-occlusion is 1.5 slices;
298
+ `AVBOIT_SAMPLE_BIAS_SLICES = 2.0` follows the deck and leaves half a slice of margin.
299
+
300
+ IBL and Brick4 variants are two files, as for MBOIT, sharing the fragment body text; the Brick4 one carries
301
+ the extra `brick4` storage buffer in the view group.
302
+
303
+ ### 3.9 Resolve
304
+
305
+ RGB total transmittance cannot go through fixed-function blending without dual-source blending, so the resolve
306
+ reads the scene colour as an input and writes a fresh `rgba16float` transient (the MBOIT blend shader's own
307
+ `TODO` says as much). Per channel:
308
+
309
+ ```
310
+ T_total = exp(-accum_ext)
311
+ norm = accum_norm > 1e-4 ? (1 - T_total) / accum_norm : 0
312
+ out = scene × T_total + accum_color × norm
313
+ ```
314
+
315
+ with the same NaN backstop as MBOIT, falling back to the scene colour.
316
+
317
+ ### 3.10 The switch
318
+
319
+ `src/shade/renderer/ShadeTransparencyMode.js`:
320
+
321
+ ```js
322
+ export const ShadeTransparencyMode = { MBOIT: 0, AVBOIT: 1 };
323
+ ```
324
+
325
+ `Renderer.transparency_mode = ShadeTransparencyMode.MBOIT` (public field, documented), and at the call site a
326
+ ternary between the two orchestrators, which take the same argument object. Nothing else in `Renderer` changes.
327
+
328
+ ### 3.11 Device requirements
329
+
330
+ AVBOIT blends only `rgba16float`, so it does not need `float32-blendable`; the atomics it uses on storage
331
+ buffers from the fragment stage are core WebGPU. The engine keeps requiring `float32-blendable` while MBOIT is
332
+ the default; the contract gets a sentence saying which mode needs it. The subgroup-using CSDLDF scan in the
333
+ draw-command prep is shared with MBOIT and unchanged.
334
+
335
+ One layout detail with no precedent in the tree: no render pipeline here writes a storage buffer from the
336
+ fragment stage yet, and `ShaderResourceSetDescriptor.generatePipelineLayout(stage)` gives every group the same
337
+ visibility. WebGPU refuses a `storage` buffer binding visible to the vertex stage, so the splat pipeline builds
338
+ its layout group by group — material, scene and view at `VERTEX | FRAGMENT`, the atomics group at `FRAGMENT`.
339
+
340
+ ---
341
+
342
+ ## 4. Decisions and the alternatives they beat
343
+
344
+ | Decision | Alternative | Why not |
345
+ |----------|-------------|---------|
346
+ | RGB 10\|10\|10 extinction from the start | Scalar 8\|8\|8\|8 (four slices per word, 4× less memory) | The deck's whole argument for the voxel path is that RGB becomes affordable, and a transmission colour on the material is the obvious next step; the scalar buffer is a memory optimization for VFX-heavy content, listed in §7. *Revision 2:* the per-channel tint is opt-in (§3.5) — the material model does not carry a transmission colour, so deriving one from the base colour by default made one asset mean two things across the mode switch. |
347
+ | Packed 8-bit counts with overflow-min | One `u32` per channel per slice (no carry, no overflow logic) | 3× memory (200 MB at 4 K) and three atomics per splat; the deck measured packed at the same speed as monochrome. |
348
+ | Storage buffer for the extinction volume | 3D storage texture | WebGPU has no atomic image operations. |
349
+ | Integral as exclusive prefix at slice boundaries, `P + 1` texels | Inclusive prefix at slice centres | Makes a gap sample land exactly on a run boundary and read the right total; costs one extra depth texel. |
350
+ | Sample bias in virtual space before the warp | Bias in physical space after it | Across a gap the physical bias reaches into a different depth region; the virtual one stops at the flat boundary. |
351
+ | Warp LUT built by one invocation | Workgroup prefix sum with subgroup ops | 1 K entries; a single lane is microseconds and the emulator can run it. Not a fallback path. |
352
+ | Occupancy from meshlet AABBs | Conservative software voxelization of quads and boxes (the deck) | The engine already has HZB-filtered meshlet bounds on the GPU; a meshlet is a tighter primitive than a mesh box. |
353
+ | *Revision 4:* the engine's depth slicing, Morton decode, linear-clamp sampler and a shared draw loop | The pipeline's own curve, bit fold, sampler descriptor and a copy of the MBOIT draw loop | Reinventions, found in review. The one thing kept apart from the engine on purpose is the shared draw-fragment body text (`avboit_draw_fragment_body.js`): MBOIT duplicates its resolve body across the IBL and Brick4 files, and two 45-line bodies drifting apart is the worse failure. |
354
+ | No depth test in the splat pass | Low-res depth from the HZB | Correctness does not need it (§3.5); it is a splat-throughput optimization to measure first. |
355
+ | Resolve writes a new transient | Two in-place blend passes (multiply, then add) | One shader, one pass; the transient is aliased by the graph. |
356
+ | `rgba8unorm` integral | `rgba16float` | Matches the deck and the splat quantization; the swap is one constant if banding shows. |
357
+ | MBOIT stays the default | Flip to AVBOIT | The contract promises no lesser frame; the new path has not been seen on real content yet. |
358
+
359
+ Rejected outright: the deck's chroma-skew approximation for memory-constrained platforms (slides 132–135) —
360
+ it exists because that content could not afford the RGB buffer, and we can.
361
+
362
+ ---
363
+
364
+ ## 5. Files
365
+
366
+ ```
367
+ src/shade/renderer/ShadeTransparencyMode.js
368
+ src/shade/renderer/rasterize/native/material_draw_indirect.js the per-material indirect draw loop, shared with MBOIT
369
+ src/shade/renderer/rasterize/native/avboit/
370
+ AVBOIT_PLAN_2026_09_03.md this document
371
+ AVBOIT_LEDGER.md the step ledger
372
+ AVBOIT_CONSTANTS.js P, V_max, downscale, curve offset, extinction max, bias, early-out
373
+ AVBOITSettings.js Renderer.avboit
374
+ AVBOIT_WARP_STRUCT.js header + LUT storage layout
375
+ avboit_build_depth_curve.js cluster parameters for the finest resolution (JS)
376
+ chunk_avboit_pack_counts.js 10|10|10 pack
377
+ chunk_avboit_unpack_counts.js … and unpack
378
+ chunk_avboit_transmittance_to_extinction.js
379
+ chunk_avboit_extinction_to_transmittance.js
380
+ chunk_avboit_extinction_to_counts.js
381
+ chunk_avboit_counts_to_extinction.js
382
+ chunk_avboit_overflows.js the per-channel overflow predicate
383
+ chunk_avboit_occupancy_range.js slice interval → dilated slice range
384
+ chunk_avboit_occupancy_word_mask.js bits of one word inside a range
385
+ chunk_avboit_dilate_word.js one-slice dilation across words
386
+ chunk_avboit_fold_pairs.js halve a word's resolution (via decode32_morton2)
387
+ chunk_avboit_warp.js φ(v_f) over the LUT
388
+ chunk_avboit_view_depth_to_virtual.js the curve, scaled to the active resolution
389
+ chunk_avboit_view_depth_to_physical.js curve then warp
390
+ chunk_avboit_integral_depth_coordinate.js bias, warp, boundary-centred texel coordinate
391
+ chunk_avboit_sample_transmittance.js trilinear sample and exp
392
+ chunk_avboit_transmission_tint.js base colour × weight
393
+ shader_avboit_occupancy.js compute, per meshlet
394
+ shader_avboit_build_warp.js compute, one invocation
395
+ shader_avboit_splat.js render pass, 1/8 resolution, atomics
396
+ shader_avboit_integrate.js compute, per column
397
+ avboit_draw_fragment_body.js shared WGSL text of the draw fragment
398
+ shader_avboit_draw_ibl.js render pass, IBL indirect
399
+ shader_avboit_draw_brick4.js render pass, Brick4 indirect
400
+ shader_avboit_resolve.js image shader
401
+ graph_rasterize_meshes_transparent_avboit.js
402
+ avboit_spec_support.js test-only helpers
403
+ *.spec.js one per chunk and shader, see §6
404
+ src/shade/playground/avboit/ A/B page, see §6 tier 4
405
+ ```
406
+
407
+ Naming follows the directory's conventions: `chunk_*` for a `CodeChunk` holding exactly the one function the
408
+ file is named after (650 of the engine's ~700 chunk files do; revision 4 brought these in line), `shader_*`
409
+ for a complete pipeline, `graph_*` for a recorder, `SCREAMING_SNAKE` for structs and constants, specs beside
410
+ their subject.
411
+
412
+ ---
413
+
414
+ ## 6. Verification
415
+
416
+ The four tiers from [`gpu-testing-tiers`], each pinning what the one below cannot see:
417
+
418
+ 1. **WGSL validity** — `avboit_shaders_wgsl_validity.spec.js`, `test.each` over every assembled module
419
+ (vertex + fragment of splat and the two draws, the four compute shaders, the resolve image shader), zero
420
+ diagnostics. Catches missing chunk dependencies and reserved words; proves nothing about types.
421
+ 2. **Emulator** — numeric behaviour of the pure parts:
422
+ - `chunk_avboit_depth_curve.spec.js`: `t(near) = 0`, `t(far) = 1`, monotonic, `z(t(z)) = z`.
423
+ - `chunk_avboit_pack.spec.js`: pack/unpack round trip, the overflow predicate, extinction ↔ transmittance.
424
+ - `shader_avboit_build_warp.spec.js`: sparse occupancy keeps `V_max`; dense occupancy halves until it fits;
425
+ the LUT is a prefix sum with the dilation applied; `φ` is monotone, slope 1 on runs, flat on gaps.
426
+ - `shader_avboit_integrate.spec.js`: one column with events at known slices → exclusive prefix, saturation,
427
+ per-channel overflow pinning; written through `textureStore` into a 3D `CPUBitmapData`.
428
+ - `chunk_avboit_sample_transmittance.spec.js`: sampling in a gap returns the previous run's total; the bias
429
+ removes self-occlusion for an event splatted at the same depth.
430
+ 3. **SoftwareGPUDevice** — `graph_rasterize_meshes_transparent_avboit.spec.js`: the warp build's dispatch and
431
+ buffer, the integration's dispatch and its `P + 1`-deep storage-and-sampled texture, the resolve's single
432
+ full-screen draw into a fresh target, the splat pipeline's atomics group visible to the fragment stage
433
+ only, and a source-level pin of the `Renderer` switch. *Revision 3:* the software device records and
434
+ validates; it is not an end-to-end runner and never was meant as one, so a spec of the whole orchestrator
435
+ over a scene is not a goal of this plan. The composition is proven on a device.
436
+ 4. **Real compile and eyes** — every module through `createShaderModule` on a real device (the validator has no
437
+ type checker, [`wgsl-real-compile-via-browser-pane`]), then a playground page with layered transparent quads
438
+ at controlled depth separations, a tinted glass pane, and the MBOIT/AVBOIT switch — the deck's own test
439
+ harness in miniature. Bounded per [`bounded-user-verification`]: one scripted session, findings into the
440
+ ledger.
441
+
442
+ ---
443
+
444
+ ## 7. Out of scope (deliberately, with the reason)
445
+
446
+ *Revision 3* decides the optimizations one by one, against the rule that a phase-2 item has to be clean and
447
+ unambiguous, must not break anything else, and must not be situational:
448
+
449
+ - **Per-fragment extinct early-out** — *done* (§3.8). No new resource, no pass, a bounded error below the
450
+ volume's own precision, and it removes the whole forward shading cost of every fragment behind something
451
+ opaque-in-the-volume.
452
+ - **XY tile occupancy** to skip empty tiles in clear and integration — *no*. The passes it would trim are
453
+ sub-millisecond at 1/8 resolution and the clear is one `clearBuffer`; the prepass would gain a second
454
+ output and the integration a second input for a saving that would not register.
455
+ - **Zero-transmittance depth cull** (slides 77–85) — *not now*. It is the deck's largest measured win on
456
+ VFX-heavy scenes, and it is exactly the situational kind: nothing on a scene without dense overdraw, a
457
+ depth copy because post-process reads the scene depth after transparency, and a new pass that writes depth.
458
+ Worth a plan of its own when there is a scene that needs it and a profile that shows the draw cost.
459
+ - **Monochrome extinction buffer** beside the RGB one — *no*. Two representations of the same volume and a
460
+ merge in the integration, for content that is mostly scalar VFX; this engine's transparent content is not
461
+ known to be that.
462
+ - **Sparse voxel texture** (slide 122) — *no*. The deck's own future work.
463
+ - **Chroma skew** (§4).
464
+ - **`ShadeDrawSide.Back` transparent materials** — dropped today by MBOIT; the same filter is used here so the
465
+ two modes draw the same set. Fixing it is a bucket-filter change that belongs to both.
466
+ - **Exposing the tunables on `Renderer`** — the constants in `AVBOIT_CONSTANTS.js` are the knobs; whether any
467
+ deserves a public field is a question for after the page in §6 has been looked at. *Revision 2:* one did —
468
+ the transmission tint, because it changes a material's meaning rather than a quality/cost trade; it lives
469
+ on `Renderer.avboit` (`AVBOITSettings`).
470
+
471
+ ---
472
+
473
+ ## 8. Staging
474
+
475
+ Each step lands with its tests green before the next starts; the ledger records what each found.
476
+
477
+ 1. **Skeleton and switch** — enum, `Renderer.transparency_mode`, an orchestrator that records only the shared
478
+ prep and the resolve (identity), the prep helper's two extra return values. Proves the wiring compiles and
479
+ the default frame is byte-identical.
480
+ 2. **Depth curve, warp, pack chunks** with their emulator specs.
481
+ 3. **Occupancy + warp build** shaders, the warp struct, emulator spec for the build.
482
+ 4. **Splat** shader and the per-group pipeline layout; validity spec.
483
+ 5. **Integrate** shader with its emulator spec; the 3D integral texture in the graph.
484
+ 6. **Draw** (IBL and Brick4) and the sample chunk with its spec; the three accumulators.
485
+ 7. **Resolve** image shader; the orchestrator complete; SoftwareGPUDevice spec.
486
+ 8. **Real compile** of every module on a device; fix what the type checker finds.
487
+ 9. **Playground** A/B page; look; record.
488
+ 10. **Docs** — contract, changelog, ledger closed out.
489
+
490
+ ---
491
+
492
+ ## 9. Risks and open questions
493
+
494
+ - **Sub-pixel geometry at 1/8 resolution** never reaches the extinction volume, so it does not occlude anything
495
+ behind it (it still draws). The deck accepts this for VFX; thin glass edges may show it. The downscale is a
496
+ constant.
497
+ - **Meshlet bounds as occupancy** are conservative in depth only as far as the bounds are right; skinned meshes
498
+ with stale bounds would splat outside their run and clamp to its edge. Watch for it on the page.
499
+ - **8-bit integral** — banding in long smooth gradients; the swap to `rgba16float` is one constant.
500
+ - **Contention** — every fragment of a large sprite covering the same low-res texel hits the same `u32`; the
501
+ deck's numbers say this is fine on console, and a WebGPU number is what the page is for.
502
+ - **The bias** — 2.0 virtual slices is the deck's figure; 1.5 is the analytic minimum here. Lower means closer
503
+ events occlude each other; the page's layered quads are the test. *Revision 3:* kept at 2.0. The margin over
504
+ the minimum is what covers the depth difference between a splat fragment (one 1/8-resolution pixel centre)
505
+ and a draw fragment (a full-resolution pixel centre) on a sloped surface, and the slice floor was raised by
506
+ `AVBOIT_VIRTUAL_SLICES_MAX` instead (§3.2).
507
+ - **Sloped surfaces** — a splat fragment carries the depth of its low-resolution pixel centre; on a surface at
508
+ a grazing angle that can differ from the full-resolution fragment's depth by more than the bias. Self-occlusion
509
+ along the slope would be the symptom; the page's copyable camera state is what makes that reproducible.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The depth-warp LUT and everything a consumer needs to use it, written once per frame by
3
+ * `shader_avboit_build_warp` and read by the splat, integrate and draw passes.
4
+ *
5
+ * `lut[v] = (prefix(v) << 1) | occupied(v)` for `v` in `[0, virtual_count]`, where `prefix(v)` counts
6
+ * the occupied virtual slices before `v`. `lut[virtual_count]` carries the total with the occupied bit
7
+ * clear. Entries past `virtual_count` are not written and must not be read; `chunk_avboit_warp` clamps.
8
+ *
9
+ * The header repeats the curve parameters, the voxel resolution and the renderer's switches so that a
10
+ * fragment shader reads one buffer rather than a uniform it would otherwise need a bind group of its
11
+ * own for.
12
+ */
13
+ export const AVBOIT_WARP_STRUCT: WebGPUStruct;
14
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
15
+ //# sourceMappingURL=AVBOIT_WARP_STRUCT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AVBOIT_WARP_STRUCT.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/AVBOIT_WARP_STRUCT.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,8CAewB;6BA9BK,sCAAsC"}
@@ -0,0 +1,33 @@
1
+ import { u32, vec3f } from "../../../shader/type/WEBGPU_WGSL_PRIMITIVE_TYPES.js";
2
+ import { WebGPUArray } from "../../../shader/type/WebGPUArray.js";
3
+ import { WebGPUStruct } from "../../../shader/type/WebGPUStruct.js";
4
+ import { AVBOIT_VIRTUAL_SLICES_MAX } from "./AVBOIT_CONSTANTS.js";
5
+
6
+ /**
7
+ * The depth-warp LUT and everything a consumer needs to use it, written once per frame by
8
+ * `shader_avboit_build_warp` and read by the splat, integrate and draw passes.
9
+ *
10
+ * `lut[v] = (prefix(v) << 1) | occupied(v)` for `v` in `[0, virtual_count]`, where `prefix(v)` counts
11
+ * the occupied virtual slices before `v`. `lut[virtual_count]` carries the total with the occupied bit
12
+ * clear. Entries past `virtual_count` are not written and must not be read; `chunk_avboit_warp` clamps.
13
+ *
14
+ * The header repeats the curve parameters, the voxel resolution and the renderer's switches so that a
15
+ * fragment shader reads one buffer rather than a uniform it would otherwise need a bind group of its
16
+ * own for.
17
+ */
18
+ export const AVBOIT_WARP_STRUCT = WebGPUStruct.from({
19
+ /** active virtual slice count V, a power-of-two divisor of AVBOIT_VIRTUAL_SLICES_MAX, ≥ physical_count */
20
+ virtual_count: u32,
21
+ /** physical slices in use after packing, ≤ physical_count */
22
+ occupied_count: u32,
23
+ /** AVBOIT_PHYSICAL_SLICES, here so the shaders and the allocation cannot disagree */
24
+ physical_count: u32,
25
+ /** extinction volume XY resolution */
26
+ voxel_width: u32,
27
+ voxel_height: u32,
28
+ /** 1 when transmitted light is filtered by the base colour, see AVBOITSettings; 0 otherwise */
29
+ tint_from_base_color: u32,
30
+ /** the depth curve for the finest virtual resolution, see avboit_build_depth_curve */
31
+ cluster_parameters: vec3f,
32
+ lut: WebGPUArray.from(u32, AVBOIT_VIRTUAL_SLICES_MAX + 1),
33
+ }, "AVBOITWarp").pack();
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The depth curve of the extinction volume, as `cluster_parameters` for the engine's log slicing
3
+ * (`cluster_depth_to_z_slice`), built for the finest virtual resolution.
4
+ *
5
+ * `build_light_cluster_parameters` is the light clusters' and the froxels' curve: slice
6
+ * `= log2(depth · B + O) · scale`, with `scale` deciding how much of the range is logarithmic and
7
+ * `near_offset` where it starts. The choice here is pure log from the offset plane — `scale` such that
8
+ * `O` comes out zero — because the adaptive warp makes near-plane precision free (empty slices cost no
9
+ * physical slice), so there is nothing to gain by flattening the curve as the light clusters do.
10
+ *
11
+ * Slice thickness at view depth `z` is then `z · ln(far / offset) / (V_max - 1)`; the numbers for the
12
+ * defaults are on `AVBOIT_VIRTUAL_SLICES_MAX`.
13
+ *
14
+ * @param {number} near camera near plane, world units
15
+ * @param {number} far camera far plane, world units
16
+ * @param {Float32Array|number[]} [result] three floats
17
+ * @returns {Float32Array|number[]} `result`
18
+ */
19
+ export function avboit_build_depth_curve(near: number, far: number, result?: Float32Array | number[]): Float32Array | number[];
20
+ //# sourceMappingURL=avboit_build_depth_curve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avboit_build_depth_curve.d.ts","sourceRoot":"","sources":["../../../../../../../src/shade/renderer/rasterize/native/avboit/avboit_build_depth_curve.js"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AACH,+CALW,MAAM,OACN,MAAM,WACN,YAAY,GAAC,MAAM,EAAE,GACnB,YAAY,GAAC,MAAM,EAAE,CAiBjC"}
@@ -0,0 +1,38 @@
1
+ import { assert } from "../../../../../core/assert.js";
2
+ import { build_light_cluster_parameters } from "../../../light/cluster/build_light_cluster_parameters.js";
3
+ import { AVBOIT_DEPTH_CURVE_NEAR_OFFSET, AVBOIT_VIRTUAL_SLICES_MAX } from "./AVBOIT_CONSTANTS.js";
4
+
5
+ /**
6
+ * The depth curve of the extinction volume, as `cluster_parameters` for the engine's log slicing
7
+ * (`cluster_depth_to_z_slice`), built for the finest virtual resolution.
8
+ *
9
+ * `build_light_cluster_parameters` is the light clusters' and the froxels' curve: slice
10
+ * `= log2(depth · B + O) · scale`, with `scale` deciding how much of the range is logarithmic and
11
+ * `near_offset` where it starts. The choice here is pure log from the offset plane — `scale` such that
12
+ * `O` comes out zero — because the adaptive warp makes near-plane precision free (empty slices cost no
13
+ * physical slice), so there is nothing to gain by flattening the curve as the light clusters do.
14
+ *
15
+ * Slice thickness at view depth `z` is then `z · ln(far / offset) / (V_max - 1)`; the numbers for the
16
+ * defaults are on `AVBOIT_VIRTUAL_SLICES_MAX`.
17
+ *
18
+ * @param {number} near camera near plane, world units
19
+ * @param {number} far camera far plane, world units
20
+ * @param {Float32Array|number[]} [result] three floats
21
+ * @returns {Float32Array|number[]} `result`
22
+ */
23
+ export function avboit_build_depth_curve(near, far, result = new Float32Array(3)) {
24
+ assert.isNumber(near, 'near');
25
+ assert.isNumber(far, 'far');
26
+ assert.greaterThan(far, near, 'far must be greater than near');
27
+
28
+ const offset = near + AVBOIT_DEPTH_CURVE_NEAR_OFFSET;
29
+ const scale = (AVBOIT_VIRTUAL_SLICES_MAX - 1) / Math.log2(far / offset);
30
+
31
+ return build_light_cluster_parameters(
32
+ result, 0,
33
+ AVBOIT_VIRTUAL_SLICES_MAX,
34
+ near, far,
35
+ AVBOIT_DEPTH_CURVE_NEAR_OFFSET,
36
+ scale,
37
+ );
38
+ }