@babylonjs/core 8.22.1 → 8.22.3

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 (42) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +3 -0
  4. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +13 -0
  5. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  6. package/FrameGraph/Node/nodeRenderGraph.js +5 -0
  7. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  8. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +1 -0
  9. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  10. package/FrameGraph/frameGraph.js +7 -0
  11. package/FrameGraph/frameGraph.js.map +1 -1
  12. package/Materials/Node/nodeMaterial.js +1 -1
  13. package/Materials/Node/nodeMaterial.js.map +1 -1
  14. package/Meshes/instancedMesh.js +0 -2
  15. package/Meshes/instancedMesh.js.map +1 -1
  16. package/Particles/Node/Blocks/Update/alignAngleBlock.d.ts +38 -0
  17. package/Particles/Node/Blocks/Update/alignAngleBlock.js +84 -0
  18. package/Particles/Node/Blocks/Update/alignAngleBlock.js.map +1 -0
  19. package/Particles/Node/Blocks/Update/updateAgeBlock.d.ts +35 -0
  20. package/Particles/Node/Blocks/Update/updateAgeBlock.js +73 -0
  21. package/Particles/Node/Blocks/Update/updateAgeBlock.js.map +1 -0
  22. package/Particles/Node/Blocks/index.d.ts +2 -0
  23. package/Particles/Node/Blocks/index.js +2 -0
  24. package/Particles/Node/Blocks/index.js.map +1 -1
  25. package/Particles/Node/nodeParticleSystemSet.d.ts +0 -1
  26. package/Particles/Node/nodeParticleSystemSet.js +0 -1
  27. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  28. package/Rendering/boundingBoxRenderer.d.ts +12 -2
  29. package/Rendering/boundingBoxRenderer.js +36 -0
  30. package/Rendering/boundingBoxRenderer.js.map +1 -1
  31. package/Rendering/objectRenderer.d.ts +4 -0
  32. package/Rendering/objectRenderer.js +8 -0
  33. package/Rendering/objectRenderer.js.map +1 -1
  34. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
  35. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  36. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +2 -3
  37. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  38. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +1 -1
  39. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  40. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +2 -3
  41. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  42. package/package.json +1 -1
@@ -17,6 +17,9 @@ export declare class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGr
17
17
  * @param scene defines the hosting scene
18
18
  */
19
19
  constructor(name: string, frameGraph: FrameGraph, scene: Scene);
20
+ /** Indicates that this object renderer is the main object renderer of the frame graph. */
21
+ get isMainObjectRenderer(): boolean;
22
+ set isMainObjectRenderer(value: boolean);
20
23
  /** Indicates if depth testing must be enabled or disabled */
21
24
  get depthTest(): boolean;
22
25
  set depthTest(value: boolean);
@@ -37,6 +37,13 @@ export class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock
37
37
  this.output._typeConnectionSource = this.target;
38
38
  this.outputDepth._typeConnectionSource = this.depth;
39
39
  }
40
+ /** Indicates that this object renderer is the main object renderer of the frame graph. */
41
+ get isMainObjectRenderer() {
42
+ return this._frameGraphTask.isMainObjectRenderer;
43
+ }
44
+ set isMainObjectRenderer(value) {
45
+ this._frameGraphTask.isMainObjectRenderer = value;
46
+ }
40
47
  /** Indicates if depth testing must be enabled or disabled */
41
48
  get depthTest() {
42
49
  return this._frameGraphTask.depthTest;
@@ -157,6 +164,7 @@ export class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock
157
164
  codes.push(`${this._codeVariableName}.depthWrite = ${this.depthWrite};`);
158
165
  codes.push(`${this._codeVariableName}.disableShadows = ${this.disableShadows};`);
159
166
  codes.push(`${this._codeVariableName}.renderInLinearSpace = ${this.renderInLinearSpace};`);
167
+ codes.push(`${this._codeVariableName}.isMainObjectRenderer = ${this.isMainObjectRenderer};`);
160
168
  return super._dumpPropertiesCode() + codes.join("\n");
161
169
  }
162
170
  serialize() {
@@ -165,6 +173,7 @@ export class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock
165
173
  serializationObject.depthWrite = this.depthWrite;
166
174
  serializationObject.disableShadows = this.disableShadows;
167
175
  serializationObject.renderInLinearSpace = this.renderInLinearSpace;
176
+ serializationObject.isMainObjectRenderer = this.isMainObjectRenderer;
168
177
  return serializationObject;
169
178
  }
170
179
  _deserialize(serializationObject) {
@@ -173,8 +182,12 @@ export class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock
173
182
  this.depthWrite = serializationObject.depthWrite;
174
183
  this.disableShadows = serializationObject.disableShadows;
175
184
  this.renderInLinearSpace = !!serializationObject.renderInLinearSpace;
185
+ this.isMainObjectRenderer = !!serializationObject.isMainObjectRenderer;
176
186
  }
177
187
  }
188
+ __decorate([
189
+ editableInPropertyPage("Is main object renderer", 0 /* PropertyTypeForEdition.Boolean */, "PROPERTIES")
190
+ ], NodeRenderGraphBaseObjectRendererBlock.prototype, "isMainObjectRenderer", null);
178
191
  __decorate([
179
192
  editableInPropertyPage("Depth test", 0 /* PropertyTypeForEdition.Boolean */, "PROPERTIES")
180
193
  ], NodeRenderGraphBaseObjectRendererBlock.prototype, "depthTest", null);
@@ -1 +1 @@
1
- {"version":3,"file":"baseObjectRendererBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Scene,\r\n NodeRenderGraphBuildState,\r\n FrameGraph,\r\n FrameGraphTextureHandle,\r\n FrameGraphObjectList,\r\n Camera,\r\n FrameGraphObjectRendererTask,\r\n NodeRenderGraphResourceContainerBlock,\r\n FrameGraphShadowGeneratorTask,\r\n} from \"core/index\";\r\nimport { NodeRenderGraphBlock } from \"../../nodeRenderGraphBlock\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes, NodeRenderGraphConnectionPointDirection } from \"../../Types/nodeRenderGraphTypes\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { NodeRenderGraphConnectionPoint } from \"../../nodeRenderGraphBlockConnectionPoint\";\r\nimport { NodeRenderGraphConnectionPointCustomObject } from \"../../nodeRenderGraphConnectionPointCustomObject\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphObjectRendererTask;\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphBaseObjectRendererBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n */\r\n public constructor(name: string, frameGraph: FrameGraph, scene: Scene) {\r\n super(name, frameGraph, scene);\r\n\r\n this.registerInput(\"target\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"depth\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"camera\", NodeRenderGraphBlockConnectionPointTypes.Camera);\r\n this.registerInput(\"objects\", NodeRenderGraphBlockConnectionPointTypes.ObjectList);\r\n this._addDependenciesInput();\r\n this.registerInput(\"shadowGenerators\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n this.registerOutput(\"outputDepth\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n this.registerOutput(\r\n \"objectRenderer\",\r\n NodeRenderGraphBlockConnectionPointTypes.Object,\r\n new NodeRenderGraphConnectionPointCustomObject(\r\n \"objectRenderer\",\r\n this,\r\n NodeRenderGraphConnectionPointDirection.Output,\r\n NodeRenderGraphBaseObjectRendererBlock,\r\n \"NodeRenderGraphBaseObjectRendererBlock\"\r\n )\r\n );\r\n\r\n this.target.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBufferDepthStencil);\r\n this.depth.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.TextureDepthStencilAttachment | NodeRenderGraphBlockConnectionPointTypes.TextureBackBufferDepthStencilAttachment\r\n );\r\n this.shadowGenerators.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.ShadowGenerator | NodeRenderGraphBlockConnectionPointTypes.ResourceContainer\r\n );\r\n\r\n this.output._typeConnectionSource = this.target;\r\n this.outputDepth._typeConnectionSource = this.depth;\r\n }\r\n\r\n /** Indicates if depth testing must be enabled or disabled */\r\n @editableInPropertyPage(\"Depth test\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get depthTest() {\r\n return this._frameGraphTask.depthTest;\r\n }\r\n\r\n public set depthTest(value: boolean) {\r\n this._frameGraphTask.depthTest = value;\r\n }\r\n\r\n /** Indicates if depth writing must be enabled or disabled */\r\n @editableInPropertyPage(\"Depth write\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get depthWrite() {\r\n return this._frameGraphTask.depthWrite;\r\n }\r\n\r\n public set depthWrite(value: boolean) {\r\n this._frameGraphTask.depthWrite = value;\r\n }\r\n\r\n /** Indicates if shadows must be enabled or disabled */\r\n @editableInPropertyPage(\"Disable shadows\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get disableShadows() {\r\n return this._frameGraphTask.disableShadows;\r\n }\r\n\r\n public set disableShadows(value: boolean) {\r\n this._frameGraphTask.disableShadows = value;\r\n }\r\n\r\n /** If image processing should be disabled */\r\n @editableInPropertyPage(\"Disable image processing\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get renderInLinearSpace() {\r\n return this._frameGraphTask.disableImageProcessing;\r\n }\r\n\r\n public set renderInLinearSpace(value: boolean) {\r\n this._frameGraphTask.disableImageProcessing = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"NodeRenderGraphBaseObjectRendererBlock\";\r\n }\r\n\r\n /**\r\n * Gets the target texture input component\r\n */\r\n public get target(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the depth texture input component\r\n */\r\n public get depth(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the camera input component\r\n */\r\n public get camera(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the objects input component\r\n */\r\n public get objects(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the dependencies input component\r\n */\r\n public get dependencies(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the shadowGenerators input component\r\n */\r\n public get shadowGenerators(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output depth component\r\n */\r\n public get outputDepth(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the objectRenderer component\r\n */\r\n public get objectRenderer(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputTexture; // the value of the output connection point is the \"output\" texture of the task\r\n this.outputDepth.value = this._frameGraphTask.outputDepthTexture; // the value of the outputDepth connection point is the \"outputDepth\" texture of the task\r\n this.objectRenderer.value = this._frameGraphTask; // the value of the objectRenderer connection point is the task itself\r\n\r\n this._frameGraphTask.targetTexture = this.target.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.depthTexture = this.depth.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.camera = this.camera.connectedPoint?.value as Camera;\r\n this._frameGraphTask.objectList = this.objects.connectedPoint?.value as FrameGraphObjectList;\r\n\r\n this._frameGraphTask.shadowGenerators = [];\r\n\r\n const shadowGeneratorsConnectedPoint = this.shadowGenerators.connectedPoint;\r\n if (shadowGeneratorsConnectedPoint) {\r\n if (shadowGeneratorsConnectedPoint.type === NodeRenderGraphBlockConnectionPointTypes.ResourceContainer) {\r\n const container = shadowGeneratorsConnectedPoint.ownerBlock as NodeRenderGraphResourceContainerBlock;\r\n for (const input of container.inputs) {\r\n if (input.connectedPoint && input.connectedPoint.value !== undefined && NodeRenderGraphConnectionPoint.IsShadowGenerator(input.connectedPoint.value)) {\r\n this._frameGraphTask.shadowGenerators.push(input.connectedPoint.value as FrameGraphShadowGeneratorTask);\r\n }\r\n }\r\n } else if (NodeRenderGraphConnectionPoint.IsShadowGenerator(shadowGeneratorsConnectedPoint.value)) {\r\n this._frameGraphTask.shadowGenerators[0] = shadowGeneratorsConnectedPoint.value as FrameGraphShadowGeneratorTask;\r\n }\r\n }\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n const codes: string[] = [];\r\n codes.push(`${this._codeVariableName}.depthTest = ${this.depthTest};`);\r\n codes.push(`${this._codeVariableName}.depthWrite = ${this.depthWrite};`);\r\n codes.push(`${this._codeVariableName}.disableShadows = ${this.disableShadows};`);\r\n codes.push(`${this._codeVariableName}.renderInLinearSpace = ${this.renderInLinearSpace};`);\r\n return super._dumpPropertiesCode() + codes.join(\"\\n\");\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.depthTest = this.depthTest;\r\n serializationObject.depthWrite = this.depthWrite;\r\n serializationObject.disableShadows = this.disableShadows;\r\n serializationObject.renderInLinearSpace = this.renderInLinearSpace;\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n this.depthTest = serializationObject.depthTest;\r\n this.depthWrite = serializationObject.depthWrite;\r\n this.disableShadows = serializationObject.disableShadows;\r\n this.renderInLinearSpace = !!serializationObject.renderInLinearSpace;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"baseObjectRendererBlock.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Scene,\r\n NodeRenderGraphBuildState,\r\n FrameGraph,\r\n FrameGraphTextureHandle,\r\n FrameGraphObjectList,\r\n Camera,\r\n FrameGraphObjectRendererTask,\r\n NodeRenderGraphResourceContainerBlock,\r\n FrameGraphShadowGeneratorTask,\r\n} from \"core/index\";\r\nimport { NodeRenderGraphBlock } from \"../../nodeRenderGraphBlock\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes, NodeRenderGraphConnectionPointDirection } from \"../../Types/nodeRenderGraphTypes\";\r\nimport { editableInPropertyPage, PropertyTypeForEdition } from \"../../../../Decorators/nodeDecorator\";\r\nimport { NodeRenderGraphConnectionPoint } from \"../../nodeRenderGraphBlockConnectionPoint\";\r\nimport { NodeRenderGraphConnectionPointCustomObject } from \"../../nodeRenderGraphConnectionPointCustomObject\";\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class NodeRenderGraphBaseObjectRendererBlock extends NodeRenderGraphBlock {\r\n protected override _frameGraphTask: FrameGraphObjectRendererTask;\r\n\r\n /**\r\n * Gets the frame graph task associated with this block\r\n */\r\n public override get task() {\r\n return this._frameGraphTask;\r\n }\r\n\r\n /**\r\n * Create a new NodeRenderGraphBaseObjectRendererBlock\r\n * @param name defines the block name\r\n * @param frameGraph defines the hosting frame graph\r\n * @param scene defines the hosting scene\r\n */\r\n public constructor(name: string, frameGraph: FrameGraph, scene: Scene) {\r\n super(name, frameGraph, scene);\r\n\r\n this.registerInput(\"target\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect);\r\n this.registerInput(\"depth\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n this.registerInput(\"camera\", NodeRenderGraphBlockConnectionPointTypes.Camera);\r\n this.registerInput(\"objects\", NodeRenderGraphBlockConnectionPointTypes.ObjectList);\r\n this._addDependenciesInput();\r\n this.registerInput(\"shadowGenerators\", NodeRenderGraphBlockConnectionPointTypes.AutoDetect, true);\r\n\r\n this.registerOutput(\"output\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n this.registerOutput(\"outputDepth\", NodeRenderGraphBlockConnectionPointTypes.BasedOnInput);\r\n this.registerOutput(\r\n \"objectRenderer\",\r\n NodeRenderGraphBlockConnectionPointTypes.Object,\r\n new NodeRenderGraphConnectionPointCustomObject(\r\n \"objectRenderer\",\r\n this,\r\n NodeRenderGraphConnectionPointDirection.Output,\r\n NodeRenderGraphBaseObjectRendererBlock,\r\n \"NodeRenderGraphBaseObjectRendererBlock\"\r\n )\r\n );\r\n\r\n this.target.addExcludedConnectionPointFromAllowedTypes(NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBufferDepthStencil);\r\n this.depth.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.TextureDepthStencilAttachment | NodeRenderGraphBlockConnectionPointTypes.TextureBackBufferDepthStencilAttachment\r\n );\r\n this.shadowGenerators.addExcludedConnectionPointFromAllowedTypes(\r\n NodeRenderGraphBlockConnectionPointTypes.ShadowGenerator | NodeRenderGraphBlockConnectionPointTypes.ResourceContainer\r\n );\r\n\r\n this.output._typeConnectionSource = this.target;\r\n this.outputDepth._typeConnectionSource = this.depth;\r\n }\r\n\r\n /** Indicates that this object renderer is the main object renderer of the frame graph. */\r\n @editableInPropertyPage(\"Is main object renderer\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get isMainObjectRenderer() {\r\n return this._frameGraphTask.isMainObjectRenderer;\r\n }\r\n\r\n public set isMainObjectRenderer(value: boolean) {\r\n this._frameGraphTask.isMainObjectRenderer = value;\r\n }\r\n\r\n /** Indicates if depth testing must be enabled or disabled */\r\n @editableInPropertyPage(\"Depth test\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get depthTest() {\r\n return this._frameGraphTask.depthTest;\r\n }\r\n\r\n public set depthTest(value: boolean) {\r\n this._frameGraphTask.depthTest = value;\r\n }\r\n\r\n /** Indicates if depth writing must be enabled or disabled */\r\n @editableInPropertyPage(\"Depth write\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get depthWrite() {\r\n return this._frameGraphTask.depthWrite;\r\n }\r\n\r\n public set depthWrite(value: boolean) {\r\n this._frameGraphTask.depthWrite = value;\r\n }\r\n\r\n /** Indicates if shadows must be enabled or disabled */\r\n @editableInPropertyPage(\"Disable shadows\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get disableShadows() {\r\n return this._frameGraphTask.disableShadows;\r\n }\r\n\r\n public set disableShadows(value: boolean) {\r\n this._frameGraphTask.disableShadows = value;\r\n }\r\n\r\n /** If image processing should be disabled */\r\n @editableInPropertyPage(\"Disable image processing\", PropertyTypeForEdition.Boolean, \"PROPERTIES\")\r\n public get renderInLinearSpace() {\r\n return this._frameGraphTask.disableImageProcessing;\r\n }\r\n\r\n public set renderInLinearSpace(value: boolean) {\r\n this._frameGraphTask.disableImageProcessing = value;\r\n }\r\n\r\n /**\r\n * Gets the current class name\r\n * @returns the class name\r\n */\r\n public override getClassName() {\r\n return \"NodeRenderGraphBaseObjectRendererBlock\";\r\n }\r\n\r\n /**\r\n * Gets the target texture input component\r\n */\r\n public get target(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[0];\r\n }\r\n\r\n /**\r\n * Gets the depth texture input component\r\n */\r\n public get depth(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[1];\r\n }\r\n\r\n /**\r\n * Gets the camera input component\r\n */\r\n public get camera(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[2];\r\n }\r\n\r\n /**\r\n * Gets the objects input component\r\n */\r\n public get objects(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[3];\r\n }\r\n\r\n /**\r\n * Gets the dependencies input component\r\n */\r\n public get dependencies(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[4];\r\n }\r\n\r\n /**\r\n * Gets the shadowGenerators input component\r\n */\r\n public get shadowGenerators(): NodeRenderGraphConnectionPoint {\r\n return this._inputs[5];\r\n }\r\n\r\n /**\r\n * Gets the output component\r\n */\r\n public get output(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[0];\r\n }\r\n\r\n /**\r\n * Gets the output depth component\r\n */\r\n public get outputDepth(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[1];\r\n }\r\n\r\n /**\r\n * Gets the objectRenderer component\r\n */\r\n public get objectRenderer(): NodeRenderGraphConnectionPoint {\r\n return this._outputs[2];\r\n }\r\n\r\n protected override _buildBlock(state: NodeRenderGraphBuildState) {\r\n super._buildBlock(state);\r\n\r\n this.output.value = this._frameGraphTask.outputTexture; // the value of the output connection point is the \"output\" texture of the task\r\n this.outputDepth.value = this._frameGraphTask.outputDepthTexture; // the value of the outputDepth connection point is the \"outputDepth\" texture of the task\r\n this.objectRenderer.value = this._frameGraphTask; // the value of the objectRenderer connection point is the task itself\r\n\r\n this._frameGraphTask.targetTexture = this.target.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.depthTexture = this.depth.connectedPoint?.value as FrameGraphTextureHandle;\r\n this._frameGraphTask.camera = this.camera.connectedPoint?.value as Camera;\r\n this._frameGraphTask.objectList = this.objects.connectedPoint?.value as FrameGraphObjectList;\r\n\r\n this._frameGraphTask.shadowGenerators = [];\r\n\r\n const shadowGeneratorsConnectedPoint = this.shadowGenerators.connectedPoint;\r\n if (shadowGeneratorsConnectedPoint) {\r\n if (shadowGeneratorsConnectedPoint.type === NodeRenderGraphBlockConnectionPointTypes.ResourceContainer) {\r\n const container = shadowGeneratorsConnectedPoint.ownerBlock as NodeRenderGraphResourceContainerBlock;\r\n for (const input of container.inputs) {\r\n if (input.connectedPoint && input.connectedPoint.value !== undefined && NodeRenderGraphConnectionPoint.IsShadowGenerator(input.connectedPoint.value)) {\r\n this._frameGraphTask.shadowGenerators.push(input.connectedPoint.value as FrameGraphShadowGeneratorTask);\r\n }\r\n }\r\n } else if (NodeRenderGraphConnectionPoint.IsShadowGenerator(shadowGeneratorsConnectedPoint.value)) {\r\n this._frameGraphTask.shadowGenerators[0] = shadowGeneratorsConnectedPoint.value as FrameGraphShadowGeneratorTask;\r\n }\r\n }\r\n }\r\n\r\n protected override _dumpPropertiesCode() {\r\n const codes: string[] = [];\r\n codes.push(`${this._codeVariableName}.depthTest = ${this.depthTest};`);\r\n codes.push(`${this._codeVariableName}.depthWrite = ${this.depthWrite};`);\r\n codes.push(`${this._codeVariableName}.disableShadows = ${this.disableShadows};`);\r\n codes.push(`${this._codeVariableName}.renderInLinearSpace = ${this.renderInLinearSpace};`);\r\n codes.push(`${this._codeVariableName}.isMainObjectRenderer = ${this.isMainObjectRenderer};`);\r\n return super._dumpPropertiesCode() + codes.join(\"\\n\");\r\n }\r\n\r\n public override serialize(): any {\r\n const serializationObject = super.serialize();\r\n serializationObject.depthTest = this.depthTest;\r\n serializationObject.depthWrite = this.depthWrite;\r\n serializationObject.disableShadows = this.disableShadows;\r\n serializationObject.renderInLinearSpace = this.renderInLinearSpace;\r\n serializationObject.isMainObjectRenderer = this.isMainObjectRenderer;\r\n return serializationObject;\r\n }\r\n\r\n public override _deserialize(serializationObject: any) {\r\n super._deserialize(serializationObject);\r\n this.depthTest = serializationObject.depthTest;\r\n this.depthWrite = serializationObject.depthWrite;\r\n this.disableShadows = serializationObject.disableShadows;\r\n this.renderInLinearSpace = !!serializationObject.renderInLinearSpace;\r\n this.isMainObjectRenderer = !!serializationObject.isMainObjectRenderer;\r\n }\r\n}\r\n"]}
@@ -211,6 +211,11 @@ export class NodeRenderGraph {
211
211
  if (this._options.autoFillExternalInputs) {
212
212
  this._autoFillExternalInputs();
213
213
  }
214
+ // Make sure that one of the object renderer is flagged as the main object renderer
215
+ const objectRendererBlocks = this.getBlocksByPredicate((block) => block instanceof NodeRenderGraphObjectRendererBlock);
216
+ if (objectRendererBlocks.length > 0 && !objectRendererBlocks.find((block) => block.isMainObjectRenderer)) {
217
+ objectRendererBlocks[0].isMainObjectRenderer = true;
218
+ }
214
219
  try {
215
220
  this.outputBlock.build(state);
216
221
  this._frameGraph.build();
@@ -1 +1 @@
1
- {"version":3,"file":"nodeRenderGraph.js","sourceRoot":"","sources":["../../../../../dev/core/src/FrameGraph/Node/nodeRenderGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Observer,\r\n Nullable,\r\n NodeRenderGraphBlock,\r\n NodeRenderGraphTeleportOutBlock,\r\n NodeRenderGraphTeleportInBlock,\r\n AbstractEngine,\r\n INodeRenderGraphCreateOptions,\r\n INodeRenderGraphEditorOptions,\r\n Scene,\r\n WritableObject,\r\n IShadowLight,\r\n} from \"core/index\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { NodeRenderGraphOutputBlock } from \"./Blocks/outputBlock\";\r\nimport { FrameGraph } from \"../frameGraph\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebRequest } from \"../../Misc/webRequest\";\r\nimport { NodeRenderGraphInputBlock } from \"./Blocks/inputBlock\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes } from \"./Types/nodeRenderGraphTypes\";\r\nimport { NodeRenderGraphClearBlock } from \"./Blocks/Textures/clearBlock\";\r\nimport { NodeRenderGraphObjectRendererBlock } from \"./Blocks/Rendering/objectRendererBlock\";\r\nimport { NodeRenderGraphBuildState } from \"./nodeRenderGraphBuildState\";\r\n\r\n// declare NODERENDERGRAPHEDITOR namespace for compilation issue\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let NODERENDERGRAPHEDITOR: any;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Defines a node render graph\r\n */\r\nexport class NodeRenderGraph {\r\n private static _BuildIdGenerator: number = 0;\r\n\r\n private _buildId: number = NodeRenderGraph._BuildIdGenerator++;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/NodeRenderGraph/babylon.nodeRenderGraph.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private BJSNODERENDERGRAPHEDITOR = this._getGlobalNodeRenderGraphEditor();\r\n\r\n /** @returns the inspector from bundle or global */\r\n private _getGlobalNodeRenderGraphEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODERENDERGRAPHEDITOR !== \"undefined\") {\r\n return NODERENDERGRAPHEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeRenderGraphEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://nrge.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeRenderGraphBlock[] = [];\r\n\r\n /**\r\n * Observable raised when the node render graph is built\r\n */\r\n public onBuildObservable = new Observable<NodeRenderGraph>();\r\n\r\n /**\r\n * Observable raised when an error is detected\r\n */\r\n public onBuildErrorObservable = new Observable<string>();\r\n\r\n /** Gets or sets the RenderGraphOutputBlock used to gather the final node render graph data */\r\n public outputBlock: Nullable<NodeRenderGraphOutputBlock> = null;\r\n\r\n /**\r\n * Snippet ID if the graph was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The name of the node render graph\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * A free comment about the graph\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _resizeObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private readonly _frameGraph: FrameGraph;\r\n private readonly _options: INodeRenderGraphCreateOptions;\r\n\r\n /**\r\n * Gets the frame graph used by this node render graph\r\n */\r\n public get frameGraph() {\r\n return this._frameGraph;\r\n }\r\n\r\n /**\r\n * Gets the scene used by this node render graph\r\n * @returns the scene used by this node render graph\r\n */\r\n public getScene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Creates a new node render graph\r\n * @param name defines the name of the node render graph\r\n * @param scene defines the scene to use to execute the graph\r\n * @param options defines the options to use when creating the graph\r\n */\r\n public constructor(name: string, scene: Scene, options?: INodeRenderGraphCreateOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n options = {\r\n debugTextures: false,\r\n autoConfigure: false,\r\n verbose: false,\r\n rebuildGraphOnEngineResize: true,\r\n autoFillExternalInputs: true,\r\n ...options,\r\n };\r\n\r\n this._options = options;\r\n\r\n this._frameGraph = new FrameGraph(this._scene, options.debugTextures, this);\r\n this._frameGraph.name = name;\r\n\r\n if (options.rebuildGraphOnEngineResize) {\r\n this._resizeObserver = this._engine.onResizeObservable.add(() => {\r\n this.build();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current class name (\"NodeRenderGraph\")\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeRenderGraph\";\r\n }\r\n\r\n /**\r\n * Gets a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName<T extends NodeRenderGraphBlock>(name: string): Nullable<T> {\r\n let result: Nullable<T> = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block as T;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): Nullable<T> {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block as T;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get all blocks that match a predicate\r\n * @param predicate defines the predicate used to find the good candidate(s)\r\n * @returns the list of blocks found\r\n */\r\n public getBlocksByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): T[] {\r\n const blocks: T[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n blocks.push(block as T);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public getInputBlocks() {\r\n const blocks: NodeRenderGraphInputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as NodeRenderGraphInputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Launch the node render graph editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async edit(config?: INodeRenderGraphEditorOptions): Promise<void> {\r\n return await new Promise((resolve) => {\r\n this.BJSNODERENDERGRAPHEDITOR = this.BJSNODERENDERGRAPHEDITOR || this._getGlobalNodeRenderGraphEditor();\r\n if (typeof this.BJSNODERENDERGRAPHEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeRenderGraph.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODERENDERGRAPHEDITOR = this.BJSNODERENDERGRAPHEDITOR || this._getGlobalNodeRenderGraphEditor();\r\n this._createNodeEditor(config?.nodeRenderGraphEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeEditor(config?.nodeRenderGraphEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates the node editor window.\r\n * @param additionalConfig Additional configuration for the FGE\r\n */\r\n private _createNodeEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeRenderGraph: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODERENDERGRAPHEDITOR.NodeRenderGraphEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Build the final list of blocks that will be executed by the \"execute\" method\r\n */\r\n public build() {\r\n if (!this.outputBlock) {\r\n throw new Error(\"You must define the outputBlock property before building the node render graph\");\r\n }\r\n\r\n this._initializeBlock(this.outputBlock);\r\n\r\n this._frameGraph.clear();\r\n\r\n const state = new NodeRenderGraphBuildState();\r\n\r\n state.buildId = this._buildId;\r\n state.verbose = this._options.verbose!;\r\n\r\n if (this._options.autoFillExternalInputs) {\r\n this._autoFillExternalInputs();\r\n }\r\n\r\n try {\r\n this.outputBlock.build(state);\r\n\r\n this._frameGraph.build();\r\n } finally {\r\n this._buildId = NodeRenderGraph._BuildIdGenerator++;\r\n\r\n if (state.emitErrors(this.onBuildErrorObservable)) {\r\n this.onBuildObservable.notifyObservers(this);\r\n }\r\n }\r\n }\r\n\r\n private _autoFillExternalInputs() {\r\n const allInputs = this.getInputBlocks();\r\n\r\n const shadowLights: IShadowLight[] = [];\r\n for (const light of this._scene.lights) {\r\n if ((light as IShadowLight).setShadowProjectionMatrix !== undefined) {\r\n shadowLights.push(light as IShadowLight);\r\n }\r\n }\r\n\r\n let cameraIndex = 0;\r\n let lightIndex = 0;\r\n for (const input of allInputs) {\r\n if (!input.isExternal) {\r\n continue;\r\n }\r\n if (!input.isAnAncestorOfType(\"NodeRenderGraphOutputBlock\")) {\r\n continue;\r\n }\r\n if ((input.type & NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBuffer) !== 0) {\r\n // nothing to do\r\n } else if (input.isCamera()) {\r\n const camera = this._scene.cameras[cameraIndex++] || this._scene.cameras[0];\r\n if (!this._scene.cameraToUseForPointers) {\r\n this._scene.cameraToUseForPointers = camera;\r\n }\r\n\r\n input.value = camera;\r\n } else if (input.isObjectList()) {\r\n input.value = { meshes: this._scene.meshes, particleSystems: this._scene.particleSystems };\r\n } else if (input.isShadowLight()) {\r\n if (lightIndex < shadowLights.length) {\r\n input.value = shadowLights[lightIndex++];\r\n lightIndex = lightIndex % shadowLights.length;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the node render graph is ready to be executed\r\n * This method must be called after the graph has been built (NodeRenderGraph.build called)!\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000)\r\n * @returns The promise that resolves when the graph is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise<void> {\r\n return this._frameGraph.whenReadyAsync(timeStep, maxTimeout);\r\n }\r\n\r\n /**\r\n * Execute the graph (the graph must have been built before!)\r\n */\r\n public execute() {\r\n this._frameGraph.execute();\r\n }\r\n\r\n private _initializeBlock(node: NodeRenderGraphBlock) {\r\n node.initialize();\r\n if (this._options.autoConfigure) {\r\n node.autoConfigure();\r\n }\r\n\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._initializeBlock(block);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph\r\n */\r\n public clear() {\r\n this.outputBlock = null;\r\n this.attachedBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Remove a block from the current graph\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeRenderGraphBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block === this.outputBlock) {\r\n this.outputBlock = null;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the graph\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeRenderGraphBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType: typeof NodeRenderGraphBlock = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const additionalConstructionParameters = parsedBlock.additionalConstructionParameters;\r\n const block: NodeRenderGraphBlock = additionalConstructionParameters\r\n ? new blockType(\"\", this._frameGraph, this._scene, ...additionalConstructionParameters)\r\n : new blockType(\"\", this._frameGraph, this._scene);\r\n block._deserialize(parsedBlock);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as NodeRenderGraphTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as NodeRenderGraphTeleportInBlock;\r\n if (source) {\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && parsedBlock.inputs.some((i: any) => i.targetConnectionName) && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // Outputs\r\n if (source.outputNodeId) {\r\n this.outputBlock = map[source.outputNodeId] as NodeRenderGraphOutputBlock;\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n isCollapsed: boolean;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: number[] = [];\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n }\r\n\r\n private _restoreConnections(block: NodeRenderGraphBlock, source: any, map: { [key: number]: NodeRenderGraphBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a string containing the code declaration required to create an equivalent of this node render graph\r\n * @returns a string\r\n */\r\n public generateCode() {\r\n let alreadyDumped: NodeRenderGraphBlock[] = [];\r\n const blocks: NodeRenderGraphBlock[] = [];\r\n const uniqueNames: string[] = [\"const\", \"var\", \"let\"];\r\n // Gets active blocks\r\n if (this.outputBlock) {\r\n this._gatherBlocks(this.outputBlock, blocks);\r\n }\r\n\r\n // Generate\r\n const options = JSON.stringify(this._options);\r\n let codeString = `let nodeRenderGraph = new BABYLON.NodeRenderGraph(\"${this.name || \"render graph\"}\", scene, ${options});\\n`;\r\n for (const node of blocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped) + \"\\n\";\r\n }\r\n }\r\n\r\n if (this.outputBlock) {\r\n // Connections\r\n alreadyDumped = [];\r\n codeString += \"// Connections\\n\";\r\n codeString += this.outputBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n\r\n // Output nodes\r\n codeString += \"// Output nodes\\n\";\r\n codeString += `nodeRenderGraph.outputBlock = ${this.outputBlock._codeVariableName};\\n`;\r\n codeString += `nodeRenderGraph.build();\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n private _gatherBlocks(rootNode: NodeRenderGraphBlock, list: NodeRenderGraphBlock[]) {\r\n if (list.indexOf(rootNode) !== -1) {\r\n return;\r\n }\r\n list.push(rootNode);\r\n\r\n for (const input of rootNode.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== rootNode) {\r\n this._gatherBlocks(block, list);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (rootNode.isTeleportOut) {\r\n const block = rootNode as NodeRenderGraphTeleportOutBlock;\r\n if (block.entryPoint) {\r\n this._gatherBlocks(block.entryPoint, list);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and set it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Source textures\r\n const colorTexture = new NodeRenderGraphInputBlock(\"Color Texture\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.Texture);\r\n colorTexture.creationOptions.options.samples = 4;\r\n\r\n const depthTexture = new NodeRenderGraphInputBlock(\"Depth Texture\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.TextureDepthStencilAttachment);\r\n depthTexture.creationOptions.options.samples = 4;\r\n\r\n // Clear texture\r\n const clear = new NodeRenderGraphClearBlock(\"Clear\", this._frameGraph, this._scene);\r\n clear.clearDepth = true;\r\n clear.clearStencil = true;\r\n\r\n colorTexture.output.connectTo(clear.target);\r\n depthTexture.output.connectTo(clear.depth);\r\n\r\n // Render objects\r\n const camera = new NodeRenderGraphInputBlock(\"Camera\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.Camera);\r\n const objectList = new NodeRenderGraphInputBlock(\"Object List\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.ObjectList);\r\n\r\n const mainRendering = new NodeRenderGraphObjectRendererBlock(\"Main Rendering\", this._frameGraph, this._scene);\r\n\r\n camera.output.connectTo(mainRendering.camera);\r\n objectList.output.connectTo(mainRendering.objects);\r\n clear.output.connectTo(mainRendering.target);\r\n clear.outputDepth.connectTo(mainRendering.depth);\r\n\r\n // Final output\r\n const output = new NodeRenderGraphOutputBlock(\"Output\", this._frameGraph, this._scene);\r\n mainRendering.output.connectTo(output.texture);\r\n\r\n this.outputBlock = output;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current node render graph.\r\n * @param name defines the name to use for the new node render graph\r\n * @returns the new node render graph\r\n */\r\n public clone(name: string): NodeRenderGraph {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeRenderGraph(name, this._scene), this);\r\n clone.name = name;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n clone.build();\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes this node render graph in a JSON representation\r\n * @param selectedBlocks defines the list of blocks to save (if null the whole node render graph will be saved)\r\n * @returns the serialized node render graph object\r\n */\r\n public serialize(selectedBlocks?: NodeRenderGraphBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeRenderGraphBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeRenderGraph\";\r\n if (this.outputBlock) {\r\n serializationObject.outputNodeId = this.outputBlock.uniqueId;\r\n }\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this._frameGraph.dispose();\r\n (this._frameGraph as WritableObject<FrameGraph>) = undefined as any;\r\n\r\n this._engine.onResizeObservable.remove(this._resizeObserver);\r\n (this._resizeObserver as WritableObject<Nullable<Observer<AbstractEngine>>>) = null;\r\n\r\n this.attachedBlocks.length = 0;\r\n this.onBuildObservable.clear();\r\n this.onBuildErrorObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new node render graph set to default basic configuration\r\n * @param name defines the name of the node render graph\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render graph\r\n * @returns a new NodeRenderGraph\r\n */\r\n public static CreateDefault(name: string, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions): NodeRenderGraph {\r\n const renderGraph = new NodeRenderGraph(name, scene, nodeRenderGraphOptions);\r\n\r\n renderGraph.setToDefault();\r\n renderGraph.build();\r\n\r\n return renderGraph;\r\n }\r\n\r\n /**\r\n * Creates a node render graph from parsed graph data\r\n * @param source defines the JSON representation of the node render graph\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render\r\n * @param skipBuild defines whether to skip building the node render graph (default is true)\r\n * @returns a new node render graph\r\n */\r\n public static Parse(source: any, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions, skipBuild: boolean = true): NodeRenderGraph {\r\n const renderGraph = SerializationHelper.Parse(() => new NodeRenderGraph(source.name, scene, nodeRenderGraphOptions), source, null);\r\n\r\n renderGraph.parseSerializedObject(source);\r\n if (!skipBuild) {\r\n renderGraph.build();\r\n }\r\n\r\n return renderGraph;\r\n }\r\n\r\n /**\r\n * Creates a node render graph from a snippet saved by the node render graph editor\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render graph\r\n * @param nodeRenderGraph defines a node render graph to update (instead of creating a new one)\r\n * @param skipBuild defines whether to skip building the node render graph (default is true)\r\n * @returns a promise that will resolve to the new node render graph\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromSnippetAsync(\r\n snippetId: string,\r\n scene: Scene,\r\n nodeRenderGraphOptions?: INodeRenderGraphCreateOptions,\r\n nodeRenderGraph?: NodeRenderGraph,\r\n skipBuild: boolean = true\r\n ): Promise<NodeRenderGraph> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeRenderGraph.CreateDefault(\"blank\", scene, nodeRenderGraphOptions));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeRenderGraph);\r\n\r\n if (!nodeRenderGraph) {\r\n nodeRenderGraph = SerializationHelper.Parse(() => new NodeRenderGraph(snippetId, scene, nodeRenderGraphOptions), serializationObject, null);\r\n }\r\n\r\n nodeRenderGraph.parseSerializedObject(serializationObject);\r\n nodeRenderGraph.snippetId = snippetId;\r\n\r\n try {\r\n if (!skipBuild) {\r\n nodeRenderGraph.build();\r\n }\r\n resolve(nodeRenderGraph);\r\n } catch (err) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(err);\r\n }\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"nodeRenderGraph.js","sourceRoot":"","sources":["../../../../../dev/core/src/FrameGraph/Node/nodeRenderGraph.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n Observer,\r\n Nullable,\r\n NodeRenderGraphBlock,\r\n NodeRenderGraphTeleportOutBlock,\r\n NodeRenderGraphTeleportInBlock,\r\n AbstractEngine,\r\n INodeRenderGraphCreateOptions,\r\n INodeRenderGraphEditorOptions,\r\n Scene,\r\n WritableObject,\r\n IShadowLight,\r\n} from \"core/index\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { NodeRenderGraphOutputBlock } from \"./Blocks/outputBlock\";\r\nimport { FrameGraph } from \"../frameGraph\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport { serialize } from \"../../Misc/decorators\";\r\nimport { SerializationHelper } from \"../../Misc/decorators.serialization\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebRequest } from \"../../Misc/webRequest\";\r\nimport { NodeRenderGraphInputBlock } from \"./Blocks/inputBlock\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Engine } from \"../../Engines/engine\";\r\nimport { NodeRenderGraphBlockConnectionPointTypes } from \"./Types/nodeRenderGraphTypes\";\r\nimport { NodeRenderGraphClearBlock } from \"./Blocks/Textures/clearBlock\";\r\nimport { NodeRenderGraphObjectRendererBlock } from \"./Blocks/Rendering/objectRendererBlock\";\r\nimport { NodeRenderGraphBuildState } from \"./nodeRenderGraphBuildState\";\r\n\r\n// declare NODERENDERGRAPHEDITOR namespace for compilation issue\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let NODERENDERGRAPHEDITOR: any;\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\ndeclare let BABYLON: any;\r\n\r\n/**\r\n * Defines a node render graph\r\n */\r\nexport class NodeRenderGraph {\r\n private static _BuildIdGenerator: number = 0;\r\n\r\n private _buildId: number = NodeRenderGraph._BuildIdGenerator++;\r\n\r\n /** Define the Url to load node editor script */\r\n public static EditorURL = `${Tools._DefaultCdnUrl}/v${Engine.Version}/NodeRenderGraph/babylon.nodeRenderGraph.js`;\r\n\r\n /** Define the Url to load snippets */\r\n public static SnippetUrl = Constants.SnippetUrl;\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private BJSNODERENDERGRAPHEDITOR = this._getGlobalNodeRenderGraphEditor();\r\n\r\n /** @returns the inspector from bundle or global */\r\n private _getGlobalNodeRenderGraphEditor(): any {\r\n // UMD Global name detection from Webpack Bundle UMD Name.\r\n if (typeof NODERENDERGRAPHEDITOR !== \"undefined\") {\r\n return NODERENDERGRAPHEDITOR;\r\n }\r\n\r\n // In case of module let's check the global emitted from the editor entry point.\r\n if (typeof BABYLON !== \"undefined\" && typeof BABYLON.NodeRenderGraphEditor !== \"undefined\") {\r\n return BABYLON;\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets or sets data used by visual editor\r\n * @see https://nrge.babylonjs.com\r\n */\r\n public editorData: any = null;\r\n\r\n /**\r\n * Gets an array of blocks that needs to be serialized even if they are not yet connected\r\n */\r\n public attachedBlocks: NodeRenderGraphBlock[] = [];\r\n\r\n /**\r\n * Observable raised when the node render graph is built\r\n */\r\n public onBuildObservable = new Observable<NodeRenderGraph>();\r\n\r\n /**\r\n * Observable raised when an error is detected\r\n */\r\n public onBuildErrorObservable = new Observable<string>();\r\n\r\n /** Gets or sets the RenderGraphOutputBlock used to gather the final node render graph data */\r\n public outputBlock: Nullable<NodeRenderGraphOutputBlock> = null;\r\n\r\n /**\r\n * Snippet ID if the graph was created from the snippet server\r\n */\r\n public snippetId: string;\r\n\r\n /**\r\n * The name of the node render graph\r\n */\r\n @serialize()\r\n public name: string;\r\n\r\n /**\r\n * A free comment about the graph\r\n */\r\n @serialize(\"comment\")\r\n public comment: string;\r\n\r\n private readonly _engine: AbstractEngine;\r\n private readonly _scene: Scene;\r\n private readonly _resizeObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private readonly _frameGraph: FrameGraph;\r\n private readonly _options: INodeRenderGraphCreateOptions;\r\n\r\n /**\r\n * Gets the frame graph used by this node render graph\r\n */\r\n public get frameGraph() {\r\n return this._frameGraph;\r\n }\r\n\r\n /**\r\n * Gets the scene used by this node render graph\r\n * @returns the scene used by this node render graph\r\n */\r\n public getScene() {\r\n return this._scene;\r\n }\r\n\r\n /**\r\n * Creates a new node render graph\r\n * @param name defines the name of the node render graph\r\n * @param scene defines the scene to use to execute the graph\r\n * @param options defines the options to use when creating the graph\r\n */\r\n public constructor(name: string, scene: Scene, options?: INodeRenderGraphCreateOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n\r\n options = {\r\n debugTextures: false,\r\n autoConfigure: false,\r\n verbose: false,\r\n rebuildGraphOnEngineResize: true,\r\n autoFillExternalInputs: true,\r\n ...options,\r\n };\r\n\r\n this._options = options;\r\n\r\n this._frameGraph = new FrameGraph(this._scene, options.debugTextures, this);\r\n this._frameGraph.name = name;\r\n\r\n if (options.rebuildGraphOnEngineResize) {\r\n this._resizeObserver = this._engine.onResizeObservable.add(() => {\r\n this.build();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current class name (\"NodeRenderGraph\")\r\n * @returns the class name\r\n */\r\n public getClassName(): string {\r\n return \"NodeRenderGraph\";\r\n }\r\n\r\n /**\r\n * Gets a block by its name\r\n * @param name defines the name of the block to retrieve\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByName<T extends NodeRenderGraphBlock>(name: string): Nullable<T> {\r\n let result: Nullable<T> = null;\r\n for (const block of this.attachedBlocks) {\r\n if (block.name === name) {\r\n if (!result) {\r\n result = block as T;\r\n } else {\r\n Tools.Warn(\"More than one block was found with the name `\" + name + \"`\");\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a block using a predicate\r\n * @param predicate defines the predicate used to find the good candidate\r\n * @returns the required block or null if not found\r\n */\r\n public getBlockByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): Nullable<T> {\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n return block as T;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Get all blocks that match a predicate\r\n * @param predicate defines the predicate used to find the good candidate(s)\r\n * @returns the list of blocks found\r\n */\r\n public getBlocksByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): T[] {\r\n const blocks: T[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (predicate(block)) {\r\n blocks.push(block as T);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Gets the list of input blocks attached to this material\r\n * @returns an array of InputBlocks\r\n */\r\n public getInputBlocks() {\r\n const blocks: NodeRenderGraphInputBlock[] = [];\r\n for (const block of this.attachedBlocks) {\r\n if (block.isInput) {\r\n blocks.push(block as NodeRenderGraphInputBlock);\r\n }\r\n }\r\n\r\n return blocks;\r\n }\r\n\r\n /**\r\n * Launch the node render graph editor\r\n * @param config Define the configuration of the editor\r\n * @returns a promise fulfilled when the node editor is visible\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async edit(config?: INodeRenderGraphEditorOptions): Promise<void> {\r\n return await new Promise((resolve) => {\r\n this.BJSNODERENDERGRAPHEDITOR = this.BJSNODERENDERGRAPHEDITOR || this._getGlobalNodeRenderGraphEditor();\r\n if (typeof this.BJSNODERENDERGRAPHEDITOR == \"undefined\") {\r\n const editorUrl = config && config.editorURL ? config.editorURL : NodeRenderGraph.EditorURL;\r\n\r\n // Load editor and add it to the DOM\r\n Tools.LoadBabylonScript(editorUrl, () => {\r\n this.BJSNODERENDERGRAPHEDITOR = this.BJSNODERENDERGRAPHEDITOR || this._getGlobalNodeRenderGraphEditor();\r\n this._createNodeEditor(config?.nodeRenderGraphEditorConfig);\r\n resolve();\r\n });\r\n } else {\r\n // Otherwise creates the editor\r\n this._createNodeEditor(config?.nodeRenderGraphEditorConfig);\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates the node editor window.\r\n * @param additionalConfig Additional configuration for the FGE\r\n */\r\n private _createNodeEditor(additionalConfig?: any) {\r\n const nodeEditorConfig: any = {\r\n nodeRenderGraph: this,\r\n ...additionalConfig,\r\n };\r\n this.BJSNODERENDERGRAPHEDITOR.NodeRenderGraphEditor.Show(nodeEditorConfig);\r\n }\r\n\r\n /**\r\n * Build the final list of blocks that will be executed by the \"execute\" method\r\n */\r\n public build() {\r\n if (!this.outputBlock) {\r\n throw new Error(\"You must define the outputBlock property before building the node render graph\");\r\n }\r\n\r\n this._initializeBlock(this.outputBlock);\r\n\r\n this._frameGraph.clear();\r\n\r\n const state = new NodeRenderGraphBuildState();\r\n\r\n state.buildId = this._buildId;\r\n state.verbose = this._options.verbose!;\r\n\r\n if (this._options.autoFillExternalInputs) {\r\n this._autoFillExternalInputs();\r\n }\r\n\r\n // Make sure that one of the object renderer is flagged as the main object renderer\r\n const objectRendererBlocks = this.getBlocksByPredicate<NodeRenderGraphObjectRendererBlock>((block) => block instanceof NodeRenderGraphObjectRendererBlock);\r\n if (objectRendererBlocks.length > 0 && !objectRendererBlocks.find((block) => block.isMainObjectRenderer)) {\r\n objectRendererBlocks[0].isMainObjectRenderer = true;\r\n }\r\n\r\n try {\r\n this.outputBlock.build(state);\r\n\r\n this._frameGraph.build();\r\n } finally {\r\n this._buildId = NodeRenderGraph._BuildIdGenerator++;\r\n\r\n if (state.emitErrors(this.onBuildErrorObservable)) {\r\n this.onBuildObservable.notifyObservers(this);\r\n }\r\n }\r\n }\r\n\r\n private _autoFillExternalInputs() {\r\n const allInputs = this.getInputBlocks();\r\n\r\n const shadowLights: IShadowLight[] = [];\r\n for (const light of this._scene.lights) {\r\n if ((light as IShadowLight).setShadowProjectionMatrix !== undefined) {\r\n shadowLights.push(light as IShadowLight);\r\n }\r\n }\r\n\r\n let cameraIndex = 0;\r\n let lightIndex = 0;\r\n for (const input of allInputs) {\r\n if (!input.isExternal) {\r\n continue;\r\n }\r\n if (!input.isAnAncestorOfType(\"NodeRenderGraphOutputBlock\")) {\r\n continue;\r\n }\r\n if ((input.type & NodeRenderGraphBlockConnectionPointTypes.TextureAllButBackBuffer) !== 0) {\r\n // nothing to do\r\n } else if (input.isCamera()) {\r\n const camera = this._scene.cameras[cameraIndex++] || this._scene.cameras[0];\r\n if (!this._scene.cameraToUseForPointers) {\r\n this._scene.cameraToUseForPointers = camera;\r\n }\r\n\r\n input.value = camera;\r\n } else if (input.isObjectList()) {\r\n input.value = { meshes: this._scene.meshes, particleSystems: this._scene.particleSystems };\r\n } else if (input.isShadowLight()) {\r\n if (lightIndex < shadowLights.length) {\r\n input.value = shadowLights[lightIndex++];\r\n lightIndex = lightIndex % shadowLights.length;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when the node render graph is ready to be executed\r\n * This method must be called after the graph has been built (NodeRenderGraph.build called)!\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000)\r\n * @returns The promise that resolves when the graph is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise<void> {\r\n return this._frameGraph.whenReadyAsync(timeStep, maxTimeout);\r\n }\r\n\r\n /**\r\n * Execute the graph (the graph must have been built before!)\r\n */\r\n public execute() {\r\n this._frameGraph.execute();\r\n }\r\n\r\n private _initializeBlock(node: NodeRenderGraphBlock) {\r\n node.initialize();\r\n if (this._options.autoConfigure) {\r\n node.autoConfigure();\r\n }\r\n\r\n if (this.attachedBlocks.indexOf(node) === -1) {\r\n this.attachedBlocks.push(node);\r\n }\r\n\r\n for (const input of node.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== node) {\r\n this._initializeBlock(block);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph\r\n */\r\n public clear() {\r\n this.outputBlock = null;\r\n this.attachedBlocks.length = 0;\r\n }\r\n\r\n /**\r\n * Remove a block from the current graph\r\n * @param block defines the block to remove\r\n */\r\n public removeBlock(block: NodeRenderGraphBlock) {\r\n const attachedBlockIndex = this.attachedBlocks.indexOf(block);\r\n if (attachedBlockIndex > -1) {\r\n this.attachedBlocks.splice(attachedBlockIndex, 1);\r\n }\r\n\r\n if (block === this.outputBlock) {\r\n this.outputBlock = null;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and load a new one from a serialization object\r\n * @param source defines the JSON representation of the graph\r\n * @param merge defines whether or not the source must be merged or replace the current content\r\n */\r\n public parseSerializedObject(source: any, merge = false) {\r\n if (!merge) {\r\n this.clear();\r\n }\r\n\r\n const map: { [key: number]: NodeRenderGraphBlock } = {};\r\n\r\n // Create blocks\r\n for (const parsedBlock of source.blocks) {\r\n const blockType: typeof NodeRenderGraphBlock = GetClass(parsedBlock.customType);\r\n if (blockType) {\r\n const additionalConstructionParameters = parsedBlock.additionalConstructionParameters;\r\n const block: NodeRenderGraphBlock = additionalConstructionParameters\r\n ? new blockType(\"\", this._frameGraph, this._scene, ...additionalConstructionParameters)\r\n : new blockType(\"\", this._frameGraph, this._scene);\r\n block._deserialize(parsedBlock);\r\n map[parsedBlock.id] = block;\r\n\r\n this.attachedBlocks.push(block);\r\n }\r\n }\r\n\r\n // Reconnect teleportation\r\n for (const block of this.attachedBlocks) {\r\n if (block.isTeleportOut) {\r\n const teleportOut = block as NodeRenderGraphTeleportOutBlock;\r\n const id = teleportOut._tempEntryPointUniqueId;\r\n if (id) {\r\n const source = map[id] as NodeRenderGraphTeleportInBlock;\r\n if (source) {\r\n source.attachToEndpoint(teleportOut);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Connections - Starts with input blocks only (except if in \"merge\" mode where we scan all blocks)\r\n for (let blockIndex = 0; blockIndex < source.blocks.length; blockIndex++) {\r\n const parsedBlock = source.blocks[blockIndex];\r\n const block = map[parsedBlock.id];\r\n\r\n if (!block) {\r\n continue;\r\n }\r\n\r\n if (block.inputs.length && parsedBlock.inputs.some((i: any) => i.targetConnectionName) && !merge) {\r\n continue;\r\n }\r\n this._restoreConnections(block, source, map);\r\n }\r\n\r\n // Outputs\r\n if (source.outputNodeId) {\r\n this.outputBlock = map[source.outputNodeId] as NodeRenderGraphOutputBlock;\r\n }\r\n\r\n // UI related info\r\n if (source.locations || (source.editorData && source.editorData.locations)) {\r\n const locations: {\r\n blockId: number;\r\n x: number;\r\n y: number;\r\n isCollapsed: boolean;\r\n }[] = source.locations || source.editorData.locations;\r\n\r\n for (const location of locations) {\r\n if (map[location.blockId]) {\r\n location.blockId = map[location.blockId].uniqueId;\r\n }\r\n }\r\n\r\n if (merge && this.editorData && this.editorData.locations) {\r\n locations.concat(this.editorData.locations);\r\n }\r\n\r\n if (source.locations) {\r\n this.editorData = {\r\n locations: locations,\r\n };\r\n } else {\r\n this.editorData = source.editorData;\r\n this.editorData.locations = locations;\r\n }\r\n\r\n const blockMap: number[] = [];\r\n\r\n for (const key in map) {\r\n blockMap[key] = map[key].uniqueId;\r\n }\r\n\r\n this.editorData.map = blockMap;\r\n }\r\n\r\n this.comment = source.comment;\r\n }\r\n\r\n private _restoreConnections(block: NodeRenderGraphBlock, source: any, map: { [key: number]: NodeRenderGraphBlock }) {\r\n for (const outputPoint of block.outputs) {\r\n for (const candidate of source.blocks) {\r\n const target = map[candidate.id];\r\n\r\n if (!target) {\r\n continue;\r\n }\r\n\r\n for (const input of candidate.inputs) {\r\n if (map[input.targetBlockId] === block && input.targetConnectionName === outputPoint.name) {\r\n const inputPoint = target.getInputByName(input.inputName);\r\n if (!inputPoint || inputPoint.isConnected) {\r\n continue;\r\n }\r\n\r\n outputPoint.connectTo(inputPoint, true);\r\n this._restoreConnections(target, source, map);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Generate a string containing the code declaration required to create an equivalent of this node render graph\r\n * @returns a string\r\n */\r\n public generateCode() {\r\n let alreadyDumped: NodeRenderGraphBlock[] = [];\r\n const blocks: NodeRenderGraphBlock[] = [];\r\n const uniqueNames: string[] = [\"const\", \"var\", \"let\"];\r\n // Gets active blocks\r\n if (this.outputBlock) {\r\n this._gatherBlocks(this.outputBlock, blocks);\r\n }\r\n\r\n // Generate\r\n const options = JSON.stringify(this._options);\r\n let codeString = `let nodeRenderGraph = new BABYLON.NodeRenderGraph(\"${this.name || \"render graph\"}\", scene, ${options});\\n`;\r\n for (const node of blocks) {\r\n if (node.isInput && alreadyDumped.indexOf(node) === -1) {\r\n codeString += node._dumpCode(uniqueNames, alreadyDumped) + \"\\n\";\r\n }\r\n }\r\n\r\n if (this.outputBlock) {\r\n // Connections\r\n alreadyDumped = [];\r\n codeString += \"// Connections\\n\";\r\n codeString += this.outputBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n\r\n // Output nodes\r\n codeString += \"// Output nodes\\n\";\r\n codeString += `nodeRenderGraph.outputBlock = ${this.outputBlock._codeVariableName};\\n`;\r\n codeString += `nodeRenderGraph.build();\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n private _gatherBlocks(rootNode: NodeRenderGraphBlock, list: NodeRenderGraphBlock[]) {\r\n if (list.indexOf(rootNode) !== -1) {\r\n return;\r\n }\r\n list.push(rootNode);\r\n\r\n for (const input of rootNode.inputs) {\r\n const connectedPoint = input.connectedPoint;\r\n if (connectedPoint) {\r\n const block = connectedPoint.ownerBlock;\r\n if (block !== rootNode) {\r\n this._gatherBlocks(block, list);\r\n }\r\n }\r\n }\r\n\r\n // Teleportation\r\n if (rootNode.isTeleportOut) {\r\n const block = rootNode as NodeRenderGraphTeleportOutBlock;\r\n if (block.entryPoint) {\r\n this._gatherBlocks(block.entryPoint, list);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current graph and set it to a default state\r\n */\r\n public setToDefault() {\r\n this.clear();\r\n\r\n this.editorData = null;\r\n\r\n // Source textures\r\n const colorTexture = new NodeRenderGraphInputBlock(\"Color Texture\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.Texture);\r\n colorTexture.creationOptions.options.samples = 4;\r\n\r\n const depthTexture = new NodeRenderGraphInputBlock(\"Depth Texture\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.TextureDepthStencilAttachment);\r\n depthTexture.creationOptions.options.samples = 4;\r\n\r\n // Clear texture\r\n const clear = new NodeRenderGraphClearBlock(\"Clear\", this._frameGraph, this._scene);\r\n clear.clearDepth = true;\r\n clear.clearStencil = true;\r\n\r\n colorTexture.output.connectTo(clear.target);\r\n depthTexture.output.connectTo(clear.depth);\r\n\r\n // Render objects\r\n const camera = new NodeRenderGraphInputBlock(\"Camera\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.Camera);\r\n const objectList = new NodeRenderGraphInputBlock(\"Object List\", this._frameGraph, this._scene, NodeRenderGraphBlockConnectionPointTypes.ObjectList);\r\n\r\n const mainRendering = new NodeRenderGraphObjectRendererBlock(\"Main Rendering\", this._frameGraph, this._scene);\r\n\r\n camera.output.connectTo(mainRendering.camera);\r\n objectList.output.connectTo(mainRendering.objects);\r\n clear.output.connectTo(mainRendering.target);\r\n clear.outputDepth.connectTo(mainRendering.depth);\r\n\r\n // Final output\r\n const output = new NodeRenderGraphOutputBlock(\"Output\", this._frameGraph, this._scene);\r\n mainRendering.output.connectTo(output.texture);\r\n\r\n this.outputBlock = output;\r\n }\r\n\r\n /**\r\n * Makes a duplicate of the current node render graph.\r\n * @param name defines the name to use for the new node render graph\r\n * @returns the new node render graph\r\n */\r\n public clone(name: string): NodeRenderGraph {\r\n const serializationObject = this.serialize();\r\n\r\n const clone = SerializationHelper.Clone(() => new NodeRenderGraph(name, this._scene), this);\r\n clone.name = name;\r\n\r\n clone.parseSerializedObject(serializationObject);\r\n clone._buildId = this._buildId;\r\n clone.build();\r\n\r\n return clone;\r\n }\r\n\r\n /**\r\n * Serializes this node render graph in a JSON representation\r\n * @param selectedBlocks defines the list of blocks to save (if null the whole node render graph will be saved)\r\n * @returns the serialized node render graph object\r\n */\r\n public serialize(selectedBlocks?: NodeRenderGraphBlock[]): any {\r\n const serializationObject = selectedBlocks ? {} : SerializationHelper.Serialize(this);\r\n serializationObject.editorData = JSON.parse(JSON.stringify(this.editorData)); // Copy\r\n\r\n let blocks: NodeRenderGraphBlock[] = [];\r\n\r\n if (selectedBlocks) {\r\n blocks = selectedBlocks;\r\n } else {\r\n serializationObject.customType = \"BABYLON.NodeRenderGraph\";\r\n if (this.outputBlock) {\r\n serializationObject.outputNodeId = this.outputBlock.uniqueId;\r\n }\r\n }\r\n\r\n // Blocks\r\n serializationObject.blocks = [];\r\n\r\n for (const block of blocks) {\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n\r\n if (!selectedBlocks) {\r\n for (const block of this.attachedBlocks) {\r\n if (blocks.indexOf(block) !== -1) {\r\n continue;\r\n }\r\n serializationObject.blocks.push(block.serialize());\r\n }\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * Disposes the resources\r\n */\r\n public dispose(): void {\r\n for (const block of this.attachedBlocks) {\r\n block.dispose();\r\n }\r\n\r\n this._frameGraph.dispose();\r\n (this._frameGraph as WritableObject<FrameGraph>) = undefined as any;\r\n\r\n this._engine.onResizeObservable.remove(this._resizeObserver);\r\n (this._resizeObserver as WritableObject<Nullable<Observer<AbstractEngine>>>) = null;\r\n\r\n this.attachedBlocks.length = 0;\r\n this.onBuildObservable.clear();\r\n this.onBuildErrorObservable.clear();\r\n }\r\n\r\n /**\r\n * Creates a new node render graph set to default basic configuration\r\n * @param name defines the name of the node render graph\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render graph\r\n * @returns a new NodeRenderGraph\r\n */\r\n public static CreateDefault(name: string, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions): NodeRenderGraph {\r\n const renderGraph = new NodeRenderGraph(name, scene, nodeRenderGraphOptions);\r\n\r\n renderGraph.setToDefault();\r\n renderGraph.build();\r\n\r\n return renderGraph;\r\n }\r\n\r\n /**\r\n * Creates a node render graph from parsed graph data\r\n * @param source defines the JSON representation of the node render graph\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render\r\n * @param skipBuild defines whether to skip building the node render graph (default is true)\r\n * @returns a new node render graph\r\n */\r\n public static Parse(source: any, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions, skipBuild: boolean = true): NodeRenderGraph {\r\n const renderGraph = SerializationHelper.Parse(() => new NodeRenderGraph(source.name, scene, nodeRenderGraphOptions), source, null);\r\n\r\n renderGraph.parseSerializedObject(source);\r\n if (!skipBuild) {\r\n renderGraph.build();\r\n }\r\n\r\n return renderGraph;\r\n }\r\n\r\n /**\r\n * Creates a node render graph from a snippet saved by the node render graph editor\r\n * @param snippetId defines the snippet to load\r\n * @param scene defines the scene to use\r\n * @param nodeRenderGraphOptions defines options to use when creating the node render graph\r\n * @param nodeRenderGraph defines a node render graph to update (instead of creating a new one)\r\n * @param skipBuild defines whether to skip building the node render graph (default is true)\r\n * @returns a promise that will resolve to the new node render graph\r\n */\r\n // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax\r\n public static ParseFromSnippetAsync(\r\n snippetId: string,\r\n scene: Scene,\r\n nodeRenderGraphOptions?: INodeRenderGraphCreateOptions,\r\n nodeRenderGraph?: NodeRenderGraph,\r\n skipBuild: boolean = true\r\n ): Promise<NodeRenderGraph> {\r\n if (snippetId === \"_BLANK\") {\r\n return Promise.resolve(NodeRenderGraph.CreateDefault(\"blank\", scene, nodeRenderGraphOptions));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = new WebRequest();\r\n request.addEventListener(\"readystatechange\", () => {\r\n if (request.readyState == 4) {\r\n if (request.status == 200) {\r\n const snippet = JSON.parse(JSON.parse(request.responseText).jsonPayload);\r\n const serializationObject = JSON.parse(snippet.nodeRenderGraph);\r\n\r\n if (!nodeRenderGraph) {\r\n nodeRenderGraph = SerializationHelper.Parse(() => new NodeRenderGraph(snippetId, scene, nodeRenderGraphOptions), serializationObject, null);\r\n }\r\n\r\n nodeRenderGraph.parseSerializedObject(serializationObject);\r\n nodeRenderGraph.snippetId = snippetId;\r\n\r\n try {\r\n if (!skipBuild) {\r\n nodeRenderGraph.build();\r\n }\r\n resolve(nodeRenderGraph);\r\n } catch (err) {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(err);\r\n }\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(\"Unable to load the snippet \" + snippetId);\r\n }\r\n }\r\n });\r\n\r\n request.open(\"GET\", this.SnippetUrl + \"/\" + snippetId.replace(/#/g, \"/\"));\r\n request.send();\r\n });\r\n }\r\n}\r\n"]}
@@ -97,6 +97,7 @@ export class FrameGraphObjectRendererTask extends FrameGraphTask {
97
97
  this._renderer.renderList = this.objectList.meshes;
98
98
  this._renderer.particleSystemList = this.objectList.particleSystems;
99
99
  this._renderer.disableImageProcessing = this.disableImageProcessing;
100
+ this._renderer.enableBoundingBoxRendering = this.isMainObjectRenderer;
100
101
  const targetTextures = Array.isArray(this.targetTexture) ? this.targetTexture : [this.targetTexture];
101
102
  const outputTextureDescription = this._frameGraph.textureManager.getTextureDescription(targetTextures[0]);
102
103
  let depthEnabled = false;
@@ -1 +1 @@
1
- {"version":3,"file":"objectRendererTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/objectRendererTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n FrameGraph,\r\n FrameGraphTextureHandle,\r\n Scene,\r\n Camera,\r\n FrameGraphObjectList,\r\n FrameGraphRenderContext,\r\n ObjectRendererOptions,\r\n Light,\r\n Nullable,\r\n Observer,\r\n FrameGraphShadowGeneratorTask,\r\n FrameGraphRenderPass,\r\n} from \"core/index\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"../../frameGraphTypes\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { ObjectRenderer } from \"../../../Rendering/objectRenderer\";\r\nimport { FrameGraphCascadedShadowGeneratorTask } from \"./csmShadowGeneratorTask\";\r\n\r\n/**\r\n * Task used to render objects to a texture.\r\n */\r\nexport class FrameGraphObjectRendererTask extends FrameGraphTask {\r\n /**\r\n * The target texture where the objects will be rendered.\r\n */\r\n public targetTexture: FrameGraphTextureHandle | FrameGraphTextureHandle[];\r\n\r\n /**\r\n * The depth attachment texture where the objects will be rendered (optional).\r\n */\r\n public depthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The shadow generators used to render the objects (optional).\r\n */\r\n public shadowGenerators?: FrameGraphShadowGeneratorTask[] = [];\r\n\r\n private _camera: Camera;\r\n\r\n /**\r\n * Gets or sets the camera used to render the objects.\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: Camera) {\r\n this._camera = camera;\r\n this._renderer.activeCamera = this.camera;\r\n }\r\n\r\n /**\r\n * The list of objects to render.\r\n */\r\n public objectList: FrameGraphObjectList;\r\n\r\n /**\r\n * If depth testing should be enabled (default is true).\r\n */\r\n public depthTest = true;\r\n\r\n /**\r\n * If depth writing should be enabled (default is true).\r\n */\r\n public depthWrite = true;\r\n\r\n /**\r\n * If shadows should be disabled (default is false).\r\n */\r\n public disableShadows = false;\r\n\r\n /**\r\n * If image processing should be disabled (default is false).\r\n * false means that the default image processing configuration will be applied (the one from the scene)\r\n */\r\n public disableImageProcessing = false;\r\n\r\n /**\r\n * Sets this property to true if this task is the main object renderer of the frame graph.\r\n * It will help to locate the main object renderer in the frame graph when multiple object renderers are used.\r\n * This is useful for the inspector to know which object renderer to use for additional rendering features like wireframe rendering or frustum light debugging.\r\n * It is also used to determine the main camera used by the frame graph: this is the camera used by the main object renderer.\r\n */\r\n public isMainObjectRenderer = false;\r\n\r\n /**\r\n * The output texture.\r\n * This texture will point to the same texture than the targetTexture property if it is set.\r\n * Note, however, that the handle itself will be different!\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output depth attachment texture.\r\n * This texture will point to the same texture than the depthTexture property if it is set.\r\n * Note, however, that the handle itself will be different!\r\n */\r\n public readonly outputDepthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The object renderer used to render the objects.\r\n */\r\n public get objectRenderer() {\r\n return this._renderer;\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(value: string) {\r\n this._name = value;\r\n if (this._renderer) {\r\n this._renderer.name = value;\r\n }\r\n }\r\n\r\n protected readonly _scene: Scene;\r\n protected readonly _renderer: ObjectRenderer;\r\n protected _textureWidth: number;\r\n protected _textureHeight: number;\r\n protected _onBeforeRenderObservable: Nullable<Observer<number>> = null;\r\n protected _onAfterRenderObservable: Nullable<Observer<number>> = null;\r\n protected _externalObjectRenderer = false;\r\n\r\n /**\r\n * Constructs a new object renderer task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph the task belongs to.\r\n * @param scene The scene the frame graph is associated with.\r\n * @param options The options of the object renderer.\r\n * @param existingObjectRenderer An existing object renderer to use (optional). If provided, the options parameter will be ignored.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: ObjectRendererOptions, existingObjectRenderer?: ObjectRenderer) {\r\n super(name, frameGraph);\r\n\r\n this._scene = scene;\r\n this._externalObjectRenderer = !!existingObjectRenderer;\r\n this._renderer = existingObjectRenderer ?? new ObjectRenderer(name, scene, options);\r\n this.name = name;\r\n\r\n if (!this._externalObjectRenderer) {\r\n this._renderer.onBeforeRenderingManagerRenderObservable.add(() => {\r\n if (!this._renderer.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n });\r\n }\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n this.outputDepthTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override isReady() {\r\n return this._renderer.isReadyForRendering(this._textureWidth, this._textureHeight);\r\n }\r\n\r\n public record(skipCreationOfDisabledPasses = false, additionalExecute?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass {\r\n if (this.targetTexture === undefined || this.objectList === undefined) {\r\n throw new Error(`FrameGraphObjectRendererTask ${this.name}: targetTexture and objectList are required`);\r\n }\r\n\r\n // Make sure the renderList / particleSystemList are set when FrameGraphObjectRendererTask.isReady() is called!\r\n this._renderer.renderList = this.objectList.meshes;\r\n this._renderer.particleSystemList = this.objectList.particleSystems;\r\n this._renderer.disableImageProcessing = this.disableImageProcessing;\r\n\r\n const targetTextures = Array.isArray(this.targetTexture) ? this.targetTexture : [this.targetTexture];\r\n\r\n const outputTextureDescription = this._frameGraph.textureManager.getTextureDescription(targetTextures[0]);\r\n\r\n let depthEnabled = false;\r\n\r\n if (this.depthTexture !== undefined) {\r\n if (this.depthTexture === backbufferDepthStencilTextureHandle && (targetTextures[0] !== backbufferColorTextureHandle || targetTextures.length > 1)) {\r\n throw new Error(\r\n `FrameGraphObjectRendererTask ${this.name}: the back buffer color texture is the only color texture allowed when the depth is the back buffer depth/stencil`\r\n );\r\n }\r\n if (this.depthTexture !== backbufferDepthStencilTextureHandle && targetTextures[0] === backbufferColorTextureHandle) {\r\n throw new Error(\r\n `FrameGraphObjectRendererTask ${this.name}: the back buffer depth/stencil texture is the only depth texture allowed when the target is the back buffer color`\r\n );\r\n }\r\n\r\n const depthTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.depthTexture);\r\n if (depthTextureDescription.options.samples !== outputTextureDescription.options.samples) {\r\n throw new Error(`FrameGraphObjectRendererTask ${this.name}: the depth texture and the output texture must have the same number of samples`);\r\n }\r\n\r\n depthEnabled = true;\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, targetTextures[0]);\r\n if (this.depthTexture !== undefined) {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputDepthTexture, this.depthTexture);\r\n }\r\n\r\n this._textureWidth = outputTextureDescription.size.width;\r\n this._textureHeight = outputTextureDescription.size.height;\r\n\r\n this._setLightsForShadow();\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.setRenderTarget(targetTextures);\r\n pass.setRenderTargetDepth(this.depthTexture);\r\n pass.setExecuteFunc((context) => {\r\n this._renderer.renderList = this.objectList.meshes;\r\n this._renderer.particleSystemList = this.objectList.particleSystems;\r\n this._renderer.disableImageProcessing = this.disableImageProcessing;\r\n\r\n context.setDepthStates(this.depthTest && depthEnabled, this.depthWrite && depthEnabled);\r\n context.render(this._renderer, this._textureWidth, this._textureHeight);\r\n\r\n additionalExecute?.(context);\r\n });\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.setRenderTarget(targetTextures);\r\n passDisabled.setRenderTargetDepth(this.depthTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n\r\n return pass;\r\n }\r\n\r\n public override dispose(): void {\r\n this._renderer.onBeforeRenderObservable.remove(this._onBeforeRenderObservable);\r\n this._renderer.onAfterRenderObservable.remove(this._onAfterRenderObservable);\r\n if (!this._externalObjectRenderer) {\r\n this._renderer.dispose();\r\n }\r\n super.dispose();\r\n }\r\n\r\n protected _setLightsForShadow() {\r\n const lightsForShadow: Set<Light> = new Set();\r\n const shadowEnabled: Map<Light, boolean> = new Map();\r\n\r\n if (this.shadowGenerators) {\r\n for (const shadowGeneratorTask of this.shadowGenerators) {\r\n const shadowGenerator = shadowGeneratorTask.shadowGenerator;\r\n const light = shadowGenerator.getLight();\r\n if (light.isEnabled() && light.shadowEnabled) {\r\n lightsForShadow.add(light);\r\n if (FrameGraphCascadedShadowGeneratorTask.IsCascadedShadowGenerator(shadowGeneratorTask)) {\r\n light._shadowGenerators!.set(shadowGeneratorTask.camera, shadowGenerator);\r\n } else {\r\n light._shadowGenerators!.set(null, shadowGenerator);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._renderer.onBeforeRenderObservable.remove(this._onBeforeRenderObservable);\r\n this._onBeforeRenderObservable = this._renderer.onBeforeRenderObservable.add(() => {\r\n for (let i = 0; i < this._scene.lights.length; i++) {\r\n const light = this._scene.lights[i];\r\n shadowEnabled.set(light, light.shadowEnabled);\r\n light.shadowEnabled = !this.disableShadows && lightsForShadow.has(light);\r\n }\r\n });\r\n\r\n this._renderer.onAfterRenderObservable.remove(this._onAfterRenderObservable);\r\n this._onAfterRenderObservable = this._renderer.onAfterRenderObservable.add(() => {\r\n for (let i = 0; i < this._scene.lights.length; i++) {\r\n const light = this._scene.lights[i];\r\n light.shadowEnabled = shadowEnabled.get(light)!;\r\n }\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"objectRendererTask.js","sourceRoot":"","sources":["../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/objectRendererTask.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\r\n FrameGraph,\r\n FrameGraphTextureHandle,\r\n Scene,\r\n Camera,\r\n FrameGraphObjectList,\r\n FrameGraphRenderContext,\r\n ObjectRendererOptions,\r\n Light,\r\n Nullable,\r\n Observer,\r\n FrameGraphShadowGeneratorTask,\r\n FrameGraphRenderPass,\r\n} from \"core/index\";\r\nimport { backbufferColorTextureHandle, backbufferDepthStencilTextureHandle } from \"../../frameGraphTypes\";\r\nimport { FrameGraphTask } from \"../../frameGraphTask\";\r\nimport { ObjectRenderer } from \"../../../Rendering/objectRenderer\";\r\nimport { FrameGraphCascadedShadowGeneratorTask } from \"./csmShadowGeneratorTask\";\r\n\r\n/**\r\n * Task used to render objects to a texture.\r\n */\r\nexport class FrameGraphObjectRendererTask extends FrameGraphTask {\r\n /**\r\n * The target texture where the objects will be rendered.\r\n */\r\n public targetTexture: FrameGraphTextureHandle | FrameGraphTextureHandle[];\r\n\r\n /**\r\n * The depth attachment texture where the objects will be rendered (optional).\r\n */\r\n public depthTexture?: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The shadow generators used to render the objects (optional).\r\n */\r\n public shadowGenerators?: FrameGraphShadowGeneratorTask[] = [];\r\n\r\n private _camera: Camera;\r\n\r\n /**\r\n * Gets or sets the camera used to render the objects.\r\n */\r\n public get camera() {\r\n return this._camera;\r\n }\r\n\r\n public set camera(camera: Camera) {\r\n this._camera = camera;\r\n this._renderer.activeCamera = this.camera;\r\n }\r\n\r\n /**\r\n * The list of objects to render.\r\n */\r\n public objectList: FrameGraphObjectList;\r\n\r\n /**\r\n * If depth testing should be enabled (default is true).\r\n */\r\n public depthTest = true;\r\n\r\n /**\r\n * If depth writing should be enabled (default is true).\r\n */\r\n public depthWrite = true;\r\n\r\n /**\r\n * If shadows should be disabled (default is false).\r\n */\r\n public disableShadows = false;\r\n\r\n /**\r\n * If image processing should be disabled (default is false).\r\n * false means that the default image processing configuration will be applied (the one from the scene)\r\n */\r\n public disableImageProcessing = false;\r\n\r\n /**\r\n * Sets this property to true if this task is the main object renderer of the frame graph.\r\n * It will help to locate the main object renderer in the frame graph when multiple object renderers are used.\r\n * This is useful for the inspector to know which object renderer to use for additional rendering features like wireframe rendering or frustum light debugging.\r\n * It is also used to determine the main camera used by the frame graph: this is the camera used by the main object renderer.\r\n */\r\n public isMainObjectRenderer = false;\r\n\r\n /**\r\n * The output texture.\r\n * This texture will point to the same texture than the targetTexture property if it is set.\r\n * Note, however, that the handle itself will be different!\r\n */\r\n public readonly outputTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The output depth attachment texture.\r\n * This texture will point to the same texture than the depthTexture property if it is set.\r\n * Note, however, that the handle itself will be different!\r\n */\r\n public readonly outputDepthTexture: FrameGraphTextureHandle;\r\n\r\n /**\r\n * The object renderer used to render the objects.\r\n */\r\n public get objectRenderer() {\r\n return this._renderer;\r\n }\r\n\r\n public override get name() {\r\n return this._name;\r\n }\r\n\r\n public override set name(value: string) {\r\n this._name = value;\r\n if (this._renderer) {\r\n this._renderer.name = value;\r\n }\r\n }\r\n\r\n protected readonly _scene: Scene;\r\n protected readonly _renderer: ObjectRenderer;\r\n protected _textureWidth: number;\r\n protected _textureHeight: number;\r\n protected _onBeforeRenderObservable: Nullable<Observer<number>> = null;\r\n protected _onAfterRenderObservable: Nullable<Observer<number>> = null;\r\n protected _externalObjectRenderer = false;\r\n\r\n /**\r\n * Constructs a new object renderer task.\r\n * @param name The name of the task.\r\n * @param frameGraph The frame graph the task belongs to.\r\n * @param scene The scene the frame graph is associated with.\r\n * @param options The options of the object renderer.\r\n * @param existingObjectRenderer An existing object renderer to use (optional). If provided, the options parameter will be ignored.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: ObjectRendererOptions, existingObjectRenderer?: ObjectRenderer) {\r\n super(name, frameGraph);\r\n\r\n this._scene = scene;\r\n this._externalObjectRenderer = !!existingObjectRenderer;\r\n this._renderer = existingObjectRenderer ?? new ObjectRenderer(name, scene, options);\r\n this.name = name;\r\n\r\n if (!this._externalObjectRenderer) {\r\n this._renderer.onBeforeRenderingManagerRenderObservable.add(() => {\r\n if (!this._renderer.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n });\r\n }\r\n\r\n this.outputTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n this.outputDepthTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n public override isReady() {\r\n return this._renderer.isReadyForRendering(this._textureWidth, this._textureHeight);\r\n }\r\n\r\n public record(skipCreationOfDisabledPasses = false, additionalExecute?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass {\r\n if (this.targetTexture === undefined || this.objectList === undefined) {\r\n throw new Error(`FrameGraphObjectRendererTask ${this.name}: targetTexture and objectList are required`);\r\n }\r\n\r\n // Make sure the renderList / particleSystemList are set when FrameGraphObjectRendererTask.isReady() is called!\r\n this._renderer.renderList = this.objectList.meshes;\r\n this._renderer.particleSystemList = this.objectList.particleSystems;\r\n this._renderer.disableImageProcessing = this.disableImageProcessing;\r\n this._renderer.enableBoundingBoxRendering = this.isMainObjectRenderer;\r\n\r\n const targetTextures = Array.isArray(this.targetTexture) ? this.targetTexture : [this.targetTexture];\r\n\r\n const outputTextureDescription = this._frameGraph.textureManager.getTextureDescription(targetTextures[0]);\r\n\r\n let depthEnabled = false;\r\n\r\n if (this.depthTexture !== undefined) {\r\n if (this.depthTexture === backbufferDepthStencilTextureHandle && (targetTextures[0] !== backbufferColorTextureHandle || targetTextures.length > 1)) {\r\n throw new Error(\r\n `FrameGraphObjectRendererTask ${this.name}: the back buffer color texture is the only color texture allowed when the depth is the back buffer depth/stencil`\r\n );\r\n }\r\n if (this.depthTexture !== backbufferDepthStencilTextureHandle && targetTextures[0] === backbufferColorTextureHandle) {\r\n throw new Error(\r\n `FrameGraphObjectRendererTask ${this.name}: the back buffer depth/stencil texture is the only depth texture allowed when the target is the back buffer color`\r\n );\r\n }\r\n\r\n const depthTextureDescription = this._frameGraph.textureManager.getTextureDescription(this.depthTexture);\r\n if (depthTextureDescription.options.samples !== outputTextureDescription.options.samples) {\r\n throw new Error(`FrameGraphObjectRendererTask ${this.name}: the depth texture and the output texture must have the same number of samples`);\r\n }\r\n\r\n depthEnabled = true;\r\n }\r\n\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputTexture, targetTextures[0]);\r\n if (this.depthTexture !== undefined) {\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputDepthTexture, this.depthTexture);\r\n }\r\n\r\n this._textureWidth = outputTextureDescription.size.width;\r\n this._textureHeight = outputTextureDescription.size.height;\r\n\r\n this._setLightsForShadow();\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n\r\n pass.setRenderTarget(targetTextures);\r\n pass.setRenderTargetDepth(this.depthTexture);\r\n pass.setExecuteFunc((context) => {\r\n this._renderer.renderList = this.objectList.meshes;\r\n this._renderer.particleSystemList = this.objectList.particleSystems;\r\n this._renderer.disableImageProcessing = this.disableImageProcessing;\r\n\r\n context.setDepthStates(this.depthTest && depthEnabled, this.depthWrite && depthEnabled);\r\n context.render(this._renderer, this._textureWidth, this._textureHeight);\r\n\r\n additionalExecute?.(context);\r\n });\r\n\r\n if (!skipCreationOfDisabledPasses) {\r\n const passDisabled = this._frameGraph.addRenderPass(this.name + \"_disabled\", true);\r\n\r\n passDisabled.setRenderTarget(targetTextures);\r\n passDisabled.setRenderTargetDepth(this.depthTexture);\r\n passDisabled.setExecuteFunc((_context) => {});\r\n }\r\n\r\n return pass;\r\n }\r\n\r\n public override dispose(): void {\r\n this._renderer.onBeforeRenderObservable.remove(this._onBeforeRenderObservable);\r\n this._renderer.onAfterRenderObservable.remove(this._onAfterRenderObservable);\r\n if (!this._externalObjectRenderer) {\r\n this._renderer.dispose();\r\n }\r\n super.dispose();\r\n }\r\n\r\n protected _setLightsForShadow() {\r\n const lightsForShadow: Set<Light> = new Set();\r\n const shadowEnabled: Map<Light, boolean> = new Map();\r\n\r\n if (this.shadowGenerators) {\r\n for (const shadowGeneratorTask of this.shadowGenerators) {\r\n const shadowGenerator = shadowGeneratorTask.shadowGenerator;\r\n const light = shadowGenerator.getLight();\r\n if (light.isEnabled() && light.shadowEnabled) {\r\n lightsForShadow.add(light);\r\n if (FrameGraphCascadedShadowGeneratorTask.IsCascadedShadowGenerator(shadowGeneratorTask)) {\r\n light._shadowGenerators!.set(shadowGeneratorTask.camera, shadowGenerator);\r\n } else {\r\n light._shadowGenerators!.set(null, shadowGenerator);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._renderer.onBeforeRenderObservable.remove(this._onBeforeRenderObservable);\r\n this._onBeforeRenderObservable = this._renderer.onBeforeRenderObservable.add(() => {\r\n for (let i = 0; i < this._scene.lights.length; i++) {\r\n const light = this._scene.lights[i];\r\n shadowEnabled.set(light, light.shadowEnabled);\r\n light.shadowEnabled = !this.disableShadows && lightsForShadow.has(light);\r\n }\r\n });\r\n\r\n this._renderer.onAfterRenderObservable.remove(this._onAfterRenderObservable);\r\n this._onAfterRenderObservable = this._renderer.onAfterRenderObservable.add(() => {\r\n for (let i = 0; i < this._scene.lights.length; i++) {\r\n const light = this._scene.lights[i];\r\n light.shadowEnabled = shadowEnabled.get(light)!;\r\n }\r\n });\r\n }\r\n}\r\n"]}
@@ -8,6 +8,7 @@ import { Observable } from "../Misc/observable.js";
8
8
  import { _RetryWithInterval } from "../Misc/timingTools.js";
9
9
  import { Logger } from "../Misc/logger.js";
10
10
  import { UniqueIdGenerator } from "../Misc/uniqueIdGenerator.js";
11
+ import { FindMainObjectRenderer } from "./frameGraphUtils.js";
11
12
  import "../Engines/Extensions/engine.multiRender.js";
12
13
  import "../Engines/WebGPU/Extensions/engine.multiRender.js";
13
14
  var FrameGraphPassType;
@@ -174,6 +175,12 @@ export class FrameGraph {
174
175
  this.textureManager._isRecordingTask = false;
175
176
  this._currentProcessedTask = null;
176
177
  }
178
+ // The user expects bouding boxes to render for the main object renderer
179
+ // It also lets the "show bounding box" option in the inspector work
180
+ const mainObjectRenderer = FindMainObjectRenderer(this);
181
+ if (mainObjectRenderer) {
182
+ mainObjectRenderer.objectRenderer.enableBoundingBoxRendering = true;
183
+ }
177
184
  this.textureManager._allocateTextures(this.optimizeTextureAllocation ? this._tasks : undefined);
178
185
  for (const task of this._tasks) {
179
186
  task._checkTask();