@babylonjs/core 7.23.1 → 7.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/Animations/animation.js +3 -3
  2. package/Animations/animation.js.map +1 -1
  3. package/Audio/sound.js +15 -7
  4. package/Audio/sound.js.map +1 -1
  5. package/Behaviors/Meshes/followBehavior.js +3 -3
  6. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  7. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  8. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  9. package/Compute/computeEffect.js +4 -4
  10. package/Compute/computeEffect.js.map +1 -1
  11. package/Engines/Extensions/engine.prefilteredCubeTexture.js +2 -3
  12. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  13. package/Engines/Processors/Expressions/shaderDefineExpression.js +1 -1
  14. package/Engines/Processors/Expressions/shaderDefineExpression.js.map +1 -1
  15. package/Engines/WebGPU/webgpuHardwareTexture.js +2 -2
  16. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  17. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +2 -2
  18. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  19. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +12 -10
  20. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  21. package/Engines/WebGPU/webgpuTextureHelper.js +2 -2
  22. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  23. package/Engines/abstractEngine.js +2 -2
  24. package/Engines/abstractEngine.js.map +1 -1
  25. package/Engines/engineCapabilities.d.ts +2 -0
  26. package/Engines/engineCapabilities.js.map +1 -1
  27. package/Engines/nativeEngine.js +3 -2
  28. package/Engines/nativeEngine.js.map +1 -1
  29. package/Engines/nullEngine.js +1 -0
  30. package/Engines/nullEngine.js.map +1 -1
  31. package/Engines/thinEngine.js +2 -0
  32. package/Engines/thinEngine.js.map +1 -1
  33. package/Engines/webgpuEngine.js +1 -0
  34. package/Engines/webgpuEngine.js.map +1 -1
  35. package/LensFlares/lensFlareSystem.js +2 -2
  36. package/LensFlares/lensFlareSystem.js.map +1 -1
  37. package/Loading/sceneLoader.js +3 -3
  38. package/Loading/sceneLoader.js.map +1 -1
  39. package/Materials/Node/Blocks/Dual/lightBlock.js +17 -8
  40. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  41. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +2 -2
  42. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  43. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -2
  44. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  45. package/Materials/Node/Blocks/PBR/refractionBlock.js +1 -2
  46. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  47. package/Materials/Node/Blocks/colorMergerBlock.js +1 -1
  48. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  49. package/Materials/Node/Blocks/vectorMergerBlock.js +1 -1
  50. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  51. package/Materials/PBR/pbrBaseMaterial.js +1 -2
  52. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  53. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -2
  54. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  55. package/Materials/Textures/Filtering/hdrFiltering.d.ts +0 -2
  56. package/Materials/Textures/Filtering/hdrFiltering.js +12 -4
  57. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  58. package/Materials/Textures/Loaders/textureLoaderManager.d.ts +14 -1
  59. package/Materials/Textures/Loaders/textureLoaderManager.js +50 -21
  60. package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
  61. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +15 -1
  62. package/Materials/Textures/Procedurals/proceduralTexture.js +24 -1
  63. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  64. package/Materials/Textures/index.d.ts +6 -0
  65. package/Materials/Textures/index.js +8 -0
  66. package/Materials/Textures/index.js.map +1 -1
  67. package/Materials/Textures/texture.js +2 -2
  68. package/Materials/Textures/texture.js.map +1 -1
  69. package/Materials/effect.functions.js +4 -4
  70. package/Materials/effect.functions.js.map +1 -1
  71. package/Maths/math.color.js +6 -7
  72. package/Maths/math.color.js.map +1 -1
  73. package/Maths/math.path.js +5 -5
  74. package/Maths/math.path.js.map +1 -1
  75. package/Maths/math.scalar.d.ts +33 -191
  76. package/Maths/math.scalar.functions.d.ts +147 -0
  77. package/Maths/math.scalar.functions.js +247 -0
  78. package/Maths/math.scalar.functions.js.map +1 -1
  79. package/Maths/math.scalar.js +15 -303
  80. package/Maths/math.scalar.js.map +1 -1
  81. package/Meshes/Builders/decalBuilder.js +3 -3
  82. package/Meshes/Builders/decalBuilder.js.map +1 -1
  83. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +8 -1
  84. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +30 -13
  85. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  86. package/Meshes/Node/Blocks/conditionBlock.js +2 -2
  87. package/Meshes/Node/Blocks/conditionBlock.js.map +1 -1
  88. package/Meshes/Node/Blocks/geometryOptimizeBlock.js +4 -4
  89. package/Meshes/Node/Blocks/geometryOptimizeBlock.js.map +1 -1
  90. package/Meshes/Node/Blocks/noiseBlock.js +3 -3
  91. package/Meshes/Node/Blocks/noiseBlock.js.map +1 -1
  92. package/Meshes/geodesicMesh.js +3 -3
  93. package/Meshes/geodesicMesh.js.map +1 -1
  94. package/Meshes/trailMesh.js +4 -4
  95. package/Meshes/trailMesh.js.map +1 -1
  96. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +7 -7
  97. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  98. package/Misc/PerformanceViewer/performanceViewerCollector.js +2 -1
  99. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  100. package/Misc/basis.js +2 -3
  101. package/Misc/basis.js.map +1 -1
  102. package/Misc/dds.js +9 -9
  103. package/Misc/dds.js.map +1 -1
  104. package/Misc/dumpTools.js +2 -2
  105. package/Misc/dumpTools.js.map +1 -1
  106. package/Misc/environmentTextureTools.js +4 -4
  107. package/Misc/environmentTextureTools.js.map +1 -1
  108. package/Misc/reflector.js +3 -3
  109. package/Misc/reflector.js.map +1 -1
  110. package/Misc/screenshotTools.d.ts +2 -1
  111. package/Misc/screenshotTools.js +3 -2
  112. package/Misc/screenshotTools.js.map +1 -1
  113. package/Misc/tools.d.ts +6 -3
  114. package/Misc/tools.js +5 -3
  115. package/Misc/tools.js.map +1 -1
  116. package/Particles/EmitterTypes/coneParticleEmitter.js +10 -10
  117. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  118. package/Particles/EmitterTypes/cylinderParticleEmitter.js +9 -9
  119. package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
  120. package/Particles/EmitterTypes/hemisphericParticleEmitter.js +7 -7
  121. package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
  122. package/Particles/EmitterTypes/meshParticleEmitter.js +4 -4
  123. package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
  124. package/Particles/EmitterTypes/pointParticleEmitter.js +4 -4
  125. package/Particles/EmitterTypes/pointParticleEmitter.js.map +1 -1
  126. package/Particles/EmitterTypes/sphereParticleEmitter.js +10 -10
  127. package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
  128. package/Particles/gpuParticleSystem.js +2 -2
  129. package/Particles/gpuParticleSystem.js.map +1 -1
  130. package/Particles/pointsCloudSystem.js +8 -8
  131. package/Particles/pointsCloudSystem.js.map +1 -1
  132. package/Physics/v1/Plugins/ammoJSPlugin.js +2 -2
  133. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  134. package/Physics/v2/physicsAggregate.js +2 -2
  135. package/Physics/v2/physicsAggregate.js.map +1 -1
  136. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -2
  137. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  138. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +2 -2
  139. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  140. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +4 -4
  141. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  142. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +2 -2
  143. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  144. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.d.ts +4 -0
  145. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +6 -0
  146. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  147. package/PostProcesses/postProcess.d.ts +4 -0
  148. package/PostProcesses/postProcess.js +1 -0
  149. package/PostProcesses/postProcess.js.map +1 -1
  150. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +0 -2
  151. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +46 -3
  152. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  153. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts +0 -5
  154. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +33 -5
  155. package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -1
  156. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +8 -3
  157. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +56 -18
  158. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  159. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +0 -2
  160. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +20 -2
  161. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  162. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +2 -14
  163. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +108 -36
  164. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  165. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +0 -2
  166. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +23 -11
  167. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  168. package/Rendering/depthPeelingRenderer.d.ts +7 -3
  169. package/Rendering/depthPeelingRenderer.js +38 -3
  170. package/Rendering/depthPeelingRenderer.js.map +1 -1
  171. package/Rendering/index.d.ts +44 -0
  172. package/Rendering/index.js +46 -0
  173. package/Rendering/index.js.map +1 -1
  174. package/Shaders/iblCombineVoxelGrids.fragment.d.ts +5 -0
  175. package/Shaders/{combineVoxelGrids.fragment.js → iblCombineVoxelGrids.fragment.js} +3 -3
  176. package/Shaders/iblCombineVoxelGrids.fragment.js.map +1 -0
  177. package/Shaders/iblGenerateVoxelMip.fragment.d.ts +5 -0
  178. package/Shaders/{generateVoxelMip.fragment.js → iblGenerateVoxelMip.fragment.js} +3 -3
  179. package/Shaders/iblGenerateVoxelMip.fragment.js.map +1 -0
  180. package/Shaders/iblShadowVoxelTracing.fragment.js +18 -10
  181. package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
  182. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js +2 -1
  183. package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +1 -1
  184. package/Shaders/{voxelGrid.fragment.d.ts → iblVoxelGrid.fragment.d.ts} +1 -1
  185. package/Shaders/{voxelGrid.fragment.js → iblVoxelGrid.fragment.js} +3 -3
  186. package/Shaders/iblVoxelGrid.fragment.js.map +1 -0
  187. package/Shaders/{voxelSlabDebug.fragment.d.ts → iblVoxelGrid.vertex.d.ts} +1 -1
  188. package/Shaders/{voxelGrid.vertex.js → iblVoxelGrid.vertex.js} +8 -4
  189. package/Shaders/iblVoxelGrid.vertex.js.map +1 -0
  190. package/Shaders/iblVoxelGrid2dArrayDebug.fragment.d.ts +5 -0
  191. package/Shaders/{voxelGrid2dArrayDebug.fragment.js → iblVoxelGrid2dArrayDebug.fragment.js} +3 -3
  192. package/Shaders/iblVoxelGrid2dArrayDebug.fragment.js.map +1 -0
  193. package/Shaders/iblVoxelGrid3dDebug.fragment.d.ts +5 -0
  194. package/Shaders/{voxelGrid3dDebug.fragment.js → iblVoxelGrid3dDebug.fragment.js} +3 -3
  195. package/Shaders/iblVoxelGrid3dDebug.fragment.js.map +1 -0
  196. package/Shaders/{combineVoxelGrids.fragment.d.ts → iblVoxelSlabDebug.fragment.d.ts} +1 -1
  197. package/Shaders/{voxelSlabDebug.fragment.js → iblVoxelSlabDebug.fragment.js} +3 -3
  198. package/Shaders/iblVoxelSlabDebug.fragment.js.map +1 -0
  199. package/Shaders/iblVoxelSlabDebug.vertex.d.ts +5 -0
  200. package/Shaders/{voxelSlabDebug.vertex.js → iblVoxelSlabDebug.vertex.js} +3 -3
  201. package/Shaders/iblVoxelSlabDebug.vertex.js.map +1 -0
  202. package/ShadersWGSL/ShadersInclude/lightFragment.js +7 -7
  203. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  204. package/ShadersWGSL/copyTexture3DLayerToTexture.fragment.d.ts +5 -0
  205. package/ShadersWGSL/copyTexture3DLayerToTexture.fragment.js +10 -0
  206. package/ShadersWGSL/copyTexture3DLayerToTexture.fragment.js.map +1 -0
  207. package/ShadersWGSL/default.fragment.js +4 -0
  208. package/ShadersWGSL/default.fragment.js.map +1 -1
  209. package/ShadersWGSL/hdrFiltering.fragment.d.ts +9 -0
  210. package/ShadersWGSL/hdrFiltering.fragment.js +18 -0
  211. package/ShadersWGSL/hdrFiltering.fragment.js.map +1 -0
  212. package/ShadersWGSL/hdrFiltering.vertex.d.ts +5 -0
  213. package/ShadersWGSL/hdrFiltering.vertex.js +16 -0
  214. package/ShadersWGSL/hdrFiltering.vertex.js.map +1 -0
  215. package/ShadersWGSL/iblCombineVoxelGrids.fragment.d.ts +5 -0
  216. package/ShadersWGSL/iblCombineVoxelGrids.fragment.js +10 -0
  217. package/ShadersWGSL/iblCombineVoxelGrids.fragment.js.map +1 -0
  218. package/ShadersWGSL/iblGenerateVoxelMip.fragment.d.ts +5 -0
  219. package/ShadersWGSL/iblGenerateVoxelMip.fragment.js +26 -0
  220. package/ShadersWGSL/iblGenerateVoxelMip.fragment.js.map +1 -0
  221. package/ShadersWGSL/iblShadowAccumulation.fragment.d.ts +5 -0
  222. package/ShadersWGSL/iblShadowAccumulation.fragment.js +24 -0
  223. package/ShadersWGSL/iblShadowAccumulation.fragment.js.map +1 -0
  224. package/ShadersWGSL/iblShadowDebug.fragment.d.ts +5 -0
  225. package/ShadersWGSL/iblShadowDebug.fragment.js +16 -0
  226. package/ShadersWGSL/iblShadowDebug.fragment.js.map +1 -0
  227. package/ShadersWGSL/iblShadowGBufferDebug.fragment.d.ts +5 -0
  228. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js +17 -0
  229. package/ShadersWGSL/iblShadowGBufferDebug.fragment.js.map +1 -0
  230. package/ShadersWGSL/iblShadowSpatialBlur.fragment.d.ts +5 -0
  231. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js +20 -0
  232. package/ShadersWGSL/iblShadowSpatialBlur.fragment.js.map +1 -0
  233. package/ShadersWGSL/iblShadowVoxelTracing.fragment.d.ts +5 -0
  234. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +163 -0
  235. package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -0
  236. package/ShadersWGSL/iblShadowsCdfx.fragment.d.ts +5 -0
  237. package/ShadersWGSL/iblShadowsCdfx.fragment.js +12 -0
  238. package/ShadersWGSL/iblShadowsCdfx.fragment.js.map +1 -0
  239. package/ShadersWGSL/iblShadowsCdfy.fragment.d.ts +5 -0
  240. package/ShadersWGSL/iblShadowsCdfy.fragment.js +33 -0
  241. package/ShadersWGSL/iblShadowsCdfy.fragment.js.map +1 -0
  242. package/ShadersWGSL/iblShadowsCombine.fragment.d.ts +5 -0
  243. package/ShadersWGSL/iblShadowsCombine.fragment.js +10 -0
  244. package/ShadersWGSL/iblShadowsCombine.fragment.js.map +1 -0
  245. package/ShadersWGSL/iblShadowsIcdfx.fragment.d.ts +5 -0
  246. package/ShadersWGSL/iblShadowsIcdfx.fragment.js +18 -0
  247. package/ShadersWGSL/iblShadowsIcdfx.fragment.js.map +1 -0
  248. package/ShadersWGSL/iblShadowsIcdfy.fragment.d.ts +5 -0
  249. package/ShadersWGSL/iblShadowsIcdfy.fragment.js +17 -0
  250. package/ShadersWGSL/iblShadowsIcdfy.fragment.js.map +1 -0
  251. package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.d.ts +5 -0
  252. package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.js +41 -0
  253. package/ShadersWGSL/iblShadowsImportanceSamplingDebug.fragment.js.map +1 -0
  254. package/{Shaders/voxelGrid3dDebug.fragment.d.ts → ShadersWGSL/iblVoxelGrid.fragment.d.ts} +1 -1
  255. package/ShadersWGSL/iblVoxelGrid.fragment.js +15 -0
  256. package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -0
  257. package/ShadersWGSL/iblVoxelGrid.vertex.d.ts +5 -0
  258. package/ShadersWGSL/iblVoxelGrid.vertex.js +14 -0
  259. package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -0
  260. package/ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment.d.ts +5 -0
  261. package/ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment.js +10 -0
  262. package/ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment.js.map +1 -0
  263. package/ShadersWGSL/iblVoxelGrid3dDebug.fragment.d.ts +5 -0
  264. package/ShadersWGSL/iblVoxelGrid3dDebug.fragment.js +22 -0
  265. package/ShadersWGSL/iblVoxelGrid3dDebug.fragment.js.map +1 -0
  266. package/ShadersWGSL/iblVoxelSlabDebug.fragment.d.ts +5 -0
  267. package/ShadersWGSL/iblVoxelSlabDebug.fragment.js +12 -0
  268. package/ShadersWGSL/iblVoxelSlabDebug.fragment.js.map +1 -0
  269. package/ShadersWGSL/iblVoxelSlabDebug.vertex.d.ts +5 -0
  270. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js +10 -0
  271. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js.map +1 -0
  272. package/{Shaders/generateVoxelMip.fragment.d.ts → ShadersWGSL/oitBackBlend.fragment.d.ts} +1 -1
  273. package/ShadersWGSL/oitBackBlend.fragment.js +11 -0
  274. package/ShadersWGSL/oitBackBlend.fragment.js.map +1 -0
  275. package/{Shaders/voxelGrid.vertex.d.ts → ShadersWGSL/oitFinal.fragment.d.ts} +1 -1
  276. package/ShadersWGSL/oitFinal.fragment.js +14 -0
  277. package/ShadersWGSL/oitFinal.fragment.js.map +1 -0
  278. package/ShadersWGSL/pbr.fragment.js +17 -8
  279. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  280. package/{Shaders/voxelSlabDebug.vertex.d.ts → ShadersWGSL/procedural.vertex.d.ts} +1 -1
  281. package/ShadersWGSL/procedural.vertex.js +16 -0
  282. package/ShadersWGSL/procedural.vertex.js.map +1 -0
  283. package/XR/features/WebXRHandTracking.d.ts +5 -0
  284. package/XR/features/WebXRHandTracking.js +34 -12
  285. package/XR/features/WebXRHandTracking.js.map +1 -1
  286. package/package.json +2 -2
  287. package/Shaders/combineVoxelGrids.fragment.js.map +0 -1
  288. package/Shaders/generateVoxelMip.fragment.js.map +0 -1
  289. package/Shaders/voxelGrid.fragment.js.map +0 -1
  290. package/Shaders/voxelGrid.vertex.js.map +0 -1
  291. package/Shaders/voxelGrid2dArrayDebug.fragment.d.ts +0 -5
  292. package/Shaders/voxelGrid2dArrayDebug.fragment.js.map +0 -1
  293. package/Shaders/voxelGrid3dDebug.fragment.js.map +0 -1
  294. package/Shaders/voxelSlabDebug.fragment.js.map +0 -1
  295. package/Shaders/voxelSlabDebug.vertex.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"environmentTextureTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/environmentTextureTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { Tools } from \"./tools\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport { SphericalPolynomial } from \"../Maths/sphericalPolynomial\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Scene } from \"../scene\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { RGBDTextureTools } from \"./rgbdTextureTools\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\n\r\nimport \"../Engines/Extensions/engine.renderTargetCube\";\r\nimport \"../Engines/Extensions/engine.readTexture\";\r\nimport \"../Materials/Textures/baseTexture.polynomial\";\r\n\r\nimport { DumpDataAsync } from \"../Misc/dumpTools\";\r\nimport { ShaderLanguage } from \"core/Materials\";\r\n\r\nconst DefaultEnvironmentTextureImageType = \"image/png\";\r\nconst CurrentVersion = 2;\r\n\r\n/**\r\n * Raw texture data and descriptor sufficient for WebGL texture upload\r\n */\r\nexport type EnvironmentTextureInfo = EnvironmentTextureInfoV1 | EnvironmentTextureInfoV2;\r\n\r\n/**\r\n * v1 of EnvironmentTextureInfo\r\n */\r\ninterface EnvironmentTextureInfoV1 {\r\n /**\r\n * Version of the environment map\r\n */\r\n version: 1;\r\n\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n\r\n /**\r\n * Irradiance information stored in the file.\r\n */\r\n irradiance: any;\r\n\r\n /**\r\n * Specular information stored in the file.\r\n */\r\n specular: any;\r\n}\r\n\r\n/**\r\n * v2 of EnvironmentTextureInfo\r\n */\r\ninterface EnvironmentTextureInfoV2 {\r\n /**\r\n * Version of the environment map\r\n */\r\n version: 2;\r\n\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n\r\n /**\r\n * Irradiance information stored in the file.\r\n */\r\n irradiance: any;\r\n\r\n /**\r\n * Specular information stored in the file.\r\n */\r\n specular: any;\r\n\r\n /**\r\n * The mime type used to encode the image data.\r\n */\r\n imageType: string;\r\n}\r\n\r\n/**\r\n * Defines One Image in the file. It requires only the position in the file\r\n * as well as the length.\r\n */\r\ninterface BufferImageData {\r\n /**\r\n * Length of the image data.\r\n */\r\n length: number;\r\n /**\r\n * Position of the data from the null terminator delimiting the end of the JSON.\r\n */\r\n position: number;\r\n}\r\n\r\n/**\r\n * Defines the specular data enclosed in the file.\r\n * This corresponds to the version 1 of the data.\r\n */\r\nexport interface EnvironmentTextureSpecularInfoV1 {\r\n /**\r\n * Defines where the specular Payload is located. It is a runtime value only not stored in the file.\r\n */\r\n specularDataPosition?: number;\r\n /**\r\n * This contains all the images data needed to reconstruct the cubemap.\r\n */\r\n mipmaps: Array<BufferImageData>;\r\n /**\r\n * Defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness.\r\n */\r\n lodGenerationScale: number;\r\n}\r\n\r\n/**\r\n * Defines the required storage to save the environment irradiance information.\r\n */\r\ninterface EnvironmentTextureIrradianceInfoV1 {\r\n x: Array<number>;\r\n y: Array<number>;\r\n z: Array<number>;\r\n\r\n xx: Array<number>;\r\n yy: Array<number>;\r\n zz: Array<number>;\r\n\r\n yz: Array<number>;\r\n zx: Array<number>;\r\n xy: Array<number>;\r\n}\r\n\r\n/**\r\n * Options for creating environment textures\r\n */\r\nexport interface CreateEnvTextureOptions {\r\n /**\r\n * The mime type of encoded images.\r\n */\r\n imageType?: string;\r\n\r\n /**\r\n * the image quality of encoded WebP images.\r\n */\r\n imageQuality?: number;\r\n}\r\n\r\n/**\r\n * Magic number identifying the env file.\r\n */\r\nconst MagicBytes = [0x86, 0x16, 0x87, 0x96, 0xf6, 0xd6, 0x96, 0x36];\r\n\r\n/**\r\n * Gets the environment info from an env file.\r\n * @param data The array buffer containing the .env bytes.\r\n * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.\r\n */\r\nexport function GetEnvInfo(data: ArrayBufferView): Nullable<EnvironmentTextureInfoV2> {\r\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n let pos = 0;\r\n\r\n for (let i = 0; i < MagicBytes.length; i++) {\r\n if (dataView.getUint8(pos++) !== MagicBytes[i]) {\r\n Logger.Error(\"Not a babylon environment map\");\r\n return null;\r\n }\r\n }\r\n\r\n // Read json manifest - collect characters up to null terminator\r\n let manifestString = \"\";\r\n let charCode = 0x00;\r\n while ((charCode = dataView.getUint8(pos++))) {\r\n manifestString += String.fromCharCode(charCode);\r\n }\r\n\r\n let manifest: EnvironmentTextureInfo = JSON.parse(manifestString);\r\n manifest = normalizeEnvInfo(manifest);\r\n if (manifest.specular) {\r\n // Extend the header with the position of the payload.\r\n manifest.specular.specularDataPosition = pos;\r\n // Fallback to 0.8 exactly if lodGenerationScale is not defined for backward compatibility.\r\n manifest.specular.lodGenerationScale = manifest.specular.lodGenerationScale || 0.8;\r\n }\r\n\r\n return manifest;\r\n}\r\n\r\n/**\r\n * Normalizes any supported version of the environment file info to the latest version\r\n * @param info environment file info on any supported version\r\n * @returns environment file info in the latest supported version\r\n * @private\r\n */\r\nexport function normalizeEnvInfo(info: EnvironmentTextureInfo): EnvironmentTextureInfoV2 {\r\n if (info.version > CurrentVersion) {\r\n throw new Error(`Unsupported babylon environment map version \"${info.version}\". Latest supported version is \"${CurrentVersion}\".`);\r\n }\r\n\r\n if (info.version === 2) {\r\n return info;\r\n }\r\n\r\n // Migrate a v1 info to v2\r\n info = { ...info, version: 2, imageType: DefaultEnvironmentTextureImageType };\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Creates an environment texture from a loaded cube texture.\r\n * @param texture defines the cube texture to convert in env file\r\n * @param options options for the conversion process\r\n * @param options.imageType the mime type for the encoded images, with support for \"image/png\" (default) and \"image/webp\"\r\n * @param options.imageQuality the image quality of encoded WebP images.\r\n * @returns a promise containing the environment data if successful.\r\n */\r\nexport async function CreateEnvTextureAsync(texture: BaseTexture, options: CreateEnvTextureOptions = {}): Promise<ArrayBuffer> {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return Promise.reject(\"The cube texture is invalid.\");\r\n }\r\n\r\n const imageType = options.imageType ?? DefaultEnvironmentTextureImageType;\r\n\r\n const engine = internalTexture.getEngine() as Engine;\r\n\r\n if (\r\n texture.textureType !== Constants.TEXTURETYPE_HALF_FLOAT &&\r\n texture.textureType !== Constants.TEXTURETYPE_FLOAT &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_BYTE &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_INT &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_INTEGER &&\r\n texture.textureType !== -1\r\n ) {\r\n return Promise.reject(\"The cube texture should allow HDR (Full Float or Half Float).\");\r\n }\r\n\r\n let textureType = Constants.TEXTURETYPE_FLOAT;\r\n if (!engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n if (!engine.getCaps().textureHalfFloatRender) {\r\n return Promise.reject(\"Env texture can only be created when the browser supports half float or full float rendering.\");\r\n }\r\n }\r\n\r\n // sphericalPolynomial is lazy loaded so simply accessing it should trigger the computation.\r\n texture.sphericalPolynomial;\r\n\r\n // Lets keep track of the polynomial promise so we can wait for it to be ready before generating the pixels.\r\n const sphericalPolynomialPromise = texture.getInternalTexture()?._sphericalPolynomialPromise;\r\n\r\n const cubeWidth = internalTexture.width;\r\n const hostingScene = new Scene(engine);\r\n const specularTextures: { [key: number]: ArrayBuffer } = {};\r\n\r\n // As we are going to readPixels the faces of the cube, make sure the drawing/update commands for the cube texture are fully sent to the GPU in case it is drawn for the first time in this very frame!\r\n engine.flushFramebuffer();\r\n\r\n // Read and collect all mipmaps data from the cube.\r\n const mipmapsCount = Scalar.ILog2(internalTexture.width);\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n const faceWidth = Math.pow(2, mipmapsCount - i);\r\n\r\n // All faces of the cube.\r\n for (let face = 0; face < 6; face++) {\r\n let faceData = await texture.readPixels(face, i, undefined, false);\r\n if (faceData && faceData.byteLength === (faceData as Uint8Array).length) {\r\n const faceDataFloat = new Float32Array(faceData!.byteLength * 4);\r\n for (let i = 0; i < faceData.byteLength; i++) {\r\n faceDataFloat[i] = (faceData as Uint8Array)[i] / 255;\r\n // Gamma to linear\r\n faceDataFloat[i] = Math.pow(faceDataFloat[i], 2.2);\r\n }\r\n faceData = faceDataFloat;\r\n } else if (faceData && texture.gammaSpace) {\r\n const floatData = faceData as Float32Array;\r\n for (let i = 0; i < floatData.length; i++) {\r\n // Gamma to linear\r\n floatData[i] = Math.pow(floatData[i], 2.2);\r\n }\r\n }\r\n\r\n const tempTexture = engine.createRawTexture(\r\n faceData,\r\n faceWidth,\r\n faceWidth,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n true,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n null,\r\n textureType\r\n );\r\n\r\n await RGBDTextureTools.EncodeTextureToRGBD(tempTexture, hostingScene, textureType);\r\n\r\n const rgbdEncodedData = await engine._readTexturePixels(tempTexture, faceWidth, faceWidth);\r\n\r\n const imageEncodedData = await DumpDataAsync(faceWidth, faceWidth, rgbdEncodedData, imageType, undefined, false, true, options.imageQuality);\r\n\r\n specularTextures[i * 6 + face] = imageEncodedData as ArrayBuffer;\r\n\r\n tempTexture.dispose();\r\n }\r\n }\r\n\r\n // We can delete the hosting scene keeping track of all the creation objects\r\n hostingScene.dispose();\r\n\r\n // Ensure completion of the polynomial creation promise.\r\n if (sphericalPolynomialPromise) {\r\n await sphericalPolynomialPromise;\r\n }\r\n\r\n // Creates the json header for the env texture\r\n const info: EnvironmentTextureInfo = {\r\n version: CurrentVersion,\r\n width: cubeWidth,\r\n imageType,\r\n irradiance: _CreateEnvTextureIrradiance(texture),\r\n specular: {\r\n mipmaps: [],\r\n lodGenerationScale: texture.lodGenerationScale,\r\n },\r\n };\r\n\r\n // Sets the specular image data information\r\n let position = 0;\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n const byteLength = specularTextures[i * 6 + face].byteLength;\r\n info.specular.mipmaps.push({\r\n length: byteLength,\r\n position: position,\r\n });\r\n position += byteLength;\r\n }\r\n }\r\n\r\n // Encode the JSON as an array buffer\r\n const infoString = JSON.stringify(info);\r\n const infoBuffer = new ArrayBuffer(infoString.length + 1);\r\n const infoView = new Uint8Array(infoBuffer); // Limited to ascii subset matching unicode.\r\n for (let i = 0, strLen = infoString.length; i < strLen; i++) {\r\n infoView[i] = infoString.charCodeAt(i);\r\n }\r\n // Ends up with a null terminator for easier parsing\r\n infoView[infoString.length] = 0x00;\r\n\r\n // Computes the final required size and creates the storage\r\n const totalSize = MagicBytes.length + position + infoBuffer.byteLength;\r\n const finalBuffer = new ArrayBuffer(totalSize);\r\n const finalBufferView = new Uint8Array(finalBuffer);\r\n const dataView = new DataView(finalBuffer);\r\n\r\n // Copy the magic bytes identifying the file in\r\n let pos = 0;\r\n for (let i = 0; i < MagicBytes.length; i++) {\r\n dataView.setUint8(pos++, MagicBytes[i]);\r\n }\r\n\r\n // Add the json info\r\n finalBufferView.set(new Uint8Array(infoBuffer), pos);\r\n pos += infoBuffer.byteLength;\r\n\r\n // Finally inserts the texture data\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n const dataBuffer = specularTextures[i * 6 + face];\r\n finalBufferView.set(new Uint8Array(dataBuffer), pos);\r\n pos += dataBuffer.byteLength;\r\n }\r\n }\r\n\r\n // Voila\r\n return finalBuffer;\r\n}\r\n\r\n/**\r\n * Creates a JSON representation of the spherical data.\r\n * @param texture defines the texture containing the polynomials\r\n * @returns the JSON representation of the spherical info\r\n */\r\nfunction _CreateEnvTextureIrradiance(texture: BaseTexture): Nullable<EnvironmentTextureIrradianceInfoV1> {\r\n const polynmials = texture.sphericalPolynomial;\r\n if (polynmials == null) {\r\n return null;\r\n }\r\n\r\n return {\r\n x: [polynmials.x.x, polynmials.x.y, polynmials.x.z],\r\n y: [polynmials.y.x, polynmials.y.y, polynmials.y.z],\r\n z: [polynmials.z.x, polynmials.z.y, polynmials.z.z],\r\n\r\n xx: [polynmials.xx.x, polynmials.xx.y, polynmials.xx.z],\r\n yy: [polynmials.yy.x, polynmials.yy.y, polynmials.yy.z],\r\n zz: [polynmials.zz.x, polynmials.zz.y, polynmials.zz.z],\r\n\r\n yz: [polynmials.yz.x, polynmials.yz.y, polynmials.yz.z],\r\n zx: [polynmials.zx.x, polynmials.zx.y, polynmials.zx.z],\r\n xy: [polynmials.xy.x, polynmials.xy.y, polynmials.xy.z],\r\n } as any;\r\n}\r\n\r\n/**\r\n * Creates the ArrayBufferViews used for initializing environment texture image data.\r\n * @param data the image data\r\n * @param info parameters that determine what views will be created for accessing the underlying buffer\r\n * @returns the views described by info providing access to the underlying buffer\r\n */\r\nexport function CreateImageDataArrayBufferViews(data: ArrayBufferView, info: EnvironmentTextureInfo): Array<Array<ArrayBufferView>> {\r\n info = normalizeEnvInfo(info);\r\n\r\n const specularInfo = info.specular as EnvironmentTextureSpecularInfoV1;\r\n\r\n // Double checks the enclosed info\r\n let mipmapsCount = Scalar.Log2(info.width);\r\n mipmapsCount = Math.round(mipmapsCount) + 1;\r\n if (specularInfo.mipmaps.length !== 6 * mipmapsCount) {\r\n throw new Error(`Unsupported specular mipmaps number \"${specularInfo.mipmaps.length}\"`);\r\n }\r\n\r\n const imageData = new Array<Array<ArrayBufferView>>(mipmapsCount);\r\n for (let i = 0; i < mipmapsCount; i++) {\r\n imageData[i] = new Array<ArrayBufferView>(6);\r\n for (let face = 0; face < 6; face++) {\r\n const imageInfo = specularInfo.mipmaps[i * 6 + face];\r\n imageData[i][face] = new Uint8Array(data.buffer, data.byteOffset + specularInfo.specularDataPosition! + imageInfo.position, imageInfo.length);\r\n }\r\n }\r\n\r\n return imageData;\r\n}\r\n\r\n/**\r\n * Uploads the texture info contained in the env file to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param data defines the data to load\r\n * @param info defines the texture info retrieved through the GetEnvInfo method\r\n * @returns a promise\r\n */\r\nexport function UploadEnvLevelsAsync(texture: InternalTexture, data: ArrayBufferView, info: EnvironmentTextureInfo): Promise<void> {\r\n info = normalizeEnvInfo(info);\r\n\r\n const specularInfo = info.specular as EnvironmentTextureSpecularInfoV1;\r\n if (!specularInfo) {\r\n // Nothing else parsed so far\r\n return Promise.resolve();\r\n }\r\n\r\n texture._lodGenerationScale = specularInfo.lodGenerationScale;\r\n\r\n const imageData = CreateImageDataArrayBufferViews(data, info);\r\n\r\n return UploadLevelsAsync(texture, imageData, info.imageType);\r\n}\r\n\r\nfunction _OnImageReadyAsync(\r\n image: HTMLImageElement | ImageBitmap,\r\n engine: Engine,\r\n expandTexture: boolean,\r\n rgbdPostProcess: Nullable<PostProcess>,\r\n url: string,\r\n face: number,\r\n i: number,\r\n generateNonLODTextures: boolean,\r\n lodTextures: Nullable<{ [lod: number]: BaseTexture }>,\r\n cubeRtt: Nullable<RenderTargetWrapper>,\r\n texture: InternalTexture\r\n): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (expandTexture) {\r\n const tempTexture = engine.createTexture(\r\n null,\r\n true,\r\n true,\r\n null,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n null,\r\n (message) => {\r\n reject(message);\r\n },\r\n image\r\n );\r\n\r\n rgbdPostProcess?.onEffectCreatedObservable.addOnce((effect) => {\r\n effect.executeWhenCompiled(() => {\r\n // Uncompress the data to a RTT\r\n rgbdPostProcess!.externalTextureSamplerBinding = true;\r\n rgbdPostProcess!.onApply = (effect) => {\r\n effect._bindTexture(\"textureSampler\", tempTexture);\r\n effect.setFloat2(\"scale\", 1, engine._features.needsInvertingBitmap && image instanceof ImageBitmap ? -1 : 1);\r\n };\r\n\r\n if (!engine.scenes.length) {\r\n return;\r\n }\r\n\r\n engine.scenes[0].postProcessManager.directRender([rgbdPostProcess!], cubeRtt, true, face, i);\r\n\r\n // Cleanup\r\n engine.restoreDefaultFramebuffer();\r\n tempTexture.dispose();\r\n URL.revokeObjectURL(url);\r\n resolve();\r\n });\r\n });\r\n } else {\r\n engine._uploadImageToTexture(texture, image, face, i);\r\n\r\n // Upload the face to the non lod texture support\r\n if (generateNonLODTextures) {\r\n const lodTexture = lodTextures![i];\r\n if (lodTexture) {\r\n engine._uploadImageToTexture(lodTexture._texture!, image, face, 0);\r\n }\r\n }\r\n resolve();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Uploads the levels of image data to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param imageData defines the array buffer views of image data [mipmap][face]\r\n * @param imageType the mime type of the image data\r\n * @returns a promise\r\n */\r\nexport async function UploadLevelsAsync(texture: InternalTexture, imageData: ArrayBufferView[][], imageType: string = DefaultEnvironmentTextureImageType): Promise<void> {\r\n if (!Tools.IsExponentOfTwo(texture.width)) {\r\n throw new Error(\"Texture size must be a power of two\");\r\n }\r\n\r\n const mipmapsCount = Scalar.ILog2(texture.width) + 1;\r\n\r\n // Gets everything ready.\r\n const engine = texture.getEngine() as Engine;\r\n let expandTexture = false;\r\n let generateNonLODTextures = false;\r\n let rgbdPostProcess: Nullable<PostProcess> = null;\r\n let cubeRtt: Nullable<RenderTargetWrapper> = null;\r\n let lodTextures: Nullable<{ [lod: number]: BaseTexture }> = null;\r\n const caps = engine.getCaps();\r\n\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n texture.generateMipMaps = true;\r\n texture._cachedAnisotropicFilteringLevel = null;\r\n engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, texture);\r\n\r\n // Add extra process if texture lod is not supported\r\n if (!caps.textureLOD) {\r\n expandTexture = false;\r\n generateNonLODTextures = true;\r\n lodTextures = {};\r\n }\r\n // in webgl 1 there are no ways to either render or copy lod level information for float textures.\r\n else if (!engine._features.supportRenderAndCopyToLodForFloatTextures) {\r\n expandTexture = false;\r\n }\r\n // If half float available we can uncompress the texture\r\n else if (caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering) {\r\n expandTexture = true;\r\n texture.type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n // If full float available we can uncompress the texture\r\n else if (caps.textureFloatRender && caps.textureFloatLinearFiltering) {\r\n expandTexture = true;\r\n texture.type = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n // Expand the texture if possible\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n if (expandTexture) {\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n await import(\"../ShadersWGSL/rgbdDecode.fragment\");\r\n } else {\r\n await import(\"../Shaders/rgbdDecode.fragment\");\r\n }\r\n\r\n // Simply run through the decode PP\r\n rgbdPostProcess = new PostProcess(\r\n \"rgbdDecode\",\r\n \"rgbdDecode\",\r\n null,\r\n null,\r\n 1,\r\n null,\r\n Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n undefined,\r\n texture.type,\r\n undefined,\r\n null,\r\n false,\r\n undefined,\r\n shaderLanguage\r\n );\r\n\r\n texture._isRGBD = false;\r\n texture.invertY = false;\r\n cubeRtt = engine.createRenderTargetCubeTexture(texture.width, {\r\n generateDepthBuffer: false,\r\n generateMipMaps: true,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n type: texture.type,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n });\r\n } else {\r\n texture._isRGBD = true;\r\n texture.invertY = true;\r\n\r\n // In case of missing support, applies the same patch than DDS files.\r\n if (generateNonLODTextures) {\r\n const mipSlices = 3;\r\n const scale = texture._lodGenerationScale;\r\n const offset = texture._lodGenerationOffset;\r\n\r\n for (let i = 0; i < mipSlices; i++) {\r\n //compute LOD from even spacing in smoothness (matching shader calculation)\r\n const smoothness = i / (mipSlices - 1);\r\n const roughness = 1 - smoothness;\r\n\r\n const minLODIndex = offset; // roughness = 0\r\n const maxLODIndex = (mipmapsCount - 1) * scale + offset; // roughness = 1 (mipmaps start from 0)\r\n\r\n const lodIndex = minLODIndex + (maxLODIndex - minLODIndex) * roughness;\r\n const mipmapIndex = Math.round(Math.min(Math.max(lodIndex, 0), maxLODIndex));\r\n\r\n const glTextureFromLod = new InternalTexture(engine, InternalTextureSource.Temp);\r\n glTextureFromLod.isCube = true;\r\n glTextureFromLod.invertY = true;\r\n glTextureFromLod.generateMipMaps = false;\r\n engine.updateTextureSamplingMode(Constants.TEXTURE_LINEAR_LINEAR, glTextureFromLod);\r\n\r\n // Wrap in a base texture for easy binding.\r\n const lodTexture = new BaseTexture(null);\r\n lodTexture._isCube = true;\r\n lodTexture._texture = glTextureFromLod;\r\n lodTextures![mipmapIndex] = lodTexture;\r\n\r\n switch (i) {\r\n case 0:\r\n texture._lodTextureLow = lodTexture;\r\n break;\r\n case 1:\r\n texture._lodTextureMid = lodTexture;\r\n break;\r\n case 2:\r\n texture._lodTextureHigh = lodTexture;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const promises: Promise<void>[] = [];\r\n // All mipmaps up to provided number of images\r\n for (let i = 0; i < imageData.length; i++) {\r\n // All faces\r\n for (let face = 0; face < 6; face++) {\r\n // Constructs an image element from image data\r\n const bytes = imageData[i][face];\r\n const blob = new Blob([bytes], { type: imageType });\r\n const url = URL.createObjectURL(blob);\r\n let promise: Promise<void>;\r\n\r\n if (engine._features.forceBitmapOverHTMLImageElement) {\r\n promise = engine.createImageBitmap(blob, { premultiplyAlpha: \"none\" }).then((img) => {\r\n return _OnImageReadyAsync(img, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.src = url;\r\n\r\n // Enqueue promise to upload to the texture.\r\n promise = new Promise<void>((resolve, reject) => {\r\n image.onload = () => {\r\n _OnImageReadyAsync(image, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture)\r\n .then(() => resolve())\r\n .catch((reason) => {\r\n reject(reason);\r\n });\r\n };\r\n image.onerror = (error) => {\r\n reject(error);\r\n };\r\n });\r\n }\r\n promises.push(promise);\r\n }\r\n }\r\n\r\n // Fill remaining mipmaps with black textures.\r\n if (imageData.length < mipmapsCount) {\r\n let data: ArrayBufferView;\r\n const size = Math.pow(2, mipmapsCount - 1 - imageData.length);\r\n const dataLength = size * size * 4;\r\n switch (texture.type) {\r\n case Constants.TEXTURETYPE_UNSIGNED_INT: {\r\n data = new Uint8Array(dataLength);\r\n break;\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n data = new Uint16Array(dataLength);\r\n break;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n data = new Float32Array(dataLength);\r\n break;\r\n }\r\n }\r\n for (let i = imageData.length; i < mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n engine._uploadArrayBufferViewToTexture(texture, data!, face, i);\r\n }\r\n }\r\n }\r\n\r\n // Once all done, finishes the cleanup and return\r\n return Promise.all(promises).then(() => {\r\n // Release temp RTT.\r\n if (cubeRtt) {\r\n engine._releaseTexture(texture);\r\n cubeRtt._swapAndDie(texture);\r\n }\r\n // Release temp Post Process.\r\n if (rgbdPostProcess) {\r\n rgbdPostProcess.dispose();\r\n }\r\n // Flag internal texture as ready in case they are in use.\r\n if (generateNonLODTextures) {\r\n if (texture._lodTextureHigh && texture._lodTextureHigh._texture) {\r\n texture._lodTextureHigh._texture.isReady = true;\r\n }\r\n if (texture._lodTextureMid && texture._lodTextureMid._texture) {\r\n texture._lodTextureMid._texture.isReady = true;\r\n }\r\n if (texture._lodTextureLow && texture._lodTextureLow._texture) {\r\n texture._lodTextureLow._texture.isReady = true;\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Uploads spherical polynomials information to the texture.\r\n * @param texture defines the texture we are trying to upload the information to\r\n * @param info defines the environment texture info retrieved through the GetEnvInfo method\r\n */\r\nexport function UploadEnvSpherical(texture: InternalTexture, info: EnvironmentTextureInfo): void {\r\n info = normalizeEnvInfo(info);\r\n\r\n const irradianceInfo = info.irradiance as EnvironmentTextureIrradianceInfoV1;\r\n if (!irradianceInfo) {\r\n return;\r\n }\r\n\r\n const sp = new SphericalPolynomial();\r\n Vector3.FromArrayToRef(irradianceInfo.x, 0, sp.x);\r\n Vector3.FromArrayToRef(irradianceInfo.y, 0, sp.y);\r\n Vector3.FromArrayToRef(irradianceInfo.z, 0, sp.z);\r\n Vector3.FromArrayToRef(irradianceInfo.xx, 0, sp.xx);\r\n Vector3.FromArrayToRef(irradianceInfo.yy, 0, sp.yy);\r\n Vector3.FromArrayToRef(irradianceInfo.zz, 0, sp.zz);\r\n Vector3.FromArrayToRef(irradianceInfo.yz, 0, sp.yz);\r\n Vector3.FromArrayToRef(irradianceInfo.zx, 0, sp.zx);\r\n Vector3.FromArrayToRef(irradianceInfo.xy, 0, sp.xy);\r\n texture._sphericalPolynomial = sp;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function _UpdateRGBDAsync(\r\n internalTexture: InternalTexture,\r\n data: ArrayBufferView[][],\r\n sphericalPolynomial: Nullable<SphericalPolynomial>,\r\n lodScale: number,\r\n lodOffset: number\r\n): Promise<InternalTexture> {\r\n const proxy = internalTexture\r\n .getEngine()\r\n .createRawCubeTexture(\r\n null,\r\n internalTexture.width,\r\n internalTexture.format,\r\n internalTexture.type,\r\n internalTexture.generateMipMaps,\r\n internalTexture.invertY,\r\n internalTexture.samplingMode,\r\n internalTexture._compression\r\n );\r\n const proxyPromise = UploadLevelsAsync(proxy, data).then(() => internalTexture);\r\n internalTexture.onRebuildCallback = (_internalTexture) => {\r\n return {\r\n proxy: proxyPromise,\r\n isReady: true,\r\n isAsync: true,\r\n };\r\n };\r\n internalTexture._source = InternalTextureSource.CubeRawRGBD;\r\n internalTexture._bufferViewArrayArray = data;\r\n internalTexture._lodGenerationScale = lodScale;\r\n internalTexture._lodGenerationOffset = lodOffset;\r\n internalTexture._sphericalPolynomial = sphericalPolynomial;\r\n\r\n return UploadLevelsAsync(internalTexture, data).then(() => {\r\n internalTexture.isReady = true;\r\n return internalTexture;\r\n });\r\n}\r\n\r\n/**\r\n * Sets of helpers addressing the serialization and deserialization of environment texture\r\n * stored in a BabylonJS env file.\r\n * Those files are usually stored as .env files.\r\n */\r\nexport const EnvironmentTextureTools = {\r\n /**\r\n * Gets the environment info from an env file.\r\n * @param data The array buffer containing the .env bytes.\r\n * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.\r\n */\r\n GetEnvInfo,\r\n\r\n /**\r\n * Creates an environment texture from a loaded cube texture.\r\n * @param texture defines the cube texture to convert in env file\r\n * @param options options for the conversion process\r\n * @param options.imageType the mime type for the encoded images, with support for \"image/png\" (default) and \"image/webp\"\r\n * @param options.imageQuality the image quality of encoded WebP images.\r\n * @returns a promise containing the environment data if successful.\r\n */\r\n CreateEnvTextureAsync,\r\n\r\n /**\r\n * Creates the ArrayBufferViews used for initializing environment texture image data.\r\n * @param data the image data\r\n * @param info parameters that determine what views will be created for accessing the underlying buffer\r\n * @returns the views described by info providing access to the underlying buffer\r\n */\r\n CreateImageDataArrayBufferViews,\r\n\r\n /**\r\n * Uploads the texture info contained in the env file to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param data defines the data to load\r\n * @param info defines the texture info retrieved through the GetEnvInfo method\r\n * @returns a promise\r\n */\r\n UploadEnvLevelsAsync,\r\n\r\n /**\r\n * Uploads the levels of image data to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param imageData defines the array buffer views of image data [mipmap][face]\r\n * @param imageType the mime type of the image data\r\n * @returns a promise\r\n */\r\n UploadLevelsAsync,\r\n\r\n /**\r\n * Uploads spherical polynomials information to the texture.\r\n * @param texture defines the texture we are trying to upload the information to\r\n * @param info defines the environment texture info retrieved through the GetEnvInfo method\r\n */\r\n UploadEnvSpherical,\r\n};\r\n"]}
1
+ {"version":3,"file":"environmentTextureTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/environmentTextureTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../types\";\r\nimport { Tools } from \"./tools\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { ILog2 } from \"../Maths/math.scalar.functions\";\r\nimport { SphericalPolynomial } from \"../Maths/sphericalPolynomial\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Scene } from \"../scene\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Engine } from \"../Engines/engine\";\r\nimport { RGBDTextureTools } from \"./rgbdTextureTools\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\n\r\nimport \"../Engines/Extensions/engine.renderTargetCube\";\r\nimport \"../Engines/Extensions/engine.readTexture\";\r\nimport \"../Materials/Textures/baseTexture.polynomial\";\r\n\r\nimport { DumpDataAsync } from \"../Misc/dumpTools\";\r\nimport { ShaderLanguage } from \"core/Materials\";\r\n\r\nconst DefaultEnvironmentTextureImageType = \"image/png\";\r\nconst CurrentVersion = 2;\r\n\r\n/**\r\n * Raw texture data and descriptor sufficient for WebGL texture upload\r\n */\r\nexport type EnvironmentTextureInfo = EnvironmentTextureInfoV1 | EnvironmentTextureInfoV2;\r\n\r\n/**\r\n * v1 of EnvironmentTextureInfo\r\n */\r\ninterface EnvironmentTextureInfoV1 {\r\n /**\r\n * Version of the environment map\r\n */\r\n version: 1;\r\n\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n\r\n /**\r\n * Irradiance information stored in the file.\r\n */\r\n irradiance: any;\r\n\r\n /**\r\n * Specular information stored in the file.\r\n */\r\n specular: any;\r\n}\r\n\r\n/**\r\n * v2 of EnvironmentTextureInfo\r\n */\r\ninterface EnvironmentTextureInfoV2 {\r\n /**\r\n * Version of the environment map\r\n */\r\n version: 2;\r\n\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n\r\n /**\r\n * Irradiance information stored in the file.\r\n */\r\n irradiance: any;\r\n\r\n /**\r\n * Specular information stored in the file.\r\n */\r\n specular: any;\r\n\r\n /**\r\n * The mime type used to encode the image data.\r\n */\r\n imageType: string;\r\n}\r\n\r\n/**\r\n * Defines One Image in the file. It requires only the position in the file\r\n * as well as the length.\r\n */\r\ninterface BufferImageData {\r\n /**\r\n * Length of the image data.\r\n */\r\n length: number;\r\n /**\r\n * Position of the data from the null terminator delimiting the end of the JSON.\r\n */\r\n position: number;\r\n}\r\n\r\n/**\r\n * Defines the specular data enclosed in the file.\r\n * This corresponds to the version 1 of the data.\r\n */\r\nexport interface EnvironmentTextureSpecularInfoV1 {\r\n /**\r\n * Defines where the specular Payload is located. It is a runtime value only not stored in the file.\r\n */\r\n specularDataPosition?: number;\r\n /**\r\n * This contains all the images data needed to reconstruct the cubemap.\r\n */\r\n mipmaps: Array<BufferImageData>;\r\n /**\r\n * Defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness.\r\n */\r\n lodGenerationScale: number;\r\n}\r\n\r\n/**\r\n * Defines the required storage to save the environment irradiance information.\r\n */\r\ninterface EnvironmentTextureIrradianceInfoV1 {\r\n x: Array<number>;\r\n y: Array<number>;\r\n z: Array<number>;\r\n\r\n xx: Array<number>;\r\n yy: Array<number>;\r\n zz: Array<number>;\r\n\r\n yz: Array<number>;\r\n zx: Array<number>;\r\n xy: Array<number>;\r\n}\r\n\r\n/**\r\n * Options for creating environment textures\r\n */\r\nexport interface CreateEnvTextureOptions {\r\n /**\r\n * The mime type of encoded images.\r\n */\r\n imageType?: string;\r\n\r\n /**\r\n * the image quality of encoded WebP images.\r\n */\r\n imageQuality?: number;\r\n}\r\n\r\n/**\r\n * Magic number identifying the env file.\r\n */\r\nconst MagicBytes = [0x86, 0x16, 0x87, 0x96, 0xf6, 0xd6, 0x96, 0x36];\r\n\r\n/**\r\n * Gets the environment info from an env file.\r\n * @param data The array buffer containing the .env bytes.\r\n * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.\r\n */\r\nexport function GetEnvInfo(data: ArrayBufferView): Nullable<EnvironmentTextureInfoV2> {\r\n const dataView = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n let pos = 0;\r\n\r\n for (let i = 0; i < MagicBytes.length; i++) {\r\n if (dataView.getUint8(pos++) !== MagicBytes[i]) {\r\n Logger.Error(\"Not a babylon environment map\");\r\n return null;\r\n }\r\n }\r\n\r\n // Read json manifest - collect characters up to null terminator\r\n let manifestString = \"\";\r\n let charCode = 0x00;\r\n while ((charCode = dataView.getUint8(pos++))) {\r\n manifestString += String.fromCharCode(charCode);\r\n }\r\n\r\n let manifest: EnvironmentTextureInfo = JSON.parse(manifestString);\r\n manifest = normalizeEnvInfo(manifest);\r\n if (manifest.specular) {\r\n // Extend the header with the position of the payload.\r\n manifest.specular.specularDataPosition = pos;\r\n // Fallback to 0.8 exactly if lodGenerationScale is not defined for backward compatibility.\r\n manifest.specular.lodGenerationScale = manifest.specular.lodGenerationScale || 0.8;\r\n }\r\n\r\n return manifest;\r\n}\r\n\r\n/**\r\n * Normalizes any supported version of the environment file info to the latest version\r\n * @param info environment file info on any supported version\r\n * @returns environment file info in the latest supported version\r\n * @private\r\n */\r\nexport function normalizeEnvInfo(info: EnvironmentTextureInfo): EnvironmentTextureInfoV2 {\r\n if (info.version > CurrentVersion) {\r\n throw new Error(`Unsupported babylon environment map version \"${info.version}\". Latest supported version is \"${CurrentVersion}\".`);\r\n }\r\n\r\n if (info.version === 2) {\r\n return info;\r\n }\r\n\r\n // Migrate a v1 info to v2\r\n info = { ...info, version: 2, imageType: DefaultEnvironmentTextureImageType };\r\n\r\n return info;\r\n}\r\n\r\n/**\r\n * Creates an environment texture from a loaded cube texture.\r\n * @param texture defines the cube texture to convert in env file\r\n * @param options options for the conversion process\r\n * @param options.imageType the mime type for the encoded images, with support for \"image/png\" (default) and \"image/webp\"\r\n * @param options.imageQuality the image quality of encoded WebP images.\r\n * @returns a promise containing the environment data if successful.\r\n */\r\nexport async function CreateEnvTextureAsync(texture: BaseTexture, options: CreateEnvTextureOptions = {}): Promise<ArrayBuffer> {\r\n const internalTexture = texture.getInternalTexture();\r\n if (!internalTexture) {\r\n return Promise.reject(\"The cube texture is invalid.\");\r\n }\r\n\r\n const imageType = options.imageType ?? DefaultEnvironmentTextureImageType;\r\n\r\n const engine = internalTexture.getEngine() as Engine;\r\n\r\n if (\r\n texture.textureType !== Constants.TEXTURETYPE_HALF_FLOAT &&\r\n texture.textureType !== Constants.TEXTURETYPE_FLOAT &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_BYTE &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_INT &&\r\n texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_INTEGER &&\r\n texture.textureType !== -1\r\n ) {\r\n return Promise.reject(\"The cube texture should allow HDR (Full Float or Half Float).\");\r\n }\r\n\r\n let textureType = Constants.TEXTURETYPE_FLOAT;\r\n if (!engine.getCaps().textureFloatRender) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n if (!engine.getCaps().textureHalfFloatRender) {\r\n return Promise.reject(\"Env texture can only be created when the browser supports half float or full float rendering.\");\r\n }\r\n }\r\n\r\n // sphericalPolynomial is lazy loaded so simply accessing it should trigger the computation.\r\n texture.sphericalPolynomial;\r\n\r\n // Lets keep track of the polynomial promise so we can wait for it to be ready before generating the pixels.\r\n const sphericalPolynomialPromise = texture.getInternalTexture()?._sphericalPolynomialPromise;\r\n\r\n const cubeWidth = internalTexture.width;\r\n const hostingScene = new Scene(engine);\r\n const specularTextures: { [key: number]: ArrayBuffer } = {};\r\n\r\n // As we are going to readPixels the faces of the cube, make sure the drawing/update commands for the cube texture are fully sent to the GPU in case it is drawn for the first time in this very frame!\r\n engine.flushFramebuffer();\r\n\r\n // Read and collect all mipmaps data from the cube.\r\n const mipmapsCount = ILog2(internalTexture.width);\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n const faceWidth = Math.pow(2, mipmapsCount - i);\r\n\r\n // All faces of the cube.\r\n for (let face = 0; face < 6; face++) {\r\n let faceData = await texture.readPixels(face, i, undefined, false);\r\n if (faceData && faceData.byteLength === (faceData as Uint8Array).length) {\r\n const faceDataFloat = new Float32Array(faceData!.byteLength * 4);\r\n for (let i = 0; i < faceData.byteLength; i++) {\r\n faceDataFloat[i] = (faceData as Uint8Array)[i] / 255;\r\n // Gamma to linear\r\n faceDataFloat[i] = Math.pow(faceDataFloat[i], 2.2);\r\n }\r\n faceData = faceDataFloat;\r\n } else if (faceData && texture.gammaSpace) {\r\n const floatData = faceData as Float32Array;\r\n for (let i = 0; i < floatData.length; i++) {\r\n // Gamma to linear\r\n floatData[i] = Math.pow(floatData[i], 2.2);\r\n }\r\n }\r\n\r\n const tempTexture = engine.createRawTexture(\r\n faceData,\r\n faceWidth,\r\n faceWidth,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n false,\r\n true,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n null,\r\n textureType\r\n );\r\n\r\n await RGBDTextureTools.EncodeTextureToRGBD(tempTexture, hostingScene, textureType);\r\n\r\n const rgbdEncodedData = await engine._readTexturePixels(tempTexture, faceWidth, faceWidth);\r\n\r\n const imageEncodedData = await DumpDataAsync(faceWidth, faceWidth, rgbdEncodedData, imageType, undefined, false, true, options.imageQuality);\r\n\r\n specularTextures[i * 6 + face] = imageEncodedData as ArrayBuffer;\r\n\r\n tempTexture.dispose();\r\n }\r\n }\r\n\r\n // We can delete the hosting scene keeping track of all the creation objects\r\n hostingScene.dispose();\r\n\r\n // Ensure completion of the polynomial creation promise.\r\n if (sphericalPolynomialPromise) {\r\n await sphericalPolynomialPromise;\r\n }\r\n\r\n // Creates the json header for the env texture\r\n const info: EnvironmentTextureInfo = {\r\n version: CurrentVersion,\r\n width: cubeWidth,\r\n imageType,\r\n irradiance: _CreateEnvTextureIrradiance(texture),\r\n specular: {\r\n mipmaps: [],\r\n lodGenerationScale: texture.lodGenerationScale,\r\n },\r\n };\r\n\r\n // Sets the specular image data information\r\n let position = 0;\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n const byteLength = specularTextures[i * 6 + face].byteLength;\r\n info.specular.mipmaps.push({\r\n length: byteLength,\r\n position: position,\r\n });\r\n position += byteLength;\r\n }\r\n }\r\n\r\n // Encode the JSON as an array buffer\r\n const infoString = JSON.stringify(info);\r\n const infoBuffer = new ArrayBuffer(infoString.length + 1);\r\n const infoView = new Uint8Array(infoBuffer); // Limited to ascii subset matching unicode.\r\n for (let i = 0, strLen = infoString.length; i < strLen; i++) {\r\n infoView[i] = infoString.charCodeAt(i);\r\n }\r\n // Ends up with a null terminator for easier parsing\r\n infoView[infoString.length] = 0x00;\r\n\r\n // Computes the final required size and creates the storage\r\n const totalSize = MagicBytes.length + position + infoBuffer.byteLength;\r\n const finalBuffer = new ArrayBuffer(totalSize);\r\n const finalBufferView = new Uint8Array(finalBuffer);\r\n const dataView = new DataView(finalBuffer);\r\n\r\n // Copy the magic bytes identifying the file in\r\n let pos = 0;\r\n for (let i = 0; i < MagicBytes.length; i++) {\r\n dataView.setUint8(pos++, MagicBytes[i]);\r\n }\r\n\r\n // Add the json info\r\n finalBufferView.set(new Uint8Array(infoBuffer), pos);\r\n pos += infoBuffer.byteLength;\r\n\r\n // Finally inserts the texture data\r\n for (let i = 0; i <= mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n const dataBuffer = specularTextures[i * 6 + face];\r\n finalBufferView.set(new Uint8Array(dataBuffer), pos);\r\n pos += dataBuffer.byteLength;\r\n }\r\n }\r\n\r\n // Voila\r\n return finalBuffer;\r\n}\r\n\r\n/**\r\n * Creates a JSON representation of the spherical data.\r\n * @param texture defines the texture containing the polynomials\r\n * @returns the JSON representation of the spherical info\r\n */\r\nfunction _CreateEnvTextureIrradiance(texture: BaseTexture): Nullable<EnvironmentTextureIrradianceInfoV1> {\r\n const polynmials = texture.sphericalPolynomial;\r\n if (polynmials == null) {\r\n return null;\r\n }\r\n\r\n return {\r\n x: [polynmials.x.x, polynmials.x.y, polynmials.x.z],\r\n y: [polynmials.y.x, polynmials.y.y, polynmials.y.z],\r\n z: [polynmials.z.x, polynmials.z.y, polynmials.z.z],\r\n\r\n xx: [polynmials.xx.x, polynmials.xx.y, polynmials.xx.z],\r\n yy: [polynmials.yy.x, polynmials.yy.y, polynmials.yy.z],\r\n zz: [polynmials.zz.x, polynmials.zz.y, polynmials.zz.z],\r\n\r\n yz: [polynmials.yz.x, polynmials.yz.y, polynmials.yz.z],\r\n zx: [polynmials.zx.x, polynmials.zx.y, polynmials.zx.z],\r\n xy: [polynmials.xy.x, polynmials.xy.y, polynmials.xy.z],\r\n } as any;\r\n}\r\n\r\n/**\r\n * Creates the ArrayBufferViews used for initializing environment texture image data.\r\n * @param data the image data\r\n * @param info parameters that determine what views will be created for accessing the underlying buffer\r\n * @returns the views described by info providing access to the underlying buffer\r\n */\r\nexport function CreateImageDataArrayBufferViews(data: ArrayBufferView, info: EnvironmentTextureInfo): Array<Array<ArrayBufferView>> {\r\n info = normalizeEnvInfo(info);\r\n\r\n const specularInfo = info.specular as EnvironmentTextureSpecularInfoV1;\r\n\r\n // Double checks the enclosed info\r\n let mipmapsCount = Math.log2(info.width);\r\n mipmapsCount = Math.round(mipmapsCount) + 1;\r\n if (specularInfo.mipmaps.length !== 6 * mipmapsCount) {\r\n throw new Error(`Unsupported specular mipmaps number \"${specularInfo.mipmaps.length}\"`);\r\n }\r\n\r\n const imageData = new Array<Array<ArrayBufferView>>(mipmapsCount);\r\n for (let i = 0; i < mipmapsCount; i++) {\r\n imageData[i] = new Array<ArrayBufferView>(6);\r\n for (let face = 0; face < 6; face++) {\r\n const imageInfo = specularInfo.mipmaps[i * 6 + face];\r\n imageData[i][face] = new Uint8Array(data.buffer, data.byteOffset + specularInfo.specularDataPosition! + imageInfo.position, imageInfo.length);\r\n }\r\n }\r\n\r\n return imageData;\r\n}\r\n\r\n/**\r\n * Uploads the texture info contained in the env file to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param data defines the data to load\r\n * @param info defines the texture info retrieved through the GetEnvInfo method\r\n * @returns a promise\r\n */\r\nexport function UploadEnvLevelsAsync(texture: InternalTexture, data: ArrayBufferView, info: EnvironmentTextureInfo): Promise<void> {\r\n info = normalizeEnvInfo(info);\r\n\r\n const specularInfo = info.specular as EnvironmentTextureSpecularInfoV1;\r\n if (!specularInfo) {\r\n // Nothing else parsed so far\r\n return Promise.resolve();\r\n }\r\n\r\n texture._lodGenerationScale = specularInfo.lodGenerationScale;\r\n\r\n const imageData = CreateImageDataArrayBufferViews(data, info);\r\n\r\n return UploadLevelsAsync(texture, imageData, info.imageType);\r\n}\r\n\r\nfunction _OnImageReadyAsync(\r\n image: HTMLImageElement | ImageBitmap,\r\n engine: Engine,\r\n expandTexture: boolean,\r\n rgbdPostProcess: Nullable<PostProcess>,\r\n url: string,\r\n face: number,\r\n i: number,\r\n generateNonLODTextures: boolean,\r\n lodTextures: Nullable<{ [lod: number]: BaseTexture }>,\r\n cubeRtt: Nullable<RenderTargetWrapper>,\r\n texture: InternalTexture\r\n): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (expandTexture) {\r\n const tempTexture = engine.createTexture(\r\n null,\r\n true,\r\n true,\r\n null,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n null,\r\n (message) => {\r\n reject(message);\r\n },\r\n image\r\n );\r\n\r\n rgbdPostProcess?.onEffectCreatedObservable.addOnce((effect) => {\r\n effect.executeWhenCompiled(() => {\r\n // Uncompress the data to a RTT\r\n rgbdPostProcess!.externalTextureSamplerBinding = true;\r\n rgbdPostProcess!.onApply = (effect) => {\r\n effect._bindTexture(\"textureSampler\", tempTexture);\r\n effect.setFloat2(\"scale\", 1, engine._features.needsInvertingBitmap && image instanceof ImageBitmap ? -1 : 1);\r\n };\r\n\r\n if (!engine.scenes.length) {\r\n return;\r\n }\r\n\r\n engine.scenes[0].postProcessManager.directRender([rgbdPostProcess!], cubeRtt, true, face, i);\r\n\r\n // Cleanup\r\n engine.restoreDefaultFramebuffer();\r\n tempTexture.dispose();\r\n URL.revokeObjectURL(url);\r\n resolve();\r\n });\r\n });\r\n } else {\r\n engine._uploadImageToTexture(texture, image, face, i);\r\n\r\n // Upload the face to the non lod texture support\r\n if (generateNonLODTextures) {\r\n const lodTexture = lodTextures![i];\r\n if (lodTexture) {\r\n engine._uploadImageToTexture(lodTexture._texture!, image, face, 0);\r\n }\r\n }\r\n resolve();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Uploads the levels of image data to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param imageData defines the array buffer views of image data [mipmap][face]\r\n * @param imageType the mime type of the image data\r\n * @returns a promise\r\n */\r\nexport async function UploadLevelsAsync(texture: InternalTexture, imageData: ArrayBufferView[][], imageType: string = DefaultEnvironmentTextureImageType): Promise<void> {\r\n if (!Tools.IsExponentOfTwo(texture.width)) {\r\n throw new Error(\"Texture size must be a power of two\");\r\n }\r\n\r\n const mipmapsCount = ILog2(texture.width) + 1;\r\n\r\n // Gets everything ready.\r\n const engine = texture.getEngine() as Engine;\r\n let expandTexture = false;\r\n let generateNonLODTextures = false;\r\n let rgbdPostProcess: Nullable<PostProcess> = null;\r\n let cubeRtt: Nullable<RenderTargetWrapper> = null;\r\n let lodTextures: Nullable<{ [lod: number]: BaseTexture }> = null;\r\n const caps = engine.getCaps();\r\n\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n texture.generateMipMaps = true;\r\n texture._cachedAnisotropicFilteringLevel = null;\r\n engine.updateTextureSamplingMode(Constants.TEXTURE_TRILINEAR_SAMPLINGMODE, texture);\r\n\r\n // Add extra process if texture lod is not supported\r\n if (!caps.textureLOD) {\r\n expandTexture = false;\r\n generateNonLODTextures = true;\r\n lodTextures = {};\r\n }\r\n // in webgl 1 there are no ways to either render or copy lod level information for float textures.\r\n else if (!engine._features.supportRenderAndCopyToLodForFloatTextures) {\r\n expandTexture = false;\r\n }\r\n // If half float available we can uncompress the texture\r\n else if (caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering) {\r\n expandTexture = true;\r\n texture.type = Constants.TEXTURETYPE_HALF_FLOAT;\r\n }\r\n // If full float available we can uncompress the texture\r\n else if (caps.textureFloatRender && caps.textureFloatLinearFiltering) {\r\n expandTexture = true;\r\n texture.type = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n // Expand the texture if possible\r\n let shaderLanguage = ShaderLanguage.GLSL;\r\n if (expandTexture) {\r\n if (engine.isWebGPU) {\r\n shaderLanguage = ShaderLanguage.WGSL;\r\n await import(\"../ShadersWGSL/rgbdDecode.fragment\");\r\n } else {\r\n await import(\"../Shaders/rgbdDecode.fragment\");\r\n }\r\n\r\n // Simply run through the decode PP\r\n rgbdPostProcess = new PostProcess(\r\n \"rgbdDecode\",\r\n \"rgbdDecode\",\r\n null,\r\n null,\r\n 1,\r\n null,\r\n Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n undefined,\r\n texture.type,\r\n undefined,\r\n null,\r\n false,\r\n undefined,\r\n shaderLanguage\r\n );\r\n\r\n texture._isRGBD = false;\r\n texture.invertY = false;\r\n cubeRtt = engine.createRenderTargetCubeTexture(texture.width, {\r\n generateDepthBuffer: false,\r\n generateMipMaps: true,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n type: texture.type,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n });\r\n } else {\r\n texture._isRGBD = true;\r\n texture.invertY = true;\r\n\r\n // In case of missing support, applies the same patch than DDS files.\r\n if (generateNonLODTextures) {\r\n const mipSlices = 3;\r\n const scale = texture._lodGenerationScale;\r\n const offset = texture._lodGenerationOffset;\r\n\r\n for (let i = 0; i < mipSlices; i++) {\r\n //compute LOD from even spacing in smoothness (matching shader calculation)\r\n const smoothness = i / (mipSlices - 1);\r\n const roughness = 1 - smoothness;\r\n\r\n const minLODIndex = offset; // roughness = 0\r\n const maxLODIndex = (mipmapsCount - 1) * scale + offset; // roughness = 1 (mipmaps start from 0)\r\n\r\n const lodIndex = minLODIndex + (maxLODIndex - minLODIndex) * roughness;\r\n const mipmapIndex = Math.round(Math.min(Math.max(lodIndex, 0), maxLODIndex));\r\n\r\n const glTextureFromLod = new InternalTexture(engine, InternalTextureSource.Temp);\r\n glTextureFromLod.isCube = true;\r\n glTextureFromLod.invertY = true;\r\n glTextureFromLod.generateMipMaps = false;\r\n engine.updateTextureSamplingMode(Constants.TEXTURE_LINEAR_LINEAR, glTextureFromLod);\r\n\r\n // Wrap in a base texture for easy binding.\r\n const lodTexture = new BaseTexture(null);\r\n lodTexture._isCube = true;\r\n lodTexture._texture = glTextureFromLod;\r\n lodTextures![mipmapIndex] = lodTexture;\r\n\r\n switch (i) {\r\n case 0:\r\n texture._lodTextureLow = lodTexture;\r\n break;\r\n case 1:\r\n texture._lodTextureMid = lodTexture;\r\n break;\r\n case 2:\r\n texture._lodTextureHigh = lodTexture;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const promises: Promise<void>[] = [];\r\n // All mipmaps up to provided number of images\r\n for (let i = 0; i < imageData.length; i++) {\r\n // All faces\r\n for (let face = 0; face < 6; face++) {\r\n // Constructs an image element from image data\r\n const bytes = imageData[i][face];\r\n const blob = new Blob([bytes], { type: imageType });\r\n const url = URL.createObjectURL(blob);\r\n let promise: Promise<void>;\r\n\r\n if (engine._features.forceBitmapOverHTMLImageElement) {\r\n promise = engine.createImageBitmap(blob, { premultiplyAlpha: \"none\" }).then((img) => {\r\n return _OnImageReadyAsync(img, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.src = url;\r\n\r\n // Enqueue promise to upload to the texture.\r\n promise = new Promise<void>((resolve, reject) => {\r\n image.onload = () => {\r\n _OnImageReadyAsync(image, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture)\r\n .then(() => resolve())\r\n .catch((reason) => {\r\n reject(reason);\r\n });\r\n };\r\n image.onerror = (error) => {\r\n reject(error);\r\n };\r\n });\r\n }\r\n promises.push(promise);\r\n }\r\n }\r\n\r\n // Fill remaining mipmaps with black textures.\r\n if (imageData.length < mipmapsCount) {\r\n let data: ArrayBufferView;\r\n const size = Math.pow(2, mipmapsCount - 1 - imageData.length);\r\n const dataLength = size * size * 4;\r\n switch (texture.type) {\r\n case Constants.TEXTURETYPE_UNSIGNED_INT: {\r\n data = new Uint8Array(dataLength);\r\n break;\r\n }\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n data = new Uint16Array(dataLength);\r\n break;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n data = new Float32Array(dataLength);\r\n break;\r\n }\r\n }\r\n for (let i = imageData.length; i < mipmapsCount; i++) {\r\n for (let face = 0; face < 6; face++) {\r\n engine._uploadArrayBufferViewToTexture(texture, data!, face, i);\r\n }\r\n }\r\n }\r\n\r\n // Once all done, finishes the cleanup and return\r\n return Promise.all(promises).then(() => {\r\n // Release temp RTT.\r\n if (cubeRtt) {\r\n engine._releaseTexture(texture);\r\n cubeRtt._swapAndDie(texture);\r\n }\r\n // Release temp Post Process.\r\n if (rgbdPostProcess) {\r\n rgbdPostProcess.dispose();\r\n }\r\n // Flag internal texture as ready in case they are in use.\r\n if (generateNonLODTextures) {\r\n if (texture._lodTextureHigh && texture._lodTextureHigh._texture) {\r\n texture._lodTextureHigh._texture.isReady = true;\r\n }\r\n if (texture._lodTextureMid && texture._lodTextureMid._texture) {\r\n texture._lodTextureMid._texture.isReady = true;\r\n }\r\n if (texture._lodTextureLow && texture._lodTextureLow._texture) {\r\n texture._lodTextureLow._texture.isReady = true;\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Uploads spherical polynomials information to the texture.\r\n * @param texture defines the texture we are trying to upload the information to\r\n * @param info defines the environment texture info retrieved through the GetEnvInfo method\r\n */\r\nexport function UploadEnvSpherical(texture: InternalTexture, info: EnvironmentTextureInfo): void {\r\n info = normalizeEnvInfo(info);\r\n\r\n const irradianceInfo = info.irradiance as EnvironmentTextureIrradianceInfoV1;\r\n if (!irradianceInfo) {\r\n return;\r\n }\r\n\r\n const sp = new SphericalPolynomial();\r\n Vector3.FromArrayToRef(irradianceInfo.x, 0, sp.x);\r\n Vector3.FromArrayToRef(irradianceInfo.y, 0, sp.y);\r\n Vector3.FromArrayToRef(irradianceInfo.z, 0, sp.z);\r\n Vector3.FromArrayToRef(irradianceInfo.xx, 0, sp.xx);\r\n Vector3.FromArrayToRef(irradianceInfo.yy, 0, sp.yy);\r\n Vector3.FromArrayToRef(irradianceInfo.zz, 0, sp.zz);\r\n Vector3.FromArrayToRef(irradianceInfo.yz, 0, sp.yz);\r\n Vector3.FromArrayToRef(irradianceInfo.zx, 0, sp.zx);\r\n Vector3.FromArrayToRef(irradianceInfo.xy, 0, sp.xy);\r\n texture._sphericalPolynomial = sp;\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport function _UpdateRGBDAsync(\r\n internalTexture: InternalTexture,\r\n data: ArrayBufferView[][],\r\n sphericalPolynomial: Nullable<SphericalPolynomial>,\r\n lodScale: number,\r\n lodOffset: number\r\n): Promise<InternalTexture> {\r\n const proxy = internalTexture\r\n .getEngine()\r\n .createRawCubeTexture(\r\n null,\r\n internalTexture.width,\r\n internalTexture.format,\r\n internalTexture.type,\r\n internalTexture.generateMipMaps,\r\n internalTexture.invertY,\r\n internalTexture.samplingMode,\r\n internalTexture._compression\r\n );\r\n const proxyPromise = UploadLevelsAsync(proxy, data).then(() => internalTexture);\r\n internalTexture.onRebuildCallback = (_internalTexture) => {\r\n return {\r\n proxy: proxyPromise,\r\n isReady: true,\r\n isAsync: true,\r\n };\r\n };\r\n internalTexture._source = InternalTextureSource.CubeRawRGBD;\r\n internalTexture._bufferViewArrayArray = data;\r\n internalTexture._lodGenerationScale = lodScale;\r\n internalTexture._lodGenerationOffset = lodOffset;\r\n internalTexture._sphericalPolynomial = sphericalPolynomial;\r\n\r\n return UploadLevelsAsync(internalTexture, data).then(() => {\r\n internalTexture.isReady = true;\r\n return internalTexture;\r\n });\r\n}\r\n\r\n/**\r\n * Sets of helpers addressing the serialization and deserialization of environment texture\r\n * stored in a BabylonJS env file.\r\n * Those files are usually stored as .env files.\r\n */\r\nexport const EnvironmentTextureTools = {\r\n /**\r\n * Gets the environment info from an env file.\r\n * @param data The array buffer containing the .env bytes.\r\n * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.\r\n */\r\n GetEnvInfo,\r\n\r\n /**\r\n * Creates an environment texture from a loaded cube texture.\r\n * @param texture defines the cube texture to convert in env file\r\n * @param options options for the conversion process\r\n * @param options.imageType the mime type for the encoded images, with support for \"image/png\" (default) and \"image/webp\"\r\n * @param options.imageQuality the image quality of encoded WebP images.\r\n * @returns a promise containing the environment data if successful.\r\n */\r\n CreateEnvTextureAsync,\r\n\r\n /**\r\n * Creates the ArrayBufferViews used for initializing environment texture image data.\r\n * @param data the image data\r\n * @param info parameters that determine what views will be created for accessing the underlying buffer\r\n * @returns the views described by info providing access to the underlying buffer\r\n */\r\n CreateImageDataArrayBufferViews,\r\n\r\n /**\r\n * Uploads the texture info contained in the env file to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param data defines the data to load\r\n * @param info defines the texture info retrieved through the GetEnvInfo method\r\n * @returns a promise\r\n */\r\n UploadEnvLevelsAsync,\r\n\r\n /**\r\n * Uploads the levels of image data to the GPU.\r\n * @param texture defines the internal texture to upload to\r\n * @param imageData defines the array buffer views of image data [mipmap][face]\r\n * @param imageType the mime type of the image data\r\n * @returns a promise\r\n */\r\n UploadLevelsAsync,\r\n\r\n /**\r\n * Uploads spherical polynomials information to the texture.\r\n * @param texture defines the texture we are trying to upload the information to\r\n * @param info defines the environment texture info retrieved through the GetEnvInfo method\r\n */\r\n UploadEnvSpherical,\r\n};\r\n"]}
package/Misc/reflector.js CHANGED
@@ -18,13 +18,13 @@ export class Reflector {
18
18
  this._webSocket.onmessage = (event) => {
19
19
  const message = event.data;
20
20
  if (message.startsWith(Reflector._SERVER_PREFIX)) {
21
- const serverMessage = message.substr(Reflector._SERVER_PREFIX.length);
22
- Logger.Log(`[Reflector] Received server message: ${serverMessage.substr(0, 64)}`);
21
+ const serverMessage = message.substring(Reflector._SERVER_PREFIX.length);
22
+ Logger.Log(`[Reflector] Received server message: ${serverMessage.substring(0, 64)}`);
23
23
  this._handleServerMessage(serverMessage);
24
24
  return;
25
25
  }
26
26
  else {
27
- Logger.Log(`[Reflector] Received client message: ${message.substr(0, 64)}`);
27
+ Logger.Log(`[Reflector] Received client message: ${message.substring(0, 64)}`);
28
28
  this._handleClientMessage();
29
29
  }
30
30
  };
@@ -1 +1 @@
1
- {"version":3,"file":"reflector.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/reflector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,SAAS;IAMlB;;;;;OAKG;IACH,YAAmB,KAAY,EAAE,QAAgB,EAAE,IAAY;QAC3D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,MAAM,CAAC,GAAG,CAAC,kCAAkC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,QAAQ,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAClC,MAAM,OAAO,GAAW,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;gBAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACtE,MAAM,CAAC,GAAG,CAAC,wCAAwC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAClF,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;gBACzC,OAAO;aACV;iBAAM;gBACH,MAAM,CAAC,GAAG,CAAC,wCAAwC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5E,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC/B;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,oBAAoB,CAAC,OAAe;QACxC,QAAQ,OAAO,EAAE;YACb,KAAK,WAAW,CAAC,CAAC;gBACd,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,MAAM;aACT;SACJ;IACL,CAAC;IAEO,oBAAoB;QACxB,aAAa;IACjB,CAAC;;AAvDuB,wBAAc,GAAG,IAAI,CAAC","sourcesContent":["import type { Scene } from \"../scene\";\r\nimport { Logger } from \"./logger\";\r\nimport { SceneSerializer } from \"./sceneSerializer\";\r\n\r\n/**\r\n * Class used to connect with the reflector zone of the sandbox via the reflector bridge\r\n * @since 5.0.0\r\n */\r\nexport class Reflector {\r\n private static readonly _SERVER_PREFIX = \"$$\";\r\n\r\n private _scene: Scene;\r\n private _webSocket: WebSocket;\r\n\r\n /**\r\n * Constructs a reflector object.\r\n * @param scene The scene to use\r\n * @param hostname The hostname of the reflector bridge\r\n * @param port The port of the reflector bridge\r\n */\r\n public constructor(scene: Scene, hostname: string, port: number) {\r\n this._scene = scene;\r\n\r\n Logger.Log(`[Reflector] Connecting to ws://${hostname}:${port}`);\r\n this._webSocket = new WebSocket(`ws://${hostname}:${port}`);\r\n\r\n this._webSocket.onmessage = (event) => {\r\n const message: string = event.data;\r\n if (message.startsWith(Reflector._SERVER_PREFIX)) {\r\n const serverMessage = message.substr(Reflector._SERVER_PREFIX.length);\r\n Logger.Log(`[Reflector] Received server message: ${serverMessage.substr(0, 64)}`);\r\n this._handleServerMessage(serverMessage);\r\n return;\r\n } else {\r\n Logger.Log(`[Reflector] Received client message: ${message.substr(0, 64)}`);\r\n this._handleClientMessage();\r\n }\r\n };\r\n\r\n this._webSocket.onclose = (event) => {\r\n Logger.Log(`[Reflector] Disconnected ${event.code} ${event.reason}`);\r\n };\r\n }\r\n\r\n /**\r\n * Closes the reflector connection\r\n */\r\n public close(): void {\r\n this._webSocket.close();\r\n }\r\n\r\n private _handleServerMessage(message: string): void {\r\n switch (message) {\r\n case \"connected\": {\r\n SceneSerializer.SerializeAsync(this._scene).then((serialized) => {\r\n this._webSocket.send(`load|${JSON.stringify(serialized)}`);\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _handleClientMessage(): void {\r\n // do nothing\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"reflector.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/reflector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,SAAS;IAMlB;;;;;OAKG;IACH,YAAmB,KAAY,EAAE,QAAgB,EAAE,IAAY;QAC3D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QAEpB,MAAM,CAAC,GAAG,CAAC,kCAAkC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,QAAQ,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;YAClC,MAAM,OAAO,GAAW,KAAK,CAAC,IAAI,CAAC;YACnC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE;gBAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACzE,MAAM,CAAC,GAAG,CAAC,wCAAwC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrF,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;gBACzC,OAAO;aACV;iBAAM;gBACH,MAAM,CAAC,GAAG,CAAC,wCAAwC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC/E,IAAI,CAAC,oBAAoB,EAAE,CAAC;aAC/B;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,oBAAoB,CAAC,OAAe;QACxC,QAAQ,OAAO,EAAE;YACb,KAAK,WAAW,CAAC,CAAC;gBACd,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBAC/D,CAAC,CAAC,CAAC;gBACH,MAAM;aACT;SACJ;IACL,CAAC;IAEO,oBAAoB;QACxB,aAAa;IACjB,CAAC;;AAvDuB,wBAAc,GAAG,IAAI,CAAC","sourcesContent":["import type { Scene } from \"../scene\";\r\nimport { Logger } from \"./logger\";\r\nimport { SceneSerializer } from \"./sceneSerializer\";\r\n\r\n/**\r\n * Class used to connect with the reflector zone of the sandbox via the reflector bridge\r\n * @since 5.0.0\r\n */\r\nexport class Reflector {\r\n private static readonly _SERVER_PREFIX = \"$$\";\r\n\r\n private _scene: Scene;\r\n private _webSocket: WebSocket;\r\n\r\n /**\r\n * Constructs a reflector object.\r\n * @param scene The scene to use\r\n * @param hostname The hostname of the reflector bridge\r\n * @param port The port of the reflector bridge\r\n */\r\n public constructor(scene: Scene, hostname: string, port: number) {\r\n this._scene = scene;\r\n\r\n Logger.Log(`[Reflector] Connecting to ws://${hostname}:${port}`);\r\n this._webSocket = new WebSocket(`ws://${hostname}:${port}`);\r\n\r\n this._webSocket.onmessage = (event) => {\r\n const message: string = event.data;\r\n if (message.startsWith(Reflector._SERVER_PREFIX)) {\r\n const serverMessage = message.substring(Reflector._SERVER_PREFIX.length);\r\n Logger.Log(`[Reflector] Received server message: ${serverMessage.substring(0, 64)}`);\r\n this._handleServerMessage(serverMessage);\r\n return;\r\n } else {\r\n Logger.Log(`[Reflector] Received client message: ${message.substring(0, 64)}`);\r\n this._handleClientMessage();\r\n }\r\n };\r\n\r\n this._webSocket.onclose = (event) => {\r\n Logger.Log(`[Reflector] Disconnected ${event.code} ${event.reason}`);\r\n };\r\n }\r\n\r\n /**\r\n * Closes the reflector connection\r\n */\r\n public close(): void {\r\n this._webSocket.close();\r\n }\r\n\r\n private _handleServerMessage(message: string): void {\r\n switch (message) {\r\n case \"connected\": {\r\n SceneSerializer.SerializeAsync(this._scene).then((serialized) => {\r\n this._webSocket.send(`load|${JSON.stringify(serialized)}`);\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _handleClientMessage(): void {\r\n // do nothing\r\n }\r\n}\r\n"]}
@@ -97,10 +97,11 @@ export declare function CreateScreenshotUsingRenderTarget(engine: AbstractEngine
97
97
  * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
98
98
  * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
99
99
  * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
100
+ * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
100
101
  * @returns screenshot as a string of base64-encoded characters. This string can be assigned
101
102
  * to the src parameter of an <img> to display it
102
103
  */
103
- export declare function CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number): Promise<string>;
104
+ export declare function CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void): Promise<string>;
104
105
  /**
105
106
  * Class containing a set of static utilities functions for screenshots
106
107
  */
@@ -249,10 +249,11 @@ export function CreateScreenshotUsingRenderTarget(engine, camera, size, successC
249
249
  * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
250
250
  * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
251
251
  * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
252
+ * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
252
253
  * @returns screenshot as a string of base64-encoded characters. This string can be assigned
253
254
  * to the src parameter of an <img> to display it
254
255
  */
255
- export function CreateScreenshotUsingRenderTargetAsync(engine, camera, size, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality) {
256
+ export function CreateScreenshotUsingRenderTargetAsync(engine, camera, size, mimeType = "image/png", samples = 1, antialiasing = false, fileName, renderSprites = false, enableStencilBuffer = false, useLayerMask = true, quality, customizeTexture) {
256
257
  return new Promise((resolve, reject) => {
257
258
  CreateScreenshotUsingRenderTarget(engine, camera, size, (data) => {
258
259
  if (typeof data !== "undefined") {
@@ -261,7 +262,7 @@ export function CreateScreenshotUsingRenderTargetAsync(engine, camera, size, mim
261
262
  else {
262
263
  reject(new Error("Data is undefined"));
263
264
  }
264
- }, mimeType, samples, antialiasing, fileName, renderSprites, enableStencilBuffer, useLayerMask, quality);
265
+ }, mimeType, samples, antialiasing, fileName, renderSprites, enableStencilBuffer, useLayerMask, quality, customizeTexture);
265
266
  });
266
267
  }
267
268
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"screenshotTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/screenshotTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { FxaaPostProcess } from \"../PostProcesses/fxaaPostProcess\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"./logger\";\r\nimport { Tools } from \"./tools\";\r\nimport type { IScreenshotSize } from \"./interfaces/screenshotSize\";\r\nimport { DumpData } from \"./dumpTools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { ApplyPostProcess } from \"./textureTools\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.readTexture\";\r\n\r\nlet screenshotCanvas: Nullable<HTMLCanvasElement> = null;\r\n\r\n/**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\nexport function CreateScreenshot(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n forceDownload = false,\r\n quality?: number\r\n): void {\r\n const { height, width } = _GetScreenshotSize(engine, camera, size);\r\n\r\n if (!(height && width)) {\r\n Logger.Error(\"Invalid 'size' parameter !\");\r\n return;\r\n }\r\n\r\n if (!screenshotCanvas) {\r\n screenshotCanvas = document.createElement(\"canvas\");\r\n }\r\n\r\n screenshotCanvas.width = width;\r\n screenshotCanvas.height = height;\r\n\r\n const renderContext = screenshotCanvas.getContext(\"2d\");\r\n\r\n const ratio = engine.getRenderWidth() / engine.getRenderHeight();\r\n let newWidth = width;\r\n let newHeight = newWidth / ratio;\r\n if (newHeight > height) {\r\n newHeight = height;\r\n newWidth = newHeight * ratio;\r\n }\r\n\r\n const offsetX = Math.max(0, width - newWidth) / 2;\r\n const offsetY = Math.max(0, height - newHeight) / 2;\r\n\r\n const scene = camera.getScene();\r\n if (scene.activeCamera !== camera) {\r\n CreateScreenshotUsingRenderTarget(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (forceDownload) {\r\n const blob = new Blob([data]);\r\n Tools.DownloadBlob(blob);\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n } else if (successCallback) {\r\n successCallback(data);\r\n }\r\n },\r\n mimeType,\r\n 1.0,\r\n engine.getCreationOptions().antialias,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n quality\r\n );\r\n } else {\r\n engine.onEndFrameObservable.addOnce(() => {\r\n const renderingCanvas = engine.getRenderingCanvas();\r\n if (renderContext && renderingCanvas) {\r\n renderContext.drawImage(renderingCanvas, offsetX, offsetY, newWidth, newHeight);\r\n }\r\n\r\n if (screenshotCanvas) {\r\n if (forceDownload) {\r\n Tools.EncodeScreenshotCanvasData(screenshotCanvas, undefined, mimeType, undefined, quality);\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(screenshotCanvas, successCallback, mimeType, undefined, quality);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType = \"image/png\", quality?: number): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n CreateScreenshot(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (typeof data !== \"undefined\") {\r\n resolve(data);\r\n } else {\r\n reject(new Error(\"Data is undefined\"));\r\n }\r\n },\r\n mimeType,\r\n undefined,\r\n quality\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Captures a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param width defines the expected width\r\n * @param height defines the expected height\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotWithResizeAsync(engine: AbstractEngine, camera: Camera, width: number, height: number, mimeType = \"image/png\", quality?: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n CreateScreenshot(\r\n engine,\r\n camera,\r\n { width: width, height: height },\r\n () => {\r\n resolve();\r\n },\r\n mimeType,\r\n true,\r\n quality\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height, finalWidth, finalHeight. If a single number is passed,\r\n * it will be used for both width and height, as well as finalWidth, finalHeight. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.\r\n */\r\nexport function CreateScreenshotUsingRenderTarget(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number,\r\n customizeTexture?: (texture: RenderTargetTexture) => void\r\n): void {\r\n const { height, width, finalWidth, finalHeight } = _GetScreenshotSize(engine, camera, size);\r\n const targetTextureSize = { width, height };\r\n\r\n if (!(height && width)) {\r\n Logger.Error(\"Invalid 'size' parameter !\");\r\n return;\r\n }\r\n\r\n const originalSize = { width: engine.getRenderWidth(), height: engine.getRenderHeight() };\r\n engine.setSize(width, height); // we need this call to trigger onResizeObservable with the screenshot width/height on all the subsystems that are observing this event and that needs to (re)create some resources with the right dimensions\r\n\r\n const scene = camera.getScene();\r\n\r\n // At this point size can be a number, or an object (according to engine.prototype.createRenderTargetTexture method)\r\n const texture = new RenderTargetTexture(\r\n \"screenShot\",\r\n targetTextureSize,\r\n scene,\r\n false,\r\n false,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n undefined,\r\n enableStencilBuffer,\r\n undefined,\r\n undefined,\r\n undefined,\r\n samples\r\n );\r\n texture.renderList = scene.meshes.slice();\r\n texture.samples = samples;\r\n texture.renderSprites = renderSprites;\r\n texture.activeCamera = camera;\r\n texture.forceLayerMaskCheck = useLayerMask;\r\n customizeTexture?.(texture);\r\n\r\n const renderWhenReady = () => {\r\n if (texture.isReadyForRendering() && camera.isReady(true)) {\r\n engine.onEndFrameObservable.addOnce(() => {\r\n if (finalWidth === width && finalHeight === height) {\r\n texture.readPixels(undefined, undefined, undefined, false)!.then((data) => {\r\n DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n texture.dispose();\r\n });\r\n } else {\r\n ApplyPostProcess(\"pass\", texture.getInternalTexture()!, scene, undefined, undefined, undefined, finalWidth, finalHeight).then((texture) => {\r\n engine._readTexturePixels(texture, finalWidth, finalHeight, -1, 0, null, true, false, 0, 0).then((data) => {\r\n DumpData(finalWidth, finalHeight, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n texture.dispose();\r\n });\r\n });\r\n }\r\n });\r\n\r\n // re-render the scene after the camera has been reset to the original camera to avoid a flicker that could occur\r\n // if the camera used for the RTT rendering stays in effect for the next frame (and if that camera was different from the original camera)\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n texture.render(true);\r\n engine.setSize(originalSize.width, originalSize.height);\r\n camera.getProjectionMatrix(true); // Force cache refresh;\r\n scene.render();\r\n } else {\r\n setTimeout(renderWhenReady, 16);\r\n }\r\n };\r\n\r\n const renderToTexture = () => {\r\n // render the RTT\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n\r\n renderWhenReady();\r\n };\r\n\r\n if (antialiasing) {\r\n const fxaaPostProcess = new FxaaPostProcess(\"antialiasing\", 1.0, scene.activeCamera);\r\n texture.addPostProcess(fxaaPostProcess);\r\n // Async Shader Compilation can lead to none ready effects in synchronous code\r\n fxaaPostProcess.onEffectCreatedObservable.addOnce((e) => {\r\n if (!e.isReady()) {\r\n e.onCompiled = () => {\r\n renderToTexture();\r\n };\r\n }\r\n // The effect is ready we can render\r\n else {\r\n renderToTexture();\r\n }\r\n });\r\n } else {\r\n // No need to wait for extra resources to be ready\r\n renderToTexture();\r\n }\r\n}\r\n\r\n/**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotUsingRenderTargetAsync(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number\r\n): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n CreateScreenshotUsingRenderTarget(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (typeof data !== \"undefined\") {\r\n resolve(data);\r\n } else {\r\n reject(new Error(\"Data is undefined\"));\r\n }\r\n },\r\n mimeType,\r\n samples,\r\n antialiasing,\r\n fileName,\r\n renderSprites,\r\n enableStencilBuffer,\r\n useLayerMask,\r\n quality\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Gets height and width for screenshot size\r\n * @param engine\r\n * @param camera\r\n * @param size\r\n * @private\r\n */\r\nfunction _GetScreenshotSize(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number): { height: number; width: number; finalWidth: number; finalHeight: number } {\r\n let height = 0;\r\n let width = 0;\r\n let finalWidth = 0;\r\n let finalHeight = 0;\r\n\r\n //If a size value defined as object\r\n if (typeof size === \"object\") {\r\n const precision = size.precision\r\n ? Math.abs(size.precision) // prevent GL_INVALID_VALUE : glViewport: negative width/height\r\n : 1;\r\n\r\n //If a width and height values is specified\r\n if (size.width && size.height) {\r\n height = size.height * precision;\r\n width = size.width * precision;\r\n }\r\n //If passing only width, computing height to keep display canvas ratio.\r\n else if (size.width && !size.height) {\r\n width = size.width * precision;\r\n height = Math.round(width / engine.getAspectRatio(camera));\r\n }\r\n //If passing only height, computing width to keep display canvas ratio.\r\n else if (size.height && !size.width) {\r\n height = size.height * precision;\r\n width = Math.round(height * engine.getAspectRatio(camera));\r\n } else {\r\n width = Math.round(engine.getRenderWidth() * precision);\r\n height = Math.round(width / engine.getAspectRatio(camera));\r\n }\r\n\r\n //If a finalWidth and finalHeight values is specified\r\n if (size.finalWidth && size.finalHeight) {\r\n finalHeight = size.finalHeight;\r\n finalWidth = size.finalWidth;\r\n }\r\n //If passing only finalWidth, computing finalHeight to keep display canvas ratio.\r\n else if (size.finalWidth && !size.finalHeight) {\r\n finalWidth = size.finalWidth;\r\n finalHeight = Math.round(finalWidth / engine.getAspectRatio(camera));\r\n }\r\n //If passing only finalHeight, computing finalWidth to keep display canvas ratio.\r\n else if (size.finalHeight && !size.finalWidth) {\r\n finalHeight = size.finalHeight;\r\n finalWidth = Math.round(finalHeight * engine.getAspectRatio(camera));\r\n } else {\r\n finalWidth = width;\r\n finalHeight = height;\r\n }\r\n }\r\n //Assuming here that \"size\" parameter is a number\r\n else if (!isNaN(size)) {\r\n height = size;\r\n width = size;\r\n finalWidth = size;\r\n finalHeight = size;\r\n }\r\n\r\n // When creating the image data from the CanvasRenderingContext2D, the width and height is clamped to the size of the _gl context\r\n // On certain GPUs, it seems as if the _gl context truncates to an integer automatically. Therefore, if a user tries to pass the width of their canvas element\r\n // and it happens to be a float (1000.5 x 600.5 px), the engine.readPixels will return a different size array than context.createImageData\r\n // to resolve this, we truncate the floats here to ensure the same size\r\n if (width) {\r\n width = Math.floor(width);\r\n }\r\n if (height) {\r\n height = Math.floor(height);\r\n }\r\n if (finalWidth) {\r\n finalWidth = Math.floor(finalWidth);\r\n }\r\n if (finalHeight) {\r\n finalHeight = Math.floor(finalHeight);\r\n }\r\n\r\n return { height: height | 0, width: width | 0, finalWidth: finalWidth | 0, finalHeight: finalHeight | 0 };\r\n}\r\n\r\n/**\r\n * Class containing a set of static utilities functions for screenshots\r\n */\r\nexport const ScreenshotTools = {\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n CreateScreenshot,\r\n\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotAsync,\r\n\r\n /**\r\n * Captures a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param width defines the expected width\r\n * @param height defines the expected height\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotWithResizeAsync,\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n CreateScreenshotUsingRenderTarget,\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotUsingRenderTargetAsync,\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.CreateScreenshot = CreateScreenshot;\r\n Tools.CreateScreenshotAsync = CreateScreenshotAsync;\r\n Tools.CreateScreenshotUsingRenderTarget = CreateScreenshotUsingRenderTarget;\r\n Tools.CreateScreenshotUsingRenderTargetAsync = CreateScreenshotUsingRenderTargetAsync;\r\n};\r\n\r\ninitSideEffects();\r\n"]}
1
+ {"version":3,"file":"screenshotTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/screenshotTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport { FxaaPostProcess } from \"../PostProcesses/fxaaPostProcess\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { Logger } from \"./logger\";\r\nimport { Tools } from \"./tools\";\r\nimport type { IScreenshotSize } from \"./interfaces/screenshotSize\";\r\nimport { DumpData } from \"./dumpTools\";\r\nimport type { Nullable } from \"../types\";\r\nimport { ApplyPostProcess } from \"./textureTools\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.readTexture\";\r\n\r\nlet screenshotCanvas: Nullable<HTMLCanvasElement> = null;\r\n\r\n/**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\nexport function CreateScreenshot(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n forceDownload = false,\r\n quality?: number\r\n): void {\r\n const { height, width } = _GetScreenshotSize(engine, camera, size);\r\n\r\n if (!(height && width)) {\r\n Logger.Error(\"Invalid 'size' parameter !\");\r\n return;\r\n }\r\n\r\n if (!screenshotCanvas) {\r\n screenshotCanvas = document.createElement(\"canvas\");\r\n }\r\n\r\n screenshotCanvas.width = width;\r\n screenshotCanvas.height = height;\r\n\r\n const renderContext = screenshotCanvas.getContext(\"2d\");\r\n\r\n const ratio = engine.getRenderWidth() / engine.getRenderHeight();\r\n let newWidth = width;\r\n let newHeight = newWidth / ratio;\r\n if (newHeight > height) {\r\n newHeight = height;\r\n newWidth = newHeight * ratio;\r\n }\r\n\r\n const offsetX = Math.max(0, width - newWidth) / 2;\r\n const offsetY = Math.max(0, height - newHeight) / 2;\r\n\r\n const scene = camera.getScene();\r\n if (scene.activeCamera !== camera) {\r\n CreateScreenshotUsingRenderTarget(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (forceDownload) {\r\n const blob = new Blob([data]);\r\n Tools.DownloadBlob(blob);\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n } else if (successCallback) {\r\n successCallback(data);\r\n }\r\n },\r\n mimeType,\r\n 1.0,\r\n engine.getCreationOptions().antialias,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n quality\r\n );\r\n } else {\r\n engine.onEndFrameObservable.addOnce(() => {\r\n const renderingCanvas = engine.getRenderingCanvas();\r\n if (renderContext && renderingCanvas) {\r\n renderContext.drawImage(renderingCanvas, offsetX, offsetY, newWidth, newHeight);\r\n }\r\n\r\n if (screenshotCanvas) {\r\n if (forceDownload) {\r\n Tools.EncodeScreenshotCanvasData(screenshotCanvas, undefined, mimeType, undefined, quality);\r\n if (successCallback) {\r\n successCallback(\"\");\r\n }\r\n } else {\r\n Tools.EncodeScreenshotCanvasData(screenshotCanvas, successCallback, mimeType, undefined, quality);\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType = \"image/png\", quality?: number): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n CreateScreenshot(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (typeof data !== \"undefined\") {\r\n resolve(data);\r\n } else {\r\n reject(new Error(\"Data is undefined\"));\r\n }\r\n },\r\n mimeType,\r\n undefined,\r\n quality\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Captures a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param width defines the expected width\r\n * @param height defines the expected height\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotWithResizeAsync(engine: AbstractEngine, camera: Camera, width: number, height: number, mimeType = \"image/png\", quality?: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n CreateScreenshot(\r\n engine,\r\n camera,\r\n { width: width, height: height },\r\n () => {\r\n resolve();\r\n },\r\n mimeType,\r\n true,\r\n quality\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height, finalWidth, finalHeight. If a single number is passed,\r\n * it will be used for both width and height, as well as finalWidth, finalHeight. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.\r\n */\r\nexport function CreateScreenshotUsingRenderTarget(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n successCallback?: (data: string) => void,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number,\r\n customizeTexture?: (texture: RenderTargetTexture) => void\r\n): void {\r\n const { height, width, finalWidth, finalHeight } = _GetScreenshotSize(engine, camera, size);\r\n const targetTextureSize = { width, height };\r\n\r\n if (!(height && width)) {\r\n Logger.Error(\"Invalid 'size' parameter !\");\r\n return;\r\n }\r\n\r\n const originalSize = { width: engine.getRenderWidth(), height: engine.getRenderHeight() };\r\n engine.setSize(width, height); // we need this call to trigger onResizeObservable with the screenshot width/height on all the subsystems that are observing this event and that needs to (re)create some resources with the right dimensions\r\n\r\n const scene = camera.getScene();\r\n\r\n // At this point size can be a number, or an object (according to engine.prototype.createRenderTargetTexture method)\r\n const texture = new RenderTargetTexture(\r\n \"screenShot\",\r\n targetTextureSize,\r\n scene,\r\n false,\r\n false,\r\n Constants.TEXTURETYPE_UNSIGNED_INT,\r\n false,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n undefined,\r\n enableStencilBuffer,\r\n undefined,\r\n undefined,\r\n undefined,\r\n samples\r\n );\r\n texture.renderList = scene.meshes.slice();\r\n texture.samples = samples;\r\n texture.renderSprites = renderSprites;\r\n texture.activeCamera = camera;\r\n texture.forceLayerMaskCheck = useLayerMask;\r\n customizeTexture?.(texture);\r\n\r\n const renderWhenReady = () => {\r\n if (texture.isReadyForRendering() && camera.isReady(true)) {\r\n engine.onEndFrameObservable.addOnce(() => {\r\n if (finalWidth === width && finalHeight === height) {\r\n texture.readPixels(undefined, undefined, undefined, false)!.then((data) => {\r\n DumpData(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n texture.dispose();\r\n });\r\n } else {\r\n ApplyPostProcess(\"pass\", texture.getInternalTexture()!, scene, undefined, undefined, undefined, finalWidth, finalHeight).then((texture) => {\r\n engine._readTexturePixels(texture, finalWidth, finalHeight, -1, 0, null, true, false, 0, 0).then((data) => {\r\n DumpData(finalWidth, finalHeight, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality);\r\n texture.dispose();\r\n });\r\n });\r\n }\r\n });\r\n\r\n // re-render the scene after the camera has been reset to the original camera to avoid a flicker that could occur\r\n // if the camera used for the RTT rendering stays in effect for the next frame (and if that camera was different from the original camera)\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n texture.render(true);\r\n engine.setSize(originalSize.width, originalSize.height);\r\n camera.getProjectionMatrix(true); // Force cache refresh;\r\n scene.render();\r\n } else {\r\n setTimeout(renderWhenReady, 16);\r\n }\r\n };\r\n\r\n const renderToTexture = () => {\r\n // render the RTT\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n\r\n renderWhenReady();\r\n };\r\n\r\n if (antialiasing) {\r\n const fxaaPostProcess = new FxaaPostProcess(\"antialiasing\", 1.0, scene.activeCamera);\r\n texture.addPostProcess(fxaaPostProcess);\r\n // Async Shader Compilation can lead to none ready effects in synchronous code\r\n fxaaPostProcess.onEffectCreatedObservable.addOnce((e) => {\r\n if (!e.isReady()) {\r\n e.onCompiled = () => {\r\n renderToTexture();\r\n };\r\n }\r\n // The effect is ready we can render\r\n else {\r\n renderToTexture();\r\n }\r\n });\r\n } else {\r\n // No need to wait for extra resources to be ready\r\n renderToTexture();\r\n }\r\n}\r\n\r\n/**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\nexport function CreateScreenshotUsingRenderTargetAsync(\r\n engine: AbstractEngine,\r\n camera: Camera,\r\n size: IScreenshotSize | number,\r\n mimeType = \"image/png\",\r\n samples = 1,\r\n antialiasing = false,\r\n fileName?: string,\r\n renderSprites = false,\r\n enableStencilBuffer = false,\r\n useLayerMask = true,\r\n quality?: number,\r\n customizeTexture?: (texture: RenderTargetTexture) => void\r\n): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n CreateScreenshotUsingRenderTarget(\r\n engine,\r\n camera,\r\n size,\r\n (data) => {\r\n if (typeof data !== \"undefined\") {\r\n resolve(data);\r\n } else {\r\n reject(new Error(\"Data is undefined\"));\r\n }\r\n },\r\n mimeType,\r\n samples,\r\n antialiasing,\r\n fileName,\r\n renderSprites,\r\n enableStencilBuffer,\r\n useLayerMask,\r\n quality,\r\n customizeTexture\r\n );\r\n });\r\n}\r\n\r\n/**\r\n * Gets height and width for screenshot size\r\n * @param engine\r\n * @param camera\r\n * @param size\r\n * @private\r\n */\r\nfunction _GetScreenshotSize(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number): { height: number; width: number; finalWidth: number; finalHeight: number } {\r\n let height = 0;\r\n let width = 0;\r\n let finalWidth = 0;\r\n let finalHeight = 0;\r\n\r\n //If a size value defined as object\r\n if (typeof size === \"object\") {\r\n const precision = size.precision\r\n ? Math.abs(size.precision) // prevent GL_INVALID_VALUE : glViewport: negative width/height\r\n : 1;\r\n\r\n //If a width and height values is specified\r\n if (size.width && size.height) {\r\n height = size.height * precision;\r\n width = size.width * precision;\r\n }\r\n //If passing only width, computing height to keep display canvas ratio.\r\n else if (size.width && !size.height) {\r\n width = size.width * precision;\r\n height = Math.round(width / engine.getAspectRatio(camera));\r\n }\r\n //If passing only height, computing width to keep display canvas ratio.\r\n else if (size.height && !size.width) {\r\n height = size.height * precision;\r\n width = Math.round(height * engine.getAspectRatio(camera));\r\n } else {\r\n width = Math.round(engine.getRenderWidth() * precision);\r\n height = Math.round(width / engine.getAspectRatio(camera));\r\n }\r\n\r\n //If a finalWidth and finalHeight values is specified\r\n if (size.finalWidth && size.finalHeight) {\r\n finalHeight = size.finalHeight;\r\n finalWidth = size.finalWidth;\r\n }\r\n //If passing only finalWidth, computing finalHeight to keep display canvas ratio.\r\n else if (size.finalWidth && !size.finalHeight) {\r\n finalWidth = size.finalWidth;\r\n finalHeight = Math.round(finalWidth / engine.getAspectRatio(camera));\r\n }\r\n //If passing only finalHeight, computing finalWidth to keep display canvas ratio.\r\n else if (size.finalHeight && !size.finalWidth) {\r\n finalHeight = size.finalHeight;\r\n finalWidth = Math.round(finalHeight * engine.getAspectRatio(camera));\r\n } else {\r\n finalWidth = width;\r\n finalHeight = height;\r\n }\r\n }\r\n //Assuming here that \"size\" parameter is a number\r\n else if (!isNaN(size)) {\r\n height = size;\r\n width = size;\r\n finalWidth = size;\r\n finalHeight = size;\r\n }\r\n\r\n // When creating the image data from the CanvasRenderingContext2D, the width and height is clamped to the size of the _gl context\r\n // On certain GPUs, it seems as if the _gl context truncates to an integer automatically. Therefore, if a user tries to pass the width of their canvas element\r\n // and it happens to be a float (1000.5 x 600.5 px), the engine.readPixels will return a different size array than context.createImageData\r\n // to resolve this, we truncate the floats here to ensure the same size\r\n if (width) {\r\n width = Math.floor(width);\r\n }\r\n if (height) {\r\n height = Math.floor(height);\r\n }\r\n if (finalWidth) {\r\n finalWidth = Math.floor(finalWidth);\r\n }\r\n if (finalHeight) {\r\n finalHeight = Math.floor(finalHeight);\r\n }\r\n\r\n return { height: height | 0, width: width | 0, finalWidth: finalWidth | 0, finalHeight: finalHeight | 0 };\r\n}\r\n\r\n/**\r\n * Class containing a set of static utilities functions for screenshots\r\n */\r\nexport const ScreenshotTools = {\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback defines the callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param forceDownload force the system to download the image even if a successCallback is provided\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n CreateScreenshot,\r\n\r\n /**\r\n * Captures a screenshot of the current rendering\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotAsync,\r\n\r\n /**\r\n * Captures a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine defines the rendering engine\r\n * @param camera defines the source camera\r\n * @param width defines the expected width\r\n * @param height defines the expected height\r\n * @param mimeType defines the MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotWithResizeAsync,\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param successCallback The callback receives a single parameter which contains the\r\n * screenshot as a string of base64-encoded characters. This string can be assigned to the\r\n * src parameter of an <img> to display it\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n */\r\n CreateScreenshotUsingRenderTarget,\r\n\r\n /**\r\n * Generates an image screenshot from the specified camera.\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG\r\n * @param engine The engine to use for rendering\r\n * @param camera The camera to use for rendering\r\n * @param size This parameter can be set to a single number or to an object with the\r\n * following (optional) properties: precision, width, height. If a single number is passed,\r\n * it will be used for both width and height. If an object is passed, the screenshot size\r\n * will be derived from the parameters. The precision property is a multiplier allowing\r\n * rendering at a higher or lower resolution\r\n * @param mimeType The MIME type of the screenshot image (default: image/png).\r\n * Check your browser for supported MIME types\r\n * @param samples Texture samples (default: 1)\r\n * @param antialiasing Whether antialiasing should be turned on or not (default: false)\r\n * @param fileName A name for for the downloaded file.\r\n * @param renderSprites Whether the sprites should be rendered or not (default: false)\r\n * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.\r\n * @returns screenshot as a string of base64-encoded characters. This string can be assigned\r\n * to the src parameter of an <img> to display it\r\n */\r\n CreateScreenshotUsingRenderTargetAsync,\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n // References the dependencies.\r\n Tools.CreateScreenshot = CreateScreenshot;\r\n Tools.CreateScreenshotAsync = CreateScreenshotAsync;\r\n Tools.CreateScreenshotUsingRenderTarget = CreateScreenshotUsingRenderTarget;\r\n Tools.CreateScreenshotUsingRenderTargetAsync = CreateScreenshotUsingRenderTargetAsync;\r\n};\r\n\r\ninitSideEffects();\r\n"]}
package/Misc/tools.d.ts CHANGED
@@ -8,6 +8,7 @@ import type { IScreenshotSize } from "./interfaces/screenshotSize";
8
8
  import type { Camera } from "../Cameras/camera";
9
9
  import type { IColor4Like } from "../Maths/math.like";
10
10
  import type { AbstractEngine } from "../Engines/abstractEngine";
11
+ import type { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture.js";
11
12
  /**
12
13
  * Class containing a set of static utilities functions
13
14
  */
@@ -470,8 +471,9 @@ export declare class Tools {
470
471
  * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
471
472
  * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
472
473
  * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
474
+ * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
473
475
  */
474
- static CreateScreenshotUsingRenderTarget(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number): void;
476
+ static CreateScreenshotUsingRenderTarget(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void): void;
475
477
  /**
476
478
  * Generates an image screenshot from the specified camera.
477
479
  * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
@@ -487,14 +489,15 @@ export declare class Tools {
487
489
  * @param samples Texture samples (default: 1)
488
490
  * @param antialiasing Whether antialiasing should be turned on or not (default: false)
489
491
  * @param fileName A name for for the downloaded file.
490
- * @returns screenshot as a string of base64-encoded characters. This string can be assigned
491
492
  * @param renderSprites Whether the sprites should be rendered or not (default: false)
492
493
  * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
493
494
  * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
494
495
  * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
496
+ * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
497
+ * @returns screenshot as a string of base64-encoded characters. This string can be assigned
495
498
  * to the src parameter of an <img> to display it
496
499
  */
497
- static CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number): Promise<string>;
500
+ static CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void): Promise<string>;
498
501
  /**
499
502
  * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523
500
503
  * Be aware Math.random() could cause collisions, but: