@babylonjs/core 8.24.0 → 8.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/Behaviors/Meshes/index.d.ts +1 -0
  2. package/Behaviors/Meshes/index.js +1 -0
  3. package/Behaviors/Meshes/index.js.map +1 -1
  4. package/Behaviors/Meshes/pointerDragBehavior.d.ts +6 -34
  5. package/Behaviors/Meshes/pointerDragBehavior.js +0 -12
  6. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  7. package/Behaviors/Meshes/pointerDragEvents.d.ts +38 -0
  8. package/Behaviors/Meshes/pointerDragEvents.js +2 -0
  9. package/Behaviors/Meshes/pointerDragEvents.js.map +1 -0
  10. package/Engines/Extensions/engine.multiview.js +5 -5
  11. package/Engines/Extensions/engine.multiview.js.map +1 -1
  12. package/Engines/abstractEngine.js +3 -3
  13. package/Engines/abstractEngine.js.map +1 -1
  14. package/Engines/engineFactory.d.ts +4 -1
  15. package/Engines/engineFactory.js.map +1 -1
  16. package/Engines/thinEngine.js +2 -0
  17. package/Engines/thinEngine.js.map +1 -1
  18. package/Engines/webgpuEngine.js +7 -0
  19. package/Engines/webgpuEngine.js.map +1 -1
  20. package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +4 -0
  21. package/FrameGraph/Tasks/Layers/baseLayerTask.js +6 -0
  22. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  23. package/Gizmos/cameraGizmo.js +2 -2
  24. package/Gizmos/cameraGizmo.js.map +1 -1
  25. package/Gizmos/lightGizmo.js +2 -2
  26. package/Gizmos/lightGizmo.js.map +1 -1
  27. package/Gizmos/positionGizmo.d.ts +7 -6
  28. package/Gizmos/positionGizmo.js +3 -9
  29. package/Gizmos/positionGizmo.js.map +1 -1
  30. package/Gizmos/rotationGizmo.d.ts +7 -6
  31. package/Gizmos/rotationGizmo.js +3 -9
  32. package/Gizmos/rotationGizmo.js.map +1 -1
  33. package/Gizmos/scaleGizmo.d.ts +7 -6
  34. package/Gizmos/scaleGizmo.js +3 -9
  35. package/Gizmos/scaleGizmo.js.map +1 -1
  36. package/Instrumentation/sceneInstrumentation.d.ts +2 -0
  37. package/Instrumentation/sceneInstrumentation.js +58 -32
  38. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  39. package/Lights/Clustered/clusteredLightContainer.d.ts +12 -0
  40. package/Lights/Clustered/clusteredLightContainer.js +104 -18
  41. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  42. package/Lights/Shadows/cascadedShadowGenerator.js +1 -0
  43. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  44. package/Lights/Shadows/shadowGenerator.js +1 -0
  45. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  46. package/Lights/light.d.ts +5 -0
  47. package/Lights/light.js +5 -0
  48. package/Lights/light.js.map +1 -1
  49. package/Materials/PBR/pbrBaseMaterial.js +2 -1
  50. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  51. package/Materials/Textures/renderTargetTexture.d.ts +5 -0
  52. package/Materials/Textures/renderTargetTexture.js +9 -0
  53. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  54. package/Materials/materialHelper.functions.js +4 -2
  55. package/Materials/materialHelper.functions.js.map +1 -1
  56. package/Materials/standardMaterial.js +2 -1
  57. package/Materials/standardMaterial.js.map +1 -1
  58. package/Materials/uniformBuffer.d.ts +6 -3
  59. package/Materials/uniformBuffer.js +35 -13
  60. package/Materials/uniformBuffer.js.map +1 -1
  61. package/Maths/math.vector.d.ts +1 -1
  62. package/Maths/math.vector.js +2 -2
  63. package/Maths/math.vector.js.map +1 -1
  64. package/Meshes/abstractMesh.d.ts +21 -0
  65. package/Meshes/abstractMesh.hotSpot.js +37 -25
  66. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  67. package/Meshes/abstractMesh.js.map +1 -1
  68. package/Meshes/instancedMesh.d.ts +1 -0
  69. package/Meshes/instancedMesh.js +3 -0
  70. package/Meshes/instancedMesh.js.map +1 -1
  71. package/Meshes/mesh.d.ts +0 -19
  72. package/Meshes/mesh.js +0 -19
  73. package/Meshes/mesh.js.map +1 -1
  74. package/Misc/fileTools.js +1 -1
  75. package/Misc/fileTools.js.map +1 -1
  76. package/Misc/screenshotTools.js +1 -1
  77. package/Misc/screenshotTools.js.map +1 -1
  78. package/Misc/snapshotRenderingHelper.d.ts +4 -3
  79. package/Misc/snapshotRenderingHelper.js +6 -5
  80. package/Misc/snapshotRenderingHelper.js.map +1 -1
  81. package/Particles/Node/Blocks/Emitters/createParticleBlock.js +7 -3
  82. package/Particles/Node/Blocks/Emitters/createParticleBlock.js.map +1 -1
  83. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js +0 -3
  84. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js.map +1 -1
  85. package/Particles/Node/Blocks/systemBlock.d.ts +3 -0
  86. package/Particles/Node/Blocks/systemBlock.js +3 -0
  87. package/Particles/Node/Blocks/systemBlock.js.map +1 -1
  88. package/Particles/Node/nodeParticleBuildState.js +1 -1
  89. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  90. package/Particles/Node/nodeParticleSystemSet.helper.d.ts +1 -1
  91. package/Particles/Node/nodeParticleSystemSet.helper.js +25 -5
  92. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  93. package/Particles/Node/nodeParticleSystemSet.js +1 -0
  94. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  95. package/Particles/particle.d.ts +4 -0
  96. package/Particles/particle.js +5 -0
  97. package/Particles/particle.js.map +1 -1
  98. package/Particles/particleSystem.d.ts +2 -0
  99. package/Particles/particleSystem.js +2 -0
  100. package/Particles/particleSystem.js.map +1 -1
  101. package/Particles/thinParticleSystem.d.ts +2 -0
  102. package/Particles/thinParticleSystem.function.d.ts +2 -0
  103. package/Particles/thinParticleSystem.function.js +3 -0
  104. package/Particles/thinParticleSystem.function.js.map +1 -1
  105. package/Particles/thinParticleSystem.js +11 -5
  106. package/Particles/thinParticleSystem.js.map +1 -1
  107. package/Rendering/objectRenderer.d.ts +17 -1
  108. package/Rendering/objectRenderer.js +55 -14
  109. package/Rendering/objectRenderer.js.map +1 -1
  110. package/Shaders/ShadersInclude/clusteredLightingFunctions.js +1 -0
  111. package/Shaders/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
  112. package/Shaders/ShadersInclude/helperFunctions.js +1 -0
  113. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  114. package/Shaders/ShadersInclude/lightFragment.js +4 -4
  115. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  116. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +1 -1
  117. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  118. package/Shaders/ShadersInclude/lightUboDeclaration.js +1 -1
  119. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  120. package/Shaders/ShadersInclude/lightVxUboDeclaration.js +1 -1
  121. package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  122. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +2 -2
  123. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  124. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +2 -2
  125. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
  126. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  127. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  128. package/Shaders/default.fragment.js +3 -0
  129. package/Shaders/default.fragment.js.map +1 -1
  130. package/Shaders/default.vertex.js +6 -0
  131. package/Shaders/default.vertex.js.map +1 -1
  132. package/Shaders/pbr.vertex.js +6 -0
  133. package/Shaders/pbr.vertex.js.map +1 -1
  134. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js +1 -0
  135. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js.map +1 -1
  136. package/ShadersWGSL/ShadersInclude/lightFragment.js +4 -4
  137. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  138. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +2 -1
  139. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  140. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +2 -1
  141. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  142. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +3 -2
  143. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  144. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +3 -2
  145. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  146. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  147. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  148. package/ShadersWGSL/default.fragment.js +3 -0
  149. package/ShadersWGSL/default.fragment.js.map +1 -1
  150. package/ShadersWGSL/default.vertex.js +6 -0
  151. package/ShadersWGSL/default.vertex.js.map +1 -1
  152. package/ShadersWGSL/pbr.vertex.js +6 -0
  153. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  154. package/States/alphaCullingState.d.ts +3 -1
  155. package/States/alphaCullingState.js +39 -37
  156. package/States/alphaCullingState.js.map +1 -1
  157. package/package.json +1 -1
  158. package/scene.d.ts +27 -1
  159. package/scene.js +55 -2
  160. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"clusteredLightContainer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Lights/Clustered/clusteredLightContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageBuffer } from \"core/Buffers/storageBuffer\";\nimport { Constants } from \"core/Engines/constants\";\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\nimport type { Effect } from \"core/Materials/effect\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\nimport { TmpColors } from \"core/Maths/math.color\";\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\nimport type { Mesh } from \"core/Meshes/mesh\";\nimport { _WarnImport } from \"core/Misc/devTools\";\nimport { serialize } from \"core/Misc/decorators\";\nimport { Logger } from \"core/Misc/logger\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { Node } from \"core/node\";\nimport type { Scene } from \"core/scene\";\nimport type { Nullable } from \"core/types\";\n\nimport { Light } from \"../light\";\nimport { LightConstants } from \"../lightConstants\";\nimport type { PointLight } from \"../pointLight\";\nimport type { SpotLight } from \"../spotLight\";\n\nimport \"core/Meshes/thinInstanceMesh\";\n\nNode.AddNodeConstructor(\"Light_Type_5\", (name, scene) => {\n return () => new ClusteredLightContainer(name, [], scene);\n});\n\n/**\n * A special light that renders all its associated spot or point lights using a clustered or forward+ system.\n */\nexport class ClusteredLightContainer extends Light {\n private static _GetEngineBatchSize(engine: AbstractEngine): number {\n const caps = engine._caps;\n if (!caps.texelFetch) {\n return 0;\n } else if (engine.isWebGPU) {\n // On WebGPU we use atomic writes to storage textures\n return 32;\n } else if (engine.version > 1) {\n // On WebGL 2 we use additive float blending as the light mask\n if (!caps.colorBufferFloat || !caps.blendFloat) {\n return 0;\n }\n // Due to the use of floats we want to limit lights to the precision of floats\n return caps.shaderFloatPrecision;\n } else {\n // WebGL 1 is not supported due to lack of dynamic for loops\n return 0;\n }\n }\n\n /**\n * Checks if the clustered lighting system supports the given light with its current parameters.\n * This will also check if the light's associated engine supports clustered lighting.\n *\n * @param light The light to test\n * @returns true if the light and its engine is supported\n */\n public static IsLightSupported(light: Light): boolean {\n if (ClusteredLightContainer._GetEngineBatchSize(light.getEngine()) === 0) {\n return false;\n } else if (light.shadowEnabled && light._scene.shadowsEnabled && light.getShadowGenerators()) {\n // Shadows are not supported\n return false;\n } else if (light.falloffType !== Light.FALLOFF_DEFAULT) {\n // Only the default falloff is supported\n return false;\n } else if (light.getTypeID() === LightConstants.LIGHTTYPEID_POINTLIGHT) {\n return true;\n } else if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n // Extra texture bindings per light are not supported\n return !(<SpotLight>light).projectionTexture && !(<SpotLight>light).iesProfileTexture;\n } else {\n // Currently only point and spot lights are supported\n return false;\n }\n }\n\n /** @internal */\n public static _SceneComponentInitialization: (scene: Scene) => void = () => {\n throw _WarnImport(\"ClusteredLightingSceneComponent\");\n };\n\n private readonly _batchSize: number;\n\n /**\n * True if clustered lighting is supported.\n */\n public get isSupported(): boolean {\n return this._batchSize > 0;\n }\n\n private readonly _lights: (PointLight | SpotLight)[] = [];\n /**\n * Gets the current list of lights added to this clustering system.\n */\n public get lights(): readonly Light[] {\n return this._lights;\n }\n\n private _lightDataBuffer: Float32Array;\n private _lightDataTexture: RawTexture;\n\n private _tileMaskBatches = -1;\n private _tileMaskTexture: RenderTargetTexture;\n private _tileMaskBuffer: Nullable<StorageBuffer>;\n\n private _horizontalTiles = 64;\n /**\n * The number of tiles in the horizontal direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get horizontalTiles(): number {\n return this._horizontalTiles;\n }\n\n public set horizontalTiles(horizontal: number) {\n if (this._horizontalTiles === horizontal) {\n return;\n }\n this._horizontalTiles = horizontal;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _verticalTiles = 64;\n /**\n * The number of tiles in the vertical direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get verticalTiles(): number {\n return this._verticalTiles;\n }\n\n public set verticalTiles(vertical: number) {\n if (this._verticalTiles === vertical) {\n return;\n }\n this._verticalTiles = vertical;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private readonly _proxyMaterial: ShaderMaterial;\n private readonly _proxyMesh: Mesh;\n\n private _maxRange = 16383;\n private _minInverseSquaredRange = 1 / (this._maxRange * this._maxRange);\n /**\n * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.\n */\n @serialize()\n public get maxRange(): number {\n return this._maxRange;\n }\n\n public set maxRange(range: number) {\n if (this._maxRange === range) {\n return;\n }\n this._maxRange = range;\n this._minInverseSquaredRange = 1 / (range * range);\n }\n\n /**\n * Creates a new clustered light system with an initial set of lights.\n *\n * @param name The name of the clustered light container\n * @param lights The initial set of lights to add\n * @param scene The scene the clustered light container belongs to\n */\n constructor(name: string, lights: Light[] = [], scene?: Scene) {\n super(name, scene);\n const engine = this.getEngine();\n this._batchSize = ClusteredLightContainer._GetEngineBatchSize(engine);\n\n const proxyShader = { vertex: \"lightProxy\", fragment: \"lightProxy\" };\n this._proxyMaterial = new ShaderMaterial(\"ProxyMaterial\", this._scene, proxyShader, {\n attributes: [\"position\"],\n uniforms: [\"view\", \"projection\", \"tileMaskResolution\"],\n samplers: [\"lightDataTexture\"],\n uniformBuffers: [\"Scene\"],\n storageBuffers: [\"tileMaskBuffer\"],\n defines: [`CLUSTLIGHT_BATCH ${this._batchSize}`],\n shaderLanguage: engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (engine.isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/lightProxy.vertex\"), import(\"../../ShadersWGSL/lightProxy.fragment\")]);\n } else {\n await Promise.all([import(\"../../Shaders/lightProxy.vertex\"), import(\"../../Shaders/lightProxy.fragment\")]);\n }\n },\n });\n\n // Additive blending is for merging masks on WebGL\n this._proxyMaterial.transparencyMode = ShaderMaterial.MATERIAL_ALPHABLEND;\n this._proxyMaterial.alphaMode = Constants.ALPHA_ADD;\n\n this._proxyMesh = CreatePlane(\"ProxyMesh\", { size: 2 });\n // Make sure it doesn't render for the default scene\n this._scene.removeMesh(this._proxyMesh);\n this._proxyMesh.material = this._proxyMaterial;\n\n this._updateBatches();\n\n if (this._batchSize > 0) {\n ClusteredLightContainer._SceneComponentInitialization(this._scene);\n for (const light of lights) {\n this.addLight(light);\n }\n }\n }\n\n public override getClassName(): string {\n return \"ClusteredLightContainer\";\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override getTypeID(): number {\n return LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER;\n }\n\n /** @internal */\n public _updateBatches(): RenderTargetTexture {\n this._proxyMesh.isVisible = this._lights.length > 0;\n\n // Ensure space for atleast 1 batch\n const batches = Math.max(Math.ceil(this._lights.length / this._batchSize), 1);\n if (this._tileMaskBatches >= batches) {\n this._proxyMesh.thinInstanceCount = this._lights.length;\n return this._tileMaskTexture;\n }\n const engine = this.getEngine();\n // Round up to a batch size so we don't have to reallocate as often\n const maxLights = batches * this._batchSize;\n\n this._lightDataBuffer = new Float32Array(20 * maxLights);\n this._lightDataTexture?.dispose();\n this._lightDataTexture = new RawTexture(\n this._lightDataBuffer,\n 5,\n maxLights,\n Constants.TEXTUREFORMAT_RGBA,\n this._scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n this._proxyMaterial.setTexture(\"lightDataTexture\", this._lightDataTexture);\n\n this._tileMaskTexture?.dispose();\n const textureSize = { width: this._horizontalTiles, height: this._verticalTiles };\n if (!engine.isWebGPU) {\n // In WebGL we shift the light proxy by the batch number\n textureSize.height *= batches;\n }\n this._tileMaskTexture = new RenderTargetTexture(\"TileMaskTexture\", textureSize, this._scene, {\n // We don't write anything on WebGPU so make it as small as possible\n type: engine.isWebGPU ? Constants.TEXTURETYPE_UNSIGNED_BYTE : Constants.TEXTURETYPE_FLOAT,\n format: Constants.TEXTUREFORMAT_RED,\n generateDepthBuffer: false,\n });\n\n this._tileMaskTexture.renderParticles = false;\n this._tileMaskTexture.renderSprites = false;\n this._tileMaskTexture.noPrePassRenderer = true;\n this._tileMaskTexture.renderList = [this._proxyMesh];\n\n this._tileMaskTexture.onBeforeBindObservable.add(() => {\n this._updateLightData();\n });\n\n this._tileMaskTexture.onClearObservable.add(() => {\n if (engine.isWebGPU) {\n // Clear the storage buffer for WebGPU\n this._tileMaskBuffer?.clear();\n } else {\n // Only clear the texture on WebGL\n engine.clear({ r: 0, g: 0, b: 0, a: 1 }, true, false);\n }\n });\n\n if (engine.isWebGPU) {\n // WebGPU also needs a storage buffer to write to\n this._tileMaskBuffer?.dispose();\n const bufferSize = this._horizontalTiles * this._verticalTiles * batches * 4;\n this._tileMaskBuffer = new StorageBuffer(<WebGPUEngine>engine, bufferSize);\n this._proxyMaterial.setStorageBuffer(\"tileMaskBuffer\", this._tileMaskBuffer);\n }\n\n this._proxyMaterial.setVector3(\"tileMaskResolution\", new Vector3(this._horizontalTiles, this.verticalTiles, batches));\n\n // We don't actually use the matrix data but we need enough capacity for the lights\n this._proxyMesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(maxLights * 16));\n this._proxyMesh.thinInstanceCount = this._lights.length;\n this._tileMaskBatches = batches;\n return this._tileMaskTexture;\n }\n\n private _updateLightData(): void {\n const buf = this._lightDataBuffer;\n for (let i = 0; i < this._lights.length; i += 1) {\n const light = this._lights[i];\n const off = i * 20;\n const computed = light.computeTransformedInformation();\n const scaledIntensity = light.getScaledIntensity();\n\n const position = computed ? light.transformedPosition : light.position;\n const diffuse = light.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\n const specular = light.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\n const range = Math.min(light.range, this.maxRange);\n const inverseSquaredRange = Math.max(light._inverseSquaredRange, this._minInverseSquaredRange);\n\n // vLightData\n buf[off + 0] = position.x;\n buf[off + 1] = position.y;\n buf[off + 2] = position.z;\n buf[off + 3] = 0;\n // vLightDiffuse\n buf[off + 4] = diffuse.r;\n buf[off + 5] = diffuse.g;\n buf[off + 6] = diffuse.b;\n buf[off + 7] = range;\n // vLightSpecular\n buf[off + 8] = specular.r;\n buf[off + 9] = specular.g;\n buf[off + 10] = specular.b;\n buf[off + 11] = light.radius;\n // vLightDirection\n buf[off + 12] = 0;\n buf[off + 13] = 0;\n buf[off + 14] = 0;\n buf[off + 15] = -1;\n // vLightFalloff\n buf[off + 16] = range;\n buf[off + 17] = inverseSquaredRange;\n buf[off + 18] = 0;\n buf[off + 19] = 0;\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n const spotLight = <SpotLight>light;\n const direction = Vector3.NormalizeToRef(computed ? spotLight.transformedDirection : spotLight.direction, TmpVectors.Vector3[0]);\n\n // vLightData.a\n buf[off + 3] = spotLight.exponent;\n // vLightDirection\n buf[off + 12] = direction.x;\n buf[off + 13] = direction.y;\n buf[off + 14] = direction.z;\n buf[off + 15] = spotLight._cosHalfAngle;\n // vLightFalloff.zw\n buf[off + 18] = spotLight._lightAngleScale;\n buf[off + 19] = spotLight._lightAngleOffset;\n }\n }\n this._lightDataTexture.update(this._lightDataBuffer);\n }\n\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void {\n for (const light of this._lights) {\n light.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n this._lightDataTexture.dispose();\n this._tileMaskTexture.dispose();\n this._tileMaskBuffer?.dispose();\n this._proxyMesh.dispose(doNotRecurse, disposeMaterialAndTextures);\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n\n /**\n * Adds a light to the clustering system.\n * @param light The light to add\n */\n public addLight(light: Light): void {\n if (!ClusteredLightContainer.IsLightSupported(light)) {\n Logger.Warn(\"Attempting to add a light to cluster that does not support clustering\");\n return;\n }\n this._scene.removeLight(light);\n this._lights.push(<PointLight | SpotLight>light);\n\n this._proxyMesh.isVisible = true;\n this._proxyMesh.thinInstanceCount = this._lights.length;\n }\n\n /**\n * Removes a light from the clustering system.\n * @param light The light to remove\n * @returns the index where the light was in the light list\n */\n public removeLight(light: Light): number {\n const index = this.lights.indexOf(light);\n if (index === -1) {\n return index;\n }\n this._lights.splice(index, 1);\n this._scene.addLight(light);\n\n this._proxyMesh.thinInstanceCount = this._lights.length;\n if (this._lights.length === 0) {\n this._proxyMesh.isVisible = false;\n }\n return index;\n }\n\n protected override _buildUniformLayout(): void {\n this._uniformBuffer.addUniform(\"vLightData\", 4);\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\n this._uniformBuffer.addUniform(\"vNumLights\", 1);\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\n this._uniformBuffer.addUniform(\"depthValues\", 2);\n this._uniformBuffer.create();\n }\n\n public override transferToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n const hscale = this._horizontalTiles / engine.getRenderWidth();\n const vscale = this._verticalTiles / engine.getRenderHeight();\n this._uniformBuffer.updateFloat4(\"vLightData\", hscale, vscale, this._verticalTiles, this._tileMaskBatches, lightIndex);\n this._uniformBuffer.updateFloat(\"vNumLights\", this._lights.length, lightIndex);\n return this;\n }\n\n public override transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n effect.setTexture(\"lightDataTexture\" + lightIndex, this._lightDataTexture);\n if (engine.isWebGPU) {\n (<WebGPUEngine>engine).setStorageBuffer(\"tileMaskBuffer\" + lightIndex, this._tileMaskBuffer);\n } else {\n effect.setTexture(\"tileMaskTexture\" + lightIndex, this._tileMaskTexture);\n }\n return this;\n }\n\n public override transferToNodeMaterialEffect(): Light {\n // TODO: ????\n return this;\n }\n\n public override prepareLightSpecificDefines(defines: any, lightIndex: number): void {\n defines[\"CLUSTLIGHT\" + lightIndex] = true;\n defines[\"CLUSTLIGHT_BATCH\"] = this._batchSize;\n }\n\n public override _isReady(): boolean {\n this._updateBatches();\n return this._proxyMesh.isReady(true, true);\n }\n}\n\n// Register Class Name\nRegisterClass(\"BABYLON.ClusteredLightContainer\", ClusteredLightContainer);\n"]}
1
+ {"version":3,"file":"clusteredLightContainer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Lights/Clustered/clusteredLightContainer.ts"],"names":[],"mappings":"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","sourcesContent":["import { StorageBuffer } from \"core/Buffers/storageBuffer\";\nimport type { Camera } from \"core/Cameras/camera\";\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\nimport { Constants } from \"core/Engines/constants\";\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\nimport type { Effect } from \"core/Materials/effect\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\nimport { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { TmpColors } from \"core/Maths/math.color\";\nimport { TmpVectors, Vector3 } from \"core/Maths/math.vector\";\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\nimport type { Mesh } from \"core/Meshes/mesh\";\nimport { serialize } from \"core/Misc/decorators\";\nimport { _WarnImport } from \"core/Misc/devTools\";\nimport { Logger } from \"core/Misc/logger\";\nimport { RegisterClass } from \"core/Misc/typeStore\";\nimport { Node } from \"core/node\";\nimport type { Scene } from \"core/scene\";\nimport type { Nullable } from \"core/types\";\n\nimport { Light } from \"../light\";\nimport { LightConstants } from \"../lightConstants\";\nimport type { PointLight } from \"../pointLight\";\nimport type { SpotLight } from \"../spotLight\";\n\nimport \"core/Meshes/thinInstanceMesh\";\n\nNode.AddNodeConstructor(\"Light_Type_5\", (name, scene) => {\n return () => new ClusteredLightContainer(name, [], scene);\n});\n\nconst DefaultDepthSlices = 16;\n\n/**\n * A special light that renders all its associated spot or point lights using a clustered or forward+ system.\n */\nexport class ClusteredLightContainer extends Light {\n private static _GetEngineBatchSize(engine: AbstractEngine): number {\n const caps = engine._caps;\n if (!caps.texelFetch) {\n return 0;\n } else if (engine.isWebGPU) {\n // On WebGPU we use atomic writes to storage textures\n return 32;\n } else if (engine.version > 1) {\n // On WebGL 2 we use additive float blending as the light mask\n if (!caps.colorBufferFloat || !caps.blendFloat) {\n return 0;\n }\n // Due to the use of floats we want to limit lights to the precision of floats\n return caps.shaderFloatPrecision;\n } else {\n // WebGL 1 is not supported due to lack of dynamic for loops\n return 0;\n }\n }\n\n /**\n * Checks if the clustered lighting system supports the given light with its current parameters.\n * This will also check if the light's associated engine supports clustered lighting.\n *\n * @param light The light to test\n * @returns true if the light and its engine is supported\n */\n public static IsLightSupported(light: Light): boolean {\n if (ClusteredLightContainer._GetEngineBatchSize(light.getEngine()) === 0) {\n return false;\n } else if (light.shadowEnabled && light._scene.shadowsEnabled && light.getShadowGenerators()) {\n // Shadows are not supported\n return false;\n } else if (light.falloffType !== Light.FALLOFF_DEFAULT) {\n // Only the default falloff is supported\n return false;\n } else if (light.getTypeID() === LightConstants.LIGHTTYPEID_POINTLIGHT) {\n return true;\n } else if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n // Extra texture bindings per light are not supported\n return !(<SpotLight>light).projectionTexture && !(<SpotLight>light).iesProfileTexture;\n } else {\n // Currently only point and spot lights are supported\n return false;\n }\n }\n\n /** @internal */\n public static _SceneComponentInitialization: (scene: Scene) => void = () => {\n throw _WarnImport(\"ClusteredLightingSceneComponent\");\n };\n\n private readonly _batchSize: number;\n\n /**\n * True if clustered lighting is supported.\n */\n public get isSupported(): boolean {\n return this._batchSize > 0;\n }\n\n private readonly _lights: Light[] = [];\n /**\n * Gets the current list of lights added to this clustering system.\n */\n public get lights(): readonly Light[] {\n return this._lights;\n }\n\n // The lights sorted by depth\n private readonly _sortedLights: (PointLight | SpotLight)[] = [];\n\n private _lightDataBuffer: Float32Array;\n private _lightDataTexture: RawTexture;\n private _lightDataRenderId = -1;\n\n private _tileMaskBatches = -1;\n private _tileMaskTexture: RenderTargetTexture;\n private _tileMaskBuffer: Nullable<StorageBuffer>;\n\n private _horizontalTiles = 64;\n /**\n * The number of tiles in the horizontal direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get horizontalTiles(): number {\n return this._horizontalTiles;\n }\n\n public set horizontalTiles(horizontal: number) {\n if (this._horizontalTiles === horizontal) {\n return;\n }\n this._horizontalTiles = horizontal;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _verticalTiles = 64;\n /**\n * The number of tiles in the vertical direction to cluster lights into.\n * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.\n */\n @serialize()\n public get verticalTiles(): number {\n return this._verticalTiles;\n }\n\n public set verticalTiles(vertical: number) {\n if (this._verticalTiles === vertical) {\n return;\n }\n this._verticalTiles = vertical;\n // Force the batch data to be recreated\n this._tileMaskBatches = -1;\n }\n\n private _sliceScale = 0;\n private _sliceBias = 0;\n // List of vec2's that keep track of the min and max index per slice\n private _sliceRanges: Float32Array;\n\n private _depthSlices = DefaultDepthSlices;\n /**\n * The number of slices to split the depth range by and cluster lights into.\n */\n public get depthSlices(): number {\n return this._depthSlices;\n }\n\n public set depthSlices(slices: number) {\n if (this._depthSlices === slices) {\n return;\n }\n this._depthSlices = slices;\n this._sliceRanges = new Float32Array(slices * 2);\n\n // UBO size depends on the number of depth slices\n this._uniformBuffer.dispose();\n this._uniformBuffer = new UniformBuffer(this.getEngine(), undefined, undefined, this.name);\n this._buildUniformLayout();\n }\n\n private readonly _proxyMaterial: ShaderMaterial;\n private readonly _proxyMesh: Mesh;\n\n private _maxRange = 16383;\n private _minInverseSquaredRange = 1 / (this._maxRange * this._maxRange);\n /**\n * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.\n */\n @serialize()\n public get maxRange(): number {\n return this._maxRange;\n }\n\n public set maxRange(range: number) {\n if (this._maxRange === range) {\n return;\n }\n this._maxRange = range;\n this._minInverseSquaredRange = 1 / (range * range);\n }\n\n /**\n * Creates a new clustered light system with an initial set of lights.\n *\n * @param name The name of the clustered light container\n * @param lights The initial set of lights to add\n * @param scene The scene the clustered light container belongs to\n */\n constructor(name: string, lights: Light[] = [], scene?: Scene) {\n super(name, scene);\n const engine = this.getEngine();\n this._batchSize = ClusteredLightContainer._GetEngineBatchSize(engine);\n\n const proxyShader = { vertex: \"lightProxy\", fragment: \"lightProxy\" };\n this._proxyMaterial = new ShaderMaterial(\"ProxyMaterial\", this._scene, proxyShader, {\n attributes: [\"position\"],\n uniforms: [\"view\", \"projection\", \"tileMaskResolution\"],\n samplers: [\"lightDataTexture\"],\n uniformBuffers: [\"Scene\"],\n storageBuffers: [\"tileMaskBuffer\"],\n defines: [`CLUSTLIGHT_BATCH ${this._batchSize}`],\n shaderLanguage: engine.isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\n extraInitializationsAsync: async () => {\n if (engine.isWebGPU) {\n await Promise.all([import(\"../../ShadersWGSL/lightProxy.vertex\"), import(\"../../ShadersWGSL/lightProxy.fragment\")]);\n } else {\n await Promise.all([import(\"../../Shaders/lightProxy.vertex\"), import(\"../../Shaders/lightProxy.fragment\")]);\n }\n },\n });\n\n // Additive blending is for merging masks on WebGL\n this._proxyMaterial.transparencyMode = ShaderMaterial.MATERIAL_ALPHABLEND;\n this._proxyMaterial.alphaMode = Constants.ALPHA_ADD;\n\n this._proxyMesh = CreatePlane(\"ProxyMesh\", { size: 2 });\n // Make sure it doesn't render for the default scene\n this._scene.removeMesh(this._proxyMesh);\n this._proxyMesh.material = this._proxyMaterial;\n\n this._updateBatches();\n\n this._sliceRanges = new Float32Array(this._depthSlices * 2);\n\n if (this._batchSize > 0) {\n ClusteredLightContainer._SceneComponentInitialization(this._scene);\n for (const light of lights) {\n this.addLight(light);\n }\n }\n }\n\n public override getClassName(): string {\n return \"ClusteredLightContainer\";\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override getTypeID(): number {\n return LightConstants.LIGHTTYPEID_CLUSTERED_CONTAINER;\n }\n\n /** @internal */\n public _updateBatches(): RenderTargetTexture {\n this._proxyMesh.isVisible = this._sortedLights.length > 0;\n\n // Ensure space for atleast 1 batch\n const batches = Math.max(Math.ceil(this._sortedLights.length / this._batchSize), 1);\n if (this._tileMaskBatches >= batches) {\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n return this._tileMaskTexture;\n }\n const engine = this.getEngine();\n // Round up to a batch size so we don't have to reallocate as often\n const maxLights = batches * this._batchSize;\n\n this._lightDataBuffer = new Float32Array(20 * maxLights);\n this._lightDataTexture?.dispose();\n this._lightDataTexture = new RawTexture(\n this._lightDataBuffer,\n 5,\n maxLights,\n Constants.TEXTUREFORMAT_RGBA,\n this._scene,\n false,\n false,\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\n Constants.TEXTURETYPE_FLOAT\n );\n this._proxyMaterial.setTexture(\"lightDataTexture\", this._lightDataTexture);\n\n this._tileMaskTexture?.dispose();\n const textureSize = { width: this._horizontalTiles, height: this._verticalTiles };\n if (!engine.isWebGPU) {\n // In WebGL we shift the light proxy by the batch number\n textureSize.height *= batches;\n }\n this._tileMaskTexture = new RenderTargetTexture(\"TileMaskTexture\", textureSize, this._scene, {\n // We don't write anything on WebGPU so make it as small as possible\n type: engine.isWebGPU ? Constants.TEXTURETYPE_UNSIGNED_BYTE : Constants.TEXTURETYPE_FLOAT,\n format: Constants.TEXTUREFORMAT_RED,\n generateDepthBuffer: false,\n });\n\n this._tileMaskTexture.renderParticles = false;\n this._tileMaskTexture.renderSprites = false;\n this._tileMaskTexture.noPrePassRenderer = true;\n this._tileMaskTexture.renderList = [this._proxyMesh];\n\n this._tileMaskTexture.onBeforeBindObservable.add(() => {\n this._updateLightData();\n });\n\n this._tileMaskTexture.onClearObservable.add(() => {\n if (engine.isWebGPU) {\n // Clear the storage buffer for WebGPU\n this._tileMaskBuffer?.clear();\n } else {\n // Only clear the texture on WebGL\n engine.clear({ r: 0, g: 0, b: 0, a: 1 }, true, false);\n }\n });\n\n if (engine.isWebGPU) {\n // WebGPU also needs a storage buffer to write to\n this._tileMaskBuffer?.dispose();\n const bufferSize = this._horizontalTiles * this._verticalTiles * batches * 4;\n this._tileMaskBuffer = new StorageBuffer(<WebGPUEngine>engine, bufferSize);\n this._proxyMaterial.setStorageBuffer(\"tileMaskBuffer\", this._tileMaskBuffer);\n }\n\n this._proxyMaterial.setVector3(\"tileMaskResolution\", new Vector3(this._horizontalTiles, this.verticalTiles, batches));\n\n // We don't actually use the matrix data but we need enough capacity for the lights\n this._proxyMesh.thinInstanceSetBuffer(\"matrix\", new Float32Array(maxLights * 16));\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n this._tileMaskBatches = batches;\n return this._tileMaskTexture;\n }\n\n private _getSliceIndex(camera: Camera, depth: number): number {\n if (depth < camera.minZ) {\n // Prevent calling log on small or negative values\n return -1;\n }\n return Math.floor(Math.log(depth) * this._sliceScale + this._sliceBias);\n }\n\n private _updateLightData(): void {\n const camera = this._scene.activeCamera;\n const renderId = this._scene.getRenderId();\n if (!camera || this._lightDataRenderId === renderId) {\n return;\n }\n this._lightDataRenderId = renderId;\n\n // Resort lights based on distance from camera\n const view = camera.getViewMatrix();\n for (const light of this._sortedLights) {\n const position = light.computeTransformedInformation() ? light.transformedPosition : light.position;\n const viewPosition = Vector3.TransformCoordinatesToRef(position, view, TmpVectors.Vector3[0]);\n light._currentViewDepth = viewPosition.z;\n }\n this._sortedLights.sort((a, b) => a._currentViewDepth - b._currentViewDepth);\n\n // DOOM 2016 subdivision scheme, copied from: https://www.aortiz.me/2018/12/21/CG.html\n const logFarNear = Math.log(camera.maxZ / camera.minZ);\n this._sliceScale = this._depthSlices / logFarNear;\n this._sliceBias = -(this._depthSlices * Math.log(camera.minZ)) / logFarNear;\n\n this._sliceRanges.fill(0);\n // Last slice which had had its min index updated\n let minSlice = -1;\n\n const buf = this._lightDataBuffer;\n for (let i = 0; i < this._sortedLights.length; i += 1) {\n const light = this._sortedLights[i];\n const off = i * 20;\n const computed = light.computeTransformedInformation();\n const scaledIntensity = light.getScaledIntensity();\n\n const position = computed ? light.transformedPosition : light.position;\n const diffuse = light.diffuse.scaleToRef(scaledIntensity, TmpColors.Color3[0]);\n const specular = light.specular.scaleToRef(scaledIntensity, TmpColors.Color3[1]);\n const range = Math.min(light.range, this.maxRange);\n const inverseSquaredRange = Math.max(light._inverseSquaredRange, this._minInverseSquaredRange);\n\n // vLightData\n buf[off + 0] = position.x;\n buf[off + 1] = position.y;\n buf[off + 2] = position.z;\n buf[off + 3] = 0;\n // vLightDiffuse\n buf[off + 4] = diffuse.r;\n buf[off + 5] = diffuse.g;\n buf[off + 6] = diffuse.b;\n buf[off + 7] = range;\n // vLightSpecular\n buf[off + 8] = specular.r;\n buf[off + 9] = specular.g;\n buf[off + 10] = specular.b;\n buf[off + 11] = light.radius;\n // vLightDirection\n buf[off + 12] = 0;\n buf[off + 13] = 0;\n buf[off + 14] = 0;\n buf[off + 15] = -1;\n // vLightFalloff\n buf[off + 16] = range;\n buf[off + 17] = inverseSquaredRange;\n buf[off + 18] = 0;\n buf[off + 19] = 0;\n\n if (light.getTypeID() === LightConstants.LIGHTTYPEID_SPOTLIGHT) {\n const spotLight = <SpotLight>light;\n const direction = Vector3.NormalizeToRef(computed ? spotLight.transformedDirection : spotLight.direction, TmpVectors.Vector3[0]);\n\n // vLightData.a\n buf[off + 3] = spotLight.exponent;\n // vLightDirection\n buf[off + 12] = direction.x;\n buf[off + 13] = direction.y;\n buf[off + 14] = direction.z;\n buf[off + 15] = spotLight._cosHalfAngle;\n // vLightFalloff.zw\n buf[off + 18] = spotLight._lightAngleScale;\n buf[off + 19] = spotLight._lightAngleOffset;\n }\n\n // Update the depth slices that include this light\n const firstSlice = this._getSliceIndex(camera, light._currentViewDepth - range);\n const lastSlice = this._getSliceIndex(camera, light._currentViewDepth + range);\n for (let j = firstSlice; j <= lastSlice; j += 1) {\n if (j < 0 || j >= this._depthSlices) {\n continue;\n } else if (j > minSlice) {\n // Update min index\n this._sliceRanges[j * 2] = i;\n minSlice = j;\n }\n // Update max index\n this._sliceRanges[j * 2 + 1] = i;\n }\n }\n\n const engine = this.getEngine();\n if (engine.isWebGPU) {\n // Whenever the light data changes we have to flush pending WebGPU command buffers so that\n // previous render passes use the old data and later render passes use the new data.\n engine.flushFramebuffer();\n }\n this._lightDataTexture.update(this._lightDataBuffer);\n }\n\n public override dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void {\n for (const light of this._lights) {\n light.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n this._lightDataTexture.dispose();\n this._tileMaskTexture.dispose();\n this._tileMaskBuffer?.dispose();\n this._proxyMesh.dispose(doNotRecurse, disposeMaterialAndTextures);\n super.dispose(doNotRecurse, disposeMaterialAndTextures);\n }\n\n /**\n * Adds a light to the clustering system.\n * @param light The light to add\n */\n public addLight(light: Light): void {\n if (!ClusteredLightContainer.IsLightSupported(light)) {\n Logger.Warn(\"Attempting to add a light to cluster that does not support clustering\");\n return;\n }\n this._scene.removeLight(light);\n this._lights.push(light);\n this._sortedLights.push(<PointLight | SpotLight>light);\n\n this._proxyMesh.isVisible = true;\n this._proxyMesh.thinInstanceCount = this._sortedLights.length;\n }\n\n /**\n * Removes a light from the clustering system.\n * @param light The light to remove\n * @returns the index where the light was in the light list\n */\n public removeLight(light: Light): number {\n // Convert to `Light` array without cast so `indexOf` has correct typing\n const sortedLights: Light[] = this._sortedLights;\n const sortedIndex = sortedLights.indexOf(light);\n if (sortedIndex !== -1) {\n sortedLights.splice(sortedIndex, 1);\n\n this._proxyMesh.thinInstanceCount = sortedLights.length;\n if (sortedLights.length === 0) {\n this._proxyMesh.isVisible = false;\n }\n }\n\n const index = this._lights.indexOf(light);\n if (index !== -1) {\n this._lights.splice(index, 1);\n // We treat the unsorted array as the \"real\" one so only add back to the scene if it was found in that\n this._scene.addLight(light);\n }\n return index;\n }\n\n protected override _buildUniformLayout(): void {\n this._uniformBuffer.addUniform(\"vLightData\", 4);\n this._uniformBuffer.addUniform(\"vLightDiffuse\", 4);\n this._uniformBuffer.addUniform(\"vLightSpecular\", 4);\n this._uniformBuffer.addUniform(\"vSliceData\", 2);\n // _depthSlices might not be initialized yet\n this._uniformBuffer.addUniform(\"vSliceRanges\", 2, this._depthSlices ?? DefaultDepthSlices);\n this._uniformBuffer.addUniform(\"shadowsInfo\", 3);\n this._uniformBuffer.addUniform(\"depthValues\", 2);\n this._uniformBuffer.create();\n }\n\n public override transferToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n const hscale = this._horizontalTiles / engine.getRenderWidth();\n const vscale = this._verticalTiles / engine.getRenderHeight();\n this._uniformBuffer.updateFloat4(\"vLightData\", hscale, vscale, this._verticalTiles, this._tileMaskBatches, lightIndex);\n this._uniformBuffer.updateFloat2(\"vSliceData\", this._sliceScale, this._sliceBias, lightIndex);\n this._uniformBuffer.updateFloatArray(\"vSliceRanges\", this._sliceRanges, lightIndex);\n return this;\n }\n\n public override transferTexturesToEffect(effect: Effect, lightIndex: string): Light {\n const engine = this.getEngine();\n effect.setTexture(\"lightDataTexture\" + lightIndex, this._lightDataTexture);\n if (engine.isWebGPU) {\n (<WebGPUEngine>engine).setStorageBuffer(\"tileMaskBuffer\" + lightIndex, this._tileMaskBuffer);\n } else {\n effect.setTexture(\"tileMaskTexture\" + lightIndex, this._tileMaskTexture);\n }\n return this;\n }\n\n public override transferToNodeMaterialEffect(): Light {\n // TODO: ????\n return this;\n }\n\n public override prepareLightSpecificDefines(defines: any, lightIndex: number): void {\n defines[\"CLUSTLIGHT\" + lightIndex] = true;\n defines[\"CLUSTLIGHT_BATCH\"] = this._batchSize;\n defines[\"CLUSTLIGHT_SLICES\"] = this._depthSlices;\n }\n\n public override _isReady(): boolean {\n this._updateBatches();\n return this._proxyMesh.isReady(true, true);\n }\n}\n\n// Register Class Name\nRegisterClass(\"BABYLON.ClusteredLightContainer\", ClusteredLightContainer);\n"]}
@@ -556,6 +556,7 @@ export class CascadedShadowGenerator extends ShadowGenerator {
556
556
  }
557
557
  _createTargetRenderTexture() {
558
558
  const engine = this._scene.getEngine();
559
+ this._shadowMap?.dispose();
559
560
  const size = { width: this._mapSize, height: this._mapSize, layers: this.numCascades };
560
561
  this._shadowMap = new RenderTargetTexture(this._light.name + "_CSMShadowMap", size, this._scene, false, true, this._textureType, false, undefined, false, false, undefined, this._useRedTextureType ? 6 : 5);
561
562
  this._shadowMap.createDepthStencilTexture(engine.useReverseDepthBuffer ? 516 : 513, true, undefined, undefined, undefined, `DepthStencilForCSMShadowGenerator-${this._light.name}`);
@@ -1 +1 @@
1
- {"version":3,"file":"cascadedShadowGenerator.js","sourceRoot":"","sources":["../../../../../dev/core/src/Lights/Shadows/cascadedShadowGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\n\r\nimport type { IShadowLight } from \"../../Lights/shadowLight\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\n\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShadowGenerator } from \"./shadowGenerator\";\r\nimport type { DirectionalLight } from \"../directionalLight\";\r\n\r\nimport { BoundingInfo } from \"../../Culling/boundingInfo\";\r\nimport type { DepthRenderer } from \"../../Rendering/depthRenderer\";\r\nimport { DepthReducer } from \"../../Misc/depthReducer\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\n\r\ninterface ICascade {\r\n prevBreakDistance: number;\r\n breakDistance: number;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst UpDir = Vector3.Up();\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst ZeroVec = Vector3.Zero();\r\n\r\nconst Tmpv1 = new Vector3();\r\nconst Tmpv2 = new Vector3();\r\nconst 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 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 override 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 MIN_CASCADES_COUNT = 2;\r\n /**\r\n * Defines the maximum number of cascades used by the CSM.\r\n */\r\n public static MAX_CASCADES_COUNT = 4;\r\n\r\n protected override _validateFilter(filter: number): number {\r\n if (filter === ShadowGenerator.FILTER_NONE || filter === ShadowGenerator.FILTER_PCF || filter === ShadowGenerator.FILTER_PCSS) {\r\n return filter;\r\n }\r\n\r\n Logger.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 this._recreateSceneUBOs();\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());\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.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_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\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 override 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._getCamera()) {\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 const camera = this._getCamera();\r\n if (!camera) {\r\n this._shadowMaxZ = value;\r\n return;\r\n }\r\n if (this._shadowMaxZ === value || value < camera.minZ || (value > camera.maxZ && camera.maxZ !== 0)) {\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._getCamera();\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,\r\n 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 const camera = this._getCamera();\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const near = camera.minZ,\r\n far = camera.maxZ || this._shadowMaxZ, // account for infinite far plane (ie. maxZ = 0)\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 const scene = this._scene;\r\n\r\n const camera = this._getCamera();\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 // Z extents of the current cascade, in cascade view coordinate system\r\n let viewMinZ = 0,\r\n viewMaxZ = 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 // Note that after the call to update, the boundingInfo properties that are identified as \"world\" coordinates are in fact view coordinates for the current cascade!\r\n // This is because the boundingInfo properties that are identifed as \"local\" are in fact world coordinates (see _computeShadowCastersBoundingInfo()), and we multiply them by the current cascade view matrix when we call update.\r\n\r\n const castersViewMinZ = boundingInfo.boundingBox.minimumWorld.z;\r\n const castersViewMaxZ = boundingInfo.boundingBox.maximumWorld.z;\r\n\r\n if (castersViewMinZ > viewMaxZ) {\r\n // Do nothing, keep the current z extents.\r\n // All the casters are too far from the light to have an impact on the current cascade.\r\n // Possible optimization: skip the rendering of the shadow map for this cascade, as all the casters will be clipped by the GPU anyway.\r\n } else {\r\n if (!this._depthClamp || this.filter === ShadowGenerator.FILTER_PCSS) {\r\n // If we don't use depth clamping, we must define minZ so that all shadow casters are in the cascade frustum\r\n viewMinZ = Math.min(viewMinZ, castersViewMinZ);\r\n\r\n if (this.filter !== ShadowGenerator.FILTER_PCSS) {\r\n // We do not need the actual distance between the currently shaded pixel and the occluder when generating shadows, so we can lower the far plane to increase the accuracy of the shadow map.\r\n viewMaxZ = Math.min(viewMaxZ, castersViewMaxZ);\r\n }\r\n } else {\r\n // If we use depth clamping (but not PCSS!), we can adjust minZ/maxZ to reduce the range [minZ, maxZ] (and obtain additional precision in the shadow map)\r\n viewMaxZ = Math.min(viewMaxZ, castersViewMaxZ);\r\n\r\n // Thanks to depth clamping, casters won't be Z clipped even if they fall outside the [-1,1] range, so we can move the near plane to 0 if castersViewMinZ < 0.\r\n // We will generate negative Z values in the shadow map, but that's okay (they will be clamped to the 0..1 range anyway), except in PCSS case\r\n // where we need the actual distance between the currently shader pixel and the occluder: that's why we don't use depth clamping in PCSS case.\r\n viewMinZ = Math.max(viewMinZ, castersViewMinZ);\r\n\r\n // If all the casters are behind the near plane of the cascade, minZ = 0 due to the previous line, and maxZ < 0 at this point.\r\n // We need to make sure that maxZ > minZ, so in this case we set maxZ a little higher than minZ. As we are using depth clamping, the casters won't be Z clipped, so we just need to make sure that we have a valid Z range for the cascade.\r\n // Having a 0 range is not ok, due to undefined behavior in the calculation in this case.\r\n viewMaxZ = Math.max(viewMinZ + 1.0, viewMaxZ);\r\n }\r\n }\r\n\r\n Matrix.OrthoOffCenterLHToRef(\r\n this._cascadeMinExtents[cascadeIndex].x,\r\n this._cascadeMaxExtents[cascadeIndex].x,\r\n this._cascadeMinExtents[cascadeIndex].y,\r\n this._cascadeMaxExtents[cascadeIndex].y,\r\n useReverseDepthBuffer ? viewMaxZ : viewMinZ,\r\n useReverseDepthBuffer ? viewMinZ : viewMaxZ,\r\n this._projectionMatrices[cascadeIndex],\r\n scene.getEngine().isNDCHalfZRange\r\n );\r\n\r\n this._cascadeMinExtents[cascadeIndex].z = viewMinZ;\r\n this._cascadeMaxExtents[cascadeIndex].z = viewMaxZ;\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 const camera = this._getCamera();\r\n if (!camera) {\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 camera.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 cameraInfiniteFarPlane = camera.maxZ === 0;\r\n const saveCameraMaxZ = camera.maxZ;\r\n\r\n if (cameraInfiniteFarPlane) {\r\n camera.maxZ = this._shadowMaxZ;\r\n camera.getProjectionMatrix(true);\r\n }\r\n\r\n const invViewProj = Matrix.Invert(camera.getTransformationMatrix());\r\n\r\n if (cameraInfiniteFarPlane) {\r\n camera.maxZ = saveCameraMaxZ;\r\n camera.getProjectionMatrix(true);\r\n }\r\n\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.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n this._frustumCenter[cascadeIndex].copyFromFloats(0, 0, 0);\r\n\r\n const camera = this._getCamera();\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 protected _recreateSceneUBOs(): void {\r\n this._disposeSceneUBOs();\r\n if (this._sceneUBOs) {\r\n for (let i = 0; i < this._numCascades; ++i) {\r\n this._sceneUBOs.push(this._scene.createSceneUniformBuffer(`Scene for CSM Shadow Generator (light \"${this._light.name}\" cascade #${i})`));\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 const 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 /**\r\n * @internal\r\n */\r\n public static override _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 * @param camera Camera associated with this shadow generator (default: null). If null, takes the scene active camera at the time we need to access it\r\n * @param useRedTextureType Forces the generator to use a Red instead of a RGBA type for the shadow map texture format (default: true)\r\n */\r\n constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean, camera?: Nullable<Camera>, useRedTextureType = true) {\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, camera, useRedTextureType);\r\n\r\n this.usePercentageCloserFiltering = true;\r\n }\r\n\r\n protected override _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._getCamera()?.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 this._recreateSceneUBOs();\r\n\r\n super._initializeGenerator();\r\n }\r\n\r\n protected override _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(\r\n this._light.name + \"_CSMShadowMap\",\r\n size,\r\n this._scene,\r\n false,\r\n true,\r\n this._textureType,\r\n false,\r\n undefined,\r\n false,\r\n false,\r\n undefined,\r\n this._useRedTextureType ? Constants.TEXTUREFORMAT_RED : Constants.TEXTUREFORMAT_RGBA\r\n );\r\n this._shadowMap.createDepthStencilTexture(\r\n engine.useReverseDepthBuffer ? Constants.GREATER : Constants.LESS,\r\n true,\r\n undefined,\r\n undefined,\r\n undefined,\r\n `DepthStencilForCSMShadowGenerator-${this._light.name}`\r\n );\r\n this._shadowMap.noPrePassRenderer = true;\r\n }\r\n\r\n protected override _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 const 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 if (this._sceneUBOs) {\r\n this._scene.setSceneUniformBuffer(this._sceneUBOs[layer]);\r\n }\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 this._currentSceneUBO = this._scene.getSceneUniformBuffer();\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 override _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect): void {\r\n effect.setMatrix(\"viewProjection\", this.getCascadeTransformMatrix(this._currentLayer)!);\r\n }\r\n\r\n protected override _isReadyCustomDefines(defines: any): 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 override prepareDefines(defines: any, lightIndex: number): void {\r\n super.prepareDefines(defines, lightIndex);\r\n\r\n const scene = this._scene;\r\n const 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 = this._getCamera();\r\n\r\n if (camera && this._shadowMaxZ <= (camera.maxZ || this._shadowMaxZ)) {\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 override 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 = this._getCamera();\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(\"shadowTexture\" + 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] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (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] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (this._cascadeMaxExtents[0].y - this._cascadeMinExtents[0].y) / (this._cascadeMaxExtents[cascadeIndex].y - this._cascadeMinExtents[cascadeIndex].y); // y correction\r\n this._depthCorrection[cascadeIndex] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (this._cascadeMaxExtents[cascadeIndex].z - this._cascadeMinExtents[cascadeIndex].z) / (this._cascadeMaxExtents[0].z - this._cascadeMinExtents[0].z);\r\n }\r\n effect.setDepthStencilTexture(\"shadowTexture\" + lightIndex, shadowMap);\r\n effect.setTexture(\"depthTexture\" + lightIndex, shadowMap);\r\n\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 } else {\r\n effect.setTexture(\"shadowTexture\" + 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(\r\n \"depthValues\",\r\n this.getLight().getDepthMinZ(camera),\r\n this.getLight().getDepthMinZ(camera) + this.getLight().getDepthMaxZ(camera),\r\n lightIndex\r\n );\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 override 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 override 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 override serialize(): any {\r\n const serializationObject: any = super.serialize();\r\n const 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 (let meshIndex = 0; meshIndex < shadowMap.renderList.length; meshIndex++) {\r\n const 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 override Parse(parsedShadowGenerator: any, scene: Scene): ShadowGenerator {\r\n const shadowGenerator = ShadowGenerator.Parse(\r\n parsedShadowGenerator,\r\n scene,\r\n (mapSize: number, light: IShadowLight, camera: Nullable<Camera>) => new CascadedShadowGenerator(mapSize, <DirectionalLight>light, undefined, camera)\r\n ) 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":["../../../../../dev/core/src/Lights/Shadows/cascadedShadowGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\n\r\nimport type { IShadowLight } from \"../../Lights/shadowLight\";\r\nimport type { Effect } from \"../../Materials/effect\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\n\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { _WarnImport } from \"../../Misc/devTools\";\r\nimport { ShadowGenerator } from \"./shadowGenerator\";\r\nimport type { DirectionalLight } from \"../directionalLight\";\r\n\r\nimport { BoundingInfo } from \"../../Culling/boundingInfo\";\r\nimport type { DepthRenderer } from \"../../Rendering/depthRenderer\";\r\nimport { DepthReducer } from \"../../Misc/depthReducer\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { EngineStore } from \"../../Engines/engineStore\";\r\nimport type { Camera } from \"../../Cameras/camera\";\r\n\r\ninterface ICascade {\r\n prevBreakDistance: number;\r\n breakDistance: number;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst UpDir = Vector3.Up();\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nconst ZeroVec = Vector3.Zero();\r\n\r\nconst Tmpv1 = new Vector3();\r\nconst Tmpv2 = new Vector3();\r\nconst 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 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 override 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 MIN_CASCADES_COUNT = 2;\r\n /**\r\n * Defines the maximum number of cascades used by the CSM.\r\n */\r\n public static MAX_CASCADES_COUNT = 4;\r\n\r\n protected override _validateFilter(filter: number): number {\r\n if (filter === ShadowGenerator.FILTER_NONE || filter === ShadowGenerator.FILTER_PCF || filter === ShadowGenerator.FILTER_PCSS) {\r\n return filter;\r\n }\r\n\r\n Logger.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 this._recreateSceneUBOs();\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());\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.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_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\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 override 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._getCamera()) {\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 const camera = this._getCamera();\r\n if (!camera) {\r\n this._shadowMaxZ = value;\r\n return;\r\n }\r\n if (this._shadowMaxZ === value || value < camera.minZ || (value > camera.maxZ && camera.maxZ !== 0)) {\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._getCamera();\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,\r\n 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 const camera = this._getCamera();\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n const near = camera.minZ,\r\n far = camera.maxZ || this._shadowMaxZ, // account for infinite far plane (ie. maxZ = 0)\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 const scene = this._scene;\r\n\r\n const camera = this._getCamera();\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 // Z extents of the current cascade, in cascade view coordinate system\r\n let viewMinZ = 0,\r\n viewMaxZ = 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 // Note that after the call to update, the boundingInfo properties that are identified as \"world\" coordinates are in fact view coordinates for the current cascade!\r\n // This is because the boundingInfo properties that are identifed as \"local\" are in fact world coordinates (see _computeShadowCastersBoundingInfo()), and we multiply them by the current cascade view matrix when we call update.\r\n\r\n const castersViewMinZ = boundingInfo.boundingBox.minimumWorld.z;\r\n const castersViewMaxZ = boundingInfo.boundingBox.maximumWorld.z;\r\n\r\n if (castersViewMinZ > viewMaxZ) {\r\n // Do nothing, keep the current z extents.\r\n // All the casters are too far from the light to have an impact on the current cascade.\r\n // Possible optimization: skip the rendering of the shadow map for this cascade, as all the casters will be clipped by the GPU anyway.\r\n } else {\r\n if (!this._depthClamp || this.filter === ShadowGenerator.FILTER_PCSS) {\r\n // If we don't use depth clamping, we must define minZ so that all shadow casters are in the cascade frustum\r\n viewMinZ = Math.min(viewMinZ, castersViewMinZ);\r\n\r\n if (this.filter !== ShadowGenerator.FILTER_PCSS) {\r\n // We do not need the actual distance between the currently shaded pixel and the occluder when generating shadows, so we can lower the far plane to increase the accuracy of the shadow map.\r\n viewMaxZ = Math.min(viewMaxZ, castersViewMaxZ);\r\n }\r\n } else {\r\n // If we use depth clamping (but not PCSS!), we can adjust minZ/maxZ to reduce the range [minZ, maxZ] (and obtain additional precision in the shadow map)\r\n viewMaxZ = Math.min(viewMaxZ, castersViewMaxZ);\r\n\r\n // Thanks to depth clamping, casters won't be Z clipped even if they fall outside the [-1,1] range, so we can move the near plane to 0 if castersViewMinZ < 0.\r\n // We will generate negative Z values in the shadow map, but that's okay (they will be clamped to the 0..1 range anyway), except in PCSS case\r\n // where we need the actual distance between the currently shader pixel and the occluder: that's why we don't use depth clamping in PCSS case.\r\n viewMinZ = Math.max(viewMinZ, castersViewMinZ);\r\n\r\n // If all the casters are behind the near plane of the cascade, minZ = 0 due to the previous line, and maxZ < 0 at this point.\r\n // We need to make sure that maxZ > minZ, so in this case we set maxZ a little higher than minZ. As we are using depth clamping, the casters won't be Z clipped, so we just need to make sure that we have a valid Z range for the cascade.\r\n // Having a 0 range is not ok, due to undefined behavior in the calculation in this case.\r\n viewMaxZ = Math.max(viewMinZ + 1.0, viewMaxZ);\r\n }\r\n }\r\n\r\n Matrix.OrthoOffCenterLHToRef(\r\n this._cascadeMinExtents[cascadeIndex].x,\r\n this._cascadeMaxExtents[cascadeIndex].x,\r\n this._cascadeMinExtents[cascadeIndex].y,\r\n this._cascadeMaxExtents[cascadeIndex].y,\r\n useReverseDepthBuffer ? viewMaxZ : viewMinZ,\r\n useReverseDepthBuffer ? viewMinZ : viewMaxZ,\r\n this._projectionMatrices[cascadeIndex],\r\n scene.getEngine().isNDCHalfZRange\r\n );\r\n\r\n this._cascadeMinExtents[cascadeIndex].z = viewMinZ;\r\n this._cascadeMaxExtents[cascadeIndex].z = viewMaxZ;\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 const camera = this._getCamera();\r\n if (!camera) {\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 camera.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 cameraInfiniteFarPlane = camera.maxZ === 0;\r\n const saveCameraMaxZ = camera.maxZ;\r\n\r\n if (cameraInfiniteFarPlane) {\r\n camera.maxZ = this._shadowMaxZ;\r\n camera.getProjectionMatrix(true);\r\n }\r\n\r\n const invViewProj = Matrix.Invert(camera.getTransformationMatrix());\r\n\r\n if (cameraInfiniteFarPlane) {\r\n camera.maxZ = saveCameraMaxZ;\r\n camera.getProjectionMatrix(true);\r\n }\r\n\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.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n this._frustumCenter[cascadeIndex].copyFromFloats(0, 0, 0);\r\n\r\n const camera = this._getCamera();\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 protected _recreateSceneUBOs(): void {\r\n this._disposeSceneUBOs();\r\n if (this._sceneUBOs) {\r\n for (let i = 0; i < this._numCascades; ++i) {\r\n this._sceneUBOs.push(this._scene.createSceneUniformBuffer(`Scene for CSM Shadow Generator (light \"${this._light.name}\" cascade #${i})`));\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 const 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 /**\r\n * @internal\r\n */\r\n public static override _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 * @param camera Camera associated with this shadow generator (default: null). If null, takes the scene active camera at the time we need to access it\r\n * @param useRedTextureType Forces the generator to use a Red instead of a RGBA type for the shadow map texture format (default: true)\r\n */\r\n constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean, camera?: Nullable<Camera>, useRedTextureType = true) {\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, camera, useRedTextureType);\r\n\r\n this.usePercentageCloserFiltering = true;\r\n }\r\n\r\n protected override _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._getCamera()?.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 this._recreateSceneUBOs();\r\n\r\n super._initializeGenerator();\r\n }\r\n\r\n protected override _createTargetRenderTexture(): void {\r\n const engine = this._scene.getEngine();\r\n this._shadowMap?.dispose();\r\n const size = { width: this._mapSize, height: this._mapSize, layers: this.numCascades };\r\n this._shadowMap = new RenderTargetTexture(\r\n this._light.name + \"_CSMShadowMap\",\r\n size,\r\n this._scene,\r\n false,\r\n true,\r\n this._textureType,\r\n false,\r\n undefined,\r\n false,\r\n false,\r\n undefined,\r\n this._useRedTextureType ? Constants.TEXTUREFORMAT_RED : Constants.TEXTUREFORMAT_RGBA\r\n );\r\n this._shadowMap.createDepthStencilTexture(\r\n engine.useReverseDepthBuffer ? Constants.GREATER : Constants.LESS,\r\n true,\r\n undefined,\r\n undefined,\r\n undefined,\r\n `DepthStencilForCSMShadowGenerator-${this._light.name}`\r\n );\r\n this._shadowMap.noPrePassRenderer = true;\r\n }\r\n\r\n protected override _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 const 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 if (this._sceneUBOs) {\r\n this._scene.setSceneUniformBuffer(this._sceneUBOs[layer]);\r\n }\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 this._currentSceneUBO = this._scene.getSceneUniformBuffer();\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 override _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect): void {\r\n effect.setMatrix(\"viewProjection\", this.getCascadeTransformMatrix(this._currentLayer)!);\r\n }\r\n\r\n protected override _isReadyCustomDefines(defines: any): 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 override prepareDefines(defines: any, lightIndex: number): void {\r\n super.prepareDefines(defines, lightIndex);\r\n\r\n const scene = this._scene;\r\n const 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 = this._getCamera();\r\n\r\n if (camera && this._shadowMaxZ <= (camera.maxZ || this._shadowMaxZ)) {\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 override 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 = this._getCamera();\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(\"shadowTexture\" + 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] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (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] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (this._cascadeMaxExtents[0].y - this._cascadeMinExtents[0].y) / (this._cascadeMaxExtents[cascadeIndex].y - this._cascadeMinExtents[cascadeIndex].y); // y correction\r\n this._depthCorrection[cascadeIndex] =\r\n cascadeIndex === 0\r\n ? 1\r\n : (this._cascadeMaxExtents[cascadeIndex].z - this._cascadeMinExtents[cascadeIndex].z) / (this._cascadeMaxExtents[0].z - this._cascadeMinExtents[0].z);\r\n }\r\n effect.setDepthStencilTexture(\"shadowTexture\" + lightIndex, shadowMap);\r\n effect.setTexture(\"depthTexture\" + lightIndex, shadowMap);\r\n\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 } else {\r\n effect.setTexture(\"shadowTexture\" + 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(\r\n \"depthValues\",\r\n this.getLight().getDepthMinZ(camera),\r\n this.getLight().getDepthMinZ(camera) + this.getLight().getDepthMaxZ(camera),\r\n lightIndex\r\n );\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 override 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 override 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 override serialize(): any {\r\n const serializationObject: any = super.serialize();\r\n const 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 (let meshIndex = 0; meshIndex < shadowMap.renderList.length; meshIndex++) {\r\n const 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 override Parse(parsedShadowGenerator: any, scene: Scene): ShadowGenerator {\r\n const shadowGenerator = ShadowGenerator.Parse(\r\n parsedShadowGenerator,\r\n scene,\r\n (mapSize: number, light: IShadowLight, camera: Nullable<Camera>) => new CascadedShadowGenerator(mapSize, <DirectionalLight>light, undefined, camera)\r\n ) 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"]}