@babylonjs/core 8.25.0 → 8.25.2

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 (126) hide show
  1. package/Bones/bone.js +14 -54
  2. package/Bones/bone.js.map +1 -1
  3. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +1 -1
  4. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  5. package/Engines/Native/nativeShaderProcessors.js +3 -0
  6. package/Engines/Native/nativeShaderProcessors.js.map +1 -1
  7. package/Engines/WebGL/webGL2ShaderProcessors.js +3 -0
  8. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  9. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +3 -1
  10. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +4 -1
  11. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  12. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +4 -1
  13. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  14. package/Engines/abstractEngine.d.ts +1 -1
  15. package/Engines/abstractEngine.functions.d.ts +2 -2
  16. package/Engines/abstractEngine.functions.js.map +1 -1
  17. package/Engines/abstractEngine.js +2 -2
  18. package/Engines/abstractEngine.js.map +1 -1
  19. package/Engines/nullEngine.js +1 -0
  20. package/Engines/nullEngine.js.map +1 -1
  21. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +3 -0
  22. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +10 -0
  23. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  24. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +3 -0
  25. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +10 -0
  26. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  27. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js +8 -0
  28. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js.map +1 -1
  29. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +16 -0
  30. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +1 -1
  31. package/FrameGraph/Node/Blocks/inputBlock.js +2 -0
  32. package/FrameGraph/Node/Blocks/inputBlock.js.map +1 -1
  33. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +6 -0
  34. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +16 -0
  35. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  36. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +8 -1
  37. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +40 -1
  38. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  39. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +3 -1
  40. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +10 -7
  41. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  42. package/FrameGraph/frameGraph.d.ts +2 -2
  43. package/FrameGraph/frameGraph.js.map +1 -1
  44. package/FrameGraph/frameGraphTextureManager.js +4 -0
  45. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  46. package/Gizmos/cameraGizmo.js +11 -13
  47. package/Gizmos/cameraGizmo.js.map +1 -1
  48. package/Gizmos/planeDragGizmo.js +21 -13
  49. package/Gizmos/planeDragGizmo.js.map +1 -1
  50. package/Loading/sceneLoader.d.ts +3 -1
  51. package/Loading/sceneLoader.js +3 -2
  52. package/Loading/sceneLoader.js.map +1 -1
  53. package/Materials/Background/backgroundMaterial.js +1 -1
  54. package/Materials/Background/backgroundMaterial.js.map +1 -1
  55. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +1 -1
  56. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  57. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js +0 -5
  58. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js.map +1 -1
  59. package/Materials/Node/nodeMaterial.d.ts +1 -1
  60. package/Materials/Node/nodeMaterial.js +3 -14
  61. package/Materials/Node/nodeMaterial.js.map +1 -1
  62. package/Materials/PBR/pbrBaseMaterial.js +1 -1
  63. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  64. package/Materials/Textures/renderTargetTexture.d.ts +5 -0
  65. package/Materials/Textures/renderTargetTexture.js +9 -0
  66. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  67. package/Materials/material.d.ts +17 -1
  68. package/Materials/material.js +38 -7
  69. package/Materials/material.js.map +1 -1
  70. package/Materials/materialDefines.d.ts +1 -0
  71. package/Materials/materialDefines.js +1 -0
  72. package/Materials/materialDefines.js.map +1 -1
  73. package/Materials/materialHelper.functions.d.ts +2 -1
  74. package/Materials/materialHelper.functions.js +3 -1
  75. package/Materials/materialHelper.functions.js.map +1 -1
  76. package/Materials/standardMaterial.js +1 -1
  77. package/Materials/standardMaterial.js.map +1 -1
  78. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +3 -10
  79. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  80. package/Meshes/csg2.js +5 -3
  81. package/Meshes/csg2.js.map +1 -1
  82. package/Meshes/geometry.js +4 -4
  83. package/Meshes/geometry.js.map +1 -1
  84. package/Meshes/linesMesh.d.ts +5 -3
  85. package/Meshes/linesMesh.js +27 -8
  86. package/Meshes/linesMesh.js.map +1 -1
  87. package/Meshes/mesh.vertexData.d.ts +2 -2
  88. package/Meshes/mesh.vertexData.js.map +1 -1
  89. package/Misc/assetsManager.d.ts +81 -25
  90. package/Misc/assetsManager.js +70 -32
  91. package/Misc/assetsManager.js.map +1 -1
  92. package/Misc/fileTools.d.ts +2 -2
  93. package/Misc/fileTools.js +3 -1
  94. package/Misc/fileTools.js.map +1 -1
  95. package/Misc/khronosTextureContainer2.js +16 -7
  96. package/Misc/khronosTextureContainer2.js.map +1 -1
  97. package/Misc/snapshotRenderingHelper.d.ts +2 -0
  98. package/Misc/snapshotRenderingHelper.js +31 -1
  99. package/Misc/snapshotRenderingHelper.js.map +1 -1
  100. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.d.ts +5 -3
  101. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +22 -9
  102. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  103. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js +3 -0
  104. package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.js.map +1 -1
  105. package/Rendering/objectRenderer.d.ts +18 -2
  106. package/Rendering/objectRenderer.js +69 -29
  107. package/Rendering/objectRenderer.js.map +1 -1
  108. package/Rendering/outlineRenderer.d.ts +4 -0
  109. package/Rendering/outlineRenderer.js +10 -0
  110. package/Rendering/outlineRenderer.js.map +1 -1
  111. package/Shaders/pbr.vertex.js +1 -5
  112. package/Shaders/pbr.vertex.js.map +1 -1
  113. package/Shaders/ssao2.fragment.js +14 -2
  114. package/Shaders/ssao2.fragment.js.map +1 -1
  115. package/ShadersWGSL/ssao2.fragment.js +14 -2
  116. package/ShadersWGSL/ssao2.fragment.js.map +1 -1
  117. package/Sprites/spriteManager.d.ts +5 -0
  118. package/Sprites/spriteManager.js +6 -0
  119. package/Sprites/spriteManager.js.map +1 -1
  120. package/Sprites/spriteRenderer.d.ts +5 -2
  121. package/Sprites/spriteRenderer.js.map +1 -1
  122. package/XR/features/WebXRDepthSensing.js +6 -2
  123. package/XR/features/WebXRDepthSensing.js.map +1 -1
  124. package/package.json +1 -1
  125. package/scene.js +5 -2
  126. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"taaMaterialManager.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Material } from \"core/Materials/material\";\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { Vector2 } from \"core/Maths/math.vector\";\nimport type { Scene } from \"core/scene\";\nimport type { Nullable } from \"core/types\";\n\nclass TAAJitterMaterialDefines extends MaterialDefines {\n TAA_JITTER = false;\n}\n\nclass TAAJitterMaterialPlugin extends MaterialPluginBase {\n public static readonly Name = \"TAAJitter\";\n\n private _manager: Nullable<TAAMaterialManager>;\n public get manager(): Nullable<TAAMaterialManager> {\n return this._manager;\n }\n\n public set manager(manager: Nullable<TAAMaterialManager>) {\n if (this._manager === manager) {\n return;\n }\n this.dispose();\n this._manager = manager;\n manager?._materialPlugins.push(this);\n this._updateMaterial();\n }\n\n public get isEnabled(): boolean {\n return this._manager?.isEnabled ?? false;\n }\n\n constructor(material: Material) {\n super(material, TAAJitterMaterialPlugin.Name, 300, new TAAJitterMaterialDefines());\n this.registerForExtraEvents = true;\n }\n\n /** @internal */\n public _updateMaterial(): void {\n this._enable(this.isEnabled);\n this.markAllDefinesAsDirty();\n }\n\n public override isCompatible(): boolean {\n return true;\n }\n\n public override getClassName(): string {\n return \"TAAJitterMaterialPlugin\";\n }\n\n public override prepareDefines(defines: TAAJitterMaterialDefines): void {\n defines.TAA_JITTER = this.isEnabled;\n }\n\n public override getUniforms(shaderLanguage = ShaderLanguage.GLSL) {\n const ubo = [{ name: \"taa_jitter\", size: 2, type: \"vec2\" }];\n if (shaderLanguage === ShaderLanguage.GLSL) {\n return {\n ubo,\n vertex: `\n #ifdef TAA_JITTER\n uniform vec2 taa_jitter;\n #endif\n `,\n };\n } else {\n return { ubo };\n }\n }\n\n public override hardBindForSubMesh(uniformBuffer: UniformBuffer): void {\n if (this.isEnabled) {\n const jitter = this._manager!.jitter;\n uniformBuffer.updateFloat2(\"taa_jitter\", jitter.x, jitter.y);\n }\n }\n\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL) {\n // We jitter instead of modifying the camera so the velocity buffer stays unaffected\n // More info: https://sugulee.wordpress.com/2021/06/21/temporal-anti-aliasingtaa-tutorial/\n if (shaderType !== \"vertex\") {\n return null;\n } else if (shaderLanguage === ShaderLanguage.WGSL) {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n vertexOutputs.position += vec4f(uniforms.taa_jitter * vertexOutputs.position.w, 0, 1);\n #endif\n `,\n };\n } else {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n gl_Position.xy += taa_jitter * gl_Position.w;\n #endif\n `,\n };\n }\n }\n\n public override dispose(): void {\n if (this._manager) {\n const index = this._manager._materialPlugins.indexOf(this);\n if (index !== -1) {\n this._manager._materialPlugins.splice(index, 1);\n }\n }\n }\n}\n\n/**\n * Applies and manages the TAA jitter plugin on all materials.\n */\nexport class TAAMaterialManager {\n private _isEnabled = true;\n /**\n * Set to enable or disable the jitter offset on all materials.\n */\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public set isEnabled(enabled: boolean) {\n if (this._isEnabled === enabled) {\n return;\n }\n this._isEnabled = enabled;\n for (const plugin of this._materialPlugins) {\n plugin._updateMaterial();\n }\n }\n\n /**\n * The current jitter offset to apply to all materials.\n */\n public readonly jitter = new Vector2();\n\n /** @internal */\n public readonly _materialPlugins: TAAJitterMaterialPlugin[] = [];\n\n /**\n * @param scene All materials in this scene will have a jitter offset applied to them.\n */\n constructor(scene: Scene) {\n for (const material of scene.materials) {\n this._getPlugin(material);\n }\n RegisterMaterialPlugin(TAAJitterMaterialPlugin.Name, (material) => this._getPlugin(material));\n }\n\n /**\n * Disposes of the material manager.\n */\n public dispose(): void {\n UnregisterMaterialPlugin(TAAJitterMaterialPlugin.Name);\n const plugins = this._materialPlugins.splice(0, this._materialPlugins.length);\n for (const plugin of plugins) {\n plugin.manager = null;\n }\n }\n\n private _getPlugin(material: Material): TAAJitterMaterialPlugin {\n let plugin = material.pluginManager?.getPlugin<TAAJitterMaterialPlugin>(TAAJitterMaterialPlugin.Name);\n if (!plugin) {\n plugin = new TAAJitterMaterialPlugin(material);\n }\n plugin.manager = this;\n return plugin;\n }\n}\n"]}
1
+ {"version":3,"file":"taaMaterialManager.js","sourceRoot":"","sources":["../../../../../../dev/core/src/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Material } from \"core/Materials/material\";\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\nimport { Vector2 } from \"core/Maths/math.vector\";\nimport type { Scene } from \"core/scene\";\nimport type { Nullable } from \"core/types\";\nimport { RegisterClass } from \"../../../Misc/typeStore\";\n\nclass TAAJitterMaterialDefines extends MaterialDefines {\n TAA_JITTER = false;\n}\n\nclass TAAJitterMaterialPlugin extends MaterialPluginBase {\n public static readonly Name = \"TAAJitter\";\n\n private _manager: Nullable<TAAMaterialManager>;\n public get manager(): Nullable<TAAMaterialManager> {\n return this._manager;\n }\n\n public set manager(manager: Nullable<TAAMaterialManager>) {\n if (this._manager === manager) {\n return;\n }\n this.dispose();\n this._manager = manager;\n manager?._materialPlugins.push(this);\n this._updateMaterial();\n }\n\n public get isEnabled(): boolean {\n return this._manager?.isEnabled ?? false;\n }\n\n constructor(material: Material) {\n super(material, TAAJitterMaterialPlugin.Name, 300, new TAAJitterMaterialDefines());\n this.registerForExtraEvents = true;\n this.doNotSerialize = true;\n }\n\n /** @internal */\n public _updateMaterial(): void {\n this._enable(this.isEnabled);\n this.markAllDefinesAsDirty();\n }\n\n public override isCompatible(): boolean {\n return true;\n }\n\n public override getClassName(): string {\n return \"TAAJitterMaterialPlugin\";\n }\n\n public override prepareDefines(defines: TAAJitterMaterialDefines): void {\n defines.TAA_JITTER = this.isEnabled;\n }\n\n public override getUniforms(shaderLanguage = ShaderLanguage.GLSL) {\n const ubo = [{ name: \"taa_jitter\", size: 2, type: \"vec2\" }];\n if (shaderLanguage === ShaderLanguage.GLSL) {\n return {\n ubo,\n vertex: `\n #ifdef TAA_JITTER\n uniform vec2 taa_jitter;\n #endif\n `,\n };\n } else {\n return { ubo };\n }\n }\n\n public override hardBindForSubMesh(uniformBuffer: UniformBuffer): void {\n if (this.isEnabled) {\n const jitter = this._manager!.jitter;\n uniformBuffer.updateFloat2(\"taa_jitter\", jitter.x, jitter.y);\n }\n }\n\n public override getCustomCode(shaderType: string, shaderLanguage = ShaderLanguage.GLSL) {\n // We jitter instead of modifying the camera so the velocity buffer stays unaffected\n // More info: https://sugulee.wordpress.com/2021/06/21/temporal-anti-aliasingtaa-tutorial/\n if (shaderType !== \"vertex\") {\n return null;\n } else if (shaderLanguage === ShaderLanguage.WGSL) {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n vertexOutputs.position += vec4f(uniforms.taa_jitter * vertexOutputs.position.w, 0, 1);\n #endif\n `,\n };\n } else {\n return {\n CUSTOM_VERTEX_MAIN_END: `\n #ifdef TAA_JITTER\n gl_Position.xy += taa_jitter * gl_Position.w;\n #endif\n `,\n };\n }\n }\n\n public override dispose(): void {\n if (this._manager) {\n const index = this._manager._materialPlugins.indexOf(this);\n if (index !== -1) {\n this._manager._materialPlugins.splice(index, 1);\n }\n }\n }\n}\n\nRegisterClass(`BABYLON.TAAJitterMaterialPlugin`, TAAJitterMaterialPlugin);\n\n/**\n * Applies and manages the TAA jitter plugin on all materials.\n */\nexport class TAAMaterialManager {\n private _isEnabled = true;\n /**\n * Set to enable or disable the jitter offset on all materials.\n */\n public get isEnabled(): boolean {\n return this._isEnabled;\n }\n\n public set isEnabled(enabled: boolean) {\n if (this._isEnabled === enabled) {\n return;\n }\n this._isEnabled = enabled;\n for (const plugin of this._materialPlugins) {\n plugin._updateMaterial();\n }\n }\n\n /**\n * The current jitter offset to apply to all materials.\n */\n public readonly jitter = new Vector2();\n\n /** @internal */\n public readonly _materialPlugins: TAAJitterMaterialPlugin[] = [];\n\n /**\n * @param scene All materials in this scene will have a jitter offset applied to them.\n */\n constructor(scene: Scene) {\n for (const material of scene.materials) {\n this._getPlugin(material);\n }\n RegisterMaterialPlugin(TAAJitterMaterialPlugin.Name, (material) => this._getPlugin(material));\n }\n\n /**\n * Disposes of the material manager.\n */\n public dispose(): void {\n UnregisterMaterialPlugin(TAAJitterMaterialPlugin.Name);\n const plugins = this._materialPlugins.splice(0, this._materialPlugins.length);\n for (const plugin of plugins) {\n plugin.manager = null;\n }\n }\n\n private _getPlugin(material: Material): TAAJitterMaterialPlugin {\n let plugin = material.pluginManager?.getPlugin<TAAJitterMaterialPlugin>(TAAJitterMaterialPlugin.Name);\n if (!plugin) {\n plugin = new TAAJitterMaterialPlugin(material);\n }\n plugin.manager = this;\n return plugin;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem, BoundingBox, UniformBuffer } from "../index.js";
1
+ import type { Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem, BoundingBox, UniformBuffer, AbstractEngine } from "../index.js";
2
2
  import { Observable } from "../Misc/observable.js";
3
3
  import { RenderingManager } from "../Rendering/renderingManager.js";
4
4
  import { SmartArray } from "../Misc/smartArray.js";
@@ -73,6 +73,10 @@ export declare class ObjectRenderer {
73
73
  * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is false.
74
74
  */
75
75
  enableBoundingBoxRendering: boolean;
76
+ /**
77
+ * Enables the rendering of outline/overlay for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.
78
+ */
79
+ enableOutlineRendering: boolean;
76
80
  /**
77
81
  * Define the camera used to render the objects.
78
82
  */
@@ -89,6 +93,13 @@ export declare class ObjectRenderer {
89
93
  */
90
94
  get disableImageProcessing(): boolean;
91
95
  set disableImageProcessing(value: boolean);
96
+ /**
97
+ * If true, the object renderer will not set the view/projection/transformation matrices for the active camera (default: false).
98
+ * By default, the view/projection/transformation matrices are set from the active camera (either ObjectRenderer.activeCamera or scene.activeCamera).
99
+ * Sets this property to true if you want to define your own transformation matrices (use the onInitRenderingObservable observable
100
+ * to set your own matrices, to be sure they will be correctly taken into account)
101
+ */
102
+ dontSetTransformationMatrix: boolean;
92
103
  /**
93
104
  * Override the mesh isReady function with your own one.
94
105
  */
@@ -125,6 +136,7 @@ export declare class ObjectRenderer {
125
136
  * An event triggered when fast path rendering is used
126
137
  */
127
138
  readonly onFastPathRenderObservable: Observable<number>;
139
+ protected _engine: AbstractEngine;
128
140
  protected _scene: Scene;
129
141
  protected _renderingManager: RenderingManager;
130
142
  /** @internal */
@@ -135,8 +147,10 @@ export declare class ObjectRenderer {
135
147
  protected _activeMeshes: SmartArray<AbstractMesh>;
136
148
  protected _activeBoundingBoxes: SmartArray<BoundingBox>;
137
149
  protected _useUBO: boolean;
138
- protected _sceneUBO: UniformBuffer;
150
+ protected _sceneUBOs: UniformBuffer[];
139
151
  protected _currentSceneUBO: UniformBuffer;
152
+ protected _currentFrameId: number;
153
+ protected _currentSceneUBOIndex: number;
140
154
  /**
141
155
  * The options used by the object renderer
142
156
  */
@@ -188,6 +202,8 @@ export declare class ObjectRenderer {
188
202
  constructor(name: string, scene: Scene, options?: ObjectRendererOptions);
189
203
  private _releaseRenderPassId;
190
204
  private _createRenderPassId;
205
+ private _createSceneUBO;
206
+ private _getSceneUBO;
191
207
  /**
192
208
  * Resets the refresh counter of the renderer and start back from scratch.
193
209
  * Could be useful to re-render if it is setup to render only once.
@@ -54,16 +54,17 @@ export class ObjectRenderer {
54
54
  return;
55
55
  }
56
56
  this._name = value;
57
- if (this._sceneUBO) {
58
- this._sceneUBO.name = `Scene ubo for ${this.name}`;
57
+ if (this._sceneUBOs) {
58
+ for (let i = 0; i < this._sceneUBOs.length; ++i) {
59
+ this._sceneUBOs[i].name = `Scene ubo #${i} for ${this.name}`;
60
+ }
59
61
  }
60
62
  if (!this._scene) {
61
63
  return;
62
64
  }
63
- const engine = this._scene.getEngine();
64
65
  for (let i = 0; i < this._renderPassIds.length; ++i) {
65
66
  const renderPassId = this._renderPassIds[i];
66
- engine._renderPassNames[renderPassId] = `${this._name}#${i}`;
67
+ this._engine._renderPassNames[renderPassId] = `${this._name}#${i}`;
67
68
  }
68
69
  }
69
70
  /**
@@ -196,7 +197,18 @@ export class ObjectRenderer {
196
197
  * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is false.
197
198
  */
198
199
  this.enableBoundingBoxRendering = false;
200
+ /**
201
+ * Enables the rendering of outline/overlay for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.
202
+ */
203
+ this.enableOutlineRendering = true;
199
204
  this._disableImageProcessing = false;
205
+ /**
206
+ * If true, the object renderer will not set the view/projection/transformation matrices for the active camera (default: false).
207
+ * By default, the view/projection/transformation matrices are set from the active camera (either ObjectRenderer.activeCamera or scene.activeCamera).
208
+ * Sets this property to true if you want to define your own transformation matrices (use the onInitRenderingObservable observable
209
+ * to set your own matrices, to be sure they will be correctly taken into account)
210
+ */
211
+ this.dontSetTransformationMatrix = false;
200
212
  /**
201
213
  * An event triggered before rendering the objects
202
214
  */
@@ -230,6 +242,8 @@ export class ObjectRenderer {
230
242
  this._currentApplyByPostProcessSetting = false;
231
243
  this._activeMeshes = new SmartArray(256);
232
244
  this._activeBoundingBoxes = new SmartArray(32);
245
+ this._currentFrameId = -1;
246
+ this._currentSceneUBOIndex = 0;
233
247
  /** @internal */
234
248
  this._isFrozen = false;
235
249
  /** @internal */
@@ -237,9 +251,11 @@ export class ObjectRenderer {
237
251
  this._currentSceneCamera = null;
238
252
  this.name = name;
239
253
  this._scene = scene;
240
- this._useUBO = this._scene.getEngine().supportsUniformBuffers;
254
+ this._engine = this._scene.getEngine();
255
+ this._useUBO = this._engine.supportsUniformBuffers;
241
256
  if (this._useUBO) {
242
- this._sceneUBO = this._scene.createSceneUniformBuffer(`Scene ubo for ${this.name}`, false);
257
+ this._sceneUBOs = [];
258
+ this._createSceneUBO();
243
259
  }
244
260
  this.renderList = [];
245
261
  this._renderPassIds = [];
@@ -256,18 +272,30 @@ export class ObjectRenderer {
256
272
  this._scene.addObjectRenderer(this);
257
273
  }
258
274
  _releaseRenderPassId() {
259
- const engine = this._scene.getEngine();
260
275
  for (let i = 0; i < this.options.numPasses; ++i) {
261
- engine.releaseRenderPassId(this._renderPassIds[i]);
276
+ this._engine.releaseRenderPassId(this._renderPassIds[i]);
262
277
  }
263
278
  this._renderPassIds.length = 0;
264
279
  }
265
280
  _createRenderPassId() {
266
281
  this._releaseRenderPassId();
267
- const engine = this._scene.getEngine();
268
282
  for (let i = 0; i < this.options.numPasses; ++i) {
269
- this._renderPassIds[i] = engine.createRenderPassId(`${this.name}#${i}`);
283
+ this._renderPassIds[i] = this._engine.createRenderPassId(`${this.name}#${i}`);
284
+ }
285
+ }
286
+ _createSceneUBO() {
287
+ const index = this._sceneUBOs.length;
288
+ this._sceneUBOs.push(this._scene.createSceneUniformBuffer(`Scene ubo #${index} for ${this.name}`, false));
289
+ }
290
+ _getSceneUBO() {
291
+ if (this._currentFrameId !== this._engine.frameId) {
292
+ this._currentSceneUBOIndex = 0;
293
+ this._currentFrameId = this._engine.frameId;
270
294
  }
295
+ if (this._currentSceneUBOIndex >= this._sceneUBOs.length) {
296
+ this._createSceneUBO();
297
+ }
298
+ return this._sceneUBOs[this._currentSceneUBOIndex++];
271
299
  }
272
300
  /**
273
301
  * Resets the refresh counter of the renderer and start back from scratch.
@@ -365,19 +393,20 @@ export class ObjectRenderer {
365
393
  * @param viewportHeight Height of the viewport to render to
366
394
  */
367
395
  initRender(viewportWidth, viewportHeight) {
368
- const engine = this._scene.getEngine();
369
396
  const camera = this.activeCamera ?? this._scene.activeCamera;
370
- this.onInitRenderingObservable.notifyObservers(this);
371
397
  this._currentSceneCamera = this._scene.activeCamera;
372
398
  if (this._useUBO) {
373
399
  this._currentSceneUBO = this._scene.getSceneUniformBuffer();
374
400
  this._currentSceneUBO.unbindEffect();
375
- this._scene.setSceneUniformBuffer(this._sceneUBO);
401
+ this._scene.setSceneUniformBuffer(this._getSceneUBO());
376
402
  }
403
+ this.onInitRenderingObservable.notifyObservers(this);
377
404
  if (camera) {
378
- this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));
405
+ if (!this.dontSetTransformationMatrix) {
406
+ this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));
407
+ }
379
408
  this._scene.activeCamera = camera;
380
- engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);
409
+ this._engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);
381
410
  }
382
411
  if (this._useUBO) {
383
412
  this._scene.finalizeSceneUbo();
@@ -400,7 +429,7 @@ export class ObjectRenderer {
400
429
  if (this.activeCamera && this.activeCamera !== scene.activeCamera) {
401
430
  scene.setTransformMatrix(this._currentSceneCamera.getViewMatrix(), this._currentSceneCamera.getProjectionMatrix(true));
402
431
  }
403
- scene.getEngine().setViewport(this._currentSceneCamera.viewport);
432
+ this._engine.setViewport(this._currentSceneCamera.viewport);
404
433
  }
405
434
  scene.resetCachedMaterial();
406
435
  this.onFinishRenderingObservable.notifyObservers(this);
@@ -411,17 +440,22 @@ export class ObjectRenderer {
411
440
  * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable
412
441
  */
413
442
  render(passIndex = 0, skipOnAfterRenderObservable = false) {
414
- const scene = this._scene;
415
- const engine = scene.getEngine();
416
- const currentRenderPassId = engine.currentRenderPassId;
417
- engine.currentRenderPassId = this._renderPassIds[passIndex];
443
+ const currentRenderPassId = this._engine.currentRenderPassId;
444
+ this._engine.currentRenderPassId = this._renderPassIds[passIndex];
418
445
  this.onBeforeRenderObservable.notifyObservers(passIndex);
419
- const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === 1;
446
+ const fastPath = this._engine.snapshotRendering && this._engine.snapshotRenderingMode === 1;
420
447
  if (!fastPath) {
421
448
  const currentRenderList = this._prepareRenderingManager(passIndex);
449
+ // The cast to "any" is to avoid an error in ES6 in case you don't import outlineRenderer
450
+ const outlineRenderer = this._scene.getOutlineRenderer?.();
451
+ const outlineRendererIsEnabled = outlineRenderer?.enabled;
452
+ outlineRenderer.enabled = this.enableOutlineRendering;
422
453
  this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);
423
454
  this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);
424
455
  this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);
456
+ if (outlineRenderer) {
457
+ outlineRenderer.enabled = outlineRendererIsEnabled;
458
+ }
425
459
  }
426
460
  else {
427
461
  this.onFastPathRenderObservable.notifyObservers(passIndex);
@@ -429,13 +463,12 @@ export class ObjectRenderer {
429
463
  if (!skipOnAfterRenderObservable) {
430
464
  this.onAfterRenderObservable.notifyObservers(passIndex);
431
465
  }
432
- engine.currentRenderPassId = currentRenderPassId;
466
+ this._engine.currentRenderPassId = currentRenderPassId;
433
467
  }
434
468
  /** @internal */
435
469
  _checkReadiness() {
436
470
  const scene = this._scene;
437
- const engine = scene.getEngine();
438
- const currentRenderPassId = engine.currentRenderPassId;
471
+ const currentRenderPassId = this._engine.currentRenderPassId;
439
472
  let returnValue = true;
440
473
  if (!scene.getViewMatrix()) {
441
474
  // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene
@@ -446,7 +479,7 @@ export class ObjectRenderer {
446
479
  let currentRenderList = null;
447
480
  const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;
448
481
  const defaultRenderListLength = this.renderList ? this.renderList.length : scene.frameGraph ? scene.meshes.length : scene.getActiveMeshes().length;
449
- engine.currentRenderPassId = this._renderPassIds[passIndex];
482
+ this._engine.currentRenderPassId = this._renderPassIds[passIndex];
450
483
  this.onBeforeRenderObservable.notifyObservers(passIndex);
451
484
  if (this.getCustomRenderList) {
452
485
  currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);
@@ -485,7 +518,7 @@ export class ObjectRenderer {
485
518
  returnValue = false;
486
519
  }
487
520
  }
488
- engine.currentRenderPassId = currentRenderPassId;
521
+ this._engine.currentRenderPassId = currentRenderPassId;
489
522
  return returnValue;
490
523
  }
491
524
  _prepareRenderingManager(passIndex = 0, winterIsComing = false) {
@@ -533,7 +566,10 @@ export class ObjectRenderer {
533
566
  this._renderingManager.reset();
534
567
  this._activeMeshes.reset();
535
568
  this._activeBoundingBoxes.reset();
536
- this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer.reset();
569
+ // We do not check option.enableBoundingBoxRendering before resetting the current list of bounding boxes, because:
570
+ // * if bounding box rendering is enabled, we want to start with an empty list and add new bounding boxes to it
571
+ // * if bounding box rendering is disabled, we don't want to render any bounding boxes that may have been generated by previous code
572
+ boundingBoxRenderer && boundingBoxRenderer.reset();
537
573
  const sceneRenderId = scene.getRenderId();
538
574
  const currentFrameId = scene.getFrameId();
539
575
  for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {
@@ -692,8 +728,12 @@ export class ObjectRenderer {
692
728
  this.onFastPathRenderObservable.clear();
693
729
  this._releaseRenderPassId();
694
730
  this.renderList = null;
695
- this._sceneUBO?.dispose();
696
- this._sceneUBO = undefined;
731
+ if (this._sceneUBOs) {
732
+ for (const ubo of this._sceneUBOs) {
733
+ ubo.dispose();
734
+ }
735
+ }
736
+ this._sceneUBOs = undefined;
697
737
  this._scene.removeObjectRenderer(this);
698
738
  }
699
739
  /** @internal */