@babylonjs/core 7.33.0 → 7.34.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.
Files changed (124) hide show
  1. package/Cameras/arcRotateCamera.d.ts +14 -0
  2. package/Cameras/arcRotateCamera.js +39 -19
  3. package/Cameras/arcRotateCamera.js.map +1 -1
  4. package/Decorators/nodeDecorator.d.ts +2 -0
  5. package/Decorators/nodeDecorator.js +1 -0
  6. package/Decorators/nodeDecorator.js.map +1 -1
  7. package/Engines/abstractEngine.js +2 -2
  8. package/Engines/abstractEngine.js.map +1 -1
  9. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +63 -0
  10. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +150 -0
  11. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -0
  12. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.d.ts +3 -47
  13. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js +2 -129
  14. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js.map +1 -1
  15. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.d.ts +40 -0
  16. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +98 -0
  17. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +1 -0
  18. package/FrameGraph/Node/Blocks/Textures/clearBlock.js +3 -3
  19. package/FrameGraph/Node/Blocks/Textures/clearBlock.js.map +1 -1
  20. package/FrameGraph/Node/Blocks/index.d.ts +3 -2
  21. package/FrameGraph/Node/Blocks/index.js +3 -2
  22. package/FrameGraph/Node/Blocks/index.js.map +1 -1
  23. package/FrameGraph/Passes/renderPass.js +1 -1
  24. package/FrameGraph/Passes/renderPass.js.map +1 -1
  25. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +21 -0
  26. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +110 -0
  27. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -0
  28. package/FrameGraph/frameGraph.d.ts +6 -0
  29. package/FrameGraph/frameGraph.js +15 -1
  30. package/FrameGraph/frameGraph.js.map +1 -1
  31. package/FrameGraph/frameGraphRenderContext.d.ts +3 -2
  32. package/FrameGraph/frameGraphRenderContext.js +9 -4
  33. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  34. package/FrameGraph/frameGraphTask.js +5 -1
  35. package/FrameGraph/frameGraphTask.js.map +1 -1
  36. package/FrameGraph/frameGraphTextureManager.d.ts +8 -0
  37. package/FrameGraph/frameGraphTextureManager.js +51 -7
  38. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  39. package/FrameGraph/frameGraphTypes.d.ts +2 -0
  40. package/FrameGraph/frameGraphTypes.js.map +1 -1
  41. package/FrameGraph/index.d.ts +3 -2
  42. package/FrameGraph/index.js +3 -2
  43. package/FrameGraph/index.js.map +1 -1
  44. package/Layers/layer.d.ts +4 -0
  45. package/Layers/layer.js +13 -2
  46. package/Layers/layer.js.map +1 -1
  47. package/Loading/sceneLoader.d.ts +11 -8
  48. package/Loading/sceneLoader.js +64 -35
  49. package/Loading/sceneLoader.js.map +1 -1
  50. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +2 -0
  51. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +12 -0
  52. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  53. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js +6 -1
  54. package/Materials/Node/Blocks/GaussianSplatting/gaussianBlock.js.map +1 -1
  55. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +9 -2
  56. package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
  57. package/Materials/Node/Blocks/GaussianSplatting/index.d.ts +2 -0
  58. package/Materials/Node/Blocks/GaussianSplatting/index.js +3 -0
  59. package/Materials/Node/Blocks/GaussianSplatting/index.js.map +1 -1
  60. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js +10 -3
  61. package/Materials/Node/Blocks/GaussianSplatting/splatReaderBlock.js.map +1 -1
  62. package/Materials/Node/nodeMaterial.d.ts +1 -1
  63. package/Materials/Node/nodeMaterial.js +1 -1
  64. package/Materials/Node/nodeMaterial.js.map +1 -1
  65. package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +2 -0
  66. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +7 -2
  67. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  68. package/Meshes/abstractMesh.hotSpot.js +2 -0
  69. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  70. package/Meshes/csg2.js +0 -3
  71. package/Meshes/csg2.js.map +1 -1
  72. package/Misc/webRequest.fetch.d.ts +16 -0
  73. package/Misc/webRequest.fetch.js +33 -0
  74. package/Misc/webRequest.fetch.js.map +1 -0
  75. package/PostProcesses/RenderPipeline/Pipelines/index.d.ts +2 -0
  76. package/PostProcesses/RenderPipeline/Pipelines/index.js +2 -0
  77. package/PostProcesses/RenderPipeline/Pipelines/index.js.map +1 -1
  78. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.d.ts +6 -8
  79. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js +32 -49
  80. package/PostProcesses/RenderPipeline/Pipelines/taaRenderingPipeline.js.map +1 -1
  81. package/PostProcesses/thinTAAPostProcess.d.ts +72 -0
  82. package/PostProcesses/thinTAAPostProcess.js +149 -0
  83. package/PostProcesses/thinTAAPostProcess.js.map +1 -0
  84. package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
  85. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +3 -3
  86. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +7 -7
  87. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  88. package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +70 -69
  89. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +102 -112
  90. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  91. package/Rendering/geometryBufferRenderer.js +8 -6
  92. package/Rendering/geometryBufferRenderer.js.map +1 -1
  93. package/Shaders/geometry.vertex.js +1 -1
  94. package/Shaders/geometry.vertex.js.map +1 -1
  95. package/Shaders/layer.fragment.js +3 -1
  96. package/Shaders/layer.fragment.js.map +1 -1
  97. package/Shaders/volumetricLightScattering.fragment.js +1 -1
  98. package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
  99. package/ShadersWGSL/ShadersInclude/gaussianSplatting.d.ts +5 -0
  100. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +47 -0
  101. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -0
  102. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.d.ts +7 -0
  103. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js +20 -0
  104. package/ShadersWGSL/ShadersInclude/gaussianSplattingFragmentDeclaration.js.map +1 -0
  105. package/ShadersWGSL/ShadersInclude/gaussianSplattingUboDeclaration.d.ts +7 -0
  106. package/ShadersWGSL/ShadersInclude/gaussianSplattingUboDeclaration.js +13 -0
  107. package/ShadersWGSL/ShadersInclude/gaussianSplattingUboDeclaration.js.map +1 -0
  108. package/ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration.d.ts +5 -0
  109. package/ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration.js +10 -0
  110. package/ShadersWGSL/ShadersInclude/gaussianSplattingVertexDeclaration.js.map +1 -0
  111. package/ShadersWGSL/gaussianSplatting.fragment.d.ts +10 -0
  112. package/ShadersWGSL/gaussianSplatting.fragment.js +23 -0
  113. package/ShadersWGSL/gaussianSplatting.fragment.js.map +1 -0
  114. package/ShadersWGSL/gaussianSplatting.vertex.d.ts +14 -0
  115. package/ShadersWGSL/gaussianSplatting.vertex.js +31 -0
  116. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -0
  117. package/ShadersWGSL/geometry.vertex.js +1 -1
  118. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  119. package/ShadersWGSL/layer.fragment.js +4 -2
  120. package/ShadersWGSL/layer.fragment.js.map +1 -1
  121. package/ShadersWGSL/taa.fragment.d.ts +5 -0
  122. package/ShadersWGSL/taa.fragment.js +11 -0
  123. package/ShadersWGSL/taa.fragment.js.map +1 -0
  124. package/package.json +1 -1
@@ -82,6 +82,7 @@ export class FrameGraphTask {
82
82
  }
83
83
  }
84
84
  let disabledOutputTexture = null;
85
+ let disabledOutputTextureHandle = -1;
85
86
  let disabledOutputDepthTexture = null;
86
87
  let disabledOutputObjectList;
87
88
  for (const pass of this._passesDisabled) {
@@ -91,6 +92,7 @@ export class FrameGraphTask {
91
92
  }
92
93
  if (FrameGraphRenderPass.IsRenderPass(pass)) {
93
94
  disabledOutputTexture = this._frameGraph.getTexture(pass.renderTarget);
95
+ disabledOutputTextureHandle = pass.renderTarget;
94
96
  disabledOutputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.getTexture(pass.renderTargetDepth) : null;
95
97
  }
96
98
  else if (FrameGraphCullPass.IsCullPass(pass)) {
@@ -99,7 +101,9 @@ export class FrameGraphTask {
99
101
  }
100
102
  if (this._passesDisabled.length > 0) {
101
103
  if (outputTexture !== disabledOutputTexture) {
102
- throw new Error(`The output texture of the task "${this.name}" is different when it is enabled or disabled.`);
104
+ if (!this._frameGraph.isHistoryTexture(disabledOutputTextureHandle)) {
105
+ throw new Error(`The output texture of the task "${this.name}" is different when it is enabled or disabled.`);
106
+ }
103
107
  }
104
108
  if (outputDepthTexture !== disabledOutputDepthTexture) {
105
109
  throw new Error(`The output depth texture of the task "${this.name}" is different when it is enabled or disabled.`);
@@ -1 +1 @@
1
- {"version":3,"file":"frameGraphTask.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTask.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,OAAgB,cAAc;IAUhC;;OAEG;IACH,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAW,IAAI,CAAC,KAAa;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACvB,CAAC;IAID;;OAEG;IACH,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAW,QAAQ,CAAC,KAAc;QAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAOD;;;OAGG;IACI,OAAO;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,YAAY,IAAY,EAAE,UAAsB;QAxDxC,YAAO,GAAsB,EAAE,CAAC;QAChC,oBAAe,GAAsB,EAAE,CAAC;QAiBtC,cAAS,GAAG,KAAK,CAAC;QAuCxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,gBAAgB;IACT,MAAM;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,gBAAgB;IACT,QAAQ,CAAC,IAAqB,EAAE,QAAiB;QACpD,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACnC;aAAM;YACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3B;IACL,CAAC;IAED,gBAAgB;IACT,UAAU;QACb,IAAI,aAAa,GAAkC,IAAI,CAAC;QACxD,IAAI,kBAAkB,GAAkC,IAAI,CAAC;QAC7D,IAAI,gBAAkD,CAAC;QAEvD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,MAAM,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,mBAAmB,MAAM,EAAE,CAAC,CAAC;aAClE;YACD,IAAI,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;gBACzC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/D,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;aAC1H;iBAAM,IAAI,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC5C,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC;aACtC;SACJ;QAED,IAAI,qBAAqB,GAAkC,IAAI,CAAC;QAChE,IAAI,0BAA0B,GAAkC,IAAI,CAAC;QACrE,IAAI,wBAA0D,CAAC;QAE/D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAgB,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,MAAM,EAAE;gBACR,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,mBAAmB,MAAM,EAAE,CAAC,CAAC;aAClE;YACD,IAAI,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;gBACzC,qBAAqB,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACvE,0BAA0B,GAAG,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;aAClI;iBAAM,IAAI,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBAC5C,wBAAwB,GAAG,IAAI,CAAC,UAAU,CAAC;aAC9C;SACJ;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,IAAI,aAAa,KAAK,qBAAqB,EAAE;gBACzC,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,gDAAgD,CAAC,CAAC;aACjH;YACD,IAAI,kBAAkB,KAAK,0BAA0B,EAAE;gBACnD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,IAAI,gDAAgD,CAAC,CAAC;aACvH;YACD,IAAI,gBAAgB,KAAK,wBAAwB,EAAE;gBAC/C,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,IAAI,gDAAgD,CAAC,CAAC;aACrH;SACJ;IACL,CAAC;IAED,gBAAgB;IACT,UAAU;QACb,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAClG,CAAC;CACJ","sourcesContent":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { RenderTargetWrapper, FrameGraph, FrameGraphObjectList, IFrameGraphPass, Nullable } from \"core/index\";\r\nimport { FrameGraphCullPass } from \"./Passes/cullPass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\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 _frameGraph: FrameGraph;\r\n\r\n private _passes: IFrameGraphPass[] = [];\r\n private _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 * Records the task in the frame graph. Use this function to add content (render passes, ...) to the task.\r\n */\r\n public abstract record(): void;\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 }\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 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<RenderTargetWrapper> = null;\r\n let outputDepthTexture: Nullable<RenderTargetWrapper> = 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 outputTexture = this._frameGraph.getTexture(pass.renderTarget);\r\n outputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.getTexture(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphCullPass.IsCullPass(pass)) {\r\n outputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n let disabledOutputTexture: Nullable<RenderTargetWrapper> = null;\r\n let disabledOutputDepthTexture: Nullable<RenderTargetWrapper> = 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 disabledOutputTexture = this._frameGraph.getTexture(pass.renderTarget);\r\n disabledOutputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.getTexture(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphCullPass.IsCullPass(pass)) {\r\n disabledOutputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n if (this._passesDisabled.length > 0) {\r\n if (outputTexture !== disabledOutputTexture) {\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 if (outputDepthTexture !== disabledOutputDepthTexture) {\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) {\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 _getPasses(): IFrameGraphPass[] {\r\n return this.disabled && this._passesDisabled.length > 0 ? this._passesDisabled : this._passes;\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":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { RenderTargetWrapper, FrameGraph, FrameGraphObjectList, IFrameGraphPass, Nullable, FrameGraphTextureHandle } from \"core/index\";\r\nimport { FrameGraphCullPass } from \"./Passes/cullPass\";\r\nimport { FrameGraphRenderPass } from \"./Passes/renderPass\";\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 _frameGraph: FrameGraph;\r\n\r\n private _passes: IFrameGraphPass[] = [];\r\n private _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 * Records the task in the frame graph. Use this function to add content (render passes, ...) to the task.\r\n */\r\n public abstract record(): void;\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 }\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 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<RenderTargetWrapper> = null;\r\n let outputDepthTexture: Nullable<RenderTargetWrapper> = 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 outputTexture = this._frameGraph.getTexture(pass.renderTarget);\r\n outputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.getTexture(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphCullPass.IsCullPass(pass)) {\r\n outputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n let disabledOutputTexture: Nullable<RenderTargetWrapper> = null;\r\n let disabledOutputTextureHandle: FrameGraphTextureHandle = -1;\r\n let disabledOutputDepthTexture: Nullable<RenderTargetWrapper> = 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 disabledOutputTexture = this._frameGraph.getTexture(pass.renderTarget);\r\n disabledOutputTextureHandle = pass.renderTarget;\r\n disabledOutputDepthTexture = pass.renderTargetDepth !== undefined ? this._frameGraph.getTexture(pass.renderTargetDepth) : null;\r\n } else if (FrameGraphCullPass.IsCullPass(pass)) {\r\n disabledOutputObjectList = pass.objectList;\r\n }\r\n }\r\n\r\n if (this._passesDisabled.length > 0) {\r\n if (outputTexture !== disabledOutputTexture) {\r\n if (!this._frameGraph.isHistoryTexture(disabledOutputTextureHandle)) {\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) {\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) {\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 _getPasses(): IFrameGraphPass[] {\r\n return this.disabled && this._passesDisabled.length > 0 ? this._passesDisabled : this._passes;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,11 @@
1
1
  import type { Scene, AbstractEngine, RenderTargetWrapper, TextureSize, Nullable, FrameGraphTextureCreationOptions, FrameGraphTextureHandle } from "../index.js";
2
2
  import { Texture } from "../Materials/Textures/texture";
3
+ type HistoryTexture = {
4
+ textures: Array<Nullable<RenderTargetWrapper>>;
5
+ handles: Array<FrameGraphTextureHandle>;
6
+ index: number;
7
+ refHandles: Array<FrameGraphTextureHandle>;
8
+ };
3
9
  type TextureEntry = {
4
10
  texture: Nullable<RenderTargetWrapper>;
5
11
  name: string;
@@ -25,6 +31,7 @@ export declare class FrameGraphTextureManager {
25
31
  private _scene?;
26
32
  private static _Counter;
27
33
  _textures: Map<FrameGraphTextureHandle, TextureEntry>;
34
+ _historyTextures: Map<FrameGraphTextureHandle, HistoryTexture>;
28
35
  constructor(_engine: AbstractEngine, _debugTextures?: boolean, _scene?: Scene | undefined);
29
36
  isBackbuffer(handle: FrameGraphTextureHandle): boolean;
30
37
  isBackbufferColor(handle: FrameGraphTextureHandle): boolean;
@@ -37,6 +44,7 @@ export declare class FrameGraphTextureManager {
37
44
  width: number;
38
45
  height: number;
39
46
  };
47
+ updateHistoryTextures(): void;
40
48
  dispose(): void;
41
49
  allocateTextures(): void;
42
50
  createDanglingHandle(): number;
@@ -18,6 +18,7 @@ export class FrameGraphTextureManager {
18
18
  this._debugTextures = _debugTextures;
19
19
  this._scene = _scene;
20
20
  this._textures = new Map();
21
+ this._historyTextures = new Map();
21
22
  this._addSystemTextures();
22
23
  }
23
24
  isBackbuffer(handle) {
@@ -54,12 +55,16 @@ export class FrameGraphTextureManager {
54
55
  return this._textures.get(handle).creationOptions;
55
56
  }
56
57
  getTextureFromHandle(handle) {
58
+ const historyEntry = this._historyTextures.get(handle);
59
+ if (historyEntry) {
60
+ return historyEntry.textures[historyEntry.index ^ 1]; // get the read texture
61
+ }
57
62
  return this._textures.get(handle).texture;
58
63
  }
59
64
  importTexture(name, texture, handle) {
60
65
  const internalTexture = texture.texture;
61
66
  if (!internalTexture) {
62
- throw new Error("Texture must have an internal texture to be imported");
67
+ throw new Error("importTexture: Texture must have an internal texture to be imported");
63
68
  }
64
69
  if (handle !== undefined) {
65
70
  this._freeEntry(handle);
@@ -101,6 +106,15 @@ export class FrameGraphTextureManager {
101
106
  height: Math.floor((height * screenHeight) / 100),
102
107
  };
103
108
  }
109
+ updateHistoryTextures() {
110
+ this._historyTextures.forEach((entry) => {
111
+ entry.index = entry.index ^ 1;
112
+ for (const refHandle of entry.refHandles) {
113
+ const textureEntry = this._textures.get(refHandle);
114
+ textureEntry.texture = entry.textures[entry.index];
115
+ }
116
+ });
117
+ }
104
118
  dispose() {
105
119
  this.releaseTextures();
106
120
  }
@@ -151,15 +165,20 @@ export class FrameGraphTextureManager {
151
165
  entry.debug = this._createDebugTexture(entry.name, entry.texture);
152
166
  }
153
167
  });
168
+ this._historyTextures.forEach((entry) => {
169
+ for (let i = 0; i < entry.handles.length; i++) {
170
+ entry.textures[i] = this._textures.get(entry.handles[i]).texture;
171
+ }
172
+ });
154
173
  }
155
174
  createDanglingHandle() {
156
175
  return FrameGraphTextureManager._Counter++;
157
176
  }
158
177
  resolveDanglingHandle(danglingHandle, handle) {
159
- if (!this._textures.has(handle)) {
178
+ const textureEntry = this._textures.get(handle);
179
+ if (textureEntry === undefined) {
160
180
  throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);
161
181
  }
162
- const textureEntry = this._textures.get(handle);
163
182
  this._textures.set(danglingHandle, {
164
183
  texture: textureEntry.texture,
165
184
  refHandle: handle,
@@ -168,11 +187,16 @@ export class FrameGraphTextureManager {
168
187
  size: { ...textureEntry.creationOptions.size },
169
188
  options: { ...textureEntry.creationOptions.options, label: textureEntry.name },
170
189
  sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,
190
+ isHistoryTexture: false,
171
191
  },
172
192
  namespace: textureEntry.namespace,
173
193
  parentHandle: textureEntry.parentHandle,
174
194
  parentTextureIndex: textureEntry.parentTextureIndex,
175
195
  });
196
+ const historyEntry = this._historyTextures.get(handle);
197
+ if (historyEntry) {
198
+ historyEntry.refHandles.push(danglingHandle);
199
+ }
176
200
  }
177
201
  releaseTextures(releaseAll = true) {
178
202
  this._textures.forEach((entry, handle) => {
@@ -189,8 +213,14 @@ export class FrameGraphTextureManager {
189
213
  this._textures.delete(handle);
190
214
  }
191
215
  });
216
+ this._historyTextures.forEach((entry) => {
217
+ for (let i = 0; i < entry.handles.length; i++) {
218
+ entry.textures[i] = null;
219
+ }
220
+ });
192
221
  if (releaseAll) {
193
222
  this._textures.clear();
223
+ this._historyTextures.clear();
194
224
  this._addSystemTextures();
195
225
  }
196
226
  }
@@ -236,21 +266,35 @@ export class FrameGraphTextureManager {
236
266
  }
237
267
  _createHandleForTexture(name, texture, creationOptions, namespace, multiTargetMode = false, handle, parentHandle, parentTextureIndex) {
238
268
  handle = handle ?? FrameGraphTextureManager._Counter++;
239
- this._textures.set(handle, {
269
+ const textureName = creationOptions.isHistoryTexture ? `${name} - ping` : name;
270
+ const textureEntry = {
240
271
  texture,
241
- name,
272
+ name: textureName,
242
273
  creationOptions: {
243
274
  size: getDimensionsFromTextureSize(creationOptions.size),
244
- options: { ...creationOptions.options, label: name },
275
+ options: { ...creationOptions.options, label: textureName },
245
276
  sizeIsPercentage: creationOptions.sizeIsPercentage,
277
+ isHistoryTexture: creationOptions.isHistoryTexture,
246
278
  },
247
279
  namespace,
248
280
  parentHandle,
249
281
  parentTextureIndex,
250
- });
282
+ };
283
+ this._textures.set(handle, textureEntry);
251
284
  if (namespace === FrameGraphTextureNamespace.External) {
252
285
  return handle;
253
286
  }
287
+ if (creationOptions.isHistoryTexture) {
288
+ const pongCreationOptions = {
289
+ size: { ...textureEntry.creationOptions.size },
290
+ options: { ...textureEntry.creationOptions.options },
291
+ sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,
292
+ isHistoryTexture: false,
293
+ };
294
+ const pongTexture = this._createHandleForTexture(`${name} - pong`, null, pongCreationOptions, namespace, false);
295
+ this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, refHandles: [] });
296
+ return handle;
297
+ }
254
298
  if (multiTargetMode) {
255
299
  const textureCount = creationOptions.options.textureCount ?? 1;
256
300
  for (let i = 0; i < textureCount; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"frameGraphTextureManager.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTextureManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type {\r\n Scene,\r\n AbstractEngine,\r\n RenderTargetWrapper,\r\n RenderTargetCreationOptions,\r\n TextureSize,\r\n Nullable,\r\n FrameGraphTextureCreationOptions,\r\n FrameGraphTextureHandle,\r\n} from \"core/index\";\r\nimport { getDimensionsFromTextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"./frameGraphTypes\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ntype TextureEntry = {\r\n texture: Nullable<RenderTargetWrapper>;\r\n name: string;\r\n creationOptions: FrameGraphTextureCreationOptions;\r\n namespace: FrameGraphTextureNamespace;\r\n debug?: Texture;\r\n parentHandle?: FrameGraphTextureHandle;\r\n parentTextureIndex?: number;\r\n refHandle?: FrameGraphTextureHandle;\r\n};\r\n\r\nenum FrameGraphTextureNamespace {\r\n Task,\r\n Graph,\r\n External,\r\n}\r\n\r\n/**\r\n * @experimental\r\n * @internal\r\n */\r\nexport class FrameGraphTextureManager {\r\n private static _Counter = 2; // 0 and 1 are reserved for backbuffer textures\r\n\r\n public _textures: Map<FrameGraphTextureHandle, TextureEntry> = new Map();\r\n\r\n constructor(\r\n private _engine: AbstractEngine,\r\n private _debugTextures = false,\r\n private _scene?: Scene\r\n ) {\r\n this._addSystemTextures();\r\n }\r\n\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle || textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle;\r\n }\r\n\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n public getTextureCreationOptions(handle: FrameGraphTextureHandle): FrameGraphTextureCreationOptions {\r\n return this._textures.get(handle)!.creationOptions;\r\n }\r\n\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<RenderTargetWrapper> {\r\n return this._textures.get(handle)!.texture;\r\n }\r\n\r\n public importTexture(name: string, texture: RenderTargetWrapper, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n const internalTexture = texture.texture;\r\n\r\n if (!internalTexture) {\r\n throw new Error(\"Texture must have an internal texture to be imported\");\r\n }\r\n\r\n if (handle !== undefined) {\r\n this._freeEntry(handle);\r\n }\r\n\r\n const creationOptions: FrameGraphTextureCreationOptions = {\r\n size: { width: texture.width, height: texture.height },\r\n options: {\r\n generateMipMaps: internalTexture.generateMipMaps,\r\n generateDepthBuffer: texture._generateDepthBuffer,\r\n generateStencilBuffer: texture._generateStencilBuffer,\r\n samples: internalTexture.samples,\r\n label: internalTexture.label,\r\n types: [internalTexture.type],\r\n samplingModes: [internalTexture.samplingMode],\r\n formats: [internalTexture.format],\r\n targetTypes: [\r\n internalTexture.isCube\r\n ? Constants.TEXTURE_CUBE_MAP\r\n : internalTexture.is3D\r\n ? Constants.TEXTURE_3D\r\n : internalTexture.is2DArray\r\n ? Constants.TEXTURE_2D_ARRAY\r\n : Constants.TEXTURE_2D,\r\n ],\r\n useSRGBBuffers: [internalTexture._useSRGBBuffer],\r\n labels: internalTexture.label ? [internalTexture.label] : undefined,\r\n },\r\n sizeIsPercentage: false,\r\n };\r\n\r\n return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, false, handle);\r\n }\r\n\r\n public createRenderTargetTexture(\r\n name: string,\r\n taskNamespace: boolean,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n multiTargetMode = false,\r\n handle?: FrameGraphTextureHandle\r\n ): FrameGraphTextureHandle {\r\n return this._createHandleForTexture(\r\n name,\r\n null,\r\n creationOptions,\r\n taskNamespace ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph,\r\n multiTargetMode,\r\n handle\r\n );\r\n }\r\n\r\n public getAbsoluteDimensions(\r\n size: TextureSize,\r\n screenWidth = this._engine.getRenderWidth(true),\r\n screenHeight = this._engine.getRenderHeight(true)\r\n ): { width: number; height: number } {\r\n const { width, height } = getDimensionsFromTextureSize(size);\r\n\r\n return {\r\n width: Math.floor((width * screenWidth) / 100),\r\n height: Math.floor((height * screenHeight) / 100),\r\n };\r\n }\r\n\r\n public dispose(): void {\r\n this.releaseTextures();\r\n }\r\n\r\n public allocateTextures() {\r\n this._textures.forEach((entry) => {\r\n if (!entry.texture) {\r\n if (entry.refHandle !== undefined) {\r\n const refEntry = this._textures.get(entry.refHandle)!;\r\n\r\n entry.texture = refEntry.texture;\r\n entry.texture?.texture?.incrementReferences();\r\n\r\n if (refEntry.refHandle === backbufferColorTextureHandle) {\r\n entry.refHandle = backbufferColorTextureHandle;\r\n }\r\n if (refEntry.refHandle === backbufferDepthStencilTextureHandle) {\r\n entry.refHandle = backbufferDepthStencilTextureHandle;\r\n }\r\n } else if (entry.namespace !== FrameGraphTextureNamespace.External) {\r\n if (entry.parentHandle !== undefined) {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n\r\n const parentEntry = this._textures.get(entry.parentHandle)!;\r\n const parentInternalTexture = parentEntry.texture!.textures![entry.parentTextureIndex!];\r\n\r\n const creationOptionsForTexture: RenderTargetCreationOptions = {\r\n createMipMaps: creationOptions.options.createMipMaps,\r\n generateMipMaps: creationOptions.options.generateMipMaps,\r\n generateDepthBuffer: creationOptions.options.generateDepthBuffer,\r\n generateStencilBuffer: creationOptions.options.generateStencilBuffer,\r\n samples: creationOptions.options.samples,\r\n type: creationOptions.options.types![0],\r\n format: creationOptions.options.formats![0],\r\n useSRGBBuffer: creationOptions.options.useSRGBBuffers![0],\r\n colorAttachment: parentInternalTexture,\r\n label: creationOptions.options.label,\r\n };\r\n\r\n entry.texture = this._engine.createRenderTargetTexture(size, creationOptionsForTexture);\r\n parentInternalTexture.incrementReferences();\r\n } else {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n\r\n entry.texture = this._engine.createMultipleRenderTarget(size, creationOptions.options, false);\r\n }\r\n }\r\n }\r\n\r\n if (entry.texture && entry.refHandle === undefined) {\r\n entry.debug?.dispose();\r\n entry.debug = this._createDebugTexture(entry.name, entry.texture);\r\n }\r\n });\r\n }\r\n\r\n public createDanglingHandle() {\r\n return FrameGraphTextureManager._Counter++;\r\n }\r\n\r\n public resolveDanglingHandle(danglingHandle: FrameGraphTextureHandle, handle: FrameGraphTextureHandle) {\r\n if (!this._textures.has(handle)) {\r\n throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);\r\n }\r\n\r\n const textureEntry = this._textures.get(handle)!;\r\n\r\n this._textures.set(danglingHandle, {\r\n texture: textureEntry.texture,\r\n refHandle: handle,\r\n name: textureEntry.name,\r\n creationOptions: {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number; depth?: number; layers?: number }) },\r\n options: { ...textureEntry.creationOptions.options, label: textureEntry.name },\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n },\r\n namespace: textureEntry.namespace,\r\n parentHandle: textureEntry.parentHandle,\r\n parentTextureIndex: textureEntry.parentTextureIndex,\r\n });\r\n }\r\n\r\n public releaseTextures(releaseAll = true): void {\r\n this._textures.forEach((entry, handle) => {\r\n if (releaseAll || entry.namespace !== FrameGraphTextureNamespace.External) {\r\n entry.debug?.dispose();\r\n entry.debug = undefined;\r\n }\r\n\r\n if (entry.namespace === FrameGraphTextureNamespace.External) {\r\n return;\r\n }\r\n\r\n entry.texture?.dispose();\r\n entry.texture = null;\r\n\r\n if (releaseAll || entry.namespace === FrameGraphTextureNamespace.Task) {\r\n this._textures.delete(handle);\r\n }\r\n });\r\n\r\n if (releaseAll) {\r\n this._textures.clear();\r\n this._addSystemTextures();\r\n }\r\n }\r\n\r\n private _addSystemTextures() {\r\n const size = { width: this._engine.getRenderWidth(true), height: this._engine.getRenderHeight(true) };\r\n\r\n this._textures.set(backbufferColorTextureHandle, {\r\n name: \"backbuffer color\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {},\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n\r\n this._textures.set(backbufferDepthStencilTextureHandle, {\r\n name: \"backbuffer depth/stencil\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {},\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n }\r\n\r\n private _createDebugTexture(name: string, texture: RenderTargetWrapper): Texture | undefined {\r\n if (!this._debugTextures || !this._scene) {\r\n return;\r\n }\r\n\r\n const textureDebug = new Texture(null, this._scene);\r\n\r\n textureDebug.name = name;\r\n textureDebug._texture = texture.texture || texture._depthStencilTexture!;\r\n textureDebug._texture.incrementReferences();\r\n\r\n return textureDebug;\r\n }\r\n\r\n private _freeEntry(handle: number): void {\r\n const entry = this._textures.get(handle);\r\n\r\n if (entry) {\r\n entry.debug?.dispose();\r\n this._textures.delete(handle);\r\n }\r\n }\r\n\r\n private _createHandleForTexture(\r\n name: string,\r\n texture: Nullable<RenderTargetWrapper>,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n namespace: FrameGraphTextureNamespace,\r\n multiTargetMode = false,\r\n handle?: FrameGraphTextureHandle,\r\n parentHandle?: FrameGraphTextureHandle,\r\n parentTextureIndex?: number\r\n ): FrameGraphTextureHandle {\r\n handle = handle ?? FrameGraphTextureManager._Counter++;\r\n\r\n this._textures.set(handle, {\r\n texture,\r\n name,\r\n creationOptions: {\r\n size: getDimensionsFromTextureSize(creationOptions.size),\r\n options: { ...creationOptions.options, label: name },\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n },\r\n namespace,\r\n parentHandle,\r\n parentTextureIndex,\r\n });\r\n\r\n if (namespace === FrameGraphTextureNamespace.External) {\r\n return handle;\r\n }\r\n\r\n if (multiTargetMode) {\r\n const textureCount = creationOptions.options.textureCount ?? 1;\r\n for (let i = 0; i < textureCount; i++) {\r\n const label = creationOptions.options.labels?.[i] ?? `${i}`;\r\n const textureName = `${name} - ${label}`;\r\n const creationOptionsForTexture: FrameGraphTextureCreationOptions = {\r\n size: getDimensionsFromTextureSize(creationOptions.size),\r\n options: {\r\n ...creationOptions.options,\r\n formats: [creationOptions.options.formats![i]],\r\n types: [creationOptions.options.types![i]],\r\n textureCount: 1,\r\n },\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n };\r\n this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, false, handle + i + 1, handle, i);\r\n }\r\n\r\n FrameGraphTextureManager._Counter += textureCount;\r\n }\r\n\r\n return handle;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"frameGraphTextureManager.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTextureManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type {\r\n Scene,\r\n AbstractEngine,\r\n RenderTargetWrapper,\r\n RenderTargetCreationOptions,\r\n TextureSize,\r\n Nullable,\r\n FrameGraphTextureCreationOptions,\r\n FrameGraphTextureHandle,\r\n} from \"core/index\";\r\nimport { getDimensionsFromTextureSize } from \"../Materials/Textures/textureCreationOptions\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"./frameGraphTypes\";\r\nimport { Constants } from \"../Engines/constants\";\r\n\r\ntype HistoryTexture = {\r\n textures: Array<Nullable<RenderTargetWrapper>>;\r\n handles: Array<FrameGraphTextureHandle>;\r\n index: number;\r\n refHandles: Array<FrameGraphTextureHandle>; // (dangling) handles that reference this history texture\r\n};\r\n\r\ntype TextureEntry = {\r\n texture: Nullable<RenderTargetWrapper>;\r\n name: string;\r\n creationOptions: FrameGraphTextureCreationOptions;\r\n namespace: FrameGraphTextureNamespace;\r\n debug?: Texture;\r\n parentHandle?: FrameGraphTextureHandle; // Parent handle if the texture comes from a multi-target texture\r\n parentTextureIndex?: number; // Index of the texture in the parent if the texture comes from a multi-target texture\r\n refHandle?: FrameGraphTextureHandle; // Handle of the texture this one is referencing - used for dangling handles\r\n};\r\n\r\nenum FrameGraphTextureNamespace {\r\n Task,\r\n Graph,\r\n External,\r\n}\r\n\r\n/**\r\n * @experimental\r\n * @internal\r\n */\r\nexport class FrameGraphTextureManager {\r\n private static _Counter = 2; // 0 and 1 are reserved for backbuffer textures\r\n\r\n public _textures: Map<FrameGraphTextureHandle, TextureEntry> = new Map();\r\n public _historyTextures: Map<FrameGraphTextureHandle, HistoryTexture> = new Map();\r\n\r\n constructor(\r\n private _engine: AbstractEngine,\r\n private _debugTextures = false,\r\n private _scene?: Scene\r\n ) {\r\n this._addSystemTextures();\r\n }\r\n\r\n public isBackbuffer(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle || handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle || textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n public isBackbufferColor(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferColorTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferColorTextureHandle;\r\n }\r\n\r\n public isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean {\r\n if (handle === backbufferDepthStencilTextureHandle) {\r\n return true;\r\n }\r\n\r\n const textureEntry = this._textures.get(handle);\r\n if (!textureEntry) {\r\n return false;\r\n }\r\n\r\n return textureEntry.refHandle === backbufferDepthStencilTextureHandle;\r\n }\r\n\r\n public getTextureCreationOptions(handle: FrameGraphTextureHandle): FrameGraphTextureCreationOptions {\r\n return this._textures.get(handle)!.creationOptions;\r\n }\r\n\r\n public getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<RenderTargetWrapper> {\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n return historyEntry.textures[historyEntry.index ^ 1]; // get the read texture\r\n }\r\n return this._textures.get(handle)!.texture;\r\n }\r\n\r\n public importTexture(name: string, texture: RenderTargetWrapper, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle {\r\n const internalTexture = texture.texture;\r\n\r\n if (!internalTexture) {\r\n throw new Error(\"importTexture: Texture must have an internal texture to be imported\");\r\n }\r\n\r\n if (handle !== undefined) {\r\n this._freeEntry(handle);\r\n }\r\n\r\n const creationOptions: FrameGraphTextureCreationOptions = {\r\n size: { width: texture.width, height: texture.height },\r\n options: {\r\n generateMipMaps: internalTexture.generateMipMaps,\r\n generateDepthBuffer: texture._generateDepthBuffer,\r\n generateStencilBuffer: texture._generateStencilBuffer,\r\n samples: internalTexture.samples,\r\n label: internalTexture.label,\r\n types: [internalTexture.type],\r\n samplingModes: [internalTexture.samplingMode],\r\n formats: [internalTexture.format],\r\n targetTypes: [\r\n internalTexture.isCube\r\n ? Constants.TEXTURE_CUBE_MAP\r\n : internalTexture.is3D\r\n ? Constants.TEXTURE_3D\r\n : internalTexture.is2DArray\r\n ? Constants.TEXTURE_2D_ARRAY\r\n : Constants.TEXTURE_2D,\r\n ],\r\n useSRGBBuffers: [internalTexture._useSRGBBuffer],\r\n labels: internalTexture.label ? [internalTexture.label] : undefined,\r\n },\r\n sizeIsPercentage: false,\r\n };\r\n\r\n return this._createHandleForTexture(name, texture, creationOptions, FrameGraphTextureNamespace.External, false, handle);\r\n }\r\n\r\n public createRenderTargetTexture(\r\n name: string,\r\n taskNamespace: boolean,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n multiTargetMode = false,\r\n handle?: FrameGraphTextureHandle\r\n ): FrameGraphTextureHandle {\r\n return this._createHandleForTexture(\r\n name,\r\n null,\r\n creationOptions,\r\n taskNamespace ? FrameGraphTextureNamespace.Task : FrameGraphTextureNamespace.Graph,\r\n multiTargetMode,\r\n handle\r\n );\r\n }\r\n\r\n public getAbsoluteDimensions(\r\n size: TextureSize,\r\n screenWidth = this._engine.getRenderWidth(true),\r\n screenHeight = this._engine.getRenderHeight(true)\r\n ): { width: number; height: number } {\r\n const { width, height } = getDimensionsFromTextureSize(size);\r\n\r\n return {\r\n width: Math.floor((width * screenWidth) / 100),\r\n height: Math.floor((height * screenHeight) / 100),\r\n };\r\n }\r\n\r\n public updateHistoryTextures(): void {\r\n this._historyTextures.forEach((entry) => {\r\n entry.index = entry.index ^ 1;\r\n for (const refHandle of entry.refHandles) {\r\n const textureEntry = this._textures.get(refHandle)!;\r\n textureEntry.texture = entry.textures[entry.index];\r\n }\r\n });\r\n }\r\n\r\n public dispose(): void {\r\n this.releaseTextures();\r\n }\r\n\r\n public allocateTextures() {\r\n this._textures.forEach((entry) => {\r\n if (!entry.texture) {\r\n if (entry.refHandle !== undefined) {\r\n const refEntry = this._textures.get(entry.refHandle)!;\r\n\r\n entry.texture = refEntry.texture;\r\n entry.texture?.texture?.incrementReferences();\r\n\r\n if (refEntry.refHandle === backbufferColorTextureHandle) {\r\n entry.refHandle = backbufferColorTextureHandle;\r\n }\r\n if (refEntry.refHandle === backbufferDepthStencilTextureHandle) {\r\n entry.refHandle = backbufferDepthStencilTextureHandle;\r\n }\r\n } else if (entry.namespace !== FrameGraphTextureNamespace.External) {\r\n if (entry.parentHandle !== undefined) {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n\r\n const parentEntry = this._textures.get(entry.parentHandle)!;\r\n const parentInternalTexture = parentEntry.texture!.textures![entry.parentTextureIndex!];\r\n\r\n const creationOptionsForTexture: RenderTargetCreationOptions = {\r\n createMipMaps: creationOptions.options.createMipMaps,\r\n generateMipMaps: creationOptions.options.generateMipMaps,\r\n generateDepthBuffer: creationOptions.options.generateDepthBuffer,\r\n generateStencilBuffer: creationOptions.options.generateStencilBuffer,\r\n samples: creationOptions.options.samples,\r\n type: creationOptions.options.types![0],\r\n format: creationOptions.options.formats![0],\r\n useSRGBBuffer: creationOptions.options.useSRGBBuffers![0],\r\n colorAttachment: parentInternalTexture,\r\n label: creationOptions.options.label,\r\n };\r\n\r\n entry.texture = this._engine.createRenderTargetTexture(size, creationOptionsForTexture);\r\n parentInternalTexture.incrementReferences();\r\n } else {\r\n const creationOptions = entry.creationOptions;\r\n const size = creationOptions.sizeIsPercentage ? this.getAbsoluteDimensions(creationOptions.size) : creationOptions.size;\r\n\r\n entry.texture = this._engine.createMultipleRenderTarget(size, creationOptions.options, false);\r\n }\r\n }\r\n }\r\n\r\n if (entry.texture && entry.refHandle === undefined) {\r\n entry.debug?.dispose();\r\n entry.debug = this._createDebugTexture(entry.name, entry.texture);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = this._textures.get(entry.handles[i])!.texture;\r\n }\r\n });\r\n }\r\n\r\n public createDanglingHandle() {\r\n return FrameGraphTextureManager._Counter++;\r\n }\r\n\r\n public resolveDanglingHandle(danglingHandle: FrameGraphTextureHandle, handle: FrameGraphTextureHandle) {\r\n const textureEntry = this._textures.get(handle);\r\n\r\n if (textureEntry === undefined) {\r\n throw new Error(`resolveDanglingHandle: Handle ${handle} does not exist!`);\r\n }\r\n\r\n this._textures.set(danglingHandle, {\r\n texture: textureEntry.texture,\r\n refHandle: handle,\r\n name: textureEntry.name,\r\n creationOptions: {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number; depth?: number; layers?: number }) },\r\n options: { ...textureEntry.creationOptions.options, label: textureEntry.name },\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n },\r\n namespace: textureEntry.namespace,\r\n parentHandle: textureEntry.parentHandle,\r\n parentTextureIndex: textureEntry.parentTextureIndex,\r\n });\r\n\r\n const historyEntry = this._historyTextures.get(handle);\r\n if (historyEntry) {\r\n historyEntry.refHandles.push(danglingHandle);\r\n }\r\n }\r\n\r\n public releaseTextures(releaseAll = true): void {\r\n this._textures.forEach((entry, handle) => {\r\n if (releaseAll || entry.namespace !== FrameGraphTextureNamespace.External) {\r\n entry.debug?.dispose();\r\n entry.debug = undefined;\r\n }\r\n\r\n if (entry.namespace === FrameGraphTextureNamespace.External) {\r\n return;\r\n }\r\n\r\n entry.texture?.dispose();\r\n entry.texture = null;\r\n\r\n if (releaseAll || entry.namespace === FrameGraphTextureNamespace.Task) {\r\n this._textures.delete(handle);\r\n }\r\n });\r\n\r\n this._historyTextures.forEach((entry) => {\r\n for (let i = 0; i < entry.handles.length; i++) {\r\n entry.textures[i] = null;\r\n }\r\n });\r\n\r\n if (releaseAll) {\r\n this._textures.clear();\r\n this._historyTextures.clear();\r\n this._addSystemTextures();\r\n }\r\n }\r\n\r\n private _addSystemTextures() {\r\n const size = { width: this._engine.getRenderWidth(true), height: this._engine.getRenderHeight(true) };\r\n\r\n this._textures.set(backbufferColorTextureHandle, {\r\n name: \"backbuffer color\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {},\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n\r\n this._textures.set(backbufferDepthStencilTextureHandle, {\r\n name: \"backbuffer depth/stencil\",\r\n texture: null,\r\n creationOptions: {\r\n size,\r\n options: {},\r\n sizeIsPercentage: false,\r\n },\r\n namespace: FrameGraphTextureNamespace.External,\r\n });\r\n }\r\n\r\n private _createDebugTexture(name: string, texture: RenderTargetWrapper): Texture | undefined {\r\n if (!this._debugTextures || !this._scene) {\r\n return;\r\n }\r\n\r\n const textureDebug = new Texture(null, this._scene);\r\n\r\n textureDebug.name = name;\r\n textureDebug._texture = texture.texture || texture._depthStencilTexture!;\r\n textureDebug._texture.incrementReferences();\r\n\r\n return textureDebug;\r\n }\r\n\r\n private _freeEntry(handle: number): void {\r\n const entry = this._textures.get(handle);\r\n\r\n if (entry) {\r\n entry.debug?.dispose();\r\n this._textures.delete(handle);\r\n }\r\n }\r\n\r\n private _createHandleForTexture(\r\n name: string,\r\n texture: Nullable<RenderTargetWrapper>,\r\n creationOptions: FrameGraphTextureCreationOptions,\r\n namespace: FrameGraphTextureNamespace,\r\n multiTargetMode = false,\r\n handle?: FrameGraphTextureHandle,\r\n parentHandle?: FrameGraphTextureHandle,\r\n parentTextureIndex?: number\r\n ): FrameGraphTextureHandle {\r\n handle = handle ?? FrameGraphTextureManager._Counter++;\r\n\r\n const textureName = creationOptions.isHistoryTexture ? `${name} - ping` : name;\r\n\r\n const textureEntry: TextureEntry = {\r\n texture,\r\n name: textureName,\r\n creationOptions: {\r\n size: getDimensionsFromTextureSize(creationOptions.size),\r\n options: { ...creationOptions.options, label: textureName },\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n isHistoryTexture: creationOptions.isHistoryTexture,\r\n },\r\n namespace,\r\n parentHandle,\r\n parentTextureIndex,\r\n };\r\n\r\n this._textures.set(handle, textureEntry);\r\n\r\n if (namespace === FrameGraphTextureNamespace.External) {\r\n return handle;\r\n }\r\n\r\n if (creationOptions.isHistoryTexture) {\r\n const pongCreationOptions: FrameGraphTextureCreationOptions = {\r\n size: { ...(textureEntry.creationOptions.size as { width: number; height: number }) },\r\n options: { ...textureEntry.creationOptions.options },\r\n sizeIsPercentage: textureEntry.creationOptions.sizeIsPercentage,\r\n isHistoryTexture: false,\r\n };\r\n\r\n const pongTexture = this._createHandleForTexture(`${name} - pong`, null, pongCreationOptions, namespace, false);\r\n\r\n this._historyTextures.set(handle, { textures: [null, null], handles: [handle, pongTexture], index: 0, refHandles: [] });\r\n\r\n return handle;\r\n }\r\n\r\n if (multiTargetMode) {\r\n const textureCount = creationOptions.options.textureCount ?? 1;\r\n for (let i = 0; i < textureCount; i++) {\r\n const label = creationOptions.options.labels?.[i] ?? `${i}`;\r\n const textureName = `${name} - ${label}`;\r\n const creationOptionsForTexture: FrameGraphTextureCreationOptions = {\r\n size: getDimensionsFromTextureSize(creationOptions.size),\r\n options: {\r\n ...creationOptions.options,\r\n formats: [creationOptions.options.formats![i]],\r\n types: [creationOptions.options.types![i]],\r\n textureCount: 1,\r\n },\r\n sizeIsPercentage: creationOptions.sizeIsPercentage,\r\n };\r\n this._createHandleForTexture(textureName, null, creationOptionsForTexture, namespace, false, handle + i + 1, handle, i);\r\n }\r\n\r\n FrameGraphTextureManager._Counter += textureCount;\r\n }\r\n\r\n return handle;\r\n }\r\n}\r\n"]}
@@ -21,6 +21,8 @@ export type FrameGraphTextureCreationOptions = {
21
21
  options: IMultiRenderTargetOptions;
22
22
  /** If true, indicates that "size" is percentages relative to the screen size */
23
23
  sizeIsPercentage: boolean;
24
+ /** Indicates that the texture is a history texture */
25
+ isHistoryTexture?: boolean;
24
26
  };
25
27
  /**
26
28
  * Represents a texture description in the frame graph.
@@ -1 +1 @@
1
- {"version":3,"file":"frameGraphTypes.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTypes.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA4B,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAA4B,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { Nullable, TextureSize, FrameGraphContext, IMultiRenderTargetOptions } from \"core/index\";\r\n\r\n/**\r\n * Represents a texture handle in the frame graph.\r\n */\r\nexport type FrameGraphTextureHandle = number;\r\n\r\n/**\r\n * Represents a texture handle for the backbuffer color texture.\r\n */\r\nexport const backbufferColorTextureHandle: FrameGraphTextureHandle = 0;\r\n\r\n/**\r\n * Represents a texture handle for the backbuffer depth/stencil texture.\r\n */\r\nexport const backbufferDepthStencilTextureHandle: FrameGraphTextureHandle = 1;\r\n\r\n/**\r\n * Options used to create a texture in the frame graph.\r\n */\r\nexport type FrameGraphTextureCreationOptions = {\r\n /** Size of the texture. If sizeIsPercentage is true, these are percentages relative to the screen size */\r\n size: TextureSize;\r\n\r\n /** Options used to create the (multi) render target texture */\r\n options: IMultiRenderTargetOptions;\r\n\r\n /** If true, indicates that \"size\" is percentages relative to the screen size */\r\n sizeIsPercentage: boolean;\r\n};\r\n\r\n/**\r\n * Represents a texture description in the frame graph.\r\n * This is basically the same thing than FrameGraphTextureCreationOptions, but the size is never in percentage and always in pixels.\r\n */\r\nexport type FrameGraphTextureDescription = {\r\n /**\r\n * Size of the texture.\r\n */\r\n size: { width: number; height: number };\r\n\r\n /**\r\n * Options used when the (multi) render target texture had been created.\r\n */\r\n options: IMultiRenderTargetOptions;\r\n};\r\n\r\n/**\r\n * Defines a pass in the frame graph.\r\n */\r\nexport interface IFrameGraphPass {\r\n /**\r\n * The name of the pass.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Sets the function to execute when the pass is executed\r\n * @param func The function to execute when the pass is executed\r\n */\r\n setExecuteFunc(func: (context: FrameGraphContext) => void): void;\r\n\r\n /** @internal */\r\n _execute(): void;\r\n\r\n /** @internal */\r\n _isValid(): Nullable<string>;\r\n}\r\n"]}
1
+ {"version":3,"file":"frameGraphTypes.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/frameGraphTypes.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA4B,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAA4B,CAAC,CAAC","sourcesContent":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { Nullable, TextureSize, FrameGraphContext, IMultiRenderTargetOptions } from \"core/index\";\r\n\r\n/**\r\n * Represents a texture handle in the frame graph.\r\n */\r\nexport type FrameGraphTextureHandle = number;\r\n\r\n/**\r\n * Represents a texture handle for the backbuffer color texture.\r\n */\r\nexport const backbufferColorTextureHandle: FrameGraphTextureHandle = 0;\r\n\r\n/**\r\n * Represents a texture handle for the backbuffer depth/stencil texture.\r\n */\r\nexport const backbufferDepthStencilTextureHandle: FrameGraphTextureHandle = 1;\r\n\r\n/**\r\n * Options used to create a texture in the frame graph.\r\n */\r\nexport type FrameGraphTextureCreationOptions = {\r\n /** Size of the texture. If sizeIsPercentage is true, these are percentages relative to the screen size */\r\n size: TextureSize;\r\n\r\n /** Options used to create the (multi) render target texture */\r\n options: IMultiRenderTargetOptions;\r\n\r\n /** If true, indicates that \"size\" is percentages relative to the screen size */\r\n sizeIsPercentage: boolean;\r\n\r\n /** Indicates that the texture is a history texture */\r\n isHistoryTexture?: boolean;\r\n};\r\n\r\n/**\r\n * Represents a texture description in the frame graph.\r\n * This is basically the same thing than FrameGraphTextureCreationOptions, but the size is never in percentage and always in pixels.\r\n */\r\nexport type FrameGraphTextureDescription = {\r\n /**\r\n * Size of the texture.\r\n */\r\n size: { width: number; height: number };\r\n\r\n /**\r\n * Options used when the (multi) render target texture had been created.\r\n */\r\n options: IMultiRenderTargetOptions;\r\n};\r\n\r\n/**\r\n * Defines a pass in the frame graph.\r\n */\r\nexport interface IFrameGraphPass {\r\n /**\r\n * The name of the pass.\r\n */\r\n name: string;\r\n\r\n /**\r\n * Sets the function to execute when the pass is executed\r\n * @param func The function to execute when the pass is executed\r\n */\r\n setExecuteFunc(func: (context: FrameGraphContext) => void): void;\r\n\r\n /** @internal */\r\n _execute(): void;\r\n\r\n /** @internal */\r\n _isValid(): Nullable<string>;\r\n}\r\n"]}
@@ -16,9 +16,10 @@ export * from "./Tasks/PostProcesses/postProcessTask";
16
16
  export * from "./Tasks/Texture/clearTextureTask";
17
17
  export * from "./Tasks/Texture/copyToBackbufferColorTask";
18
18
  export * from "./Tasks/Texture/copyToTextureTask";
19
- export * from "./Tasks/Rendering/objectRendererTask";
20
- export * from "./Tasks/Rendering/geometryRendererTask";
21
19
  export * from "./Tasks/Rendering/cullObjectsTask";
20
+ export * from "./Tasks/Rendering/geometryRendererTask";
21
+ export * from "./Tasks/Rendering/objectRendererTask";
22
+ export * from "./Tasks/Rendering/taaObjectRendererTask";
22
23
  export * from "./frameGraph";
23
24
  export * from "./frameGraphContext";
24
25
  export * from "./frameGraphObjectList";
@@ -17,9 +17,10 @@ export * from "./Tasks/PostProcesses/postProcessTask.js";
17
17
  export * from "./Tasks/Texture/clearTextureTask.js";
18
18
  export * from "./Tasks/Texture/copyToBackbufferColorTask.js";
19
19
  export * from "./Tasks/Texture/copyToTextureTask.js";
20
- export * from "./Tasks/Rendering/objectRendererTask.js";
21
- export * from "./Tasks/Rendering/geometryRendererTask.js";
22
20
  export * from "./Tasks/Rendering/cullObjectsTask.js";
21
+ export * from "./Tasks/Rendering/geometryRendererTask.js";
22
+ export * from "./Tasks/Rendering/objectRendererTask.js";
23
+ export * from "./Tasks/Rendering/taaObjectRendererTask.js";
23
24
  export * from "./frameGraph.js";
24
25
  export * from "./frameGraphContext.js";
25
26
  export * from "./frameGraphObjectList.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAElD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,mCAAmC,CAAC;AAElD,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./Node/nodeRenderGraph\";\r\nexport * from \"./Node/nodeRenderGraphBlock\";\r\nexport * from \"./Node/nodeRenderGraphBlockConnectionPoint\";\r\nexport * from \"./Node/nodeRenderGraphBuildState\";\r\nexport * from \"./Node/Types/nodeRenderGraphTypes\";\r\nexport * from \"./Node/Blocks/index\";\r\n\r\nexport * from \"./Passes/pass\";\r\nexport * from \"./Passes/renderPass\";\r\n\r\nexport * from \"./Tasks/PostProcesses/blackAndWhiteTask\";\r\nexport * from \"./Tasks/PostProcesses/bloomTask\";\r\nexport * from \"./Tasks/PostProcesses/blurTask\";\r\nexport * from \"./Tasks/PostProcesses/circleOfConfusionTask\";\r\nexport * from \"./Tasks/PostProcesses/depthOfFieldTask\";\r\nexport * from \"./Tasks/PostProcesses/extractHighlightsTask\";\r\nexport * from \"./Tasks/PostProcesses/postProcessTask\";\r\n\r\nexport * from \"./Tasks/Texture/clearTextureTask\";\r\nexport * from \"./Tasks/Texture/copyToBackbufferColorTask\";\r\nexport * from \"./Tasks/Texture/copyToTextureTask\";\r\n\r\nexport * from \"./Tasks/Rendering/objectRendererTask\";\r\nexport * from \"./Tasks/Rendering/geometryRendererTask\";\r\nexport * from \"./Tasks/Rendering/cullObjectsTask\";\r\n\r\nexport * from \"./frameGraph\";\r\nexport * from \"./frameGraphContext\";\r\nexport * from \"./frameGraphObjectList\";\r\nexport * from \"./frameGraphRenderContext\";\r\nexport * from \"./frameGraphTask\";\r\nexport * from \"./frameGraphTextureManager\";\r\nexport * from \"./frameGraphTypes\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/FrameGraph/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,qBAAqB,CAAC;AAEpC,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AAEpC,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AAEtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAElD,cAAc,mCAAmC,CAAC;AAClD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,yCAAyC,CAAC;AAExD,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./Node/nodeRenderGraph\";\r\nexport * from \"./Node/nodeRenderGraphBlock\";\r\nexport * from \"./Node/nodeRenderGraphBlockConnectionPoint\";\r\nexport * from \"./Node/nodeRenderGraphBuildState\";\r\nexport * from \"./Node/Types/nodeRenderGraphTypes\";\r\nexport * from \"./Node/Blocks/index\";\r\n\r\nexport * from \"./Passes/pass\";\r\nexport * from \"./Passes/renderPass\";\r\n\r\nexport * from \"./Tasks/PostProcesses/blackAndWhiteTask\";\r\nexport * from \"./Tasks/PostProcesses/bloomTask\";\r\nexport * from \"./Tasks/PostProcesses/blurTask\";\r\nexport * from \"./Tasks/PostProcesses/circleOfConfusionTask\";\r\nexport * from \"./Tasks/PostProcesses/depthOfFieldTask\";\r\nexport * from \"./Tasks/PostProcesses/extractHighlightsTask\";\r\nexport * from \"./Tasks/PostProcesses/postProcessTask\";\r\n\r\nexport * from \"./Tasks/Texture/clearTextureTask\";\r\nexport * from \"./Tasks/Texture/copyToBackbufferColorTask\";\r\nexport * from \"./Tasks/Texture/copyToTextureTask\";\r\n\r\nexport * from \"./Tasks/Rendering/cullObjectsTask\";\r\nexport * from \"./Tasks/Rendering/geometryRendererTask\";\r\nexport * from \"./Tasks/Rendering/objectRendererTask\";\r\nexport * from \"./Tasks/Rendering/taaObjectRendererTask\";\r\n\r\nexport * from \"./frameGraph\";\r\nexport * from \"./frameGraphContext\";\r\nexport * from \"./frameGraphObjectList\";\r\nexport * from \"./frameGraphRenderContext\";\r\nexport * from \"./frameGraphTask\";\r\nexport * from \"./frameGraphTextureManager\";\r\nexport * from \"./frameGraphTypes\";\r\n"]}
package/Layers/layer.d.ts CHANGED
@@ -71,6 +71,10 @@ export declare class Layer {
71
71
  * renders in the main frame buffer of the canvas.
72
72
  */
73
73
  renderOnlyInRenderTargetTextures: boolean;
74
+ /**
75
+ * Define if the colors of the layer should be generated in linear space (default: false)
76
+ */
77
+ convertToLinearSpace: boolean;
74
78
  /**
75
79
  * Define if the layer is enabled (ie. should be displayed). Default: true
76
80
  */
package/Layers/layer.js CHANGED
@@ -105,6 +105,10 @@ export class Layer {
105
105
  * renders in the main frame buffer of the canvas.
106
106
  */
107
107
  this.renderOnlyInRenderTargetTextures = false;
108
+ /**
109
+ * Define if the colors of the layer should be generated in linear space (default: false)
110
+ */
111
+ this.convertToLinearSpace = false;
108
112
  /**
109
113
  * Define if the layer is enabled (ie. should be displayed). Default: true
110
114
  */
@@ -180,8 +184,15 @@ export class Layer {
180
184
  if (this.alphaTest) {
181
185
  defines = "#define ALPHATEST";
182
186
  }
183
- if (this.texture && !this.texture.gammaSpace) {
184
- defines += "\n#define LINEAR";
187
+ if (this.texture) {
188
+ if (this.texture.gammaSpace) {
189
+ if (this.convertToLinearSpace) {
190
+ defines += "\n#define CONVERT_TO_LINEAR";
191
+ }
192
+ }
193
+ else if (!this.convertToLinearSpace) {
194
+ defines += "\n#define CONVERT_TO_GAMMA";
195
+ }
185
196
  }
186
197
  if (this._previousDefines !== defines) {
187
198
  this._previousDefines = defines;
@@ -1 +1 @@
1
- {"version":3,"file":"layer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/layer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { LayerSceneComponent } from \"./layerSceneComponent\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n */\r\nexport class Layer {\r\n /**\r\n * Force all the layers to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * Define the texture the layer should display.\r\n */\r\n public texture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Is the layer in background or foreground.\r\n */\r\n public isBackground: boolean;\r\n\r\n private _applyPostProcess: boolean = true;\r\n /**\r\n * Determines if the layer is drawn before (true) or after (false) post-processing.\r\n * If the layer is background, it is always before.\r\n */\r\n public set applyPostProcess(value: boolean) {\r\n this._applyPostProcess = value;\r\n }\r\n public get applyPostProcess(): boolean {\r\n return this.isBackground || this._applyPostProcess;\r\n }\r\n\r\n /**\r\n * Define the color of the layer (instead of texture).\r\n */\r\n public color: Color4;\r\n\r\n /**\r\n * Define the scale of the layer in order to zoom in out of the texture.\r\n */\r\n public scale = new Vector2(1, 1);\r\n\r\n /**\r\n * Define an offset for the layer in order to shift the texture.\r\n */\r\n public offset = new Vector2(0, 0);\r\n\r\n /**\r\n * Define the alpha blending mode used in the layer in case the texture or color has an alpha.\r\n */\r\n public alphaBlendingMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Define if the layer should alpha test or alpha blend with the rest of the scene.\r\n * Alpha test will not mix with the background color in case of transparency.\r\n * It will either use the texture color or the background depending on the alpha value of the current pixel.\r\n */\r\n public alphaTest: boolean;\r\n\r\n /**\r\n * Define a mask to restrict the layer to only some of the scene cameras.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * Define the list of render target the layer is visible into.\r\n */\r\n public renderTargetTextures: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Define if the layer is only used in renderTarget or if it also\r\n * renders in the main frame buffer of the canvas.\r\n */\r\n public renderOnlyInRenderTargetTextures = false;\r\n\r\n /**\r\n * Define if the layer is enabled (ie. should be displayed). Default: true\r\n */\r\n public isEnabled = true;\r\n\r\n private _scene: Scene;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _drawWrapper: DrawWrapper;\r\n private _previousDefines: string;\r\n\r\n /**\r\n * An event triggered when the layer is disposed.\r\n */\r\n public onDisposeObservable = new Observable<Layer>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onDisposeObservable existed.\r\n * The set callback will be triggered when the layer has been disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene\r\n */\r\n public onBeforeRenderObservable = new Observable<Layer>();\r\n\r\n private _onBeforeRenderObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onBeforeRenderObservable existed.\r\n * The set callback will be triggered just before rendering the layer.\r\n */\r\n public set onBeforeRender(callback: () => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable<Layer>();\r\n\r\n private _onAfterRenderObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onAfterRenderObservable existed.\r\n * The set callback will be triggered just after rendering the layer.\r\n */\r\n public set onAfterRender(callback: () => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /** Shader language used by the material */\r\n private _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new layer.\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n * @param name Define the name of the layer in the scene\r\n * @param imgUrl Define the url of the texture to display in the layer\r\n * @param scene Define the scene the layer belongs to\r\n * @param isBackground Defines whether the layer is displayed in front or behind the scene\r\n * @param color Defines a color for the layer\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(\r\n /**\r\n * Define the name of the layer.\r\n */\r\n public name: string,\r\n imgUrl: Nullable<string>,\r\n scene: Nullable<Scene>,\r\n isBackground?: boolean,\r\n color?: Color4,\r\n forceGLSL = false\r\n ) {\r\n this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null;\r\n this.isBackground = isBackground === undefined ? true : isBackground;\r\n this.color = color === undefined ? new Color4(1, 1, 1, 1) : color;\r\n\r\n this._scene = <Scene>(scene || EngineStore.LastCreatedScene);\r\n const engine = this._scene.getEngine();\r\n if (engine.isWebGPU && !forceGLSL && !Layer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER) as LayerSceneComponent;\r\n if (!layerComponent) {\r\n layerComponent = new LayerSceneComponent(this._scene);\r\n this._scene._addComponent(layerComponent);\r\n }\r\n this._scene.layers.push(this);\r\n\r\n this._drawWrapper = new DrawWrapper(engine);\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be rendered\r\n * @returns true if the layer is ready. False otherwise.\r\n */\r\n public isReady() {\r\n const engine = this._scene.getEngine();\r\n\r\n let defines = \"\";\r\n\r\n if (this.alphaTest) {\r\n defines = \"#define ALPHATEST\";\r\n }\r\n\r\n if (this.texture && !this.texture.gammaSpace) {\r\n defines += \"\\n#define LINEAR\";\r\n }\r\n\r\n if (this._previousDefines !== defines) {\r\n this._previousDefines = defines;\r\n this._drawWrapper.effect = engine.createEffect(\r\n \"layer\",\r\n [VertexBuffer.PositionKind],\r\n [\"textureMatrix\", \"color\", \"scale\", \"offset\"],\r\n [\"textureSampler\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/layer.vertex\"), import(\"../ShadersWGSL/layer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/layer.vertex\"), import(\"../Shaders/layer.fragment\")]);\r\n }\r\n this._shadersLoaded = true;\r\n }\r\n );\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect;\r\n\r\n return !!currentEffect?.isReady() && (!this.texture || this.texture.isReady());\r\n }\r\n\r\n /**\r\n * Renders the layer in the scene.\r\n */\r\n public render(): void {\r\n if (!this.isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect!;\r\n\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n engine.setState(false);\r\n\r\n // Texture\r\n if (this.texture) {\r\n currentEffect.setTexture(\"textureSampler\", this.texture);\r\n currentEffect.setMatrix(\"textureMatrix\", this.texture.getTextureMatrix());\r\n }\r\n\r\n // Color\r\n currentEffect.setFloat4(\"color\", this.color.r, this.color.g, this.color.b, this.color.a);\r\n\r\n // Scale / offset\r\n currentEffect.setVector2(\"offset\", this.offset);\r\n currentEffect.setVector2(\"scale\", this.scale);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect);\r\n\r\n // Draw order\r\n if (!this.alphaTest) {\r\n engine.setAlphaMode(this.alphaBlendingMode);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n } else {\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Disposes and releases the associated resources.\r\n */\r\n public dispose(): void {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n this.texture = null;\r\n }\r\n\r\n // Clean RTT list\r\n this.renderTargetTextures = [];\r\n\r\n // Remove from scene\r\n const index = this._scene.layers.indexOf(this);\r\n this._scene.layers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"layer.js","sourceRoot":"","sources":["../../../../dev/core/src/Layers/layer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector2 } from \"../Maths/math.vector\";\r\nimport { Color4 } from \"../Maths/math.color\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { Texture } from \"../Materials/Textures/texture\";\r\nimport type { BaseTexture } from \"../Materials/Textures/baseTexture\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { LayerSceneComponent } from \"./layerSceneComponent\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\n\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\n\r\n/**\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n */\r\nexport class Layer {\r\n /**\r\n * Force all the layers to compile to glsl even on WebGPU engines.\r\n * False by default. This is mostly meant for backward compatibility.\r\n */\r\n public static ForceGLSL = false;\r\n /**\r\n * Define the texture the layer should display.\r\n */\r\n public texture: Nullable<BaseTexture>;\r\n\r\n /**\r\n * Is the layer in background or foreground.\r\n */\r\n public isBackground: boolean;\r\n\r\n private _applyPostProcess: boolean = true;\r\n /**\r\n * Determines if the layer is drawn before (true) or after (false) post-processing.\r\n * If the layer is background, it is always before.\r\n */\r\n public set applyPostProcess(value: boolean) {\r\n this._applyPostProcess = value;\r\n }\r\n public get applyPostProcess(): boolean {\r\n return this.isBackground || this._applyPostProcess;\r\n }\r\n\r\n /**\r\n * Define the color of the layer (instead of texture).\r\n */\r\n public color: Color4;\r\n\r\n /**\r\n * Define the scale of the layer in order to zoom in out of the texture.\r\n */\r\n public scale = new Vector2(1, 1);\r\n\r\n /**\r\n * Define an offset for the layer in order to shift the texture.\r\n */\r\n public offset = new Vector2(0, 0);\r\n\r\n /**\r\n * Define the alpha blending mode used in the layer in case the texture or color has an alpha.\r\n */\r\n public alphaBlendingMode = Constants.ALPHA_COMBINE;\r\n\r\n /**\r\n * Define if the layer should alpha test or alpha blend with the rest of the scene.\r\n * Alpha test will not mix with the background color in case of transparency.\r\n * It will either use the texture color or the background depending on the alpha value of the current pixel.\r\n */\r\n public alphaTest: boolean;\r\n\r\n /**\r\n * Define a mask to restrict the layer to only some of the scene cameras.\r\n */\r\n public layerMask: number = 0x0fffffff;\r\n\r\n /**\r\n * Define the list of render target the layer is visible into.\r\n */\r\n public renderTargetTextures: RenderTargetTexture[] = [];\r\n\r\n /**\r\n * Define if the layer is only used in renderTarget or if it also\r\n * renders in the main frame buffer of the canvas.\r\n */\r\n public renderOnlyInRenderTargetTextures = false;\r\n\r\n /**\r\n * Define if the colors of the layer should be generated in linear space (default: false)\r\n */\r\n public convertToLinearSpace = false;\r\n\r\n /**\r\n * Define if the layer is enabled (ie. should be displayed). Default: true\r\n */\r\n public isEnabled = true;\r\n\r\n private _scene: Scene;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _drawWrapper: DrawWrapper;\r\n private _previousDefines: string;\r\n\r\n /**\r\n * An event triggered when the layer is disposed.\r\n */\r\n public onDisposeObservable = new Observable<Layer>();\r\n\r\n private _onDisposeObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onDisposeObservable existed.\r\n * The set callback will be triggered when the layer has been disposed.\r\n */\r\n public set onDispose(callback: () => void) {\r\n if (this._onDisposeObserver) {\r\n this.onDisposeObservable.remove(this._onDisposeObserver);\r\n }\r\n this._onDisposeObserver = this.onDisposeObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered before rendering the scene\r\n */\r\n public onBeforeRenderObservable = new Observable<Layer>();\r\n\r\n private _onBeforeRenderObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onBeforeRenderObservable existed.\r\n * The set callback will be triggered just before rendering the layer.\r\n */\r\n public set onBeforeRender(callback: () => void) {\r\n if (this._onBeforeRenderObserver) {\r\n this.onBeforeRenderObservable.remove(this._onBeforeRenderObserver);\r\n }\r\n this._onBeforeRenderObserver = this.onBeforeRenderObservable.add(callback);\r\n }\r\n\r\n /**\r\n * An event triggered after rendering the scene\r\n */\r\n public onAfterRenderObservable = new Observable<Layer>();\r\n\r\n private _onAfterRenderObserver: Nullable<Observer<Layer>>;\r\n /**\r\n * Back compatibility with callback before the onAfterRenderObservable existed.\r\n * The set callback will be triggered just after rendering the layer.\r\n */\r\n public set onAfterRender(callback: () => void) {\r\n if (this._onAfterRenderObserver) {\r\n this.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n }\r\n this._onAfterRenderObserver = this.onAfterRenderObservable.add(callback);\r\n }\r\n\r\n /** Shader language used by the material */\r\n private _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this material.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * Instantiates a new layer.\r\n * This represents a full screen 2d layer.\r\n * This can be useful to display a picture in the background of your scene for instance.\r\n * @see https://www.babylonjs-playground.com/#08A2BS#1\r\n * @param name Define the name of the layer in the scene\r\n * @param imgUrl Define the url of the texture to display in the layer\r\n * @param scene Define the scene the layer belongs to\r\n * @param isBackground Defines whether the layer is displayed in front or behind the scene\r\n * @param color Defines a color for the layer\r\n * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false\r\n */\r\n constructor(\r\n /**\r\n * Define the name of the layer.\r\n */\r\n public name: string,\r\n imgUrl: Nullable<string>,\r\n scene: Nullable<Scene>,\r\n isBackground?: boolean,\r\n color?: Color4,\r\n forceGLSL = false\r\n ) {\r\n this.texture = imgUrl ? new Texture(imgUrl, scene, true) : null;\r\n this.isBackground = isBackground === undefined ? true : isBackground;\r\n this.color = color === undefined ? new Color4(1, 1, 1, 1) : color;\r\n\r\n this._scene = <Scene>(scene || EngineStore.LastCreatedScene);\r\n const engine = this._scene.getEngine();\r\n if (engine.isWebGPU && !forceGLSL && !Layer.ForceGLSL) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n let layerComponent = this._scene._getComponent(SceneComponentConstants.NAME_LAYER) as LayerSceneComponent;\r\n if (!layerComponent) {\r\n layerComponent = new LayerSceneComponent(this._scene);\r\n this._scene._addComponent(layerComponent);\r\n }\r\n this._scene.layers.push(this);\r\n\r\n this._drawWrapper = new DrawWrapper(engine);\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n const vertexBuffer = new VertexBuffer(engine, vertices, VertexBuffer.PositionKind, false, false, 2);\r\n this._vertexBuffers[VertexBuffer.PositionKind] = vertexBuffer;\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n private _shadersLoaded = false;\r\n\r\n private _createIndexBuffer(): void {\r\n const engine = this._scene.getEngine();\r\n\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = engine.createIndexBuffer(indices);\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * Checks if the layer is ready to be rendered\r\n * @returns true if the layer is ready. False otherwise.\r\n */\r\n public isReady() {\r\n const engine = this._scene.getEngine();\r\n\r\n let defines = \"\";\r\n\r\n if (this.alphaTest) {\r\n defines = \"#define ALPHATEST\";\r\n }\r\n\r\n if (this.texture) {\r\n if (this.texture.gammaSpace) {\r\n if (this.convertToLinearSpace) {\r\n defines += \"\\n#define CONVERT_TO_LINEAR\";\r\n }\r\n } else if (!this.convertToLinearSpace) {\r\n defines += \"\\n#define CONVERT_TO_GAMMA\";\r\n }\r\n }\r\n\r\n if (this._previousDefines !== defines) {\r\n this._previousDefines = defines;\r\n this._drawWrapper.effect = engine.createEffect(\r\n \"layer\",\r\n [VertexBuffer.PositionKind],\r\n [\"textureMatrix\", \"color\", \"scale\", \"offset\"],\r\n [\"textureSampler\"],\r\n defines,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n this._shaderLanguage,\r\n this._shadersLoaded\r\n ? undefined\r\n : async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/layer.vertex\"), import(\"../ShadersWGSL/layer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/layer.vertex\"), import(\"../Shaders/layer.fragment\")]);\r\n }\r\n this._shadersLoaded = true;\r\n }\r\n );\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect;\r\n\r\n return !!currentEffect?.isReady() && (!this.texture || this.texture.isReady());\r\n }\r\n\r\n /**\r\n * Renders the layer in the scene.\r\n */\r\n public render(): void {\r\n if (!this.isEnabled) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n // Check\r\n if (!this.isReady()) {\r\n return;\r\n }\r\n\r\n const currentEffect = this._drawWrapper.effect!;\r\n\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n // Render\r\n engine.enableEffect(this._drawWrapper);\r\n engine.setState(false);\r\n\r\n // Texture\r\n if (this.texture) {\r\n currentEffect.setTexture(\"textureSampler\", this.texture);\r\n currentEffect.setMatrix(\"textureMatrix\", this.texture.getTextureMatrix());\r\n }\r\n\r\n // Color\r\n currentEffect.setFloat4(\"color\", this.color.r, this.color.g, this.color.b, this.color.a);\r\n\r\n // Scale / offset\r\n currentEffect.setVector2(\"offset\", this.offset);\r\n currentEffect.setVector2(\"scale\", this.scale);\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, currentEffect);\r\n\r\n // Draw order\r\n if (!this.alphaTest) {\r\n engine.setAlphaMode(this.alphaBlendingMode);\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n } else {\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 6);\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Disposes and releases the associated resources.\r\n */\r\n public dispose(): void {\r\n const vertexBuffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vertexBuffer) {\r\n vertexBuffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n\r\n if (this.texture) {\r\n this.texture.dispose();\r\n this.texture = null;\r\n }\r\n\r\n // Clean RTT list\r\n this.renderTargetTextures = [];\r\n\r\n // Remove from scene\r\n const index = this._scene.layers.indexOf(this);\r\n this._scene.layers.splice(index, 1);\r\n\r\n // Callback\r\n this.onDisposeObservable.notifyObservers(this);\r\n\r\n this.onDisposeObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderObservable.clear();\r\n }\r\n}\r\n"]}