@babylonjs/core 5.0.0-alpha.60 → 5.0.0-alpha.61

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 (332) hide show
  1. package/Animations/animation.d.ts +20 -0
  2. package/Animations/animation.js +57 -8
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animationKey.d.ts +4 -0
  5. package/Animations/animationKey.js +4 -0
  6. package/Animations/animationKey.js.map +1 -1
  7. package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +130 -0
  8. package/BakedVertexAnimation/bakedVertexAnimationManager.js +134 -0
  9. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -0
  10. package/BakedVertexAnimation/index.d.ts +2 -0
  11. package/BakedVertexAnimation/index.js +3 -0
  12. package/BakedVertexAnimation/index.js.map +1 -0
  13. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +65 -0
  14. package/BakedVertexAnimation/vertexAnimationBaker.js +155 -0
  15. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -0
  16. package/Behaviors/Cameras/framingBehavior.d.ts +5 -0
  17. package/Behaviors/Cameras/framingBehavior.js +8 -1
  18. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  19. package/Bones/bone.d.ts +3 -1
  20. package/Bones/bone.js +4 -1
  21. package/Bones/bone.js.map +1 -1
  22. package/Cameras/Inputs/BaseCameraPointersInput.js +4 -6
  23. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  24. package/Cameras/Inputs/flyCameraMouseInput.js +4 -4
  25. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  26. package/Cameras/Inputs/freeCameraMouseInput.js +4 -4
  27. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  28. package/Cameras/camera.js +7 -1
  29. package/Cameras/camera.js.map +1 -1
  30. package/Cameras/targetCamera.js +1 -1
  31. package/Cameras/targetCamera.js.map +1 -1
  32. package/Culling/boundingBox.d.ts +4 -0
  33. package/Culling/boundingBox.js +8 -0
  34. package/Culling/boundingBox.js.map +1 -1
  35. package/Debug/physicsViewer.js +1 -1
  36. package/Debug/physicsViewer.js.map +1 -1
  37. package/Debug/skeletonViewer.js +2 -2
  38. package/Debug/skeletonViewer.js.map +1 -1
  39. package/DeviceInput/Implementations/nativeDeviceInputWrapper.d.ts +6 -1
  40. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js +16 -1
  41. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js.map +1 -1
  42. package/DeviceInput/Implementations/webDeviceInputSystem.js +1 -1
  43. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  44. package/DeviceInput/deviceInputSystem.js +6 -1
  45. package/DeviceInput/deviceInputSystem.js.map +1 -1
  46. package/Engines/Extensions/engine.multiview.js +17 -6
  47. package/Engines/Extensions/engine.multiview.js.map +1 -1
  48. package/Engines/WebGPU/Extensions/engine.query.js +19 -3
  49. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  50. package/Engines/WebGPU/webgpuBundleList.d.ts +13 -0
  51. package/Engines/WebGPU/webgpuBundleList.js +27 -0
  52. package/Engines/WebGPU/webgpuBundleList.js.map +1 -1
  53. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +4 -0
  54. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  55. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +6 -0
  56. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +6 -0
  57. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  58. package/Engines/WebGPU/webgpuSnapshotRendering.d.ts +27 -0
  59. package/Engines/WebGPU/webgpuSnapshotRendering.js +107 -0
  60. package/Engines/WebGPU/webgpuSnapshotRendering.js.map +1 -0
  61. package/Engines/WebGPU/webgpuTextureHelper.d.ts +2 -2
  62. package/Engines/WebGPU/webgpuTextureHelper.js +41 -18
  63. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  64. package/Engines/constants.d.ts +2 -0
  65. package/Engines/constants.js +2 -0
  66. package/Engines/constants.js.map +1 -1
  67. package/Engines/engine.d.ts +12 -1
  68. package/Engines/engine.js +33 -0
  69. package/Engines/engine.js.map +1 -1
  70. package/Engines/engineFeatures.d.ts +2 -0
  71. package/Engines/engineFeatures.js.map +1 -1
  72. package/Engines/index.d.ts +1 -0
  73. package/Engines/index.js +1 -0
  74. package/Engines/index.js.map +1 -1
  75. package/Engines/nativeEngine.js +1 -0
  76. package/Engines/nativeEngine.js.map +1 -1
  77. package/Engines/nullEngine.js +1 -0
  78. package/Engines/nullEngine.js.map +1 -1
  79. package/Engines/thinEngine.d.ts +0 -11
  80. package/Engines/thinEngine.js +12 -40
  81. package/Engines/thinEngine.js.map +1 -1
  82. package/Engines/webgpuEngine.d.ts +6 -6
  83. package/Engines/webgpuEngine.js +26 -67
  84. package/Engines/webgpuEngine.js.map +1 -1
  85. package/Helpers/sceneHelpers.d.ts +3 -3
  86. package/Helpers/sceneHelpers.js +1 -2
  87. package/Helpers/sceneHelpers.js.map +1 -1
  88. package/Inputs/scene.inputManager.js +12 -14
  89. package/Inputs/scene.inputManager.js.map +1 -1
  90. package/Layers/effectLayer.d.ts +13 -1
  91. package/Layers/effectLayer.js +115 -65
  92. package/Layers/effectLayer.js.map +1 -1
  93. package/Layers/highlightLayer.d.ts +2 -1
  94. package/Layers/highlightLayer.js +6 -3
  95. package/Layers/highlightLayer.js.map +1 -1
  96. package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -0
  97. package/Lights/Shadows/cascadedShadowGenerator.js +14 -0
  98. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  99. package/Lights/Shadows/shadowGenerator.d.ts +4 -0
  100. package/Lights/Shadows/shadowGenerator.js +31 -3
  101. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  102. package/Lights/light.js +7 -1
  103. package/Lights/light.js.map +1 -1
  104. package/Loading/Plugins/babylonFileLoader.js +17 -4
  105. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  106. package/Materials/Background/backgroundMaterial.js +1 -0
  107. package/Materials/Background/backgroundMaterial.js.map +1 -1
  108. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +10 -0
  109. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +31 -0
  110. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  111. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  112. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  113. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  114. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.d.ts +41 -0
  115. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +130 -0
  116. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -0
  117. package/Materials/Node/Blocks/Input/inputBlock.js +1 -1
  118. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  119. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.d.ts +1 -0
  120. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +15 -0
  121. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  122. package/Materials/Node/Blocks/index.d.ts +1 -0
  123. package/Materials/Node/Blocks/index.js +1 -0
  124. package/Materials/Node/Blocks/index.js.map +1 -1
  125. package/Materials/Node/Blocks/vectorMergerBlock.js +4 -4
  126. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  127. package/Materials/Node/Blocks/voronoiNoiseBlock.d.ts +39 -0
  128. package/Materials/Node/Blocks/voronoiNoiseBlock.js +107 -0
  129. package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -0
  130. package/Materials/Node/Blocks/worleyNoise3DBlock.d.ts +8 -0
  131. package/Materials/Node/Blocks/worleyNoise3DBlock.js +34 -2
  132. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  133. package/Materials/Node/nodeMaterial.d.ts +1 -0
  134. package/Materials/Node/nodeMaterial.js +2 -0
  135. package/Materials/Node/nodeMaterial.js.map +1 -1
  136. package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -0
  137. package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
  138. package/Materials/PBR/pbrBaseMaterial.d.ts +2 -0
  139. package/Materials/PBR/pbrBaseMaterial.js +11 -4
  140. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  141. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +11 -0
  142. package/Materials/PBR/pbrSubSurfaceConfiguration.js +18 -3
  143. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  144. package/Materials/Textures/hdrCubeTexture.d.ts +9 -0
  145. package/Materials/Textures/hdrCubeTexture.js +21 -5
  146. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  147. package/Materials/Textures/mirrorTexture.d.ts +2 -0
  148. package/Materials/Textures/mirrorTexture.js +13 -0
  149. package/Materials/Textures/mirrorTexture.js.map +1 -1
  150. package/Materials/imageProcessingConfiguration.d.ts +16 -1
  151. package/Materials/imageProcessingConfiguration.js +31 -0
  152. package/Materials/imageProcessingConfiguration.js.map +1 -1
  153. package/Materials/materialHelper.d.ts +15 -1
  154. package/Materials/materialHelper.js +40 -3
  155. package/Materials/materialHelper.js.map +1 -1
  156. package/Materials/pushMaterial.d.ts +2 -2
  157. package/Materials/pushMaterial.js +7 -3
  158. package/Materials/pushMaterial.js.map +1 -1
  159. package/Materials/shaderMaterial.d.ts +6 -5
  160. package/Materials/shaderMaterial.js +58 -28
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Materials/shadowDepthWrapper.js +7 -7
  163. package/Materials/shadowDepthWrapper.js.map +1 -1
  164. package/Materials/standardMaterial.d.ts +2 -0
  165. package/Materials/standardMaterial.js +11 -1
  166. package/Materials/standardMaterial.js.map +1 -1
  167. package/Materials/uniformBuffer.js +1 -2
  168. package/Materials/uniformBuffer.js.map +1 -1
  169. package/Maths/math.color.d.ts +20 -0
  170. package/Maths/math.color.js +45 -2
  171. package/Maths/math.color.js.map +1 -1
  172. package/Maths/math.vector.d.ts +2 -1
  173. package/Maths/math.vector.js +14 -3
  174. package/Maths/math.vector.js.map +1 -1
  175. package/Meshes/Builders/boxBuilder.d.ts +1 -1
  176. package/Meshes/Builders/boxBuilder.js +1 -0
  177. package/Meshes/Builders/boxBuilder.js.map +1 -1
  178. package/Meshes/Builders/cylinderBuilder.d.ts +17 -17
  179. package/Meshes/Builders/cylinderBuilder.js +1 -0
  180. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  181. package/Meshes/Builders/discBuilder.d.ts +1 -1
  182. package/Meshes/Builders/discBuilder.js +1 -0
  183. package/Meshes/Builders/discBuilder.js.map +1 -1
  184. package/Meshes/Builders/groundBuilder.d.ts +8 -8
  185. package/Meshes/Builders/groundBuilder.js +2 -0
  186. package/Meshes/Builders/groundBuilder.js.map +1 -1
  187. package/Meshes/Builders/hemisphereBuilder.d.ts +4 -4
  188. package/Meshes/Builders/hemisphereBuilder.js +1 -0
  189. package/Meshes/Builders/hemisphereBuilder.js.map +1 -1
  190. package/Meshes/Builders/icoSphereBuilder.d.ts +1 -1
  191. package/Meshes/Builders/icoSphereBuilder.js +1 -0
  192. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  193. package/Meshes/Builders/planeBuilder.d.ts +1 -1
  194. package/Meshes/Builders/planeBuilder.js +1 -0
  195. package/Meshes/Builders/planeBuilder.js.map +1 -1
  196. package/Meshes/Builders/polyhedronBuilder.d.ts +1 -1
  197. package/Meshes/Builders/polyhedronBuilder.js +1 -0
  198. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  199. package/Meshes/Builders/sphereBuilder.d.ts +1 -1
  200. package/Meshes/Builders/sphereBuilder.js +1 -0
  201. package/Meshes/Builders/sphereBuilder.js.map +1 -1
  202. package/Meshes/Builders/torusBuilder.d.ts +8 -8
  203. package/Meshes/Builders/torusBuilder.js +1 -0
  204. package/Meshes/Builders/torusBuilder.js.map +1 -1
  205. package/Meshes/Builders/torusKnotBuilder.d.ts +11 -11
  206. package/Meshes/Builders/torusKnotBuilder.js +1 -0
  207. package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
  208. package/Meshes/abstractMesh.d.ts +22 -2
  209. package/Meshes/abstractMesh.js +55 -6
  210. package/Meshes/abstractMesh.js.map +1 -1
  211. package/Meshes/geometry.d.ts +3 -0
  212. package/Meshes/geometry.js +13 -5
  213. package/Meshes/geometry.js.map +1 -1
  214. package/Meshes/linesMesh.d.ts +0 -2
  215. package/Meshes/linesMesh.js +3 -35
  216. package/Meshes/linesMesh.js.map +1 -1
  217. package/Meshes/mesh.js +4 -4
  218. package/Meshes/mesh.js.map +1 -1
  219. package/Meshes/thinInstanceMesh.js +6 -5
  220. package/Meshes/thinInstanceMesh.js.map +1 -1
  221. package/Meshes/transformNode.d.ts +8 -8
  222. package/Meshes/transformNode.js +25 -17
  223. package/Meshes/transformNode.js.map +1 -1
  224. package/Misc/basis.d.ts +2 -2
  225. package/Misc/basis.js +19 -4
  226. package/Misc/basis.js.map +1 -1
  227. package/Misc/sceneSerializer.js +0 -3
  228. package/Misc/sceneSerializer.js.map +1 -1
  229. package/Misc/tools.d.ts +2 -4
  230. package/Misc/tools.js +6 -10
  231. package/Misc/tools.js.map +1 -1
  232. package/Particles/particleSystem.js +19 -16
  233. package/Particles/particleSystem.js.map +1 -1
  234. package/Particles/solidParticleSystem.js +29 -5
  235. package/Particles/solidParticleSystem.js.map +1 -1
  236. package/Physics/Plugins/ammoJSPlugin.js +10 -8
  237. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  238. package/PostProcesses/imageProcessingPostProcess.js +1 -0
  239. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  240. package/Probes/reflectionProbe.d.ts +2 -0
  241. package/Probes/reflectionProbe.js +21 -0
  242. package/Probes/reflectionProbe.js.map +1 -1
  243. package/Rendering/boundingBoxRenderer.d.ts +3 -0
  244. package/Rendering/boundingBoxRenderer.js +49 -14
  245. package/Rendering/boundingBoxRenderer.js.map +1 -1
  246. package/Rendering/depthRenderer.d.ts +1 -1
  247. package/Rendering/depthRenderer.js +2 -2
  248. package/Rendering/depthRenderer.js.map +1 -1
  249. package/Rendering/edgesRenderer.js +3 -1
  250. package/Rendering/edgesRenderer.js.map +1 -1
  251. package/Rendering/geometryBufferRenderer.d.ts +0 -2
  252. package/Rendering/geometryBufferRenderer.js +13 -10
  253. package/Rendering/geometryBufferRenderer.js.map +1 -1
  254. package/Shaders/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
  255. package/Shaders/ShadersInclude/bakedVertexAnimation.js +7 -0
  256. package/Shaders/ShadersInclude/bakedVertexAnimation.js.map +1 -0
  257. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
  258. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
  259. package/Shaders/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
  260. package/Shaders/ShadersInclude/bonesDeclaration.js +1 -1
  261. package/Shaders/ShadersInclude/bonesDeclaration.js.map +1 -1
  262. package/Shaders/ShadersInclude/bonesVertex.js +1 -1
  263. package/Shaders/ShadersInclude/bonesVertex.js.map +1 -1
  264. package/Shaders/ShadersInclude/pbrBlockImageProcessing.js +1 -1
  265. package/Shaders/ShadersInclude/pbrBlockImageProcessing.js.map +1 -1
  266. package/Shaders/background.fragment.js +1 -1
  267. package/Shaders/background.fragment.js.map +1 -1
  268. package/Shaders/background.vertex.d.ts +2 -0
  269. package/Shaders/background.vertex.js +3 -1
  270. package/Shaders/background.vertex.js.map +1 -1
  271. package/Shaders/color.vertex.d.ts +2 -0
  272. package/Shaders/color.vertex.js +3 -1
  273. package/Shaders/color.vertex.js.map +1 -1
  274. package/Shaders/default.vertex.d.ts +2 -0
  275. package/Shaders/default.vertex.js +3 -1
  276. package/Shaders/default.vertex.js.map +1 -1
  277. package/Shaders/depth.vertex.d.ts +2 -0
  278. package/Shaders/depth.vertex.js +3 -1
  279. package/Shaders/depth.vertex.js.map +1 -1
  280. package/Shaders/geometry.vertex.d.ts +2 -0
  281. package/Shaders/geometry.vertex.js +3 -1
  282. package/Shaders/geometry.vertex.js.map +1 -1
  283. package/Shaders/glowMapGeneration.vertex.d.ts +2 -0
  284. package/Shaders/glowMapGeneration.vertex.js +3 -1
  285. package/Shaders/glowMapGeneration.vertex.js.map +1 -1
  286. package/Shaders/outline.vertex.d.ts +2 -0
  287. package/Shaders/outline.vertex.js +3 -1
  288. package/Shaders/outline.vertex.js.map +1 -1
  289. package/Shaders/pbr.vertex.d.ts +2 -0
  290. package/Shaders/pbr.vertex.js +3 -1
  291. package/Shaders/pbr.vertex.js.map +1 -1
  292. package/Shaders/shadowMap.vertex.d.ts +2 -0
  293. package/Shaders/shadowMap.vertex.js +3 -1
  294. package/Shaders/shadowMap.vertex.js.map +1 -1
  295. package/Shaders/volumetricLightScatteringPass.vertex.d.ts +2 -0
  296. package/Shaders/volumetricLightScatteringPass.vertex.js +3 -1
  297. package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
  298. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.d.ts +5 -0
  299. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js +7 -0
  300. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js.map +1 -0
  301. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.d.ts +5 -0
  302. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js +7 -0
  303. package/ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration.js.map +1 -0
  304. package/ShadersWGSL/ShadersInclude/bonesDeclaration.js +1 -1
  305. package/ShadersWGSL/ShadersInclude/bonesDeclaration.js.map +1 -1
  306. package/ShadersWGSL/ShadersInclude/bonesVertex.js +1 -1
  307. package/ShadersWGSL/ShadersInclude/bonesVertex.js.map +1 -1
  308. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.d.ts +5 -0
  309. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js +7 -0
  310. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js.map +1 -0
  311. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.d.ts +5 -0
  312. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js +7 -0
  313. package/ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration.js.map +1 -0
  314. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.d.ts +5 -0
  315. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js +7 -0
  316. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js.map +1 -0
  317. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.d.ts +5 -0
  318. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js +7 -0
  319. package/ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration.js.map +1 -0
  320. package/XR/features/WebXRNearInteraction.d.ts +1 -0
  321. package/XR/features/WebXRNearInteraction.js +2 -0
  322. package/XR/features/WebXRNearInteraction.js.map +1 -1
  323. package/index.d.ts +1 -0
  324. package/index.js +1 -0
  325. package/index.js.map +1 -1
  326. package/node.d.ts +30 -1
  327. package/node.js +12 -0
  328. package/node.js.map +1 -1
  329. package/package.json +43 -1
  330. package/scene.d.ts +10 -0
  331. package/scene.js +27 -0
  332. package/scene.js.map +1 -1
@@ -218,6 +218,17 @@ export declare class PBRSubSurfaceConfiguration {
218
218
  * @param scene defines the scene to the material belongs to.
219
219
  */
220
220
  prepareDefines(defines: IMaterialSubSurfaceDefines, scene: Scene): void;
221
+ /**
222
+ * Binds the material data (this function is called even if mustRebind() returns false)
223
+ * @param uniformBuffer defines the Uniform buffer to fill in.
224
+ * @param scene defines the scene the material belongs to.
225
+ * @param engine defines the engine the material belongs to.
226
+ * @param isFrozen defines whether the material is frozen or not.
227
+ * @param lodBasedMicrosurface defines whether the material relies on lod based microsurface or not.
228
+ * @param realTimeFiltering defines whether the textures should be filtered on the fly.
229
+ * @param subMesh the submesh to bind data for
230
+ */
231
+ hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, isFrozen: boolean, lodBasedMicrosurface: boolean, realTimeFiltering: boolean, subMesh: SubMesh): void;
221
232
  /**
222
233
  * Binds the material data.
223
234
  * @param uniformBuffer defines the Uniform buffer to fill in.
@@ -322,6 +322,24 @@ var PBRSubSurfaceConfiguration = /** @class */ (function () {
322
322
  }
323
323
  }
324
324
  };
325
+ /**
326
+ * Binds the material data (this function is called even if mustRebind() returns false)
327
+ * @param uniformBuffer defines the Uniform buffer to fill in.
328
+ * @param scene defines the scene the material belongs to.
329
+ * @param engine defines the engine the material belongs to.
330
+ * @param isFrozen defines whether the material is frozen or not.
331
+ * @param lodBasedMicrosurface defines whether the material relies on lod based microsurface or not.
332
+ * @param realTimeFiltering defines whether the textures should be filtered on the fly.
333
+ * @param subMesh the submesh to bind data for
334
+ */
335
+ PBRSubSurfaceConfiguration.prototype.hardBindForSubMesh = function (uniformBuffer, scene, engine, isFrozen, lodBasedMicrosurface, realTimeFiltering, subMesh) {
336
+ if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {
337
+ return;
338
+ }
339
+ subMesh.getRenderingMesh().getWorldMatrix().decompose(TmpVectors.Vector3[0]);
340
+ var thicknessScale = Math.max(Math.abs(TmpVectors.Vector3[0].x), Math.abs(TmpVectors.Vector3[0].y), Math.abs(TmpVectors.Vector3[0].z));
341
+ uniformBuffer.updateFloat2("vThicknessParam", this.minimumThickness * thicknessScale, (this.maximumThickness - this.minimumThickness) * thicknessScale);
342
+ };
325
343
  /**
326
344
  * Binds the material data.
327
345
  * @param uniformBuffer defines the Uniform buffer to fill in.
@@ -351,9 +369,6 @@ var PBRSubSurfaceConfiguration = /** @class */ (function () {
351
369
  uniformBuffer.updateFloat2("vTranslucencyIntensityInfos", this._translucencyIntensityTexture.coordinatesIndex, this._translucencyIntensityTexture.level);
352
370
  MaterialHelper.BindTextureMatrix(this._translucencyIntensityTexture, uniformBuffer, "translucencyIntensity");
353
371
  }
354
- subMesh.getRenderingMesh().getWorldMatrix().decompose(TmpVectors.Vector3[0]);
355
- var thicknessScale = Math.max(Math.abs(TmpVectors.Vector3[0].x), Math.abs(TmpVectors.Vector3[0].y), Math.abs(TmpVectors.Vector3[0].z));
356
- uniformBuffer.updateFloat2("vThicknessParam", this.minimumThickness * thicknessScale, (this.maximumThickness - this.minimumThickness) * thicknessScale);
357
372
  if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {
358
373
  uniformBuffer.updateMatrix("refractionMatrix", refractionTexture.getReflectionTextureMatrix());
359
374
  var depth = 1.0;
@@ -1 +1 @@
1
- {"version":3,"file":"pbrSubSurfaceConfiguration.js","sourceRoot":"","sources":["../../../../sourceES6/core/Materials/PBR/pbrSubSurfaceConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { IAnimatable } from '../../Animations/animatable.interface';\r\nimport { SerializationHelper, serialize, serializeAsTexture, expandToProperty, serializeAsColor3 } from \"../../Misc/decorators\";\r\nimport { Color3 } from '../../Maths/math.color';\r\nimport { SmartArray } from \"../../Misc/smartArray\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport { Effect } from \"../../Materials/effect\";\r\nimport { MaterialFlags } from \"../materialFlags\";\r\nimport { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\nimport { MaterialHelper } from \"../../Materials/materialHelper\";\r\nimport { EffectFallbacks } from '../effectFallbacks';\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport { CubeTexture } from \"../Textures/cubeTexture\";\r\nimport { TmpVectors } from \"../../Maths/math.vector\";\r\nimport { SubMesh } from \"../../Meshes/subMesh\";\r\n\r\ndeclare type Engine = import(\"../../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../../scene\").Scene;\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport interface IMaterialSubSurfaceDefines {\r\n SUBSURFACE: boolean;\r\n\r\n SS_REFRACTION: boolean;\r\n SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE: boolean;\r\n SS_TRANSLUCENCY: boolean;\r\n SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE: boolean;\r\n SS_SCATTERING: boolean;\r\n\r\n SS_THICKNESSANDMASK_TEXTURE: boolean;\r\n SS_THICKNESSANDMASK_TEXTUREDIRECTUV: number;\r\n SS_HAS_THICKNESS: boolean;\r\n SS_REFRACTIONINTENSITY_TEXTURE: boolean;\r\n SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV: number;\r\n SS_TRANSLUCENCYINTENSITY_TEXTURE: boolean;\r\n SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV: number;\r\n\r\n SS_REFRACTIONMAP_3D: boolean;\r\n SS_REFRACTIONMAP_OPPOSITEZ: boolean;\r\n SS_LODINREFRACTIONALPHA: boolean;\r\n SS_GAMMAREFRACTION: boolean;\r\n SS_RGBDREFRACTION: boolean;\r\n SS_LINEARSPECULARREFRACTION: boolean;\r\n SS_LINKREFRACTIONTOTRANSPARENCY: boolean;\r\n SS_ALBEDOFORREFRACTIONTINT: boolean;\r\n SS_ALBEDOFORTRANSLUCENCYTINT: boolean;\r\n SS_USE_LOCAL_REFRACTIONMAP_CUBIC: boolean;\r\n SS_USE_THICKNESS_AS_DEPTH: boolean;\r\n\r\n SS_MASK_FROM_THICKNESS_TEXTURE: boolean;\r\n SS_USE_GLTF_TEXTURES: boolean;\r\n\r\n /** @hidden */\r\n _areTexturesDirty: boolean;\r\n}\r\n\r\n/**\r\n * Define the code related to the sub surface parameters of the pbr material.\r\n */\r\nexport class PBRSubSurfaceConfiguration {\r\n\r\n private _isRefractionEnabled = false;\r\n /**\r\n * Defines if the refraction is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isRefractionEnabled = false;\r\n\r\n private _isTranslucencyEnabled = false;\r\n /**\r\n * Defines if the translucency is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isTranslucencyEnabled = false;\r\n\r\n private _isScatteringEnabled = false;\r\n /**\r\n * Defines if the sub surface scattering is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markScenePrePassDirty\")\r\n public isScatteringEnabled = false;\r\n\r\n @serialize()\r\n private _scatteringDiffusionProfileIndex = 0;\r\n\r\n /**\r\n * Diffusion profile for subsurface scattering.\r\n * Useful for better scattering in the skins or foliages.\r\n */\r\n public get scatteringDiffusionProfile(): Nullable<Color3> {\r\n if (!this._scene.subSurfaceConfiguration) {\r\n return null;\r\n }\r\n\r\n return this._scene.subSurfaceConfiguration.ssDiffusionProfileColors[this._scatteringDiffusionProfileIndex];\r\n }\r\n\r\n public set scatteringDiffusionProfile(c: Nullable<Color3>) {\r\n if (!this._scene.enableSubSurfaceForPrePass()) {\r\n // Not supported\r\n return;\r\n }\r\n\r\n // addDiffusionProfile automatically checks for doubles\r\n if (c) {\r\n this._scatteringDiffusionProfileIndex = this._scene.subSurfaceConfiguration!.addDiffusionProfile(c);\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refraction intensity of the material.\r\n * The refraction when enabled replaces the Diffuse part of the material.\r\n * The intensity helps transitioning between diffuse and refraction.\r\n */\r\n @serialize()\r\n public refractionIntensity: number = 1;\r\n\r\n /**\r\n * Defines the translucency intensity of the material.\r\n * When translucency has been enabled, this defines how much of the \"translucency\"\r\n * is added to the diffuse part of the material.\r\n */\r\n @serialize()\r\n public translucencyIntensity: number = 1;\r\n\r\n /**\r\n * When enabled, transparent surfaces will be tinted with the albedo colour (independent of thickness)\r\n */\r\n @serialize()\r\n public useAlbedoToTintRefraction: boolean = false;\r\n\r\n /**\r\n * When enabled, translucent surfaces will be tinted with the albedo colour (independent of thickness)\r\n */\r\n @serialize()\r\n public useAlbedoToTintTranslucency: boolean = false;\r\n\r\n private _thicknessTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the average thickness of a mesh in a texture (The texture is holding the values linearly).\r\n * The red (or green if useGltfStyleTextures=true) channel of the texture should contain the thickness remapped between 0 and 1.\r\n * 0 would mean minimumThickness\r\n * 1 would mean maximumThickness\r\n * The other channels might be use as a mask to vary the different effects intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public thicknessTexture: Nullable<BaseTexture> = null;\r\n\r\n private _refractionTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Defines the texture to use for refraction.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionTexture: Nullable<BaseTexture> = null;\r\n\r\n private _indexOfRefraction = 1.5;\r\n /**\r\n * Index of refraction of the material base layer.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\r\n *\r\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public indexOfRefraction = 1.5;\r\n\r\n @serialize()\r\n private _volumeIndexOfRefraction = -1.0;\r\n\r\n /**\r\n * Index of refraction of the material's volume.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This ONLY impacts refraction. If not provided or given a non-valid value,\r\n * the volume will use the same IOR as the surface.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public get volumeIndexOfRefraction(): number {\r\n if (this._volumeIndexOfRefraction >= 1.0) {\r\n return this._volumeIndexOfRefraction;\r\n }\r\n return this._indexOfRefraction;\r\n }\r\n public set volumeIndexOfRefraction(value: number) {\r\n if (value >= 1.0) {\r\n this._volumeIndexOfRefraction = value;\r\n } else {\r\n this._volumeIndexOfRefraction = -1.0;\r\n }\r\n }\r\n\r\n private _invertRefractionY = false;\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertRefractionY = false;\r\n\r\n private _linkRefractionWithTransparency = false;\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public linkRefractionWithTransparency = false;\r\n\r\n /**\r\n * Defines the minimum thickness stored in the thickness map.\r\n * If no thickness map is defined, this value will be used to simulate thickness.\r\n */\r\n @serialize()\r\n public minimumThickness: number = 0;\r\n\r\n /**\r\n * Defines the maximum thickness stored in the thickness map.\r\n */\r\n @serialize()\r\n public maximumThickness: number = 1;\r\n\r\n /**\r\n * Defines that the thickness should be used as a measure of the depth volume.\r\n */\r\n @serialize()\r\n public useThicknessAsDepth = false;\r\n\r\n /**\r\n * Defines the volume tint of the material.\r\n * This is used for both translucency and scattering.\r\n */\r\n @serializeAsColor3()\r\n public tintColor = Color3.White();\r\n\r\n /**\r\n * Defines the distance at which the tint color should be found in the media.\r\n * This is used for refraction only.\r\n */\r\n @serialize()\r\n public tintColorAtDistance = 1;\r\n\r\n /**\r\n * Defines how far each channel transmit through the media.\r\n * It is defined as a color to simplify it selection.\r\n */\r\n @serializeAsColor3()\r\n public diffusionDistance = Color3.White();\r\n\r\n private _useMaskFromThicknessTexture = false;\r\n /**\r\n * Stores the intensity of the different subsurface effects in the thickness texture.\r\n * Note that if refractionIntensityTexture and/or translucencyIntensityTexture is provided it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.\r\n * * the blue channel is the translucency intensity.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMaskFromThicknessTexture: boolean = false;\r\n\r\n private _refractionIntensityTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the intensity of the refraction. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionIntensityTexture: Nullable<BaseTexture> = null;\r\n\r\n private _translucencyIntensityTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the intensity of the translucency. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the blue channel is the translucency intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public translucencyIntensityTexture: Nullable<BaseTexture> = null;\r\n\r\n private _scene: Scene;\r\n private _useGltfStyleTextures = false;\r\n /**\r\n * Use channels layout used by glTF:\r\n * * thicknessTexture: the green (instead of red) channel is the thickness\r\n * * thicknessTexture/refractionIntensityTexture: the red (instead of green) channel is the refraction intensity\r\n * * thicknessTexture/translucencyIntensityTexture: no change, use the blue channel for the translucency intensity\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useGltfStyleTextures: boolean = false;\r\n\r\n /** @hidden */\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n private _internalMarkScenePrePassDirty: () => void;\r\n\r\n /** @hidden */\r\n public _markAllSubMeshesAsTexturesDirty(): void {\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n /** @hidden */\r\n public _markScenePrePassDirty(): void {\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n this._internalMarkScenePrePassDirty();\r\n }\r\n\r\n /**\r\n * Instantiate a new instance of sub surface configuration.\r\n * @param markAllSubMeshesAsTexturesDirty Callback to flag the material to dirty\r\n * @param markScenePrePassDirty Callback to flag the scene as prepass dirty\r\n * @param scene The scene\r\n */\r\n constructor(markAllSubMeshesAsTexturesDirty: () => void, markScenePrePassDirty: () => void, scene: Scene) {\r\n this._internalMarkAllSubMeshesAsTexturesDirty = markAllSubMeshesAsTexturesDirty;\r\n this._internalMarkScenePrePassDirty = markScenePrePassDirty;\r\n this._scene = scene;\r\n }\r\n\r\n /**\r\n * Gets whether the submesh is ready to be used or not.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @returns - boolean indicating that the submesh is ready or not.\r\n */\r\n public isReadyForSubMesh(defines: IMaterialSubSurfaceDefines, scene: Scene): boolean {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n return true;\r\n }\r\n\r\n if (defines._areTexturesDirty) {\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n if (!this._thicknessTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n }\r\n\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n if (!refractionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n */\r\n public prepareDefines(defines: IMaterialSubSurfaceDefines, scene: Scene): void {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n defines.SUBSURFACE = false;\r\n defines.SS_TRANSLUCENCY = false;\r\n defines.SS_SCATTERING = false;\r\n defines.SS_REFRACTION = false;\r\n return;\r\n }\r\n\r\n if (defines._areTexturesDirty) {\r\n defines.SUBSURFACE = false;\r\n\r\n defines.SS_TRANSLUCENCY = this._isTranslucencyEnabled;\r\n defines.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = false;\r\n defines.SS_SCATTERING = this._isScatteringEnabled;\r\n defines.SS_THICKNESSANDMASK_TEXTURE = false;\r\n defines.SS_REFRACTIONINTENSITY_TEXTURE = false;\r\n defines.SS_TRANSLUCENCYINTENSITY_TEXTURE = false;\r\n defines.SS_HAS_THICKNESS = false;\r\n defines.SS_MASK_FROM_THICKNESS_TEXTURE = false;\r\n defines.SS_USE_GLTF_TEXTURES = false;\r\n defines.SS_REFRACTION = false;\r\n defines.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = false;\r\n defines.SS_REFRACTIONMAP_3D = false;\r\n defines.SS_GAMMAREFRACTION = false;\r\n defines.SS_RGBDREFRACTION = false;\r\n defines.SS_LINEARSPECULARREFRACTION = false;\r\n defines.SS_REFRACTIONMAP_OPPOSITEZ = false;\r\n defines.SS_LODINREFRACTIONALPHA = false;\r\n defines.SS_LINKREFRACTIONTOTRANSPARENCY = false;\r\n defines.SS_ALBEDOFORREFRACTIONTINT = false;\r\n defines.SS_ALBEDOFORTRANSLUCENCYTINT = false;\r\n defines.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = false;\r\n defines.SS_USE_THICKNESS_AS_DEPTH = false;\r\n\r\n if (this._isRefractionEnabled || this._isTranslucencyEnabled || this._isScatteringEnabled) {\r\n defines.SUBSURFACE = true;\r\n\r\n const refractionIntensityTextureIsThicknessTexture =\r\n !!this._thicknessTexture &&\r\n !!this._refractionIntensityTexture &&\r\n this._refractionIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._refractionIntensityTexture._texture === this._thicknessTexture._texture;\r\n\r\n const translucencyIntensityTextureIsThicknessTexture =\r\n !!this._thicknessTexture &&\r\n !!this._translucencyIntensityTexture &&\r\n this._translucencyIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._translucencyIntensityTexture._texture === this._thicknessTexture._texture;\r\n\r\n // if true, it means the refraction/translucency textures are the same than the thickness texture so there's no need to pass them to the shader, only thicknessTexture\r\n const useOnlyThicknessTexture = (refractionIntensityTextureIsThicknessTexture || !this._refractionIntensityTexture) && (translucencyIntensityTextureIsThicknessTexture || !this._translucencyIntensityTexture);\r\n\r\n if (defines._areTexturesDirty) {\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._thicknessTexture, defines, \"SS_THICKNESSANDMASK_TEXTURE\");\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && !useOnlyThicknessTexture) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._refractionIntensityTexture, defines, \"SS_REFRACTIONINTENSITY_TEXTURE\");\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && !useOnlyThicknessTexture) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._translucencyIntensityTexture, defines, \"SS_TRANSLUCENCYINTENSITY_TEXTURE\");\r\n }\r\n }\r\n }\r\n\r\n defines.SS_HAS_THICKNESS = (this.maximumThickness - this.minimumThickness) !== 0.0;\r\n defines.SS_MASK_FROM_THICKNESS_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture || !!this._translucencyIntensityTexture) && useOnlyThicknessTexture;\r\n defines.SS_USE_GLTF_TEXTURES = this._useGltfStyleTextures;\r\n defines.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture) && useOnlyThicknessTexture;\r\n defines.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._translucencyIntensityTexture) && useOnlyThicknessTexture;\r\n }\r\n\r\n if (this._isRefractionEnabled) {\r\n if (scene.texturesEnabled) {\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n defines.SS_REFRACTION = true;\r\n defines.SS_REFRACTIONMAP_3D = refractionTexture.isCube;\r\n defines.SS_GAMMAREFRACTION = refractionTexture.gammaSpace;\r\n defines.SS_RGBDREFRACTION = refractionTexture.isRGBD;\r\n defines.SS_LINEARSPECULARREFRACTION = refractionTexture.linearSpecularLOD;\r\n defines.SS_REFRACTIONMAP_OPPOSITEZ = refractionTexture.invertZ;\r\n defines.SS_LODINREFRACTIONALPHA = refractionTexture.lodLevelInAlpha;\r\n defines.SS_LINKREFRACTIONTOTRANSPARENCY = this._linkRefractionWithTransparency;\r\n defines.SS_ALBEDOFORREFRACTIONTINT = this.useAlbedoToTintRefraction;\r\n defines.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = refractionTexture.isCube && (<any>refractionTexture).boundingBoxSize;\r\n defines.SS_USE_THICKNESS_AS_DEPTH = this.useThicknessAsDepth;\r\n }\r\n }\r\n }\r\n\r\n if (this._isTranslucencyEnabled) {\r\n defines.SS_ALBEDOFORTRANSLUCENCYTINT = this.useAlbedoToTintTranslucency;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param isFrozen defines whether the material is frozen or not.\r\n * @param lodBasedMicrosurface defines whether the material relies on lod based microsurface or not.\r\n * @param realTimeFiltering defines whether the textures should be filtered on the fly.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, isFrozen: boolean, lodBasedMicrosurface: boolean, realTimeFiltering: boolean, subMesh: SubMesh): void {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n return;\r\n }\r\n\r\n const defines = subMesh!.materialDefines as unknown as IMaterialSubSurfaceDefines;\r\n\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n\r\n if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n uniformBuffer.updateFloat2(\"vThicknessInfos\", this._thicknessTexture.coordinatesIndex, this._thicknessTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._thicknessTexture, uniformBuffer, \"thickness\");\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && defines.SS_REFRACTIONINTENSITY_TEXTURE) {\r\n uniformBuffer.updateFloat2(\"vRefractionIntensityInfos\", this._refractionIntensityTexture.coordinatesIndex, this._refractionIntensityTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._refractionIntensityTexture, uniformBuffer, \"refractionIntensity\");\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && defines.SS_TRANSLUCENCYINTENSITY_TEXTURE) {\r\n uniformBuffer.updateFloat2(\"vTranslucencyIntensityInfos\", this._translucencyIntensityTexture.coordinatesIndex, this._translucencyIntensityTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._translucencyIntensityTexture, uniformBuffer, \"translucencyIntensity\");\r\n }\r\n\r\n subMesh.getRenderingMesh().getWorldMatrix().decompose(TmpVectors.Vector3[0]);\r\n\r\n const thicknessScale = Math.max(Math.abs(TmpVectors.Vector3[0].x), Math.abs(TmpVectors.Vector3[0].y), Math.abs(TmpVectors.Vector3[0].z));\r\n\r\n uniformBuffer.updateFloat2(\"vThicknessParam\", this.minimumThickness * thicknessScale, (this.maximumThickness - this.minimumThickness) * thicknessScale);\r\n\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n uniformBuffer.updateMatrix(\"refractionMatrix\", refractionTexture.getReflectionTextureMatrix());\r\n\r\n var depth = 1.0;\r\n if (!refractionTexture.isCube) {\r\n if ((<any>refractionTexture).depth) {\r\n depth = (<any>refractionTexture).depth;\r\n }\r\n }\r\n\r\n var width = refractionTexture.getSize().width;\r\n var refractionIor = this.volumeIndexOfRefraction;\r\n uniformBuffer.updateFloat4(\"vRefractionInfos\", refractionTexture.level, 1 / refractionIor, depth, this._invertRefractionY ? -1 : 1);\r\n uniformBuffer.updateFloat4(\"vRefractionMicrosurfaceInfos\",\r\n width,\r\n refractionTexture.lodGenerationScale,\r\n refractionTexture.lodGenerationOffset,\r\n 1.0 / this.indexOfRefraction);\r\n\r\n if (realTimeFiltering) {\r\n uniformBuffer.updateFloat2(\"vRefractionFilteringInfo\", width, Scalar.Log2(width));\r\n }\r\n\r\n if ((<any>refractionTexture).boundingBoxSize) {\r\n let cubeTexture = <CubeTexture>refractionTexture;\r\n\r\n uniformBuffer.updateVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n uniformBuffer.updateVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n if (this.isScatteringEnabled) {\r\n uniformBuffer.updateFloat(\"scatteringDiffusionProfile\", this._scatteringDiffusionProfileIndex);\r\n }\r\n uniformBuffer.updateColor3(\"vDiffusionDistance\", this.diffusionDistance);\r\n\r\n uniformBuffer.updateFloat4(\"vTintColor\", this.tintColor.r,\r\n this.tintColor.g,\r\n this.tintColor.b,\r\n Math.max(0.00001, this.tintColorAtDistance));\r\n\r\n uniformBuffer.updateFloat3(\"vSubSurfaceIntensity\", this.refractionIntensity, this.translucencyIntensity, 0);\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n uniformBuffer.setTexture(\"thicknessSampler\", this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && defines.SS_REFRACTIONINTENSITY_TEXTURE) {\r\n uniformBuffer.setTexture(\"refractionIntensitySampler\", this._refractionIntensityTexture);\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && defines.SS_TRANSLUCENCYINTENSITY_TEXTURE) {\r\n uniformBuffer.setTexture(\"translucencyIntensitySampler\", this._translucencyIntensityTexture);\r\n }\r\n\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n if (lodBasedMicrosurface) {\r\n uniformBuffer.setTexture(\"refractionSampler\", refractionTexture);\r\n }\r\n else {\r\n uniformBuffer.setTexture(\"refractionSampler\", refractionTexture._lodTextureMid || refractionTexture);\r\n uniformBuffer.setTexture(\"refractionSamplerLow\", refractionTexture._lodTextureLow || refractionTexture);\r\n uniformBuffer.setTexture(\"refractionSamplerHigh\", refractionTexture._lodTextureHigh || refractionTexture);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh.\r\n * @param activeEffect defines the effect that should be unbound from.\r\n * @returns true if unbound, otherwise false\r\n */\r\n public unbind(activeEffect: Effect): boolean {\r\n if (this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n activeEffect.setTexture(\"refractionSampler\", null);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the texture used for refraction or null if none is used.\r\n * @param scene defines the scene the material belongs to.\r\n * @returns - Refraction texture if present. If no refraction texture and refraction\r\n * is linked with transparency, returns environment texture. Otherwise, returns null.\r\n */\r\n private _getRefractionTexture(scene: Scene): Nullable<BaseTexture> {\r\n if (this._refractionTexture) {\r\n return this._refractionTexture;\r\n }\r\n\r\n if (this._isRefractionEnabled) {\r\n return scene.environmentTexture;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n public get disableAlphaBlending(): boolean {\r\n return this.isRefractionEnabled && this._linkRefractionWithTransparency;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n public fillRenderTargetTextures(renderTargets: SmartArray<RenderTargetTexture>): void {\r\n if (MaterialFlags.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n renderTargets.push(<RenderTargetTexture>this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (this._thicknessTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._refractionTexture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n if (MaterialFlags.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {\r\n if (this._thicknessTexture) {\r\n activeTextures.push(this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionTexture) {\r\n activeTextures.push(this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n public getAnimatables(animatables: IAnimatable[]): void {\r\n if (this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0) {\r\n animatables.push(this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) {\r\n animatables.push(this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n public dispose(forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n if (this._thicknessTexture) {\r\n this._thicknessTexture.dispose();\r\n }\r\n\r\n if (this._refractionTexture) {\r\n this._refractionTexture.dispose();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"PBRSubSurfaceConfiguration\"\r\n */\r\n public getClassName(): string {\r\n return \"PBRSubSurfaceConfiguration\";\r\n }\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public static AddFallbacks(defines: IMaterialSubSurfaceDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n if (defines.SS_SCATTERING) {\r\n fallbacks.addFallback(currentRank++, \"SS_SCATTERING\");\r\n }\r\n if (defines.SS_TRANSLUCENCY) {\r\n fallbacks.addFallback(currentRank++, \"SS_TRANSLUCENCY\");\r\n }\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Add the required uniforms to the current list.\r\n * @param uniforms defines the current uniform list.\r\n */\r\n public static AddUniforms(uniforms: string[]): void {\r\n uniforms.push(\r\n \"vDiffusionDistance\", \"vTintColor\", \"vSubSurfaceIntensity\",\r\n \"vRefractionMicrosurfaceInfos\", \"vRefractionFilteringInfo\",\r\n \"vRefractionInfos\", \"vThicknessInfos\", \"vRefractionIntensityInfos\", \"vTranslucencyIntensityInfos\", \"vThicknessParam\",\r\n \"vRefractionPosition\", \"vRefractionSize\",\r\n \"refractionMatrix\", \"thicknessMatrix\", \"refractionIntensityMatrix\", \"translucencyIntensityMatrix\", \"scatteringDiffusionProfile\");\r\n }\r\n\r\n /**\r\n * Add the required samplers to the current list.\r\n * @param samplers defines the current sampler list.\r\n */\r\n public static AddSamplers(samplers: string[]): void {\r\n samplers.push(\"thicknessSampler\", \"refractionIntensitySampler\", \"translucencyIntensitySampler\",\r\n \"refractionSampler\", \"refractionSamplerLow\", \"refractionSamplerHigh\");\r\n }\r\n\r\n /**\r\n * Add the required uniforms to the current buffer.\r\n * @param uniformBuffer defines the current uniform buffer.\r\n */\r\n public static PrepareUniformBuffer(uniformBuffer: UniformBuffer): void {\r\n uniformBuffer.addUniform(\"vRefractionMicrosurfaceInfos\", 4);\r\n uniformBuffer.addUniform(\"vRefractionFilteringInfo\", 2);\r\n uniformBuffer.addUniform(\"vTranslucencyIntensityInfos\", 2);\r\n uniformBuffer.addUniform(\"vRefractionInfos\", 4);\r\n uniformBuffer.addUniform(\"refractionMatrix\", 16);\r\n uniformBuffer.addUniform(\"vThicknessInfos\", 2);\r\n uniformBuffer.addUniform(\"vRefractionIntensityInfos\", 2);\r\n uniformBuffer.addUniform(\"thicknessMatrix\", 16);\r\n uniformBuffer.addUniform(\"refractionIntensityMatrix\", 16);\r\n uniformBuffer.addUniform(\"translucencyIntensityMatrix\", 16);\r\n uniformBuffer.addUniform(\"vThicknessParam\", 2);\r\n uniformBuffer.addUniform(\"vDiffusionDistance\", 3);\r\n uniformBuffer.addUniform(\"vTintColor\", 4);\r\n uniformBuffer.addUniform(\"vSubSurfaceIntensity\", 3);\r\n uniformBuffer.addUniform(\"vRefractionPosition\", 3);\r\n uniformBuffer.addUniform(\"vRefractionSize\", 3);\r\n uniformBuffer.addUniform(\"scatteringDiffusionProfile\", 1);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param configuration define the config where to copy the info\r\n */\r\n public copyTo(configuration: PBRSubSurfaceConfiguration): void {\r\n SerializationHelper.Clone(() => configuration, this);\r\n }\r\n\r\n /**\r\n * Serializes this Sub Surface configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a anisotropy Configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}"]}
1
+ {"version":3,"file":"pbrSubSurfaceConfiguration.js","sourceRoot":"","sources":["../../../../sourceES6/core/Materials/PBR/pbrSubSurfaceConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { IAnimatable } from '../../Animations/animatable.interface';\r\nimport { SerializationHelper, serialize, serializeAsTexture, expandToProperty, serializeAsColor3 } from \"../../Misc/decorators\";\r\nimport { Color3 } from '../../Maths/math.color';\r\nimport { SmartArray } from \"../../Misc/smartArray\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport { Effect } from \"../../Materials/effect\";\r\nimport { MaterialFlags } from \"../materialFlags\";\r\nimport { UniformBuffer } from \"../../Materials/uniformBuffer\";\r\nimport { MaterialHelper } from \"../../Materials/materialHelper\";\r\nimport { EffectFallbacks } from '../effectFallbacks';\r\nimport { Scalar } from \"../../Maths/math.scalar\";\r\nimport { CubeTexture } from \"../Textures/cubeTexture\";\r\nimport { TmpVectors } from \"../../Maths/math.vector\";\r\nimport { SubMesh } from \"../../Meshes/subMesh\";\r\n\r\ndeclare type Engine = import(\"../../Engines/engine\").Engine;\r\ndeclare type Scene = import(\"../../scene\").Scene;\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport interface IMaterialSubSurfaceDefines {\r\n SUBSURFACE: boolean;\r\n\r\n SS_REFRACTION: boolean;\r\n SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE: boolean;\r\n SS_TRANSLUCENCY: boolean;\r\n SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE: boolean;\r\n SS_SCATTERING: boolean;\r\n\r\n SS_THICKNESSANDMASK_TEXTURE: boolean;\r\n SS_THICKNESSANDMASK_TEXTUREDIRECTUV: number;\r\n SS_HAS_THICKNESS: boolean;\r\n SS_REFRACTIONINTENSITY_TEXTURE: boolean;\r\n SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV: number;\r\n SS_TRANSLUCENCYINTENSITY_TEXTURE: boolean;\r\n SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV: number;\r\n\r\n SS_REFRACTIONMAP_3D: boolean;\r\n SS_REFRACTIONMAP_OPPOSITEZ: boolean;\r\n SS_LODINREFRACTIONALPHA: boolean;\r\n SS_GAMMAREFRACTION: boolean;\r\n SS_RGBDREFRACTION: boolean;\r\n SS_LINEARSPECULARREFRACTION: boolean;\r\n SS_LINKREFRACTIONTOTRANSPARENCY: boolean;\r\n SS_ALBEDOFORREFRACTIONTINT: boolean;\r\n SS_ALBEDOFORTRANSLUCENCYTINT: boolean;\r\n SS_USE_LOCAL_REFRACTIONMAP_CUBIC: boolean;\r\n SS_USE_THICKNESS_AS_DEPTH: boolean;\r\n\r\n SS_MASK_FROM_THICKNESS_TEXTURE: boolean;\r\n SS_USE_GLTF_TEXTURES: boolean;\r\n\r\n /** @hidden */\r\n _areTexturesDirty: boolean;\r\n}\r\n\r\n/**\r\n * Define the code related to the sub surface parameters of the pbr material.\r\n */\r\nexport class PBRSubSurfaceConfiguration {\r\n\r\n private _isRefractionEnabled = false;\r\n /**\r\n * Defines if the refraction is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isRefractionEnabled = false;\r\n\r\n private _isTranslucencyEnabled = false;\r\n /**\r\n * Defines if the translucency is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public isTranslucencyEnabled = false;\r\n\r\n private _isScatteringEnabled = false;\r\n /**\r\n * Defines if the sub surface scattering is enabled in the material.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markScenePrePassDirty\")\r\n public isScatteringEnabled = false;\r\n\r\n @serialize()\r\n private _scatteringDiffusionProfileIndex = 0;\r\n\r\n /**\r\n * Diffusion profile for subsurface scattering.\r\n * Useful for better scattering in the skins or foliages.\r\n */\r\n public get scatteringDiffusionProfile(): Nullable<Color3> {\r\n if (!this._scene.subSurfaceConfiguration) {\r\n return null;\r\n }\r\n\r\n return this._scene.subSurfaceConfiguration.ssDiffusionProfileColors[this._scatteringDiffusionProfileIndex];\r\n }\r\n\r\n public set scatteringDiffusionProfile(c: Nullable<Color3>) {\r\n if (!this._scene.enableSubSurfaceForPrePass()) {\r\n // Not supported\r\n return;\r\n }\r\n\r\n // addDiffusionProfile automatically checks for doubles\r\n if (c) {\r\n this._scatteringDiffusionProfileIndex = this._scene.subSurfaceConfiguration!.addDiffusionProfile(c);\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refraction intensity of the material.\r\n * The refraction when enabled replaces the Diffuse part of the material.\r\n * The intensity helps transitioning between diffuse and refraction.\r\n */\r\n @serialize()\r\n public refractionIntensity: number = 1;\r\n\r\n /**\r\n * Defines the translucency intensity of the material.\r\n * When translucency has been enabled, this defines how much of the \"translucency\"\r\n * is added to the diffuse part of the material.\r\n */\r\n @serialize()\r\n public translucencyIntensity: number = 1;\r\n\r\n /**\r\n * When enabled, transparent surfaces will be tinted with the albedo colour (independent of thickness)\r\n */\r\n @serialize()\r\n public useAlbedoToTintRefraction: boolean = false;\r\n\r\n /**\r\n * When enabled, translucent surfaces will be tinted with the albedo colour (independent of thickness)\r\n */\r\n @serialize()\r\n public useAlbedoToTintTranslucency: boolean = false;\r\n\r\n private _thicknessTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the average thickness of a mesh in a texture (The texture is holding the values linearly).\r\n * The red (or green if useGltfStyleTextures=true) channel of the texture should contain the thickness remapped between 0 and 1.\r\n * 0 would mean minimumThickness\r\n * 1 would mean maximumThickness\r\n * The other channels might be use as a mask to vary the different effects intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public thicknessTexture: Nullable<BaseTexture> = null;\r\n\r\n private _refractionTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Defines the texture to use for refraction.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionTexture: Nullable<BaseTexture> = null;\r\n\r\n private _indexOfRefraction = 1.5;\r\n /**\r\n * Index of refraction of the material base layer.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This does not only impact refraction but also the Base F0 of Dielectric Materials.\r\n *\r\n * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public indexOfRefraction = 1.5;\r\n\r\n @serialize()\r\n private _volumeIndexOfRefraction = -1.0;\r\n\r\n /**\r\n * Index of refraction of the material's volume.\r\n * https://en.wikipedia.org/wiki/List_of_refractive_indices\r\n *\r\n * This ONLY impacts refraction. If not provided or given a non-valid value,\r\n * the volume will use the same IOR as the surface.\r\n */\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public get volumeIndexOfRefraction(): number {\r\n if (this._volumeIndexOfRefraction >= 1.0) {\r\n return this._volumeIndexOfRefraction;\r\n }\r\n return this._indexOfRefraction;\r\n }\r\n public set volumeIndexOfRefraction(value: number) {\r\n if (value >= 1.0) {\r\n this._volumeIndexOfRefraction = value;\r\n } else {\r\n this._volumeIndexOfRefraction = -1.0;\r\n }\r\n }\r\n\r\n private _invertRefractionY = false;\r\n /**\r\n * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public invertRefractionY = false;\r\n\r\n private _linkRefractionWithTransparency = false;\r\n /**\r\n * This parameters will make the material used its opacity to control how much it is refracting against not.\r\n * Materials half opaque for instance using refraction could benefit from this control.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public linkRefractionWithTransparency = false;\r\n\r\n /**\r\n * Defines the minimum thickness stored in the thickness map.\r\n * If no thickness map is defined, this value will be used to simulate thickness.\r\n */\r\n @serialize()\r\n public minimumThickness: number = 0;\r\n\r\n /**\r\n * Defines the maximum thickness stored in the thickness map.\r\n */\r\n @serialize()\r\n public maximumThickness: number = 1;\r\n\r\n /**\r\n * Defines that the thickness should be used as a measure of the depth volume.\r\n */\r\n @serialize()\r\n public useThicknessAsDepth = false;\r\n\r\n /**\r\n * Defines the volume tint of the material.\r\n * This is used for both translucency and scattering.\r\n */\r\n @serializeAsColor3()\r\n public tintColor = Color3.White();\r\n\r\n /**\r\n * Defines the distance at which the tint color should be found in the media.\r\n * This is used for refraction only.\r\n */\r\n @serialize()\r\n public tintColorAtDistance = 1;\r\n\r\n /**\r\n * Defines how far each channel transmit through the media.\r\n * It is defined as a color to simplify it selection.\r\n */\r\n @serializeAsColor3()\r\n public diffusionDistance = Color3.White();\r\n\r\n private _useMaskFromThicknessTexture = false;\r\n /**\r\n * Stores the intensity of the different subsurface effects in the thickness texture.\r\n * Note that if refractionIntensityTexture and/or translucencyIntensityTexture is provided it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.\r\n * * the blue channel is the translucency intensity.\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useMaskFromThicknessTexture: boolean = false;\r\n\r\n private _refractionIntensityTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the intensity of the refraction. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public refractionIntensityTexture: Nullable<BaseTexture> = null;\r\n\r\n private _translucencyIntensityTexture: Nullable<BaseTexture> = null;\r\n /**\r\n * Stores the intensity of the translucency. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture\r\n * * the blue channel is the translucency intensity.\r\n */\r\n @serializeAsTexture()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public translucencyIntensityTexture: Nullable<BaseTexture> = null;\r\n\r\n private _scene: Scene;\r\n private _useGltfStyleTextures = false;\r\n /**\r\n * Use channels layout used by glTF:\r\n * * thicknessTexture: the green (instead of red) channel is the thickness\r\n * * thicknessTexture/refractionIntensityTexture: the red (instead of green) channel is the refraction intensity\r\n * * thicknessTexture/translucencyIntensityTexture: no change, use the blue channel for the translucency intensity\r\n */\r\n @serialize()\r\n @expandToProperty(\"_markAllSubMeshesAsTexturesDirty\")\r\n public useGltfStyleTextures: boolean = false;\r\n\r\n /** @hidden */\r\n private _internalMarkAllSubMeshesAsTexturesDirty: () => void;\r\n private _internalMarkScenePrePassDirty: () => void;\r\n\r\n /** @hidden */\r\n public _markAllSubMeshesAsTexturesDirty(): void {\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n }\r\n /** @hidden */\r\n public _markScenePrePassDirty(): void {\r\n this._internalMarkAllSubMeshesAsTexturesDirty();\r\n this._internalMarkScenePrePassDirty();\r\n }\r\n\r\n /**\r\n * Instantiate a new instance of sub surface configuration.\r\n * @param markAllSubMeshesAsTexturesDirty Callback to flag the material to dirty\r\n * @param markScenePrePassDirty Callback to flag the scene as prepass dirty\r\n * @param scene The scene\r\n */\r\n constructor(markAllSubMeshesAsTexturesDirty: () => void, markScenePrePassDirty: () => void, scene: Scene) {\r\n this._internalMarkAllSubMeshesAsTexturesDirty = markAllSubMeshesAsTexturesDirty;\r\n this._internalMarkScenePrePassDirty = markScenePrePassDirty;\r\n this._scene = scene;\r\n }\r\n\r\n /**\r\n * Gets whether the submesh is ready to be used or not.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene the material belongs to.\r\n * @returns - boolean indicating that the submesh is ready or not.\r\n */\r\n public isReadyForSubMesh(defines: IMaterialSubSurfaceDefines, scene: Scene): boolean {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n return true;\r\n }\r\n\r\n if (defines._areTexturesDirty) {\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n if (!this._thicknessTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n }\r\n\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n if (!refractionTexture.isReadyOrNotBlocking()) {\r\n return false;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param defines the list of \"defines\" to update.\r\n * @param scene defines the scene to the material belongs to.\r\n */\r\n public prepareDefines(defines: IMaterialSubSurfaceDefines, scene: Scene): void {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n defines.SUBSURFACE = false;\r\n defines.SS_TRANSLUCENCY = false;\r\n defines.SS_SCATTERING = false;\r\n defines.SS_REFRACTION = false;\r\n return;\r\n }\r\n\r\n if (defines._areTexturesDirty) {\r\n defines.SUBSURFACE = false;\r\n\r\n defines.SS_TRANSLUCENCY = this._isTranslucencyEnabled;\r\n defines.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = false;\r\n defines.SS_SCATTERING = this._isScatteringEnabled;\r\n defines.SS_THICKNESSANDMASK_TEXTURE = false;\r\n defines.SS_REFRACTIONINTENSITY_TEXTURE = false;\r\n defines.SS_TRANSLUCENCYINTENSITY_TEXTURE = false;\r\n defines.SS_HAS_THICKNESS = false;\r\n defines.SS_MASK_FROM_THICKNESS_TEXTURE = false;\r\n defines.SS_USE_GLTF_TEXTURES = false;\r\n defines.SS_REFRACTION = false;\r\n defines.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = false;\r\n defines.SS_REFRACTIONMAP_3D = false;\r\n defines.SS_GAMMAREFRACTION = false;\r\n defines.SS_RGBDREFRACTION = false;\r\n defines.SS_LINEARSPECULARREFRACTION = false;\r\n defines.SS_REFRACTIONMAP_OPPOSITEZ = false;\r\n defines.SS_LODINREFRACTIONALPHA = false;\r\n defines.SS_LINKREFRACTIONTOTRANSPARENCY = false;\r\n defines.SS_ALBEDOFORREFRACTIONTINT = false;\r\n defines.SS_ALBEDOFORTRANSLUCENCYTINT = false;\r\n defines.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = false;\r\n defines.SS_USE_THICKNESS_AS_DEPTH = false;\r\n\r\n if (this._isRefractionEnabled || this._isTranslucencyEnabled || this._isScatteringEnabled) {\r\n defines.SUBSURFACE = true;\r\n\r\n const refractionIntensityTextureIsThicknessTexture =\r\n !!this._thicknessTexture &&\r\n !!this._refractionIntensityTexture &&\r\n this._refractionIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._refractionIntensityTexture._texture === this._thicknessTexture._texture;\r\n\r\n const translucencyIntensityTextureIsThicknessTexture =\r\n !!this._thicknessTexture &&\r\n !!this._translucencyIntensityTexture &&\r\n this._translucencyIntensityTexture.checkTransformsAreIdentical(this._thicknessTexture) && this._translucencyIntensityTexture._texture === this._thicknessTexture._texture;\r\n\r\n // if true, it means the refraction/translucency textures are the same than the thickness texture so there's no need to pass them to the shader, only thicknessTexture\r\n const useOnlyThicknessTexture = (refractionIntensityTextureIsThicknessTexture || !this._refractionIntensityTexture) && (translucencyIntensityTextureIsThicknessTexture || !this._translucencyIntensityTexture);\r\n\r\n if (defines._areTexturesDirty) {\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._thicknessTexture, defines, \"SS_THICKNESSANDMASK_TEXTURE\");\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && !useOnlyThicknessTexture) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._refractionIntensityTexture, defines, \"SS_REFRACTIONINTENSITY_TEXTURE\");\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && !useOnlyThicknessTexture) {\r\n MaterialHelper.PrepareDefinesForMergedUV(this._translucencyIntensityTexture, defines, \"SS_TRANSLUCENCYINTENSITY_TEXTURE\");\r\n }\r\n }\r\n }\r\n\r\n defines.SS_HAS_THICKNESS = (this.maximumThickness - this.minimumThickness) !== 0.0;\r\n defines.SS_MASK_FROM_THICKNESS_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture || !!this._translucencyIntensityTexture) && useOnlyThicknessTexture;\r\n defines.SS_USE_GLTF_TEXTURES = this._useGltfStyleTextures;\r\n defines.SS_REFRACTION_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._refractionIntensityTexture) && useOnlyThicknessTexture;\r\n defines.SS_TRANSLUCENCY_USE_INTENSITY_FROM_TEXTURE = (this._useMaskFromThicknessTexture || !!this._translucencyIntensityTexture) && useOnlyThicknessTexture;\r\n }\r\n\r\n if (this._isRefractionEnabled) {\r\n if (scene.texturesEnabled) {\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n defines.SS_REFRACTION = true;\r\n defines.SS_REFRACTIONMAP_3D = refractionTexture.isCube;\r\n defines.SS_GAMMAREFRACTION = refractionTexture.gammaSpace;\r\n defines.SS_RGBDREFRACTION = refractionTexture.isRGBD;\r\n defines.SS_LINEARSPECULARREFRACTION = refractionTexture.linearSpecularLOD;\r\n defines.SS_REFRACTIONMAP_OPPOSITEZ = refractionTexture.invertZ;\r\n defines.SS_LODINREFRACTIONALPHA = refractionTexture.lodLevelInAlpha;\r\n defines.SS_LINKREFRACTIONTOTRANSPARENCY = this._linkRefractionWithTransparency;\r\n defines.SS_ALBEDOFORREFRACTIONTINT = this.useAlbedoToTintRefraction;\r\n defines.SS_USE_LOCAL_REFRACTIONMAP_CUBIC = refractionTexture.isCube && (<any>refractionTexture).boundingBoxSize;\r\n defines.SS_USE_THICKNESS_AS_DEPTH = this.useThicknessAsDepth;\r\n }\r\n }\r\n }\r\n\r\n if (this._isTranslucencyEnabled) {\r\n defines.SS_ALBEDOFORTRANSLUCENCYTINT = this.useAlbedoToTintTranslucency;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Binds the material data (this function is called even if mustRebind() returns false)\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param isFrozen defines whether the material is frozen or not.\r\n * @param lodBasedMicrosurface defines whether the material relies on lod based microsurface or not.\r\n * @param realTimeFiltering defines whether the textures should be filtered on the fly.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n public hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, isFrozen: boolean, lodBasedMicrosurface: boolean, realTimeFiltering: boolean, subMesh: SubMesh): void {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n return;\r\n }\r\n\r\n subMesh.getRenderingMesh().getWorldMatrix().decompose(TmpVectors.Vector3[0]);\r\n\r\n const thicknessScale = Math.max(Math.abs(TmpVectors.Vector3[0].x), Math.abs(TmpVectors.Vector3[0].y), Math.abs(TmpVectors.Vector3[0].z));\r\n\r\n uniformBuffer.updateFloat2(\"vThicknessParam\", this.minimumThickness * thicknessScale, (this.maximumThickness - this.minimumThickness) * thicknessScale);\r\n }\r\n\r\n /**\r\n * Binds the material data.\r\n * @param uniformBuffer defines the Uniform buffer to fill in.\r\n * @param scene defines the scene the material belongs to.\r\n * @param engine defines the engine the material belongs to.\r\n * @param isFrozen defines whether the material is frozen or not.\r\n * @param lodBasedMicrosurface defines whether the material relies on lod based microsurface or not.\r\n * @param realTimeFiltering defines whether the textures should be filtered on the fly.\r\n * @param subMesh the submesh to bind data for\r\n */\r\n public bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, isFrozen: boolean, lodBasedMicrosurface: boolean, realTimeFiltering: boolean, subMesh: SubMesh): void {\r\n if (!this._isRefractionEnabled && !this._isTranslucencyEnabled && !this._isScatteringEnabled) {\r\n return;\r\n }\r\n\r\n const defines = subMesh!.materialDefines as unknown as IMaterialSubSurfaceDefines;\r\n\r\n var refractionTexture = this._getRefractionTexture(scene);\r\n\r\n if (!uniformBuffer.useUbo || !isFrozen || !uniformBuffer.isSync) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n uniformBuffer.updateFloat2(\"vThicknessInfos\", this._thicknessTexture.coordinatesIndex, this._thicknessTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._thicknessTexture, uniformBuffer, \"thickness\");\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && defines.SS_REFRACTIONINTENSITY_TEXTURE) {\r\n uniformBuffer.updateFloat2(\"vRefractionIntensityInfos\", this._refractionIntensityTexture.coordinatesIndex, this._refractionIntensityTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._refractionIntensityTexture, uniformBuffer, \"refractionIntensity\");\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && defines.SS_TRANSLUCENCYINTENSITY_TEXTURE) {\r\n uniformBuffer.updateFloat2(\"vTranslucencyIntensityInfos\", this._translucencyIntensityTexture.coordinatesIndex, this._translucencyIntensityTexture.level);\r\n MaterialHelper.BindTextureMatrix(this._translucencyIntensityTexture, uniformBuffer, \"translucencyIntensity\");\r\n }\r\n\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n uniformBuffer.updateMatrix(\"refractionMatrix\", refractionTexture.getReflectionTextureMatrix());\r\n\r\n var depth = 1.0;\r\n if (!refractionTexture.isCube) {\r\n if ((<any>refractionTexture).depth) {\r\n depth = (<any>refractionTexture).depth;\r\n }\r\n }\r\n\r\n var width = refractionTexture.getSize().width;\r\n var refractionIor = this.volumeIndexOfRefraction;\r\n uniformBuffer.updateFloat4(\"vRefractionInfos\", refractionTexture.level, 1 / refractionIor, depth, this._invertRefractionY ? -1 : 1);\r\n uniformBuffer.updateFloat4(\"vRefractionMicrosurfaceInfos\",\r\n width,\r\n refractionTexture.lodGenerationScale,\r\n refractionTexture.lodGenerationOffset,\r\n 1.0 / this.indexOfRefraction);\r\n\r\n if (realTimeFiltering) {\r\n uniformBuffer.updateFloat2(\"vRefractionFilteringInfo\", width, Scalar.Log2(width));\r\n }\r\n\r\n if ((<any>refractionTexture).boundingBoxSize) {\r\n let cubeTexture = <CubeTexture>refractionTexture;\r\n\r\n uniformBuffer.updateVector3(\"vRefractionPosition\", cubeTexture.boundingBoxPosition);\r\n uniformBuffer.updateVector3(\"vRefractionSize\", cubeTexture.boundingBoxSize);\r\n }\r\n }\r\n\r\n if (this.isScatteringEnabled) {\r\n uniformBuffer.updateFloat(\"scatteringDiffusionProfile\", this._scatteringDiffusionProfileIndex);\r\n }\r\n uniformBuffer.updateColor3(\"vDiffusionDistance\", this.diffusionDistance);\r\n\r\n uniformBuffer.updateFloat4(\"vTintColor\", this.tintColor.r,\r\n this.tintColor.g,\r\n this.tintColor.b,\r\n Math.max(0.00001, this.tintColorAtDistance));\r\n\r\n uniformBuffer.updateFloat3(\"vSubSurfaceIntensity\", this.refractionIntensity, this.translucencyIntensity, 0);\r\n }\r\n\r\n // Textures\r\n if (scene.texturesEnabled) {\r\n if (this._thicknessTexture && MaterialFlags.ThicknessTextureEnabled) {\r\n uniformBuffer.setTexture(\"thicknessSampler\", this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionIntensityTexture && MaterialFlags.RefractionIntensityTextureEnabled && defines.SS_REFRACTIONINTENSITY_TEXTURE) {\r\n uniformBuffer.setTexture(\"refractionIntensitySampler\", this._refractionIntensityTexture);\r\n }\r\n\r\n if (this._translucencyIntensityTexture && MaterialFlags.TranslucencyIntensityTextureEnabled && defines.SS_TRANSLUCENCYINTENSITY_TEXTURE) {\r\n uniformBuffer.setTexture(\"translucencyIntensitySampler\", this._translucencyIntensityTexture);\r\n }\r\n\r\n if (refractionTexture && MaterialFlags.RefractionTextureEnabled) {\r\n if (lodBasedMicrosurface) {\r\n uniformBuffer.setTexture(\"refractionSampler\", refractionTexture);\r\n }\r\n else {\r\n uniformBuffer.setTexture(\"refractionSampler\", refractionTexture._lodTextureMid || refractionTexture);\r\n uniformBuffer.setTexture(\"refractionSamplerLow\", refractionTexture._lodTextureLow || refractionTexture);\r\n uniformBuffer.setTexture(\"refractionSamplerHigh\", refractionTexture._lodTextureHigh || refractionTexture);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Unbinds the material from the mesh.\r\n * @param activeEffect defines the effect that should be unbound from.\r\n * @returns true if unbound, otherwise false\r\n */\r\n public unbind(activeEffect: Effect): boolean {\r\n if (this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n activeEffect.setTexture(\"refractionSampler\", null);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns the texture used for refraction or null if none is used.\r\n * @param scene defines the scene the material belongs to.\r\n * @returns - Refraction texture if present. If no refraction texture and refraction\r\n * is linked with transparency, returns environment texture. Otherwise, returns null.\r\n */\r\n private _getRefractionTexture(scene: Scene): Nullable<BaseTexture> {\r\n if (this._refractionTexture) {\r\n return this._refractionTexture;\r\n }\r\n\r\n if (this._isRefractionEnabled) {\r\n return scene.environmentTexture;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns true if alpha blending should be disabled.\r\n */\r\n public get disableAlphaBlending(): boolean {\r\n return this.isRefractionEnabled && this._linkRefractionWithTransparency;\r\n }\r\n\r\n /**\r\n * Fills the list of render target textures.\r\n * @param renderTargets the list of render targets to update\r\n */\r\n public fillRenderTargetTextures(renderTargets: SmartArray<RenderTargetTexture>): void {\r\n if (MaterialFlags.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n renderTargets.push(<RenderTargetTexture>this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Checks to see if a texture is used in the material.\r\n * @param texture - Base texture to use.\r\n * @returns - Boolean specifying if a texture is used in the material.\r\n */\r\n public hasTexture(texture: BaseTexture): boolean {\r\n if (this._thicknessTexture === texture) {\r\n return true;\r\n }\r\n\r\n if (this._refractionTexture === texture) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that current material needs to register RTT\r\n * @returns true if this uses a render target otherwise false.\r\n */\r\n public hasRenderTargetTextures(): boolean {\r\n if (MaterialFlags.RefractionTextureEnabled && this._refractionTexture && this._refractionTexture.isRenderTarget) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Returns an array of the actively used textures.\r\n * @param activeTextures Array of BaseTextures\r\n */\r\n public getActiveTextures(activeTextures: BaseTexture[]): void {\r\n if (this._thicknessTexture) {\r\n activeTextures.push(this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionTexture) {\r\n activeTextures.push(this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Returns the animatable textures.\r\n * @param animatables Array of animatable textures.\r\n */\r\n public getAnimatables(animatables: IAnimatable[]): void {\r\n if (this._thicknessTexture && this._thicknessTexture.animations && this._thicknessTexture.animations.length > 0) {\r\n animatables.push(this._thicknessTexture);\r\n }\r\n\r\n if (this._refractionTexture && this._refractionTexture.animations && this._refractionTexture.animations.length > 0) {\r\n animatables.push(this._refractionTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the resources of the material.\r\n * @param forceDisposeTextures - Forces the disposal of all textures.\r\n */\r\n public dispose(forceDisposeTextures?: boolean): void {\r\n if (forceDisposeTextures) {\r\n if (this._thicknessTexture) {\r\n this._thicknessTexture.dispose();\r\n }\r\n\r\n if (this._refractionTexture) {\r\n this._refractionTexture.dispose();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"PBRSubSurfaceConfiguration\"\r\n */\r\n public getClassName(): string {\r\n return \"PBRSubSurfaceConfiguration\";\r\n }\r\n\r\n /**\r\n * Add fallbacks to the effect fallbacks list.\r\n * @param defines defines the Base texture to use.\r\n * @param fallbacks defines the current fallback list.\r\n * @param currentRank defines the current fallback rank.\r\n * @returns the new fallback rank.\r\n */\r\n public static AddFallbacks(defines: IMaterialSubSurfaceDefines, fallbacks: EffectFallbacks, currentRank: number): number {\r\n if (defines.SS_SCATTERING) {\r\n fallbacks.addFallback(currentRank++, \"SS_SCATTERING\");\r\n }\r\n if (defines.SS_TRANSLUCENCY) {\r\n fallbacks.addFallback(currentRank++, \"SS_TRANSLUCENCY\");\r\n }\r\n return currentRank;\r\n }\r\n\r\n /**\r\n * Add the required uniforms to the current list.\r\n * @param uniforms defines the current uniform list.\r\n */\r\n public static AddUniforms(uniforms: string[]): void {\r\n uniforms.push(\r\n \"vDiffusionDistance\", \"vTintColor\", \"vSubSurfaceIntensity\",\r\n \"vRefractionMicrosurfaceInfos\", \"vRefractionFilteringInfo\",\r\n \"vRefractionInfos\", \"vThicknessInfos\", \"vRefractionIntensityInfos\", \"vTranslucencyIntensityInfos\", \"vThicknessParam\",\r\n \"vRefractionPosition\", \"vRefractionSize\",\r\n \"refractionMatrix\", \"thicknessMatrix\", \"refractionIntensityMatrix\", \"translucencyIntensityMatrix\", \"scatteringDiffusionProfile\");\r\n }\r\n\r\n /**\r\n * Add the required samplers to the current list.\r\n * @param samplers defines the current sampler list.\r\n */\r\n public static AddSamplers(samplers: string[]): void {\r\n samplers.push(\"thicknessSampler\", \"refractionIntensitySampler\", \"translucencyIntensitySampler\",\r\n \"refractionSampler\", \"refractionSamplerLow\", \"refractionSamplerHigh\");\r\n }\r\n\r\n /**\r\n * Add the required uniforms to the current buffer.\r\n * @param uniformBuffer defines the current uniform buffer.\r\n */\r\n public static PrepareUniformBuffer(uniformBuffer: UniformBuffer): void {\r\n uniformBuffer.addUniform(\"vRefractionMicrosurfaceInfos\", 4);\r\n uniformBuffer.addUniform(\"vRefractionFilteringInfo\", 2);\r\n uniformBuffer.addUniform(\"vTranslucencyIntensityInfos\", 2);\r\n uniformBuffer.addUniform(\"vRefractionInfos\", 4);\r\n uniformBuffer.addUniform(\"refractionMatrix\", 16);\r\n uniformBuffer.addUniform(\"vThicknessInfos\", 2);\r\n uniformBuffer.addUniform(\"vRefractionIntensityInfos\", 2);\r\n uniformBuffer.addUniform(\"thicknessMatrix\", 16);\r\n uniformBuffer.addUniform(\"refractionIntensityMatrix\", 16);\r\n uniformBuffer.addUniform(\"translucencyIntensityMatrix\", 16);\r\n uniformBuffer.addUniform(\"vThicknessParam\", 2);\r\n uniformBuffer.addUniform(\"vDiffusionDistance\", 3);\r\n uniformBuffer.addUniform(\"vTintColor\", 4);\r\n uniformBuffer.addUniform(\"vSubSurfaceIntensity\", 3);\r\n uniformBuffer.addUniform(\"vRefractionPosition\", 3);\r\n uniformBuffer.addUniform(\"vRefractionSize\", 3);\r\n uniformBuffer.addUniform(\"scatteringDiffusionProfile\", 1);\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current configuration into another one.\r\n * @param configuration define the config where to copy the info\r\n */\r\n public copyTo(configuration: PBRSubSurfaceConfiguration): void {\r\n SerializationHelper.Clone(() => configuration, this);\r\n }\r\n\r\n /**\r\n * Serializes this Sub Surface configuration.\r\n * @returns - An object with the serialized config.\r\n */\r\n public serialize(): any {\r\n return SerializationHelper.Serialize(this);\r\n }\r\n\r\n /**\r\n * Parses a anisotropy Configuration from a serialized object.\r\n * @param source - Serialized object.\r\n * @param scene Defines the scene we are parsing for\r\n * @param rootUrl Defines the rootUrl to load from\r\n */\r\n public parse(source: any, scene: Scene, rootUrl: string): void {\r\n SerializationHelper.Parse(() => this, source, scene, rootUrl);\r\n }\r\n}"]}
@@ -2,6 +2,7 @@ import { Nullable } from "../../types";
2
2
  import { Scene } from "../../scene";
3
3
  import { Matrix, Vector3 } from "../../Maths/math.vector";
4
4
  import { BaseTexture } from "../../Materials/Textures/baseTexture";
5
+ import { Observable } from "../../Misc/observable";
5
6
  import { ThinEngine } from '../../Engines/thinEngine';
6
7
  import "../../Engines/Extensions/engine.rawTexture";
7
8
  import "../../Materials/Textures/baseTexture.polynomial";
@@ -56,6 +57,10 @@ export declare class HDRCubeTexture extends BaseTexture {
56
57
  */
57
58
  set boundingBoxSize(value: Vector3);
58
59
  get boundingBoxSize(): Vector3;
60
+ /**
61
+ * Observable triggered once the texture has been loaded.
62
+ */
63
+ onLoadObservable: Observable<HDRCubeTexture>;
59
64
  /**
60
65
  * Instantiates an HDRTexture from the following parameters.
61
66
  *
@@ -89,6 +94,10 @@ export declare class HDRCubeTexture extends BaseTexture {
89
94
  * @param value Define the reflection matrix to set
90
95
  */
91
96
  setReflectionTextureMatrix(value: Matrix): void;
97
+ /**
98
+ * Dispose the texture and release its associated resources.
99
+ */
100
+ dispose(): void;
92
101
  /**
93
102
  * Parses a JSON representation of an HDR Texture in order to create the texture
94
103
  * @param parsedTexture Define the JSON representation
@@ -5,6 +5,7 @@ import { Texture } from "../../Materials/Textures/texture.js";
5
5
  import { HDRTools } from "../../Misc/HighDynamicRange/hdr.js";
6
6
  import { CubeMapToSphericalPolynomialTools } from "../../Misc/HighDynamicRange/cubemapToSphericalPolynomial.js";
7
7
  import { RegisterClass } from '../../Misc/typeStore.js';
8
+ import { Observable } from "../../Misc/observable.js";
8
9
  import { Tools } from '../../Misc/tools.js';
9
10
  import { ToGammaSpace } from '../../Maths/math.constants.js';
10
11
  import { HDRFiltering } from "../../Materials/Textures/Filtering/hdrFiltering.js";
@@ -40,7 +41,6 @@ var HDRCubeTexture = /** @class */ (function (_super) {
40
41
  var _a;
41
42
  var _this = _super.call(this, sceneOrEngine) || this;
42
43
  _this._generateHarmonics = true;
43
- _this._onLoad = null;
44
44
  _this._onError = null;
45
45
  _this._isBlocking = true;
46
46
  _this._rotationY = 0;
@@ -49,6 +49,10 @@ var HDRCubeTexture = /** @class */ (function (_super) {
49
49
  * It must define where the camera used to render the texture was set
50
50
  */
51
51
  _this.boundingBoxPosition = Vector3.Zero();
52
+ /**
53
+ * Observable triggered once the texture has been loaded.
54
+ */
55
+ _this.onLoadObservable = new Observable();
52
56
  if (!url) {
53
57
  return _this;
54
58
  }
@@ -59,7 +63,12 @@ var HDRCubeTexture = /** @class */ (function (_super) {
59
63
  _this.isCube = true;
60
64
  _this._textureMatrix = Matrix.Identity();
61
65
  _this._prefilterOnLoad = prefilterOnLoad;
62
- _this._onLoad = onLoad;
66
+ _this._onLoad = function () {
67
+ _this.onLoadObservable.notifyObservers(_this);
68
+ if (onLoad) {
69
+ onLoad();
70
+ }
71
+ };
63
72
  _this._onError = onError;
64
73
  _this.gammaSpace = gammaSpace;
65
74
  _this._noMipmap = noMipmap;
@@ -74,12 +83,12 @@ var HDRCubeTexture = /** @class */ (function (_super) {
74
83
  _this.delayLoadState = 4;
75
84
  }
76
85
  }
77
- else if (onLoad) {
86
+ else {
78
87
  if (_this._texture.isReady) {
79
- Tools.SetImmediate(function () { return onLoad(); });
88
+ Tools.SetImmediate(function () { return _this._onLoad(); });
80
89
  }
81
90
  else {
82
- _this._texture.onLoadedObservable.add(onLoad);
91
+ _this._texture.onLoadedObservable.add(_this._onLoad);
83
92
  }
84
93
  }
85
94
  return _this;
@@ -283,6 +292,13 @@ var HDRCubeTexture = /** @class */ (function (_super) {
283
292
  (_a = this.getScene()) === null || _a === void 0 ? void 0 : _a.markAllMaterialsAsDirty(1, function (mat) { return mat.getActiveTextures().indexOf(_this) !== -1; });
284
293
  }
285
294
  };
295
+ /**
296
+ * Dispose the texture and release its associated resources.
297
+ */
298
+ HDRCubeTexture.prototype.dispose = function () {
299
+ this.onLoadObservable.clear();
300
+ _super.prototype.dispose.call(this);
301
+ };
286
302
  /**
287
303
  * Parses a JSON representation of an HDR Texture in order to create the texture
288
304
  * @param parsedTexture Define the JSON representation
@@ -1 +1 @@
1
- {"version":3,"file":"hdrCubeTexture.js","sourceRoot":"","sources":["../../../../sourceES6/core/Materials/Textures/hdrCubeTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\n\r\nimport { HDRTools } from \"../../Misc/HighDynamicRange/hdr\";\r\nimport { CubeMapToSphericalPolynomialTools } from \"../../Misc/HighDynamicRange/cubemapToSphericalPolynomial\";\r\nimport { RegisterClass } from '../../Misc/typeStore';\r\nimport { Tools } from '../../Misc/tools';\r\nimport { ToGammaSpace } from '../../Maths/math.constants';\r\nimport { ThinEngine } from '../../Engines/thinEngine';\r\nimport { HDRFiltering } from \"../../Materials/Textures/Filtering/hdrFiltering\";\r\nimport { ToHalfFloat } from \"../../Misc/textureTools\";\r\nimport \"../../Engines/Extensions/engine.rawTexture\";\r\nimport \"../../Materials/Textures/baseTexture.polynomial\";\r\n\r\n/**\r\n * This represents a texture coming from an HDR input.\r\n *\r\n * The only supported format is currently panorama picture stored in RGBE format.\r\n * Example of such files can be found on Poly Haven: https://polyhaven.com/hdris\r\n */\r\nexport class HDRCubeTexture extends BaseTexture {\r\n\r\n private static _facesMapping = [\r\n \"right\",\r\n \"left\",\r\n \"up\",\r\n \"down\",\r\n \"front\",\r\n \"back\"\r\n ];\r\n\r\n private _generateHarmonics = true;\r\n private _noMipmap: boolean;\r\n private _prefilterOnLoad: boolean;\r\n private _textureMatrix: Matrix;\r\n private _size: number;\r\n private _onLoad: Nullable<() => void> = null;\r\n private _onError: Nullable<() => void> = null;\r\n\r\n /**\r\n * The texture URL.\r\n */\r\n public url: string;\r\n\r\n protected _isBlocking: boolean = true;\r\n /**\r\n * Sets whether or not the texture is blocking during loading.\r\n */\r\n public set isBlocking(value: boolean) {\r\n this._isBlocking = value;\r\n }\r\n /**\r\n * Gets whether or not the texture is blocking during loading.\r\n */\r\n public get isBlocking(): boolean {\r\n return this._isBlocking;\r\n }\r\n\r\n protected _rotationY: number = 0;\r\n /**\r\n * Sets texture matrix rotation angle around Y axis in radians.\r\n */\r\n public set rotationY(value: number) {\r\n this._rotationY = value;\r\n this.setReflectionTextureMatrix(Matrix.RotationY(this._rotationY));\r\n }\r\n /**\r\n * Gets texture matrix rotation angle around Y axis radians.\r\n */\r\n public get rotationY(): number {\r\n return this._rotationY;\r\n }\r\n\r\n /**\r\n * Gets or sets the center of the bounding box associated with the cube texture\r\n * It must define where the camera used to render the texture was set\r\n */\r\n public boundingBoxPosition = Vector3.Zero();\r\n\r\n private _boundingBoxSize: Vector3;\r\n\r\n /**\r\n * Gets or sets the size of the bounding box associated with the cube texture\r\n * When defined, the cubemap will switch to local mode\r\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\r\n * @example https://www.babylonjs-playground.com/#RNASML\r\n */\r\n public set boundingBoxSize(value: Vector3) {\r\n if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) {\r\n return;\r\n }\r\n this._boundingBoxSize = value;\r\n let scene = this.getScene();\r\n if (scene) {\r\n scene.markAllMaterialsAsDirty(1);\r\n }\r\n }\r\n public get boundingBoxSize(): Vector3 {\r\n return this._boundingBoxSize;\r\n }\r\n\r\n /**\r\n * Instantiates an HDRTexture from the following parameters.\r\n *\r\n * @param url The location of the HDR raw data (Panorama stored in RGBE format)\r\n * @param sceneOrEngine The scene or engine the texture will be used in\r\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\r\n * @param noMipmap Forces to not generate the mipmap if true\r\n * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process\r\n * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)\r\n * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.\r\n */\r\n constructor(url: string, sceneOrEngine: Scene | ThinEngine, size: number, noMipmap = false, generateHarmonics = true, gammaSpace = false, prefilterOnLoad = false, onLoad: Nullable<() => void> = null, onError: Nullable<(message?: string, exception?: any) => void> = null) {\r\n super(sceneOrEngine);\r\n\r\n if (!url) {\r\n return;\r\n }\r\n\r\n this._coordinatesMode = Texture.CUBIC_MODE;\r\n this.name = url;\r\n this.url = url;\r\n this.hasAlpha = false;\r\n this.isCube = true;\r\n this._textureMatrix = Matrix.Identity();\r\n this._prefilterOnLoad = prefilterOnLoad;\r\n this._onLoad = onLoad;\r\n this._onError = onError;\r\n this.gammaSpace = gammaSpace;\r\n\r\n this._noMipmap = noMipmap;\r\n this._size = size;\r\n this._generateHarmonics = generateHarmonics;\r\n\r\n this._texture = this._getFromCache(url, this._noMipmap);\r\n\r\n if (!this._texture) {\r\n if (!this.getScene()?.useDelayedTextureLoading) {\r\n this.loadTexture();\r\n } else {\r\n this.delayLoadState = 4;\r\n }\r\n } else if (onLoad) {\r\n if (this._texture.isReady) {\r\n Tools.SetImmediate(() => onLoad());\r\n } else {\r\n this._texture.onLoadedObservable.add(onLoad);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"HDRCubeTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"HDRCubeTexture\";\r\n }\r\n\r\n /**\r\n * Occurs when the file is raw .hdr file.\r\n */\r\n private loadTexture() {\r\n const engine = this._getEngine()!;\r\n const caps = engine.getCaps();\r\n\r\n let textureType = 0;\r\n if (caps.textureFloat && caps.textureFloatLinearFiltering) {\r\n textureType = 1;\r\n } else if (caps.textureHalfFloat && caps.textureHalfFloatLinearFiltering) {\r\n textureType = 2;\r\n }\r\n\r\n const callback = (buffer: ArrayBuffer): Nullable<ArrayBufferView[]> => {\r\n\r\n this.lodGenerationOffset = 0.0;\r\n this.lodGenerationScale = 0.8;\r\n\r\n // Extract the raw linear data.\r\n const data = HDRTools.GetCubeMapTextureData(buffer, this._size);\r\n\r\n // Generate harmonics if needed.\r\n if (this._generateHarmonics) {\r\n var sphericalPolynomial = CubeMapToSphericalPolynomialTools.ConvertCubeMapToSphericalPolynomial(data);\r\n this.sphericalPolynomial = sphericalPolynomial;\r\n }\r\n\r\n const results = [];\r\n\r\n let byteArray: Nullable<Uint8Array> = null;\r\n let shortArray: Nullable<Uint16Array> = null;\r\n\r\n // Push each faces.\r\n for (let j = 0; j < 6; j++) {\r\n\r\n // Create fallback array\r\n if (textureType === 2) {\r\n shortArray = new Uint16Array(this._size * this._size * 3);\r\n } else if (textureType === 0) {\r\n // 3 channels of 1 bytes per pixel in bytes.\r\n byteArray = new Uint8Array(this._size * this._size * 3);\r\n }\r\n\r\n const dataFace = <Float32Array>((<any>data)[HDRCubeTexture._facesMapping[j]]);\r\n\r\n // If special cases.\r\n if (this.gammaSpace || shortArray || byteArray) {\r\n for (let i = 0; i < this._size * this._size; i++) {\r\n\r\n // Put in gamma space if requested.\r\n if (this.gammaSpace) {\r\n dataFace[(i * 3) + 0] = Math.pow(dataFace[(i * 3) + 0], ToGammaSpace);\r\n dataFace[(i * 3) + 1] = Math.pow(dataFace[(i * 3) + 1], ToGammaSpace);\r\n dataFace[(i * 3) + 2] = Math.pow(dataFace[(i * 3) + 2], ToGammaSpace);\r\n }\r\n\r\n // Convert to half float texture for fallback.\r\n if (shortArray) {\r\n shortArray[(i * 3) + 0] = ToHalfFloat(dataFace[(i * 3) + 0]);\r\n shortArray[(i * 3) + 1] = ToHalfFloat(dataFace[(i * 3) + 1]);\r\n shortArray[(i * 3) + 2] = ToHalfFloat(dataFace[(i * 3) + 2]);\r\n }\r\n\r\n // Convert to int texture for fallback.\r\n if (byteArray) {\r\n let r = Math.max(dataFace[(i * 3) + 0] * 255, 0);\r\n let g = Math.max(dataFace[(i * 3) + 1] * 255, 0);\r\n let b = Math.max(dataFace[(i * 3) + 2] * 255, 0);\r\n\r\n // May use luminance instead if the result is not accurate.\r\n const max = Math.max(Math.max(r, g), b);\r\n if (max > 255) {\r\n const scale = 255 / max;\r\n r *= scale;\r\n g *= scale;\r\n b *= scale;\r\n }\r\n\r\n byteArray[(i * 3) + 0] = r;\r\n byteArray[(i * 3) + 1] = g;\r\n byteArray[(i * 3) + 2] = b;\r\n }\r\n }\r\n }\r\n\r\n if (shortArray) {\r\n results.push(shortArray);\r\n }\r\n else if (byteArray) {\r\n results.push(byteArray);\r\n }\r\n else {\r\n results.push(dataFace);\r\n }\r\n }\r\n\r\n return results;\r\n };\r\n\r\n if (engine._features.allowTexturePrefiltering && this._prefilterOnLoad) {\r\n const previousOnLoad = this._onLoad;\r\n const hdrFiltering = new HDRFiltering(engine);\r\n this._onLoad = () => {\r\n hdrFiltering.prefilter(this, previousOnLoad);\r\n };\r\n }\r\n\r\n this._texture = engine.createRawCubeTextureFromUrl(this.url, this.getScene(), this._size,\r\n 4,\r\n textureType,\r\n this._noMipmap,\r\n callback,\r\n null, this._onLoad, this._onError);\r\n }\r\n\r\n public clone(): HDRCubeTexture {\r\n var newTexture = new HDRCubeTexture(this.url, this.getScene() || this._getEngine()!, this._size, this._noMipmap, this._generateHarmonics,\r\n this.gammaSpace);\r\n\r\n // Base texture\r\n newTexture.level = this.level;\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n newTexture.coordinatesIndex = this.coordinatesIndex;\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n // Methods\r\n public delayLoad(): void {\r\n if (this.delayLoadState !== 4) {\r\n return;\r\n }\r\n\r\n this.delayLoadState = 1;\r\n this._texture = this._getFromCache(this.url, this._noMipmap);\r\n\r\n if (!this._texture) {\r\n this.loadTexture();\r\n }\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n return this._textureMatrix;\r\n }\r\n\r\n /**\r\n * Set the texture reflection matrix used to rotate/transform the reflection.\r\n * @param value Define the reflection matrix to set\r\n */\r\n public setReflectionTextureMatrix(value: Matrix): void {\r\n this._textureMatrix = value;\r\n\r\n if (value.updateFlag === this._textureMatrix.updateFlag) {\r\n return;\r\n }\r\n\r\n if (value.isIdentity() !== this._textureMatrix.isIdentity()) {\r\n this.getScene()?.markAllMaterialsAsDirty(1, (mat) => mat.getActiveTextures().indexOf(this) !== -1);\r\n }\r\n }\r\n\r\n /**\r\n * Parses a JSON representation of an HDR Texture in order to create the texture\r\n * @param parsedTexture Define the JSON representation\r\n * @param scene Define the scene the texture should be created in\r\n * @param rootUrl Define the root url in case we need to load relative dependencies\r\n * @returns the newly created texture after parsing\r\n */\r\n public static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable<HDRCubeTexture> {\r\n var texture = null;\r\n if (parsedTexture.name && !parsedTexture.isRenderTarget) {\r\n texture = new HDRCubeTexture(rootUrl + parsedTexture.name, scene, parsedTexture.size, parsedTexture.noMipmap,\r\n parsedTexture.generateHarmonics, parsedTexture.useInGammaSpace);\r\n texture.name = parsedTexture.name;\r\n texture.hasAlpha = parsedTexture.hasAlpha;\r\n texture.level = parsedTexture.level;\r\n texture.coordinatesMode = parsedTexture.coordinatesMode;\r\n texture.isBlocking = parsedTexture.isBlocking;\r\n }\r\n if (texture) {\r\n if (parsedTexture.boundingBoxPosition) {\r\n (<any>texture).boundingBoxPosition = Vector3.FromArray(parsedTexture.boundingBoxPosition);\r\n }\r\n if (parsedTexture.boundingBoxSize) {\r\n (<any>texture).boundingBoxSize = Vector3.FromArray(parsedTexture.boundingBoxSize);\r\n }\r\n if (parsedTexture.rotationY) {\r\n (<any>texture).rotationY = parsedTexture.rotationY;\r\n }\r\n }\r\n return texture;\r\n }\r\n\r\n public serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n var serializationObject: any = {};\r\n serializationObject.name = this.name;\r\n serializationObject.hasAlpha = this.hasAlpha;\r\n serializationObject.isCube = true;\r\n serializationObject.level = this.level;\r\n serializationObject.size = this._size;\r\n serializationObject.coordinatesMode = this.coordinatesMode;\r\n serializationObject.useInGammaSpace = this.gammaSpace;\r\n serializationObject.generateHarmonics = this._generateHarmonics;\r\n serializationObject.customType = \"BABYLON.HDRCubeTexture\";\r\n serializationObject.noMipmap = this._noMipmap;\r\n serializationObject.isBlocking = this._isBlocking;\r\n serializationObject.rotationY = this._rotationY;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.HDRCubeTexture\", HDRCubeTexture);\r\n"]}
1
+ {"version":3,"file":"hdrCubeTexture.js","sourceRoot":"","sources":["../../../../sourceES6/core/Materials/Textures/hdrCubeTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\n\r\nimport { HDRTools } from \"../../Misc/HighDynamicRange/hdr\";\r\nimport { CubeMapToSphericalPolynomialTools } from \"../../Misc/HighDynamicRange/cubemapToSphericalPolynomial\";\r\nimport { RegisterClass } from '../../Misc/typeStore';\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Tools } from '../../Misc/tools';\r\nimport { ToGammaSpace } from '../../Maths/math.constants';\r\nimport { ThinEngine } from '../../Engines/thinEngine';\r\nimport { HDRFiltering } from \"../../Materials/Textures/Filtering/hdrFiltering\";\r\nimport { ToHalfFloat } from \"../../Misc/textureTools\";\r\nimport \"../../Engines/Extensions/engine.rawTexture\";\r\nimport \"../../Materials/Textures/baseTexture.polynomial\";\r\n\r\n/**\r\n * This represents a texture coming from an HDR input.\r\n *\r\n * The only supported format is currently panorama picture stored in RGBE format.\r\n * Example of such files can be found on Poly Haven: https://polyhaven.com/hdris\r\n */\r\nexport class HDRCubeTexture extends BaseTexture {\r\n\r\n private static _facesMapping = [\r\n \"right\",\r\n \"left\",\r\n \"up\",\r\n \"down\",\r\n \"front\",\r\n \"back\"\r\n ];\r\n\r\n private _generateHarmonics = true;\r\n private _noMipmap: boolean;\r\n private _prefilterOnLoad: boolean;\r\n private _textureMatrix: Matrix;\r\n private _size: number;\r\n private _onLoad: () => void;\r\n private _onError: Nullable<() => void> = null;\r\n\r\n /**\r\n * The texture URL.\r\n */\r\n public url: string;\r\n\r\n protected _isBlocking: boolean = true;\r\n /**\r\n * Sets whether or not the texture is blocking during loading.\r\n */\r\n public set isBlocking(value: boolean) {\r\n this._isBlocking = value;\r\n }\r\n /**\r\n * Gets whether or not the texture is blocking during loading.\r\n */\r\n public get isBlocking(): boolean {\r\n return this._isBlocking;\r\n }\r\n\r\n protected _rotationY: number = 0;\r\n /**\r\n * Sets texture matrix rotation angle around Y axis in radians.\r\n */\r\n public set rotationY(value: number) {\r\n this._rotationY = value;\r\n this.setReflectionTextureMatrix(Matrix.RotationY(this._rotationY));\r\n }\r\n /**\r\n * Gets texture matrix rotation angle around Y axis radians.\r\n */\r\n public get rotationY(): number {\r\n return this._rotationY;\r\n }\r\n\r\n /**\r\n * Gets or sets the center of the bounding box associated with the cube texture\r\n * It must define where the camera used to render the texture was set\r\n */\r\n public boundingBoxPosition = Vector3.Zero();\r\n\r\n private _boundingBoxSize: Vector3;\r\n\r\n /**\r\n * Gets or sets the size of the bounding box associated with the cube texture\r\n * When defined, the cubemap will switch to local mode\r\n * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity\r\n * @example https://www.babylonjs-playground.com/#RNASML\r\n */\r\n public set boundingBoxSize(value: Vector3) {\r\n if (this._boundingBoxSize && this._boundingBoxSize.equals(value)) {\r\n return;\r\n }\r\n this._boundingBoxSize = value;\r\n let scene = this.getScene();\r\n if (scene) {\r\n scene.markAllMaterialsAsDirty(1);\r\n }\r\n }\r\n public get boundingBoxSize(): Vector3 {\r\n return this._boundingBoxSize;\r\n }\r\n\r\n /**\r\n * Observable triggered once the texture has been loaded.\r\n */\r\n public onLoadObservable: Observable<HDRCubeTexture> = new Observable<HDRCubeTexture>();\r\n\r\n /**\r\n * Instantiates an HDRTexture from the following parameters.\r\n *\r\n * @param url The location of the HDR raw data (Panorama stored in RGBE format)\r\n * @param sceneOrEngine The scene or engine the texture will be used in\r\n * @param size The cubemap desired size (the more it increases the longer the generation will be)\r\n * @param noMipmap Forces to not generate the mipmap if true\r\n * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process\r\n * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)\r\n * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.\r\n */\r\n constructor(url: string, sceneOrEngine: Scene | ThinEngine, size: number, noMipmap = false, generateHarmonics = true, gammaSpace = false, prefilterOnLoad = false, onLoad: Nullable<() => void> = null, onError: Nullable<(message?: string, exception?: any) => void> = null) {\r\n super(sceneOrEngine);\r\n\r\n if (!url) {\r\n return;\r\n }\r\n\r\n this._coordinatesMode = Texture.CUBIC_MODE;\r\n this.name = url;\r\n this.url = url;\r\n this.hasAlpha = false;\r\n this.isCube = true;\r\n this._textureMatrix = Matrix.Identity();\r\n this._prefilterOnLoad = prefilterOnLoad;\r\n this._onLoad = () => {\r\n this.onLoadObservable.notifyObservers(this);\r\n if (onLoad) {\r\n onLoad();\r\n }\r\n };\r\n\r\n this._onError = onError;\r\n this.gammaSpace = gammaSpace;\r\n\r\n this._noMipmap = noMipmap;\r\n this._size = size;\r\n this._generateHarmonics = generateHarmonics;\r\n\r\n this._texture = this._getFromCache(url, this._noMipmap);\r\n\r\n if (!this._texture) {\r\n if (!this.getScene()?.useDelayedTextureLoading) {\r\n this.loadTexture();\r\n } else {\r\n this.delayLoadState = 4;\r\n }\r\n } else {\r\n if (this._texture.isReady) {\r\n Tools.SetImmediate(() => this._onLoad());\r\n } else {\r\n this._texture.onLoadedObservable.add(this._onLoad);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get the current class name of the texture useful for serialization or dynamic coding.\r\n * @returns \"HDRCubeTexture\"\r\n */\r\n public getClassName(): string {\r\n return \"HDRCubeTexture\";\r\n }\r\n\r\n /**\r\n * Occurs when the file is raw .hdr file.\r\n */\r\n private loadTexture() {\r\n const engine = this._getEngine()!;\r\n const caps = engine.getCaps();\r\n\r\n let textureType = 0;\r\n if (caps.textureFloat && caps.textureFloatLinearFiltering) {\r\n textureType = 1;\r\n } else if (caps.textureHalfFloat && caps.textureHalfFloatLinearFiltering) {\r\n textureType = 2;\r\n }\r\n\r\n const callback = (buffer: ArrayBuffer): Nullable<ArrayBufferView[]> => {\r\n\r\n this.lodGenerationOffset = 0.0;\r\n this.lodGenerationScale = 0.8;\r\n\r\n // Extract the raw linear data.\r\n const data = HDRTools.GetCubeMapTextureData(buffer, this._size);\r\n\r\n // Generate harmonics if needed.\r\n if (this._generateHarmonics) {\r\n var sphericalPolynomial = CubeMapToSphericalPolynomialTools.ConvertCubeMapToSphericalPolynomial(data);\r\n this.sphericalPolynomial = sphericalPolynomial;\r\n }\r\n\r\n const results = [];\r\n\r\n let byteArray: Nullable<Uint8Array> = null;\r\n let shortArray: Nullable<Uint16Array> = null;\r\n\r\n // Push each faces.\r\n for (let j = 0; j < 6; j++) {\r\n\r\n // Create fallback array\r\n if (textureType === 2) {\r\n shortArray = new Uint16Array(this._size * this._size * 3);\r\n } else if (textureType === 0) {\r\n // 3 channels of 1 bytes per pixel in bytes.\r\n byteArray = new Uint8Array(this._size * this._size * 3);\r\n }\r\n\r\n const dataFace = <Float32Array>((<any>data)[HDRCubeTexture._facesMapping[j]]);\r\n\r\n // If special cases.\r\n if (this.gammaSpace || shortArray || byteArray) {\r\n for (let i = 0; i < this._size * this._size; i++) {\r\n\r\n // Put in gamma space if requested.\r\n if (this.gammaSpace) {\r\n dataFace[(i * 3) + 0] = Math.pow(dataFace[(i * 3) + 0], ToGammaSpace);\r\n dataFace[(i * 3) + 1] = Math.pow(dataFace[(i * 3) + 1], ToGammaSpace);\r\n dataFace[(i * 3) + 2] = Math.pow(dataFace[(i * 3) + 2], ToGammaSpace);\r\n }\r\n\r\n // Convert to half float texture for fallback.\r\n if (shortArray) {\r\n shortArray[(i * 3) + 0] = ToHalfFloat(dataFace[(i * 3) + 0]);\r\n shortArray[(i * 3) + 1] = ToHalfFloat(dataFace[(i * 3) + 1]);\r\n shortArray[(i * 3) + 2] = ToHalfFloat(dataFace[(i * 3) + 2]);\r\n }\r\n\r\n // Convert to int texture for fallback.\r\n if (byteArray) {\r\n let r = Math.max(dataFace[(i * 3) + 0] * 255, 0);\r\n let g = Math.max(dataFace[(i * 3) + 1] * 255, 0);\r\n let b = Math.max(dataFace[(i * 3) + 2] * 255, 0);\r\n\r\n // May use luminance instead if the result is not accurate.\r\n const max = Math.max(Math.max(r, g), b);\r\n if (max > 255) {\r\n const scale = 255 / max;\r\n r *= scale;\r\n g *= scale;\r\n b *= scale;\r\n }\r\n\r\n byteArray[(i * 3) + 0] = r;\r\n byteArray[(i * 3) + 1] = g;\r\n byteArray[(i * 3) + 2] = b;\r\n }\r\n }\r\n }\r\n\r\n if (shortArray) {\r\n results.push(shortArray);\r\n }\r\n else if (byteArray) {\r\n results.push(byteArray);\r\n }\r\n else {\r\n results.push(dataFace);\r\n }\r\n }\r\n\r\n return results;\r\n };\r\n\r\n if (engine._features.allowTexturePrefiltering && this._prefilterOnLoad) {\r\n const previousOnLoad = this._onLoad;\r\n const hdrFiltering = new HDRFiltering(engine);\r\n this._onLoad = () => {\r\n hdrFiltering.prefilter(this, previousOnLoad);\r\n };\r\n }\r\n\r\n this._texture = engine.createRawCubeTextureFromUrl(this.url, this.getScene(), this._size,\r\n 4,\r\n textureType,\r\n this._noMipmap,\r\n callback,\r\n null, this._onLoad, this._onError);\r\n }\r\n\r\n public clone(): HDRCubeTexture {\r\n var newTexture = new HDRCubeTexture(this.url, this.getScene() || this._getEngine()!, this._size, this._noMipmap, this._generateHarmonics,\r\n this.gammaSpace);\r\n\r\n // Base texture\r\n newTexture.level = this.level;\r\n newTexture.wrapU = this.wrapU;\r\n newTexture.wrapV = this.wrapV;\r\n newTexture.coordinatesIndex = this.coordinatesIndex;\r\n newTexture.coordinatesMode = this.coordinatesMode;\r\n\r\n return newTexture;\r\n }\r\n\r\n // Methods\r\n public delayLoad(): void {\r\n if (this.delayLoadState !== 4) {\r\n return;\r\n }\r\n\r\n this.delayLoadState = 1;\r\n this._texture = this._getFromCache(this.url, this._noMipmap);\r\n\r\n if (!this._texture) {\r\n this.loadTexture();\r\n }\r\n }\r\n\r\n /**\r\n * Get the texture reflection matrix used to rotate/transform the reflection.\r\n * @returns the reflection matrix\r\n */\r\n public getReflectionTextureMatrix(): Matrix {\r\n return this._textureMatrix;\r\n }\r\n\r\n /**\r\n * Set the texture reflection matrix used to rotate/transform the reflection.\r\n * @param value Define the reflection matrix to set\r\n */\r\n public setReflectionTextureMatrix(value: Matrix): void {\r\n this._textureMatrix = value;\r\n\r\n if (value.updateFlag === this._textureMatrix.updateFlag) {\r\n return;\r\n }\r\n\r\n if (value.isIdentity() !== this._textureMatrix.isIdentity()) {\r\n this.getScene()?.markAllMaterialsAsDirty(1, (mat) => mat.getActiveTextures().indexOf(this) !== -1);\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the texture and release its associated resources.\r\n */\r\n public dispose(): void {\r\n this.onLoadObservable.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Parses a JSON representation of an HDR Texture in order to create the texture\r\n * @param parsedTexture Define the JSON representation\r\n * @param scene Define the scene the texture should be created in\r\n * @param rootUrl Define the root url in case we need to load relative dependencies\r\n * @returns the newly created texture after parsing\r\n */\r\n public static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable<HDRCubeTexture> {\r\n var texture = null;\r\n if (parsedTexture.name && !parsedTexture.isRenderTarget) {\r\n texture = new HDRCubeTexture(rootUrl + parsedTexture.name, scene, parsedTexture.size, parsedTexture.noMipmap,\r\n parsedTexture.generateHarmonics, parsedTexture.useInGammaSpace);\r\n texture.name = parsedTexture.name;\r\n texture.hasAlpha = parsedTexture.hasAlpha;\r\n texture.level = parsedTexture.level;\r\n texture.coordinatesMode = parsedTexture.coordinatesMode;\r\n texture.isBlocking = parsedTexture.isBlocking;\r\n }\r\n if (texture) {\r\n if (parsedTexture.boundingBoxPosition) {\r\n (<any>texture).boundingBoxPosition = Vector3.FromArray(parsedTexture.boundingBoxPosition);\r\n }\r\n if (parsedTexture.boundingBoxSize) {\r\n (<any>texture).boundingBoxSize = Vector3.FromArray(parsedTexture.boundingBoxSize);\r\n }\r\n if (parsedTexture.rotationY) {\r\n (<any>texture).rotationY = parsedTexture.rotationY;\r\n }\r\n }\r\n return texture;\r\n }\r\n\r\n public serialize(): any {\r\n if (!this.name) {\r\n return null;\r\n }\r\n\r\n var serializationObject: any = {};\r\n serializationObject.name = this.name;\r\n serializationObject.hasAlpha = this.hasAlpha;\r\n serializationObject.isCube = true;\r\n serializationObject.level = this.level;\r\n serializationObject.size = this._size;\r\n serializationObject.coordinatesMode = this.coordinatesMode;\r\n serializationObject.useInGammaSpace = this.gammaSpace;\r\n serializationObject.generateHarmonics = this._generateHarmonics;\r\n serializationObject.customType = \"BABYLON.HDRCubeTexture\";\r\n serializationObject.noMipmap = this._noMipmap;\r\n serializationObject.isBlocking = this._isBlocking;\r\n serializationObject.rotationY = this._rotationY;\r\n\r\n return serializationObject;\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.HDRCubeTexture\", HDRCubeTexture);\r\n"]}
@@ -55,6 +55,8 @@ export declare class MirrorTexture extends RenderTargetTexture {
55
55
  private _blurKernelX;
56
56
  private _blurKernelY;
57
57
  private _blurRatio;
58
+ private _sceneUBO;
59
+ private _currentSceneUBO;
58
60
  /**
59
61
  * Instantiates a Mirror Texture.
60
62
  * Mirror texture can be used to simulate the view from a mirror in a scene.
@@ -52,6 +52,9 @@ var MirrorTexture = /** @class */ (function (_super) {
52
52
  _this._updateGammaSpace();
53
53
  });
54
54
  var engine = _this.getScene().getEngine();
55
+ if (engine.supportsUniformBuffers) {
56
+ _this._sceneUBO = scene.createSceneUniformBuffer("Scene for Mirror Texture (name \"" + name + "\")");
57
+ }
55
58
  _this.onBeforeBindObservable.add(function () {
56
59
  var _a;
57
60
  (_a = engine._debugPushGroup) === null || _a === void 0 ? void 0 : _a.call(engine, "mirror generation for " + name, 1);
@@ -62,6 +65,11 @@ var MirrorTexture = /** @class */ (function (_super) {
62
65
  });
63
66
  var saveClipPlane;
64
67
  _this.onBeforeRenderObservable.add(function () {
68
+ if (_this._sceneUBO) {
69
+ _this._currentSceneUBO = scene.getSceneUniformBuffer();
70
+ scene.setSceneUniformBuffer(_this._sceneUBO);
71
+ scene.getSceneUniformBuffer().unbindEffect();
72
+ }
65
73
  Matrix.ReflectionToRef(_this.mirrorPlane, _this._mirrorMatrix);
66
74
  _this._mirrorMatrix.multiplyToRef(scene.getViewMatrix(), _this._transformMatrix);
67
75
  scene.setTransformMatrix(_this._transformMatrix, scene.getProjectionMatrix());
@@ -71,6 +79,9 @@ var MirrorTexture = /** @class */ (function (_super) {
71
79
  scene._mirroredCameraPosition = Vector3.TransformCoordinates(scene.activeCamera.globalPosition, _this._mirrorMatrix);
72
80
  });
73
81
  _this.onAfterRenderObservable.add(function () {
82
+ if (_this._sceneUBO) {
83
+ scene.setSceneUniformBuffer(_this._currentSceneUBO);
84
+ }
74
85
  scene.updateTransformMatrix();
75
86
  scene.getEngine().cullBackFaces = null;
76
87
  scene._mirroredCameraPosition = null;
@@ -245,8 +256,10 @@ var MirrorTexture = /** @class */ (function (_super) {
245
256
  * Dispose the texture and release its associated resources.
246
257
  */
247
258
  MirrorTexture.prototype.dispose = function () {
259
+ var _a;
248
260
  _super.prototype.dispose.call(this);
249
261
  this.scene.imageProcessingConfiguration.onUpdateParameters.remove(this._imageProcessingConfigChangeObserver);
262
+ (_a = this._sceneUBO) === null || _a === void 0 ? void 0 : _a.dispose();
250
263
  };
251
264
  return MirrorTexture;
252
265
  }(RenderTargetTexture));