@onerjs/core 8.56.4 → 9.0.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 (482) hide show
  1. package/Animations/animatable.core.js +36 -0
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animationGroup.pure.d.ts +61 -1
  4. package/Animations/animationGroup.pure.js +191 -2
  5. package/Animations/animationGroup.pure.js.map +1 -1
  6. package/Animations/index.d.ts +1 -0
  7. package/Animations/index.js +1 -0
  8. package/Animations/index.js.map +1 -1
  9. package/Animations/pure.d.ts +1 -0
  10. package/Animations/pure.js +1 -0
  11. package/Animations/pure.js.map +1 -1
  12. package/Animations/rootMotion.d.ts +560 -0
  13. package/Animations/rootMotion.js +1709 -0
  14. package/Animations/rootMotion.js.map +1 -0
  15. package/Animations/runtimeAnimation.d.ts +57 -0
  16. package/Animations/runtimeAnimation.js +127 -3
  17. package/Animations/runtimeAnimation.js.map +1 -1
  18. package/Cameras/arcRotateCamera.pure.d.ts +2 -0
  19. package/Cameras/arcRotateCamera.pure.js +2 -0
  20. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  21. package/Cameras/targetCamera.pure.d.ts +2 -0
  22. package/Cameras/targetCamera.pure.js +7 -1
  23. package/Cameras/targetCamera.pure.js.map +1 -1
  24. package/Collisions/gpuPicker.js +5 -5
  25. package/Collisions/gpuPicker.js.map +1 -1
  26. package/Engines/AbstractEngine/abstractEngine.query.pure.js +4 -2
  27. package/Engines/AbstractEngine/abstractEngine.query.pure.js.map +1 -1
  28. package/Engines/AbstractEngine/abstractEngine.query.types.d.ts +11 -2
  29. package/Engines/AbstractEngine/abstractEngine.query.types.js.map +1 -1
  30. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js +1 -0
  31. package/Engines/AbstractEngine/abstractEngine.renderPass.pure.js.map +1 -1
  32. package/Engines/Extensions/engine.multiRender.pure.js +63 -0
  33. package/Engines/Extensions/engine.multiRender.pure.js.map +1 -1
  34. package/Engines/Extensions/engine.multiRender.types.d.ts +13 -0
  35. package/Engines/Extensions/engine.multiRender.types.js.map +1 -1
  36. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +2 -2
  37. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
  38. package/Engines/Extensions/engine.prefilteredCubeTexture.types.d.ts +2 -1
  39. package/Engines/Extensions/engine.prefilteredCubeTexture.types.js.map +1 -1
  40. package/Engines/Extensions/index.d.ts +1 -0
  41. package/Engines/Extensions/index.js +1 -0
  42. package/Engines/Extensions/index.js.map +1 -1
  43. package/Engines/Extensions/pure.d.ts +1 -1
  44. package/Engines/Extensions/pure.js +1 -1
  45. package/Engines/Extensions/pure.js.map +1 -1
  46. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +88 -39
  47. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
  48. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.d.ts +20 -2
  49. package/Engines/Native/Extensions/nativeEngine.cubeTexture.types.js.map +1 -1
  50. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +4 -0
  51. package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
  52. package/Engines/WebGPU/Extensions/engine.multiRender.types.d.ts +13 -0
  53. package/Engines/WebGPU/Extensions/engine.multiRender.types.js.map +1 -1
  54. package/Engines/WebGPU/Extensions/engine.query.pure.js +11 -3
  55. package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
  56. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  57. package/Engines/WebGPU/Extensions/index.js +1 -0
  58. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  59. package/Engines/WebGPU/Extensions/pure.d.ts +1 -1
  60. package/Engines/WebGPU/Extensions/pure.js +1 -1
  61. package/Engines/WebGPU/Extensions/pure.js.map +1 -1
  62. package/Engines/WebGPU/webgpuBundleList.d.ts +2 -0
  63. package/Engines/WebGPU/webgpuBundleList.js +4 -0
  64. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  65. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +5 -2
  66. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  67. package/Engines/WebGPU/webgpuHardwareTexture.js +3 -1
  68. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  69. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  70. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  71. package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +4 -0
  72. package/Engines/WebGPU/webgpuSnapshotRendering.js +40 -7
  73. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -1
  74. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -1
  75. package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
  76. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  77. package/Engines/WebGPU/webgpuTextureManager.d.ts +2 -0
  78. package/Engines/WebGPU/webgpuTextureManager.js +286 -13
  79. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  80. package/Engines/abstractEngine.pure.d.ts +2 -0
  81. package/Engines/abstractEngine.pure.js +7 -3
  82. package/Engines/abstractEngine.pure.js.map +1 -1
  83. package/Engines/constants.d.ts +4 -0
  84. package/Engines/constants.js +4 -0
  85. package/Engines/constants.js.map +1 -1
  86. package/Engines/thinEngine.pure.d.ts +14 -0
  87. package/Engines/thinEngine.pure.js +48 -12
  88. package/Engines/thinEngine.pure.js.map +1 -1
  89. package/Engines/thinNativeEngine.pure.d.ts +1 -0
  90. package/Engines/thinNativeEngine.pure.js +7 -1
  91. package/Engines/thinNativeEngine.pure.js.map +1 -1
  92. package/Engines/thinWebGPUEngine.d.ts +4 -0
  93. package/Engines/thinWebGPUEngine.js +10 -1
  94. package/Engines/thinWebGPUEngine.js.map +1 -1
  95. package/Engines/webgpuEngine.pure.d.ts +5 -2
  96. package/Engines/webgpuEngine.pure.js +48 -13
  97. package/Engines/webgpuEngine.pure.js.map +1 -1
  98. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +2 -2
  99. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
  100. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.d.ts +11 -2
  101. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +1 -1
  102. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
  103. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.d.ts +9 -1
  104. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js +6 -8
  105. package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.pure.js.map +1 -1
  106. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.d.ts +2 -0
  107. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js +5 -1
  108. package/FlowGraph/Blocks/Event/flowGraphPointerOutEventBlock.pure.js.map +1 -1
  109. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.d.ts +2 -0
  110. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js +5 -1
  111. package/FlowGraph/Blocks/Event/flowGraphPointerOverEventBlock.pure.js.map +1 -1
  112. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +9 -0
  113. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +34 -9
  114. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
  115. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +2 -0
  116. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +4 -0
  117. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
  118. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +2 -0
  119. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +4 -0
  120. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
  121. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js +19 -7
  122. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.pure.js.map +1 -1
  123. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +20 -2
  124. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +53 -10
  125. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
  126. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.d.ts +16 -1
  127. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +64 -14
  128. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
  129. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js +64 -16
  130. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.pure.js.map +1 -1
  131. package/FlowGraph/flowGraph.d.ts +4 -0
  132. package/FlowGraph/flowGraph.js +38 -7
  133. package/FlowGraph/flowGraph.js.map +1 -1
  134. package/FlowGraph/flowGraphBlock.js +3 -0
  135. package/FlowGraph/flowGraphBlock.js.map +1 -1
  136. package/FlowGraph/flowGraphConnection.d.ts +7 -0
  137. package/FlowGraph/flowGraphConnection.js +7 -0
  138. package/FlowGraph/flowGraphConnection.js.map +1 -1
  139. package/FlowGraph/flowGraphContext.d.ts +2 -1
  140. package/FlowGraph/flowGraphContext.js +4 -3
  141. package/FlowGraph/flowGraphContext.js.map +1 -1
  142. package/FlowGraph/flowGraphCoordinator.d.ts +15 -1
  143. package/FlowGraph/flowGraphCoordinator.js +47 -16
  144. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  145. package/FlowGraph/flowGraphEventBlock.d.ts +5 -0
  146. package/FlowGraph/flowGraphEventBlock.js +7 -0
  147. package/FlowGraph/flowGraphEventBlock.js.map +1 -1
  148. package/FlowGraph/flowGraphHostResolver.d.ts +2 -1
  149. package/FlowGraph/flowGraphHostResolver.js.map +1 -1
  150. package/FlowGraph/flowGraphParser.js +60 -2
  151. package/FlowGraph/flowGraphParser.js.map +1 -1
  152. package/FlowGraph/serialization.d.ts +2 -0
  153. package/FlowGraph/serialization.js +10 -22
  154. package/FlowGraph/serialization.js.map +1 -1
  155. package/FlowGraph/typeDefinitions.d.ts +8 -0
  156. package/FlowGraph/typeDefinitions.js.map +1 -1
  157. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.d.ts +5 -0
  158. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js +8 -0
  159. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.js.map +1 -0
  160. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.d.ts +87 -0
  161. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js +295 -0
  162. package/FrameGraph/Node/Blocks/PostProcesses/meshBlendingPostProcessBlock.pure.js.map +1 -0
  163. package/FrameGraph/Node/Blocks/PostProcesses/pure.d.ts +1 -0
  164. package/FrameGraph/Node/Blocks/PostProcesses/pure.js +1 -0
  165. package/FrameGraph/Node/Blocks/PostProcesses/pure.js.map +1 -1
  166. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +4 -4
  167. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  168. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.d.ts +5 -1
  169. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js +13 -1
  170. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.pure.js.map +1 -1
  171. package/FrameGraph/Node/Blocks/allBlocks.pure.js +2 -0
  172. package/FrameGraph/Node/Blocks/allBlocks.pure.js.map +1 -1
  173. package/FrameGraph/Node/Blocks/index.d.ts +1 -0
  174. package/FrameGraph/Node/Blocks/index.js +1 -0
  175. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  176. package/FrameGraph/Node/Blocks/inputBlock.pure.js +20 -1
  177. package/FrameGraph/Node/Blocks/inputBlock.pure.js.map +1 -1
  178. package/FrameGraph/Node/Blocks/pure.d.ts +1 -0
  179. package/FrameGraph/Node/Blocks/pure.js +1 -0
  180. package/FrameGraph/Node/Blocks/pure.js.map +1 -1
  181. package/FrameGraph/Node/Types/nodeRenderGraphTypes.d.ts +4 -2
  182. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js +4 -2
  183. package/FrameGraph/Node/Types/nodeRenderGraphTypes.js.map +1 -1
  184. package/FrameGraph/Node/nodeRenderGraph.js +1 -1
  185. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  186. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js +1 -0
  187. package/FrameGraph/Tasks/Layers/selectionOutlineTask.js.map +1 -1
  188. package/FrameGraph/Tasks/Misc/cullObjectsTask.js +5 -1
  189. package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
  190. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +1 -0
  191. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
  192. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.d.ts +69 -0
  193. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js +223 -0
  194. package/FrameGraph/Tasks/PostProcesses/meshBlendingTask.js.map +1 -0
  195. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +25 -3
  196. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +69 -33
  197. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  198. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +3 -1
  199. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  200. package/FrameGraph/frameGraphObjectList.d.ts +6 -1
  201. package/FrameGraph/frameGraphObjectList.js.map +1 -1
  202. package/FrameGraph/frameGraphRenderContext.d.ts +3 -1
  203. package/FrameGraph/frameGraphRenderContext.js +5 -5
  204. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  205. package/FrameGraph/index.d.ts +1 -0
  206. package/FrameGraph/index.js +1 -0
  207. package/FrameGraph/index.js.map +1 -1
  208. package/FrameGraph/pure.d.ts +1 -0
  209. package/FrameGraph/pure.js +1 -0
  210. package/FrameGraph/pure.js.map +1 -1
  211. package/Inputs/scene.inputManager.d.ts +4 -0
  212. package/Inputs/scene.inputManager.js +50 -8
  213. package/Inputs/scene.inputManager.js.map +1 -1
  214. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js +5 -5
  215. package/Materials/GaussianSplatting/gaussianSplattingDebugMaterialPlugin.pure.js.map +1 -1
  216. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js +5 -5
  217. package/Materials/GaussianSplatting/gaussianSplattingGpuPickingMaterialPlugin.pure.js.map +1 -1
  218. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.d.ts +26 -1
  219. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +151 -47
  220. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  221. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js +5 -5
  222. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.js.map +1 -1
  223. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js +11 -1
  224. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.pure.js.map +1 -1
  225. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +17 -2
  226. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  227. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js +2 -2
  228. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.pure.js.map +1 -1
  229. package/Materials/Node/nodeMaterial.pure.d.ts +4 -0
  230. package/Materials/Node/nodeMaterial.pure.js +4 -0
  231. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  232. package/Materials/Node/nodeMaterialBuildState.d.ts +1 -1
  233. package/Materials/Node/nodeMaterialBuildState.js +25 -3
  234. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  235. package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -0
  236. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -0
  237. package/Materials/Textures/Procedurals/proceduralTexture.pure.d.ts +13 -14
  238. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +6 -6
  239. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  240. package/Materials/Textures/baseTexture.pure.js +3 -0
  241. package/Materials/Textures/baseTexture.pure.js.map +1 -1
  242. package/Materials/Textures/cubeTexture.pure.js +1 -1
  243. package/Materials/Textures/cubeTexture.pure.js.map +1 -1
  244. package/Materials/Textures/internalTexture.d.ts +8 -1
  245. package/Materials/Textures/internalTexture.js +9 -2
  246. package/Materials/Textures/internalTexture.js.map +1 -1
  247. package/Materials/Textures/rawTexture2DArray.functions.d.ts +3 -3
  248. package/Materials/Textures/rawTexture2DArray.functions.js.map +1 -1
  249. package/Materials/Textures/rawTexture3D.d.ts +1 -1
  250. package/Materials/Textures/rawTexture3D.js +1 -1
  251. package/Materials/Textures/rawTexture3D.js.map +1 -1
  252. package/Materials/Textures/textureHelper.functions.d.ts +14 -0
  253. package/Materials/Textures/textureHelper.functions.js +24 -0
  254. package/Materials/Textures/textureHelper.functions.js.map +1 -1
  255. package/Materials/ditheredTileFadeMaterialPlugin.d.ts +210 -0
  256. package/Materials/ditheredTileFadeMaterialPlugin.js +509 -0
  257. package/Materials/ditheredTileFadeMaterialPlugin.js.map +1 -0
  258. package/Materials/index.d.ts +1 -0
  259. package/Materials/index.js +1 -0
  260. package/Materials/index.js.map +1 -1
  261. package/Materials/materialHelper.geometryrendering.d.ts +46 -1
  262. package/Materials/materialHelper.geometryrendering.js +105 -8
  263. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  264. package/Materials/prepass.defines.d.ts +2 -0
  265. package/Materials/prepass.defines.js +2 -0
  266. package/Materials/prepass.defines.js.map +1 -1
  267. package/Materials/pure.d.ts +1 -0
  268. package/Materials/pure.js +1 -0
  269. package/Materials/pure.js.map +1 -1
  270. package/Materials/standardMaterial.pure.d.ts +2 -0
  271. package/Materials/standardMaterial.pure.js +6 -3
  272. package/Materials/standardMaterial.pure.js.map +1 -1
  273. package/Meshes/Builders/polygonBuilder.pure.d.ts +4 -0
  274. package/Meshes/Builders/polygonBuilder.pure.js +4 -1
  275. package/Meshes/Builders/polygonBuilder.pure.js.map +1 -1
  276. package/Meshes/GaussianSplatting/gaussianSplatting.functions.d.ts +19 -0
  277. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js +23 -0
  278. package/Meshes/GaussianSplatting/gaussianSplatting.functions.js.map +1 -0
  279. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -14
  280. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +20 -24
  281. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  282. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +2 -0
  283. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +11 -4
  284. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  285. package/Meshes/abstractMesh.pure.d.ts +18 -0
  286. package/Meshes/abstractMesh.pure.js +22 -0
  287. package/Meshes/abstractMesh.pure.js.map +1 -1
  288. package/Meshes/index.d.ts +1 -0
  289. package/Meshes/index.js +1 -0
  290. package/Meshes/index.js.map +1 -1
  291. package/Meshes/instancedMesh.pure.d.ts +5 -0
  292. package/Meshes/instancedMesh.pure.js +12 -0
  293. package/Meshes/instancedMesh.pure.js.map +1 -1
  294. package/Meshes/mesh.pure.js +23 -8
  295. package/Meshes/mesh.pure.js.map +1 -1
  296. package/Meshes/meshBlendingTag.d.ts +47 -0
  297. package/Meshes/meshBlendingTag.js +64 -0
  298. package/Meshes/meshBlendingTag.js.map +1 -0
  299. package/Meshes/polygonMesh.js +2 -2
  300. package/Meshes/polygonMesh.js.map +1 -1
  301. package/Meshes/pure.d.ts +1 -0
  302. package/Meshes/pure.js +1 -0
  303. package/Meshes/pure.js.map +1 -1
  304. package/Misc/fileTools.pure.js +21 -0
  305. package/Misc/fileTools.pure.js.map +1 -1
  306. package/Misc/snapshotRenderingHelper.js +2 -2
  307. package/Misc/snapshotRenderingHelper.js.map +1 -1
  308. package/Misc/tools.pure.js +1 -1
  309. package/Misc/tools.pure.js.map +1 -1
  310. package/Particles/gpuParticleSystem.pure.d.ts +2 -0
  311. package/Particles/gpuParticleSystem.pure.js +89 -28
  312. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  313. package/Particles/thinParticleSystem.pure.d.ts +2 -0
  314. package/Particles/thinParticleSystem.pure.js +84 -19
  315. package/Particles/thinParticleSystem.pure.js.map +1 -1
  316. package/Particles/webgl2ParticleSystem.pure.d.ts +1 -0
  317. package/Particles/webgl2ParticleSystem.pure.js +12 -4
  318. package/Particles/webgl2ParticleSystem.pure.js.map +1 -1
  319. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js +7 -0
  320. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.pure.js.map +1 -1
  321. package/PostProcesses/index.d.ts +2 -0
  322. package/PostProcesses/index.js +2 -0
  323. package/PostProcesses/index.js.map +1 -1
  324. package/PostProcesses/meshBlendingBlueNoise.d.ts +15 -0
  325. package/PostProcesses/meshBlendingBlueNoise.js +77 -0
  326. package/PostProcesses/meshBlendingBlueNoise.js.map +1 -0
  327. package/PostProcesses/meshBlendingPostProcess.d.ts +131 -0
  328. package/PostProcesses/meshBlendingPostProcess.js +315 -0
  329. package/PostProcesses/meshBlendingPostProcess.js.map +1 -0
  330. package/PostProcesses/pure.d.ts +2 -0
  331. package/PostProcesses/pure.js +2 -0
  332. package/PostProcesses/pure.js.map +1 -1
  333. package/PostProcesses/thinMeshBlendingPostProcess.d.ts +339 -0
  334. package/PostProcesses/thinMeshBlendingPostProcess.js +771 -0
  335. package/PostProcesses/thinMeshBlendingPostProcess.js.map +1 -0
  336. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +6 -6
  337. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  338. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +8 -8
  339. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  340. package/Rendering/boundingBoxRenderer.pure.js +2 -1
  341. package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
  342. package/Rendering/depthRenderer.pure.js +3 -4
  343. package/Rendering/depthRenderer.pure.js.map +1 -1
  344. package/Rendering/edgesRenderer.pure.d.ts +4 -2
  345. package/Rendering/edgesRenderer.pure.js +11 -2
  346. package/Rendering/edgesRenderer.pure.js.map +1 -1
  347. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +10 -0
  348. package/Rendering/fluidRenderer/fluidRenderingObject.js +20 -0
  349. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  350. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +9 -3
  351. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +14 -9
  352. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  353. package/Rendering/geometryBufferRenderer.pure.d.ts +38 -4
  354. package/Rendering/geometryBufferRenderer.pure.js +126 -17
  355. package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
  356. package/Rendering/objectRenderer.d.ts +7 -1
  357. package/Rendering/objectRenderer.js +45 -7
  358. package/Rendering/objectRenderer.js.map +1 -1
  359. package/Rendering/outlineRenderer.pure.js +6 -2
  360. package/Rendering/outlineRenderer.pure.js.map +1 -1
  361. package/Rendering/renderingManager.d.ts +1 -1
  362. package/Rendering/renderingManager.js +5 -4
  363. package/Rendering/renderingManager.js.map +1 -1
  364. package/Shaders/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  365. package/Shaders/ShadersInclude/defaultFragmentAlpha.js +34 -0
  366. package/Shaders/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  367. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js +5 -1
  368. package/Shaders/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -1
  369. package/Shaders/ShadersInclude/geometryRenderingFragment.d.ts +5 -0
  370. package/Shaders/ShadersInclude/geometryRenderingFragment.js +74 -0
  371. package/Shaders/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  372. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js +89 -0
  373. package/Shaders/ShadersInclude/mrtFragmentDeclaration.js.map +1 -1
  374. package/Shaders/ShadersInclude/openpbrBlockPrePass.js +24 -17
  375. package/Shaders/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  376. package/Shaders/ShadersInclude/pbrBlockPrePass.js +27 -20
  377. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  378. package/Shaders/ShadersInclude/pbrDebug.js +6 -2
  379. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  380. package/Shaders/ShadersInclude/prePassDeclaration.js +95 -2
  381. package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
  382. package/Shaders/default.fragment.js +31 -40
  383. package/Shaders/default.fragment.js.map +1 -1
  384. package/Shaders/depthOfField.fragment.js +13 -9
  385. package/Shaders/depthOfField.fragment.js.map +1 -1
  386. package/Shaders/fluidRenderingParticleDepth.vertex.js +16 -1
  387. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  388. package/Shaders/fluidRenderingParticleThickness.vertex.js +16 -1
  389. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  390. package/Shaders/gaussianSplatting.fragment.js +63 -3
  391. package/Shaders/gaussianSplatting.fragment.js.map +1 -1
  392. package/Shaders/gaussianSplatting.vertex.js +80 -0
  393. package/Shaders/gaussianSplatting.vertex.js.map +1 -1
  394. package/Shaders/geometry.fragment.js +17 -11
  395. package/Shaders/geometry.fragment.js.map +1 -1
  396. package/Shaders/gpuRenderParticles.fragment.js +43 -1
  397. package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
  398. package/Shaders/gpuRenderParticles.vertex.js +96 -16
  399. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  400. package/Shaders/meshBlending.fragment.d.ts +5 -0
  401. package/Shaders/meshBlending.fragment.js +519 -0
  402. package/Shaders/meshBlending.fragment.js.map +1 -0
  403. package/Shaders/particles.fragment.js +43 -1
  404. package/Shaders/particles.fragment.js.map +1 -1
  405. package/Shaders/particles.vertex.js +84 -3
  406. package/Shaders/particles.vertex.js.map +1 -1
  407. package/Shaders/sprites.fragment.js +52 -2
  408. package/Shaders/sprites.fragment.js.map +1 -1
  409. package/Shaders/sprites.vertex.js +62 -1
  410. package/Shaders/sprites.vertex.js.map +1 -1
  411. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.d.ts +5 -0
  412. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js +33 -0
  413. package/ShadersWGSL/ShadersInclude/defaultFragmentAlpha.js.map +1 -0
  414. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.d.ts +6 -0
  415. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js +76 -0
  416. package/ShadersWGSL/ShadersInclude/geometryRenderingFragment.js.map +1 -0
  417. package/ShadersWGSL/ShadersInclude/lightFragment.js +1 -1
  418. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  419. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.d.ts +5 -0
  420. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js +18 -0
  421. package/ShadersWGSL/ShadersInclude/meshBlendTagFragmentOutput.js.map +1 -0
  422. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.d.ts +1 -0
  423. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js +11 -25
  424. package/ShadersWGSL/ShadersInclude/openpbrBlockPrePass.js.map +1 -1
  425. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.d.ts +1 -0
  426. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +11 -25
  427. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  428. package/ShadersWGSL/ShadersInclude/pbrDebug.js +5 -1
  429. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  430. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +6 -1
  431. package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
  432. package/ShadersWGSL/default.fragment.js +17 -48
  433. package/ShadersWGSL/default.fragment.js.map +1 -1
  434. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +15 -2
  435. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  436. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -2
  437. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  438. package/ShadersWGSL/gaussianSplatting.fragment.js +63 -2
  439. package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -1
  440. package/ShadersWGSL/gaussianSplatting.vertex.js +80 -0
  441. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  442. package/ShadersWGSL/geometry.fragment.js +37 -2
  443. package/ShadersWGSL/geometry.fragment.js.map +1 -1
  444. package/ShadersWGSL/gpuRenderParticles.fragment.js +47 -2
  445. package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -1
  446. package/ShadersWGSL/gpuRenderParticles.vertex.js +110 -7
  447. package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -1
  448. package/ShadersWGSL/meshBlending.fragment.d.ts +5 -0
  449. package/ShadersWGSL/meshBlending.fragment.js +576 -0
  450. package/ShadersWGSL/meshBlending.fragment.js.map +1 -0
  451. package/ShadersWGSL/openpbr.fragment.js +2 -1
  452. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  453. package/ShadersWGSL/particles.fragment.js +45 -1
  454. package/ShadersWGSL/particles.fragment.js.map +1 -1
  455. package/ShadersWGSL/particles.vertex.js +86 -4
  456. package/ShadersWGSL/particles.vertex.js.map +1 -1
  457. package/ShadersWGSL/pbr.fragment.js +2 -1
  458. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  459. package/ShadersWGSL/sprites.fragment.js +56 -2
  460. package/ShadersWGSL/sprites.fragment.js.map +1 -1
  461. package/ShadersWGSL/sprites.vertex.js +62 -1
  462. package/ShadersWGSL/sprites.vertex.js.map +1 -1
  463. package/Sprites/spriteManager.d.ts +13 -0
  464. package/Sprites/spriteManager.js +15 -0
  465. package/Sprites/spriteManager.js.map +1 -1
  466. package/Sprites/spriteRenderer.d.ts +24 -1
  467. package/Sprites/spriteRenderer.js +368 -50
  468. package/Sprites/spriteRenderer.js.map +1 -1
  469. package/Sprites/thinSprite.d.ts +4 -0
  470. package/Sprites/thinSprite.js +4 -0
  471. package/Sprites/thinSprite.js.map +1 -1
  472. package/States/alphaCullingState.d.ts +3 -1
  473. package/States/alphaCullingState.js +18 -3
  474. package/States/alphaCullingState.js.map +1 -1
  475. package/XR/webXRDefaultExperience.d.ts +5 -1
  476. package/XR/webXRDefaultExperience.js.map +1 -1
  477. package/XR/webXREnterExitUI.d.ts +2 -1
  478. package/XR/webXREnterExitUI.js.map +1 -1
  479. package/package.json +1 -1
  480. package/scene.pure.d.ts +23 -0
  481. package/scene.pure.js +35 -0
  482. package/scene.pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingMaterial.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\r\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\r\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\r\nimport { type Effect, type IEffectCreationOptions } from \"../../Materials/effect.pure\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { type Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { type AbstractEngine } from \"../../Engines/abstractEngine.pure\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer.pure\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera.pure\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\r\nimport { MaterialPluginEvent } from \"../materialPluginEvent\";\r\nimport { Material } from \"../material.pure\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport { Engine } from \"../../Engines/engine.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\n\r\n/**\r\n * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.\r\n * The limit is derived from the engine's maximum vertex uniform vectors capability.\r\n * @param engine - The engine to compute the limit for\r\n * @returns The maximum number of parts supported\r\n */\r\nexport function GetGaussianSplattingMaxPartCount(engine: AbstractEngine): number {\r\n // Each GS compound part requires 5 uniform vectors: 4 for the mat4 world matrix + 1 for the visibility float.\r\n // The maximum number of parts is limited by the engine's uniform vector capacity and by the uint8 partIndices texture format (max 256).\r\n\r\n const uniformsPerSplat = 5;\r\n const reservedUniforms = 40; // base shader uniforms + margin for plugins/clip planes\r\n const absoluteMax = 256; // uint8 partIndices texture format limit\r\n\r\n const maxUniformVectors = engine.getCaps().maxVertexUniformVectors;\r\n const available = Math.max(maxUniformVectors - reservedUniforms, 0);\r\n const maxFromUniforms = Math.floor(available / uniformsPerSplat);\r\n return Math.min(Math.max(maxFromUniforms, 1), absoluteMax);\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link GetGaussianSplattingMaxPartCount} with an engine instance instead.\r\n */\r\nexport const GaussianSplattingMaxPartCount = 128;\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends MaterialDefines {\r\n /** Defines whether fog is enabled */\r\n public FOG = false;\r\n /** Defines whether thin instances are used */\r\n public THIN_INSTANCES = true;\r\n /** Defines whether logarithmic depth is enabled */\r\n public LOGARITHMICDEPTH = false;\r\n /** Defines whether clip plane 1 is enabled */\r\n public CLIPPLANE = false;\r\n /** Defines whether clip plane 2 is enabled */\r\n public CLIPPLANE2 = false;\r\n /** Defines whether clip plane 3 is enabled */\r\n public CLIPPLANE3 = false;\r\n /** Defines whether clip plane 4 is enabled */\r\n public CLIPPLANE4 = false;\r\n /** Defines whether clip plane 5 is enabled */\r\n public CLIPPLANE5 = false;\r\n /** Defines whether clip plane 6 is enabled */\r\n public CLIPPLANE6 = false;\r\n /** Defines the spherical harmonics degree */\r\n public SH_DEGREE = 0;\r\n /** Defines whether compensation is applied */\r\n public COMPENSATION = false;\r\n /** Defines whether this is a compound splat */\r\n public IS_COMPOUND = false;\r\n /** Defines the maximum number of parts (computed from engine caps at runtime) */\r\n public MAX_PART_COUNT = GaussianSplattingMaxPartCount;\r\n /** Defines whether SOG raw-texture in-shader dequantization is enabled */\r\n public USE_SOG = false;\r\n /** Defines whether SOG v2 (codebook) dequantization is enabled */\r\n public USE_SOG_V2 = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n * @param externalProperties External properties (e.g. from material plugins) to add to the defines.\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n\r\n /**\r\n * Checks if a define is part of the generated define list.\r\n * @param name define name to check\r\n * @returns true if the define exists\r\n */\r\n public hasDefine(name: string): boolean {\r\n return this._keys.indexOf(name) !== -1;\r\n }\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Minimum projected splat size, in pixels, below which a splat is discarded (default 0 = disabled).\r\n * Matches PlayCanvas `minPixelSize`. Applies to all Gaussian Splatting meshes using this material.\r\n */\r\n public static MinPixelSize: number = 0;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n\r\n /**\r\n * Minimum projected splat size, in pixels, below which a splat is discarded (default 0 = disabled).\r\n */\r\n public minPixelSize = GaussianSplattingMaterial.MinPixelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\r\n \"covariancesATexture\",\r\n \"covariancesBTexture\",\r\n \"centersTexture\",\r\n \"colorsTexture\",\r\n \"shTexture0\",\r\n \"shTexture1\",\r\n \"shTexture2\",\r\n \"shTexture3\",\r\n \"shTexture4\",\r\n \"partIndicesTexture\",\r\n \"sogQuatsTexture\",\r\n \"sogShNCentroidsTexture\",\r\n \"sogShNLabelsTexture\",\r\n \"sogCodebookTexture\",\r\n ];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _VoxelUniforms = [\r\n \"world\",\r\n \"dataTextureSize\",\r\n \"alpha\",\r\n \"invWorldScale\",\r\n \"viewMatrix\",\r\n \"nearPlane\",\r\n \"farPlane\",\r\n \"stepSize\",\r\n \"partWorld\",\r\n \"partVisibility\",\r\n \"axis\",\r\n ];\r\n protected static _VoxelSamplers = [\"rotationsATexture\", \"rotationsBTexture\", \"rotationScaleTexture\", \"centersTexture\", \"colorsTexture\", \"partIndicesTexture\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"minPixelSize\",\r\n \"alpha\",\r\n \"depthValues\",\r\n \"partWorld\",\r\n \"partVisibility\",\r\n \"sogMeansMin\",\r\n \"sogMeansMax\",\r\n \"sogScalesMin\",\r\n \"sogScalesMax\",\r\n \"sogSh0Min\",\r\n \"sogSh0Max\",\r\n \"sogShnMin\",\r\n \"sogShnMax\",\r\n \"sogShCoeffCount\",\r\n ];\r\n private _sourceMesh: GaussianSplattingMesh | null = null;\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines || this.pluginManager) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n const defineNames = this._eventInfo.defineNames;\r\n const needsNewDefines = !subMesh.materialDefines || (defineNames && Object.keys(defineNames).some((name) => !defines.hasDefine(name)));\r\n if (needsNewDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines(defineNames);\r\n }\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n // Check plugin readiness\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (!this._sourceMesh) {\r\n return false;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = this._sourceMesh;\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // External config\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.mesh = mesh;\r\n this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // External config\r\n this._callbackPluginEventPrepareDefines(this._eventInfo);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n defines[\"IS_COMPOUND\"] = gsMesh.isCompound;\r\n defines[\"MAX_PART_COUNT\"] = GetGaussianSplattingMaxPartCount(engine);\r\n defines[\"USE_SOG\"] = gsMesh.useSog;\r\n defines[\"USE_SOG_V2\"] = gsMesh.useSog && gsMesh.sogParams?.version === 2;\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n const attribs = GaussianSplattingMaterial._Attribs.slice();\r\n const uniforms = GaussianSplattingMaterial._Uniforms.slice();\r\n const samplers = GaussianSplattingMaterial._Samplers.slice();\r\n const uniformBuffers = GaussianSplattingMaterial._UniformBuffers.slice();\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n // Let plugin manager prepare its uniform/sampler/ubo lists\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n // Prepare plugin effect\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: {},\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * GaussianSplattingMaterial belongs to a single mesh\r\n * @param mesh mesh this material belongs to\r\n */\r\n public setSourceMesh(mesh: GaussianSplattingMesh) {\r\n this._sourceMesh = mesh;\r\n }\r\n\r\n /**\r\n * Gets the source mesh of this material, which is the Gaussian Splatting mesh that provides the data for rendering\r\n * @returns The Gaussian Splatting mesh that provides the data for rendering, or null if not set\r\n */\r\n public getSourceMesh(): GaussianSplattingMesh | null {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n\r\n if (!gsMaterial._sourceMesh) {\r\n return;\r\n }\r\n\r\n const gsMesh = gsMaterial._sourceMesh;\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n effect.setFloat2(\"invViewport\", 1 / (renderWidth / numberOfRigs), 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"minPixelSize\", gsMaterial ? gsMaterial.minPixelSize : GaussianSplattingMaterial.MinPixelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.useSog) {\r\n GaussianSplattingMaterial._BindSogUniforms(gsMesh, effect);\r\n } else if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n\r\n // Bind part indices texture, if the\r\n gsMesh.bindExtraEffectUniforms(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Bind SOG dequantization uniforms + raw textures.\r\n * @internal\r\n */\r\n protected static _BindSogUniforms(gsMesh: GaussianSplattingMesh, effect: Effect): void {\r\n const p = gsMesh.sogParams;\r\n if (!p) {\r\n return;\r\n }\r\n effect.setTexture(\"sogQuatsTexture\", gsMesh.rotationsATexture);\r\n if (gsMesh.shTextures && gsMesh.shTextures.length >= 2) {\r\n effect.setTexture(\"sogShNCentroidsTexture\", gsMesh.shTextures[0]);\r\n effect.setTexture(\"sogShNLabelsTexture\", gsMesh.shTextures[1]);\r\n }\r\n if (p.codebookTexture) {\r\n effect.setTexture(\"sogCodebookTexture\", p.codebookTexture);\r\n }\r\n effect.setFloat3(\"sogMeansMin\", p.meansMin[0], p.meansMin[1], p.meansMin[2]);\r\n effect.setFloat3(\"sogMeansMax\", p.meansMax[0], p.meansMax[1], p.meansMax[2]);\r\n if (p.scalesMin && p.scalesMax) {\r\n effect.setFloat3(\"sogScalesMin\", p.scalesMin[0], p.scalesMin[1], p.scalesMin[2]);\r\n effect.setFloat3(\"sogScalesMax\", p.scalesMax[0], p.scalesMax[1], p.scalesMax[2]);\r\n }\r\n if (p.sh0Min && p.sh0Max) {\r\n effect.setFloat4(\"sogSh0Min\", p.sh0Min[0], p.sh0Min[1], p.sh0Min[2], p.sh0Min[3]);\r\n effect.setFloat4(\"sogSh0Max\", p.sh0Max[0], p.sh0Max[1], p.sh0Max[2], p.sh0Max[3]);\r\n }\r\n effect.setFloat(\"sogShnMin\", p.shnMin ?? 0);\r\n effect.setFloat(\"sogShnMax\", p.shnMax ?? 0);\r\n effect.setFloat(\"sogShCoeffCount\", p.shCoeffCount ?? 0);\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // Bind plugins\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const effect = shaderMaterial.getEffect()!;\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const renderWidth = engine.getRenderWidth() * camera!.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera!.viewport.height;\r\n effect.setFloat2(\"invViewport\", 1 / renderWidth, 1 / renderHeight);\r\n\r\n let focal = 1000;\r\n\r\n if (camera) {\r\n /*\r\n more explicit version:\r\n const t = camera.getProjectionMatrix().m[5];\r\n const FovY = Math.atan(1.0 / t) * 2.0;\r\n focal = renderHeight / 2.0 / Math.tan(FovY / 2.0);\r\n Using a shorter version here to not have tan(atan) and 2.0 factor\r\n */\r\n const t = camera.getProjectionMatrix().m[5];\r\n if (camera.fovMode == Camera.FOVMODE_VERTICAL_FIXED) {\r\n focal = (renderHeight * t) / 2.0;\r\n } else {\r\n focal = (renderWidth * t) / 2.0;\r\n }\r\n }\r\n\r\n effect.setFloat2(\"focal\", focal, focal);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"minPixelSize\", gsMaterial ? gsMaterial.minPixelSize : GaussianSplattingMaterial.MinPixelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n\r\n let minZ: number, maxZ: number;\r\n\r\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\r\n if (cameraIsOrtho) {\r\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n } else {\r\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\r\n }\r\n\r\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n gsMesh.bindExtraEffectUniforms(effect);\r\n }\r\n }\r\n\r\n private _voxelMissingTextureWarned = new Set<number>();\r\n private _voxelPartWorldData = new Float32Array(0);\r\n private readonly _voxelPartVisibilityData: number[] = [];\r\n\r\n protected _bindVoxelEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial): boolean {\r\n if (!gsMesh.rotationsATexture) {\r\n // Attempt to enable rotation/scale texture generation (no-op if already enabled).\r\n // If the mesh is already loaded and splat data is in RAM this triggers updateData() synchronously.\r\n // If the mesh was loaded without keepInRam=true the setter will log an error.\r\n gsMesh.needsRotationScaleTextures = true;\r\n\r\n if (!gsMesh.rotationsATexture) {\r\n // Mesh data was already processed but rotation textures couldn't be generated — warn once.\r\n if (gsMesh.centersTexture && !gsMesh.splatsData && !this._voxelMissingTextureWarned.has(gsMesh.uniqueId)) {\r\n this._voxelMissingTextureWarned.add(gsMesh.uniqueId);\r\n Logger.Error(\r\n \"IBL voxelization: GaussianSplattingMesh rotation/scale textures are not available. \" +\r\n \"Create the mesh either with keepInRam=true or needsRotationScaleTextures=true to enable IBL shadow voxelization.\"\r\n );\r\n }\r\n return false;\r\n }\r\n }\r\n this._voxelMissingTextureWarned.delete(gsMesh.uniqueId);\r\n\r\n const effect = shaderMaterial.getEffect()!;\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n\r\n const textureSize = gsMesh.rotationsATexture.getSize();\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n effect.setTexture(\"rotationsATexture\", gsMesh.rotationsATexture);\r\n effect.setTexture(\"rotationsBTexture\", gsMesh.rotationsBTexture);\r\n effect.setTexture(\"rotationScaleTexture\", gsMesh.rotationScaleTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n const partWorldDataLength = gsMesh.partCount * 16;\r\n if (this._voxelPartWorldData.length !== partWorldDataLength) {\r\n this._voxelPartWorldData = new Float32Array(partWorldDataLength);\r\n }\r\n const partWorldData = this._voxelPartWorldData;\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n const partVisibilityData = this._voxelPartVisibilityData;\r\n partVisibilityData.length = gsMesh.partCount;\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData[i] = gsMesh.partVisibility[i] ?? 1.0;\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Create a voxel rendering material for a Gaussian Splatting mesh, for use with IBL shadow voxelization.\r\n * The returned ShaderMaterial's onBindObservable binds the GS mesh-side uniforms (textures, alpha, dataTextureSize, part data).\r\n * The caller (e.g. iblShadowsVoxelRenderer) is responsible for setting the per-slab uniforms on the returned material:\r\n * viewMatrix, invWorldScale, nearPlane, farPlane, stepSize.\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param maxDrawBuffers number of draw buffers (MRT outputs) per voxelization slab\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns voxel rendering shader material\r\n */\r\n public makeVoxelRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, maxDrawBuffers: number, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [`#define MAX_DRAW_BUFFERS ${maxDrawBuffers}`];\r\n\r\n defines.push(\"#define IS_FOR_VOXELIZATION\");\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND 1\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingVoxelRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingVoxel\",\r\n fragment: \"gaussianSplattingVoxel\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._VoxelUniforms,\r\n samplers: GaussianSplattingMaterial._VoxelSamplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n // WebGPU accumulates non-binary voxel opacity via atomicMax into this storage buffer.\r\n storageBuffers: shaderLanguage === ShaderLanguage.WGSL ? [\"voxelOpacityBuffer\"] : [],\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: false,\r\n extraInitializationsAsync: async () => {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplattingVoxel.vertex\"), import(\"../../ShadersWGSL/gaussianSplattingVoxel.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplattingVoxel.vertex\"), import(\"../../Shaders/gaussianSplattingVoxel.fragment\")]);\r\n }\r\n },\r\n }\r\n );\r\n shaderMaterial.cullBackFaces = false;\r\n shaderMaterial.backFaceCulling = false;\r\n shaderMaterial.depthFunction = Engine.ALWAYS;\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n this._bindVoxelEffectUniforms(gsMesh, gsMaterial, shaderMaterial);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n /**\r\n * Create a depth rendering material for a Gaussian Splatting mesh\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param alphaBlendedDepth whether to enable alpha blended depth rendering\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns depth rendering shader material\r\n */\r\n public makeDepthRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, alphaBlendedDepth: boolean = false, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [\"#define DEPTH_RENDER\"];\r\n\r\n if (alphaBlendedDepth) {\r\n defines.push(\"#define ALPHA_BLENDED_DEPTH\");\r\n }\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND 1\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepthRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: alphaBlendedDepth,\r\n }\r\n );\r\n shaderMaterial.doNotSerialize = true;\r\n shaderMaterial.backFaceCulling = false;\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n // Use the source mesh from the material for GS-specific properties (textures, etc.),\r\n // since the bound mesh may be a camera mesh proxy without those properties.\r\n const gsMesh = (gsMaterial?.getSourceMesh() ?? mesh) as GaussianSplattingMesh;\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n shaderMaterial.doNotSerialize = true;\r\n shaderMaterial.backFaceCulling = false;\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n // Use the source mesh from the material for GS-specific properties (textures, etc.),\r\n // since the bound mesh may be a camera mesh proxy without those properties.\r\n const gsMesh = (gsMaterial?.getSourceMesh() ?? mesh) as GaussianSplattingMesh;\r\n\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n const clone = SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this._clonePlugins(clone, \"\");\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n const material = SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingMaterial.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\r\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\r\nimport { type Mesh } from \"../../Meshes/mesh.pure\";\r\nimport { type Effect, type IEffectCreationOptions } from \"../../Materials/effect.pure\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { type GaussianSplattingMesh } from \"../../Meshes/GaussianSplatting/gaussianSplattingMesh.pure\";\r\nimport { type AbstractEngine } from \"../../Engines/abstractEngine.pure\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { VertexBuffer } from \"../../Buffers/buffer.pure\";\r\nimport { MaterialDefines } from \"../../Materials/materialDefines\";\r\nimport { PushMaterial } from \"../../Materials/pushMaterial\";\r\nimport { AddClipPlaneUniforms, BindClipPlane } from \"../clipPlaneMaterialHelper\";\r\nimport { Camera } from \"../../Cameras/camera.pure\";\r\nimport { ShadowDepthWrapper } from \"../../Materials/shadowDepthWrapper\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\r\nimport { MaterialPluginEvent } from \"../materialPluginEvent\";\r\nimport { Material } from \"../material.pure\";\r\nimport {\r\n BindFogParameters,\r\n BindLogDepth,\r\n PrepareAttributesForInstances,\r\n PrepareDefinesForAttributes,\r\n PrepareDefinesForFrameBoundValues,\r\n PrepareDefinesForMisc,\r\n PrepareUniformsAndSamplersList,\r\n} from \"../materialHelper.functions\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport { Engine } from \"../../Engines/engine.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { PrepassDefinesMixin } from \"../prepass.defines\";\r\nimport { MaterialHelperGeometryRendering, type GeometryRenderingConfiguration } from \"../materialHelper.geometryrendering\";\r\nimport { Observable, type Observer } from \"../../Misc/observable.pure\";\r\nimport { type Nullable } from \"../../types\";\r\n\r\n/**\r\n * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.\r\n * The limit is derived from the engine's maximum vertex uniform vectors capability.\r\n * @param engine - The engine to compute the limit for\r\n * @returns The maximum number of parts supported\r\n */\r\nexport function GetGaussianSplattingMaxPartCount(engine: AbstractEngine): number {\r\n // Each GS compound part requires 5 uniform vectors: 4 for the mat4 world matrix + 1 for the visibility float.\r\n // The maximum number of parts is limited by the engine's uniform vector capacity and by the uint8 partIndices texture format (max 256).\r\n\r\n const uniformsPerSplat = 5;\r\n const reservedUniforms = 40; // base shader uniforms + margin for plugins/clip planes\r\n const absoluteMax = 256; // uint8 partIndices texture format limit\r\n\r\n const maxUniformVectors = engine.getCaps().maxVertexUniformVectors;\r\n const available = Math.max(maxUniformVectors - reservedUniforms, 0);\r\n const maxFromUniforms = Math.floor(available / uniformsPerSplat);\r\n return Math.min(Math.max(maxFromUniforms, 1), absoluteMax);\r\n}\r\n\r\n/**\r\n * @deprecated Use {@link GetGaussianSplattingMaxPartCount} with an engine instance instead.\r\n */\r\nexport const GaussianSplattingMaxPartCount = 128;\r\n\r\n/**\r\n * Returns an include-guarded declaration of the `vPartIndex` varying shared by the Gaussian\r\n * Splatting material plugins (debug, solid-color, GPU picking). More than one of these plugins can\r\n * be attached to the same material at once; each needs `vPartIndex` to carry `splat.partIndex` from\r\n * the vertex to the fragment stage. Without a guard each plugin injects its own `varying vPartIndex`,\r\n * which is a duplicate declaration — fatal under WGSL (\"redefinition of 'vPartIndex'\"). The guard\r\n * makes the declaration idempotent so exactly one survives regardless of how many plugins inject it.\r\n * Inject the result at a CUSTOM_VERTEX_DEFINITIONS / CUSTOM_FRAGMENT_DEFINITIONS point.\r\n * @param shaderLanguage - The shader language the host material is compiling.\r\n * @returns The guarded `vPartIndex` varying declaration.\r\n */\r\nexport function GetPartIndexVaryingDeclaration(shaderLanguage: ShaderLanguage): string {\r\n const decl = shaderLanguage === ShaderLanguage.WGSL ? \"varying vPartIndex: f32;\" : \"varying float vPartIndex;\";\r\n return `\r\n#if !defined(VPARTINDEX_VARYING_DECLARED)\r\n#define VPARTINDEX_VARYING_DECLARED\r\n${decl}\r\n#endif\r\n`;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefinesBase extends PrepassDefinesMixin(MaterialDefines) {}\r\n\r\n/**\r\n * @internal\r\n */\r\nclass GaussianSplattingMaterialDefines extends GaussianSplattingMaterialDefinesBase {\r\n /** Defines whether fog is enabled */\r\n public FOG = false;\r\n /** Defines whether thin instances are used */\r\n public THIN_INSTANCES = true;\r\n /** Defines whether logarithmic depth is enabled */\r\n public LOGARITHMICDEPTH = false;\r\n /** Defines whether clip plane 1 is enabled */\r\n public CLIPPLANE = false;\r\n /** Defines whether clip plane 2 is enabled */\r\n public CLIPPLANE2 = false;\r\n /** Defines whether clip plane 3 is enabled */\r\n public CLIPPLANE3 = false;\r\n /** Defines whether clip plane 4 is enabled */\r\n public CLIPPLANE4 = false;\r\n /** Defines whether clip plane 5 is enabled */\r\n public CLIPPLANE5 = false;\r\n /** Defines whether clip plane 6 is enabled */\r\n public CLIPPLANE6 = false;\r\n /** Defines the spherical harmonics degree */\r\n public SH_DEGREE = 0;\r\n /** Defines whether compensation is applied */\r\n public COMPENSATION = false;\r\n /** Defines whether this is a compound splat */\r\n public IS_COMPOUND = false;\r\n /** Defines the maximum number of parts (computed from engine caps at runtime) */\r\n public MAX_PART_COUNT = GaussianSplattingMaxPartCount;\r\n /** Defines whether SOG raw-texture in-shader dequantization is enabled */\r\n public USE_SOG = false;\r\n /** Defines whether SOG v2 (codebook) dequantization is enabled */\r\n public USE_SOG_V2 = false;\r\n\r\n /**\r\n * Constructor of the defines.\r\n * @param externalProperties External properties (e.g. from material plugins) to add to the defines.\r\n */\r\n constructor(externalProperties?: { [name: string]: { type: string; default: any } }) {\r\n super(externalProperties);\r\n this.rebuild();\r\n }\r\n\r\n /**\r\n * Checks if a define is part of the generated define list.\r\n * @param name define name to check\r\n * @returns true if the define exists\r\n */\r\n public hasDefine(name: string): boolean {\r\n return this._keys.indexOf(name) !== -1;\r\n }\r\n}\r\n\r\ninterface IGaussianSplattingPartMotionHistory {\r\n configuration: GeometryRenderingConfiguration;\r\n currentPartWorldMatrices: Matrix[];\r\n previousPartWorldData: Float32Array;\r\n lastUpdateFrameId: number;\r\n}\r\n\r\n/**\r\n * GaussianSplattingMaterial material used to render Gaussian Splatting\r\n * @experimental\r\n */\r\nexport class GaussianSplattingMaterial extends PushMaterial {\r\n /**\r\n * Instantiates a Gaussian Splatting Material in the given scene\r\n * @param name The friendly name of the material\r\n * @param scene The scene to add the material to\r\n */\r\n constructor(name: string, scene?: Scene) {\r\n super(name, scene);\r\n\r\n this.backFaceCulling = false;\r\n this.shadowDepthWrapper = GaussianSplattingMaterial._MakeGaussianSplattingShadowDepthWrapper(scene!, this.shaderLanguage);\r\n }\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material\r\n */\r\n public static KernelSize: number = 0.3;\r\n\r\n /**\r\n * Compensation\r\n */\r\n public static Compensation: boolean = false;\r\n\r\n /**\r\n * Minimum projected splat size, in pixels, below which a splat is discarded (default 0 = disabled).\r\n * Matches PlayCanvas `minPixelSize`. Applies to all Gaussian Splatting meshes using this material.\r\n */\r\n public static MinPixelSize: number = 0;\r\n\r\n /**\r\n * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value\r\n */\r\n public kernelSize = GaussianSplattingMaterial.KernelSize;\r\n\r\n /**\r\n * Minimum projected splat size, in pixels, below which a splat is discarded (default 0 = disabled).\r\n */\r\n public minPixelSize = GaussianSplattingMaterial.MinPixelSize;\r\n private _compensation = GaussianSplattingMaterial.Compensation;\r\n\r\n // set to true when material defines are dirty\r\n private _isDirty = false;\r\n\r\n /**\r\n * Set compensation default value is `GaussianSplattingMaterial.Compensation`\r\n */\r\n public set compensation(value: boolean) {\r\n this._isDirty = this._isDirty != value;\r\n this._compensation = value;\r\n }\r\n\r\n /**\r\n * Get compensation\r\n */\r\n public get compensation(): boolean {\r\n return this._compensation;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n */\r\n public override get hasRenderTargetTextures(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha test mode.\r\n * @returns false\r\n */\r\n public override needAlphaTesting(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Specifies whether or not this material should be rendered in alpha blend mode.\r\n * @returns true\r\n */\r\n public override needAlphaBlending(): boolean {\r\n return true;\r\n }\r\n\r\n protected static _Attribs = [VertexBuffer.PositionKind, \"splatIndex0\", \"splatIndex1\", \"splatIndex2\", \"splatIndex3\"];\r\n protected static _Samplers = [\r\n \"covariancesATexture\",\r\n \"covariancesBTexture\",\r\n \"centersTexture\",\r\n \"colorsTexture\",\r\n \"shTexture0\",\r\n \"shTexture1\",\r\n \"shTexture2\",\r\n \"shTexture3\",\r\n \"shTexture4\",\r\n \"partIndicesTexture\",\r\n \"sogQuatsTexture\",\r\n \"sogShNCentroidsTexture\",\r\n \"sogShNLabelsTexture\",\r\n \"sogCodebookTexture\",\r\n ];\r\n protected static _UniformBuffers = [\"Scene\", \"Mesh\"];\r\n protected static _VoxelUniforms = [\r\n \"world\",\r\n \"dataTextureSize\",\r\n \"alpha\",\r\n \"invWorldScale\",\r\n \"viewMatrix\",\r\n \"nearPlane\",\r\n \"farPlane\",\r\n \"stepSize\",\r\n \"partWorld\",\r\n \"partVisibility\",\r\n \"axis\",\r\n ];\r\n protected static _VoxelSamplers = [\"rotationsATexture\", \"rotationsBTexture\", \"rotationScaleTexture\", \"centersTexture\", \"colorsTexture\", \"partIndicesTexture\"];\r\n protected static _Uniforms = [\r\n \"world\",\r\n \"view\",\r\n \"projection\",\r\n \"inverseProjection\",\r\n \"vFogInfos\",\r\n \"vFogColor\",\r\n \"logarithmicDepthConstant\",\r\n \"invViewport\",\r\n \"dataTextureSize\",\r\n \"focal\",\r\n \"eyePosition\",\r\n \"kernelSize\",\r\n \"minPixelSize\",\r\n \"alpha\",\r\n \"depthValues\",\r\n \"geometryDepthRange\",\r\n \"geometryZeroAlphaDiscard\",\r\n \"partWorld\",\r\n \"previousPartWorld\",\r\n \"partVisibility\",\r\n \"sogMeansMin\",\r\n \"sogMeansMax\",\r\n \"sogScalesMin\",\r\n \"sogScalesMax\",\r\n \"sogSh0Min\",\r\n \"sogSh0Max\",\r\n \"sogShnMin\",\r\n \"sogShnMax\",\r\n \"sogShCoeffCount\",\r\n ];\r\n private _sourceMesh: GaussianSplattingMesh | null = null;\r\n private _inverseProjection = Matrix.Identity();\r\n private _geometryProjectionUpdateFlag = -1;\r\n private _partMotionHistory = new Map<number, IGaussianSplattingPartMotionHistory>();\r\n private _renderPassObserver: Nullable<Observer<number>> = null;\r\n\r\n private static _BindViewportAndFocal(effect: Effect, camera: Camera | null, renderWidth: number, renderHeight: number, invViewportWidth = renderWidth): void {\r\n effect.setFloat2(\"invViewport\", 1 / invViewportWidth, 1 / renderHeight);\r\n\r\n if (camera) {\r\n const projection = camera.getProjectionMatrix();\r\n effect.setFloat2(\"focal\", (renderWidth * projection.m[0]) / 2, (renderHeight * projection.m[5]) / 2);\r\n } else {\r\n effect.setFloat2(\"focal\", 1000, 1000);\r\n }\r\n }\r\n\r\n /**\r\n * Checks whether the material is ready to be rendered for a given mesh.\r\n * @param mesh The mesh to render\r\n * @param subMesh The submesh to check against\r\n * @returns true if all the dependencies are ready (Textures, Effects...)\r\n */\r\n public override isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean {\r\n const useInstances = true;\r\n\r\n const drawWrapper = subMesh._drawWrapper;\r\n let defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n\r\n if (defines && this._isDirty) {\r\n defines.markAsUnprocessed();\r\n }\r\n\r\n if (drawWrapper.effect && this.isFrozen) {\r\n if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) {\r\n return true;\r\n }\r\n }\r\n\r\n if (!subMesh.materialDefines || this.pluginManager) {\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.GetDefineNames, this._eventInfo);\r\n const defineNames = this._eventInfo.defineNames;\r\n const needsNewDefines = !subMesh.materialDefines || (defineNames && Object.keys(defineNames).some((name) => !defines.hasDefine(name)));\r\n if (needsNewDefines) {\r\n defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines(defineNames);\r\n }\r\n }\r\n\r\n const scene = this.getScene();\r\n\r\n if (this._isReadyForSubMesh(subMesh)) {\r\n return true;\r\n }\r\n\r\n // Check plugin readiness\r\n this._eventInfo.isReadyForSubMesh = true;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventIsReadyForSubMesh(this._eventInfo);\r\n\r\n if (!this._eventInfo.isReadyForSubMesh) {\r\n return false;\r\n }\r\n\r\n if (!this._sourceMesh) {\r\n return false;\r\n }\r\n\r\n const engine = scene.getEngine();\r\n const gsMesh = this._sourceMesh;\r\n\r\n MaterialHelperGeometryRendering.PrepareDefines(engine.currentRenderPassId, gsMesh, defines);\r\n\r\n // Misc.\r\n PrepareDefinesForMisc(\r\n mesh,\r\n scene,\r\n this._useLogarithmicDepth,\r\n this.pointsCloud,\r\n this.fogEnabled,\r\n false,\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._isVertexOutputInvariant\r\n );\r\n\r\n // Values that need to be evaluated on every frame\r\n PrepareDefinesForFrameBoundValues(scene, engine, this, defines, useInstances, null, true);\r\n\r\n // External config\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.mesh = mesh;\r\n this._callbackPluginEventPrepareDefinesBeforeAttributes(this._eventInfo);\r\n\r\n // Attribs\r\n PrepareDefinesForAttributes(mesh, defines, false, false);\r\n\r\n // External config\r\n this._callbackPluginEventPrepareDefines(this._eventInfo);\r\n\r\n // SH is disabled for webGL1\r\n if (engine.version > 1 || engine.isWebGPU) {\r\n defines[\"SH_DEGREE\"] = gsMesh.shDegree;\r\n }\r\n\r\n defines[\"IS_COMPOUND\"] = gsMesh.isCompound;\r\n defines[\"MAX_PART_COUNT\"] = GetGaussianSplattingMaxPartCount(engine);\r\n if (gsMesh.isCompound && (defines.PREPASS_VELOCITY || defines.PREPASS_VELOCITY_LINEAR)) {\r\n // Reserve the regular 40 vectors plus projection/history matrices and the depth range.\r\n defines.MAX_PART_COUNT = Math.min(defines.MAX_PART_COUNT, Math.max(1, Math.floor((engine.getCaps().maxVertexUniformVectors - 53) / 9)));\r\n if (gsMesh.partCount > defines.MAX_PART_COUNT) {\r\n throw new Error(`GaussianSplattingMaterial \"${this.name}\": geometry velocity supports at most ${defines.MAX_PART_COUNT} compound parts on this engine`);\r\n }\r\n }\r\n defines[\"USE_SOG\"] = gsMesh.useSog;\r\n defines[\"USE_SOG_V2\"] = gsMesh.useSog && gsMesh.sogParams?.version === 2;\r\n\r\n // Compensation\r\n const splatMaterial = gsMesh.material as GaussianSplattingMaterial;\r\n defines[\"COMPENSATION\"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation;\r\n\r\n // Get correct effect\r\n if (defines.isDirty) {\r\n defines.markAsProcessed();\r\n scene.resetCachedMaterial();\r\n\r\n //Attributes\r\n PrepareAttributesForInstances(GaussianSplattingMaterial._Attribs, defines);\r\n\r\n const attribs = GaussianSplattingMaterial._Attribs.slice();\r\n const uniforms = GaussianSplattingMaterial._Uniforms.slice();\r\n const samplers = GaussianSplattingMaterial._Samplers.slice();\r\n const uniformBuffers = GaussianSplattingMaterial._UniformBuffers.slice();\r\n\r\n MaterialHelperGeometryRendering.AddUniformsAndSamplers(uniforms, samplers);\r\n\r\n PrepareUniformsAndSamplersList(<IEffectCreationOptions>{\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: defines,\r\n });\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n // Let plugin manager prepare its uniform/sampler/ubo lists\r\n if (!this._uniformBufferLayoutBuilt) {\r\n this.buildUniformLayout();\r\n }\r\n\r\n // Prepare plugin effect\r\n this._eventInfo.fallbackRank = 0;\r\n this._eventInfo.defines = defines;\r\n this._eventInfo.attributes = attribs;\r\n this._eventInfo.uniforms = uniforms;\r\n this._eventInfo.samplers = samplers;\r\n this._eventInfo.uniformBuffersNames = uniformBuffers;\r\n this._eventInfo.customCode = undefined;\r\n this._eventInfo.mesh = mesh;\r\n\r\n this._callbackPluginEventGeneric(MaterialPluginEvent.PrepareEffect, this._eventInfo);\r\n\r\n const join = defines.toString();\r\n const effect = scene.getEngine().createEffect(\r\n \"gaussianSplatting\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: uniformBuffers,\r\n samplers: samplers,\r\n defines: join,\r\n onCompiled: this.onCompiled,\r\n onError: this.onError,\r\n indexParameters: { SCENE_MRT_COUNT: defines.SCENE_MRT_COUNT },\r\n processCodeAfterIncludes: this._eventInfo.customCode,\r\n multiTarget: defines.PREPASS,\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplatting.fragment\"), import(\"../../ShadersWGSL/gaussianSplatting.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplatting.fragment\"), import(\"../../Shaders/gaussianSplatting.vertex\")]);\r\n }\r\n },\r\n },\r\n engine\r\n );\r\n subMesh.setEffect(effect, defines, this._materialContext);\r\n }\r\n\r\n if (!subMesh.effect || !subMesh.effect.isReady()) {\r\n return false;\r\n }\r\n\r\n defines._renderId = scene.getRenderId();\r\n drawWrapper._wasPreviouslyReady = true;\r\n drawWrapper._wasPreviouslyUsingInstances = useInstances;\r\n this._isDirty = false;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * GaussianSplattingMaterial belongs to a single mesh\r\n * @param mesh mesh this material belongs to\r\n */\r\n public setSourceMesh(mesh: GaussianSplattingMesh) {\r\n if (this._sourceMesh !== mesh) {\r\n this._partMotionHistory.clear();\r\n }\r\n this._sourceMesh = mesh;\r\n }\r\n\r\n /**\r\n * Gets the source mesh of this material, which is the Gaussian Splatting mesh that provides the data for rendering\r\n * @returns The Gaussian Splatting mesh that provides the data for rendering, or null if not set\r\n */\r\n public getSourceMesh(): GaussianSplattingMesh | null {\r\n return this._sourceMesh;\r\n }\r\n\r\n /**\r\n * Bind material effect for a specific Gaussian Splatting mesh\r\n * @param mesh Gaussian splatting mesh\r\n * @param effect Splatting material or node material\r\n * @param scene scene that contains mesh and camera used for rendering\r\n */\r\n public static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const camera = scene.activeCamera;\r\n\r\n const renderWidth = engine.getRenderWidth() * (camera?.viewport.width ?? 1);\r\n const renderHeight = engine.getRenderHeight() * (camera?.viewport.height ?? 1);\r\n\r\n const material = mesh.material;\r\n const gsMaterial = material instanceof GaussianSplattingMaterial ? material : null;\r\n const gsMesh = gsMaterial?._sourceMesh ?? (mesh.reservedDataStore?._gaussianSplattingSourceMesh as GaussianSplattingMesh | undefined);\r\n\r\n if (!gsMesh) {\r\n return;\r\n }\r\n\r\n // check if rigcamera, get number of rigs\r\n const numberOfRigs = camera?.rigParent?.rigCameras.length || 1;\r\n\r\n GaussianSplattingMaterial._BindViewportAndFocal(effect, camera, renderWidth, renderHeight, renderWidth / numberOfRigs);\r\n effect.setFloat(\"kernelSize\", gsMaterial?.kernelSize || GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"minPixelSize\", gsMaterial ? gsMaterial.minPixelSize : GaussianSplattingMaterial.MinPixelSize);\r\n effect.setFloat(\"alpha\", material?.alpha ?? 1);\r\n scene.bindEyePosition(effect, \"eyePosition\", true);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.useSog) {\r\n GaussianSplattingMaterial._BindSogUniforms(gsMesh, effect);\r\n } else if (gsMesh.shTextures) {\r\n for (let i = 0; i < gsMesh.shTextures.length; i++) {\r\n effect.setTexture(`shTexture${i}`, gsMesh.shTextures[i]);\r\n }\r\n }\r\n\r\n // Bind part indices texture, if the\r\n gsMesh.bindExtraEffectUniforms(effect);\r\n }\r\n }\r\n\r\n private _bindGeometryRendering(effect: Effect, defines: GaussianSplattingMaterialDefines, mustRebind: boolean): void {\r\n const sourceMesh = this._sourceMesh;\r\n if (!sourceMesh || !defines.PREPASS) {\r\n return;\r\n }\r\n\r\n const scene = this.getScene();\r\n const engine = scene.getEngine();\r\n const renderPassId = engine.currentRenderPassId;\r\n const configuration = MaterialHelperGeometryRendering.GetConfiguration(renderPassId);\r\n if (!configuration) {\r\n return;\r\n }\r\n\r\n MaterialHelperGeometryRendering.Bind(renderPassId, effect, sourceMesh, sourceMesh.getWorldMatrix(), this);\r\n MaterialHelperGeometryRendering._BindZeroAlphaDiscard(engine, effect);\r\n\r\n const camera = scene.activeCamera;\r\n if (camera) {\r\n if (defines.PREPASS_POSITION || defines.PREPASS_LOCAL_POSITION || defines.PREPASS_VELOCITY || defines.PREPASS_VELOCITY_LINEAR) {\r\n const projection = camera.getProjectionMatrix();\r\n if (projection.updateFlag !== this._geometryProjectionUpdateFlag) {\r\n projection.invertToRef(this._inverseProjection);\r\n this._geometryProjectionUpdateFlag = projection.updateFlag;\r\n }\r\n effect.setMatrix(\"inverseProjection\", this._inverseProjection);\r\n }\r\n if (defines.PREPASS_NORMALIZED_VIEW_DEPTH) {\r\n effect.setFloat2(\"geometryDepthRange\", camera.minZ, camera.maxZ);\r\n }\r\n }\r\n\r\n if (!mustRebind) {\r\n sourceMesh.bindExtraEffectUniforms(effect);\r\n }\r\n\r\n if (!sourceMesh.isCompound || (!defines.PREPASS_VELOCITY && !defines.PREPASS_VELOCITY_LINEAR)) {\r\n return;\r\n }\r\n\r\n const partCount = sourceMesh.partCount;\r\n let history = this._partMotionHistory.get(renderPassId);\r\n if (!history || history.configuration !== configuration || history.currentPartWorldMatrices.length !== partCount) {\r\n if (partCount > defines.MAX_PART_COUNT) {\r\n throw new Error(`GaussianSplattingMaterial \"${this.name}\": geometry velocity supports at most ${defines.MAX_PART_COUNT} compound parts on this engine`);\r\n }\r\n const currentPartWorldMatrices = new Array<Matrix>(partCount);\r\n for (let i = 0; i < partCount; i++) {\r\n currentPartWorldMatrices[i] = sourceMesh.getWorldMatrixForPart(i).clone();\r\n }\r\n history = {\r\n configuration,\r\n currentPartWorldMatrices,\r\n previousPartWorldData: new Float32Array(partCount * 16),\r\n lastUpdateFrameId: -1,\r\n };\r\n this._partMotionHistory.set(renderPassId, history);\r\n this._renderPassObserver ??= (engine._onReleaseRenderPassObservable ??= new Observable<number>()).add((id) => this._partMotionHistory.delete(id));\r\n }\r\n\r\n if (history.lastUpdateFrameId !== engine.frameId) {\r\n const consecutiveFrame = history.lastUpdateFrameId === engine.frameId - 1;\r\n for (let i = 0; i < partCount; i++) {\r\n const previous = consecutiveFrame ? history.currentPartWorldMatrices[i] : sourceMesh.getWorldMatrixForPart(i);\r\n previous.toArray(history.previousPartWorldData, i * 16);\r\n }\r\n history.lastUpdateFrameId = engine.frameId;\r\n }\r\n effect.setMatrices(\"previousPartWorld\", history.previousPartWorldData);\r\n for (let i = 0; i < partCount; i++) {\r\n history.currentPartWorldMatrices[i].copyFrom(sourceMesh.getWorldMatrixForPart(i));\r\n }\r\n }\r\n\r\n /**\r\n * Releases the material and its render-pass motion histories.\r\n * @param forceDisposeEffect whether associated effects should be disposed\r\n * @param forceDisposeTextures whether associated textures should be disposed\r\n * @param notBoundToMesh whether mesh references can be left unchanged\r\n */\r\n public override dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void {\r\n this.getScene().getEngine()._onReleaseRenderPassObservable?.remove(this._renderPassObserver);\r\n this._renderPassObserver = null;\r\n this._partMotionHistory.clear();\r\n super.dispose(forceDisposeEffect, forceDisposeTextures, notBoundToMesh);\r\n }\r\n\r\n /**\r\n * Bind SOG dequantization uniforms + raw textures.\r\n * @internal\r\n */\r\n protected static _BindSogUniforms(gsMesh: GaussianSplattingMesh, effect: Effect): void {\r\n const p = gsMesh.sogParams;\r\n if (!p) {\r\n return;\r\n }\r\n effect.setTexture(\"sogQuatsTexture\", gsMesh.rotationsATexture);\r\n if (gsMesh.shTextures && gsMesh.shTextures.length >= 2) {\r\n effect.setTexture(\"sogShNCentroidsTexture\", gsMesh.shTextures[0]);\r\n effect.setTexture(\"sogShNLabelsTexture\", gsMesh.shTextures[1]);\r\n }\r\n if (p.codebookTexture) {\r\n effect.setTexture(\"sogCodebookTexture\", p.codebookTexture);\r\n }\r\n effect.setFloat3(\"sogMeansMin\", p.meansMin[0], p.meansMin[1], p.meansMin[2]);\r\n effect.setFloat3(\"sogMeansMax\", p.meansMax[0], p.meansMax[1], p.meansMax[2]);\r\n if (p.scalesMin && p.scalesMax) {\r\n effect.setFloat3(\"sogScalesMin\", p.scalesMin[0], p.scalesMin[1], p.scalesMin[2]);\r\n effect.setFloat3(\"sogScalesMax\", p.scalesMax[0], p.scalesMax[1], p.scalesMax[2]);\r\n }\r\n if (p.sh0Min && p.sh0Max) {\r\n effect.setFloat4(\"sogSh0Min\", p.sh0Min[0], p.sh0Min[1], p.sh0Min[2], p.sh0Min[3]);\r\n effect.setFloat4(\"sogSh0Max\", p.sh0Max[0], p.sh0Max[1], p.sh0Max[2], p.sh0Max[3]);\r\n }\r\n effect.setFloat(\"sogShnMin\", p.shnMin ?? 0);\r\n effect.setFloat(\"sogShnMax\", p.shnMax ?? 0);\r\n effect.setFloat(\"sogShCoeffCount\", p.shCoeffCount ?? 0);\r\n }\r\n /**\r\n * Binds the submesh to this material by preparing the effect and shader to draw\r\n * @param world defines the world transformation matrix\r\n * @param mesh defines the mesh containing the submesh\r\n * @param subMesh defines the submesh to bind the material to\r\n */\r\n public override bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void {\r\n const scene = this.getScene();\r\n\r\n const defines = <GaussianSplattingMaterialDefines>subMesh.materialDefines;\r\n if (!defines) {\r\n return;\r\n }\r\n\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n this._activeEffect = effect;\r\n\r\n // Matrices Mesh.\r\n mesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n mesh.transferToEffect(world);\r\n\r\n // Bind data\r\n const mustRebind = this._mustRebind(scene, effect, subMesh, mesh.visibility);\r\n\r\n if (mustRebind) {\r\n this.bindView(effect);\r\n this.bindViewProjection(effect);\r\n GaussianSplattingMaterial.BindEffect(mesh, this._activeEffect, scene);\r\n // Clip plane\r\n BindClipPlane(effect, this, scene);\r\n } else if (scene.getEngine()._features.needToAlwaysBindUniformBuffers) {\r\n this._needToBindSceneUbo = true;\r\n }\r\n\r\n this._bindGeometryRendering(effect, defines, mustRebind);\r\n\r\n // Fog\r\n BindFogParameters(scene, mesh, effect);\r\n\r\n // Log. depth\r\n if (this.useLogarithmicDepth) {\r\n BindLogDepth(defines, effect, scene);\r\n }\r\n\r\n // Bind plugins\r\n this._eventInfo.subMesh = subMesh;\r\n this._callbackPluginEventBindForSubMesh(this._eventInfo);\r\n\r\n this._afterBind(mesh, this._activeEffect, subMesh);\r\n }\r\n\r\n protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void {\r\n const engine = scene.getEngine();\r\n const effect = shaderMaterial.getEffect()!;\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n shaderMaterial.bindView(effect);\r\n shaderMaterial.bindViewProjection(effect);\r\n\r\n const renderWidth = engine.getRenderWidth() * camera.viewport.width;\r\n const renderHeight = engine.getRenderHeight() * camera.viewport.height;\r\n GaussianSplattingMaterial._BindViewportAndFocal(effect, camera, renderWidth, renderHeight);\r\n effect.setFloat(\"kernelSize\", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize);\r\n effect.setFloat(\"minPixelSize\", gsMaterial ? gsMaterial.minPixelSize : GaussianSplattingMaterial.MinPixelSize);\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n\r\n let minZ: number, maxZ: number;\r\n\r\n const cameraIsOrtho = camera.mode === Camera.ORTHOGRAPHIC_CAMERA;\r\n if (cameraIsOrtho) {\r\n minZ = !engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : 1;\r\n } else {\r\n minZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? camera.minZ : engine.isNDCHalfZRange ? 0 : camera.minZ;\r\n maxZ = engine.useReverseDepthBuffer && engine.isNDCHalfZRange ? 0 : camera.maxZ;\r\n }\r\n\r\n effect.setFloat2(\"depthValues\", minZ, minZ + maxZ);\r\n\r\n if (gsMesh.covariancesATexture) {\r\n const textureSize = gsMesh.covariancesATexture.getSize();\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n\r\n effect.setTexture(\"covariancesATexture\", gsMesh.covariancesATexture);\r\n effect.setTexture(\"covariancesBTexture\", gsMesh.covariancesBTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n gsMesh.bindExtraEffectUniforms(effect);\r\n }\r\n }\r\n\r\n private _voxelMissingTextureWarned = new Set<number>();\r\n private _voxelPartWorldData = new Float32Array(0);\r\n private readonly _voxelPartVisibilityData: number[] = [];\r\n\r\n protected _bindVoxelEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial): boolean {\r\n if (!gsMesh.rotationsATexture) {\r\n // Attempt to enable rotation/scale texture generation (no-op if already enabled).\r\n // If the mesh is already loaded and splat data is in RAM this triggers updateData() synchronously.\r\n // If the mesh was loaded without keepInRam=true the setter will log an error.\r\n gsMesh.needsRotationScaleTextures = true;\r\n\r\n if (!gsMesh.rotationsATexture) {\r\n // Mesh data was already processed but rotation textures couldn't be generated — warn once.\r\n if (gsMesh.centersTexture && !gsMesh.splatsData && !this._voxelMissingTextureWarned.has(gsMesh.uniqueId)) {\r\n this._voxelMissingTextureWarned.add(gsMesh.uniqueId);\r\n Logger.Error(\r\n \"IBL voxelization: GaussianSplattingMesh rotation/scale textures are not available. \" +\r\n \"Create the mesh either with keepInRam=true or needsRotationScaleTextures=true to enable IBL shadow voxelization.\"\r\n );\r\n }\r\n return false;\r\n }\r\n }\r\n this._voxelMissingTextureWarned.delete(gsMesh.uniqueId);\r\n\r\n const effect = shaderMaterial.getEffect()!;\r\n gsMesh.getMeshUniformBuffer().bindToEffect(effect, \"Mesh\");\r\n\r\n const textureSize = gsMesh.rotationsATexture.getSize();\r\n effect.setFloat(\"alpha\", gsMaterial.alpha);\r\n effect.setFloat2(\"dataTextureSize\", textureSize.width, textureSize.height);\r\n effect.setTexture(\"rotationsATexture\", gsMesh.rotationsATexture);\r\n effect.setTexture(\"rotationsBTexture\", gsMesh.rotationsBTexture);\r\n effect.setTexture(\"rotationScaleTexture\", gsMesh.rotationScaleTexture);\r\n effect.setTexture(\"centersTexture\", gsMesh.centersTexture);\r\n effect.setTexture(\"colorsTexture\", gsMesh.colorsTexture);\r\n\r\n if (gsMesh.partIndicesTexture) {\r\n effect.setTexture(\"partIndicesTexture\", gsMesh.partIndicesTexture);\r\n const partWorldDataLength = gsMesh.partCount * 16;\r\n if (this._voxelPartWorldData.length !== partWorldDataLength) {\r\n this._voxelPartWorldData = new Float32Array(partWorldDataLength);\r\n }\r\n const partWorldData = this._voxelPartWorldData;\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n gsMesh.getWorldMatrixForPart(i).toArray(partWorldData, i * 16);\r\n }\r\n effect.setMatrices(\"partWorld\", partWorldData);\r\n const partVisibilityData = this._voxelPartVisibilityData;\r\n partVisibilityData.length = gsMesh.partCount;\r\n for (let i = 0; i < gsMesh.partCount; i++) {\r\n partVisibilityData[i] = gsMesh.partVisibility[i] ?? 1.0;\r\n }\r\n effect.setArray(\"partVisibility\", partVisibilityData);\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Create a voxel rendering material for a Gaussian Splatting mesh, for use with IBL shadow voxelization.\r\n * The returned ShaderMaterial's onBindObservable binds the GS mesh-side uniforms (textures, alpha, dataTextureSize, part data).\r\n * The caller (e.g. iblShadowsVoxelRenderer) is responsible for setting the per-slab uniforms on the returned material:\r\n * viewMatrix, invWorldScale, nearPlane, farPlane, stepSize.\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param maxDrawBuffers number of draw buffers (MRT outputs) per voxelization slab\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns voxel rendering shader material\r\n */\r\n public makeVoxelRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, maxDrawBuffers: number, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [`#define MAX_DRAW_BUFFERS ${maxDrawBuffers}`];\r\n\r\n defines.push(\"#define IS_FOR_VOXELIZATION\");\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND 1\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingVoxelRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingVoxel\",\r\n fragment: \"gaussianSplattingVoxel\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._VoxelUniforms,\r\n samplers: GaussianSplattingMaterial._VoxelSamplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n // WebGPU accumulates non-binary voxel opacity via atomicMax into this storage buffer.\r\n storageBuffers: shaderLanguage === ShaderLanguage.WGSL ? [\"voxelOpacityBuffer\"] : [],\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: false,\r\n extraInitializationsAsync: async () => {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../../ShadersWGSL/gaussianSplattingVoxel.vertex\"), import(\"../../ShadersWGSL/gaussianSplattingVoxel.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/gaussianSplattingVoxel.vertex\"), import(\"../../Shaders/gaussianSplattingVoxel.fragment\")]);\r\n }\r\n },\r\n }\r\n );\r\n shaderMaterial.cullBackFaces = false;\r\n shaderMaterial.backFaceCulling = false;\r\n shaderMaterial.depthFunction = Engine.ALWAYS;\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n const gsMesh = mesh as GaussianSplattingMesh;\r\n this._bindVoxelEffectUniforms(gsMesh, gsMaterial, shaderMaterial);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n /**\r\n * Create a depth rendering material for a Gaussian Splatting mesh\r\n * @param scene scene it belongs to\r\n * @param shaderLanguage GLSL or WGSL\r\n * @param alphaBlendedDepth whether to enable alpha blended depth rendering\r\n * @param compoundMesh whether the mesh is a compound mesh\r\n * @returns depth rendering shader material\r\n */\r\n public makeDepthRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, alphaBlendedDepth: boolean = false, compoundMesh: boolean = false): ShaderMaterial {\r\n const defines = [\"#define DEPTH_RENDER\"];\r\n\r\n if (alphaBlendedDepth) {\r\n defines.push(\"#define ALPHA_BLENDED_DEPTH\");\r\n }\r\n\r\n if (compoundMesh) {\r\n defines.push(\"#define IS_COMPOUND 1\");\r\n defines.push(`#define MAX_PART_COUNT ${GetGaussianSplattingMaxPartCount(scene.getEngine())}`);\r\n }\r\n\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepthRender\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n defines: defines,\r\n needAlphaBlending: alphaBlendedDepth,\r\n }\r\n );\r\n shaderMaterial.doNotSerialize = true;\r\n shaderMaterial.backFaceCulling = false;\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n // Use the source mesh from the material for GS-specific properties (textures, etc.),\r\n // since the bound mesh may be a camera mesh proxy without those properties.\r\n const gsMesh = (gsMaterial?.getSourceMesh() ?? mesh) as GaussianSplattingMesh;\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n return shaderMaterial;\r\n }\r\n\r\n protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper {\r\n const shaderMaterial = new ShaderMaterial(\r\n \"gaussianSplattingDepth\",\r\n scene,\r\n {\r\n vertex: \"gaussianSplattingDepth\",\r\n fragment: \"gaussianSplattingDepth\",\r\n },\r\n {\r\n attributes: GaussianSplattingMaterial._Attribs,\r\n uniforms: GaussianSplattingMaterial._Uniforms,\r\n samplers: GaussianSplattingMaterial._Samplers,\r\n uniformBuffers: GaussianSplattingMaterial._UniformBuffers,\r\n shaderLanguage: shaderLanguage,\r\n }\r\n );\r\n shaderMaterial.doNotSerialize = true;\r\n shaderMaterial.backFaceCulling = false;\r\n\r\n const shadowDepthWrapper = new ShadowDepthWrapper(shaderMaterial, scene, {\r\n standalone: true,\r\n });\r\n\r\n shaderMaterial.onBindObservable.add((mesh: AbstractMesh) => {\r\n const gsMaterial = mesh.material as GaussianSplattingMaterial;\r\n // Use the source mesh from the material for GS-specific properties (textures, etc.),\r\n // since the bound mesh may be a camera mesh proxy without those properties.\r\n const gsMesh = (gsMaterial?.getSourceMesh() ?? mesh) as GaussianSplattingMesh;\r\n\r\n GaussianSplattingMaterial._BindEffectUniforms(gsMesh, gsMaterial, shaderMaterial, scene);\r\n });\r\n\r\n return shadowDepthWrapper;\r\n }\r\n\r\n /**\r\n * Clones the material.\r\n * @param name The cloned name.\r\n * @returns The cloned material.\r\n */\r\n public override clone(name: string): GaussianSplattingMaterial {\r\n const clone = SerializationHelper.Clone(() => new GaussianSplattingMaterial(name, this.getScene()), this);\r\n\r\n clone.id = name;\r\n clone.name = name;\r\n\r\n this._clonePlugins(clone, \"\");\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes the current material to its JSON representation.\r\n * @returns The JSON representation.\r\n */\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.customType = \"BABYLON.GaussianSplattingMaterial\";\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Gets the class name of the material\r\n * @returns \"GaussianSplattingMaterial\"\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingMaterial\";\r\n }\r\n\r\n /**\r\n * Parse a JSON input to create back a Gaussian Splatting material.\r\n * @param source The JSON data to parse\r\n * @param scene The scene to create the parsed material in\r\n * @param rootUrl The root url of the assets the material depends upon\r\n * @returns the instantiated GaussianSplattingMaterial.\r\n */\r\n public static override Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial {\r\n const material = SerializationHelper.Parse(() => new GaussianSplattingMaterial(source.name, scene), source, scene, rootUrl);\r\n\r\n Material._ParsePlugins(source, material, scene, rootUrl);\r\n\r\n return material;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingMaterial.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingMaterial(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingMaterial\", GaussianSplattingMaterial);\r\n}\r\n"]}
@@ -2,7 +2,7 @@
2
2
  import { __esDecorate, __runInitializers } from "../../tslib.es6.js";
3
3
  import { serialize } from "../../Misc/decorators.js";
4
4
  import { MaterialPluginBase } from "../materialPluginBase.pure.js";
5
- import { GetGaussianSplattingMaxPartCount } from "./gaussianSplattingMaterial.pure.js";
5
+ import { GetGaussianSplattingMaxPartCount, GetPartIndexVaryingDeclaration } from "./gaussianSplattingMaterial.pure.js";
6
6
  import { RegisterClass } from "../../Misc/typeStore.js";
7
7
  /**
8
8
  * Plugin for GaussianSplattingMaterial that replaces per-splat colors with a
@@ -106,7 +106,7 @@ let GaussianSplattingSolidColorMaterialPlugin = (() => {
106
106
  _getCustomCodeGLSL(shaderType, maxPartCount) {
107
107
  if (shaderType === "vertex") {
108
108
  return {
109
- CUSTOM_VERTEX_DEFINITIONS: `varying float vPartIndex;`,
109
+ CUSTOM_VERTEX_DEFINITIONS: GetPartIndexVaryingDeclaration(0 /* ShaderLanguage.GLSL */),
110
110
  CUSTOM_VERTEX_UPDATE: `
111
111
  #if IS_COMPOUND
112
112
  vPartIndex = float(splat.partIndex);
@@ -119,7 +119,7 @@ let GaussianSplattingSolidColorMaterialPlugin = (() => {
119
119
  else if (shaderType === "fragment") {
120
120
  return {
121
121
  CUSTOM_FRAGMENT_DEFINITIONS: `
122
- varying float vPartIndex;
122
+ ${GetPartIndexVaryingDeclaration(0 /* ShaderLanguage.GLSL */)}
123
123
  uniform float solidColorEnabled;
124
124
  uniform vec3 partColors[${maxPartCount}];
125
125
  `,
@@ -136,7 +136,7 @@ if (solidColorEnabled > 0.5) {
136
136
  _getCustomCodeWGSL(shaderType, maxPartCount) {
137
137
  if (shaderType === "vertex") {
138
138
  return {
139
- CUSTOM_VERTEX_DEFINITIONS: `varying vPartIndex: f32;`,
139
+ CUSTOM_VERTEX_DEFINITIONS: GetPartIndexVaryingDeclaration(1 /* ShaderLanguage.WGSL */),
140
140
  CUSTOM_VERTEX_UPDATE: `
141
141
  #if IS_COMPOUND
142
142
  vertexOutputs.vPartIndex = f32(splat.partIndex);
@@ -149,7 +149,7 @@ if (solidColorEnabled > 0.5) {
149
149
  else if (shaderType === "fragment") {
150
150
  return {
151
151
  CUSTOM_FRAGMENT_DEFINITIONS: `
152
- varying vPartIndex: f32;
152
+ ${GetPartIndexVaryingDeclaration(1 /* ShaderLanguage.WGSL */)}
153
153
  uniform solidColorEnabled: f32;
154
154
  uniform partColors: array<vec3f, ${maxPartCount}>;
155
155
  `,
@@ -1 +1 @@
1
- {"version":3,"file":"gaussianSplattingSolidColorMaterialPlugin.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { type AbstractEngine } from \"../../Engines/abstractEngine.pure\";\r\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\r\nimport { type UniformBuffer } from \"../uniformBuffer\";\r\nimport { type MaterialDefines } from \"../materialDefines\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { type Color3 } from \"../../Maths/math.color.pure\";\r\nimport { MaterialPluginBase } from \"../materialPluginBase.pure\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport { GetGaussianSplattingMaxPartCount, type GaussianSplattingMaterial } from \"./gaussianSplattingMaterial.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\n\r\n/**\r\n * Plugin for GaussianSplattingMaterial that replaces per-splat colors with a\r\n * solid color per compound-mesh part. Each part index maps to a single Color3\r\n * value, which is looked up in a uniform array in the fragment shader.\r\n */\r\nexport class GaussianSplattingSolidColorMaterialPlugin extends MaterialPluginBase {\r\n private _partColors: Color3[];\r\n private _maxPartCount: number;\r\n private _isEnabled = true;\r\n private readonly _partColorArray: number[] = [];\r\n /**\r\n * Whether the solid-color override is active. When false, splats\r\n * render with their original per-splat colors.\r\n * Toggled via a shader uniform so no recompilation is required.\r\n */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._onIsEnabledChanged();\r\n }\r\n\r\n /** @internal */\r\n public _onIsEnabledChanged(): void {\r\n // Intentional no-op: isEnabled is applied via a uniform in\r\n // bindForSubMesh, so no dirty-marking or recompilation is needed.\r\n }\r\n\r\n /**\r\n * Creates a new GaussianSplatSolidColorPlugin.\r\n * @param material The GaussianSplattingMaterial to attach the plugin to.\r\n * @param partColors A map from part index to the solid Color3 for that part.\r\n * @param maxPartCount The maximum number of parts supported. This determines the size of the uniform array.\r\n */\r\n constructor(material: GaussianSplattingMaterial, partColors: Color3[], maxPartCount?: number) {\r\n super(material, \"GaussianSplatSolidColor\", 200);\r\n\r\n this._partColors = partColors;\r\n this._maxPartCount = maxPartCount ?? GetGaussianSplattingMaxPartCount(material.getScene().getEngine());\r\n this._enable(true);\r\n }\r\n\r\n /**\r\n * Updates the part colors dynamically.\r\n * @param partColors A map from part index to the solid Color3 for that part.\r\n */\r\n public updatePartColors(partColors: Color3[]): void {\r\n this._partColors = partColors;\r\n }\r\n\r\n // --- Plugin overrides ---\r\n\r\n /**\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingSolidColorMaterialPlugin\";\r\n }\r\n\r\n /**\r\n * Indicates this plugin supports both GLSL and WGSL.\r\n * @param shaderLanguage the shader language to check\r\n * @returns true for GLSL and WGSL\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Always ready — no textures or async resources to wait on.\r\n * @param _defines the defines\r\n * @param _scene the scene\r\n * @param _engine the engine\r\n * @param _subMesh the submesh\r\n * @returns true\r\n */\r\n public override isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns custom shader code fragments to inject solid-color rendering.\r\n *\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @param shaderLanguage the shader language to use (default: GLSL)\r\n * @returns null or a map of injection point names to code strings\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n const maxPartCount = this._maxPartCount;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return this._getCustomCodeWGSL(shaderType, maxPartCount);\r\n }\r\n return this._getCustomCodeGLSL(shaderType, maxPartCount);\r\n }\r\n\r\n private _getCustomCodeGLSL(shaderType: string, maxPartCount: number): Nullable<{ [pointName: string]: string }> {\r\n if (shaderType === \"vertex\") {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `varying float vPartIndex;`,\r\n CUSTOM_VERTEX_UPDATE: `\r\n#if IS_COMPOUND\r\n vPartIndex = float(splat.partIndex);\r\n#else\r\n vPartIndex = 0.0;\r\n#endif\r\n `,\r\n };\r\n } else if (shaderType === \"fragment\") {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\nvarying float vPartIndex;\r\nuniform float solidColorEnabled;\r\nuniform vec3 partColors[${maxPartCount}];\r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (solidColorEnabled > 0.5) {\r\n int partIdx = int(vPartIndex + 0.5);\r\n finalColor = vec4(partColors[partIdx], finalColor.w);\r\n}\r\n `,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n private _getCustomCodeWGSL(shaderType: string, maxPartCount: number): Nullable<{ [pointName: string]: string }> {\r\n if (shaderType === \"vertex\") {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: `varying vPartIndex: f32;`,\r\n CUSTOM_VERTEX_UPDATE: `\r\n#if IS_COMPOUND\r\n vertexOutputs.vPartIndex = f32(splat.partIndex);\r\n#else\r\n vertexOutputs.vPartIndex = 0.0;\r\n#endif\r\n `,\r\n };\r\n } else if (shaderType === \"fragment\") {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\nvarying vPartIndex: f32;\r\nuniform solidColorEnabled: f32;\r\nuniform partColors: array<vec3f, ${maxPartCount}>;\r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (uniforms.solidColorEnabled > 0.5) {\r\n var partIdx: i32 = i32(fragmentInputs.vPartIndex + 0.5);\r\n finalColor = vec4f(uniforms.partColors[partIdx], finalColor.w);\r\n}\r\n `,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Registers the plugin uniforms with the engine so that\r\n * the Effect can resolve their locations.\r\n * @returns uniform descriptions\r\n */\r\n public override getUniforms(): {\r\n ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>;\r\n vertex?: string;\r\n fragment?: string;\r\n externalUniforms?: string[];\r\n } {\r\n return {\r\n externalUniforms: [\"partColors\", \"solidColorEnabled\"],\r\n };\r\n }\r\n\r\n /**\r\n * Binds the plugin uniforms each frame.\r\n * @param _uniformBuffer the uniform buffer (unused — we bind directly on the effect)\r\n * @param _scene the current scene\r\n * @param _engine the current engine\r\n * @param subMesh the submesh being rendered\r\n */\r\n public override bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void {\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n effect.setFloat(\"solidColorEnabled\", this._isEnabled ? 1.0 : 0.0);\r\n\r\n const colorArray = this._partColorArray;\r\n colorArray.length = 0;\r\n for (let i = 0; i < this._maxPartCount; i++) {\r\n const color = this._partColors[i];\r\n if (color) {\r\n colorArray.push(color.r, color.g, color.b);\r\n } else {\r\n colorArray.push(0, 0, 0);\r\n }\r\n }\r\n\r\n effect.setArray3(\"partColors\", colorArray);\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingSolidColorMaterialPlugin.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingSolidColorMaterialPlugin(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingSolidColorMaterialPlugin\", GaussianSplattingSolidColorMaterialPlugin);\r\n}\r\n"]}
1
+ {"version":3,"file":"gaussianSplattingSolidColorMaterialPlugin.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { type AbstractEngine } from \"../../Engines/abstractEngine.pure\";\r\nimport { type SubMesh } from \"../../Meshes/subMesh.pure\";\r\nimport { type UniformBuffer } from \"../uniformBuffer\";\r\nimport { type MaterialDefines } from \"../materialDefines\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { type Color3 } from \"../../Maths/math.color.pure\";\r\nimport { MaterialPluginBase } from \"../materialPluginBase.pure\";\r\nimport { ShaderLanguage } from \"../shaderLanguage\";\r\nimport { GetGaussianSplattingMaxPartCount, GetPartIndexVaryingDeclaration, type GaussianSplattingMaterial } from \"./gaussianSplattingMaterial.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\n\r\n/**\r\n * Plugin for GaussianSplattingMaterial that replaces per-splat colors with a\r\n * solid color per compound-mesh part. Each part index maps to a single Color3\r\n * value, which is looked up in a uniform array in the fragment shader.\r\n */\r\nexport class GaussianSplattingSolidColorMaterialPlugin extends MaterialPluginBase {\r\n private _partColors: Color3[];\r\n private _maxPartCount: number;\r\n private _isEnabled = true;\r\n private readonly _partColorArray: number[] = [];\r\n /**\r\n * Whether the solid-color override is active. When false, splats\r\n * render with their original per-splat colors.\r\n * Toggled via a shader uniform so no recompilation is required.\r\n */\r\n @serialize()\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._onIsEnabledChanged();\r\n }\r\n\r\n /** @internal */\r\n public _onIsEnabledChanged(): void {\r\n // Intentional no-op: isEnabled is applied via a uniform in\r\n // bindForSubMesh, so no dirty-marking or recompilation is needed.\r\n }\r\n\r\n /**\r\n * Creates a new GaussianSplatSolidColorPlugin.\r\n * @param material The GaussianSplattingMaterial to attach the plugin to.\r\n * @param partColors A map from part index to the solid Color3 for that part.\r\n * @param maxPartCount The maximum number of parts supported. This determines the size of the uniform array.\r\n */\r\n constructor(material: GaussianSplattingMaterial, partColors: Color3[], maxPartCount?: number) {\r\n super(material, \"GaussianSplatSolidColor\", 200);\r\n\r\n this._partColors = partColors;\r\n this._maxPartCount = maxPartCount ?? GetGaussianSplattingMaxPartCount(material.getScene().getEngine());\r\n this._enable(true);\r\n }\r\n\r\n /**\r\n * Updates the part colors dynamically.\r\n * @param partColors A map from part index to the solid Color3 for that part.\r\n */\r\n public updatePartColors(partColors: Color3[]): void {\r\n this._partColors = partColors;\r\n }\r\n\r\n // --- Plugin overrides ---\r\n\r\n /**\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"GaussianSplattingSolidColorMaterialPlugin\";\r\n }\r\n\r\n /**\r\n * Indicates this plugin supports both GLSL and WGSL.\r\n * @param shaderLanguage the shader language to check\r\n * @returns true for GLSL and WGSL\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Always ready — no textures or async resources to wait on.\r\n * @param _defines the defines\r\n * @param _scene the scene\r\n * @param _engine the engine\r\n * @param _subMesh the submesh\r\n * @returns true\r\n */\r\n public override isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Returns custom shader code fragments to inject solid-color rendering.\r\n *\r\n * @param shaderType \"vertex\" or \"fragment\"\r\n * @param shaderLanguage the shader language to use (default: GLSL)\r\n * @returns null or a map of injection point names to code strings\r\n */\r\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n const maxPartCount = this._maxPartCount;\r\n\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return this._getCustomCodeWGSL(shaderType, maxPartCount);\r\n }\r\n return this._getCustomCodeGLSL(shaderType, maxPartCount);\r\n }\r\n\r\n private _getCustomCodeGLSL(shaderType: string, maxPartCount: number): Nullable<{ [pointName: string]: string }> {\r\n if (shaderType === \"vertex\") {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: GetPartIndexVaryingDeclaration(ShaderLanguage.GLSL),\r\n CUSTOM_VERTEX_UPDATE: `\r\n#if IS_COMPOUND\r\n vPartIndex = float(splat.partIndex);\r\n#else\r\n vPartIndex = 0.0;\r\n#endif\r\n `,\r\n };\r\n } else if (shaderType === \"fragment\") {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n${GetPartIndexVaryingDeclaration(ShaderLanguage.GLSL)}\r\nuniform float solidColorEnabled;\r\nuniform vec3 partColors[${maxPartCount}];\r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (solidColorEnabled > 0.5) {\r\n int partIdx = int(vPartIndex + 0.5);\r\n finalColor = vec4(partColors[partIdx], finalColor.w);\r\n}\r\n `,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n private _getCustomCodeWGSL(shaderType: string, maxPartCount: number): Nullable<{ [pointName: string]: string }> {\r\n if (shaderType === \"vertex\") {\r\n return {\r\n CUSTOM_VERTEX_DEFINITIONS: GetPartIndexVaryingDeclaration(ShaderLanguage.WGSL),\r\n CUSTOM_VERTEX_UPDATE: `\r\n#if IS_COMPOUND\r\n vertexOutputs.vPartIndex = f32(splat.partIndex);\r\n#else\r\n vertexOutputs.vPartIndex = 0.0;\r\n#endif\r\n `,\r\n };\r\n } else if (shaderType === \"fragment\") {\r\n return {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n${GetPartIndexVaryingDeclaration(ShaderLanguage.WGSL)}\r\nuniform solidColorEnabled: f32;\r\nuniform partColors: array<vec3f, ${maxPartCount}>;\r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\nif (uniforms.solidColorEnabled > 0.5) {\r\n var partIdx: i32 = i32(fragmentInputs.vPartIndex + 0.5);\r\n finalColor = vec4f(uniforms.partColors[partIdx], finalColor.w);\r\n}\r\n `,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Registers the plugin uniforms with the engine so that\r\n * the Effect can resolve their locations.\r\n * @returns uniform descriptions\r\n */\r\n public override getUniforms(): {\r\n ubo?: Array<{ name: string; size?: number; type?: string; arraySize?: number }>;\r\n vertex?: string;\r\n fragment?: string;\r\n externalUniforms?: string[];\r\n } {\r\n return {\r\n externalUniforms: [\"partColors\", \"solidColorEnabled\"],\r\n };\r\n }\r\n\r\n /**\r\n * Binds the plugin uniforms each frame.\r\n * @param _uniformBuffer the uniform buffer (unused — we bind directly on the effect)\r\n * @param _scene the current scene\r\n * @param _engine the current engine\r\n * @param subMesh the submesh being rendered\r\n */\r\n public override bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void {\r\n const effect = subMesh.effect;\r\n if (!effect) {\r\n return;\r\n }\r\n\r\n effect.setFloat(\"solidColorEnabled\", this._isEnabled ? 1.0 : 0.0);\r\n\r\n const colorArray = this._partColorArray;\r\n colorArray.length = 0;\r\n for (let i = 0; i < this._maxPartCount; i++) {\r\n const color = this._partColors[i];\r\n if (color) {\r\n colorArray.push(color.r, color.g, color.b);\r\n } else {\r\n colorArray.push(0, 0, 0);\r\n }\r\n }\r\n\r\n effect.setArray3(\"partColors\", colorArray);\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for gaussianSplattingSolidColorMaterialPlugin.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterGaussianSplattingSolidColorMaterialPlugin(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(\"BABYLON.GaussianSplattingSolidColorMaterialPlugin\", GaussianSplattingSolidColorMaterialPlugin);\r\n}\r\n"]}
@@ -84,6 +84,7 @@ let FragmentOutputBlock = (() => {
84
84
  state._excludeVariableName("logarithmicDepthConstant");
85
85
  state._excludeVariableName("vFragmentDepth");
86
86
  state._excludeVariableName("objectId");
87
+ state._excludeVariableName("meshBlendTag");
87
88
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
88
89
  this._initShaderSourceAsync(state.shaderLanguage);
89
90
  }
@@ -133,7 +134,7 @@ let FragmentOutputBlock = (() => {
133
134
  }
134
135
  _writePrePassOutput(state, define, indexDefine, value) {
135
136
  if (state.shaderLanguage !== 1 /* ShaderLanguage.WGSL */) {
136
- return `#ifdef ${define}\r\ngl_FragData[${indexDefine}] = ${value};\r\n#endif\r\n`;
137
+ return `#ifdef ${define}\r\nWRITE_GEOMETRY_FRAGMENT_OUTPUT(${indexDefine}, ${value});\r\n#endif\r\n`;
137
138
  }
138
139
  let code = "";
139
140
  for (let index = 0; index < 8; index++) {
@@ -189,6 +190,7 @@ let FragmentOutputBlock = (() => {
189
190
  state._emitFunctionFromInclude("helperFunctions", comments);
190
191
  state._emitFunctionFromInclude("objectIdFunctions", comments, { define: "PREPASS_OBJECT_ID" });
191
192
  state._emitUniformFromString("objectId", NodeMaterialBlockConnectionPointTypes.Float, "PREPASS_OBJECT_ID");
193
+ state._emitUniformFromString("meshBlendTag", NodeMaterialBlockConnectionPointTypes.Int, "PREPASS_MESH_BLEND_TAG");
192
194
  const outputString = this._getOutputString(state);
193
195
  if (state.shaderLanguage === 1 /* ShaderLanguage.WGSL */) {
194
196
  state.compilationString += `var ${outputString} : vec4<f32>;\r\n`;
@@ -255,6 +257,14 @@ let FragmentOutputBlock = (() => {
255
257
  state.compilationString += `#if defined(PREPASS)\r\n`;
256
258
  state.compilationString += this._writePrePassOutput(state, "PREPASS_COLOR", "PREPASS_COLOR_INDEX", outputString);
257
259
  state.compilationString += this._writePrePassOutput(state, "PREPASS_OBJECT_ID", "PREPASS_OBJECT_ID_INDEX", `encodeObjectId(${uniformPrefix}objectId)`);
260
+ if (isWebGPU) {
261
+ state.compilationString += this._writePrePassOutput(state, "PREPASS_MESH_BLEND_TAG", "PREPASS_MESH_BLEND_TAG_INDEX", `vec4u(u32(${uniformPrefix}meshBlendTag), 0u, 0u, 0u)`);
262
+ }
263
+ else {
264
+ state.compilationString += `#ifdef PREPASS_MESH_BLEND_TAG\r\n`;
265
+ state.compilationString += `meshBlendTagOutput = uvec4(uint(${uniformPrefix}meshBlendTag), 0u, 0u, 0u);\r\n`;
266
+ state.compilationString += `#endif\r\n`;
267
+ }
258
268
  state.compilationString += `#endif\r\n`;
259
269
  return this;
260
270
  }