@onerjs/core 8.55.8 → 8.56.1

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 (423) hide show
  1. package/Animations/animation.pure.js +2 -2
  2. package/Animations/animation.pure.js.map +1 -1
  3. package/Animations/runtimeAnimation.js +4 -0
  4. package/Animations/runtimeAnimation.js.map +1 -1
  5. package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
  6. package/AudioV2/webAudio/webAudioEngine.js +6 -5
  7. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  8. package/Behaviors/Cameras/autoRotationBehavior.js +1 -1
  9. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  10. package/Behaviors/Meshes/followBehavior.js +1 -0
  11. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  12. package/Behaviors/Meshes/surfaceMagnetismBehavior.js +1 -0
  13. package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
  14. package/Cameras/Inputs/followCameraMouseWheelInput.js +2 -2
  15. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  16. package/Cameras/Inputs/followCameraPointersInput.d.ts +15 -0
  17. package/Cameras/Inputs/followCameraPointersInput.js +18 -3
  18. package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
  19. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +1 -1
  20. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
  21. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.pure.js +1 -1
  22. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.pure.js.map +1 -1
  23. package/Cameras/arcRotateCamera.pure.js +1 -1
  24. package/Cameras/arcRotateCamera.pure.js.map +1 -1
  25. package/Collisions/gpuPicker.d.ts +1 -0
  26. package/Collisions/gpuPicker.js +5 -4
  27. package/Collisions/gpuPicker.js.map +1 -1
  28. package/Culling/Helper/boundingInfoHelper.js +9 -5
  29. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  30. package/Culling/boundingSphere.js +7 -4
  31. package/Culling/boundingSphere.js.map +1 -1
  32. package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
  33. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
  34. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
  35. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
  36. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
  37. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
  38. package/Engines/AbstractEngine/pure.d.ts +1 -0
  39. package/Engines/AbstractEngine/pure.js +1 -0
  40. package/Engines/AbstractEngine/pure.js.map +1 -1
  41. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +1 -1
  42. package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
  43. package/Engines/IDrawContext.d.ts +2 -0
  44. package/Engines/IDrawContext.js.map +1 -1
  45. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +48 -6
  46. package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
  47. package/Engines/Native/nativeInterfaces.d.ts +1 -1
  48. package/Engines/Native/nativeInterfaces.js.map +1 -1
  49. package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
  50. package/Engines/WebGPU/webgpuDrawContext.js +15 -0
  51. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  52. package/Engines/abstractEngine.pure.js +2 -2
  53. package/Engines/abstractEngine.pure.js.map +1 -1
  54. package/Engines/engine.d.ts +21 -4
  55. package/Engines/thinNativeEngine.pure.d.ts +6 -1
  56. package/Engines/thinNativeEngine.pure.js +29 -2
  57. package/Engines/thinNativeEngine.pure.js.map +1 -1
  58. package/Engines/webgpuEngine.d.ts +1 -0
  59. package/Engines/webgpuEngine.js +1 -0
  60. package/Engines/webgpuEngine.js.map +1 -1
  61. package/Engines/webgpuEngine.pure.d.ts +10 -0
  62. package/Engines/webgpuEngine.pure.js +15 -1
  63. package/Engines/webgpuEngine.pure.js.map +1 -1
  64. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.d.ts +3 -63
  65. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js +5 -71
  66. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js.map +1 -1
  67. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.d.ts +71 -0
  68. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.js +86 -0
  69. package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.js.map +1 -0
  70. package/FlowGraph/Blocks/Data/pure.d.ts +1 -0
  71. package/FlowGraph/Blocks/Data/pure.js +1 -0
  72. package/FlowGraph/Blocks/Data/pure.js.map +1 -1
  73. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.d.ts +3 -37
  74. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js +5 -39
  75. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js.map +1 -1
  76. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.d.ts +45 -0
  77. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.js +54 -0
  78. package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.js.map +1 -0
  79. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.d.ts +3 -17
  80. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js +5 -22
  81. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js.map +1 -1
  82. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.d.ts +25 -0
  83. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.js +37 -0
  84. package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.js.map +1 -0
  85. package/FlowGraph/Blocks/Event/pure.d.ts +2 -0
  86. package/FlowGraph/Blocks/Event/pure.js +2 -0
  87. package/FlowGraph/Blocks/Event/pure.js.map +1 -1
  88. package/FlowGraph/Blocks/flowGraphBlockFactory.d.ts +1 -1
  89. package/FlowGraph/Blocks/flowGraphBlockFactory.js +198 -172
  90. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  91. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
  92. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
  93. package/FrameGraph/frameGraph.js +10 -1
  94. package/FrameGraph/frameGraph.js.map +1 -1
  95. package/Gamepads/gamepadManager.d.ts +1 -0
  96. package/Gamepads/gamepadManager.js +5 -2
  97. package/Gamepads/gamepadManager.js.map +1 -1
  98. package/Gizmos/scaleGizmo.js +1 -0
  99. package/Gizmos/scaleGizmo.js.map +1 -1
  100. package/Lights/IES/iesLoader.js +6 -8
  101. package/Lights/IES/iesLoader.js.map +1 -1
  102. package/Lights/Shadows/cascadedShadowGenerator.pure.js +4 -6
  103. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
  104. package/Lights/Shadows/shadowGenerator.js +2 -2
  105. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  106. package/Lights/light.js +3 -5
  107. package/Lights/light.js.map +1 -1
  108. package/Lights/spotLight.pure.js +1 -1
  109. package/Lights/spotLight.pure.js.map +1 -1
  110. package/Materials/Background/backgroundMaterial.pure.d.ts +1 -1
  111. package/Materials/Background/backgroundMaterial.pure.js +3 -12
  112. package/Materials/Background/backgroundMaterial.pure.js.map +1 -1
  113. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +2 -0
  114. package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
  115. package/Materials/Node/Blocks/Fragment/TBNBlock.pure.js +1 -1
  116. package/Materials/Node/Blocks/Fragment/TBNBlock.pure.js.map +1 -1
  117. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
  118. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
  119. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
  120. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  121. package/Materials/Node/Blocks/powBlock.pure.js +2 -1
  122. package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
  123. package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
  124. package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
  125. package/Materials/Node/nodeMaterial.pure.d.ts +1 -0
  126. package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
  127. package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -1
  128. package/Materials/PBR/openpbrMaterial.pure.js +3 -12
  129. package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
  130. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -1
  131. package/Materials/PBR/pbrBaseMaterial.pure.js +3 -12
  132. package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
  133. package/Materials/Textures/index.d.ts +1 -0
  134. package/Materials/Textures/index.js +1 -0
  135. package/Materials/Textures/index.js.map +1 -1
  136. package/Materials/Textures/renderTargetTexture.pure.js +1 -1
  137. package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
  138. package/Materials/drawWrapper.js +3 -0
  139. package/Materials/drawWrapper.js.map +1 -1
  140. package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
  141. package/Materials/imageProcessingConfiguration.defines.js +2 -0
  142. package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
  143. package/Materials/imageProcessingConfiguration.functions.js +3 -0
  144. package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
  145. package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
  146. package/Materials/imageProcessingConfiguration.pure.js +123 -2
  147. package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
  148. package/Materials/material.pure.js +2 -2
  149. package/Materials/material.pure.js.map +1 -1
  150. package/Materials/standardMaterial.pure.d.ts +2 -1
  151. package/Materials/standardMaterial.pure.js +4 -13
  152. package/Materials/standardMaterial.pure.js.map +1 -1
  153. package/Materials/uniformBuffer.d.ts +29 -0
  154. package/Materials/uniformBuffer.js +146 -0
  155. package/Materials/uniformBuffer.js.map +1 -1
  156. package/Maths/colorTemperature.functions.d.ts +29 -0
  157. package/Maths/colorTemperature.functions.js +196 -0
  158. package/Maths/colorTemperature.functions.js.map +1 -0
  159. package/Maths/index.d.ts +1 -0
  160. package/Maths/index.js +1 -0
  161. package/Maths/index.js.map +1 -1
  162. package/Maths/math.path.js +1 -1
  163. package/Maths/math.path.js.map +1 -1
  164. package/Maths/math.polar.js +1 -1
  165. package/Maths/math.polar.js.map +1 -1
  166. package/Maths/math.vector.pure.js +4 -3
  167. package/Maths/math.vector.pure.js.map +1 -1
  168. package/Maths/pure.d.ts +1 -0
  169. package/Maths/pure.js +1 -0
  170. package/Maths/pure.js.map +1 -1
  171. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +72 -0
  172. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +164 -1
  173. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  174. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +2 -1
  175. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +36 -18
  176. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  177. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.d.ts +5 -4
  178. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js +25 -8
  179. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js.map +1 -1
  180. package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js +3 -3
  181. package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js.map +1 -1
  182. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.pure.js +1 -1
  183. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.pure.js.map +1 -1
  184. package/Meshes/Node/Blocks/geometryOptimizeBlock.pure.js +2 -2
  185. package/Meshes/Node/Blocks/geometryOptimizeBlock.pure.js.map +1 -1
  186. package/Meshes/Node/Blocks/mappingBlock.pure.js +2 -2
  187. package/Meshes/Node/Blocks/mappingBlock.pure.js.map +1 -1
  188. package/Meshes/csg.js +5 -5
  189. package/Meshes/csg.js.map +1 -1
  190. package/Meshes/groundMesh.pure.js +1 -1
  191. package/Meshes/groundMesh.pure.js.map +1 -1
  192. package/Meshes/mesh.pure.js +2 -2
  193. package/Meshes/mesh.pure.js.map +1 -1
  194. package/Misc/deepMerger.js +1 -1
  195. package/Misc/deepMerger.js.map +1 -1
  196. package/Misc/dumpTools.pure.js +1 -1
  197. package/Misc/dumpTools.pure.js.map +1 -1
  198. package/Misc/index.d.ts +1 -0
  199. package/Misc/index.js +1 -0
  200. package/Misc/index.js.map +1 -1
  201. package/Misc/observable.pure.js +1 -3
  202. package/Misc/observable.pure.js.map +1 -1
  203. package/Misc/pure.d.ts +1 -0
  204. package/Misc/pure.js +1 -0
  205. package/Misc/pure.js.map +1 -1
  206. package/Misc/shaderImportLoader.d.ts +25 -0
  207. package/Misc/shaderImportLoader.js +54 -0
  208. package/Misc/shaderImportLoader.js.map +1 -0
  209. package/Misc/tools.pure.js +1 -1
  210. package/Misc/tools.pure.js.map +1 -1
  211. package/Particles/Node/Blocks/particleClampBlock.pure.d.ts +0 -1
  212. package/Particles/Node/Blocks/particleClampBlock.pure.js +1 -6
  213. package/Particles/Node/Blocks/particleClampBlock.pure.js.map +1 -1
  214. package/Particles/Node/Blocks/particleMathBlock.pure.js +1 -1
  215. package/Particles/Node/Blocks/particleMathBlock.pure.js.map +1 -1
  216. package/Particles/Node/Blocks/particleNLerpBlock.pure.js +8 -3
  217. package/Particles/Node/Blocks/particleNLerpBlock.pure.js.map +1 -1
  218. package/Particles/Node/Blocks/particleSmoothStepBlock.pure.js +3 -2
  219. package/Particles/Node/Blocks/particleSmoothStepBlock.pure.js.map +1 -1
  220. package/Particles/Node/Blocks/particleStepBlock.pure.js +3 -2
  221. package/Particles/Node/Blocks/particleStepBlock.pure.js.map +1 -1
  222. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.pure.js +1 -1
  223. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.pure.js.map +1 -1
  224. package/PostProcesses/depthOfFieldEffect.js +1 -1
  225. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  226. package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
  227. package/PostProcesses/imageProcessingPostProcess.js +41 -1
  228. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  229. package/PostProcesses/screenSpaceCurvaturePostProcess.pure.js +1 -1
  230. package/PostProcesses/screenSpaceCurvaturePostProcess.pure.js.map +1 -1
  231. package/PostProcesses/sharpenPostProcess.pure.js +1 -1
  232. package/PostProcesses/sharpenPostProcess.pure.js.map +1 -1
  233. package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
  234. package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
  235. package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
  236. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
  237. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
  238. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
  239. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
  240. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
  241. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
  242. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.d.ts +12 -0
  243. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +17 -5
  244. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  245. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +14 -0
  246. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +122 -6
  247. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
  248. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +7 -0
  249. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +17 -0
  250. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  251. package/Rendering/IBLShadows/pure.d.ts +1 -0
  252. package/Rendering/IBLShadows/pure.js +1 -0
  253. package/Rendering/IBLShadows/pure.js.map +1 -1
  254. package/Rendering/boundingBoxRenderer.pure.js +3 -3
  255. package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
  256. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
  257. package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
  258. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  259. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
  260. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
  261. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  262. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
  263. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
  264. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  265. package/Rendering/iblCdfGenerator.js +10 -1
  266. package/Rendering/iblCdfGenerator.js.map +1 -1
  267. package/Rendering/outlineRenderer.pure.js +1 -0
  268. package/Rendering/outlineRenderer.pure.js.map +1 -1
  269. package/Rendering/subSurfaceConfiguration.js +1 -1
  270. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  271. package/Rendering/subSurfaceSceneComponent.pure.d.ts +1 -1
  272. package/Rendering/subSurfaceSceneComponent.pure.js +1 -1
  273. package/Rendering/subSurfaceSceneComponent.pure.js.map +1 -1
  274. package/Rendering/utilityLayerRenderer.js +1 -1
  275. package/Rendering/utilityLayerRenderer.js.map +1 -1
  276. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
  277. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  278. package/Shaders/ShadersInclude/helperFunctions.js +2 -2
  279. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  280. package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
  281. package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  282. package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
  283. package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  284. package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
  285. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  286. package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
  287. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  288. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  289. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  290. package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
  291. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  292. package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
  293. package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  294. package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
  295. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  296. package/Shaders/gaussianSplattingVoxel.fragment.js +4 -10
  297. package/Shaders/gaussianSplattingVoxel.fragment.js.map +1 -1
  298. package/Shaders/iblCombineVoxelGrids.fragment.js +1 -1
  299. package/Shaders/iblCombineVoxelGrids.fragment.js.map +1 -1
  300. package/Shaders/iblShadowVoxelTracing.fragment.js +24 -7
  301. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  302. package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.d.ts +5 -0
  303. package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.js +13 -0
  304. package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.js.map +1 -0
  305. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
  306. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  307. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
  308. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  309. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
  310. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  311. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
  312. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
  313. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
  314. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  315. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  316. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  317. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
  318. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  319. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
  320. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  321. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
  322. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  323. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js +15 -9
  324. package/ShadersWGSL/gaussianSplattingVoxel.fragment.js.map +1 -1
  325. package/ShadersWGSL/iblCombineVoxelGrids.fragment.js +1 -1
  326. package/ShadersWGSL/iblCombineVoxelGrids.fragment.js.map +1 -1
  327. package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.d.ts +5 -0
  328. package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.js +14 -0
  329. package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.js.map +1 -0
  330. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +24 -7
  331. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
  332. package/ShadersWGSL/iblVoxelGrid.fragment.js +26 -6
  333. package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
  334. package/SmartAssets/smartAssetManager.pure.js +1 -1
  335. package/SmartAssets/smartAssetManager.pure.js.map +1 -1
  336. package/Sprites/thinSprite.js +1 -1
  337. package/Sprites/thinSprite.js.map +1 -1
  338. package/XR/features/Layers/WebXRCompositionLayer.d.ts +182 -12
  339. package/XR/features/Layers/WebXRCompositionLayer.js +272 -3
  340. package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
  341. package/XR/features/Layers/WebXRFallbackLayer.d.ts +84 -0
  342. package/XR/features/Layers/WebXRFallbackLayer.js +137 -0
  343. package/XR/features/Layers/WebXRFallbackLayer.js.map +1 -0
  344. package/XR/features/Layers/WebXRWebGPUCompositionLayer.d.ts +4 -4
  345. package/XR/features/Layers/WebXRWebGPUCompositionLayer.js.map +1 -1
  346. package/XR/features/WebXRAnchorSystem.pure.d.ts +45 -0
  347. package/XR/features/WebXRAnchorSystem.pure.js +153 -13
  348. package/XR/features/WebXRAnchorSystem.pure.js.map +1 -1
  349. package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
  350. package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
  351. package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
  352. package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
  353. package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
  354. package/XR/features/WebXRDepthSensing.pure.js +42 -0
  355. package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
  356. package/XR/features/WebXRHandTracking.pure.js +2 -0
  357. package/XR/features/WebXRHandTracking.pure.js.map +1 -1
  358. package/XR/features/WebXRLayers.pure.d.ts +183 -8
  359. package/XR/features/WebXRLayers.pure.js +531 -99
  360. package/XR/features/WebXRLayers.pure.js.map +1 -1
  361. package/XR/features/WebXRLayersFallback.d.ts +5 -0
  362. package/XR/features/WebXRLayersFallback.js +8 -0
  363. package/XR/features/WebXRLayersFallback.js.map +1 -0
  364. package/XR/features/WebXRLayersFallback.pure.d.ts +6 -0
  365. package/XR/features/WebXRLayersFallback.pure.js +44 -0
  366. package/XR/features/WebXRLayersFallback.pure.js.map +1 -0
  367. package/XR/features/WebXRLightEstimation.pure.d.ts +3 -4
  368. package/XR/features/WebXRLightEstimation.pure.js +22 -21
  369. package/XR/features/WebXRLightEstimation.pure.js.map +1 -1
  370. package/XR/features/WebXRMeshDetector.pure.d.ts +5 -0
  371. package/XR/features/WebXRMeshDetector.pure.js +1 -0
  372. package/XR/features/WebXRMeshDetector.pure.js.map +1 -1
  373. package/XR/features/WebXRNearInteraction.pure.js +3 -3
  374. package/XR/features/WebXRNearInteraction.pure.js.map +1 -1
  375. package/XR/features/WebXRPlaneDetector.pure.d.ts +9 -5
  376. package/XR/features/WebXRPlaneDetector.pure.js +12 -8
  377. package/XR/features/WebXRPlaneDetector.pure.js.map +1 -1
  378. package/XR/features/WebXRTrackedSources.d.ts +5 -0
  379. package/XR/features/WebXRTrackedSources.js +8 -0
  380. package/XR/features/WebXRTrackedSources.js.map +1 -0
  381. package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
  382. package/XR/features/WebXRTrackedSources.pure.js +153 -0
  383. package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
  384. package/XR/features/index.d.ts +1 -0
  385. package/XR/features/index.js +1 -0
  386. package/XR/features/index.js.map +1 -1
  387. package/XR/features/pure.d.ts +2 -0
  388. package/XR/features/pure.js +2 -0
  389. package/XR/features/pure.js.map +1 -1
  390. package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
  391. package/XR/motionController/webXRAbstractMotionController.js +61 -0
  392. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  393. package/XR/webXRCamera.d.ts +2 -0
  394. package/XR/webXRCamera.js +8 -2
  395. package/XR/webXRCamera.js.map +1 -1
  396. package/XR/webXRDefaultExperience.js +8 -4
  397. package/XR/webXRDefaultExperience.js.map +1 -1
  398. package/XR/webXRExperienceHelper.js +86 -44
  399. package/XR/webXRExperienceHelper.js.map +1 -1
  400. package/XR/webXRFeaturesManager.d.ts +9 -0
  401. package/XR/webXRFeaturesManager.js +4 -0
  402. package/XR/webXRFeaturesManager.js.map +1 -1
  403. package/XR/webXRGraphicsBinding.d.ts +29 -0
  404. package/XR/webXRGraphicsBinding.js +40 -0
  405. package/XR/webXRGraphicsBinding.js.map +1 -1
  406. package/XR/webXRInputSource.js +1 -1
  407. package/XR/webXRInputSource.js.map +1 -1
  408. package/XR/webXRLayerWrapper.d.ts +26 -10
  409. package/XR/webXRLayerWrapper.js +19 -7
  410. package/XR/webXRLayerWrapper.js.map +1 -1
  411. package/XR/webXRRenderTargetTextureProvider.d.ts +4 -4
  412. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  413. package/XR/webXRSessionManager.d.ts +45 -0
  414. package/XR/webXRSessionManager.js +174 -29
  415. package/XR/webXRSessionManager.js.map +1 -1
  416. package/XR/webXRWebGLRenderTargetTextureProvider.d.ts +2 -1
  417. package/XR/webXRWebGLRenderTargetTextureProvider.js.map +1 -1
  418. package/XR/webXRWebGPURenderTargetTextureProvider.d.ts +3 -3
  419. package/XR/webXRWebGPURenderTargetTextureProvider.js.map +1 -1
  420. package/package.json +1 -1
  421. package/scene.pure.d.ts +5 -0
  422. package/scene.pure.js +25 -0
  423. package/scene.pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"iblCdfGenerator.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/iblCdfGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../Engines/constants\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport { type Scene } from \"../scene\";\r\nimport { Texture } from \"../Materials/Textures/texture.pure\";\r\nimport { type TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../Materials/Textures/Procedurals/proceduralTexture.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../PostProcesses/postProcess.pure\";\r\nimport { Vector3, Vector4 } from \"../Maths/math.vector.pure\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { CubeTexture } from \"../Materials/Textures/cubeTexture.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { type Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { RegisterIblCdfGeneratorSceneComponent } from \"./iblCdfGeneratorSceneComponent.pure\";\r\n\r\n/**\r\n * Build cdf maps to be used for IBL importance sampling.\r\n */\r\nexport class IblCdfGenerator {\r\n private _scene: Nullable<Scene>;\r\n private _engine: AbstractEngine;\r\n\r\n private _cdfyPT: ProceduralTexture;\r\n private _cdfxPT: ProceduralTexture;\r\n private _icdfPT: Nullable<ProceduralTexture>;\r\n private _scaledLuminancePT: ProceduralTexture;\r\n private _dominantDirectionPT: ProceduralTexture;\r\n private _iblSource: Nullable<BaseTexture>;\r\n private _dummyTexture: RawTexture;\r\n private _iblSourceLoadUnsubscribe: Nullable<() => void> = null;\r\n private _iblSourceReadyRetryObserver: Nullable<() => void> = null;\r\n\r\n private _cachedDominantDirection: Nullable<Vector3> = null;\r\n\r\n /**\r\n * Returns whether the CDF renderer is supported by the current engine\r\n */\r\n public get isSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine.getCaps().texelFetch;\r\n }\r\n\r\n /**\r\n * Gets the IBL source texture being used by the CDF renderer\r\n */\r\n public get iblSource(): Nullable<BaseTexture> {\r\n return this._iblSource;\r\n }\r\n\r\n /**\r\n * Sets the IBL source texture to be used by the CDF renderer.\r\n * This will trigger recreation of the CDF assets.\r\n */\r\n public set iblSource(source: Nullable<BaseTexture>) {\r\n if (this._iblSource === source) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._iblSource = source;\r\n\r\n if (!source) {\r\n return;\r\n }\r\n\r\n const recreateFromObservedSourceIfReady = () => {\r\n if (this._iblSource !== source || !this._isIblSourceReady(source)) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._recreateAssetsFromNewIbl();\r\n };\r\n\r\n if (this._isIblSourceReady(source)) {\r\n this._recreateAssetsFromNewIbl();\r\n return;\r\n }\r\n\r\n if (source instanceof Texture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n } else if (source instanceof CubeTexture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n }\r\n\r\n this._iblSourceReadyRetryObserver = _RetryWithInterval(\r\n () => this._iblSource !== source || this._isIblSourceReady(source),\r\n recreateFromObservedSourceIfReady,\r\n undefined,\r\n 16,\r\n 30000,\r\n false\r\n );\r\n }\r\n\r\n private _isIblSourceReady(source: BaseTexture): boolean {\r\n if (!source.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n if (!source.isCube) {\r\n return true;\r\n }\r\n\r\n const internalTexture = source.getInternalTexture();\r\n return !!internalTexture && internalTexture.isReady;\r\n }\r\n\r\n private _clearIblSourceReadinessObservers() {\r\n this._iblSourceReadyRetryObserver?.();\r\n this._iblSourceReadyRetryObserver = null;\r\n\r\n this._iblSourceLoadUnsubscribe?.();\r\n this._iblSourceLoadUnsubscribe = null;\r\n }\r\n\r\n private _recreateAssetsFromNewIbl() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n\r\n this._createTextures();\r\n\r\n if (this._debugPass) {\r\n // Recreate the debug pass because of the new textures\r\n this._createDebugPass();\r\n }\r\n }\r\n\r\n /**\r\n * Return the cumulative distribution function (CDF) texture\r\n * @returns Return the cumulative distribution function (CDF) texture\r\n */\r\n public getIcdfTexture(): Texture {\r\n return this._icdfPT ? this._icdfPT : this._dummyTexture;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPass: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 1.0, 1.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * The name of the debug pass post process\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n private _debugPassName: string = \"CDF Debug\";\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPass) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"IblCdfGeneratorSceneComponentSceneComponent\");\r\n };\r\n\r\n /**\r\n * Instanciates the CDF renderer\r\n * @param sceneOrEngine Scene to attach to\r\n * @returns The CDF renderer\r\n */\r\n constructor(sceneOrEngine: Nullable<Scene | AbstractEngine>) {\r\n if (sceneOrEngine) {\r\n if (IblCdfGenerator._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n if (this._scene) {\r\n this._engine = this._scene.getEngine();\r\n }\r\n if (!this.isSupported) {\r\n Logger.Warn(\"CDF renderer is not supported by the current engine.\");\r\n return;\r\n }\r\n const blackPixels = new Uint16Array([0, 0, 0, 255]);\r\n this._dummyTexture = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, Constants.TEXTURETYPE_HALF_FLOAT);\r\n if (this._scene) {\r\n RegisterIblCdfGeneratorSceneComponent(IblCdfGenerator);\r\n IblCdfGenerator._SceneComponentInitialization(this._scene);\r\n }\r\n }\r\n\r\n /**\r\n * Observable that triggers when the CDF renderer is ready\r\n */\r\n public onGeneratedObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when CDF texture references change.\r\n * It is raised after disposing textures (so fallback ICDF can be used)\r\n * and after creating new textures (so consumers can rebind immediately).\r\n */\r\n public onTextureChangedObservable: Observable<void> = new Observable<void>();\r\n\r\n private _createTextures() {\r\n const size: TextureSize = this._iblSource ? { width: this._iblSource.getSize().width, height: this._iblSource.getSize().height } : { width: 1, height: 1 };\r\n if (!this._iblSource) {\r\n this._iblSource = RawTexture.CreateRTexture(\r\n new Uint8Array([255]),\r\n 1,\r\n 1,\r\n this._engine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._iblSource.name = \"Placeholder IBL Source\";\r\n }\r\n if (this._iblSource.isCube) {\r\n size.width *= 4;\r\n size.height *= 2;\r\n // Force the resolution to be a power of 2 because we rely on the\r\n // auto-mipmap generation for the scaled luminance texture to produce\r\n // a 1x1 mip that represents the true average pixel intensity of the IBL.\r\n size.width = 1 << Math.floor(Math.log2(size.width));\r\n size.height = 1 << Math.floor(Math.log2(size.height));\r\n }\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n // Create CDF maps (Cumulative Distribution Function) to assist in importance sampling\r\n const cdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_R,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblCdfx.fragment\"), import(\"../ShadersWGSL/iblCdfy.fragment\"), import(\"../ShadersWGSL/iblScaledLuminance.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblCdfx.fragment\"), import(\"../Shaders/iblCdfy.fragment\"), import(\"../Shaders/iblScaledLuminance.fragment\")]);\r\n }\r\n },\r\n };\r\n const icdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblIcdf.fragment\"), import(\"../ShadersWGSL/iblDominantDirection.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblIcdf.fragment\"), import(\"../Shaders/iblDominantDirection.fragment\")]);\r\n }\r\n },\r\n };\r\n this._cdfyPT = new ProceduralTexture(\"cdfyTexture\", { width: size.width, height: size.height + 1 }, \"iblCdfy\", this._scene, cdfOptions, false, false);\r\n this._cdfyPT.autoClear = false;\r\n this._cdfyPT.setTexture(\"iblSource\", this._iblSource);\r\n this._cdfyPT.setInt(\"iblHeight\", size.height);\r\n this._cdfyPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._cdfyPT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._cdfyPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n\r\n this._cdfxPT = new ProceduralTexture(\"cdfxTexture\", { width: size.width + 1, height: 1 }, \"iblCdfx\", this._scene, cdfOptions, false, false);\r\n this._cdfxPT.autoClear = false;\r\n this._cdfxPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._cdfxPT.refreshRate = 0;\r\n this._cdfxPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n this._scaledLuminancePT = new ProceduralTexture(\r\n \"iblScaledLuminance\",\r\n { width: size.width, height: size.height },\r\n \"iblScaledLuminance\",\r\n this._scene,\r\n { ...cdfOptions, samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, generateMipMaps: true },\r\n true,\r\n false\r\n );\r\n this._scaledLuminancePT.autoClear = false;\r\n this._scaledLuminancePT.setTexture(\"iblSource\", this._iblSource);\r\n this._scaledLuminancePT.setInt(\"iblHeight\", size.height);\r\n this._scaledLuminancePT.setInt(\"iblWidth\", size.width);\r\n this._scaledLuminancePT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._scaledLuminancePT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n this._icdfPT = new ProceduralTexture(\"icdfTexture\", { width: size.width, height: size.height }, \"iblIcdf\", this._scene, icdfOptions, false, false);\r\n this._icdfPT.autoClear = false;\r\n this._icdfPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._icdfPT.setTexture(\"cdfx\", this._cdfxPT);\r\n this._icdfPT.setTexture(\"iblSource\", this._iblSource);\r\n this._icdfPT.setTexture(\"scaledLuminanceSampler\", this._scaledLuminancePT);\r\n this._icdfPT.refreshRate = 0;\r\n this._icdfPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._icdfPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n if (this._iblSource.isCube) {\r\n this._icdfPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n // Once the textures are generated, notify that they are ready to use.\r\n this._icdfPT.onGeneratedObservable.addOnce(() => {\r\n this.onGeneratedObservable.notifyObservers();\r\n });\r\n\r\n this._dominantDirectionPT = new ProceduralTexture(\"iblDominantDirection\", { width: 1, height: 1 }, \"iblDominantDirection\", this._scene, icdfOptions, false, false);\r\n this._dominantDirectionPT.autoClear = false;\r\n this._dominantDirectionPT.setTexture(\"icdfSampler\", this._icdfPT);\r\n this._dominantDirectionPT.refreshRate = 0;\r\n this._dominantDirectionPT.defines = \"#define NUM_SAMPLES 32u\\n\";\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _disposeTextures() {\r\n this._cdfyPT?.dispose();\r\n this._cdfxPT?.dispose();\r\n this._icdfPT?.dispose();\r\n this._scaledLuminancePT?.dispose();\r\n this._dominantDirectionPT?.dispose();\r\n this._icdfPT = null;\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _createDebugPass() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n samplingMode: Texture.BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"cdfy\", \"icdf\", \"cdfx\", \"iblSource\"],\r\n defines: this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../ShadersWGSL/iblCdfDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/iblCdfDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPass = new PostProcess(this._debugPassName, \"iblCdfDebug\", debugOptions);\r\n const debugEffect = this._debugPass.getEffect();\r\n if (debugEffect) {\r\n debugEffect.defines = this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\";\r\n }\r\n if (this._iblSource?.isCube) {\r\n this._debugPass.updateEffect(\"#define IBL_USE_CUBE_MAP\\n\");\r\n }\r\n this._debugPass.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"cdfy\", this._cdfyPT);\r\n effect.setTexture(\"icdf\", this._icdfPT);\r\n effect.setTexture(\"cdfx\", this._cdfxPT);\r\n effect.setTexture(\"iblSource\", this._iblSource);\r\n effect.setFloat4(\"sizeParams\", this._debugSizeParams.x, this._debugSizeParams.y, this._debugSizeParams.z, this._debugSizeParams.w);\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the CDF renderer is ready\r\n * @returns true if the CDF renderer is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._iblSource &&\r\n this._iblSource.name !== \"Placeholder IBL Source\" &&\r\n this._iblSource.isReady() &&\r\n this._cdfyPT &&\r\n this._cdfyPT.isReady() &&\r\n this._icdfPT &&\r\n this._icdfPT.isReady() &&\r\n this._cdfxPT &&\r\n this._cdfxPT.isReady() &&\r\n this._scaledLuminancePT &&\r\n this._scaledLuminancePT.isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Explicitly trigger generation of CDF maps when they are ready to render.\r\n * @returns Promise that resolves when the CDF maps are rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public renderWhenReady(): Promise<void> {\r\n this._cachedDominantDirection = null;\r\n // Even if a IBL source must be set before calling this function, _icdfPT may not yet be created because the creation may be asynchronous (see @set iblSource).\r\n const icdfPTPromise = new Promise((resolve, reject) => {\r\n _RetryWithInterval(\r\n () => !!this._icdfPT,\r\n () => resolve(void 0),\r\n () => reject(new Error(\"Waiting for _icdfPT creation failed\"))\r\n );\r\n });\r\n\r\n // eslint-disable-next-line github/no-then, @typescript-eslint/promise-function-async\r\n return icdfPTPromise.then(() => {\r\n const icdfTexture = this._icdfPT;\r\n const promises: Array<Promise<void>> = [];\r\n const renderTargets: Array<ProceduralTexture> = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, icdfTexture!];\r\n for (const target of renderTargets) {\r\n promises.push(\r\n new Promise((resolve) => {\r\n if (target.isReady()) {\r\n resolve();\r\n } else {\r\n target.getEffect().executeWhenCompiled(() => {\r\n resolve();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {\r\n for (const target of renderTargets) {\r\n target.render();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Finds the average direction of the highest intensity areas of the IBL source\r\n * @returns Async promise that resolves to the dominant direction of the IBL source\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public findDominantDirection(): Promise<Vector3> {\r\n if (this._cachedDominantDirection) {\r\n return Promise.resolve(this._cachedDominantDirection);\r\n }\r\n return new Promise((resolve) => {\r\n this._dominantDirectionPT.onGeneratedObservable.addOnce(() => {\r\n const data = new Float32Array(4);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._dominantDirectionPT.readPixels(0, 0, data, true)!.then(() => {\r\n const dominantDirection = new Vector3(data[0], data[1], data[2]);\r\n this._cachedDominantDirection = dominantDirection;\r\n resolve(dominantDirection);\r\n });\r\n });\r\n if (this.isReady()) {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n } else {\r\n this.onGeneratedObservable.addOnce(() => {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the CDF renderer and associated resources\r\n */\r\n public dispose() {\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._dummyTexture.dispose();\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n this.onGeneratedObservable.clear();\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | AbstractEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblCdfGenerator.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/iblCdfGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../Engines/constants\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport { type Scene } from \"../scene\";\r\nimport { Texture } from \"../Materials/Textures/texture.pure\";\r\nimport { type TextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { ProceduralTexture, type IProceduralTextureCreationOptions } from \"../Materials/Textures/Procedurals/proceduralTexture.pure\";\r\nimport { PostProcess, type PostProcessOptions } from \"../PostProcesses/postProcess.pure\";\r\nimport { Vector3, Vector4 } from \"../Maths/math.vector.pure\";\r\nimport { RawTexture } from \"../Materials/Textures/rawTexture\";\r\nimport { type BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { CubeTexture } from \"../Materials/Textures/cubeTexture.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { type Nullable } from \"../types\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { RegisterIblCdfGeneratorSceneComponent } from \"./iblCdfGeneratorSceneComponent.pure\";\r\n\r\n/**\r\n * Build cdf maps to be used for IBL importance sampling.\r\n */\r\nexport class IblCdfGenerator {\r\n private _scene: Nullable<Scene>;\r\n private _engine: AbstractEngine;\r\n\r\n private _cdfyPT: ProceduralTexture;\r\n private _cdfxPT: ProceduralTexture;\r\n private _icdfPT: Nullable<ProceduralTexture>;\r\n private _scaledLuminancePT: ProceduralTexture;\r\n private _dominantDirectionPT: ProceduralTexture;\r\n private _iblSource: Nullable<BaseTexture>;\r\n private _dummyTexture: RawTexture;\r\n private _iblSourceLoadUnsubscribe: Nullable<() => void> = null;\r\n private _iblSourceReadyRetryObserver: Nullable<() => void> = null;\r\n\r\n private _cachedDominantDirection: Nullable<Vector3> = null;\r\n\r\n /**\r\n * Returns whether the CDF renderer is supported by the current engine\r\n */\r\n public get isSupported(): boolean {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine.getCaps().texelFetch;\r\n }\r\n\r\n /**\r\n * Gets the IBL source texture being used by the CDF renderer\r\n */\r\n public get iblSource(): Nullable<BaseTexture> {\r\n return this._iblSource;\r\n }\r\n\r\n /**\r\n * Sets the IBL source texture to be used by the CDF renderer.\r\n * This will trigger recreation of the CDF assets.\r\n */\r\n public set iblSource(source: Nullable<BaseTexture>) {\r\n if (this._iblSource === source) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._iblSource = source;\r\n\r\n if (!source) {\r\n return;\r\n }\r\n\r\n const recreateFromObservedSourceIfReady = () => {\r\n if (this._iblSource !== source || !this._isIblSourceReady(source)) {\r\n return;\r\n }\r\n\r\n this._clearIblSourceReadinessObservers();\r\n this._recreateAssetsFromNewIbl();\r\n };\r\n\r\n if (this._isIblSourceReady(source)) {\r\n this._recreateAssetsFromNewIbl();\r\n return;\r\n }\r\n\r\n if (source instanceof Texture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n } else if (source instanceof CubeTexture) {\r\n const observer = source.onLoadObservable.addOnce(recreateFromObservedSourceIfReady);\r\n if (observer) {\r\n this._iblSourceLoadUnsubscribe = () => source.onLoadObservable.remove(observer);\r\n }\r\n }\r\n\r\n this._iblSourceReadyRetryObserver = _RetryWithInterval(\r\n () => this._iblSource !== source || this._isIblSourceReady(source),\r\n recreateFromObservedSourceIfReady,\r\n undefined,\r\n 16,\r\n 30000,\r\n false\r\n );\r\n }\r\n\r\n private _isIblSourceReady(source: BaseTexture): boolean {\r\n if (!source.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n\r\n if (!source.isCube) {\r\n return true;\r\n }\r\n\r\n const internalTexture = source.getInternalTexture();\r\n return !!internalTexture && internalTexture.isReady;\r\n }\r\n\r\n private _clearIblSourceReadinessObservers() {\r\n this._iblSourceReadyRetryObserver?.();\r\n this._iblSourceReadyRetryObserver = null;\r\n\r\n this._iblSourceLoadUnsubscribe?.();\r\n this._iblSourceLoadUnsubscribe = null;\r\n }\r\n\r\n private _recreateAssetsFromNewIbl() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n\r\n this._createTextures();\r\n\r\n if (this._debugPass) {\r\n // Recreate the debug pass because of the new textures\r\n this._createDebugPass();\r\n }\r\n }\r\n\r\n /**\r\n * Return the cumulative distribution function (CDF) texture\r\n * @returns Return the cumulative distribution function (CDF) texture\r\n */\r\n public getIcdfTexture(): Texture {\r\n return this._icdfPT ? this._icdfPT : this._dummyTexture;\r\n }\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n private _debugPass: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 1.0, 1.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * The name of the debug pass post process\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n private _debugPassName: string = \"CDF Debug\";\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPass) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPass;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"IblCdfGeneratorSceneComponentSceneComponent\");\r\n };\r\n\r\n /**\r\n * Instanciates the CDF renderer\r\n * @param sceneOrEngine Scene to attach to\r\n * @returns The CDF renderer\r\n */\r\n constructor(sceneOrEngine: Nullable<Scene | AbstractEngine>) {\r\n if (sceneOrEngine) {\r\n if (IblCdfGenerator._IsScene(sceneOrEngine)) {\r\n this._scene = sceneOrEngine;\r\n } else {\r\n this._engine = sceneOrEngine;\r\n }\r\n } else {\r\n this._scene = EngineStore.LastCreatedScene;\r\n }\r\n if (this._scene) {\r\n this._engine = this._scene.getEngine();\r\n }\r\n if (!this.isSupported) {\r\n Logger.Warn(\"CDF renderer is not supported by the current engine.\");\r\n return;\r\n }\r\n const blackPixels = new Uint16Array([0, 0, 0, 255]);\r\n this._dummyTexture = new RawTexture(blackPixels, 1, 1, Constants.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, Constants.TEXTURETYPE_HALF_FLOAT);\r\n if (this._scene) {\r\n RegisterIblCdfGeneratorSceneComponent(IblCdfGenerator);\r\n IblCdfGenerator._SceneComponentInitialization(this._scene);\r\n }\r\n }\r\n\r\n /**\r\n * Observable that triggers when the CDF renderer is ready\r\n */\r\n public onGeneratedObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Observable that triggers when CDF texture references change.\r\n * It is raised after disposing textures (so fallback ICDF can be used)\r\n * and after creating new textures (so consumers can rebind immediately).\r\n */\r\n public onTextureChangedObservable: Observable<void> = new Observable<void>();\r\n\r\n private _createTextures() {\r\n const size: TextureSize = this._iblSource ? { width: this._iblSource.getSize().width, height: this._iblSource.getSize().height } : { width: 1, height: 1 };\r\n if (!this._iblSource) {\r\n this._iblSource = RawTexture.CreateRTexture(\r\n new Uint8Array([255]),\r\n 1,\r\n 1,\r\n this._engine,\r\n false,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n this._iblSource.name = \"Placeholder IBL Source\";\r\n }\r\n if (this._iblSource.isCube) {\r\n size.width *= 4;\r\n size.height *= 2;\r\n // Force the resolution to be a power of 2 because we rely on the\r\n // auto-mipmap generation for the scaled luminance texture to produce\r\n // a 1x1 mip that represents the true average pixel intensity of the IBL.\r\n size.width = 1 << Math.floor(Math.log2(size.width));\r\n size.height = 1 << Math.floor(Math.log2(size.height));\r\n }\r\n\r\n const isWebGPU = this._engine.isWebGPU;\r\n // r32float mip generation requires filtered sampling. On WebGPU this hard-fails bind group\r\n // validation (and drops the whole command buffer) when the optional `float32-filterable` adapter\r\n // feature is absent, so fall back to r16float there. WebGL2/Native also depend on an extension\r\n // (OES_texture_float_linear) for float32 filtering, but when it's missing they silently degrade\r\n // to nearest sampling instead of hard-failing, so no fallback is needed there.\r\n const scaledLuminanceType = isWebGPU && !this._engine.getCaps().textureFloatLinearFiltering ? Constants.TEXTURETYPE_HALF_FLOAT : Constants.TEXTURETYPE_FLOAT;\r\n // Create CDF maps (Cumulative Distribution Function) to assist in importance sampling\r\n const cdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_R,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblCdfx.fragment\"), import(\"../ShadersWGSL/iblCdfy.fragment\"), import(\"../ShadersWGSL/iblScaledLuminance.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblCdfx.fragment\"), import(\"../Shaders/iblCdfy.fragment\"), import(\"../Shaders/iblScaledLuminance.fragment\")]);\r\n }\r\n },\r\n };\r\n const icdfOptions: IProceduralTextureCreationOptions = {\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n gammaSpace: false,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../ShadersWGSL/iblIcdf.fragment\"), import(\"../ShadersWGSL/iblDominantDirection.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/iblIcdf.fragment\"), import(\"../Shaders/iblDominantDirection.fragment\")]);\r\n }\r\n },\r\n };\r\n this._cdfyPT = new ProceduralTexture(\"cdfyTexture\", { width: size.width, height: size.height + 1 }, \"iblCdfy\", this._scene, cdfOptions, false, false);\r\n this._cdfyPT.autoClear = false;\r\n this._cdfyPT.setTexture(\"iblSource\", this._iblSource);\r\n this._cdfyPT.setInt(\"iblHeight\", size.height);\r\n this._cdfyPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._cdfyPT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._cdfyPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n\r\n this._cdfxPT = new ProceduralTexture(\"cdfxTexture\", { width: size.width + 1, height: 1 }, \"iblCdfx\", this._scene, cdfOptions, false, false);\r\n this._cdfxPT.autoClear = false;\r\n this._cdfxPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._cdfxPT.refreshRate = 0;\r\n this._cdfxPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n this._scaledLuminancePT = new ProceduralTexture(\r\n \"iblScaledLuminance\",\r\n { width: size.width, height: size.height },\r\n \"iblScaledLuminance\",\r\n this._scene,\r\n // This texture is trilinear-filtered and mip-mapped, so it must use a filterable format;\r\n // see scaledLuminanceType above for why r16float is only used as a WebGPU fallback.\r\n { ...cdfOptions, type: scaledLuminanceType, samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, generateMipMaps: true },\r\n true,\r\n false\r\n );\r\n this._scaledLuminancePT.autoClear = false;\r\n this._scaledLuminancePT.setTexture(\"iblSource\", this._iblSource);\r\n this._scaledLuminancePT.setInt(\"iblHeight\", size.height);\r\n this._scaledLuminancePT.setInt(\"iblWidth\", size.width);\r\n this._scaledLuminancePT.refreshRate = 0;\r\n if (this._iblSource.isCube) {\r\n this._scaledLuminancePT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n this._icdfPT = new ProceduralTexture(\"icdfTexture\", { width: size.width, height: size.height }, \"iblIcdf\", this._scene, icdfOptions, false, false);\r\n this._icdfPT.autoClear = false;\r\n this._icdfPT.setTexture(\"cdfy\", this._cdfyPT);\r\n this._icdfPT.setTexture(\"cdfx\", this._cdfxPT);\r\n this._icdfPT.setTexture(\"iblSource\", this._iblSource);\r\n this._icdfPT.setTexture(\"scaledLuminanceSampler\", this._scaledLuminancePT);\r\n this._icdfPT.refreshRate = 0;\r\n this._icdfPT.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._icdfPT.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n if (this._iblSource.isCube) {\r\n this._icdfPT.defines = \"#define IBL_USE_CUBE_MAP\\n\";\r\n }\r\n // Once the textures are generated, notify that they are ready to use.\r\n this._icdfPT.onGeneratedObservable.addOnce(() => {\r\n this.onGeneratedObservable.notifyObservers();\r\n });\r\n\r\n this._dominantDirectionPT = new ProceduralTexture(\"iblDominantDirection\", { width: 1, height: 1 }, \"iblDominantDirection\", this._scene, icdfOptions, false, false);\r\n this._dominantDirectionPT.autoClear = false;\r\n this._dominantDirectionPT.setTexture(\"icdfSampler\", this._icdfPT);\r\n this._dominantDirectionPT.refreshRate = 0;\r\n this._dominantDirectionPT.defines = \"#define NUM_SAMPLES 32u\\n\";\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _disposeTextures() {\r\n this._cdfyPT?.dispose();\r\n this._cdfxPT?.dispose();\r\n this._icdfPT?.dispose();\r\n this._scaledLuminancePT?.dispose();\r\n this._dominantDirectionPT?.dispose();\r\n this._icdfPT = null;\r\n\r\n this.onTextureChangedObservable.notifyObservers();\r\n }\r\n\r\n private _createDebugPass() {\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n samplingMode: Texture.BILINEAR_SAMPLINGMODE,\r\n engine: this._engine,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"cdfy\", \"icdf\", \"cdfx\", \"iblSource\"],\r\n defines: this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\",\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../ShadersWGSL/iblCdfDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/iblCdfDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPass = new PostProcess(this._debugPassName, \"iblCdfDebug\", debugOptions);\r\n const debugEffect = this._debugPass.getEffect();\r\n if (debugEffect) {\r\n debugEffect.defines = this._iblSource?.isCube ? \"#define IBL_USE_CUBE_MAP\\n\" : \"\";\r\n }\r\n if (this._iblSource?.isCube) {\r\n this._debugPass.updateEffect(\"#define IBL_USE_CUBE_MAP\\n\");\r\n }\r\n this._debugPass.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"cdfy\", this._cdfyPT);\r\n effect.setTexture(\"icdf\", this._icdfPT);\r\n effect.setTexture(\"cdfx\", this._cdfxPT);\r\n effect.setTexture(\"iblSource\", this._iblSource);\r\n effect.setFloat4(\"sizeParams\", this._debugSizeParams.x, this._debugSizeParams.y, this._debugSizeParams.z, this._debugSizeParams.w);\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the CDF renderer is ready\r\n * @returns true if the CDF renderer is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._iblSource &&\r\n this._iblSource.name !== \"Placeholder IBL Source\" &&\r\n this._iblSource.isReady() &&\r\n this._cdfyPT &&\r\n this._cdfyPT.isReady() &&\r\n this._icdfPT &&\r\n this._icdfPT.isReady() &&\r\n this._cdfxPT &&\r\n this._cdfxPT.isReady() &&\r\n this._scaledLuminancePT &&\r\n this._scaledLuminancePT.isReady()\r\n );\r\n }\r\n\r\n /**\r\n * Explicitly trigger generation of CDF maps when they are ready to render.\r\n * @returns Promise that resolves when the CDF maps are rendered.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public renderWhenReady(): Promise<void> {\r\n this._cachedDominantDirection = null;\r\n // Even if a IBL source must be set before calling this function, _icdfPT may not yet be created because the creation may be asynchronous (see @set iblSource).\r\n const icdfPTPromise = new Promise((resolve, reject) => {\r\n _RetryWithInterval(\r\n () => !!this._icdfPT,\r\n () => resolve(void 0),\r\n () => reject(new Error(\"Waiting for _icdfPT creation failed\"))\r\n );\r\n });\r\n\r\n // eslint-disable-next-line github/no-then, @typescript-eslint/promise-function-async\r\n return icdfPTPromise.then(() => {\r\n const icdfTexture = this._icdfPT;\r\n const promises: Array<Promise<void>> = [];\r\n const renderTargets: Array<ProceduralTexture> = [this._cdfyPT, this._cdfxPT, this._scaledLuminancePT, icdfTexture!];\r\n for (const target of renderTargets) {\r\n promises.push(\r\n new Promise((resolve) => {\r\n if (target.isReady()) {\r\n resolve();\r\n } else {\r\n target.getEffect().executeWhenCompiled(() => {\r\n resolve();\r\n });\r\n }\r\n })\r\n );\r\n }\r\n // eslint-disable-next-line github/no-then\r\n return Promise.all(promises).then(() => {\r\n for (const target of renderTargets) {\r\n target.render();\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Finds the average direction of the highest intensity areas of the IBL source\r\n * @returns Async promise that resolves to the dominant direction of the IBL source\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async\r\n public findDominantDirection(): Promise<Vector3> {\r\n if (this._cachedDominantDirection) {\r\n return Promise.resolve(this._cachedDominantDirection);\r\n }\r\n return new Promise((resolve) => {\r\n this._dominantDirectionPT.onGeneratedObservable.addOnce(() => {\r\n const data = new Float32Array(4);\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n this._dominantDirectionPT.readPixels(0, 0, data, true)!.then(() => {\r\n const dominantDirection = new Vector3(data[0], data[1], data[2]);\r\n this._cachedDominantDirection = dominantDirection;\r\n resolve(dominantDirection);\r\n });\r\n });\r\n if (this.isReady()) {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n } else {\r\n this.onGeneratedObservable.addOnce(() => {\r\n if (this._dominantDirectionPT.isReady()) {\r\n this._dominantDirectionPT.render();\r\n } else {\r\n this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {\r\n this._dominantDirectionPT.render();\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disposes the CDF renderer and associated resources\r\n */\r\n public dispose() {\r\n this._clearIblSourceReadinessObservers();\r\n this._disposeTextures();\r\n this._dummyTexture.dispose();\r\n if (this._debugPass) {\r\n this._debugPass.dispose();\r\n }\r\n this.onGeneratedObservable.clear();\r\n }\r\n\r\n private static _IsScene(sceneOrEngine: Scene | AbstractEngine): sceneOrEngine is Scene {\r\n return sceneOrEngine.getClassName() === \"Scene\";\r\n }\r\n}\r\n"]}
@@ -103,6 +103,7 @@ export class OutlineRenderer {
103
103
  }
104
104
  const drawWrapper = subMesh._getDrawWrapper(renderPassId);
105
105
  const effect = DrawWrapper.GetEffect(drawWrapper);
106
+ scene.resetCachedMaterial();
106
107
  engine.enableEffect(drawWrapper);
107
108
  // Logarithmic depth
108
109
  if (material.useLogarithmicDepth) {
@@ -1 +1 @@
1
- {"version":3,"file":"outlineRenderer.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/outlineRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type _InstancesBatch } from \"../Meshes/mesh\";\r\nimport { Scene } from \"../scene.pure\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SceneComponentConstants, type ISceneComponent } from \"../sceneComponent\";\r\n\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This class is responsible to draw the outline/overlay of meshes.\r\n * It should not be used directly but through the available method on mesh.\r\n */\r\nexport class OutlineRenderer implements ISceneComponent {\r\n /**\r\n * Stencil value used to avoid outline being seen within the mesh when the mesh is transparent\r\n */\r\n private static _StencilReference = 0x04;\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n public name = SceneComponentConstants.NAME_OUTLINERENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Defines a zOffset default Factor to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffset = 1;\r\n\r\n /**\r\n * Defines a zOffset default Unit to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffsetUnits = 4; // 4 to account for projection a bit by default\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer is enabled\r\n */\r\n public enabled = true;\r\n\r\n private _engine: AbstractEngine;\r\n private _savedDepthWrite: boolean;\r\n private _passIdForDrawWrapper: number[];\r\n\r\n /** Shader language used by the Outline renderer. */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in the Outline renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new outline renderer. (There could be only one per scene).\r\n * @param scene Defines the scene it belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this._engine = scene.getEngine();\r\n this.scene._addComponent(this);\r\n this._passIdForDrawWrapper = [];\r\n for (let i = 0; i < 4; ++i) {\r\n this._passIdForDrawWrapper[i] = this._engine.createRenderPassId(`Outline Renderer (${i})`);\r\n }\r\n\r\n const engine = this._engine;\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n }\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n public register(): void {\r\n this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE, this, this._beforeRenderingMesh);\r\n this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE, this, this._afterRenderingMesh);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n for (let i = 0; i < this._passIdForDrawWrapper.length; ++i) {\r\n this._engine.releaseRenderPassId(this._passIdForDrawWrapper[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the outline in the canvas.\r\n * @param subMesh Defines the sumesh to render\r\n * @param batch Defines the batch of meshes in case of instances\r\n * @param useOverlay Defines if the rendering is for the overlay or the outline\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @param internal Defines the internal render\r\n */\r\n public render(subMesh: SubMesh, batch: _InstancesBatch, useOverlay: boolean = false, renderPassId?: number, internal?: boolean): void {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const scene = this.scene;\r\n const engine = scene.getEngine();\r\n\r\n const hardwareInstancedRendering =\r\n engine.getCaps().instancedArrays &&\r\n ((batch.visibleInstances[subMesh._id] !== null && batch.visibleInstances[subMesh._id] !== undefined) || subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n if (!this.isReady(subMesh, hardwareInstancedRendering, renderPassId)) {\r\n return;\r\n }\r\n\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = ownerMesh._internalAbstractMeshDataInfo._actAsRegularMesh ? ownerMesh : null;\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = replacementMesh ? replacementMesh : renderingMesh;\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material || !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId)!;\r\n const effect = DrawWrapper.GetEffect(drawWrapper)!;\r\n\r\n engine.enableEffect(drawWrapper);\r\n\r\n // Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(scene.activeCamera.maxZ + 1.0) / Math.LN2));\r\n }\r\n\r\n effect.setFloat(\"offset\", useOverlay ? 0 : renderingMesh.outlineWidth);\r\n effect.setColor4(\r\n \"color\",\r\n useOverlay ? (internal ? renderingMesh._internalOverlayColor : renderingMesh.overlayColor) : renderingMesh.outlineColor,\r\n useOverlay ? (internal ? renderingMesh._internalOverlayAlpha : renderingMesh.overlayAlpha) : material.alpha\r\n );\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha test\r\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, material, scene);\r\n\r\n engine.setZOffset(-this.zOffset);\r\n engine.setZOffsetUnits(-this.zOffsetUnits);\r\n\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n effect.setMatrix(\"world\", world);\r\n });\r\n\r\n engine.setZOffset(0);\r\n engine.setZOffsetUnits(0);\r\n }\r\n\r\n /**\r\n * Returns whether or not the outline renderer is ready for a given submesh.\r\n * All the dependencies e.g. submeshes, texture, effect... mus be ready\r\n * @param subMesh Defines the submesh to check readiness for\r\n * @param useInstances Defines whether wee are trying to render instances or not\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @returns true if ready otherwise false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean, renderPassId?: number): boolean {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n const mesh = subMesh.getMesh();\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n const scene = mesh.getScene();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = true;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = true;\r\n }\r\n }\r\n //Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n // Clip planes\r\n PrepareStringDefinesForClipPlanes(material, scene, defines);\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n const skeleton = mesh.skeleton;\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n true, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (cachedDefines !== join) {\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"offset\",\r\n \"color\",\r\n \"logarithmicDepthConstant\",\r\n \"morphTargetInfluences\",\r\n \"boneTextureInfo\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this.scene.getEngine().createEffect(\r\n \"outline\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/outline.fragment\"), import(\"../ShadersWGSL/outline.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/outline.fragment\"), import(\"../Shaders/outline.vertex\")]);\r\n }\r\n },\r\n },\r\n this.scene.getEngine()\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n private _beforeRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n // Outline - step 1\r\n this._savedDepthWrite = this._engine.getDepthWrite();\r\n if (mesh.renderOutline) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.cacheStencilState();\r\n // Draw only to stencil buffer for the original mesh\r\n // The resulting stencil buffer will be used so the outline is not visible inside the mesh when the mesh is transparent\r\n this._engine.setDepthWrite(false);\r\n this._engine.setColorWrite(false);\r\n this._engine.setStencilBuffer(true);\r\n this._engine.setStencilOperationPass(Constants.REPLACE);\r\n this._engine.setStencilFunction(Constants.ALWAYS);\r\n this._engine.setStencilMask(OutlineRenderer._StencilReference);\r\n this._engine.setStencilFunctionReference(OutlineRenderer._StencilReference);\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = true;\r\n this.render(subMesh, batch, /* This sets offset to 0 */ true, this._passIdForDrawWrapper[1]);\r\n\r\n this._engine.setColorWrite(true);\r\n this._engine.setStencilFunction(Constants.NOTEQUAL);\r\n }\r\n\r\n // Draw the outline using the above stencil if needed to avoid drawing within the mesh\r\n this._engine.setDepthWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[0]);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = false;\r\n this._engine.restoreStencilState();\r\n }\r\n }\r\n }\r\n\r\n private _afterRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n // Overlay\r\n if (mesh.renderOverlay || mesh.renderInternalOverlay) {\r\n const currentMode = this._engine.getAlphaMode();\r\n const alphaBlendState = this._engine.alphaState.alphaBlend;\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n this.render(subMesh, batch, true, this._passIdForDrawWrapper[3], mesh.renderInternalOverlay);\r\n this._engine.setAlphaMode(currentMode);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n this._engine.alphaState.setAlphaBlend(alphaBlendState);\r\n }\r\n\r\n // Outline - step 2\r\n if (mesh.renderOutline && this._savedDepthWrite) {\r\n this._engine.setDepthWrite(true);\r\n this._engine.setColorWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[2]);\r\n this._engine.setColorWrite(true);\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for outlineRenderer.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterOutlineRenderer(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n /**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\n Scene.prototype.getOutlineRenderer = function (): OutlineRenderer {\r\n if (!this._outlineRenderer) {\r\n this._outlineRenderer = new OutlineRenderer(this);\r\n }\r\n return this._outlineRenderer;\r\n };\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderOutline\", {\r\n get: function (this: Mesh) {\r\n return this._renderOutline;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOutline = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderInternalOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderInternalOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderInternalOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n}\r\n"]}
1
+ {"version":3,"file":"outlineRenderer.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/outlineRenderer.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { VertexBuffer } from \"../Buffers/buffer.pure\";\r\nimport { type SubMesh } from \"../Meshes/subMesh.pure\";\r\nimport { Mesh } from \"../Meshes/mesh.pure\";\r\nimport { type _InstancesBatch } from \"../Meshes/mesh\";\r\nimport { Scene } from \"../scene.pure\";\r\nimport { type AbstractEngine } from \"../Engines/abstractEngine.pure\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { SceneComponentConstants, type ISceneComponent } from \"../sceneComponent\";\r\n\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { AddClipPlaneUniforms, BindClipPlane, PrepareStringDefinesForClipPlanes } from \"core/Materials/clipPlaneMaterialHelper\";\r\nimport { BindBonesParameters, BindMorphTargetParameters, PrepareDefinesAndAttributesForMorphTargets, PushAttributesForInstances } from \"../Materials/materialHelper.functions\";\r\nimport { EffectFallbacks } from \"core/Materials/effectFallbacks\";\r\nimport { type IEffectCreationOptions } from \"core/Materials/effect.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This class is responsible to draw the outline/overlay of meshes.\r\n * It should not be used directly but through the available method on mesh.\r\n */\r\nexport class OutlineRenderer implements ISceneComponent {\r\n /**\r\n * Stencil value used to avoid outline being seen within the mesh when the mesh is transparent\r\n */\r\n private static _StencilReference = 0x04;\r\n /**\r\n * The name of the component. Each component must have a unique name.\r\n */\r\n public name = SceneComponentConstants.NAME_OUTLINERENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Defines a zOffset default Factor to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffset = 1;\r\n\r\n /**\r\n * Defines a zOffset default Unit to prevent zFighting between the overlay and the mesh.\r\n */\r\n public zOffsetUnits = 4; // 4 to account for projection a bit by default\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the renderer is enabled\r\n */\r\n public enabled = true;\r\n\r\n private _engine: AbstractEngine;\r\n private _savedDepthWrite: boolean;\r\n private _passIdForDrawWrapper: number[];\r\n\r\n /** Shader language used by the Outline renderer. */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in the Outline renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new outline renderer. (There could be only one per scene).\r\n * @param scene Defines the scene it belongs to\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n this._engine = scene.getEngine();\r\n this.scene._addComponent(this);\r\n this._passIdForDrawWrapper = [];\r\n for (let i = 0; i < 4; ++i) {\r\n this._passIdForDrawWrapper[i] = this._engine.createRenderPassId(`Outline Renderer (${i})`);\r\n }\r\n\r\n const engine = this._engine;\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n }\r\n\r\n /**\r\n * Register the component to one instance of a scene.\r\n */\r\n public register(): void {\r\n this.scene._beforeRenderingMeshStage.registerStep(SceneComponentConstants.STEP_BEFORERENDERINGMESH_OUTLINE, this, this._beforeRenderingMesh);\r\n this.scene._afterRenderingMeshStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGMESH_OUTLINE, this, this._afterRenderingMesh);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do here.\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources.\r\n */\r\n public dispose(): void {\r\n for (let i = 0; i < this._passIdForDrawWrapper.length; ++i) {\r\n this._engine.releaseRenderPassId(this._passIdForDrawWrapper[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Renders the outline in the canvas.\r\n * @param subMesh Defines the sumesh to render\r\n * @param batch Defines the batch of meshes in case of instances\r\n * @param useOverlay Defines if the rendering is for the overlay or the outline\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @param internal Defines the internal render\r\n */\r\n public render(subMesh: SubMesh, batch: _InstancesBatch, useOverlay: boolean = false, renderPassId?: number, internal?: boolean): void {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const scene = this.scene;\r\n const engine = scene.getEngine();\r\n\r\n const hardwareInstancedRendering =\r\n engine.getCaps().instancedArrays &&\r\n ((batch.visibleInstances[subMesh._id] !== null && batch.visibleInstances[subMesh._id] !== undefined) || subMesh.getRenderingMesh().hasThinInstances);\r\n\r\n if (!this.isReady(subMesh, hardwareInstancedRendering, renderPassId)) {\r\n return;\r\n }\r\n\r\n const ownerMesh = subMesh.getMesh();\r\n const replacementMesh = ownerMesh._internalAbstractMeshDataInfo._actAsRegularMesh ? ownerMesh : null;\r\n const renderingMesh = subMesh.getRenderingMesh();\r\n const effectiveMesh = replacementMesh ? replacementMesh : renderingMesh;\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material || !scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId)!;\r\n const effect = DrawWrapper.GetEffect(drawWrapper)!;\r\n\r\n scene.resetCachedMaterial();\r\n engine.enableEffect(drawWrapper);\r\n\r\n // Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n effect.setFloat(\"logarithmicDepthConstant\", 2.0 / (Math.log(scene.activeCamera.maxZ + 1.0) / Math.LN2));\r\n }\r\n\r\n effect.setFloat(\"offset\", useOverlay ? 0 : renderingMesh.outlineWidth);\r\n effect.setColor4(\r\n \"color\",\r\n useOverlay ? (internal ? renderingMesh._internalOverlayColor : renderingMesh.overlayColor) : renderingMesh.outlineColor,\r\n useOverlay ? (internal ? renderingMesh._internalOverlayAlpha : renderingMesh.overlayAlpha) : material.alpha\r\n );\r\n effect.setMatrix(\"viewProjection\", scene.getTransformMatrix());\r\n effect.setMatrix(\"world\", effectiveMesh.getWorldMatrix());\r\n\r\n // Bones\r\n BindBonesParameters(renderingMesh, effect);\r\n\r\n // Morph targets\r\n BindMorphTargetParameters(renderingMesh, effect);\r\n if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {\r\n renderingMesh.morphTargetManager._bind(effect);\r\n }\r\n\r\n if (!hardwareInstancedRendering) {\r\n renderingMesh._bind(subMesh, effect, material.fillMode);\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n bvaManager.bind(effect, hardwareInstancedRendering);\r\n }\r\n\r\n // Alpha test\r\n if (material && material.needAlphaTestingForMesh(effectiveMesh)) {\r\n const alphaTexture = material.getAlphaTestTexture();\r\n if (alphaTexture) {\r\n effect.setTexture(\"diffuseSampler\", alphaTexture);\r\n effect.setMatrix(\"diffuseMatrix\", alphaTexture.getTextureMatrix());\r\n }\r\n }\r\n\r\n // Clip plane\r\n BindClipPlane(effect, material, scene);\r\n\r\n engine.setZOffset(-this.zOffset);\r\n engine.setZOffsetUnits(-this.zOffsetUnits);\r\n\r\n renderingMesh._processRendering(effectiveMesh, subMesh, effect, material.fillMode, batch, hardwareInstancedRendering, (isInstance, world) => {\r\n effect.setMatrix(\"world\", world);\r\n });\r\n\r\n engine.setZOffset(0);\r\n engine.setZOffsetUnits(0);\r\n }\r\n\r\n /**\r\n * Returns whether or not the outline renderer is ready for a given submesh.\r\n * All the dependencies e.g. submeshes, texture, effect... mus be ready\r\n * @param subMesh Defines the submesh to check readiness for\r\n * @param useInstances Defines whether wee are trying to render instances or not\r\n * @param renderPassId Render pass id to use to render the mesh\r\n * @returns true if ready otherwise false\r\n */\r\n public isReady(subMesh: SubMesh, useInstances: boolean, renderPassId?: number): boolean {\r\n renderPassId = renderPassId ?? this._passIdForDrawWrapper[0];\r\n\r\n const defines = [];\r\n const attribs = [VertexBuffer.PositionKind, VertexBuffer.NormalKind];\r\n\r\n const mesh = subMesh.getMesh();\r\n const material = subMesh.getMaterial();\r\n\r\n if (!material) {\r\n return false;\r\n }\r\n\r\n const scene = mesh.getScene();\r\n\r\n let uv1 = false;\r\n let uv2 = false;\r\n const color = false;\r\n\r\n // Alpha test\r\n if (material.needAlphaTestingForMesh(mesh)) {\r\n defines.push(\"#define ALPHATEST\");\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UVKind)) {\r\n attribs.push(VertexBuffer.UVKind);\r\n defines.push(\"#define UV1\");\r\n uv1 = true;\r\n }\r\n if (mesh.isVerticesDataPresent(VertexBuffer.UV2Kind)) {\r\n attribs.push(VertexBuffer.UV2Kind);\r\n defines.push(\"#define UV2\");\r\n uv2 = true;\r\n }\r\n }\r\n //Logarithmic depth\r\n if ((<any>material).useLogarithmicDepth) {\r\n defines.push(\"#define LOGARITHMICDEPTH\");\r\n }\r\n // Clip planes\r\n PrepareStringDefinesForClipPlanes(material, scene, defines);\r\n\r\n // Bones\r\n const fallbacks = new EffectFallbacks();\r\n if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {\r\n attribs.push(VertexBuffer.MatricesIndicesKind);\r\n attribs.push(VertexBuffer.MatricesWeightsKind);\r\n if (mesh.numBoneInfluencers > 4) {\r\n attribs.push(VertexBuffer.MatricesIndicesExtraKind);\r\n attribs.push(VertexBuffer.MatricesWeightsExtraKind);\r\n }\r\n const skeleton = mesh.skeleton;\r\n defines.push(\"#define NUM_BONE_INFLUENCERS \" + mesh.numBoneInfluencers);\r\n if (mesh.numBoneInfluencers > 0) {\r\n fallbacks.addCPUSkinningFallback(0, mesh);\r\n }\r\n\r\n if (skeleton.isUsingTextureForMatrices) {\r\n defines.push(\"#define BONETEXTURE\");\r\n } else {\r\n defines.push(\"#define BonesPerMesh \" + (skeleton.bones.length + 1));\r\n }\r\n } else {\r\n defines.push(\"#define NUM_BONE_INFLUENCERS 0\");\r\n }\r\n\r\n // Morph targets\r\n const numMorphInfluencers = mesh.morphTargetManager\r\n ? PrepareDefinesAndAttributesForMorphTargets(\r\n mesh.morphTargetManager,\r\n defines,\r\n attribs,\r\n mesh,\r\n true, // usePositionMorph\r\n true, // useNormalMorph\r\n false, // useTangentMorph\r\n uv1, // useUVMorph\r\n uv2, // useUV2Morph\r\n color // useColorMorph\r\n )\r\n : 0;\r\n\r\n // Instances\r\n if (useInstances) {\r\n defines.push(\"#define INSTANCES\");\r\n PushAttributesForInstances(attribs);\r\n if (subMesh.getRenderingMesh().hasThinInstances) {\r\n defines.push(\"#define THIN_INSTANCES\");\r\n }\r\n }\r\n\r\n // Baked vertex animations\r\n const bvaManager = mesh.bakedVertexAnimationManager;\r\n if (bvaManager && bvaManager.isEnabled) {\r\n defines.push(\"#define BAKED_VERTEX_ANIMATION_TEXTURE\");\r\n if (useInstances) {\r\n attribs.push(\"bakedVertexAnimationSettingsInstanced\");\r\n }\r\n }\r\n\r\n // Get correct effect\r\n const drawWrapper = subMesh._getDrawWrapper(renderPassId, true)!;\r\n const cachedDefines = drawWrapper.defines;\r\n const join = defines.join(\"\\n\");\r\n\r\n if (cachedDefines !== join) {\r\n const uniforms = [\r\n \"world\",\r\n \"mBones\",\r\n \"viewProjection\",\r\n \"diffuseMatrix\",\r\n \"offset\",\r\n \"color\",\r\n \"logarithmicDepthConstant\",\r\n \"morphTargetInfluences\",\r\n \"boneTextureInfo\",\r\n \"morphTargetCount\",\r\n \"morphTargetTextureInfo\",\r\n \"morphTargetTextureIndices\",\r\n \"bakedVertexAnimationSettings\",\r\n \"bakedVertexAnimationTextureSizeInverted\",\r\n \"bakedVertexAnimationTime\",\r\n \"bakedVertexAnimationTexture\",\r\n ];\r\n const samplers = [\"diffuseSampler\", \"boneSampler\", \"morphTargets\", \"bakedVertexAnimationTexture\"];\r\n\r\n AddClipPlaneUniforms(uniforms);\r\n\r\n drawWrapper.setEffect(\r\n this.scene.getEngine().createEffect(\r\n \"outline\",\r\n <IEffectCreationOptions>{\r\n attributes: attribs,\r\n uniformsNames: uniforms,\r\n uniformBuffersNames: [],\r\n samplers: samplers,\r\n defines: join,\r\n fallbacks: fallbacks,\r\n onCompiled: null,\r\n onError: null,\r\n indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/outline.fragment\"), import(\"../ShadersWGSL/outline.vertex\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/outline.fragment\"), import(\"../Shaders/outline.vertex\")]);\r\n }\r\n },\r\n },\r\n this.scene.getEngine()\r\n ),\r\n join\r\n );\r\n }\r\n\r\n return drawWrapper.effect!.isReady();\r\n }\r\n\r\n private _beforeRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n // Outline - step 1\r\n this._savedDepthWrite = this._engine.getDepthWrite();\r\n if (mesh.renderOutline) {\r\n const material = subMesh.getMaterial();\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.cacheStencilState();\r\n // Draw only to stencil buffer for the original mesh\r\n // The resulting stencil buffer will be used so the outline is not visible inside the mesh when the mesh is transparent\r\n this._engine.setDepthWrite(false);\r\n this._engine.setColorWrite(false);\r\n this._engine.setStencilBuffer(true);\r\n this._engine.setStencilOperationPass(Constants.REPLACE);\r\n this._engine.setStencilFunction(Constants.ALWAYS);\r\n this._engine.setStencilMask(OutlineRenderer._StencilReference);\r\n this._engine.setStencilFunctionReference(OutlineRenderer._StencilReference);\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = true;\r\n this.render(subMesh, batch, /* This sets offset to 0 */ true, this._passIdForDrawWrapper[1]);\r\n\r\n this._engine.setColorWrite(true);\r\n this._engine.setStencilFunction(Constants.NOTEQUAL);\r\n }\r\n\r\n // Draw the outline using the above stencil if needed to avoid drawing within the mesh\r\n this._engine.setDepthWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[0]);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n\r\n if (material && material.needAlphaBlendingForMesh(mesh)) {\r\n this._engine.stencilStateComposer.useStencilGlobalOnly = false;\r\n this._engine.restoreStencilState();\r\n }\r\n }\r\n }\r\n\r\n private _afterRenderingMesh(mesh: Mesh, subMesh: SubMesh, batch: _InstancesBatch): void {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n // Overlay\r\n if (mesh.renderOverlay || mesh.renderInternalOverlay) {\r\n const currentMode = this._engine.getAlphaMode();\r\n const alphaBlendState = this._engine.alphaState.alphaBlend;\r\n this._engine.setAlphaMode(Constants.ALPHA_COMBINE);\r\n this.render(subMesh, batch, true, this._passIdForDrawWrapper[3], mesh.renderInternalOverlay);\r\n this._engine.setAlphaMode(currentMode);\r\n this._engine.setDepthWrite(this._savedDepthWrite);\r\n this._engine.alphaState.setAlphaBlend(alphaBlendState);\r\n }\r\n\r\n // Outline - step 2\r\n if (mesh.renderOutline && this._savedDepthWrite) {\r\n this._engine.setDepthWrite(true);\r\n this._engine.setColorWrite(false);\r\n this.render(subMesh, batch, false, this._passIdForDrawWrapper[2]);\r\n this._engine.setColorWrite(true);\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for outlineRenderer.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterOutlineRenderer(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n /**\r\n * Gets the outline renderer associated with the scene\r\n * @returns a OutlineRenderer\r\n */\r\n Scene.prototype.getOutlineRenderer = function (): OutlineRenderer {\r\n if (!this._outlineRenderer) {\r\n this._outlineRenderer = new OutlineRenderer(this);\r\n }\r\n return this._outlineRenderer;\r\n };\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderOutline\", {\r\n get: function (this: Mesh) {\r\n return this._renderOutline;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOutline = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Object.defineProperty(Mesh.prototype, \"renderInternalOverlay\", {\r\n get: function (this: Mesh) {\r\n return this._renderInternalOverlay;\r\n },\r\n set: function (this: Mesh, value: boolean) {\r\n if (value) {\r\n // Lazy Load the component.\r\n this.getScene().getOutlineRenderer();\r\n }\r\n this._renderInternalOverlay = value;\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n}\r\n"]}
@@ -98,7 +98,7 @@ export class SubSurfaceConfiguration {
98
98
  return i;
99
99
  }
100
100
  }
101
- this._ssDiffusionS.push(color.r, color.b, color.g);
101
+ this._ssDiffusionS.push(color.r, color.g, color.b);
102
102
  this._ssDiffusionD.push(Math.max(Math.max(color.r, color.b), color.g));
103
103
  this._ssFilterRadii.push(this.getDiffusionProfileParameters(color));
104
104
  this.ssDiffusionProfileColors.push(color);
@@ -1 +1 @@
1
- {"version":3,"file":"subSurfaceConfiguration.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Color3, Color4 } from \"../Maths/math.color.pure\";\r\nimport { SubSurfaceScatteringPostProcess } from \"../PostProcesses/subSurfaceScatteringPostProcess.pure\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { type PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { RegisterSubSurfaceSceneComponent } from \"./subSurfaceSceneComponent.pure\";\r\n\r\n/**\r\n * Contains all parameters needed for the prepass to perform\r\n * screen space subsurface scattering\r\n */\r\nexport class SubSurfaceConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"SubSurfaceSceneComponent\");\r\n };\r\n\r\n private _ssDiffusionS: number[] = [];\r\n private _ssFilterRadii: number[] = [];\r\n private _ssDiffusionD: number[] = [];\r\n\r\n /**\r\n * Post process to attach for screen space subsurface scattering\r\n */\r\n public postProcess: SubSurfaceScatteringPostProcess;\r\n\r\n /**\r\n * Diffusion profile color for subsurface scattering\r\n */\r\n public get ssDiffusionS() {\r\n return this._ssDiffusionS;\r\n }\r\n\r\n /**\r\n * Diffusion profile max color channel value for subsurface scattering\r\n */\r\n public get ssDiffusionD() {\r\n return this._ssDiffusionD;\r\n }\r\n\r\n /**\r\n * Diffusion profile filter radius for subsurface scattering\r\n */\r\n public get ssFilterRadii() {\r\n return this._ssFilterRadii;\r\n }\r\n\r\n /**\r\n * Is subsurface enabled\r\n */\r\n public enabled = false;\r\n\r\n /**\r\n * Does the output of this prepass need to go through imageprocessing\r\n */\r\n public needsImageProcessing = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = SceneComponentConstants.NAME_SUBSURFACE;\r\n\r\n /**\r\n * Diffusion profile colors for subsurface scattering\r\n * You can add one diffusion color using `addDiffusionProfile` on `scene.prePassRenderer`\r\n * See ...\r\n * Note that you can only store up to 5 of them\r\n */\r\n public ssDiffusionProfileColors: Color3[] = [];\r\n\r\n /**\r\n * Defines the ratio real world => scene units.\r\n * Used for subsurface scattering\r\n */\r\n public metersPerUnit: number = 1;\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [\r\n Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n Constants.PREPASS_IRRADIANCE_LEGACY_TEXTURE_TYPE,\r\n ];\r\n\r\n /**\r\n * The clear color of the render targets.\r\n * We need 1 for the alpha channel of the irradiance texture so that we early exit from the SSS post-process if the pixel should not be processed\r\n */\r\n public clearColor = new Color4(0, 0, 0, 1);\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * Builds a subsurface configuration object\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n // Adding default diffusion profile\r\n this.addDiffusionProfile(new Color3(1, 1, 1));\r\n this._scene = scene;\r\n\r\n RegisterSubSurfaceSceneComponent(SubSurfaceConfiguration);\r\n SubSurfaceConfiguration._SceneComponentInitialization(this._scene);\r\n }\r\n\r\n /**\r\n * Adds a new diffusion profile.\r\n * Useful for more realistic subsurface scattering on diverse materials.\r\n * @param color The color of the diffusion profile. Should be the average color of the material.\r\n * @returns The index of the diffusion profile for the material subsurface configuration\r\n */\r\n public addDiffusionProfile(color: Color3): number {\r\n if (this.ssDiffusionD.length >= 5) {\r\n // We only suppport 5 diffusion profiles\r\n Logger.Error(\"You already reached the maximum number of diffusion profiles.\");\r\n return 0; // default profile\r\n }\r\n\r\n // Do not add doubles\r\n for (let i = 0; i < this._ssDiffusionS.length / 3; i++) {\r\n if (this._ssDiffusionS[i * 3] === color.r && this._ssDiffusionS[i * 3 + 1] === color.g && this._ssDiffusionS[i * 3 + 2] === color.b) {\r\n return i;\r\n }\r\n }\r\n\r\n this._ssDiffusionS.push(color.r, color.b, color.g);\r\n this._ssDiffusionD.push(Math.max(Math.max(color.r, color.b), color.g));\r\n this._ssFilterRadii.push(this.getDiffusionProfileParameters(color));\r\n this.ssDiffusionProfileColors.push(color);\r\n\r\n return this._ssDiffusionD.length - 1;\r\n }\r\n\r\n /**\r\n * Creates the sss post process\r\n * @returns The created post process\r\n */\r\n public createPostProcess(): SubSurfaceScatteringPostProcess {\r\n this.postProcess = new SubSurfaceScatteringPostProcess(\"subSurfaceScattering\", this._scene, {\r\n size: 1,\r\n engine: this._scene.getEngine(),\r\n shaderLanguage: this._scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n });\r\n this.postProcess.autoClear = false;\r\n\r\n return this.postProcess;\r\n }\r\n\r\n /**\r\n * Deletes all diffusion profiles.\r\n * Note that in order to render subsurface scattering, you should have at least 1 diffusion profile.\r\n */\r\n public clearAllDiffusionProfiles() {\r\n this._ssDiffusionD = [];\r\n this._ssDiffusionS = [];\r\n this._ssFilterRadii = [];\r\n this.ssDiffusionProfileColors = [];\r\n }\r\n\r\n /**\r\n * Disposes this object\r\n */\r\n public dispose() {\r\n this.clearAllDiffusionProfiles();\r\n if (this.postProcess) {\r\n this.postProcess.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * https://zero-radiance.github.io/post/sampling-diffusion/\r\n *\r\n * Importance sample the normalized diffuse reflectance profile for the computed value of 's'.\r\n * ------------------------------------------------------------------------------------\r\n * R[r, phi, s] = s * (Exp[-r * s] + Exp[-r * s / 3]) / (8 * Pi * r)\r\n * PDF[r, phi, s] = r * R[r, phi, s]\r\n * CDF[r, s] = 1 - 1/4 * Exp[-r * s] - 3/4 * Exp[-r * s / 3]\r\n * ------------------------------------------------------------------------------------\r\n * We importance sample the color channel with the widest scattering distance.\r\n */\r\n public getDiffusionProfileParameters(color: Color3) {\r\n const cdf = 0.997;\r\n const maxScatteringDistance = Math.max(color.r, color.g, color.b);\r\n\r\n return this._sampleBurleyDiffusionProfile(cdf, maxScatteringDistance);\r\n }\r\n\r\n /**\r\n * Performs sampling of a Normalized Burley diffusion profile in polar coordinates.\r\n * 'u' is the random number (the value of the CDF): [0, 1).\r\n * rcp(s) = 1 / ShapeParam = ScatteringDistance.\r\n * Returns the sampled radial distance, s.t. (u = 0 -> r = 0) and (u = 1 -> r = Inf).\r\n * @param u\r\n * @param rcpS\r\n * @returns The sampled radial distance\r\n */\r\n private _sampleBurleyDiffusionProfile(u: number, rcpS: number) {\r\n u = 1 - u; // Convert CDF to CCDF\r\n\r\n const g = 1 + 4 * u * (2 * u + Math.sqrt(1 + 4 * u * u));\r\n const n = Math.pow(g, -1.0 / 3.0); // g^(-1/3)\r\n const p = g * n * n; // g^(+1/3)\r\n const c = 1 + p + n; // 1 + g^(+1/3) + g^(-1/3)\r\n const x = 3 * Math.log(c / (4 * u));\r\n\r\n return x * rcpS;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"subSurfaceConfiguration.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Color3, Color4 } from \"../Maths/math.color.pure\";\r\nimport { SubSurfaceScatteringPostProcess } from \"../PostProcesses/subSurfaceScatteringPostProcess.pure\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { type PrePassEffectConfiguration } from \"./prePassEffectConfiguration\";\r\nimport { _WarnImport } from \"../Misc/devTools\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { RegisterSubSurfaceSceneComponent } from \"./subSurfaceSceneComponent.pure\";\r\n\r\n/**\r\n * Contains all parameters needed for the prepass to perform\r\n * screen space subsurface scattering\r\n */\r\nexport class SubSurfaceConfiguration implements PrePassEffectConfiguration {\r\n /**\r\n * @internal\r\n */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"SubSurfaceSceneComponent\");\r\n };\r\n\r\n private _ssDiffusionS: number[] = [];\r\n private _ssFilterRadii: number[] = [];\r\n private _ssDiffusionD: number[] = [];\r\n\r\n /**\r\n * Post process to attach for screen space subsurface scattering\r\n */\r\n public postProcess: SubSurfaceScatteringPostProcess;\r\n\r\n /**\r\n * Diffusion profile color for subsurface scattering\r\n */\r\n public get ssDiffusionS() {\r\n return this._ssDiffusionS;\r\n }\r\n\r\n /**\r\n * Diffusion profile max color channel value for subsurface scattering\r\n */\r\n public get ssDiffusionD() {\r\n return this._ssDiffusionD;\r\n }\r\n\r\n /**\r\n * Diffusion profile filter radius for subsurface scattering\r\n */\r\n public get ssFilterRadii() {\r\n return this._ssFilterRadii;\r\n }\r\n\r\n /**\r\n * Is subsurface enabled\r\n */\r\n public enabled = false;\r\n\r\n /**\r\n * Does the output of this prepass need to go through imageprocessing\r\n */\r\n public needsImageProcessing = true;\r\n\r\n /**\r\n * Name of the configuration\r\n */\r\n public name = SceneComponentConstants.NAME_SUBSURFACE;\r\n\r\n /**\r\n * Diffusion profile colors for subsurface scattering\r\n * You can add one diffusion color using `addDiffusionProfile` on `scene.prePassRenderer`\r\n * See ...\r\n * Note that you can only store up to 5 of them\r\n */\r\n public ssDiffusionProfileColors: Color3[] = [];\r\n\r\n /**\r\n * Defines the ratio real world => scene units.\r\n * Used for subsurface scattering\r\n */\r\n public metersPerUnit: number = 1;\r\n\r\n /**\r\n * Textures that should be present in the MRT for this effect to work\r\n */\r\n public readonly texturesRequired: number[] = [\r\n Constants.PREPASS_DEPTH_TEXTURE_TYPE,\r\n Constants.PREPASS_ALBEDO_SQRT_TEXTURE_TYPE,\r\n Constants.PREPASS_COLOR_TEXTURE_TYPE,\r\n Constants.PREPASS_IRRADIANCE_LEGACY_TEXTURE_TYPE,\r\n ];\r\n\r\n /**\r\n * The clear color of the render targets.\r\n * We need 1 for the alpha channel of the irradiance texture so that we early exit from the SSS post-process if the pixel should not be processed\r\n */\r\n public clearColor = new Color4(0, 0, 0, 1);\r\n\r\n private _scene: Scene;\r\n\r\n /**\r\n * Builds a subsurface configuration object\r\n * @param scene The scene\r\n */\r\n constructor(scene: Scene) {\r\n // Adding default diffusion profile\r\n this.addDiffusionProfile(new Color3(1, 1, 1));\r\n this._scene = scene;\r\n\r\n RegisterSubSurfaceSceneComponent(SubSurfaceConfiguration);\r\n SubSurfaceConfiguration._SceneComponentInitialization(this._scene);\r\n }\r\n\r\n /**\r\n * Adds a new diffusion profile.\r\n * Useful for more realistic subsurface scattering on diverse materials.\r\n * @param color The color of the diffusion profile. Should be the average color of the material.\r\n * @returns The index of the diffusion profile for the material subsurface configuration\r\n */\r\n public addDiffusionProfile(color: Color3): number {\r\n if (this.ssDiffusionD.length >= 5) {\r\n // We only suppport 5 diffusion profiles\r\n Logger.Error(\"You already reached the maximum number of diffusion profiles.\");\r\n return 0; // default profile\r\n }\r\n\r\n // Do not add doubles\r\n for (let i = 0; i < this._ssDiffusionS.length / 3; i++) {\r\n if (this._ssDiffusionS[i * 3] === color.r && this._ssDiffusionS[i * 3 + 1] === color.g && this._ssDiffusionS[i * 3 + 2] === color.b) {\r\n return i;\r\n }\r\n }\r\n\r\n this._ssDiffusionS.push(color.r, color.g, color.b);\r\n this._ssDiffusionD.push(Math.max(Math.max(color.r, color.b), color.g));\r\n this._ssFilterRadii.push(this.getDiffusionProfileParameters(color));\r\n this.ssDiffusionProfileColors.push(color);\r\n\r\n return this._ssDiffusionD.length - 1;\r\n }\r\n\r\n /**\r\n * Creates the sss post process\r\n * @returns The created post process\r\n */\r\n public createPostProcess(): SubSurfaceScatteringPostProcess {\r\n this.postProcess = new SubSurfaceScatteringPostProcess(\"subSurfaceScattering\", this._scene, {\r\n size: 1,\r\n engine: this._scene.getEngine(),\r\n shaderLanguage: this._scene.getEngine().isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n });\r\n this.postProcess.autoClear = false;\r\n\r\n return this.postProcess;\r\n }\r\n\r\n /**\r\n * Deletes all diffusion profiles.\r\n * Note that in order to render subsurface scattering, you should have at least 1 diffusion profile.\r\n */\r\n public clearAllDiffusionProfiles() {\r\n this._ssDiffusionD = [];\r\n this._ssDiffusionS = [];\r\n this._ssFilterRadii = [];\r\n this.ssDiffusionProfileColors = [];\r\n }\r\n\r\n /**\r\n * Disposes this object\r\n */\r\n public dispose() {\r\n this.clearAllDiffusionProfiles();\r\n if (this.postProcess) {\r\n this.postProcess.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n * https://zero-radiance.github.io/post/sampling-diffusion/\r\n *\r\n * Importance sample the normalized diffuse reflectance profile for the computed value of 's'.\r\n * ------------------------------------------------------------------------------------\r\n * R[r, phi, s] = s * (Exp[-r * s] + Exp[-r * s / 3]) / (8 * Pi * r)\r\n * PDF[r, phi, s] = r * R[r, phi, s]\r\n * CDF[r, s] = 1 - 1/4 * Exp[-r * s] - 3/4 * Exp[-r * s / 3]\r\n * ------------------------------------------------------------------------------------\r\n * We importance sample the color channel with the widest scattering distance.\r\n */\r\n public getDiffusionProfileParameters(color: Color3) {\r\n const cdf = 0.997;\r\n const maxScatteringDistance = Math.max(color.r, color.g, color.b);\r\n\r\n return this._sampleBurleyDiffusionProfile(cdf, maxScatteringDistance);\r\n }\r\n\r\n /**\r\n * Performs sampling of a Normalized Burley diffusion profile in polar coordinates.\r\n * 'u' is the random number (the value of the CDF): [0, 1).\r\n * rcp(s) = 1 / ShapeParam = ScatteringDistance.\r\n * Returns the sampled radial distance, s.t. (u = 0 -> r = 0) and (u = 1 -> r = Inf).\r\n * @param u\r\n * @param rcpS\r\n * @returns The sampled radial distance\r\n */\r\n private _sampleBurleyDiffusionProfile(u: number, rcpS: number) {\r\n u = 1 - u; // Convert CDF to CCDF\r\n\r\n const g = 1 + 4 * u * (2 * u + Math.sqrt(1 + 4 * u * u));\r\n const n = Math.pow(g, -1.0 / 3.0); // g^(-1/3)\r\n const p = g * n * n; // g^(+1/3)\r\n const c = 1 + p + n; // 1 + g^(+1/3) + g^(-1/3)\r\n const x = 3 * Math.log(c / (4 * u));\r\n\r\n return x * rcpS;\r\n }\r\n}\r\n"]}
@@ -10,7 +10,7 @@ export declare class SubSurfaceSceneComponent implements ISceneSerializableCompo
10
10
  /**
11
11
  * The component name helpful to identify the component in the list of scene components.
12
12
  */
13
- readonly name = "PrePassRenderer";
13
+ readonly name = "SubSurface";
14
14
  /**
15
15
  * The scene the component belongs to.
16
16
  */
@@ -16,7 +16,7 @@ export class SubSurfaceSceneComponent {
16
16
  /**
17
17
  * The component name helpful to identify the component in the list of scene components.
18
18
  */
19
- this.name = SceneComponentConstants.NAME_PREPASSRENDERER;
19
+ this.name = SceneComponentConstants.NAME_SUBSURFACE;
20
20
  this.scene = scene;
21
21
  }
22
22
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"subSurfaceSceneComponent.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceSceneComponent.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { Scene } from \"../scene.pure\";\r\nimport { SceneComponentConstants, type ISceneSerializableComponent } from \"../sceneComponent\";\r\n\r\nimport { type Nullable } from \"../types\";\r\nimport { Color3 } from \"../Maths/math.color.pure\";\r\nimport { AddParser } from \"core/Loading/Plugins/babylonFileParser.function\";\r\nimport { type SubSurfaceConfiguration } from \"./subSurfaceConfiguration\";\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class SubSurfaceSceneComponent implements ISceneSerializableComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_PREPASSRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {}\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n public serialize(serializationObject: any): void {\r\n if (!this.scene.subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n const ssDiffusionProfileColors = this.scene.subSurfaceConfiguration.ssDiffusionProfileColors;\r\n serializationObject.ssDiffusionProfileColors = [];\r\n\r\n for (let i = 0; i < ssDiffusionProfileColors.length; i++) {\r\n serializationObject.ssDiffusionProfileColors.push({\r\n r: ssDiffusionProfileColors[i].r,\r\n g: ssDiffusionProfileColors[i].g,\r\n b: ssDiffusionProfileColors[i].b,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n */\r\n public addFromContainer(): void {\r\n // Nothing to do\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n */\r\n public removeFromContainer(): void {\r\n // Make sure nothing will be serialized\r\n if (!this.scene.prePassRenderer) {\r\n return;\r\n }\r\n\r\n if (this.scene.subSurfaceConfiguration) {\r\n this.scene.subSurfaceConfiguration.clearAllDiffusionProfiles();\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for subSurfaceSceneComponent.\r\n * Safe to call multiple times; only the first call has an effect.\r\n * @param subSurfaceConfigClass The SubSurfaceConfiguration class to register the component for\r\n */\r\nexport function RegisterSubSurfaceSceneComponent(subSurfaceConfigClass: typeof SubSurfaceConfiguration): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n // Adds the parser to the scene parsers.\r\n AddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData: any, scene: Scene) => {\r\n // Diffusion profiles\r\n if (parsedData.ssDiffusionProfileColors !== undefined && parsedData.ssDiffusionProfileColors !== null) {\r\n scene.enableSubSurfaceForPrePass();\r\n if (scene.subSurfaceConfiguration) {\r\n for (let index = 0, cache = parsedData.ssDiffusionProfileColors.length; index < cache; index++) {\r\n const color = parsedData.ssDiffusionProfileColors[index];\r\n scene.subSurfaceConfiguration.addDiffusionProfile(new Color3(color.r, color.g, color.b));\r\n }\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(Scene.prototype, \"subSurfaceConfiguration\", {\r\n get: function (this: Scene) {\r\n return this._subSurfaceConfiguration;\r\n },\r\n set: function (this: Scene, value: Nullable<SubSurfaceConfiguration>) {\r\n if (value) {\r\n if (this.enablePrePassRenderer()) {\r\n this._subSurfaceConfiguration = value;\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Scene.prototype.enableSubSurfaceForPrePass = function (): Nullable<SubSurfaceConfiguration> {\r\n if (this._subSurfaceConfiguration) {\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n const prePassRenderer = this.enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n this._subSurfaceConfiguration = new subSurfaceConfigClass(this);\r\n prePassRenderer.addEffectConfiguration(this._subSurfaceConfiguration);\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n Scene.prototype.disableSubSurfaceForPrePass = function (): void {\r\n if (!this._subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n this._subSurfaceConfiguration.dispose();\r\n this._subSurfaceConfiguration = null;\r\n };\r\n\r\n subSurfaceConfigClass._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_SUBSURFACE) as SubSurfaceSceneComponent;\r\n if (!component) {\r\n component = new SubSurfaceSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n };\r\n}\r\n"]}
1
+ {"version":3,"file":"subSurfaceSceneComponent.pure.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/subSurfaceSceneComponent.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { Scene } from \"../scene.pure\";\r\nimport { SceneComponentConstants, type ISceneSerializableComponent } from \"../sceneComponent\";\r\n\r\nimport { type Nullable } from \"../types\";\r\nimport { Color3 } from \"../Maths/math.color.pure\";\r\nimport { AddParser } from \"core/Loading/Plugins/babylonFileParser.function\";\r\nimport { type SubSurfaceConfiguration } from \"./subSurfaceConfiguration\";\r\n\r\n/**\r\n * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful\r\n * in several rendering techniques.\r\n */\r\nexport class SubSurfaceSceneComponent implements ISceneSerializableComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_SUBSURFACE;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Creates a new instance of the component for the given scene\r\n * @param scene Defines the scene to register the component in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {}\r\n\r\n /**\r\n * Serializes the component data to the specified json object\r\n * @param serializationObject The object to serialize to\r\n */\r\n public serialize(serializationObject: any): void {\r\n if (!this.scene.subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n const ssDiffusionProfileColors = this.scene.subSurfaceConfiguration.ssDiffusionProfileColors;\r\n serializationObject.ssDiffusionProfileColors = [];\r\n\r\n for (let i = 0; i < ssDiffusionProfileColors.length; i++) {\r\n serializationObject.ssDiffusionProfileColors.push({\r\n r: ssDiffusionProfileColors[i].r,\r\n g: ssDiffusionProfileColors[i].g,\r\n b: ssDiffusionProfileColors[i].b,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Adds all the elements from the container to the scene\r\n */\r\n public addFromContainer(): void {\r\n // Nothing to do\r\n }\r\n\r\n /**\r\n * Removes all the elements in the container from the scene\r\n */\r\n public removeFromContainer(): void {\r\n // Make sure nothing will be serialized\r\n if (!this.scene.prePassRenderer) {\r\n return;\r\n }\r\n\r\n if (this.scene.subSurfaceConfiguration) {\r\n this.scene.subSurfaceConfiguration.clearAllDiffusionProfiles();\r\n }\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n // Nothing to do for this component\r\n }\r\n\r\n /**\r\n * Disposes the component and the associated resources\r\n */\r\n public dispose(): void {\r\n // Nothing to do for this component\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for subSurfaceSceneComponent.\r\n * Safe to call multiple times; only the first call has an effect.\r\n * @param subSurfaceConfigClass The SubSurfaceConfiguration class to register the component for\r\n */\r\nexport function RegisterSubSurfaceSceneComponent(subSurfaceConfigClass: typeof SubSurfaceConfiguration): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n // Adds the parser to the scene parsers.\r\n AddParser(SceneComponentConstants.NAME_SUBSURFACE, (parsedData: any, scene: Scene) => {\r\n // Diffusion profiles\r\n if (parsedData.ssDiffusionProfileColors !== undefined && parsedData.ssDiffusionProfileColors !== null) {\r\n scene.enableSubSurfaceForPrePass();\r\n if (scene.subSurfaceConfiguration) {\r\n for (let index = 0, cache = parsedData.ssDiffusionProfileColors.length; index < cache; index++) {\r\n const color = parsedData.ssDiffusionProfileColors[index];\r\n scene.subSurfaceConfiguration.addDiffusionProfile(new Color3(color.r, color.g, color.b));\r\n }\r\n }\r\n }\r\n });\r\n\r\n Object.defineProperty(Scene.prototype, \"subSurfaceConfiguration\", {\r\n get: function (this: Scene) {\r\n return this._subSurfaceConfiguration;\r\n },\r\n set: function (this: Scene, value: Nullable<SubSurfaceConfiguration>) {\r\n if (value) {\r\n if (this.enablePrePassRenderer()) {\r\n this._subSurfaceConfiguration = value;\r\n }\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n\r\n Scene.prototype.enableSubSurfaceForPrePass = function (): Nullable<SubSurfaceConfiguration> {\r\n if (this._subSurfaceConfiguration) {\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n const prePassRenderer = this.enablePrePassRenderer();\r\n if (prePassRenderer) {\r\n this._subSurfaceConfiguration = new subSurfaceConfigClass(this);\r\n prePassRenderer.addEffectConfiguration(this._subSurfaceConfiguration);\r\n return this._subSurfaceConfiguration;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n Scene.prototype.disableSubSurfaceForPrePass = function (): void {\r\n if (!this._subSurfaceConfiguration) {\r\n return;\r\n }\r\n\r\n this._subSurfaceConfiguration.dispose();\r\n this._subSurfaceConfiguration = null;\r\n };\r\n\r\n subSurfaceConfigClass._SceneComponentInitialization = (scene: Scene) => {\r\n // Register the G Buffer component to the scene.\r\n let component = scene._getComponent(SceneComponentConstants.NAME_SUBSURFACE) as SubSurfaceSceneComponent;\r\n if (!component) {\r\n component = new SubSurfaceSceneComponent(scene);\r\n scene._addComponent(component);\r\n }\r\n };\r\n}\r\n"]}
@@ -343,7 +343,7 @@ export class UtilityLayerRenderer {
343
343
  dispose() {
344
344
  this.onPointerOutObservable.clear();
345
345
  if (this._afterRenderObserver) {
346
- this.originalScene.onAfterCameraRenderObservable.remove(this._afterRenderObserver);
346
+ this.originalScene.onAfterRenderCameraObservable.remove(this._afterRenderObserver);
347
347
  }
348
348
  if (this._sceneDisposeObserver) {
349
349
  this.originalScene.onDisposeObservable.remove(this._sceneDisposeObserver);