@babylonjs/core 8.46.2 → 8.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/Behaviors/Cameras/geospatialClippingBehavior.d.ts +39 -0
  2. package/Behaviors/Cameras/geospatialClippingBehavior.js +75 -0
  3. package/Behaviors/Cameras/geospatialClippingBehavior.js.map +1 -0
  4. package/Behaviors/Cameras/index.d.ts +2 -0
  5. package/Behaviors/Cameras/index.js +2 -0
  6. package/Behaviors/Cameras/index.js.map +1 -1
  7. package/Cameras/Inputs/geospatialCameraPointersInput.js +6 -4
  8. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  9. package/Cameras/Limits/geospatialLimits.d.ts +25 -1
  10. package/Cameras/Limits/geospatialLimits.js +60 -3
  11. package/Cameras/Limits/geospatialLimits.js.map +1 -1
  12. package/Cameras/geospatialCamera.d.ts +33 -9
  13. package/Cameras/geospatialCamera.js +114 -42
  14. package/Cameras/geospatialCamera.js.map +1 -1
  15. package/Cameras/geospatialCameraMovement.d.ts +1 -3
  16. package/Cameras/geospatialCameraMovement.js +10 -4
  17. package/Cameras/geospatialCameraMovement.js.map +1 -1
  18. package/Debug/debugLayer.js +11 -3
  19. package/Debug/debugLayer.js.map +1 -1
  20. package/Engines/abstractEngine.js +2 -2
  21. package/Engines/abstractEngine.js.map +1 -1
  22. package/Engines/constants.d.ts +1 -1
  23. package/Engines/constants.js +1 -1
  24. package/Engines/constants.js.map +1 -1
  25. package/Engines/thinEngine.d.ts +3 -2
  26. package/Engines/thinEngine.js.map +1 -1
  27. package/IAssetContainer.d.ts +5 -0
  28. package/IAssetContainer.js.map +1 -1
  29. package/Lights/Clustered/clusteredLightContainer.js +1 -1
  30. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  31. package/Lights/areaLight.d.ts +1 -1
  32. package/Lights/areaLight.js +1 -1
  33. package/Lights/areaLight.js.map +1 -1
  34. package/Lights/rectAreaLight.d.ts +20 -0
  35. package/Lights/rectAreaLight.js +45 -0
  36. package/Lights/rectAreaLight.js.map +1 -1
  37. package/Loading/Plugins/babylonFileLoader.js +2 -0
  38. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  39. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -1
  40. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  41. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +1 -1
  42. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  43. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +6 -3
  44. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  45. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -1
  46. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  47. package/Materials/PBR/openpbrMaterial.d.ts +135 -5
  48. package/Materials/PBR/openpbrMaterial.js +205 -22
  49. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  50. package/Materials/effectRenderer.d.ts +2 -1
  51. package/Materials/effectRenderer.js +2 -12
  52. package/Materials/effectRenderer.js.map +1 -1
  53. package/Materials/material.d.ts +1 -1
  54. package/Materials/material.js +1 -1
  55. package/Materials/material.js.map +1 -1
  56. package/Materials/materialHelper.functions.d.ts +2 -1
  57. package/Materials/materialHelper.functions.js +7 -2
  58. package/Materials/materialHelper.functions.js.map +1 -1
  59. package/Materials/materialPluginManager.js +2 -2
  60. package/Materials/materialPluginManager.js.map +1 -1
  61. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +6 -1
  62. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +21 -17
  63. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  64. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -5
  65. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  66. package/Misc/areaLightsTextureTools.d.ts +52 -0
  67. package/Misc/areaLightsTextureTools.js +227 -0
  68. package/Misc/areaLightsTextureTools.js.map +1 -0
  69. package/Misc/decorators.serialization.js +6 -1
  70. package/Misc/decorators.serialization.js.map +1 -1
  71. package/Misc/index.d.ts +3 -0
  72. package/Misc/index.js +4 -0
  73. package/Misc/index.js.map +1 -1
  74. package/Misc/sceneRecorder.d.ts +6 -2
  75. package/Misc/sceneRecorder.js +7 -0
  76. package/Misc/sceneRecorder.js.map +1 -1
  77. package/Particles/Node/Blocks/index.d.ts +3 -0
  78. package/Particles/Node/Blocks/index.js +3 -0
  79. package/Particles/Node/Blocks/index.js.map +1 -1
  80. package/Particles/Node/Blocks/particleNLerpBlock.d.ts +35 -0
  81. package/Particles/Node/Blocks/particleNLerpBlock.js +97 -0
  82. package/Particles/Node/Blocks/particleNLerpBlock.js.map +1 -0
  83. package/Particles/Node/Blocks/particleSmoothStepBlock.d.ts +34 -0
  84. package/Particles/Node/Blocks/particleSmoothStepBlock.js +91 -0
  85. package/Particles/Node/Blocks/particleSmoothStepBlock.js.map +1 -0
  86. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +4 -0
  87. package/Particles/Node/Blocks/particleSourceTextureBlock.js +9 -3
  88. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  89. package/Particles/Node/Blocks/particleStepBlock.d.ts +30 -0
  90. package/Particles/Node/Blocks/particleStepBlock.js +84 -0
  91. package/Particles/Node/Blocks/particleStepBlock.js.map +1 -0
  92. package/Particles/Node/nodeParticleSystemSet.d.ts +2 -0
  93. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  94. package/Particles/solidParticleSystem.d.ts +3 -0
  95. package/Particles/solidParticleSystem.js +7 -4
  96. package/Particles/solidParticleSystem.js.map +1 -1
  97. package/Physics/v2/IPhysicsEnginePlugin.d.ts +1 -0
  98. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  99. package/Physics/v2/Plugins/havokPlugin.d.ts +10 -0
  100. package/Physics/v2/Plugins/havokPlugin.js +13 -0
  101. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  102. package/Physics/v2/physicsBody.d.ts +10 -0
  103. package/Physics/v2/physicsBody.js +12 -0
  104. package/Physics/v2/physicsBody.js.map +1 -1
  105. package/Physics/v2/physicsEngineComponent.d.ts +5 -0
  106. package/Physics/v2/physicsEngineComponent.js +13 -0
  107. package/Physics/v2/physicsEngineComponent.js.map +1 -1
  108. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +8 -10
  109. package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
  110. package/Rendering/utilityLayerRenderer.d.ts +6 -0
  111. package/Rendering/utilityLayerRenderer.js +14 -5
  112. package/Rendering/utilityLayerRenderer.js.map +1 -1
  113. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +7 -9
  114. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  115. package/Shaders/ShadersInclude/helperFunctions.js +4 -0
  116. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  117. package/Shaders/ShadersInclude/lightFragment.js +13 -0
  118. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  119. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +3 -0
  120. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  121. package/Shaders/ShadersInclude/lightUboDeclaration.js +3 -0
  122. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  123. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +6 -0
  124. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  125. package/Shaders/ShadersInclude/ltcHelperFunctions.js +17 -1
  126. package/Shaders/ShadersInclude/ltcHelperFunctions.js.map +1 -1
  127. package/Shaders/ShadersInclude/{openpbrBlockAmbientOcclusion.d.ts → openpbrAmbientOcclusionData.d.ts} +1 -1
  128. package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js +15 -0
  129. package/Shaders/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -0
  130. package/{ShadersWGSL/ShadersInclude/openpbrBlockAmbientOcclusion.d.ts → Shaders/ShadersInclude/openpbrAmbientOcclusionFunctions.d.ts} +1 -1
  131. package/Shaders/ShadersInclude/openpbrAmbientOcclusionFunctions.js +13 -0
  132. package/Shaders/ShadersInclude/openpbrAmbientOcclusionFunctions.js.map +1 -0
  133. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.d.ts +5 -0
  134. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +26 -0
  135. package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -0
  136. package/Shaders/ShadersInclude/openpbrBaseLayerData.js +18 -7
  137. package/Shaders/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  138. package/Shaders/ShadersInclude/openpbrDirectLighting.js +52 -6
  139. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  140. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +109 -6
  141. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  142. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.d.ts +1 -0
  143. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js +24 -4
  144. package/Shaders/ShadersInclude/openpbrFragmentDeclaration.js.map +1 -1
  145. package/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.js +10 -1
  146. package/Shaders/ShadersInclude/openpbrFragmentSamplersDeclaration.js.map +1 -1
  147. package/Shaders/ShadersInclude/openpbrIblFunctions.js +9 -2
  148. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  149. package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js +1 -0
  150. package/Shaders/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
  151. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.d.ts +5 -0
  152. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js +47 -0
  153. package/Shaders/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -0
  154. package/Shaders/ShadersInclude/openpbrUboDeclaration.js +1 -1
  155. package/Shaders/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  156. package/Shaders/ShadersInclude/openpbrVertexDeclaration.d.ts +1 -0
  157. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +17 -4
  158. package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
  159. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
  160. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  161. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +6 -0
  162. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  163. package/Shaders/ShadersInclude/pbrHelperFunctions.js +1 -1
  164. package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  165. package/Shaders/areaLightTextureProcessing.fragment.d.ts +5 -0
  166. package/Shaders/areaLightTextureProcessing.fragment.js +13 -0
  167. package/Shaders/areaLightTextureProcessing.fragment.js.map +1 -0
  168. package/Shaders/openpbr.fragment.d.ts +4 -1
  169. package/Shaders/openpbr.fragment.js +33 -15
  170. package/Shaders/openpbr.fragment.js.map +1 -1
  171. package/Shaders/openpbr.vertex.js +30 -18
  172. package/Shaders/openpbr.vertex.js.map +1 -1
  173. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +10 -12
  174. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  175. package/ShadersWGSL/ShadersInclude/helperFunctions.js +4 -0
  176. package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
  177. package/ShadersWGSL/ShadersInclude/importanceSampling.js +1 -1
  178. package/ShadersWGSL/ShadersInclude/importanceSampling.js.map +1 -1
  179. package/ShadersWGSL/ShadersInclude/lightFragment.js +14 -0
  180. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  181. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +3 -0
  182. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  183. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +6 -0
  184. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  185. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js +19 -1
  186. package/ShadersWGSL/ShadersInclude/ltcHelperFunctions.js.map +1 -1
  187. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.d.ts +5 -0
  188. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js +15 -0
  189. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionData.js.map +1 -0
  190. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionFunctions.d.ts +5 -0
  191. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionFunctions.js +13 -0
  192. package/ShadersWGSL/ShadersInclude/openpbrAmbientOcclusionFunctions.js.map +1 -0
  193. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.d.ts +5 -0
  194. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +25 -0
  195. package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -0
  196. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +18 -7
  197. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  198. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +52 -6
  199. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  200. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +115 -7
  201. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  202. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js +10 -1
  203. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js.map +1 -1
  204. package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js +4 -4
  205. package/ShadersWGSL/ShadersInclude/openpbrFuzzLayerData.js.map +1 -1
  206. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +10 -3
  207. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  208. package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js +1 -0
  209. package/ShadersWGSL/ShadersInclude/openpbrThinFilmLayerData.js.map +1 -1
  210. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.d.ts +5 -0
  211. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js +47 -0
  212. package/ShadersWGSL/ShadersInclude/openpbrTransmissionLayerData.js.map +1 -0
  213. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js +1 -1
  214. package/ShadersWGSL/ShadersInclude/openpbrUboDeclaration.js.map +1 -1
  215. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
  216. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  217. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +5 -0
  218. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  219. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js +1 -1
  220. package/ShadersWGSL/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  221. package/ShadersWGSL/areaLightTextureProcessing.fragment.d.ts +5 -0
  222. package/ShadersWGSL/areaLightTextureProcessing.fragment.js +12 -0
  223. package/ShadersWGSL/areaLightTextureProcessing.fragment.js.map +1 -0
  224. package/ShadersWGSL/iblVoxelGrid.vertex.js +2 -2
  225. package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
  226. package/ShadersWGSL/openpbr.fragment.d.ts +4 -1
  227. package/ShadersWGSL/openpbr.fragment.js +33 -15
  228. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  229. package/ShadersWGSL/openpbr.vertex.js +12 -0
  230. package/ShadersWGSL/openpbr.vertex.js.map +1 -1
  231. package/Sprites/spriteManager.d.ts +3 -0
  232. package/Sprites/spriteManager.js +9 -0
  233. package/Sprites/spriteManager.js.map +1 -1
  234. package/States/alphaCullingState.js +0 -1
  235. package/States/alphaCullingState.js.map +1 -1
  236. package/assetContainer.d.ts +5 -0
  237. package/assetContainer.js +32 -0
  238. package/assetContainer.js.map +1 -1
  239. package/package.json +2 -2
  240. package/Shaders/ShadersInclude/openpbrBlockAmbientOcclusion.js +0 -35
  241. package/Shaders/ShadersInclude/openpbrBlockAmbientOcclusion.js.map +0 -1
  242. package/ShadersWGSL/ShadersInclude/openpbrBlockAmbientOcclusion.js +0 -36
  243. package/ShadersWGSL/ShadersInclude/openpbrBlockAmbientOcclusion.js.map +0 -1
@@ -48,10 +48,6 @@ export class CubeMapToSphericalPolynomialTools {
48
48
  const gammaSpace = texture.gammaSpace;
49
49
  // Always read as RGBA.
50
50
  const format = 5;
51
- let type = 0;
52
- if (texture.textureType == 1 || texture.textureType == 2) {
53
- type = 1;
54
- }
55
51
  return new Promise((resolve) => {
56
52
  // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then
57
53
  Promise.all([leftPromise, rightPromise, upPromise, downPromise, frontPromise, backPromise]).then(([left, right, up, down, front, back]) => {
@@ -64,7 +60,7 @@ export class CubeMapToSphericalPolynomialTools {
64
60
  front,
65
61
  back,
66
62
  format,
67
- type,
63
+ type: left instanceof Float32Array ? 1 : 0,
68
64
  gammaSpace,
69
65
  };
70
66
  resolve(this.ConvertCubeMapToSphericalPolynomial(cubeInfo));
@@ -1 +1 @@
1
- {"version":3,"file":"cubemapToSphericalPolynomial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Clamp } from \"../../Maths/math.scalar.functions\";\r\nimport { SphericalPolynomial, SphericalHarmonics } from \"../../Maths/sphericalPolynomial\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { CubeMapInfo } from \"./panoramaToCubemap\";\r\nimport { ToLinearSpace } from \"../../Maths/math.constants\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\n\r\nclass FileFaceOrientation {\r\n public name: string;\r\n public worldAxisForNormal: Vector3; // the world axis corresponding to the normal to the face\r\n public worldAxisForFileX: Vector3; // the world axis corresponding to texture right x-axis in file\r\n public worldAxisForFileY: Vector3; // the world axis corresponding to texture down y-axis in file\r\n\r\n public constructor(name: string, worldAxisForNormal: Vector3, worldAxisForFileX: Vector3, worldAxisForFileY: Vector3) {\r\n this.name = name;\r\n this.worldAxisForNormal = worldAxisForNormal;\r\n this.worldAxisForFileX = worldAxisForFileX;\r\n this.worldAxisForFileY = worldAxisForFileY;\r\n }\r\n}\r\n\r\n/**\r\n * Helper class dealing with the extraction of spherical polynomial dataArray\r\n * from a cube map.\r\n */\r\nexport class CubeMapToSphericalPolynomialTools {\r\n private static _FileFaces: FileFaceOrientation[] = [\r\n new FileFaceOrientation(\"right\", new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)), // +X east\r\n new FileFaceOrientation(\"left\", new Vector3(-1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, -1, 0)), // -X west\r\n new FileFaceOrientation(\"up\", new Vector3(0, 1, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1)), // +Y north\r\n new FileFaceOrientation(\"down\", new Vector3(0, -1, 0), new Vector3(1, 0, 0), new Vector3(0, 0, -1)), // -Y south\r\n new FileFaceOrientation(\"front\", new Vector3(0, 0, 1), new Vector3(1, 0, 0), new Vector3(0, -1, 0)), // +Z top\r\n new FileFaceOrientation(\"back\", new Vector3(0, 0, -1), new Vector3(-1, 0, 0), new Vector3(0, -1, 0)), // -Z bottom\r\n ];\r\n\r\n /** @internal */\r\n public static MAX_HDRI_VALUE = 4096;\r\n /** @internal */\r\n public static PRESERVE_CLAMPED_COLORS = false;\r\n\r\n /**\r\n * Converts a texture to the according Spherical Polynomial data.\r\n * This extracts the first 3 orders only as they are the only one used in the lighting.\r\n *\r\n * @param texture The texture to extract the information from.\r\n * @returns The Spherical Polynomial data.\r\n */\r\n public static ConvertCubeMapTextureToSphericalPolynomial(texture: BaseTexture): Nullable<Promise<SphericalPolynomial>> {\r\n if (!texture.isCube) {\r\n // Only supports cube Textures currently.\r\n return null;\r\n }\r\n\r\n texture.getScene()?.getEngine().flushFramebuffer();\r\n\r\n const size = texture.getSize().width;\r\n const rightPromise = texture.readPixels(0, undefined, undefined, false);\r\n const leftPromise = texture.readPixels(1, undefined, undefined, false);\r\n\r\n let upPromise: Nullable<Promise<ArrayBufferView>>;\r\n let downPromise: Nullable<Promise<ArrayBufferView>>;\r\n if (texture.isRenderTarget) {\r\n upPromise = texture.readPixels(3, undefined, undefined, false);\r\n downPromise = texture.readPixels(2, undefined, undefined, false);\r\n } else {\r\n upPromise = texture.readPixels(2, undefined, undefined, false);\r\n downPromise = texture.readPixels(3, undefined, undefined, false);\r\n }\r\n\r\n const frontPromise = texture.readPixels(4, undefined, undefined, false);\r\n const backPromise = texture.readPixels(5, undefined, undefined, false);\r\n\r\n const gammaSpace = texture.gammaSpace;\r\n // Always read as RGBA.\r\n const format = Constants.TEXTUREFORMAT_RGBA;\r\n let type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n if (texture.textureType == Constants.TEXTURETYPE_FLOAT || texture.textureType == Constants.TEXTURETYPE_HALF_FLOAT) {\r\n type = Constants.TEXTURETYPE_FLOAT;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n Promise.all([leftPromise, rightPromise, upPromise, downPromise, frontPromise, backPromise]).then(([left, right, up, down, front, back]) => {\r\n const cubeInfo: CubeMapInfo = {\r\n size,\r\n right,\r\n left,\r\n up,\r\n down,\r\n front,\r\n back,\r\n format,\r\n type,\r\n gammaSpace,\r\n };\r\n\r\n resolve(this.ConvertCubeMapToSphericalPolynomial(cubeInfo));\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Compute the area on the unit sphere of the rectangle defined by (x,y) and the origin\r\n * See https://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/\r\n * @param x\r\n * @param y\r\n * @returns the area\r\n */\r\n private static _AreaElement(x: number, y: number): number {\r\n return Math.atan2(x * y, Math.sqrt(x * x + y * y + 1));\r\n }\r\n\r\n /**\r\n * Converts a cubemap to the according Spherical Polynomial data.\r\n * This extracts the first 3 orders only as they are the only one used in the lighting.\r\n *\r\n * @param cubeInfo The Cube map to extract the information from.\r\n * @returns The Spherical Polynomial data.\r\n */\r\n public static ConvertCubeMapToSphericalPolynomial(cubeInfo: CubeMapInfo): SphericalPolynomial {\r\n const sphericalHarmonics = new SphericalHarmonics();\r\n let totalSolidAngle = 0.0;\r\n\r\n // The (u,v) range is [-1,+1], so the distance between each texel is 2/Size.\r\n const du = 2.0 / cubeInfo.size;\r\n const dv = du;\r\n\r\n const halfTexel = 0.5 * du;\r\n\r\n // The (u,v) of the first texel is half a texel from the corner (-1,-1).\r\n const minUV = halfTexel - 1.0;\r\n\r\n for (let faceIndex = 0; faceIndex < 6; faceIndex++) {\r\n const fileFace = this._FileFaces[faceIndex];\r\n const dataArray = (<any>cubeInfo)[fileFace.name];\r\n let v = minUV;\r\n\r\n // TODO: we could perform the summation directly into a SphericalPolynomial (SP), which is more efficient than SphericalHarmonic (SH).\r\n // This is possible because during the summation we do not need the SH-specific properties, e.g. orthogonality.\r\n // Because SP is still linear, so summation is fine in that basis.\r\n const stride = cubeInfo.format === Constants.TEXTUREFORMAT_RGBA ? 4 : 3;\r\n for (let y = 0; y < cubeInfo.size; y++) {\r\n let u = minUV;\r\n\r\n for (let x = 0; x < cubeInfo.size; x++) {\r\n // World direction (not normalised)\r\n const worldDirection = fileFace.worldAxisForFileX.scale(u).add(fileFace.worldAxisForFileY.scale(v)).add(fileFace.worldAxisForNormal);\r\n worldDirection.normalize();\r\n\r\n const deltaSolidAngle =\r\n this._AreaElement(u - halfTexel, v - halfTexel) -\r\n this._AreaElement(u - halfTexel, v + halfTexel) -\r\n this._AreaElement(u + halfTexel, v - halfTexel) +\r\n this._AreaElement(u + halfTexel, v + halfTexel);\r\n\r\n let r = dataArray[y * cubeInfo.size * stride + x * stride + 0];\r\n let g = dataArray[y * cubeInfo.size * stride + x * stride + 1];\r\n let b = dataArray[y * cubeInfo.size * stride + x * stride + 2];\r\n\r\n // Prevent NaN harmonics with extreme HDRI data.\r\n if (isNaN(r)) {\r\n r = 0;\r\n }\r\n if (isNaN(g)) {\r\n g = 0;\r\n }\r\n if (isNaN(b)) {\r\n b = 0;\r\n }\r\n\r\n // Handle Integer types.\r\n if (cubeInfo.type === Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n }\r\n\r\n // Handle Gamma space textures.\r\n if (cubeInfo.gammaSpace) {\r\n r = Math.pow(Clamp(r), ToLinearSpace);\r\n g = Math.pow(Clamp(g), ToLinearSpace);\r\n b = Math.pow(Clamp(b), ToLinearSpace);\r\n }\r\n\r\n // Prevent to explode in case of really high dynamic ranges.\r\n // sh 3 would not be enough to accurately represent it.\r\n const max = this.MAX_HDRI_VALUE;\r\n if (this.PRESERVE_CLAMPED_COLORS) {\r\n const currentMax = Math.max(r, g, b);\r\n if (currentMax > max) {\r\n const factor = max / currentMax;\r\n r *= factor;\r\n g *= factor;\r\n b *= factor;\r\n }\r\n } else {\r\n r = Clamp(r, 0, max);\r\n g = Clamp(g, 0, max);\r\n b = Clamp(b, 0, max);\r\n }\r\n\r\n const color = new Color3(r, g, b);\r\n\r\n sphericalHarmonics.addLight(worldDirection, color, deltaSolidAngle);\r\n\r\n totalSolidAngle += deltaSolidAngle;\r\n\r\n u += du;\r\n }\r\n\r\n v += dv;\r\n }\r\n }\r\n\r\n // Solid angle for entire sphere is 4*pi\r\n const sphereSolidAngle = 4.0 * Math.PI;\r\n\r\n // Adjust the solid angle to allow for how many faces we processed.\r\n const facesProcessed = 6.0;\r\n const expectedSolidAngle = (sphereSolidAngle * facesProcessed) / 6.0;\r\n\r\n // Adjust the harmonics so that the accumulated solid angle matches the expected solid angle.\r\n // This is needed because the numerical integration over the cube uses a\r\n // small angle approximation of solid angle for each texel (see deltaSolidAngle),\r\n // and also to compensate for accumulative error due to float precision in the summation.\r\n const correctionFactor = expectedSolidAngle / totalSolidAngle;\r\n sphericalHarmonics.scaleInPlace(correctionFactor);\r\n\r\n sphericalHarmonics.convertIncidentRadianceToIrradiance();\r\n sphericalHarmonics.convertIrradianceToLambertianRadiance();\r\n\r\n return SphericalPolynomial.FromHarmonics(sphericalHarmonics);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"cubemapToSphericalPolynomial.js","sourceRoot":"","sources":["../../../../../dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../../Maths/math.vector\";\r\nimport { Clamp } from \"../../Maths/math.scalar.functions\";\r\nimport { SphericalPolynomial, SphericalHarmonics } from \"../../Maths/sphericalPolynomial\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { CubeMapInfo } from \"./panoramaToCubemap\";\r\nimport { ToLinearSpace } from \"../../Maths/math.constants\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\n\r\nclass FileFaceOrientation {\r\n public name: string;\r\n public worldAxisForNormal: Vector3; // the world axis corresponding to the normal to the face\r\n public worldAxisForFileX: Vector3; // the world axis corresponding to texture right x-axis in file\r\n public worldAxisForFileY: Vector3; // the world axis corresponding to texture down y-axis in file\r\n\r\n public constructor(name: string, worldAxisForNormal: Vector3, worldAxisForFileX: Vector3, worldAxisForFileY: Vector3) {\r\n this.name = name;\r\n this.worldAxisForNormal = worldAxisForNormal;\r\n this.worldAxisForFileX = worldAxisForFileX;\r\n this.worldAxisForFileY = worldAxisForFileY;\r\n }\r\n}\r\n\r\n/**\r\n * Helper class dealing with the extraction of spherical polynomial dataArray\r\n * from a cube map.\r\n */\r\nexport class CubeMapToSphericalPolynomialTools {\r\n private static _FileFaces: FileFaceOrientation[] = [\r\n new FileFaceOrientation(\"right\", new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)), // +X east\r\n new FileFaceOrientation(\"left\", new Vector3(-1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, -1, 0)), // -X west\r\n new FileFaceOrientation(\"up\", new Vector3(0, 1, 0), new Vector3(1, 0, 0), new Vector3(0, 0, 1)), // +Y north\r\n new FileFaceOrientation(\"down\", new Vector3(0, -1, 0), new Vector3(1, 0, 0), new Vector3(0, 0, -1)), // -Y south\r\n new FileFaceOrientation(\"front\", new Vector3(0, 0, 1), new Vector3(1, 0, 0), new Vector3(0, -1, 0)), // +Z top\r\n new FileFaceOrientation(\"back\", new Vector3(0, 0, -1), new Vector3(-1, 0, 0), new Vector3(0, -1, 0)), // -Z bottom\r\n ];\r\n\r\n /** @internal */\r\n public static MAX_HDRI_VALUE = 4096;\r\n /** @internal */\r\n public static PRESERVE_CLAMPED_COLORS = false;\r\n\r\n /**\r\n * Converts a texture to the according Spherical Polynomial data.\r\n * This extracts the first 3 orders only as they are the only one used in the lighting.\r\n *\r\n * @param texture The texture to extract the information from.\r\n * @returns The Spherical Polynomial data.\r\n */\r\n public static ConvertCubeMapTextureToSphericalPolynomial(texture: BaseTexture): Nullable<Promise<SphericalPolynomial>> {\r\n if (!texture.isCube) {\r\n // Only supports cube Textures currently.\r\n return null;\r\n }\r\n\r\n texture.getScene()?.getEngine().flushFramebuffer();\r\n\r\n const size = texture.getSize().width;\r\n const rightPromise = texture.readPixels(0, undefined, undefined, false);\r\n const leftPromise = texture.readPixels(1, undefined, undefined, false);\r\n\r\n let upPromise: Nullable<Promise<ArrayBufferView>>;\r\n let downPromise: Nullable<Promise<ArrayBufferView>>;\r\n if (texture.isRenderTarget) {\r\n upPromise = texture.readPixels(3, undefined, undefined, false);\r\n downPromise = texture.readPixels(2, undefined, undefined, false);\r\n } else {\r\n upPromise = texture.readPixels(2, undefined, undefined, false);\r\n downPromise = texture.readPixels(3, undefined, undefined, false);\r\n }\r\n\r\n const frontPromise = texture.readPixels(4, undefined, undefined, false);\r\n const backPromise = texture.readPixels(5, undefined, undefined, false);\r\n\r\n const gammaSpace = texture.gammaSpace;\r\n // Always read as RGBA.\r\n const format = Constants.TEXTUREFORMAT_RGBA;\r\n\r\n return new Promise((resolve) => {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then\r\n Promise.all([leftPromise, rightPromise, upPromise, downPromise, frontPromise, backPromise]).then(([left, right, up, down, front, back]) => {\r\n const cubeInfo: CubeMapInfo = {\r\n size,\r\n right,\r\n left,\r\n up,\r\n down,\r\n front,\r\n back,\r\n format,\r\n type: left instanceof Float32Array ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n gammaSpace,\r\n };\r\n\r\n resolve(this.ConvertCubeMapToSphericalPolynomial(cubeInfo));\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Compute the area on the unit sphere of the rectangle defined by (x,y) and the origin\r\n * See https://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/\r\n * @param x\r\n * @param y\r\n * @returns the area\r\n */\r\n private static _AreaElement(x: number, y: number): number {\r\n return Math.atan2(x * y, Math.sqrt(x * x + y * y + 1));\r\n }\r\n\r\n /**\r\n * Converts a cubemap to the according Spherical Polynomial data.\r\n * This extracts the first 3 orders only as they are the only one used in the lighting.\r\n *\r\n * @param cubeInfo The Cube map to extract the information from.\r\n * @returns The Spherical Polynomial data.\r\n */\r\n public static ConvertCubeMapToSphericalPolynomial(cubeInfo: CubeMapInfo): SphericalPolynomial {\r\n const sphericalHarmonics = new SphericalHarmonics();\r\n let totalSolidAngle = 0.0;\r\n\r\n // The (u,v) range is [-1,+1], so the distance between each texel is 2/Size.\r\n const du = 2.0 / cubeInfo.size;\r\n const dv = du;\r\n\r\n const halfTexel = 0.5 * du;\r\n\r\n // The (u,v) of the first texel is half a texel from the corner (-1,-1).\r\n const minUV = halfTexel - 1.0;\r\n\r\n for (let faceIndex = 0; faceIndex < 6; faceIndex++) {\r\n const fileFace = this._FileFaces[faceIndex];\r\n const dataArray = (<any>cubeInfo)[fileFace.name];\r\n let v = minUV;\r\n\r\n // TODO: we could perform the summation directly into a SphericalPolynomial (SP), which is more efficient than SphericalHarmonic (SH).\r\n // This is possible because during the summation we do not need the SH-specific properties, e.g. orthogonality.\r\n // Because SP is still linear, so summation is fine in that basis.\r\n const stride = cubeInfo.format === Constants.TEXTUREFORMAT_RGBA ? 4 : 3;\r\n for (let y = 0; y < cubeInfo.size; y++) {\r\n let u = minUV;\r\n\r\n for (let x = 0; x < cubeInfo.size; x++) {\r\n // World direction (not normalised)\r\n const worldDirection = fileFace.worldAxisForFileX.scale(u).add(fileFace.worldAxisForFileY.scale(v)).add(fileFace.worldAxisForNormal);\r\n worldDirection.normalize();\r\n\r\n const deltaSolidAngle =\r\n this._AreaElement(u - halfTexel, v - halfTexel) -\r\n this._AreaElement(u - halfTexel, v + halfTexel) -\r\n this._AreaElement(u + halfTexel, v - halfTexel) +\r\n this._AreaElement(u + halfTexel, v + halfTexel);\r\n\r\n let r = dataArray[y * cubeInfo.size * stride + x * stride + 0];\r\n let g = dataArray[y * cubeInfo.size * stride + x * stride + 1];\r\n let b = dataArray[y * cubeInfo.size * stride + x * stride + 2];\r\n\r\n // Prevent NaN harmonics with extreme HDRI data.\r\n if (isNaN(r)) {\r\n r = 0;\r\n }\r\n if (isNaN(g)) {\r\n g = 0;\r\n }\r\n if (isNaN(b)) {\r\n b = 0;\r\n }\r\n\r\n // Handle Integer types.\r\n if (cubeInfo.type === Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n r /= 255;\r\n g /= 255;\r\n b /= 255;\r\n }\r\n\r\n // Handle Gamma space textures.\r\n if (cubeInfo.gammaSpace) {\r\n r = Math.pow(Clamp(r), ToLinearSpace);\r\n g = Math.pow(Clamp(g), ToLinearSpace);\r\n b = Math.pow(Clamp(b), ToLinearSpace);\r\n }\r\n\r\n // Prevent to explode in case of really high dynamic ranges.\r\n // sh 3 would not be enough to accurately represent it.\r\n const max = this.MAX_HDRI_VALUE;\r\n if (this.PRESERVE_CLAMPED_COLORS) {\r\n const currentMax = Math.max(r, g, b);\r\n if (currentMax > max) {\r\n const factor = max / currentMax;\r\n r *= factor;\r\n g *= factor;\r\n b *= factor;\r\n }\r\n } else {\r\n r = Clamp(r, 0, max);\r\n g = Clamp(g, 0, max);\r\n b = Clamp(b, 0, max);\r\n }\r\n\r\n const color = new Color3(r, g, b);\r\n\r\n sphericalHarmonics.addLight(worldDirection, color, deltaSolidAngle);\r\n\r\n totalSolidAngle += deltaSolidAngle;\r\n\r\n u += du;\r\n }\r\n\r\n v += dv;\r\n }\r\n }\r\n\r\n // Solid angle for entire sphere is 4*pi\r\n const sphereSolidAngle = 4.0 * Math.PI;\r\n\r\n // Adjust the solid angle to allow for how many faces we processed.\r\n const facesProcessed = 6.0;\r\n const expectedSolidAngle = (sphereSolidAngle * facesProcessed) / 6.0;\r\n\r\n // Adjust the harmonics so that the accumulated solid angle matches the expected solid angle.\r\n // This is needed because the numerical integration over the cube uses a\r\n // small angle approximation of solid angle for each texel (see deltaSolidAngle),\r\n // and also to compensate for accumulative error due to float precision in the summation.\r\n const correctionFactor = expectedSolidAngle / totalSolidAngle;\r\n sphericalHarmonics.scaleInPlace(correctionFactor);\r\n\r\n sphericalHarmonics.convertIncidentRadianceToIrradiance();\r\n sphericalHarmonics.convertIrradianceToLambertianRadiance();\r\n\r\n return SphericalPolynomial.FromHarmonics(sphericalHarmonics);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,52 @@
1
+ import type { AbstractEngine } from "../Engines/abstractEngine.js";
2
+ import type { Nullable } from "../types.js";
3
+ import { ShaderLanguage } from "../Materials/shaderLanguage.js";
4
+ import { BaseTexture } from "../Materials/Textures/baseTexture.js";
5
+ /**
6
+ * Class used for fast copy from one texture to another
7
+ */
8
+ export declare class AreaLightTextureTools {
9
+ private _engine;
10
+ private _renderer;
11
+ private _effectWrapper;
12
+ private _source;
13
+ private _scalingRange;
14
+ private _kernelLibrary;
15
+ private readonly _blurSize;
16
+ private readonly _alphaFactor;
17
+ /** Shader language used */
18
+ protected _shaderLanguage: ShaderLanguage;
19
+ /**
20
+ * Gets the shader language
21
+ */
22
+ get shaderLanguage(): ShaderLanguage;
23
+ private _textureIsInternal;
24
+ /**
25
+ * Constructs a new instance of the class
26
+ * @param engine The engine to use for the copy
27
+ */
28
+ constructor(engine: AbstractEngine);
29
+ private _shadersLoaded;
30
+ private _createEffect;
31
+ /**
32
+ * Indicates if the effect is ready to be used for the copy
33
+ * @returns true if "copy" can be called without delay, else false
34
+ */
35
+ isReady(): boolean;
36
+ /**
37
+ * Pre-processes the texture to be used with RectAreaLight emissionTexture.
38
+ * @param source The texture to pre-process
39
+ * @returns A promise that resolves with the pre-processed texture
40
+ */
41
+ processAsync(source: BaseTexture): Promise<Nullable<BaseTexture>>;
42
+ private _scaleImageDownAsync;
43
+ private _generateGaussianKernel;
44
+ private _mirrorIndex;
45
+ private _applyGaussianBlurRange;
46
+ private _transposeImage;
47
+ private _applyProgressiveBlurAsync;
48
+ /**
49
+ * Releases all the resources used by the class
50
+ */
51
+ dispose(): void;
52
+ }
@@ -0,0 +1,227 @@
1
+ import { EffectRenderer, EffectWrapper } from "../Materials/effectRenderer.js";
2
+ import { Vector2 } from "../Maths/math.vector.js";
3
+ import { WhenTextureReadyAsync } from "./textureTools.js";
4
+ import { BaseTexture } from "../Materials/Textures/baseTexture.js";
5
+
6
+ /**
7
+ * Class used for fast copy from one texture to another
8
+ */
9
+ export class AreaLightTextureTools {
10
+ /**
11
+ * Gets the shader language
12
+ */
13
+ get shaderLanguage() {
14
+ return this._shaderLanguage;
15
+ }
16
+ _textureIsInternal(texture) {
17
+ return texture?.getInternalTexture === undefined;
18
+ }
19
+ /**
20
+ * Constructs a new instance of the class
21
+ * @param engine The engine to use for the copy
22
+ */
23
+ constructor(engine) {
24
+ this._kernelLibrary = [];
25
+ this._blurSize = 5;
26
+ this._alphaFactor = 0.5;
27
+ /** Shader language used */
28
+ this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;
29
+ this._shadersLoaded = false;
30
+ this._engine = engine;
31
+ this._renderer = new EffectRenderer(this._engine);
32
+ this._scalingRange = new Vector2();
33
+ for (let i = 0; i < 512; i++) {
34
+ const kernelSize = this._blurSize + (i + 1) * 2;
35
+ const alpha = (kernelSize / 2.0) * this._alphaFactor;
36
+ this._kernelLibrary.push(this._generateGaussianKernel(kernelSize, alpha));
37
+ }
38
+ }
39
+ _createEffect() {
40
+ const engine = this._engine;
41
+ let isWebGPU = false;
42
+ if (engine?.isWebGPU) {
43
+ this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;
44
+ isWebGPU = true;
45
+ }
46
+ const effectWrapper = new EffectWrapper({
47
+ engine: engine,
48
+ name: "AreaLightTextureProcessing",
49
+ fragmentShader: "areaLightTextureProcessing",
50
+ useShaderStore: true,
51
+ uniformNames: ["scalingRange"],
52
+ samplerNames: ["textureSampler"],
53
+ defines: [],
54
+ shaderLanguage: this._shaderLanguage,
55
+ extraInitializationsAsync: async () => {
56
+ if (isWebGPU) {
57
+ await import("../ShadersWGSL/areaLightTextureProcessing.fragment.js");
58
+ }
59
+ else {
60
+ await import("../Shaders/areaLightTextureProcessing.fragment.js");
61
+ }
62
+ },
63
+ });
64
+ effectWrapper.onApplyObservable.add(() => {
65
+ engine.depthCullingState.depthMask = false;
66
+ if (this._textureIsInternal(this._source)) {
67
+ effectWrapper.effect._bindTexture("textureSampler", this._source);
68
+ }
69
+ else {
70
+ effectWrapper.effect.setTexture("textureSampler", this._source);
71
+ }
72
+ effectWrapper.effect.setVector2("scalingRange", this._scalingRange);
73
+ });
74
+ return effectWrapper;
75
+ }
76
+ /**
77
+ * Indicates if the effect is ready to be used for the copy
78
+ * @returns true if "copy" can be called without delay, else false
79
+ */
80
+ isReady() {
81
+ return this._shadersLoaded && !!this._effectWrapper?.effect?.isReady();
82
+ }
83
+ /**
84
+ * Pre-processes the texture to be used with RectAreaLight emissionTexture.
85
+ * @param source The texture to pre-process
86
+ * @returns A promise that resolves with the pre-processed texture
87
+ */
88
+ async processAsync(source) {
89
+ if (!this._shadersLoaded) {
90
+ this._effectWrapper = this._createEffect();
91
+ await this._effectWrapper.effect.whenCompiledAsync();
92
+ this._shadersLoaded = true;
93
+ }
94
+ if (!source.isReady()) {
95
+ await WhenTextureReadyAsync(source);
96
+ }
97
+ this._scalingRange.x = 0.125;
98
+ this._scalingRange.y = 0.875;
99
+ this._source = source;
100
+ const oldWrapU = this._source.wrapU;
101
+ const oldWrapV = this._source.wrapV;
102
+ this._source.wrapU = 2;
103
+ this._source.wrapV = 2;
104
+ const result = await this._scaleImageDownAsync(source);
105
+ await this._applyProgressiveBlurAsync(result);
106
+ result.wrapU = 0;
107
+ result.wrapV = 0;
108
+ this._source.wrapU = oldWrapU;
109
+ this._source.wrapV = oldWrapV;
110
+ return result;
111
+ }
112
+ async _scaleImageDownAsync(source) {
113
+ const renderTarget = this._engine.createRenderTargetTexture({ width: 1024, height: 1024 }, {
114
+ generateDepthBuffer: false,
115
+ generateMipMaps: true,
116
+ generateStencilBuffer: false,
117
+ samplingMode: 3,
118
+ type: 3553,
119
+ format: 5,
120
+ });
121
+ this._source = source;
122
+ const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates
123
+ this._renderer.render(this._effectWrapper, renderTarget);
124
+ this._engine.setDepthWrite(engineDepthMask);
125
+ return new BaseTexture(this._engine, renderTarget.texture);
126
+ }
127
+ _generateGaussianKernel(size, sigma) {
128
+ if (size % 2 === 0) {
129
+ throw new Error("Kernel size must be odd.");
130
+ }
131
+ const kernel = new Float32Array(size);
132
+ let sum = 0.0;
133
+ const halfSize = Math.floor(size / 2);
134
+ for (let i = -halfSize; i <= halfSize; ++i) {
135
+ const value = Math.exp(-(i * i) / (2.0 * sigma * sigma));
136
+ const index = i + halfSize;
137
+ kernel[index] = value;
138
+ sum += value;
139
+ }
140
+ for (let i = 0; i < kernel.length; i++) {
141
+ kernel[i] /= sum;
142
+ }
143
+ return { kernel, kernelSize: size, kernelHalfSize: halfSize };
144
+ }
145
+ _mirrorIndex(x, width) {
146
+ if (x < 0) {
147
+ x = -x;
148
+ }
149
+ if (x >= width) {
150
+ x = 2 * width - 2 - x;
151
+ }
152
+ return x;
153
+ }
154
+ _applyGaussianBlurRange(input, output, width, height, channels, kernelLibrary) {
155
+ const marginStart = Math.floor(width * 0.125);
156
+ const marginEnd = Math.floor(width * 0.875);
157
+ for (let y = 0; y < height; y++) {
158
+ for (let x = 0; x < width; x++) {
159
+ let targetKernel = 0;
160
+ if (x <= marginStart) {
161
+ targetKernel = Math.max(targetKernel, Math.abs(x - marginStart));
162
+ }
163
+ if (y <= marginStart) {
164
+ targetKernel = Math.max(targetKernel, Math.abs(y - marginStart));
165
+ }
166
+ if (x >= marginEnd) {
167
+ targetKernel = Math.max(targetKernel, Math.abs(x - marginEnd));
168
+ }
169
+ if (y >= marginEnd) {
170
+ targetKernel = Math.max(targetKernel, Math.abs(y - marginEnd));
171
+ }
172
+ const kernelData = kernelLibrary[targetKernel];
173
+ const { kernel, kernelHalfSize } = kernelData;
174
+ for (let c = 0; c < channels - 1; c++) {
175
+ let sum = 0.0;
176
+ for (let kx = -kernelHalfSize; kx <= kernelHalfSize; kx++) {
177
+ const px = this._mirrorIndex(x + kx, width);
178
+ const weight = kernel[kx + kernelHalfSize];
179
+ const pixelData = input[(y * width + px) * channels + c];
180
+ sum += pixelData * weight;
181
+ }
182
+ output[(y * width + x) * channels + c] = Math.max(0, Math.min(255, Math.round(sum)));
183
+ }
184
+ // copy alpha if present
185
+ if (channels > 3) {
186
+ output[(y * width + x) * channels + (channels - 1)] = input[(y * width + x) * channels + (channels - 1)];
187
+ }
188
+ }
189
+ }
190
+ }
191
+ _transposeImage(input, width, height, channels, output) {
192
+ for (let y = 0; y < height; y++) {
193
+ for (let x = 0; x < width; x++) {
194
+ const srcBase = (y * width + x) * channels;
195
+ const dstBase = (x * height + y) * channels;
196
+ for (let c = 0; c < channels; c++) {
197
+ output[dstBase + c] = input[srcBase + c];
198
+ }
199
+ }
200
+ }
201
+ }
202
+ async _applyProgressiveBlurAsync(source) {
203
+ const pixelData = await source.readPixels();
204
+ if (!pixelData) {
205
+ return;
206
+ }
207
+ const internalTexture = source.getInternalTexture();
208
+ if (!internalTexture) {
209
+ return;
210
+ }
211
+ const rourcePixel = new Uint8Array(pixelData.buffer);
212
+ const result = new Uint8Array(rourcePixel.length);
213
+ this._applyGaussianBlurRange(rourcePixel, result, internalTexture.width, internalTexture.height, 4, this._kernelLibrary);
214
+ this._transposeImage(result, internalTexture.width, internalTexture.height, 4, rourcePixel);
215
+ this._applyGaussianBlurRange(rourcePixel, result, internalTexture.width, internalTexture.height, 4, this._kernelLibrary);
216
+ this._transposeImage(result, internalTexture.width, internalTexture.height, 4, rourcePixel);
217
+ this._engine.updateRawTexture(internalTexture, rourcePixel, internalTexture.format, false);
218
+ }
219
+ /**
220
+ * Releases all the resources used by the class
221
+ */
222
+ dispose() {
223
+ this._effectWrapper?.dispose();
224
+ this._renderer.dispose();
225
+ }
226
+ }
227
+ //# sourceMappingURL=areaLightsTextureTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"areaLightsTextureTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/areaLightsTextureTools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { EffectRenderer, EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { WhenTextureReadyAsync } from \"core/Misc/textureTools\";\r\nimport { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Constants } from \"core/Engines/constants\";\r\n\r\ntype KernelData = {\r\n kernel: Float32Array;\r\n kernelSize: number;\r\n kernelHalfSize: number;\r\n};\r\n\r\n/**\r\n * Class used for fast copy from one texture to another\r\n */\r\nexport class AreaLightTextureTools {\r\n private _engine: AbstractEngine;\r\n private _renderer: EffectRenderer;\r\n private _effectWrapper: EffectWrapper;\r\n private _source: BaseTexture;\r\n private _scalingRange: Vector2;\r\n private _kernelLibrary: KernelData[] = [];\r\n private readonly _blurSize = 5;\r\n private readonly _alphaFactor = 0.5;\r\n\r\n /** Shader language used */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n private _textureIsInternal(texture: InternalTexture | ThinTexture): texture is InternalTexture {\r\n return (texture as ThinTexture)?.getInternalTexture === undefined;\r\n }\r\n\r\n /**\r\n * Constructs a new instance of the class\r\n * @param engine The engine to use for the copy\r\n */\r\n constructor(engine: AbstractEngine) {\r\n this._engine = engine;\r\n this._renderer = new EffectRenderer(this._engine);\r\n this._scalingRange = new Vector2();\r\n\r\n for (let i = 0; i < 512; i++) {\r\n const kernelSize = this._blurSize + (i + 1) * 2;\r\n const alpha = (kernelSize / 2.0) * this._alphaFactor;\r\n this._kernelLibrary.push(this._generateGaussianKernel(kernelSize, alpha));\r\n }\r\n }\r\n\r\n private _shadersLoaded = false;\r\n private _createEffect(): EffectWrapper {\r\n const engine = this._engine;\r\n let isWebGPU = false;\r\n\r\n if (engine?.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n isWebGPU = true;\r\n }\r\n\r\n const effectWrapper = new EffectWrapper({\r\n engine: engine,\r\n name: \"AreaLightTextureProcessing\",\r\n fragmentShader: \"areaLightTextureProcessing\",\r\n useShaderStore: true,\r\n uniformNames: [\"scalingRange\"],\r\n samplerNames: [\"textureSampler\"],\r\n defines: [],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await import(\"../ShadersWGSL/areaLightTextureProcessing.fragment\");\r\n } else {\r\n await import(\"../Shaders/areaLightTextureProcessing.fragment\");\r\n }\r\n },\r\n });\r\n\r\n effectWrapper.onApplyObservable.add(() => {\r\n engine.depthCullingState.depthMask = false;\r\n if (this._textureIsInternal(this._source)) {\r\n effectWrapper.effect._bindTexture(\"textureSampler\", this._source);\r\n } else {\r\n effectWrapper.effect.setTexture(\"textureSampler\", this._source);\r\n }\r\n effectWrapper.effect.setVector2(\"scalingRange\", this._scalingRange);\r\n });\r\n\r\n return effectWrapper;\r\n }\r\n\r\n /**\r\n * Indicates if the effect is ready to be used for the copy\r\n * @returns true if \"copy\" can be called without delay, else false\r\n */\r\n public isReady(): boolean {\r\n return this._shadersLoaded && !!this._effectWrapper?.effect?.isReady();\r\n }\r\n\r\n /**\r\n * Pre-processes the texture to be used with RectAreaLight emissionTexture.\r\n * @param source The texture to pre-process\r\n * @returns A promise that resolves with the pre-processed texture\r\n */\r\n public async processAsync(source: BaseTexture): Promise<Nullable<BaseTexture>> {\r\n if (!this._shadersLoaded) {\r\n this._effectWrapper = this._createEffect();\r\n await this._effectWrapper.effect.whenCompiledAsync();\r\n this._shadersLoaded = true;\r\n }\r\n\r\n if (!source.isReady()) {\r\n await WhenTextureReadyAsync(source);\r\n }\r\n\r\n this._scalingRange.x = 0.125;\r\n this._scalingRange.y = 0.875;\r\n\r\n this._source = source;\r\n const oldWrapU = this._source.wrapU;\r\n const oldWrapV = this._source.wrapV;\r\n\r\n this._source.wrapU = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n this._source.wrapV = Constants.TEXTURE_MIRROR_ADDRESSMODE;\r\n\r\n const result = await this._scaleImageDownAsync(source);\r\n await this._applyProgressiveBlurAsync(result);\r\n\r\n result.wrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n result.wrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n\r\n this._source.wrapU = oldWrapU;\r\n this._source.wrapV = oldWrapV;\r\n\r\n return result;\r\n }\r\n\r\n private async _scaleImageDownAsync(source: BaseTexture): Promise<BaseTexture> {\r\n const renderTarget = this._engine.createRenderTargetTexture(\r\n { width: 1024, height: 1024 },\r\n {\r\n generateDepthBuffer: false,\r\n generateMipMaps: true,\r\n generateStencilBuffer: false,\r\n samplingMode: Constants.TEXTURE_TRILINEAR_SAMPLINGMODE,\r\n type: Constants.TEXTURE_2D,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n }\r\n );\r\n\r\n this._source = source;\r\n const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates\r\n this._renderer.render(this._effectWrapper, renderTarget);\r\n this._engine.setDepthWrite(engineDepthMask);\r\n return new BaseTexture(this._engine, renderTarget.texture);\r\n }\r\n\r\n private _generateGaussianKernel(size: number, sigma: number): KernelData {\r\n if (size % 2 === 0) {\r\n throw new Error(\"Kernel size must be odd.\");\r\n }\r\n\r\n const kernel = new Float32Array(size);\r\n let sum = 0.0;\r\n const halfSize = Math.floor(size / 2);\r\n\r\n for (let i = -halfSize; i <= halfSize; ++i) {\r\n const value = Math.exp(-(i * i) / (2.0 * sigma * sigma));\r\n const index = i + halfSize;\r\n kernel[index] = value;\r\n sum += value;\r\n }\r\n\r\n for (let i = 0; i < kernel.length; i++) {\r\n kernel[i] /= sum;\r\n }\r\n\r\n return { kernel, kernelSize: size, kernelHalfSize: halfSize };\r\n }\r\n\r\n private _mirrorIndex(x: number, width: number): number {\r\n if (x < 0) {\r\n x = -x;\r\n }\r\n if (x >= width) {\r\n x = 2 * width - 2 - x;\r\n }\r\n return x;\r\n }\r\n\r\n private _applyGaussianBlurRange(input: Uint8Array, output: Uint8Array, width: number, height: number, channels: number, kernelLibrary: KernelData[]) {\r\n const marginStart = Math.floor(width * 0.125);\r\n const marginEnd = Math.floor(width * 0.875);\r\n\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n let targetKernel = 0;\r\n\r\n if (x <= marginStart) {\r\n targetKernel = Math.max(targetKernel, Math.abs(x - marginStart));\r\n }\r\n if (y <= marginStart) {\r\n targetKernel = Math.max(targetKernel, Math.abs(y - marginStart));\r\n }\r\n if (x >= marginEnd) {\r\n targetKernel = Math.max(targetKernel, Math.abs(x - marginEnd));\r\n }\r\n if (y >= marginEnd) {\r\n targetKernel = Math.max(targetKernel, Math.abs(y - marginEnd));\r\n }\r\n\r\n const kernelData = kernelLibrary[targetKernel];\r\n const { kernel, kernelHalfSize } = kernelData;\r\n\r\n for (let c = 0; c < channels - 1; c++) {\r\n let sum = 0.0;\r\n for (let kx = -kernelHalfSize; kx <= kernelHalfSize; kx++) {\r\n const px = this._mirrorIndex(x + kx, width);\r\n const weight = kernel[kx + kernelHalfSize];\r\n const pixelData = input[(y * width + px) * channels + c];\r\n sum += pixelData * weight;\r\n }\r\n output[(y * width + x) * channels + c] = Math.max(0, Math.min(255, Math.round(sum)));\r\n }\r\n // copy alpha if present\r\n if (channels > 3) {\r\n output[(y * width + x) * channels + (channels - 1)] = input[(y * width + x) * channels + (channels - 1)];\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _transposeImage(input: Uint8Array, width: number, height: number, channels: number, output: Uint8Array): void {\r\n for (let y = 0; y < height; y++) {\r\n for (let x = 0; x < width; x++) {\r\n const srcBase = (y * width + x) * channels;\r\n const dstBase = (x * height + y) * channels;\r\n for (let c = 0; c < channels; c++) {\r\n output[dstBase + c] = input[srcBase + c];\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async _applyProgressiveBlurAsync(source: BaseTexture): Promise<void> {\r\n const pixelData = await source.readPixels();\r\n\r\n if (!pixelData) {\r\n return;\r\n }\r\n\r\n const internalTexture = source.getInternalTexture();\r\n\r\n if (!internalTexture) {\r\n return;\r\n }\r\n\r\n const rourcePixel = new Uint8Array(pixelData.buffer);\r\n const result = new Uint8Array(rourcePixel.length);\r\n\r\n this._applyGaussianBlurRange(rourcePixel, result, internalTexture.width, internalTexture.height, 4, this._kernelLibrary);\r\n this._transposeImage(result, internalTexture.width, internalTexture.height, 4, rourcePixel);\r\n this._applyGaussianBlurRange(rourcePixel, result, internalTexture.width, internalTexture.height, 4, this._kernelLibrary);\r\n this._transposeImage(result, internalTexture.width, internalTexture.height, 4, rourcePixel);\r\n this._engine.updateRawTexture(internalTexture, rourcePixel, internalTexture.format, false);\r\n }\r\n\r\n /**\r\n * Releases all the resources used by the class\r\n */\r\n public dispose(): void {\r\n this._effectWrapper?.dispose();\r\n this._renderer.dispose();\r\n }\r\n}\r\n"]}
@@ -23,7 +23,12 @@ const CopySource = function (creationFunction, source, instanciate, options = {}
23
23
  case 6: // Mesh reference
24
24
  case 9: // Image processing configuration reference
25
25
  case 11: // Camera reference
26
- destination[property] = sourceProperty;
26
+ if (typeof sourceProperty.slice === "function") {
27
+ destination[property] = sourceProperty.slice();
28
+ }
29
+ else {
30
+ destination[property] = sourceProperty;
31
+ }
27
32
  break;
28
33
  case 1: // Texture
29
34
  if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) {
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.serialization.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/decorators.serialization.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FresnelParameters } from \"../Materials/fresnelParameters\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { ColorCurves } from \"../Materials/colorCurves\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { Tags } from \"./tags\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { GetMergedStore } from \"./decorators.functions\";\r\n\r\n/** @internal */\r\nexport interface ICopySourceOptions {\r\n /*\r\n * if a texture is used in more than one channel (e.g diffuse and opacity),\r\n * only clone it once and reuse it on the other channels. Default false\r\n */\r\n cloneTexturesOnlyOnce?: boolean;\r\n}\r\n\r\nconst CopySource = function <T>(creationFunction: () => T, source: T, instanciate: boolean, options: ICopySourceOptions = {}): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(destination, Tags.GetTags(source, true));\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Map from source texture uniqueId to destination texture\r\n const textureMap: Record<number, any> = {};\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = (<any>source)[property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n case 6: // Mesh reference\r\n case 9: // Image processing configuration reference\r\n case 11: // Camera reference\r\n (<any>destination)[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) {\r\n (<any>destination)[property] = textureMap[sourceProperty.uniqueId];\r\n } else {\r\n (<any>destination)[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone();\r\n textureMap[sourceProperty.uniqueId] = (<any>destination)[property];\r\n }\r\n break;\r\n case 2: // Color3\r\n case 3: // FresnelParameters\r\n case 4: // Vector2\r\n case 5: // Vector3\r\n case 7: // Color Curves\r\n case 8: // Color 4\r\n case 10: // Quaternion\r\n case 12: // Matrix\r\n (<any>destination)[property] = instanciate ? sourceProperty : sourceProperty.clone();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return destination;\r\n};\r\n\r\n/**\r\n * Class used to help serialization objects\r\n */\r\nexport class SerializationHelper {\r\n /**\r\n * Gets or sets a boolean to indicate if the UniqueId property should be serialized\r\n */\r\n public static AllowLoadingUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImageProcessingConfigurationParser = (sourceProperty: any): ImageProcessingConfiguration => {\r\n throw _WarnImport(\"ImageProcessingConfiguration\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _FresnelParametersParser = (sourceProperty: any): FresnelParameters => {\r\n throw _WarnImport(\"FresnelParameters\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ColorCurvesParser = (sourceProperty: any): ColorCurves => {\r\n throw _WarnImport(\"ColorCurves\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _TextureParser = (sourceProperty: any, scene: Scene, rootUrl: string): Nullable<BaseTexture> => {\r\n throw _WarnImport(\"Texture\");\r\n };\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n if (source.animations) {\r\n destination.animations = [];\r\n for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) {\r\n const animation = source.animations[animationIndex];\r\n\r\n destination.animations.push(animation.serialize());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static function used to serialized a specific entity\r\n * @param entity defines the entity to serialize\r\n * @param serializationObject defines the optional target object where serialization data will be stored\r\n * @returns a JSON compatible object representing the serialization of the entity\r\n */\r\n public static Serialize<T>(entity: T, serializationObject?: any): any {\r\n if (!serializationObject) {\r\n serializationObject = {};\r\n }\r\n\r\n // Tags\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(entity);\r\n }\r\n\r\n const serializedProperties = GetMergedStore(entity);\r\n\r\n // Properties\r\n for (const property in serializedProperties) {\r\n const propertyDescriptor = serializedProperties[property];\r\n const targetPropertyName = propertyDescriptor.sourceName || property;\r\n const propertyType = propertyDescriptor.type;\r\n const sourceProperty = (<any>entity)[property];\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n if (Array.isArray(sourceProperty)) {\r\n serializationObject[targetPropertyName] = sourceProperty.slice();\r\n } else {\r\n serializationObject[targetPropertyName] = sourceProperty;\r\n }\r\n break;\r\n case 1: // Texture\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 2: // Color3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 3: // FresnelParameters\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 4: // Vector2\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 5: // Vector3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 6: // Mesh reference\r\n serializationObject[targetPropertyName] = sourceProperty.id;\r\n break;\r\n case 7: // Color Curves\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 8: // Color 4\r\n serializationObject[targetPropertyName] = (<Color4>sourceProperty).asArray();\r\n break;\r\n case 9: // Image Processing\r\n serializationObject[targetPropertyName] = (<ImageProcessingConfiguration>sourceProperty).serialize();\r\n break;\r\n case 10: // Quaternion\r\n serializationObject[targetPropertyName] = (<Quaternion>sourceProperty).asArray();\r\n break;\r\n case 11: // Camera reference\r\n serializationObject[targetPropertyName] = (<Camera>sourceProperty).id;\r\n break;\r\n case 12: // Matrix\r\n serializationObject[targetPropertyName] = (<Matrix>sourceProperty).asArray();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\r\n * @param source the source json data\r\n * @param destination the destination object\r\n * @param scene the scene where the object is\r\n * @param rootUrl root url to use to load assets\r\n */\r\n public static ParseProperties(source: any, destination: any, scene: Nullable<Scene>, rootUrl: Nullable<string>) {\r\n if (!rootUrl) {\r\n rootUrl = \"\";\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = source[propertyDescriptor.sourceName || property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n const dest = destination;\r\n switch (propertyType) {\r\n case 0: // Value\r\n dest[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (scene) {\r\n dest[property] = SerializationHelper._TextureParser(sourceProperty, scene, rootUrl);\r\n }\r\n break;\r\n case 2: // Color3\r\n dest[property] = Color3.FromArray(sourceProperty);\r\n break;\r\n case 3: // FresnelParameters\r\n dest[property] = SerializationHelper._FresnelParametersParser(sourceProperty);\r\n break;\r\n case 4: // Vector2\r\n dest[property] = Vector2.FromArray(sourceProperty);\r\n break;\r\n case 5: // Vector3\r\n dest[property] = Vector3.FromArray(sourceProperty);\r\n break;\r\n case 6: // Mesh reference\r\n if (scene) {\r\n dest[property] = scene.getLastMeshById(sourceProperty);\r\n }\r\n break;\r\n case 7: // Color Curves\r\n dest[property] = SerializationHelper._ColorCurvesParser(sourceProperty);\r\n break;\r\n case 8: // Color 4\r\n dest[property] = Color4.FromArray(sourceProperty);\r\n break;\r\n case 9: // Image Processing\r\n dest[property] = SerializationHelper._ImageProcessingConfigurationParser(sourceProperty);\r\n break;\r\n case 10: // Quaternion\r\n dest[property] = Quaternion.FromArray(sourceProperty);\r\n break;\r\n case 11: // Camera reference\r\n if (scene) {\r\n dest[property] = scene.getCameraById(sourceProperty);\r\n }\r\n break;\r\n case 12: // Matrix\r\n dest[property] = Matrix.FromArray(sourceProperty);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new entity from a serialization data object\r\n * @param creationFunction defines a function used to instanciated the new entity\r\n * @param source defines the source serialization data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url for resources\r\n * @returns a new entity\r\n */\r\n public static Parse<T>(creationFunction: () => T, source: any, scene: Nullable<Scene>, rootUrl: Nullable<string> = null): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags) {\r\n Tags.AddTagsTo(destination, source.tags);\r\n }\r\n\r\n SerializationHelper.ParseProperties(source, destination, scene, rootUrl);\r\n\r\n return destination;\r\n }\r\n\r\n /**\r\n * Clones an object\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @param options defines the options to use\r\n * @returns the cloned object\r\n */\r\n public static Clone<T>(creationFunction: () => T, source: T, options: ICopySourceOptions = {}): T {\r\n return CopySource(creationFunction, source, false, options);\r\n }\r\n\r\n /**\r\n * Instanciates a new object based on a source one (some data will be shared between both object)\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @returns the new object\r\n */\r\n public static Instanciate<T>(creationFunction: () => T, source: T): T {\r\n return CopySource(creationFunction, source, true);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"decorators.serialization.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/decorators.serialization.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FresnelParameters } from \"../Materials/fresnelParameters\";\r\nimport type { ImageProcessingConfiguration } from \"../Materials/imageProcessingConfiguration\";\r\nimport { _WarnImport } from \"./devTools\";\r\nimport type { ColorCurves } from \"../Materials/colorCurves\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport type { IAnimatable } from \"../Animations/animatable.interface\";\r\nimport { Tags } from \"./tags\";\r\nimport { Color3, Color4 } from \"../Maths/math.color\";\r\nimport { Matrix, Quaternion, Vector2, Vector3 } from \"../Maths/math.vector\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport { GetMergedStore } from \"./decorators.functions\";\r\n\r\n/** @internal */\r\nexport interface ICopySourceOptions {\r\n /*\r\n * if a texture is used in more than one channel (e.g diffuse and opacity),\r\n * only clone it once and reuse it on the other channels. Default false\r\n */\r\n cloneTexturesOnlyOnce?: boolean;\r\n}\r\n\r\nconst CopySource = function <T>(creationFunction: () => T, source: T, instanciate: boolean, options: ICopySourceOptions = {}): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags && Tags.HasTags(source)) {\r\n Tags.AddTagsTo(destination, Tags.GetTags(source, true));\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Map from source texture uniqueId to destination texture\r\n const textureMap: Record<number, any> = {};\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = (<any>source)[property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n case 6: // Mesh reference\r\n case 9: // Image processing configuration reference\r\n case 11: // Camera reference\r\n if (typeof sourceProperty.slice === \"function\") {\r\n (<any>destination)[property] = sourceProperty.slice();\r\n } else {\r\n (<any>destination)[property] = sourceProperty;\r\n }\r\n break;\r\n case 1: // Texture\r\n if (options.cloneTexturesOnlyOnce && textureMap[sourceProperty.uniqueId]) {\r\n (<any>destination)[property] = textureMap[sourceProperty.uniqueId];\r\n } else {\r\n (<any>destination)[property] = instanciate || sourceProperty.isRenderTarget ? sourceProperty : sourceProperty.clone();\r\n textureMap[sourceProperty.uniqueId] = (<any>destination)[property];\r\n }\r\n break;\r\n case 2: // Color3\r\n case 3: // FresnelParameters\r\n case 4: // Vector2\r\n case 5: // Vector3\r\n case 7: // Color Curves\r\n case 8: // Color 4\r\n case 10: // Quaternion\r\n case 12: // Matrix\r\n (<any>destination)[property] = instanciate ? sourceProperty : sourceProperty.clone();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return destination;\r\n};\r\n\r\n/**\r\n * Class used to help serialization objects\r\n */\r\nexport class SerializationHelper {\r\n /**\r\n * Gets or sets a boolean to indicate if the UniqueId property should be serialized\r\n */\r\n public static AllowLoadingUniqueId = false;\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ImageProcessingConfigurationParser = (sourceProperty: any): ImageProcessingConfiguration => {\r\n throw _WarnImport(\"ImageProcessingConfiguration\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _FresnelParametersParser = (sourceProperty: any): FresnelParameters => {\r\n throw _WarnImport(\"FresnelParameters\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _ColorCurvesParser = (sourceProperty: any): ColorCurves => {\r\n throw _WarnImport(\"ColorCurves\");\r\n };\r\n\r\n /**\r\n * @internal\r\n */\r\n public static _TextureParser = (sourceProperty: any, scene: Scene, rootUrl: string): Nullable<BaseTexture> => {\r\n throw _WarnImport(\"Texture\");\r\n };\r\n\r\n /**\r\n * Appends the serialized animations from the source animations\r\n * @param source Source containing the animations\r\n * @param destination Target to store the animations\r\n */\r\n public static AppendSerializedAnimations(source: IAnimatable, destination: any): void {\r\n if (source.animations) {\r\n destination.animations = [];\r\n for (let animationIndex = 0; animationIndex < source.animations.length; animationIndex++) {\r\n const animation = source.animations[animationIndex];\r\n\r\n destination.animations.push(animation.serialize());\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Static function used to serialized a specific entity\r\n * @param entity defines the entity to serialize\r\n * @param serializationObject defines the optional target object where serialization data will be stored\r\n * @returns a JSON compatible object representing the serialization of the entity\r\n */\r\n public static Serialize<T>(entity: T, serializationObject?: any): any {\r\n if (!serializationObject) {\r\n serializationObject = {};\r\n }\r\n\r\n // Tags\r\n if (Tags) {\r\n serializationObject.tags = Tags.GetTags(entity);\r\n }\r\n\r\n const serializedProperties = GetMergedStore(entity);\r\n\r\n // Properties\r\n for (const property in serializedProperties) {\r\n const propertyDescriptor = serializedProperties[property];\r\n const targetPropertyName = propertyDescriptor.sourceName || property;\r\n const propertyType = propertyDescriptor.type;\r\n const sourceProperty = (<any>entity)[property];\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n switch (propertyType) {\r\n case 0: // Value\r\n if (Array.isArray(sourceProperty)) {\r\n serializationObject[targetPropertyName] = sourceProperty.slice();\r\n } else {\r\n serializationObject[targetPropertyName] = sourceProperty;\r\n }\r\n break;\r\n case 1: // Texture\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 2: // Color3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 3: // FresnelParameters\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 4: // Vector2\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 5: // Vector3\r\n serializationObject[targetPropertyName] = sourceProperty.asArray();\r\n break;\r\n case 6: // Mesh reference\r\n serializationObject[targetPropertyName] = sourceProperty.id;\r\n break;\r\n case 7: // Color Curves\r\n serializationObject[targetPropertyName] = sourceProperty.serialize();\r\n break;\r\n case 8: // Color 4\r\n serializationObject[targetPropertyName] = (<Color4>sourceProperty).asArray();\r\n break;\r\n case 9: // Image Processing\r\n serializationObject[targetPropertyName] = (<ImageProcessingConfiguration>sourceProperty).serialize();\r\n break;\r\n case 10: // Quaternion\r\n serializationObject[targetPropertyName] = (<Quaternion>sourceProperty).asArray();\r\n break;\r\n case 11: // Camera reference\r\n serializationObject[targetPropertyName] = (<Camera>sourceProperty).id;\r\n break;\r\n case 12: // Matrix\r\n serializationObject[targetPropertyName] = (<Matrix>sourceProperty).asArray();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object\r\n * @param source the source json data\r\n * @param destination the destination object\r\n * @param scene the scene where the object is\r\n * @param rootUrl root url to use to load assets\r\n */\r\n public static ParseProperties(source: any, destination: any, scene: Nullable<Scene>, rootUrl: Nullable<string>) {\r\n if (!rootUrl) {\r\n rootUrl = \"\";\r\n }\r\n\r\n const classStore = GetMergedStore(destination);\r\n\r\n // Properties\r\n for (const property in classStore) {\r\n const propertyDescriptor = classStore[property];\r\n const sourceProperty = source[propertyDescriptor.sourceName || property];\r\n const propertyType = propertyDescriptor.type;\r\n\r\n if (sourceProperty !== undefined && sourceProperty !== null && (property !== \"uniqueId\" || SerializationHelper.AllowLoadingUniqueId)) {\r\n const dest = destination;\r\n switch (propertyType) {\r\n case 0: // Value\r\n dest[property] = sourceProperty;\r\n break;\r\n case 1: // Texture\r\n if (scene) {\r\n dest[property] = SerializationHelper._TextureParser(sourceProperty, scene, rootUrl);\r\n }\r\n break;\r\n case 2: // Color3\r\n dest[property] = Color3.FromArray(sourceProperty);\r\n break;\r\n case 3: // FresnelParameters\r\n dest[property] = SerializationHelper._FresnelParametersParser(sourceProperty);\r\n break;\r\n case 4: // Vector2\r\n dest[property] = Vector2.FromArray(sourceProperty);\r\n break;\r\n case 5: // Vector3\r\n dest[property] = Vector3.FromArray(sourceProperty);\r\n break;\r\n case 6: // Mesh reference\r\n if (scene) {\r\n dest[property] = scene.getLastMeshById(sourceProperty);\r\n }\r\n break;\r\n case 7: // Color Curves\r\n dest[property] = SerializationHelper._ColorCurvesParser(sourceProperty);\r\n break;\r\n case 8: // Color 4\r\n dest[property] = Color4.FromArray(sourceProperty);\r\n break;\r\n case 9: // Image Processing\r\n dest[property] = SerializationHelper._ImageProcessingConfigurationParser(sourceProperty);\r\n break;\r\n case 10: // Quaternion\r\n dest[property] = Quaternion.FromArray(sourceProperty);\r\n break;\r\n case 11: // Camera reference\r\n if (scene) {\r\n dest[property] = scene.getCameraById(sourceProperty);\r\n }\r\n break;\r\n case 12: // Matrix\r\n dest[property] = Matrix.FromArray(sourceProperty);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new entity from a serialization data object\r\n * @param creationFunction defines a function used to instanciated the new entity\r\n * @param source defines the source serialization data\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root url for resources\r\n * @returns a new entity\r\n */\r\n public static Parse<T>(creationFunction: () => T, source: any, scene: Nullable<Scene>, rootUrl: Nullable<string> = null): T {\r\n const destination = creationFunction();\r\n\r\n // Tags\r\n if (Tags) {\r\n Tags.AddTagsTo(destination, source.tags);\r\n }\r\n\r\n SerializationHelper.ParseProperties(source, destination, scene, rootUrl);\r\n\r\n return destination;\r\n }\r\n\r\n /**\r\n * Clones an object\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @param options defines the options to use\r\n * @returns the cloned object\r\n */\r\n public static Clone<T>(creationFunction: () => T, source: T, options: ICopySourceOptions = {}): T {\r\n return CopySource(creationFunction, source, false, options);\r\n }\r\n\r\n /**\r\n * Instanciates a new object based on a source one (some data will be shared between both object)\r\n * @param creationFunction defines the function used to instanciate the new object\r\n * @param source defines the source object\r\n * @returns the new object\r\n */\r\n public static Instanciate<T>(creationFunction: () => T, source: T): T {\r\n return CopySource(creationFunction, source, true);\r\n }\r\n}\r\n"]}
package/Misc/index.d.ts CHANGED
@@ -67,6 +67,7 @@ export * from "./error.js";
67
67
  export * from "./snapshotRenderingHelper.js";
68
68
  export * from "./observableCoroutine.js";
69
69
  export * from "./copyTextureToTexture.js";
70
+ export * from "./areaLightsTextureTools.js";
70
71
  export { DumpTools, EncodeImageAsync } from "./dumpTools.js";
71
72
  export * from "./greasedLineTools.js";
72
73
  export * from "./equirectangularCapture.js";
@@ -81,4 +82,6 @@ export * from "../ShadersWGSL/rgbdDecode.fragment.js";
81
82
  export * from "../ShadersWGSL/rgbdEncode.fragment.js";
82
83
  export * from "../Shaders/copyTextureToTexture.fragment.js";
83
84
  export * from "../ShadersWGSL/copyTextureToTexture.fragment.js";
85
+ export * from "../Shaders/areaLightTextureProcessing.fragment.js";
86
+ export * from "../ShadersWGSL/areaLightTextureProcessing.fragment.js";
84
87
  export * from "./tools.internals.js";
package/Misc/index.js CHANGED
@@ -70,6 +70,7 @@ export * from "./snapshotRenderingHelper.js";
70
70
  // eslint-disable-next-line import/export
71
71
  export * from "./observableCoroutine.js";
72
72
  export * from "./copyTextureToTexture.js";
73
+ export * from "./areaLightsTextureTools.js";
73
74
  export { DumpTools, EncodeImageAsync } from "./dumpTools.js";
74
75
  export * from "./greasedLineTools.js";
75
76
  export * from "./equirectangularCapture.js";
@@ -86,5 +87,8 @@ export * from "../ShadersWGSL/rgbdEncode.fragment.js";
86
87
  // CopyTextureToTexture
87
88
  export * from "../Shaders/copyTextureToTexture.fragment.js";
88
89
  export * from "../ShadersWGSL/copyTextureToTexture.fragment.js";
90
+ // Area Light Texture
91
+ export * from "../Shaders/areaLightTextureProcessing.fragment.js";
92
+ export * from "../ShadersWGSL/areaLightTextureProcessing.fragment.js";
89
93
  export * from "./tools.internals.js";
90
94
  //# sourceMappingURL=index.js.map