@onerjs/core 8.42.7 → 8.42.8
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/animatable.core.js +1 -1
- package/Animations/animatable.core.js.map +1 -1
- package/Animations/animatorAvatar.js +2 -2
- package/Animations/animatorAvatar.js.map +1 -1
- package/Animations/runtimeAnimation.js +1 -1
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/audioSceneComponent.js +1 -2
- package/Audio/audioSceneComponent.js.map +1 -1
- package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
- package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.js +1 -1
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -1
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Bones/boneLookController.js +1 -1
- package/Bones/boneLookController.js.map +1 -1
- package/Buffers/buffer.js +1 -1
- package/Buffers/buffer.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/camera.js +2 -2
- package/Cameras/camera.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
- package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
- package/Engines/Extensions/engine.query.js +1 -1
- package/Engines/Extensions/engine.query.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +2 -3
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
- package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
- package/Engines/WebGPU/Extensions/engine.debugging.js +123 -31
- package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
- package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +10 -5
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/engine.common.js +2 -2
- package/Engines/engine.common.js.map +1 -1
- package/Engines/engine.js +0 -1
- package/Engines/engine.js.map +1 -1
- package/Engines/thinEngine.functions.js +1 -1
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.js +4 -5
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/thinNativeEngine.js +2 -5
- package/Engines/thinNativeEngine.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +6 -4
- package/Engines/thinWebGPUEngine.js +49 -25
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +2 -1
- package/Engines/webgpuEngine.js +18 -16
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +1 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphBlock.d.ts +1 -0
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +1 -0
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
- package/FrameGraph/Node/nodeRenderGraph.js +36 -2
- package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
- package/Layers/glowLayer.js +1 -1
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +1 -1
- package/Layers/highlightLayer.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +28 -1
- package/Lights/Shadows/shadowGenerator.js +77 -11
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/lightingVolume.d.ts +1 -0
- package/Lights/lightingVolume.js +10 -2
- package/Lights/lightingVolume.js.map +1 -1
- package/Loading/sceneLoader.js +1 -1
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.js +1 -1
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/curveBlock.js +2 -3
- package/Materials/Node/Blocks/curveBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +1 -2
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.js +3 -5
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +2 -3
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/cubeTexture.js +1 -1
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/Textures/htmlElementTexture.js +2 -2
- package/Materials/Textures/htmlElementTexture.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.js +1 -1
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +13 -2
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/effect.js +2 -1
- package/Materials/effect.js.map +1 -1
- package/Materials/materialHelper.functions.js +1 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/multiMaterial.js +1 -1
- package/Materials/multiMaterial.js.map +1 -1
- package/Materials/standardMaterial.js +1 -2
- package/Materials/standardMaterial.js.map +1 -1
- package/Maths/math.geospatial.d.ts +17 -2
- package/Maths/math.geospatial.functions.d.ts +16 -2
- package/Maths/math.geospatial.functions.js +37 -4
- package/Maths/math.geospatial.functions.js.map +1 -1
- package/Maths/math.geospatial.js.map +1 -1
- package/Maths/math.path.js +1 -1
- package/Maths/math.path.js.map +1 -1
- package/Maths/math.scalar.functions.js +3 -3
- package/Maths/math.scalar.functions.js.map +1 -1
- package/Maths/math.vector.js +1 -1
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/boxBuilder.js +1 -2
- package/Meshes/Builders/boxBuilder.js.map +1 -1
- package/Meshes/Builders/cylinderBuilder.js +2 -2
- package/Meshes/Builders/cylinderBuilder.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +1 -2
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/latheBuilder.js +2 -2
- package/Meshes/Builders/latheBuilder.js.map +1 -1
- package/Meshes/Builders/linesBuilder.js +11 -15
- package/Meshes/Builders/linesBuilder.js.map +1 -1
- package/Meshes/Builders/polygonBuilder.js +6 -6
- package/Meshes/Builders/polygonBuilder.js.map +1 -1
- package/Meshes/Builders/polyhedronBuilder.js +2 -2
- package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
- package/Meshes/Builders/ribbonBuilder.js +6 -6
- package/Meshes/Builders/ribbonBuilder.js.map +1 -1
- package/Meshes/Builders/shapeBuilder.js +2 -3
- package/Meshes/Builders/shapeBuilder.js.map +1 -1
- package/Meshes/Builders/tiledBoxBuilder.js +1 -1
- package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
- package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
- package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
- package/Meshes/Node/Blocks/mappingBlock.js +1 -1
- package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +4 -0
- package/Meshes/abstractMesh.js +14 -10
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/csg.js +1 -1
- package/Meshes/csg.js.map +1 -1
- package/Meshes/csg2.js +1 -1
- package/Meshes/csg2.js.map +1 -1
- package/Meshes/geodesicMesh.js +11 -13
- package/Meshes/geodesicMesh.js.map +1 -1
- package/Meshes/geometry.js +2 -2
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/groundMesh.js +7 -7
- package/Meshes/groundMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +2 -0
- package/Meshes/mesh.js +21 -7
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.js +22 -22
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/meshSimplification.js +1 -1
- package/Meshes/meshSimplification.js.map +1 -1
- package/Meshes/polygonMesh.js +1 -1
- package/Meshes/polygonMesh.js.map +1 -1
- package/Meshes/trailMesh.js +1 -1
- package/Meshes/trailMesh.js.map +1 -1
- package/Misc/HighDynamicRange/hdr.js +4 -6
- package/Misc/HighDynamicRange/hdr.js.map +1 -1
- package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
- package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
- package/Misc/basisWorker.js +1 -1
- package/Misc/basisWorker.js.map +1 -1
- package/Misc/environmentTextureTools.js +1 -1
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/meshExploder.js +1 -2
- package/Misc/meshExploder.js.map +1 -1
- package/Misc/tga.js +2 -2
- package/Misc/tga.js.map +1 -1
- package/Misc/timer.js +4 -2
- package/Misc/timer.js.map +1 -1
- package/Misc/tools.d.ts +7 -0
- package/Misc/tools.js +20 -6
- package/Misc/tools.js.map +1 -1
- package/Morph/morphTargetManager.js +1 -1
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
- package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
- package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
- package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
- package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
- package/Particles/Node/nodeParticleSystemSet.js +1 -1
- package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +2 -0
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +14 -0
- package/Particles/gpuParticleSystem.js +94 -12
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.js +4 -1
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/pointsCloudSystem.js +46 -47
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Particles/solidParticleSystem.js +5 -6
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.js +3 -4
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +2 -1
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
- package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
- package/Physics/v2/characterController.js +4 -8
- package/Physics/v2/characterController.js.map +1 -1
- package/Physics/v2/ragdoll.js +1 -2
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/postProcess.js +3 -3
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
- package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
- package/Probes/reflectionProbe.js +0 -1
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/depthRenderer.js +0 -11
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/depthRendererSceneComponent.js +1 -1
- package/Rendering/depthRendererSceneComponent.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +0 -1
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/objectRenderer.js +7 -5
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/thinDepthPeelingRenderer.js +1 -1
- package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js +1 -1
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
- package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
- package/Shaders/gpuRenderParticles.vertex.js +4 -0
- package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +15 -3
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
- package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/Sprites/spriteManager.js +4 -4
- package/Sprites/spriteManager.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +2 -2
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRHandTracking.js +1 -1
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +1 -1
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
- package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
- package/XR/motionController/webXROculusTouchMotionController.js +1 -1
- package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
- package/XR/webXRFeaturesManager.js +1 -1
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/assetContainer.js +1 -1
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +16 -0
- package/scene.js +28 -0
- package/scene.js.map +1 -1
- package/sceneComponent.js +1 -1
- package/sceneComponent.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssrRenderingPipelineTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraph, FrameGraphTextureHandle, Camera, FrameGraphTextureCreationOptions } from \"core/index\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { ThinSSRRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline\";\r\nimport { FrameGraphSSRTask } from \"./ssrTask\";\r\nimport { FrameGraphSSRBlurTask } from \"./ssrBlurTask\";\r\nimport { FrameGraphPostProcessTask } from \"./postProcessTask\";\r\n\r\n/**\r\n * Task which applies a SSR post process.\r\n */\r\nexport class FrameGraphSSRRenderingPipelineTask extends FrameGraphTask {\r\n /**\r\n * The source texture to apply the SSR effect on.\r\n */\r\n public sourceTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use for the source texture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The alpha mode to use when applying the SSR effect.\r\n */\r\n public get alphaMode() {\r\n return this._ssrBlurCombiner.alphaMode;\r\n }\r\n\r\n public set alphaMode(mode: number) {\r\n this._ssrBlurCombiner.alphaMode = mode;\r\n }\r\n\r\n /**\r\n * The normal texture used by the SSR effect.\r\n */\r\n public normalTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The depth texture used by the SSR effect.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The back depth texture used by the SSR effect (optional).\r\n * This is used when automatic thickness computation is enabled.\r\n * The back depth texture is the depth texture of the scene rendered for the back side of the objects (that is, front faces are culled).\r\n */\r\n public backDepthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The reflectivity texture used by the SSR effect\r\n */\r\n public reflectivityTexture: FrameGraphTextureHandle;\r\n\r\n private _camera: Camera;\r\n\r\n /**\r\n * The camera used to render the scene.\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: Camera) {\r\n if (camera === this._camera) {\r\n return;\r\n }\r\n\r\n this._camera = camera;\r\n\r\n this.ssr.camera = camera;\r\n }\r\n\r\n /**\r\n * The target texture to render the SSR effect to.\r\n */\r\n public targetTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output texture of the SSR effect.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The SSR Rendering pipeline.\r\n */\r\n public readonly ssr: ThinSSRRenderingPipeline;\r\n\r\n /**\r\n * The name of the task.\r\n */\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._ssr) {\r\n this._ssr.name = `${name} SSR main`;\r\n }\r\n if (this._ssrBlurX) {\r\n this._ssrBlurX.name = `${name} SSR Blur X`;\r\n }\r\n if (this._ssrBlurY) {\r\n this._ssrBlurY.name = `${name} SSR Blur Y`;\r\n }\r\n if (this._ssrBlurCombiner) {\r\n this._ssrBlurCombiner.name = `${name} SSR Blur Combiner`;\r\n }\r\n }\r\n\r\n /**\r\n * The texture type used by the different post processes created by SSR.\r\n * It's a read-only property. If you want to change it, you must recreate the task and pass the appropriate texture type to the constructor.\r\n */\r\n public readonly textureType: number;\r\n\r\n private readonly _ssr: FrameGraphSSRTask;\r\n private readonly _ssrBlurX: FrameGraphSSRBlurTask;\r\n private readonly _ssrBlurY: FrameGraphSSRBlurTask;\r\n private readonly _ssrBlurCombiner: FrameGraphPostProcessTask;\r\n\r\n /**\r\n * Constructs a SSR rendering pipeline task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task belongs to.\r\n * @param textureType The texture type used by the different post processes created by SSR (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n super(name, frameGraph);\r\n\r\n this.textureType = textureType;\r\n\r\n this.ssr = new ThinSSRRenderingPipeline(name, frameGraph.scene);\r\n\r\n this._ssr = new FrameGraphSSRTask(`${name} SSR main`, this._frameGraph, this.ssr._ssrPostProcess);\r\n this._ssrBlurX = new FrameGraphSSRBlurTask(`${name} SSR Blur X`, this._frameGraph, this.ssr._ssrBlurXPostProcess);\r\n this._ssrBlurY = new FrameGraphSSRBlurTask(`${name} SSR Blur Y`, this._frameGraph, this.ssr._ssrBlurYPostProcess);\r\n this._ssrBlurCombiner = new FrameGraphPostProcessTask(`${name} SSR Blur Combiner`, this._frameGraph, this.ssr._ssrBlurCombinerPostProcess);\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override isReady() {\r\n return this.ssr.isReady();\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphSSRRenderingPipelineTask\";\r\n }\r\n\r\n public record(): void {\r\n if (\r\n this.sourceTexture === undefined ||\r\n this.normalTexture === undefined ||\r\n this.depthTexture === undefined ||\r\n this.reflectivityTexture === undefined ||\r\n this.camera === undefined\r\n ) {\r\n throw new Error(`FrameGraphSSRRenderingPipelineTask \"${this.name}\": sourceTexture, normalTexture, depthTexture, reflectivityTexture and camera are required`);\r\n }\r\n\r\n const sourceTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.sourceTexture);\r\n\r\n this._ssr.sourceTexture = this.sourceTexture;\r\n this._ssr.sourceSamplingMode = this.sourceSamplingMode;\r\n this._ssr.camera = this.camera;\r\n this._ssr.normalTexture = this.normalTexture;\r\n this._ssr.depthTexture = this.depthTexture;\r\n this._ssr.backDepthTexture = this.backDepthTexture;\r\n this._ssr.reflectivityTexture = this.reflectivityTexture;\r\n\r\n let ssrTextureHandle: FrameGraphTextureHandle | undefined;\r\n\r\n const textureSize = {\r\n width: Math.floor(sourceTextureDescription.size.width / (this.ssr.ssrDownsample + 1)) || 1,\r\n height: Math.floor(sourceTextureDescription.size.height / (this.ssr.ssrDownsample + 1)) || 1,\r\n };\r\n const textureCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: textureSize,\r\n options: {\r\n createMipMaps: false,\r\n types: [this.textureType],\r\n formats: [Constants.TEXTUREFORMAT_RGBA],\r\n samples: 1,\r\n useSRGBBuffers: [false],\r\n labels: [\"\"],\r\n },\r\n sizeIsPercentage: false,\r\n };\r\n\r\n if (this.ssr.blurDispersionStrength > 0 || !this.targetTexture) {\r\n ssrTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssr.name, textureCreationOptions);\r\n }\r\n\r\n if (this.ssr.blurDispersionStrength === 0) {\r\n this._ssr.targetTexture = this.outputTexture;\r\n\r\n if (ssrTextureHandle !== undefined) {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, ssrTextureHandle);\r\n } else {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n }\r\n\r\n this._ssr.record(true);\r\n } else {\r\n this._ssr.targetTexture = ssrTextureHandle;\r\n this._ssr.record(true);\r\n\r\n textureSize.width = Math.floor(sourceTextureDescription.size.width / (this.ssr.blurDownsample + 1)) || 1;\r\n textureSize.height = Math.floor(sourceTextureDescription.size.height / (this.ssr.blurDownsample + 1)) || 1;\r\n\r\n const sourceTextureCreationOptions = this._frameGraph.textureManager.getTextureCreationOptions(this.sourceTexture);\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture, this.name + \" Output\", sourceTextureCreationOptions);\r\n\r\n const blurXTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssrBlurX.name, textureCreationOptions);\r\n\r\n this._ssrBlurX.sourceTexture = ssrTextureHandle!;\r\n this._ssrBlurX.sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n this._ssrBlurX.targetTexture = blurXTextureHandle;\r\n this._ssrBlurX.record(true);\r\n\r\n const blurYTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssrBlurY.name, textureCreationOptions);\r\n\r\n this._ssrBlurY.sourceTexture = blurXTextureHandle;\r\n this._ssrBlurY.sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n this._ssrBlurY.targetTexture = blurYTextureHandle;\r\n this._ssrBlurY.record(true);\r\n\r\n this._ssrBlurCombiner.sourceTexture = this.sourceTexture;\r\n this._ssrBlurCombiner.sourceSamplingMode = this.sourceSamplingMode;\r\n this._ssrBlurCombiner.targetTexture = this.outputTexture;\r\n const combinerPass = this._ssrBlurCombiner.record(true, undefined, (context) => {\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"mainSampler\", this.sourceTexture);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"textureSampler\", blurYTextureHandle);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"reflectivitySampler\", this.reflectivityTexture);\r\n if (this.ssr.useFresnel) {\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"normalSampler\", this.normalTexture);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"depthSampler\", this.depthTexture);\r\n }\r\n });\r\n\r\n combinerPass.addDependencies(blurYTextureHandle);\r\n }\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.addDependencies(this.sourceTexture);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((context) => {\r\n if (this.alphaMode === Constants.ALPHA_DISABLE) {\r\n context.copyTexture(this.sourceTexture);\r\n }\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this._ssr.dispose();\r\n this._ssrBlurX.dispose();\r\n this._ssrBlurY.dispose();\r\n this._ssrBlurCombiner.dispose();\r\n this.ssr.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ssrRenderingPipelineTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraph, FrameGraphTextureHandle, Camera, FrameGraphTextureCreationOptions } from \"core/index\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { ThinSSRRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline\";\r\nimport { FrameGraphSSRTask } from \"./ssrTask\";\r\nimport { FrameGraphSSRBlurTask } from \"./ssrBlurTask\";\r\nimport { FrameGraphPostProcessTask } from \"./postProcessTask\";\r\n\r\n/**\r\n * Task which applies a SSR post process.\r\n */\r\nexport class FrameGraphSSRRenderingPipelineTask extends FrameGraphTask {\r\n /**\r\n * The source texture to apply the SSR effect on.\r\n */\r\n public sourceTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use for the source texture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The alpha mode to use when applying the SSR effect.\r\n */\r\n public get alphaMode() {\r\n return this._ssrBlurCombiner.alphaMode;\r\n }\r\n\r\n public set alphaMode(mode: number) {\r\n this._ssrBlurCombiner.alphaMode = mode;\r\n }\r\n\r\n /**\r\n * The normal texture used by the SSR effect.\r\n */\r\n public normalTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The depth texture used by the SSR effect.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The back depth texture used by the SSR effect (optional).\r\n * This is used when automatic thickness computation is enabled.\r\n * The back depth texture is the depth texture of the scene rendered for the back side of the objects (that is, front faces are culled).\r\n */\r\n public backDepthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The reflectivity texture used by the SSR effect\r\n */\r\n public reflectivityTexture: FrameGraphTextureHandle;\r\n\r\n private _camera: Camera;\r\n\r\n /**\r\n * The camera used to render the scene.\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: Camera) {\r\n if (camera === this._camera) {\r\n return;\r\n }\r\n\r\n this._camera = camera;\r\n\r\n this.ssr.camera = camera;\r\n if (this._ssr) {\r\n this._ssr.camera = camera;\r\n }\r\n }\r\n\r\n /**\r\n * The target texture to render the SSR effect to.\r\n */\r\n public targetTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output texture of the SSR effect.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The SSR Rendering pipeline.\r\n */\r\n public readonly ssr: ThinSSRRenderingPipeline;\r\n\r\n /**\r\n * The name of the task.\r\n */\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._ssr) {\r\n this._ssr.name = `${name} SSR main`;\r\n }\r\n if (this._ssrBlurX) {\r\n this._ssrBlurX.name = `${name} SSR Blur X`;\r\n }\r\n if (this._ssrBlurY) {\r\n this._ssrBlurY.name = `${name} SSR Blur Y`;\r\n }\r\n if (this._ssrBlurCombiner) {\r\n this._ssrBlurCombiner.name = `${name} SSR Blur Combiner`;\r\n }\r\n }\r\n\r\n /**\r\n * The texture type used by the different post processes created by SSR.\r\n * It's a read-only property. If you want to change it, you must recreate the task and pass the appropriate texture type to the constructor.\r\n */\r\n public readonly textureType: number;\r\n\r\n private readonly _ssr: FrameGraphSSRTask;\r\n private readonly _ssrBlurX: FrameGraphSSRBlurTask;\r\n private readonly _ssrBlurY: FrameGraphSSRBlurTask;\r\n private readonly _ssrBlurCombiner: FrameGraphPostProcessTask;\r\n\r\n /**\r\n * Constructs a SSR rendering pipeline task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task belongs to.\r\n * @param textureType The texture type used by the different post processes created by SSR (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, textureType = Constants.TEXTURETYPE_UNSIGNED_BYTE) {\r\n super(name, frameGraph);\r\n\r\n this.textureType = textureType;\r\n\r\n this.ssr = new ThinSSRRenderingPipeline(name, frameGraph.scene);\r\n\r\n this._ssr = new FrameGraphSSRTask(`${name} SSR main`, this._frameGraph, this.ssr._ssrPostProcess);\r\n this._ssrBlurX = new FrameGraphSSRBlurTask(`${name} SSR Blur X`, this._frameGraph, this.ssr._ssrBlurXPostProcess);\r\n this._ssrBlurY = new FrameGraphSSRBlurTask(`${name} SSR Blur Y`, this._frameGraph, this.ssr._ssrBlurYPostProcess);\r\n this._ssrBlurCombiner = new FrameGraphPostProcessTask(`${name} SSR Blur Combiner`, this._frameGraph, this.ssr._ssrBlurCombinerPostProcess);\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override isReady() {\r\n return this.ssr.isReady();\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphSSRRenderingPipelineTask\";\r\n }\r\n\r\n public record(): void {\r\n if (\r\n this.sourceTexture === undefined ||\r\n this.normalTexture === undefined ||\r\n this.depthTexture === undefined ||\r\n this.reflectivityTexture === undefined ||\r\n this.camera === undefined\r\n ) {\r\n throw new Error(`FrameGraphSSRRenderingPipelineTask \"${this.name}\": sourceTexture, normalTexture, depthTexture, reflectivityTexture and camera are required`);\r\n }\r\n\r\n const sourceTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.sourceTexture);\r\n\r\n this._ssr.sourceTexture = this.sourceTexture;\r\n this._ssr.sourceSamplingMode = this.sourceSamplingMode;\r\n this._ssr.camera = this.camera;\r\n this._ssr.normalTexture = this.normalTexture;\r\n this._ssr.depthTexture = this.depthTexture;\r\n this._ssr.backDepthTexture = this.backDepthTexture;\r\n this._ssr.reflectivityTexture = this.reflectivityTexture;\r\n\r\n let ssrTextureHandle: FrameGraphTextureHandle | undefined;\r\n\r\n const textureSize = {\r\n width: Math.floor(sourceTextureDescription.size.width / (this.ssr.ssrDownsample + 1)) || 1,\r\n height: Math.floor(sourceTextureDescription.size.height / (this.ssr.ssrDownsample + 1)) || 1,\r\n };\r\n const textureCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: textureSize,\r\n options: {\r\n createMipMaps: false,\r\n types: [this.textureType],\r\n formats: [Constants.TEXTUREFORMAT_RGBA],\r\n samples: 1,\r\n useSRGBBuffers: [false],\r\n labels: [\"\"],\r\n },\r\n sizeIsPercentage: false,\r\n };\r\n\r\n if (this.ssr.blurDispersionStrength > 0 || !this.targetTexture) {\r\n ssrTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssr.name, textureCreationOptions);\r\n }\r\n\r\n if (this.ssr.blurDispersionStrength === 0) {\r\n this._ssr.targetTexture = this.outputTexture;\r\n\r\n if (ssrTextureHandle !== undefined) {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, ssrTextureHandle);\r\n } else {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n }\r\n\r\n this._ssr.record(true);\r\n } else {\r\n this._ssr.targetTexture = ssrTextureHandle;\r\n this._ssr.record(true);\r\n\r\n textureSize.width = Math.floor(sourceTextureDescription.size.width / (this.ssr.blurDownsample + 1)) || 1;\r\n textureSize.height = Math.floor(sourceTextureDescription.size.height / (this.ssr.blurDownsample + 1)) || 1;\r\n\r\n const sourceTextureCreationOptions = this._frameGraph.textureManager.getTextureCreationOptions(this.sourceTexture);\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture, this.name + \" Output\", sourceTextureCreationOptions);\r\n\r\n const blurXTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssrBlurX.name, textureCreationOptions);\r\n\r\n this._ssrBlurX.sourceTexture = ssrTextureHandle!;\r\n this._ssrBlurX.sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n this._ssrBlurX.targetTexture = blurXTextureHandle;\r\n this._ssrBlurX.record(true);\r\n\r\n const blurYTextureHandle = this._frameGraph.textureManager.createRenderTargetTexture(this._ssrBlurY.name, textureCreationOptions);\r\n\r\n this._ssrBlurY.sourceTexture = blurXTextureHandle;\r\n this._ssrBlurY.sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n this._ssrBlurY.targetTexture = blurYTextureHandle;\r\n this._ssrBlurY.record(true);\r\n\r\n this._ssrBlurCombiner.sourceTexture = this.sourceTexture;\r\n this._ssrBlurCombiner.sourceSamplingMode = this.sourceSamplingMode;\r\n this._ssrBlurCombiner.targetTexture = this.outputTexture;\r\n const combinerPass = this._ssrBlurCombiner.record(true, undefined, (context) => {\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"mainSampler\", this.sourceTexture);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"textureSampler\", blurYTextureHandle);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"reflectivitySampler\", this.reflectivityTexture);\r\n if (this.ssr.useFresnel) {\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"normalSampler\", this.normalTexture);\r\n context.bindTextureHandle(this._ssrBlurCombiner.drawWrapper.effect!, \"depthSampler\", this.depthTexture);\r\n }\r\n });\r\n\r\n combinerPass.addDependencies(blurYTextureHandle);\r\n }\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.addDependencies(this.sourceTexture);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((context) => {\r\n if (this.alphaMode === Constants.ALPHA_DISABLE) {\r\n context.copyTexture(this.sourceTexture);\r\n }\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this._ssr.dispose();\r\n this._ssrBlurX.dispose();\r\n this._ssrBlurY.dispose();\r\n this._ssrBlurCombiner.dispose();\r\n this.ssr.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -19,10 +19,12 @@ export declare class FrameGraphVolumetricLightingTask extends FrameGraphTask {
|
|
|
19
19
|
* It must be the depth texture used to generate targetTexture.
|
|
20
20
|
*/
|
|
21
21
|
depthTexture: FrameGraphTextureHandle;
|
|
22
|
+
private _camera;
|
|
22
23
|
/**
|
|
23
24
|
* The camera used for volumetric lighting calculations.
|
|
24
25
|
*/
|
|
25
|
-
camera: Camera;
|
|
26
|
+
get camera(): Camera;
|
|
27
|
+
set camera(value: Camera);
|
|
26
28
|
/**
|
|
27
29
|
* The mesh representing the lighting volume.
|
|
28
30
|
* This is the mesh that will be rendered to create the volumetric lighting effect.
|
|
@@ -11,6 +11,20 @@ const InvViewProjectionMatrix = new Matrix();
|
|
|
11
11
|
* A frame graph task that performs volumetric lighting.
|
|
12
12
|
*/
|
|
13
13
|
export class FrameGraphVolumetricLightingTask extends FrameGraphTask {
|
|
14
|
+
/**
|
|
15
|
+
* The camera used for volumetric lighting calculations.
|
|
16
|
+
*/
|
|
17
|
+
get camera() {
|
|
18
|
+
return this._camera;
|
|
19
|
+
}
|
|
20
|
+
set camera(value) {
|
|
21
|
+
if (this._camera === value) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this._camera = value;
|
|
25
|
+
this._renderLightingVolumeTask.camera = value;
|
|
26
|
+
this._blendLightingVolumeTask.camera = value;
|
|
27
|
+
}
|
|
14
28
|
/**
|
|
15
29
|
* The phase G parameter for the volumetric lighting effect (default: 0).
|
|
16
30
|
* This parameter controls the anisotropy of the scattering.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"volumetricLightingTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera, DirectionalLight, FrameGraph, FrameGraphObjectList, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphVolumetricLightingBlendVolumeTask } from \"./volumetricLightingBlendVolumeTask\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphClearTextureTask } from \"../Texture/clearTextureTask\";\r\nimport { FrameGraphObjectRendererTask } from \"../Rendering/objectRendererTask\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nconst InvViewProjectionMatrix = new Matrix();\r\n\r\n/**\r\n * A frame graph task that performs volumetric lighting.\r\n */\r\nexport class FrameGraphVolumetricLightingTask extends FrameGraphTask {\r\n /**\r\n * The target texture to which the volumetric lighting will be applied.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use when blending the volumetric lighting texture with targetTexture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The depth texture used for volumetric lighting calculations.\r\n * It must be the depth texture used to generate targetTexture.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The camera used for volumetric lighting calculations.\r\n */\r\n public camera: Camera;\r\n\r\n /**\r\n * The mesh representing the lighting volume.\r\n * This is the mesh that will be rendered to create the volumetric lighting effect.\r\n */\r\n public lightingVolumeMesh: FrameGraphObjectList;\r\n\r\n /**\r\n * The directional light used for volumetric lighting.\r\n */\r\n public light: DirectionalLight;\r\n\r\n /**\r\n * The lighting volume texture (optional).\r\n * If not provided, a new texture will be created, with the same size, format and type as targetTexture.\r\n * This is the texture that will store the volumetric lighting information, before being blended to targetTexture.\r\n */\r\n public lightingVolumeTexture?: FrameGraphTextureHandle;\r\n\r\n private _extinctionPhaseG = new Vector4(0, 0, 0, 0);\r\n\r\n /**\r\n * The phase G parameter for the volumetric lighting effect (default: 0).\r\n * This parameter controls the anisotropy of the scattering.\r\n * A value of 0 means isotropic scattering, while a value of 1 means forward scattering and -1 means backward scattering.\r\n */\r\n public get phaseG() {\r\n return this._extinctionPhaseG.w;\r\n }\r\n\r\n public set phaseG(value: number) {\r\n this._extinctionPhaseG.w = value;\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n }\r\n\r\n /**\r\n * Whether to enable extinction in the volumetric lighting effect (default: false).\r\n * Read-only property set in the constructor.\r\n */\r\n public readonly enableExtinction: boolean;\r\n\r\n /**\r\n * The extinction coefficient for the volumetric lighting effect (default: (0, 0, 0) - no extinction).\r\n * This parameter controls how much light is absorbed and scattered as it travels through the medium.\r\n * Will only have an effect if enableExtinction is set to true in the constructor!\r\n */\r\n public get extinction() {\r\n return this._blendLightingVolumeTask.postProcess.extinction;\r\n }\r\n\r\n public set extinction(value: Vector3) {\r\n this._extinctionPhaseG.x = Math.max(value.x, 1e-6);\r\n this._extinctionPhaseG.y = Math.max(value.y, 1e-6);\r\n this._extinctionPhaseG.z = Math.max(value.z, 1e-6);\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n this._blendLightingVolumeTask.postProcess.extinction.copyFromFloats(this._extinctionPhaseG.x, this._extinctionPhaseG.y, this._extinctionPhaseG.z);\r\n }\r\n\r\n private _lightPower = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The light power/color for the volumetric lighting effect (default: (1, 1, 1)).\r\n * This parameter controls the intensity and color of the light used for volumetric lighting.\r\n */\r\n public get lightPower() {\r\n return this._lightPower;\r\n }\r\n\r\n public set lightPower(value: Color3) {\r\n this._lightPower.copyFrom(value);\r\n this._renderLightingVolumeMaterial.setColor3(\"lightPower\", this._lightPower);\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._renderLightingVolumeMaterial) {\r\n this._renderLightingVolumeMaterial.name = `${name} - render lighting volume`;\r\n }\r\n if (this._clearLightingVolumeTextureTask) {\r\n this._clearLightingVolumeTextureTask.name = `${name} - clear lighting volume texture`;\r\n }\r\n if (this._renderLightingVolumeTask) {\r\n this._renderLightingVolumeTask.name = `${name} - render lighting volume`;\r\n }\r\n if (this._blendLightingVolumeTask) {\r\n this._blendLightingVolumeTask.name = `${name} - blend lighting volume`;\r\n }\r\n }\r\n\r\n /**\r\n * The output texture of the task. It will be the same as targetTexture.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n private readonly _clearLightingVolumeTextureTask: FrameGraphClearTextureTask;\r\n private readonly _renderLightingVolumeTask: FrameGraphObjectRendererTask;\r\n private readonly _blendLightingVolumeTask: FrameGraphVolumetricLightingBlendVolumeTask;\r\n private _renderLightingVolumeMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a new FrameGraphVolumetricLightingTask.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph to which the task belongs.\r\n * @param enableExtinction Whether to enable extinction in the volumetric lighting effect (default: false). If you don't plan to set extinction to something different than (0, 0, 0), you can disable this to save some performance.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, enableExtinction = false) {\r\n super(name, frameGraph);\r\n\r\n this.enableExtinction = enableExtinction;\r\n\r\n const isWebGPU = this._frameGraph.engine.isWebGPU;\r\n\r\n this._renderLightingVolumeMaterial = new ShaderMaterial(`${name} - render lighting volume`, this._frameGraph.scene, \"volumetricLightingRenderVolume\", {\r\n attributes: [\"position\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n uniforms: [\"world\", \"viewProjection\", \"vEyePosition\", \"lightDir\", \"invViewProjection\", \"outputTextureSize\", \"extinctionPhaseG\", \"lightPower\", \"textureRatio\"],\r\n samplers: [\"depthTexture\"],\r\n defines: enableExtinction ? [\"USE_EXTINCTION\"] : [],\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n needAlphaBlending: true,\r\n });\r\n this._renderLightingVolumeMaterial.backFaceCulling = false;\r\n this._renderLightingVolumeMaterial.alphaMode = Constants.ALPHA_ADD;\r\n this._renderLightingVolumeMaterial.onBindObservable.add(() => {\r\n this._renderLightingVolumeMaterial.bindEyePosition(this._renderLightingVolumeMaterial.getEffect());\r\n });\r\n\r\n this._clearLightingVolumeTextureTask = new FrameGraphClearTextureTask(`clear lighting volume texture`, frameGraph);\r\n this._renderLightingVolumeTask = new FrameGraphObjectRendererTask(`render lighting volume`, frameGraph, frameGraph.scene);\r\n this._blendLightingVolumeTask = new FrameGraphVolumetricLightingBlendVolumeTask(`blend lighting volume texture`, frameGraph, enableExtinction);\r\n\r\n this.onTexturesAllocatedObservable.add(() => {\r\n this._renderLightingVolumeMaterial.setInternalTexture(\"depthTexture\", frameGraph.textureManager.getTextureFromHandle(this.depthTexture)!);\r\n });\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n\r\n // Triggers the setters to set the uniforms\r\n this.phaseG = this._extinctionPhaseG.w;\r\n this.extinction = new Vector3(this.extinction.x, this.extinction.y, this.extinction.z);\r\n this.lightPower = this._lightPower;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public override initAsync(): Promise<unknown> {\r\n if (this._frameGraph.engine.isWebGPU) {\r\n return Promise.all([import(\"../../../ShadersWGSL/volumetricLightingRenderVolume.vertex\"), import(\"../../../ShadersWGSL/volumetricLightingRenderVolume.fragment\")]);\r\n }\r\n\r\n return Promise.all([import(\"../../../Shaders/volumetricLightingRenderVolume.vertex\"), import(\"../../../Shaders/volumetricLightingRenderVolume.fragment\")]);\r\n }\r\n\r\n public override isReady() {\r\n return (\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._clearLightingVolumeTextureTask.isReady() &&\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._blendLightingVolumeTask.isReady()\r\n );\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphVolumetricLightingTask\";\r\n }\r\n\r\n public record(skipCreationOfDisabledPasses = false) {\r\n if (this.targetTexture === undefined || this.depthTexture === undefined || this.camera === undefined || this.lightingVolumeMesh === undefined || this.light === undefined) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": targetTexture, depthTexture, camera, lightingVolumeMesh and light are required`);\r\n }\r\n if (!this.lightingVolumeMesh.meshes || this.lightingVolumeMesh.meshes.length === 0) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": lightingVolumeMesh is empty`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n\r\n let lightingVolumeTexture = this.lightingVolumeTexture;\r\n if (!lightingVolumeTexture) {\r\n const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);\r\n\r\n targetTextureCreationOptions.options.labels = [\"InScattering\"];\r\n targetTextureCreationOptions.options.samples = 1;\r\n\r\n lightingVolumeTexture = textureManager.createRenderTargetTexture(`${this.name} - lighting volume texture`, targetTextureCreationOptions);\r\n }\r\n\r\n this.lightingVolumeMesh.meshes[0].material = this._renderLightingVolumeMaterial;\r\n\r\n const targetTextureSize = textureManager.getTextureAbsoluteDimensions(this.targetTexture);\r\n const volumeTextureSize = textureManager.getTextureAbsoluteDimensions(lightingVolumeTexture);\r\n\r\n this._renderLightingVolumeMaterial.setVector2(\r\n \"textureRatio\",\r\n new Vector2(targetTextureSize.width / volumeTextureSize.width, targetTextureSize.height / volumeTextureSize.height)\r\n );\r\n this._renderLightingVolumeMaterial.setVector2(\"outputTextureSize\", new Vector2(volumeTextureSize.width, volumeTextureSize.height));\r\n\r\n const passUpdateMaterial = this._frameGraph.addPass(this.name);\r\n\r\n passUpdateMaterial.setExecuteFunc(() => {\r\n this.camera.getTransformationMatrix().invertToRef(InvViewProjectionMatrix);\r\n\r\n this._renderLightingVolumeMaterial.setMatrix(\"invViewProjection\", InvViewProjectionMatrix);\r\n this._renderLightingVolumeMaterial.setVector3(\"lightDir\", this.light.direction.normalizeToRef(TmpVectors.Vector3[0]));\r\n });\r\n\r\n this._clearLightingVolumeTextureTask.clearColor = true;\r\n this._clearLightingVolumeTextureTask.clearStencil = this.enableExtinction;\r\n this._clearLightingVolumeTextureTask.color = new Color4(0, 0, 0, 1);\r\n this._clearLightingVolumeTextureTask.stencilValue = 0;\r\n this._clearLightingVolumeTextureTask.targetTexture = lightingVolumeTexture;\r\n this._clearLightingVolumeTextureTask.record(true);\r\n\r\n this._renderLightingVolumeTask.targetTexture = this._clearLightingVolumeTextureTask.outputTexture;\r\n this._renderLightingVolumeTask.objectList = this.lightingVolumeMesh;\r\n this._renderLightingVolumeTask.camera = this.camera;\r\n this._renderLightingVolumeTask.disableImageProcessing = true;\r\n this._renderLightingVolumeTask.depthTest = false;\r\n this._renderLightingVolumeTask.record(true);\r\n\r\n this._blendLightingVolumeTask.sourceTexture = this._renderLightingVolumeTask.outputTexture;\r\n this._blendLightingVolumeTask.sourceSamplingMode = this.sourceSamplingMode;\r\n this._blendLightingVolumeTask.targetTexture = this.targetTexture;\r\n this._blendLightingVolumeTask.depthTexture = this.depthTexture;\r\n this._blendLightingVolumeTask.camera = this.camera;\r\n this._blendLightingVolumeTask.record(true);\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const disabledPass = this._frameGraph.addPass(this.name + \"_disabled\", true);\r\n\r\n disabledPass.setExecuteFunc(() => {});\r\n }\r\n }\r\n\r\n public override dispose() {\r\n this._renderLightingVolumeMaterial?.dispose();\r\n this._clearLightingVolumeTextureTask.dispose();\r\n this._renderLightingVolumeTask.dispose();\r\n this._blendLightingVolumeTask.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"volumetricLightingTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Camera, DirectionalLight, FrameGraph, FrameGraphObjectList, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphVolumetricLightingBlendVolumeTask } from \"./volumetricLightingBlendVolumeTask\";\r\nimport { Matrix, TmpVectors, Vector2, Vector3, Vector4 } from \"core/Maths/math.vector\";\r\nimport { Color3, Color4 } from \"core/Maths/math.color\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { FrameGraphClearTextureTask } from \"../Texture/clearTextureTask\";\r\nimport { FrameGraphObjectRendererTask } from \"../Rendering/objectRendererTask\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\nconst InvViewProjectionMatrix = new Matrix();\r\n\r\n/**\r\n * A frame graph task that performs volumetric lighting.\r\n */\r\nexport class FrameGraphVolumetricLightingTask extends FrameGraphTask {\r\n /**\r\n * The target texture to which the volumetric lighting will be applied.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The sampling mode to use when blending the volumetric lighting texture with targetTexture.\r\n */\r\n public sourceSamplingMode = Constants.TEXTURE_BILINEAR_SAMPLINGMODE;\r\n\r\n /**\r\n * The depth texture used for volumetric lighting calculations.\r\n * It must be the depth texture used to generate targetTexture.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n private _camera: Camera;\r\n /**\r\n * The camera used for volumetric lighting calculations.\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n public set camera(value: Camera) {\r\n if (this._camera === value) {\r\n return;\r\n }\r\n this._camera = value;\r\n this._renderLightingVolumeTask.camera = value;\r\n this._blendLightingVolumeTask.camera = value;\r\n }\r\n\r\n /**\r\n * The mesh representing the lighting volume.\r\n * This is the mesh that will be rendered to create the volumetric lighting effect.\r\n */\r\n public lightingVolumeMesh: FrameGraphObjectList;\r\n\r\n /**\r\n * The directional light used for volumetric lighting.\r\n */\r\n public light: DirectionalLight;\r\n\r\n /**\r\n * The lighting volume texture (optional).\r\n * If not provided, a new texture will be created, with the same size, format and type as targetTexture.\r\n * This is the texture that will store the volumetric lighting information, before being blended to targetTexture.\r\n */\r\n public lightingVolumeTexture?: FrameGraphTextureHandle;\r\n\r\n private _extinctionPhaseG = new Vector4(0, 0, 0, 0);\r\n\r\n /**\r\n * The phase G parameter for the volumetric lighting effect (default: 0).\r\n * This parameter controls the anisotropy of the scattering.\r\n * A value of 0 means isotropic scattering, while a value of 1 means forward scattering and -1 means backward scattering.\r\n */\r\n public get phaseG() {\r\n return this._extinctionPhaseG.w;\r\n }\r\n\r\n public set phaseG(value: number) {\r\n this._extinctionPhaseG.w = value;\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n }\r\n\r\n /**\r\n * Whether to enable extinction in the volumetric lighting effect (default: false).\r\n * Read-only property set in the constructor.\r\n */\r\n public readonly enableExtinction: boolean;\r\n\r\n /**\r\n * The extinction coefficient for the volumetric lighting effect (default: (0, 0, 0) - no extinction).\r\n * This parameter controls how much light is absorbed and scattered as it travels through the medium.\r\n * Will only have an effect if enableExtinction is set to true in the constructor!\r\n */\r\n public get extinction() {\r\n return this._blendLightingVolumeTask.postProcess.extinction;\r\n }\r\n\r\n public set extinction(value: Vector3) {\r\n this._extinctionPhaseG.x = Math.max(value.x, 1e-6);\r\n this._extinctionPhaseG.y = Math.max(value.y, 1e-6);\r\n this._extinctionPhaseG.z = Math.max(value.z, 1e-6);\r\n this._renderLightingVolumeMaterial.setVector4(\"extinctionPhaseG\", this._extinctionPhaseG);\r\n this._blendLightingVolumeTask.postProcess.extinction.copyFromFloats(this._extinctionPhaseG.x, this._extinctionPhaseG.y, this._extinctionPhaseG.z);\r\n }\r\n\r\n private _lightPower = new Color3(1, 1, 1);\r\n\r\n /**\r\n * The light power/color for the volumetric lighting effect (default: (1, 1, 1)).\r\n * This parameter controls the intensity and color of the light used for volumetric lighting.\r\n */\r\n public get lightPower() {\r\n return this._lightPower;\r\n }\r\n\r\n public set lightPower(value: Color3) {\r\n this._lightPower.copyFrom(value);\r\n this._renderLightingVolumeMaterial.setColor3(\"lightPower\", this._lightPower);\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(name: string) {\r\n this._name = name;\r\n if (this._renderLightingVolumeMaterial) {\r\n this._renderLightingVolumeMaterial.name = `${name} - render lighting volume`;\r\n }\r\n if (this._clearLightingVolumeTextureTask) {\r\n this._clearLightingVolumeTextureTask.name = `${name} - clear lighting volume texture`;\r\n }\r\n if (this._renderLightingVolumeTask) {\r\n this._renderLightingVolumeTask.name = `${name} - render lighting volume`;\r\n }\r\n if (this._blendLightingVolumeTask) {\r\n this._blendLightingVolumeTask.name = `${name} - blend lighting volume`;\r\n }\r\n }\r\n\r\n /**\r\n * The output texture of the task. It will be the same as targetTexture.\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n private readonly _clearLightingVolumeTextureTask: FrameGraphClearTextureTask;\r\n private readonly _renderLightingVolumeTask: FrameGraphObjectRendererTask;\r\n private readonly _blendLightingVolumeTask: FrameGraphVolumetricLightingBlendVolumeTask;\r\n private _renderLightingVolumeMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a new FrameGraphVolumetricLightingTask.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph to which the task belongs.\r\n * @param enableExtinction Whether to enable extinction in the volumetric lighting effect (default: false). If you don't plan to set extinction to something different than (0, 0, 0), you can disable this to save some performance.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, enableExtinction = false) {\r\n super(name, frameGraph);\r\n\r\n this.enableExtinction = enableExtinction;\r\n\r\n const isWebGPU = this._frameGraph.engine.isWebGPU;\r\n\r\n this._renderLightingVolumeMaterial = new ShaderMaterial(`${name} - render lighting volume`, this._frameGraph.scene, \"volumetricLightingRenderVolume\", {\r\n attributes: [\"position\"],\r\n uniformBuffers: [\"Scene\", \"Mesh\"],\r\n uniforms: [\"world\", \"viewProjection\", \"vEyePosition\", \"lightDir\", \"invViewProjection\", \"outputTextureSize\", \"extinctionPhaseG\", \"lightPower\", \"textureRatio\"],\r\n samplers: [\"depthTexture\"],\r\n defines: enableExtinction ? [\"USE_EXTINCTION\"] : [],\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n needAlphaBlending: true,\r\n });\r\n this._renderLightingVolumeMaterial.backFaceCulling = false;\r\n this._renderLightingVolumeMaterial.alphaMode = Constants.ALPHA_ADD;\r\n this._renderLightingVolumeMaterial.onBindObservable.add(() => {\r\n this._renderLightingVolumeMaterial.bindEyePosition(this._renderLightingVolumeMaterial.getEffect());\r\n });\r\n\r\n this._clearLightingVolumeTextureTask = new FrameGraphClearTextureTask(`clear lighting volume texture`, frameGraph);\r\n this._renderLightingVolumeTask = new FrameGraphObjectRendererTask(`render lighting volume`, frameGraph, frameGraph.scene);\r\n this._blendLightingVolumeTask = new FrameGraphVolumetricLightingBlendVolumeTask(`blend lighting volume texture`, frameGraph, enableExtinction);\r\n\r\n this.onTexturesAllocatedObservable.add(() => {\r\n this._renderLightingVolumeMaterial.setInternalTexture(\"depthTexture\", frameGraph.textureManager.getTextureFromHandle(this.depthTexture)!);\r\n });\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n\r\n // Triggers the setters to set the uniforms\r\n this.phaseG = this._extinctionPhaseG.w;\r\n this.extinction = new Vector3(this.extinction.x, this.extinction.y, this.extinction.z);\r\n this.lightPower = this._lightPower;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public override initAsync(): Promise<unknown> {\r\n if (this._frameGraph.engine.isWebGPU) {\r\n return Promise.all([import(\"../../../ShadersWGSL/volumetricLightingRenderVolume.vertex\"), import(\"../../../ShadersWGSL/volumetricLightingRenderVolume.fragment\")]);\r\n }\r\n\r\n return Promise.all([import(\"../../../Shaders/volumetricLightingRenderVolume.vertex\"), import(\"../../../Shaders/volumetricLightingRenderVolume.fragment\")]);\r\n }\r\n\r\n public override isReady() {\r\n return (\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._clearLightingVolumeTextureTask.isReady() &&\r\n this._renderLightingVolumeMaterial.isReady() &&\r\n this._blendLightingVolumeTask.isReady()\r\n );\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphVolumetricLightingTask\";\r\n }\r\n\r\n public record(skipCreationOfDisabledPasses = false) {\r\n if (this.targetTexture === undefined || this.depthTexture === undefined || this.camera === undefined || this.lightingVolumeMesh === undefined || this.light === undefined) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": targetTexture, depthTexture, camera, lightingVolumeMesh and light are required`);\r\n }\r\n if (!this.lightingVolumeMesh.meshes || this.lightingVolumeMesh.meshes.length === 0) {\r\n throw new Error(`FrameGraphVolumetricLightingTask \"${this.name}\": lightingVolumeMesh is empty`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const textureManager = this._frameGraph.textureManager;\r\n\r\n let lightingVolumeTexture = this.lightingVolumeTexture;\r\n if (!lightingVolumeTexture) {\r\n const targetTextureCreationOptions = textureManager.getTextureCreationOptions(this.targetTexture);\r\n\r\n targetTextureCreationOptions.options.labels = [\"InScattering\"];\r\n targetTextureCreationOptions.options.samples = 1;\r\n\r\n lightingVolumeTexture = textureManager.createRenderTargetTexture(`${this.name} - lighting volume texture`, targetTextureCreationOptions);\r\n }\r\n\r\n this.lightingVolumeMesh.meshes[0].material = this._renderLightingVolumeMaterial;\r\n\r\n const targetTextureSize = textureManager.getTextureAbsoluteDimensions(this.targetTexture);\r\n const volumeTextureSize = textureManager.getTextureAbsoluteDimensions(lightingVolumeTexture);\r\n\r\n this._renderLightingVolumeMaterial.setVector2(\r\n \"textureRatio\",\r\n new Vector2(targetTextureSize.width / volumeTextureSize.width, targetTextureSize.height / volumeTextureSize.height)\r\n );\r\n this._renderLightingVolumeMaterial.setVector2(\"outputTextureSize\", new Vector2(volumeTextureSize.width, volumeTextureSize.height));\r\n\r\n const passUpdateMaterial = this._frameGraph.addPass(this.name);\r\n\r\n passUpdateMaterial.setExecuteFunc(() => {\r\n this.camera.getTransformationMatrix().invertToRef(InvViewProjectionMatrix);\r\n\r\n this._renderLightingVolumeMaterial.setMatrix(\"invViewProjection\", InvViewProjectionMatrix);\r\n this._renderLightingVolumeMaterial.setVector3(\"lightDir\", this.light.direction.normalizeToRef(TmpVectors.Vector3[0]));\r\n });\r\n\r\n this._clearLightingVolumeTextureTask.clearColor = true;\r\n this._clearLightingVolumeTextureTask.clearStencil = this.enableExtinction;\r\n this._clearLightingVolumeTextureTask.color = new Color4(0, 0, 0, 1);\r\n this._clearLightingVolumeTextureTask.stencilValue = 0;\r\n this._clearLightingVolumeTextureTask.targetTexture = lightingVolumeTexture;\r\n this._clearLightingVolumeTextureTask.record(true);\r\n\r\n this._renderLightingVolumeTask.targetTexture = this._clearLightingVolumeTextureTask.outputTexture;\r\n this._renderLightingVolumeTask.objectList = this.lightingVolumeMesh;\r\n this._renderLightingVolumeTask.camera = this.camera;\r\n this._renderLightingVolumeTask.disableImageProcessing = true;\r\n this._renderLightingVolumeTask.depthTest = false;\r\n this._renderLightingVolumeTask.record(true);\r\n\r\n this._blendLightingVolumeTask.sourceTexture = this._renderLightingVolumeTask.outputTexture;\r\n this._blendLightingVolumeTask.sourceSamplingMode = this.sourceSamplingMode;\r\n this._blendLightingVolumeTask.targetTexture = this.targetTexture;\r\n this._blendLightingVolumeTask.depthTexture = this.depthTexture;\r\n this._blendLightingVolumeTask.camera = this.camera;\r\n this._blendLightingVolumeTask.record(true);\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const disabledPass = this._frameGraph.addPass(this.name + \"_disabled\", true);\r\n\r\n disabledPass.setExecuteFunc(() => {});\r\n }\r\n }\r\n\r\n public override dispose() {\r\n this._renderLightingVolumeMaterial?.dispose();\r\n this._clearLightingVolumeTextureTask.dispose();\r\n this._renderLightingVolumeTask.dispose();\r\n this._blendLightingVolumeTask.dispose();\r\n super.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -87,8 +87,8 @@ export declare class FrameGraphCascadedShadowGeneratorTask extends FrameGraphSha
|
|
|
87
87
|
* @param frameGraph The frame graph the task belongs to.
|
|
88
88
|
*/
|
|
89
89
|
constructor(name: string, frameGraph: FrameGraph);
|
|
90
|
-
protected
|
|
91
|
-
protected
|
|
90
|
+
protected _createShadowGeneratorInstance(): void;
|
|
91
|
+
protected _createShadowGenerator(): boolean | undefined;
|
|
92
92
|
getClassName(): string;
|
|
93
93
|
record(): void;
|
|
94
94
|
dispose(): void;
|
|
@@ -28,7 +28,10 @@ export class FrameGraphCascadedShadowGeneratorTask extends FrameGraphShadowGener
|
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
this._numCascades = value;
|
|
31
|
-
this.
|
|
31
|
+
if (this._shadowGenerator) {
|
|
32
|
+
this._shadowGenerator.numCascades = value;
|
|
33
|
+
this._updateShadowMap();
|
|
34
|
+
}
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
37
|
* Gets or sets a value indicating whether the shadow generator should display the cascades.
|
|
@@ -210,25 +213,28 @@ export class FrameGraphCascadedShadowGeneratorTask extends FrameGraphShadowGener
|
|
|
210
213
|
}
|
|
211
214
|
});
|
|
212
215
|
}
|
|
213
|
-
|
|
216
|
+
_createShadowGeneratorInstance() {
|
|
214
217
|
if (!(this.light instanceof DirectionalLight)) {
|
|
215
218
|
throw new Error(`FrameGraphCascadedShadowGeneratorTask ${this.name}: the CSM shadow generator only supports directional lights.`);
|
|
216
219
|
}
|
|
217
220
|
this._shadowGenerator = new CascadedShadowGenerator(this.mapSize, this.light, this.useFloat32TextureType, this.camera, this.useRedTextureFormat);
|
|
218
|
-
this._shadowGenerator.numCascades = this._numCascades;
|
|
219
221
|
}
|
|
220
|
-
|
|
221
|
-
super.
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
222
|
+
_createShadowGenerator() {
|
|
223
|
+
if (super._createShadowGenerator()) {
|
|
224
|
+
const shadowGenerator = this._shadowGenerator;
|
|
225
|
+
if (shadowGenerator === undefined) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
shadowGenerator.numCascades = this._numCascades;
|
|
229
|
+
shadowGenerator.debug = this._debug;
|
|
230
|
+
shadowGenerator.stabilizeCascades = this._stabilizeCascades;
|
|
231
|
+
shadowGenerator.lambda = this._lambda;
|
|
232
|
+
shadowGenerator.cascadeBlendPercentage = this._cascadeBlendPercentage;
|
|
233
|
+
shadowGenerator.depthClamp = this._depthClamp;
|
|
234
|
+
shadowGenerator.shadowMaxZ = this._shadowMaxZ;
|
|
235
|
+
return true;
|
|
225
236
|
}
|
|
226
|
-
|
|
227
|
-
shadowGenerator.stabilizeCascades = this._stabilizeCascades;
|
|
228
|
-
shadowGenerator.lambda = this._lambda;
|
|
229
|
-
shadowGenerator.cascadeBlendPercentage = this._cascadeBlendPercentage;
|
|
230
|
-
shadowGenerator.depthClamp = this._depthClamp;
|
|
231
|
-
shadowGenerator.shadowMaxZ = this._shadowMaxZ;
|
|
237
|
+
return false;
|
|
232
238
|
}
|
|
233
239
|
getClassName() {
|
|
234
240
|
return "FrameGraphCascadedShadowGeneratorTask";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csmShadowGeneratorTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphTextureHandle, FrameGraph } from \"core/index\";\r\nimport { CascadedShadowGenerator } from \"../../../Lights/Shadows/cascadedShadowGenerator\";\r\nimport { FrameGraphShadowGeneratorTask } from \"./shadowGeneratorTask\";\r\nimport { DirectionalLight } from \"../../../Lights/directionalLight\";\r\nimport { DepthTextureType, ThinMinMaxReducer } from \"../../../Misc/thinMinMaxReducer\";\r\nimport { FrameGraphPostProcessTask } from \"../PostProcesses/postProcessTask\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { textureSizeIsObject } from \"../../../Materials/Textures/textureCreationOptions\";\r\n\r\n/**\r\n * Task used to generate a cascaded shadow map from a list of objects.\r\n */\r\nexport class FrameGraphCascadedShadowGeneratorTask extends FrameGraphShadowGeneratorTask {\r\n protected override _shadowGenerator: CascadedShadowGenerator | undefined;\r\n\r\n /**\r\n * Checks if a shadow generator task is a cascaded shadow generator task.\r\n * @param task The task to check.\r\n * @returns True if the task is a cascaded shadow generator task, else false.\r\n */\r\n public static IsCascadedShadowGenerator(task: FrameGraphShadowGeneratorTask): task is FrameGraphCascadedShadowGeneratorTask {\r\n return (task as FrameGraphCascadedShadowGeneratorTask).numCascades !== undefined;\r\n }\r\n\r\n /**\r\n * The depth texture used by the autoCalcDepthBounds feature (optional if autoCalcDepthBounds is set to false).\r\n * This texture is used to compute the min/max depth bounds of the scene to setup the cascaded shadow generator.\r\n * The texture should contain either “view,” “normalized view,” or “screen” depth values - if possible, connect “normalized view,” or “screen” for best performance.\r\n * Warning: Do not set a texture if you are not using the autoCalcDepthBounds feature, to avoid generating a depth texture that will not be used.\r\n */\r\n public depthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The type of the depth texture used by the autoCalcDepthBounds feature.\r\n */\r\n public depthTextureType: DepthTextureType = DepthTextureType.NormalizedViewDepth;\r\n\r\n private _numCascades = CascadedShadowGenerator.DEFAULT_CASCADES_COUNT;\r\n /**\r\n * The number of cascades.\r\n */\r\n public get numCascades() {\r\n return this._numCascades;\r\n }\r\n\r\n public set numCascades(value: number) {\r\n if (value === this._numCascades) {\r\n return;\r\n }\r\n\r\n this._numCascades = value;\r\n this._setupShadowGenerator();\r\n }\r\n\r\n private _debug = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should display the cascades.\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(value: boolean) {\r\n if (value === this._debug) {\r\n return;\r\n }\r\n\r\n this._debug = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.debug = value;\r\n }\r\n }\r\n\r\n private _stabilizeCascades = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should stabilize the cascades.\r\n */\r\n public get stabilizeCascades() {\r\n return this._stabilizeCascades;\r\n }\r\n\r\n public set stabilizeCascades(value: boolean) {\r\n if (value === this._stabilizeCascades) {\r\n return;\r\n }\r\n\r\n this._stabilizeCascades = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.stabilizeCascades = value;\r\n }\r\n }\r\n\r\n private _lambda = 0.5;\r\n /**\r\n * Gets or sets the lambda parameter of the shadow generator.\r\n */\r\n public get lambda() {\r\n return this._lambda;\r\n }\r\n\r\n public set lambda(value: number) {\r\n if (value === this._lambda) {\r\n return;\r\n }\r\n\r\n this._lambda = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.lambda = value;\r\n }\r\n }\r\n\r\n private _cascadeBlendPercentage = 0.1;\r\n /**\r\n * Gets or sets the cascade blend percentage.\r\n */\r\n public get cascadeBlendPercentage() {\r\n return this._cascadeBlendPercentage;\r\n }\r\n\r\n public set cascadeBlendPercentage(value: number) {\r\n if (value === this._cascadeBlendPercentage) {\r\n return;\r\n }\r\n\r\n this._cascadeBlendPercentage = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.cascadeBlendPercentage = value;\r\n }\r\n }\r\n\r\n private _depthClamp = true;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should use depth clamping.\r\n */\r\n public get depthClamp() {\r\n return this._depthClamp;\r\n }\r\n\r\n public set depthClamp(value: boolean) {\r\n if (value === this._depthClamp) {\r\n return;\r\n }\r\n\r\n this._depthClamp = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.depthClamp = value;\r\n }\r\n }\r\n\r\n private _autoCalcDepthBounds = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should automatically calculate the depth bounds.\r\n */\r\n public get autoCalcDepthBounds() {\r\n return this._autoCalcDepthBounds;\r\n }\r\n\r\n public set autoCalcDepthBounds(value: boolean) {\r\n if (value === this._autoCalcDepthBounds) {\r\n return;\r\n }\r\n\r\n this._autoCalcDepthBounds = value;\r\n this._currentAutoCalcDepthBoundsCounter = this._autoCalcDepthBoundsRefreshRate;\r\n\r\n if (!value) {\r\n this._shadowGenerator?.setMinMaxDistance(0, 1);\r\n }\r\n\r\n // All passes but the last one are related to min/max reduction and should be enabled/disabled depending on autoCalcDepthBounds value\r\n const passes = this.passes;\r\n for (let i = 0; i < passes.length - 1; ++i) {\r\n passes[i].disabled = !value;\r\n }\r\n }\r\n\r\n private _currentAutoCalcDepthBoundsCounter = 0;\r\n private _autoCalcDepthBoundsRefreshRate = 1;\r\n /**\r\n * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get autoCalcDepthBoundsRefreshRate() {\r\n return this._autoCalcDepthBoundsRefreshRate;\r\n }\r\n\r\n public set autoCalcDepthBoundsRefreshRate(value: number) {\r\n this._autoCalcDepthBoundsRefreshRate = value;\r\n this._currentAutoCalcDepthBoundsCounter = this._autoCalcDepthBoundsRefreshRate;\r\n }\r\n\r\n private _shadowMaxZ = 10000;\r\n /**\r\n * Gets or sets the maximum shadow Z value.\r\n */\r\n public get shadowMaxZ() {\r\n return this._shadowMaxZ;\r\n }\r\n\r\n public set shadowMaxZ(value: number) {\r\n if (value === this._shadowMaxZ) {\r\n return;\r\n }\r\n\r\n this._shadowMaxZ = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.shadowMaxZ = value;\r\n }\r\n }\r\n\r\n protected readonly _thinMinMaxReducer: ThinMinMaxReducer;\r\n\r\n /**\r\n * Creates a new shadow generator task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph the task belongs to.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n super(name, frameGraph);\r\n\r\n this._thinMinMaxReducer = new ThinMinMaxReducer(frameGraph.scene);\r\n\r\n this._thinMinMaxReducer.onAfterReductionPerformed.add((minmax: { min: number; max: number }) => {\r\n if (!this._shadowGenerator) {\r\n return;\r\n }\r\n\r\n const camera = this.camera;\r\n\r\n let min = minmax.min,\r\n max = minmax.max;\r\n\r\n if (min >= max) {\r\n min = 0;\r\n max = 1;\r\n } else if (camera && this.depthTextureType !== DepthTextureType.NormalizedViewDepth) {\r\n if (this.depthTextureType === DepthTextureType.ScreenDepth) {\r\n const engine = this._frameGraph.engine;\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n const p2z = projectionMatrix.m[10];\r\n const p3z = projectionMatrix.m[14];\r\n\r\n if (!engine.isNDCHalfZRange) {\r\n // Convert to NDC depth\r\n min = min * 2 - 1;\r\n max = max * 2 - 1;\r\n }\r\n\r\n // Convert to view depth\r\n min = p3z / (min - p2z);\r\n max = p3z / (max - p2z);\r\n }\r\n\r\n // Convert to normalized view depth\r\n const zNear = camera.minZ;\r\n const zFar = camera.maxZ;\r\n\r\n min = (min - zNear) / (zFar - zNear);\r\n max = (max - zNear) / (zFar - zNear);\r\n }\r\n\r\n if (min !== this._shadowGenerator.minDistance || max !== this._shadowGenerator.maxDistance) {\r\n this._shadowGenerator.setMinMaxDistance(min, max);\r\n }\r\n });\r\n }\r\n\r\n protected override _createShadowGenerator() {\r\n if (!(this.light instanceof DirectionalLight)) {\r\n throw new Error(`FrameGraphCascadedShadowGeneratorTask ${this.name}: the CSM shadow generator only supports directional lights.`);\r\n }\r\n this._shadowGenerator = new CascadedShadowGenerator(this.mapSize, this.light, this.useFloat32TextureType, this.camera, this.useRedTextureFormat);\r\n this._shadowGenerator.numCascades = this._numCascades;\r\n }\r\n\r\n protected override _setupShadowGenerator() {\r\n super._setupShadowGenerator();\r\n\r\n const shadowGenerator = this._shadowGenerator;\r\n if (shadowGenerator === undefined) {\r\n return;\r\n }\r\n\r\n shadowGenerator.debug = this._debug;\r\n shadowGenerator.stabilizeCascades = this._stabilizeCascades;\r\n shadowGenerator.lambda = this._lambda;\r\n shadowGenerator.cascadeBlendPercentage = this._cascadeBlendPercentage;\r\n shadowGenerator.depthClamp = this._depthClamp;\r\n shadowGenerator.shadowMaxZ = this._shadowMaxZ;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphCascadedShadowGeneratorTask\";\r\n }\r\n\r\n public override record() {\r\n if (this.light === undefined || this.objectList === undefined || this.camera === undefined) {\r\n throw new Error(`FrameGraphCascadedShadowGeneratorTask ${this.name}: light, objectList and camera are required`);\r\n }\r\n\r\n if (this.depthTexture !== undefined) {\r\n const depthTextureCreationOptions = this._frameGraph.textureManager.getTextureCreationOptions(this.depthTexture);\r\n\r\n const size = !depthTextureCreationOptions.sizeIsPercentage\r\n ? textureSizeIsObject(depthTextureCreationOptions.size)\r\n ? depthTextureCreationOptions.size\r\n : { width: depthTextureCreationOptions.size, height: depthTextureCreationOptions.size }\r\n : this._frameGraph.textureManager.getAbsoluteDimensions(depthTextureCreationOptions.size);\r\n\r\n const width = size.width;\r\n const height = size.height;\r\n\r\n depthTextureCreationOptions.sizeIsPercentage = false;\r\n depthTextureCreationOptions.options.formats = [Constants.TEXTUREFORMAT_RG];\r\n depthTextureCreationOptions.options.samples = 1;\r\n\r\n this._thinMinMaxReducer.setTextureDimensions(width, height, this.depthTextureType);\r\n\r\n const reductionSteps = this._thinMinMaxReducer.reductionSteps;\r\n\r\n let targetTexture: FrameGraphTextureHandle;\r\n\r\n this._frameGraph.addPass(`${this.name} Before Min Max Reduction`).setExecuteFunc((context) => {\r\n context.pushDebugGroup(`Min Max Reduction`);\r\n });\r\n\r\n for (let i = 0; i < reductionSteps.length - 1; ++i) {\r\n const reductionStep = reductionSteps[i];\r\n\r\n depthTextureCreationOptions.size = { width: reductionSteps[i + 1].textureWidth, height: reductionSteps[i + 1].textureHeight };\r\n\r\n const postProcess = new FrameGraphPostProcessTask(reductionStep.name, this._frameGraph, reductionStep);\r\n\r\n postProcess.sourceTexture = i == 0 ? this.depthTexture : targetTexture!;\r\n postProcess.sourceSamplingMode = Constants.TEXTURE_NEAREST_NEAREST;\r\n postProcess.targetTexture = this._frameGraph.textureManager.createRenderTargetTexture(`${this.name} ${reductionStep.name}`, depthTextureCreationOptions);\r\n\r\n postProcess.record(true);\r\n\r\n targetTexture = postProcess.outputTexture;\r\n }\r\n\r\n this._frameGraph.addPass(`${this.name} After Min Max Reduction`).setExecuteFunc((context) => {\r\n context.popDebugGroup();\r\n if (this._autoCalcDepthBounds && this._currentAutoCalcDepthBoundsCounter >= 0) {\r\n if (++this._currentAutoCalcDepthBoundsCounter >= this._autoCalcDepthBoundsRefreshRate) {\r\n const minMaxTexture = context.getTextureFromHandle(targetTexture!);\r\n if (minMaxTexture) {\r\n this._thinMinMaxReducer.readMinMax(minMaxTexture);\r\n }\r\n }\r\n this._currentAutoCalcDepthBoundsCounter %= this._autoCalcDepthBoundsRefreshRate;\r\n if (this._autoCalcDepthBoundsRefreshRate === 0) {\r\n this._currentAutoCalcDepthBoundsCounter = -1;\r\n }\r\n }\r\n });\r\n }\r\n\r\n super.record();\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n this._thinMinMaxReducer.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"csmShadowGeneratorTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraphTextureHandle, FrameGraph } from \"core/index\";\r\nimport { CascadedShadowGenerator } from \"../../../Lights/Shadows/cascadedShadowGenerator\";\r\nimport { FrameGraphShadowGeneratorTask } from \"./shadowGeneratorTask\";\r\nimport { DirectionalLight } from \"../../../Lights/directionalLight\";\r\nimport { DepthTextureType, ThinMinMaxReducer } from \"../../../Misc/thinMinMaxReducer\";\r\nimport { FrameGraphPostProcessTask } from \"../PostProcesses/postProcessTask\";\r\nimport { Constants } from \"../../../Engines/constants\";\r\nimport { textureSizeIsObject } from \"../../../Materials/Textures/textureCreationOptions\";\r\n\r\n/**\r\n * Task used to generate a cascaded shadow map from a list of objects.\r\n */\r\nexport class FrameGraphCascadedShadowGeneratorTask extends FrameGraphShadowGeneratorTask {\r\n protected override _shadowGenerator: CascadedShadowGenerator | undefined;\r\n\r\n /**\r\n * Checks if a shadow generator task is a cascaded shadow generator task.\r\n * @param task The task to check.\r\n * @returns True if the task is a cascaded shadow generator task, else false.\r\n */\r\n public static IsCascadedShadowGenerator(task: FrameGraphShadowGeneratorTask): task is FrameGraphCascadedShadowGeneratorTask {\r\n return (task as FrameGraphCascadedShadowGeneratorTask).numCascades !== undefined;\r\n }\r\n\r\n /**\r\n * The depth texture used by the autoCalcDepthBounds feature (optional if autoCalcDepthBounds is set to false).\r\n * This texture is used to compute the min/max depth bounds of the scene to setup the cascaded shadow generator.\r\n * The texture should contain either “view,” “normalized view,” or “screen” depth values - if possible, connect “normalized view,” or “screen” for best performance.\r\n * Warning: Do not set a texture if you are not using the autoCalcDepthBounds feature, to avoid generating a depth texture that will not be used.\r\n */\r\n public depthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The type of the depth texture used by the autoCalcDepthBounds feature.\r\n */\r\n public depthTextureType: DepthTextureType = DepthTextureType.NormalizedViewDepth;\r\n\r\n private _numCascades = CascadedShadowGenerator.DEFAULT_CASCADES_COUNT;\r\n /**\r\n * The number of cascades.\r\n */\r\n public get numCascades() {\r\n return this._numCascades;\r\n }\r\n\r\n public set numCascades(value: number) {\r\n if (value === this._numCascades) {\r\n return;\r\n }\r\n\r\n this._numCascades = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.numCascades = value;\r\n this._updateShadowMap();\r\n }\r\n }\r\n\r\n private _debug = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should display the cascades.\r\n */\r\n public get debug() {\r\n return this._debug;\r\n }\r\n\r\n public set debug(value: boolean) {\r\n if (value === this._debug) {\r\n return;\r\n }\r\n\r\n this._debug = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.debug = value;\r\n }\r\n }\r\n\r\n private _stabilizeCascades = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should stabilize the cascades.\r\n */\r\n public get stabilizeCascades() {\r\n return this._stabilizeCascades;\r\n }\r\n\r\n public set stabilizeCascades(value: boolean) {\r\n if (value === this._stabilizeCascades) {\r\n return;\r\n }\r\n\r\n this._stabilizeCascades = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.stabilizeCascades = value;\r\n }\r\n }\r\n\r\n private _lambda = 0.5;\r\n /**\r\n * Gets or sets the lambda parameter of the shadow generator.\r\n */\r\n public get lambda() {\r\n return this._lambda;\r\n }\r\n\r\n public set lambda(value: number) {\r\n if (value === this._lambda) {\r\n return;\r\n }\r\n\r\n this._lambda = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.lambda = value;\r\n }\r\n }\r\n\r\n private _cascadeBlendPercentage = 0.1;\r\n /**\r\n * Gets or sets the cascade blend percentage.\r\n */\r\n public get cascadeBlendPercentage() {\r\n return this._cascadeBlendPercentage;\r\n }\r\n\r\n public set cascadeBlendPercentage(value: number) {\r\n if (value === this._cascadeBlendPercentage) {\r\n return;\r\n }\r\n\r\n this._cascadeBlendPercentage = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.cascadeBlendPercentage = value;\r\n }\r\n }\r\n\r\n private _depthClamp = true;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should use depth clamping.\r\n */\r\n public get depthClamp() {\r\n return this._depthClamp;\r\n }\r\n\r\n public set depthClamp(value: boolean) {\r\n if (value === this._depthClamp) {\r\n return;\r\n }\r\n\r\n this._depthClamp = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.depthClamp = value;\r\n }\r\n }\r\n\r\n private _autoCalcDepthBounds = false;\r\n /**\r\n * Gets or sets a value indicating whether the shadow generator should automatically calculate the depth bounds.\r\n */\r\n public get autoCalcDepthBounds() {\r\n return this._autoCalcDepthBounds;\r\n }\r\n\r\n public set autoCalcDepthBounds(value: boolean) {\r\n if (value === this._autoCalcDepthBounds) {\r\n return;\r\n }\r\n\r\n this._autoCalcDepthBounds = value;\r\n this._currentAutoCalcDepthBoundsCounter = this._autoCalcDepthBoundsRefreshRate;\r\n\r\n if (!value) {\r\n this._shadowGenerator?.setMinMaxDistance(0, 1);\r\n }\r\n\r\n // All passes but the last one are related to min/max reduction and should be enabled/disabled depending on autoCalcDepthBounds value\r\n const passes = this.passes;\r\n for (let i = 0; i < passes.length - 1; ++i) {\r\n passes[i].disabled = !value;\r\n }\r\n }\r\n\r\n private _currentAutoCalcDepthBoundsCounter = 0;\r\n private _autoCalcDepthBoundsRefreshRate = 1;\r\n /**\r\n * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true\r\n * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...\r\n */\r\n public get autoCalcDepthBoundsRefreshRate() {\r\n return this._autoCalcDepthBoundsRefreshRate;\r\n }\r\n\r\n public set autoCalcDepthBoundsRefreshRate(value: number) {\r\n this._autoCalcDepthBoundsRefreshRate = value;\r\n this._currentAutoCalcDepthBoundsCounter = this._autoCalcDepthBoundsRefreshRate;\r\n }\r\n\r\n private _shadowMaxZ = 10000;\r\n /**\r\n * Gets or sets the maximum shadow Z value.\r\n */\r\n public get shadowMaxZ() {\r\n return this._shadowMaxZ;\r\n }\r\n\r\n public set shadowMaxZ(value: number) {\r\n if (value === this._shadowMaxZ) {\r\n return;\r\n }\r\n\r\n this._shadowMaxZ = value;\r\n if (this._shadowGenerator) {\r\n this._shadowGenerator.shadowMaxZ = value;\r\n }\r\n }\r\n\r\n protected readonly _thinMinMaxReducer: ThinMinMaxReducer;\r\n\r\n /**\r\n * Creates a new shadow generator task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph the task belongs to.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n super(name, frameGraph);\r\n\r\n this._thinMinMaxReducer = new ThinMinMaxReducer(frameGraph.scene);\r\n\r\n this._thinMinMaxReducer.onAfterReductionPerformed.add((minmax: { min: number; max: number }) => {\r\n if (!this._shadowGenerator) {\r\n return;\r\n }\r\n\r\n const camera = this.camera;\r\n\r\n let min = minmax.min,\r\n max = minmax.max;\r\n\r\n if (min >= max) {\r\n min = 0;\r\n max = 1;\r\n } else if (camera && this.depthTextureType !== DepthTextureType.NormalizedViewDepth) {\r\n if (this.depthTextureType === DepthTextureType.ScreenDepth) {\r\n const engine = this._frameGraph.engine;\r\n const projectionMatrix = camera.getProjectionMatrix();\r\n const p2z = projectionMatrix.m[10];\r\n const p3z = projectionMatrix.m[14];\r\n\r\n if (!engine.isNDCHalfZRange) {\r\n // Convert to NDC depth\r\n min = min * 2 - 1;\r\n max = max * 2 - 1;\r\n }\r\n\r\n // Convert to view depth\r\n min = p3z / (min - p2z);\r\n max = p3z / (max - p2z);\r\n }\r\n\r\n // Convert to normalized view depth\r\n const zNear = camera.minZ;\r\n const zFar = camera.maxZ;\r\n\r\n min = (min - zNear) / (zFar - zNear);\r\n max = (max - zNear) / (zFar - zNear);\r\n }\r\n\r\n if (min !== this._shadowGenerator.minDistance || max !== this._shadowGenerator.maxDistance) {\r\n this._shadowGenerator.setMinMaxDistance(min, max);\r\n }\r\n });\r\n }\r\n\r\n protected override _createShadowGeneratorInstance() {\r\n if (!(this.light instanceof DirectionalLight)) {\r\n throw new Error(`FrameGraphCascadedShadowGeneratorTask ${this.name}: the CSM shadow generator only supports directional lights.`);\r\n }\r\n this._shadowGenerator = new CascadedShadowGenerator(this.mapSize, this.light, this.useFloat32TextureType, this.camera, this.useRedTextureFormat);\r\n }\r\n\r\n protected override _createShadowGenerator() {\r\n if (super._createShadowGenerator()) {\r\n const shadowGenerator = this._shadowGenerator;\r\n if (shadowGenerator === undefined) {\r\n return;\r\n }\r\n\r\n shadowGenerator.numCascades = this._numCascades;\r\n shadowGenerator.debug = this._debug;\r\n shadowGenerator.stabilizeCascades = this._stabilizeCascades;\r\n shadowGenerator.lambda = this._lambda;\r\n shadowGenerator.cascadeBlendPercentage = this._cascadeBlendPercentage;\r\n shadowGenerator.depthClamp = this._depthClamp;\r\n shadowGenerator.shadowMaxZ = this._shadowMaxZ;\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphCascadedShadowGeneratorTask\";\r\n }\r\n\r\n public override record() {\r\n if (this.light === undefined || this.objectList === undefined || this.camera === undefined) {\r\n throw new Error(`FrameGraphCascadedShadowGeneratorTask ${this.name}: light, objectList and camera are required`);\r\n }\r\n\r\n if (this.depthTexture !== undefined) {\r\n const depthTextureCreationOptions = this._frameGraph.textureManager.getTextureCreationOptions(this.depthTexture);\r\n\r\n const size = !depthTextureCreationOptions.sizeIsPercentage\r\n ? textureSizeIsObject(depthTextureCreationOptions.size)\r\n ? depthTextureCreationOptions.size\r\n : { width: depthTextureCreationOptions.size, height: depthTextureCreationOptions.size }\r\n : this._frameGraph.textureManager.getAbsoluteDimensions(depthTextureCreationOptions.size);\r\n\r\n const width = size.width;\r\n const height = size.height;\r\n\r\n depthTextureCreationOptions.sizeIsPercentage = false;\r\n depthTextureCreationOptions.options.formats = [Constants.TEXTUREFORMAT_RG];\r\n depthTextureCreationOptions.options.samples = 1;\r\n\r\n this._thinMinMaxReducer.setTextureDimensions(width, height, this.depthTextureType);\r\n\r\n const reductionSteps = this._thinMinMaxReducer.reductionSteps;\r\n\r\n let targetTexture: FrameGraphTextureHandle;\r\n\r\n this._frameGraph.addPass(`${this.name} Before Min Max Reduction`).setExecuteFunc((context) => {\r\n context.pushDebugGroup(`Min Max Reduction`);\r\n });\r\n\r\n for (let i = 0; i < reductionSteps.length - 1; ++i) {\r\n const reductionStep = reductionSteps[i];\r\n\r\n depthTextureCreationOptions.size = { width: reductionSteps[i + 1].textureWidth, height: reductionSteps[i + 1].textureHeight };\r\n\r\n const postProcess = new FrameGraphPostProcessTask(reductionStep.name, this._frameGraph, reductionStep);\r\n\r\n postProcess.sourceTexture = i == 0 ? this.depthTexture : targetTexture!;\r\n postProcess.sourceSamplingMode = Constants.TEXTURE_NEAREST_NEAREST;\r\n postProcess.targetTexture = this._frameGraph.textureManager.createRenderTargetTexture(`${this.name} ${reductionStep.name}`, depthTextureCreationOptions);\r\n\r\n postProcess.record(true);\r\n\r\n targetTexture = postProcess.outputTexture;\r\n }\r\n\r\n this._frameGraph.addPass(`${this.name} After Min Max Reduction`).setExecuteFunc((context) => {\r\n context.popDebugGroup();\r\n if (this._autoCalcDepthBounds && this._currentAutoCalcDepthBoundsCounter >= 0) {\r\n if (++this._currentAutoCalcDepthBoundsCounter >= this._autoCalcDepthBoundsRefreshRate) {\r\n const minMaxTexture = context.getTextureFromHandle(targetTexture!);\r\n if (minMaxTexture) {\r\n this._thinMinMaxReducer.readMinMax(minMaxTexture);\r\n }\r\n }\r\n this._currentAutoCalcDepthBoundsCounter %= this._autoCalcDepthBoundsRefreshRate;\r\n if (this._autoCalcDepthBoundsRefreshRate === 0) {\r\n this._currentAutoCalcDepthBoundsCounter = -1;\r\n }\r\n }\r\n });\r\n }\r\n\r\n super.record();\r\n }\r\n\r\n public override dispose() {\r\n super.dispose();\r\n this._thinMinMaxReducer.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -96,8 +96,9 @@ export declare class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
96
96
|
*/
|
|
97
97
|
readonly outputTexture: FrameGraphTextureHandle;
|
|
98
98
|
protected _shadowGenerator: ShadowGenerator | undefined;
|
|
99
|
-
protected
|
|
100
|
-
protected
|
|
99
|
+
protected _updateShadowMap(): void;
|
|
100
|
+
protected _createShadowGeneratorInstance(): void;
|
|
101
|
+
protected _createShadowGenerator(): boolean | undefined;
|
|
101
102
|
isReady(): boolean;
|
|
102
103
|
/**
|
|
103
104
|
* Creates a new shadow generator task.
|
|
@@ -15,7 +15,11 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
this._light = value;
|
|
18
|
-
this.
|
|
18
|
+
this._createShadowGenerator(); // make sure the shadow generator is created
|
|
19
|
+
if (this._shadowGenerator) {
|
|
20
|
+
this._shadowGenerator.light = value;
|
|
21
|
+
this._updateShadowMap();
|
|
22
|
+
}
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Gets or sets the camera used to generate the shadow generator.
|
|
@@ -25,7 +29,11 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
25
29
|
}
|
|
26
30
|
set camera(camera) {
|
|
27
31
|
this._camera = camera;
|
|
28
|
-
this.
|
|
32
|
+
if (this._shadowGenerator) {
|
|
33
|
+
this._shadowGenerator.camera = camera;
|
|
34
|
+
this._shadowGenerator.getShadowMap().cameraForLOD = camera;
|
|
35
|
+
this._updateShadowMap();
|
|
36
|
+
}
|
|
29
37
|
}
|
|
30
38
|
/**
|
|
31
39
|
* The size of the shadow map.
|
|
@@ -38,7 +46,10 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
38
46
|
return;
|
|
39
47
|
}
|
|
40
48
|
this._mapSize = value;
|
|
41
|
-
this.
|
|
49
|
+
if (this._shadowGenerator) {
|
|
50
|
+
this._shadowGenerator.mapSize = value;
|
|
51
|
+
this._updateShadowMap();
|
|
52
|
+
}
|
|
42
53
|
}
|
|
43
54
|
/**
|
|
44
55
|
* If true, the shadow map will use a 32 bits float texture type (else, 16 bits float is used if supported).
|
|
@@ -51,7 +62,10 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
51
62
|
return;
|
|
52
63
|
}
|
|
53
64
|
this._useFloat32TextureType = value;
|
|
54
|
-
this.
|
|
65
|
+
if (this._shadowGenerator) {
|
|
66
|
+
this._shadowGenerator.useFloat32TextureType = value;
|
|
67
|
+
this._updateShadowMap();
|
|
68
|
+
}
|
|
55
69
|
}
|
|
56
70
|
/**
|
|
57
71
|
* If true, the shadow map will use a red texture format (else, a RGBA format is used).
|
|
@@ -64,7 +78,10 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
64
78
|
return;
|
|
65
79
|
}
|
|
66
80
|
this._useRedTextureFormat = value;
|
|
67
|
-
this.
|
|
81
|
+
if (this._shadowGenerator) {
|
|
82
|
+
this._shadowGenerator.useRedTextureFormat = value;
|
|
83
|
+
this._updateShadowMap();
|
|
84
|
+
}
|
|
68
85
|
}
|
|
69
86
|
/**
|
|
70
87
|
* The bias to apply to the shadow map.
|
|
@@ -186,14 +203,21 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
186
203
|
this._shadowGenerator.filteringQuality = value;
|
|
187
204
|
}
|
|
188
205
|
}
|
|
189
|
-
|
|
206
|
+
_updateShadowMap() {
|
|
207
|
+
const shadowGenerator = this._shadowGenerator;
|
|
208
|
+
if (shadowGenerator === undefined) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const shadowMap = shadowGenerator.getShadowMap();
|
|
212
|
+
shadowMap._disableEngineStages = true;
|
|
213
|
+
shadowMap.cameraForLOD = this._camera;
|
|
214
|
+
}
|
|
215
|
+
_createShadowGeneratorInstance() {
|
|
190
216
|
this._shadowGenerator = new ShadowGenerator(this._mapSize, this._light, this._useFloat32TextureType, undefined, this._useRedTextureFormat);
|
|
191
217
|
}
|
|
192
|
-
|
|
193
|
-
this._shadowGenerator
|
|
194
|
-
|
|
195
|
-
if (this._light !== undefined) {
|
|
196
|
-
this._createShadowGenerator();
|
|
218
|
+
_createShadowGenerator() {
|
|
219
|
+
if (!this._shadowGenerator && this._light) {
|
|
220
|
+
this._createShadowGeneratorInstance();
|
|
197
221
|
const shadowGenerator = this._shadowGenerator;
|
|
198
222
|
if (shadowGenerator === undefined) {
|
|
199
223
|
return;
|
|
@@ -206,11 +230,11 @@ export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
|
|
|
206
230
|
shadowGenerator.useOpacityTextureForTransparentShadow = this._useOpacityTextureForTransparentShadow;
|
|
207
231
|
shadowGenerator.filter = this._filter;
|
|
208
232
|
shadowGenerator.filteringQuality = this._filteringQuality;
|
|
209
|
-
|
|
210
|
-
shadowMap._disableEngineStages = true;
|
|
211
|
-
shadowMap.cameraForLOD = this._camera;
|
|
233
|
+
this._updateShadowMap();
|
|
212
234
|
this.shadowGenerator = shadowGenerator;
|
|
235
|
+
return true;
|
|
213
236
|
}
|
|
237
|
+
return false;
|
|
214
238
|
}
|
|
215
239
|
isReady() {
|
|
216
240
|
return !!this._shadowGenerator && !!this._shadowGenerator.getShadowMap()?.isReadyForRendering();
|