@babylonjs/core 8.40.0 → 8.41.0
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/Compute/computeEffect.js +5 -1
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.d.ts +4 -0
- package/Compute/computeShader.js +9 -3
- package/Compute/computeShader.js.map +1 -1
- package/Engines/Extensions/engine.computeShader.d.ts +2 -3
- package/Engines/Extensions/engine.computeShader.js.map +1 -1
- package/Engines/ICanvas.d.ts +3 -3
- package/Engines/ICanvas.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +2 -2
- package/Engines/webgpuEngine.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +3 -0
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +29 -14
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +12 -41
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +106 -184
- package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
- package/FrameGraph/Passes/renderPass.js +5 -3
- package/FrameGraph/Passes/renderPass.js.map +1 -1
- package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +2 -0
- package/FrameGraph/Tasks/Layers/baseLayerTask.js +6 -0
- package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/Layers/glowLayerTask.d.ts +1 -0
- package/FrameGraph/Tasks/Layers/glowLayerTask.js +3 -0
- package/FrameGraph/Tasks/Layers/glowLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/Layers/highlightLayerTask.d.ts +1 -0
- package/FrameGraph/Tasks/Layers/highlightLayerTask.js +3 -0
- package/FrameGraph/Tasks/Layers/highlightLayerTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/computeShaderTask.d.ts +1 -0
- package/FrameGraph/Tasks/Misc/computeShaderTask.js +3 -0
- package/FrameGraph/Tasks/Misc/computeShaderTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/cullObjectsTask.d.ts +1 -0
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js +3 -0
- package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/executeTask.d.ts +1 -0
- package/FrameGraph/Tasks/Misc/executeTask.js +3 -0
- package/FrameGraph/Tasks/Misc/executeTask.js.map +1 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.d.ts +1 -0
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +8 -1
- package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/anaglyphTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/anaglyphTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/anaglyphTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/blackAndWhiteTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/blackAndWhiteTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/blackAndWhiteTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/bloomMergeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/bloomTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/bloomTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/bloomTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/blurTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/blurTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/blurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/chromaticAberrationTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/chromaticAberrationTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/chromaticAberrationTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/circleOfConfusionTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/colorCorrectionTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/convolutionTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/convolutionTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/convolutionTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/customPostProcessTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/customPostProcessTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/customPostProcessTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/extractHighlightsTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/extractHighlightsTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/extractHighlightsTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/filterTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/filterTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/filterTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/fxaaTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/fxaaTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/fxaaTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/grainTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/grainTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/grainTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/imageProcessingTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/imageProcessingTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/imageProcessingTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/motionBlurTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/motionBlurTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/motionBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/passTask.d.ts +2 -0
- package/FrameGraph/Tasks/PostProcesses/passTask.js +6 -0
- package/FrameGraph/Tasks/PostProcesses/passTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/postProcessTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/screenSpaceCurvatureTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/screenSpaceCurvatureTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/screenSpaceCurvatureTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/sharpenTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/sharpenTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/sharpenTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2BlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssao2Task.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/ssrTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/ssrTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/ssrTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/taaTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/tonemapTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/tonemapTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/tonemapTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.d.ts +1 -0
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js +3 -0
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +12 -6
- package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +1 -0
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +3 -0
- package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +18 -58
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +114 -121
- package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +12 -0
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js +65 -26
- package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +1 -0
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +3 -0
- package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.d.ts +1 -0
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.js +3 -0
- package/FrameGraph/Tasks/Rendering/utilityLayerRendererTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -0
- package/FrameGraph/Tasks/Texture/clearTextureTask.js +21 -8
- package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.d.ts +1 -0
- package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js +3 -0
- package/FrameGraph/Tasks/Texture/copyToBackbufferColorTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/copyToTextureTask.d.ts +1 -0
- package/FrameGraph/Tasks/Texture/copyToTextureTask.js +21 -4
- package/FrameGraph/Tasks/Texture/copyToTextureTask.js.map +1 -1
- package/FrameGraph/Tasks/Texture/generateMipMapsTask.d.ts +1 -0
- package/FrameGraph/Tasks/Texture/generateMipMapsTask.js +3 -0
- package/FrameGraph/Tasks/Texture/generateMipMapsTask.js.map +1 -1
- package/FrameGraph/frameGraphContext.js +2 -2
- package/FrameGraph/frameGraphContext.js.map +1 -1
- package/FrameGraph/frameGraphRenderContext.d.ts +1 -0
- package/FrameGraph/frameGraphRenderContext.js +17 -8
- package/FrameGraph/frameGraphRenderContext.js.map +1 -1
- package/FrameGraph/frameGraphTask.d.ts +5 -0
- package/FrameGraph/frameGraphTask.js +9 -0
- package/FrameGraph/frameGraphTask.js.map +1 -1
- package/FrameGraph/frameGraphUtils.d.ts +2 -2
- package/FrameGraph/frameGraphUtils.js +6 -6
- package/FrameGraph/frameGraphUtils.js.map +1 -1
- package/Lights/lightingVolume.d.ts +10 -1
- package/Lights/lightingVolume.js +201 -102
- package/Lights/lightingVolume.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +2 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.d.ts +5 -1
- package/Materials/materialHelper.geometryrendering.js +11 -2
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/geometry.d.ts +2 -1
- package/Meshes/geometry.js +6 -2
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/mesh.d.ts +2 -1
- package/Meshes/mesh.js +4 -3
- package/Meshes/mesh.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +6 -2
- package/Rendering/objectRenderer.js +69 -63
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +2 -2
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/Shaders/volumetricLightingRenderVolume.fragment.js +2 -2
- package/Shaders/volumetricLightingRenderVolume.fragment.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/lightingVolume.compute.js +10 -4
- package/ShadersWGSL/lightingVolume.compute.js.map +1 -1
- package/ShadersWGSL/volumetricLightingRenderVolume.fragment.js +2 -2
- package/ShadersWGSL/volumetricLightingRenderVolume.fragment.js.map +1 -1
- package/States/alphaCullingState.d.ts +1 -0
- package/States/alphaCullingState.js +3 -0
- package/States/alphaCullingState.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FrameGraphTask } from "../../frameGraphTask.js";
|
|
2
2
|
|
|
3
|
+
import { IsDepthTexture } from "../../../Materials/Textures/textureHelper.functions.js";
|
|
3
4
|
/**
|
|
4
5
|
* Task used to copy a texture to another texture.
|
|
5
6
|
*/
|
|
@@ -17,23 +18,39 @@ export class FrameGraphCopyToTextureTask extends FrameGraphTask {
|
|
|
17
18
|
this.lodLevel = 0;
|
|
18
19
|
this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();
|
|
19
20
|
}
|
|
21
|
+
getClassName() {
|
|
22
|
+
return "FrameGraphCopyToTextureTask";
|
|
23
|
+
}
|
|
20
24
|
record() {
|
|
21
25
|
if (this.sourceTexture === undefined || this.targetTexture === undefined) {
|
|
22
26
|
throw new Error(`FrameGraphCopyToTextureTask "${this.name}": sourceTexture and targetTexture are required`);
|
|
23
27
|
}
|
|
24
28
|
this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);
|
|
25
29
|
const pass = this._frameGraph.addRenderPass(this.name);
|
|
30
|
+
const passDisabled = this._frameGraph.addRenderPass(this.name + "_disabled", true);
|
|
26
31
|
pass.addDependencies(this.sourceTexture);
|
|
27
|
-
|
|
32
|
+
passDisabled.addDependencies(this.sourceTexture);
|
|
33
|
+
const textureDescription = this._frameGraph.textureManager.getTextureDescription(this.targetTexture);
|
|
34
|
+
const targetIsDepthTexture = IsDepthTexture(textureDescription.options.formats[0]);
|
|
35
|
+
if (targetIsDepthTexture) {
|
|
36
|
+
pass.setRenderTargetDepth(this.outputTexture);
|
|
37
|
+
passDisabled.setRenderTargetDepth(this.outputTexture);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
pass.setRenderTarget(this.outputTexture);
|
|
41
|
+
passDisabled.setRenderTarget(this.outputTexture);
|
|
42
|
+
}
|
|
28
43
|
pass.setExecuteFunc((context) => {
|
|
29
44
|
if (this.viewport) {
|
|
30
45
|
context.setViewport(this.viewport);
|
|
31
46
|
}
|
|
32
|
-
context.setTextureSamplingMode(this.sourceTexture,
|
|
47
|
+
context.setTextureSamplingMode(this.sourceTexture, targetIsDepthTexture
|
|
48
|
+
? 1
|
|
49
|
+
: this.lodLevel > 0
|
|
50
|
+
? 3
|
|
51
|
+
: 2);
|
|
33
52
|
context.copyTexture(this.sourceTexture, undefined, this.viewport !== undefined, this.lodLevel);
|
|
34
53
|
});
|
|
35
|
-
const passDisabled = this._frameGraph.addRenderPass(this.name + "_disabled", true);
|
|
36
|
-
passDisabled.setRenderTarget(this.outputTexture);
|
|
37
54
|
passDisabled.setExecuteFunc((_context) => { });
|
|
38
55
|
}
|
|
39
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copyToTextureTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Texture/copyToTextureTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,sCAA+B;
|
|
1
|
+
{"version":3,"file":"copyToTextureTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Texture/copyToTextureTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,sCAA+B;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AAErF;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,cAAc;IA4B3D;;;;OAIG;IACH,YAAY,IAAY,EAAE,UAAsB;QAC5C,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAhB5B;;WAEG;QACI,aAAQ,GAAW,CAAC,CAAC;QAexB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;IAChF,CAAC;IAEe,YAAY;QACxB,OAAO,6BAA6B,CAAC;IACzC,CAAC;IAEM,MAAM;QACT,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;QAChH,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9F,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;QAEnF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrG,MAAM,oBAAoB,GAAG,cAAc,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpF,IAAI,oBAAoB,EAAE,CAAC;YACvB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,sBAAsB,CAC1B,IAAI,CAAC,aAAa,EAClB,oBAAoB;gBAChB,CAAC,CAAC,SAAS,CAAC,4BAA4B;gBACxC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC;oBACjB,CAAC,CAAC,SAAS,CAAC,8BAA8B;oBAC1C,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAClD,CAAC;YACF,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ","sourcesContent":["import type { FrameGraph, FrameGraphTextureHandle, IViewportLike, Nullable } from \"core/index\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { IsDepthTexture } from \"../../../Materials/Textures/textureHelper.functions\";\r\n\r\n/**\r\n * Task used to copy a texture to another texture.\r\n */\r\nexport class FrameGraphCopyToTextureTask extends FrameGraphTask {\r\n /**\r\n * The source texture to copy from.\r\n */\r\n public sourceTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The target texture to copy to.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The viewport to use when doing the copy.\r\n * If set to null, the currently active viewport is used.\r\n * If undefined (default), the viewport is reset to a full screen viewport before performing the copy.\r\n */\r\n public viewport?: Nullable<IViewportLike>;\r\n\r\n /**\r\n * The LOD level to copy from the source texture (default: 0).\r\n */\r\n public lodLevel: number = 0;\r\n\r\n /**\r\n * The output texture (same as targetTexture, but the handle may be different).\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Constructs a new FrameGraphCopyToTextureTask.\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.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphCopyToTextureTask\";\r\n }\r\n\r\n public record() {\r\n if (this.sourceTexture === undefined || this.targetTexture === undefined) {\r\n throw new Error(`FrameGraphCopyToTextureTask \"${this.name}\": sourceTexture and targetTexture are required`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n pass.addDependencies(this.sourceTexture);\r\n passDisabled.addDependencies(this.sourceTexture);\r\n\r\n const textureDescription = this._frameGraph.textureManager.getTextureDescription(this.targetTexture);\r\n const targetIsDepthTexture = IsDepthTexture(textureDescription.options.formats![0]);\r\n\r\n if (targetIsDepthTexture) {\r\n pass.setRenderTargetDepth(this.outputTexture);\r\n passDisabled.setRenderTargetDepth(this.outputTexture);\r\n } else {\r\n pass.setRenderTarget(this.outputTexture);\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n }\r\n pass.setExecuteFunc((context) => {\r\n if (this.viewport) {\r\n context.setViewport(this.viewport);\r\n }\r\n context.setTextureSamplingMode(\r\n this.sourceTexture,\r\n targetIsDepthTexture\r\n ? Constants.TEXTURE_NEAREST_SAMPLINGMODE\r\n : this.lodLevel > 0\r\n ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE\r\n : Constants.TEXTURE_BILINEAR_SAMPLINGMODE\r\n );\r\n context.copyTexture(this.sourceTexture, undefined, this.viewport !== undefined, this.lodLevel);\r\n });\r\n\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n}\r\n"]}
|
|
@@ -12,6 +12,9 @@ export class FrameGraphGenerateMipMapsTask extends FrameGraphTask {
|
|
|
12
12
|
super(name, frameGraph);
|
|
13
13
|
this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();
|
|
14
14
|
}
|
|
15
|
+
getClassName() {
|
|
16
|
+
return "FrameGraphGenerateMipMapsTask";
|
|
17
|
+
}
|
|
15
18
|
record() {
|
|
16
19
|
if (this.targetTexture === undefined) {
|
|
17
20
|
throw new Error(`FrameGraphGenerateMipMapsTask ${this.name}: targetTexture is required`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateMipMapsTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Texture/generateMipMapsTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,6BAA8B,SAAQ,cAAc;IAW7D;;;;OAIG;IACH,YAAY,IAAY,EAAE,UAAsB;QAC5C,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAExB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;IAChF,CAAC;IAEM,MAAM;QACT,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9F,MAAM,wBAAwB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE3G,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,qDAAqD,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;QAEnF,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,YAAY,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ","sourcesContent":["import type { FrameGraph, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\n\r\n/**\r\n * Task which generates mipmaps for a texture.\r\n */\r\nexport class FrameGraphGenerateMipMapsTask extends FrameGraphTask {\r\n /**\r\n * The texture to generate mipmaps for.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output texture (same as targetTexture, but the handle may be different).\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Constructs a new FrameGraphGenerateMipMapsTask.\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.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public record() {\r\n if (this.targetTexture === undefined) {\r\n throw new Error(`FrameGraphGenerateMipMapsTask ${this.name}: targetTexture is required`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const outputTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.targetTexture);\r\n\r\n if (!outputTextureDescription.options.createMipMaps) {\r\n throw new Error(`FrameGraphGenerateMipMapsTask ${this.name}: targetTexture must have createMipMaps set to true`);\r\n }\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.setRenderTarget(this.outputTexture);\r\n pass.setExecuteFunc((context) => {\r\n context.generateMipMaps();\r\n });\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"generateMipMapsTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Texture/generateMipMapsTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;GAEG;AACH,MAAM,OAAO,6BAA8B,SAAQ,cAAc;IAW7D;;;;OAIG;IACH,YAAY,IAAY,EAAE,UAAsB;QAC5C,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAExB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;IAChF,CAAC;IAEe,YAAY;QACxB,OAAO,+BAA+B,CAAC;IAC3C,CAAC;IAEM,MAAM;QACT,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;QAC7F,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAE9F,MAAM,wBAAwB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE3G,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,iCAAiC,IAAI,CAAC,IAAI,qDAAqD,CAAC,CAAC;QACrH,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,OAAO,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;QAEnF,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjD,YAAY,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ","sourcesContent":["import type { FrameGraph, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\n\r\n/**\r\n * Task which generates mipmaps for a texture.\r\n */\r\nexport class FrameGraphGenerateMipMapsTask extends FrameGraphTask {\r\n /**\r\n * The texture to generate mipmaps for.\r\n */\r\n public targetTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output texture (same as targetTexture, but the handle may be different).\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * Constructs a new FrameGraphGenerateMipMapsTask.\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.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override getClassName(): string {\r\n return \"FrameGraphGenerateMipMapsTask\";\r\n }\r\n\r\n public record() {\r\n if (this.targetTexture === undefined) {\r\n throw new Error(`FrameGraphGenerateMipMapsTask ${this.name}: targetTexture is required`);\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, this.targetTexture);\r\n\r\n const outputTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.targetTexture);\r\n\r\n if (!outputTextureDescription.options.createMipMaps) {\r\n throw new Error(`FrameGraphGenerateMipMapsTask ${this.name}: targetTexture must have createMipMaps set to true`);\r\n }\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.setRenderTarget(this.outputTexture);\r\n pass.setExecuteFunc((context) => {\r\n context.generateMipMaps();\r\n });\r\n\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.setRenderTarget(this.outputTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n}\r\n"]}
|
|
@@ -44,13 +44,13 @@ export class FrameGraphContext {
|
|
|
44
44
|
* @param name The name of the debug group
|
|
45
45
|
*/
|
|
46
46
|
pushDebugGroup(name) {
|
|
47
|
-
this._engine._debugPushGroup?.(name,
|
|
47
|
+
this._engine._debugPushGroup?.(name, 2);
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
50
|
* Pops a debug group from the engine's debug stack.
|
|
51
51
|
*/
|
|
52
52
|
popDebugGroup() {
|
|
53
|
-
this._engine._debugPopGroup?.(
|
|
53
|
+
this._engine._debugPopGroup?.(2);
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Saves the current depth states (depth testing and depth writing)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frameGraphContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphContext.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAI1B,gBAAgB;IAChB,YACuB,OAAuB,EACvB,eAAyC,EACzC,MAAa;QAFb,YAAO,GAAP,OAAO,CAAgB;QACvB,oBAAe,GAAf,eAAe,CAA0B;QACzC,WAAM,GAAN,MAAM,CAAO;IACjC,CAAC;IAEJ;;;;;OAKG;IACI,eAAe,CAAC,SAAiC,EAAE,qBAAqB,GAAG,IAAI;QAClF,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QAE3D,SAAS,CAAC,MAAM,EAAE,CAAC;QAEnB,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAE3C,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;YAC5D,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,oBAAoB,CAAC,MAA+B;QACvD,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,IAAY;QAC9B,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,eAAe;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,kBAAkB;QACrB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,SAAkB,EAAE,UAAmB;QACzD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,QAAuB,EAAE,aAAsB,EAAE,cAAuB;QACvF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC;CACJ","sourcesContent":["import type { AbstractEngine, FrameGraphTextureManager, Scene, FrameGraphTextureHandle, Nullable, InternalTexture, IViewportLike } from \"core/index\";\r\n\r\n/**\r\n * Base class for frame graph context.\r\n */\r\nexport class FrameGraphContext {\r\n private _depthTest: boolean;\r\n private _depthWrite: boolean;\r\n\r\n /** @internal */\r\n constructor(\r\n protected readonly _engine: AbstractEngine,\r\n protected readonly _textureManager: FrameGraphTextureManager,\r\n protected readonly _scene: Scene\r\n ) {}\r\n\r\n /**\r\n * Renders a component without managing the render target.\r\n * Use this method when you have a component that handles its own rendering logic which is not fully integrated into the frame graph system.\r\n * @param component The component to render.\r\n * @param intermediateRendering If true, the scene's intermediate rendering flag will be set to true during the render call (default: true)\r\n */\r\n public renderUnmanaged(component: { render: () => void }, intermediateRendering = true): void {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._scene._intermediateRendering = intermediateRendering;\r\n\r\n component.render();\r\n\r\n this._scene._intermediateRendering = false;\r\n\r\n if (this._engine._currentRenderTarget !== currentRenderTarget) {\r\n if (!currentRenderTarget) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a texture from a handle.\r\n * Note that if the texture is a history texture, the read texture for the current frame will be returned.\r\n * @param handle The handle of the texture\r\n * @returns The texture or null if not found\r\n */\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<InternalTexture> {\r\n return this._textureManager.getTextureFromHandle(handle);\r\n }\r\n\r\n /**\r\n * Pushes a debug group to the engine's debug stack.\r\n * @param name The name of the debug group\r\n */\r\n public pushDebugGroup(name: string) {\r\n this._engine._debugPushGroup?.(name,
|
|
1
|
+
{"version":3,"file":"frameGraphContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphContext.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAI1B,gBAAgB;IAChB,YACuB,OAAuB,EACvB,eAAyC,EACzC,MAAa;QAFb,YAAO,GAAP,OAAO,CAAgB;QACvB,oBAAe,GAAf,eAAe,CAA0B;QACzC,WAAM,GAAN,MAAM,CAAO;IACjC,CAAC;IAEJ;;;;;OAKG;IACI,eAAe,CAAC,SAAiC,EAAE,qBAAqB,GAAG,IAAI;QAClF,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QAE9D,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAElC,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QAE3D,SAAS,CAAC,MAAM,EAAE,CAAC;QAEnB,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAE3C,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,KAAK,mBAAmB,EAAE,CAAC;YAC5D,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,oBAAoB,CAAC,MAA+B;QACvD,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACI,cAAc,CAAC,IAAY;QAC9B,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,aAAa;QAChB,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,eAAe;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,kBAAkB;QACrB,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,SAAkB,EAAE,UAAmB;QACzD,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACI,WAAW,CAAC,QAAuB,EAAE,aAAsB,EAAE,cAAuB;QACvF,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IACtE,CAAC;CACJ","sourcesContent":["import type { AbstractEngine, FrameGraphTextureManager, Scene, FrameGraphTextureHandle, Nullable, InternalTexture, IViewportLike } from \"core/index\";\r\n\r\n/**\r\n * Base class for frame graph context.\r\n */\r\nexport class FrameGraphContext {\r\n private _depthTest: boolean;\r\n private _depthWrite: boolean;\r\n\r\n /** @internal */\r\n constructor(\r\n protected readonly _engine: AbstractEngine,\r\n protected readonly _textureManager: FrameGraphTextureManager,\r\n protected readonly _scene: Scene\r\n ) {}\r\n\r\n /**\r\n * Renders a component without managing the render target.\r\n * Use this method when you have a component that handles its own rendering logic which is not fully integrated into the frame graph system.\r\n * @param component The component to render.\r\n * @param intermediateRendering If true, the scene's intermediate rendering flag will be set to true during the render call (default: true)\r\n */\r\n public renderUnmanaged(component: { render: () => void }, intermediateRendering = true): void {\r\n const currentRenderTarget = this._engine._currentRenderTarget;\r\n\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._scene._intermediateRendering = intermediateRendering;\r\n\r\n component.render();\r\n\r\n this._scene._intermediateRendering = false;\r\n\r\n if (this._engine._currentRenderTarget !== currentRenderTarget) {\r\n if (!currentRenderTarget) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n this._engine.bindFramebuffer(currentRenderTarget);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets a texture from a handle.\r\n * Note that if the texture is a history texture, the read texture for the current frame will be returned.\r\n * @param handle The handle of the texture\r\n * @returns The texture or null if not found\r\n */\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<InternalTexture> {\r\n return this._textureManager.getTextureFromHandle(handle);\r\n }\r\n\r\n /**\r\n * Pushes a debug group to the engine's debug stack.\r\n * @param name The name of the debug group\r\n */\r\n public pushDebugGroup(name: string) {\r\n this._engine._debugPushGroup?.(name, 2);\r\n }\r\n\r\n /**\r\n * Pops a debug group from the engine's debug stack.\r\n */\r\n public popDebugGroup() {\r\n this._engine._debugPopGroup?.(2);\r\n }\r\n\r\n /**\r\n * Saves the current depth states (depth testing and depth writing)\r\n */\r\n public saveDepthStates(): void {\r\n this._depthTest = this._engine.getDepthBuffer();\r\n this._depthWrite = this._engine.getDepthWrite();\r\n }\r\n\r\n /**\r\n * Restores the depth states saved by saveDepthStates\r\n */\r\n public restoreDepthStates(): void {\r\n this._engine.setDepthBuffer(this._depthTest);\r\n this._engine.setDepthWrite(this._depthWrite);\r\n }\r\n\r\n /**\r\n * Sets the depth states for the current render target\r\n * @param depthTest If true, depth testing is enabled\r\n * @param depthWrite If true, depth writing is enabled\r\n */\r\n public setDepthStates(depthTest: boolean, depthWrite: boolean): void {\r\n this._engine.setDepthBuffer(depthTest);\r\n this._engine.setDepthWrite(depthWrite);\r\n }\r\n\r\n /**\r\n * Sets the current viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided, the width of the render texture is used.\r\n * @param requiredHeight defines the height required for rendering. If not provided the height of the render texture is used.\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n this._engine.setViewport(viewport, requiredHeight, requiredWidth);\r\n }\r\n}\r\n"]}
|
|
@@ -12,6 +12,7 @@ export declare class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
12
12
|
private _debugMessageHasBeenPushed;
|
|
13
13
|
private _renderTargetIsBound;
|
|
14
14
|
private readonly _copyTexture;
|
|
15
|
+
private readonly _copyDepthTexture;
|
|
15
16
|
private static _IsObjectRenderer;
|
|
16
17
|
/** @internal */
|
|
17
18
|
constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { EffectRenderer } from "../Materials/effectRenderer.js";
|
|
3
3
|
import { CopyTextureToTexture } from "../Misc/copyTextureToTexture.js";
|
|
4
4
|
import { FrameGraphContext } from "./frameGraphContext.js";
|
|
5
|
+
import { IsDepthTexture } from "../Materials/Textures/textureHelper.functions.js";
|
|
5
6
|
const SamplingModeHasMipMapFiltering = [
|
|
6
7
|
false, // not used
|
|
7
8
|
false, // TEXTURE_NEAREST_SAMPLINGMODE / TEXTURE_NEAREST_NEAREST
|
|
@@ -36,6 +37,7 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
36
37
|
indices: [0, 2, 1, 0, 3, 2],
|
|
37
38
|
});
|
|
38
39
|
this._copyTexture = new CopyTextureToTexture(this._engine);
|
|
40
|
+
this._copyDepthTexture = new CopyTextureToTexture(this._engine, true);
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Checks whether a texture handle points to the backbuffer's color or depth texture
|
|
@@ -191,6 +193,7 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
191
193
|
}
|
|
192
194
|
this._applyRenderTarget();
|
|
193
195
|
const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates
|
|
196
|
+
const engineDepthFunc = this._engine.getDepthFunction();
|
|
194
197
|
const effectRenderer = drawBackFace ? this._effectRendererBack : this._effectRenderer;
|
|
195
198
|
effectRenderer.saveStates();
|
|
196
199
|
if (!noViewport) {
|
|
@@ -211,6 +214,9 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
211
214
|
this._engine.setColorWrite(true);
|
|
212
215
|
}
|
|
213
216
|
this._engine.setDepthWrite(engineDepthMask);
|
|
217
|
+
if (engineDepthFunc) {
|
|
218
|
+
this._engine.setDepthFunction(engineDepthFunc);
|
|
219
|
+
}
|
|
214
220
|
this._engine.setAlphaMode(0);
|
|
215
221
|
return true;
|
|
216
222
|
}
|
|
@@ -225,10 +231,12 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
225
231
|
if (forceCopyToBackbuffer) {
|
|
226
232
|
this.bindRenderTarget();
|
|
227
233
|
}
|
|
228
|
-
|
|
229
|
-
this.
|
|
230
|
-
|
|
231
|
-
|
|
234
|
+
const texture = this._textureManager.getTextureFromHandle(sourceTexture, true);
|
|
235
|
+
const copyTexture = IsDepthTexture(texture.format) ? this._copyDepthTexture : this._copyTexture;
|
|
236
|
+
copyTexture.source = texture;
|
|
237
|
+
copyTexture.lodLevel = lodLevel;
|
|
238
|
+
this.applyFullScreenEffect(copyTexture.effectWrapper.drawWrapper, () => {
|
|
239
|
+
copyTexture.effectWrapper.onApplyObservable.notifyObservers({});
|
|
232
240
|
}, undefined, undefined, undefined, undefined, noViewport);
|
|
233
241
|
}
|
|
234
242
|
/**
|
|
@@ -269,7 +277,7 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
269
277
|
(renderTarget && this._currentRenderTarget && renderTarget.equals(this._currentRenderTarget))) {
|
|
270
278
|
this._flushDebugMessages();
|
|
271
279
|
if (debugMessage !== undefined) {
|
|
272
|
-
this.
|
|
280
|
+
this.pushDebugGroup(debugMessage);
|
|
273
281
|
this._debugMessageWhenTargetBound = undefined;
|
|
274
282
|
this._debugMessageHasBeenPushed = true;
|
|
275
283
|
}
|
|
@@ -288,7 +296,7 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
288
296
|
/** @internal */
|
|
289
297
|
_flushDebugMessages() {
|
|
290
298
|
if (this._debugMessageHasBeenPushed) {
|
|
291
|
-
this.
|
|
299
|
+
this.popDebugGroup();
|
|
292
300
|
this._debugMessageHasBeenPushed = false;
|
|
293
301
|
}
|
|
294
302
|
}
|
|
@@ -309,7 +317,7 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
309
317
|
this._engine.bindFramebuffer(renderTargetWrapper);
|
|
310
318
|
}
|
|
311
319
|
if (this._debugMessageWhenTargetBound !== undefined) {
|
|
312
|
-
this.
|
|
320
|
+
this.pushDebugGroup(this._debugMessageWhenTargetBound);
|
|
313
321
|
this._debugMessageWhenTargetBound = undefined;
|
|
314
322
|
this._debugMessageHasBeenPushed = true;
|
|
315
323
|
}
|
|
@@ -317,13 +325,14 @@ export class FrameGraphRenderContext extends FrameGraphContext {
|
|
|
317
325
|
}
|
|
318
326
|
/** @internal */
|
|
319
327
|
_isReady() {
|
|
320
|
-
return this._copyTexture.isReady();
|
|
328
|
+
return this._copyTexture.isReady() && this._copyDepthTexture.isReady();
|
|
321
329
|
}
|
|
322
330
|
/** @internal */
|
|
323
331
|
_dispose() {
|
|
324
332
|
this._effectRenderer.dispose();
|
|
325
333
|
this._effectRendererBack.dispose();
|
|
326
334
|
this._copyTexture.dispose();
|
|
335
|
+
this._copyDepthTexture.dispose();
|
|
327
336
|
}
|
|
328
337
|
}
|
|
329
338
|
//# sourceMappingURL=frameGraphRenderContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frameGraphRenderContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphRenderContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Nullable,\r\n AbstractEngine,\r\n DrawWrapper,\r\n IColor4Like,\r\n Layer,\r\n FrameGraphTextureHandle,\r\n Effect,\r\n FrameGraphTextureManager,\r\n ObjectRenderer,\r\n Scene,\r\n FrameGraphRenderTarget,\r\n InternalTexture,\r\n UtilityLayerRenderer,\r\n IStencilState,\r\n IStencilStateProperties,\r\n} from \"core/index\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer } from \"../Materials/effectRenderer\";\r\nimport { CopyTextureToTexture } from \"../Misc/copyTextureToTexture\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\n\r\nconst SamplingModeHasMipMapFiltering = [\r\n false, // not used\r\n false, // TEXTURE_NEAREST_SAMPLINGMODE / TEXTURE_NEAREST_NEAREST\r\n false, // TEXTURE_BILINEAR_SAMPLINGMODE / TEXTURE_LINEAR_LINEAR\r\n true, // TEXTURE_TRILINEAR_SAMPLINGMODE / TEXTURE_LINEAR_LINEAR_MIPLINEAR\r\n true, // TEXTURE_NEAREST_NEAREST_MIPNEAREST\r\n true, // TEXTURE_NEAREST_LINEAR_MIPNEAREST\r\n true, // TEXTURE_NEAREST_LINEAR_MIPLINEAR\r\n false, // TEXTURE_NEAREST_LINEAR\r\n true, // TEXTURE_NEAREST_NEAREST_MIPLINEAR\r\n true, // TEXTURE_LINEAR_NEAREST_MIPNEAREST\r\n true, // TEXTURE_LINEAR_NEAREST_MIPLINEAR\r\n true, // TEXTURE_LINEAR_LINEAR_MIPNEAREST\r\n false, // TEXTURE_LINEAR_NEAREST\r\n];\r\n\r\n/**\r\n * Frame graph context used render passes.\r\n * @experimental\r\n */\r\nexport class FrameGraphRenderContext extends FrameGraphContext {\r\n private readonly _effectRenderer: EffectRenderer;\r\n private readonly _effectRendererBack: EffectRenderer;\r\n private _currentRenderTarget: FrameGraphRenderTarget | undefined;\r\n private _debugMessageWhenTargetBound: string | undefined;\r\n private _debugMessageHasBeenPushed = false;\r\n private _renderTargetIsBound = true;\r\n private readonly _copyTexture: CopyTextureToTexture;\r\n\r\n private static _IsObjectRenderer(value: Layer | ObjectRenderer | UtilityLayerRenderer): value is ObjectRenderer {\r\n return (value as ObjectRenderer).initRender !== undefined;\r\n }\r\n\r\n /** @internal */\r\n constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene) {\r\n super(engine, textureManager, scene);\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectRendererBack = new EffectRenderer(this._engine, {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 2, 1, 0, 3, 2],\r\n });\r\n this._copyTexture = new CopyTextureToTexture(this._engine);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color or depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color or depth texture, otherwise false\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager._isBackbuffer(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color texture, otherwise false\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferColor(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's depth texture, otherwise false\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferDepthStencil(handle);\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @param depthReadOnly If true, the depth buffer will be read-only\r\n * @param stencilReadOnly If true, the stencil buffer will be read-only\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle,\r\n depthReadOnly?: boolean,\r\n stencilReadOnly?: boolean\r\n ): FrameGraphRenderTarget {\r\n return this._textureManager.createRenderTarget(name, renderTargets, renderTargetDepth, depthReadOnly, stencilReadOnly);\r\n }\r\n\r\n /**\r\n * Clears the current render buffer or the current render target (if any is set up)\r\n * @param color Defines the color to use\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Clears the color attachments of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n */\r\n public clearColorAttachments(color: Nullable<IColor4Like>, attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, true, false, false);\r\n }\r\n\r\n /**\r\n * Clears all attachments (color(s) + depth/stencil) of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clearAttachments(color: Nullable<IColor4Like>, attachments: number[], backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Binds the attachments to the current render target\r\n * @param attachments The attachments to bind\r\n */\r\n public bindAttachments(attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n }\r\n\r\n /**\r\n * Generates mipmaps for the current render target\r\n */\r\n public generateMipMaps(): void {\r\n if (this._currentRenderTarget?.renderTargetWrapper === undefined) {\r\n return;\r\n }\r\n\r\n if (this._engine._currentRenderTarget && (!this._engine.isWebGPU || this._renderTargetIsBound)) {\r\n // we can't generate the mipmaps if the render target (which is the texture we want to generate mipmaps for) is bound\r\n // Also, for some reasons, on WebGL2, generating mipmaps doesn't work if a render target is bound, even if it's not the texture we want to generate mipmaps for...\r\n this._flushDebugMessages();\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n const textures = this._currentRenderTarget.renderTargetWrapper.textures;\r\n if (textures) {\r\n for (const texture of textures) {\r\n this._engine.generateMipmaps(texture);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the texture sampling mode for a given texture handle\r\n * @param handle Handle of the texture to set the sampling mode for\r\n * @param samplingMode Sampling mode to set\r\n */\r\n public setTextureSamplingMode(handle: FrameGraphTextureHandle, samplingMode: number): void {\r\n const internalTexture = this._textureManager.getTextureFromHandle(handle);\r\n if (internalTexture && internalTexture.samplingMode !== samplingMode) {\r\n internalTexture.useMipMaps = SamplingModeHasMipMapFiltering[samplingMode];\r\n this._engine.updateTextureSamplingMode(samplingMode, internalTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Binds a texture handle to a given effect (resolves the handle to a texture and binds it to the effect)\r\n * @param effect The effect to bind the texture to\r\n * @param name The name of the texture in the effect\r\n * @param handle The handle of the texture to bind\r\n */\r\n public bindTextureHandle(effect: Effect, name: string, handle: FrameGraphTextureHandle): void {\r\n let texture: Nullable<InternalTexture>;\r\n\r\n const historyEntry = this._textureManager._historyTextures.get(handle);\r\n if (historyEntry) {\r\n texture = historyEntry.textures[historyEntry.index]; // texture we write to in this frame\r\n if (\r\n this._currentRenderTarget !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper.textures!.includes(texture!)\r\n ) {\r\n // If the current render target renders to the history write texture, we bind the read texture instead\r\n texture = historyEntry.textures[historyEntry.index ^ 1];\r\n }\r\n } else {\r\n texture = this._textureManager._textures.get(handle)!.texture;\r\n }\r\n\r\n effect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Applies a full-screen effect to the current render target\r\n * @param drawWrapper The draw wrapper containing the effect to apply\r\n * @param customBindings The custom bindings to use when applying the effect (optional)\r\n * @param stencilState The stencil state to use when applying the effect (optional)\r\n * @param disableColorWrite If true, color write will be disabled when applying the effect (optional)\r\n * @param drawBackFace If true, the fullscreen quad will be drawn as a back face (in CW - optional)\r\n * @param depthTest If true, depth testing will be enabled when applying the effect (default is false)\r\n * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.\r\n * @returns True if the effect was applied, otherwise false (effect not ready)\r\n */\r\n public applyFullScreenEffect(\r\n drawWrapper: DrawWrapper,\r\n customBindings?: () => void,\r\n stencilState?: IStencilState | IStencilStateProperties,\r\n disableColorWrite?: boolean,\r\n drawBackFace?: boolean,\r\n depthTest?: boolean,\r\n noViewport?: boolean\r\n ): boolean {\r\n if (!drawWrapper.effect?.isReady()) {\r\n return false;\r\n }\r\n\r\n this._applyRenderTarget();\r\n\r\n const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates\r\n\r\n const effectRenderer = drawBackFace ? this._effectRendererBack : this._effectRenderer;\r\n\r\n effectRenderer.saveStates();\r\n if (!noViewport) {\r\n effectRenderer.setViewport();\r\n }\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n this._engine.setState(false, undefined, undefined, undefined, undefined, stencilState);\r\n this._engine.setDepthBuffer(!!depthTest);\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(false);\r\n }\r\n this._engine.setDepthWrite(false);\r\n\r\n effectRenderer.bindBuffers(drawWrapper.effect);\r\n customBindings?.();\r\n effectRenderer.draw();\r\n effectRenderer.restoreStates();\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(true);\r\n }\r\n this._engine.setDepthWrite(engineDepthMask);\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Copies a texture to the current render target\r\n * @param sourceTexture The source texture to copy from\r\n * @param forceCopyToBackbuffer If true, the copy will be done to the back buffer regardless of the current render target\r\n * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.\r\n * @param lodLevel The LOD level to use when copying the texture (default: 0).\r\n */\r\n public copyTexture(sourceTexture: FrameGraphTextureHandle, forceCopyToBackbuffer = false, noViewport?: boolean, lodLevel = 0): void {\r\n if (forceCopyToBackbuffer) {\r\n this.bindRenderTarget();\r\n }\r\n\r\n this._copyTexture.source = this._textureManager.getTextureFromHandle(sourceTexture, true)!;\r\n this._copyTexture.lodLevel = lodLevel;\r\n\r\n this.applyFullScreenEffect(\r\n this._copyTexture.effectWrapper.drawWrapper,\r\n () => {\r\n this._copyTexture.effectWrapper.onApplyObservable.notifyObservers({});\r\n },\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n noViewport\r\n );\r\n }\r\n\r\n /**\r\n * Renders a RenderTargetTexture or a layer\r\n * @param object The RenderTargetTexture/Layer to render\r\n * @param viewportWidth The width of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n * @param viewportHeight The height of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n */\r\n public render(object: Layer | ObjectRenderer | UtilityLayerRenderer, viewportWidth?: number, viewportHeight?: number): void {\r\n if (FrameGraphRenderContext._IsObjectRenderer(object)) {\r\n this._scene._intermediateRendering = true;\r\n if (object.shouldRender()) {\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._applyRenderTarget();\r\n\r\n object.prepareRenderList();\r\n\r\n object.initRender(viewportWidth!, viewportHeight!);\r\n\r\n object.render();\r\n\r\n object.finishRender();\r\n }\r\n this._scene._intermediateRendering = false;\r\n } else {\r\n this._applyRenderTarget();\r\n object.render();\r\n }\r\n }\r\n\r\n /**\r\n * Binds a render target texture so that upcoming draw calls will render to it\r\n * Note: it is a lazy operation, so the render target will only be bound when needed. This way, it is possible to call\r\n * this method several times with different render targets without incurring the cost of binding if no draw calls are made\r\n * @param renderTarget The handle of the render target texture to bind (default: undefined, meaning \"back buffer\"). Pass an array for MRT rendering.\r\n * @param debugMessage Optional debug message to display when the render target is bound (visible in PIX, for example)\r\n * @param applyImmediately If true, the render target will be applied immediately (otherwise it will be applied at first use). Default is false (delayed application).\r\n */\r\n public bindRenderTarget(renderTarget?: FrameGraphRenderTarget, debugMessage?: string, applyImmediately = false): void {\r\n if (\r\n (renderTarget?.renderTargetWrapper === undefined && this._currentRenderTarget === undefined) ||\r\n (renderTarget && this._currentRenderTarget && renderTarget.equals(this._currentRenderTarget))\r\n ) {\r\n this._flushDebugMessages();\r\n if (debugMessage !== undefined) {\r\n this._engine._debugPushGroup?.(debugMessage, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n if (applyImmediately) {\r\n this._applyRenderTarget();\r\n }\r\n return;\r\n }\r\n this._currentRenderTarget = renderTarget?.renderTargetWrapper === undefined ? undefined : renderTarget;\r\n this._debugMessageWhenTargetBound = debugMessage;\r\n this._renderTargetIsBound = false;\r\n if (applyImmediately) {\r\n this._applyRenderTarget();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _flushDebugMessages() {\r\n if (this._debugMessageHasBeenPushed) {\r\n this._engine._debugPopGroup?.(2);\r\n this._debugMessageHasBeenPushed = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _applyRenderTarget() {\r\n if (this._renderTargetIsBound) {\r\n return;\r\n }\r\n\r\n this._flushDebugMessages();\r\n\r\n const renderTargetWrapper = this._currentRenderTarget?.renderTargetWrapper;\r\n\r\n if (renderTargetWrapper === undefined) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n }\r\n this._engine.bindFramebuffer(renderTargetWrapper);\r\n }\r\n\r\n if (this._debugMessageWhenTargetBound !== undefined) {\r\n this._engine._debugPushGroup?.(this._debugMessageWhenTargetBound, 2);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n\r\n this._renderTargetIsBound = true;\r\n }\r\n\r\n /** @internal */\r\n public _isReady(): boolean {\r\n return this._copyTexture.isReady();\r\n }\r\n\r\n /** @internal */\r\n public _dispose() {\r\n this._effectRenderer.dispose();\r\n this._effectRendererBack.dispose();\r\n this._copyTexture.dispose();\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"frameGraphRenderContext.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphRenderContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Nullable,\r\n AbstractEngine,\r\n DrawWrapper,\r\n IColor4Like,\r\n Layer,\r\n FrameGraphTextureHandle,\r\n Effect,\r\n FrameGraphTextureManager,\r\n ObjectRenderer,\r\n Scene,\r\n FrameGraphRenderTarget,\r\n InternalTexture,\r\n UtilityLayerRenderer,\r\n IStencilState,\r\n IStencilStateProperties,\r\n} from \"core/index\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { EffectRenderer } from \"../Materials/effectRenderer\";\r\nimport { CopyTextureToTexture } from \"../Misc/copyTextureToTexture\";\r\nimport { FrameGraphContext } from \"./frameGraphContext\";\r\nimport { IsDepthTexture } from \"../Materials/Textures/textureHelper.functions\";\r\n\r\nconst SamplingModeHasMipMapFiltering = [\r\n false, // not used\r\n false, // TEXTURE_NEAREST_SAMPLINGMODE / TEXTURE_NEAREST_NEAREST\r\n false, // TEXTURE_BILINEAR_SAMPLINGMODE / TEXTURE_LINEAR_LINEAR\r\n true, // TEXTURE_TRILINEAR_SAMPLINGMODE / TEXTURE_LINEAR_LINEAR_MIPLINEAR\r\n true, // TEXTURE_NEAREST_NEAREST_MIPNEAREST\r\n true, // TEXTURE_NEAREST_LINEAR_MIPNEAREST\r\n true, // TEXTURE_NEAREST_LINEAR_MIPLINEAR\r\n false, // TEXTURE_NEAREST_LINEAR\r\n true, // TEXTURE_NEAREST_NEAREST_MIPLINEAR\r\n true, // TEXTURE_LINEAR_NEAREST_MIPNEAREST\r\n true, // TEXTURE_LINEAR_NEAREST_MIPLINEAR\r\n true, // TEXTURE_LINEAR_LINEAR_MIPNEAREST\r\n false, // TEXTURE_LINEAR_NEAREST\r\n];\r\n\r\n/**\r\n * Frame graph context used render passes.\r\n * @experimental\r\n */\r\nexport class FrameGraphRenderContext extends FrameGraphContext {\r\n private readonly _effectRenderer: EffectRenderer;\r\n private readonly _effectRendererBack: EffectRenderer;\r\n private _currentRenderTarget: FrameGraphRenderTarget | undefined;\r\n private _debugMessageWhenTargetBound: string | undefined;\r\n private _debugMessageHasBeenPushed = false;\r\n private _renderTargetIsBound = true;\r\n private readonly _copyTexture: CopyTextureToTexture;\r\n private readonly _copyDepthTexture: CopyTextureToTexture;\r\n\r\n private static _IsObjectRenderer(value: Layer | ObjectRenderer | UtilityLayerRenderer): value is ObjectRenderer {\r\n return (value as ObjectRenderer).initRender !== undefined;\r\n }\r\n\r\n /** @internal */\r\n constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene) {\r\n super(engine, textureManager, scene);\r\n this._effectRenderer = new EffectRenderer(this._engine);\r\n this._effectRendererBack = new EffectRenderer(this._engine, {\r\n positions: [1, 1, -1, 1, -1, -1, 1, -1],\r\n indices: [0, 2, 1, 0, 3, 2],\r\n });\r\n this._copyTexture = new CopyTextureToTexture(this._engine);\r\n this._copyDepthTexture = new CopyTextureToTexture(this._engine, true);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color or depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color or depth texture, otherwise false\r\n */\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager._isBackbuffer(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's color texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's color texture, otherwise false\r\n */\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferColor(handle);\r\n }\r\n\r\n /**\r\n * Checks whether a texture handle points to the backbuffer's depth texture\r\n * @param handle The handle to check\r\n * @returns True if the handle points to the backbuffer's depth texture, otherwise false\r\n */\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n return this._textureManager.isBackbufferDepthStencil(handle);\r\n }\r\n\r\n /**\r\n * Creates a (frame graph) render target wrapper\r\n * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!\r\n * @param name Name of the render target wrapper\r\n * @param renderTargets Render target handles (textures) to use\r\n * @param renderTargetDepth Render target depth handle (texture) to use\r\n * @param depthReadOnly If true, the depth buffer will be read-only\r\n * @param stencilReadOnly If true, the stencil buffer will be read-only\r\n * @returns The created render target wrapper\r\n */\r\n public createRenderTarget(\r\n name: string,\r\n renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[],\r\n renderTargetDepth?: FrameGraphTextureHandle,\r\n depthReadOnly?: boolean,\r\n stencilReadOnly?: boolean\r\n ): FrameGraphRenderTarget {\r\n return this._textureManager.createRenderTarget(name, renderTargets, renderTargetDepth, depthReadOnly, stencilReadOnly);\r\n }\r\n\r\n /**\r\n * Clears the current render buffer or the current render target (if any is set up)\r\n * @param color Defines the color to use\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Clears the color attachments of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n */\r\n public clearColorAttachments(color: Nullable<IColor4Like>, attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, true, false, false);\r\n }\r\n\r\n /**\r\n * Clears all attachments (color(s) + depth/stencil) of the current render target\r\n * @param color Defines the color to use\r\n * @param attachments The attachments to clear\r\n * @param backBuffer Defines if the back buffer must be cleared\r\n * @param depth Defines if the depth buffer must be cleared\r\n * @param stencil Defines if the stencil buffer must be cleared\r\n * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)\r\n */\r\n public clearAttachments(color: Nullable<IColor4Like>, attachments: number[], backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue = 0): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n this._engine.clear(color, backBuffer, depth, stencil, stencilClearValue);\r\n }\r\n\r\n /**\r\n * Binds the attachments to the current render target\r\n * @param attachments The attachments to bind\r\n */\r\n public bindAttachments(attachments: number[]): void {\r\n this._applyRenderTarget();\r\n this._engine.bindAttachments(attachments);\r\n }\r\n\r\n /**\r\n * Generates mipmaps for the current render target\r\n */\r\n public generateMipMaps(): void {\r\n if (this._currentRenderTarget?.renderTargetWrapper === undefined) {\r\n return;\r\n }\r\n\r\n if (this._engine._currentRenderTarget && (!this._engine.isWebGPU || this._renderTargetIsBound)) {\r\n // we can't generate the mipmaps if the render target (which is the texture we want to generate mipmaps for) is bound\r\n // Also, for some reasons, on WebGL2, generating mipmaps doesn't work if a render target is bound, even if it's not the texture we want to generate mipmaps for...\r\n this._flushDebugMessages();\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n this._renderTargetIsBound = false;\r\n }\r\n\r\n const textures = this._currentRenderTarget.renderTargetWrapper.textures;\r\n if (textures) {\r\n for (const texture of textures) {\r\n this._engine.generateMipmaps(texture);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the texture sampling mode for a given texture handle\r\n * @param handle Handle of the texture to set the sampling mode for\r\n * @param samplingMode Sampling mode to set\r\n */\r\n public setTextureSamplingMode(handle: FrameGraphTextureHandle, samplingMode: number): void {\r\n const internalTexture = this._textureManager.getTextureFromHandle(handle);\r\n if (internalTexture && internalTexture.samplingMode !== samplingMode) {\r\n internalTexture.useMipMaps = SamplingModeHasMipMapFiltering[samplingMode];\r\n this._engine.updateTextureSamplingMode(samplingMode, internalTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Binds a texture handle to a given effect (resolves the handle to a texture and binds it to the effect)\r\n * @param effect The effect to bind the texture to\r\n * @param name The name of the texture in the effect\r\n * @param handle The handle of the texture to bind\r\n */\r\n public bindTextureHandle(effect: Effect, name: string, handle: FrameGraphTextureHandle): void {\r\n let texture: Nullable<InternalTexture>;\r\n\r\n const historyEntry = this._textureManager._historyTextures.get(handle);\r\n if (historyEntry) {\r\n texture = historyEntry.textures[historyEntry.index]; // texture we write to in this frame\r\n if (\r\n this._currentRenderTarget !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper !== undefined &&\r\n this._currentRenderTarget.renderTargetWrapper.textures!.includes(texture!)\r\n ) {\r\n // If the current render target renders to the history write texture, we bind the read texture instead\r\n texture = historyEntry.textures[historyEntry.index ^ 1];\r\n }\r\n } else {\r\n texture = this._textureManager._textures.get(handle)!.texture;\r\n }\r\n\r\n effect._bindTexture(name, texture);\r\n }\r\n\r\n /**\r\n * Applies a full-screen effect to the current render target\r\n * @param drawWrapper The draw wrapper containing the effect to apply\r\n * @param customBindings The custom bindings to use when applying the effect (optional)\r\n * @param stencilState The stencil state to use when applying the effect (optional)\r\n * @param disableColorWrite If true, color write will be disabled when applying the effect (optional)\r\n * @param drawBackFace If true, the fullscreen quad will be drawn as a back face (in CW - optional)\r\n * @param depthTest If true, depth testing will be enabled when applying the effect (default is false)\r\n * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.\r\n * @returns True if the effect was applied, otherwise false (effect not ready)\r\n */\r\n public applyFullScreenEffect(\r\n drawWrapper: DrawWrapper,\r\n customBindings?: () => void,\r\n stencilState?: IStencilState | IStencilStateProperties,\r\n disableColorWrite?: boolean,\r\n drawBackFace?: boolean,\r\n depthTest?: boolean,\r\n noViewport?: boolean\r\n ): boolean {\r\n if (!drawWrapper.effect?.isReady()) {\r\n return false;\r\n }\r\n\r\n this._applyRenderTarget();\r\n\r\n const engineDepthMask = this._engine.getDepthWrite(); // for some reasons, depthWrite is not restored by EffectRenderer.restoreStates\r\n const engineDepthFunc = this._engine.getDepthFunction();\r\n\r\n const effectRenderer = drawBackFace ? this._effectRendererBack : this._effectRenderer;\r\n\r\n effectRenderer.saveStates();\r\n if (!noViewport) {\r\n effectRenderer.setViewport();\r\n }\r\n\r\n this._engine.enableEffect(drawWrapper);\r\n this._engine.setState(false, undefined, undefined, undefined, undefined, stencilState);\r\n this._engine.setDepthBuffer(!!depthTest);\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(false);\r\n }\r\n this._engine.setDepthWrite(false);\r\n\r\n effectRenderer.bindBuffers(drawWrapper.effect);\r\n customBindings?.();\r\n effectRenderer.draw();\r\n effectRenderer.restoreStates();\r\n if (disableColorWrite) {\r\n this._engine.setColorWrite(true);\r\n }\r\n this._engine.setDepthWrite(engineDepthMask);\r\n if (engineDepthFunc) {\r\n this._engine.setDepthFunction(engineDepthFunc);\r\n }\r\n this._engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Copies a texture to the current render target\r\n * @param sourceTexture The source texture to copy from\r\n * @param forceCopyToBackbuffer If true, the copy will be done to the back buffer regardless of the current render target\r\n * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.\r\n * @param lodLevel The LOD level to use when copying the texture (default: 0).\r\n */\r\n public copyTexture(sourceTexture: FrameGraphTextureHandle, forceCopyToBackbuffer = false, noViewport?: boolean, lodLevel = 0): void {\r\n if (forceCopyToBackbuffer) {\r\n this.bindRenderTarget();\r\n }\r\n\r\n const texture = this._textureManager.getTextureFromHandle(sourceTexture, true)!;\r\n const copyTexture = IsDepthTexture(texture.format) ? this._copyDepthTexture : this._copyTexture;\r\n\r\n copyTexture.source = texture;\r\n copyTexture.lodLevel = lodLevel;\r\n\r\n this.applyFullScreenEffect(\r\n copyTexture.effectWrapper.drawWrapper,\r\n () => {\r\n copyTexture.effectWrapper.onApplyObservable.notifyObservers({});\r\n },\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n noViewport\r\n );\r\n }\r\n\r\n /**\r\n * Renders a RenderTargetTexture or a layer\r\n * @param object The RenderTargetTexture/Layer to render\r\n * @param viewportWidth The width of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n * @param viewportHeight The height of the viewport (optional for Layer, but mandatory for ObjectRenderer)\r\n */\r\n public render(object: Layer | ObjectRenderer | UtilityLayerRenderer, viewportWidth?: number, viewportHeight?: number): void {\r\n if (FrameGraphRenderContext._IsObjectRenderer(object)) {\r\n this._scene._intermediateRendering = true;\r\n if (object.shouldRender()) {\r\n this._scene.incrementRenderId();\r\n this._scene.resetCachedMaterial();\r\n\r\n this._applyRenderTarget();\r\n\r\n object.prepareRenderList();\r\n\r\n object.initRender(viewportWidth!, viewportHeight!);\r\n\r\n object.render();\r\n\r\n object.finishRender();\r\n }\r\n this._scene._intermediateRendering = false;\r\n } else {\r\n this._applyRenderTarget();\r\n object.render();\r\n }\r\n }\r\n\r\n /**\r\n * Binds a render target texture so that upcoming draw calls will render to it\r\n * Note: it is a lazy operation, so the render target will only be bound when needed. This way, it is possible to call\r\n * this method several times with different render targets without incurring the cost of binding if no draw calls are made\r\n * @param renderTarget The handle of the render target texture to bind (default: undefined, meaning \"back buffer\"). Pass an array for MRT rendering.\r\n * @param debugMessage Optional debug message to display when the render target is bound (visible in PIX, for example)\r\n * @param applyImmediately If true, the render target will be applied immediately (otherwise it will be applied at first use). Default is false (delayed application).\r\n */\r\n public bindRenderTarget(renderTarget?: FrameGraphRenderTarget, debugMessage?: string, applyImmediately = false): void {\r\n if (\r\n (renderTarget?.renderTargetWrapper === undefined && this._currentRenderTarget === undefined) ||\r\n (renderTarget && this._currentRenderTarget && renderTarget.equals(this._currentRenderTarget))\r\n ) {\r\n this._flushDebugMessages();\r\n if (debugMessage !== undefined) {\r\n this.pushDebugGroup(debugMessage);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n if (applyImmediately) {\r\n this._applyRenderTarget();\r\n }\r\n return;\r\n }\r\n this._currentRenderTarget = renderTarget?.renderTargetWrapper === undefined ? undefined : renderTarget;\r\n this._debugMessageWhenTargetBound = debugMessage;\r\n this._renderTargetIsBound = false;\r\n if (applyImmediately) {\r\n this._applyRenderTarget();\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _flushDebugMessages() {\r\n if (this._debugMessageHasBeenPushed) {\r\n this.popDebugGroup();\r\n this._debugMessageHasBeenPushed = false;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _applyRenderTarget() {\r\n if (this._renderTargetIsBound) {\r\n return;\r\n }\r\n\r\n this._flushDebugMessages();\r\n\r\n const renderTargetWrapper = this._currentRenderTarget?.renderTargetWrapper;\r\n\r\n if (renderTargetWrapper === undefined) {\r\n this._engine.restoreDefaultFramebuffer();\r\n } else {\r\n if (this._engine._currentRenderTarget) {\r\n this._engine.unBindFramebuffer(this._engine._currentRenderTarget);\r\n }\r\n this._engine.bindFramebuffer(renderTargetWrapper);\r\n }\r\n\r\n if (this._debugMessageWhenTargetBound !== undefined) {\r\n this.pushDebugGroup(this._debugMessageWhenTargetBound);\r\n this._debugMessageWhenTargetBound = undefined;\r\n this._debugMessageHasBeenPushed = true;\r\n }\r\n\r\n this._renderTargetIsBound = true;\r\n }\r\n\r\n /** @internal */\r\n public _isReady(): boolean {\r\n return this._copyTexture.isReady() && this._copyDepthTexture.isReady();\r\n }\r\n\r\n /** @internal */\r\n public _dispose() {\r\n this._effectRenderer.dispose();\r\n this._effectRendererBack.dispose();\r\n this._copyTexture.dispose();\r\n this._copyDepthTexture.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -37,6 +37,11 @@ export declare abstract class FrameGraphTask {
|
|
|
37
37
|
* @param skipCreationOfDisabledPasses If true, the disabled passe(s) won't be created.
|
|
38
38
|
*/
|
|
39
39
|
abstract record(skipCreationOfDisabledPasses?: boolean): void;
|
|
40
|
+
/**
|
|
41
|
+
* Gets the current class name
|
|
42
|
+
* @returns the class name
|
|
43
|
+
*/
|
|
44
|
+
getClassName(): string;
|
|
40
45
|
/**
|
|
41
46
|
* This function is called once after the task has been added to the frame graph and before the frame graph is built for the first time.
|
|
42
47
|
* This allows you to initialize asynchronous resources, which is not possible in the constructor.
|
|
@@ -36,6 +36,13 @@ export class FrameGraphTask {
|
|
|
36
36
|
get passesDisabled() {
|
|
37
37
|
return this._passesDisabled;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets the current class name
|
|
41
|
+
* @returns the class name
|
|
42
|
+
*/
|
|
43
|
+
getClassName() {
|
|
44
|
+
return "FrameGraphTask";
|
|
45
|
+
}
|
|
39
46
|
/**
|
|
40
47
|
* This function is called once after the task has been added to the frame graph and before the frame graph is built for the first time.
|
|
41
48
|
* This allows you to initialize asynchronous resources, which is not possible in the constructor.
|
|
@@ -179,9 +186,11 @@ export class FrameGraphTask {
|
|
|
179
186
|
_execute() {
|
|
180
187
|
const passes = this._disabled && this._passesDisabled.length > 0 ? this._passesDisabled : this._passes;
|
|
181
188
|
this.onBeforeTaskExecute.notifyObservers(this);
|
|
189
|
+
this._frameGraph.engine._debugPushGroup?.(`${this.getClassName()} (${this.name})`, 2);
|
|
182
190
|
for (const pass of passes) {
|
|
183
191
|
pass._execute();
|
|
184
192
|
}
|
|
193
|
+
this._frameGraph.engine._debugPopGroup?.(2);
|
|
185
194
|
this.onAfterTaskExecute.notifyObservers(this);
|
|
186
195
|
}
|
|
187
196
|
_checkSameRenderTarget(src, dst) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frameGraphTask.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraph, FrameGraphObjectList, IFrameGraphPass, Nullable, FrameGraphTextureHandle, InternalTexture, FrameGraphRenderContext } from \"core/index\";\r\nimport { FrameGraphObjectListPass } from \"./Passes/objectListPass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Represents a task in a frame graph.\r\n * @experimental\r\n */\r\nexport abstract class FrameGraphTask {\r\n protected readonly _frameGraph: FrameGraph;\r\n\r\n private readonly _passes: IFrameGraphPass[] = [];\r\n private readonly _passesDisabled: IFrameGraphPass[] = [];\r\n\r\n // Note: must be a getter/setter even if there's no specific processing, otherwise inherited classes can't make it a getter/setter!\r\n // Same thing for the disabled property\r\n protected _name: string;\r\n\r\n /**\r\n * The name of the task.\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n protected _disabled = false;\r\n\r\n /**\r\n * Whether the task is disabled.\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n this._disabled = value;\r\n }\r\n\r\n /**\r\n * Gets the render passes of the task.\r\n */\r\n public get passes() {\r\n return this._passes;\r\n }\r\n\r\n /**\r\n * Gets the disabled render passes of the task.\r\n */\r\n public get passesDisabled() {\r\n return this._passesDisabled;\r\n }\r\n\r\n /**\r\n * The (texture) dependencies of the task (optional).\r\n */\r\n public dependencies?: Set<FrameGraphTextureHandle>;\r\n\r\n /**\r\n * Records the task in the frame graph. Use this function to add content (render passes, ...) to the task.\r\n * @param skipCreationOfDisabledPasses If true, the disabled passe(s) won't be created.\r\n */\r\n public abstract record(skipCreationOfDisabledPasses?: boolean): void;\r\n\r\n /**\r\n * This function is called once after the task has been added to the frame graph and before the frame graph is built for the first time.\r\n * This allows you to initialize asynchronous resources, which is not possible in the constructor.\r\n * @returns A promise that resolves when the initialization is complete.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public initAsync(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * An observable that is triggered after the textures have been allocated.\r\n */\r\n public onTexturesAllocatedObservable: Observable<FrameGraphRenderContext> = new Observable();\r\n\r\n /**\r\n * An observable that is triggered before the task is executed.\r\n */\r\n public onBeforeTaskExecute: Observable<FrameGraphTask> = new Observable();\r\n\r\n /**\r\n * An observable that is triggered after the task is executed.\r\n */\r\n public onAfterTaskExecute: Observable<FrameGraphTask> = new Observable();\r\n\r\n /**\r\n * Checks if the task is ready to be executed.\r\n * @returns True if the task is ready to be executed, else false.\r\n */\r\n public isReady(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes of the task.\r\n */\r\n public dispose() {\r\n this._reset();\r\n this.onTexturesAllocatedObservable.clear();\r\n this.onBeforeTaskExecute.clear();\r\n this.onAfterTaskExecute.clear();\r\n }\r\n\r\n /**\r\n * Constructs a new frame graph task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n this.name = name;\r\n this._frameGraph = frameGraph;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _reset() {\r\n for (const pass of this._passes) {\r\n pass._dispose();\r\n }\r\n for (const pass of this._passesDisabled) {\r\n pass._dispose();\r\n }\r\n this._passes.length = 0;\r\n this._passesDisabled.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public _addPass(pass: IFrameGraphPass, disabled: boolean) {\r\n if (disabled) {\r\n this._passesDisabled.push(pass);\r\n } else {\r\n this._passes.push(pass);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _checkTask() {\r\n let outputTexture: Nullable<Nullable<InternalTexture>[]> = null;\r\n let outputDepthTexture: Nullable<InternalTexture> = null;\r\n let outputObjectList: FrameGraphObjectList | undefined;\r\n\r\n for (const pass of this._passes) {\r\n const errMsg = pass._isValid();\r\n if (errMsg) {\r\n throw new Error(`Pass \"${pass.name}\" is not valid. ${errMsg}`);\r\n }\r\n if (FrameGraphRenderPass.IsRenderPass(pass)) {\r\n const handles = Array.isArray(pass.renderTarget) ? pass.renderTarget : [pass.renderTarget];\r\n outputTexture = [];\r\n for (const handle of handles) {\r\n if (handle !== undefined) {\r\n outputTexture.push(this._frameGraph.textureManager.getTextureFromHandle(handle));\r\n }\r\n }\r\n outputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.textureManager.getTextureFromHandle(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphObjectListPass.IsObjectListPass(pass)) {\r\n outputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n let disabledOutputTexture: Nullable<Nullable<InternalTexture>[]> = null;\r\n let disabledOutputTextureHandle: (FrameGraphTextureHandle | undefined)[] = [];\r\n let disabledOutputDepthTexture: Nullable<InternalTexture> = null;\r\n let disabledOutputObjectList: FrameGraphObjectList | undefined;\r\n\r\n for (const pass of this._passesDisabled) {\r\n const errMsg = pass._isValid();\r\n if (errMsg) {\r\n throw new Error(`Pass \"${pass.name}\" is not valid. ${errMsg}`);\r\n }\r\n if (FrameGraphRenderPass.IsRenderPass(pass)) {\r\n const handles = Array.isArray(pass.renderTarget) ? pass.renderTarget : [pass.renderTarget];\r\n disabledOutputTexture = [];\r\n for (const handle of handles) {\r\n if (handle !== undefined) {\r\n disabledOutputTexture.push(this._frameGraph.textureManager.getTextureFromHandle(handle));\r\n }\r\n }\r\n disabledOutputTextureHandle = handles;\r\n disabledOutputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.textureManager.getTextureFromHandle(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphObjectListPass.IsObjectListPass(pass)) {\r\n disabledOutputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n if (this._passesDisabled.length > 0) {\r\n if (!this._checkSameRenderTarget(outputTexture, disabledOutputTexture)) {\r\n let ok = true;\r\n for (const handle of disabledOutputTextureHandle) {\r\n if (handle !== undefined && !this._frameGraph.textureManager.isHistoryTexture(handle)) {\r\n ok = false;\r\n break;\r\n }\r\n }\r\n if (!ok) {\r\n throw new Error(`The output texture of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n }\r\n if (outputDepthTexture !== disabledOutputDepthTexture && disabledOutputDepthTexture !== null) {\r\n throw new Error(`The output depth texture of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n if (outputObjectList !== disabledOutputObjectList && disabledOutputObjectList !== null) {\r\n throw new Error(`The output object list of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _execute() {\r\n const passes = this._disabled && this._passesDisabled.length > 0 ? this._passesDisabled : this._passes;\r\n\r\n this.onBeforeTaskExecute.notifyObservers(this);\r\n\r\n for (const pass of passes) {\r\n pass._execute();\r\n }\r\n\r\n this.onAfterTaskExecute.notifyObservers(this);\r\n }\r\n\r\n private _checkSameRenderTarget(src: Nullable<Nullable<InternalTexture>[]>, dst: Nullable<Nullable<InternalTexture>[]>) {\r\n if (src === null || dst === null) {\r\n return src === dst;\r\n }\r\n\r\n if (src.length !== dst.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < src.length; i++) {\r\n if (src[i] !== dst[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"frameGraphTask.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FrameGraph, FrameGraphObjectList, IFrameGraphPass, Nullable, FrameGraphTextureHandle, InternalTexture, FrameGraphRenderContext } from \"core/index\";\r\nimport { FrameGraphObjectListPass } from \"./Passes/objectListPass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\r\nimport { Observable } from \"core/Misc/observable\";\r\n\r\n/**\r\n * Represents a task in a frame graph.\r\n * @experimental\r\n */\r\nexport abstract class FrameGraphTask {\r\n protected readonly _frameGraph: FrameGraph;\r\n\r\n private readonly _passes: IFrameGraphPass[] = [];\r\n private readonly _passesDisabled: IFrameGraphPass[] = [];\r\n\r\n // Note: must be a getter/setter even if there's no specific processing, otherwise inherited classes can't make it a getter/setter!\r\n // Same thing for the disabled property\r\n protected _name: string;\r\n\r\n /**\r\n * The name of the task.\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n this._name = value;\r\n }\r\n\r\n protected _disabled = false;\r\n\r\n /**\r\n * Whether the task is disabled.\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n this._disabled = value;\r\n }\r\n\r\n /**\r\n * Gets the render passes of the task.\r\n */\r\n public get passes() {\r\n return this._passes;\r\n }\r\n\r\n /**\r\n * Gets the disabled render passes of the task.\r\n */\r\n public get passesDisabled() {\r\n return this._passesDisabled;\r\n }\r\n\r\n /**\r\n * The (texture) dependencies of the task (optional).\r\n */\r\n public dependencies?: Set<FrameGraphTextureHandle>;\r\n\r\n /**\r\n * Records the task in the frame graph. Use this function to add content (render passes, ...) to the task.\r\n * @param skipCreationOfDisabledPasses If true, the disabled passe(s) won't be created.\r\n */\r\n public abstract record(skipCreationOfDisabledPasses?: boolean): void;\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"FrameGraphTask\";\r\n }\r\n\r\n /**\r\n * This function is called once after the task has been added to the frame graph and before the frame graph is built for the first time.\r\n * This allows you to initialize asynchronous resources, which is not possible in the constructor.\r\n * @returns A promise that resolves when the initialization is complete.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public initAsync(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * An observable that is triggered after the textures have been allocated.\r\n */\r\n public onTexturesAllocatedObservable: Observable<FrameGraphRenderContext> = new Observable();\r\n\r\n /**\r\n * An observable that is triggered before the task is executed.\r\n */\r\n public onBeforeTaskExecute: Observable<FrameGraphTask> = new Observable();\r\n\r\n /**\r\n * An observable that is triggered after the task is executed.\r\n */\r\n public onAfterTaskExecute: Observable<FrameGraphTask> = new Observable();\r\n\r\n /**\r\n * Checks if the task is ready to be executed.\r\n * @returns True if the task is ready to be executed, else false.\r\n */\r\n public isReady(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Disposes of the task.\r\n */\r\n public dispose() {\r\n this._reset();\r\n this.onTexturesAllocatedObservable.clear();\r\n this.onBeforeTaskExecute.clear();\r\n this.onAfterTaskExecute.clear();\r\n }\r\n\r\n /**\r\n * Constructs a new frame graph task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph this task is associated with.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n this.name = name;\r\n this._frameGraph = frameGraph;\r\n this._reset();\r\n }\r\n\r\n /** @internal */\r\n public _reset() {\r\n for (const pass of this._passes) {\r\n pass._dispose();\r\n }\r\n for (const pass of this._passesDisabled) {\r\n pass._dispose();\r\n }\r\n this._passes.length = 0;\r\n this._passesDisabled.length = 0;\r\n }\r\n\r\n /** @internal */\r\n public _addPass(pass: IFrameGraphPass, disabled: boolean) {\r\n if (disabled) {\r\n this._passesDisabled.push(pass);\r\n } else {\r\n this._passes.push(pass);\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _checkTask() {\r\n let outputTexture: Nullable<Nullable<InternalTexture>[]> = null;\r\n let outputDepthTexture: Nullable<InternalTexture> = null;\r\n let outputObjectList: FrameGraphObjectList | undefined;\r\n\r\n for (const pass of this._passes) {\r\n const errMsg = pass._isValid();\r\n if (errMsg) {\r\n throw new Error(`Pass \"${pass.name}\" is not valid. ${errMsg}`);\r\n }\r\n if (FrameGraphRenderPass.IsRenderPass(pass)) {\r\n const handles = Array.isArray(pass.renderTarget) ? pass.renderTarget : [pass.renderTarget];\r\n outputTexture = [];\r\n for (const handle of handles) {\r\n if (handle !== undefined) {\r\n outputTexture.push(this._frameGraph.textureManager.getTextureFromHandle(handle));\r\n }\r\n }\r\n outputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.textureManager.getTextureFromHandle(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphObjectListPass.IsObjectListPass(pass)) {\r\n outputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n let disabledOutputTexture: Nullable<Nullable<InternalTexture>[]> = null;\r\n let disabledOutputTextureHandle: (FrameGraphTextureHandle | undefined)[] = [];\r\n let disabledOutputDepthTexture: Nullable<InternalTexture> = null;\r\n let disabledOutputObjectList: FrameGraphObjectList | undefined;\r\n\r\n for (const pass of this._passesDisabled) {\r\n const errMsg = pass._isValid();\r\n if (errMsg) {\r\n throw new Error(`Pass \"${pass.name}\" is not valid. ${errMsg}`);\r\n }\r\n if (FrameGraphRenderPass.IsRenderPass(pass)) {\r\n const handles = Array.isArray(pass.renderTarget) ? pass.renderTarget : [pass.renderTarget];\r\n disabledOutputTexture = [];\r\n for (const handle of handles) {\r\n if (handle !== undefined) {\r\n disabledOutputTexture.push(this._frameGraph.textureManager.getTextureFromHandle(handle));\r\n }\r\n }\r\n disabledOutputTextureHandle = handles;\r\n disabledOutputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.textureManager.getTextureFromHandle(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphObjectListPass.IsObjectListPass(pass)) {\r\n disabledOutputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n if (this._passesDisabled.length > 0) {\r\n if (!this._checkSameRenderTarget(outputTexture, disabledOutputTexture)) {\r\n let ok = true;\r\n for (const handle of disabledOutputTextureHandle) {\r\n if (handle !== undefined && !this._frameGraph.textureManager.isHistoryTexture(handle)) {\r\n ok = false;\r\n break;\r\n }\r\n }\r\n if (!ok) {\r\n throw new Error(`The output texture of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n }\r\n if (outputDepthTexture !== disabledOutputDepthTexture && disabledOutputDepthTexture !== null) {\r\n throw new Error(`The output depth texture of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n if (outputObjectList !== disabledOutputObjectList && disabledOutputObjectList !== null) {\r\n throw new Error(`The output object list of the task \"${this.name}\" is different when it is enabled or disabled.`);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _execute() {\r\n const passes = this._disabled && this._passesDisabled.length > 0 ? this._passesDisabled : this._passes;\r\n\r\n this.onBeforeTaskExecute.notifyObservers(this);\r\n\r\n this._frameGraph.engine._debugPushGroup?.(`${this.getClassName()} (${this.name})`, 2);\r\n\r\n for (const pass of passes) {\r\n pass._execute();\r\n }\r\n\r\n this._frameGraph.engine._debugPopGroup?.(2);\r\n\r\n this.onAfterTaskExecute.notifyObservers(this);\r\n }\r\n\r\n private _checkSameRenderTarget(src: Nullable<Nullable<InternalTexture>[]>, dst: Nullable<Nullable<InternalTexture>[]>) {\r\n if (src === null || dst === null) {\r\n return src === dst;\r\n }\r\n\r\n if (src.length !== dst.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < src.length; i++) {\r\n if (src[i] !== dst[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n"]}
|
|
@@ -11,8 +11,8 @@ import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer.js";
|
|
|
11
11
|
export declare function FindMainCamera(frameGraph: FrameGraph): Nullable<Camera>;
|
|
12
12
|
/**
|
|
13
13
|
* Looks for the main object renderer task in the frame graph.
|
|
14
|
-
* By default, this is the object renderer task with isMainObjectRenderer set to true.
|
|
15
|
-
* If no such task, we return the last object renderer task that has an object list with meshes (or null if none found).
|
|
14
|
+
* By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.
|
|
15
|
+
* If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).
|
|
16
16
|
* @param frameGraph The frame graph to search in
|
|
17
17
|
* @returns The main object renderer of the frame graph, or null if not found
|
|
18
18
|
*/
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { FrameGraphObjectRendererTask } from "./Tasks/Rendering/objectRendererTask.js";
|
|
2
|
-
import { FrameGraphGeometryRendererTask } from "./Tasks/Rendering/geometryRendererTask.js";
|
|
3
2
|
import { FrameGraphUtilityLayerRendererTask } from "./Tasks/Rendering/utilityLayerRendererTask.js";
|
|
4
3
|
import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer.js";
|
|
5
4
|
/**
|
|
@@ -14,11 +13,11 @@ export function FindMainCamera(frameGraph) {
|
|
|
14
13
|
if (mainObjectRenderer) {
|
|
15
14
|
return mainObjectRenderer.camera;
|
|
16
15
|
}
|
|
17
|
-
// Try to find a camera in
|
|
16
|
+
// Try to find a camera in the utility layer renderer tasks
|
|
18
17
|
const tasks = frameGraph.tasks;
|
|
19
18
|
for (let i = tasks.length - 1; i >= 0; i--) {
|
|
20
19
|
const task = tasks[i];
|
|
21
|
-
if (task instanceof
|
|
20
|
+
if (task instanceof FrameGraphUtilityLayerRendererTask) {
|
|
22
21
|
return task.camera;
|
|
23
22
|
}
|
|
24
23
|
}
|
|
@@ -26,8 +25,8 @@ export function FindMainCamera(frameGraph) {
|
|
|
26
25
|
}
|
|
27
26
|
/**
|
|
28
27
|
* Looks for the main object renderer task in the frame graph.
|
|
29
|
-
* By default, this is the object renderer task with isMainObjectRenderer set to true.
|
|
30
|
-
* If no such task, we return the last object renderer task that has an object list with meshes (or null if none found).
|
|
28
|
+
* By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.
|
|
29
|
+
* If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).
|
|
31
30
|
* @param frameGraph The frame graph to search in
|
|
32
31
|
* @returns The main object renderer of the frame graph, or null if not found
|
|
33
32
|
*/
|
|
@@ -35,10 +34,11 @@ export function FindMainObjectRenderer(frameGraph) {
|
|
|
35
34
|
const objectRenderers = frameGraph.getTasksByType(FrameGraphObjectRendererTask);
|
|
36
35
|
let fallbackRenderer = null;
|
|
37
36
|
for (let i = objectRenderers.length - 1; i >= 0; --i) {
|
|
37
|
+
const meshes = objectRenderers[i].objectList.meshes;
|
|
38
38
|
if (objectRenderers[i].isMainObjectRenderer) {
|
|
39
39
|
return objectRenderers[i];
|
|
40
40
|
}
|
|
41
|
-
if (
|
|
41
|
+
if ((!meshes || meshes.length > 0) && !fallbackRenderer) {
|
|
42
42
|
fallbackRenderer = objectRenderers[i];
|
|
43
43
|
}
|
|
44
44
|
}
|