@onerjs/core 8.23.12 → 8.25.1

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 (287) hide show
  1. package/Behaviors/Meshes/index.d.ts +1 -0
  2. package/Behaviors/Meshes/index.js +1 -0
  3. package/Behaviors/Meshes/index.js.map +1 -1
  4. package/Behaviors/Meshes/pointerDragBehavior.d.ts +6 -34
  5. package/Behaviors/Meshes/pointerDragBehavior.js +0 -12
  6. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  7. package/Behaviors/Meshes/pointerDragEvents.d.ts +38 -0
  8. package/Behaviors/Meshes/pointerDragEvents.js +2 -0
  9. package/Behaviors/Meshes/pointerDragEvents.js.map +1 -0
  10. package/Buffers/storageBuffer.d.ts +6 -0
  11. package/Buffers/storageBuffer.js +8 -0
  12. package/Buffers/storageBuffer.js.map +1 -1
  13. package/Engines/Extensions/engine.multiRender.d.ts +2 -1
  14. package/Engines/Extensions/engine.multiRender.js +12 -7
  15. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  16. package/Engines/Extensions/engine.multiview.js +5 -5
  17. package/Engines/Extensions/engine.multiview.js.map +1 -1
  18. package/Engines/WebGPU/Extensions/engine.multiRender.d.ts +2 -1
  19. package/Engines/WebGPU/Extensions/engine.multiRender.js +12 -7
  20. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  21. package/Engines/WebGPU/webgpuDrawContext.d.ts +6 -0
  22. package/Engines/WebGPU/webgpuDrawContext.js +9 -0
  23. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  24. package/Engines/abstractEngine.js +3 -3
  25. package/Engines/abstractEngine.js.map +1 -1
  26. package/Engines/engineCapabilities.d.ts +4 -0
  27. package/Engines/engineCapabilities.js.map +1 -1
  28. package/Engines/engineFactory.d.ts +4 -1
  29. package/Engines/engineFactory.js.map +1 -1
  30. package/Engines/nativeEngine.js +2 -0
  31. package/Engines/nativeEngine.js.map +1 -1
  32. package/Engines/nullEngine.js +2 -0
  33. package/Engines/nullEngine.js.map +1 -1
  34. package/Engines/thinEngine.js +17 -0
  35. package/Engines/thinEngine.js.map +1 -1
  36. package/Engines/webgpuEngine.d.ts +7 -0
  37. package/Engines/webgpuEngine.js +19 -1
  38. package/Engines/webgpuEngine.js.map +1 -1
  39. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +12 -0
  40. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +52 -0
  41. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  42. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +0 -3
  43. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  44. package/FrameGraph/Node/nodeRenderGraph.js +7 -2
  45. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  46. package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +4 -0
  47. package/FrameGraph/Tasks/Layers/baseLayerTask.js +7 -1
  48. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  49. package/FrameGraph/Tasks/Misc/cullObjectsTask.js +11 -2
  50. package/FrameGraph/Tasks/Misc/cullObjectsTask.js.map +1 -1
  51. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +6 -6
  52. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  53. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +27 -1
  54. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +76 -8
  55. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  56. package/FrameGraph/Tasks/Texture/clearTextureTask.js +2 -1
  57. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  58. package/FrameGraph/frameGraph.js +0 -7
  59. package/FrameGraph/frameGraph.js.map +1 -1
  60. package/FrameGraph/frameGraphRenderTarget.js +1 -1
  61. package/FrameGraph/frameGraphRenderTarget.js.map +1 -1
  62. package/Gizmos/cameraGizmo.js +2 -2
  63. package/Gizmos/cameraGizmo.js.map +1 -1
  64. package/Gizmos/lightGizmo.js +2 -2
  65. package/Gizmos/lightGizmo.js.map +1 -1
  66. package/Gizmos/positionGizmo.d.ts +7 -6
  67. package/Gizmos/positionGizmo.js +3 -9
  68. package/Gizmos/positionGizmo.js.map +1 -1
  69. package/Gizmos/rotationGizmo.d.ts +7 -6
  70. package/Gizmos/rotationGizmo.js +3 -9
  71. package/Gizmos/rotationGizmo.js.map +1 -1
  72. package/Gizmos/scaleGizmo.d.ts +7 -6
  73. package/Gizmos/scaleGizmo.js +3 -9
  74. package/Gizmos/scaleGizmo.js.map +1 -1
  75. package/Instrumentation/sceneInstrumentation.d.ts +2 -0
  76. package/Instrumentation/sceneInstrumentation.js +58 -32
  77. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  78. package/Lights/Clustered/clusteredLightContainer.d.ts +102 -0
  79. package/Lights/Clustered/clusteredLightContainer.js +487 -0
  80. package/Lights/Clustered/clusteredLightContainer.js.map +1 -0
  81. package/Lights/Clustered/clusteredLightingSceneComponent.d.ts +34 -0
  82. package/Lights/Clustered/clusteredLightingSceneComponent.js +47 -0
  83. package/Lights/Clustered/clusteredLightingSceneComponent.js.map +1 -0
  84. package/Lights/Clustered/index.d.ts +6 -0
  85. package/Lights/Clustered/index.js +7 -0
  86. package/Lights/Clustered/index.js.map +1 -0
  87. package/Lights/Shadows/cascadedShadowGenerator.js +1 -0
  88. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  89. package/Lights/Shadows/shadowGenerator.js +10 -8
  90. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  91. package/Lights/index.d.ts +1 -0
  92. package/Lights/index.js +1 -0
  93. package/Lights/index.js.map +1 -1
  94. package/Lights/light.d.ts +7 -1
  95. package/Lights/light.js +7 -1
  96. package/Lights/light.js.map +1 -1
  97. package/Lights/lightConstants.d.ts +4 -0
  98. package/Lights/lightConstants.js +4 -0
  99. package/Lights/lightConstants.js.map +1 -1
  100. package/Lights/spotLight.d.ts +6 -3
  101. package/Lights/spotLight.js.map +1 -1
  102. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js +0 -5
  103. package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js.map +1 -1
  104. package/Materials/PBR/pbrBaseMaterial.js +3 -2
  105. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  106. package/Materials/Textures/renderTargetTexture.d.ts +5 -0
  107. package/Materials/Textures/renderTargetTexture.js +9 -0
  108. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  109. package/Materials/materialHelper.functions.d.ts +2 -1
  110. package/Materials/materialHelper.functions.js +12 -4
  111. package/Materials/materialHelper.functions.js.map +1 -1
  112. package/Materials/standardMaterial.js +4 -3
  113. package/Materials/standardMaterial.js.map +1 -1
  114. package/Materials/uniformBuffer.d.ts +7 -4
  115. package/Materials/uniformBuffer.js +37 -15
  116. package/Materials/uniformBuffer.js.map +1 -1
  117. package/Maths/math.vector.d.ts +1 -1
  118. package/Maths/math.vector.js +2 -2
  119. package/Maths/math.vector.js.map +1 -1
  120. package/Meshes/abstractMesh.d.ts +25 -0
  121. package/Meshes/abstractMesh.hotSpot.js +37 -25
  122. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  123. package/Meshes/abstractMesh.js +4 -0
  124. package/Meshes/abstractMesh.js.map +1 -1
  125. package/Meshes/csg2.js +6 -4
  126. package/Meshes/csg2.js.map +1 -1
  127. package/Meshes/geometry.js +1 -1
  128. package/Meshes/geometry.js.map +1 -1
  129. package/Meshes/instancedMesh.d.ts +1 -0
  130. package/Meshes/instancedMesh.js +3 -0
  131. package/Meshes/instancedMesh.js.map +1 -1
  132. package/Meshes/linesMesh.d.ts +5 -3
  133. package/Meshes/linesMesh.js +27 -8
  134. package/Meshes/linesMesh.js.map +1 -1
  135. package/Meshes/mesh.d.ts +0 -19
  136. package/Meshes/mesh.js +2 -26
  137. package/Meshes/mesh.js.map +1 -1
  138. package/Meshes/mesh.vertexData.d.ts +2 -2
  139. package/Meshes/mesh.vertexData.js.map +1 -1
  140. package/Misc/dumpTools.d.ts +1 -1
  141. package/Misc/dumpTools.js +23 -14
  142. package/Misc/dumpTools.js.map +1 -1
  143. package/Misc/fileTools.js +8 -1
  144. package/Misc/fileTools.js.map +1 -1
  145. package/Misc/index.d.ts +1 -0
  146. package/Misc/index.js +1 -0
  147. package/Misc/index.js.map +1 -1
  148. package/Misc/khronosTextureContainer2.js +16 -7
  149. package/Misc/khronosTextureContainer2.js.map +1 -1
  150. package/Misc/lazy.d.ts +16 -0
  151. package/Misc/lazy.js +25 -0
  152. package/Misc/lazy.js.map +1 -0
  153. package/Misc/screenshotTools.js +1 -1
  154. package/Misc/screenshotTools.js.map +1 -1
  155. package/Misc/snapshotRenderingHelper.d.ts +6 -3
  156. package/Misc/snapshotRenderingHelper.js +37 -6
  157. package/Misc/snapshotRenderingHelper.js.map +1 -1
  158. package/Particles/IParticleSystem.d.ts +4 -0
  159. package/Particles/IParticleSystem.js.map +1 -1
  160. package/Particles/Node/Blocks/Emitters/createParticleBlock.d.ts +4 -0
  161. package/Particles/Node/Blocks/Emitters/createParticleBlock.js +17 -3
  162. package/Particles/Node/Blocks/Emitters/createParticleBlock.js.map +1 -1
  163. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js +0 -1
  164. package/Particles/Node/Blocks/Emitters/meshShapeBlock.js.map +1 -1
  165. package/Particles/Node/Blocks/Update/basicColorUpdateBlock.d.ts +31 -0
  166. package/Particles/Node/Blocks/Update/basicColorUpdateBlock.js +67 -0
  167. package/Particles/Node/Blocks/Update/basicColorUpdateBlock.js.map +1 -0
  168. package/Particles/Node/Blocks/index.d.ts +1 -0
  169. package/Particles/Node/Blocks/index.js +1 -0
  170. package/Particles/Node/Blocks/index.js.map +1 -1
  171. package/Particles/Node/Blocks/particleInputBlock.js +1 -0
  172. package/Particles/Node/Blocks/particleInputBlock.js.map +1 -1
  173. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +2 -2
  174. package/Particles/Node/Blocks/particleSourceTextureBlock.js +3 -3
  175. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  176. package/Particles/Node/Blocks/systemBlock.d.ts +3 -0
  177. package/Particles/Node/Blocks/systemBlock.js +3 -0
  178. package/Particles/Node/Blocks/systemBlock.js.map +1 -1
  179. package/Particles/Node/Enums/nodeParticleContextualSources.d.ts +3 -1
  180. package/Particles/Node/Enums/nodeParticleContextualSources.js +2 -0
  181. package/Particles/Node/Enums/nodeParticleContextualSources.js.map +1 -1
  182. package/Particles/Node/nodeParticleBuildState.js +3 -1
  183. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  184. package/Particles/Node/nodeParticleSystemSet.helper.d.ts +2 -1
  185. package/Particles/Node/nodeParticleSystemSet.helper.js +118 -61
  186. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  187. package/Particles/Node/nodeParticleSystemSet.js +1 -0
  188. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  189. package/Particles/particle.d.ts +8 -0
  190. package/Particles/particle.js +10 -0
  191. package/Particles/particle.js.map +1 -1
  192. package/Particles/particleSystem.d.ts +2 -4
  193. package/Particles/particleSystem.js +2 -4
  194. package/Particles/particleSystem.js.map +1 -1
  195. package/Particles/thinParticleSystem.d.ts +6 -0
  196. package/Particles/thinParticleSystem.function.d.ts +2 -0
  197. package/Particles/thinParticleSystem.function.js +3 -0
  198. package/Particles/thinParticleSystem.function.js.map +1 -1
  199. package/Particles/thinParticleSystem.js +15 -5
  200. package/Particles/thinParticleSystem.js.map +1 -1
  201. package/Rendering/objectRenderer.d.ts +33 -3
  202. package/Rendering/objectRenderer.js +164 -38
  203. package/Rendering/objectRenderer.js.map +1 -1
  204. package/Shaders/ShadersInclude/clusteredLightingFunctions.d.ts +5 -0
  205. package/Shaders/ShadersInclude/clusteredLightingFunctions.js +19 -0
  206. package/Shaders/ShadersInclude/clusteredLightingFunctions.js.map +1 -0
  207. package/Shaders/ShadersInclude/helperFunctions.js +6 -1
  208. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  209. package/Shaders/ShadersInclude/lightFragment.js +33 -1
  210. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  211. package/Shaders/ShadersInclude/lightFragmentDeclaration.js +3 -0
  212. package/Shaders/ShadersInclude/lightFragmentDeclaration.js.map +1 -1
  213. package/Shaders/ShadersInclude/lightUboDeclaration.js +5 -0
  214. package/Shaders/ShadersInclude/lightUboDeclaration.js.map +1 -1
  215. package/Shaders/ShadersInclude/lightVxUboDeclaration.js +2 -0
  216. package/Shaders/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  217. package/Shaders/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  218. package/Shaders/ShadersInclude/lightsFragmentFunctions.js +20 -0
  219. package/Shaders/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  220. package/Shaders/ShadersInclude/pbrBlockPrePass.js +3 -1
  221. package/Shaders/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  222. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.d.ts +7 -0
  223. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +125 -0
  224. package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -0
  225. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  226. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  227. package/Shaders/default.fragment.js +5 -0
  228. package/Shaders/default.fragment.js.map +1 -1
  229. package/Shaders/default.vertex.js +6 -0
  230. package/Shaders/default.vertex.js.map +1 -1
  231. package/Shaders/lightProxy.fragment.d.ts +5 -0
  232. package/Shaders/lightProxy.fragment.js +13 -0
  233. package/Shaders/lightProxy.fragment.js.map +1 -0
  234. package/Shaders/lightProxy.vertex.d.ts +8 -0
  235. package/Shaders/lightProxy.vertex.js +19 -0
  236. package/Shaders/lightProxy.vertex.js.map +1 -0
  237. package/Shaders/pbr.fragment.d.ts +1 -0
  238. package/Shaders/pbr.fragment.js +4 -0
  239. package/Shaders/pbr.fragment.js.map +1 -1
  240. package/Shaders/pbr.vertex.js +6 -0
  241. package/Shaders/pbr.vertex.js.map +1 -1
  242. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.d.ts +5 -0
  243. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js +24 -0
  244. package/ShadersWGSL/ShadersInclude/clusteredLightingFunctions.js.map +1 -0
  245. package/ShadersWGSL/ShadersInclude/lightFragment.js +33 -1
  246. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  247. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +6 -0
  248. package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
  249. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +3 -0
  250. package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
  251. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  252. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +22 -1
  253. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  254. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +3 -1
  255. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  256. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.d.ts +2 -0
  257. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +115 -0
  258. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  259. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js +3 -0
  260. package/ShadersWGSL/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  261. package/ShadersWGSL/default.fragment.js +5 -0
  262. package/ShadersWGSL/default.fragment.js.map +1 -1
  263. package/ShadersWGSL/default.vertex.js +6 -0
  264. package/ShadersWGSL/default.vertex.js.map +1 -1
  265. package/ShadersWGSL/lightProxy.fragment.d.ts +5 -0
  266. package/ShadersWGSL/lightProxy.fragment.js +13 -0
  267. package/ShadersWGSL/lightProxy.fragment.js.map +1 -0
  268. package/ShadersWGSL/lightProxy.vertex.d.ts +7 -0
  269. package/ShadersWGSL/lightProxy.vertex.js +19 -0
  270. package/ShadersWGSL/lightProxy.vertex.js.map +1 -0
  271. package/ShadersWGSL/pbr.vertex.js +6 -0
  272. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  273. package/Sprites/spriteManager.d.ts +5 -0
  274. package/Sprites/spriteManager.js +6 -0
  275. package/Sprites/spriteManager.js.map +1 -1
  276. package/Sprites/spriteRenderer.d.ts +5 -2
  277. package/Sprites/spriteRenderer.js.map +1 -1
  278. package/States/alphaCullingState.d.ts +3 -1
  279. package/States/alphaCullingState.js +39 -37
  280. package/States/alphaCullingState.js.map +1 -1
  281. package/package.json +1 -1
  282. package/scene.d.ts +28 -1
  283. package/scene.js +198 -34
  284. package/scene.js.map +1 -1
  285. package/sceneComponent.d.ts +2 -0
  286. package/sceneComponent.js +2 -0
  287. package/sceneComponent.js.map +1 -1
@@ -1,6 +1,7 @@
1
- import type { SmartArray, Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem } from "../index.js";
1
+ import type { Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem, BoundingBox, UniformBuffer } from "../index.js";
2
2
  import { Observable } from "../Misc/observable.js";
3
3
  import { RenderingManager } from "../Rendering/renderingManager.js";
4
+ import { SmartArray } from "../Misc/smartArray.js";
4
5
  /**
5
6
  * Defines the options of the object renderer
6
7
  */
@@ -112,18 +113,30 @@ export declare class ObjectRenderer {
112
113
  * An event triggered after the rendering group is processed
113
114
  */
114
115
  readonly onAfterRenderingManagerRenderObservable: Observable<number>;
116
+ /**
117
+ * An event triggered when initRender is called
118
+ */
119
+ readonly onInitRenderingObservable: Observable<ObjectRenderer>;
120
+ /**
121
+ * An event triggered when finishRender is called
122
+ */
123
+ readonly onFinishRenderingObservable: Observable<ObjectRenderer>;
115
124
  /**
116
125
  * An event triggered when fast path rendering is used
117
126
  */
118
127
  readonly onFastPathRenderObservable: Observable<number>;
119
128
  protected _scene: Scene;
120
- /** @internal */
121
- _renderingManager: RenderingManager;
129
+ protected _renderingManager: RenderingManager;
122
130
  /** @internal */
123
131
  _waitingRenderList?: string[];
124
132
  protected _currentRefreshId: number;
125
133
  protected _refreshRate: number;
126
134
  protected _currentApplyByPostProcessSetting: boolean;
135
+ protected _activeMeshes: SmartArray<AbstractMesh>;
136
+ protected _activeBoundingBoxes: SmartArray<BoundingBox>;
137
+ protected _useUBO: boolean;
138
+ protected _sceneUBO: UniformBuffer;
139
+ protected _currentSceneUBO: UniformBuffer;
127
140
  /**
128
141
  * The options used by the object renderer
129
142
  */
@@ -147,12 +160,25 @@ export declare class ObjectRenderer {
147
160
  * Gets the current value of the refreshId counter
148
161
  */
149
162
  get currentRefreshId(): number;
163
+ /**
164
+ * Gets the array of active meshes
165
+ * @returns an array of AbstractMesh
166
+ */
167
+ getActiveMeshes(): SmartArray<AbstractMesh>;
150
168
  /**
151
169
  * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer
152
170
  * @param mesh mesh or array of meshes
153
171
  * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.
154
172
  */
155
173
  setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void;
174
+ /** @internal */
175
+ _isFrozen: boolean;
176
+ /** @internal */
177
+ _freezeActiveMeshesCancel: Nullable<() => void>;
178
+ /** @internal */
179
+ _freezeActiveMeshes(freezeMeshes: boolean): void;
180
+ /** @internal */
181
+ _unfreezeActiveMeshes(): void;
156
182
  /**
157
183
  * Instantiates an object renderer.
158
184
  * @param name The friendly name of the object renderer
@@ -212,6 +238,10 @@ export declare class ObjectRenderer {
212
238
  /** @internal */
213
239
  _checkReadiness(): boolean;
214
240
  private _prepareRenderingManager;
241
+ /**
242
+ * Gets the rendering manager
243
+ */
244
+ get renderingManager(): RenderingManager;
215
245
  /**
216
246
  * Overrides the default sort function applied in the rendering group to prepare the meshes.
217
247
  * This allowed control for front to back rendering or reversely depending of the special needs.
@@ -2,6 +2,9 @@ import { Observable } from "../Misc/observable.js";
2
2
  import { RenderingManager } from "../Rendering/renderingManager.js";
3
3
 
4
4
  import { _ObserveArray } from "../Misc/arrayTools.js";
5
+ import { _RetryWithInterval } from "../Misc/timingTools.js";
6
+ import { Logger } from "../Misc/logger.js";
7
+ import { SmartArray } from "../Misc/smartArray.js";
5
8
  /**
6
9
  * A class that renders objects to the currently bound render target.
7
10
  * This class only renders objects, and is not concerned with the output texture or post-processing.
@@ -51,6 +54,9 @@ export class ObjectRenderer {
51
54
  return;
52
55
  }
53
56
  this._name = value;
57
+ if (this._sceneUBO) {
58
+ this._sceneUBO.name = `Scene ubo for ${this.name}`;
59
+ }
54
60
  if (!this._scene) {
55
61
  return;
56
62
  }
@@ -72,6 +78,13 @@ export class ObjectRenderer {
72
78
  get currentRefreshId() {
73
79
  return this._currentRefreshId;
74
80
  }
81
+ /**
82
+ * Gets the array of active meshes
83
+ * @returns an array of AbstractMesh
84
+ */
85
+ getActiveMeshes() {
86
+ return this._activeMeshes;
87
+ }
75
88
  /**
76
89
  * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer
77
90
  * @param mesh mesh or array of meshes
@@ -95,6 +108,47 @@ export class ObjectRenderer {
95
108
  }
96
109
  }
97
110
  }
111
+ /** @internal */
112
+ _freezeActiveMeshes(freezeMeshes) {
113
+ this._freezeActiveMeshesCancel = _RetryWithInterval(() => {
114
+ return this._checkReadiness();
115
+ }, () => {
116
+ this._freezeActiveMeshesCancel = null;
117
+ if (freezeMeshes) {
118
+ for (let index = 0; index < this._activeMeshes.length; index++) {
119
+ this._activeMeshes.data[index]._freeze();
120
+ }
121
+ }
122
+ this._prepareRenderingManager(0, true);
123
+ this._isFrozen = true;
124
+ }, (err, isTimeout) => {
125
+ this._freezeActiveMeshesCancel = null;
126
+ if (!isTimeout) {
127
+ Logger.Error("ObjectRenderer: An unexpected error occurred while waiting for the renderer to be ready.");
128
+ if (err) {
129
+ Logger.Error(err);
130
+ if (err.stack) {
131
+ Logger.Error(err.stack);
132
+ }
133
+ }
134
+ }
135
+ else {
136
+ Logger.Error(`ObjectRenderer: Timeout while waiting for the renderer to be ready.`);
137
+ if (err) {
138
+ Logger.Error(err);
139
+ }
140
+ }
141
+ });
142
+ }
143
+ /** @internal */
144
+ _unfreezeActiveMeshes() {
145
+ this._freezeActiveMeshesCancel?.();
146
+ this._freezeActiveMeshesCancel = null;
147
+ for (let index = 0; index < this._activeMeshes.length; index++) {
148
+ this._activeMeshes.data[index]._unFreeze();
149
+ }
150
+ this._isFrozen = false;
151
+ }
98
152
  /**
99
153
  * Instantiates an object renderer.
100
154
  * @param name The friendly name of the object renderer
@@ -159,6 +213,14 @@ export class ObjectRenderer {
159
213
  * An event triggered after the rendering group is processed
160
214
  */
161
215
  this.onAfterRenderingManagerRenderObservable = new Observable();
216
+ /**
217
+ * An event triggered when initRender is called
218
+ */
219
+ this.onInitRenderingObservable = new Observable();
220
+ /**
221
+ * An event triggered when finishRender is called
222
+ */
223
+ this.onFinishRenderingObservable = new Observable();
162
224
  /**
163
225
  * An event triggered when fast path rendering is used
164
226
  */
@@ -166,9 +228,19 @@ export class ObjectRenderer {
166
228
  this._currentRefreshId = -1;
167
229
  this._refreshRate = 1;
168
230
  this._currentApplyByPostProcessSetting = false;
231
+ this._activeMeshes = new SmartArray(256);
232
+ this._activeBoundingBoxes = new SmartArray(32);
233
+ /** @internal */
234
+ this._isFrozen = false;
235
+ /** @internal */
236
+ this._freezeActiveMeshesCancel = null;
169
237
  this._currentSceneCamera = null;
170
238
  this.name = name;
171
239
  this._scene = scene;
240
+ this._useUBO = this._scene.getEngine().supportsUniformBuffers;
241
+ if (this._useUBO) {
242
+ this._sceneUBO = this._scene.createSceneUniformBuffer(`Scene ubo for ${this.name}`, false);
243
+ }
172
244
  this.renderList = [];
173
245
  this._renderPassIds = [];
174
246
  this.options = {
@@ -181,6 +253,7 @@ export class ObjectRenderer {
181
253
  // Rendering groups
182
254
  this._renderingManager = new RenderingManager(scene);
183
255
  this._renderingManager._useSceneAutoClearSetup = true;
256
+ this._scene.addObjectRenderer(this);
184
257
  }
185
258
  _releaseRenderPassId() {
186
259
  const engine = this._scene.getEngine();
@@ -294,14 +367,21 @@ export class ObjectRenderer {
294
367
  initRender(viewportWidth, viewportHeight) {
295
368
  const engine = this._scene.getEngine();
296
369
  const camera = this.activeCamera ?? this._scene.activeCamera;
370
+ this.onInitRenderingObservable.notifyObservers(this);
297
371
  this._currentSceneCamera = this._scene.activeCamera;
372
+ if (this._useUBO) {
373
+ this._currentSceneUBO = this._scene.getSceneUniformBuffer();
374
+ this._currentSceneUBO.unbindEffect();
375
+ this._scene.setSceneUniformBuffer(this._sceneUBO);
376
+ }
298
377
  if (camera) {
299
- if (camera !== this._scene.activeCamera) {
300
- this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));
301
- this._scene.activeCamera = camera;
302
- }
378
+ this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));
379
+ this._scene.activeCamera = camera;
303
380
  engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);
304
381
  }
382
+ if (this._useUBO) {
383
+ this._scene.finalizeSceneUbo();
384
+ }
305
385
  this._defaultRenderListPrepared = false;
306
386
  }
307
387
  /**
@@ -309,6 +389,9 @@ export class ObjectRenderer {
309
389
  */
310
390
  finishRender() {
311
391
  const scene = this._scene;
392
+ if (this._useUBO) {
393
+ this._scene.setSceneUniformBuffer(this._currentSceneUBO);
394
+ }
312
395
  if (this._disableImageProcessing) {
313
396
  scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;
314
397
  }
@@ -320,6 +403,7 @@ export class ObjectRenderer {
320
403
  scene.getEngine().setViewport(this._currentSceneCamera.viewport);
321
404
  }
322
405
  scene.resetCachedMaterial();
406
+ this.onFinishRenderingObservable.notifyObservers(this);
323
407
  }
324
408
  /**
325
409
  * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.
@@ -334,26 +418,7 @@ export class ObjectRenderer {
334
418
  this.onBeforeRenderObservable.notifyObservers(passIndex);
335
419
  const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === 1;
336
420
  if (!fastPath) {
337
- // Get the list of meshes to render
338
- let currentRenderList = null;
339
- const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;
340
- const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;
341
- if (this.getCustomRenderList) {
342
- currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);
343
- }
344
- if (!currentRenderList) {
345
- // No custom render list provided, we prepare the rendering for the default list, but check
346
- // first if we did not already performed the preparation before so as to avoid re-doing it several times
347
- if (!this._defaultRenderListPrepared) {
348
- this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, !this.renderList || this.forceLayerMaskCheck);
349
- this._defaultRenderListPrepared = true;
350
- }
351
- currentRenderList = defaultRenderList;
352
- }
353
- else {
354
- // Prepare the rendering for the custom render list provided
355
- this._prepareRenderingManager(currentRenderList, currentRenderList.length, this.forceLayerMaskCheck);
356
- }
421
+ const currentRenderList = this._prepareRenderingManager(passIndex);
357
422
  this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);
358
423
  this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);
359
424
  this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);
@@ -379,8 +444,8 @@ export class ObjectRenderer {
379
444
  const numPasses = this.options.numPasses;
380
445
  for (let passIndex = 0; passIndex < numPasses && returnValue; passIndex++) {
381
446
  let currentRenderList = null;
382
- const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;
383
- const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;
447
+ const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;
448
+ const defaultRenderListLength = this.renderList ? this.renderList.length : scene.frameGraph ? scene.meshes.length : scene.getActiveMeshes().length;
384
449
  engine.currentRenderPassId = this._renderPassIds[passIndex];
385
450
  this.onBeforeRenderObservable.notifyObservers(passIndex);
386
451
  if (this.getCustomRenderList) {
@@ -423,13 +488,52 @@ export class ObjectRenderer {
423
488
  engine.currentRenderPassId = currentRenderPassId;
424
489
  return returnValue;
425
490
  }
426
- _prepareRenderingManager(currentRenderList, currentRenderListLength, checkLayerMask) {
491
+ _prepareRenderingManager(passIndex = 0, winterIsComing = false) {
427
492
  const scene = this._scene;
493
+ // Get the list of meshes to dispatch to the rendering manager
494
+ let currentRenderList = null;
495
+ let currentRenderListLength = 0;
496
+ let checkLayerMask = false;
497
+ const defaultRenderList = this.renderList ? this.renderList : scene.frameGraph ? scene.meshes : scene.getActiveMeshes().data;
498
+ const defaultRenderListLength = this.renderList ? this.renderList.length : scene.frameGraph ? scene.meshes.length : scene.getActiveMeshes().length;
499
+ if (this.getCustomRenderList) {
500
+ currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);
501
+ }
502
+ if (!currentRenderList) {
503
+ // No custom render list provided, we prepare the rendering for the default list, but check
504
+ // first if we did not already performed the preparation (in this frame) before so as to avoid re-doing it several times
505
+ if (this._defaultRenderListPrepared && !winterIsComing) {
506
+ return defaultRenderList;
507
+ }
508
+ this._defaultRenderListPrepared = true;
509
+ currentRenderList = defaultRenderList;
510
+ currentRenderListLength = defaultRenderListLength;
511
+ checkLayerMask = !this.renderList || this.forceLayerMaskCheck;
512
+ }
513
+ else {
514
+ // Prepare the rendering for the custom render list provided
515
+ currentRenderListLength = currentRenderList.length;
516
+ checkLayerMask = this.forceLayerMaskCheck;
517
+ }
428
518
  const camera = scene.activeCamera; // note that at this point, scene.activeCamera == this.activeCamera if defined, because initRender() has been called before
429
519
  const cameraForLOD = this.cameraForLOD ?? camera;
520
+ // The cast to "any" is to avoid an error in ES6 in case you don't import boundingBoxRenderer
521
+ const boundingBoxRenderer = scene.getBoundingBoxRenderer?.();
522
+ if (scene._activeMeshesFrozen && this._isFrozen) {
523
+ this._renderingManager.resetSprites();
524
+ if (this.enableBoundingBoxRendering && boundingBoxRenderer) {
525
+ boundingBoxRenderer.reset();
526
+ for (let i = 0; i < this._activeBoundingBoxes.length; i++) {
527
+ const boundingBox = this._activeBoundingBoxes.data[i];
528
+ boundingBoxRenderer.renderList.push(boundingBox);
529
+ }
530
+ }
531
+ return currentRenderList;
532
+ }
430
533
  this._renderingManager.reset();
431
- const boundingBoxRenderer = scene.getBoundingBoxRenderer();
432
- boundingBoxRenderer && boundingBoxRenderer.reset();
534
+ this._activeMeshes.reset();
535
+ this._activeBoundingBoxes.reset();
536
+ this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer.reset();
433
537
  const sceneRenderId = scene.getRenderId();
434
538
  const currentFrameId = scene.getFrameId();
435
539
  for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {
@@ -480,10 +584,12 @@ export class ObjectRenderer {
480
584
  isMasked = false;
481
585
  }
482
586
  if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {
587
+ this._activeMeshes.push(mesh);
588
+ meshToRender._internalAbstractMeshDataInfo._wasActiveLastFrame = true;
483
589
  if (meshToRender !== mesh) {
484
590
  meshToRender._activate(sceneRenderId, true);
485
591
  }
486
- this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._preActiveMesh(meshToRender);
592
+ this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._preActiveMesh(mesh);
487
593
  if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {
488
594
  if (!mesh.isAnInstance) {
489
595
  meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;
@@ -497,7 +603,7 @@ export class ObjectRenderer {
497
603
  scene._prepareSkeleton(meshToRender);
498
604
  for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {
499
605
  const subMesh = meshToRender.subMeshes[subIndex];
500
- this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._evaluateSubMesh(meshToRender, subMesh);
606
+ this.enableBoundingBoxRendering && boundingBoxRenderer && boundingBoxRenderer._evaluateSubMesh(mesh, subMesh);
501
607
  this._renderingManager.dispatch(subMesh, meshToRender);
502
608
  }
503
609
  }
@@ -505,15 +611,32 @@ export class ObjectRenderer {
505
611
  }
506
612
  }
507
613
  }
508
- const particleSystems = this.particleSystemList || scene.particleSystems;
509
- for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {
510
- const particleSystem = particleSystems[particleIndex];
511
- const emitter = particleSystem.emitter;
512
- if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {
513
- continue;
614
+ if (this.enableBoundingBoxRendering && boundingBoxRenderer && winterIsComing) {
615
+ for (let i = 0; i < boundingBoxRenderer.renderList.length; i++) {
616
+ const boundingBox = boundingBoxRenderer.renderList.data[i];
617
+ this._activeBoundingBoxes.push(boundingBox);
618
+ }
619
+ }
620
+ if (this._scene.particlesEnabled) {
621
+ this._scene.onBeforeParticlesRenderingObservable.notifyObservers(this._scene);
622
+ const particleSystems = this.particleSystemList || scene.particleSystems;
623
+ for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {
624
+ const particleSystem = particleSystems[particleIndex];
625
+ const emitter = particleSystem.emitter;
626
+ if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {
627
+ continue;
628
+ }
629
+ this._renderingManager.dispatchParticles(particleSystem);
514
630
  }
515
- this._renderingManager.dispatchParticles(particleSystem);
631
+ this._scene.onAfterParticlesRenderingObservable.notifyObservers(this._scene);
516
632
  }
633
+ return currentRenderList;
634
+ }
635
+ /**
636
+ * Gets the rendering manager
637
+ */
638
+ get renderingManager() {
639
+ return this._renderingManager;
517
640
  }
518
641
  /**
519
642
  * Overrides the default sort function applied in the rendering group to prepare the meshes.
@@ -569,6 +692,9 @@ export class ObjectRenderer {
569
692
  this.onFastPathRenderObservable.clear();
570
693
  this._releaseRenderPassId();
571
694
  this.renderList = null;
695
+ this._sceneUBO?.dispose();
696
+ this._sceneUBO = undefined;
697
+ this._scene.removeObjectRenderer(this);
572
698
  }
573
699
  /** @internal */
574
700
  _rebuild() {