@babylonjs/core 7.6.0 → 7.6.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.
- package/Animations/animation.js +7 -5
- package/Animations/animation.js.map +1 -1
- package/Bones/bone.js +1 -1
- package/Bones/bone.js.map +1 -1
- package/Cameras/camera.js +1 -1
- package/Cameras/camera.js.map +1 -1
- package/Debug/debugLayer.d.ts +4 -0
- package/Debug/debugLayer.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +2 -0
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Processors/iShaderProcessor.d.ts +3 -1
- package/Engines/Processors/iShaderProcessor.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +2 -2
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +1 -2
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessor.d.ts +0 -1
- package/Engines/WebGPU/webgpuShaderProcessor.js +0 -1
- package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +2 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +10 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +45 -15
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/abstractEngine.js +7 -3
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +4 -0
- package/Engines/constants.js +4 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.common.js +2 -2
- package/Engines/engine.common.js.map +1 -1
- package/Engines/engine.js +5 -2
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +7 -2
- package/Engines/nativeEngine.js +25 -3
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +5 -9
- package/Engines/webgpuEngine.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +4 -4
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +11 -5
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +1 -1
- package/Lights/light.js.map +1 -1
- package/Lights/spotLight.js +1 -1
- package/Lights/spotLight.js.map +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.js +20 -3
- package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.d.ts +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js +10 -4
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.d.ts +1 -0
- package/Materials/Node/Blocks/Dual/lightBlock.js +35 -27
- package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.d.ts +1 -2
- package/Materials/Node/Blocks/Dual/textureBlock.js +13 -20
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/discardBlock.js +1 -1
- package/Materials/Node/Blocks/Fragment/discardBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragCoordBlock.js +3 -1
- package/Materials/Node/Blocks/Fragment/fragCoordBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +6 -4
- package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/frontFacingBlock.js +4 -1
- package/Materials/Node/Blocks/Fragment/frontFacingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/instancesBlock.js +11 -2
- package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
- package/Materials/Node/Blocks/biPlanarBlock.d.ts +2 -0
- package/Materials/Node/Blocks/biPlanarBlock.js +48 -23
- package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/clampBlock.js +4 -1
- package/Materials/Node/Blocks/clampBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.js +32 -17
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/conditionalBlock.js +9 -9
- package/Materials/Node/Blocks/conditionalBlock.js.map +1 -1
- package/Materials/Node/Blocks/curveBlock.js +12 -12
- package/Materials/Node/Blocks/curveBlock.js.map +1 -1
- package/Materials/Node/Blocks/matrixBuilderBlock.js +3 -1
- package/Materials/Node/Blocks/matrixBuilderBlock.js.map +1 -1
- package/Materials/Node/Blocks/matrixTransposeBlock.js +1 -1
- package/Materials/Node/Blocks/matrixTransposeBlock.js.map +1 -1
- package/Materials/Node/Blocks/normalBlendBlock.js +2 -2
- package/Materials/Node/Blocks/normalBlendBlock.js.map +1 -1
- package/Materials/Node/Blocks/simplexPerlin3DBlock.js +14 -6
- package/Materials/Node/Blocks/simplexPerlin3DBlock.js.map +1 -1
- package/Materials/Node/Blocks/transformBlock.js +1 -1
- package/Materials/Node/Blocks/transformBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.d.ts +2 -0
- package/Materials/Node/Blocks/triPlanarBlock.js +33 -14
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/trigonometryBlock.d.ts +3 -1
- package/Materials/Node/Blocks/trigonometryBlock.js +6 -0
- package/Materials/Node/Blocks/trigonometryBlock.js.map +1 -1
- package/Materials/Node/Blocks/worleyNoise3DBlock.js +17 -8
- package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +8 -3
- package/Materials/Node/nodeMaterial.js +15 -24
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlock.d.ts +1 -1
- package/Materials/Node/nodeMaterialBlock.js +1 -1
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +10 -5
- package/Materials/Node/nodeMaterialBuildState.js +45 -18
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/materialHelper.functions.js +3 -3
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -2
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/mesh.js +7 -7
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/transformNode.js +1 -1
- package/Meshes/transformNode.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +12 -4
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +3 -0
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +7 -0
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +18 -0
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js +3 -0
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +29 -29
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js +8 -8
- package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/lightUboDeclaration.js +8 -8
- package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +1 -1
- package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
- package/Shaders/fluidRenderingRender.fragment.js +12 -3
- package/Shaders/fluidRenderingRender.fragment.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +2 -2
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/sprites.fragment.d.ts +2 -0
- package/Shaders/sprites.fragment.js +8 -1
- package/Shaders/sprites.fragment.js.map +1 -1
- package/Shaders/sprites.vertex.d.ts +2 -0
- package/Shaders/sprites.vertex.js +4 -0
- package/Shaders/sprites.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/fogFragmentDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/fogFragmentDeclaration.js +24 -0
- package/ShadersWGSL/ShadersInclude/fogFragmentDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js +279 -0
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +70 -0
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +33 -0
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +57 -0
- package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +1 -1
- package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js +307 -0
- package/ShadersWGSL/ShadersInclude/shadowsFragmentFunctions.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js +53 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -0
- package/Sprites/spriteManager.d.ts +3 -0
- package/Sprites/spriteManager.js +11 -0
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.d.ts +11 -3
- package/Sprites/spriteRenderer.js +49 -32
- package/Sprites/spriteRenderer.js.map +1 -1
- package/node.d.ts +2 -1
- package/node.js +5 -1
- package/node.js.map +1 -1
- package/package.json +1 -1
|
@@ -337,6 +337,7 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
|
|
|
337
337
|
}
|
|
338
338
|
};
|
|
339
339
|
blurFilter.samples = this.textureSamples;
|
|
340
|
+
blurFilter.autoClear = false;
|
|
340
341
|
return blurFilter;
|
|
341
342
|
}
|
|
342
343
|
//Van der Corput radical inverse
|
|
@@ -402,6 +403,7 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
|
|
|
402
403
|
"minZAspect",
|
|
403
404
|
"depthProjection",
|
|
404
405
|
], samplers, ratio, null, Texture.BILINEAR_SAMPLINGMODE, this._scene.getEngine(), false, defines, textureType);
|
|
406
|
+
this._ssaoPostProcess.autoClear = false;
|
|
405
407
|
this._ssaoPostProcess.onApply = (effect) => {
|
|
406
408
|
if (!this._scene.activeCamera) {
|
|
407
409
|
return;
|
|
@@ -455,6 +457,7 @@ export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
|
|
|
455
457
|
effect.setVector4("viewport", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));
|
|
456
458
|
effect.setTextureFromPostProcessOutput("originalColor", this._originalColorPostProcess);
|
|
457
459
|
};
|
|
460
|
+
this._ssaoCombinePostProcess.autoClear = false;
|
|
458
461
|
this._ssaoCombinePostProcess.samples = this.textureSamples;
|
|
459
462
|
}
|
|
460
463
|
_createRandomTexture() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssao2RenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport { Vector3, TmpVectors, Vector2 } from \"../../../Maths/math.vector\";\r\nimport { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Texture } from \"../../../Materials/Textures/texture\";\r\nimport { PostProcess } from \"../../../PostProcesses/postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../../../PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport { PassPostProcess } from \"../../../PostProcesses/passPostProcess\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { EngineStore } from \"../../../Engines/engineStore\";\r\nimport { SSAO2Configuration } from \"../../../Rendering/ssao2Configuration\";\r\nimport type { PrePassRenderer } from \"../../../Rendering/prePassRenderer\";\r\nimport type { GeometryBufferRenderer } from \"../../../Rendering/geometryBufferRenderer\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { Scalar } from \"../../../Maths/math.scalar\";\r\nimport { RawTexture } from \"../../../Materials/Textures/rawTexture\";\r\n\r\nimport \"../../../PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nimport \"../../../Shaders/ssao2.fragment\";\r\nimport \"../../../Shaders/ssaoCombine.fragment\";\r\n\r\n/**\r\n * Render pipeline to produce ssao effect\r\n */\r\nexport class SSAO2RenderingPipeline extends PostProcessRenderPipeline {\r\n // Members\r\n\r\n /**\r\n * @ignore\r\n * The PassPostProcess id in the pipeline that contains the original scene color\r\n */\r\n public SSAOOriginalSceneColorEffect: string = \"SSAOOriginalSceneColorEffect\";\r\n /**\r\n * @ignore\r\n * The SSAO PostProcess id in the pipeline\r\n */\r\n public SSAORenderEffect: string = \"SSAORenderEffect\";\r\n /**\r\n * @ignore\r\n * The horizontal blur PostProcess id in the pipeline\r\n */\r\n public SSAOBlurHRenderEffect: string = \"SSAOBlurHRenderEffect\";\r\n /**\r\n * @ignore\r\n * The vertical blur PostProcess id in the pipeline\r\n */\r\n public SSAOBlurVRenderEffect: string = \"SSAOBlurVRenderEffect\";\r\n /**\r\n * @ignore\r\n * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)\r\n */\r\n public SSAOCombineRenderEffect: string = \"SSAOCombineRenderEffect\";\r\n\r\n /**\r\n * The output strength of the SSAO post-process. Default value is 1.0.\r\n */\r\n @serialize()\r\n public totalStrength: number = 1.0;\r\n\r\n /**\r\n * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.\r\n */\r\n @serialize()\r\n public maxZ: number = 100.0;\r\n\r\n /**\r\n * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much.\r\n */\r\n @serialize()\r\n public minZAspect: number = 0.2;\r\n\r\n @serialize(\"epsilon\")\r\n private _epsilon: number = 0.02;\r\n /**\r\n * Used in SSAO calculations to compensate for accuracy issues with depth values. Default 0.02.\r\n *\r\n * Normally you do not need to change this value, but you can experiment with it if you get a lot of in false self-occlusion on flat surfaces when using fewer than 16 samples. Useful range is normally [0..0.1] but higher values is allowed.\r\n */\r\n public set epsilon(n: number) {\r\n this._epsilon = n;\r\n this._ssaoPostProcess.updateEffect(this._getDefinesForSSAO());\r\n }\r\n public get epsilon(): number {\r\n return this._epsilon;\r\n }\r\n\r\n @serialize(\"samples\")\r\n private _samples: number = 8;\r\n /**\r\n * Number of samples used for the SSAO calculations. Default value is 8.\r\n */\r\n public set samples(n: number) {\r\n this._samples = n;\r\n this._ssaoPostProcess.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n @serialize(\"textureSamples\")\r\n private _textureSamples: number = 1;\r\n /**\r\n * Number of samples to use for antialiasing.\r\n */\r\n public set textureSamples(n: number) {\r\n this._textureSamples = n;\r\n\r\n if (this._prePassRenderer) {\r\n this._prePassRenderer.samples = n;\r\n } else {\r\n this._originalColorPostProcess.samples = n;\r\n }\r\n }\r\n public get textureSamples(): number {\r\n return this._textureSamples;\r\n }\r\n\r\n /**\r\n * Force rendering the geometry through geometry buffer.\r\n */\r\n @serialize()\r\n private _forceGeometryBuffer: boolean = false;\r\n private get _geometryBufferRenderer(): Nullable<GeometryBufferRenderer> {\r\n if (!this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n return this._scene.geometryBufferRenderer;\r\n }\r\n private get _prePassRenderer(): Nullable<PrePassRenderer> {\r\n if (this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n return this._scene.prePassRenderer;\r\n }\r\n\r\n /**\r\n * Ratio object used for SSAO ratio and blur ratio\r\n */\r\n @serialize()\r\n private _ratio: any;\r\n\r\n /*\r\n * The texture type used by the different post processes created by SSAO\r\n */\r\n @serialize()\r\n private _textureType: number;\r\n\r\n /**\r\n * Dynamically generated sphere sampler.\r\n */\r\n private _sampleSphere: number[];\r\n\r\n /**\r\n * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0\r\n */\r\n @serialize()\r\n public radius: number = 2.0;\r\n\r\n /**\r\n * The base color of the SSAO post-process\r\n * The final result is \"base + ssao\" between [0, 1]\r\n */\r\n @serialize()\r\n public base: number = 0;\r\n\r\n @serialize(\"bypassBlur\")\r\n private _bypassBlur: boolean = false;\r\n /**\r\n * Skips the denoising (blur) stage of the SSAO calculations.\r\n *\r\n * Useful to temporarily set while experimenting with the other SSAO2 settings.\r\n */\r\n public set bypassBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, b);\r\n const samplers = this._getSamplersForBlur(b);\r\n this._blurHPostProcess.updateEffect(defines.h, null, samplers);\r\n this._blurVPostProcess.updateEffect(defines.v, null, samplers);\r\n this._bypassBlur = b;\r\n }\r\n public get bypassBlur(): boolean {\r\n return this._bypassBlur;\r\n }\r\n\r\n @serialize(\"expensiveBlur\")\r\n private _expensiveBlur: boolean = true;\r\n /**\r\n * Enables the configurable bilateral denoising (blurring) filter. Default is true.\r\n * Set to false to instead use a legacy bilateral filter that can't be configured.\r\n *\r\n * The denoising filter runs after the SSAO calculations and is a very important step. Both options results in a so called bilateral being used, but the \"expensive\" one can be\r\n * configured in several ways to fit your scene.\r\n */\r\n public set expensiveBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(b, this._bypassBlur);\r\n this._blurHPostProcess.updateEffect(defines.h);\r\n this._blurVPostProcess.updateEffect(defines.v);\r\n this._expensiveBlur = b;\r\n }\r\n public get expensiveBlur(): boolean {\r\n return this._expensiveBlur;\r\n }\r\n\r\n /**\r\n * The number of samples the bilateral filter uses in both dimensions when denoising the SSAO calculations. Default value is 16.\r\n *\r\n * A higher value should result in smoother shadows but will use more processing time in the shaders.\r\n *\r\n * A high value can cause the shadows to get to blurry or create visible artifacts (bands) near sharp details in the geometry. The artifacts can sometimes be mitigated by increasing the bilateralSoften setting.\r\n */\r\n @serialize()\r\n public bilateralSamples: number = 16;\r\n\r\n /**\r\n * Controls the shape of the denoising kernel used by the bilateral filter. Default value is 0.\r\n *\r\n * By default the bilateral filter acts like a box-filter, treating all samples on the same depth with equal weights. This is effective to maximize the denoising effect given a limited set of samples. However, it also often results in visible ghosting around sharp shadow regions and can spread out lines over large areas so they are no longer visible.\r\n *\r\n * Increasing this setting will make the filter pay less attention to samples further away from the center sample, reducing many artifacts but at the same time increasing noise.\r\n *\r\n * Useful value range is [0..1].\r\n */\r\n @serialize()\r\n public bilateralSoften: number = 0;\r\n\r\n /**\r\n * How forgiving the bilateral denoiser should be when rejecting samples. Default value is 0.\r\n *\r\n * A higher value results in the bilateral filter being more forgiving and thus doing a better job at denoising slanted and curved surfaces, but can lead to shadows spreading out around corners or between objects that are close to each other depth wise.\r\n *\r\n * Useful value range is normally [0..1], but higher values are allowed.\r\n */\r\n @serialize()\r\n public bilateralTolerance: number = 0;\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.supportSSAO2;\r\n }\r\n\r\n private _scene: Scene;\r\n private _randomTexture: Texture;\r\n private _originalColorPostProcess: PassPostProcess;\r\n private _ssaoPostProcess: PostProcess;\r\n private _blurHPostProcess: PostProcess;\r\n private _blurVPostProcess: PostProcess;\r\n private _ssaoCombinePostProcess: PostProcess;\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * @constructor\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param ratio The size of the postprocesses. Can be a number shared between passes or an object for more precision: { ssaoRatio: 0.5, blurRatio: 1.0 }\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to\r\n * @param forceGeometryBuffer Set to true if you want to use the legacy geometry buffer renderer\r\n * @param textureType The texture type used by the different post processes created by SSAO (default: Constants.TEXTURETYPE_UNSIGNED_INT)\r\n */\r\n constructor(name: string, scene: Scene, ratio: any, cameras?: Camera[], forceGeometryBuffer = false, textureType = Constants.TEXTURETYPE_UNSIGNED_INT) {\r\n super(scene.getEngine(), name);\r\n\r\n this._scene = scene;\r\n this._ratio = ratio;\r\n this._textureType = textureType;\r\n this._forceGeometryBuffer = forceGeometryBuffer;\r\n\r\n if (!this.isSupported) {\r\n Logger.Error(\"The current engine does not support SSAO 2.\");\r\n return;\r\n }\r\n\r\n const ssaoRatio = this._ratio.ssaoRatio || ratio;\r\n const blurRatio = this._ratio.blurRatio || ratio;\r\n\r\n // Set up assets\r\n if (this._forceGeometryBuffer) {\r\n scene.enableGeometryBufferRenderer();\r\n if (scene.geometryBufferRenderer?.generateNormalsInWorldSpace) {\r\n Logger.Error(\"SSAO2RenderingPipeline does not support generateNormalsInWorldSpace=true for the geometry buffer renderer!\");\r\n }\r\n } else {\r\n scene.enablePrePassRenderer();\r\n if (scene.prePassRenderer?.generateNormalsInWorldSpace) {\r\n Logger.Error(\"SSAO2RenderingPipeline does not support generateNormalsInWorldSpace=true for the prepass renderer!\");\r\n }\r\n }\r\n\r\n this._createRandomTexture();\r\n\r\n this._originalColorPostProcess = new PassPostProcess(\"SSAOOriginalSceneColor\", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), undefined, this._textureType);\r\n this._originalColorPostProcess.samples = this.textureSamples;\r\n this._createSSAOPostProcess(1.0, textureType);\r\n this._createBlurPostProcess(ssaoRatio, blurRatio, this._textureType);\r\n this._createSSAOCombinePostProcess(blurRatio, this._textureType);\r\n\r\n // Set up pipeline\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOOriginalSceneColorEffect,\r\n () => {\r\n return this._originalColorPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAORenderEffect,\r\n () => {\r\n return this._ssaoPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOBlurHRenderEffect,\r\n () => {\r\n return this._blurHPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOBlurVRenderEffect,\r\n () => {\r\n return this._blurVPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOCombineRenderEffect,\r\n () => {\r\n return this._ssaoCombinePostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n // Finish\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n if (cameras) {\r\n scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(name, cameras);\r\n }\r\n }\r\n\r\n // Public Methods\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"SSAO2RenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"SSAO2RenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n * @param disableGeometryBufferRenderer Set to true if you want to disable the Geometry Buffer renderer\r\n */\r\n public override dispose(disableGeometryBufferRenderer: boolean = false): void {\r\n for (let i = 0; i < this._scene.cameras.length; i++) {\r\n const camera = this._scene.cameras[i];\r\n\r\n this._originalColorPostProcess.dispose(camera);\r\n this._ssaoPostProcess.dispose(camera);\r\n this._blurHPostProcess.dispose(camera);\r\n this._blurVPostProcess.dispose(camera);\r\n this._ssaoCombinePostProcess.dispose(camera);\r\n }\r\n\r\n this._randomTexture.dispose();\r\n\r\n if (disableGeometryBufferRenderer) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._scene.cameras);\r\n\r\n super.dispose();\r\n }\r\n\r\n // Private Methods\r\n\r\n /** @internal */\r\n public override _rebuild() {\r\n super._rebuild();\r\n }\r\n\r\n private _getSamplersForBlur(disabled: boolean): Array<string> {\r\n return disabled ? [\"textureSampler\"] : [\"textureSampler\", \"depthSampler\"];\r\n }\r\n\r\n private _getDefinesForBlur(bilateral: boolean, disabled: boolean): { h: string; v: string } {\r\n let define = \"#define BLUR\\n\";\r\n if (disabled) {\r\n define += \"#define BLUR_BYPASS\\n\";\r\n }\r\n if (!bilateral) {\r\n define += \"#define BLUR_LEGACY\\n\";\r\n }\r\n return { h: define + \"#define BLUR_H\\n\", v: define };\r\n }\r\n\r\n private _createBlurPostProcess(ssaoRatio: number, blurRatio: number, textureType: number): void {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);\r\n const samplers = this._getSamplersForBlur(this.bypassBlur);\r\n\r\n this._blurHPostProcess = this._createBlurFilter(\"BlurH\", samplers, ssaoRatio, defines.h, textureType, true);\r\n this._blurVPostProcess = this._createBlurFilter(\"BlurV\", samplers, blurRatio, defines.v, textureType, false);\r\n }\r\n\r\n private _createBlurFilter(name: string, samplers: Array<string>, ratio: number, defines: string, textureType: number, horizontal: boolean): PostProcess {\r\n const blurFilter = new PostProcess(\r\n name,\r\n \"ssao2\",\r\n [\"outSize\", \"samples\", \"soften\", \"tolerance\"],\r\n samplers,\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n defines,\r\n textureType\r\n );\r\n\r\n blurFilter.onApply = (effect: Effect) => {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const ssaoCombineSize = horizontal ? this._ssaoCombinePostProcess.width : this._ssaoCombinePostProcess.height;\r\n const originalColorSize = horizontal ? this._originalColorPostProcess.width : this._originalColorPostProcess.height;\r\n\r\n effect.setFloat(\"outSize\", ssaoCombineSize > 0 ? ssaoCombineSize : originalColorSize);\r\n effect.setInt(\"samples\", this.bilateralSamples);\r\n effect.setFloat(\"soften\", this.bilateralSoften);\r\n effect.setFloat(\"tolerance\", this.bilateralTolerance);\r\n if (this._geometryBufferRenderer) {\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[0]);\r\n } else if (this._prePassRenderer) {\r\n effect.setTexture(\"depthSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n };\r\n\r\n blurFilter.samples = this.textureSamples;\r\n return blurFilter;\r\n }\r\n\r\n private _bits = new Uint32Array(1);\r\n\r\n //Van der Corput radical inverse\r\n private _radicalInverse_VdC(i: number) {\r\n this._bits[0] = i;\r\n this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;\r\n this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);\r\n return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296\r\n }\r\n\r\n private _hammersley(i: number, n: number) {\r\n return [i / n, this._radicalInverse_VdC(i)];\r\n }\r\n\r\n private _hemisphereSample_uniform(u: number, v: number): Vector3 {\r\n const phi = v * 2.0 * Math.PI;\r\n // rejecting samples that are close to tangent plane to avoid z-fighting artifacts\r\n const cosTheta = 1.0 - u * 0.85;\r\n const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);\r\n return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);\r\n }\r\n\r\n private _generateHemisphere(): number[] {\r\n const numSamples = this.samples;\r\n const result = [];\r\n let vector;\r\n\r\n let i = 0;\r\n while (i < numSamples) {\r\n if (numSamples < 16) {\r\n vector = this._hemisphereSample_uniform(Math.random(), Math.random());\r\n } else {\r\n const rand = this._hammersley(i, numSamples);\r\n vector = this._hemisphereSample_uniform(rand[0], rand[1]);\r\n }\r\n\r\n result.push(vector.x, vector.y, vector.z);\r\n i++;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getDefinesForSSAO() {\r\n const defines = `#define SSAO\\n#define SAMPLES ${this.samples}\\n#define EPSILON ${this.epsilon.toFixed(4)}`;\r\n\r\n return defines;\r\n }\r\n\r\n private static readonly ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n\r\n private static readonly PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];\r\n\r\n private _createSSAOPostProcess(ratio: number, textureType: number): void {\r\n this._sampleSphere = this._generateHemisphere();\r\n\r\n const defines = this._getDefinesForSSAO();\r\n const samplers = [\"randomSampler\", \"depthSampler\", \"normalSampler\"];\r\n\r\n this._ssaoPostProcess = new PostProcess(\r\n \"ssao2\",\r\n \"ssao2\",\r\n [\r\n \"sampleSphere\",\r\n \"samplesFactor\",\r\n \"randTextureTiles\",\r\n \"totalStrength\",\r\n \"radius\",\r\n \"base\",\r\n \"range\",\r\n \"projection\",\r\n \"near\",\r\n \"texelSize\",\r\n \"xViewport\",\r\n \"yViewport\",\r\n \"maxZ\",\r\n \"minZAspect\",\r\n \"depthProjection\",\r\n ],\r\n samplers,\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n defines,\r\n textureType\r\n );\r\n\r\n this._ssaoPostProcess.onApply = (effect: Effect) => {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n effect.setArray3(\"sampleSphere\", this._sampleSphere);\r\n effect.setFloat(\"randTextureTiles\", 32.0);\r\n effect.setFloat(\"samplesFactor\", 1 / this.samples);\r\n effect.setFloat(\"totalStrength\", this.totalStrength);\r\n effect.setFloat2(\"texelSize\", 1 / this._ssaoPostProcess.width, 1 / this._ssaoPostProcess.height);\r\n effect.setFloat(\"radius\", this.radius);\r\n effect.setFloat(\"maxZ\", this.maxZ);\r\n effect.setFloat(\"minZAspect\", this.minZAspect);\r\n effect.setFloat(\"base\", this.base);\r\n effect.setFloat(\"near\", this._scene.activeCamera.minZ);\r\n if (this._scene.activeCamera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n effect.setMatrix3x3(\"depthProjection\", SSAO2RenderingPipeline.PERSPECTIVE_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", Math.tan(this._scene.activeCamera.fov / 2) * this._scene.getEngine().getAspectRatio(this._scene.activeCamera, true));\r\n effect.setFloat(\"yViewport\", Math.tan(this._scene.activeCamera.fov / 2));\r\n } else {\r\n const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;\r\n const orthoLeft = this._scene.activeCamera.orthoLeft ?? -halfWidth;\r\n const orthoRight = this._scene.activeCamera.orthoRight ?? halfWidth;\r\n const orthoBottom = this._scene.activeCamera.orthoBottom ?? -halfHeight;\r\n const orthoTop = this._scene.activeCamera.orthoTop ?? halfHeight;\r\n effect.setMatrix3x3(\"depthProjection\", SSAO2RenderingPipeline.ORTHO_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", (orthoRight - orthoLeft) * 0.5);\r\n effect.setFloat(\"yViewport\", (orthoTop - orthoBottom) * 0.5);\r\n }\r\n effect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n\r\n if (this._geometryBufferRenderer) {\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[0]);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[1]);\r\n } else if (this._prePassRenderer) {\r\n effect.setTexture(\"depthSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\"normalSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)]);\r\n }\r\n effect.setTexture(\"randomSampler\", this._randomTexture);\r\n };\r\n this._ssaoPostProcess.samples = this.textureSamples;\r\n\r\n if (!this._forceGeometryBuffer) {\r\n this._ssaoPostProcess._prePassEffectConfiguration = new SSAO2Configuration();\r\n }\r\n }\r\n\r\n private _createSSAOCombinePostProcess(ratio: number, textureType: number): void {\r\n this._ssaoCombinePostProcess = new PostProcess(\r\n \"ssaoCombine\",\r\n \"ssaoCombine\",\r\n [],\r\n [\"originalColor\", \"viewport\"],\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n undefined,\r\n textureType\r\n );\r\n\r\n this._ssaoCombinePostProcess.onApply = (effect: Effect) => {\r\n const viewport = this._scene.activeCamera!.viewport;\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));\r\n effect.setTextureFromPostProcessOutput(\"originalColor\", this._originalColorPostProcess);\r\n };\r\n this._ssaoCombinePostProcess.samples = this.textureSamples;\r\n }\r\n\r\n private _createRandomTexture(): void {\r\n const size = 128;\r\n\r\n const data = new Uint8Array(size * size * 4);\r\n const randVector = Vector2.Zero();\r\n for (let index = 0; index < data.length; ) {\r\n randVector.set(Scalar.RandomRange(0, 1), Scalar.RandomRange(0, 1)).normalize().scaleInPlace(255);\r\n data[index++] = Math.floor(randVector.x);\r\n data[index++] = Math.floor(randVector.y);\r\n data[index++] = 0;\r\n data[index++] = 255;\r\n }\r\n\r\n const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n texture.name = \"SSAORandomTexture\";\r\n texture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n texture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n this._randomTexture = texture;\r\n }\r\n\r\n /**\r\n * Serialize the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"SSAO2RenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): SSAO2RenderingPipeline {\r\n return SerializationHelper.Parse(\r\n () => new SSAO2RenderingPipeline(source._name, scene, source._ratio, undefined, source._forceGeometryBuffer, source._textureType),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SSAO2RenderingPipeline\", SSAO2RenderingPipeline);\r\n"]}
|
|
1
|
+
{"version":3,"file":"ssao2RenderingPipeline.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { serialize } from \"../../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../../Misc/decorators.serialization\";\r\nimport { Vector3, TmpVectors, Vector2 } from \"../../../Maths/math.vector\";\r\nimport { Camera } from \"../../../Cameras/camera\";\r\nimport type { Effect } from \"../../../Materials/effect\";\r\nimport { Texture } from \"../../../Materials/Textures/texture\";\r\nimport { PostProcess } from \"../../../PostProcesses/postProcess\";\r\nimport { PostProcessRenderPipeline } from \"../../../PostProcesses/RenderPipeline/postProcessRenderPipeline\";\r\nimport { PostProcessRenderEffect } from \"../../../PostProcesses/RenderPipeline/postProcessRenderEffect\";\r\nimport { PassPostProcess } from \"../../../PostProcesses/passPostProcess\";\r\nimport type { Scene } from \"../../../scene\";\r\nimport { RegisterClass } from \"../../../Misc/typeStore\";\r\nimport { EngineStore } from \"../../../Engines/engineStore\";\r\nimport { SSAO2Configuration } from \"../../../Rendering/ssao2Configuration\";\r\nimport type { PrePassRenderer } from \"../../../Rendering/prePassRenderer\";\r\nimport type { GeometryBufferRenderer } from \"../../../Rendering/geometryBufferRenderer\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { Scalar } from \"../../../Maths/math.scalar\";\r\nimport { RawTexture } from \"../../../Materials/Textures/rawTexture\";\r\n\r\nimport \"../../../PostProcesses/RenderPipeline/postProcessRenderPipelineManagerSceneComponent\";\r\n\r\nimport \"../../../Shaders/ssao2.fragment\";\r\nimport \"../../../Shaders/ssaoCombine.fragment\";\r\n\r\n/**\r\n * Render pipeline to produce ssao effect\r\n */\r\nexport class SSAO2RenderingPipeline extends PostProcessRenderPipeline {\r\n // Members\r\n\r\n /**\r\n * @ignore\r\n * The PassPostProcess id in the pipeline that contains the original scene color\r\n */\r\n public SSAOOriginalSceneColorEffect: string = \"SSAOOriginalSceneColorEffect\";\r\n /**\r\n * @ignore\r\n * The SSAO PostProcess id in the pipeline\r\n */\r\n public SSAORenderEffect: string = \"SSAORenderEffect\";\r\n /**\r\n * @ignore\r\n * The horizontal blur PostProcess id in the pipeline\r\n */\r\n public SSAOBlurHRenderEffect: string = \"SSAOBlurHRenderEffect\";\r\n /**\r\n * @ignore\r\n * The vertical blur PostProcess id in the pipeline\r\n */\r\n public SSAOBlurVRenderEffect: string = \"SSAOBlurVRenderEffect\";\r\n /**\r\n * @ignore\r\n * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)\r\n */\r\n public SSAOCombineRenderEffect: string = \"SSAOCombineRenderEffect\";\r\n\r\n /**\r\n * The output strength of the SSAO post-process. Default value is 1.0.\r\n */\r\n @serialize()\r\n public totalStrength: number = 1.0;\r\n\r\n /**\r\n * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.\r\n */\r\n @serialize()\r\n public maxZ: number = 100.0;\r\n\r\n /**\r\n * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much.\r\n */\r\n @serialize()\r\n public minZAspect: number = 0.2;\r\n\r\n @serialize(\"epsilon\")\r\n private _epsilon: number = 0.02;\r\n /**\r\n * Used in SSAO calculations to compensate for accuracy issues with depth values. Default 0.02.\r\n *\r\n * Normally you do not need to change this value, but you can experiment with it if you get a lot of in false self-occlusion on flat surfaces when using fewer than 16 samples. Useful range is normally [0..0.1] but higher values is allowed.\r\n */\r\n public set epsilon(n: number) {\r\n this._epsilon = n;\r\n this._ssaoPostProcess.updateEffect(this._getDefinesForSSAO());\r\n }\r\n public get epsilon(): number {\r\n return this._epsilon;\r\n }\r\n\r\n @serialize(\"samples\")\r\n private _samples: number = 8;\r\n /**\r\n * Number of samples used for the SSAO calculations. Default value is 8.\r\n */\r\n public set samples(n: number) {\r\n this._samples = n;\r\n this._ssaoPostProcess.updateEffect(this._getDefinesForSSAO());\r\n this._sampleSphere = this._generateHemisphere();\r\n }\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n @serialize(\"textureSamples\")\r\n private _textureSamples: number = 1;\r\n /**\r\n * Number of samples to use for antialiasing.\r\n */\r\n public set textureSamples(n: number) {\r\n this._textureSamples = n;\r\n\r\n if (this._prePassRenderer) {\r\n this._prePassRenderer.samples = n;\r\n } else {\r\n this._originalColorPostProcess.samples = n;\r\n }\r\n }\r\n public get textureSamples(): number {\r\n return this._textureSamples;\r\n }\r\n\r\n /**\r\n * Force rendering the geometry through geometry buffer.\r\n */\r\n @serialize()\r\n private _forceGeometryBuffer: boolean = false;\r\n private get _geometryBufferRenderer(): Nullable<GeometryBufferRenderer> {\r\n if (!this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n return this._scene.geometryBufferRenderer;\r\n }\r\n private get _prePassRenderer(): Nullable<PrePassRenderer> {\r\n if (this._forceGeometryBuffer) {\r\n return null;\r\n }\r\n return this._scene.prePassRenderer;\r\n }\r\n\r\n /**\r\n * Ratio object used for SSAO ratio and blur ratio\r\n */\r\n @serialize()\r\n private _ratio: any;\r\n\r\n /*\r\n * The texture type used by the different post processes created by SSAO\r\n */\r\n @serialize()\r\n private _textureType: number;\r\n\r\n /**\r\n * Dynamically generated sphere sampler.\r\n */\r\n private _sampleSphere: number[];\r\n\r\n /**\r\n * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0\r\n */\r\n @serialize()\r\n public radius: number = 2.0;\r\n\r\n /**\r\n * The base color of the SSAO post-process\r\n * The final result is \"base + ssao\" between [0, 1]\r\n */\r\n @serialize()\r\n public base: number = 0;\r\n\r\n @serialize(\"bypassBlur\")\r\n private _bypassBlur: boolean = false;\r\n /**\r\n * Skips the denoising (blur) stage of the SSAO calculations.\r\n *\r\n * Useful to temporarily set while experimenting with the other SSAO2 settings.\r\n */\r\n public set bypassBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, b);\r\n const samplers = this._getSamplersForBlur(b);\r\n this._blurHPostProcess.updateEffect(defines.h, null, samplers);\r\n this._blurVPostProcess.updateEffect(defines.v, null, samplers);\r\n this._bypassBlur = b;\r\n }\r\n public get bypassBlur(): boolean {\r\n return this._bypassBlur;\r\n }\r\n\r\n @serialize(\"expensiveBlur\")\r\n private _expensiveBlur: boolean = true;\r\n /**\r\n * Enables the configurable bilateral denoising (blurring) filter. Default is true.\r\n * Set to false to instead use a legacy bilateral filter that can't be configured.\r\n *\r\n * The denoising filter runs after the SSAO calculations and is a very important step. Both options results in a so called bilateral being used, but the \"expensive\" one can be\r\n * configured in several ways to fit your scene.\r\n */\r\n public set expensiveBlur(b: boolean) {\r\n const defines = this._getDefinesForBlur(b, this._bypassBlur);\r\n this._blurHPostProcess.updateEffect(defines.h);\r\n this._blurVPostProcess.updateEffect(defines.v);\r\n this._expensiveBlur = b;\r\n }\r\n public get expensiveBlur(): boolean {\r\n return this._expensiveBlur;\r\n }\r\n\r\n /**\r\n * The number of samples the bilateral filter uses in both dimensions when denoising the SSAO calculations. Default value is 16.\r\n *\r\n * A higher value should result in smoother shadows but will use more processing time in the shaders.\r\n *\r\n * A high value can cause the shadows to get to blurry or create visible artifacts (bands) near sharp details in the geometry. The artifacts can sometimes be mitigated by increasing the bilateralSoften setting.\r\n */\r\n @serialize()\r\n public bilateralSamples: number = 16;\r\n\r\n /**\r\n * Controls the shape of the denoising kernel used by the bilateral filter. Default value is 0.\r\n *\r\n * By default the bilateral filter acts like a box-filter, treating all samples on the same depth with equal weights. This is effective to maximize the denoising effect given a limited set of samples. However, it also often results in visible ghosting around sharp shadow regions and can spread out lines over large areas so they are no longer visible.\r\n *\r\n * Increasing this setting will make the filter pay less attention to samples further away from the center sample, reducing many artifacts but at the same time increasing noise.\r\n *\r\n * Useful value range is [0..1].\r\n */\r\n @serialize()\r\n public bilateralSoften: number = 0;\r\n\r\n /**\r\n * How forgiving the bilateral denoiser should be when rejecting samples. Default value is 0.\r\n *\r\n * A higher value results in the bilateral filter being more forgiving and thus doing a better job at denoising slanted and curved surfaces, but can lead to shadows spreading out around corners or between objects that are close to each other depth wise.\r\n *\r\n * Useful value range is normally [0..1], but higher values are allowed.\r\n */\r\n @serialize()\r\n public bilateralTolerance: number = 0;\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.supportSSAO2;\r\n }\r\n\r\n private _scene: Scene;\r\n private _randomTexture: Texture;\r\n private _originalColorPostProcess: PassPostProcess;\r\n private _ssaoPostProcess: PostProcess;\r\n private _blurHPostProcess: PostProcess;\r\n private _blurVPostProcess: PostProcess;\r\n private _ssaoCombinePostProcess: PostProcess;\r\n\r\n /**\r\n * Gets active scene\r\n */\r\n public get scene(): Scene {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * @constructor\r\n * @param name The rendering pipeline name\r\n * @param scene The scene linked to this pipeline\r\n * @param ratio The size of the postprocesses. Can be a number shared between passes or an object for more precision: { ssaoRatio: 0.5, blurRatio: 1.0 }\r\n * @param cameras The array of cameras that the rendering pipeline will be attached to\r\n * @param forceGeometryBuffer Set to true if you want to use the legacy geometry buffer renderer\r\n * @param textureType The texture type used by the different post processes created by SSAO (default: Constants.TEXTURETYPE_UNSIGNED_INT)\r\n */\r\n constructor(name: string, scene: Scene, ratio: any, cameras?: Camera[], forceGeometryBuffer = false, textureType = Constants.TEXTURETYPE_UNSIGNED_INT) {\r\n super(scene.getEngine(), name);\r\n\r\n this._scene = scene;\r\n this._ratio = ratio;\r\n this._textureType = textureType;\r\n this._forceGeometryBuffer = forceGeometryBuffer;\r\n\r\n if (!this.isSupported) {\r\n Logger.Error(\"The current engine does not support SSAO 2.\");\r\n return;\r\n }\r\n\r\n const ssaoRatio = this._ratio.ssaoRatio || ratio;\r\n const blurRatio = this._ratio.blurRatio || ratio;\r\n\r\n // Set up assets\r\n if (this._forceGeometryBuffer) {\r\n scene.enableGeometryBufferRenderer();\r\n if (scene.geometryBufferRenderer?.generateNormalsInWorldSpace) {\r\n Logger.Error(\"SSAO2RenderingPipeline does not support generateNormalsInWorldSpace=true for the geometry buffer renderer!\");\r\n }\r\n } else {\r\n scene.enablePrePassRenderer();\r\n if (scene.prePassRenderer?.generateNormalsInWorldSpace) {\r\n Logger.Error(\"SSAO2RenderingPipeline does not support generateNormalsInWorldSpace=true for the prepass renderer!\");\r\n }\r\n }\r\n\r\n this._createRandomTexture();\r\n\r\n this._originalColorPostProcess = new PassPostProcess(\"SSAOOriginalSceneColor\", 1.0, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), undefined, this._textureType);\r\n this._originalColorPostProcess.samples = this.textureSamples;\r\n this._createSSAOPostProcess(1.0, textureType);\r\n this._createBlurPostProcess(ssaoRatio, blurRatio, this._textureType);\r\n this._createSSAOCombinePostProcess(blurRatio, this._textureType);\r\n\r\n // Set up pipeline\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOOriginalSceneColorEffect,\r\n () => {\r\n return this._originalColorPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAORenderEffect,\r\n () => {\r\n return this._ssaoPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOBlurHRenderEffect,\r\n () => {\r\n return this._blurHPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOBlurVRenderEffect,\r\n () => {\r\n return this._blurVPostProcess;\r\n },\r\n true\r\n )\r\n );\r\n this.addEffect(\r\n new PostProcessRenderEffect(\r\n scene.getEngine(),\r\n this.SSAOCombineRenderEffect,\r\n () => {\r\n return this._ssaoCombinePostProcess;\r\n },\r\n true\r\n )\r\n );\r\n\r\n // Finish\r\n scene.postProcessRenderPipelineManager.addPipeline(this);\r\n if (cameras) {\r\n scene.postProcessRenderPipelineManager.attachCamerasToRenderPipeline(name, cameras);\r\n }\r\n }\r\n\r\n // Public Methods\r\n\r\n /**\r\n * Get the class name\r\n * @returns \"SSAO2RenderingPipeline\"\r\n */\r\n public override getClassName(): string {\r\n return \"SSAO2RenderingPipeline\";\r\n }\r\n\r\n /**\r\n * Removes the internal pipeline assets and detaches the pipeline from the scene cameras\r\n * @param disableGeometryBufferRenderer Set to true if you want to disable the Geometry Buffer renderer\r\n */\r\n public override dispose(disableGeometryBufferRenderer: boolean = false): void {\r\n for (let i = 0; i < this._scene.cameras.length; i++) {\r\n const camera = this._scene.cameras[i];\r\n\r\n this._originalColorPostProcess.dispose(camera);\r\n this._ssaoPostProcess.dispose(camera);\r\n this._blurHPostProcess.dispose(camera);\r\n this._blurVPostProcess.dispose(camera);\r\n this._ssaoCombinePostProcess.dispose(camera);\r\n }\r\n\r\n this._randomTexture.dispose();\r\n\r\n if (disableGeometryBufferRenderer) {\r\n this._scene.disableGeometryBufferRenderer();\r\n }\r\n\r\n this._scene.postProcessRenderPipelineManager.detachCamerasFromRenderPipeline(this._name, this._scene.cameras);\r\n\r\n super.dispose();\r\n }\r\n\r\n // Private Methods\r\n\r\n /** @internal */\r\n public override _rebuild() {\r\n super._rebuild();\r\n }\r\n\r\n private _getSamplersForBlur(disabled: boolean): Array<string> {\r\n return disabled ? [\"textureSampler\"] : [\"textureSampler\", \"depthSampler\"];\r\n }\r\n\r\n private _getDefinesForBlur(bilateral: boolean, disabled: boolean): { h: string; v: string } {\r\n let define = \"#define BLUR\\n\";\r\n if (disabled) {\r\n define += \"#define BLUR_BYPASS\\n\";\r\n }\r\n if (!bilateral) {\r\n define += \"#define BLUR_LEGACY\\n\";\r\n }\r\n return { h: define + \"#define BLUR_H\\n\", v: define };\r\n }\r\n\r\n private _createBlurPostProcess(ssaoRatio: number, blurRatio: number, textureType: number): void {\r\n const defines = this._getDefinesForBlur(this.expensiveBlur, this.bypassBlur);\r\n const samplers = this._getSamplersForBlur(this.bypassBlur);\r\n\r\n this._blurHPostProcess = this._createBlurFilter(\"BlurH\", samplers, ssaoRatio, defines.h, textureType, true);\r\n this._blurVPostProcess = this._createBlurFilter(\"BlurV\", samplers, blurRatio, defines.v, textureType, false);\r\n }\r\n\r\n private _createBlurFilter(name: string, samplers: Array<string>, ratio: number, defines: string, textureType: number, horizontal: boolean): PostProcess {\r\n const blurFilter = new PostProcess(\r\n name,\r\n \"ssao2\",\r\n [\"outSize\", \"samples\", \"soften\", \"tolerance\"],\r\n samplers,\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n defines,\r\n textureType\r\n );\r\n\r\n blurFilter.onApply = (effect: Effect) => {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n const ssaoCombineSize = horizontal ? this._ssaoCombinePostProcess.width : this._ssaoCombinePostProcess.height;\r\n const originalColorSize = horizontal ? this._originalColorPostProcess.width : this._originalColorPostProcess.height;\r\n\r\n effect.setFloat(\"outSize\", ssaoCombineSize > 0 ? ssaoCombineSize : originalColorSize);\r\n effect.setInt(\"samples\", this.bilateralSamples);\r\n effect.setFloat(\"soften\", this.bilateralSoften);\r\n effect.setFloat(\"tolerance\", this.bilateralTolerance);\r\n if (this._geometryBufferRenderer) {\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[0]);\r\n } else if (this._prePassRenderer) {\r\n effect.setTexture(\"depthSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n }\r\n };\r\n\r\n blurFilter.samples = this.textureSamples;\r\n blurFilter.autoClear = false;\r\n return blurFilter;\r\n }\r\n\r\n private _bits = new Uint32Array(1);\r\n\r\n //Van der Corput radical inverse\r\n private _radicalInverse_VdC(i: number) {\r\n this._bits[0] = i;\r\n this._bits[0] = ((this._bits[0] << 16) | (this._bits[0] >> 16)) >>> 0;\r\n this._bits[0] = ((this._bits[0] & 0x55555555) << 1) | (((this._bits[0] & 0xaaaaaaaa) >>> 1) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x33333333) << 2) | (((this._bits[0] & 0xcccccccc) >>> 2) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x0f0f0f0f) << 4) | (((this._bits[0] & 0xf0f0f0f0) >>> 4) >>> 0);\r\n this._bits[0] = ((this._bits[0] & 0x00ff00ff) << 8) | (((this._bits[0] & 0xff00ff00) >>> 8) >>> 0);\r\n return this._bits[0] * 2.3283064365386963e-10; // / 0x100000000 or / 4294967296\r\n }\r\n\r\n private _hammersley(i: number, n: number) {\r\n return [i / n, this._radicalInverse_VdC(i)];\r\n }\r\n\r\n private _hemisphereSample_uniform(u: number, v: number): Vector3 {\r\n const phi = v * 2.0 * Math.PI;\r\n // rejecting samples that are close to tangent plane to avoid z-fighting artifacts\r\n const cosTheta = 1.0 - u * 0.85;\r\n const sinTheta = Math.sqrt(1.0 - cosTheta * cosTheta);\r\n return new Vector3(Math.cos(phi) * sinTheta, Math.sin(phi) * sinTheta, cosTheta);\r\n }\r\n\r\n private _generateHemisphere(): number[] {\r\n const numSamples = this.samples;\r\n const result = [];\r\n let vector;\r\n\r\n let i = 0;\r\n while (i < numSamples) {\r\n if (numSamples < 16) {\r\n vector = this._hemisphereSample_uniform(Math.random(), Math.random());\r\n } else {\r\n const rand = this._hammersley(i, numSamples);\r\n vector = this._hemisphereSample_uniform(rand[0], rand[1]);\r\n }\r\n\r\n result.push(vector.x, vector.y, vector.z);\r\n i++;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private _getDefinesForSSAO() {\r\n const defines = `#define SSAO\\n#define SAMPLES ${this.samples}\\n#define EPSILON ${this.epsilon.toFixed(4)}`;\r\n\r\n return defines;\r\n }\r\n\r\n private static readonly ORTHO_DEPTH_PROJECTION = [1, 0, 0, 0, 1, 0, 0, 0, 1];\r\n\r\n private static readonly PERSPECTIVE_DEPTH_PROJECTION = [0, 0, 0, 0, 0, 0, 1, 1, 1];\r\n\r\n private _createSSAOPostProcess(ratio: number, textureType: number): void {\r\n this._sampleSphere = this._generateHemisphere();\r\n\r\n const defines = this._getDefinesForSSAO();\r\n const samplers = [\"randomSampler\", \"depthSampler\", \"normalSampler\"];\r\n\r\n this._ssaoPostProcess = new PostProcess(\r\n \"ssao2\",\r\n \"ssao2\",\r\n [\r\n \"sampleSphere\",\r\n \"samplesFactor\",\r\n \"randTextureTiles\",\r\n \"totalStrength\",\r\n \"radius\",\r\n \"base\",\r\n \"range\",\r\n \"projection\",\r\n \"near\",\r\n \"texelSize\",\r\n \"xViewport\",\r\n \"yViewport\",\r\n \"maxZ\",\r\n \"minZAspect\",\r\n \"depthProjection\",\r\n ],\r\n samplers,\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n defines,\r\n textureType\r\n );\r\n this._ssaoPostProcess.autoClear = false;\r\n\r\n this._ssaoPostProcess.onApply = (effect: Effect) => {\r\n if (!this._scene.activeCamera) {\r\n return;\r\n }\r\n\r\n effect.setArray3(\"sampleSphere\", this._sampleSphere);\r\n effect.setFloat(\"randTextureTiles\", 32.0);\r\n effect.setFloat(\"samplesFactor\", 1 / this.samples);\r\n effect.setFloat(\"totalStrength\", this.totalStrength);\r\n effect.setFloat2(\"texelSize\", 1 / this._ssaoPostProcess.width, 1 / this._ssaoPostProcess.height);\r\n effect.setFloat(\"radius\", this.radius);\r\n effect.setFloat(\"maxZ\", this.maxZ);\r\n effect.setFloat(\"minZAspect\", this.minZAspect);\r\n effect.setFloat(\"base\", this.base);\r\n effect.setFloat(\"near\", this._scene.activeCamera.minZ);\r\n if (this._scene.activeCamera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n effect.setMatrix3x3(\"depthProjection\", SSAO2RenderingPipeline.PERSPECTIVE_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", Math.tan(this._scene.activeCamera.fov / 2) * this._scene.getEngine().getAspectRatio(this._scene.activeCamera, true));\r\n effect.setFloat(\"yViewport\", Math.tan(this._scene.activeCamera.fov / 2));\r\n } else {\r\n const halfWidth = this._scene.getEngine().getRenderWidth() / 2.0;\r\n const halfHeight = this._scene.getEngine().getRenderHeight() / 2.0;\r\n const orthoLeft = this._scene.activeCamera.orthoLeft ?? -halfWidth;\r\n const orthoRight = this._scene.activeCamera.orthoRight ?? halfWidth;\r\n const orthoBottom = this._scene.activeCamera.orthoBottom ?? -halfHeight;\r\n const orthoTop = this._scene.activeCamera.orthoTop ?? halfHeight;\r\n effect.setMatrix3x3(\"depthProjection\", SSAO2RenderingPipeline.ORTHO_DEPTH_PROJECTION);\r\n effect.setFloat(\"xViewport\", (orthoRight - orthoLeft) * 0.5);\r\n effect.setFloat(\"yViewport\", (orthoTop - orthoBottom) * 0.5);\r\n }\r\n effect.setMatrix(\"projection\", this._scene.getProjectionMatrix());\r\n\r\n if (this._geometryBufferRenderer) {\r\n effect.setTexture(\"depthSampler\", this._geometryBufferRenderer.getGBuffer().textures[0]);\r\n effect.setTexture(\"normalSampler\", this._geometryBufferRenderer.getGBuffer().textures[1]);\r\n } else if (this._prePassRenderer) {\r\n effect.setTexture(\"depthSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE)]);\r\n effect.setTexture(\"normalSampler\", this._prePassRenderer.getRenderTarget().textures[this._prePassRenderer.getIndex(Constants.PREPASS_NORMAL_TEXTURE_TYPE)]);\r\n }\r\n effect.setTexture(\"randomSampler\", this._randomTexture);\r\n };\r\n this._ssaoPostProcess.samples = this.textureSamples;\r\n\r\n if (!this._forceGeometryBuffer) {\r\n this._ssaoPostProcess._prePassEffectConfiguration = new SSAO2Configuration();\r\n }\r\n }\r\n\r\n private _createSSAOCombinePostProcess(ratio: number, textureType: number): void {\r\n this._ssaoCombinePostProcess = new PostProcess(\r\n \"ssaoCombine\",\r\n \"ssaoCombine\",\r\n [],\r\n [\"originalColor\", \"viewport\"],\r\n ratio,\r\n null,\r\n Texture.BILINEAR_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n undefined,\r\n textureType\r\n );\r\n\r\n this._ssaoCombinePostProcess.onApply = (effect: Effect) => {\r\n const viewport = this._scene.activeCamera!.viewport;\r\n effect.setVector4(\"viewport\", TmpVectors.Vector4[0].copyFromFloats(viewport.x, viewport.y, viewport.width, viewport.height));\r\n effect.setTextureFromPostProcessOutput(\"originalColor\", this._originalColorPostProcess);\r\n };\r\n this._ssaoCombinePostProcess.autoClear = false;\r\n this._ssaoCombinePostProcess.samples = this.textureSamples;\r\n }\r\n\r\n private _createRandomTexture(): void {\r\n const size = 128;\r\n\r\n const data = new Uint8Array(size * size * 4);\r\n const randVector = Vector2.Zero();\r\n for (let index = 0; index < data.length; ) {\r\n randVector.set(Scalar.RandomRange(0, 1), Scalar.RandomRange(0, 1)).normalize().scaleInPlace(255);\r\n data[index++] = Math.floor(randVector.x);\r\n data[index++] = Math.floor(randVector.y);\r\n data[index++] = 0;\r\n data[index++] = 255;\r\n }\r\n\r\n const texture = RawTexture.CreateRGBATexture(data, size, size, this._scene, false, false, Constants.TEXTURE_BILINEAR_SAMPLINGMODE);\r\n texture.name = \"SSAORandomTexture\";\r\n texture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n texture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n this._randomTexture = texture;\r\n }\r\n\r\n /**\r\n * Serialize the rendering pipeline (Used when exporting)\r\n * @returns the serialized object\r\n */\r\n public serialize(): any {\r\n const serializationObject = SerializationHelper.Serialize(this);\r\n serializationObject.customType = \"SSAO2RenderingPipeline\";\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Parse the serialized pipeline\r\n * @param source Source pipeline.\r\n * @param scene The scene to load the pipeline to.\r\n * @param rootUrl The URL of the serialized pipeline.\r\n * @returns An instantiated pipeline from the serialized object.\r\n */\r\n public static Parse(source: any, scene: Scene, rootUrl: string): SSAO2RenderingPipeline {\r\n return SerializationHelper.Parse(\r\n () => new SSAO2RenderingPipeline(source._name, scene, source._ratio, undefined, source._forceGeometryBuffer, source._textureType),\r\n source,\r\n scene,\r\n rootUrl\r\n );\r\n }\r\n}\r\n\r\nRegisterClass(\"BABYLON.SSAO2RenderingPipeline\", SSAO2RenderingPipeline);\r\n"]}
|
|
@@ -197,6 +197,13 @@ export declare class FluidRenderingTargetRenderer {
|
|
|
197
197
|
*/
|
|
198
198
|
get samples(): number;
|
|
199
199
|
set samples(samples: number);
|
|
200
|
+
private _compositeMode;
|
|
201
|
+
/**
|
|
202
|
+
* If compositeMode is true (default: false), when the alpha value of the background (the scene rendered without the fluid objects) is 0, the final alpha value of the pixel will be set to the thickness value.
|
|
203
|
+
* This way, it is possible to composite the fluid rendering on top of the HTML background.
|
|
204
|
+
*/
|
|
205
|
+
get compositeMode(): boolean;
|
|
206
|
+
set compositeMode(value: boolean);
|
|
200
207
|
/**
|
|
201
208
|
* Gets the camera used for the rendering
|
|
202
209
|
*/
|
|
@@ -296,6 +296,20 @@ export class FluidRenderingTargetRenderer {
|
|
|
296
296
|
this._samples = samples;
|
|
297
297
|
this._needInitialization = true;
|
|
298
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* If compositeMode is true (default: false), when the alpha value of the background (the scene rendered without the fluid objects) is 0, the final alpha value of the pixel will be set to the thickness value.
|
|
301
|
+
* This way, it is possible to composite the fluid rendering on top of the HTML background.
|
|
302
|
+
*/
|
|
303
|
+
get compositeMode() {
|
|
304
|
+
return this._compositeMode;
|
|
305
|
+
}
|
|
306
|
+
set compositeMode(value) {
|
|
307
|
+
if (this._compositeMode === value) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
this._compositeMode = value;
|
|
311
|
+
this._needInitialization = true;
|
|
312
|
+
}
|
|
299
313
|
/**
|
|
300
314
|
* Gets the camera used for the rendering
|
|
301
315
|
*/
|
|
@@ -357,6 +371,7 @@ export class FluidRenderingTargetRenderer {
|
|
|
357
371
|
this._thicknessMapSize = null;
|
|
358
372
|
this._diffuseMapSize = null;
|
|
359
373
|
this._samples = 1;
|
|
374
|
+
this._compositeMode = false;
|
|
360
375
|
this._scene = scene;
|
|
361
376
|
this._engine = scene.getEngine();
|
|
362
377
|
this._camera = camera ?? scene.activeCamera;
|
|
@@ -480,6 +495,9 @@ export class FluidRenderingTargetRenderer {
|
|
|
480
495
|
uniformNames.push("minimumThickness");
|
|
481
496
|
samplerNames.push("thicknessSampler");
|
|
482
497
|
}
|
|
498
|
+
if (this._compositeMode) {
|
|
499
|
+
defines.push("#define FLUIDRENDERING_COMPOSITE_MODE");
|
|
500
|
+
}
|
|
483
501
|
if (this._debug) {
|
|
484
502
|
defines.push("#define FLUIDRENDERING_DEBUG");
|
|
485
503
|
if (this._debugFeature === FluidRenderingDebug.Normals) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingTargetRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingTextures } from \"./fluidRenderingTextures\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\n\r\n/**\r\n * Textures that can be displayed as a debugging tool\r\n */\r\nexport enum FluidRenderingDebug {\r\n DepthTexture,\r\n DepthBlurredTexture,\r\n ThicknessTexture,\r\n ThicknessBlurredTexture,\r\n DiffuseTexture,\r\n Normals,\r\n DiffuseRendering,\r\n}\r\n\r\n/**\r\n * Class used to render an object as a fluid thanks to different render target textures (depth, thickness, diffuse)\r\n */\r\nexport class FluidRenderingTargetRenderer {\r\n protected _scene: Scene;\r\n protected _camera: Nullable<Camera>;\r\n protected _engine: AbstractEngine;\r\n\r\n protected _invProjectionMatrix: Matrix;\r\n protected _depthClearColor: Color4;\r\n protected _thicknessClearColor: Color4;\r\n\r\n protected _needInitialization: boolean;\r\n\r\n /**\r\n * Returns true if the class needs to be reinitialized (because of changes in parameterization)\r\n */\r\n public get needInitialization() {\r\n return this._needInitialization;\r\n }\r\n\r\n private _generateDiffuseTexture = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated and used for the rendering\r\n */\r\n public get generateDiffuseTexture() {\r\n return this._generateDiffuseTexture;\r\n }\r\n\r\n public set generateDiffuseTexture(generate: boolean) {\r\n if (this._generateDiffuseTexture === generate) {\r\n return;\r\n }\r\n\r\n this._generateDiffuseTexture = generate;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Fluid color. Not used if generateDiffuseTexture is true\r\n */\r\n public fluidColor = new Color3(0.085, 0.6375, 0.765);\r\n\r\n /**\r\n * Density of the fluid (positive number). The higher the value, the more opaque the fluid.\r\n */\r\n public density = 2;\r\n\r\n /**\r\n * Strength of the refraction (positive number, but generally between 0 and 0.3).\r\n */\r\n public refractionStrength = 0.1;\r\n\r\n /**\r\n * Strength of the fresnel effect (value between 0 and 1). Lower the value if you want to soften the specular effect\r\n */\r\n public fresnelClamp = 1.0;\r\n\r\n /**\r\n * Strength of the specular power (positive number). Increase the value to make the specular effect more concentrated\r\n */\r\n public specularPower = 250;\r\n\r\n /**\r\n * Minimum thickness of the particles (positive number). If useFixedThickness is true, minimumThickness is the thickness used\r\n */\r\n public minimumThickness = 0;\r\n\r\n /**\r\n * Direction of the light. The fluid is assumed to be lit by a directional light\r\n */\r\n public dirLight: Vector3 = new Vector3(-2, -1, 1).normalize();\r\n\r\n private _debugFeature: FluidRenderingDebug = FluidRenderingDebug.DepthBlurredTexture;\r\n\r\n /**\r\n * Gets or sets the feature (texture) to be debugged. Not used if debug is false\r\n */\r\n public get debugFeature() {\r\n return this._debugFeature;\r\n }\r\n\r\n public set debugFeature(feature: FluidRenderingDebug) {\r\n if (this._debugFeature === feature) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._debugFeature = feature;\r\n }\r\n\r\n private _debug = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if we should display a specific texture (given by debugFeature) for debugging purpose\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(debug: boolean) {\r\n if (this._debug === debug) {\r\n return;\r\n }\r\n\r\n this._debug = debug;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _environmentMap?: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Gets or sets the environment map used for the reflection part of the shading\r\n * If null, no map will be used. If undefined, the scene.environmentMap will be used (if defined)\r\n */\r\n public get environmentMap() {\r\n return this._environmentMap;\r\n }\r\n\r\n public set environmentMap(map: Nullable<BaseTexture> | undefined) {\r\n if (this._environmentMap === map) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._environmentMap = map;\r\n }\r\n\r\n private _enableBlurDepth = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the depth texture should be blurred\r\n */\r\n public get enableBlurDepth() {\r\n return this._enableBlurDepth;\r\n }\r\n\r\n public set enableBlurDepth(enable: boolean) {\r\n if (this._enableBlurDepth === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurDepth = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the depth size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the depth\r\n * For eg. if blurDepthSizeDivisor=2, the texture used to blur the depth will be half the size of the depth texture\r\n */\r\n public get blurDepthSizeDivisor() {\r\n return this._blurDepthSizeDivisor;\r\n }\r\n\r\n public set blurDepthSizeDivisor(scale: number) {\r\n if (this._blurDepthSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthFilterSize = 7;\r\n\r\n /**\r\n * Size of the kernel used to filter the depth blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthFilterSize() {\r\n return this._blurDepthFilterSize;\r\n }\r\n\r\n public set blurDepthFilterSize(filterSize: number) {\r\n if (this._blurDepthFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthNumIterations = 3;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the depth blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthNumIterations() {\r\n return this._blurDepthNumIterations;\r\n }\r\n\r\n public set blurDepthNumIterations(numIterations: number) {\r\n if (this._blurDepthNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurDepthNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthMaxFilterSize = 100;\r\n\r\n /**\r\n * Maximum size of the kernel used to blur the depth texture (positive number, generally between 1 and 200 - higher values will require more processing power from the GPU when the particles are larger on screen)\r\n */\r\n public get blurDepthMaxFilterSize() {\r\n return this._blurDepthMaxFilterSize;\r\n }\r\n\r\n public set blurDepthMaxFilterSize(maxFilterSize: number) {\r\n if (this._blurDepthMaxFilterSize === maxFilterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthMaxFilterSize = maxFilterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthDepthScale = 10;\r\n\r\n /**\r\n * Depth weight in the calculation when applying the bilateral blur to generate the depth blur texture (positive number, generally between 0 and 100)\r\n */\r\n public get blurDepthDepthScale() {\r\n return this._blurDepthDepthScale;\r\n }\r\n\r\n public set blurDepthDepthScale(scale: number) {\r\n if (this._blurDepthDepthScale === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthDepthScale = scale;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _enableBlurThickness = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the thickness texture should be blurred\r\n */\r\n public get enableBlurThickness() {\r\n return this._enableBlurThickness;\r\n }\r\n\r\n public set enableBlurThickness(enable: boolean) {\r\n if (this._enableBlurThickness === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurThickness = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the thickness size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the thickness\r\n * For eg. if blurThicknessSizeDivisor=2, the texture used to blur the thickness will be half the size of the thickness texture\r\n */\r\n public get blurThicknessSizeDivisor() {\r\n return this._blurThicknessSizeDivisor;\r\n }\r\n\r\n public set blurThicknessSizeDivisor(scale: number) {\r\n if (this._blurThicknessSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurThicknessSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessFilterSize = 5;\r\n\r\n /**\r\n * Size of the kernel used to filter the thickness blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessFilterSize() {\r\n return this._blurThicknessFilterSize;\r\n }\r\n\r\n public set blurThicknessFilterSize(filterSize: number) {\r\n if (this._blurThicknessFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurThicknessFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurThicknessNumIterations = 1;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the thickness blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessNumIterations() {\r\n return this._blurThicknessNumIterations;\r\n }\r\n\r\n public set blurThicknessNumIterations(numIterations: number) {\r\n if (this._blurThicknessNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurThicknessNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _useFixedThickness = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that a fixed thickness should be used instead of generating a thickness texture\r\n */\r\n public get useFixedThickness() {\r\n return this._useFixedThickness;\r\n }\r\n\r\n public set useFixedThickness(use: boolean) {\r\n if (this._useFixedThickness === use) {\r\n return;\r\n }\r\n\r\n this._useFixedThickness = use;\r\n this._needInitialization = true;\r\n }\r\n\r\n /** @internal */\r\n public _bgDepthTexture: Nullable<InternalTexture>;\r\n\r\n /** @internal */\r\n public _onUseVelocityChanged = new Observable<FluidRenderingTargetRenderer>();\r\n\r\n private _useVelocity = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the velocity should be used when rendering the particles as a fluid.\r\n * Note: the vertex buffers must contain a \"velocity\" buffer for this to work!\r\n */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._needInitialization = true;\r\n this._onUseVelocityChanged.notifyObservers(this);\r\n }\r\n\r\n private _depthMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the depth texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get depthMapSize() {\r\n return this._depthMapSize;\r\n }\r\n\r\n public set depthMapSize(size: Nullable<number>) {\r\n if (this._depthMapSize === size) {\r\n return;\r\n }\r\n\r\n this._depthMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _thicknessMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the thickness texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get thicknessMapSize() {\r\n return this._thicknessMapSize;\r\n }\r\n\r\n public set thicknessMapSize(size: Nullable<number>) {\r\n if (this._thicknessMapSize === size) {\r\n return;\r\n }\r\n\r\n this._thicknessMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _diffuseMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the diffuse texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get diffuseMapSize() {\r\n return this._diffuseMapSize;\r\n }\r\n\r\n public set diffuseMapSize(size: Nullable<number>) {\r\n if (this._diffuseMapSize === size) {\r\n return;\r\n }\r\n\r\n this._diffuseMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _samples = 1;\r\n\r\n /**\r\n * Gets or sets the number of samples used by MSAA\r\n * Note: changing this value in WebGL does not work because depth/stencil textures can't be created with MSAA (see https://github.com/BabylonJS/Babylon.js/issues/12444)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Gets the camera used for the rendering\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n /** @internal */\r\n public _renderPostProcess: Nullable<PostProcess>;\r\n\r\n /** @internal */\r\n public _depthRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _diffuseRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _thicknessRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /**\r\n * Creates an instance of the class\r\n * @param scene Scene used to render the fluid object into\r\n * @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead\r\n */\r\n constructor(scene: Scene, camera?: Camera) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._camera = camera ?? scene.activeCamera;\r\n this._needInitialization = true;\r\n this._bgDepthTexture = null;\r\n\r\n this._invProjectionMatrix = new Matrix();\r\n this._depthClearColor = new Color4(1e6, 1e6, 1e6, 1);\r\n this._thicknessClearColor = new Color4(0, 0, 0, 1);\r\n\r\n this._depthRenderTarget = null;\r\n this._diffuseRenderTarget = null;\r\n this._thicknessRenderTarget = null;\r\n\r\n this._renderPostProcess = null;\r\n }\r\n\r\n /** @internal */\r\n public _initialize(): void {\r\n this.dispose();\r\n\r\n this._needInitialization = false;\r\n\r\n const depthWidth = this._depthMapSize ?? this._engine.getRenderWidth();\r\n const depthHeight =\r\n this._depthMapSize !== null ? Math.round((this._depthMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth()) : this._engine.getRenderHeight();\r\n\r\n this._depthRenderTarget = new FluidRenderingTextures(\r\n \"Depth\",\r\n this._scene,\r\n depthWidth,\r\n depthHeight,\r\n depthWidth,\r\n depthHeight,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n false,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._depthRenderTarget);\r\n\r\n if (this.generateDiffuseTexture) {\r\n const diffuseWidth = this._diffuseMapSize ?? this._engine.getRenderWidth();\r\n const diffuseHeight =\r\n this._diffuseMapSize !== null\r\n ? Math.round((this._diffuseMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n this._diffuseRenderTarget = new FluidRenderingTextures(\r\n \"Diffuse\",\r\n this._scene,\r\n diffuseWidth,\r\n diffuseHeight,\r\n 0,\r\n 0,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n true,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._diffuseRenderTarget);\r\n }\r\n\r\n const thicknessWidth = this._thicknessMapSize ?? this._engine.getRenderWidth();\r\n const thicknessHeight =\r\n this._thicknessMapSize !== null\r\n ? Math.round((this._thicknessMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n if (!this._useFixedThickness) {\r\n this._thicknessRenderTarget = new FluidRenderingTextures(\r\n \"Thickness\",\r\n this._scene,\r\n thicknessWidth,\r\n thicknessHeight,\r\n thicknessWidth,\r\n thicknessHeight,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n true,\r\n this._camera,\r\n false,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._thicknessRenderTarget);\r\n }\r\n\r\n this._createLiquidRenderingPostProcess();\r\n }\r\n\r\n protected _setBlurParameters(renderTarget: Nullable<FluidRenderingTextures> = null): void {\r\n if (renderTarget === null || renderTarget === this._depthRenderTarget) {\r\n this._setBlurDepthParameters();\r\n }\r\n if (renderTarget === null || renderTarget === this._thicknessRenderTarget) {\r\n this._setBlurThicknessParameters();\r\n }\r\n }\r\n\r\n protected _setBlurDepthParameters(): void {\r\n if (!this._depthRenderTarget) {\r\n return;\r\n }\r\n this._depthRenderTarget.blurFilterSize = this.blurDepthFilterSize;\r\n this._depthRenderTarget.blurMaxFilterSize = this.blurDepthMaxFilterSize;\r\n this._depthRenderTarget.blurNumIterations = this.blurDepthNumIterations;\r\n this._depthRenderTarget.blurDepthScale = this.blurDepthDepthScale;\r\n }\r\n\r\n protected _setBlurThicknessParameters(): void {\r\n if (!this._thicknessRenderTarget) {\r\n return;\r\n }\r\n this._thicknessRenderTarget.blurFilterSize = this.blurThicknessFilterSize;\r\n this._thicknessRenderTarget.blurNumIterations = this.blurThicknessNumIterations;\r\n }\r\n\r\n protected _initializeRenderTarget(renderTarget: FluidRenderingTextures): void {\r\n if (renderTarget !== this._diffuseRenderTarget) {\r\n renderTarget.enableBlur = renderTarget === this._depthRenderTarget ? this.enableBlurDepth : this.enableBlurThickness;\r\n renderTarget.blurSizeDivisor = renderTarget === this._depthRenderTarget ? this.blurDepthSizeDivisor : this.blurThicknessSizeDivisor;\r\n }\r\n\r\n this._setBlurParameters(renderTarget);\r\n\r\n renderTarget.initialize();\r\n }\r\n\r\n protected _createLiquidRenderingPostProcess(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n const uniformNames = [\r\n \"viewMatrix\",\r\n \"projectionMatrix\",\r\n \"invProjectionMatrix\",\r\n \"texelSize\",\r\n \"dirLight\",\r\n \"cameraFar\",\r\n \"density\",\r\n \"refractionStrength\",\r\n \"fresnelClamp\",\r\n \"specularPower\",\r\n ];\r\n const samplerNames = [\"depthSampler\"];\r\n const defines = [];\r\n\r\n this.dispose(true);\r\n\r\n if (!this._camera) {\r\n return;\r\n }\r\n\r\n const texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur! : this._depthRenderTarget!.texture!;\r\n const texelSize = new Vector2(1 / texture.getSize().width, 1 / texture.getSize().height);\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n samplerNames.push(\"reflectionSampler\");\r\n defines.push(\"#define FLUIDRENDERING_ENVIRONMENT\");\r\n }\r\n }\r\n\r\n if (this._diffuseRenderTarget) {\r\n samplerNames.push(\"diffuseSampler\");\r\n defines.push(\"#define FLUIDRENDERING_DIFFUSETEXTURE\");\r\n } else {\r\n uniformNames.push(\"diffuseColor\");\r\n }\r\n\r\n if (this._useVelocity) {\r\n samplerNames.push(\"velocitySampler\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._useFixedThickness) {\r\n uniformNames.push(\"thickness\");\r\n samplerNames.push(\"bgDepthSampler\");\r\n defines.push(\"#define FLUIDRENDERING_FIXED_THICKNESS\");\r\n } else {\r\n uniformNames.push(\"minimumThickness\");\r\n samplerNames.push(\"thicknessSampler\");\r\n }\r\n\r\n if (this._debug) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG\");\r\n if (this._debugFeature === FluidRenderingDebug.Normals) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_SHOWNORMAL\");\r\n } else if (this._debugFeature === FluidRenderingDebug.DiffuseRendering) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DIFFUSERENDERING\");\r\n } else {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_TEXTURE\");\r\n samplerNames.push(\"debugSampler\");\r\n if (this._debugFeature === FluidRenderingDebug.DepthTexture || this._debugFeature === FluidRenderingDebug.DepthBlurredTexture) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DEPTH\");\r\n }\r\n }\r\n }\r\n\r\n this._renderPostProcess = new PostProcess(\r\n \"FluidRendering\",\r\n \"fluidRenderingRender\",\r\n uniformNames,\r\n samplerNames,\r\n 1,\r\n null,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n null,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n undefined,\r\n undefined,\r\n true,\r\n undefined\r\n );\r\n this._renderPostProcess.updateEffect(defines.join(\"\\n\"));\r\n\r\n this._renderPostProcess.samples = this._samples;\r\n const engineWebGPU = engine as WebGPUEngine;\r\n const setTextureSampler = engineWebGPU.setTextureSampler;\r\n this._renderPostProcess.onApplyObservable.add((effect) => {\r\n this._invProjectionMatrix.copyFrom(this._scene.getProjectionMatrix());\r\n this._invProjectionMatrix.invert();\r\n\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"textureSamplerSampler\", this._renderPostProcess!.inputTexture.texture);\r\n }\r\n\r\n if (!this._depthRenderTarget!.enableBlur) {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n if (this._diffuseRenderTarget) {\r\n if (!this._diffuseRenderTarget.enableBlur) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n } else {\r\n effect.setColor3(\"diffuseColor\", this.fluidColor);\r\n }\r\n if (this._useFixedThickness) {\r\n effect.setFloat(\"thickness\", this.minimumThickness);\r\n effect._bindTexture(\"bgDepthSampler\", this._bgDepthTexture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"bgDepthSamplerSampler\", this._bgDepthTexture ?? null);\r\n }\r\n } else {\r\n if (!this._thicknessRenderTarget!.enableBlur) {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n effect.setFloat(\"minimumThickness\", this.minimumThickness);\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n effect.setTexture(\"reflectionSampler\", envMap);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"reflectionSamplerSampler\", envMap?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n\r\n effect.setMatrix(\"viewMatrix\", this._scene.getViewMatrix());\r\n effect.setMatrix(\"invProjectionMatrix\", this._invProjectionMatrix);\r\n effect.setMatrix(\"projectionMatrix\", this._scene.getProjectionMatrix());\r\n effect.setVector2(\"texelSize\", texelSize);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setFloat(\"refractionStrength\", this.refractionStrength);\r\n effect.setFloat(\"fresnelClamp\", this.fresnelClamp);\r\n effect.setFloat(\"specularPower\", this.specularPower);\r\n\r\n effect.setVector3(\"dirLight\", this.dirLight);\r\n\r\n effect.setFloat(\"cameraFar\", this._camera!.maxZ);\r\n\r\n if (this._debug) {\r\n let texture: Nullable<ThinTexture> = null;\r\n switch (this._debugFeature) {\r\n case FluidRenderingDebug.DepthTexture:\r\n texture = this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.DepthBlurredTexture:\r\n texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur : this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.ThicknessTexture:\r\n texture = this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.ThicknessBlurredTexture:\r\n texture = this._thicknessRenderTarget?.enableBlur ? this._thicknessRenderTarget?.textureBlur ?? null : this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.DiffuseTexture:\r\n if (this._diffuseRenderTarget) {\r\n texture = this._diffuseRenderTarget.texture;\r\n }\r\n break;\r\n }\r\n if (this._debugFeature !== FluidRenderingDebug.Normals) {\r\n effect.setTexture(\"debugSampler\", texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"debugSamplerSampler\", texture?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _clearTargets(): void {\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n this._engine.clear(this._depthClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n this._engine.clear(this._thicknessClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n // we don't clear the depth buffer because it is the depth buffer that is coming from the scene and that we reuse in the thickness rendering pass\r\n this._engine.clear(this._thicknessClearColor, true, false, false);\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(fluidObject: FluidRenderingObject): void {\r\n if (this._needInitialization || !fluidObject.isReady()) {\r\n return;\r\n }\r\n\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._engine.setState(false, undefined, undefined, undefined, true);\r\n this._engine.setDepthBuffer(true);\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n // Render the particles in the depth texture\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDepthTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the diffuse texture\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDiffuseTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the thickness texture\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n\r\n fluidObject.renderThicknessTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n\r\n // Run the blur post processes\r\n this._depthRenderTarget?.applyBlurPostProcesses();\r\n this._diffuseRenderTarget?.applyBlurPostProcesses();\r\n this._thicknessRenderTarget?.applyBlurPostProcesses();\r\n\r\n if (currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Releases all the ressources used by the class\r\n * @param onlyPostProcesses If true, releases only the ressources used by the render post processes\r\n */\r\n public dispose(onlyPostProcesses = false): void {\r\n if (!onlyPostProcesses) {\r\n this._depthRenderTarget?.dispose();\r\n this._depthRenderTarget = null;\r\n\r\n this._diffuseRenderTarget?.dispose();\r\n this._diffuseRenderTarget = null;\r\n\r\n this._thicknessRenderTarget?.dispose();\r\n this._thicknessRenderTarget = null;\r\n }\r\n\r\n if (this._renderPostProcess && this._camera) {\r\n this._camera.detachPostProcess(this._renderPostProcess);\r\n }\r\n this._renderPostProcess?.dispose();\r\n this._renderPostProcess = null;\r\n\r\n this._needInitialization = false;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fluidRenderingTargetRenderer.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera } from \"core/Cameras/camera\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport type { AbstractEngine } from \"core/Engines/abstractEngine\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { Matrix, Vector2, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { Nullable } from \"core/types\";\r\n\r\nimport type { FluidRenderingObject } from \"./fluidRenderingObject\";\r\nimport { FluidRenderingTextures } from \"./fluidRenderingTextures\";\r\nimport type { WebGPUEngine } from \"core/Engines/webgpuEngine\";\r\n\r\n/**\r\n * Textures that can be displayed as a debugging tool\r\n */\r\nexport enum FluidRenderingDebug {\r\n DepthTexture,\r\n DepthBlurredTexture,\r\n ThicknessTexture,\r\n ThicknessBlurredTexture,\r\n DiffuseTexture,\r\n Normals,\r\n DiffuseRendering,\r\n}\r\n\r\n/**\r\n * Class used to render an object as a fluid thanks to different render target textures (depth, thickness, diffuse)\r\n */\r\nexport class FluidRenderingTargetRenderer {\r\n protected _scene: Scene;\r\n protected _camera: Nullable<Camera>;\r\n protected _engine: AbstractEngine;\r\n\r\n protected _invProjectionMatrix: Matrix;\r\n protected _depthClearColor: Color4;\r\n protected _thicknessClearColor: Color4;\r\n\r\n protected _needInitialization: boolean;\r\n\r\n /**\r\n * Returns true if the class needs to be reinitialized (because of changes in parameterization)\r\n */\r\n public get needInitialization() {\r\n return this._needInitialization;\r\n }\r\n\r\n private _generateDiffuseTexture = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the diffuse texture should be generated and used for the rendering\r\n */\r\n public get generateDiffuseTexture() {\r\n return this._generateDiffuseTexture;\r\n }\r\n\r\n public set generateDiffuseTexture(generate: boolean) {\r\n if (this._generateDiffuseTexture === generate) {\r\n return;\r\n }\r\n\r\n this._generateDiffuseTexture = generate;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Fluid color. Not used if generateDiffuseTexture is true\r\n */\r\n public fluidColor = new Color3(0.085, 0.6375, 0.765);\r\n\r\n /**\r\n * Density of the fluid (positive number). The higher the value, the more opaque the fluid.\r\n */\r\n public density = 2;\r\n\r\n /**\r\n * Strength of the refraction (positive number, but generally between 0 and 0.3).\r\n */\r\n public refractionStrength = 0.1;\r\n\r\n /**\r\n * Strength of the fresnel effect (value between 0 and 1). Lower the value if you want to soften the specular effect\r\n */\r\n public fresnelClamp = 1.0;\r\n\r\n /**\r\n * Strength of the specular power (positive number). Increase the value to make the specular effect more concentrated\r\n */\r\n public specularPower = 250;\r\n\r\n /**\r\n * Minimum thickness of the particles (positive number). If useFixedThickness is true, minimumThickness is the thickness used\r\n */\r\n public minimumThickness = 0;\r\n\r\n /**\r\n * Direction of the light. The fluid is assumed to be lit by a directional light\r\n */\r\n public dirLight: Vector3 = new Vector3(-2, -1, 1).normalize();\r\n\r\n private _debugFeature: FluidRenderingDebug = FluidRenderingDebug.DepthBlurredTexture;\r\n\r\n /**\r\n * Gets or sets the feature (texture) to be debugged. Not used if debug is false\r\n */\r\n public get debugFeature() {\r\n return this._debugFeature;\r\n }\r\n\r\n public set debugFeature(feature: FluidRenderingDebug) {\r\n if (this._debugFeature === feature) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._debugFeature = feature;\r\n }\r\n\r\n private _debug = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if we should display a specific texture (given by debugFeature) for debugging purpose\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(debug: boolean) {\r\n if (this._debug === debug) {\r\n return;\r\n }\r\n\r\n this._debug = debug;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _environmentMap?: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Gets or sets the environment map used for the reflection part of the shading\r\n * If null, no map will be used. If undefined, the scene.environmentMap will be used (if defined)\r\n */\r\n public get environmentMap() {\r\n return this._environmentMap;\r\n }\r\n\r\n public set environmentMap(map: Nullable<BaseTexture> | undefined) {\r\n if (this._environmentMap === map) {\r\n return;\r\n }\r\n\r\n this._needInitialization = true;\r\n this._environmentMap = map;\r\n }\r\n\r\n private _enableBlurDepth = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the depth texture should be blurred\r\n */\r\n public get enableBlurDepth() {\r\n return this._enableBlurDepth;\r\n }\r\n\r\n public set enableBlurDepth(enable: boolean) {\r\n if (this._enableBlurDepth === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurDepth = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the depth size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the depth\r\n * For eg. if blurDepthSizeDivisor=2, the texture used to blur the depth will be half the size of the depth texture\r\n */\r\n public get blurDepthSizeDivisor() {\r\n return this._blurDepthSizeDivisor;\r\n }\r\n\r\n public set blurDepthSizeDivisor(scale: number) {\r\n if (this._blurDepthSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurDepthFilterSize = 7;\r\n\r\n /**\r\n * Size of the kernel used to filter the depth blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthFilterSize() {\r\n return this._blurDepthFilterSize;\r\n }\r\n\r\n public set blurDepthFilterSize(filterSize: number) {\r\n if (this._blurDepthFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthNumIterations = 3;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the depth blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurDepthNumIterations() {\r\n return this._blurDepthNumIterations;\r\n }\r\n\r\n public set blurDepthNumIterations(numIterations: number) {\r\n if (this._blurDepthNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurDepthNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthMaxFilterSize = 100;\r\n\r\n /**\r\n * Maximum size of the kernel used to blur the depth texture (positive number, generally between 1 and 200 - higher values will require more processing power from the GPU when the particles are larger on screen)\r\n */\r\n public get blurDepthMaxFilterSize() {\r\n return this._blurDepthMaxFilterSize;\r\n }\r\n\r\n public set blurDepthMaxFilterSize(maxFilterSize: number) {\r\n if (this._blurDepthMaxFilterSize === maxFilterSize) {\r\n return;\r\n }\r\n\r\n this._blurDepthMaxFilterSize = maxFilterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurDepthDepthScale = 10;\r\n\r\n /**\r\n * Depth weight in the calculation when applying the bilateral blur to generate the depth blur texture (positive number, generally between 0 and 100)\r\n */\r\n public get blurDepthDepthScale() {\r\n return this._blurDepthDepthScale;\r\n }\r\n\r\n public set blurDepthDepthScale(scale: number) {\r\n if (this._blurDepthDepthScale === scale) {\r\n return;\r\n }\r\n\r\n this._blurDepthDepthScale = scale;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _enableBlurThickness = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the thickness texture should be blurred\r\n */\r\n public get enableBlurThickness() {\r\n return this._enableBlurThickness;\r\n }\r\n\r\n public set enableBlurThickness(enable: boolean) {\r\n if (this._enableBlurThickness === enable) {\r\n return;\r\n }\r\n\r\n this._enableBlurThickness = enable;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessSizeDivisor = 1;\r\n\r\n /**\r\n * Gets or sets the thickness size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the thickness\r\n * For eg. if blurThicknessSizeDivisor=2, the texture used to blur the thickness will be half the size of the thickness texture\r\n */\r\n public get blurThicknessSizeDivisor() {\r\n return this._blurThicknessSizeDivisor;\r\n }\r\n\r\n public set blurThicknessSizeDivisor(scale: number) {\r\n if (this._blurThicknessSizeDivisor === scale) {\r\n return;\r\n }\r\n\r\n this._blurThicknessSizeDivisor = scale;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _blurThicknessFilterSize = 5;\r\n\r\n /**\r\n * Size of the kernel used to filter the thickness blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessFilterSize() {\r\n return this._blurThicknessFilterSize;\r\n }\r\n\r\n public set blurThicknessFilterSize(filterSize: number) {\r\n if (this._blurThicknessFilterSize === filterSize) {\r\n return;\r\n }\r\n\r\n this._blurThicknessFilterSize = filterSize;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _blurThicknessNumIterations = 1;\r\n\r\n /**\r\n * Number of blurring iterations used to generate the thickness blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)\r\n */\r\n public get blurThicknessNumIterations() {\r\n return this._blurThicknessNumIterations;\r\n }\r\n\r\n public set blurThicknessNumIterations(numIterations: number) {\r\n if (this._blurThicknessNumIterations === numIterations) {\r\n return;\r\n }\r\n\r\n this._blurThicknessNumIterations = numIterations;\r\n this._setBlurParameters();\r\n }\r\n\r\n private _useFixedThickness = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that a fixed thickness should be used instead of generating a thickness texture\r\n */\r\n public get useFixedThickness() {\r\n return this._useFixedThickness;\r\n }\r\n\r\n public set useFixedThickness(use: boolean) {\r\n if (this._useFixedThickness === use) {\r\n return;\r\n }\r\n\r\n this._useFixedThickness = use;\r\n this._needInitialization = true;\r\n }\r\n\r\n /** @internal */\r\n public _bgDepthTexture: Nullable<InternalTexture>;\r\n\r\n /** @internal */\r\n public _onUseVelocityChanged = new Observable<FluidRenderingTargetRenderer>();\r\n\r\n private _useVelocity = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that the velocity should be used when rendering the particles as a fluid.\r\n * Note: the vertex buffers must contain a \"velocity\" buffer for this to work!\r\n */\r\n public get useVelocity() {\r\n return this._useVelocity;\r\n }\r\n\r\n public set useVelocity(use: boolean) {\r\n if (this._useVelocity === use) {\r\n return;\r\n }\r\n\r\n this._useVelocity = use;\r\n this._needInitialization = true;\r\n this._onUseVelocityChanged.notifyObservers(this);\r\n }\r\n\r\n private _depthMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the depth texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get depthMapSize() {\r\n return this._depthMapSize;\r\n }\r\n\r\n public set depthMapSize(size: Nullable<number>) {\r\n if (this._depthMapSize === size) {\r\n return;\r\n }\r\n\r\n this._depthMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _thicknessMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the thickness texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get thicknessMapSize() {\r\n return this._thicknessMapSize;\r\n }\r\n\r\n public set thicknessMapSize(size: Nullable<number>) {\r\n if (this._thicknessMapSize === size) {\r\n return;\r\n }\r\n\r\n this._thicknessMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _diffuseMapSize: Nullable<number> = null;\r\n\r\n /**\r\n * Defines the size of the diffuse texture.\r\n * If null, the texture will have the size of the screen\r\n */\r\n public get diffuseMapSize() {\r\n return this._diffuseMapSize;\r\n }\r\n\r\n public set diffuseMapSize(size: Nullable<number>) {\r\n if (this._diffuseMapSize === size) {\r\n return;\r\n }\r\n\r\n this._diffuseMapSize = size;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _samples = 1;\r\n\r\n /**\r\n * Gets or sets the number of samples used by MSAA\r\n * Note: changing this value in WebGL does not work because depth/stencil textures can't be created with MSAA (see https://github.com/BabylonJS/Babylon.js/issues/12444)\r\n */\r\n public get samples() {\r\n return this._samples;\r\n }\r\n\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._needInitialization = true;\r\n }\r\n\r\n private _compositeMode = false;\r\n\r\n /**\r\n * If compositeMode is true (default: false), when the alpha value of the background (the scene rendered without the fluid objects) is 0, the final alpha value of the pixel will be set to the thickness value.\r\n * This way, it is possible to composite the fluid rendering on top of the HTML background.\r\n */\r\n public get compositeMode() {\r\n return this._compositeMode;\r\n }\r\n\r\n public set compositeMode(value: boolean) {\r\n if (this._compositeMode === value) {\r\n return;\r\n }\r\n\r\n this._compositeMode = value;\r\n this._needInitialization = true;\r\n }\r\n\r\n /**\r\n * Gets the camera used for the rendering\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n /** @internal */\r\n public _renderPostProcess: Nullable<PostProcess>;\r\n\r\n /** @internal */\r\n public _depthRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _diffuseRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /** @internal */\r\n public _thicknessRenderTarget: Nullable<FluidRenderingTextures>;\r\n\r\n /**\r\n * Creates an instance of the class\r\n * @param scene Scene used to render the fluid object into\r\n * @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead\r\n */\r\n constructor(scene: Scene, camera?: Camera) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._camera = camera ?? scene.activeCamera;\r\n this._needInitialization = true;\r\n this._bgDepthTexture = null;\r\n\r\n this._invProjectionMatrix = new Matrix();\r\n this._depthClearColor = new Color4(1e6, 1e6, 1e6, 1);\r\n this._thicknessClearColor = new Color4(0, 0, 0, 1);\r\n\r\n this._depthRenderTarget = null;\r\n this._diffuseRenderTarget = null;\r\n this._thicknessRenderTarget = null;\r\n\r\n this._renderPostProcess = null;\r\n }\r\n\r\n /** @internal */\r\n public _initialize(): void {\r\n this.dispose();\r\n\r\n this._needInitialization = false;\r\n\r\n const depthWidth = this._depthMapSize ?? this._engine.getRenderWidth();\r\n const depthHeight =\r\n this._depthMapSize !== null ? Math.round((this._depthMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth()) : this._engine.getRenderHeight();\r\n\r\n this._depthRenderTarget = new FluidRenderingTextures(\r\n \"Depth\",\r\n this._scene,\r\n depthWidth,\r\n depthHeight,\r\n depthWidth,\r\n depthHeight,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n Constants.TEXTURETYPE_FLOAT,\r\n Constants.TEXTUREFORMAT_RG,\r\n false,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._depthRenderTarget);\r\n\r\n if (this.generateDiffuseTexture) {\r\n const diffuseWidth = this._diffuseMapSize ?? this._engine.getRenderWidth();\r\n const diffuseHeight =\r\n this._diffuseMapSize !== null\r\n ? Math.round((this._diffuseMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n this._diffuseRenderTarget = new FluidRenderingTextures(\r\n \"Diffuse\",\r\n this._scene,\r\n diffuseWidth,\r\n diffuseHeight,\r\n 0,\r\n 0,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n Constants.TEXTUREFORMAT_RGBA,\r\n true,\r\n this._camera,\r\n true,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._diffuseRenderTarget);\r\n }\r\n\r\n const thicknessWidth = this._thicknessMapSize ?? this._engine.getRenderWidth();\r\n const thicknessHeight =\r\n this._thicknessMapSize !== null\r\n ? Math.round((this._thicknessMapSize * this._engine.getRenderHeight()) / this._engine.getRenderWidth())\r\n : this._engine.getRenderHeight();\r\n\r\n if (!this._useFixedThickness) {\r\n this._thicknessRenderTarget = new FluidRenderingTextures(\r\n \"Thickness\",\r\n this._scene,\r\n thicknessWidth,\r\n thicknessHeight,\r\n thicknessWidth,\r\n thicknessHeight,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n Constants.TEXTURETYPE_HALF_FLOAT,\r\n Constants.TEXTUREFORMAT_R,\r\n true,\r\n this._camera,\r\n false,\r\n this._samples\r\n );\r\n\r\n this._initializeRenderTarget(this._thicknessRenderTarget);\r\n }\r\n\r\n this._createLiquidRenderingPostProcess();\r\n }\r\n\r\n protected _setBlurParameters(renderTarget: Nullable<FluidRenderingTextures> = null): void {\r\n if (renderTarget === null || renderTarget === this._depthRenderTarget) {\r\n this._setBlurDepthParameters();\r\n }\r\n if (renderTarget === null || renderTarget === this._thicknessRenderTarget) {\r\n this._setBlurThicknessParameters();\r\n }\r\n }\r\n\r\n protected _setBlurDepthParameters(): void {\r\n if (!this._depthRenderTarget) {\r\n return;\r\n }\r\n this._depthRenderTarget.blurFilterSize = this.blurDepthFilterSize;\r\n this._depthRenderTarget.blurMaxFilterSize = this.blurDepthMaxFilterSize;\r\n this._depthRenderTarget.blurNumIterations = this.blurDepthNumIterations;\r\n this._depthRenderTarget.blurDepthScale = this.blurDepthDepthScale;\r\n }\r\n\r\n protected _setBlurThicknessParameters(): void {\r\n if (!this._thicknessRenderTarget) {\r\n return;\r\n }\r\n this._thicknessRenderTarget.blurFilterSize = this.blurThicknessFilterSize;\r\n this._thicknessRenderTarget.blurNumIterations = this.blurThicknessNumIterations;\r\n }\r\n\r\n protected _initializeRenderTarget(renderTarget: FluidRenderingTextures): void {\r\n if (renderTarget !== this._diffuseRenderTarget) {\r\n renderTarget.enableBlur = renderTarget === this._depthRenderTarget ? this.enableBlurDepth : this.enableBlurThickness;\r\n renderTarget.blurSizeDivisor = renderTarget === this._depthRenderTarget ? this.blurDepthSizeDivisor : this.blurThicknessSizeDivisor;\r\n }\r\n\r\n this._setBlurParameters(renderTarget);\r\n\r\n renderTarget.initialize();\r\n }\r\n\r\n protected _createLiquidRenderingPostProcess(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n const uniformNames = [\r\n \"viewMatrix\",\r\n \"projectionMatrix\",\r\n \"invProjectionMatrix\",\r\n \"texelSize\",\r\n \"dirLight\",\r\n \"cameraFar\",\r\n \"density\",\r\n \"refractionStrength\",\r\n \"fresnelClamp\",\r\n \"specularPower\",\r\n ];\r\n const samplerNames = [\"depthSampler\"];\r\n const defines = [];\r\n\r\n this.dispose(true);\r\n\r\n if (!this._camera) {\r\n return;\r\n }\r\n\r\n const texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur! : this._depthRenderTarget!.texture!;\r\n const texelSize = new Vector2(1 / texture.getSize().width, 1 / texture.getSize().height);\r\n\r\n if (this._scene.useRightHandedSystem) {\r\n defines.push(\"#define FLUIDRENDERING_RHS\");\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n samplerNames.push(\"reflectionSampler\");\r\n defines.push(\"#define FLUIDRENDERING_ENVIRONMENT\");\r\n }\r\n }\r\n\r\n if (this._diffuseRenderTarget) {\r\n samplerNames.push(\"diffuseSampler\");\r\n defines.push(\"#define FLUIDRENDERING_DIFFUSETEXTURE\");\r\n } else {\r\n uniformNames.push(\"diffuseColor\");\r\n }\r\n\r\n if (this._useVelocity) {\r\n samplerNames.push(\"velocitySampler\");\r\n defines.push(\"#define FLUIDRENDERING_VELOCITY\");\r\n }\r\n\r\n if (this._useFixedThickness) {\r\n uniformNames.push(\"thickness\");\r\n samplerNames.push(\"bgDepthSampler\");\r\n defines.push(\"#define FLUIDRENDERING_FIXED_THICKNESS\");\r\n } else {\r\n uniformNames.push(\"minimumThickness\");\r\n samplerNames.push(\"thicknessSampler\");\r\n }\r\n\r\n if (this._compositeMode) {\r\n defines.push(\"#define FLUIDRENDERING_COMPOSITE_MODE\");\r\n }\r\n\r\n if (this._debug) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG\");\r\n if (this._debugFeature === FluidRenderingDebug.Normals) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_SHOWNORMAL\");\r\n } else if (this._debugFeature === FluidRenderingDebug.DiffuseRendering) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DIFFUSERENDERING\");\r\n } else {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_TEXTURE\");\r\n samplerNames.push(\"debugSampler\");\r\n if (this._debugFeature === FluidRenderingDebug.DepthTexture || this._debugFeature === FluidRenderingDebug.DepthBlurredTexture) {\r\n defines.push(\"#define FLUIDRENDERING_DEBUG_DEPTH\");\r\n }\r\n }\r\n }\r\n\r\n this._renderPostProcess = new PostProcess(\r\n \"FluidRendering\",\r\n \"fluidRenderingRender\",\r\n uniformNames,\r\n samplerNames,\r\n 1,\r\n null,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n engine,\r\n false,\r\n null,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n undefined,\r\n undefined,\r\n true,\r\n undefined\r\n );\r\n this._renderPostProcess.updateEffect(defines.join(\"\\n\"));\r\n\r\n this._renderPostProcess.samples = this._samples;\r\n const engineWebGPU = engine as WebGPUEngine;\r\n const setTextureSampler = engineWebGPU.setTextureSampler;\r\n this._renderPostProcess.onApplyObservable.add((effect) => {\r\n this._invProjectionMatrix.copyFrom(this._scene.getProjectionMatrix());\r\n this._invProjectionMatrix.invert();\r\n\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"textureSamplerSampler\", this._renderPostProcess!.inputTexture.texture);\r\n }\r\n\r\n if (!this._depthRenderTarget!.enableBlur) {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"depthSampler\", this._depthRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"depthSamplerSampler\", this._depthRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n if (this._diffuseRenderTarget) {\r\n if (!this._diffuseRenderTarget.enableBlur) {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"diffuseSampler\", this._diffuseRenderTarget.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"diffuseSamplerSampler\", this._diffuseRenderTarget.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n } else {\r\n effect.setColor3(\"diffuseColor\", this.fluidColor);\r\n }\r\n if (this._useFixedThickness) {\r\n effect.setFloat(\"thickness\", this.minimumThickness);\r\n effect._bindTexture(\"bgDepthSampler\", this._bgDepthTexture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"bgDepthSamplerSampler\", this._bgDepthTexture ?? null);\r\n }\r\n } else {\r\n if (!this._thicknessRenderTarget!.enableBlur) {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.texture?.getInternalTexture() ?? null);\r\n }\r\n } else {\r\n effect.setTexture(\"thicknessSampler\", this._thicknessRenderTarget!.textureBlur);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"thicknessSamplerSampler\", this._thicknessRenderTarget!.textureBlur?.getInternalTexture() ?? null);\r\n }\r\n }\r\n effect.setFloat(\"minimumThickness\", this.minimumThickness);\r\n }\r\n\r\n if (this._environmentMap !== null) {\r\n const envMap = this._environmentMap ?? this._scene.environmentTexture;\r\n if (envMap) {\r\n effect.setTexture(\"reflectionSampler\", envMap);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"reflectionSamplerSampler\", envMap?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n\r\n effect.setMatrix(\"viewMatrix\", this._scene.getViewMatrix());\r\n effect.setMatrix(\"invProjectionMatrix\", this._invProjectionMatrix);\r\n effect.setMatrix(\"projectionMatrix\", this._scene.getProjectionMatrix());\r\n effect.setVector2(\"texelSize\", texelSize);\r\n effect.setFloat(\"density\", this.density);\r\n effect.setFloat(\"refractionStrength\", this.refractionStrength);\r\n effect.setFloat(\"fresnelClamp\", this.fresnelClamp);\r\n effect.setFloat(\"specularPower\", this.specularPower);\r\n\r\n effect.setVector3(\"dirLight\", this.dirLight);\r\n\r\n effect.setFloat(\"cameraFar\", this._camera!.maxZ);\r\n\r\n if (this._debug) {\r\n let texture: Nullable<ThinTexture> = null;\r\n switch (this._debugFeature) {\r\n case FluidRenderingDebug.DepthTexture:\r\n texture = this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.DepthBlurredTexture:\r\n texture = this._depthRenderTarget!.enableBlur ? this._depthRenderTarget!.textureBlur : this._depthRenderTarget!.texture;\r\n break;\r\n case FluidRenderingDebug.ThicknessTexture:\r\n texture = this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.ThicknessBlurredTexture:\r\n texture = this._thicknessRenderTarget?.enableBlur ? this._thicknessRenderTarget?.textureBlur ?? null : this._thicknessRenderTarget?.texture ?? null;\r\n break;\r\n case FluidRenderingDebug.DiffuseTexture:\r\n if (this._diffuseRenderTarget) {\r\n texture = this._diffuseRenderTarget.texture;\r\n }\r\n break;\r\n }\r\n if (this._debugFeature !== FluidRenderingDebug.Normals) {\r\n effect.setTexture(\"debugSampler\", texture);\r\n if (setTextureSampler) {\r\n setTextureSampler.call(engineWebGPU, \"debugSamplerSampler\", texture?.getInternalTexture() ?? null);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _clearTargets(): void {\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n this._engine.clear(this._depthClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n this._engine.clear(this._thicknessClearColor, true, true, false);\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n // we don't clear the depth buffer because it is the depth buffer that is coming from the scene and that we reuse in the thickness rendering pass\r\n this._engine.clear(this._thicknessClearColor, true, false, false);\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _render(fluidObject: FluidRenderingObject): void {\r\n if (this._needInitialization || !fluidObject.isReady()) {\r\n return;\r\n }\r\n\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._engine.setState(false, undefined, undefined, undefined, true);\r\n this._engine.setDepthBuffer(true);\r\n this._engine.setDepthWrite(true);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n // Render the particles in the depth texture\r\n if (this._depthRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._depthRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDepthTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._depthRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the diffuse texture\r\n if (this._diffuseRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n\r\n fluidObject.renderDiffuseTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._diffuseRenderTarget.renderTarget);\r\n }\r\n\r\n // Render the particles in the thickness texture\r\n if (this._thicknessRenderTarget?.renderTarget) {\r\n this._engine.bindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n\r\n fluidObject.renderThicknessTexture();\r\n\r\n this._engine.unbindInstanceAttributes();\r\n this._engine.unBindFramebuffer(this._thicknessRenderTarget.renderTarget);\r\n }\r\n\r\n // Run the blur post processes\r\n this._depthRenderTarget?.applyBlurPostProcesses();\r\n this._diffuseRenderTarget?.applyBlurPostProcesses();\r\n this._thicknessRenderTarget?.applyBlurPostProcesses();\r\n\r\n if (currentRenderTarget) {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n\r\n /**\r\n * Releases all the ressources used by the class\r\n * @param onlyPostProcesses If true, releases only the ressources used by the render post processes\r\n */\r\n public dispose(onlyPostProcesses = false): void {\r\n if (!onlyPostProcesses) {\r\n this._depthRenderTarget?.dispose();\r\n this._depthRenderTarget = null;\r\n\r\n this._diffuseRenderTarget?.dispose();\r\n this._diffuseRenderTarget = null;\r\n\r\n this._thicknessRenderTarget?.dispose();\r\n this._thicknessRenderTarget = null;\r\n }\r\n\r\n if (this._renderPostProcess && this._camera) {\r\n this._camera.detachPostProcess(this._renderPostProcess);\r\n }\r\n this._renderPostProcess?.dispose();\r\n this._renderPostProcess = null;\r\n\r\n this._needInitialization = false;\r\n }\r\n}\r\n"]}
|
|
@@ -397,6 +397,9 @@ export class PrePassRenderer {
|
|
|
397
397
|
* @internal
|
|
398
398
|
*/
|
|
399
399
|
_clear() {
|
|
400
|
+
if (this._isDirty) {
|
|
401
|
+
this._update();
|
|
402
|
+
}
|
|
400
403
|
if (this._enabled && this._currentTarget.enabled) {
|
|
401
404
|
this._bindFrameBuffer();
|
|
402
405
|
// Clearing other attachment with 0 on all other attachments
|