@babylonjs/core 7.8.0 → 7.8.2

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 (182) hide show
  1. package/Behaviors/Meshes/sixDofDragBehavior.js +1 -1
  2. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  3. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -1
  4. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  5. package/Engines/AbstractEngine/abstractEngine.states.d.ts +1 -0
  6. package/Engines/AbstractEngine/abstractEngine.states.js +1 -0
  7. package/Engines/AbstractEngine/abstractEngine.states.js.map +1 -1
  8. package/Engines/{Extensions/engine.views.d.ts → AbstractEngine/abstractEngine.views.d.ts} +1 -2
  9. package/Engines/{Extensions/engine.views.js → AbstractEngine/abstractEngine.views.js} +10 -10
  10. package/Engines/AbstractEngine/abstractEngine.views.js.map +1 -0
  11. package/Engines/AbstractEngine/index.d.ts +1 -0
  12. package/Engines/AbstractEngine/index.js +1 -0
  13. package/Engines/AbstractEngine/index.js.map +1 -1
  14. package/Engines/Extensions/engine.alpha.d.ts +2 -2
  15. package/Engines/Extensions/engine.alpha.js.map +1 -1
  16. package/Engines/Extensions/engine.cubeTexture.d.ts +10 -4
  17. package/Engines/Extensions/engine.cubeTexture.js +10 -0
  18. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  19. package/Engines/Extensions/engine.dynamicBuffer.d.ts +2 -2
  20. package/Engines/Extensions/engine.dynamicBuffer.js.map +1 -1
  21. package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -2
  22. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  23. package/Engines/Extensions/engine.multiRender.d.ts +2 -2
  24. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  25. package/Engines/Extensions/engine.prefilteredCubeTexture.d.ts +22 -0
  26. package/Engines/Extensions/engine.prefilteredCubeTexture.js +88 -0
  27. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -0
  28. package/Engines/Extensions/engine.rawTexture.d.ts +2 -63
  29. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  30. package/Engines/Extensions/engine.readTexture.d.ts +2 -2
  31. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  32. package/Engines/Extensions/engine.renderTarget.d.ts +5 -11
  33. package/Engines/Extensions/engine.renderTarget.js +37 -0
  34. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  35. package/Engines/Extensions/engine.renderTargetCube.d.ts +2 -2
  36. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  37. package/Engines/Extensions/engine.renderTargetTexture.d.ts +14 -0
  38. package/Engines/Extensions/engine.renderTargetTexture.js +16 -0
  39. package/Engines/Extensions/engine.renderTargetTexture.js.map +1 -0
  40. package/Engines/Extensions/engine.videoTexture.d.ts +2 -2
  41. package/Engines/Extensions/engine.videoTexture.js.map +1 -1
  42. package/Engines/Extensions/index.d.ts +2 -1
  43. package/Engines/Extensions/index.js +2 -1
  44. package/Engines/Extensions/index.js.map +1 -1
  45. package/Engines/WebGPU/Extensions/engine.alpha.d.ts +3 -27
  46. package/Engines/WebGPU/Extensions/engine.alpha.js +1 -0
  47. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  48. package/Engines/WebGPU/Extensions/engine.cubeTexture.d.ts +10 -4
  49. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +9 -0
  50. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  51. package/Engines/WebGPU/Extensions/engine.dynamicTexture.d.ts +2 -2
  52. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  53. package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +2 -2
  54. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  55. package/Engines/WebGPU/Extensions/engine.rawTexture.d.ts +2 -50
  56. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  57. package/Engines/WebGPU/Extensions/engine.readTexture.d.ts +2 -2
  58. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  59. package/Engines/WebGPU/Extensions/engine.renderTarget.d.ts +3 -11
  60. package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -0
  61. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  62. package/Engines/WebGPU/Extensions/engine.renderTargetCube.d.ts +2 -2
  63. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  64. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.d.ts +14 -0
  65. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.js +10 -0
  66. package/Engines/WebGPU/Extensions/engine.renderTargetTexture.js.map +1 -0
  67. package/Engines/WebGPU/Extensions/engine.videoTexture.d.ts +2 -2
  68. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/index.d.ts +1 -0
  70. package/Engines/WebGPU/Extensions/index.js +1 -0
  71. package/Engines/WebGPU/Extensions/index.js.map +1 -1
  72. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +4 -0
  73. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +4 -0
  74. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  75. package/Engines/abstractEngine.d.ts +13 -351
  76. package/Engines/abstractEngine.js +90 -5
  77. package/Engines/abstractEngine.js.map +1 -1
  78. package/Engines/engine.d.ts +11 -30
  79. package/Engines/engine.js +0 -69
  80. package/Engines/engine.js.map +1 -1
  81. package/Engines/nativeEngine.d.ts +4 -7
  82. package/Engines/nativeEngine.js +3 -8
  83. package/Engines/nativeEngine.js.map +1 -1
  84. package/Engines/thinEngine.d.ts +7 -18
  85. package/Engines/thinEngine.js +4 -146
  86. package/Engines/thinEngine.js.map +1 -1
  87. package/Engines/webgpuEngine.d.ts +4 -26
  88. package/Engines/webgpuEngine.js +3 -51
  89. package/Engines/webgpuEngine.js.map +1 -1
  90. package/Materials/Node/Blocks/Fragment/TBNBlock.js +14 -7
  91. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  92. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +19 -11
  93. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  94. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +47 -20
  95. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  96. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +3 -1
  97. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  98. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +4 -4
  99. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  100. package/Materials/Node/Blocks/biPlanarBlock.js +1 -2
  101. package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
  102. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  103. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  104. package/Materials/Node/Blocks/triPlanarBlock.js +1 -1
  105. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  106. package/Materials/Node/nodeMaterialBuildState.d.ts +2 -0
  107. package/Materials/Node/nodeMaterialBuildState.js +7 -0
  108. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  109. package/Materials/Textures/Filtering/hdrFiltering.d.ts +1 -0
  110. package/Materials/Textures/Filtering/hdrFiltering.js +2 -1
  111. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  112. package/Materials/Textures/Loaders/basisTextureLoader.d.ts +1 -0
  113. package/Materials/Textures/Loaders/basisTextureLoader.js +1 -0
  114. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  115. package/Materials/Textures/Loaders/ddsTextureLoader.d.ts +1 -0
  116. package/Materials/Textures/Loaders/ddsTextureLoader.js +1 -0
  117. package/Materials/Textures/Loaders/ddsTextureLoader.js.map +1 -1
  118. package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +1 -0
  119. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
  120. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  121. package/Materials/Textures/baseTexture.d.ts +1 -0
  122. package/Materials/Textures/baseTexture.js +1 -0
  123. package/Materials/Textures/baseTexture.js.map +1 -1
  124. package/Materials/Textures/cubeTexture.d.ts +2 -1
  125. package/Materials/Textures/cubeTexture.js +3 -2
  126. package/Materials/Textures/cubeTexture.js.map +1 -1
  127. package/Materials/Textures/dynamicTexture.d.ts +1 -1
  128. package/Materials/Textures/dynamicTexture.js.map +1 -1
  129. package/Materials/Textures/renderTargetTexture.d.ts +11 -0
  130. package/Materials/Textures/renderTargetTexture.js +10 -0
  131. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  132. package/Materials/effect.d.ts +8 -23
  133. package/Materials/effect.js +2 -25
  134. package/Materials/effect.js.map +1 -1
  135. package/Misc/dds.d.ts +2 -22
  136. package/Misc/dds.js +0 -95
  137. package/Misc/dds.js.map +1 -1
  138. package/Misc/minMaxReducer.d.ts +1 -0
  139. package/Misc/minMaxReducer.js +1 -0
  140. package/Misc/minMaxReducer.js.map +1 -1
  141. package/Misc/screenshotTools.d.ts +1 -0
  142. package/Misc/screenshotTools.js +1 -0
  143. package/Misc/screenshotTools.js.map +1 -1
  144. package/Morph/morphTargetManager.d.ts +6 -0
  145. package/Morph/morphTargetManager.js +13 -0
  146. package/Morph/morphTargetManager.js.map +1 -1
  147. package/Physics/v2/IPhysicsEnginePlugin.d.ts +1 -0
  148. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  149. package/Physics/v2/Plugins/havokPlugin.d.ts +11 -1
  150. package/Physics/v2/Plugins/havokPlugin.js +25 -1
  151. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  152. package/Physics/v2/physicsAggregate.js +3 -3
  153. package/Physics/v2/physicsAggregate.js.map +1 -1
  154. package/Physics/v2/physicsBody.d.ts +6 -0
  155. package/Physics/v2/physicsBody.js +7 -0
  156. package/Physics/v2/physicsBody.js.map +1 -1
  157. package/PostProcesses/postProcess.d.ts +37 -2
  158. package/PostProcesses/postProcess.js +34 -0
  159. package/PostProcesses/postProcess.js.map +1 -1
  160. package/Rendering/depthPeelingRenderer.d.ts +1 -0
  161. package/Rendering/depthPeelingRenderer.js +1 -0
  162. package/Rendering/depthPeelingRenderer.js.map +1 -1
  163. package/Rendering/geometryBufferRenderer.d.ts +1 -0
  164. package/Rendering/geometryBufferRenderer.js +1 -0
  165. package/Rendering/geometryBufferRenderer.js.map +1 -1
  166. package/Rendering/prePassRenderer.d.ts +1 -0
  167. package/Rendering/prePassRenderer.js +1 -0
  168. package/Rendering/prePassRenderer.js.map +1 -1
  169. package/ShadersWGSL/ShadersInclude/bumpFragment.d.ts +5 -0
  170. package/ShadersWGSL/ShadersInclude/bumpFragment.js +61 -0
  171. package/ShadersWGSL/ShadersInclude/bumpFragment.js.map +1 -0
  172. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.d.ts +6 -0
  173. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.js +40 -0
  174. package/ShadersWGSL/ShadersInclude/bumpFragmentFunctions.js.map +1 -0
  175. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.d.ts +5 -0
  176. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +69 -0
  177. package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -0
  178. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.d.ts +5 -0
  179. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.js +27 -0
  180. package/ShadersWGSL/ShadersInclude/samplerFragmentDeclaration.js.map +1 -0
  181. package/package.json +1 -1
  182. package/Engines/Extensions/engine.views.js.map +0 -1
package/Misc/dds.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"dds.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/dds.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport { SphericalPolynomial } from \"../Maths/sphericalPolynomial\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { InternalTexture, InternalTextureSource } from \"../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { CubeMapToSphericalPolynomialTools } from \"../Misc/HighDynamicRange/cubemapToSphericalPolynomial\";\r\nimport type { Scene } from \"../scene\";\r\nimport { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { FromHalfFloat, ToHalfFloat } from \"./textureTools\";\r\n\r\nimport \"../Engines/AbstractEngine/abstractEngine.cubeTexture\";\r\nimport \"../Engines/Extensions/engine.cubeTexture\";\r\nimport { ThinEngine } from \"../Engines/thinEngine\";\r\n\r\n// Based on demo done by Brandon Jones - http://media.tojicode.com/webgl-samples/dds.html\r\n// All values and structures referenced from:\r\n// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\r\nconst DDS_MAGIC = 0x20534444;\r\n\r\nconst //DDSD_CAPS = 0x1,\r\n //DDSD_HEIGHT = 0x2,\r\n //DDSD_WIDTH = 0x4,\r\n //DDSD_PITCH = 0x8,\r\n //DDSD_PIXELFORMAT = 0x1000,\r\n DDSD_MIPMAPCOUNT = 0x20000;\r\n//DDSD_LINEARSIZE = 0x80000,\r\n//DDSD_DEPTH = 0x800000;\r\n\r\n// var DDSCAPS_COMPLEX = 0x8,\r\n// DDSCAPS_MIPMAP = 0x400000,\r\n// DDSCAPS_TEXTURE = 0x1000;\r\n\r\nconst DDSCAPS2_CUBEMAP = 0x200;\r\n// DDSCAPS2_CUBEMAP_POSITIVEX = 0x400,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,\r\n// DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,\r\n// DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,\r\n// DDSCAPS2_VOLUME = 0x200000;\r\n\r\nconst //DDPF_ALPHAPIXELS = 0x1,\r\n //DDPF_ALPHA = 0x2,\r\n DDPF_FOURCC = 0x4,\r\n DDPF_RGB = 0x40,\r\n //DDPF_YUV = 0x200,\r\n DDPF_LUMINANCE = 0x20000;\r\n\r\nfunction FourCCToInt32(value: string) {\r\n return value.charCodeAt(0) + (value.charCodeAt(1) << 8) + (value.charCodeAt(2) << 16) + (value.charCodeAt(3) << 24);\r\n}\r\n\r\nfunction Int32ToFourCC(value: number) {\r\n return String.fromCharCode(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff);\r\n}\r\n\r\nconst FOURCC_DXT1 = FourCCToInt32(\"DXT1\");\r\nconst FOURCC_DXT3 = FourCCToInt32(\"DXT3\");\r\nconst FOURCC_DXT5 = FourCCToInt32(\"DXT5\");\r\nconst FOURCC_DX10 = FourCCToInt32(\"DX10\");\r\nconst FOURCC_D3DFMT_R16G16B16A16F = 113;\r\nconst FOURCC_D3DFMT_R32G32B32A32F = 116;\r\n\r\nconst DXGI_FORMAT_R32G32B32A32_FLOAT = 2;\r\nconst DXGI_FORMAT_R16G16B16A16_FLOAT = 10;\r\nconst DXGI_FORMAT_B8G8R8X8_UNORM = 88;\r\n\r\nconst headerLengthInt = 31; // The header length in 32 bit ints\r\n\r\n// Offsets into the header array\r\nconst off_magic = 0;\r\n\r\nconst off_size = 1;\r\nconst off_flags = 2;\r\nconst off_height = 3;\r\nconst off_width = 4;\r\n\r\nconst off_mipmapCount = 7;\r\n\r\nconst off_pfFlags = 20;\r\nconst off_pfFourCC = 21;\r\nconst off_RGBbpp = 22;\r\nconst off_RMask = 23;\r\nconst off_GMask = 24;\r\nconst off_BMask = 25;\r\nconst off_AMask = 26;\r\n// var off_caps1 = 27;\r\nconst off_caps2 = 28;\r\n// var off_caps3 = 29;\r\n// var off_caps4 = 30;\r\nconst off_dxgiFormat = 32;\r\n\r\n/**\r\n * Direct draw surface info\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dx-graphics-dds-pguide\r\n */\r\nexport interface DDSInfo {\r\n /**\r\n * Width of the texture\r\n */\r\n width: number;\r\n /**\r\n * Width of the texture\r\n */\r\n height: number;\r\n /**\r\n * Number of Mipmaps for the texture\r\n * @see https://en.wikipedia.org/wiki/Mipmap\r\n */\r\n mipmapCount: number;\r\n /**\r\n * If the textures format is a known fourCC format\r\n * @see https://www.fourcc.org/\r\n */\r\n isFourCC: boolean;\r\n /**\r\n * If the texture is an RGB format eg. DXGI_FORMAT_B8G8R8X8_UNORM format\r\n */\r\n isRGB: boolean;\r\n /**\r\n * If the texture is a lumincance format\r\n */\r\n isLuminance: boolean;\r\n /**\r\n * If this is a cube texture\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dds-file-layout-for-cubic-environment-maps\r\n */\r\n isCube: boolean;\r\n /**\r\n * If the texture is a compressed format eg. FOURCC_DXT1\r\n */\r\n isCompressed: boolean;\r\n /**\r\n * The dxgiFormat of the texture\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/api/dxgiformat/ne-dxgiformat-dxgi_format\r\n */\r\n dxgiFormat: number;\r\n /**\r\n * Texture type eg. Engine.TEXTURETYPE_UNSIGNED_INT, Engine.TEXTURETYPE_FLOAT\r\n */\r\n textureType: number;\r\n /**\r\n * Sphericle polynomial created for the dds texture\r\n */\r\n sphericalPolynomial?: SphericalPolynomial;\r\n}\r\n\r\n/**\r\n * Class used to provide DDS decompression tools\r\n */\r\nexport class DDSTools {\r\n /**\r\n * Gets or sets a boolean indicating that LOD info is stored in alpha channel (false by default)\r\n */\r\n public static StoreLODInAlphaChannel = false;\r\n\r\n /**\r\n * Gets DDS information from an array buffer\r\n * @param data defines the array buffer view to read data from\r\n * @returns the DDS information\r\n */\r\n public static GetDDSInfo(data: ArrayBufferView): DDSInfo {\r\n const header = new Int32Array(data.buffer, data.byteOffset, headerLengthInt);\r\n const extendedHeader = new Int32Array(data.buffer, data.byteOffset, headerLengthInt + 4);\r\n\r\n let mipmapCount = 1;\r\n if (header[off_flags] & DDSD_MIPMAPCOUNT) {\r\n mipmapCount = Math.max(1, header[off_mipmapCount]);\r\n }\r\n\r\n const fourCC = header[off_pfFourCC];\r\n const dxgiFormat = fourCC === FOURCC_DX10 ? extendedHeader[off_dxgiFormat] : 0;\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n\r\n switch (fourCC) {\r\n case FOURCC_D3DFMT_R16G16B16A16F:\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n break;\r\n case FOURCC_D3DFMT_R32G32B32A32F:\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n break;\r\n case FOURCC_DX10:\r\n if (dxgiFormat === DXGI_FORMAT_R16G16B16A16_FLOAT) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n break;\r\n }\r\n if (dxgiFormat === DXGI_FORMAT_R32G32B32A32_FLOAT) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n width: header[off_width],\r\n height: header[off_height],\r\n mipmapCount: mipmapCount,\r\n isFourCC: (header[off_pfFlags] & DDPF_FOURCC) === DDPF_FOURCC,\r\n isRGB: (header[off_pfFlags] & DDPF_RGB) === DDPF_RGB,\r\n isLuminance: (header[off_pfFlags] & DDPF_LUMINANCE) === DDPF_LUMINANCE,\r\n isCube: (header[off_caps2] & DDSCAPS2_CUBEMAP) === DDSCAPS2_CUBEMAP,\r\n isCompressed: fourCC === FOURCC_DXT1 || fourCC === FOURCC_DXT3 || fourCC === FOURCC_DXT5,\r\n dxgiFormat: dxgiFormat,\r\n textureType: textureType,\r\n };\r\n }\r\n\r\n private static _GetHalfFloatAsFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Float32Array {\r\n const destArray = new Float32Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = FromHalfFloat(srcData[srcPos]);\r\n destArray[index + 1] = FromHalfFloat(srcData[srcPos + 1]);\r\n destArray[index + 2] = FromHalfFloat(srcData[srcPos + 2]);\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = FromHalfFloat(srcData[srcPos + 3]);\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetHalfFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint16Array {\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n const destArray = new Uint16Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = srcData[srcPos];\r\n destArray[index + 1] = srcData[srcPos + 1];\r\n destArray[index + 2] = srcData[srcPos + 2];\r\n destArray[index + 3] = ToHalfFloat(lod);\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n return new Uint16Array(arrayBuffer, dataOffset, dataLength);\r\n }\r\n\r\n private static _GetFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Float32Array {\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n const destArray = new Float32Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = srcData[srcPos];\r\n destArray[index + 1] = srcData[srcPos + 1];\r\n destArray[index + 2] = srcData[srcPos + 2];\r\n destArray[index + 3] = lod;\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n return new Float32Array(arrayBuffer, dataOffset, dataLength);\r\n }\r\n\r\n private static _GetFloatAsHalfFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint16Array {\r\n const destArray = new Uint16Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n destArray[index] = ToHalfFloat(srcData[index]);\r\n destArray[index + 1] = ToHalfFloat(srcData[index + 1]);\r\n destArray[index + 2] = ToHalfFloat(srcData[index + 2]);\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = ToHalfFloat(lod);\r\n } else {\r\n destArray[index + 3] = ToHalfFloat(srcData[index + 3]);\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetFloatAsUIntRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint8Array {\r\n const destArray = new Uint8Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = Scalar.Clamp(srcData[srcPos]) * 255;\r\n destArray[index + 1] = Scalar.Clamp(srcData[srcPos + 1]) * 255;\r\n destArray[index + 2] = Scalar.Clamp(srcData[srcPos + 2]) * 255;\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = Scalar.Clamp(srcData[srcPos + 3]) * 255;\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetHalfFloatAsUIntRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint8Array {\r\n const destArray = new Uint8Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = Scalar.Clamp(FromHalfFloat(srcData[srcPos])) * 255;\r\n destArray[index + 1] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 1])) * 255;\r\n destArray[index + 2] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 2])) * 255;\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 3])) * 255;\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetRGBAArrayBuffer(\r\n width: number,\r\n height: number,\r\n dataOffset: number,\r\n dataLength: number,\r\n arrayBuffer: ArrayBuffer,\r\n rOffset: number,\r\n gOffset: number,\r\n bOffset: number,\r\n aOffset: number\r\n ): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n\r\n byteArray[index] = srcData[srcPos + rOffset];\r\n byteArray[index + 1] = srcData[srcPos + gOffset];\r\n byteArray[index + 2] = srcData[srcPos + bOffset];\r\n byteArray[index + 3] = srcData[srcPos + aOffset];\r\n index += 4;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n private static _ExtractLongWordOrder(value: number): number {\r\n if (value === 0 || value === 255 || value === -16777216) {\r\n return 0;\r\n }\r\n\r\n return 1 + DDSTools._ExtractLongWordOrder(value >> 8);\r\n }\r\n\r\n private static _GetRGBArrayBuffer(\r\n width: number,\r\n height: number,\r\n dataOffset: number,\r\n dataLength: number,\r\n arrayBuffer: ArrayBuffer,\r\n rOffset: number,\r\n gOffset: number,\r\n bOffset: number\r\n ): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 3;\r\n\r\n byteArray[index] = srcData[srcPos + rOffset];\r\n byteArray[index + 1] = srcData[srcPos + gOffset];\r\n byteArray[index + 2] = srcData[srcPos + bOffset];\r\n index += 3;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n private static _GetLuminanceArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = x + y * width;\r\n byteArray[index] = srcData[srcPos];\r\n index++;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n /**\r\n * Uploads DDS Levels to a Babylon Texture\r\n * @internal\r\n */\r\n public static UploadDDSLevels(\r\n engine: AbstractEngine,\r\n texture: InternalTexture,\r\n data: ArrayBufferView,\r\n info: DDSInfo,\r\n loadMipmaps: boolean,\r\n faces: number,\r\n lodIndex = -1,\r\n currentFace?: number,\r\n destTypeMustBeFilterable = true\r\n ) {\r\n let sphericalPolynomialFaces: Nullable<Array<ArrayBufferView>> = null;\r\n if (info.sphericalPolynomial) {\r\n sphericalPolynomialFaces = [] as ArrayBufferView[];\r\n }\r\n const ext = !!engine.getCaps().s3tc;\r\n\r\n // TODO WEBGPU Once generateMipMaps is split into generateMipMaps + hasMipMaps in InternalTexture this line can be removed\r\n texture.generateMipMaps = loadMipmaps;\r\n\r\n const header = new Int32Array(data.buffer, data.byteOffset, headerLengthInt);\r\n let fourCC: number,\r\n width: number,\r\n height: number,\r\n dataLength: number = 0,\r\n dataOffset: number;\r\n let byteArray: Uint8Array, mipmapCount: number, mip: number;\r\n let internalCompressedFormat = 0;\r\n let blockBytes = 1;\r\n\r\n if (header[off_magic] !== DDS_MAGIC) {\r\n Logger.Error(\"Invalid magic number in DDS header\");\r\n return;\r\n }\r\n\r\n if (!info.isFourCC && !info.isRGB && !info.isLuminance) {\r\n Logger.Error(\"Unsupported format, must contain a FourCC, RGB or LUMINANCE code\");\r\n return;\r\n }\r\n\r\n if (info.isCompressed && !ext) {\r\n Logger.Error(\"Compressed textures are not supported on this platform.\");\r\n return;\r\n }\r\n\r\n let bpp = header[off_RGBbpp];\r\n dataOffset = header[off_size] + 4;\r\n\r\n let computeFormats = false;\r\n\r\n if (info.isFourCC) {\r\n fourCC = header[off_pfFourCC];\r\n switch (fourCC) {\r\n case FOURCC_DXT1:\r\n blockBytes = 8;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1;\r\n break;\r\n case FOURCC_DXT3:\r\n blockBytes = 16;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3;\r\n break;\r\n case FOURCC_DXT5:\r\n blockBytes = 16;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5;\r\n break;\r\n case FOURCC_D3DFMT_R16G16B16A16F:\r\n computeFormats = true;\r\n bpp = 64;\r\n break;\r\n case FOURCC_D3DFMT_R32G32B32A32F:\r\n computeFormats = true;\r\n bpp = 128;\r\n break;\r\n case FOURCC_DX10: {\r\n // There is an additionnal header so dataOffset need to be changed\r\n dataOffset += 5 * 4; // 5 uints\r\n\r\n let supported = false;\r\n switch (info.dxgiFormat) {\r\n case DXGI_FORMAT_R16G16B16A16_FLOAT:\r\n computeFormats = true;\r\n bpp = 64;\r\n supported = true;\r\n break;\r\n case DXGI_FORMAT_R32G32B32A32_FLOAT:\r\n computeFormats = true;\r\n bpp = 128;\r\n supported = true;\r\n break;\r\n case DXGI_FORMAT_B8G8R8X8_UNORM:\r\n info.isRGB = true;\r\n info.isFourCC = false;\r\n bpp = 32;\r\n supported = true;\r\n break;\r\n }\r\n\r\n if (supported) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n default:\r\n Logger.Error([\"Unsupported FourCC code:\", Int32ToFourCC(fourCC)]);\r\n return;\r\n }\r\n }\r\n\r\n const rOffset = DDSTools._ExtractLongWordOrder(header[off_RMask]);\r\n const gOffset = DDSTools._ExtractLongWordOrder(header[off_GMask]);\r\n const bOffset = DDSTools._ExtractLongWordOrder(header[off_BMask]);\r\n const aOffset = DDSTools._ExtractLongWordOrder(header[off_AMask]);\r\n\r\n if (computeFormats) {\r\n internalCompressedFormat = engine._getRGBABufferInternalSizedFormat(info.textureType);\r\n }\r\n\r\n mipmapCount = 1;\r\n if (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) {\r\n mipmapCount = Math.max(1, header[off_mipmapCount]);\r\n }\r\n\r\n const startFace = currentFace || 0;\r\n const caps = engine.getCaps();\r\n for (let face = startFace; face < faces; face++) {\r\n width = header[off_width];\r\n height = header[off_height];\r\n\r\n for (mip = 0; mip < mipmapCount; ++mip) {\r\n if (lodIndex === -1 || lodIndex === mip) {\r\n // In case of fixed LOD, if the lod has just been uploaded, early exit.\r\n const i = lodIndex === -1 ? mip : 0;\r\n\r\n if (!info.isCompressed && info.isFourCC) {\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n dataLength = width * height * 4;\r\n let floatArray: Nullable<ArrayBufferView> = null;\r\n\r\n if (engine._badOS || engine._badDesktopOS || (!caps.textureHalfFloat && !caps.textureFloat)) {\r\n // Required because iOS has many issues with float and half float generation\r\n if (bpp === 128) {\r\n floatArray = DDSTools._GetFloatAsUIntRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(DDSTools._GetFloatRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i));\r\n }\r\n } else if (bpp === 64) {\r\n floatArray = DDSTools._GetHalfFloatAsUIntRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(\r\n DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i)\r\n );\r\n }\r\n }\r\n\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n } else {\r\n const floatAvailable = caps.textureFloat && ((destTypeMustBeFilterable && caps.textureFloatLinearFiltering) || !destTypeMustBeFilterable);\r\n const halfFloatAvailable = caps.textureHalfFloat && ((destTypeMustBeFilterable && caps.textureHalfFloatLinearFiltering) || !destTypeMustBeFilterable);\r\n\r\n const destType =\r\n (bpp === 128 || (bpp === 64 && !halfFloatAvailable)) && floatAvailable\r\n ? Constants.TEXTURETYPE_FLOAT\r\n : (bpp === 64 || (bpp === 128 && !floatAvailable)) && halfFloatAvailable\r\n ? Constants.TEXTURETYPE_HALF_FLOAT\r\n : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n\r\n let dataGetter: (width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number) => ArrayBufferView;\r\n let dataGetterPolynomial: Nullable<\r\n (width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number) => ArrayBufferView\r\n > = null;\r\n\r\n switch (bpp) {\r\n case 128: {\r\n switch (destType) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n dataGetter = DDSTools._GetFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = null;\r\n break;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n dataGetter = DDSTools._GetFloatAsHalfFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetFloatRGBAArrayBuffer;\r\n break;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n dataGetter = DDSTools._GetFloatAsUIntRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetFloatRGBAArrayBuffer;\r\n break;\r\n }\r\n break;\r\n }\r\n default: {\r\n // 64 bpp\r\n switch (destType) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n dataGetter = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = null;\r\n break;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n dataGetter = DDSTools._GetHalfFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n break;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n dataGetter = DDSTools._GetHalfFloatAsUIntRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n texture.type = destType;\r\n\r\n floatArray = dataGetter(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(\r\n dataGetterPolynomial ? dataGetterPolynomial(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i) : floatArray\r\n );\r\n }\r\n }\r\n\r\n if (floatArray) {\r\n engine._uploadDataToTextureDirectly(texture, floatArray, face, i);\r\n }\r\n } else if (info.isRGB) {\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n if (bpp === 24) {\r\n texture.format = Constants.TEXTUREFORMAT_RGB;\r\n dataLength = width * height * 3;\r\n byteArray = DDSTools._GetRGBArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, rOffset, gOffset, bOffset);\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n } else {\r\n // 32\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n dataLength = width * height * 4;\r\n byteArray = DDSTools._GetRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, rOffset, gOffset, bOffset, aOffset);\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n }\r\n } else if (info.isLuminance) {\r\n const unpackAlignment = engine._getUnpackAlignement();\r\n const unpaddedRowSize = width;\r\n const paddedRowSize = Math.floor((width + unpackAlignment - 1) / unpackAlignment) * unpackAlignment;\r\n dataLength = paddedRowSize * (height - 1) + unpaddedRowSize;\r\n\r\n byteArray = DDSTools._GetLuminanceArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer);\r\n texture.format = Constants.TEXTUREFORMAT_LUMINANCE;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n } else {\r\n dataLength = (((Math.max(4, width) / 4) * Math.max(4, height)) / 4) * blockBytes;\r\n byteArray = new Uint8Array(data.buffer, data.byteOffset + dataOffset, dataLength);\r\n\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n engine._uploadCompressedDataToTextureDirectly(texture, internalCompressedFormat, width, height, byteArray, face, i);\r\n }\r\n }\r\n dataOffset += bpp ? width * height * (bpp / 8) : dataLength;\r\n width *= 0.5;\r\n height *= 0.5;\r\n\r\n width = Math.max(1.0, width);\r\n height = Math.max(1.0, height);\r\n }\r\n\r\n if (currentFace !== undefined) {\r\n // Loading a single face\r\n break;\r\n }\r\n }\r\n if (sphericalPolynomialFaces && sphericalPolynomialFaces.length > 0) {\r\n info.sphericalPolynomial = CubeMapToSphericalPolynomialTools.ConvertCubeMapToSphericalPolynomial({\r\n size: header[off_width],\r\n right: sphericalPolynomialFaces[0],\r\n left: sphericalPolynomialFaces[1],\r\n up: sphericalPolynomialFaces[2],\r\n down: sphericalPolynomialFaces[3],\r\n front: sphericalPolynomialFaces[4],\r\n back: sphericalPolynomialFaces[5],\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n gammaSpace: false,\r\n });\r\n } else {\r\n info.sphericalPolynomial = undefined;\r\n }\r\n }\r\n}\r\n\r\ndeclare module \"../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /**\r\n * Create a cube texture from prefiltered data (ie. the mipmaps contain ready to use data for PBR reflection)\r\n * @param rootUrl defines the url where the file to load is located\r\n * @param scene defines the current scene\r\n * @param lodScale defines scale to apply to the mip map selection\r\n * @param lodOffset defines offset to apply to the mip map selection\r\n * @param onLoad defines an optional callback raised when the texture is loaded\r\n * @param onError defines an optional callback raised if there is an issue to load the texture\r\n * @param format defines the format of the data\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param createPolynomials defines wheter or not to create polynomails harmonics for the texture\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n createPrefilteredCubeTexture(\r\n rootUrl: string,\r\n scene: Nullable<Scene>,\r\n lodScale: number,\r\n lodOffset: number,\r\n onLoad?: Nullable<(internalTexture: Nullable<InternalTexture>) => void>,\r\n onError?: Nullable<(message?: string, exception?: any) => void>,\r\n format?: number,\r\n forcedExtension?: any,\r\n createPolynomials?: boolean\r\n ): InternalTexture;\r\n }\r\n}\r\n\r\n/**\r\n * Create a cube texture from prefiltered data (ie. the mipmaps contain ready to use data for PBR reflection)\r\n * @param rootUrl defines the url where the file to load is located\r\n * @param scene defines the current scene\r\n * @param lodScale defines scale to apply to the mip map selection\r\n * @param lodOffset defines offset to apply to the mip map selection\r\n * @param onLoad defines an optional callback raised when the texture is loaded\r\n * @param onError defines an optional callback raised if there is an issue to load the texture\r\n * @param format defines the format of the data\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param createPolynomials defines wheter or not to create polynomails harmonics for the texture\r\n * @returns the cube texture as an InternalTexture\r\n */\r\nThinEngine.prototype.createPrefilteredCubeTexture = function (\r\n rootUrl: string,\r\n scene: Nullable<Scene>,\r\n lodScale: number,\r\n lodOffset: number,\r\n onLoad: Nullable<(internalTexture: Nullable<InternalTexture>) => void> = null,\r\n onError: Nullable<(message?: string, exception?: any) => void> = null,\r\n format?: number,\r\n forcedExtension: any = null,\r\n createPolynomials: boolean = true\r\n): InternalTexture {\r\n const callback = (loadData: any) => {\r\n if (!loadData) {\r\n if (onLoad) {\r\n onLoad(null);\r\n }\r\n return;\r\n }\r\n\r\n const texture = loadData.texture as InternalTexture;\r\n if (!createPolynomials) {\r\n texture._sphericalPolynomial = new SphericalPolynomial();\r\n } else if (loadData.info.sphericalPolynomial) {\r\n texture._sphericalPolynomial = loadData.info.sphericalPolynomial;\r\n }\r\n texture._source = InternalTextureSource.CubePrefiltered;\r\n\r\n if (this.getCaps().textureLOD) {\r\n // Do not add extra process if texture lod is supported.\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n return;\r\n }\r\n\r\n const mipSlices = 3;\r\n\r\n const gl = this._gl;\r\n const width = loadData.width;\r\n if (!width) {\r\n return;\r\n }\r\n\r\n const textures: BaseTexture[] = [];\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 = lodOffset; // roughness = 0\r\n const maxLODIndex = Scalar.Log2(width) * lodScale + lodOffset; // roughness = 1\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(this, InternalTextureSource.Temp);\r\n glTextureFromLod.type = texture.type;\r\n glTextureFromLod.format = texture.format;\r\n glTextureFromLod.width = Math.pow(2, Math.max(Scalar.Log2(width) - mipmapIndex, 0));\r\n glTextureFromLod.height = glTextureFromLod.width;\r\n glTextureFromLod.isCube = true;\r\n glTextureFromLod._cachedWrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n glTextureFromLod._cachedWrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, glTextureFromLod, true);\r\n\r\n glTextureFromLod.samplingMode = Constants.TEXTURE_LINEAR_LINEAR;\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n if (loadData.isDDS) {\r\n const info: DDSInfo = loadData.info;\r\n const data: any = loadData.data;\r\n this._unpackFlipY(info.isCompressed);\r\n\r\n DDSTools.UploadDDSLevels(this, glTextureFromLod, data, info, true, 6, mipmapIndex);\r\n } else {\r\n Logger.Warn(\"DDS is the only prefiltered cube map supported so far.\");\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);\r\n\r\n // Wrap in a base texture for easy binding.\r\n const lodTexture = new BaseTexture(scene);\r\n lodTexture._isCube = true;\r\n lodTexture._texture = glTextureFromLod;\r\n\r\n glTextureFromLod.isReady = true;\r\n textures.push(lodTexture);\r\n }\r\n\r\n texture._lodTextureHigh = textures[2];\r\n texture._lodTextureMid = textures[1];\r\n texture._lodTextureLow = textures[0];\r\n\r\n if (onLoad) {\r\n onLoad(texture);\r\n }\r\n };\r\n\r\n return this.createCubeTexture(rootUrl, scene, null, false, callback, onError, format, forcedExtension, createPolynomials, lodScale, lodOffset);\r\n};\r\n"]}
1
+ {"version":3,"file":"dds.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/dds.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,iCAAiC,EAAE,MAAM,uDAAuD,CAAC;AAE1G,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,sDAAsD,CAAC;AAC9D,OAAO,0CAA0C,CAAC;AAElD,yFAAyF;AACzF,6CAA6C;AAC7C,yDAAyD;AACzD,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,MAAM,kBAAkB;AACpB,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,4BAA4B;AAC5B,gBAAgB,GAAG,OAAO,CAAC;AAC/B,4BAA4B;AAC5B,wBAAwB;AAExB,6BAA6B;AAC7B,iCAAiC;AACjC,gCAAgC;AAEhC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,sCAAsC;AACtC,sCAAsC;AACtC,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,uCAAuC;AACvC,8BAA8B;AAE9B,MAAM,yBAAyB;AAC3B,mBAAmB;AACnB,WAAW,GAAG,GAAG,EACjB,QAAQ,GAAG,IAAI;AACf,mBAAmB;AACnB,cAAc,GAAG,OAAO,CAAC;AAE7B,SAAS,aAAa,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAChC,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,2BAA2B,GAAG,GAAG,CAAC;AACxC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAExC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AACzC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAC1C,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC,MAAM,eAAe,GAAG,EAAE,CAAC,CAAC,mCAAmC;AAE/D,gCAAgC;AAChC,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,sBAAsB;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,sBAAsB;AACtB,sBAAsB;AACtB,MAAM,cAAc,GAAG,EAAE,CAAC;AAyD1B;;GAEG;AACH,MAAM,OAAO,QAAQ;IAMjB;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,IAAqB;QAC1C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC7E,MAAM,cAAc,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;QAEzF,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,gBAAgB,EAAE;YACtC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;SACtD;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,WAAW,GAAG,SAAS,CAAC,wBAAwB,CAAC;QAErD,QAAQ,MAAM,EAAE;YACZ,KAAK,2BAA2B;gBAC5B,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC;gBAC/C,MAAM;YACV,KAAK,2BAA2B;gBAC5B,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC;gBAC1C,MAAM;YACV,KAAK,WAAW;gBACZ,IAAI,UAAU,KAAK,8BAA8B,EAAE;oBAC/C,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC;oBAC/C,MAAM;iBACT;gBACD,IAAI,UAAU,KAAK,8BAA8B,EAAE;oBAC/C,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC;oBAC1C,MAAM;iBACT;SACR;QAED,OAAO;YACH,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;YACxB,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC;YAC1B,WAAW,EAAE,WAAW;YACxB,QAAQ,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,KAAK,WAAW;YAC7D,KAAK,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,QAAQ;YACpD,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,KAAK,cAAc;YACtE,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,KAAK,gBAAgB;YACnE,YAAY,EAAE,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,WAAW;YACxF,UAAU,EAAE,UAAU;YACtB,WAAW,EAAE,WAAW;SAC3B,CAAC;IACN,CAAC;IAEO,MAAM,CAAC,mCAAmC,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QAC3J,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,SAAS,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBAClD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1D,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1D,IAAI,QAAQ,CAAC,sBAAsB,EAAE;oBACjC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;iBAC9B;qBAAM;oBACH,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC7D;gBACD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,4BAA4B,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QACpJ,IAAI,QAAQ,CAAC,sBAAsB,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACzD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;oBACnC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;oBACnC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;oBACxC,KAAK,IAAI,CAAC,CAAC;iBACd;aACJ;YAED,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAEO,MAAM,CAAC,wBAAwB,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QAChJ,IAAI,QAAQ,CAAC,sBAAsB,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;oBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;oBACnC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;oBACnC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC3C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC3B,KAAK,IAAI,CAAC,CAAC;iBACd;aACJ;YAED,OAAO,SAAS,CAAC;SACpB;QACD,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;IAEO,MAAM,CAAC,mCAAmC,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QAC3J,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,SAAS,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvD,IAAI,QAAQ,CAAC,sBAAsB,EAAE;oBACjC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;iBAC3C;qBAAM;oBACH,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC1D;gBACD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,8BAA8B,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QACtJ,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;gBACvD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC/D,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC/D,IAAI,QAAQ,CAAC,sBAAsB,EAAE;oBACjC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;iBAC9B;qBAAM;oBACH,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;iBAClE;gBACD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,kCAAkC,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB,EAAE,GAAW;QAC1J,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACtE,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC9E,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC9E,IAAI,QAAQ,CAAC,sBAAsB,EAAE;oBACjC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;iBAC9B;qBAAM;oBACH,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;iBACjF;gBACD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,mBAAmB,CAC9B,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,UAAkB,EAClB,WAAwB,EACxB,OAAe,EACf,OAAe,EACf,OAAe,EACf,OAAe;QAEf,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEnC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBAC7C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBACjD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBACjD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,KAAa;QAC9C,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE;YACrD,OAAO,CAAC,CAAC;SACZ;QAED,OAAO,CAAC,GAAG,QAAQ,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAC7B,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,UAAkB,EAClB,WAAwB,EACxB,OAAe,EACf,OAAe,EACf,OAAe;QAEf,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEnC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBAC7C,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBACjD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;gBACjD,KAAK,IAAI,CAAC,CAAC;aACd;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,wBAAwB,CAAC,KAAa,EAAE,MAAc,EAAE,UAAkB,EAAE,UAAkB,EAAE,WAAwB;QACnI,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC7B,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,KAAK,EAAE,CAAC;aACX;SACJ;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,eAAe,CACzB,MAAsB,EACtB,OAAwB,EACxB,IAAqB,EACrB,IAAa,EACb,WAAoB,EACpB,KAAa,EACb,QAAQ,GAAG,CAAC,CAAC,EACb,WAAoB,EACpB,wBAAwB,GAAG,IAAI;QAE/B,IAAI,wBAAwB,GAAqC,IAAI,CAAC;QACtE,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC1B,wBAAwB,GAAG,EAAuB,CAAC;SACtD;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;QAEpC,0HAA0H;QAC1H,OAAO,CAAC,eAAe,GAAG,WAAW,CAAC;QAEtC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC7E,IAAI,MAAc,EACd,KAAa,EACb,MAAc,EACd,UAAU,GAAW,CAAC,EACtB,UAAkB,CAAC;QACvB,IAAI,SAAqB,EAAE,WAAmB,EAAE,GAAW,CAAC;QAC5D,IAAI,wBAAwB,GAAG,CAAC,CAAC;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;YACjC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACnD,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACpD,MAAM,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;YACjF,OAAO;SACV;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;SACV;QAED,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7B,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9B,QAAQ,MAAM,EAAE;gBACZ,KAAK,WAAW;oBACZ,UAAU,GAAG,CAAC,CAAC;oBACf,wBAAwB,GAAG,SAAS,CAAC,uCAAuC,CAAC;oBAC7E,MAAM;gBACV,KAAK,WAAW;oBACZ,UAAU,GAAG,EAAE,CAAC;oBAChB,wBAAwB,GAAG,SAAS,CAAC,uCAAuC,CAAC;oBAC7E,MAAM;gBACV,KAAK,WAAW;oBACZ,UAAU,GAAG,EAAE,CAAC;oBAChB,wBAAwB,GAAG,SAAS,CAAC,uCAAuC,CAAC;oBAC7E,MAAM;gBACV,KAAK,2BAA2B;oBAC5B,cAAc,GAAG,IAAI,CAAC;oBACtB,GAAG,GAAG,EAAE,CAAC;oBACT,MAAM;gBACV,KAAK,2BAA2B;oBAC5B,cAAc,GAAG,IAAI,CAAC;oBACtB,GAAG,GAAG,GAAG,CAAC;oBACV,MAAM;gBACV,KAAK,WAAW,CAAC,CAAC;oBACd,kEAAkE;oBAClE,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;oBAE/B,IAAI,SAAS,GAAG,KAAK,CAAC;oBACtB,QAAQ,IAAI,CAAC,UAAU,EAAE;wBACrB,KAAK,8BAA8B;4BAC/B,cAAc,GAAG,IAAI,CAAC;4BACtB,GAAG,GAAG,EAAE,CAAC;4BACT,SAAS,GAAG,IAAI,CAAC;4BACjB,MAAM;wBACV,KAAK,8BAA8B;4BAC/B,cAAc,GAAG,IAAI,CAAC;4BACtB,GAAG,GAAG,GAAG,CAAC;4BACV,SAAS,GAAG,IAAI,CAAC;4BACjB,MAAM;wBACV,KAAK,0BAA0B;4BAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;4BAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;4BACtB,GAAG,GAAG,EAAE,CAAC;4BACT,SAAS,GAAG,IAAI,CAAC;4BACjB,MAAM;qBACb;oBAED,IAAI,SAAS,EAAE;wBACX,MAAM;qBACT;iBACJ;gBACD,0CAA0C;gBAC1C;oBACI,MAAM,CAAC,KAAK,CAAC,CAAC,0BAA0B,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAClE,OAAO;aACd;SACJ;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAElE,IAAI,cAAc,EAAE;YAChB,wBAAwB,GAAG,MAAM,CAAC,iCAAiC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACzF;QAED,WAAW,GAAG,CAAC,CAAC;QAChB,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,gBAAgB,IAAI,WAAW,KAAK,KAAK,EAAE;YAC/D,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;SACtD;QAED,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7C,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YAE5B,KAAK,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,WAAW,EAAE,EAAE,GAAG,EAAE;gBACpC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE;oBACrC,uEAAuE;oBACvE,MAAM,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEpC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE;wBACrC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC;wBAC9C,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;wBAChC,IAAI,UAAU,GAA8B,IAAI,CAAC;wBAEjD,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;4BACzF,4EAA4E;4BAC5E,IAAI,GAAG,KAAK,GAAG,EAAE;gCACb,UAAU,GAAG,QAAQ,CAAC,8BAA8B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gCAC9H,IAAI,wBAAwB,IAAI,CAAC,IAAI,CAAC,EAAE;oCACpC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;iCAC7I;6BACJ;iCAAM,IAAI,GAAG,KAAK,EAAE,EAAE;gCACnB,UAAU,GAAG,QAAQ,CAAC,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gCAClI,IAAI,wBAAwB,IAAI,CAAC,IAAI,CAAC,EAAE;oCACpC,wBAAwB,CAAC,IAAI,CACzB,QAAQ,CAAC,mCAAmC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CACxH,CAAC;iCACL;6BACJ;4BAED,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,wBAAwB,CAAC;yBACrD;6BAAM;4BACH,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,wBAAwB,IAAI,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;4BAC1I,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,wBAAwB,IAAI,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;4BAEtJ,MAAM,QAAQ,GACV,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,cAAc;gCAClE,CAAC,CAAC,SAAS,CAAC,iBAAiB;gCAC7B,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,kBAAkB;oCACtE,CAAC,CAAC,SAAS,CAAC,sBAAsB;oCAClC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC;4BAEhD,IAAI,UAA6I,CAAC;4BAClJ,IAAI,oBAAoB,GAEpB,IAAI,CAAC;4BAET,QAAQ,GAAG,EAAE;gCACT,KAAK,GAAG,CAAC,CAAC;oCACN,QAAQ,QAAQ,EAAE;wCACd,KAAK,SAAS,CAAC,iBAAiB;4CAC5B,UAAU,GAAG,QAAQ,CAAC,wBAAwB,CAAC;4CAC/C,oBAAoB,GAAG,IAAI,CAAC;4CAC5B,MAAM;wCACV,KAAK,SAAS,CAAC,sBAAsB;4CACjC,UAAU,GAAG,QAAQ,CAAC,mCAAmC,CAAC;4CAC1D,oBAAoB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;4CACzD,MAAM;wCACV,KAAK,SAAS,CAAC,yBAAyB;4CACpC,UAAU,GAAG,QAAQ,CAAC,8BAA8B,CAAC;4CACrD,oBAAoB,GAAG,QAAQ,CAAC,wBAAwB,CAAC;4CACzD,MAAM;qCACb;oCACD,MAAM;iCACT;gCACD,OAAO,CAAC,CAAC;oCACL,SAAS;oCACT,QAAQ,QAAQ,EAAE;wCACd,KAAK,SAAS,CAAC,iBAAiB;4CAC5B,UAAU,GAAG,QAAQ,CAAC,mCAAmC,CAAC;4CAC1D,oBAAoB,GAAG,IAAI,CAAC;4CAC5B,MAAM;wCACV,KAAK,SAAS,CAAC,sBAAsB;4CACjC,UAAU,GAAG,QAAQ,CAAC,4BAA4B,CAAC;4CACnD,oBAAoB,GAAG,QAAQ,CAAC,mCAAmC,CAAC;4CACpE,MAAM;wCACV,KAAK,SAAS,CAAC,yBAAyB;4CACpC,UAAU,GAAG,QAAQ,CAAC,kCAAkC,CAAC;4CACzD,oBAAoB,GAAG,QAAQ,CAAC,mCAAmC,CAAC;4CACpE,MAAM;qCACb;oCACD,MAAM;iCACT;6BACJ;4BAED,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;4BAExB,UAAU,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;4BAEjG,IAAI,wBAAwB,IAAI,CAAC,IAAI,CAAC,EAAE;gCACpC,wBAAwB,CAAC,IAAI,CACzB,oBAAoB,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CACpI,CAAC;6BACL;yBACJ;wBAED,IAAI,UAAU,EAAE;4BACZ,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;yBACrE;qBACJ;yBAAM,IAAI,IAAI,CAAC,KAAK,EAAE;wBACnB,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,wBAAwB,CAAC;wBAClD,IAAI,GAAG,KAAK,EAAE,EAAE;4BACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,iBAAiB,CAAC;4BAC7C,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;4BAChC,SAAS,GAAG,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;4BACzI,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;yBACpE;6BAAM;4BACH,KAAK;4BACL,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC;4BAC9C,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;4BAChC,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;4BACnJ,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;yBACpE;qBACJ;yBAAM,IAAI,IAAI,CAAC,WAAW,EAAE;wBACzB,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;wBACtD,MAAM,eAAe,GAAG,KAAK,CAAC;wBAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,eAAe,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC;wBACpG,UAAU,GAAG,aAAa,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;wBAE5D,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;wBACpH,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,uBAAuB,CAAC;wBACnD,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,wBAAwB,CAAC;wBAElD,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;qBACpE;yBAAM;wBACH,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;wBACjF,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,UAAU,EAAE,UAAU,CAAC,CAAC;wBAElF,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,wBAAwB,CAAC;wBAClD,MAAM,CAAC,sCAAsC,CAAC,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;qBACvH;iBACJ;gBACD,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC5D,KAAK,IAAI,GAAG,CAAC;gBACb,MAAM,IAAI,GAAG,CAAC;gBAEd,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;aAClC;YAED,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC3B,wBAAwB;gBACxB,MAAM;aACT;SACJ;QACD,IAAI,wBAAwB,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAAE;YACjE,IAAI,CAAC,mBAAmB,GAAG,iCAAiC,CAAC,mCAAmC,CAAC;gBAC7F,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;gBACvB,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBAClC,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBACjC,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBAC/B,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBACjC,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBAClC,IAAI,EAAE,wBAAwB,CAAC,CAAC,CAAC;gBACjC,MAAM,EAAE,SAAS,CAAC,kBAAkB;gBACpC,IAAI,EAAE,SAAS,CAAC,iBAAiB;gBACjC,UAAU,EAAE,KAAK;aACpB,CAAC,CAAC;SACN;aAAM;YACH,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;SACxC;IACL,CAAC;;AAziBD;;GAEG;AACW,+BAAsB,GAAG,KAAK,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { SphericalPolynomial } from \"../Maths/sphericalPolynomial\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { CubeMapToSphericalPolynomialTools } from \"../Misc/HighDynamicRange/cubemapToSphericalPolynomial\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\nimport { FromHalfFloat, ToHalfFloat } from \"./textureTools\";\r\n\r\nimport \"../Engines/AbstractEngine/abstractEngine.cubeTexture\";\r\nimport \"../Engines/Extensions/engine.cubeTexture\";\r\n\r\n// Based on demo done by Brandon Jones - http://media.tojicode.com/webgl-samples/dds.html\r\n// All values and structures referenced from:\r\n// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\r\nconst DDS_MAGIC = 0x20534444;\r\n\r\nconst //DDSD_CAPS = 0x1,\r\n //DDSD_HEIGHT = 0x2,\r\n //DDSD_WIDTH = 0x4,\r\n //DDSD_PITCH = 0x8,\r\n //DDSD_PIXELFORMAT = 0x1000,\r\n DDSD_MIPMAPCOUNT = 0x20000;\r\n//DDSD_LINEARSIZE = 0x80000,\r\n//DDSD_DEPTH = 0x800000;\r\n\r\n// var DDSCAPS_COMPLEX = 0x8,\r\n// DDSCAPS_MIPMAP = 0x400000,\r\n// DDSCAPS_TEXTURE = 0x1000;\r\n\r\nconst DDSCAPS2_CUBEMAP = 0x200;\r\n// DDSCAPS2_CUBEMAP_POSITIVEX = 0x400,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,\r\n// DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,\r\n// DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,\r\n// DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,\r\n// DDSCAPS2_VOLUME = 0x200000;\r\n\r\nconst //DDPF_ALPHAPIXELS = 0x1,\r\n //DDPF_ALPHA = 0x2,\r\n DDPF_FOURCC = 0x4,\r\n DDPF_RGB = 0x40,\r\n //DDPF_YUV = 0x200,\r\n DDPF_LUMINANCE = 0x20000;\r\n\r\nfunction FourCCToInt32(value: string) {\r\n return value.charCodeAt(0) + (value.charCodeAt(1) << 8) + (value.charCodeAt(2) << 16) + (value.charCodeAt(3) << 24);\r\n}\r\n\r\nfunction Int32ToFourCC(value: number) {\r\n return String.fromCharCode(value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >> 24) & 0xff);\r\n}\r\n\r\nconst FOURCC_DXT1 = FourCCToInt32(\"DXT1\");\r\nconst FOURCC_DXT3 = FourCCToInt32(\"DXT3\");\r\nconst FOURCC_DXT5 = FourCCToInt32(\"DXT5\");\r\nconst FOURCC_DX10 = FourCCToInt32(\"DX10\");\r\nconst FOURCC_D3DFMT_R16G16B16A16F = 113;\r\nconst FOURCC_D3DFMT_R32G32B32A32F = 116;\r\n\r\nconst DXGI_FORMAT_R32G32B32A32_FLOAT = 2;\r\nconst DXGI_FORMAT_R16G16B16A16_FLOAT = 10;\r\nconst DXGI_FORMAT_B8G8R8X8_UNORM = 88;\r\n\r\nconst headerLengthInt = 31; // The header length in 32 bit ints\r\n\r\n// Offsets into the header array\r\nconst off_magic = 0;\r\n\r\nconst off_size = 1;\r\nconst off_flags = 2;\r\nconst off_height = 3;\r\nconst off_width = 4;\r\n\r\nconst off_mipmapCount = 7;\r\n\r\nconst off_pfFlags = 20;\r\nconst off_pfFourCC = 21;\r\nconst off_RGBbpp = 22;\r\nconst off_RMask = 23;\r\nconst off_GMask = 24;\r\nconst off_BMask = 25;\r\nconst off_AMask = 26;\r\n// var off_caps1 = 27;\r\nconst off_caps2 = 28;\r\n// var off_caps3 = 29;\r\n// var off_caps4 = 30;\r\nconst off_dxgiFormat = 32;\r\n\r\n/**\r\n * Direct draw surface info\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dx-graphics-dds-pguide\r\n */\r\nexport interface DDSInfo {\r\n /**\r\n * Width of the texture\r\n */\r\n width: number;\r\n /**\r\n * Width of the texture\r\n */\r\n height: number;\r\n /**\r\n * Number of Mipmaps for the texture\r\n * @see https://en.wikipedia.org/wiki/Mipmap\r\n */\r\n mipmapCount: number;\r\n /**\r\n * If the textures format is a known fourCC format\r\n * @see https://www.fourcc.org/\r\n */\r\n isFourCC: boolean;\r\n /**\r\n * If the texture is an RGB format eg. DXGI_FORMAT_B8G8R8X8_UNORM format\r\n */\r\n isRGB: boolean;\r\n /**\r\n * If the texture is a lumincance format\r\n */\r\n isLuminance: boolean;\r\n /**\r\n * If this is a cube texture\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dds-file-layout-for-cubic-environment-maps\r\n */\r\n isCube: boolean;\r\n /**\r\n * If the texture is a compressed format eg. FOURCC_DXT1\r\n */\r\n isCompressed: boolean;\r\n /**\r\n * The dxgiFormat of the texture\r\n * @see https://docs.microsoft.com/en-us/windows/desktop/api/dxgiformat/ne-dxgiformat-dxgi_format\r\n */\r\n dxgiFormat: number;\r\n /**\r\n * Texture type eg. Engine.TEXTURETYPE_UNSIGNED_INT, Engine.TEXTURETYPE_FLOAT\r\n */\r\n textureType: number;\r\n /**\r\n * Sphericle polynomial created for the dds texture\r\n */\r\n sphericalPolynomial?: SphericalPolynomial;\r\n}\r\n\r\n/**\r\n * Class used to provide DDS decompression tools\r\n */\r\nexport class DDSTools {\r\n /**\r\n * Gets or sets a boolean indicating that LOD info is stored in alpha channel (false by default)\r\n */\r\n public static StoreLODInAlphaChannel = false;\r\n\r\n /**\r\n * Gets DDS information from an array buffer\r\n * @param data defines the array buffer view to read data from\r\n * @returns the DDS information\r\n */\r\n public static GetDDSInfo(data: ArrayBufferView): DDSInfo {\r\n const header = new Int32Array(data.buffer, data.byteOffset, headerLengthInt);\r\n const extendedHeader = new Int32Array(data.buffer, data.byteOffset, headerLengthInt + 4);\r\n\r\n let mipmapCount = 1;\r\n if (header[off_flags] & DDSD_MIPMAPCOUNT) {\r\n mipmapCount = Math.max(1, header[off_mipmapCount]);\r\n }\r\n\r\n const fourCC = header[off_pfFourCC];\r\n const dxgiFormat = fourCC === FOURCC_DX10 ? extendedHeader[off_dxgiFormat] : 0;\r\n let textureType = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n\r\n switch (fourCC) {\r\n case FOURCC_D3DFMT_R16G16B16A16F:\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n break;\r\n case FOURCC_D3DFMT_R32G32B32A32F:\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n break;\r\n case FOURCC_DX10:\r\n if (dxgiFormat === DXGI_FORMAT_R16G16B16A16_FLOAT) {\r\n textureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n break;\r\n }\r\n if (dxgiFormat === DXGI_FORMAT_R32G32B32A32_FLOAT) {\r\n textureType = Constants.TEXTURETYPE_FLOAT;\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n width: header[off_width],\r\n height: header[off_height],\r\n mipmapCount: mipmapCount,\r\n isFourCC: (header[off_pfFlags] & DDPF_FOURCC) === DDPF_FOURCC,\r\n isRGB: (header[off_pfFlags] & DDPF_RGB) === DDPF_RGB,\r\n isLuminance: (header[off_pfFlags] & DDPF_LUMINANCE) === DDPF_LUMINANCE,\r\n isCube: (header[off_caps2] & DDSCAPS2_CUBEMAP) === DDSCAPS2_CUBEMAP,\r\n isCompressed: fourCC === FOURCC_DXT1 || fourCC === FOURCC_DXT3 || fourCC === FOURCC_DXT5,\r\n dxgiFormat: dxgiFormat,\r\n textureType: textureType,\r\n };\r\n }\r\n\r\n private static _GetHalfFloatAsFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Float32Array {\r\n const destArray = new Float32Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = FromHalfFloat(srcData[srcPos]);\r\n destArray[index + 1] = FromHalfFloat(srcData[srcPos + 1]);\r\n destArray[index + 2] = FromHalfFloat(srcData[srcPos + 2]);\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = FromHalfFloat(srcData[srcPos + 3]);\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetHalfFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint16Array {\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n const destArray = new Uint16Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = srcData[srcPos];\r\n destArray[index + 1] = srcData[srcPos + 1];\r\n destArray[index + 2] = srcData[srcPos + 2];\r\n destArray[index + 3] = ToHalfFloat(lod);\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n return new Uint16Array(arrayBuffer, dataOffset, dataLength);\r\n }\r\n\r\n private static _GetFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Float32Array {\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n const destArray = new Float32Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = srcData[srcPos];\r\n destArray[index + 1] = srcData[srcPos + 1];\r\n destArray[index + 2] = srcData[srcPos + 2];\r\n destArray[index + 3] = lod;\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n return new Float32Array(arrayBuffer, dataOffset, dataLength);\r\n }\r\n\r\n private static _GetFloatAsHalfFloatRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint16Array {\r\n const destArray = new Uint16Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n destArray[index] = ToHalfFloat(srcData[index]);\r\n destArray[index + 1] = ToHalfFloat(srcData[index + 1]);\r\n destArray[index + 2] = ToHalfFloat(srcData[index + 2]);\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = ToHalfFloat(lod);\r\n } else {\r\n destArray[index + 3] = ToHalfFloat(srcData[index + 3]);\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetFloatAsUIntRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint8Array {\r\n const destArray = new Uint8Array(dataLength);\r\n const srcData = new Float32Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = Scalar.Clamp(srcData[srcPos]) * 255;\r\n destArray[index + 1] = Scalar.Clamp(srcData[srcPos + 1]) * 255;\r\n destArray[index + 2] = Scalar.Clamp(srcData[srcPos + 2]) * 255;\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = Scalar.Clamp(srcData[srcPos + 3]) * 255;\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetHalfFloatAsUIntRGBAArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number): Uint8Array {\r\n const destArray = new Uint8Array(dataLength);\r\n const srcData = new Uint16Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n destArray[index] = Scalar.Clamp(FromHalfFloat(srcData[srcPos])) * 255;\r\n destArray[index + 1] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 1])) * 255;\r\n destArray[index + 2] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 2])) * 255;\r\n if (DDSTools.StoreLODInAlphaChannel) {\r\n destArray[index + 3] = lod;\r\n } else {\r\n destArray[index + 3] = Scalar.Clamp(FromHalfFloat(srcData[srcPos + 3])) * 255;\r\n }\r\n index += 4;\r\n }\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n private static _GetRGBAArrayBuffer(\r\n width: number,\r\n height: number,\r\n dataOffset: number,\r\n dataLength: number,\r\n arrayBuffer: ArrayBuffer,\r\n rOffset: number,\r\n gOffset: number,\r\n bOffset: number,\r\n aOffset: number\r\n ): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 4;\r\n\r\n byteArray[index] = srcData[srcPos + rOffset];\r\n byteArray[index + 1] = srcData[srcPos + gOffset];\r\n byteArray[index + 2] = srcData[srcPos + bOffset];\r\n byteArray[index + 3] = srcData[srcPos + aOffset];\r\n index += 4;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n private static _ExtractLongWordOrder(value: number): number {\r\n if (value === 0 || value === 255 || value === -16777216) {\r\n return 0;\r\n }\r\n\r\n return 1 + DDSTools._ExtractLongWordOrder(value >> 8);\r\n }\r\n\r\n private static _GetRGBArrayBuffer(\r\n width: number,\r\n height: number,\r\n dataOffset: number,\r\n dataLength: number,\r\n arrayBuffer: ArrayBuffer,\r\n rOffset: number,\r\n gOffset: number,\r\n bOffset: number\r\n ): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = (x + y * width) * 3;\r\n\r\n byteArray[index] = srcData[srcPos + rOffset];\r\n byteArray[index + 1] = srcData[srcPos + gOffset];\r\n byteArray[index + 2] = srcData[srcPos + bOffset];\r\n index += 3;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n private static _GetLuminanceArrayBuffer(width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer): Uint8Array {\r\n const byteArray = new Uint8Array(dataLength);\r\n const srcData = new Uint8Array(arrayBuffer, dataOffset);\r\n let index = 0;\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcPos = x + y * width;\r\n byteArray[index] = srcData[srcPos];\r\n index++;\r\n }\r\n }\r\n\r\n return byteArray;\r\n }\r\n\r\n /**\r\n * Uploads DDS Levels to a Babylon Texture\r\n * @internal\r\n */\r\n public static UploadDDSLevels(\r\n engine: AbstractEngine,\r\n texture: InternalTexture,\r\n data: ArrayBufferView,\r\n info: DDSInfo,\r\n loadMipmaps: boolean,\r\n faces: number,\r\n lodIndex = -1,\r\n currentFace?: number,\r\n destTypeMustBeFilterable = true\r\n ) {\r\n let sphericalPolynomialFaces: Nullable<Array<ArrayBufferView>> = null;\r\n if (info.sphericalPolynomial) {\r\n sphericalPolynomialFaces = [] as ArrayBufferView[];\r\n }\r\n const ext = !!engine.getCaps().s3tc;\r\n\r\n // TODO WEBGPU Once generateMipMaps is split into generateMipMaps + hasMipMaps in InternalTexture this line can be removed\r\n texture.generateMipMaps = loadMipmaps;\r\n\r\n const header = new Int32Array(data.buffer, data.byteOffset, headerLengthInt);\r\n let fourCC: number,\r\n width: number,\r\n height: number,\r\n dataLength: number = 0,\r\n dataOffset: number;\r\n let byteArray: Uint8Array, mipmapCount: number, mip: number;\r\n let internalCompressedFormat = 0;\r\n let blockBytes = 1;\r\n\r\n if (header[off_magic] !== DDS_MAGIC) {\r\n Logger.Error(\"Invalid magic number in DDS header\");\r\n return;\r\n }\r\n\r\n if (!info.isFourCC && !info.isRGB && !info.isLuminance) {\r\n Logger.Error(\"Unsupported format, must contain a FourCC, RGB or LUMINANCE code\");\r\n return;\r\n }\r\n\r\n if (info.isCompressed && !ext) {\r\n Logger.Error(\"Compressed textures are not supported on this platform.\");\r\n return;\r\n }\r\n\r\n let bpp = header[off_RGBbpp];\r\n dataOffset = header[off_size] + 4;\r\n\r\n let computeFormats = false;\r\n\r\n if (info.isFourCC) {\r\n fourCC = header[off_pfFourCC];\r\n switch (fourCC) {\r\n case FOURCC_DXT1:\r\n blockBytes = 8;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT1;\r\n break;\r\n case FOURCC_DXT3:\r\n blockBytes = 16;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT3;\r\n break;\r\n case FOURCC_DXT5:\r\n blockBytes = 16;\r\n internalCompressedFormat = Constants.TEXTUREFORMAT_COMPRESSED_RGBA_S3TC_DXT5;\r\n break;\r\n case FOURCC_D3DFMT_R16G16B16A16F:\r\n computeFormats = true;\r\n bpp = 64;\r\n break;\r\n case FOURCC_D3DFMT_R32G32B32A32F:\r\n computeFormats = true;\r\n bpp = 128;\r\n break;\r\n case FOURCC_DX10: {\r\n // There is an additionnal header so dataOffset need to be changed\r\n dataOffset += 5 * 4; // 5 uints\r\n\r\n let supported = false;\r\n switch (info.dxgiFormat) {\r\n case DXGI_FORMAT_R16G16B16A16_FLOAT:\r\n computeFormats = true;\r\n bpp = 64;\r\n supported = true;\r\n break;\r\n case DXGI_FORMAT_R32G32B32A32_FLOAT:\r\n computeFormats = true;\r\n bpp = 128;\r\n supported = true;\r\n break;\r\n case DXGI_FORMAT_B8G8R8X8_UNORM:\r\n info.isRGB = true;\r\n info.isFourCC = false;\r\n bpp = 32;\r\n supported = true;\r\n break;\r\n }\r\n\r\n if (supported) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n default:\r\n Logger.Error([\"Unsupported FourCC code:\", Int32ToFourCC(fourCC)]);\r\n return;\r\n }\r\n }\r\n\r\n const rOffset = DDSTools._ExtractLongWordOrder(header[off_RMask]);\r\n const gOffset = DDSTools._ExtractLongWordOrder(header[off_GMask]);\r\n const bOffset = DDSTools._ExtractLongWordOrder(header[off_BMask]);\r\n const aOffset = DDSTools._ExtractLongWordOrder(header[off_AMask]);\r\n\r\n if (computeFormats) {\r\n internalCompressedFormat = engine._getRGBABufferInternalSizedFormat(info.textureType);\r\n }\r\n\r\n mipmapCount = 1;\r\n if (header[off_flags] & DDSD_MIPMAPCOUNT && loadMipmaps !== false) {\r\n mipmapCount = Math.max(1, header[off_mipmapCount]);\r\n }\r\n\r\n const startFace = currentFace || 0;\r\n const caps = engine.getCaps();\r\n for (let face = startFace; face < faces; face++) {\r\n width = header[off_width];\r\n height = header[off_height];\r\n\r\n for (mip = 0; mip < mipmapCount; ++mip) {\r\n if (lodIndex === -1 || lodIndex === mip) {\r\n // In case of fixed LOD, if the lod has just been uploaded, early exit.\r\n const i = lodIndex === -1 ? mip : 0;\r\n\r\n if (!info.isCompressed && info.isFourCC) {\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n dataLength = width * height * 4;\r\n let floatArray: Nullable<ArrayBufferView> = null;\r\n\r\n if (engine._badOS || engine._badDesktopOS || (!caps.textureHalfFloat && !caps.textureFloat)) {\r\n // Required because iOS has many issues with float and half float generation\r\n if (bpp === 128) {\r\n floatArray = DDSTools._GetFloatAsUIntRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(DDSTools._GetFloatRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i));\r\n }\r\n } else if (bpp === 64) {\r\n floatArray = DDSTools._GetHalfFloatAsUIntRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(\r\n DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i)\r\n );\r\n }\r\n }\r\n\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n } else {\r\n const floatAvailable = caps.textureFloat && ((destTypeMustBeFilterable && caps.textureFloatLinearFiltering) || !destTypeMustBeFilterable);\r\n const halfFloatAvailable = caps.textureHalfFloat && ((destTypeMustBeFilterable && caps.textureHalfFloatLinearFiltering) || !destTypeMustBeFilterable);\r\n\r\n const destType =\r\n (bpp === 128 || (bpp === 64 && !halfFloatAvailable)) && floatAvailable\r\n ? Constants.TEXTURETYPE_FLOAT\r\n : (bpp === 64 || (bpp === 128 && !floatAvailable)) && halfFloatAvailable\r\n ? Constants.TEXTURETYPE_HALF_FLOAT\r\n : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n\r\n let dataGetter: (width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number) => ArrayBufferView;\r\n let dataGetterPolynomial: Nullable<\r\n (width: number, height: number, dataOffset: number, dataLength: number, arrayBuffer: ArrayBuffer, lod: number) => ArrayBufferView\r\n > = null;\r\n\r\n switch (bpp) {\r\n case 128: {\r\n switch (destType) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n dataGetter = DDSTools._GetFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = null;\r\n break;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n dataGetter = DDSTools._GetFloatAsHalfFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetFloatRGBAArrayBuffer;\r\n break;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n dataGetter = DDSTools._GetFloatAsUIntRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetFloatRGBAArrayBuffer;\r\n break;\r\n }\r\n break;\r\n }\r\n default: {\r\n // 64 bpp\r\n switch (destType) {\r\n case Constants.TEXTURETYPE_FLOAT:\r\n dataGetter = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = null;\r\n break;\r\n case Constants.TEXTURETYPE_HALF_FLOAT:\r\n dataGetter = DDSTools._GetHalfFloatRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n break;\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE:\r\n dataGetter = DDSTools._GetHalfFloatAsUIntRGBAArrayBuffer;\r\n dataGetterPolynomial = DDSTools._GetHalfFloatAsFloatRGBAArrayBuffer;\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n texture.type = destType;\r\n\r\n floatArray = dataGetter(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i);\r\n\r\n if (sphericalPolynomialFaces && i == 0) {\r\n sphericalPolynomialFaces.push(\r\n dataGetterPolynomial ? dataGetterPolynomial(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, i) : floatArray\r\n );\r\n }\r\n }\r\n\r\n if (floatArray) {\r\n engine._uploadDataToTextureDirectly(texture, floatArray, face, i);\r\n }\r\n } else if (info.isRGB) {\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n if (bpp === 24) {\r\n texture.format = Constants.TEXTUREFORMAT_RGB;\r\n dataLength = width * height * 3;\r\n byteArray = DDSTools._GetRGBArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, rOffset, gOffset, bOffset);\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n } else {\r\n // 32\r\n texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n dataLength = width * height * 4;\r\n byteArray = DDSTools._GetRGBAArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer, rOffset, gOffset, bOffset, aOffset);\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n }\r\n } else if (info.isLuminance) {\r\n const unpackAlignment = engine._getUnpackAlignement();\r\n const unpaddedRowSize = width;\r\n const paddedRowSize = Math.floor((width + unpackAlignment - 1) / unpackAlignment) * unpackAlignment;\r\n dataLength = paddedRowSize * (height - 1) + unpaddedRowSize;\r\n\r\n byteArray = DDSTools._GetLuminanceArrayBuffer(width, height, data.byteOffset + dataOffset, dataLength, data.buffer);\r\n texture.format = Constants.TEXTUREFORMAT_LUMINANCE;\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n\r\n engine._uploadDataToTextureDirectly(texture, byteArray, face, i);\r\n } else {\r\n dataLength = (((Math.max(4, width) / 4) * Math.max(4, height)) / 4) * blockBytes;\r\n byteArray = new Uint8Array(data.buffer, data.byteOffset + dataOffset, dataLength);\r\n\r\n texture.type = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n engine._uploadCompressedDataToTextureDirectly(texture, internalCompressedFormat, width, height, byteArray, face, i);\r\n }\r\n }\r\n dataOffset += bpp ? width * height * (bpp / 8) : dataLength;\r\n width *= 0.5;\r\n height *= 0.5;\r\n\r\n width = Math.max(1.0, width);\r\n height = Math.max(1.0, height);\r\n }\r\n\r\n if (currentFace !== undefined) {\r\n // Loading a single face\r\n break;\r\n }\r\n }\r\n if (sphericalPolynomialFaces && sphericalPolynomialFaces.length > 0) {\r\n info.sphericalPolynomial = CubeMapToSphericalPolynomialTools.ConvertCubeMapToSphericalPolynomial({\r\n size: header[off_width],\r\n right: sphericalPolynomialFaces[0],\r\n left: sphericalPolynomialFaces[1],\r\n up: sphericalPolynomialFaces[2],\r\n down: sphericalPolynomialFaces[3],\r\n front: sphericalPolynomialFaces[4],\r\n back: sphericalPolynomialFaces[5],\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n type: Constants.TEXTURETYPE_FLOAT,\r\n gammaSpace: false,\r\n });\r\n } else {\r\n info.sphericalPolynomial = undefined;\r\n }\r\n }\r\n}\r\n"]}
@@ -6,6 +6,7 @@ import { Observable } from "./observable";
6
6
  import { PostProcess } from "../PostProcesses/postProcess";
7
7
  import { PostProcessManager } from "../PostProcesses/postProcessManager";
8
8
  import type { AbstractEngine } from "../Engines/abstractEngine";
9
+ import "../Engines/Extensions/engine.readTexture";
9
10
  import "../Shaders/minmaxRedux.fragment";
10
11
  /**
11
12
  * This class computes a min/max reduction from a texture: it means it computes the minimum
@@ -2,6 +2,7 @@
2
2
  import { Observable } from "./observable.js";
3
3
  import { PostProcess } from "../PostProcesses/postProcess.js";
4
4
  import { PostProcessManager } from "../PostProcesses/postProcessManager.js";
5
+ import "../Engines/Extensions/engine.readTexture.js";
5
6
  import "../Shaders/minmaxRedux.fragment.js";
6
7
  /**
7
8
  * This class computes a min/max reduction from a texture: it means it computes the minimum
@@ -1 +1 @@
1
- {"version":3,"file":"minMaxReducer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/minMaxReducer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { PostProcessManager } from \"../PostProcesses/postProcessManager\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Shaders/minmaxRedux.fragment\";\r\n\r\n/**\r\n * This class computes a min/max reduction from a texture: it means it computes the minimum\r\n * and maximum values from all values of the texture.\r\n * It is performed on the GPU for better performances, thanks to a succession of post processes.\r\n * The source values are read from the red channel of the texture.\r\n */\r\nexport class MinMaxReducer {\r\n /**\r\n * Observable triggered when the computation has been performed\r\n */\r\n public onAfterReductionPerformed = new Observable<{ min: number; max: number }>();\r\n\r\n protected _camera: Camera;\r\n protected _sourceTexture: Nullable<RenderTargetTexture>;\r\n protected _reductionSteps: Nullable<Array<PostProcess>>;\r\n protected _postProcessManager: PostProcessManager;\r\n protected _onAfterUnbindObserver: Nullable<Observer<RenderTargetTexture>>;\r\n protected _forceFullscreenViewport = true;\r\n protected _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates a min/max reducer\r\n * @param camera The camera to use for the post processes\r\n */\r\n constructor(camera: Camera) {\r\n this._camera = camera;\r\n this._postProcessManager = new PostProcessManager(camera.getScene());\r\n\r\n this._onContextRestoredObserver = camera.getEngine().onContextRestoredObservable.add(() => {\r\n this._postProcessManager._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Gets the texture used to read the values from.\r\n */\r\n public get sourceTexture(): Nullable<RenderTargetTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the source texture to read the values from.\r\n * One must indicate if the texture is a depth texture or not through the depthRedux parameter\r\n * because in such textures '1' value must not be taken into account to compute the maximum\r\n * as this value is used to clear the texture.\r\n * Note that the computation is not activated by calling this function, you must call activate() for that!\r\n * @param sourceTexture The texture to read the values from. The values should be in the red channel.\r\n * @param depthRedux Indicates if the texture is a depth texture or not\r\n * @param type The type of the textures created for the reduction (defaults to TEXTURETYPE_HALF_FLOAT)\r\n * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)\r\n */\r\n public setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type: number = Constants.TEXTURETYPE_HALF_FLOAT, forceFullscreenViewport = true): void {\r\n if (sourceTexture === this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this.dispose(false);\r\n\r\n this._sourceTexture = sourceTexture;\r\n this._reductionSteps = [];\r\n this._forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n const scene = this._camera.getScene();\r\n\r\n // create the first step\r\n const reductionInitial = new PostProcess(\r\n \"Initial reduction phase\",\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n [\"sourceTexture\"], // textures\r\n 1.0, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define INITIAL\" + (depthRedux ? \"\\n#define DEPTH_REDUX\" : \"\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG\r\n );\r\n\r\n reductionInitial.autoClear = false;\r\n reductionInitial.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n let w = this._sourceTexture.getRenderWidth(),\r\n h = this._sourceTexture.getRenderHeight();\r\n\r\n reductionInitial.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n effect.setTexture(\"sourceTexture\", this._sourceTexture);\r\n effect.setFloat2(\"texSize\", w, h);\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reductionInitial);\r\n\r\n let index = 1;\r\n\r\n // create the additional steps\r\n while (w > 1 || h > 1) {\r\n w = Math.max(Math.round(w / 2), 1);\r\n h = Math.max(Math.round(h / 2), 1);\r\n\r\n const reduction = new PostProcess(\r\n \"Reduction phase \" + index,\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n null,\r\n { width: w, height: h }, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define \" + (w == 1 && h == 1 ? \"LAST\" : w == 1 || h == 1 ? \"ONEBEFORELAST\" : \"MAIN\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG\r\n );\r\n\r\n reduction.autoClear = false;\r\n reduction.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n reduction.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n if (w == 1 || h == 1) {\r\n effect.setInt2(\"texSize\", w, h);\r\n } else {\r\n effect.setFloat2(\"texSize\", w, h);\r\n }\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reduction);\r\n\r\n index++;\r\n\r\n if (w == 1 && h == 1) {\r\n const func = (w: number, h: number, reduction: PostProcess) => {\r\n const buffer = new Float32Array(4 * w * h),\r\n minmax = { min: 0, max: 0 };\r\n return () => {\r\n scene.getEngine()._readTexturePixels(reduction.inputTexture.texture!, w, h, -1, 0, buffer, false);\r\n minmax.min = buffer[0];\r\n minmax.max = buffer[1];\r\n this.onAfterReductionPerformed.notifyObservers(minmax);\r\n };\r\n };\r\n reduction.onAfterRenderObservable.add(func(w, h, reduction));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the computation.\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._sourceTexture ? this._sourceTexture.refreshRate : -1;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n if (this._sourceTexture) {\r\n this._sourceTexture.refreshRate = value;\r\n }\r\n }\r\n\r\n protected _activated = false;\r\n\r\n /**\r\n * Gets the activation status of the reducer\r\n */\r\n public get activated(): boolean {\r\n return this._activated;\r\n }\r\n\r\n /**\r\n * Activates the reduction computation.\r\n * When activated, the observers registered in onAfterReductionPerformed are\r\n * called after the computation is performed\r\n */\r\n public activate(): void {\r\n if (this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._onAfterUnbindObserver = this._sourceTexture.onAfterUnbindObservable.add(() => {\r\n const engine = this._camera.getScene().getEngine();\r\n engine._debugPushGroup?.(`min max reduction`, 1);\r\n this._reductionSteps![0].activate(this._camera);\r\n this._postProcessManager.directRender(this._reductionSteps!, this._reductionSteps![0].inputTexture, this._forceFullscreenViewport);\r\n engine.unBindFramebuffer(this._reductionSteps![0].inputTexture, false);\r\n engine._debugPopGroup?.(1);\r\n });\r\n\r\n this._activated = true;\r\n }\r\n\r\n /**\r\n * Deactivates the reduction computation.\r\n */\r\n public deactivate(): void {\r\n if (!this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._sourceTexture.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n this._onAfterUnbindObserver = null;\r\n this._activated = false;\r\n }\r\n\r\n /**\r\n * Disposes the min/max reducer\r\n * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.\r\n */\r\n public dispose(disposeAll = true): void {\r\n if (disposeAll) {\r\n this.onAfterReductionPerformed.clear();\r\n\r\n if (this._onContextRestoredObserver) {\r\n this._camera.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n\r\n this.deactivate();\r\n\r\n if (this._reductionSteps) {\r\n for (let i = 0; i < this._reductionSteps.length; ++i) {\r\n this._reductionSteps[i].dispose();\r\n }\r\n this._reductionSteps = null;\r\n }\r\n\r\n if (this._postProcessManager && disposeAll) {\r\n this._postProcessManager.dispose();\r\n }\r\n\r\n this._sourceTexture = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"minMaxReducer.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/minMaxReducer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { Observer } from \"./observable\";\r\nimport { Observable } from \"./observable\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { PostProcess } from \"../PostProcesses/postProcess\";\r\nimport { PostProcessManager } from \"../PostProcesses/postProcessManager\";\r\n\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nimport \"../Engines/Extensions/engine.readTexture\";\r\n\r\nimport \"../Shaders/minmaxRedux.fragment\";\r\n\r\n/**\r\n * This class computes a min/max reduction from a texture: it means it computes the minimum\r\n * and maximum values from all values of the texture.\r\n * It is performed on the GPU for better performances, thanks to a succession of post processes.\r\n * The source values are read from the red channel of the texture.\r\n */\r\nexport class MinMaxReducer {\r\n /**\r\n * Observable triggered when the computation has been performed\r\n */\r\n public onAfterReductionPerformed = new Observable<{ min: number; max: number }>();\r\n\r\n protected _camera: Camera;\r\n protected _sourceTexture: Nullable<RenderTargetTexture>;\r\n protected _reductionSteps: Nullable<Array<PostProcess>>;\r\n protected _postProcessManager: PostProcessManager;\r\n protected _onAfterUnbindObserver: Nullable<Observer<RenderTargetTexture>>;\r\n protected _forceFullscreenViewport = true;\r\n protected _onContextRestoredObserver: Nullable<Observer<AbstractEngine>>;\r\n\r\n /**\r\n * Creates a min/max reducer\r\n * @param camera The camera to use for the post processes\r\n */\r\n constructor(camera: Camera) {\r\n this._camera = camera;\r\n this._postProcessManager = new PostProcessManager(camera.getScene());\r\n\r\n this._onContextRestoredObserver = camera.getEngine().onContextRestoredObservable.add(() => {\r\n this._postProcessManager._rebuild();\r\n });\r\n }\r\n\r\n /**\r\n * Gets the texture used to read the values from.\r\n */\r\n public get sourceTexture(): Nullable<RenderTargetTexture> {\r\n return this._sourceTexture;\r\n }\r\n\r\n /**\r\n * Sets the source texture to read the values from.\r\n * One must indicate if the texture is a depth texture or not through the depthRedux parameter\r\n * because in such textures '1' value must not be taken into account to compute the maximum\r\n * as this value is used to clear the texture.\r\n * Note that the computation is not activated by calling this function, you must call activate() for that!\r\n * @param sourceTexture The texture to read the values from. The values should be in the red channel.\r\n * @param depthRedux Indicates if the texture is a depth texture or not\r\n * @param type The type of the textures created for the reduction (defaults to TEXTURETYPE_HALF_FLOAT)\r\n * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)\r\n */\r\n public setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type: number = Constants.TEXTURETYPE_HALF_FLOAT, forceFullscreenViewport = true): void {\r\n if (sourceTexture === this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this.dispose(false);\r\n\r\n this._sourceTexture = sourceTexture;\r\n this._reductionSteps = [];\r\n this._forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n const scene = this._camera.getScene();\r\n\r\n // create the first step\r\n const reductionInitial = new PostProcess(\r\n \"Initial reduction phase\",\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n [\"sourceTexture\"], // textures\r\n 1.0, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define INITIAL\" + (depthRedux ? \"\\n#define DEPTH_REDUX\" : \"\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG\r\n );\r\n\r\n reductionInitial.autoClear = false;\r\n reductionInitial.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n let w = this._sourceTexture.getRenderWidth(),\r\n h = this._sourceTexture.getRenderHeight();\r\n\r\n reductionInitial.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n effect.setTexture(\"sourceTexture\", this._sourceTexture);\r\n effect.setFloat2(\"texSize\", w, h);\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reductionInitial);\r\n\r\n let index = 1;\r\n\r\n // create the additional steps\r\n while (w > 1 || h > 1) {\r\n w = Math.max(Math.round(w / 2), 1);\r\n h = Math.max(Math.round(h / 2), 1);\r\n\r\n const reduction = new PostProcess(\r\n \"Reduction phase \" + index,\r\n \"minmaxRedux\", // shader\r\n [\"texSize\"],\r\n null,\r\n { width: w, height: h }, // options\r\n null, // camera\r\n Constants.TEXTURE_NEAREST_NEAREST, // sampling\r\n scene.getEngine(), // engine\r\n false, // reusable\r\n \"#define \" + (w == 1 && h == 1 ? \"LAST\" : w == 1 || h == 1 ? \"ONEBEFORELAST\" : \"MAIN\"), // defines\r\n type,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_RG\r\n );\r\n\r\n reduction.autoClear = false;\r\n reduction.forceFullscreenViewport = forceFullscreenViewport;\r\n\r\n reduction.onApply = ((w: number, h: number) => {\r\n return (effect: Effect) => {\r\n if (w == 1 || h == 1) {\r\n effect.setInt2(\"texSize\", w, h);\r\n } else {\r\n effect.setFloat2(\"texSize\", w, h);\r\n }\r\n };\r\n })(w, h);\r\n\r\n this._reductionSteps.push(reduction);\r\n\r\n index++;\r\n\r\n if (w == 1 && h == 1) {\r\n const func = (w: number, h: number, reduction: PostProcess) => {\r\n const buffer = new Float32Array(4 * w * h),\r\n minmax = { min: 0, max: 0 };\r\n return () => {\r\n scene.getEngine()._readTexturePixels(reduction.inputTexture.texture!, w, h, -1, 0, buffer, false);\r\n minmax.min = buffer[0];\r\n minmax.max = buffer[1];\r\n this.onAfterReductionPerformed.notifyObservers(minmax);\r\n };\r\n };\r\n reduction.onAfterRenderObservable.add(func(w, h, reduction));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the computation.\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._sourceTexture ? this._sourceTexture.refreshRate : -1;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n if (this._sourceTexture) {\r\n this._sourceTexture.refreshRate = value;\r\n }\r\n }\r\n\r\n protected _activated = false;\r\n\r\n /**\r\n * Gets the activation status of the reducer\r\n */\r\n public get activated(): boolean {\r\n return this._activated;\r\n }\r\n\r\n /**\r\n * Activates the reduction computation.\r\n * When activated, the observers registered in onAfterReductionPerformed are\r\n * called after the computation is performed\r\n */\r\n public activate(): void {\r\n if (this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._onAfterUnbindObserver = this._sourceTexture.onAfterUnbindObservable.add(() => {\r\n const engine = this._camera.getScene().getEngine();\r\n engine._debugPushGroup?.(`min max reduction`, 1);\r\n this._reductionSteps![0].activate(this._camera);\r\n this._postProcessManager.directRender(this._reductionSteps!, this._reductionSteps![0].inputTexture, this._forceFullscreenViewport);\r\n engine.unBindFramebuffer(this._reductionSteps![0].inputTexture, false);\r\n engine._debugPopGroup?.(1);\r\n });\r\n\r\n this._activated = true;\r\n }\r\n\r\n /**\r\n * Deactivates the reduction computation.\r\n */\r\n public deactivate(): void {\r\n if (!this._onAfterUnbindObserver || !this._sourceTexture) {\r\n return;\r\n }\r\n\r\n this._sourceTexture.onAfterUnbindObservable.remove(this._onAfterUnbindObserver);\r\n this._onAfterUnbindObserver = null;\r\n this._activated = false;\r\n }\r\n\r\n /**\r\n * Disposes the min/max reducer\r\n * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.\r\n */\r\n public dispose(disposeAll = true): void {\r\n if (disposeAll) {\r\n this.onAfterReductionPerformed.clear();\r\n\r\n if (this._onContextRestoredObserver) {\r\n this._camera.getEngine().onContextRestoredObservable.remove(this._onContextRestoredObserver);\r\n this._onContextRestoredObserver = null;\r\n }\r\n }\r\n\r\n this.deactivate();\r\n\r\n if (this._reductionSteps) {\r\n for (let i = 0; i < this._reductionSteps.length; ++i) {\r\n this._reductionSteps[i].dispose();\r\n }\r\n this._reductionSteps = null;\r\n }\r\n\r\n if (this._postProcessManager && disposeAll) {\r\n this._postProcessManager.dispose();\r\n }\r\n\r\n this._sourceTexture = null;\r\n }\r\n}\r\n"]}
@@ -2,6 +2,7 @@ import type { Camera } from "../Cameras/camera";
2
2
  import { RenderTargetTexture } from "../Materials/Textures/renderTargetTexture";
3
3
  import type { IScreenshotSize } from "./interfaces/screenshotSize";
4
4
  import type { AbstractEngine } from "../Engines/abstractEngine";
5
+ import "../Engines/Extensions/engine.readTexture";
5
6
  /**
6
7
  * Captures a screenshot of the current rendering
7
8
  * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
@@ -6,6 +6,7 @@ import { Logger } from "./logger.js";
6
6
  import { Tools } from "./tools.js";
7
7
  import { DumpTools } from "./dumpTools.js";
8
8
  import { ApplyPostProcess } from "./textureTools.js";
9
+ import "../Engines/Extensions/engine.readTexture.js";
9
10
  let screenshotCanvas = null;
10
11
  /**
11
12
  * Captures a screenshot of the current rendering