@onerjs/core 8.48.4 → 8.48.6
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.d.ts +13 -0
- package/Animations/animatable.core.js +46 -7
- package/Animations/animatable.core.js.map +1 -1
- package/Cameras/Inputs/geospatialCameraPointersInput.js +10 -8
- package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
- package/Cameras/geospatialCameraMovement.js +2 -2
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.d.ts +105 -0
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js +318 -0
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/index.d.ts +1 -0
- package/FrameGraph/Node/Blocks/index.js +1 -0
- package/FrameGraph/Node/Blocks/index.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +34 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +144 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +26 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +82 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +61 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +207 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +104 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +218 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.d.ts +217 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js +640 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js.map +1 -0
- package/FrameGraph/frameGraph.js +1 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/index.d.ts +1 -0
- package/FrameGraph/index.js +1 -0
- package/FrameGraph/index.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.d.ts +13 -2
- package/Materials/PBR/openpbrMaterial.js +47 -16
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.js +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
- package/Materials/Textures/Filtering/hdrFiltering.js +6 -0
- package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
- package/Materials/Textures/envCubeTexture.js +13 -13
- package/Materials/Textures/envCubeTexture.js.map +1 -1
- package/Materials/materialHelper.functions.js +1 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Misc/textureTools.d.ts +3 -1
- package/Misc/textureTools.js +74 -13
- package/Misc/textureTools.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +33 -1
- package/Particles/baseParticleSystem.js +65 -0
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +6 -0
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +24 -6
- package/Particles/gpuParticleSystem.js +85 -36
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +0 -7
- package/Particles/particleSystem.js +3 -15
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.d.ts +1 -3
- package/Particles/thinParticleSystem.js +1 -27
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +7 -0
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +3 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +11 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +0 -19
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +21 -65
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +15 -52
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +129 -220
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/geometryBufferRenderer.d.ts +14 -5
- package/Rendering/geometryBufferRenderer.js +6 -2
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/geometryBufferRendererSceneComponent.d.ts +4 -6
- package/Rendering/geometryBufferRendererSceneComponent.js.map +1 -1
- package/Rendering/iblCdfGenerator.d.ts +10 -0
- package/Rendering/iblCdfGenerator.js +52 -17
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/index.d.ts +0 -6
- package/Rendering/index.js +0 -6
- package/Rendering/index.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +6 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +12 -6
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js +5 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/Shaders/iblVoxelGrid.fragment.d.ts +1 -0
- package/Shaders/iblVoxelGrid.fragment.js +33 -5
- package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
- package/Shaders/lod3D.fragment.d.ts +5 -0
- package/Shaders/lod3D.fragment.js +13 -0
- package/Shaders/lod3D.fragment.js.map +1 -0
- package/Shaders/openpbr.fragment.js +5 -0
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +6 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +14 -7
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +5 -1
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
- package/ShadersWGSL/lod3D.fragment.d.ts +5 -0
- package/ShadersWGSL/lod3D.fragment.js +13 -0
- package/ShadersWGSL/lod3D.fragment.js.map +1 -0
- package/ShadersWGSL/openpbr.fragment.js +5 -0
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iblShadowsRendererTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Camera, type FrameGraph, type FrameGraphObjectList, type FrameGraphTextureHandle, type InternalTexture, type Mesh, type Nullable, type Observer } from \"core/index\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { IBLShadowsPluginMaterial } from \"core/Rendering/IBLShadows/iblShadowsPluginMaterial\";\r\nimport { FrameGraphIblShadowsAccumulationTask } from \"./iblShadows/iblShadowsAccumulationTask\";\r\nimport { FrameGraphIblShadowsSpatialBlurTask } from \"./iblShadows/iblShadowsSpatialBlurTask\";\r\nimport { FrameGraphIblShadowsTracingTask } from \"./iblShadows/iblShadowsTracingTask\";\r\nimport { FrameGraphIblShadowsVoxelizationTask } from \"./iblShadows/iblShadowsVoxelizationTask\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { _RetryWithInterval } from \"../../../Misc/timingTools\";\r\nimport \"../../../Rendering/iblCdfGeneratorSceneComponent\";\r\n\r\n/**\r\n * Composite task that owns the individual IBL shadows frame graph tasks.\r\n * The frame graph remains flat internally, but this task groups the pipeline\r\n * and owns the child task implementation details.\r\n */\r\nexport class FrameGraphIblShadowsRendererTask extends FrameGraphTask {\r\n /** Final frame-graph texture handle produced by the task. */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n private readonly _voxelizationTask: FrameGraphIblShadowsVoxelizationTask;\r\n private readonly _tracingTask: FrameGraphIblShadowsTracingTask;\r\n private readonly _spatialBlurTask: FrameGraphIblShadowsSpatialBlurTask;\r\n private readonly _accumulationTask: FrameGraphIblShadowsAccumulationTask;\r\n private _dependenciesResolved = false;\r\n private _shadowOpacity = 1.0;\r\n private readonly _materialsWithRenderPlugin: Material[] = [];\r\n private readonly _outputTextureReadyObservable = new Observable<InternalTexture>();\r\n private _lastNotifiedOutputTexture: Nullable<InternalTexture> = null;\r\n private _observedEnvironmentTexture: Nullable<Texture | CubeTexture> = null;\r\n private _observedEnvironmentTextureUnsubscribe: Nullable<() => void> = null;\r\n private _lastImportedIcdfTexture: Nullable<InternalTexture> = null;\r\n private _lastImportedEnvironmentTexture: Nullable<InternalTexture> = null;\r\n private _lastImportedBlueNoiseTexture: Nullable<InternalTexture> = null;\r\n private readonly _blueNoiseTexture: Texture;\r\n private _cameraViewChangedObserver: Nullable<Observer<any>> = null;\r\n private _cdfTextureChangedObserver: Nullable<Observer<any>> = null;\r\n private _cdfGeneratedObserver: Nullable<Observer<any>> = null;\r\n private _environmentTextureChangedObserver: Nullable<Observer<any>> = null;\r\n private _beforeRenderDependencyObserver: Nullable<Observer<any>> = null;\r\n private _beforeRenderOutputReadyObserver: Nullable<Observer<any>> = null;\r\n private _blueNoiseLoadObserver: Nullable<Observer<any>> = null;\r\n private _texturesAllocatedObserver: Nullable<Observer<any>> = null;\r\n private _voxelizationCompleteObserver: Nullable<Observer<any>> = null;\r\n\r\n /**\r\n * Gets the class name.\r\n * @returns The class name.\r\n */\r\n public override getClassName(): string {\r\n return \"FrameGraphIblShadowsRendererTask\";\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(value: string) {\r\n this._name = value;\r\n if (this._voxelizationTask) {\r\n this._voxelizationTask.name = `${value} Voxelization`;\r\n }\r\n if (this._tracingTask) {\r\n this._tracingTask.name = `${value} Tracing`;\r\n }\r\n if (this._spatialBlurTask) {\r\n this._spatialBlurTask.name = `${value} Blur`;\r\n }\r\n if (this._accumulationTask) {\r\n this._accumulationTask.name = `${value} Accumulation`;\r\n }\r\n }\r\n\r\n /**\r\n * Whether the task is disabled.\r\n */\r\n\r\n public override get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n\r\n public override set disabled(value: boolean) {\r\n this._disabled = value;\r\n if (!this._disabled && this._dependenciesResolved) {\r\n this._accumulationTask.reset = true;\r\n }\r\n this._applyMaterialPluginParameters();\r\n }\r\n\r\n // ------ Common properties ------\r\n\r\n /** Camera used by the tracing stage. */\r\n public get camera(): Camera {\r\n return this._tracingTask.camera!;\r\n }\r\n\r\n /** Camera used by the tracing stage. */\r\n public set camera(value: Camera) {\r\n this._setCamera(value);\r\n }\r\n\r\n /** Object list used by voxelization. */\r\n public get objectList(): FrameGraphObjectList {\r\n return this._voxelizationTask.objectList;\r\n }\r\n\r\n /** Object list used by voxelization. */\r\n public set objectList(value: FrameGraphObjectList) {\r\n if (this._voxelizationTask.objectList === value) {\r\n return;\r\n }\r\n\r\n this._voxelizationTask.objectList = value;\r\n this._voxelizationTask.updateSceneBounds();\r\n this._voxelizationTask.requestVoxelizationUpdate();\r\n this._accumulationTask.reset = true;\r\n }\r\n\r\n /**\r\n * Depth texture handle used by tracing and blur.\r\n * This should be the screen-space depth of all objects in the scene\r\n * that will receive shadows.\r\n * It is important that this texture stores 32-bit depth values to avoid artifacts.\r\n */\r\n public depthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * World-space normal texture handle used by tracing and blur.\r\n * This should store the world-space normals of all objects in the scene\r\n * that will receive shadows. Each component should be normalized to [0, 1] rather than [-1, 1].\r\n * Recommended to be 16-bit floating point though 8-bit unsigned byte can be used with minimal\r\n * loss in quality.\r\n */\r\n public normalTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Position texture handle used by accumulation.\r\n * This should store the world-space position of all objects in the scene\r\n * that will receive shadows.\r\n * Should be stored as 16-bit floating point.\r\n */\r\n public positionTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Velocity texture handle used by accumulation.\r\n * This should store the linear velocity per pixel of all objects in the scene\r\n * that will receive shadows.\r\n * Should be stored as 16-bit floating point.\r\n */\r\n public velocityTexture: FrameGraphTextureHandle;\r\n\r\n // ------ Tracing properties ------\r\n\r\n /** Number of tracing sample directions. */\r\n public get sampleDirections(): number {\r\n return this._tracingTask.sampleDirections;\r\n }\r\n\r\n /** Number of tracing sample directions. */\r\n public set sampleDirections(value: number) {\r\n this._tracingTask.sampleDirections = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Whether traced shadows preserve environment color. */\r\n public get coloredShadows(): boolean {\r\n return this._tracingTask.coloredShadows;\r\n }\r\n\r\n /** Whether traced shadows preserve environment color. */\r\n public set coloredShadows(value: boolean) {\r\n if (this._tracingTask.coloredShadows === value) {\r\n return;\r\n }\r\n this._tracingTask.coloredShadows = value;\r\n this._applyMaterialPluginParameters();\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Opacity of voxel-traced shadows. */\r\n public get voxelShadowOpacity(): number {\r\n return this._tracingTask.voxelShadowOpacity;\r\n }\r\n\r\n /** Opacity of voxel-traced shadows. */\r\n public set voxelShadowOpacity(value: number) {\r\n this._tracingTask.voxelShadowOpacity = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Opacity of screen-space shadows. */\r\n public get ssShadowOpacity(): number {\r\n return this._tracingTask.ssShadowOpacity;\r\n }\r\n\r\n /** Opacity of screen-space shadows. */\r\n public set ssShadowOpacity(value: number) {\r\n this._tracingTask.ssShadowOpacity = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Number of screen-space shadow samples. */\r\n public get ssShadowSampleCount(): number {\r\n return this._tracingTask.ssShadowSampleCount;\r\n }\r\n\r\n /** Number of screen-space shadow samples. */\r\n public set ssShadowSampleCount(value: number) {\r\n this._tracingTask.ssShadowSampleCount = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Stride used by screen-space shadow sampling. */\r\n public get ssShadowStride(): number {\r\n return this._tracingTask.ssShadowStride;\r\n }\r\n\r\n /** Stride used by screen-space shadow sampling. */\r\n public set ssShadowStride(value: number) {\r\n this._tracingTask.ssShadowStride = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Distance scale used by screen-space shadow tracing. */\r\n public get ssShadowDistanceScale(): number {\r\n return this._tracingTask.ssShadowDistanceScale;\r\n }\r\n\r\n /** Distance scale used by screen-space shadow tracing. */\r\n public set ssShadowDistanceScale(value: number) {\r\n this._tracingTask.ssShadowDistanceScale = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Thickness scale used by screen-space shadow tracing. */\r\n public get ssShadowThicknessScale(): number {\r\n return this._tracingTask.ssShadowThicknessScale;\r\n }\r\n\r\n /** Thickness scale used by screen-space shadow tracing. */\r\n public set ssShadowThicknessScale(value: number) {\r\n this._tracingTask.ssShadowThicknessScale = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Voxel tracing normal bias. */\r\n public get voxelNormalBias(): number {\r\n return this._tracingTask.voxelNormalBias;\r\n }\r\n\r\n /** Voxel tracing normal bias. */\r\n public set voxelNormalBias(value: number) {\r\n this._tracingTask.voxelNormalBias = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Voxel tracing direction bias. */\r\n public get voxelDirectionBias(): number {\r\n return this._tracingTask.voxelDirectionBias;\r\n }\r\n\r\n /** Voxel tracing direction bias. */\r\n public set voxelDirectionBias(value: number) {\r\n this._tracingTask.voxelDirectionBias = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Environment rotation in radians. */\r\n public get envRotation(): number {\r\n return this._tracingTask.envRotation;\r\n }\r\n\r\n /** Environment rotation in radians. */\r\n public set envRotation(value: number) {\r\n this._tracingTask.envRotation = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n // ------ Accumulation properties ------\r\n\r\n /** Temporal shadow remanence while moving. */\r\n public get shadowRemanence(): number {\r\n return this._accumulationTask.remanence;\r\n }\r\n\r\n /** Temporal shadow remanence while moving. */\r\n public set shadowRemanence(value: number) {\r\n this._accumulationTask.remanence = value;\r\n }\r\n\r\n /** Final material shadow opacity. */\r\n public get shadowOpacity(): number {\r\n return this._shadowOpacity;\r\n }\r\n\r\n /** Final material shadow opacity. */\r\n public set shadowOpacity(value: number) {\r\n this._shadowOpacity = Math.max(0, Math.min(value, 1));\r\n this._applyMaterialPluginParameters();\r\n }\r\n\r\n // ------ Voxelization properties ------\r\n\r\n /** Voxelization resolution exponent. */\r\n public get resolutionExp(): number {\r\n return this._voxelizationTask.resolutionExp;\r\n }\r\n\r\n /** Voxelization resolution exponent. */\r\n public set resolutionExp(value: number) {\r\n this._voxelizationTask.resolutionExp = value;\r\n this.resetAccumulation();\r\n }\r\n\r\n /** Voxelization refresh rate. */\r\n public get refreshRate(): number {\r\n return this._voxelizationTask.refreshRate;\r\n }\r\n\r\n /** Voxelization refresh rate. */\r\n public set refreshRate(value: number) {\r\n this._voxelizationTask.refreshRate = value;\r\n }\r\n\r\n /** Whether tri-planar voxelization is used. */\r\n public get triPlanarVoxelization(): boolean {\r\n return this._voxelizationTask.triPlanarVoxelization;\r\n }\r\n\r\n /** Whether tri-planar voxelization is used. */\r\n public set triPlanarVoxelization(value: boolean) {\r\n this._voxelizationTask.triPlanarVoxelization = value;\r\n }\r\n\r\n /** Current world-space voxel grid size. */\r\n public get voxelGridSize(): number {\r\n return this._voxelizationTask.voxelGridSize;\r\n }\r\n\r\n /** True when the accumulated output texture is ready. */\r\n public get outputTextureReady(): boolean {\r\n return !!this._getAccumulationOutputTexture()?.isReady;\r\n }\r\n\r\n /** Notifies when the accumulated output texture becomes ready. */\r\n public get onOutputTextureReadyObservable(): Observable<InternalTexture> {\r\n return this._outputTextureReadyObservable;\r\n }\r\n\r\n // ------ Public methods ------\r\n\r\n /** Triggers a voxelization refresh on the next eligible frame. */\r\n public updateVoxelization(): void {\r\n this._voxelizationTask.requestVoxelizationUpdate();\r\n }\r\n\r\n /** Recomputes the voxelization scene bounds from the current object list. */\r\n public updateSceneBounds(): void {\r\n this._voxelizationTask.updateSceneBounds();\r\n }\r\n\r\n /** Resets temporal accumulation. */\r\n public resetAccumulation(): void {\r\n this._accumulationTask.reset = true;\r\n }\r\n\r\n /**\r\n * Adds one or more materials that should receive IBL shadows.\r\n * @param material The material or materials to register. If omitted, all scene materials are added.\r\n */\r\n public addShadowReceivingMaterial(material?: Material | Material[]): void {\r\n if (!material) {\r\n for (const sceneMaterial of this._frameGraph.scene.materials) {\r\n this._addShadowReceivingMaterialInternal(sceneMaterial);\r\n }\r\n } else if (Array.isArray(material)) {\r\n for (const sceneMaterial of material) {\r\n this._addShadowReceivingMaterialInternal(sceneMaterial);\r\n }\r\n } else {\r\n this._addShadowReceivingMaterialInternal(material);\r\n }\r\n\r\n this._applyMaterialPluginParameters();\r\n }\r\n\r\n /**\r\n * Removes one or more materials from IBL shadow reception.\r\n * @param material The material or materials to unregister.\r\n */\r\n public removeShadowReceivingMaterial(material: Material | Material[]): void {\r\n const materials = Array.isArray(material) ? material : [material];\r\n for (const mat of materials) {\r\n const index = this._materialsWithRenderPlugin.indexOf(mat);\r\n if (index !== -1) {\r\n this._materialsWithRenderPlugin.splice(index, 1);\r\n }\r\n\r\n const plugin = mat.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (plugin) {\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n }\r\n\r\n /** Clears all registered shadow-receiving materials. */\r\n public clearShadowReceivingMaterials(): void {\r\n for (const mat of this._materialsWithRenderPlugin) {\r\n const plugin = mat.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (plugin) {\r\n plugin.isEnabled = false;\r\n }\r\n }\r\n\r\n this._materialsWithRenderPlugin.length = 0;\r\n }\r\n\r\n /**\r\n * Adds one or more meshes to the voxelization object list.\r\n * @param mesh The mesh or meshes to add.\r\n */\r\n public addShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n const meshes = Array.isArray(mesh) ? mesh : [mesh];\r\n const objectMeshes = this._voxelizationTask.objectList.meshes as Mesh[];\r\n for (const currentMesh of meshes) {\r\n if (currentMesh && objectMeshes.indexOf(currentMesh) === -1) {\r\n objectMeshes.push(currentMesh);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes one or more meshes from the voxelization object list.\r\n * @param mesh The mesh or meshes to remove.\r\n */\r\n public removeShadowCastingMesh(mesh: Mesh | Mesh[]): void {\r\n const meshes = Array.isArray(mesh) ? mesh : [mesh];\r\n const objectMeshes = this._voxelizationTask.objectList.meshes as Mesh[];\r\n for (const currentMesh of meshes) {\r\n const index = objectMeshes.indexOf(currentMesh);\r\n if (index !== -1) {\r\n objectMeshes.splice(index, 1);\r\n }\r\n }\r\n }\r\n\r\n /** Clears all shadow-casting meshes from the voxelization object list. */\r\n public clearShadowCastingMeshes(): void {\r\n const objectMeshes = this._voxelizationTask.objectList.meshes as Mesh[];\r\n objectMeshes.length = 0;\r\n }\r\n\r\n // ------ Framework overrides ------\r\n\r\n private _initAsyncCancel: Nullable<() => void> = null;\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 this._frameGraph.scene.enableIblCdfGenerator();\r\n\r\n return new Promise<void>((resolve, reject) => {\r\n this._initAsyncCancel = _RetryWithInterval(\r\n () => this._tryEnableShadowsTasks(),\r\n () => {\r\n this._initAsyncCancel = null;\r\n resolve();\r\n },\r\n (err, isTimeout) => {\r\n this._initAsyncCancel = null;\r\n if (isTimeout) {\r\n reject(new Error(`FrameGraphIblShadowsRendererTask \"${this.name}\": timed out waiting for shadow dependencies to be ready.`));\r\n } else {\r\n reject(new Error(err));\r\n }\r\n },\r\n 16,\r\n 10000\r\n );\r\n });\r\n }\r\n\r\n public override isReady(): boolean {\r\n return this._voxelizationTask.isReady() && this._tracingTask.isReady() && this._spatialBlurTask.isReady() && this._accumulationTask.isReady();\r\n }\r\n\r\n /**\r\n * Records the parent task.\r\n * Child tasks record the actual passes.\r\n */\r\n public override record(): void {\r\n if (this.depthTexture === undefined || this.normalTexture === undefined || this.positionTexture === undefined || this.velocityTexture === undefined) {\r\n throw new Error(`FrameGraphIblShadowsRendererTask \"${this.name}\": depthTexture, normalTexture, positionTexture and velocityTexture are required`);\r\n }\r\n\r\n this._lastImportedIcdfTexture = null;\r\n this._lastImportedEnvironmentTexture = null;\r\n this._lastImportedBlueNoiseTexture = null;\r\n\r\n this._tryEnableShadowsTasks();\r\n\r\n // Set sub-task texture inputs (these are set here because handles may not be available at construction time)\r\n this._tracingTask.depthTexture = this.depthTexture;\r\n this._tracingTask.normalTexture = this.normalTexture;\r\n this._spatialBlurTask.depthTexture = this.depthTexture;\r\n this._spatialBlurTask.normalTexture = this.normalTexture;\r\n this._accumulationTask.positionTexture = this.positionTexture;\r\n this._accumulationTask.velocityTexture = this.velocityTexture;\r\n\r\n this._voxelizationTask.record();\r\n this._tracingTask.record();\r\n this._spatialBlurTask.record();\r\n this._accumulationTask.record();\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n\r\n /**\r\n * Disposes the task and owned resources.\r\n */\r\n public override dispose(): void {\r\n this._initAsyncCancel?.();\r\n this._initAsyncCancel = null;\r\n this._disposeObservers();\r\n this._voxelizationTask.dispose();\r\n this._tracingTask.dispose();\r\n this._spatialBlurTask.dispose();\r\n this._accumulationTask.dispose();\r\n\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Creates a new IBL shadows composite task.\r\n * @param name The task name.\r\n * @param frameGraph The owning frame graph.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n super(name, frameGraph);\r\n\r\n this._voxelizationTask = new FrameGraphIblShadowsVoxelizationTask(`${name} Voxelization`, frameGraph);\r\n\r\n this._tracingTask = new FrameGraphIblShadowsTracingTask(`${name} Tracing`, frameGraph);\r\n this._tracingTask.voxelGridTexture = this._voxelizationTask.outputVoxelGridTexture;\r\n this._tracingTask.worldScaleMatrix = this._voxelizationTask.worldScaleMatrix;\r\n this._tracingTask.voxelizationTask = this._voxelizationTask;\r\n\r\n this._spatialBlurTask = new FrameGraphIblShadowsSpatialBlurTask(`${name} Blur`, frameGraph);\r\n this._spatialBlurTask.sourceTexture = this._tracingTask.outputTexture;\r\n this._spatialBlurTask.voxelizationTask = this._voxelizationTask;\r\n\r\n this._accumulationTask = new FrameGraphIblShadowsAccumulationTask(`${name} Accumulation`, frameGraph);\r\n this._accumulationTask.sourceTexture = this._spatialBlurTask.outputTexture;\r\n this._accumulationTask.voxelizationTask = this._voxelizationTask;\r\n\r\n this.outputTexture = this._accumulationTask.outputTexture;\r\n this._blueNoiseTexture = new Texture(\r\n Tools.GetAssetUrl(\"https://assets.babylonjs.com/core/blue_noise/blue_noise_rgb.png\"),\r\n frameGraph.scene,\r\n false,\r\n true,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n );\r\n\r\n this._initialize();\r\n }\r\n\r\n private _disposeDependencyObservers(): void {\r\n this._observedEnvironmentTextureUnsubscribe?.();\r\n this._observedEnvironmentTextureUnsubscribe = null;\r\n this._observedEnvironmentTexture = null;\r\n }\r\n\r\n private _disposeObservers(): void {\r\n this._disposeDependencyObservers();\r\n this._tracingTask.camera?.onViewMatrixChangedObservable.remove(this._cameraViewChangedObserver);\r\n this._frameGraph.scene.iblCdfGenerator?.onTextureChangedObservable.remove(this._cdfTextureChangedObserver);\r\n this._frameGraph.scene.iblCdfGenerator?.onGeneratedObservable.remove(this._cdfGeneratedObserver);\r\n this._frameGraph.scene.onEnvironmentTextureChangedObservable.remove(this._environmentTextureChangedObserver);\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._beforeRenderDependencyObserver);\r\n this._frameGraph.scene.onBeforeRenderObservable.remove(this._beforeRenderOutputReadyObserver);\r\n this._blueNoiseTexture.onLoadObservable.remove(this._blueNoiseLoadObserver);\r\n this.onTexturesAllocatedObservable.remove(this._texturesAllocatedObserver);\r\n this._voxelizationTask.onVoxelizationCompleteObservable.remove(this._voxelizationCompleteObserver);\r\n\r\n this._cameraViewChangedObserver = null;\r\n this._cdfTextureChangedObserver = null;\r\n this._cdfGeneratedObserver = null;\r\n this._environmentTextureChangedObserver = null;\r\n this._beforeRenderDependencyObserver = null;\r\n this._beforeRenderOutputReadyObserver = null;\r\n this._blueNoiseLoadObserver = null;\r\n this._texturesAllocatedObserver = null;\r\n this._voxelizationCompleteObserver = null;\r\n this._blueNoiseTexture.dispose();\r\n }\r\n\r\n private _setCamera(camera: Camera): void {\r\n const currentCamera = this._tracingTask.camera;\r\n if (currentCamera === camera && this._cameraViewChangedObserver !== null) {\r\n return;\r\n }\r\n\r\n if (currentCamera && this._cameraViewChangedObserver) {\r\n currentCamera.onViewMatrixChangedObservable.remove(this._cameraViewChangedObserver);\r\n this._cameraViewChangedObserver = null;\r\n }\r\n\r\n this._tracingTask.camera = camera;\r\n this._cameraViewChangedObserver = camera.onViewMatrixChangedObservable.add(() => {\r\n this._accumulationTask.isMoving = true;\r\n });\r\n this._accumulationTask.reset = true;\r\n }\r\n\r\n private _observeEnvironmentTexture(): void {\r\n const env = this._frameGraph.scene.environmentTexture;\r\n const currentEnvironmentTexture = env instanceof Texture || env instanceof CubeTexture ? env : null;\r\n\r\n if (currentEnvironmentTexture === this._observedEnvironmentTexture) {\r\n return;\r\n }\r\n\r\n this._observedEnvironmentTextureUnsubscribe?.();\r\n this._observedEnvironmentTextureUnsubscribe = null;\r\n this._observedEnvironmentTexture = currentEnvironmentTexture;\r\n\r\n if (currentEnvironmentTexture instanceof Texture) {\r\n const observer = currentEnvironmentTexture.onLoadObservable.add(this._onEnvironmentTextureLoaded);\r\n if (observer) {\r\n this._observedEnvironmentTextureUnsubscribe = () => currentEnvironmentTexture.onLoadObservable.remove(observer);\r\n }\r\n } else if (currentEnvironmentTexture instanceof CubeTexture) {\r\n const observer = currentEnvironmentTexture.onLoadObservable.add(this._onEnvironmentTextureLoaded);\r\n if (observer) {\r\n this._observedEnvironmentTextureUnsubscribe = () => currentEnvironmentTexture.onLoadObservable.remove(observer);\r\n }\r\n }\r\n }\r\n\r\n private _getEnvironmentTextureInternal(): Nullable<InternalTexture> {\r\n const currentEnvironmentTexture = this._frameGraph.scene.environmentTexture;\r\n\r\n if (!currentEnvironmentTexture || !currentEnvironmentTexture.isReadyOrNotBlocking()) {\r\n return null;\r\n }\r\n\r\n const internalTexture = currentEnvironmentTexture.getInternalTexture();\r\n return internalTexture?.isReady ? internalTexture : null;\r\n }\r\n\r\n private _getAccumulationOutputTexture(): Nullable<InternalTexture> {\r\n try {\r\n return this._frameGraph.textureManager.getTextureFromHandle(this._accumulationTask.outputTexture);\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private _notifyIfOutputTextureReady(): void {\r\n const outputTexture = this._getAccumulationOutputTexture();\r\n if (!outputTexture?.isReady || this._lastNotifiedOutputTexture === outputTexture) {\r\n return;\r\n }\r\n\r\n this._lastNotifiedOutputTexture = outputTexture;\r\n this._outputTextureReadyObservable.notifyObservers(outputTexture);\r\n }\r\n\r\n private _applyMaterialPluginParameters(): void {\r\n const accumulationTexture = this._getAccumulationOutputTexture();\r\n for (const material of this._materialsWithRenderPlugin) {\r\n const plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n continue;\r\n }\r\n\r\n if (accumulationTexture && accumulationTexture.isReady) {\r\n plugin.iblShadowsTexture = accumulationTexture;\r\n }\r\n\r\n plugin.shadowOpacity = this._shadowOpacity;\r\n plugin.isColored = this._tracingTask.coloredShadows;\r\n plugin.isEnabled = !this._disabled && this._dependenciesResolved && !!accumulationTexture;\r\n }\r\n }\r\n\r\n private _addShadowReceivingMaterialInternal(material: Material): void {\r\n const isSupportedMaterial = material instanceof PBRBaseMaterial || material instanceof StandardMaterial || material instanceof OpenPBRMaterial;\r\n if (!isSupportedMaterial || this._materialsWithRenderPlugin.indexOf(material) !== -1) {\r\n return;\r\n }\r\n\r\n const plugin = material.pluginManager?.getPlugin<IBLShadowsPluginMaterial>(IBLShadowsPluginMaterial.Name);\r\n if (!plugin) {\r\n new IBLShadowsPluginMaterial(material);\r\n }\r\n\r\n this._materialsWithRenderPlugin.push(material);\r\n }\r\n\r\n private readonly _onEnvironmentTextureLoaded = () => {\r\n this._tryEnableShadowsTasks();\r\n };\r\n\r\n private _tryEnableShadowsTasks(): boolean {\r\n const scene = this._frameGraph.scene;\r\n const icdfTexture = scene.iblCdfGenerator?.getIcdfTexture().getInternalTexture();\r\n const environmentTexture = this._getEnvironmentTextureInternal();\r\n const blueNoiseInternalTexture = this._blueNoiseTexture.getInternalTexture();\r\n\r\n if (!icdfTexture?.isReady || icdfTexture.width === 1 || !environmentTexture?.isReady || !blueNoiseInternalTexture?.isReady) {\r\n if (this._dependenciesResolved) {\r\n this._dependenciesResolved = false;\r\n this._applyMaterialPluginParameters();\r\n }\r\n return false;\r\n }\r\n\r\n const icdfChanged = this._lastImportedIcdfTexture !== icdfTexture;\r\n const environmentChanged = this._lastImportedEnvironmentTexture !== environmentTexture;\r\n const blueNoiseChanged = this._lastImportedBlueNoiseTexture !== blueNoiseInternalTexture;\r\n\r\n if (icdfChanged) {\r\n this._tracingTask.icdfTexture = this._frameGraph.textureManager.importTexture(`ICDF Texture`, icdfTexture, this._tracingTask.icdfTexture);\r\n this._lastImportedIcdfTexture = icdfTexture;\r\n }\r\n\r\n if (environmentChanged) {\r\n this._tracingTask.environmentTexture = this._frameGraph.textureManager.importTexture(`Environment Texture`, environmentTexture, this._tracingTask.environmentTexture);\r\n this._lastImportedEnvironmentTexture = environmentTexture;\r\n }\r\n\r\n if (blueNoiseChanged) {\r\n this._tracingTask.blueNoiseTexture = this._frameGraph.textureManager.importTexture(`Blue Noise Texture`, blueNoiseInternalTexture, this._tracingTask.blueNoiseTexture);\r\n this._lastImportedBlueNoiseTexture = blueNoiseInternalTexture;\r\n }\r\n\r\n if (!this._dependenciesResolved) {\r\n this._dependenciesResolved = true;\r\n if (!this._disabled) {\r\n this._accumulationTask.reset = true;\r\n }\r\n this._disposeDependencyObservers();\r\n } else if (icdfChanged || environmentChanged || blueNoiseChanged) {\r\n this._accumulationTask.reset = true;\r\n }\r\n\r\n this._applyMaterialPluginParameters();\r\n\r\n return true;\r\n }\r\n\r\n private _initialize(): void {\r\n const scene = this._frameGraph.scene;\r\n\r\n this._voxelizationCompleteObserver = this._voxelizationTask.onVoxelizationCompleteObservable.add(() => {\r\n this._tracingTask.voxelGridTexture = this._voxelizationTask.outputVoxelGridTexture;\r\n this._accumulationTask.reset = true;\r\n });\r\n\r\n this._cdfTextureChangedObserver =\r\n scene.iblCdfGenerator?.onTextureChangedObservable.add(() => {\r\n this._lastImportedIcdfTexture = null;\r\n this._accumulationTask.reset = true;\r\n }) ?? null;\r\n\r\n this._cdfGeneratedObserver =\r\n scene.iblCdfGenerator?.onGeneratedObservable.add(() => {\r\n this._lastImportedIcdfTexture = null;\r\n this._tryEnableShadowsTasks();\r\n }) ?? null;\r\n\r\n this._environmentTextureChangedObserver = scene.onEnvironmentTextureChangedObservable.add(() => {\r\n this._lastImportedEnvironmentTexture = null;\r\n this._dependenciesResolved = false;\r\n this._observeEnvironmentTexture();\r\n this._applyMaterialPluginParameters();\r\n this._tryEnableShadowsTasks();\r\n });\r\n\r\n this._observeEnvironmentTexture();\r\n\r\n if (scene.environmentTexture?.isReadyOrNotBlocking()) {\r\n this._tryEnableShadowsTasks();\r\n }\r\n\r\n this._blueNoiseLoadObserver = this._blueNoiseTexture.onLoadObservable.add(() => {\r\n this._tryEnableShadowsTasks();\r\n });\r\n\r\n this._beforeRenderDependencyObserver = scene.onBeforeRenderObservable.add(() => {\r\n this._tryEnableShadowsTasks();\r\n });\r\n\r\n this._beforeRenderOutputReadyObserver = scene.onBeforeRenderObservable.add(() => {\r\n this._notifyIfOutputTextureReady();\r\n });\r\n\r\n this._tryEnableShadowsTasks();\r\n\r\n this._texturesAllocatedObserver = this.onTexturesAllocatedObservable.add(() => {\r\n this._applyMaterialPluginParameters();\r\n this._notifyIfOutputTextureReady();\r\n });\r\n }\r\n}\r\n"]}
|
package/FrameGraph/frameGraph.js
CHANGED
|
@@ -258,6 +258,7 @@ export class FrameGraph {
|
|
|
258
258
|
let firstNotReadyTask = null;
|
|
259
259
|
return await new Promise((resolve, reject) => {
|
|
260
260
|
this._whenReadyAsyncCancel = _RetryWithInterval(() => {
|
|
261
|
+
firstNotReadyTask = null;
|
|
261
262
|
let ready = this._renderContext._isReady();
|
|
262
263
|
for (const task of this._tasks) {
|
|
263
264
|
const taskIsReady = task.isReady();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frameGraph.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n type Scene,\r\n type AbstractEngine,\r\n type FrameGraphTask,\r\n type Nullable,\r\n type NodeRenderGraph,\r\n type IDisposable,\r\n type Camera,\r\n type FrameGraphObjectRendererTask,\r\n} from \"core/index\";\r\nimport { FrameGraphPass } from \"./Passes/pass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { FrameGraphObjectListPass } from \"./Passes/objectListPass\";\r\nimport { FrameGraphRenderContext } from \"./frameGraphRenderContext\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\nimport { FrameGraphTextureManager } from \"./frameGraphTextureManager\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { UniqueIdGenerator } from \"core/Misc/uniqueIdGenerator\";\r\n\r\nenum FrameGraphPassType {\r\n Normal = 0,\r\n Render = 1,\r\n ObjectList = 2,\r\n}\r\n\r\n/**\r\n * Class used to implement a frame graph\r\n */\r\nexport class FrameGraph implements IDisposable {\r\n /**\r\n * Gets the texture manager used by the frame graph\r\n */\r\n public readonly textureManager: FrameGraphTextureManager;\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _tasks: FrameGraphTask[] = [];\r\n private readonly _passContext: FrameGraphContext;\r\n private readonly _renderContext: FrameGraphRenderContext;\r\n private readonly _initAsyncPromises: Promise<unknown>[] = [];\r\n private _currentProcessedTask: FrameGraphTask | null = null;\r\n private _whenReadyAsyncCancel: Nullable<() => void> = null;\r\n private _importPromise: Promise<any>;\r\n\r\n /**\r\n * Name of the frame graph\r\n */\r\n public name = \"Frame Graph\";\r\n\r\n /**\r\n * Gets the unique id of the frame graph\r\n */\r\n public readonly uniqueId = UniqueIdGenerator.UniqueId;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that texture allocation should be optimized (that is, reuse existing textures when possible to limit GPU memory usage) (default: true)\r\n */\r\n public optimizeTextureAllocation = true;\r\n\r\n /**\r\n * Observable raised when the node render graph is built\r\n */\r\n public onBuildObservable = new Observable<FrameGraph>();\r\n\r\n /**\r\n * Gets the engine used by the frame graph\r\n */\r\n public get engine() {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the scene used by the frame graph\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the list of tasks in the frame graph\r\n */\r\n public get tasks() {\r\n return this._tasks;\r\n }\r\n\r\n /**\r\n * Indicates whether the execution of the frame graph is paused (default is false)\r\n */\r\n public pausedExecution = false;\r\n\r\n /**\r\n * Gets the node render graph linked to the frame graph (if any)\r\n * @returns the linked node render graph or null if none\r\n */\r\n public getLinkedNodeRenderGraph(): Nullable<NodeRenderGraph> {\r\n return this._linkedNodeRenderGraph;\r\n }\r\n\r\n /**\r\n * Constructs the frame graph\r\n * @param scene defines the scene the frame graph is associated with\r\n * @param debugTextures defines a boolean indicating that textures created by the frame graph should be visible in the inspector (default is false)\r\n * @param _linkedNodeRenderGraph defines the linked node render graph (if any)\r\n */\r\n constructor(\r\n scene: Scene,\r\n debugTextures = false,\r\n private readonly _linkedNodeRenderGraph: Nullable<NodeRenderGraph> = null\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._importPromise = this._engine.isWebGPU ? import(\"../Engines/WebGPU/Extensions/engine.multiRender\") : import(\"../Engines/Extensions/engine.multiRender\");\r\n this.textureManager = new FrameGraphTextureManager(this._engine, debugTextures, scene);\r\n this._passContext = new FrameGraphContext(this._engine, this.textureManager, scene);\r\n this._renderContext = new FrameGraphRenderContext(this._engine, this.textureManager, scene);\r\n\r\n this._scene.addFrameGraph(this);\r\n }\r\n\r\n /**\r\n * Gets the class name of the frame graph\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"FrameGraph\";\r\n }\r\n\r\n /**\r\n * Gets a task by name\r\n * @param name Name of the task to get\r\n * @returns The task or undefined if not found\r\n */\r\n public getTaskByName<T extends FrameGraphTask>(name: string): T | undefined {\r\n return this._tasks.find((t) => t.name === name) as T;\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific class name(s)\r\n * @param name Class name(s) of the task to get\r\n * @returns The list of tasks or an empty array if none found\r\n */\r\n public getTasksByClassNames<T extends FrameGraphTask>(name: string | string[]): T[] {\r\n return this._tasks.filter((t) => (Array.isArray(name) ? name.includes(t.getClassName()) : t.getClassName() === name)) as T[];\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific type\r\n * @param taskType Type of the task(s) to get\r\n * @returns The list of tasks of the specified type\r\n */\r\n public getTasksByType<T extends FrameGraphTask>(taskType: new (...args: any[]) => T): T[] {\r\n return this._tasks.filter((t) => t instanceof taskType) as T[];\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific type, based on their class name\r\n * @param taskClassName Class name(s) of the task(s) to get\r\n * @returns The list of tasks of the specified type\r\n */\r\n public getTasksByClassName<T extends FrameGraphTask>(taskClassName: string | string[]): T[] {\r\n return Array.isArray(taskClassName)\r\n ? (this._tasks.filter((t) => taskClassName.includes(t.getClassName())) as T[])\r\n : (this._tasks.filter((t) => t.getClassName() === taskClassName) as T[]);\r\n }\r\n\r\n /**\r\n * Adds a task to the frame graph\r\n * @param task Task to add\r\n */\r\n public addTask(task: FrameGraphTask): void {\r\n if (this._currentProcessedTask !== null) {\r\n throw new Error(`FrameGraph.addTask: Can't add the task \"${task.name}\" while another task is currently building (task: ${this._currentProcessedTask.name}).`);\r\n }\r\n\r\n if (this._tasks.includes(task)) {\r\n return;\r\n }\r\n\r\n this._tasks.push(task);\r\n this._initAsyncPromises.push(task.initAsync());\r\n }\r\n\r\n /**\r\n * Adds a pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The render pass created\r\n */\r\n public addPass(name: string, whenTaskDisabled = false): FrameGraphPass<FrameGraphContext> {\r\n return this._addPass(name, FrameGraphPassType.Normal, whenTaskDisabled) as FrameGraphPass<FrameGraphContext>;\r\n }\r\n\r\n /**\r\n * Adds a render pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The render pass created\r\n */\r\n public addRenderPass(name: string, whenTaskDisabled = false): FrameGraphRenderPass {\r\n return this._addPass(name, FrameGraphPassType.Render, whenTaskDisabled) as FrameGraphRenderPass;\r\n }\r\n\r\n /**\r\n * Adds an object list pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The object list pass created\r\n */\r\n public addObjectListPass(name: string, whenTaskDisabled = false): FrameGraphObjectListPass {\r\n return this._addPass(name, FrameGraphPassType.ObjectList, whenTaskDisabled) as FrameGraphObjectListPass;\r\n }\r\n\r\n private _addPass(name: string, passType: FrameGraphPassType, whenTaskDisabled = false): FrameGraphPass<FrameGraphContext> | FrameGraphRenderPass {\r\n if (!this._currentProcessedTask) {\r\n throw new Error(\"FrameGraph: A pass must be created during a Task.record execution only.\");\r\n }\r\n\r\n let pass: FrameGraphPass<FrameGraphContext> | FrameGraphRenderPass;\r\n\r\n switch (passType) {\r\n case FrameGraphPassType.Render:\r\n pass = new FrameGraphRenderPass(name, this._currentProcessedTask, this._renderContext, this._engine);\r\n break;\r\n case FrameGraphPassType.ObjectList:\r\n pass = new FrameGraphObjectListPass(name, this._currentProcessedTask, this._passContext, this._engine);\r\n break;\r\n default:\r\n pass = new FrameGraphPass(name, this._currentProcessedTask, this._passContext);\r\n break;\r\n }\r\n\r\n this._currentProcessedTask._addPass(pass, whenTaskDisabled);\r\n\r\n return pass;\r\n }\r\n\r\n /** @internal */\r\n public async _whenAsynchronousInitializationDoneAsync(): Promise<void> {\r\n if (this._initAsyncPromises.length > 0) {\r\n await Promise.all(this._initAsyncPromises);\r\n this._initAsyncPromises.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Builds the frame graph.\r\n * This method should be called after all tasks have been added to the frame graph (FrameGraph.addTask) and before the graph is executed (FrameGraph.execute).\r\n * @param waitForReadiness If true, the method will wait for the frame graph to be ready before returning (default is true)\r\n */\r\n public async buildAsync(waitForReadiness = true): Promise<void> {\r\n this.textureManager._releaseTextures(false);\r\n\r\n this.pausedExecution = true;\r\n\r\n try {\r\n await this._importPromise;\r\n\r\n await this._whenAsynchronousInitializationDoneAsync();\r\n\r\n for (const task of this._tasks) {\r\n task._reset();\r\n\r\n this._currentProcessedTask = task;\r\n this.textureManager._isRecordingTask = true;\r\n\r\n task.record();\r\n\r\n this.textureManager._isRecordingTask = false;\r\n this._currentProcessedTask = null;\r\n }\r\n\r\n this.textureManager._allocateTextures(this.optimizeTextureAllocation ? this._tasks : undefined);\r\n\r\n for (const task of this._tasks) {\r\n task._checkTask();\r\n }\r\n\r\n for (const task of this._tasks) {\r\n task.onTexturesAllocatedObservable.notifyObservers(this._renderContext);\r\n }\r\n\r\n for (const task of this._tasks) {\r\n task._initializePasses();\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n if (waitForReadiness) {\r\n await this.whenReadyAsync();\r\n }\r\n } catch (e) {\r\n this._tasks.length = 0;\r\n this._currentProcessedTask = null;\r\n this.textureManager._isRecordingTask = false;\r\n throw e;\r\n } finally {\r\n this.pausedExecution = false;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the frame graph is ready to be executed.\r\n * Note that you can use the whenReadyAsync method to wait for the frame graph to be ready.\r\n * @returns True if the frame graph is ready to be executed, else false\r\n */\r\n public isReady(): boolean {\r\n let ready = this._renderContext._isReady();\r\n for (const task of this._tasks) {\r\n ready &&= task.isReady();\r\n }\r\n return ready;\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the frame graph is ready to be executed.\r\n * In general, calling “await buildAsync()” should suffice, as this function also waits for readiness by default.\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 10000)\r\n * @returns The promise that resolves when the graph is ready\r\n */\r\n public async whenReadyAsync(timeStep = 16, maxTimeout = 10000): Promise<void> {\r\n let firstNotReadyTask: FrameGraphTask | null = null;\r\n\r\n return await new Promise((resolve, reject) => {\r\n this._whenReadyAsyncCancel = _RetryWithInterval(\r\n () => {\r\n let ready = this._renderContext._isReady();\r\n for (const task of this._tasks) {\r\n const taskIsReady = task.isReady();\r\n if (!taskIsReady && !firstNotReadyTask) {\r\n firstNotReadyTask = task;\r\n }\r\n ready &&= taskIsReady;\r\n }\r\n return ready;\r\n },\r\n () => {\r\n this._whenReadyAsyncCancel = null;\r\n resolve();\r\n },\r\n (err, isTimeout) => {\r\n this._whenReadyAsyncCancel = null;\r\n if (!isTimeout) {\r\n Logger.Error(\"FrameGraph: An unexpected error occurred while waiting for the frame graph to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(\r\n `FrameGraph: Timeout while waiting for the frame graph to be ready.${firstNotReadyTask ? ` First task not ready: ${firstNotReadyTask.name}` : \"\"}`\r\n );\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n reject(new Error(err));\r\n },\r\n timeStep,\r\n maxTimeout\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Executes the frame graph.\r\n */\r\n public execute(): void {\r\n if (this.pausedExecution) {\r\n return;\r\n }\r\n\r\n this._renderContext.restoreDefaultFramebuffer();\r\n\r\n this.textureManager._updateHistoryTextures();\r\n\r\n for (const task of this._tasks) {\r\n task._execute();\r\n }\r\n\r\n this._renderContext.restoreDefaultFramebuffer();\r\n }\r\n\r\n /**\r\n * Clears the frame graph (remove the tasks and release the textures).\r\n * The frame graph can be built again after this method is called.\r\n */\r\n public clear(): void {\r\n this._whenReadyAsyncCancel?.();\r\n this._whenReadyAsyncCancel = null;\r\n\r\n for (const task of this._tasks) {\r\n task._reset();\r\n }\r\n\r\n this._tasks.length = 0;\r\n this.textureManager._releaseTextures();\r\n this._currentProcessedTask = null;\r\n }\r\n\r\n /**\r\n * Looks for the main camera used by the frame graph.\r\n * By default, this is the camera used by the main object renderer task.\r\n * If no such task, we try to find a camera in a utility layer renderer tasks.\r\n * @returns The main camera used by the frame graph, or null if not found\r\n */\r\n public findMainCamera(): Nullable<Camera> {\r\n const mainObjectRenderer = this.findMainObjectRenderer();\r\n if (mainObjectRenderer) {\r\n return mainObjectRenderer.camera;\r\n }\r\n\r\n // Try to find a camera in the utility layer renderer tasks\r\n const tasks = this.tasks;\r\n\r\n for (let i = tasks.length - 1; i >= 0; i--) {\r\n const task = tasks[i];\r\n if (task.getClassName() === \"FrameGraphUtilityLayerRendererTask\") {\r\n return (task as unknown as { camera: Camera }).camera;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Looks for the main object renderer task in the frame graph.\r\n * By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.\r\n * If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).\r\n * @returns The main object renderer of the frame graph, or null if not found\r\n */\r\n public findMainObjectRenderer(): Nullable<FrameGraphObjectRendererTask> {\r\n const objectRenderers = this.getTasksByClassNames<FrameGraphObjectRendererTask>([\"FrameGraphObjectRendererTask\", \"FrameGraphGeometryRendererTask\"]);\r\n\r\n let fallbackRenderer: Nullable<FrameGraphObjectRendererTask> = null;\r\n for (let i = objectRenderers.length - 1; i >= 0; --i) {\r\n const meshes = objectRenderers[i].objectList.meshes;\r\n if (objectRenderers[i].isMainObjectRenderer) {\r\n return objectRenderers[i];\r\n }\r\n if ((!meshes || meshes.length > 0) && !fallbackRenderer) {\r\n fallbackRenderer = objectRenderers[i];\r\n }\r\n }\r\n return fallbackRenderer;\r\n }\r\n\r\n /**\r\n * Disposes the frame graph\r\n */\r\n public dispose(): void {\r\n this._whenReadyAsyncCancel?.();\r\n this._whenReadyAsyncCancel = null;\r\n this.clear();\r\n this.textureManager._dispose();\r\n this._renderContext._dispose();\r\n\r\n this._scene.removeFrameGraph(this);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"frameGraph.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n type Scene,\r\n type AbstractEngine,\r\n type FrameGraphTask,\r\n type Nullable,\r\n type NodeRenderGraph,\r\n type IDisposable,\r\n type Camera,\r\n type FrameGraphObjectRendererTask,\r\n} from \"core/index\";\r\nimport { FrameGraphPass } from \"./Passes/pass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { FrameGraphObjectListPass } from \"./Passes/objectListPass\";\r\nimport { FrameGraphRenderContext } from \"./frameGraphRenderContext\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\nimport { FrameGraphTextureManager } from \"./frameGraphTextureManager\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { _RetryWithInterval } from \"core/Misc/timingTools\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { UniqueIdGenerator } from \"core/Misc/uniqueIdGenerator\";\r\n\r\nenum FrameGraphPassType {\r\n Normal = 0,\r\n Render = 1,\r\n ObjectList = 2,\r\n}\r\n\r\n/**\r\n * Class used to implement a frame graph\r\n */\r\nexport class FrameGraph implements IDisposable {\r\n /**\r\n * Gets the texture manager used by the frame graph\r\n */\r\n public readonly textureManager: FrameGraphTextureManager;\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _tasks: FrameGraphTask[] = [];\r\n private readonly _passContext: FrameGraphContext;\r\n private readonly _renderContext: FrameGraphRenderContext;\r\n private readonly _initAsyncPromises: Promise<unknown>[] = [];\r\n private _currentProcessedTask: FrameGraphTask | null = null;\r\n private _whenReadyAsyncCancel: Nullable<() => void> = null;\r\n private _importPromise: Promise<any>;\r\n\r\n /**\r\n * Name of the frame graph\r\n */\r\n public name = \"Frame Graph\";\r\n\r\n /**\r\n * Gets the unique id of the frame graph\r\n */\r\n public readonly uniqueId = UniqueIdGenerator.UniqueId;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that texture allocation should be optimized (that is, reuse existing textures when possible to limit GPU memory usage) (default: true)\r\n */\r\n public optimizeTextureAllocation = true;\r\n\r\n /**\r\n * Observable raised when the node render graph is built\r\n */\r\n public onBuildObservable = new Observable<FrameGraph>();\r\n\r\n /**\r\n * Gets the engine used by the frame graph\r\n */\r\n public get engine() {\r\n return this._engine;\r\n }\r\n\r\n /**\r\n * Gets the scene used by the frame graph\r\n */\r\n public get scene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Gets the list of tasks in the frame graph\r\n */\r\n public get tasks() {\r\n return this._tasks;\r\n }\r\n\r\n /**\r\n * Indicates whether the execution of the frame graph is paused (default is false)\r\n */\r\n public pausedExecution = false;\r\n\r\n /**\r\n * Gets the node render graph linked to the frame graph (if any)\r\n * @returns the linked node render graph or null if none\r\n */\r\n public getLinkedNodeRenderGraph(): Nullable<NodeRenderGraph> {\r\n return this._linkedNodeRenderGraph;\r\n }\r\n\r\n /**\r\n * Constructs the frame graph\r\n * @param scene defines the scene the frame graph is associated with\r\n * @param debugTextures defines a boolean indicating that textures created by the frame graph should be visible in the inspector (default is false)\r\n * @param _linkedNodeRenderGraph defines the linked node render graph (if any)\r\n */\r\n constructor(\r\n scene: Scene,\r\n debugTextures = false,\r\n private readonly _linkedNodeRenderGraph: Nullable<NodeRenderGraph> = null\r\n ) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._importPromise = this._engine.isWebGPU ? import(\"../Engines/WebGPU/Extensions/engine.multiRender\") : import(\"../Engines/Extensions/engine.multiRender\");\r\n this.textureManager = new FrameGraphTextureManager(this._engine, debugTextures, scene);\r\n this._passContext = new FrameGraphContext(this._engine, this.textureManager, scene);\r\n this._renderContext = new FrameGraphRenderContext(this._engine, this.textureManager, scene);\r\n\r\n this._scene.addFrameGraph(this);\r\n }\r\n\r\n /**\r\n * Gets the class name of the frame graph\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"FrameGraph\";\r\n }\r\n\r\n /**\r\n * Gets a task by name\r\n * @param name Name of the task to get\r\n * @returns The task or undefined if not found\r\n */\r\n public getTaskByName<T extends FrameGraphTask>(name: string): T | undefined {\r\n return this._tasks.find((t) => t.name === name) as T;\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific class name(s)\r\n * @param name Class name(s) of the task to get\r\n * @returns The list of tasks or an empty array if none found\r\n */\r\n public getTasksByClassNames<T extends FrameGraphTask>(name: string | string[]): T[] {\r\n return this._tasks.filter((t) => (Array.isArray(name) ? name.includes(t.getClassName()) : t.getClassName() === name)) as T[];\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific type\r\n * @param taskType Type of the task(s) to get\r\n * @returns The list of tasks of the specified type\r\n */\r\n public getTasksByType<T extends FrameGraphTask>(taskType: new (...args: any[]) => T): T[] {\r\n return this._tasks.filter((t) => t instanceof taskType) as T[];\r\n }\r\n\r\n /**\r\n * Gets all tasks of a specific type, based on their class name\r\n * @param taskClassName Class name(s) of the task(s) to get\r\n * @returns The list of tasks of the specified type\r\n */\r\n public getTasksByClassName<T extends FrameGraphTask>(taskClassName: string | string[]): T[] {\r\n return Array.isArray(taskClassName)\r\n ? (this._tasks.filter((t) => taskClassName.includes(t.getClassName())) as T[])\r\n : (this._tasks.filter((t) => t.getClassName() === taskClassName) as T[]);\r\n }\r\n\r\n /**\r\n * Adds a task to the frame graph\r\n * @param task Task to add\r\n */\r\n public addTask(task: FrameGraphTask): void {\r\n if (this._currentProcessedTask !== null) {\r\n throw new Error(`FrameGraph.addTask: Can't add the task \"${task.name}\" while another task is currently building (task: ${this._currentProcessedTask.name}).`);\r\n }\r\n\r\n if (this._tasks.includes(task)) {\r\n return;\r\n }\r\n\r\n this._tasks.push(task);\r\n this._initAsyncPromises.push(task.initAsync());\r\n }\r\n\r\n /**\r\n * Adds a pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The render pass created\r\n */\r\n public addPass(name: string, whenTaskDisabled = false): FrameGraphPass<FrameGraphContext> {\r\n return this._addPass(name, FrameGraphPassType.Normal, whenTaskDisabled) as FrameGraphPass<FrameGraphContext>;\r\n }\r\n\r\n /**\r\n * Adds a render pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The render pass created\r\n */\r\n public addRenderPass(name: string, whenTaskDisabled = false): FrameGraphRenderPass {\r\n return this._addPass(name, FrameGraphPassType.Render, whenTaskDisabled) as FrameGraphRenderPass;\r\n }\r\n\r\n /**\r\n * Adds an object list pass to a task. This method can only be called during a Task.record execution.\r\n * @param name The name of the pass\r\n * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)\r\n * @returns The object list pass created\r\n */\r\n public addObjectListPass(name: string, whenTaskDisabled = false): FrameGraphObjectListPass {\r\n return this._addPass(name, FrameGraphPassType.ObjectList, whenTaskDisabled) as FrameGraphObjectListPass;\r\n }\r\n\r\n private _addPass(name: string, passType: FrameGraphPassType, whenTaskDisabled = false): FrameGraphPass<FrameGraphContext> | FrameGraphRenderPass {\r\n if (!this._currentProcessedTask) {\r\n throw new Error(\"FrameGraph: A pass must be created during a Task.record execution only.\");\r\n }\r\n\r\n let pass: FrameGraphPass<FrameGraphContext> | FrameGraphRenderPass;\r\n\r\n switch (passType) {\r\n case FrameGraphPassType.Render:\r\n pass = new FrameGraphRenderPass(name, this._currentProcessedTask, this._renderContext, this._engine);\r\n break;\r\n case FrameGraphPassType.ObjectList:\r\n pass = new FrameGraphObjectListPass(name, this._currentProcessedTask, this._passContext, this._engine);\r\n break;\r\n default:\r\n pass = new FrameGraphPass(name, this._currentProcessedTask, this._passContext);\r\n break;\r\n }\r\n\r\n this._currentProcessedTask._addPass(pass, whenTaskDisabled);\r\n\r\n return pass;\r\n }\r\n\r\n /** @internal */\r\n public async _whenAsynchronousInitializationDoneAsync(): Promise<void> {\r\n if (this._initAsyncPromises.length > 0) {\r\n await Promise.all(this._initAsyncPromises);\r\n this._initAsyncPromises.length = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Builds the frame graph.\r\n * This method should be called after all tasks have been added to the frame graph (FrameGraph.addTask) and before the graph is executed (FrameGraph.execute).\r\n * @param waitForReadiness If true, the method will wait for the frame graph to be ready before returning (default is true)\r\n */\r\n public async buildAsync(waitForReadiness = true): Promise<void> {\r\n this.textureManager._releaseTextures(false);\r\n\r\n this.pausedExecution = true;\r\n\r\n try {\r\n await this._importPromise;\r\n\r\n await this._whenAsynchronousInitializationDoneAsync();\r\n\r\n for (const task of this._tasks) {\r\n task._reset();\r\n\r\n this._currentProcessedTask = task;\r\n this.textureManager._isRecordingTask = true;\r\n\r\n task.record();\r\n\r\n this.textureManager._isRecordingTask = false;\r\n this._currentProcessedTask = null;\r\n }\r\n\r\n this.textureManager._allocateTextures(this.optimizeTextureAllocation ? this._tasks : undefined);\r\n\r\n for (const task of this._tasks) {\r\n task._checkTask();\r\n }\r\n\r\n for (const task of this._tasks) {\r\n task.onTexturesAllocatedObservable.notifyObservers(this._renderContext);\r\n }\r\n\r\n for (const task of this._tasks) {\r\n task._initializePasses();\r\n }\r\n\r\n this.onBuildObservable.notifyObservers(this);\r\n\r\n if (waitForReadiness) {\r\n await this.whenReadyAsync();\r\n }\r\n } catch (e) {\r\n this._tasks.length = 0;\r\n this._currentProcessedTask = null;\r\n this.textureManager._isRecordingTask = false;\r\n throw e;\r\n } finally {\r\n this.pausedExecution = false;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if the frame graph is ready to be executed.\r\n * Note that you can use the whenReadyAsync method to wait for the frame graph to be ready.\r\n * @returns True if the frame graph is ready to be executed, else false\r\n */\r\n public isReady(): boolean {\r\n let ready = this._renderContext._isReady();\r\n for (const task of this._tasks) {\r\n ready &&= task.isReady();\r\n }\r\n return ready;\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the frame graph is ready to be executed.\r\n * In general, calling “await buildAsync()” should suffice, as this function also waits for readiness by default.\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 10000)\r\n * @returns The promise that resolves when the graph is ready\r\n */\r\n public async whenReadyAsync(timeStep = 16, maxTimeout = 10000): Promise<void> {\r\n let firstNotReadyTask: FrameGraphTask | null = null;\r\n\r\n return await new Promise((resolve, reject) => {\r\n this._whenReadyAsyncCancel = _RetryWithInterval(\r\n () => {\r\n firstNotReadyTask = null;\r\n let ready = this._renderContext._isReady();\r\n for (const task of this._tasks) {\r\n const taskIsReady = task.isReady();\r\n if (!taskIsReady && !firstNotReadyTask) {\r\n firstNotReadyTask = task;\r\n }\r\n ready &&= taskIsReady;\r\n }\r\n return ready;\r\n },\r\n () => {\r\n this._whenReadyAsyncCancel = null;\r\n resolve();\r\n },\r\n (err, isTimeout) => {\r\n this._whenReadyAsyncCancel = null;\r\n if (!isTimeout) {\r\n Logger.Error(\"FrameGraph: An unexpected error occurred while waiting for the frame graph to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(\r\n `FrameGraph: Timeout while waiting for the frame graph to be ready.${firstNotReadyTask ? ` First task not ready: ${firstNotReadyTask.name}` : \"\"}`\r\n );\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n reject(new Error(err));\r\n },\r\n timeStep,\r\n maxTimeout\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Executes the frame graph.\r\n */\r\n public execute(): void {\r\n if (this.pausedExecution) {\r\n return;\r\n }\r\n\r\n this._renderContext.restoreDefaultFramebuffer();\r\n\r\n this.textureManager._updateHistoryTextures();\r\n\r\n for (const task of this._tasks) {\r\n task._execute();\r\n }\r\n\r\n this._renderContext.restoreDefaultFramebuffer();\r\n }\r\n\r\n /**\r\n * Clears the frame graph (remove the tasks and release the textures).\r\n * The frame graph can be built again after this method is called.\r\n */\r\n public clear(): void {\r\n this._whenReadyAsyncCancel?.();\r\n this._whenReadyAsyncCancel = null;\r\n\r\n for (const task of this._tasks) {\r\n task._reset();\r\n }\r\n\r\n this._tasks.length = 0;\r\n this.textureManager._releaseTextures();\r\n this._currentProcessedTask = null;\r\n }\r\n\r\n /**\r\n * Looks for the main camera used by the frame graph.\r\n * By default, this is the camera used by the main object renderer task.\r\n * If no such task, we try to find a camera in a utility layer renderer tasks.\r\n * @returns The main camera used by the frame graph, or null if not found\r\n */\r\n public findMainCamera(): Nullable<Camera> {\r\n const mainObjectRenderer = this.findMainObjectRenderer();\r\n if (mainObjectRenderer) {\r\n return mainObjectRenderer.camera;\r\n }\r\n\r\n // Try to find a camera in the utility layer renderer tasks\r\n const tasks = this.tasks;\r\n\r\n for (let i = tasks.length - 1; i >= 0; i--) {\r\n const task = tasks[i];\r\n if (task.getClassName() === \"FrameGraphUtilityLayerRendererTask\") {\r\n return (task as unknown as { camera: Camera }).camera;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Looks for the main object renderer task in the frame graph.\r\n * By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.\r\n * If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).\r\n * @returns The main object renderer of the frame graph, or null if not found\r\n */\r\n public findMainObjectRenderer(): Nullable<FrameGraphObjectRendererTask> {\r\n const objectRenderers = this.getTasksByClassNames<FrameGraphObjectRendererTask>([\"FrameGraphObjectRendererTask\", \"FrameGraphGeometryRendererTask\"]);\r\n\r\n let fallbackRenderer: Nullable<FrameGraphObjectRendererTask> = null;\r\n for (let i = objectRenderers.length - 1; i >= 0; --i) {\r\n const meshes = objectRenderers[i].objectList.meshes;\r\n if (objectRenderers[i].isMainObjectRenderer) {\r\n return objectRenderers[i];\r\n }\r\n if ((!meshes || meshes.length > 0) && !fallbackRenderer) {\r\n fallbackRenderer = objectRenderers[i];\r\n }\r\n }\r\n return fallbackRenderer;\r\n }\r\n\r\n /**\r\n * Disposes the frame graph\r\n */\r\n public dispose(): void {\r\n this._whenReadyAsyncCancel?.();\r\n this._whenReadyAsyncCancel = null;\r\n this.clear();\r\n this.textureManager._dispose();\r\n this._renderContext._dispose();\r\n\r\n this._scene.removeFrameGraph(this);\r\n }\r\n}\r\n"]}
|
package/FrameGraph/index.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export * from "./Tasks/Texture/copyToTextureTask.js";
|
|
|
45
45
|
export * from "./Tasks/Texture/generateMipMapsTask.js";
|
|
46
46
|
export * from "./Tasks/Rendering/csmShadowGeneratorTask.js";
|
|
47
47
|
export * from "./Tasks/Rendering/geometryRendererTask.js";
|
|
48
|
+
export * from "./Tasks/Rendering/iblShadowsRendererTask.js";
|
|
48
49
|
export * from "./Tasks/Rendering/objectRendererTask.js";
|
|
49
50
|
export * from "./Tasks/Rendering/shadowGeneratorTask.js";
|
|
50
51
|
export * from "./Tasks/Rendering/utilityLayerRendererTask.js";
|
package/FrameGraph/index.js
CHANGED
|
@@ -46,6 +46,7 @@ export * from "./Tasks/Texture/copyToTextureTask.js";
|
|
|
46
46
|
export * from "./Tasks/Texture/generateMipMapsTask.js";
|
|
47
47
|
export * from "./Tasks/Rendering/csmShadowGeneratorTask.js";
|
|
48
48
|
export * from "./Tasks/Rendering/geometryRendererTask.js";
|
|
49
|
+
export * from "./Tasks/Rendering/iblShadowsRendererTask.js";
|
|
49
50
|
export * from "./Tasks/Rendering/objectRendererTask.js";
|
|
50
51
|
export * from "./Tasks/Rendering/shadowGeneratorTask.js";
|
|
51
52
|
export * from "./Tasks/Rendering/utilityLayerRendererTask.js";
|
package/FrameGraph/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAEhD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,kDAAkD,CAAC;AACjE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAE7D,cAAc,kCAAkC,CAAC;AACjD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Node/nodeRenderGraph\";\r\nexport * from \"./Node/nodeRenderGraphBlock\";\r\nexport * from \"./Node/nodeRenderGraphBlockConnectionPoint\";\r\nexport * from \"./Node/nodeRenderGraphBuildState\";\r\nexport * from \"./Node/Types/nodeRenderGraphTypes\";\r\nexport * from \"./Node/Blocks/index\";\r\n\r\nexport * from \"./Passes/objectListPass\";\r\nexport * from \"./Passes/pass\";\r\nexport * from \"./Passes/renderPass\";\r\n\r\nexport * from \"./Tasks/Layers/glowLayerTask\";\r\nexport * from \"./Tasks/Layers/highlightLayerTask\";\r\nexport * from \"./Tasks/Layers/selectionOutlineTask\";\r\n\r\nexport * from \"./Tasks/Misc/computeShaderTask\";\r\nexport * from \"./Tasks/Misc/cullObjectsTask\";\r\nexport * from \"./Tasks/Misc/executeTask\";\r\nexport * from \"./Tasks/Misc/lightingVolumeTask\";\r\n\r\nexport * from \"./Tasks/PostProcesses/anaglyphTask\";\r\nexport * from \"./Tasks/PostProcesses/blackAndWhiteTask\";\r\nexport * from \"./Tasks/PostProcesses/bloomTask\";\r\nexport * from \"./Tasks/PostProcesses/blurTask\";\r\nexport * from \"./Tasks/PostProcesses/chromaticAberrationTask\";\r\nexport * from \"./Tasks/PostProcesses/circleOfConfusionTask\";\r\nexport * from \"./Tasks/PostProcesses/colorCorrectionTask\";\r\nexport * from \"./Tasks/PostProcesses/convolutionTask\";\r\nexport * from \"./Tasks/PostProcesses/customPostProcessTask\";\r\nexport * from \"./Tasks/PostProcesses/depthOfFieldTask\";\r\nexport * from \"./Tasks/PostProcesses/extractHighlightsTask\";\r\nexport * from \"./Tasks/PostProcesses/filterTask\";\r\nexport * from \"./Tasks/PostProcesses/fxaaTask\";\r\nexport * from \"./Tasks/PostProcesses/grainTask\";\r\nexport * from \"./Tasks/PostProcesses/imageProcessingTask\";\r\nexport * from \"./Tasks/PostProcesses/motionBlurTask\";\r\nexport * from \"./Tasks/PostProcesses/passTask\";\r\nexport * from \"./Tasks/PostProcesses/postProcessTask\";\r\nexport * from \"./Tasks/PostProcesses/sharpenTask\";\r\nexport * from \"./Tasks/PostProcesses/screenSpaceCurvatureTask\";\r\nexport * from \"./Tasks/PostProcesses/ssao2RenderingPipelineTask\";\r\nexport * from \"./Tasks/PostProcesses/ssrRenderingPipelineTask\";\r\nexport * from \"./Tasks/PostProcesses/taaTask\";\r\nexport * from \"./Tasks/PostProcesses/tonemapTask\";\r\nexport * from \"./Tasks/PostProcesses/volumetricLightingTask\";\r\n\r\nexport * from \"./Tasks/Texture/clearTextureTask\";\r\nexport * from \"./Tasks/Texture/copyToBackbufferColorTask\";\r\nexport * from \"./Tasks/Texture/copyToTextureTask\";\r\nexport * from \"./Tasks/Texture/generateMipMapsTask\";\r\n\r\nexport * from \"./Tasks/Rendering/csmShadowGeneratorTask\";\r\nexport * from \"./Tasks/Rendering/geometryRendererTask\";\r\nexport * from \"./Tasks/Rendering/objectRendererTask\";\r\nexport * from \"./Tasks/Rendering/shadowGeneratorTask\";\r\nexport * from \"./Tasks/Rendering/utilityLayerRendererTask\";\r\n\r\nexport * from \"./frameGraph\";\r\nexport * from \"./frameGraphContext\";\r\nexport * from \"./frameGraphObjectList\";\r\nexport * from \"./frameGraphRenderContext\";\r\nexport * from \"./frameGraphRenderTarget\";\r\nexport * from \"./frameGraphTask\";\r\nexport * from \"./frameGraphTextureManager\";\r\nexport * from \"./frameGraphTypes\";\r\nexport * from \"./frameGraphUtils\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/index.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAEhD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,kDAAkD,CAAC;AACjE,cAAc,gDAAgD,CAAC;AAC/D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAE7D,cAAc,kCAAkC,CAAC;AACjD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AAEpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAE3D,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-restricted-imports */\r\nexport * from \"./Node/nodeRenderGraph\";\r\nexport * from \"./Node/nodeRenderGraphBlock\";\r\nexport * from \"./Node/nodeRenderGraphBlockConnectionPoint\";\r\nexport * from \"./Node/nodeRenderGraphBuildState\";\r\nexport * from \"./Node/Types/nodeRenderGraphTypes\";\r\nexport * from \"./Node/Blocks/index\";\r\n\r\nexport * from \"./Passes/objectListPass\";\r\nexport * from \"./Passes/pass\";\r\nexport * from \"./Passes/renderPass\";\r\n\r\nexport * from \"./Tasks/Layers/glowLayerTask\";\r\nexport * from \"./Tasks/Layers/highlightLayerTask\";\r\nexport * from \"./Tasks/Layers/selectionOutlineTask\";\r\n\r\nexport * from \"./Tasks/Misc/computeShaderTask\";\r\nexport * from \"./Tasks/Misc/cullObjectsTask\";\r\nexport * from \"./Tasks/Misc/executeTask\";\r\nexport * from \"./Tasks/Misc/lightingVolumeTask\";\r\n\r\nexport * from \"./Tasks/PostProcesses/anaglyphTask\";\r\nexport * from \"./Tasks/PostProcesses/blackAndWhiteTask\";\r\nexport * from \"./Tasks/PostProcesses/bloomTask\";\r\nexport * from \"./Tasks/PostProcesses/blurTask\";\r\nexport * from \"./Tasks/PostProcesses/chromaticAberrationTask\";\r\nexport * from \"./Tasks/PostProcesses/circleOfConfusionTask\";\r\nexport * from \"./Tasks/PostProcesses/colorCorrectionTask\";\r\nexport * from \"./Tasks/PostProcesses/convolutionTask\";\r\nexport * from \"./Tasks/PostProcesses/customPostProcessTask\";\r\nexport * from \"./Tasks/PostProcesses/depthOfFieldTask\";\r\nexport * from \"./Tasks/PostProcesses/extractHighlightsTask\";\r\nexport * from \"./Tasks/PostProcesses/filterTask\";\r\nexport * from \"./Tasks/PostProcesses/fxaaTask\";\r\nexport * from \"./Tasks/PostProcesses/grainTask\";\r\nexport * from \"./Tasks/PostProcesses/imageProcessingTask\";\r\nexport * from \"./Tasks/PostProcesses/motionBlurTask\";\r\nexport * from \"./Tasks/PostProcesses/passTask\";\r\nexport * from \"./Tasks/PostProcesses/postProcessTask\";\r\nexport * from \"./Tasks/PostProcesses/sharpenTask\";\r\nexport * from \"./Tasks/PostProcesses/screenSpaceCurvatureTask\";\r\nexport * from \"./Tasks/PostProcesses/ssao2RenderingPipelineTask\";\r\nexport * from \"./Tasks/PostProcesses/ssrRenderingPipelineTask\";\r\nexport * from \"./Tasks/PostProcesses/taaTask\";\r\nexport * from \"./Tasks/PostProcesses/tonemapTask\";\r\nexport * from \"./Tasks/PostProcesses/volumetricLightingTask\";\r\n\r\nexport * from \"./Tasks/Texture/clearTextureTask\";\r\nexport * from \"./Tasks/Texture/copyToBackbufferColorTask\";\r\nexport * from \"./Tasks/Texture/copyToTextureTask\";\r\nexport * from \"./Tasks/Texture/generateMipMapsTask\";\r\n\r\nexport * from \"./Tasks/Rendering/csmShadowGeneratorTask\";\r\nexport * from \"./Tasks/Rendering/geometryRendererTask\";\r\nexport * from \"./Tasks/Rendering/iblShadowsRendererTask\";\r\nexport * from \"./Tasks/Rendering/objectRendererTask\";\r\nexport * from \"./Tasks/Rendering/shadowGeneratorTask\";\r\nexport * from \"./Tasks/Rendering/utilityLayerRendererTask\";\r\n\r\nexport * from \"./frameGraph\";\r\nexport * from \"./frameGraphContext\";\r\nexport * from \"./frameGraphObjectList\";\r\nexport * from \"./frameGraphRenderContext\";\r\nexport * from \"./frameGraphRenderTarget\";\r\nexport * from \"./frameGraphTask\";\r\nexport * from \"./frameGraphTextureManager\";\r\nexport * from \"./frameGraphTypes\";\r\nexport * from \"./frameGraphUtils\";\r\n"]}
|
|
@@ -3,6 +3,7 @@ import { type Scene } from "../../scene.js";
|
|
|
3
3
|
import { Color3 } from "../../Maths/math.color.js";
|
|
4
4
|
import { ImageProcessingConfiguration } from "../imageProcessingConfiguration.js";
|
|
5
5
|
import { type BaseTexture } from "../../Materials/Textures/baseTexture.js";
|
|
6
|
+
import { type ThinTexture } from "../../Materials/Textures/thinTexture.js";
|
|
6
7
|
import { Material } from "../material.js";
|
|
7
8
|
import { type Engine } from "../../Engines/engine.js";
|
|
8
9
|
import { type AbstractMesh } from "../../Meshes/abstractMesh.js";
|
|
@@ -811,16 +812,26 @@ export declare class OpenPBRMaterial extends OpenPBRMaterialBase {
|
|
|
811
812
|
*/
|
|
812
813
|
ambientOcclusionTexture: Nullable<BaseTexture>;
|
|
813
814
|
private _ambientOcclusionTexture;
|
|
815
|
+
private _sssIrradianceTexture;
|
|
814
816
|
/**
|
|
815
817
|
* Defines the irradiance texture used for subsurface scattering.
|
|
816
818
|
* If it's not provided, the irradiance will be looked for in the scene.geometryBufferRenderer.
|
|
819
|
+
* Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
|
|
820
|
+
* handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
|
|
821
|
+
* Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
|
|
817
822
|
*/
|
|
818
|
-
sssIrradianceTexture: Nullable<
|
|
823
|
+
get sssIrradianceTexture(): Nullable<ThinTexture>;
|
|
824
|
+
set sssIrradianceTexture(value: Nullable<ThinTexture>);
|
|
825
|
+
private _sssDepthTexture;
|
|
819
826
|
/**
|
|
820
827
|
* Defines the depth texture used for subsurface scattering. This is the depth defined
|
|
821
828
|
* in screen space. If it's not provided, the depth will be looked for in the scene.geometryBufferRenderer.
|
|
829
|
+
* Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
|
|
830
|
+
* handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
|
|
831
|
+
* Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
|
|
822
832
|
*/
|
|
823
|
-
sssDepthTexture: Nullable<
|
|
833
|
+
get sssDepthTexture(): Nullable<ThinTexture>;
|
|
834
|
+
set sssDepthTexture(value: Nullable<ThinTexture>);
|
|
824
835
|
private _propertyList;
|
|
825
836
|
private _uniformsList;
|
|
826
837
|
private _samplersList;
|
|
@@ -377,6 +377,40 @@ export class OpenPBRMaterial extends OpenPBRMaterialBase {
|
|
|
377
377
|
set geometryCoatTangentAngle(value) {
|
|
378
378
|
this.geometryCoatTangent = new Vector2(Math.cos(value), Math.sin(value));
|
|
379
379
|
}
|
|
380
|
+
/**
|
|
381
|
+
* Defines the irradiance texture used for subsurface scattering.
|
|
382
|
+
* If it's not provided, the irradiance will be looked for in the scene.geometryBufferRenderer.
|
|
383
|
+
* Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
|
|
384
|
+
* handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
|
|
385
|
+
* Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
|
|
386
|
+
*/
|
|
387
|
+
get sssIrradianceTexture() {
|
|
388
|
+
return this._sssIrradianceTexture;
|
|
389
|
+
}
|
|
390
|
+
set sssIrradianceTexture(value) {
|
|
391
|
+
if (this._sssIrradianceTexture === value) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
this._sssIrradianceTexture = value;
|
|
395
|
+
this._markAllSubMeshesAsTexturesDirty();
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Defines the depth texture used for subsurface scattering. This is the depth defined
|
|
399
|
+
* in screen space. If it's not provided, the depth will be looked for in the scene.geometryBufferRenderer.
|
|
400
|
+
* Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
|
|
401
|
+
* handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
|
|
402
|
+
* Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
|
|
403
|
+
*/
|
|
404
|
+
get sssDepthTexture() {
|
|
405
|
+
return this._sssDepthTexture;
|
|
406
|
+
}
|
|
407
|
+
set sssDepthTexture(value) {
|
|
408
|
+
if (this._sssDepthTexture === value) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
this._sssDepthTexture = value;
|
|
412
|
+
this._markAllSubMeshesAsTexturesDirty();
|
|
413
|
+
}
|
|
380
414
|
/**
|
|
381
415
|
* Specifies if we can see through the surface of the material due to subsurface scattering or transmission.
|
|
382
416
|
*/
|
|
@@ -571,16 +605,8 @@ export class OpenPBRMaterial extends OpenPBRMaterialBase {
|
|
|
571
605
|
this._thinFilmThicknessTexture = new Sampler("thin_film_thickness", "thinFilmThickness", "THIN_FILM_THICKNESS");
|
|
572
606
|
this._thinFilmIor = new Property("thin_film_ior", 1.4, "vThinFilmIor", 1, 0);
|
|
573
607
|
this._ambientOcclusionTexture = new Sampler("ambient_occlusion", "ambientOcclusion", "AMBIENT_OCCLUSION");
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
* If it's not provided, the irradiance will be looked for in the scene.geometryBufferRenderer.
|
|
577
|
-
*/
|
|
578
|
-
this.sssIrradianceTexture = null;
|
|
579
|
-
/**
|
|
580
|
-
* Defines the depth texture used for subsurface scattering. This is the depth defined
|
|
581
|
-
* in screen space. If it's not provided, the depth will be looked for in the scene.geometryBufferRenderer.
|
|
582
|
-
*/
|
|
583
|
-
this.sssDepthTexture = null;
|
|
608
|
+
this._sssIrradianceTexture = null;
|
|
609
|
+
this._sssDepthTexture = null;
|
|
584
610
|
this._uniformsList = {};
|
|
585
611
|
this._samplersList = {};
|
|
586
612
|
this._samplerDefines = {};
|
|
@@ -1302,6 +1328,17 @@ export class OpenPBRMaterial extends OpenPBRMaterialBase {
|
|
|
1302
1328
|
return false;
|
|
1303
1329
|
}
|
|
1304
1330
|
}
|
|
1331
|
+
// When both SSS textures are assigned they will be used for screen-space subsurface
|
|
1332
|
+
// scattering. Block readiness until both underlying textures are loaded so that
|
|
1333
|
+
// scene.onReadyObservable never fires with missing SSS data.
|
|
1334
|
+
if (this._sssIrradianceTexture && this._sssDepthTexture) {
|
|
1335
|
+
if (!this._sssIrradianceTexture.isReady()) {
|
|
1336
|
+
return false;
|
|
1337
|
+
}
|
|
1338
|
+
if (!this._sssDepthTexture.isReady()) {
|
|
1339
|
+
return false;
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1305
1342
|
}
|
|
1306
1343
|
}
|
|
1307
1344
|
this._eventInfo.isReadyForSubMesh = true;
|
|
@@ -1613,12 +1650,6 @@ export class OpenPBRMaterial extends OpenPBRMaterialBase {
|
|
|
1613
1650
|
if (this._radianceTexture) {
|
|
1614
1651
|
activeTextures.push(this._radianceTexture);
|
|
1615
1652
|
}
|
|
1616
|
-
if (this.sssIrradianceTexture) {
|
|
1617
|
-
activeTextures.push(this.sssIrradianceTexture);
|
|
1618
|
-
}
|
|
1619
|
-
if (this.sssDepthTexture) {
|
|
1620
|
-
activeTextures.push(this.sssDepthTexture);
|
|
1621
|
-
}
|
|
1622
1653
|
return activeTextures;
|
|
1623
1654
|
}
|
|
1624
1655
|
/**
|