@babylonjs/core 6.34.1 → 6.34.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 (153) hide show
  1. package/Cameras/Inputs/followCameraMouseWheelInput.js +12 -9
  2. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  3. package/Cameras/Inputs/followCameraPointersInput.js +28 -9
  4. package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
  5. package/Cameras/followCameraInputsManager.js +2 -1
  6. package/Cameras/followCameraInputsManager.js.map +1 -1
  7. package/Compute/computeShader.d.ts +8 -2
  8. package/Compute/computeShader.js +5 -1
  9. package/Compute/computeShader.js.map +1 -1
  10. package/Debug/skeletonViewer.js +2 -1
  11. package/Debug/skeletonViewer.js.map +1 -1
  12. package/Engines/Extensions/engine.computeShader.d.ts +3 -1
  13. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  14. package/Engines/Extensions/engine.multiRender.js +3 -2
  15. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  16. package/Engines/Processors/shaderCodeInliner.js +15 -14
  17. package/Engines/Processors/shaderCodeInliner.js.map +1 -1
  18. package/Engines/WebGPU/Extensions/engine.computeShader.js +13 -4
  19. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  20. package/Engines/WebGPU/Extensions/engine.multiRender.js +3 -2
  21. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  22. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +8 -1
  23. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  24. package/Engines/WebGPU/webgpuBufferManager.d.ts +3 -1
  25. package/Engines/WebGPU/webgpuBufferManager.js +10 -2
  26. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  27. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  28. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  29. package/Engines/WebGPU/webgpuPerfCounter.d.ts +15 -0
  30. package/Engines/WebGPU/webgpuPerfCounter.js +31 -0
  31. package/Engines/WebGPU/webgpuPerfCounter.js.map +1 -0
  32. package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -1
  33. package/Engines/WebGPU/webgpuQuerySet.js +37 -18
  34. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  35. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +20 -1
  36. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +18 -1
  37. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
  38. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  39. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  40. package/Engines/WebGPU/webgpuTimestampQuery.d.ts +11 -2
  41. package/Engines/WebGPU/webgpuTimestampQuery.js +45 -7
  42. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  43. package/Engines/WebGPU/webgpuTintWASM.js +3 -2
  44. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  45. package/Engines/engine.d.ts +3 -5
  46. package/Engines/engine.js.map +1 -1
  47. package/Engines/index.d.ts +1 -0
  48. package/Engines/index.js +1 -0
  49. package/Engines/index.js.map +1 -1
  50. package/Engines/nativeEngine.js +4 -2
  51. package/Engines/nativeEngine.js.map +1 -1
  52. package/Engines/thinEngine.js +4 -4
  53. package/Engines/thinEngine.js.map +1 -1
  54. package/Engines/webgpuEngine.d.ts +16 -1
  55. package/Engines/webgpuEngine.js +108 -54
  56. package/Engines/webgpuEngine.js.map +1 -1
  57. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js +2 -1
  58. package/FlowGraph/Blocks/Execution/flowGraphConsoleLogBlock.js.map +1 -1
  59. package/Gizmos/lightGizmo.js +2 -1
  60. package/Gizmos/lightGizmo.js.map +1 -1
  61. package/Gizmos/rotationGizmo.js +1 -1
  62. package/Gizmos/rotationGizmo.js.map +1 -1
  63. package/Lights/Shadows/cascadedShadowGenerator.js +1 -1
  64. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  65. package/Materials/Node/Blocks/Dual/lightBlock.js +2 -1
  66. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  67. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js +3 -2
  68. package/Materials/Node/Blocks/Dual/reflectionTextureBlock.js.map +1 -1
  69. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +2 -1
  70. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  71. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +2 -1
  72. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  73. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +2 -1
  74. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  75. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +3 -2
  76. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  77. package/Materials/Node/Blocks/PBR/reflectionBlock.js +2 -1
  78. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  79. package/Materials/Node/nodeMaterial.js +9 -8
  80. package/Materials/Node/nodeMaterial.js.map +1 -1
  81. package/Materials/Node/nodeMaterialBlock.js +2 -1
  82. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  83. package/Materials/Textures/multiRenderTarget.d.ts +4 -0
  84. package/Materials/Textures/multiRenderTarget.js +1 -0
  85. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  86. package/Materials/Textures/renderTargetTexture.js +1 -2
  87. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  88. package/Materials/uniformBuffer.d.ts +1 -4
  89. package/Materials/uniformBuffer.js +2 -5
  90. package/Materials/uniformBuffer.js.map +1 -1
  91. package/Meshes/Builders/groundBuilder.d.ts +7 -1
  92. package/Meshes/Builders/groundBuilder.js +17 -8
  93. package/Meshes/Builders/groundBuilder.js.map +1 -1
  94. package/Meshes/Compression/dracoCompression.js.map +1 -1
  95. package/Meshes/Node/nodeGeometryBlock.js +2 -1
  96. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  97. package/Meshes/mesh.d.ts +2 -1
  98. package/Meshes/mesh.js +3 -2
  99. package/Meshes/mesh.js.map +1 -1
  100. package/Misc/assetsManager.js +2 -2
  101. package/Misc/assetsManager.js.map +1 -1
  102. package/Misc/dds.js +1 -1
  103. package/Misc/dds.js.map +1 -1
  104. package/Misc/fileTools.js +4 -0
  105. package/Misc/fileTools.js.map +1 -1
  106. package/Misc/logger.d.ts +3 -3
  107. package/Misc/logger.js +8 -4
  108. package/Misc/logger.js.map +1 -1
  109. package/Misc/perfCounter.d.ts +2 -1
  110. package/Misc/perfCounter.js +1 -0
  111. package/Misc/perfCounter.js.map +1 -1
  112. package/Misc/sceneSerializer.js +2 -1
  113. package/Misc/sceneSerializer.js.map +1 -1
  114. package/Misc/tools.d.ts +2 -7
  115. package/Misc/tools.js.map +1 -1
  116. package/Navigation/Plugins/recastJSPlugin.js +3 -3
  117. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  118. package/Particles/computeShaderParticleSystem.js.map +1 -1
  119. package/Physics/v2/Plugins/havokPlugin.js +1 -1
  120. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  121. package/Physics/v2/physicsBody.d.ts +5 -0
  122. package/Physics/v2/physicsBody.js +7 -0
  123. package/Physics/v2/physicsBody.js.map +1 -1
  124. package/Physics/v2/ragdoll.d.ts +5 -10
  125. package/Physics/v2/ragdoll.js +29 -36
  126. package/Physics/v2/ragdoll.js.map +1 -1
  127. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +2 -2
  128. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  129. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +3 -2
  130. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  131. package/PostProcesses/screenSpaceCurvaturePostProcess.js +1 -1
  132. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  133. package/PostProcesses/screenSpaceReflectionPostProcess.js +3 -2
  134. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  135. package/Rendering/GaussianSplatting/gaussianSplatting.js.map +1 -1
  136. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +3 -1
  137. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  138. package/XR/features/WebXRControllerPhysics.js +2 -2
  139. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  140. package/XR/features/WebXRMeshDetector.js +2 -1
  141. package/XR/features/WebXRMeshDetector.js.map +1 -1
  142. package/XR/features/WebXRWalkingLocomotion.js +1 -1
  143. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  144. package/XR/motionController/webXRMotionControllerManager.js +1 -1
  145. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  146. package/XR/webXRExperienceHelper.js +2 -2
  147. package/XR/webXRExperienceHelper.js.map +1 -1
  148. package/assetContainer.js +2 -2
  149. package/assetContainer.js.map +1 -1
  150. package/package.json +1 -1
  151. package/scene.d.ts +2 -4
  152. package/scene.js +2 -1
  153. package/scene.js.map +1 -1
@@ -3,6 +3,7 @@ import { NodeMaterialConnectionPoint, NodeMaterialConnectionPointDirection } fro
3
3
  import { NodeMaterialBlockTargets } from "./Enums/nodeMaterialBlockTargets.js";
4
4
  import { UniqueIdGenerator } from "../../Misc/uniqueIdGenerator.js";
5
5
  import { GetClass } from "../../Misc/typeStore.js";
6
+ import { Logger } from "../../Misc/logger.js";
6
7
  /**
7
8
  * Defines a block that can be used inside a node based material
8
9
  */
@@ -534,7 +535,7 @@ export class NodeMaterialBlock {
534
535
  }
535
536
  // Logs
536
537
  if (state.sharedData.verbose) {
537
- console.log(`${state.target === NodeMaterialBlockTargets.Vertex ? "Vertex shader" : "Fragment shader"}: Building ${this.name} [${this.getClassName()}]`);
538
+ Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? "Vertex shader" : "Fragment shader"}: Building ${this.name} [${this.getClassName()}]`);
538
539
  }
539
540
  // Checks final outputs
540
541
  if (this.isFinalMerger) {
@@ -1 +1 @@
1
- {"version":3,"file":"nodeMaterialBlock.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Node/nodeMaterialBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { NodeMaterialConnectionPoint, NodeMaterialConnectionPointDirection } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Effect } from \"../effect\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"./nodeMaterial\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport type { EffectFallbacks } from \"../effectFallbacks\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based material\r\n */\r\nexport class NodeMaterialBlock {\r\n private _buildId: number;\r\n private _buildTarget: NodeMaterialBlockTargets;\r\n protected _target: NodeMaterialBlockTargets;\r\n private _isFinalMerger = false;\r\n private _isInput = false;\r\n private _isTeleportOut = false;\r\n private _isTeleportIn = false;\r\n private _name = \"\";\r\n protected _isUnique = false;\r\n\r\n /** Gets or sets a boolean indicating that only one input can be connected at a time */\r\n public inputsAreExclusive = false;\r\n\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /** @internal */\r\n public _inputs = new Array<NodeMaterialConnectionPoint>();\r\n /** @internal */\r\n public _outputs = new Array<NodeMaterialConnectionPoint>();\r\n\r\n /** @internal */\r\n public _preparationId: number;\r\n\r\n /** @internal */\r\n public readonly _originalTargetIsNeutral: boolean;\r\n\r\n /**\r\n * Gets the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Sets the name of the block. Will check if the name is valid.\r\n */\r\n public set name(newName: string) {\r\n if (!this.validateBlockName(newName)) {\r\n return;\r\n }\r\n\r\n this._name = newName;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets the comments associated with this block\r\n */\r\n public comments: string = \"\";\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeMaterial\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value)\r\n */\r\n public get isFinalMerger(): boolean {\r\n return this._isFinalMerger;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader)\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets or sets the build Id\r\n */\r\n public get buildId(): number {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the target of the block\r\n */\r\n public get target() {\r\n return this._target;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n if ((this._target & value) !== 0) {\r\n return;\r\n }\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeMaterialConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeMaterialConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited in the Inspector (false by default) */\r\n public visibleInInspector = false;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) {\r\n this._target = target;\r\n this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral;\r\n this._isFinalMerger = isFinalMerger;\r\n this._isInput = this.getClassName() === \"InputBlock\";\r\n this._isTeleportOut = this.getClassName() === \"NodeMaterialTeleportOutBlock\";\r\n this._isTeleportIn = this.getClassName() === \"NodeMaterialTeleportInBlock\";\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setInitialTarget(target: NodeMaterialBlockTargets): void {\r\n this._target = target;\r\n (this._originalTargetIsNeutral as boolean) = target === NodeMaterialBlockTargets.Neutral;\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initialize(state: NodeMaterialBuildState) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Bind data to effect. Will only be called for blocks with isBindable === true\r\n * @param effect defines the effect to bind data to\r\n * @param nodeMaterial defines the hosting NodeMaterial\r\n * @param mesh defines the mesh that will be rendered\r\n * @param subMesh defines the submesh that will be rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n protected _declareOutput(output: NodeMaterialConnectionPoint, state: NodeMaterialBuildState): string {\r\n return `${state._getGLType(output.type)} ${output.associatedVariableName}`;\r\n }\r\n\r\n protected _writeVariable(currentPoint: NodeMaterialConnectionPoint): string {\r\n const connectionPoint = currentPoint.connectedPoint;\r\n\r\n if (connectionPoint) {\r\n return `${currentPoint.associatedVariableName}`;\r\n }\r\n\r\n return `0.`;\r\n }\r\n\r\n protected _writeFloat(value: number) {\r\n let stringVersion = value.toString();\r\n\r\n if (stringVersion.indexOf(\".\") === -1) {\r\n stringVersion += \".0\";\r\n }\r\n return `${stringVersion}`;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeMaterialBlock\";\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader */\r\n public isConnectedInFragmentShader() {\r\n return this.outputs.some((o) => o.isConnectedInFragmentShader);\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerInput(\r\n name: string,\r\n type: NodeMaterialBlockConnectionPointTypes,\r\n isOptional: boolean = false,\r\n target?: NodeMaterialBlockTargets,\r\n point?: NodeMaterialConnectionPoint\r\n ) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeMaterialBlockConnectionPointTypes, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Output);\r\n point.type = type;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Will return the first available input e.g. the first one which is not an uniform or an attribute\r\n * @param forOutput defines an optional connection point to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableInput(forOutput: Nullable<NodeMaterialConnectionPoint> = null) {\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n return input;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Will return the first available output e.g. the first one which is not yet connected and not a varying\r\n * @param forBlock defines an optional block to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableOutput(forBlock: Nullable<NodeMaterialBlock> = null) {\r\n for (const output of this._outputs) {\r\n if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) {\r\n return output;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the sibling of the given output\r\n * @param current defines the current output\r\n * @returns the next output in the list or null\r\n */\r\n public getSiblingOutput(current: NodeMaterialConnectionPoint) {\r\n const index = this._outputs.indexOf(current);\r\n\r\n if (index === -1 || index >= this._outputs.length) {\r\n return null;\r\n }\r\n\r\n return this._outputs[index + 1];\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeMaterialBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Connect current block with another block\r\n * @param other defines the block to connect with\r\n * @param options define the various options to help pick the right connections\r\n * @param options.input\r\n * @param options.output\r\n * @param options.outputSwizzle\r\n * @returns the current block\r\n */\r\n public connectTo(\r\n other: NodeMaterialBlock,\r\n options?: {\r\n input?: string;\r\n output?: string;\r\n outputSwizzle?: string;\r\n }\r\n ) {\r\n if (this._outputs.length === 0) {\r\n return;\r\n }\r\n\r\n let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other);\r\n\r\n let notFound = true;\r\n while (notFound) {\r\n const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output);\r\n\r\n if (output && input && output.canConnectTo(input)) {\r\n output.connectTo(input);\r\n notFound = false;\r\n } else if (!output) {\r\n throw \"Unable to find a compatible match\";\r\n } else {\r\n output = this.getSiblingOutput(output);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n /**\r\n * Add uniforms, samplers and uniform buffers at compilation time\r\n * @param state defines the state to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param uniformBuffers defines the list of uniform buffer names\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Add potential fallbacks if shader compilation fails\r\n * @param mesh defines the mesh to be rendered\r\n * @param fallbacks defines the current prioritized list of fallbacks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public provideFallbacks(mesh: AbstractMesh, fallbacks: EffectFallbacks) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Initialize defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initializeDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {}\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @param subMesh defines which submesh to render\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n * @param material defines the hosting NodeMaterial\r\n * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Function called when a block is declared as repeatable content generator\r\n * @param vertexShaderState defines the current compilation state for the vertex shader\r\n * @param fragmentShaderState defines the current compilation state for the fragment shader\r\n * @param mesh defines the mesh to be rendered\r\n * @param defines defines the material defines to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, fragmentShaderState: NodeMaterialBuildState, mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n }\r\n\r\n /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */\r\n public get willBeGeneratedIntoVertexShaderFromFragmentShader(): boolean {\r\n if (this.isInput || this.isFinalMerger) {\r\n return false;\r\n }\r\n\r\n if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) {\r\n if (this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the block is ready\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @returns true if the block is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {\r\n return true;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n private _processBuild(block: NodeMaterialBlock, state: NodeMaterialBuildState, input: NodeMaterialConnectionPoint, activeBlocks: NodeMaterialBlock[]) {\r\n block.build(state, activeBlocks);\r\n\r\n const localBlockIsFragment = state._vertexState != null;\r\n const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n if (\r\n localBlockIsFragment &&\r\n ((block.target & block._buildTarget) === 0 ||\r\n (block.target & input.target) === 0 ||\r\n (this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader))\r\n ) {\r\n // context switch! We need a varying\r\n if (\r\n (!block.isInput && state.target !== block._buildTarget) || // block was already emitted by vertex shader\r\n (block.isInput && (block as InputBlock).isAttribute && !(block as InputBlock)._noContextSwitch) // block is an attribute\r\n ) {\r\n const connectedPoint = input.connectedPoint!;\r\n if (state._vertexState._emitVaryingFromString(\"v_\" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) {\r\n state._vertexState.compilationString += `${\"v_\" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName};\\n`;\r\n }\r\n input.associatedVariableName = \"v_\" + connectedPoint.associatedVariableName;\r\n input._enforceAssociatedVariableName = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validates the new name for the block node.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n const reservedNames: Array<string> = [\r\n \"position\",\r\n \"normal\",\r\n \"tangent\",\r\n \"particle_positionw\",\r\n \"uv\",\r\n \"uv2\",\r\n \"uv3\",\r\n \"uv4\",\r\n \"uv5\",\r\n \"uv6\",\r\n \"position2d\",\r\n \"particle_uv\",\r\n \"matricesIndices\",\r\n \"matricesWeights\",\r\n \"world0\",\r\n \"world1\",\r\n \"world2\",\r\n \"world3\",\r\n \"particle_color\",\r\n \"particle_texturemask\",\r\n ];\r\n for (const reservedName of reservedNames) {\r\n if (newName === reservedName) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Compile the current node and generate the shader code\r\n * @param state defines the current compilation state (uniforms, samplers, current string)\r\n * @param activeBlocks defines the list of active blocks (i.e. blocks to compile)\r\n * @returns true if already built\r\n */\r\n public build(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): boolean {\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true;\r\n }\r\n\r\n if (!this.isInput) {\r\n /** Prepare outputs */\r\n for (const output of this._outputs) {\r\n if (!output.associatedVariableName) {\r\n output.associatedVariableName = state._getFreeVariableName(output.name);\r\n }\r\n }\r\n }\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n if (this.target !== NodeMaterialBlockTargets.Neutral) {\r\n if ((input.target & this.target!) === 0) {\r\n continue;\r\n }\r\n\r\n if ((input.target & state.target!) === 0) {\r\n continue;\r\n }\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n this._processBuild(block, state, input, activeBlocks);\r\n }\r\n }\r\n\r\n this._customBuildStep(state, activeBlocks);\r\n\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true; // Need to check again as inputs can be connected multiple time to this endpoint\r\n }\r\n\r\n // Logs\r\n if (state.sharedData.verbose) {\r\n console.log(`${state.target === NodeMaterialBlockTargets.Vertex ? \"Vertex shader\" : \"Fragment shader\"}: Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n // Checks final outputs\r\n if (this.isFinalMerger) {\r\n switch (state.target) {\r\n case NodeMaterialBlockTargets.Vertex:\r\n state.sharedData.checks.emitVertex = true;\r\n break;\r\n case NodeMaterialBlockTargets.Fragment:\r\n state.sharedData.checks.emitFragment = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.isInput && state.sharedData.emitComments) {\r\n state.compilationString += `\\n//${this.name}\\n`;\r\n }\r\n\r\n this._buildBlock(state);\r\n\r\n this._buildId = state.sharedData.buildId;\r\n this._buildTarget = state.target;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n if ((output.target & state.target) === 0) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) {\r\n this._processBuild(block, state, endpoint, activeBlocks);\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleInInspector = ${this.visibleInInspector};\\n${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n${variableName}.target = ${this.target};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}(\"${this.name}\");\\n`;\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a copy of the current block\r\n */\r\n public clone(scene: Scene, rootUrl: string = \"\") {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(serializationObject, scene, rootUrl);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.comments = this.comments;\r\n serializationObject.visibleInInspector = this.visibleInInspector;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n serializationObject.target = this.target;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this.name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleInInspector = !!serializationObject.visibleInInspector;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._target = serializationObject.target ?? this.target;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.inputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.inputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.inputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"nodeMaterialBlock.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Node/nodeMaterialBlock.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeMaterialBlockConnectionPointTypes } from \"./Enums/nodeMaterialBlockConnectionPointTypes\";\r\nimport type { NodeMaterialBuildState } from \"./nodeMaterialBuildState\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { NodeMaterialConnectionPoint, NodeMaterialConnectionPointDirection } from \"./nodeMaterialBlockConnectionPoint\";\r\nimport { NodeMaterialBlockTargets } from \"./Enums/nodeMaterialBlockTargets\";\r\nimport type { Effect } from \"../effect\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { SubMesh } from \"../../Meshes/subMesh\";\r\nimport type { NodeMaterial, NodeMaterialDefines } from \"./nodeMaterial\";\r\nimport type { InputBlock } from \"./Blocks/Input/inputBlock\";\r\nimport { UniqueIdGenerator } from \"../../Misc/uniqueIdGenerator\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { GetClass } from \"../../Misc/typeStore\";\r\nimport type { EffectFallbacks } from \"../effectFallbacks\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * Defines a block that can be used inside a node based material\r\n */\r\nexport class NodeMaterialBlock {\r\n private _buildId: number;\r\n private _buildTarget: NodeMaterialBlockTargets;\r\n protected _target: NodeMaterialBlockTargets;\r\n private _isFinalMerger = false;\r\n private _isInput = false;\r\n private _isTeleportOut = false;\r\n private _isTeleportIn = false;\r\n private _name = \"\";\r\n protected _isUnique = false;\r\n\r\n /** Gets or sets a boolean indicating that only one input can be connected at a time */\r\n public inputsAreExclusive = false;\r\n\r\n /** @internal */\r\n public _codeVariableName = \"\";\r\n\r\n /** @internal */\r\n public _inputs = new Array<NodeMaterialConnectionPoint>();\r\n /** @internal */\r\n public _outputs = new Array<NodeMaterialConnectionPoint>();\r\n\r\n /** @internal */\r\n public _preparationId: number;\r\n\r\n /** @internal */\r\n public readonly _originalTargetIsNeutral: boolean;\r\n\r\n /**\r\n * Gets the name of the block\r\n */\r\n public get name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Sets the name of the block. Will check if the name is valid.\r\n */\r\n public set name(newName: string) {\r\n if (!this.validateBlockName(newName)) {\r\n return;\r\n }\r\n\r\n this._name = newName;\r\n }\r\n\r\n /**\r\n * Gets or sets the unique id of the node\r\n */\r\n public uniqueId: number;\r\n\r\n /**\r\n * Gets or sets the comments associated with this block\r\n */\r\n public comments: string = \"\";\r\n\r\n /**\r\n * Gets a boolean indicating that this block can only be used once per NodeMaterial\r\n */\r\n public get isUnique() {\r\n return this._isUnique;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value)\r\n */\r\n public get isFinalMerger(): boolean {\r\n return this._isFinalMerger;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader)\r\n */\r\n public get isInput(): boolean {\r\n return this._isInput;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport out\r\n */\r\n public get isTeleportOut(): boolean {\r\n return this._isTeleportOut;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if this block is a teleport in\r\n */\r\n public get isTeleportIn(): boolean {\r\n return this._isTeleportIn;\r\n }\r\n\r\n /**\r\n * Gets or sets the build Id\r\n */\r\n public get buildId(): number {\r\n return this._buildId;\r\n }\r\n\r\n public set buildId(value: number) {\r\n this._buildId = value;\r\n }\r\n\r\n /**\r\n * Gets or sets the target of the block\r\n */\r\n public get target() {\r\n return this._target;\r\n }\r\n\r\n public set target(value: NodeMaterialBlockTargets) {\r\n if ((this._target & value) !== 0) {\r\n return;\r\n }\r\n this._target = value;\r\n }\r\n\r\n /**\r\n * Gets the list of input points\r\n */\r\n public get inputs(): NodeMaterialConnectionPoint[] {\r\n return this._inputs;\r\n }\r\n\r\n /** Gets the list of output points */\r\n public get outputs(): NodeMaterialConnectionPoint[] {\r\n return this._outputs;\r\n }\r\n\r\n /**\r\n * Find an input by its name\r\n * @param name defines the name of the input to look for\r\n * @returns the input or null if not found\r\n */\r\n public getInputByName(name: string) {\r\n const filter = this._inputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Find an output by its name\r\n * @param name defines the name of the output to look for\r\n * @returns the output or null if not found\r\n */\r\n public getOutputByName(name: string) {\r\n const filter = this._outputs.filter((e) => e.name === name);\r\n\r\n if (filter.length) {\r\n return filter[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited in the Inspector (false by default) */\r\n public visibleInInspector = false;\r\n\r\n /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */\r\n public visibleOnFrame = false;\r\n\r\n /**\r\n * Creates a new NodeMaterialBlock\r\n * @param name defines the block name\r\n * @param target defines the target of that block (Vertex by default)\r\n * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false\r\n */\r\n public constructor(name: string, target = NodeMaterialBlockTargets.Vertex, isFinalMerger = false) {\r\n this._target = target;\r\n this._originalTargetIsNeutral = target === NodeMaterialBlockTargets.Neutral;\r\n this._isFinalMerger = isFinalMerger;\r\n this._isInput = this.getClassName() === \"InputBlock\";\r\n this._isTeleportOut = this.getClassName() === \"NodeMaterialTeleportOutBlock\";\r\n this._isTeleportIn = this.getClassName() === \"NodeMaterialTeleportInBlock\";\r\n this._name = name;\r\n this.uniqueId = UniqueIdGenerator.UniqueId;\r\n }\r\n\r\n /** @internal */\r\n public _setInitialTarget(target: NodeMaterialBlockTargets): void {\r\n this._target = target;\r\n (this._originalTargetIsNeutral as boolean) = target === NodeMaterialBlockTargets.Neutral;\r\n }\r\n\r\n /**\r\n * Initialize the block and prepare the context for build\r\n * @param state defines the state that will be used for the build\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initialize(state: NodeMaterialBuildState) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Bind data to effect. Will only be called for blocks with isBindable === true\r\n * @param effect defines the effect to bind data to\r\n * @param nodeMaterial defines the hosting NodeMaterial\r\n * @param mesh defines the mesh that will be rendered\r\n * @param subMesh defines the submesh that will be rendered\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n protected _declareOutput(output: NodeMaterialConnectionPoint, state: NodeMaterialBuildState): string {\r\n return `${state._getGLType(output.type)} ${output.associatedVariableName}`;\r\n }\r\n\r\n protected _writeVariable(currentPoint: NodeMaterialConnectionPoint): string {\r\n const connectionPoint = currentPoint.connectedPoint;\r\n\r\n if (connectionPoint) {\r\n return `${currentPoint.associatedVariableName}`;\r\n }\r\n\r\n return `0.`;\r\n }\r\n\r\n protected _writeFloat(value: number) {\r\n let stringVersion = value.toString();\r\n\r\n if (stringVersion.indexOf(\".\") === -1) {\r\n stringVersion += \".0\";\r\n }\r\n return `${stringVersion}`;\r\n }\r\n\r\n /**\r\n * Gets the current class name e.g. \"NodeMaterialBlock\"\r\n * @returns the class name\r\n */\r\n public getClassName() {\r\n return \"NodeMaterialBlock\";\r\n }\r\n\r\n /** Gets a boolean indicating that this connection will be used in the fragment shader */\r\n public isConnectedInFragmentShader() {\r\n return this.outputs.some((o) => o.isConnectedInFragmentShader);\r\n }\r\n\r\n /**\r\n * Register a new input. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param isOptional defines a boolean indicating that this input can be omitted\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerInput(\r\n name: string,\r\n type: NodeMaterialBlockConnectionPointTypes,\r\n isOptional: boolean = false,\r\n target?: NodeMaterialBlockTargets,\r\n point?: NodeMaterialConnectionPoint\r\n ) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Input);\r\n point.type = type;\r\n point.isOptional = isOptional;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._inputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Register a new output. Must be called inside a block constructor\r\n * @param name defines the connection point name\r\n * @param type defines the connection point type\r\n * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)\r\n * @param point an already created connection point. If not provided, create a new one\r\n * @returns the current block\r\n */\r\n public registerOutput(name: string, type: NodeMaterialBlockConnectionPointTypes, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint) {\r\n point = point ?? new NodeMaterialConnectionPoint(name, this, NodeMaterialConnectionPointDirection.Output);\r\n point.type = type;\r\n if (target) {\r\n point.target = target;\r\n }\r\n\r\n this._outputs.push(point);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Will return the first available input e.g. the first one which is not an uniform or an attribute\r\n * @param forOutput defines an optional connection point to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableInput(forOutput: Nullable<NodeMaterialConnectionPoint> = null) {\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!forOutput || forOutput.type === input.type || input.type === NodeMaterialBlockConnectionPointTypes.AutoDetect) {\r\n return input;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Will return the first available output e.g. the first one which is not yet connected and not a varying\r\n * @param forBlock defines an optional block to check compatibility with\r\n * @returns the first available input or null\r\n */\r\n public getFirstAvailableOutput(forBlock: Nullable<NodeMaterialBlock> = null) {\r\n for (const output of this._outputs) {\r\n if (!forBlock || !forBlock.target || forBlock.target === NodeMaterialBlockTargets.Neutral || (forBlock.target & output.target) !== 0) {\r\n return output;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the sibling of the given output\r\n * @param current defines the current output\r\n * @returns the next output in the list or null\r\n */\r\n public getSiblingOutput(current: NodeMaterialConnectionPoint) {\r\n const index = this._outputs.indexOf(current);\r\n\r\n if (index === -1 || index >= this._outputs.length) {\r\n return null;\r\n }\r\n\r\n return this._outputs[index + 1];\r\n }\r\n\r\n /**\r\n * Checks if the current block is an ancestor of a given block\r\n * @param block defines the potential descendant block to check\r\n * @returns true if block is a descendant\r\n */\r\n public isAnAncestorOf(block: NodeMaterialBlock): boolean {\r\n for (const output of this._outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n if (endpoint.ownerBlock === block) {\r\n return true;\r\n }\r\n if (endpoint.ownerBlock.isAnAncestorOf(block)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Connect current block with another block\r\n * @param other defines the block to connect with\r\n * @param options define the various options to help pick the right connections\r\n * @param options.input\r\n * @param options.output\r\n * @param options.outputSwizzle\r\n * @returns the current block\r\n */\r\n public connectTo(\r\n other: NodeMaterialBlock,\r\n options?: {\r\n input?: string;\r\n output?: string;\r\n outputSwizzle?: string;\r\n }\r\n ) {\r\n if (this._outputs.length === 0) {\r\n return;\r\n }\r\n\r\n let output = options && options.output ? this.getOutputByName(options.output) : this.getFirstAvailableOutput(other);\r\n\r\n let notFound = true;\r\n while (notFound) {\r\n const input = options && options.input ? other.getInputByName(options.input) : other.getFirstAvailableInput(output);\r\n\r\n if (output && input && output.canConnectTo(input)) {\r\n output.connectTo(input);\r\n notFound = false;\r\n } else if (!output) {\r\n throw \"Unable to find a compatible match\";\r\n } else {\r\n output = this.getSiblingOutput(output);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _buildBlock(state: NodeMaterialBuildState) {\r\n // Empty. Must be defined by child nodes\r\n }\r\n\r\n /**\r\n * Add uniforms, samplers and uniform buffers at compilation time\r\n * @param state defines the state to update\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param uniformBuffers defines the list of uniform buffer names\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Add potential fallbacks if shader compilation fails\r\n * @param mesh defines the mesh to be rendered\r\n * @param fallbacks defines the current prioritized list of fallbacks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public provideFallbacks(mesh: AbstractMesh, fallbacks: EffectFallbacks) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Initialize defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public initializeDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {}\r\n\r\n /**\r\n * Update defines for shader compilation\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @param subMesh defines which submesh to render\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public prepareDefines(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false, subMesh?: SubMesh) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Lets the block try to connect some inputs automatically\r\n * @param material defines the hosting NodeMaterial\r\n * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public autoConfigure(material: NodeMaterial, additionalFilteringInfo: (node: NodeMaterialBlock) => boolean = () => true) {\r\n // Do nothing\r\n }\r\n\r\n /**\r\n * Function called when a block is declared as repeatable content generator\r\n * @param vertexShaderState defines the current compilation state for the vertex shader\r\n * @param fragmentShaderState defines the current compilation state for the fragment shader\r\n * @param mesh defines the mesh to be rendered\r\n * @param defines defines the material defines to update\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, fragmentShaderState: NodeMaterialBuildState, mesh: AbstractMesh, defines: NodeMaterialDefines) {\r\n // Do nothing\r\n }\r\n\r\n /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */\r\n public get willBeGeneratedIntoVertexShaderFromFragmentShader(): boolean {\r\n if (this.isInput || this.isFinalMerger) {\r\n return false;\r\n }\r\n\r\n if (this._outputs.some((o) => o.isDirectlyConnectedToVertexOutput)) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.Vertex) {\r\n return false;\r\n }\r\n\r\n if (this.target === NodeMaterialBlockTargets.VertexAndFragment || this.target === NodeMaterialBlockTargets.Neutral) {\r\n if (this._outputs.some((o) => o.isConnectedInVertexShader)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if the block is ready\r\n * @param mesh defines the mesh to be rendered\r\n * @param nodeMaterial defines the node material requesting the update\r\n * @param defines defines the material defines to update\r\n * @param useInstances specifies that instances should be used\r\n * @returns true if the block is ready\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances: boolean = false) {\r\n return true;\r\n }\r\n\r\n protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling = false) {\r\n if (looseCoupling) {\r\n this._inputs[inputIndex1]._acceptedConnectionPointType = this._inputs[inputIndex0];\r\n } else {\r\n this._inputs[inputIndex0]._linkedConnectionSource = this._inputs[inputIndex1];\r\n }\r\n this._inputs[inputIndex1]._linkedConnectionSource = this._inputs[inputIndex0];\r\n }\r\n\r\n private _processBuild(block: NodeMaterialBlock, state: NodeMaterialBuildState, input: NodeMaterialConnectionPoint, activeBlocks: NodeMaterialBlock[]) {\r\n block.build(state, activeBlocks);\r\n\r\n const localBlockIsFragment = state._vertexState != null;\r\n const otherBlockWasGeneratedInVertexShader = block._buildTarget === NodeMaterialBlockTargets.Vertex && block.target !== NodeMaterialBlockTargets.VertexAndFragment;\r\n\r\n if (\r\n localBlockIsFragment &&\r\n ((block.target & block._buildTarget) === 0 ||\r\n (block.target & input.target) === 0 ||\r\n (this.target !== NodeMaterialBlockTargets.VertexAndFragment && otherBlockWasGeneratedInVertexShader))\r\n ) {\r\n // context switch! We need a varying\r\n if (\r\n (!block.isInput && state.target !== block._buildTarget) || // block was already emitted by vertex shader\r\n (block.isInput && (block as InputBlock).isAttribute && !(block as InputBlock)._noContextSwitch) // block is an attribute\r\n ) {\r\n const connectedPoint = input.connectedPoint!;\r\n if (state._vertexState._emitVaryingFromString(\"v_\" + connectedPoint.associatedVariableName, state._getGLType(connectedPoint.type))) {\r\n state._vertexState.compilationString += `${\"v_\" + connectedPoint.associatedVariableName} = ${connectedPoint.associatedVariableName};\\n`;\r\n }\r\n input.associatedVariableName = \"v_\" + connectedPoint.associatedVariableName;\r\n input._enforceAssociatedVariableName = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validates the new name for the block node.\r\n * @param newName the new name to be given to the node.\r\n * @returns false if the name is a reserve word, else true.\r\n */\r\n public validateBlockName(newName: string) {\r\n const reservedNames: Array<string> = [\r\n \"position\",\r\n \"normal\",\r\n \"tangent\",\r\n \"particle_positionw\",\r\n \"uv\",\r\n \"uv2\",\r\n \"uv3\",\r\n \"uv4\",\r\n \"uv5\",\r\n \"uv6\",\r\n \"position2d\",\r\n \"particle_uv\",\r\n \"matricesIndices\",\r\n \"matricesWeights\",\r\n \"world0\",\r\n \"world1\",\r\n \"world2\",\r\n \"world3\",\r\n \"particle_color\",\r\n \"particle_texturemask\",\r\n ];\r\n for (const reservedName of reservedNames) {\r\n if (newName === reservedName) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void {\r\n // Must be implemented by children\r\n }\r\n\r\n /**\r\n * Compile the current node and generate the shader code\r\n * @param state defines the current compilation state (uniforms, samplers, current string)\r\n * @param activeBlocks defines the list of active blocks (i.e. blocks to compile)\r\n * @returns true if already built\r\n */\r\n public build(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): boolean {\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true;\r\n }\r\n\r\n if (!this.isInput) {\r\n /** Prepare outputs */\r\n for (const output of this._outputs) {\r\n if (!output.associatedVariableName) {\r\n output.associatedVariableName = state._getFreeVariableName(output.name);\r\n }\r\n }\r\n }\r\n\r\n // Check if \"parent\" blocks are compiled\r\n for (const input of this._inputs) {\r\n if (!input.connectedPoint) {\r\n if (!input.isOptional) {\r\n // Emit a warning\r\n state.sharedData.checks.notConnectedNonOptionalInputs.push(input);\r\n }\r\n continue;\r\n }\r\n\r\n if (this.target !== NodeMaterialBlockTargets.Neutral) {\r\n if ((input.target & this.target!) === 0) {\r\n continue;\r\n }\r\n\r\n if ((input.target & state.target!) === 0) {\r\n continue;\r\n }\r\n }\r\n\r\n const block = input.connectedPoint.ownerBlock;\r\n if (block && block !== this) {\r\n this._processBuild(block, state, input, activeBlocks);\r\n }\r\n }\r\n\r\n this._customBuildStep(state, activeBlocks);\r\n\r\n if (this._buildId === state.sharedData.buildId) {\r\n return true; // Need to check again as inputs can be connected multiple time to this endpoint\r\n }\r\n\r\n // Logs\r\n if (state.sharedData.verbose) {\r\n Logger.Log(`${state.target === NodeMaterialBlockTargets.Vertex ? \"Vertex shader\" : \"Fragment shader\"}: Building ${this.name} [${this.getClassName()}]`);\r\n }\r\n\r\n // Checks final outputs\r\n if (this.isFinalMerger) {\r\n switch (state.target) {\r\n case NodeMaterialBlockTargets.Vertex:\r\n state.sharedData.checks.emitVertex = true;\r\n break;\r\n case NodeMaterialBlockTargets.Fragment:\r\n state.sharedData.checks.emitFragment = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!this.isInput && state.sharedData.emitComments) {\r\n state.compilationString += `\\n//${this.name}\\n`;\r\n }\r\n\r\n this._buildBlock(state);\r\n\r\n this._buildId = state.sharedData.buildId;\r\n this._buildTarget = state.target;\r\n\r\n // Compile connected blocks\r\n for (const output of this._outputs) {\r\n if ((output.target & state.target) === 0) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const block = endpoint.ownerBlock;\r\n\r\n if (block && (block.target & state.target) !== 0 && activeBlocks.indexOf(block) !== -1) {\r\n this._processBuild(block, state, endpoint, activeBlocks);\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n protected _inputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _outputRename(name: string) {\r\n return name;\r\n }\r\n\r\n protected _dumpPropertiesCode() {\r\n const variableName = this._codeVariableName;\r\n return `${variableName}.visibleInInspector = ${this.visibleInInspector};\\n${variableName}.visibleOnFrame = ${this.visibleOnFrame};\\n${variableName}.target = ${this.target};\\n`;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]) {\r\n alreadyDumped.push(this);\r\n\r\n // Get unique name\r\n const nameAsVariableName = this.name.replace(/[^A-Za-z_]+/g, \"\");\r\n this._codeVariableName = nameAsVariableName || `${this.getClassName()}_${this.uniqueId}`;\r\n\r\n if (uniqueNames.indexOf(this._codeVariableName) !== -1) {\r\n let index = 0;\r\n do {\r\n index++;\r\n this._codeVariableName = nameAsVariableName + index;\r\n } while (uniqueNames.indexOf(this._codeVariableName) !== -1);\r\n }\r\n\r\n uniqueNames.push(this._codeVariableName);\r\n\r\n // Declaration\r\n let codeString = `\\n// ${this.getClassName()}\\n`;\r\n if (this.comments) {\r\n codeString += `// ${this.comments}\\n`;\r\n }\r\n codeString += `var ${this._codeVariableName} = new BABYLON.${this.getClassName()}(\"${this.name}\");\\n`;\r\n\r\n // Properties\r\n codeString += this._dumpPropertiesCode();\r\n\r\n // Inputs\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n if (alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n\r\n // Outputs\r\n for (const output of this.outputs) {\r\n if (!output.hasEndpoints) {\r\n continue;\r\n }\r\n\r\n for (const endpoint of output.endpoints) {\r\n const connectedBlock = endpoint.ownerBlock;\r\n if (connectedBlock && alreadyDumped.indexOf(connectedBlock) === -1) {\r\n codeString += connectedBlock._dumpCode(uniqueNames, alreadyDumped);\r\n }\r\n }\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]) {\r\n let codeString = \"\";\r\n\r\n if (alreadyDumped.indexOf(this) !== -1) {\r\n return codeString;\r\n }\r\n\r\n alreadyDumped.push(this);\r\n\r\n for (const input of this.inputs) {\r\n if (!input.isConnected) {\r\n continue;\r\n }\r\n\r\n const connectedOutput = input.connectedPoint!;\r\n const connectedBlock = connectedOutput.ownerBlock;\r\n\r\n codeString += connectedBlock._dumpCodeForOutputConnections(alreadyDumped);\r\n codeString += `${connectedBlock._codeVariableName}.${connectedBlock._outputRename(connectedOutput.name)}.connectTo(${this._codeVariableName}.${this._inputRename(\r\n input.name\r\n )});\\n`;\r\n }\r\n\r\n return codeString;\r\n }\r\n\r\n /**\r\n * Clone the current block to a new identical block\r\n * @param scene defines the hosting scene\r\n * @param rootUrl defines the root URL to use to load textures and relative dependencies\r\n * @returns a copy of the current block\r\n */\r\n public clone(scene: Scene, rootUrl: string = \"\") {\r\n const serializationObject = this.serialize();\r\n\r\n const blockType = GetClass(serializationObject.customType);\r\n if (blockType) {\r\n const block: NodeMaterialBlock = new blockType();\r\n block._deserialize(serializationObject, scene, rootUrl);\r\n\r\n return block;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Serializes this block in a JSON representation\r\n * @returns the serialized block object\r\n */\r\n public serialize(): any {\r\n const serializationObject: any = {};\r\n serializationObject.customType = \"BABYLON.\" + this.getClassName();\r\n serializationObject.id = this.uniqueId;\r\n serializationObject.name = this.name;\r\n serializationObject.comments = this.comments;\r\n serializationObject.visibleInInspector = this.visibleInInspector;\r\n serializationObject.visibleOnFrame = this.visibleOnFrame;\r\n serializationObject.target = this.target;\r\n\r\n serializationObject.inputs = [];\r\n serializationObject.outputs = [];\r\n\r\n for (const input of this.inputs) {\r\n serializationObject.inputs.push(input.serialize());\r\n }\r\n\r\n for (const output of this.outputs) {\r\n serializationObject.outputs.push(output.serialize(false));\r\n }\r\n\r\n return serializationObject;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public _deserialize(serializationObject: any, scene: Scene, rootUrl: string) {\r\n this.name = serializationObject.name;\r\n this.comments = serializationObject.comments;\r\n this.visibleInInspector = !!serializationObject.visibleInInspector;\r\n this.visibleOnFrame = !!serializationObject.visibleOnFrame;\r\n this._target = serializationObject.target ?? this.target;\r\n this._deserializePortDisplayNamesAndExposedOnFrame(serializationObject);\r\n }\r\n\r\n private _deserializePortDisplayNamesAndExposedOnFrame(serializationObject: any) {\r\n const serializedInputs = serializationObject.inputs;\r\n const serializedOutputs = serializationObject.outputs;\r\n if (serializedInputs) {\r\n serializedInputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.inputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.inputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.inputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n if (serializedOutputs) {\r\n serializedOutputs.forEach((port: any, i: number) => {\r\n if (port.displayName) {\r\n this.outputs[i].displayName = port.displayName;\r\n }\r\n if (port.isExposedOnFrame) {\r\n this.outputs[i].isExposedOnFrame = port.isExposedOnFrame;\r\n this.outputs[i].exposedPortPosition = port.exposedPortPosition;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Release resources\r\n */\r\n public dispose() {\r\n for (const input of this.inputs) {\r\n input.dispose();\r\n }\r\n\r\n for (const output of this.outputs) {\r\n output.dispose();\r\n }\r\n }\r\n}\r\n"]}
@@ -85,6 +85,10 @@ export interface IMultiRenderTargetOptions {
85
85
  * Define the names of the textures (used for debugging purpose)
86
86
  */
87
87
  labels?: string[];
88
+ /**
89
+ * Label of the RenderTargetWrapper (used for debugging only)
90
+ */
91
+ label?: string;
88
92
  }
89
93
  /**
90
94
  * A multi render target, like a render target provides the ability to render to a texture.
@@ -108,6 +108,7 @@ export class MultiRenderTarget extends RenderTargetTexture {
108
108
  layerIndex: layerIndex,
109
109
  layerCounts: layerCounts,
110
110
  labels: textureNames,
111
+ label: name,
111
112
  };
112
113
  this._count = count;
113
114
  this._drawOnlyOnFirstAttachmentByDefault = drawOnlyOnFirstAttachmentByDefault;
@@ -1 +1 @@
1
- {"version":3,"file":"multiRenderTarget.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/multiRenderTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../../scene\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\nimport \"../../Engines/Extensions/engine.multiRender\";\r\nimport type { InternalTexture } from \"./internalTexture\";\r\n\r\n/**\r\n * Creation options of the multi render target texture.\r\n */\r\nexport interface IMultiRenderTargetOptions {\r\n /**\r\n * Define if the texture needs to create mip maps after render.\r\n */\r\n generateMipMaps?: boolean;\r\n /**\r\n * Define the types of all the draw buffers (render textures) we want to create\r\n */\r\n types?: number[];\r\n /**\r\n * Define the sampling modes of all the draw buffers (render textures) we want to create\r\n */\r\n samplingModes?: number[];\r\n /**\r\n * Define if sRGB format should be used for each of the draw buffers (render textures) we want to create\r\n */\r\n useSRGBBuffers?: boolean[];\r\n /**\r\n * Define if a depth buffer is required\r\n */\r\n generateDepthBuffer?: boolean;\r\n /**\r\n * Define if a stencil buffer is required\r\n */\r\n generateStencilBuffer?: boolean;\r\n /**\r\n * Define if a depth texture is required instead of a depth buffer\r\n */\r\n generateDepthTexture?: boolean;\r\n /**\r\n * Define the internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) of all the draw buffers (render textures) we want to create\r\n */\r\n formats?: number[];\r\n /**\r\n * Define depth texture format to use\r\n */\r\n depthTextureFormat?: number;\r\n /**\r\n * Define the number of desired draw buffers (render textures)\r\n */\r\n textureCount?: number;\r\n /**\r\n * Define if aspect ratio should be adapted to the texture or stay the scene one\r\n */\r\n doNotChangeAspectRatio?: boolean;\r\n /**\r\n * Define the default type of the buffers we are creating\r\n */\r\n defaultType?: number;\r\n /**\r\n * Define the default type of the buffers we are creating\r\n */\r\n drawOnlyOnFirstAttachmentByDefault?: boolean;\r\n /**\r\n * Define the type of texture at each attahment index (of Constants.TEXTURE_2D, .TEXTURE_2D_ARRAY, .TEXTURE_CUBE_MAP, .TEXTURE_CUBE_MAP_ARRAY, .TEXTURE_3D).\r\n * You can also use the -1 value to indicate that no texture should be created but that you will assign a texture to that attachment index later.\r\n * Can be useful when you want to attach several layers of the same 2DArrayTexture / 3DTexture or several faces of the same CubeMapTexture: Use the setInternalTexture\r\n * method for that purpose, after the MultiRenderTarget has been created.\r\n */\r\n targetTypes?: number[];\r\n /**\r\n * Define the face index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_CUBE_MAP and .TEXTURE_CUBE_MAP_ARRAY).\r\n * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex\r\n */\r\n faceIndex?: number[];\r\n /**\r\n * Define the layer index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY).\r\n * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex\r\n */\r\n layerIndex?: number[];\r\n /**\r\n * Define the number of layer of each texture in the textures array (if applicable, given the corresponding targetType) (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY)\r\n */\r\n layerCounts?: number[];\r\n /**\r\n * Define the names of the textures (used for debugging purpose)\r\n */\r\n labels?: string[];\r\n}\r\n\r\n/**\r\n * A multi render target, like a render target provides the ability to render to a texture.\r\n * Unlike the render target, it can render to several draw buffers (render textures) in one draw.\r\n * This is specially interesting in deferred rendering or for any effects requiring more than\r\n * just one color from a single pass.\r\n */\r\nexport class MultiRenderTarget extends RenderTargetTexture {\r\n private _textures: Texture[];\r\n private _multiRenderTargetOptions: IMultiRenderTargetOptions;\r\n private _count: number;\r\n private _drawOnlyOnFirstAttachmentByDefault: boolean;\r\n private _textureNames?: string[];\r\n\r\n /**\r\n * Get if draw buffers (render textures) are currently supported by the used hardware and browser.\r\n */\r\n public get isSupported(): boolean {\r\n return this._engine?.getCaps().drawBuffersExtension ?? false;\r\n }\r\n\r\n /**\r\n * Get the list of textures generated by the multi render target.\r\n */\r\n public get textures(): Texture[] {\r\n return this._textures;\r\n }\r\n\r\n /**\r\n * Gets the number of textures in this MRT. This number can be different from `_textures.length` in case a depth texture is generated.\r\n */\r\n public get count(): number {\r\n return this._count;\r\n }\r\n\r\n /**\r\n * Get the depth texture generated by the multi render target if options.generateDepthTexture has been set\r\n */\r\n public get depthTexture(): Texture {\r\n return this._textures[this._textures.length - 1];\r\n }\r\n\r\n /**\r\n * Set the wrapping mode on U of all the textures we are rendering to.\r\n * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)\r\n */\r\n public set wrapU(wrap: number) {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i].wrapU = wrap;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the wrapping mode on V of all the textures we are rendering to.\r\n * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)\r\n */\r\n public set wrapV(wrap: number) {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i].wrapV = wrap;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Instantiate a new multi render target texture.\r\n * A multi render target, like a render target provides the ability to render to a texture.\r\n * Unlike the render target, it can render to several draw buffers (render textures) in one draw.\r\n * This is specially interesting in deferred rendering or for any effects requiring more than\r\n * just one color from a single pass.\r\n * @param name Define the name of the texture\r\n * @param size Define the size of the buffers to render to\r\n * @param count Define the number of target we are rendering into\r\n * @param scene Define the scene the texture belongs to\r\n * @param options Define the options used to create the multi render target\r\n * @param textureNames Define the names to set to the textures (if count \\> 0 - optional)\r\n */\r\n constructor(name: string, size: any, count: number, scene?: Scene, options?: IMultiRenderTargetOptions, textureNames?: string[]) {\r\n const generateMipMaps = options && options.generateMipMaps ? options.generateMipMaps : false;\r\n const generateDepthTexture = options && options.generateDepthTexture ? options.generateDepthTexture : false;\r\n const depthTextureFormat = options && options.depthTextureFormat ? options.depthTextureFormat : Constants.TEXTUREFORMAT_DEPTH16;\r\n const doNotChangeAspectRatio = !options || options.doNotChangeAspectRatio === undefined ? true : options.doNotChangeAspectRatio;\r\n const drawOnlyOnFirstAttachmentByDefault = options && options.drawOnlyOnFirstAttachmentByDefault ? options.drawOnlyOnFirstAttachmentByDefault : false;\r\n super(name, size, scene, generateMipMaps, doNotChangeAspectRatio, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true);\r\n\r\n if (!this.isSupported) {\r\n this.dispose();\r\n return;\r\n }\r\n\r\n this._textureNames = textureNames;\r\n\r\n const types: number[] = [];\r\n const samplingModes: number[] = [];\r\n const useSRGBBuffers: boolean[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n this._initTypes(count, types, samplingModes, useSRGBBuffers, formats, targetTypes, faceIndex, layerIndex, layerCounts, options);\r\n\r\n const generateDepthBuffer = !options || options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n const generateStencilBuffer = !options || options.generateStencilBuffer === undefined ? false : options.generateStencilBuffer;\r\n\r\n this._multiRenderTargetOptions = {\r\n samplingModes: samplingModes,\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: generateDepthBuffer,\r\n generateStencilBuffer: generateStencilBuffer,\r\n generateDepthTexture: generateDepthTexture,\r\n depthTextureFormat: depthTextureFormat,\r\n types: types,\r\n textureCount: count,\r\n useSRGBBuffers: useSRGBBuffers,\r\n formats: formats,\r\n targetTypes: targetTypes,\r\n faceIndex: faceIndex,\r\n layerIndex: layerIndex,\r\n layerCounts: layerCounts,\r\n labels: textureNames,\r\n };\r\n\r\n this._count = count;\r\n this._drawOnlyOnFirstAttachmentByDefault = drawOnlyOnFirstAttachmentByDefault;\r\n\r\n if (count > 0) {\r\n this._createInternalTextures();\r\n this._createTextures(textureNames);\r\n }\r\n }\r\n\r\n private _initTypes(\r\n count: number,\r\n types: number[],\r\n samplingModes: number[],\r\n useSRGBBuffers: boolean[],\r\n formats: number[],\r\n targets: number[],\r\n faceIndex: number[],\r\n layerIndex: number[],\r\n layerCounts: number[],\r\n options?: IMultiRenderTargetOptions\r\n ) {\r\n for (let i = 0; i < count; i++) {\r\n if (options && options.types && options.types[i] !== undefined) {\r\n types.push(options.types[i]);\r\n } else {\r\n types.push(options && options.defaultType ? options.defaultType : Constants.TEXTURETYPE_UNSIGNED_INT);\r\n }\r\n\r\n if (options && options.samplingModes && options.samplingModes[i] !== undefined) {\r\n samplingModes.push(options.samplingModes[i]);\r\n } else {\r\n samplingModes.push(Texture.BILINEAR_SAMPLINGMODE);\r\n }\r\n\r\n if (options && options.useSRGBBuffers && options.useSRGBBuffers[i] !== undefined) {\r\n useSRGBBuffers.push(options.useSRGBBuffers[i]);\r\n } else {\r\n useSRGBBuffers.push(false);\r\n }\r\n\r\n if (options && options.formats && options.formats[i] !== undefined) {\r\n formats.push(options.formats[i]);\r\n } else {\r\n formats.push(Constants.TEXTUREFORMAT_RGBA);\r\n }\r\n\r\n if (options && options.targetTypes && options.targetTypes[i] !== undefined) {\r\n targets.push(options.targetTypes[i]);\r\n } else {\r\n targets.push(Constants.TEXTURE_2D);\r\n }\r\n\r\n if (options && options.faceIndex && options.faceIndex[i] !== undefined) {\r\n faceIndex.push(options.faceIndex[i]);\r\n } else {\r\n faceIndex.push(0);\r\n }\r\n\r\n if (options && options.layerIndex && options.layerIndex[i] !== undefined) {\r\n layerIndex.push(options.layerIndex[i]);\r\n } else {\r\n layerIndex.push(0);\r\n }\r\n\r\n if (options && options.layerCounts && options.layerCounts[i] !== undefined) {\r\n layerCounts.push(options.layerCounts[i]);\r\n } else {\r\n layerCounts.push(1);\r\n }\r\n }\r\n }\r\n\r\n private _createInternaTextureIndexMapping() {\r\n const mapMainInternalTexture2Index: { [key: number]: number } = {};\r\n const mapInternalTexture2MainIndex: number[] = [];\r\n\r\n if (!this._renderTarget) {\r\n return mapInternalTexture2MainIndex;\r\n }\r\n\r\n const internalTextures = this._renderTarget!.textures!;\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = internalTextures[i];\r\n if (!texture) {\r\n continue;\r\n }\r\n const mainIndex = mapMainInternalTexture2Index[texture.uniqueId];\r\n if (mainIndex !== undefined) {\r\n mapInternalTexture2MainIndex[i] = mainIndex;\r\n } else {\r\n mapMainInternalTexture2Index[texture.uniqueId] = i;\r\n }\r\n }\r\n\r\n return mapInternalTexture2MainIndex;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rebuild(forceFullRebuild: boolean = false, textureNames?: string[]): void {\r\n if (this._count < 1) {\r\n return;\r\n }\r\n\r\n const mapInternalTexture2MainIndex = this._createInternaTextureIndexMapping();\r\n\r\n this.releaseInternalTextures();\r\n this._createInternalTextures();\r\n\r\n if (forceFullRebuild) {\r\n this._releaseTextures();\r\n this._createTextures(textureNames);\r\n }\r\n\r\n const internalTextures = this._renderTarget!.textures!;\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = this._textures[i];\r\n if (mapInternalTexture2MainIndex[i] !== undefined) {\r\n this._renderTarget!.setTexture(internalTextures[mapInternalTexture2MainIndex[i]], i);\r\n }\r\n texture._texture = internalTextures[i];\r\n if (texture._texture) {\r\n texture._noMipmap = !texture._texture.useMipMaps;\r\n texture._useSRGBBuffer = texture._texture._useSRGBBuffer;\r\n }\r\n }\r\n\r\n if (this.samples !== 1) {\r\n this._renderTarget!.setSamples(this.samples, !this._drawOnlyOnFirstAttachmentByDefault, true);\r\n }\r\n }\r\n\r\n private _createInternalTextures(): void {\r\n this._renderTarget = this._getEngine()!.createMultipleRenderTarget(this._size, this._multiRenderTargetOptions, !this._drawOnlyOnFirstAttachmentByDefault);\r\n this._texture = this._renderTarget.texture;\r\n }\r\n\r\n private _releaseTextures(): void {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i]._texture = null; // internal textures are released by a call to releaseInternalTextures()\r\n this._textures[i].dispose();\r\n }\r\n }\r\n }\r\n\r\n private _createTextures(textureNames?: string[]): void {\r\n const internalTextures = this._renderTarget!.textures!;\r\n this._textures = [];\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = new Texture(null, this.getScene());\r\n if (textureNames?.[i]) {\r\n texture.name = textureNames[i];\r\n }\r\n texture._texture = internalTextures[i];\r\n if (texture._texture) {\r\n texture._noMipmap = !texture._texture.useMipMaps;\r\n texture._useSRGBBuffer = texture._texture._useSRGBBuffer;\r\n }\r\n this._textures.push(texture);\r\n }\r\n }\r\n\r\n /**\r\n * Replaces an internal texture within the MRT. Useful to share textures between MultiRenderTarget.\r\n * @param texture The new texture to set in the MRT\r\n * @param index The index of the texture to replace\r\n * @param disposePrevious Set to true if the previous internal texture should be disposed\r\n */\r\n public setInternalTexture(texture: InternalTexture, index: number, disposePrevious: boolean = true) {\r\n if (!this.renderTarget) {\r\n return;\r\n }\r\n\r\n if (index === 0) {\r\n this._texture = texture;\r\n }\r\n\r\n this.renderTarget.setTexture(texture, index, disposePrevious);\r\n\r\n if (!this.textures[index]) {\r\n this.textures[index] = new Texture(null, this.getScene());\r\n this.textures[index].name = this._textureNames?.[index] ?? this.textures[index].name;\r\n }\r\n this.textures[index]._texture = texture;\r\n this.textures[index]._noMipmap = !texture.useMipMaps;\r\n this.textures[index]._useSRGBBuffer = texture._useSRGBBuffer;\r\n\r\n this._count = this.renderTarget.textures ? this.renderTarget.textures.length : 0;\r\n\r\n if (this._multiRenderTargetOptions.types) {\r\n this._multiRenderTargetOptions.types[index] = texture.type;\r\n }\r\n if (this._multiRenderTargetOptions.samplingModes) {\r\n this._multiRenderTargetOptions.samplingModes[index] = texture.samplingMode;\r\n }\r\n if (this._multiRenderTargetOptions.useSRGBBuffers) {\r\n this._multiRenderTargetOptions.useSRGBBuffers[index] = texture._useSRGBBuffer;\r\n }\r\n if (this._multiRenderTargetOptions.targetTypes && this._multiRenderTargetOptions.targetTypes[index] !== -1) {\r\n let target: number = 0;\r\n if (texture.is2DArray) {\r\n target = Constants.TEXTURE_2D_ARRAY;\r\n } else if (texture.isCube) {\r\n target = Constants.TEXTURE_CUBE_MAP;\r\n } /*else if (texture.isCubeArray) {\r\n target = Constants.TEXTURE_CUBE_MAP_ARRAY;\r\n }*/ else if (texture.is3D) {\r\n target = Constants.TEXTURE_3D;\r\n } else {\r\n target = Constants.TEXTURE_2D;\r\n }\r\n this._multiRenderTargetOptions.targetTypes[index] = target;\r\n }\r\n }\r\n\r\n /**\r\n * Changes an attached texture's face index or layer.\r\n * @param index The index of the texture to modify the attachment of\r\n * @param layerIndex The layer index of the texture to be attached to the framebuffer\r\n * @param faceIndex The face index of the texture to be attached to the framebuffer\r\n */\r\n public setLayerAndFaceIndex(index: number, layerIndex: number = -1, faceIndex: number = -1) {\r\n if (!this.textures[index] || !this.renderTarget) {\r\n return;\r\n }\r\n\r\n if (this._multiRenderTargetOptions.layerIndex) {\r\n this._multiRenderTargetOptions.layerIndex[index] = layerIndex;\r\n }\r\n if (this._multiRenderTargetOptions.faceIndex) {\r\n this._multiRenderTargetOptions.faceIndex[index] = faceIndex;\r\n }\r\n\r\n this.renderTarget.setLayerAndFaceIndex(index, layerIndex, faceIndex);\r\n }\r\n\r\n /**\r\n * Changes every attached texture's face index or layer.\r\n * @param layerIndices The layer indices of the texture to be attached to the framebuffer\r\n * @param faceIndices The face indices of the texture to be attached to the framebuffer\r\n */\r\n public setLayerAndFaceIndices(layerIndices: number[], faceIndices: number[]) {\r\n if (!this.renderTarget) {\r\n return;\r\n }\r\n\r\n this._multiRenderTargetOptions.layerIndex = layerIndices;\r\n this._multiRenderTargetOptions.faceIndex = faceIndices;\r\n\r\n this.renderTarget.setLayerAndFaceIndices(layerIndices, faceIndices);\r\n }\r\n\r\n /**\r\n * Define the number of samples used if MSAA is enabled.\r\n */\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n public set samples(value: number) {\r\n if (this._renderTarget) {\r\n this._samples = this._renderTarget.setSamples(value);\r\n } else {\r\n // In case samples are set with 0 textures created, we must save the desired samples value\r\n this._samples = value;\r\n }\r\n }\r\n\r\n /**\r\n * Resize all the textures in the multi render target.\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param size Define the new size\r\n */\r\n public resize(size: any) {\r\n this._processSizeParameter(size, false);\r\n this._rebuild(undefined, this._textureNames);\r\n }\r\n\r\n /**\r\n * Changes the number of render targets in this MRT\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param count new texture count\r\n * @param options Specifies texture types and sampling modes for new textures\r\n * @param textureNames Specifies the names of the textures (optional)\r\n */\r\n public updateCount(count: number, options?: IMultiRenderTargetOptions, textureNames?: string[]) {\r\n this._multiRenderTargetOptions.textureCount = count;\r\n this._count = count;\r\n\r\n const types: number[] = [];\r\n const samplingModes: number[] = [];\r\n const useSRGBBuffers: boolean[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n\r\n this._textureNames = textureNames;\r\n\r\n this._initTypes(count, types, samplingModes, useSRGBBuffers, formats, targetTypes, faceIndex, layerIndex, layerCounts, options);\r\n this._multiRenderTargetOptions.types = types;\r\n this._multiRenderTargetOptions.samplingModes = samplingModes;\r\n this._multiRenderTargetOptions.useSRGBBuffers = useSRGBBuffers;\r\n this._multiRenderTargetOptions.formats = formats;\r\n this._multiRenderTargetOptions.targetTypes = targetTypes;\r\n this._multiRenderTargetOptions.faceIndex = faceIndex;\r\n this._multiRenderTargetOptions.layerIndex = layerIndex;\r\n this._multiRenderTargetOptions.layerCounts = layerCounts;\r\n this._multiRenderTargetOptions.labels = textureNames;\r\n\r\n this._rebuild(true, textureNames);\r\n }\r\n\r\n protected _unbindFrameBuffer(engine: Engine, faceIndex: number): void {\r\n if (this._renderTarget) {\r\n engine.unBindMultiColorAttachmentFramebuffer(this._renderTarget, this.isCube, () => {\r\n this.onAfterRenderObservable.notifyObservers(faceIndex);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the render targets and their associated resources\r\n * @param doNotDisposeInternalTextures\r\n */\r\n public dispose(doNotDisposeInternalTextures = false): void {\r\n this._releaseTextures();\r\n if (!doNotDisposeInternalTextures) {\r\n this.releaseInternalTextures();\r\n } else {\r\n // Prevent internal texture dispose in super.dispose\r\n this._texture = null;\r\n }\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Release all the underlying texture used as draw buffers (render textures).\r\n */\r\n public releaseInternalTextures(): void {\r\n const internalTextures = this._renderTarget?.textures;\r\n\r\n if (!internalTextures) {\r\n return;\r\n }\r\n\r\n for (let i = internalTextures.length - 1; i >= 0; i--) {\r\n this._textures[i]._texture = null;\r\n }\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"multiRenderTarget.js","sourceRoot":"","sources":["../../../../../dev/core/src/Materials/Textures/multiRenderTarget.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"../../scene\";\r\nimport type { Engine } from \"../../Engines/engine\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture\";\r\nimport { Constants } from \"../../Engines/constants\";\r\n\r\nimport \"../../Engines/Extensions/engine.multiRender\";\r\nimport type { InternalTexture } from \"./internalTexture\";\r\n\r\n/**\r\n * Creation options of the multi render target texture.\r\n */\r\nexport interface IMultiRenderTargetOptions {\r\n /**\r\n * Define if the texture needs to create mip maps after render.\r\n */\r\n generateMipMaps?: boolean;\r\n /**\r\n * Define the types of all the draw buffers (render textures) we want to create\r\n */\r\n types?: number[];\r\n /**\r\n * Define the sampling modes of all the draw buffers (render textures) we want to create\r\n */\r\n samplingModes?: number[];\r\n /**\r\n * Define if sRGB format should be used for each of the draw buffers (render textures) we want to create\r\n */\r\n useSRGBBuffers?: boolean[];\r\n /**\r\n * Define if a depth buffer is required\r\n */\r\n generateDepthBuffer?: boolean;\r\n /**\r\n * Define if a stencil buffer is required\r\n */\r\n generateStencilBuffer?: boolean;\r\n /**\r\n * Define if a depth texture is required instead of a depth buffer\r\n */\r\n generateDepthTexture?: boolean;\r\n /**\r\n * Define the internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) of all the draw buffers (render textures) we want to create\r\n */\r\n formats?: number[];\r\n /**\r\n * Define depth texture format to use\r\n */\r\n depthTextureFormat?: number;\r\n /**\r\n * Define the number of desired draw buffers (render textures)\r\n */\r\n textureCount?: number;\r\n /**\r\n * Define if aspect ratio should be adapted to the texture or stay the scene one\r\n */\r\n doNotChangeAspectRatio?: boolean;\r\n /**\r\n * Define the default type of the buffers we are creating\r\n */\r\n defaultType?: number;\r\n /**\r\n * Define the default type of the buffers we are creating\r\n */\r\n drawOnlyOnFirstAttachmentByDefault?: boolean;\r\n /**\r\n * Define the type of texture at each attahment index (of Constants.TEXTURE_2D, .TEXTURE_2D_ARRAY, .TEXTURE_CUBE_MAP, .TEXTURE_CUBE_MAP_ARRAY, .TEXTURE_3D).\r\n * You can also use the -1 value to indicate that no texture should be created but that you will assign a texture to that attachment index later.\r\n * Can be useful when you want to attach several layers of the same 2DArrayTexture / 3DTexture or several faces of the same CubeMapTexture: Use the setInternalTexture\r\n * method for that purpose, after the MultiRenderTarget has been created.\r\n */\r\n targetTypes?: number[];\r\n /**\r\n * Define the face index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_CUBE_MAP and .TEXTURE_CUBE_MAP_ARRAY).\r\n * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex\r\n */\r\n faceIndex?: number[];\r\n /**\r\n * Define the layer index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY).\r\n * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex\r\n */\r\n layerIndex?: number[];\r\n /**\r\n * Define the number of layer of each texture in the textures array (if applicable, given the corresponding targetType) (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY)\r\n */\r\n layerCounts?: number[];\r\n /**\r\n * Define the names of the textures (used for debugging purpose)\r\n */\r\n labels?: string[];\r\n /**\r\n * Label of the RenderTargetWrapper (used for debugging only)\r\n */\r\n label?: string;\r\n}\r\n\r\n/**\r\n * A multi render target, like a render target provides the ability to render to a texture.\r\n * Unlike the render target, it can render to several draw buffers (render textures) in one draw.\r\n * This is specially interesting in deferred rendering or for any effects requiring more than\r\n * just one color from a single pass.\r\n */\r\nexport class MultiRenderTarget extends RenderTargetTexture {\r\n private _textures: Texture[];\r\n private _multiRenderTargetOptions: IMultiRenderTargetOptions;\r\n private _count: number;\r\n private _drawOnlyOnFirstAttachmentByDefault: boolean;\r\n private _textureNames?: string[];\r\n\r\n /**\r\n * Get if draw buffers (render textures) are currently supported by the used hardware and browser.\r\n */\r\n public get isSupported(): boolean {\r\n return this._engine?.getCaps().drawBuffersExtension ?? false;\r\n }\r\n\r\n /**\r\n * Get the list of textures generated by the multi render target.\r\n */\r\n public get textures(): Texture[] {\r\n return this._textures;\r\n }\r\n\r\n /**\r\n * Gets the number of textures in this MRT. This number can be different from `_textures.length` in case a depth texture is generated.\r\n */\r\n public get count(): number {\r\n return this._count;\r\n }\r\n\r\n /**\r\n * Get the depth texture generated by the multi render target if options.generateDepthTexture has been set\r\n */\r\n public get depthTexture(): Texture {\r\n return this._textures[this._textures.length - 1];\r\n }\r\n\r\n /**\r\n * Set the wrapping mode on U of all the textures we are rendering to.\r\n * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)\r\n */\r\n public set wrapU(wrap: number) {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i].wrapU = wrap;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the wrapping mode on V of all the textures we are rendering to.\r\n * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)\r\n */\r\n public set wrapV(wrap: number) {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i].wrapV = wrap;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Instantiate a new multi render target texture.\r\n * A multi render target, like a render target provides the ability to render to a texture.\r\n * Unlike the render target, it can render to several draw buffers (render textures) in one draw.\r\n * This is specially interesting in deferred rendering or for any effects requiring more than\r\n * just one color from a single pass.\r\n * @param name Define the name of the texture\r\n * @param size Define the size of the buffers to render to\r\n * @param count Define the number of target we are rendering into\r\n * @param scene Define the scene the texture belongs to\r\n * @param options Define the options used to create the multi render target\r\n * @param textureNames Define the names to set to the textures (if count \\> 0 - optional)\r\n */\r\n constructor(name: string, size: any, count: number, scene?: Scene, options?: IMultiRenderTargetOptions, textureNames?: string[]) {\r\n const generateMipMaps = options && options.generateMipMaps ? options.generateMipMaps : false;\r\n const generateDepthTexture = options && options.generateDepthTexture ? options.generateDepthTexture : false;\r\n const depthTextureFormat = options && options.depthTextureFormat ? options.depthTextureFormat : Constants.TEXTUREFORMAT_DEPTH16;\r\n const doNotChangeAspectRatio = !options || options.doNotChangeAspectRatio === undefined ? true : options.doNotChangeAspectRatio;\r\n const drawOnlyOnFirstAttachmentByDefault = options && options.drawOnlyOnFirstAttachmentByDefault ? options.drawOnlyOnFirstAttachmentByDefault : false;\r\n super(name, size, scene, generateMipMaps, doNotChangeAspectRatio, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true);\r\n\r\n if (!this.isSupported) {\r\n this.dispose();\r\n return;\r\n }\r\n\r\n this._textureNames = textureNames;\r\n\r\n const types: number[] = [];\r\n const samplingModes: number[] = [];\r\n const useSRGBBuffers: boolean[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n this._initTypes(count, types, samplingModes, useSRGBBuffers, formats, targetTypes, faceIndex, layerIndex, layerCounts, options);\r\n\r\n const generateDepthBuffer = !options || options.generateDepthBuffer === undefined ? true : options.generateDepthBuffer;\r\n const generateStencilBuffer = !options || options.generateStencilBuffer === undefined ? false : options.generateStencilBuffer;\r\n\r\n this._multiRenderTargetOptions = {\r\n samplingModes: samplingModes,\r\n generateMipMaps: generateMipMaps,\r\n generateDepthBuffer: generateDepthBuffer,\r\n generateStencilBuffer: generateStencilBuffer,\r\n generateDepthTexture: generateDepthTexture,\r\n depthTextureFormat: depthTextureFormat,\r\n types: types,\r\n textureCount: count,\r\n useSRGBBuffers: useSRGBBuffers,\r\n formats: formats,\r\n targetTypes: targetTypes,\r\n faceIndex: faceIndex,\r\n layerIndex: layerIndex,\r\n layerCounts: layerCounts,\r\n labels: textureNames,\r\n label: name,\r\n };\r\n\r\n this._count = count;\r\n this._drawOnlyOnFirstAttachmentByDefault = drawOnlyOnFirstAttachmentByDefault;\r\n\r\n if (count > 0) {\r\n this._createInternalTextures();\r\n this._createTextures(textureNames);\r\n }\r\n }\r\n\r\n private _initTypes(\r\n count: number,\r\n types: number[],\r\n samplingModes: number[],\r\n useSRGBBuffers: boolean[],\r\n formats: number[],\r\n targets: number[],\r\n faceIndex: number[],\r\n layerIndex: number[],\r\n layerCounts: number[],\r\n options?: IMultiRenderTargetOptions\r\n ) {\r\n for (let i = 0; i < count; i++) {\r\n if (options && options.types && options.types[i] !== undefined) {\r\n types.push(options.types[i]);\r\n } else {\r\n types.push(options && options.defaultType ? options.defaultType : Constants.TEXTURETYPE_UNSIGNED_INT);\r\n }\r\n\r\n if (options && options.samplingModes && options.samplingModes[i] !== undefined) {\r\n samplingModes.push(options.samplingModes[i]);\r\n } else {\r\n samplingModes.push(Texture.BILINEAR_SAMPLINGMODE);\r\n }\r\n\r\n if (options && options.useSRGBBuffers && options.useSRGBBuffers[i] !== undefined) {\r\n useSRGBBuffers.push(options.useSRGBBuffers[i]);\r\n } else {\r\n useSRGBBuffers.push(false);\r\n }\r\n\r\n if (options && options.formats && options.formats[i] !== undefined) {\r\n formats.push(options.formats[i]);\r\n } else {\r\n formats.push(Constants.TEXTUREFORMAT_RGBA);\r\n }\r\n\r\n if (options && options.targetTypes && options.targetTypes[i] !== undefined) {\r\n targets.push(options.targetTypes[i]);\r\n } else {\r\n targets.push(Constants.TEXTURE_2D);\r\n }\r\n\r\n if (options && options.faceIndex && options.faceIndex[i] !== undefined) {\r\n faceIndex.push(options.faceIndex[i]);\r\n } else {\r\n faceIndex.push(0);\r\n }\r\n\r\n if (options && options.layerIndex && options.layerIndex[i] !== undefined) {\r\n layerIndex.push(options.layerIndex[i]);\r\n } else {\r\n layerIndex.push(0);\r\n }\r\n\r\n if (options && options.layerCounts && options.layerCounts[i] !== undefined) {\r\n layerCounts.push(options.layerCounts[i]);\r\n } else {\r\n layerCounts.push(1);\r\n }\r\n }\r\n }\r\n\r\n private _createInternaTextureIndexMapping() {\r\n const mapMainInternalTexture2Index: { [key: number]: number } = {};\r\n const mapInternalTexture2MainIndex: number[] = [];\r\n\r\n if (!this._renderTarget) {\r\n return mapInternalTexture2MainIndex;\r\n }\r\n\r\n const internalTextures = this._renderTarget!.textures!;\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = internalTextures[i];\r\n if (!texture) {\r\n continue;\r\n }\r\n const mainIndex = mapMainInternalTexture2Index[texture.uniqueId];\r\n if (mainIndex !== undefined) {\r\n mapInternalTexture2MainIndex[i] = mainIndex;\r\n } else {\r\n mapMainInternalTexture2Index[texture.uniqueId] = i;\r\n }\r\n }\r\n\r\n return mapInternalTexture2MainIndex;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public _rebuild(forceFullRebuild: boolean = false, textureNames?: string[]): void {\r\n if (this._count < 1) {\r\n return;\r\n }\r\n\r\n const mapInternalTexture2MainIndex = this._createInternaTextureIndexMapping();\r\n\r\n this.releaseInternalTextures();\r\n this._createInternalTextures();\r\n\r\n if (forceFullRebuild) {\r\n this._releaseTextures();\r\n this._createTextures(textureNames);\r\n }\r\n\r\n const internalTextures = this._renderTarget!.textures!;\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = this._textures[i];\r\n if (mapInternalTexture2MainIndex[i] !== undefined) {\r\n this._renderTarget!.setTexture(internalTextures[mapInternalTexture2MainIndex[i]], i);\r\n }\r\n texture._texture = internalTextures[i];\r\n if (texture._texture) {\r\n texture._noMipmap = !texture._texture.useMipMaps;\r\n texture._useSRGBBuffer = texture._texture._useSRGBBuffer;\r\n }\r\n }\r\n\r\n if (this.samples !== 1) {\r\n this._renderTarget!.setSamples(this.samples, !this._drawOnlyOnFirstAttachmentByDefault, true);\r\n }\r\n }\r\n\r\n private _createInternalTextures(): void {\r\n this._renderTarget = this._getEngine()!.createMultipleRenderTarget(this._size, this._multiRenderTargetOptions, !this._drawOnlyOnFirstAttachmentByDefault);\r\n this._texture = this._renderTarget.texture;\r\n }\r\n\r\n private _releaseTextures(): void {\r\n if (this._textures) {\r\n for (let i = 0; i < this._textures.length; i++) {\r\n this._textures[i]._texture = null; // internal textures are released by a call to releaseInternalTextures()\r\n this._textures[i].dispose();\r\n }\r\n }\r\n }\r\n\r\n private _createTextures(textureNames?: string[]): void {\r\n const internalTextures = this._renderTarget!.textures!;\r\n this._textures = [];\r\n for (let i = 0; i < internalTextures.length; i++) {\r\n const texture = new Texture(null, this.getScene());\r\n if (textureNames?.[i]) {\r\n texture.name = textureNames[i];\r\n }\r\n texture._texture = internalTextures[i];\r\n if (texture._texture) {\r\n texture._noMipmap = !texture._texture.useMipMaps;\r\n texture._useSRGBBuffer = texture._texture._useSRGBBuffer;\r\n }\r\n this._textures.push(texture);\r\n }\r\n }\r\n\r\n /**\r\n * Replaces an internal texture within the MRT. Useful to share textures between MultiRenderTarget.\r\n * @param texture The new texture to set in the MRT\r\n * @param index The index of the texture to replace\r\n * @param disposePrevious Set to true if the previous internal texture should be disposed\r\n */\r\n public setInternalTexture(texture: InternalTexture, index: number, disposePrevious: boolean = true) {\r\n if (!this.renderTarget) {\r\n return;\r\n }\r\n\r\n if (index === 0) {\r\n this._texture = texture;\r\n }\r\n\r\n this.renderTarget.setTexture(texture, index, disposePrevious);\r\n\r\n if (!this.textures[index]) {\r\n this.textures[index] = new Texture(null, this.getScene());\r\n this.textures[index].name = this._textureNames?.[index] ?? this.textures[index].name;\r\n }\r\n this.textures[index]._texture = texture;\r\n this.textures[index]._noMipmap = !texture.useMipMaps;\r\n this.textures[index]._useSRGBBuffer = texture._useSRGBBuffer;\r\n\r\n this._count = this.renderTarget.textures ? this.renderTarget.textures.length : 0;\r\n\r\n if (this._multiRenderTargetOptions.types) {\r\n this._multiRenderTargetOptions.types[index] = texture.type;\r\n }\r\n if (this._multiRenderTargetOptions.samplingModes) {\r\n this._multiRenderTargetOptions.samplingModes[index] = texture.samplingMode;\r\n }\r\n if (this._multiRenderTargetOptions.useSRGBBuffers) {\r\n this._multiRenderTargetOptions.useSRGBBuffers[index] = texture._useSRGBBuffer;\r\n }\r\n if (this._multiRenderTargetOptions.targetTypes && this._multiRenderTargetOptions.targetTypes[index] !== -1) {\r\n let target: number = 0;\r\n if (texture.is2DArray) {\r\n target = Constants.TEXTURE_2D_ARRAY;\r\n } else if (texture.isCube) {\r\n target = Constants.TEXTURE_CUBE_MAP;\r\n } /*else if (texture.isCubeArray) {\r\n target = Constants.TEXTURE_CUBE_MAP_ARRAY;\r\n }*/ else if (texture.is3D) {\r\n target = Constants.TEXTURE_3D;\r\n } else {\r\n target = Constants.TEXTURE_2D;\r\n }\r\n this._multiRenderTargetOptions.targetTypes[index] = target;\r\n }\r\n }\r\n\r\n /**\r\n * Changes an attached texture's face index or layer.\r\n * @param index The index of the texture to modify the attachment of\r\n * @param layerIndex The layer index of the texture to be attached to the framebuffer\r\n * @param faceIndex The face index of the texture to be attached to the framebuffer\r\n */\r\n public setLayerAndFaceIndex(index: number, layerIndex: number = -1, faceIndex: number = -1) {\r\n if (!this.textures[index] || !this.renderTarget) {\r\n return;\r\n }\r\n\r\n if (this._multiRenderTargetOptions.layerIndex) {\r\n this._multiRenderTargetOptions.layerIndex[index] = layerIndex;\r\n }\r\n if (this._multiRenderTargetOptions.faceIndex) {\r\n this._multiRenderTargetOptions.faceIndex[index] = faceIndex;\r\n }\r\n\r\n this.renderTarget.setLayerAndFaceIndex(index, layerIndex, faceIndex);\r\n }\r\n\r\n /**\r\n * Changes every attached texture's face index or layer.\r\n * @param layerIndices The layer indices of the texture to be attached to the framebuffer\r\n * @param faceIndices The face indices of the texture to be attached to the framebuffer\r\n */\r\n public setLayerAndFaceIndices(layerIndices: number[], faceIndices: number[]) {\r\n if (!this.renderTarget) {\r\n return;\r\n }\r\n\r\n this._multiRenderTargetOptions.layerIndex = layerIndices;\r\n this._multiRenderTargetOptions.faceIndex = faceIndices;\r\n\r\n this.renderTarget.setLayerAndFaceIndices(layerIndices, faceIndices);\r\n }\r\n\r\n /**\r\n * Define the number of samples used if MSAA is enabled.\r\n */\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n public set samples(value: number) {\r\n if (this._renderTarget) {\r\n this._samples = this._renderTarget.setSamples(value);\r\n } else {\r\n // In case samples are set with 0 textures created, we must save the desired samples value\r\n this._samples = value;\r\n }\r\n }\r\n\r\n /**\r\n * Resize all the textures in the multi render target.\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param size Define the new size\r\n */\r\n public resize(size: any) {\r\n this._processSizeParameter(size, false);\r\n this._rebuild(undefined, this._textureNames);\r\n }\r\n\r\n /**\r\n * Changes the number of render targets in this MRT\r\n * Be careful as it will recreate all the data in the new texture.\r\n * @param count new texture count\r\n * @param options Specifies texture types and sampling modes for new textures\r\n * @param textureNames Specifies the names of the textures (optional)\r\n */\r\n public updateCount(count: number, options?: IMultiRenderTargetOptions, textureNames?: string[]) {\r\n this._multiRenderTargetOptions.textureCount = count;\r\n this._count = count;\r\n\r\n const types: number[] = [];\r\n const samplingModes: number[] = [];\r\n const useSRGBBuffers: boolean[] = [];\r\n const formats: number[] = [];\r\n const targetTypes: number[] = [];\r\n const faceIndex: number[] = [];\r\n const layerIndex: number[] = [];\r\n const layerCounts: number[] = [];\r\n\r\n this._textureNames = textureNames;\r\n\r\n this._initTypes(count, types, samplingModes, useSRGBBuffers, formats, targetTypes, faceIndex, layerIndex, layerCounts, options);\r\n this._multiRenderTargetOptions.types = types;\r\n this._multiRenderTargetOptions.samplingModes = samplingModes;\r\n this._multiRenderTargetOptions.useSRGBBuffers = useSRGBBuffers;\r\n this._multiRenderTargetOptions.formats = formats;\r\n this._multiRenderTargetOptions.targetTypes = targetTypes;\r\n this._multiRenderTargetOptions.faceIndex = faceIndex;\r\n this._multiRenderTargetOptions.layerIndex = layerIndex;\r\n this._multiRenderTargetOptions.layerCounts = layerCounts;\r\n this._multiRenderTargetOptions.labels = textureNames;\r\n\r\n this._rebuild(true, textureNames);\r\n }\r\n\r\n protected _unbindFrameBuffer(engine: Engine, faceIndex: number): void {\r\n if (this._renderTarget) {\r\n engine.unBindMultiColorAttachmentFramebuffer(this._renderTarget, this.isCube, () => {\r\n this.onAfterRenderObservable.notifyObservers(faceIndex);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the render targets and their associated resources\r\n * @param doNotDisposeInternalTextures\r\n */\r\n public dispose(doNotDisposeInternalTextures = false): void {\r\n this._releaseTextures();\r\n if (!doNotDisposeInternalTextures) {\r\n this.releaseInternalTextures();\r\n } else {\r\n // Prevent internal texture dispose in super.dispose\r\n this._texture = null;\r\n }\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Release all the underlying texture used as draw buffers (render textures).\r\n */\r\n public releaseInternalTextures(): void {\r\n const internalTextures = this._renderTarget?.textures;\r\n\r\n if (!internalTextures) {\r\n return;\r\n }\r\n\r\n for (let i = internalTextures.length - 1; i >= 0; i--) {\r\n this._textures[i]._texture = null;\r\n }\r\n\r\n this._renderTarget?.dispose();\r\n this._renderTarget = null;\r\n }\r\n}\r\n"]}
@@ -689,8 +689,7 @@ export class RenderTargetTexture extends Texture {
689
689
  engine.currentRenderPassId = currentRenderPassId;
690
690
  if (sceneCamera) {
691
691
  scene.activeCamera = sceneCamera;
692
- // Do not avoid setting uniforms when multiple scenes are active as another camera may have overwrite these
693
- if (scene.getEngine().scenes.length > 1 || (this.activeCamera && this.activeCamera !== scene.activeCamera)) {
692
+ if (this.activeCamera && this.activeCamera !== scene.activeCamera) {
694
693
  scene.setTransformMatrix(scene.activeCamera.getViewMatrix(), scene.activeCamera.getProjectionMatrix(true));
695
694
  }
696
695
  engine.setViewport(scene.activeCamera.viewport);