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

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 (273) hide show
  1. package/Buffers/buffer.js +3 -2
  2. package/Buffers/buffer.js.map +1 -1
  3. package/Cameras/Inputs/BaseCameraPointersInput.d.ts +0 -1
  4. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -5
  5. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  6. package/Cameras/Inputs/freeCameraMouseInput.d.ts +0 -1
  7. package/Cameras/Inputs/freeCameraMouseInput.js +27 -28
  8. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  9. package/Cameras/camera.d.ts +4 -0
  10. package/Cameras/camera.js +2 -0
  11. package/Cameras/camera.js.map +1 -1
  12. package/Culling/boundingBox.d.ts +7 -1
  13. package/Culling/boundingBox.js +4 -0
  14. package/Culling/boundingBox.js.map +1 -1
  15. package/DeviceInput/Helpers/eventFactory.js +1 -2
  16. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  17. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +1 -0
  18. package/DeviceInput/Implementations/webDeviceInputSystem.js +5 -12
  19. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  20. package/DeviceInput/InputDevices/deviceEnums.d.ts +1 -3
  21. package/DeviceInput/InputDevices/deviceEnums.js +0 -2
  22. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  23. package/Engines/Extensions/engine.alpha.js +6 -6
  24. package/Engines/Extensions/engine.alpha.js.map +1 -1
  25. package/Engines/Extensions/engine.renderTarget.js +1 -1
  26. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  27. package/Engines/IDrawContext.d.ts +4 -0
  28. package/Engines/IDrawContext.js.map +1 -1
  29. package/Engines/IMaterialContext.d.ts +1 -0
  30. package/Engines/IMaterialContext.js.map +1 -1
  31. package/Engines/WebGPU/Extensions/engine.alpha.js +20 -31
  32. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  33. package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -38
  34. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  35. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +1 -1
  36. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  37. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +1 -1
  38. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  39. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -0
  40. package/Engines/WebGPU/webgpuBufferManager.js +3 -0
  41. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  42. package/Engines/WebGPU/webgpuCacheBindGroups.d.ts +3 -2
  43. package/Engines/WebGPU/webgpuCacheBindGroups.js +15 -14
  44. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  45. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -18
  46. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  47. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +2 -0
  48. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +17 -0
  49. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  50. package/Engines/WebGPU/webgpuDrawContext.d.ts +24 -2
  51. package/Engines/WebGPU/webgpuDrawContext.js +75 -1
  52. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  53. package/Engines/WebGPU/webgpuMaterialContext.d.ts +1 -6
  54. package/Engines/WebGPU/webgpuMaterialContext.js +11 -8
  55. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  56. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +1 -0
  57. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  58. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  59. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
  60. package/Engines/WebGPU/webgpuTextureHelper.js +67 -1
  61. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  62. package/Engines/constants.d.ts +40 -7
  63. package/Engines/constants.js +40 -7
  64. package/Engines/constants.js.map +1 -1
  65. package/Engines/engine.d.ts +37 -2
  66. package/Engines/engine.js +68 -0
  67. package/Engines/engine.js.map +1 -1
  68. package/Engines/engineFeatures.d.ts +2 -0
  69. package/Engines/engineFeatures.js.map +1 -1
  70. package/Engines/nativeEngine.js +19 -13
  71. package/Engines/nativeEngine.js.map +1 -1
  72. package/Engines/nullEngine.js +1 -0
  73. package/Engines/nullEngine.js.map +1 -1
  74. package/Engines/thinEngine.d.ts +8 -2
  75. package/Engines/thinEngine.js +10 -5
  76. package/Engines/thinEngine.js.map +1 -1
  77. package/Engines/webgpuEngine.d.ts +28 -7
  78. package/Engines/webgpuEngine.js +177 -58
  79. package/Engines/webgpuEngine.js.map +1 -1
  80. package/Inputs/scene.inputManager.js +2 -3
  81. package/Inputs/scene.inputManager.js.map +1 -1
  82. package/Layers/effectLayer.d.ts +0 -2
  83. package/Layers/effectLayer.js +12 -11
  84. package/Layers/effectLayer.js.map +1 -1
  85. package/Layers/effectLayerSceneComponent.js +5 -0
  86. package/Layers/effectLayerSceneComponent.js.map +1 -1
  87. package/Layers/glowLayer.js +2 -0
  88. package/Layers/glowLayer.js.map +1 -1
  89. package/Layers/highlightLayer.js +2 -0
  90. package/Layers/highlightLayer.js.map +1 -1
  91. package/LensFlares/lensFlare.d.ts +3 -0
  92. package/LensFlares/lensFlare.js +5 -0
  93. package/LensFlares/lensFlare.js.map +1 -1
  94. package/LensFlares/lensFlareSystem.d.ts +2 -1
  95. package/LensFlares/lensFlareSystem.js +15 -12
  96. package/LensFlares/lensFlareSystem.js.map +1 -1
  97. package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -2
  98. package/Lights/Shadows/cascadedShadowGenerator.js +3 -12
  99. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  100. package/Lights/Shadows/shadowGenerator.d.ts +0 -3
  101. package/Lights/Shadows/shadowGenerator.js +8 -14
  102. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  103. package/Lights/light.js +3 -0
  104. package/Lights/light.js.map +1 -1
  105. package/Loading/Plugins/babylonFileLoader.js +3 -0
  106. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  107. package/Materials/Background/backgroundMaterial.js +8 -11
  108. package/Materials/Background/backgroundMaterial.js.map +1 -1
  109. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -1
  110. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  111. package/Materials/Node/Blocks/cloudBlock.d.ts +4 -0
  112. package/Materials/Node/Blocks/cloudBlock.js +27 -8
  113. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  114. package/Materials/Node/Blocks/colorMergerBlock.d.ts +21 -0
  115. package/Materials/Node/Blocks/colorMergerBlock.js +48 -4
  116. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  117. package/Materials/Node/Blocks/vectorMergerBlock.d.ts +25 -0
  118. package/Materials/Node/Blocks/vectorMergerBlock.js +93 -23
  119. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  120. package/Materials/Node/nodeMaterial.js +4 -4
  121. package/Materials/Node/nodeMaterial.js.map +1 -1
  122. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  123. package/Materials/PBR/pbrBaseMaterial.js +10 -5
  124. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  125. package/Materials/PBR/pbrClearCoatConfiguration.js +1 -1
  126. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  127. package/Materials/PBR/pbrSheenConfiguration.js +1 -1
  128. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  129. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -1
  130. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  131. package/Materials/Textures/baseTexture.d.ts +2 -0
  132. package/Materials/Textures/baseTexture.js +2 -0
  133. package/Materials/Textures/baseTexture.js.map +1 -1
  134. package/Materials/Textures/renderTargetTexture.d.ts +27 -0
  135. package/Materials/Textures/renderTargetTexture.js +127 -14
  136. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  137. package/Materials/Textures/texture.js +11 -4
  138. package/Materials/Textures/texture.js.map +1 -1
  139. package/Materials/drawWrapper.d.ts +2 -1
  140. package/Materials/drawWrapper.js +10 -1
  141. package/Materials/drawWrapper.js.map +1 -1
  142. package/Materials/material.d.ts +3 -1
  143. package/Materials/material.detailMapConfiguration.d.ts +1 -1
  144. package/Materials/material.detailMapConfiguration.js +2 -2
  145. package/Materials/material.detailMapConfiguration.js.map +1 -1
  146. package/Materials/material.js +18 -9
  147. package/Materials/material.js.map +1 -1
  148. package/Materials/materialHelper.js +3 -1
  149. package/Materials/materialHelper.js.map +1 -1
  150. package/Materials/pushMaterial.js +1 -1
  151. package/Materials/pushMaterial.js.map +1 -1
  152. package/Materials/shaderMaterial.d.ts +0 -1
  153. package/Materials/shaderMaterial.js +3 -4
  154. package/Materials/shaderMaterial.js.map +1 -1
  155. package/Materials/shadowDepthWrapper.d.ts +4 -4
  156. package/Materials/shadowDepthWrapper.js +16 -15
  157. package/Materials/shadowDepthWrapper.js.map +1 -1
  158. package/Materials/standardMaterial.d.ts +1 -0
  159. package/Materials/standardMaterial.js +10 -5
  160. package/Materials/standardMaterial.js.map +1 -1
  161. package/Materials/uniformBuffer.d.ts +10 -2
  162. package/Materials/uniformBuffer.js +17 -11
  163. package/Materials/uniformBuffer.js.map +1 -1
  164. package/Meshes/abstractMesh.d.ts +13 -0
  165. package/Meshes/abstractMesh.js +22 -2
  166. package/Meshes/abstractMesh.js.map +1 -1
  167. package/Meshes/geometry.d.ts +7 -0
  168. package/Meshes/geometry.js +16 -0
  169. package/Meshes/geometry.js.map +1 -1
  170. package/Meshes/linesMesh.js +1 -1
  171. package/Meshes/linesMesh.js.map +1 -1
  172. package/Meshes/mesh.js +15 -0
  173. package/Meshes/mesh.js.map +1 -1
  174. package/Meshes/subMesh.d.ts +10 -9
  175. package/Meshes/subMesh.js +44 -43
  176. package/Meshes/subMesh.js.map +1 -1
  177. package/Misc/basis.d.ts +3 -2
  178. package/Misc/basis.js +16 -15
  179. package/Misc/basis.js.map +1 -1
  180. package/Misc/environmentTextureTools.js +1 -0
  181. package/Misc/environmentTextureTools.js.map +1 -1
  182. package/Misc/rgbdTextureTools.js +1 -0
  183. package/Misc/rgbdTextureTools.js.map +1 -1
  184. package/Misc/sceneSerializer.js +17 -17
  185. package/Misc/sceneSerializer.js.map +1 -1
  186. package/Misc/textureTools.js +2 -0
  187. package/Misc/textureTools.js.map +1 -1
  188. package/Particles/gpuParticleSystem.d.ts +5 -1
  189. package/Particles/gpuParticleSystem.js +31 -5
  190. package/Particles/gpuParticleSystem.js.map +1 -1
  191. package/Particles/particleSystem.d.ts +5 -1
  192. package/Particles/particleSystem.js +35 -5
  193. package/Particles/particleSystem.js.map +1 -1
  194. package/Physics/Plugins/ammoJSPlugin.d.ts +1 -0
  195. package/Physics/Plugins/ammoJSPlugin.js +10 -0
  196. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  197. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -0
  198. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  199. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
  200. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  201. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  202. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  203. package/PostProcesses/bloomMergePostProcess.js +1 -0
  204. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  205. package/PostProcesses/depthOfFieldBlurPostProcess.js +1 -0
  206. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  207. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -0
  208. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  209. package/PostProcesses/extractHighlightsPostProcess.js +1 -0
  210. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  211. package/PostProcesses/postProcess.d.ts +6 -0
  212. package/PostProcesses/postProcess.js +9 -1
  213. package/PostProcesses/postProcess.js.map +1 -1
  214. package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -1
  215. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  216. package/PostProcesses/tonemapPostProcess.d.ts +2 -1
  217. package/PostProcesses/tonemapPostProcess.js +3 -2
  218. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  219. package/Rendering/boundingBoxRenderer.d.ts +5 -3
  220. package/Rendering/boundingBoxRenderer.js +46 -14
  221. package/Rendering/boundingBoxRenderer.js.map +1 -1
  222. package/Rendering/depthPeelingRenderer.d.ts +20 -1
  223. package/Rendering/depthPeelingRenderer.js +125 -32
  224. package/Rendering/depthPeelingRenderer.js.map +1 -1
  225. package/Rendering/depthPeelingSceneComponent.d.ts +2 -0
  226. package/Rendering/depthPeelingSceneComponent.js +16 -0
  227. package/Rendering/depthPeelingSceneComponent.js.map +1 -1
  228. package/Rendering/depthRenderer.d.ts +9 -2
  229. package/Rendering/depthRenderer.js +77 -43
  230. package/Rendering/depthRenderer.js.map +1 -1
  231. package/Rendering/depthRendererSceneComponent.js +0 -1
  232. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  233. package/Rendering/edgesRenderer.d.ts +2 -0
  234. package/Rendering/edgesRenderer.js +11 -0
  235. package/Rendering/edgesRenderer.js.map +1 -1
  236. package/Rendering/geometryBufferRenderer.js +4 -4
  237. package/Rendering/geometryBufferRenderer.js.map +1 -1
  238. package/Rendering/outlineRenderer.d.ts +5 -4
  239. package/Rendering/outlineRenderer.js +24 -19
  240. package/Rendering/outlineRenderer.js.map +1 -1
  241. package/Rendering/prePassRenderer.js +3 -2
  242. package/Rendering/prePassRenderer.js.map +1 -1
  243. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.d.ts +5 -0
  244. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js +7 -0
  245. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js.map +1 -0
  246. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.d.ts +5 -0
  247. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +7 -0
  248. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -0
  249. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.d.ts +5 -0
  250. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js +7 -0
  251. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js.map +1 -0
  252. package/Shaders/ShadersInclude/oitFragment.js +1 -1
  253. package/Shaders/ShadersInclude/oitFragment.js.map +1 -1
  254. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +1 -1
  255. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  256. package/Shaders/boundingBoxRenderer.fragment.d.ts +7 -0
  257. package/Shaders/boundingBoxRenderer.fragment.js +9 -0
  258. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -0
  259. package/Shaders/boundingBoxRenderer.vertex.d.ts +7 -0
  260. package/Shaders/boundingBoxRenderer.vertex.js +9 -0
  261. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -0
  262. package/Sprites/spriteManager.d.ts +3 -1
  263. package/Sprites/spriteManager.js +16 -5
  264. package/Sprites/spriteManager.js.map +1 -1
  265. package/Sprites/spriteRenderer.d.ts +2 -0
  266. package/Sprites/spriteRenderer.js +26 -0
  267. package/Sprites/spriteRenderer.js.map +1 -1
  268. package/XR/features/WebXRWalkingLocomotion.js +28 -13
  269. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  270. package/package.json +16 -1
  271. package/scene.d.ts +18 -4
  272. package/scene.js +100 -41
  273. package/scene.js.map +1 -1
@@ -37,7 +37,6 @@ var CascadedShadowGenerator = /** @class */ (function (_super) {
37
37
  }
38
38
  _this = _super.call(this, mapSize, light, usefulFloatFirst) || this;
39
39
  _this.usePercentageCloserFiltering = true;
40
- _this._nameForDrawWrapperOrig = _this._nameForDrawWrapper[0];
41
40
  return _this;
42
41
  }
43
42
  CascadedShadowGenerator.prototype._validateFilter = function (filter) {
@@ -62,18 +61,11 @@ var CascadedShadowGenerator = /** @class */ (function (_super) {
62
61
  return;
63
62
  }
64
63
  this._numCascades = value;
65
- this._setNamesForDrawWrapper();
66
64
  this.recreateShadowMap();
67
65
  },
68
66
  enumerable: false,
69
67
  configurable: true
70
68
  });
71
- CascadedShadowGenerator.prototype._setNamesForDrawWrapper = function () {
72
- this._nameForDrawWrapper.length = this._numCascades;
73
- for (var i = 0; i < this._numCascades; ++i) {
74
- this._nameForDrawWrapper[i] = this._nameForDrawWrapperOrig + "_" + i;
75
- }
76
- };
77
69
  Object.defineProperty(CascadedShadowGenerator.prototype, "freezeShadowCastersBoundingInfo", {
78
70
  /**
79
71
  * Enables or disables the shadow casters bounding info computation.
@@ -566,7 +558,6 @@ var CascadedShadowGenerator = /** @class */ (function (_super) {
566
558
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
567
559
  this.penumbraDarkness = (_a = this.penumbraDarkness) !== null && _a !== void 0 ? _a : 1.0;
568
560
  this._numCascades = (_b = this._numCascades) !== null && _b !== void 0 ? _b : CascadedShadowGenerator.DEFAULT_CASCADES_COUNT;
569
- this._setNamesForDrawWrapper();
570
561
  this.stabilizeCascades = (_c = this.stabilizeCascades) !== null && _c !== void 0 ? _c : false;
571
562
  this._freezeShadowCastersBoundingInfoObservable = (_d = this._freezeShadowCastersBoundingInfoObservable) !== null && _d !== void 0 ? _d : null;
572
563
  this.freezeShadowCastersBoundingInfo = (_e = this.freezeShadowCastersBoundingInfo) !== null && _e !== void 0 ? _e : false;
@@ -588,7 +579,7 @@ var CascadedShadowGenerator = /** @class */ (function (_super) {
588
579
  CascadedShadowGenerator.prototype._createTargetRenderTexture = function () {
589
580
  var engine = this._scene.getEngine();
590
581
  var size = { width: this._mapSize, height: this._mapSize, layers: this.numCascades };
591
- this._shadowMap = new RenderTargetTexture(this._light.name + "_shadowMap", size, this._scene, false, true, this._textureType, false, undefined, false, false, undefined /*, 6*/);
582
+ this._shadowMap = new RenderTargetTexture(this._light.name + "_CSMShadowMap", size, this._scene, false, true, this._textureType, false, undefined, false, false, undefined /*, 6*/);
592
583
  this._shadowMap.createDepthStencilTexture(engine.useReverseDepthBuffer ? 516 : 513, true);
593
584
  };
594
585
  CascadedShadowGenerator.prototype._initializeShadowMap = function () {
@@ -632,19 +623,19 @@ var CascadedShadowGenerator = /** @class */ (function (_super) {
632
623
  this._shadowMap.onBeforeBindObservable.clear();
633
624
  this._shadowMap.onBeforeRenderObservable.clear();
634
625
  this._shadowMap.onBeforeRenderObservable.add(function (layer) {
635
- _this._nameForDrawWrapperCurrent = _this._nameForDrawWrapper[layer];
636
626
  _this._currentLayer = layer;
637
627
  if (_this._filter === ShadowGenerator.FILTER_PCF) {
638
628
  engine.setColorWrite(false);
639
629
  }
640
630
  _this._scene.setTransformMatrix(_this.getCascadeViewMatrix(layer), _this.getCascadeProjectionMatrix(layer));
641
631
  if (_this._useUBO) {
632
+ _this._scene.getSceneUniformBuffer().unbindEffect();
642
633
  _this._scene.finalizeSceneUbo();
643
634
  }
644
635
  });
645
636
  this._shadowMap.onBeforeBindObservable.add(function () {
646
637
  var _a;
647
- (_a = engine._debugPushGroup) === null || _a === void 0 ? void 0 : _a.call(engine, "cascaded shadow map generation for " + _this._nameForDrawWrapper, 1);
638
+ (_a = engine._debugPushGroup) === null || _a === void 0 ? void 0 : _a.call(engine, "cascaded shadow map generation for pass id " + engine.currentRenderPassId, 1);
648
639
  if (_this._breaksAreDirty) {
649
640
  _this._splitFrustum();
650
641
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cascadedShadowGenerator.js","sourceRoot":"","sources":["../../../../sourceES6/core/Lights/Shadows/cascadedShadowGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { SubMesh } from \"../../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\n\r\nimport { IShadowLight } from \"../../Lights/shadowLight\";\r\nimport { Effect } from \"../../Materials/effect\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\n\r\n\r\n\r\nimport \"../../Shaders/shadowMap.fragment\";\r\nimport \"../../Shaders/shadowMap.vertex\";\r\nimport \"../../Shaders/depthBoxBlur.fragment\";\r\nimport { Observer } from '../../Misc/observable';\r\nimport { _WarnImport } from '../../Misc/devTools';\r\nimport { ShadowGenerator } from './shadowGenerator';\r\nimport { DirectionalLight } from '../directionalLight';\r\n\r\nimport { BoundingInfo } from '../../Culling/boundingInfo';\r\nimport { DepthRenderer } from '../../Rendering/depthRenderer';\r\nimport { DepthReducer } from '../../Misc/depthReducer';\r\n\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { EngineStore } from '../../Engines/engineStore';\r\n\r\ninterface ICascade {\r\n prevBreakDistance: number;\r\n breakDistance: number;\r\n}\r\n\r\nconst UpDir = Vector3.Up();\r\nconst ZeroVec = Vector3.Zero();\r\n\r\nlet tmpv1 = new Vector3(),\r\n tmpv2 = new Vector3(),\r\n tmpMatrix = new Matrix();\r\n\r\n/**\r\n * A CSM implementation allowing casting shadows on large scenes.\r\n * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows\r\n * Based on: https://github.com/TheRealMJP/Shadows and https://johanmedestrom.wordpress.com/2016/03/18/opengl-cascaded-shadow-maps/\r\n */\r\nexport class CascadedShadowGenerator extends ShadowGenerator {\r\n\r\n private static readonly frustumCornersNDCSpace = [\r\n new Vector3(-1.0, +1.0, -1.0),\r\n new Vector3(+1.0, +1.0, -1.0),\r\n new Vector3(+1.0, -1.0, -1.0),\r\n new Vector3(-1.0, -1.0, -1.0),\r\n new Vector3(-1.0, +1.0, +1.0),\r\n new Vector3(+1.0, +1.0, +1.0),\r\n new Vector3(+1.0, -1.0, +1.0),\r\n new Vector3(-1.0, -1.0, +1.0),\r\n ];\r\n\r\n /**\r\n * Name of the CSM class\r\n */\r\n public static CLASSNAME = \"CascadedShadowGenerator\";\r\n\r\n /**\r\n * Defines the default number of cascades used by the CSM.\r\n */\r\n public static readonly DEFAULT_CASCADES_COUNT = 4;\r\n /**\r\n * Defines the minimum number of cascades used by the CSM.\r\n */\r\n public static readonly MIN_CASCADES_COUNT = 2;\r\n /**\r\n * Defines the maximum number of cascades used by the CSM.\r\n */\r\n public static readonly MAX_CASCADES_COUNT = 4;\r\n\r\n protected _validateFilter(filter: number): number {\r\n if (filter === ShadowGenerator.FILTER_NONE ||\r\n filter === ShadowGenerator.FILTER_PCF ||\r\n filter === ShadowGenerator.FILTER_PCSS) {\r\n return filter;\r\n }\r\n\r\n console.error('Unsupported filter \"' + filter + '\"!');\r\n\r\n return ShadowGenerator.FILTER_NONE;\r\n }\r\n\r\n /**\r\n * Gets or sets the actual darkness of the soft shadows while using PCSS filtering (value between 0. and 1.)\r\n */\r\n public penumbraDarkness: number;\r\n\r\n private _numCascades: number;\r\n\r\n /**\r\n * Gets or set the number of cascades used by the CSM.\r\n */\r\n public get numCascades(): number {\r\n return this._numCascades;\r\n }\r\n\r\n public set numCascades(value: number) {\r\n value = Math.min(Math.max(value, CascadedShadowGenerator.MIN_CASCADES_COUNT), CascadedShadowGenerator.MAX_CASCADES_COUNT);\r\n if (value === this._numCascades) {\r\n return;\r\n }\r\n\r\n this._numCascades = value;\r\n this._setNamesForDrawWrapper();\r\n this.recreateShadowMap();\r\n }\r\n\r\n private _setNamesForDrawWrapper(): void {\r\n this._nameForDrawWrapper.length = this._numCascades;\r\n for (let i = 0; i < this._numCascades; ++i) {\r\n this._nameForDrawWrapper[i] = this._nameForDrawWrapperOrig + \"_\" + i;\r\n }\r\n }\r\n\r\n /**\r\n * Sets this to true if you want that the edges of the shadows don't \"swimm\" / \"shimmer\" when rotating the camera.\r\n * The trade off is that you lose some precision in the shadow rendering when enabling this setting.\r\n */\r\n public stabilizeCascades: boolean;\r\n\r\n private _freezeShadowCastersBoundingInfo: boolean;\r\n private _freezeShadowCastersBoundingInfoObservable: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Enables or disables the shadow casters bounding info computation.\r\n * If your shadow casters don't move, you can disable this feature.\r\n * If it is enabled, the bounding box computation is done every frame.\r\n */\r\n public get freezeShadowCastersBoundingInfo(): boolean {\r\n return this._freezeShadowCastersBoundingInfo;\r\n }\r\n\r\n public set freezeShadowCastersBoundingInfo(freeze: boolean) {\r\n if (this._freezeShadowCastersBoundingInfoObservable && freeze) {\r\n this._scene.onBeforeRenderObservable.remove(this._freezeShadowCastersBoundingInfoObservable);\r\n this._freezeShadowCastersBoundingInfoObservable = null;\r\n }\r\n\r\n if (!this._freezeShadowCastersBoundingInfoObservable && !freeze) {\r\n this._freezeShadowCastersBoundingInfoObservable = this._scene.onBeforeRenderObservable.add(this._computeShadowCastersBoundingInfo.bind(this));\r\n }\r\n\r\n this._freezeShadowCastersBoundingInfo = freeze;\r\n\r\n if (freeze) {\r\n this._computeShadowCastersBoundingInfo();\r\n }\r\n }\r\n\r\n private _scbiMin: Vector3;\r\n private _scbiMax: Vector3;\r\n\r\n protected _computeShadowCastersBoundingInfo(): void {\r\n this._scbiMin.copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._scbiMax.copyFromFloats(Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE);\r\n\r\n if (this._shadowMap && this._shadowMap.renderList) {\r\n const renderList = this._shadowMap.renderList;\r\n for (let meshIndex = 0; meshIndex < renderList.length; meshIndex++) {\r\n const mesh = renderList[meshIndex];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo(),\r\n boundingBox = boundingInfo.boundingBox;\r\n\r\n this._scbiMin.minimizeInPlace(boundingBox.minimumWorld);\r\n this._scbiMax.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n\r\n const meshes = this._scene.meshes;\r\n for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {\r\n const mesh = meshes[meshIndex];\r\n\r\n if (!mesh || !mesh.isVisible || !mesh.isEnabled || !mesh.receiveShadows) {\r\n continue;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo(),\r\n boundingBox = boundingInfo.boundingBox;\r\n\r\n this._scbiMin.minimizeInPlace(boundingBox.minimumWorld);\r\n this._scbiMax.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n }\r\n\r\n this._shadowCastersBoundingInfo.reConstruct(this._scbiMin, this._scbiMax);\r\n }\r\n\r\n protected _shadowCastersBoundingInfo: BoundingInfo;\r\n\r\n /**\r\n * Gets or sets the shadow casters bounding info.\r\n * If you provide your own shadow casters bounding info, first enable freezeShadowCastersBoundingInfo\r\n * so that the system won't overwrite the bounds you provide\r\n */\r\n public get shadowCastersBoundingInfo(): BoundingInfo {\r\n return this._shadowCastersBoundingInfo;\r\n }\r\n\r\n public set shadowCastersBoundingInfo(boundingInfo: BoundingInfo) {\r\n this._shadowCastersBoundingInfo = boundingInfo;\r\n }\r\n\r\n protected _breaksAreDirty: boolean;\r\n\r\n protected _minDistance: number;\r\n protected _maxDistance: number;\r\n\r\n /**\r\n * Sets the minimal and maximal distances to use when computing the cascade breaks.\r\n *\r\n * The values of min / max are typically the depth zmin and zmax values of your scene, for a given frame.\r\n * If you don't know these values, simply leave them to their defaults and don't call this function.\r\n * @param min minimal distance for the breaks (default to 0.)\r\n * @param max maximal distance for the breaks (default to 1.)\r\n */\r\n public setMinMaxDistance(min: number, max: number): void {\r\n if (this._minDistance === min && this._maxDistance === max) {\r\n return;\r\n }\r\n\r\n if (min > max) {\r\n min = 0;\r\n max = 1;\r\n }\r\n\r\n if (min < 0) {\r\n min = 0;\r\n }\r\n\r\n if (max > 1) {\r\n max = 1;\r\n }\r\n\r\n this._minDistance = min;\r\n this._maxDistance = max;\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n /** Gets the minimal distance used in the cascade break computation */\r\n public get minDistance(): number {\r\n return this._minDistance;\r\n }\r\n\r\n /** Gets the maximal distance used in the cascade break computation */\r\n public get maxDistance(): number {\r\n return this._maxDistance;\r\n }\r\n\r\n /**\r\n * Gets the class name of that object\r\n * @returns \"CascadedShadowGenerator\"\r\n */\r\n public getClassName(): string {\r\n return CascadedShadowGenerator.CLASSNAME;\r\n }\r\n\r\n private _cascadeMinExtents: Array<Vector3>;\r\n private _cascadeMaxExtents: Array<Vector3>;\r\n\r\n /**\r\n * Gets a cascade minimum extents\r\n * @param cascadeIndex index of the cascade\r\n * @returns the minimum cascade extents\r\n */\r\n public getCascadeMinExtents(cascadeIndex: number): Nullable<Vector3> {\r\n return cascadeIndex >= 0 && cascadeIndex < this._numCascades ? this._cascadeMinExtents[cascadeIndex] : null;\r\n }\r\n\r\n /**\r\n * Gets a cascade maximum extents\r\n * @param cascadeIndex index of the cascade\r\n * @returns the maximum cascade extents\r\n */\r\n public getCascadeMaxExtents(cascadeIndex: number): Nullable<Vector3> {\r\n return cascadeIndex >= 0 && cascadeIndex < this._numCascades ? this._cascadeMaxExtents[cascadeIndex] : null;\r\n }\r\n\r\n private _cascades: Array<ICascade>;\r\n private _currentLayer: number;\r\n private _viewSpaceFrustumsZ: Array<number>;\r\n private _viewMatrices: Array<Matrix>;\r\n private _projectionMatrices: Array<Matrix>;\r\n private _transformMatrices: Array<Matrix>;\r\n private _transformMatricesAsArray: Float32Array;\r\n private _frustumLengths: Array<number>;\r\n private _lightSizeUVCorrection: Array<number>;\r\n private _depthCorrection: Array<number>;\r\n private _frustumCornersWorldSpace: Array<Array<Vector3>>;\r\n private _frustumCenter: Array<Vector3>;\r\n private _shadowCameraPos: Array<Vector3>;\r\n\r\n private _shadowMaxZ: number;\r\n /**\r\n * Gets the shadow max z distance. It's the limit beyond which shadows are not displayed.\r\n * It defaults to camera.maxZ\r\n */\r\n public get shadowMaxZ(): number {\r\n if (!this._scene || !this._scene.activeCamera) {\r\n return 0;\r\n }\r\n return this._shadowMaxZ;\r\n }\r\n /**\r\n * Sets the shadow max z distance.\r\n */\r\n public set shadowMaxZ(value: number) {\r\n if (!this._scene || !this._scene.activeCamera) {\r\n this._shadowMaxZ = value;\r\n return;\r\n }\r\n if (this._shadowMaxZ === value || value < this._scene.activeCamera.minZ || value > this._scene.activeCamera.maxZ) {\r\n return;\r\n }\r\n this._shadowMaxZ = value;\r\n this._light._markMeshesAsLightDirty();\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n protected _debug: boolean;\r\n\r\n /**\r\n * Gets or sets the debug flag.\r\n * When enabled, the cascades are materialized by different colors on the screen.\r\n */\r\n public get debug(): boolean {\r\n return this._debug;\r\n }\r\n\r\n public set debug(dbg: boolean) {\r\n this._debug = dbg;\r\n this._light._markMeshesAsLightDirty();\r\n }\r\n\r\n private _depthClamp: boolean;\r\n\r\n /**\r\n * Gets or sets the depth clamping value.\r\n *\r\n * When enabled, it improves the shadow quality because the near z plane of the light frustum don't need to be adjusted\r\n * to account for the shadow casters far away.\r\n *\r\n * Note that this property is incompatible with PCSS filtering, so it won't be used in that case.\r\n */\r\n public get depthClamp(): boolean {\r\n return this._depthClamp;\r\n }\r\n\r\n public set depthClamp(value: boolean) {\r\n this._depthClamp = value;\r\n }\r\n\r\n private _cascadeBlendPercentage: number;\r\n\r\n /**\r\n * Gets or sets the percentage of blending between two cascades (value between 0. and 1.).\r\n * It defaults to 0.1 (10% blending).\r\n */\r\n public get cascadeBlendPercentage(): number {\r\n return this._cascadeBlendPercentage;\r\n }\r\n\r\n public set cascadeBlendPercentage(value: number) {\r\n this._cascadeBlendPercentage = value;\r\n this._light._markMeshesAsLightDirty();\r\n }\r\n\r\n private _lambda: number;\r\n\r\n /**\r\n * Gets or set the lambda parameter.\r\n * This parameter is used to split the camera frustum and create the cascades.\r\n * It's a value between 0. and 1.: If 0, the split is a uniform split of the frustum, if 1 it is a logarithmic split.\r\n * For all values in-between, it's a linear combination of the uniform and logarithm split algorithm.\r\n */\r\n public get lambda(): number {\r\n return this._lambda;\r\n }\r\n\r\n public set lambda(value: number) {\r\n const lambda = Math.min(Math.max(value, 0), 1);\r\n if (this._lambda == lambda) {\r\n return;\r\n }\r\n this._lambda = lambda;\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n /**\r\n * Gets the view matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the view matrix from\r\n * @returns the cascade view matrix\r\n */\r\n public getCascadeViewMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._viewMatrices[cascadeNum] : null;\r\n }\r\n\r\n /**\r\n * Gets the projection matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the projection matrix from\r\n * @returns the cascade projection matrix\r\n */\r\n public getCascadeProjectionMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._projectionMatrices[cascadeNum] : null;\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the transformation matrix from\r\n * @returns the cascade transformation matrix\r\n */\r\n public getCascadeTransformMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._transformMatrices[cascadeNum] : null;\r\n }\r\n\r\n private _depthRenderer: Nullable<DepthRenderer>;\r\n /**\r\n * Sets the depth renderer to use when autoCalcDepthBounds is enabled.\r\n *\r\n * Note that if no depth renderer is set, a new one will be automatically created internally when necessary.\r\n *\r\n * You should call this function if you already have a depth renderer enabled in your scene, to avoid\r\n * doing multiple depth rendering each frame. If you provide your own depth renderer, make sure it stores linear depth!\r\n * @param depthRenderer The depth renderer to use when autoCalcDepthBounds is enabled. If you pass null or don't call this function at all, a depth renderer will be automatically created\r\n */\r\n public setDepthRenderer(depthRenderer: Nullable<DepthRenderer>): void {\r\n this._depthRenderer = depthRenderer;\r\n\r\n if (this._depthReducer) {\r\n this._depthReducer.setDepthRenderer(this._depthRenderer);\r\n }\r\n }\r\n\r\n private _depthReducer: Nullable<DepthReducer>;\r\n private _autoCalcDepthBounds: boolean;\r\n\r\n /**\r\n * Gets or sets the autoCalcDepthBounds property.\r\n *\r\n * When enabled, a depth rendering pass is first performed (with an internally created depth renderer or with the one\r\n * you provide by calling setDepthRenderer). Then, a min/max reducing is applied on the depth map to compute the\r\n * minimal and maximal depth of the map and those values are used as inputs for the setMinMaxDistance() function.\r\n * It can greatly enhance the shadow quality, at the expense of more GPU works.\r\n * When using this option, you should increase the value of the lambda parameter, and even set it to 1 for best results.\r\n */\r\n public get autoCalcDepthBounds(): boolean {\r\n return this._autoCalcDepthBounds;\r\n }\r\n\r\n public set autoCalcDepthBounds(value: boolean) {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n this._autoCalcDepthBounds = value;\r\n\r\n if (!value) {\r\n if (this._depthReducer) {\r\n this._depthReducer.deactivate();\r\n }\r\n this.setMinMaxDistance(0, 1);\r\n return;\r\n }\r\n\r\n if (!this._depthReducer) {\r\n this._depthReducer = new DepthReducer(camera);\r\n this._depthReducer.onAfterReductionPerformed.add((minmax: { min: number, max: number }) => {\r\n let min = minmax.min, max = minmax.max;\r\n if (min >= max) {\r\n min = 0;\r\n max = 1;\r\n }\r\n if (min != this._minDistance || max != this._maxDistance) {\r\n this.setMinMaxDistance(min, max);\r\n }\r\n });\r\n this._depthReducer.setDepthRenderer(this._depthRenderer);\r\n }\r\n\r\n this._depthReducer.activate();\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true\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 * Note that if you provided your own depth renderer through a call to setDepthRenderer, you are responsible\r\n * for setting the refresh rate on the renderer yourself!\r\n */\r\n public get autoCalcDepthBoundsRefreshRate(): number {\r\n return this._depthReducer?.depthRenderer?.getDepthMap().refreshRate ?? -1;\r\n }\r\n\r\n public set autoCalcDepthBoundsRefreshRate(value: number) {\r\n if (this._depthReducer?.depthRenderer) {\r\n this._depthReducer.depthRenderer.getDepthMap().refreshRate = value;\r\n }\r\n }\r\n\r\n /**\r\n * Create the cascade breaks according to the lambda, shadowMaxZ and min/max distance properties, as well as the camera near and far planes.\r\n * This function is automatically called when updating lambda, shadowMaxZ and min/max distances, however you should call it yourself if\r\n * you change the camera near/far planes!\r\n */\r\n public splitFrustum(): void {\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n private _splitFrustum(): void {\r\n let camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const near = camera.minZ,\r\n far = camera.maxZ,\r\n cameraRange = far - near,\r\n minDistance = this._minDistance,\r\n maxDistance = this._shadowMaxZ < far && this._shadowMaxZ >= near ? Math.min((this._shadowMaxZ - near) / (far - near), this._maxDistance) : this._maxDistance;\r\n\r\n const minZ = near + minDistance * cameraRange,\r\n maxZ = near + maxDistance * cameraRange;\r\n\r\n const range = maxZ - minZ,\r\n ratio = maxZ / minZ;\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._cascades.length; ++cascadeIndex) {\r\n const p = (cascadeIndex + 1) / this._numCascades,\r\n log = minZ * (ratio ** p),\r\n uniform = minZ + range * p;\r\n\r\n const d = this._lambda * (log - uniform) + uniform;\r\n\r\n this._cascades[cascadeIndex].prevBreakDistance = cascadeIndex === 0 ? minDistance : this._cascades[cascadeIndex - 1].breakDistance;\r\n this._cascades[cascadeIndex].breakDistance = (d - near) / cameraRange;\r\n\r\n this._viewSpaceFrustumsZ[cascadeIndex] = d;\r\n this._frustumLengths[cascadeIndex] = (this._cascades[cascadeIndex].breakDistance - this._cascades[cascadeIndex].prevBreakDistance) * cameraRange;\r\n }\r\n\r\n this._breaksAreDirty = false;\r\n }\r\n\r\n private _computeMatrices(): void {\r\n var scene = this._scene;\r\n\r\n let camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n Vector3.NormalizeToRef(this._light.getShadowDirection(0), this._lightDirection);\r\n if (Math.abs(Vector3.Dot(this._lightDirection, Vector3.Up())) === 1.0) {\r\n this._lightDirection.z = 0.0000000000001; // Required to avoid perfectly perpendicular light\r\n }\r\n\r\n this._cachedDirection.copyFrom(this._lightDirection);\r\n\r\n const useReverseDepthBuffer = scene.getEngine().useReverseDepthBuffer;\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._computeFrustumInWorldSpace(cascadeIndex);\r\n this._computeCascadeFrustum(cascadeIndex);\r\n\r\n this._cascadeMaxExtents[cascadeIndex].subtractToRef(this._cascadeMinExtents[cascadeIndex], tmpv1); // tmpv1 = cascadeExtents\r\n\r\n // Get position of the shadow camera\r\n this._frustumCenter[cascadeIndex].addToRef(this._lightDirection.scale(this._cascadeMinExtents[cascadeIndex].z), this._shadowCameraPos[cascadeIndex]);\r\n\r\n // Come up with a new orthographic camera for the shadow caster\r\n Matrix.LookAtLHToRef(this._shadowCameraPos[cascadeIndex], this._frustumCenter[cascadeIndex], UpDir, this._viewMatrices[cascadeIndex]);\r\n\r\n let minZ = 0, maxZ = tmpv1.z;\r\n\r\n // Try to tighten minZ and maxZ based on the bounding box of the shadow casters\r\n const boundingInfo = this._shadowCastersBoundingInfo;\r\n\r\n boundingInfo.update(this._viewMatrices[cascadeIndex]);\r\n\r\n maxZ = Math.min(maxZ, boundingInfo.boundingBox.maximumWorld.z);\r\n\r\n if (!this._depthClamp || this.filter === ShadowGenerator.FILTER_PCSS) {\r\n // If we don't use depth clamping, we must set minZ so that all shadow casters are in the light frustum\r\n minZ = Math.min(minZ, boundingInfo.boundingBox.minimumWorld.z);\r\n } else {\r\n // If using depth clamping, we can adjust minZ to reduce the [minZ, maxZ] range (and get some additional precision in the shadow map)\r\n minZ = Math.max(minZ, boundingInfo.boundingBox.minimumWorld.z);\r\n }\r\n\r\n Matrix.OrthoOffCenterLHToRef(this._cascadeMinExtents[cascadeIndex].x, this._cascadeMaxExtents[cascadeIndex].x, this._cascadeMinExtents[cascadeIndex].y, this._cascadeMaxExtents[cascadeIndex].y,\r\n useReverseDepthBuffer ? maxZ : minZ, useReverseDepthBuffer ? minZ : maxZ, this._projectionMatrices[cascadeIndex], scene.getEngine().isNDCHalfZRange);\r\n\r\n this._cascadeMinExtents[cascadeIndex].z = minZ;\r\n this._cascadeMaxExtents[cascadeIndex].z = maxZ;\r\n\r\n this._viewMatrices[cascadeIndex].multiplyToRef(this._projectionMatrices[cascadeIndex], this._transformMatrices[cascadeIndex]);\r\n\r\n // Create the rounding matrix, by projecting the world-space origin and determining\r\n // the fractional offset in texel space\r\n Vector3.TransformCoordinatesToRef(ZeroVec, this._transformMatrices[cascadeIndex], tmpv1); // tmpv1 = shadowOrigin\r\n tmpv1.scaleInPlace(this._mapSize / 2);\r\n\r\n tmpv2.copyFromFloats(Math.round(tmpv1.x), Math.round(tmpv1.y), Math.round(tmpv1.z)); // tmpv2 = roundedOrigin\r\n tmpv2.subtractInPlace(tmpv1).scaleInPlace(2 / this._mapSize); // tmpv2 = roundOffset\r\n\r\n Matrix.TranslationToRef(tmpv2.x, tmpv2.y, 0.0, tmpMatrix);\r\n\r\n this._projectionMatrices[cascadeIndex].multiplyToRef(tmpMatrix, this._projectionMatrices[cascadeIndex]);\r\n this._viewMatrices[cascadeIndex].multiplyToRef(this._projectionMatrices[cascadeIndex], this._transformMatrices[cascadeIndex]);\r\n\r\n this._transformMatrices[cascadeIndex].copyToArray(this._transformMatricesAsArray, cascadeIndex * 16);\r\n }\r\n }\r\n\r\n // Get the 8 points of the view frustum in world space\r\n private _computeFrustumInWorldSpace(cascadeIndex: number): void {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const prevSplitDist = this._cascades[cascadeIndex].prevBreakDistance,\r\n splitDist = this._cascades[cascadeIndex].breakDistance;\r\n\r\n const isNDCHalfZRange = this._scene.getEngine().isNDCHalfZRange;\r\n\r\n this._scene.activeCamera.getViewMatrix(); // make sure the transformation matrix we get when calling 'getTransformationMatrix()' is calculated with an up to date view matrix\r\n\r\n const invViewProj = Matrix.Invert(this._scene.activeCamera.getTransformationMatrix());\r\n const cornerIndexOffset = this._scene.getEngine().useReverseDepthBuffer ? 4 : 0;\r\n for (let cornerIndex = 0; cornerIndex < CascadedShadowGenerator.frustumCornersNDCSpace.length; ++cornerIndex) {\r\n tmpv1.copyFrom(CascadedShadowGenerator.frustumCornersNDCSpace[(cornerIndex + cornerIndexOffset) % CascadedShadowGenerator.frustumCornersNDCSpace.length]);\r\n if (isNDCHalfZRange && tmpv1.z === -1) {\r\n tmpv1.z = 0;\r\n }\r\n Vector3.TransformCoordinatesToRef(tmpv1, invViewProj, this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n }\r\n\r\n // Get the corners of the current cascade slice of the view frustum\r\n for (let cornerIndex = 0; cornerIndex < CascadedShadowGenerator.frustumCornersNDCSpace.length / 2; ++cornerIndex) {\r\n tmpv1.copyFrom(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex + 4]).subtractInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n tmpv2.copyFrom(tmpv1).scaleInPlace(prevSplitDist); // near corner ray\r\n tmpv1.scaleInPlace(splitDist); // far corner ray\r\n\r\n tmpv1.addInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n\r\n this._frustumCornersWorldSpace[cascadeIndex][cornerIndex + 4].copyFrom(tmpv1);\r\n this._frustumCornersWorldSpace[cascadeIndex][cornerIndex].addInPlace(tmpv2);\r\n }\r\n }\r\n\r\n private _computeCascadeFrustum(cascadeIndex: number): void {\r\n this._cascadeMinExtents[cascadeIndex].copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cascadeMaxExtents[cascadeIndex].copyFromFloats(Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE);\r\n this._frustumCenter[cascadeIndex].copyFromFloats(0, 0, 0);\r\n\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n // Calculate the centroid of the view frustum slice\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n this._frustumCenter[cascadeIndex].addInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n }\r\n\r\n this._frustumCenter[cascadeIndex].scaleInPlace(1 / this._frustumCornersWorldSpace[cascadeIndex].length);\r\n\r\n if (this.stabilizeCascades) {\r\n // Calculate the radius of a bounding sphere surrounding the frustum corners\r\n let sphereRadius = 0;\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n const dist = this._frustumCornersWorldSpace[cascadeIndex][cornerIndex].subtractToRef(this._frustumCenter[cascadeIndex], tmpv1).length();\r\n sphereRadius = Math.max(sphereRadius, dist);\r\n }\r\n\r\n sphereRadius = Math.ceil(sphereRadius * 16) / 16;\r\n\r\n this._cascadeMaxExtents[cascadeIndex].copyFromFloats(sphereRadius, sphereRadius, sphereRadius);\r\n this._cascadeMinExtents[cascadeIndex].copyFromFloats(-sphereRadius, -sphereRadius, -sphereRadius);\r\n } else {\r\n // Create a temporary view matrix for the light\r\n const lightCameraPos = this._frustumCenter[cascadeIndex];\r\n\r\n this._frustumCenter[cascadeIndex].addToRef(this._lightDirection, tmpv1); // tmpv1 = look at\r\n\r\n Matrix.LookAtLHToRef(lightCameraPos, tmpv1, UpDir, tmpMatrix); // matrix = lightView\r\n\r\n // Calculate an AABB around the frustum corners\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n Vector3.TransformCoordinatesToRef(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex], tmpMatrix, tmpv1);\r\n\r\n this._cascadeMinExtents[cascadeIndex].minimizeInPlace(tmpv1);\r\n this._cascadeMaxExtents[cascadeIndex].maximizeInPlace(tmpv1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n var engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportCSM;\r\n }\r\n\r\n /** @hidden */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"ShadowGeneratorSceneComponent\");\r\n }\r\n\r\n private _nameForDrawWrapperOrig: string;\r\n\r\n /**\r\n * Creates a Cascaded Shadow Generator object.\r\n * A ShadowGenerator is the required tool to use the shadows.\r\n * Each directional light casting shadows needs to use its own ShadowGenerator.\r\n * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows\r\n * @param mapSize The size of the texture what stores the shadows. Example : 1024.\r\n * @param light The directional light object generating the shadows.\r\n * @param usefulFloatFirst By default the generator will try to use half float textures but if you need precision (for self shadowing for instance), you can use this option to enforce full float texture.\r\n */\r\n constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean) {\r\n if (!CascadedShadowGenerator.IsSupported) {\r\n Logger.Error(\"CascadedShadowMap is not supported by the current engine.\");\r\n return;\r\n }\r\n\r\n super(mapSize, light, usefulFloatFirst);\r\n\r\n this.usePercentageCloserFiltering = true;\r\n this._nameForDrawWrapperOrig = this._nameForDrawWrapper[0];\r\n }\r\n\r\n protected _initializeGenerator(): void {\r\n this.penumbraDarkness = this.penumbraDarkness ?? 1.0;\r\n this._numCascades = this._numCascades ?? CascadedShadowGenerator.DEFAULT_CASCADES_COUNT;\r\n this._setNamesForDrawWrapper();\r\n this.stabilizeCascades = this.stabilizeCascades ?? false;\r\n this._freezeShadowCastersBoundingInfoObservable = this._freezeShadowCastersBoundingInfoObservable ?? null;\r\n this.freezeShadowCastersBoundingInfo = this.freezeShadowCastersBoundingInfo ?? false;\r\n this._scbiMin = this._scbiMin ?? new Vector3(0, 0, 0);\r\n this._scbiMax = this._scbiMax ?? new Vector3(0, 0, 0);\r\n this._shadowCastersBoundingInfo = this._shadowCastersBoundingInfo ?? new BoundingInfo(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n this._breaksAreDirty = this._breaksAreDirty ?? true;\r\n this._minDistance = this._minDistance ?? 0;\r\n this._maxDistance = this._maxDistance ?? 1;\r\n this._currentLayer = this._currentLayer ?? 0;\r\n this._shadowMaxZ = this._shadowMaxZ ?? this._scene.activeCamera?.maxZ ?? 10000;\r\n this._debug = this._debug ?? false;\r\n this._depthClamp = this._depthClamp ?? true;\r\n this._cascadeBlendPercentage = this._cascadeBlendPercentage ?? 0.1;\r\n this._lambda = this._lambda ?? 0.5;\r\n this._autoCalcDepthBounds = this._autoCalcDepthBounds ?? false;\r\n\r\n super._initializeGenerator();\r\n }\r\n\r\n protected _createTargetRenderTexture(): void {\r\n const engine = this._scene.getEngine();\r\n const size = { width: this._mapSize, height: this._mapSize, layers: this.numCascades };\r\n this._shadowMap = new RenderTargetTexture(this._light.name + \"_shadowMap\", size, this._scene, false, true, this._textureType, false, undefined, false, false, undefined/*, 6*/);\r\n this._shadowMap.createDepthStencilTexture(engine.useReverseDepthBuffer ? 516 : 513, true);\r\n }\r\n\r\n protected _initializeShadowMap(): void {\r\n super._initializeShadowMap();\r\n\r\n if (this._shadowMap === null) {\r\n return;\r\n }\r\n\r\n this._transformMatricesAsArray = new Float32Array(this._numCascades * 16);\r\n this._viewSpaceFrustumsZ = new Array(this._numCascades);\r\n this._frustumLengths = new Array(this._numCascades);\r\n this._lightSizeUVCorrection = new Array(this._numCascades * 2);\r\n this._depthCorrection = new Array(this._numCascades);\r\n\r\n this._cascades = [];\r\n this._viewMatrices = [];\r\n this._projectionMatrices = [];\r\n this._transformMatrices = [];\r\n this._cascadeMinExtents = [];\r\n this._cascadeMaxExtents = [];\r\n this._frustumCenter = [];\r\n this._shadowCameraPos = [];\r\n this._frustumCornersWorldSpace = [];\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._cascades[cascadeIndex] = {\r\n prevBreakDistance: 0,\r\n breakDistance: 0,\r\n };\r\n\r\n this._viewMatrices[cascadeIndex] = Matrix.Zero();\r\n this._projectionMatrices[cascadeIndex] = Matrix.Zero();\r\n this._transformMatrices[cascadeIndex] = Matrix.Zero();\r\n this._cascadeMinExtents[cascadeIndex] = new Vector3();\r\n this._cascadeMaxExtents[cascadeIndex] = new Vector3();\r\n this._frustumCenter[cascadeIndex] = new Vector3();\r\n this._shadowCameraPos[cascadeIndex] = new Vector3();\r\n this._frustumCornersWorldSpace[cascadeIndex] = new Array(CascadedShadowGenerator.frustumCornersNDCSpace.length);\r\n\r\n for (let i = 0; i < CascadedShadowGenerator.frustumCornersNDCSpace.length; ++i) {\r\n this._frustumCornersWorldSpace[cascadeIndex][i] = new Vector3();\r\n }\r\n }\r\n\r\n let engine = this._scene.getEngine();\r\n\r\n this._shadowMap.onBeforeBindObservable.clear();\r\n this._shadowMap.onBeforeRenderObservable.clear();\r\n\r\n this._shadowMap.onBeforeRenderObservable.add((layer: number) => {\r\n this._nameForDrawWrapperCurrent = this._nameForDrawWrapper[layer];\r\n this._currentLayer = layer;\r\n if (this._filter === ShadowGenerator.FILTER_PCF) {\r\n engine.setColorWrite(false);\r\n }\r\n this._scene.setTransformMatrix(this.getCascadeViewMatrix(layer)!, this.getCascadeProjectionMatrix(layer)!);\r\n if (this._useUBO) {\r\n this._scene.finalizeSceneUbo();\r\n }\r\n });\r\n\r\n this._shadowMap.onBeforeBindObservable.add(() => {\r\n engine._debugPushGroup?.(`cascaded shadow map generation for ${this._nameForDrawWrapper}`, 1);\r\n if (this._breaksAreDirty) {\r\n this._splitFrustum();\r\n }\r\n this._computeMatrices();\r\n });\r\n\r\n this._splitFrustum();\r\n }\r\n\r\n protected _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect, mesh: AbstractMesh): void {\r\n effect.setMatrix(\"viewProjection\", this.getCascadeTransformMatrix(this._currentLayer)!);\r\n }\r\n\r\n protected _isReadyCustomDefines(defines: any, subMesh: SubMesh, useInstances: boolean): void {\r\n defines.push(\"#define SM_DEPTHCLAMP \" + (this._depthClamp && this._filter !== ShadowGenerator.FILTER_PCSS ? \"1\" : \"0\"));\r\n }\r\n\r\n /**\r\n * Prepare all the defines in a material relying on a shadow map at the specified light index.\r\n * @param defines Defines of the material we want to update\r\n * @param lightIndex Index of the light in the enabled light list of the material\r\n */\r\n public prepareDefines(defines: any, lightIndex: number): void {\r\n super.prepareDefines(defines, lightIndex);\r\n\r\n var scene = this._scene;\r\n var light = this._light;\r\n\r\n if (!scene.shadowsEnabled || !light.shadowEnabled) {\r\n return;\r\n }\r\n\r\n defines[\"SHADOWCSM\" + lightIndex] = true;\r\n defines[\"SHADOWCSMDEBUG\" + lightIndex] = this.debug;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + lightIndex] = this.numCascades;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + lightIndex] = scene.useRightHandedSystem;\r\n\r\n const camera = scene.activeCamera;\r\n\r\n if (camera && this._shadowMaxZ < camera.maxZ) {\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + lightIndex] = true;\r\n }\r\n\r\n if (this.cascadeBlendPercentage === 0) {\r\n defines[\"SHADOWCSMNOBLEND\" + lightIndex] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the shadow related information inside of an effect (information like near, far, darkness...\r\n * defined in the generator but impacting the effect).\r\n * @param lightIndex Index of the light in the enabled light list of the material owning the effect\r\n * @param effect The effect we are binfing the information for\r\n */\r\n public bindShadowLight(lightIndex: string, effect: Effect): void {\r\n const light = this._light;\r\n const scene = this._scene;\r\n\r\n if (!scene.shadowsEnabled || !light.shadowEnabled) {\r\n return;\r\n }\r\n\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const shadowMap = this.getShadowMap();\r\n if (!shadowMap) {\r\n return;\r\n }\r\n\r\n const width = shadowMap.getSize().width;\r\n\r\n effect.setMatrices(\"lightMatrix\" + lightIndex, this._transformMatricesAsArray);\r\n effect.setArray(\"viewFrustumZ\" + lightIndex, this._viewSpaceFrustumsZ);\r\n effect.setFloat(\"cascadeBlendFactor\" + lightIndex, this.cascadeBlendPercentage === 0 ? 10000 : 1 / this.cascadeBlendPercentage);\r\n effect.setArray(\"frustumLengths\" + lightIndex, this._frustumLengths);\r\n\r\n // Only PCF uses depth stencil texture.\r\n if (this._filter === ShadowGenerator.FILTER_PCF) {\r\n effect.setDepthStencilTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), width, 1 / width, this.frustumEdgeFalloff, lightIndex);\r\n } else if (this._filter === ShadowGenerator.FILTER_PCSS) {\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._lightSizeUVCorrection[cascadeIndex * 2 + 0] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[0].x - this._cascadeMinExtents[0].x) / (this._cascadeMaxExtents[cascadeIndex].x - this._cascadeMinExtents[cascadeIndex].x); // x correction\r\n this._lightSizeUVCorrection[cascadeIndex * 2 + 1] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[0].y - this._cascadeMinExtents[0].y) / (this._cascadeMaxExtents[cascadeIndex].y - this._cascadeMinExtents[cascadeIndex].y); // y correction\r\n this._depthCorrection[cascadeIndex] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[cascadeIndex].z - this._cascadeMinExtents[cascadeIndex].z) / (this._cascadeMaxExtents[0].z - this._cascadeMinExtents[0].z);\r\n }\r\n effect.setDepthStencilTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n effect.setTexture(\"depthSampler\" + lightIndex, shadowMap);\r\n effect.setArray2(\"lightSizeUVCorrection\" + lightIndex, this._lightSizeUVCorrection);\r\n effect.setArray(\"depthCorrection\" + lightIndex, this._depthCorrection);\r\n effect.setFloat(\"penumbraDarkness\" + lightIndex, this.penumbraDarkness);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), 1 / width, this._contactHardeningLightSizeUVRatio * width, this.frustumEdgeFalloff, lightIndex);\r\n }\r\n else {\r\n effect.setTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), width, 1 / width, this.frustumEdgeFalloff, lightIndex);\r\n }\r\n\r\n light._uniformBuffer.updateFloat2(\"depthValues\", this.getLight().getDepthMinZ(camera), this.getLight().getDepthMinZ(camera) + this.getLight().getDepthMaxZ(camera), lightIndex);\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix of the first cascade used to project the meshes into the map from the light point of view.\r\n * (eq to view projection * shadow projection matrices)\r\n * @returns The transform matrix used to create the shadow map\r\n */\r\n public getTransformMatrix(): Matrix {\r\n return this.getCascadeTransformMatrix(0)!;\r\n }\r\n\r\n /**\r\n * Disposes the ShadowGenerator.\r\n * Returns nothing.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n if (this._freezeShadowCastersBoundingInfoObservable) {\r\n this._scene.onBeforeRenderObservable.remove(this._freezeShadowCastersBoundingInfoObservable);\r\n this._freezeShadowCastersBoundingInfoObservable = null;\r\n }\r\n\r\n if (this._depthReducer) {\r\n this._depthReducer.dispose();\r\n this._depthReducer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serializes the shadow generator setup to a json object.\r\n * @returns The serialized JSON object\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = super.serialize();\r\n var shadowMap = this.getShadowMap();\r\n\r\n if (!shadowMap) {\r\n return serializationObject;\r\n }\r\n\r\n serializationObject.numCascades = this._numCascades;\r\n serializationObject.debug = this._debug;\r\n serializationObject.stabilizeCascades = this.stabilizeCascades;\r\n serializationObject.lambda = this._lambda;\r\n serializationObject.cascadeBlendPercentage = this.cascadeBlendPercentage;\r\n serializationObject.depthClamp = this._depthClamp;\r\n serializationObject.autoCalcDepthBounds = this.autoCalcDepthBounds;\r\n serializationObject.shadowMaxZ = this._shadowMaxZ;\r\n serializationObject.penumbraDarkness = this.penumbraDarkness;\r\n\r\n serializationObject.freezeShadowCastersBoundingInfo = this._freezeShadowCastersBoundingInfo;\r\n serializationObject.minDistance = this.minDistance;\r\n serializationObject.maxDistance = this.maxDistance;\r\n\r\n serializationObject.renderList = [];\r\n if (shadowMap.renderList) {\r\n for (var meshIndex = 0; meshIndex < shadowMap.renderList.length; meshIndex++) {\r\n var mesh = shadowMap.renderList[meshIndex];\r\n\r\n serializationObject.renderList.push(mesh.id);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a serialized ShadowGenerator and returns a new ShadowGenerator.\r\n * @param parsedShadowGenerator The JSON object to parse\r\n * @param scene The scene to create the shadow map for\r\n * @returns The parsed shadow generator\r\n */\r\n public static Parse(parsedShadowGenerator: any, scene: Scene): ShadowGenerator {\r\n var shadowGenerator = ShadowGenerator.Parse(parsedShadowGenerator, scene, (mapSize: number, light: IShadowLight) => new CascadedShadowGenerator(mapSize, <DirectionalLight>light)) as CascadedShadowGenerator;\r\n\r\n if (parsedShadowGenerator.numCascades !== undefined) {\r\n shadowGenerator.numCascades = parsedShadowGenerator.numCascades;\r\n }\r\n\r\n if (parsedShadowGenerator.debug !== undefined) {\r\n shadowGenerator.debug = parsedShadowGenerator.debug;\r\n }\r\n\r\n if (parsedShadowGenerator.stabilizeCascades !== undefined) {\r\n shadowGenerator.stabilizeCascades = parsedShadowGenerator.stabilizeCascades;\r\n }\r\n\r\n if (parsedShadowGenerator.lambda !== undefined) {\r\n shadowGenerator.lambda = parsedShadowGenerator.lambda;\r\n }\r\n\r\n if (parsedShadowGenerator.cascadeBlendPercentage !== undefined) {\r\n shadowGenerator.cascadeBlendPercentage = parsedShadowGenerator.cascadeBlendPercentage;\r\n }\r\n\r\n if (parsedShadowGenerator.depthClamp !== undefined) {\r\n shadowGenerator.depthClamp = parsedShadowGenerator.depthClamp;\r\n }\r\n\r\n if (parsedShadowGenerator.autoCalcDepthBounds !== undefined) {\r\n shadowGenerator.autoCalcDepthBounds = parsedShadowGenerator.autoCalcDepthBounds;\r\n }\r\n\r\n if (parsedShadowGenerator.shadowMaxZ !== undefined) {\r\n shadowGenerator.shadowMaxZ = parsedShadowGenerator.shadowMaxZ;\r\n }\r\n\r\n if (parsedShadowGenerator.penumbraDarkness !== undefined) {\r\n shadowGenerator.penumbraDarkness = parsedShadowGenerator.penumbraDarkness;\r\n }\r\n\r\n if (parsedShadowGenerator.freezeShadowCastersBoundingInfo !== undefined) {\r\n shadowGenerator.freezeShadowCastersBoundingInfo = parsedShadowGenerator.freezeShadowCastersBoundingInfo;\r\n }\r\n\r\n if (parsedShadowGenerator.minDistance !== undefined && parsedShadowGenerator.maxDistance !== undefined) {\r\n shadowGenerator.setMinMaxDistance(parsedShadowGenerator.minDistance, parsedShadowGenerator.maxDistance);\r\n }\r\n\r\n return shadowGenerator;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"cascadedShadowGenerator.js","sourceRoot":"","sources":["../../../../sourceES6/core/Lights/Shadows/cascadedShadowGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../../types\";\r\nimport { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { SubMesh } from \"../../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\n\r\nimport { IShadowLight } from \"../../Lights/shadowLight\";\r\nimport { Effect } from \"../../Materials/effect\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\n\r\n\r\n\r\nimport \"../../Shaders/shadowMap.fragment\";\r\nimport \"../../Shaders/shadowMap.vertex\";\r\nimport \"../../Shaders/depthBoxBlur.fragment\";\r\nimport { Observer } from '../../Misc/observable';\r\nimport { _WarnImport } from '../../Misc/devTools';\r\nimport { ShadowGenerator } from './shadowGenerator';\r\nimport { DirectionalLight } from '../directionalLight';\r\n\r\nimport { BoundingInfo } from '../../Culling/boundingInfo';\r\nimport { DepthRenderer } from '../../Rendering/depthRenderer';\r\nimport { DepthReducer } from '../../Misc/depthReducer';\r\n\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { EngineStore } from '../../Engines/engineStore';\r\n\r\ninterface ICascade {\r\n prevBreakDistance: number;\r\n breakDistance: number;\r\n}\r\n\r\nconst UpDir = Vector3.Up();\r\nconst ZeroVec = Vector3.Zero();\r\n\r\nlet tmpv1 = new Vector3(),\r\n tmpv2 = new Vector3(),\r\n tmpMatrix = new Matrix();\r\n\r\n/**\r\n * A CSM implementation allowing casting shadows on large scenes.\r\n * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows\r\n * Based on: https://github.com/TheRealMJP/Shadows and https://johanmedestrom.wordpress.com/2016/03/18/opengl-cascaded-shadow-maps/\r\n */\r\nexport class CascadedShadowGenerator extends ShadowGenerator {\r\n\r\n private static readonly frustumCornersNDCSpace = [\r\n new Vector3(-1.0, +1.0, -1.0),\r\n new Vector3(+1.0, +1.0, -1.0),\r\n new Vector3(+1.0, -1.0, -1.0),\r\n new Vector3(-1.0, -1.0, -1.0),\r\n new Vector3(-1.0, +1.0, +1.0),\r\n new Vector3(+1.0, +1.0, +1.0),\r\n new Vector3(+1.0, -1.0, +1.0),\r\n new Vector3(-1.0, -1.0, +1.0),\r\n ];\r\n\r\n /**\r\n * Name of the CSM class\r\n */\r\n public static CLASSNAME = \"CascadedShadowGenerator\";\r\n\r\n /**\r\n * Defines the default number of cascades used by the CSM.\r\n */\r\n public static readonly DEFAULT_CASCADES_COUNT = 4;\r\n /**\r\n * Defines the minimum number of cascades used by the CSM.\r\n */\r\n public static readonly MIN_CASCADES_COUNT = 2;\r\n /**\r\n * Defines the maximum number of cascades used by the CSM.\r\n */\r\n public static readonly MAX_CASCADES_COUNT = 4;\r\n\r\n protected _validateFilter(filter: number): number {\r\n if (filter === ShadowGenerator.FILTER_NONE ||\r\n filter === ShadowGenerator.FILTER_PCF ||\r\n filter === ShadowGenerator.FILTER_PCSS) {\r\n return filter;\r\n }\r\n\r\n console.error('Unsupported filter \"' + filter + '\"!');\r\n\r\n return ShadowGenerator.FILTER_NONE;\r\n }\r\n\r\n /**\r\n * Gets or sets the actual darkness of the soft shadows while using PCSS filtering (value between 0. and 1.)\r\n */\r\n public penumbraDarkness: number;\r\n\r\n private _numCascades: number;\r\n\r\n /**\r\n * Gets or set the number of cascades used by the CSM.\r\n */\r\n public get numCascades(): number {\r\n return this._numCascades;\r\n }\r\n\r\n public set numCascades(value: number) {\r\n value = Math.min(Math.max(value, CascadedShadowGenerator.MIN_CASCADES_COUNT), CascadedShadowGenerator.MAX_CASCADES_COUNT);\r\n if (value === this._numCascades) {\r\n return;\r\n }\r\n\r\n this._numCascades = value;\r\n this.recreateShadowMap();\r\n }\r\n\r\n /**\r\n * Sets this to true if you want that the edges of the shadows don't \"swimm\" / \"shimmer\" when rotating the camera.\r\n * The trade off is that you lose some precision in the shadow rendering when enabling this setting.\r\n */\r\n public stabilizeCascades: boolean;\r\n\r\n private _freezeShadowCastersBoundingInfo: boolean;\r\n private _freezeShadowCastersBoundingInfoObservable: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Enables or disables the shadow casters bounding info computation.\r\n * If your shadow casters don't move, you can disable this feature.\r\n * If it is enabled, the bounding box computation is done every frame.\r\n */\r\n public get freezeShadowCastersBoundingInfo(): boolean {\r\n return this._freezeShadowCastersBoundingInfo;\r\n }\r\n\r\n public set freezeShadowCastersBoundingInfo(freeze: boolean) {\r\n if (this._freezeShadowCastersBoundingInfoObservable && freeze) {\r\n this._scene.onBeforeRenderObservable.remove(this._freezeShadowCastersBoundingInfoObservable);\r\n this._freezeShadowCastersBoundingInfoObservable = null;\r\n }\r\n\r\n if (!this._freezeShadowCastersBoundingInfoObservable && !freeze) {\r\n this._freezeShadowCastersBoundingInfoObservable = this._scene.onBeforeRenderObservable.add(this._computeShadowCastersBoundingInfo.bind(this));\r\n }\r\n\r\n this._freezeShadowCastersBoundingInfo = freeze;\r\n\r\n if (freeze) {\r\n this._computeShadowCastersBoundingInfo();\r\n }\r\n }\r\n\r\n private _scbiMin: Vector3;\r\n private _scbiMax: Vector3;\r\n\r\n protected _computeShadowCastersBoundingInfo(): void {\r\n this._scbiMin.copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._scbiMax.copyFromFloats(Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE);\r\n\r\n if (this._shadowMap && this._shadowMap.renderList) {\r\n const renderList = this._shadowMap.renderList;\r\n for (let meshIndex = 0; meshIndex < renderList.length; meshIndex++) {\r\n const mesh = renderList[meshIndex];\r\n\r\n if (!mesh) {\r\n continue;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo(),\r\n boundingBox = boundingInfo.boundingBox;\r\n\r\n this._scbiMin.minimizeInPlace(boundingBox.minimumWorld);\r\n this._scbiMax.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n\r\n const meshes = this._scene.meshes;\r\n for (let meshIndex = 0; meshIndex < meshes.length; meshIndex++) {\r\n const mesh = meshes[meshIndex];\r\n\r\n if (!mesh || !mesh.isVisible || !mesh.isEnabled || !mesh.receiveShadows) {\r\n continue;\r\n }\r\n\r\n const boundingInfo = mesh.getBoundingInfo(),\r\n boundingBox = boundingInfo.boundingBox;\r\n\r\n this._scbiMin.minimizeInPlace(boundingBox.minimumWorld);\r\n this._scbiMax.maximizeInPlace(boundingBox.maximumWorld);\r\n }\r\n }\r\n\r\n this._shadowCastersBoundingInfo.reConstruct(this._scbiMin, this._scbiMax);\r\n }\r\n\r\n protected _shadowCastersBoundingInfo: BoundingInfo;\r\n\r\n /**\r\n * Gets or sets the shadow casters bounding info.\r\n * If you provide your own shadow casters bounding info, first enable freezeShadowCastersBoundingInfo\r\n * so that the system won't overwrite the bounds you provide\r\n */\r\n public get shadowCastersBoundingInfo(): BoundingInfo {\r\n return this._shadowCastersBoundingInfo;\r\n }\r\n\r\n public set shadowCastersBoundingInfo(boundingInfo: BoundingInfo) {\r\n this._shadowCastersBoundingInfo = boundingInfo;\r\n }\r\n\r\n protected _breaksAreDirty: boolean;\r\n\r\n protected _minDistance: number;\r\n protected _maxDistance: number;\r\n\r\n /**\r\n * Sets the minimal and maximal distances to use when computing the cascade breaks.\r\n *\r\n * The values of min / max are typically the depth zmin and zmax values of your scene, for a given frame.\r\n * If you don't know these values, simply leave them to their defaults and don't call this function.\r\n * @param min minimal distance for the breaks (default to 0.)\r\n * @param max maximal distance for the breaks (default to 1.)\r\n */\r\n public setMinMaxDistance(min: number, max: number): void {\r\n if (this._minDistance === min && this._maxDistance === max) {\r\n return;\r\n }\r\n\r\n if (min > max) {\r\n min = 0;\r\n max = 1;\r\n }\r\n\r\n if (min < 0) {\r\n min = 0;\r\n }\r\n\r\n if (max > 1) {\r\n max = 1;\r\n }\r\n\r\n this._minDistance = min;\r\n this._maxDistance = max;\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n /** Gets the minimal distance used in the cascade break computation */\r\n public get minDistance(): number {\r\n return this._minDistance;\r\n }\r\n\r\n /** Gets the maximal distance used in the cascade break computation */\r\n public get maxDistance(): number {\r\n return this._maxDistance;\r\n }\r\n\r\n /**\r\n * Gets the class name of that object\r\n * @returns \"CascadedShadowGenerator\"\r\n */\r\n public getClassName(): string {\r\n return CascadedShadowGenerator.CLASSNAME;\r\n }\r\n\r\n private _cascadeMinExtents: Array<Vector3>;\r\n private _cascadeMaxExtents: Array<Vector3>;\r\n\r\n /**\r\n * Gets a cascade minimum extents\r\n * @param cascadeIndex index of the cascade\r\n * @returns the minimum cascade extents\r\n */\r\n public getCascadeMinExtents(cascadeIndex: number): Nullable<Vector3> {\r\n return cascadeIndex >= 0 && cascadeIndex < this._numCascades ? this._cascadeMinExtents[cascadeIndex] : null;\r\n }\r\n\r\n /**\r\n * Gets a cascade maximum extents\r\n * @param cascadeIndex index of the cascade\r\n * @returns the maximum cascade extents\r\n */\r\n public getCascadeMaxExtents(cascadeIndex: number): Nullable<Vector3> {\r\n return cascadeIndex >= 0 && cascadeIndex < this._numCascades ? this._cascadeMaxExtents[cascadeIndex] : null;\r\n }\r\n\r\n private _cascades: Array<ICascade>;\r\n private _currentLayer: number;\r\n private _viewSpaceFrustumsZ: Array<number>;\r\n private _viewMatrices: Array<Matrix>;\r\n private _projectionMatrices: Array<Matrix>;\r\n private _transformMatrices: Array<Matrix>;\r\n private _transformMatricesAsArray: Float32Array;\r\n private _frustumLengths: Array<number>;\r\n private _lightSizeUVCorrection: Array<number>;\r\n private _depthCorrection: Array<number>;\r\n private _frustumCornersWorldSpace: Array<Array<Vector3>>;\r\n private _frustumCenter: Array<Vector3>;\r\n private _shadowCameraPos: Array<Vector3>;\r\n\r\n private _shadowMaxZ: number;\r\n /**\r\n * Gets the shadow max z distance. It's the limit beyond which shadows are not displayed.\r\n * It defaults to camera.maxZ\r\n */\r\n public get shadowMaxZ(): number {\r\n if (!this._scene || !this._scene.activeCamera) {\r\n return 0;\r\n }\r\n return this._shadowMaxZ;\r\n }\r\n /**\r\n * Sets the shadow max z distance.\r\n */\r\n public set shadowMaxZ(value: number) {\r\n if (!this._scene || !this._scene.activeCamera) {\r\n this._shadowMaxZ = value;\r\n return;\r\n }\r\n if (this._shadowMaxZ === value || value < this._scene.activeCamera.minZ || value > this._scene.activeCamera.maxZ) {\r\n return;\r\n }\r\n this._shadowMaxZ = value;\r\n this._light._markMeshesAsLightDirty();\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n protected _debug: boolean;\r\n\r\n /**\r\n * Gets or sets the debug flag.\r\n * When enabled, the cascades are materialized by different colors on the screen.\r\n */\r\n public get debug(): boolean {\r\n return this._debug;\r\n }\r\n\r\n public set debug(dbg: boolean) {\r\n this._debug = dbg;\r\n this._light._markMeshesAsLightDirty();\r\n }\r\n\r\n private _depthClamp: boolean;\r\n\r\n /**\r\n * Gets or sets the depth clamping value.\r\n *\r\n * When enabled, it improves the shadow quality because the near z plane of the light frustum don't need to be adjusted\r\n * to account for the shadow casters far away.\r\n *\r\n * Note that this property is incompatible with PCSS filtering, so it won't be used in that case.\r\n */\r\n public get depthClamp(): boolean {\r\n return this._depthClamp;\r\n }\r\n\r\n public set depthClamp(value: boolean) {\r\n this._depthClamp = value;\r\n }\r\n\r\n private _cascadeBlendPercentage: number;\r\n\r\n /**\r\n * Gets or sets the percentage of blending between two cascades (value between 0. and 1.).\r\n * It defaults to 0.1 (10% blending).\r\n */\r\n public get cascadeBlendPercentage(): number {\r\n return this._cascadeBlendPercentage;\r\n }\r\n\r\n public set cascadeBlendPercentage(value: number) {\r\n this._cascadeBlendPercentage = value;\r\n this._light._markMeshesAsLightDirty();\r\n }\r\n\r\n private _lambda: number;\r\n\r\n /**\r\n * Gets or set the lambda parameter.\r\n * This parameter is used to split the camera frustum and create the cascades.\r\n * It's a value between 0. and 1.: If 0, the split is a uniform split of the frustum, if 1 it is a logarithmic split.\r\n * For all values in-between, it's a linear combination of the uniform and logarithm split algorithm.\r\n */\r\n public get lambda(): number {\r\n return this._lambda;\r\n }\r\n\r\n public set lambda(value: number) {\r\n const lambda = Math.min(Math.max(value, 0), 1);\r\n if (this._lambda == lambda) {\r\n return;\r\n }\r\n this._lambda = lambda;\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n /**\r\n * Gets the view matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the view matrix from\r\n * @returns the cascade view matrix\r\n */\r\n public getCascadeViewMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._viewMatrices[cascadeNum] : null;\r\n }\r\n\r\n /**\r\n * Gets the projection matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the projection matrix from\r\n * @returns the cascade projection matrix\r\n */\r\n public getCascadeProjectionMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._projectionMatrices[cascadeNum] : null;\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix corresponding to a given cascade\r\n * @param cascadeNum cascade to retrieve the transformation matrix from\r\n * @returns the cascade transformation matrix\r\n */\r\n public getCascadeTransformMatrix(cascadeNum: number): Nullable<Matrix> {\r\n return cascadeNum >= 0 && cascadeNum < this._numCascades ? this._transformMatrices[cascadeNum] : null;\r\n }\r\n\r\n private _depthRenderer: Nullable<DepthRenderer>;\r\n /**\r\n * Sets the depth renderer to use when autoCalcDepthBounds is enabled.\r\n *\r\n * Note that if no depth renderer is set, a new one will be automatically created internally when necessary.\r\n *\r\n * You should call this function if you already have a depth renderer enabled in your scene, to avoid\r\n * doing multiple depth rendering each frame. If you provide your own depth renderer, make sure it stores linear depth!\r\n * @param depthRenderer The depth renderer to use when autoCalcDepthBounds is enabled. If you pass null or don't call this function at all, a depth renderer will be automatically created\r\n */\r\n public setDepthRenderer(depthRenderer: Nullable<DepthRenderer>): void {\r\n this._depthRenderer = depthRenderer;\r\n\r\n if (this._depthReducer) {\r\n this._depthReducer.setDepthRenderer(this._depthRenderer);\r\n }\r\n }\r\n\r\n private _depthReducer: Nullable<DepthReducer>;\r\n private _autoCalcDepthBounds: boolean;\r\n\r\n /**\r\n * Gets or sets the autoCalcDepthBounds property.\r\n *\r\n * When enabled, a depth rendering pass is first performed (with an internally created depth renderer or with the one\r\n * you provide by calling setDepthRenderer). Then, a min/max reducing is applied on the depth map to compute the\r\n * minimal and maximal depth of the map and those values are used as inputs for the setMinMaxDistance() function.\r\n * It can greatly enhance the shadow quality, at the expense of more GPU works.\r\n * When using this option, you should increase the value of the lambda parameter, and even set it to 1 for best results.\r\n */\r\n public get autoCalcDepthBounds(): boolean {\r\n return this._autoCalcDepthBounds;\r\n }\r\n\r\n public set autoCalcDepthBounds(value: boolean) {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n this._autoCalcDepthBounds = value;\r\n\r\n if (!value) {\r\n if (this._depthReducer) {\r\n this._depthReducer.deactivate();\r\n }\r\n this.setMinMaxDistance(0, 1);\r\n return;\r\n }\r\n\r\n if (!this._depthReducer) {\r\n this._depthReducer = new DepthReducer(camera);\r\n this._depthReducer.onAfterReductionPerformed.add((minmax: { min: number, max: number }) => {\r\n let min = minmax.min, max = minmax.max;\r\n if (min >= max) {\r\n min = 0;\r\n max = 1;\r\n }\r\n if (min != this._minDistance || max != this._maxDistance) {\r\n this.setMinMaxDistance(min, max);\r\n }\r\n });\r\n this._depthReducer.setDepthRenderer(this._depthRenderer);\r\n }\r\n\r\n this._depthReducer.activate();\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true\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 * Note that if you provided your own depth renderer through a call to setDepthRenderer, you are responsible\r\n * for setting the refresh rate on the renderer yourself!\r\n */\r\n public get autoCalcDepthBoundsRefreshRate(): number {\r\n return this._depthReducer?.depthRenderer?.getDepthMap().refreshRate ?? -1;\r\n }\r\n\r\n public set autoCalcDepthBoundsRefreshRate(value: number) {\r\n if (this._depthReducer?.depthRenderer) {\r\n this._depthReducer.depthRenderer.getDepthMap().refreshRate = value;\r\n }\r\n }\r\n\r\n /**\r\n * Create the cascade breaks according to the lambda, shadowMaxZ and min/max distance properties, as well as the camera near and far planes.\r\n * This function is automatically called when updating lambda, shadowMaxZ and min/max distances, however you should call it yourself if\r\n * you change the camera near/far planes!\r\n */\r\n public splitFrustum(): void {\r\n this._breaksAreDirty = true;\r\n }\r\n\r\n private _splitFrustum(): void {\r\n let camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const near = camera.minZ,\r\n far = camera.maxZ,\r\n cameraRange = far - near,\r\n minDistance = this._minDistance,\r\n maxDistance = this._shadowMaxZ < far && this._shadowMaxZ >= near ? Math.min((this._shadowMaxZ - near) / (far - near), this._maxDistance) : this._maxDistance;\r\n\r\n const minZ = near + minDistance * cameraRange,\r\n maxZ = near + maxDistance * cameraRange;\r\n\r\n const range = maxZ - minZ,\r\n ratio = maxZ / minZ;\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._cascades.length; ++cascadeIndex) {\r\n const p = (cascadeIndex + 1) / this._numCascades,\r\n log = minZ * (ratio ** p),\r\n uniform = minZ + range * p;\r\n\r\n const d = this._lambda * (log - uniform) + uniform;\r\n\r\n this._cascades[cascadeIndex].prevBreakDistance = cascadeIndex === 0 ? minDistance : this._cascades[cascadeIndex - 1].breakDistance;\r\n this._cascades[cascadeIndex].breakDistance = (d - near) / cameraRange;\r\n\r\n this._viewSpaceFrustumsZ[cascadeIndex] = d;\r\n this._frustumLengths[cascadeIndex] = (this._cascades[cascadeIndex].breakDistance - this._cascades[cascadeIndex].prevBreakDistance) * cameraRange;\r\n }\r\n\r\n this._breaksAreDirty = false;\r\n }\r\n\r\n private _computeMatrices(): void {\r\n var scene = this._scene;\r\n\r\n let camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n Vector3.NormalizeToRef(this._light.getShadowDirection(0), this._lightDirection);\r\n if (Math.abs(Vector3.Dot(this._lightDirection, Vector3.Up())) === 1.0) {\r\n this._lightDirection.z = 0.0000000000001; // Required to avoid perfectly perpendicular light\r\n }\r\n\r\n this._cachedDirection.copyFrom(this._lightDirection);\r\n\r\n const useReverseDepthBuffer = scene.getEngine().useReverseDepthBuffer;\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._computeFrustumInWorldSpace(cascadeIndex);\r\n this._computeCascadeFrustum(cascadeIndex);\r\n\r\n this._cascadeMaxExtents[cascadeIndex].subtractToRef(this._cascadeMinExtents[cascadeIndex], tmpv1); // tmpv1 = cascadeExtents\r\n\r\n // Get position of the shadow camera\r\n this._frustumCenter[cascadeIndex].addToRef(this._lightDirection.scale(this._cascadeMinExtents[cascadeIndex].z), this._shadowCameraPos[cascadeIndex]);\r\n\r\n // Come up with a new orthographic camera for the shadow caster\r\n Matrix.LookAtLHToRef(this._shadowCameraPos[cascadeIndex], this._frustumCenter[cascadeIndex], UpDir, this._viewMatrices[cascadeIndex]);\r\n\r\n let minZ = 0, maxZ = tmpv1.z;\r\n\r\n // Try to tighten minZ and maxZ based on the bounding box of the shadow casters\r\n const boundingInfo = this._shadowCastersBoundingInfo;\r\n\r\n boundingInfo.update(this._viewMatrices[cascadeIndex]);\r\n\r\n maxZ = Math.min(maxZ, boundingInfo.boundingBox.maximumWorld.z);\r\n\r\n if (!this._depthClamp || this.filter === ShadowGenerator.FILTER_PCSS) {\r\n // If we don't use depth clamping, we must set minZ so that all shadow casters are in the light frustum\r\n minZ = Math.min(minZ, boundingInfo.boundingBox.minimumWorld.z);\r\n } else {\r\n // If using depth clamping, we can adjust minZ to reduce the [minZ, maxZ] range (and get some additional precision in the shadow map)\r\n minZ = Math.max(minZ, boundingInfo.boundingBox.minimumWorld.z);\r\n }\r\n\r\n Matrix.OrthoOffCenterLHToRef(this._cascadeMinExtents[cascadeIndex].x, this._cascadeMaxExtents[cascadeIndex].x, this._cascadeMinExtents[cascadeIndex].y, this._cascadeMaxExtents[cascadeIndex].y,\r\n useReverseDepthBuffer ? maxZ : minZ, useReverseDepthBuffer ? minZ : maxZ, this._projectionMatrices[cascadeIndex], scene.getEngine().isNDCHalfZRange);\r\n\r\n this._cascadeMinExtents[cascadeIndex].z = minZ;\r\n this._cascadeMaxExtents[cascadeIndex].z = maxZ;\r\n\r\n this._viewMatrices[cascadeIndex].multiplyToRef(this._projectionMatrices[cascadeIndex], this._transformMatrices[cascadeIndex]);\r\n\r\n // Create the rounding matrix, by projecting the world-space origin and determining\r\n // the fractional offset in texel space\r\n Vector3.TransformCoordinatesToRef(ZeroVec, this._transformMatrices[cascadeIndex], tmpv1); // tmpv1 = shadowOrigin\r\n tmpv1.scaleInPlace(this._mapSize / 2);\r\n\r\n tmpv2.copyFromFloats(Math.round(tmpv1.x), Math.round(tmpv1.y), Math.round(tmpv1.z)); // tmpv2 = roundedOrigin\r\n tmpv2.subtractInPlace(tmpv1).scaleInPlace(2 / this._mapSize); // tmpv2 = roundOffset\r\n\r\n Matrix.TranslationToRef(tmpv2.x, tmpv2.y, 0.0, tmpMatrix);\r\n\r\n this._projectionMatrices[cascadeIndex].multiplyToRef(tmpMatrix, this._projectionMatrices[cascadeIndex]);\r\n this._viewMatrices[cascadeIndex].multiplyToRef(this._projectionMatrices[cascadeIndex], this._transformMatrices[cascadeIndex]);\r\n\r\n this._transformMatrices[cascadeIndex].copyToArray(this._transformMatricesAsArray, cascadeIndex * 16);\r\n }\r\n }\r\n\r\n // Get the 8 points of the view frustum in world space\r\n private _computeFrustumInWorldSpace(cascadeIndex: number): void {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const prevSplitDist = this._cascades[cascadeIndex].prevBreakDistance,\r\n splitDist = this._cascades[cascadeIndex].breakDistance;\r\n\r\n const isNDCHalfZRange = this._scene.getEngine().isNDCHalfZRange;\r\n\r\n this._scene.activeCamera.getViewMatrix(); // make sure the transformation matrix we get when calling 'getTransformationMatrix()' is calculated with an up to date view matrix\r\n\r\n const invViewProj = Matrix.Invert(this._scene.activeCamera.getTransformationMatrix());\r\n const cornerIndexOffset = this._scene.getEngine().useReverseDepthBuffer ? 4 : 0;\r\n for (let cornerIndex = 0; cornerIndex < CascadedShadowGenerator.frustumCornersNDCSpace.length; ++cornerIndex) {\r\n tmpv1.copyFrom(CascadedShadowGenerator.frustumCornersNDCSpace[(cornerIndex + cornerIndexOffset) % CascadedShadowGenerator.frustumCornersNDCSpace.length]);\r\n if (isNDCHalfZRange && tmpv1.z === -1) {\r\n tmpv1.z = 0;\r\n }\r\n Vector3.TransformCoordinatesToRef(tmpv1, invViewProj, this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n }\r\n\r\n // Get the corners of the current cascade slice of the view frustum\r\n for (let cornerIndex = 0; cornerIndex < CascadedShadowGenerator.frustumCornersNDCSpace.length / 2; ++cornerIndex) {\r\n tmpv1.copyFrom(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex + 4]).subtractInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n tmpv2.copyFrom(tmpv1).scaleInPlace(prevSplitDist); // near corner ray\r\n tmpv1.scaleInPlace(splitDist); // far corner ray\r\n\r\n tmpv1.addInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n\r\n this._frustumCornersWorldSpace[cascadeIndex][cornerIndex + 4].copyFrom(tmpv1);\r\n this._frustumCornersWorldSpace[cascadeIndex][cornerIndex].addInPlace(tmpv2);\r\n }\r\n }\r\n\r\n private _computeCascadeFrustum(cascadeIndex: number): void {\r\n this._cascadeMinExtents[cascadeIndex].copyFromFloats(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n this._cascadeMaxExtents[cascadeIndex].copyFromFloats(Number.MIN_VALUE, Number.MIN_VALUE, Number.MIN_VALUE);\r\n this._frustumCenter[cascadeIndex].copyFromFloats(0, 0, 0);\r\n\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n // Calculate the centroid of the view frustum slice\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n this._frustumCenter[cascadeIndex].addInPlace(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex]);\r\n }\r\n\r\n this._frustumCenter[cascadeIndex].scaleInPlace(1 / this._frustumCornersWorldSpace[cascadeIndex].length);\r\n\r\n if (this.stabilizeCascades) {\r\n // Calculate the radius of a bounding sphere surrounding the frustum corners\r\n let sphereRadius = 0;\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n const dist = this._frustumCornersWorldSpace[cascadeIndex][cornerIndex].subtractToRef(this._frustumCenter[cascadeIndex], tmpv1).length();\r\n sphereRadius = Math.max(sphereRadius, dist);\r\n }\r\n\r\n sphereRadius = Math.ceil(sphereRadius * 16) / 16;\r\n\r\n this._cascadeMaxExtents[cascadeIndex].copyFromFloats(sphereRadius, sphereRadius, sphereRadius);\r\n this._cascadeMinExtents[cascadeIndex].copyFromFloats(-sphereRadius, -sphereRadius, -sphereRadius);\r\n } else {\r\n // Create a temporary view matrix for the light\r\n const lightCameraPos = this._frustumCenter[cascadeIndex];\r\n\r\n this._frustumCenter[cascadeIndex].addToRef(this._lightDirection, tmpv1); // tmpv1 = look at\r\n\r\n Matrix.LookAtLHToRef(lightCameraPos, tmpv1, UpDir, tmpMatrix); // matrix = lightView\r\n\r\n // Calculate an AABB around the frustum corners\r\n for (let cornerIndex = 0; cornerIndex < this._frustumCornersWorldSpace[cascadeIndex].length; ++cornerIndex) {\r\n Vector3.TransformCoordinatesToRef(this._frustumCornersWorldSpace[cascadeIndex][cornerIndex], tmpMatrix, tmpv1);\r\n\r\n this._cascadeMinExtents[cascadeIndex].minimizeInPlace(tmpv1);\r\n this._cascadeMaxExtents[cascadeIndex].maximizeInPlace(tmpv1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Support test.\r\n */\r\n public static get IsSupported(): boolean {\r\n var engine = EngineStore.LastCreatedEngine;\r\n if (!engine) {\r\n return false;\r\n }\r\n return engine._features.supportCSM;\r\n }\r\n\r\n /** @hidden */\r\n public static _SceneComponentInitialization: (scene: Scene) => void = (_) => {\r\n throw _WarnImport(\"ShadowGeneratorSceneComponent\");\r\n }\r\n\r\n /**\r\n * Creates a Cascaded Shadow Generator object.\r\n * A ShadowGenerator is the required tool to use the shadows.\r\n * Each directional light casting shadows needs to use its own ShadowGenerator.\r\n * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows\r\n * @param mapSize The size of the texture what stores the shadows. Example : 1024.\r\n * @param light The directional light object generating the shadows.\r\n * @param usefulFloatFirst By default the generator will try to use half float textures but if you need precision (for self shadowing for instance), you can use this option to enforce full float texture.\r\n */\r\n constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean) {\r\n if (!CascadedShadowGenerator.IsSupported) {\r\n Logger.Error(\"CascadedShadowMap is not supported by the current engine.\");\r\n return;\r\n }\r\n\r\n super(mapSize, light, usefulFloatFirst);\r\n\r\n this.usePercentageCloserFiltering = true;\r\n }\r\n\r\n protected _initializeGenerator(): void {\r\n this.penumbraDarkness = this.penumbraDarkness ?? 1.0;\r\n this._numCascades = this._numCascades ?? CascadedShadowGenerator.DEFAULT_CASCADES_COUNT;\r\n this.stabilizeCascades = this.stabilizeCascades ?? false;\r\n this._freezeShadowCastersBoundingInfoObservable = this._freezeShadowCastersBoundingInfoObservable ?? null;\r\n this.freezeShadowCastersBoundingInfo = this.freezeShadowCastersBoundingInfo ?? false;\r\n this._scbiMin = this._scbiMin ?? new Vector3(0, 0, 0);\r\n this._scbiMax = this._scbiMax ?? new Vector3(0, 0, 0);\r\n this._shadowCastersBoundingInfo = this._shadowCastersBoundingInfo ?? new BoundingInfo(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n this._breaksAreDirty = this._breaksAreDirty ?? true;\r\n this._minDistance = this._minDistance ?? 0;\r\n this._maxDistance = this._maxDistance ?? 1;\r\n this._currentLayer = this._currentLayer ?? 0;\r\n this._shadowMaxZ = this._shadowMaxZ ?? this._scene.activeCamera?.maxZ ?? 10000;\r\n this._debug = this._debug ?? false;\r\n this._depthClamp = this._depthClamp ?? true;\r\n this._cascadeBlendPercentage = this._cascadeBlendPercentage ?? 0.1;\r\n this._lambda = this._lambda ?? 0.5;\r\n this._autoCalcDepthBounds = this._autoCalcDepthBounds ?? false;\r\n\r\n super._initializeGenerator();\r\n }\r\n\r\n protected _createTargetRenderTexture(): void {\r\n const engine = this._scene.getEngine();\r\n const size = { width: this._mapSize, height: this._mapSize, layers: this.numCascades };\r\n this._shadowMap = new RenderTargetTexture(this._light.name + \"_CSMShadowMap\", size, this._scene, false, true, this._textureType, false, undefined, false, false, undefined/*, 6*/);\r\n this._shadowMap.createDepthStencilTexture(engine.useReverseDepthBuffer ? 516 : 513, true);\r\n }\r\n\r\n protected _initializeShadowMap(): void {\r\n super._initializeShadowMap();\r\n\r\n if (this._shadowMap === null) {\r\n return;\r\n }\r\n\r\n this._transformMatricesAsArray = new Float32Array(this._numCascades * 16);\r\n this._viewSpaceFrustumsZ = new Array(this._numCascades);\r\n this._frustumLengths = new Array(this._numCascades);\r\n this._lightSizeUVCorrection = new Array(this._numCascades * 2);\r\n this._depthCorrection = new Array(this._numCascades);\r\n\r\n this._cascades = [];\r\n this._viewMatrices = [];\r\n this._projectionMatrices = [];\r\n this._transformMatrices = [];\r\n this._cascadeMinExtents = [];\r\n this._cascadeMaxExtents = [];\r\n this._frustumCenter = [];\r\n this._shadowCameraPos = [];\r\n this._frustumCornersWorldSpace = [];\r\n\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._cascades[cascadeIndex] = {\r\n prevBreakDistance: 0,\r\n breakDistance: 0,\r\n };\r\n\r\n this._viewMatrices[cascadeIndex] = Matrix.Zero();\r\n this._projectionMatrices[cascadeIndex] = Matrix.Zero();\r\n this._transformMatrices[cascadeIndex] = Matrix.Zero();\r\n this._cascadeMinExtents[cascadeIndex] = new Vector3();\r\n this._cascadeMaxExtents[cascadeIndex] = new Vector3();\r\n this._frustumCenter[cascadeIndex] = new Vector3();\r\n this._shadowCameraPos[cascadeIndex] = new Vector3();\r\n this._frustumCornersWorldSpace[cascadeIndex] = new Array(CascadedShadowGenerator.frustumCornersNDCSpace.length);\r\n\r\n for (let i = 0; i < CascadedShadowGenerator.frustumCornersNDCSpace.length; ++i) {\r\n this._frustumCornersWorldSpace[cascadeIndex][i] = new Vector3();\r\n }\r\n }\r\n\r\n let engine = this._scene.getEngine();\r\n\r\n this._shadowMap.onBeforeBindObservable.clear();\r\n this._shadowMap.onBeforeRenderObservable.clear();\r\n\r\n this._shadowMap.onBeforeRenderObservable.add((layer: number) => {\r\n this._currentLayer = layer;\r\n if (this._filter === ShadowGenerator.FILTER_PCF) {\r\n engine.setColorWrite(false);\r\n }\r\n this._scene.setTransformMatrix(this.getCascadeViewMatrix(layer)!, this.getCascadeProjectionMatrix(layer)!);\r\n if (this._useUBO) {\r\n this._scene.getSceneUniformBuffer().unbindEffect();\r\n this._scene.finalizeSceneUbo();\r\n }\r\n });\r\n\r\n this._shadowMap.onBeforeBindObservable.add(() => {\r\n engine._debugPushGroup?.(`cascaded shadow map generation for pass id ${engine.currentRenderPassId}`, 1);\r\n if (this._breaksAreDirty) {\r\n this._splitFrustum();\r\n }\r\n this._computeMatrices();\r\n });\r\n\r\n this._splitFrustum();\r\n }\r\n\r\n protected _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect, mesh: AbstractMesh): void {\r\n effect.setMatrix(\"viewProjection\", this.getCascadeTransformMatrix(this._currentLayer)!);\r\n }\r\n\r\n protected _isReadyCustomDefines(defines: any, subMesh: SubMesh, useInstances: boolean): void {\r\n defines.push(\"#define SM_DEPTHCLAMP \" + (this._depthClamp && this._filter !== ShadowGenerator.FILTER_PCSS ? \"1\" : \"0\"));\r\n }\r\n\r\n /**\r\n * Prepare all the defines in a material relying on a shadow map at the specified light index.\r\n * @param defines Defines of the material we want to update\r\n * @param lightIndex Index of the light in the enabled light list of the material\r\n */\r\n public prepareDefines(defines: any, lightIndex: number): void {\r\n super.prepareDefines(defines, lightIndex);\r\n\r\n var scene = this._scene;\r\n var light = this._light;\r\n\r\n if (!scene.shadowsEnabled || !light.shadowEnabled) {\r\n return;\r\n }\r\n\r\n defines[\"SHADOWCSM\" + lightIndex] = true;\r\n defines[\"SHADOWCSMDEBUG\" + lightIndex] = this.debug;\r\n defines[\"SHADOWCSMNUM_CASCADES\" + lightIndex] = this.numCascades;\r\n defines[\"SHADOWCSM_RIGHTHANDED\" + lightIndex] = scene.useRightHandedSystem;\r\n\r\n const camera = scene.activeCamera;\r\n\r\n if (camera && this._shadowMaxZ < camera.maxZ) {\r\n defines[\"SHADOWCSMUSESHADOWMAXZ\" + lightIndex] = true;\r\n }\r\n\r\n if (this.cascadeBlendPercentage === 0) {\r\n defines[\"SHADOWCSMNOBLEND\" + lightIndex] = true;\r\n }\r\n }\r\n\r\n /**\r\n * Binds the shadow related information inside of an effect (information like near, far, darkness...\r\n * defined in the generator but impacting the effect).\r\n * @param lightIndex Index of the light in the enabled light list of the material owning the effect\r\n * @param effect The effect we are binfing the information for\r\n */\r\n public bindShadowLight(lightIndex: string, effect: Effect): void {\r\n const light = this._light;\r\n const scene = this._scene;\r\n\r\n if (!scene.shadowsEnabled || !light.shadowEnabled) {\r\n return;\r\n }\r\n\r\n const camera = scene.activeCamera;\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const shadowMap = this.getShadowMap();\r\n if (!shadowMap) {\r\n return;\r\n }\r\n\r\n const width = shadowMap.getSize().width;\r\n\r\n effect.setMatrices(\"lightMatrix\" + lightIndex, this._transformMatricesAsArray);\r\n effect.setArray(\"viewFrustumZ\" + lightIndex, this._viewSpaceFrustumsZ);\r\n effect.setFloat(\"cascadeBlendFactor\" + lightIndex, this.cascadeBlendPercentage === 0 ? 10000 : 1 / this.cascadeBlendPercentage);\r\n effect.setArray(\"frustumLengths\" + lightIndex, this._frustumLengths);\r\n\r\n // Only PCF uses depth stencil texture.\r\n if (this._filter === ShadowGenerator.FILTER_PCF) {\r\n effect.setDepthStencilTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), width, 1 / width, this.frustumEdgeFalloff, lightIndex);\r\n } else if (this._filter === ShadowGenerator.FILTER_PCSS) {\r\n for (let cascadeIndex = 0; cascadeIndex < this._numCascades; ++cascadeIndex) {\r\n this._lightSizeUVCorrection[cascadeIndex * 2 + 0] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[0].x - this._cascadeMinExtents[0].x) / (this._cascadeMaxExtents[cascadeIndex].x - this._cascadeMinExtents[cascadeIndex].x); // x correction\r\n this._lightSizeUVCorrection[cascadeIndex * 2 + 1] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[0].y - this._cascadeMinExtents[0].y) / (this._cascadeMaxExtents[cascadeIndex].y - this._cascadeMinExtents[cascadeIndex].y); // y correction\r\n this._depthCorrection[cascadeIndex] = cascadeIndex === 0 ? 1 : (this._cascadeMaxExtents[cascadeIndex].z - this._cascadeMinExtents[cascadeIndex].z) / (this._cascadeMaxExtents[0].z - this._cascadeMinExtents[0].z);\r\n }\r\n effect.setDepthStencilTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n effect.setTexture(\"depthSampler\" + lightIndex, shadowMap);\r\n effect.setArray2(\"lightSizeUVCorrection\" + lightIndex, this._lightSizeUVCorrection);\r\n effect.setArray(\"depthCorrection\" + lightIndex, this._depthCorrection);\r\n effect.setFloat(\"penumbraDarkness\" + lightIndex, this.penumbraDarkness);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), 1 / width, this._contactHardeningLightSizeUVRatio * width, this.frustumEdgeFalloff, lightIndex);\r\n }\r\n else {\r\n effect.setTexture(\"shadowSampler\" + lightIndex, shadowMap);\r\n light._uniformBuffer.updateFloat4(\"shadowsInfo\", this.getDarkness(), width, 1 / width, this.frustumEdgeFalloff, lightIndex);\r\n }\r\n\r\n light._uniformBuffer.updateFloat2(\"depthValues\", this.getLight().getDepthMinZ(camera), this.getLight().getDepthMinZ(camera) + this.getLight().getDepthMaxZ(camera), lightIndex);\r\n }\r\n\r\n /**\r\n * Gets the transformation matrix of the first cascade used to project the meshes into the map from the light point of view.\r\n * (eq to view projection * shadow projection matrices)\r\n * @returns The transform matrix used to create the shadow map\r\n */\r\n public getTransformMatrix(): Matrix {\r\n return this.getCascadeTransformMatrix(0)!;\r\n }\r\n\r\n /**\r\n * Disposes the ShadowGenerator.\r\n * Returns nothing.\r\n */\r\n public dispose(): void {\r\n super.dispose();\r\n\r\n if (this._freezeShadowCastersBoundingInfoObservable) {\r\n this._scene.onBeforeRenderObservable.remove(this._freezeShadowCastersBoundingInfoObservable);\r\n this._freezeShadowCastersBoundingInfoObservable = null;\r\n }\r\n\r\n if (this._depthReducer) {\r\n this._depthReducer.dispose();\r\n this._depthReducer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Serializes the shadow generator setup to a json object.\r\n * @returns The serialized JSON object\r\n */\r\n public serialize(): any {\r\n var serializationObject: any = super.serialize();\r\n var shadowMap = this.getShadowMap();\r\n\r\n if (!shadowMap) {\r\n return serializationObject;\r\n }\r\n\r\n serializationObject.numCascades = this._numCascades;\r\n serializationObject.debug = this._debug;\r\n serializationObject.stabilizeCascades = this.stabilizeCascades;\r\n serializationObject.lambda = this._lambda;\r\n serializationObject.cascadeBlendPercentage = this.cascadeBlendPercentage;\r\n serializationObject.depthClamp = this._depthClamp;\r\n serializationObject.autoCalcDepthBounds = this.autoCalcDepthBounds;\r\n serializationObject.shadowMaxZ = this._shadowMaxZ;\r\n serializationObject.penumbraDarkness = this.penumbraDarkness;\r\n\r\n serializationObject.freezeShadowCastersBoundingInfo = this._freezeShadowCastersBoundingInfo;\r\n serializationObject.minDistance = this.minDistance;\r\n serializationObject.maxDistance = this.maxDistance;\r\n\r\n serializationObject.renderList = [];\r\n if (shadowMap.renderList) {\r\n for (var meshIndex = 0; meshIndex < shadowMap.renderList.length; meshIndex++) {\r\n var mesh = shadowMap.renderList[meshIndex];\r\n\r\n serializationObject.renderList.push(mesh.id);\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parses a serialized ShadowGenerator and returns a new ShadowGenerator.\r\n * @param parsedShadowGenerator The JSON object to parse\r\n * @param scene The scene to create the shadow map for\r\n * @returns The parsed shadow generator\r\n */\r\n public static Parse(parsedShadowGenerator: any, scene: Scene): ShadowGenerator {\r\n var shadowGenerator = ShadowGenerator.Parse(parsedShadowGenerator, scene, (mapSize: number, light: IShadowLight) => new CascadedShadowGenerator(mapSize, <DirectionalLight>light)) as CascadedShadowGenerator;\r\n\r\n if (parsedShadowGenerator.numCascades !== undefined) {\r\n shadowGenerator.numCascades = parsedShadowGenerator.numCascades;\r\n }\r\n\r\n if (parsedShadowGenerator.debug !== undefined) {\r\n shadowGenerator.debug = parsedShadowGenerator.debug;\r\n }\r\n\r\n if (parsedShadowGenerator.stabilizeCascades !== undefined) {\r\n shadowGenerator.stabilizeCascades = parsedShadowGenerator.stabilizeCascades;\r\n }\r\n\r\n if (parsedShadowGenerator.lambda !== undefined) {\r\n shadowGenerator.lambda = parsedShadowGenerator.lambda;\r\n }\r\n\r\n if (parsedShadowGenerator.cascadeBlendPercentage !== undefined) {\r\n shadowGenerator.cascadeBlendPercentage = parsedShadowGenerator.cascadeBlendPercentage;\r\n }\r\n\r\n if (parsedShadowGenerator.depthClamp !== undefined) {\r\n shadowGenerator.depthClamp = parsedShadowGenerator.depthClamp;\r\n }\r\n\r\n if (parsedShadowGenerator.autoCalcDepthBounds !== undefined) {\r\n shadowGenerator.autoCalcDepthBounds = parsedShadowGenerator.autoCalcDepthBounds;\r\n }\r\n\r\n if (parsedShadowGenerator.shadowMaxZ !== undefined) {\r\n shadowGenerator.shadowMaxZ = parsedShadowGenerator.shadowMaxZ;\r\n }\r\n\r\n if (parsedShadowGenerator.penumbraDarkness !== undefined) {\r\n shadowGenerator.penumbraDarkness = parsedShadowGenerator.penumbraDarkness;\r\n }\r\n\r\n if (parsedShadowGenerator.freezeShadowCastersBoundingInfo !== undefined) {\r\n shadowGenerator.freezeShadowCastersBoundingInfo = parsedShadowGenerator.freezeShadowCastersBoundingInfo;\r\n }\r\n\r\n if (parsedShadowGenerator.minDistance !== undefined && parsedShadowGenerator.maxDistance !== undefined) {\r\n shadowGenerator.setMinMaxDistance(parsedShadowGenerator.minDistance, parsedShadowGenerator.maxDistance);\r\n }\r\n\r\n return shadowGenerator;\r\n }\r\n}\r\n"]}
@@ -116,7 +116,6 @@ export interface IShadowGenerator {
116
116
  * Documentation: https://doc.babylonjs.com/babylon101/shadows
117
117
  */
118
118
  export declare class ShadowGenerator implements IShadowGenerator {
119
- private static _Counter;
120
119
  /**
121
120
  * Name of the shadow generator class
122
121
  */
@@ -492,8 +491,6 @@ export declare class ShadowGenerator implements IShadowGenerator {
492
491
  protected _defaultTextureMatrix: Matrix;
493
492
  protected _storedUniqueId: Nullable<number>;
494
493
  protected _useUBO: boolean;
495
- protected _nameForDrawWrapper: string[];
496
- protected _nameForDrawWrapperCurrent: string;
497
494
  /** @hidden */
498
495
  static _SceneComponentInitialization: (scene: Scene) => void;
499
496
  /**
@@ -95,13 +95,6 @@ var ShadowGenerator = /** @class */ (function () {
95
95
  light._shadowGenerator = this;
96
96
  this.id = light.id;
97
97
  this._useUBO = this._scene.getEngine().supportsUniformBuffers;
98
- this._nameForDrawWrapper = ["bjs_shadowgenerator_" + ShadowGenerator._Counter++];
99
- if (light.needCube()) {
100
- var baseName = this._nameForDrawWrapper[0];
101
- for (var i = 0; i < 6; ++i) {
102
- this._nameForDrawWrapper[i] = baseName + "_" + i;
103
- }
104
- }
105
98
  ShadowGenerator._SceneComponentInitialization(this._scene);
106
99
  // Texture type fallback from float to int if not supported.
107
100
  var caps = this._scene.getEngine().getCaps();
@@ -129,7 +122,6 @@ var ShadowGenerator = /** @class */ (function () {
129
122
  }
130
123
  this._initializeGenerator();
131
124
  this._applyFilterValues();
132
- this._nameForDrawWrapperCurrent = this._nameForDrawWrapper[0];
133
125
  }
134
126
  Object.defineProperty(ShadowGenerator.prototype, "bias", {
135
127
  /**
@@ -707,11 +699,10 @@ var ShadowGenerator = /** @class */ (function () {
707
699
  var engine = this._scene.getEngine();
708
700
  this._shadowMap.onBeforeBindObservable.add(function () {
709
701
  var _a;
710
- (_a = engine._debugPushGroup) === null || _a === void 0 ? void 0 : _a.call(engine, "shadow map generation for " + _this._nameForDrawWrapper, 1);
702
+ (_a = engine._debugPushGroup) === null || _a === void 0 ? void 0 : _a.call(engine, "shadow map generation for pass id " + engine.currentRenderPassId, 1);
711
703
  });
712
704
  // Record Face Index before render.
713
705
  this._shadowMap.onBeforeRenderObservable.add(function (faceIndex) {
714
- _this._nameForDrawWrapperCurrent = _this._nameForDrawWrapper[faceIndex];
715
706
  _this._currentFaceIndex = faceIndex;
716
707
  if (_this._filter === ShadowGenerator.FILTER_PCF) {
717
708
  engine.setColorWrite(false);
@@ -719,6 +710,7 @@ var ShadowGenerator = /** @class */ (function () {
719
710
  _this.getTransformMatrix(); // generate the view/projection matrix
720
711
  _this._scene.setTransformMatrix(_this._viewMatrix, _this._projectionMatrix);
721
712
  if (_this._useUBO) {
713
+ _this._scene.getSceneUniformBuffer().unbindEffect();
722
714
  _this._scene.finalizeSceneUbo();
723
715
  }
724
716
  });
@@ -781,6 +773,7 @@ var ShadowGenerator = /** @class */ (function () {
781
773
  this._kernelBlurXPostprocess = new BlurPostProcess(this._light.name + "KernelBlurX", new Vector2(1, 0), this.blurKernel, 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, this._textureType);
782
774
  this._kernelBlurXPostprocess.width = targetSize;
783
775
  this._kernelBlurXPostprocess.height = targetSize;
776
+ this._kernelBlurXPostprocess.externalTextureSamplerBinding = true;
784
777
  this._kernelBlurXPostprocess.onApplyObservable.add(function (effect) {
785
778
  effect.setTexture("textureSampler", _this._shadowMap);
786
779
  });
@@ -795,6 +788,7 @@ var ShadowGenerator = /** @class */ (function () {
795
788
  }
796
789
  else {
797
790
  this._boxBlurPostprocess = new PostProcess(this._light.name + "DepthBoxBlur", "depthBoxBlur", ["screenSize", "boxOffset"], [], 1.0, null, Texture.BILINEAR_SAMPLINGMODE, engine, false, "#define OFFSET " + this._blurBoxOffset, this._textureType);
791
+ this._boxBlurPostprocess.externalTextureSamplerBinding = true;
798
792
  this._boxBlurPostprocess.onApplyObservable.add(function (effect) {
799
793
  effect.setFloat2("screenSize", targetSize, targetSize);
800
794
  effect.setTexture("textureSampler", _this._shadowMap);
@@ -862,7 +856,7 @@ var ShadowGenerator = /** @class */ (function () {
862
856
  if (this.isReady(subMesh, hardwareInstancedRendering, isTransparent)) {
863
857
  subMesh._renderId = scene.getRenderId();
864
858
  var shadowDepthWrapper = material.shadowDepthWrapper;
865
- var drawWrapper = (_b = shadowDepthWrapper === null || shadowDepthWrapper === void 0 ? void 0 : shadowDepthWrapper.getEffect(subMesh, this, this._nameForDrawWrapperCurrent)) !== null && _b !== void 0 ? _b : subMesh._getDrawWrapper(this._nameForDrawWrapperCurrent);
859
+ var drawWrapper = (_b = shadowDepthWrapper === null || shadowDepthWrapper === void 0 ? void 0 : shadowDepthWrapper.getEffect(subMesh, this, engine.currentRenderPassId)) !== null && _b !== void 0 ? _b : subMesh._getDrawWrapper();
866
860
  var effect_1 = DrawWrapper.GetEffect(drawWrapper);
867
861
  engine.enableEffect(drawWrapper);
868
862
  if (!hardwareInstancedRendering) {
@@ -928,6 +922,7 @@ var ShadowGenerator = /** @class */ (function () {
928
922
  this._bindCustomEffectForRenderSubMeshForShadowMap(subMesh, effect_1, effectiveMesh);
929
923
  }
930
924
  MaterialHelper.BindSceneUniformBuffer(effect_1, this._scene.getSceneUniformBuffer());
925
+ this._scene.getSceneUniformBuffer().bindUniformBuffer();
931
926
  var world = effectiveMesh.getWorldMatrix();
932
927
  effectiveMesh.getMeshUniformBuffer().bindToEffect(effect_1, "Mesh");
933
928
  effectiveMesh.transferToEffect(world);
@@ -1063,12 +1058,12 @@ var ShadowGenerator = /** @class */ (function () {
1063
1058
  var defines = [];
1064
1059
  this._prepareShadowDefines(subMesh, useInstances, defines, isTransparent);
1065
1060
  if (shadowDepthWrapper) {
1066
- if (!shadowDepthWrapper.isReadyForSubMesh(subMesh, defines, this, useInstances, this._nameForDrawWrapperCurrent)) {
1061
+ if (!shadowDepthWrapper.isReadyForSubMesh(subMesh, defines, this, useInstances, this._scene.getEngine().currentRenderPassId)) {
1067
1062
  return false;
1068
1063
  }
1069
1064
  }
1070
1065
  else {
1071
- var subMeshEffect = subMesh._getDrawWrapper(this._nameForDrawWrapperCurrent, true);
1066
+ var subMeshEffect = subMesh._getDrawWrapper(undefined, true);
1072
1067
  var effect = subMeshEffect.effect;
1073
1068
  var cachedDefines = subMeshEffect.defines;
1074
1069
  var attribs = [VertexBuffer.PositionKind];
@@ -1581,7 +1576,6 @@ var ShadowGenerator = /** @class */ (function () {
1581
1576
  }
1582
1577
  return shadowGenerator;
1583
1578
  };
1584
- ShadowGenerator._Counter = 0;
1585
1579
  /**
1586
1580
  * Name of the shadow generator class
1587
1581
  */