@babylonjs/core 5.0.0-alpha.57 → 5.0.0-alpha.60

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 (273) hide show
  1. package/Buffers/buffer.js +3 -2
  2. package/Buffers/buffer.js.map +1 -1
  3. package/Cameras/Inputs/BaseCameraPointersInput.d.ts +0 -1
  4. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -5
  5. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  6. package/Cameras/Inputs/freeCameraMouseInput.d.ts +0 -1
  7. package/Cameras/Inputs/freeCameraMouseInput.js +27 -28
  8. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  9. package/Cameras/camera.d.ts +4 -0
  10. package/Cameras/camera.js +2 -0
  11. package/Cameras/camera.js.map +1 -1
  12. package/Culling/boundingBox.d.ts +7 -1
  13. package/Culling/boundingBox.js +4 -0
  14. package/Culling/boundingBox.js.map +1 -1
  15. package/DeviceInput/Helpers/eventFactory.js +1 -2
  16. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  17. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +1 -0
  18. package/DeviceInput/Implementations/webDeviceInputSystem.js +5 -12
  19. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  20. package/DeviceInput/InputDevices/deviceEnums.d.ts +1 -3
  21. package/DeviceInput/InputDevices/deviceEnums.js +0 -2
  22. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  23. package/Engines/Extensions/engine.alpha.js +6 -6
  24. package/Engines/Extensions/engine.alpha.js.map +1 -1
  25. package/Engines/Extensions/engine.renderTarget.js +1 -1
  26. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  27. package/Engines/IDrawContext.d.ts +4 -0
  28. package/Engines/IDrawContext.js.map +1 -1
  29. package/Engines/IMaterialContext.d.ts +1 -0
  30. package/Engines/IMaterialContext.js.map +1 -1
  31. package/Engines/WebGPU/Extensions/engine.alpha.js +20 -31
  32. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  33. package/Engines/WebGPU/Extensions/engine.renderTarget.js +1 -38
  34. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  35. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +1 -1
  36. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  37. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +1 -1
  38. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  39. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -0
  40. package/Engines/WebGPU/webgpuBufferManager.js +3 -0
  41. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  42. package/Engines/WebGPU/webgpuCacheBindGroups.d.ts +3 -2
  43. package/Engines/WebGPU/webgpuCacheBindGroups.js +15 -14
  44. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  45. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -18
  46. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  47. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +2 -0
  48. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +17 -0
  49. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  50. package/Engines/WebGPU/webgpuDrawContext.d.ts +24 -2
  51. package/Engines/WebGPU/webgpuDrawContext.js +75 -1
  52. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  53. package/Engines/WebGPU/webgpuMaterialContext.d.ts +1 -6
  54. package/Engines/WebGPU/webgpuMaterialContext.js +11 -8
  55. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  56. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +1 -0
  57. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  58. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  59. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
  60. package/Engines/WebGPU/webgpuTextureHelper.js +67 -1
  61. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  62. package/Engines/constants.d.ts +40 -7
  63. package/Engines/constants.js +40 -7
  64. package/Engines/constants.js.map +1 -1
  65. package/Engines/engine.d.ts +37 -2
  66. package/Engines/engine.js +68 -0
  67. package/Engines/engine.js.map +1 -1
  68. package/Engines/engineFeatures.d.ts +2 -0
  69. package/Engines/engineFeatures.js.map +1 -1
  70. package/Engines/nativeEngine.js +19 -13
  71. package/Engines/nativeEngine.js.map +1 -1
  72. package/Engines/nullEngine.js +1 -0
  73. package/Engines/nullEngine.js.map +1 -1
  74. package/Engines/thinEngine.d.ts +8 -2
  75. package/Engines/thinEngine.js +10 -5
  76. package/Engines/thinEngine.js.map +1 -1
  77. package/Engines/webgpuEngine.d.ts +28 -7
  78. package/Engines/webgpuEngine.js +177 -58
  79. package/Engines/webgpuEngine.js.map +1 -1
  80. package/Inputs/scene.inputManager.js +2 -3
  81. package/Inputs/scene.inputManager.js.map +1 -1
  82. package/Layers/effectLayer.d.ts +0 -2
  83. package/Layers/effectLayer.js +12 -11
  84. package/Layers/effectLayer.js.map +1 -1
  85. package/Layers/effectLayerSceneComponent.js +5 -0
  86. package/Layers/effectLayerSceneComponent.js.map +1 -1
  87. package/Layers/glowLayer.js +2 -0
  88. package/Layers/glowLayer.js.map +1 -1
  89. package/Layers/highlightLayer.js +2 -0
  90. package/Layers/highlightLayer.js.map +1 -1
  91. package/LensFlares/lensFlare.d.ts +3 -0
  92. package/LensFlares/lensFlare.js +5 -0
  93. package/LensFlares/lensFlare.js.map +1 -1
  94. package/LensFlares/lensFlareSystem.d.ts +2 -1
  95. package/LensFlares/lensFlareSystem.js +15 -12
  96. package/LensFlares/lensFlareSystem.js.map +1 -1
  97. package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -2
  98. package/Lights/Shadows/cascadedShadowGenerator.js +3 -12
  99. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  100. package/Lights/Shadows/shadowGenerator.d.ts +0 -3
  101. package/Lights/Shadows/shadowGenerator.js +8 -14
  102. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  103. package/Lights/light.js +3 -0
  104. package/Lights/light.js.map +1 -1
  105. package/Loading/Plugins/babylonFileLoader.js +3 -0
  106. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  107. package/Materials/Background/backgroundMaterial.js +8 -11
  108. package/Materials/Background/backgroundMaterial.js.map +1 -1
  109. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -1
  110. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  111. package/Materials/Node/Blocks/cloudBlock.d.ts +4 -0
  112. package/Materials/Node/Blocks/cloudBlock.js +27 -8
  113. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  114. package/Materials/Node/Blocks/colorMergerBlock.d.ts +21 -0
  115. package/Materials/Node/Blocks/colorMergerBlock.js +48 -4
  116. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  117. package/Materials/Node/Blocks/vectorMergerBlock.d.ts +25 -0
  118. package/Materials/Node/Blocks/vectorMergerBlock.js +93 -23
  119. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  120. package/Materials/Node/nodeMaterial.js +4 -4
  121. package/Materials/Node/nodeMaterial.js.map +1 -1
  122. package/Materials/PBR/pbrBaseMaterial.d.ts +1 -0
  123. package/Materials/PBR/pbrBaseMaterial.js +10 -5
  124. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  125. package/Materials/PBR/pbrClearCoatConfiguration.js +1 -1
  126. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  127. package/Materials/PBR/pbrSheenConfiguration.js +1 -1
  128. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  129. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -1
  130. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  131. package/Materials/Textures/baseTexture.d.ts +2 -0
  132. package/Materials/Textures/baseTexture.js +2 -0
  133. package/Materials/Textures/baseTexture.js.map +1 -1
  134. package/Materials/Textures/renderTargetTexture.d.ts +27 -0
  135. package/Materials/Textures/renderTargetTexture.js +127 -14
  136. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  137. package/Materials/Textures/texture.js +11 -4
  138. package/Materials/Textures/texture.js.map +1 -1
  139. package/Materials/drawWrapper.d.ts +2 -1
  140. package/Materials/drawWrapper.js +10 -1
  141. package/Materials/drawWrapper.js.map +1 -1
  142. package/Materials/material.d.ts +3 -1
  143. package/Materials/material.detailMapConfiguration.d.ts +1 -1
  144. package/Materials/material.detailMapConfiguration.js +2 -2
  145. package/Materials/material.detailMapConfiguration.js.map +1 -1
  146. package/Materials/material.js +18 -9
  147. package/Materials/material.js.map +1 -1
  148. package/Materials/materialHelper.js +3 -1
  149. package/Materials/materialHelper.js.map +1 -1
  150. package/Materials/pushMaterial.js +1 -1
  151. package/Materials/pushMaterial.js.map +1 -1
  152. package/Materials/shaderMaterial.d.ts +0 -1
  153. package/Materials/shaderMaterial.js +3 -4
  154. package/Materials/shaderMaterial.js.map +1 -1
  155. package/Materials/shadowDepthWrapper.d.ts +4 -4
  156. package/Materials/shadowDepthWrapper.js +16 -15
  157. package/Materials/shadowDepthWrapper.js.map +1 -1
  158. package/Materials/standardMaterial.d.ts +1 -0
  159. package/Materials/standardMaterial.js +10 -5
  160. package/Materials/standardMaterial.js.map +1 -1
  161. package/Materials/uniformBuffer.d.ts +10 -2
  162. package/Materials/uniformBuffer.js +17 -11
  163. package/Materials/uniformBuffer.js.map +1 -1
  164. package/Meshes/abstractMesh.d.ts +13 -0
  165. package/Meshes/abstractMesh.js +22 -2
  166. package/Meshes/abstractMesh.js.map +1 -1
  167. package/Meshes/geometry.d.ts +7 -0
  168. package/Meshes/geometry.js +16 -0
  169. package/Meshes/geometry.js.map +1 -1
  170. package/Meshes/linesMesh.js +1 -1
  171. package/Meshes/linesMesh.js.map +1 -1
  172. package/Meshes/mesh.js +15 -0
  173. package/Meshes/mesh.js.map +1 -1
  174. package/Meshes/subMesh.d.ts +10 -9
  175. package/Meshes/subMesh.js +44 -43
  176. package/Meshes/subMesh.js.map +1 -1
  177. package/Misc/basis.d.ts +3 -2
  178. package/Misc/basis.js +16 -15
  179. package/Misc/basis.js.map +1 -1
  180. package/Misc/environmentTextureTools.js +1 -0
  181. package/Misc/environmentTextureTools.js.map +1 -1
  182. package/Misc/rgbdTextureTools.js +1 -0
  183. package/Misc/rgbdTextureTools.js.map +1 -1
  184. package/Misc/sceneSerializer.js +17 -17
  185. package/Misc/sceneSerializer.js.map +1 -1
  186. package/Misc/textureTools.js +2 -0
  187. package/Misc/textureTools.js.map +1 -1
  188. package/Particles/gpuParticleSystem.d.ts +5 -1
  189. package/Particles/gpuParticleSystem.js +31 -5
  190. package/Particles/gpuParticleSystem.js.map +1 -1
  191. package/Particles/particleSystem.d.ts +5 -1
  192. package/Particles/particleSystem.js +35 -5
  193. package/Particles/particleSystem.js.map +1 -1
  194. package/Physics/Plugins/ammoJSPlugin.d.ts +1 -0
  195. package/Physics/Plugins/ammoJSPlugin.js +10 -0
  196. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  197. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -0
  198. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  199. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
  200. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  201. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  202. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  203. package/PostProcesses/bloomMergePostProcess.js +1 -0
  204. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  205. package/PostProcesses/depthOfFieldBlurPostProcess.js +1 -0
  206. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  207. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -0
  208. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  209. package/PostProcesses/extractHighlightsPostProcess.js +1 -0
  210. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  211. package/PostProcesses/postProcess.d.ts +6 -0
  212. package/PostProcesses/postProcess.js +9 -1
  213. package/PostProcesses/postProcess.js.map +1 -1
  214. package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -1
  215. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  216. package/PostProcesses/tonemapPostProcess.d.ts +2 -1
  217. package/PostProcesses/tonemapPostProcess.js +3 -2
  218. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  219. package/Rendering/boundingBoxRenderer.d.ts +5 -3
  220. package/Rendering/boundingBoxRenderer.js +46 -14
  221. package/Rendering/boundingBoxRenderer.js.map +1 -1
  222. package/Rendering/depthPeelingRenderer.d.ts +20 -1
  223. package/Rendering/depthPeelingRenderer.js +125 -32
  224. package/Rendering/depthPeelingRenderer.js.map +1 -1
  225. package/Rendering/depthPeelingSceneComponent.d.ts +2 -0
  226. package/Rendering/depthPeelingSceneComponent.js +16 -0
  227. package/Rendering/depthPeelingSceneComponent.js.map +1 -1
  228. package/Rendering/depthRenderer.d.ts +9 -2
  229. package/Rendering/depthRenderer.js +77 -43
  230. package/Rendering/depthRenderer.js.map +1 -1
  231. package/Rendering/depthRendererSceneComponent.js +0 -1
  232. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  233. package/Rendering/edgesRenderer.d.ts +2 -0
  234. package/Rendering/edgesRenderer.js +11 -0
  235. package/Rendering/edgesRenderer.js.map +1 -1
  236. package/Rendering/geometryBufferRenderer.js +4 -4
  237. package/Rendering/geometryBufferRenderer.js.map +1 -1
  238. package/Rendering/outlineRenderer.d.ts +5 -4
  239. package/Rendering/outlineRenderer.js +24 -19
  240. package/Rendering/outlineRenderer.js.map +1 -1
  241. package/Rendering/prePassRenderer.js +3 -2
  242. package/Rendering/prePassRenderer.js.map +1 -1
  243. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.d.ts +5 -0
  244. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js +7 -0
  245. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js.map +1 -0
  246. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.d.ts +5 -0
  247. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +7 -0
  248. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -0
  249. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.d.ts +5 -0
  250. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js +7 -0
  251. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js.map +1 -0
  252. package/Shaders/ShadersInclude/oitFragment.js +1 -1
  253. package/Shaders/ShadersInclude/oitFragment.js.map +1 -1
  254. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +1 -1
  255. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  256. package/Shaders/boundingBoxRenderer.fragment.d.ts +7 -0
  257. package/Shaders/boundingBoxRenderer.fragment.js +9 -0
  258. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -0
  259. package/Shaders/boundingBoxRenderer.vertex.d.ts +7 -0
  260. package/Shaders/boundingBoxRenderer.vertex.js +9 -0
  261. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -0
  262. package/Sprites/spriteManager.d.ts +3 -1
  263. package/Sprites/spriteManager.js +16 -5
  264. package/Sprites/spriteManager.js.map +1 -1
  265. package/Sprites/spriteRenderer.d.ts +2 -0
  266. package/Sprites/spriteRenderer.js +26 -0
  267. package/Sprites/spriteRenderer.js.map +1 -1
  268. package/XR/features/WebXRWalkingLocomotion.js +28 -13
  269. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  270. package/package.json +16 -1
  271. package/scene.d.ts +18 -4
  272. package/scene.js +100 -41
  273. package/scene.js.map +1 -1
@@ -6,12 +6,13 @@ import { SmartArray } from "../Misc/smartArray.js";
6
6
  import { SceneComponentConstants } from "../sceneComponent.js";
7
7
  import { Material } from "../Materials/material.js";
8
8
  import { ShaderMaterial } from "../Materials/shaderMaterial.js";
9
- import "../Meshes/Builders/boxBuilder.js";
10
- import "../Shaders/color.fragment.js";
11
- import "../Shaders/color.vertex.js";
12
9
  import { Color3 } from '../Maths/math.color.js';
13
10
  import { Observable } from '../Misc/observable.js';
11
+ import { DrawWrapper } from "../Materials/drawWrapper.js";
12
+ import { UniformBuffer } from "../Materials/uniformBuffer.js";
14
13
  import { CreateBoxVertexData } from "../Meshes/Builders/boxBuilder.js";
14
+ import "../Shaders/boundingBoxRenderer.fragment.js";
15
+ import "../Shaders/boundingBoxRenderer.vertex.js";
15
16
  Object.defineProperty(Scene.prototype, "forceShowBoundingBoxes", {
16
17
  get: function () {
17
18
  return this._forceShowBoundingBoxes || false;
@@ -97,7 +98,18 @@ var BoundingBoxRenderer = /** @class */ (function () {
97
98
  this._fillIndexData = null;
98
99
  this.scene = scene;
99
100
  scene._addComponent(this);
101
+ this._uniformBufferFront = new UniformBuffer(this.scene.getEngine(), undefined, undefined, "BoundingBoxRendererFront");
102
+ this._buildUniformLayout(this._uniformBufferFront);
103
+ this._uniformBufferBack = new UniformBuffer(this.scene.getEngine(), undefined, undefined, "BoundingBoxRendererBack");
104
+ this._buildUniformLayout(this._uniformBufferBack);
100
105
  }
106
+ BoundingBoxRenderer.prototype._buildUniformLayout = function (ubo) {
107
+ ubo.addUniform("color", 4);
108
+ ubo.addUniform("world", 16);
109
+ ubo.addUniform("viewProjection", 16);
110
+ ubo.addUniform("viewProjectionR", 16);
111
+ ubo.create();
112
+ };
101
113
  /**
102
114
  * Registers the component in a given scene
103
115
  */
@@ -127,9 +139,10 @@ var BoundingBoxRenderer = /** @class */ (function () {
127
139
  if (this._colorShader) {
128
140
  return;
129
141
  }
130
- this._colorShader = new ShaderMaterial("colorShader", this.scene, "color", {
142
+ this._colorShader = new ShaderMaterial("colorShader", this.scene, "boundingBoxRenderer", {
131
143
  attributes: [VertexBuffer.PositionKind],
132
- uniforms: ["world", "viewProjection", "color"]
144
+ uniforms: ["world", "viewProjection", "color"],
145
+ uniformBuffers: ["BoundingBoxRenderer"]
133
146
  });
134
147
  this._colorShader.reservedDataStore = {
135
148
  hidden: true
@@ -167,6 +180,7 @@ var BoundingBoxRenderer = /** @class */ (function () {
167
180
  * @param renderingGroupId defines the rendering group to render
168
181
  */
169
182
  BoundingBoxRenderer.prototype.render = function (renderingGroupId) {
183
+ var _a, _b;
170
184
  if (this.renderList.length === 0 || !this.enabled) {
171
185
  return;
172
186
  }
@@ -176,12 +190,20 @@ var BoundingBoxRenderer = /** @class */ (function () {
176
190
  }
177
191
  var engine = this.scene.getEngine();
178
192
  engine.setDepthWrite(false);
179
- this._colorShader._preBind();
193
+ var frontColor = this.frontColor.toColor4();
194
+ var backColor = this.backColor.toColor4();
195
+ var transformMatrix = this.scene.getTransformMatrix();
180
196
  for (var boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {
181
197
  var boundingBox = this.renderList.data[boundingBoxIndex];
182
198
  if (boundingBox._tag !== renderingGroupId) {
183
199
  continue;
184
200
  }
201
+ if (!boundingBox._drawWrapperFront) {
202
+ boundingBox._drawWrapperFront = new DrawWrapper(engine);
203
+ boundingBox._drawWrapperBack = new DrawWrapper(engine);
204
+ boundingBox._drawWrapperFront.setEffect(this._colorShader.getEffect());
205
+ boundingBox._drawWrapperBack.setEffect(this._colorShader.getEffect());
206
+ }
185
207
  this.onBeforeBoxRenderingObservable.notifyObservers(boundingBox);
186
208
  var min = boundingBox.minimum;
187
209
  var max = boundingBox.maximum;
@@ -190,10 +212,11 @@ var BoundingBoxRenderer = /** @class */ (function () {
190
212
  var worldMatrix = Matrix.Scaling(diff.x, diff.y, diff.z)
191
213
  .multiply(Matrix.Translation(median.x, median.y, median.z))
192
214
  .multiply(boundingBox.getWorldMatrix());
193
- // VBOs
194
- engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._colorShader.getEffect());
195
215
  var useReverseDepthBuffer = engine.useReverseDepthBuffer;
196
216
  if (this.showBackLines) {
217
+ var drawWrapperBack = (_a = boundingBox._drawWrapperBack) !== null && _a !== void 0 ? _a : this._colorShader._getDrawWrapper();
218
+ this._colorShader._preBind(drawWrapperBack);
219
+ engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._colorShader.getEffect());
197
220
  // Back
198
221
  if (useReverseDepthBuffer) {
199
222
  engine.setDepthFunctionToLessOrEqual();
@@ -201,12 +224,17 @@ var BoundingBoxRenderer = /** @class */ (function () {
201
224
  else {
202
225
  engine.setDepthFunctionToGreaterOrEqual();
203
226
  }
204
- this.scene.resetCachedMaterial();
205
- this._colorShader.setColor4("color", this.backColor.toColor4());
206
- this._colorShader.bind(worldMatrix);
227
+ this._uniformBufferBack.bindToEffect(drawWrapperBack.effect, "BoundingBoxRenderer");
228
+ this._uniformBufferBack.updateDirectColor4("color", backColor);
229
+ this._uniformBufferBack.updateMatrix("world", worldMatrix);
230
+ this._uniformBufferBack.updateMatrix("viewProjection", transformMatrix);
231
+ this._uniformBufferBack.update();
207
232
  // Draw order
208
233
  engine.drawElementsType(Material.LineListDrawMode, 0, 24);
209
234
  }
235
+ var drawWrapperFront = (_b = boundingBox._drawWrapperFront) !== null && _b !== void 0 ? _b : this._colorShader._getDrawWrapper();
236
+ this._colorShader._preBind(drawWrapperFront);
237
+ engine.bindBuffers(this._vertexBuffers, this._indexBuffer, this._colorShader.getEffect());
210
238
  // Front
211
239
  if (useReverseDepthBuffer) {
212
240
  engine.setDepthFunctionToGreater();
@@ -214,9 +242,11 @@ var BoundingBoxRenderer = /** @class */ (function () {
214
242
  else {
215
243
  engine.setDepthFunctionToLess();
216
244
  }
217
- this.scene.resetCachedMaterial();
218
- this._colorShader.setColor4("color", this.frontColor.toColor4());
219
- this._colorShader.bind(worldMatrix);
245
+ this._uniformBufferFront.bindToEffect(drawWrapperFront.effect, "BoundingBoxRenderer");
246
+ this._uniformBufferFront.updateDirectColor4("color", frontColor);
247
+ this._uniformBufferFront.updateMatrix("world", worldMatrix);
248
+ this._uniformBufferFront.updateMatrix("viewProjection", transformMatrix);
249
+ this._uniformBufferFront.update();
220
250
  // Draw order
221
251
  engine.drawElementsType(Material.LineListDrawMode, 0, 24);
222
252
  this.onAfterBoxRenderingObservable.notifyObservers(boundingBox);
@@ -271,6 +301,8 @@ var BoundingBoxRenderer = /** @class */ (function () {
271
301
  this.onResourcesReadyObservable.clear();
272
302
  this.renderList.dispose();
273
303
  this._colorShader.dispose();
304
+ this._uniformBufferFront.dispose();
305
+ this._uniformBufferBack.dispose();
274
306
  var buffer = this._vertexBuffers[VertexBuffer.PositionKind];
275
307
  if (buffer) {
276
308
  buffer.dispose();
@@ -1 +1 @@
1
- {"version":3,"file":"boundingBoxRenderer.js","sourceRoot":"","sources":["../../../sourceES6/core/Rendering/boundingBoxRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scene } from \"../scene\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport { ISceneComponent, SceneComponentConstants } from \"../sceneComponent\";\r\nimport { BoundingBox } from \"../Culling/boundingBox\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\n\r\nimport \"../Meshes/Builders/boxBuilder\";\r\n\r\nimport \"../Shaders/color.fragment\";\r\nimport \"../Shaders/color.vertex\";\r\nimport { DataBuffer } from '../Buffers/dataBuffer';\r\nimport { Color3 } from '../Maths/math.color';\r\nimport { Observable } from '../Misc/observable';\r\nimport { CreateBoxVertexData } from \"../Meshes/Builders/boxBuilder\";\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @hidden (Backing field) */\r\n _boundingBoxRenderer: BoundingBoxRenderer;\r\n\r\n /** @hidden (Backing field) */\r\n _forceShowBoundingBoxes: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if all bounding boxes must be rendered\r\n */\r\n forceShowBoundingBoxes: boolean;\r\n\r\n /**\r\n * Gets the bounding box renderer associated with the scene\r\n * @returns a BoundingBoxRenderer\r\n */\r\n getBoundingBoxRenderer(): BoundingBoxRenderer;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"forceShowBoundingBoxes\", {\r\n get: function (this: Scene) {\r\n return this._forceShowBoundingBoxes || false;\r\n },\r\n set: function (this: Scene, value: boolean) {\r\n this._forceShowBoundingBoxes = value;\r\n // Lazyly creates a BB renderer if needed.\r\n if (value) {\r\n this.getBoundingBoxRenderer();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n});\r\n\r\nScene.prototype.getBoundingBoxRenderer = function (): BoundingBoxRenderer {\r\n\r\n if (!this._boundingBoxRenderer) {\r\n this._boundingBoxRenderer = new BoundingBoxRenderer(this);\r\n }\r\n\r\n return this._boundingBoxRenderer;\r\n};\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n export interface AbstractMesh {\r\n /** @hidden (Backing field) */\r\n _showBoundingBox: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the bounding box must be rendered as well (false by default)\r\n */\r\n showBoundingBox: boolean;\r\n }\r\n}\r\n\r\nObject.defineProperty(AbstractMesh.prototype, \"showBoundingBox\", {\r\n get: function (this: AbstractMesh) {\r\n return this._showBoundingBox || false;\r\n },\r\n set: function (this: AbstractMesh, value: boolean) {\r\n this._showBoundingBox = value;\r\n // Lazyly creates a BB renderer if needed.\r\n if (value) {\r\n this.getScene().getBoundingBoxRenderer();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n});\r\n\r\n/**\r\n * Component responsible of rendering the bounding box of the meshes in a scene.\r\n * This is usually used through the mesh.showBoundingBox or the scene.forceShowBoundingBoxes properties\r\n */\r\nexport class BoundingBoxRenderer implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_BOUNDINGBOXRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Color of the bounding box lines placed in front of an object\r\n */\r\n public frontColor = new Color3(1, 1, 1);\r\n /**\r\n * Color of the bounding box lines placed behind an object\r\n */\r\n public backColor = new Color3(0.1, 0.1, 0.1);\r\n /**\r\n * Defines if the renderer should show the back lines or not\r\n */\r\n public showBackLines = true;\r\n\r\n /**\r\n * Observable raised before rendering a bounding box\r\n */\r\n public onBeforeBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after rendering a bounding box\r\n */\r\n public onAfterBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after resources are created\r\n */\r\n public onResourcesReadyObservable = new Observable<BoundingBoxRenderer>();\r\n\r\n /**\r\n * When false, no bounding boxes will be rendered\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public renderList = new SmartArray<BoundingBox>(32);\r\n\r\n private _colorShader: ShaderMaterial;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: DataBuffer;\r\n private _fillIndexBuffer: Nullable<DataBuffer> = null;\r\n private _fillIndexData: Nullable<IndicesArray> = null;\r\n\r\n /**\r\n * Instantiates a new bounding box renderer in a scene.\r\n * @param scene the scene the renderer renders in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n scene._addComponent(this);\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeEvaluateActiveMeshStage.registerStep(SceneComponentConstants.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER, this, this.reset);\r\n\r\n this.scene._preActiveMeshStage.registerStep(SceneComponentConstants.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER, this, this._preActiveMesh);\r\n\r\n this.scene._evaluateSubMeshStage.registerStep(SceneComponentConstants.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER, this, this._evaluateSubMesh);\r\n\r\n this.scene._afterRenderingGroupDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER, this, this.render);\r\n }\r\n\r\n private _evaluateSubMesh(mesh: AbstractMesh, subMesh: SubMesh): void {\r\n if (mesh.showSubMeshesBoundingBox) {\r\n const boundingInfo = subMesh.getBoundingInfo();\r\n if (boundingInfo !== null && boundingInfo !== undefined) {\r\n boundingInfo.boundingBox._tag = mesh.renderingGroupId;\r\n this.renderList.push(boundingInfo.boundingBox);\r\n }\r\n }\r\n }\r\n\r\n private _preActiveMesh(mesh: AbstractMesh): void {\r\n if (mesh.showBoundingBox || this.scene.forceShowBoundingBoxes) {\r\n let boundingInfo = mesh.getBoundingInfo();\r\n boundingInfo.boundingBox._tag = mesh.renderingGroupId;\r\n this.renderList.push(boundingInfo.boundingBox);\r\n }\r\n }\r\n\r\n private _prepareResources(): void {\r\n if (this._colorShader) {\r\n return;\r\n }\r\n\r\n this._colorShader = new ShaderMaterial(\"colorShader\", this.scene, \"color\",\r\n {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\", \"color\"]\r\n });\r\n\r\n this._colorShader.reservedDataStore = {\r\n hidden: true\r\n };\r\n var engine = this.scene.getEngine();\r\n var boxdata = CreateBoxVertexData({ size: 1.0 });\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, <FloatArray>boxdata.positions, VertexBuffer.PositionKind, false);\r\n this._createIndexBuffer();\r\n this._fillIndexData = boxdata.indices;\r\n this.onResourcesReadyObservable.notifyObservers(this);\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n var engine = this.scene.getEngine();\r\n this._indexBuffer = engine.createIndexBuffer([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 7, 1, 6, 2, 5, 3, 4]);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n let vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public reset(): void {\r\n this.renderList.reset();\r\n }\r\n\r\n /**\r\n * Render the bounding boxes of a specific rendering group\r\n * @param renderingGroupId defines the rendering group to render\r\n */\r\n public render(renderingGroupId: number): void {\r\n if (this.renderList.length === 0 || !this.enabled) {\r\n return;\r\n }\r\n\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady()) {\r\n return;\r\n }\r\n\r\n var engine = this.scene.getEngine();\r\n engine.setDepthWrite(false);\r\n this._colorShader._preBind();\r\n\r\n for (var boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n var boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.notifyObservers(boundingBox);\r\n\r\n var min = boundingBox.minimum;\r\n var max = boundingBox.maximum;\r\n var diff = max.subtract(min);\r\n var median = min.add(diff.scale(0.5));\r\n\r\n var worldMatrix = Matrix.Scaling(diff.x, diff.y, diff.z)\r\n .multiply(Matrix.Translation(median.x, median.y, median.z))\r\n .multiply(boundingBox.getWorldMatrix());\r\n\r\n // VBOs\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, <Effect>this._colorShader.getEffect());\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n\r\n if (this.showBackLines) {\r\n // Back\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToLessOrEqual();\r\n } else {\r\n engine.setDepthFunctionToGreaterOrEqual();\r\n }\r\n this.scene.resetCachedMaterial();\r\n this._colorShader.setColor4(\"color\", this.backColor.toColor4());\r\n this._colorShader.bind(worldMatrix);\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24);\r\n }\r\n\r\n // Front\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToGreater();\r\n } else {\r\n engine.setDepthFunctionToLess();\r\n }\r\n this.scene.resetCachedMaterial();\r\n this._colorShader.setColor4(\"color\", this.frontColor.toColor4());\r\n this._colorShader.bind(worldMatrix);\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24);\r\n\r\n this.onAfterBoxRenderingObservable.notifyObservers(boundingBox);\r\n }\r\n this._colorShader.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * In case of occlusion queries, we can render the occlusion bounding box through this method\r\n * @param mesh Define the mesh to render the occlusion bounding box for\r\n */\r\n public renderOcclusionBoundingBox(mesh: AbstractMesh): void {\r\n\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady() || !mesh.hasBoundingInfo) {\r\n return;\r\n }\r\n\r\n var engine = this.scene.getEngine();\r\n if (!this._fillIndexBuffer) {\r\n this._fillIndexBuffer = engine.createIndexBuffer(this._fillIndexData!);\r\n }\r\n\r\n engine.setDepthWrite(false);\r\n engine.setColorWrite(false);\r\n this._colorShader._preBind();\r\n\r\n var boundingBox = mesh.getBoundingInfo().boundingBox;\r\n var min = boundingBox.minimum;\r\n var max = boundingBox.maximum;\r\n var diff = max.subtract(min);\r\n var median = min.add(diff.scale(0.5));\r\n\r\n var worldMatrix = Matrix.Scaling(diff.x, diff.y, diff.z)\r\n .multiply(Matrix.Translation(median.x, median.y, median.z))\r\n .multiply(boundingBox.getWorldMatrix());\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._fillIndexBuffer, <Effect>this._colorShader.getEffect());\r\n\r\n engine.setDepthFunctionToLess();\r\n this.scene.resetCachedMaterial();\r\n this._colorShader.bind(worldMatrix);\r\n\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 36);\r\n\r\n this._colorShader.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n /**\r\n * Dispose and release the resources attached to this renderer.\r\n */\r\n public dispose(): void {\r\n if (!this._colorShader) {\r\n return;\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.clear();\r\n this.onAfterBoxRenderingObservable.clear();\r\n this.onResourcesReadyObservable.clear();\r\n\r\n this.renderList.dispose();\r\n\r\n this._colorShader.dispose();\r\n\r\n var buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n this.scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n\r\n if (this._fillIndexBuffer) {\r\n this.scene.getEngine()._releaseBuffer(this._fillIndexBuffer);\r\n this._fillIndexBuffer = null;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"boundingBoxRenderer.js","sourceRoot":"","sources":["../../../sourceES6/core/Rendering/boundingBoxRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAmB,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,yCAAyC,CAAC;AACjD,OAAO,uCAAuC,CAAC;AAuB/C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,wBAAwB,EAAE;IAC7D,GAAG,EAAE;QACD,OAAO,IAAI,CAAC,uBAAuB,IAAI,KAAK,CAAC;IACjD,CAAC;IACD,GAAG,EAAE,UAAuB,KAAc;QACtC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACrC,0CAA0C;QAC1C,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,sBAAsB,EAAE,CAAC;SACjC;IACL,CAAC;IACD,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH,KAAK,CAAC,SAAS,CAAC,sBAAsB,GAAG;IAErC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAC5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;KAC7D;IAED,OAAO,IAAI,CAAC,oBAAoB,CAAC;AACrC,CAAC,CAAC;AAcF,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,iBAAiB,EAAE;IAC7D,GAAG,EAAE;QACD,OAAO,IAAI,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC1C,CAAC;IACD,GAAG,EAAE,UAA8B,KAAc;QAC7C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,0CAA0C;QAC1C,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,QAAQ,EAAE,CAAC,sBAAsB,EAAE,CAAC;SAC5C;IACL,CAAC;IACD,UAAU,EAAE,IAAI;IAChB,YAAY,EAAE,IAAI;CACrB,CAAC,CAAC;AAEH;;;GAGG;AACH;IAyDI;;;OAGG;IACH,6BAAY,KAAY;QA5DxB;;WAEG;QACa,SAAI,GAAG,uBAAuB,CAAC,wBAAwB,CAAC;QAOxE;;WAEG;QACI,eAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC;;WAEG;QACI,cAAS,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC7C;;WAEG;QACI,kBAAa,GAAG,IAAI,CAAC;QAE5B;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAe,CAAC;QAEtE;;WAEG;QACI,kCAA6B,GAAG,IAAI,UAAU,EAAe,CAAC;QAErE;;WAEG;QACI,+BAA0B,GAAG,IAAI,UAAU,EAAuB,CAAC;QAE1E;;WAEG;QACI,YAAO,GAAG,IAAI,CAAC;QAEtB;;WAEG;QACI,eAAU,GAAG,IAAI,UAAU,CAAc,EAAE,CAAC,CAAC;QAG5C,mBAAc,GAA8C,EAAE,CAAC;QAE/D,qBAAgB,GAAyB,IAAI,CAAC;QAC9C,mBAAc,GAA2B,IAAI,CAAC;QASlD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACvH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;QACrH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IAEO,iDAAmB,GAA3B,UAA4B,GAAkB;QAC1C,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3B,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACI,sCAAQ,GAAf;QACI,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,YAAY,CAAC,uBAAuB,CAAC,iDAAiD,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAEpJ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,CAAC,uBAAuB,CAAC,sCAAsC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAEvI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,YAAY,CAAC,uBAAuB,CAAC,wCAAwC,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE7I,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,YAAY,CAAC,uBAAuB,CAAC,gDAAgD,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvJ,CAAC;IAEO,8CAAgB,GAAxB,UAAyB,IAAkB,EAAE,OAAgB;QACzD,IAAI,IAAI,CAAC,wBAAwB,EAAE;YAC/B,IAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;YAC/C,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE;gBACrD,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;aAClD;SACJ;IACL,CAAC;IAEO,4CAAc,GAAtB,UAAuB,IAAkB;QACrC,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;YAC3D,IAAI,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1C,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;SAClD;IACL,CAAC;IAEO,+CAAiB,GAAzB;QACI,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,OAAO;SACV;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,EAAE,qBAAqB,EACnF;YACI,UAAU,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC;YACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC;YAC9C,cAAc,EAAE,CAAC,qBAAqB,CAAC;SAC1C,CAAC,CAAC;QAEP,IAAI,CAAC,YAAY,CAAC,iBAAiB,GAAG;YAClC,MAAM,EAAE,IAAI;SACf,CAAC;QACF,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,OAAO,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,YAAY,CAAC,MAAM,EAAc,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC3I,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,0BAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEO,gDAAkB,GAA1B;QACI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3H,CAAC;IAED;;;OAGG;IACI,qCAAO,GAAd;QACI,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,EAAE,EAAE;YACJ,EAAE,CAAC,QAAQ,EAAE,CAAC;SACjB;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACI,mCAAK,GAAZ;QACI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACI,oCAAM,GAAb,UAAc,gBAAwB;;QAClC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAC/C,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE;YAC9B,OAAO;SACV;QAED,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC9C,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAExD,KAAK,IAAI,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE;YAC1F,IAAI,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACzD,IAAI,WAAW,CAAC,IAAI,KAAK,gBAAgB,EAAE;gBACvC,SAAS;aACZ;YACD,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE;gBAChC,WAAW,CAAC,iBAAiB,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;gBACxD,WAAW,CAAC,gBAAgB,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;gBAEvD,WAAW,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;gBACvE,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;aACzE;YAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAEjE,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;YAC9B,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;YAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAEtC,IAAI,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;iBACnD,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;iBAC1D,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;YAE5C,IAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC;YAE3D,IAAI,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAM,eAAe,GAAG,MAAA,WAAW,CAAC,gBAAgB,mCAAI,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;gBAE5F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAE5C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAU,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;gBAElG,OAAO;gBACP,IAAI,qBAAqB,EAAE;oBACvB,MAAM,CAAC,6BAA6B,EAAE,CAAC;iBAC1C;qBAAM;oBACH,MAAM,CAAC,gCAAgC,EAAE,CAAC;iBAC7C;gBACD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAO,EAAE,qBAAqB,CAAC,CAAC;gBACrF,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC/D,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC3D,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;gBACxE,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;gBAEjC,aAAa;gBACb,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;aAC7D;YAED,IAAM,gBAAgB,GAAG,MAAA,WAAW,CAAC,iBAAiB,mCAAI,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;YAE9F,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YAE7C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,EAAU,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;YAElG,QAAQ;YACR,IAAI,qBAAqB,EAAE;gBACvB,MAAM,CAAC,yBAAyB,EAAE,CAAC;aACtC;iBAAM;gBACH,MAAM,CAAC,sBAAsB,EAAE,CAAC;aACnC;YACD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAO,EAAE,qBAAqB,CAAC,CAAC;YACvF,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;YACzE,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC;YAElC,aAAa;YACb,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAE1D,IAAI,CAAC,6BAA6B,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;SACnE;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,6BAA6B,EAAE,CAAC;QACvC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,wDAA0B,GAAjC,UAAkC,IAAkB;QAEhD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACvD,OAAO;SACV;QAED,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAe,CAAC,CAAC;SAC1E;QAED,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAE7B,IAAI,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC;QACrD,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;QAC9B,IAAI,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;QAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEtC,IAAI,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;aACnD,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAC1D,QAAQ,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAU,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAEtG,MAAM,CAAC,sBAAsB,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEpC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,6BAA6B,EAAE,CAAC;QACvC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,qCAAO,GAAd;QACI,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,OAAO;SACV;QAED,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,CAAC;QAC3C,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAC;QAExC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAE1B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAElC,IAAI,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;SACzD;QACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEzD,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;SAChC;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AA3UD,IA2UC","sourcesContent":["import { Scene } from \"../scene\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport { ISceneComponent, SceneComponentConstants } from \"../sceneComponent\";\r\nimport { BoundingBox } from \"../Culling/boundingBox\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { DataBuffer } from '../Buffers/dataBuffer';\r\nimport { Color3 } from '../Maths/math.color';\r\nimport { Observable } from '../Misc/observable';\r\nimport { DrawWrapper } from \"../Materials/drawWrapper\";\r\nimport { UniformBuffer } from \"../Materials/uniformBuffer\";\r\nimport { CreateBoxVertexData } from \"../Meshes/Builders/boxBuilder\";\r\n\r\nimport \"../Shaders/boundingBoxRenderer.fragment\";\r\nimport \"../Shaders/boundingBoxRenderer.vertex\";\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @hidden (Backing field) */\r\n _boundingBoxRenderer: BoundingBoxRenderer;\r\n\r\n /** @hidden (Backing field) */\r\n _forceShowBoundingBoxes: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if all bounding boxes must be rendered\r\n */\r\n forceShowBoundingBoxes: boolean;\r\n\r\n /**\r\n * Gets the bounding box renderer associated with the scene\r\n * @returns a BoundingBoxRenderer\r\n */\r\n getBoundingBoxRenderer(): BoundingBoxRenderer;\r\n }\r\n}\r\n\r\nObject.defineProperty(Scene.prototype, \"forceShowBoundingBoxes\", {\r\n get: function (this: Scene) {\r\n return this._forceShowBoundingBoxes || false;\r\n },\r\n set: function (this: Scene, value: boolean) {\r\n this._forceShowBoundingBoxes = value;\r\n // Lazyly creates a BB renderer if needed.\r\n if (value) {\r\n this.getBoundingBoxRenderer();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n});\r\n\r\nScene.prototype.getBoundingBoxRenderer = function (): BoundingBoxRenderer {\r\n\r\n if (!this._boundingBoxRenderer) {\r\n this._boundingBoxRenderer = new BoundingBoxRenderer(this);\r\n }\r\n\r\n return this._boundingBoxRenderer;\r\n};\r\n\r\ndeclare module \"../Meshes/abstractMesh\" {\r\n export interface AbstractMesh {\r\n /** @hidden (Backing field) */\r\n _showBoundingBox: boolean;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the bounding box must be rendered as well (false by default)\r\n */\r\n showBoundingBox: boolean;\r\n }\r\n}\r\n\r\nObject.defineProperty(AbstractMesh.prototype, \"showBoundingBox\", {\r\n get: function (this: AbstractMesh) {\r\n return this._showBoundingBox || false;\r\n },\r\n set: function (this: AbstractMesh, value: boolean) {\r\n this._showBoundingBox = value;\r\n // Lazyly creates a BB renderer if needed.\r\n if (value) {\r\n this.getScene().getBoundingBoxRenderer();\r\n }\r\n },\r\n enumerable: true,\r\n configurable: true\r\n});\r\n\r\n/**\r\n * Component responsible of rendering the bounding box of the meshes in a scene.\r\n * This is usually used through the mesh.showBoundingBox or the scene.forceShowBoundingBoxes properties\r\n */\r\nexport class BoundingBoxRenderer implements ISceneComponent {\r\n /**\r\n * The component name helpful to identify the component in the list of scene components.\r\n */\r\n public readonly name = SceneComponentConstants.NAME_BOUNDINGBOXRENDERER;\r\n\r\n /**\r\n * The scene the component belongs to.\r\n */\r\n public scene: Scene;\r\n\r\n /**\r\n * Color of the bounding box lines placed in front of an object\r\n */\r\n public frontColor = new Color3(1, 1, 1);\r\n /**\r\n * Color of the bounding box lines placed behind an object\r\n */\r\n public backColor = new Color3(0.1, 0.1, 0.1);\r\n /**\r\n * Defines if the renderer should show the back lines or not\r\n */\r\n public showBackLines = true;\r\n\r\n /**\r\n * Observable raised before rendering a bounding box\r\n */\r\n public onBeforeBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after rendering a bounding box\r\n */\r\n public onAfterBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after resources are created\r\n */\r\n public onResourcesReadyObservable = new Observable<BoundingBoxRenderer>();\r\n\r\n /**\r\n * When false, no bounding boxes will be rendered\r\n */\r\n public enabled = true;\r\n\r\n /**\r\n * @hidden\r\n */\r\n public renderList = new SmartArray<BoundingBox>(32);\r\n\r\n private _colorShader: ShaderMaterial;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n private _indexBuffer: DataBuffer;\r\n private _fillIndexBuffer: Nullable<DataBuffer> = null;\r\n private _fillIndexData: Nullable<IndicesArray> = null;\r\n private _uniformBufferFront: UniformBuffer;\r\n private _uniformBufferBack: UniformBuffer;\r\n\r\n /**\r\n * Instantiates a new bounding box renderer in a scene.\r\n * @param scene the scene the renderer renders in\r\n */\r\n constructor(scene: Scene) {\r\n this.scene = scene;\r\n scene._addComponent(this);\r\n this._uniformBufferFront = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererFront\");\r\n this._buildUniformLayout(this._uniformBufferFront);\r\n this._uniformBufferBack = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererBack\");\r\n this._buildUniformLayout(this._uniformBufferBack);\r\n }\r\n\r\n private _buildUniformLayout(ubo: UniformBuffer): void {\r\n ubo.addUniform(\"color\", 4);\r\n ubo.addUniform(\"world\", 16);\r\n ubo.addUniform(\"viewProjection\", 16);\r\n ubo.addUniform(\"viewProjectionR\", 16);\r\n ubo.create();\r\n }\r\n\r\n /**\r\n * Registers the component in a given scene\r\n */\r\n public register(): void {\r\n this.scene._beforeEvaluateActiveMeshStage.registerStep(SceneComponentConstants.STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER, this, this.reset);\r\n\r\n this.scene._preActiveMeshStage.registerStep(SceneComponentConstants.STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER, this, this._preActiveMesh);\r\n\r\n this.scene._evaluateSubMeshStage.registerStep(SceneComponentConstants.STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER, this, this._evaluateSubMesh);\r\n\r\n this.scene._afterRenderingGroupDrawStage.registerStep(SceneComponentConstants.STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER, this, this.render);\r\n }\r\n\r\n private _evaluateSubMesh(mesh: AbstractMesh, subMesh: SubMesh): void {\r\n if (mesh.showSubMeshesBoundingBox) {\r\n const boundingInfo = subMesh.getBoundingInfo();\r\n if (boundingInfo !== null && boundingInfo !== undefined) {\r\n boundingInfo.boundingBox._tag = mesh.renderingGroupId;\r\n this.renderList.push(boundingInfo.boundingBox);\r\n }\r\n }\r\n }\r\n\r\n private _preActiveMesh(mesh: AbstractMesh): void {\r\n if (mesh.showBoundingBox || this.scene.forceShowBoundingBoxes) {\r\n let boundingInfo = mesh.getBoundingInfo();\r\n boundingInfo.boundingBox._tag = mesh.renderingGroupId;\r\n this.renderList.push(boundingInfo.boundingBox);\r\n }\r\n }\r\n\r\n private _prepareResources(): void {\r\n if (this._colorShader) {\r\n return;\r\n }\r\n\r\n this._colorShader = new ShaderMaterial(\"colorShader\", this.scene, \"boundingBoxRenderer\",\r\n {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\", \"color\"],\r\n uniformBuffers: [\"BoundingBoxRenderer\"]\r\n });\r\n\r\n this._colorShader.reservedDataStore = {\r\n hidden: true\r\n };\r\n var engine = this.scene.getEngine();\r\n var boxdata = CreateBoxVertexData({ size: 1.0 });\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(engine, <FloatArray>boxdata.positions, VertexBuffer.PositionKind, false);\r\n this._createIndexBuffer();\r\n this._fillIndexData = boxdata.indices;\r\n this.onResourcesReadyObservable.notifyObservers(this);\r\n }\r\n\r\n private _createIndexBuffer(): void {\r\n var engine = this.scene.getEngine();\r\n this._indexBuffer = engine.createIndexBuffer([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 7, 1, 6, 2, 5, 3, 4]);\r\n }\r\n\r\n /**\r\n * Rebuilds the elements related to this component in case of\r\n * context lost for instance.\r\n */\r\n public rebuild(): void {\r\n let vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n this._createIndexBuffer();\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public reset(): void {\r\n this.renderList.reset();\r\n }\r\n\r\n /**\r\n * Render the bounding boxes of a specific rendering group\r\n * @param renderingGroupId defines the rendering group to render\r\n */\r\n public render(renderingGroupId: number): void {\r\n if (this.renderList.length === 0 || !this.enabled) {\r\n return;\r\n }\r\n\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady()) {\r\n return;\r\n }\r\n\r\n var engine = this.scene.getEngine();\r\n engine.setDepthWrite(false);\r\n\r\n const frontColor = this.frontColor.toColor4();\r\n const backColor = this.backColor.toColor4();\r\n const transformMatrix = this.scene.getTransformMatrix();\r\n\r\n for (var boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n var boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n if (!boundingBox._drawWrapperFront) {\r\n boundingBox._drawWrapperFront = new DrawWrapper(engine);\r\n boundingBox._drawWrapperBack = new DrawWrapper(engine);\r\n\r\n boundingBox._drawWrapperFront.setEffect(this._colorShader.getEffect());\r\n boundingBox._drawWrapperBack.setEffect(this._colorShader.getEffect());\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.notifyObservers(boundingBox);\r\n\r\n var min = boundingBox.minimum;\r\n var max = boundingBox.maximum;\r\n var diff = max.subtract(min);\r\n var median = min.add(diff.scale(0.5));\r\n\r\n var worldMatrix = Matrix.Scaling(diff.x, diff.y, diff.z)\r\n .multiply(Matrix.Translation(median.x, median.y, median.z))\r\n .multiply(boundingBox.getWorldMatrix());\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n\r\n if (this.showBackLines) {\r\n const drawWrapperBack = boundingBox._drawWrapperBack ?? this._colorShader._getDrawWrapper();\r\n\r\n this._colorShader._preBind(drawWrapperBack);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, <Effect>this._colorShader.getEffect());\r\n\r\n // Back\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToLessOrEqual();\r\n } else {\r\n engine.setDepthFunctionToGreaterOrEqual();\r\n }\r\n this._uniformBufferBack.bindToEffect(drawWrapperBack.effect!, \"BoundingBoxRenderer\");\r\n this._uniformBufferBack.updateDirectColor4(\"color\", backColor);\r\n this._uniformBufferBack.updateMatrix(\"world\", worldMatrix);\r\n this._uniformBufferBack.updateMatrix(\"viewProjection\", transformMatrix);\r\n this._uniformBufferBack.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24);\r\n }\r\n\r\n const drawWrapperFront = boundingBox._drawWrapperFront ?? this._colorShader._getDrawWrapper();\r\n\r\n this._colorShader._preBind(drawWrapperFront);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, <Effect>this._colorShader.getEffect());\r\n\r\n // Front\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToGreater();\r\n } else {\r\n engine.setDepthFunctionToLess();\r\n }\r\n this._uniformBufferFront.bindToEffect(drawWrapperFront.effect!, \"BoundingBoxRenderer\");\r\n this._uniformBufferFront.updateDirectColor4(\"color\", frontColor);\r\n this._uniformBufferFront.updateMatrix(\"world\", worldMatrix);\r\n this._uniformBufferFront.updateMatrix(\"viewProjection\", transformMatrix);\r\n this._uniformBufferFront.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24);\r\n\r\n this.onAfterBoxRenderingObservable.notifyObservers(boundingBox);\r\n }\r\n this._colorShader.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * In case of occlusion queries, we can render the occlusion bounding box through this method\r\n * @param mesh Define the mesh to render the occlusion bounding box for\r\n */\r\n public renderOcclusionBoundingBox(mesh: AbstractMesh): void {\r\n\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady() || !mesh.hasBoundingInfo) {\r\n return;\r\n }\r\n\r\n var engine = this.scene.getEngine();\r\n if (!this._fillIndexBuffer) {\r\n this._fillIndexBuffer = engine.createIndexBuffer(this._fillIndexData!);\r\n }\r\n\r\n engine.setDepthWrite(false);\r\n engine.setColorWrite(false);\r\n this._colorShader._preBind();\r\n\r\n var boundingBox = mesh.getBoundingInfo().boundingBox;\r\n var min = boundingBox.minimum;\r\n var max = boundingBox.maximum;\r\n var diff = max.subtract(min);\r\n var median = min.add(diff.scale(0.5));\r\n\r\n var worldMatrix = Matrix.Scaling(diff.x, diff.y, diff.z)\r\n .multiply(Matrix.Translation(median.x, median.y, median.z))\r\n .multiply(boundingBox.getWorldMatrix());\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._fillIndexBuffer, <Effect>this._colorShader.getEffect());\r\n\r\n engine.setDepthFunctionToLess();\r\n this.scene.resetCachedMaterial();\r\n this._colorShader.bind(worldMatrix);\r\n\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 36);\r\n\r\n this._colorShader.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n engine.setColorWrite(true);\r\n }\r\n\r\n /**\r\n * Dispose and release the resources attached to this renderer.\r\n */\r\n public dispose(): void {\r\n if (!this._colorShader) {\r\n return;\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.clear();\r\n this.onAfterBoxRenderingObservable.clear();\r\n this.onResourcesReadyObservable.clear();\r\n\r\n this.renderList.dispose();\r\n\r\n this._colorShader.dispose();\r\n\r\n this._uniformBufferFront.dispose();\r\n this._uniformBufferBack.dispose();\r\n\r\n var buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n this.scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n\r\n if (this._fillIndexBuffer) {\r\n this.scene.getEngine()._releaseBuffer(this._fillIndexBuffer);\r\n this._fillIndexBuffer = null;\r\n }\r\n }\r\n}\r\n"]}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b
3
+ */
1
4
  import { Effect } from "../Materials/effect";
2
5
  import { SubMesh } from "../Meshes/subMesh";
3
6
  import { SmartArray } from "../Misc/smartArray";
@@ -19,17 +22,31 @@ export declare class DepthPeelingRenderer {
19
22
  private _colorMrts;
20
23
  private _blendBackMrt;
21
24
  private _blendBackEffectWrapper;
25
+ private _blendBackEffectWrapperPingPong;
22
26
  private _finalEffectWrapper;
23
27
  private _effectRenderer;
24
- private _passCount;
25
28
  private _currentPingPongState;
26
29
  private _prePassEffectConfiguration;
27
30
  private _blendBackTexture;
31
+ private _layoutCacheFormat;
28
32
  private _layoutCache;
33
+ private _renderPassIds;
29
34
  private static _DEPTH_CLEAR_VALUE;
30
35
  private static _MIN_DEPTH;
31
36
  private static _MAX_DEPTH;
32
37
  private _colorCache;
38
+ private _passCount;
39
+ /**
40
+ * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.
41
+ */
42
+ get passCount(): number;
43
+ set passCount(count: number);
44
+ private _useRenderPasses;
45
+ /**
46
+ * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.
47
+ */
48
+ get useRenderPasses(): boolean;
49
+ set useRenderPasses(usePasses: boolean);
33
50
  /**
34
51
  * Instanciates the depth peeling renderer
35
52
  * @param scene Scene to attach to
@@ -37,6 +54,8 @@ export declare class DepthPeelingRenderer {
37
54
  * @returns The depth peeling renderer
38
55
  */
39
56
  constructor(scene: Scene, passCount?: number);
57
+ private _createRenderPassIds;
58
+ private _releaseRenderPassIds;
40
59
  private _createTextures;
41
60
  private _disposeTextures;
42
61
  private _updateTextures;
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b
3
+ */
1
4
  import { MultiRenderTarget } from "../Materials/Textures/multiRenderTarget.js";
2
5
  import { Color4 } from "../Maths/math.color.js";
3
6
  import { ThinTexture } from "../Materials/Textures/thinTexture.js";
@@ -39,7 +42,8 @@ var DepthPeelingRenderer = /** @class */ (function () {
39
42
  if (passCount === void 0) { passCount = 5; }
40
43
  this._thinTextures = [];
41
44
  this._currentPingPongState = 0;
42
- this._layoutCache = [[true], [true, true], [true, true, true]];
45
+ this._layoutCacheFormat = [[true], [true, true], [true, true, true]];
46
+ this._layoutCache = [];
43
47
  this._colorCache = [
44
48
  new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),
45
49
  new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0),
@@ -53,10 +57,65 @@ var DepthPeelingRenderer = /** @class */ (function () {
53
57
  Logger.Warn("Depth peeling for order independant transparency could not enable PrePass, aborting.");
54
58
  return;
55
59
  }
60
+ for (var i = 0; i < this._layoutCacheFormat.length; ++i) {
61
+ this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);
62
+ }
63
+ this._renderPassIds = [];
64
+ this.useRenderPasses = false;
56
65
  this._prePassEffectConfiguration = new DepthPeelingEffectConfiguration();
57
66
  this._createTextures();
58
67
  this._createEffects();
59
68
  }
69
+ Object.defineProperty(DepthPeelingRenderer.prototype, "passCount", {
70
+ /**
71
+ * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.
72
+ */
73
+ get: function () {
74
+ return this._passCount;
75
+ },
76
+ set: function (count) {
77
+ if (this._passCount === count) {
78
+ return;
79
+ }
80
+ this._passCount = count;
81
+ this._createRenderPassIds();
82
+ },
83
+ enumerable: false,
84
+ configurable: true
85
+ });
86
+ Object.defineProperty(DepthPeelingRenderer.prototype, "useRenderPasses", {
87
+ /**
88
+ * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.
89
+ */
90
+ get: function () {
91
+ return this._useRenderPasses;
92
+ },
93
+ set: function (usePasses) {
94
+ if (this._useRenderPasses === usePasses) {
95
+ return;
96
+ }
97
+ this._useRenderPasses = usePasses;
98
+ this._createRenderPassIds();
99
+ },
100
+ enumerable: false,
101
+ configurable: true
102
+ });
103
+ DepthPeelingRenderer.prototype._createRenderPassIds = function () {
104
+ this._releaseRenderPassIds();
105
+ if (this._useRenderPasses) {
106
+ for (var i = 0; i < this._passCount + 1; ++i) {
107
+ if (!this._renderPassIds[i]) {
108
+ this._renderPassIds[i] = this._engine.createRenderPassId("DepthPeelingRenderer - pass #" + i);
109
+ }
110
+ }
111
+ }
112
+ };
113
+ DepthPeelingRenderer.prototype._releaseRenderPassIds = function () {
114
+ for (var i = 0; i < this._renderPassIds.length; ++i) {
115
+ this._engine.releaseRenderPassId(this._renderPassIds[i]);
116
+ }
117
+ this._renderPassIds = [];
118
+ };
60
119
  DepthPeelingRenderer.prototype._createTextures = function () {
61
120
  var size = {
62
121
  width: this._engine.getRenderWidth(),
@@ -64,15 +123,15 @@ var DepthPeelingRenderer = /** @class */ (function () {
64
123
  };
65
124
  // 2 for ping pong
66
125
  this._depthMrts = [new MultiRenderTarget("depthPeelingDepth0", size, 1, this._scene), new MultiRenderTarget("depthPeelingDepth1", size, 1, this._scene)];
67
- this._colorMrts = [new MultiRenderTarget("depthPeelingColor0", size, 1, this._scene), new MultiRenderTarget("depthPeelingColor1", size, 1, this._scene)];
68
- this._blendBackMrt = new MultiRenderTarget("depthPeelingBack", size, 1, this._scene);
126
+ this._colorMrts = [new MultiRenderTarget("depthPeelingColor0", size, 1, this._scene, { generateDepthBuffer: false }), new MultiRenderTarget("depthPeelingColor1", size, 1, this._scene, { generateDepthBuffer: false })];
127
+ this._blendBackMrt = new MultiRenderTarget("depthPeelingBack", size, 1, this._scene, { generateDepthBuffer: false });
69
128
  // 0 is a depth texture
70
129
  // 1 is a color texture
71
130
  var optionsArray = [
72
131
  {
73
132
  format: 7,
74
133
  samplingMode: 1,
75
- type: 1,
134
+ type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,
76
135
  },
77
136
  {
78
137
  format: 5,
@@ -81,9 +140,9 @@ var DepthPeelingRenderer = /** @class */ (function () {
81
140
  },
82
141
  ];
83
142
  for (var i = 0; i < 2; i++) {
84
- var depthTexture = this._engine._createInternalTexture(size, optionsArray[0]);
85
- var frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1]);
86
- var backColorTexture = this._engine._createInternalTexture(size, optionsArray[1]);
143
+ var depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);
144
+ var frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);
145
+ var backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);
87
146
  this._depthMrts[i].setInternalTexture(depthTexture, 0);
88
147
  this._depthMrts[i].setInternalTexture(frontColorTexture, 1);
89
148
  this._depthMrts[i].setInternalTexture(backColorTexture, 2);
@@ -147,6 +206,13 @@ var DepthPeelingRenderer = /** @class */ (function () {
147
206
  samplerNames: ["uBackColor"],
148
207
  uniformNames: [],
149
208
  });
209
+ this._blendBackEffectWrapperPingPong = new EffectWrapper({
210
+ fragmentShader: "oitBackBlend",
211
+ useShaderStore: true,
212
+ engine: this._engine,
213
+ samplerNames: ["uBackColor"],
214
+ uniformNames: [],
215
+ });
150
216
  this._finalEffectWrapper = new EffectWrapper({
151
217
  fragmentShader: "oitFinal",
152
218
  useShaderStore: true,
@@ -172,17 +238,38 @@ var DepthPeelingRenderer = /** @class */ (function () {
172
238
  effect.setTexture("oitFrontColorSampler", this._thinTextures[this._currentPingPongState * 3 + 1]);
173
239
  };
174
240
  DepthPeelingRenderer.prototype._renderSubMeshes = function (transparentSubMeshes) {
241
+ var mapMaterialContext;
242
+ if (this._useRenderPasses) {
243
+ mapMaterialContext = {};
244
+ }
175
245
  for (var j = 0; j < transparentSubMeshes.length; j++) {
176
246
  var material = transparentSubMeshes.data[j].getMaterial();
177
247
  var previousShaderHotSwapping = true;
178
248
  var previousBFC = false;
249
+ var subMesh = transparentSubMeshes.data[j];
250
+ var drawWrapper = void 0;
251
+ var firstDraw = false;
252
+ if (this._useRenderPasses) {
253
+ drawWrapper = subMesh._getDrawWrapper();
254
+ firstDraw = !drawWrapper;
255
+ }
179
256
  if (material) {
180
257
  previousShaderHotSwapping = material.allowShaderHotSwapping;
181
258
  previousBFC = material.backFaceCulling;
182
259
  material.allowShaderHotSwapping = false;
183
260
  material.backFaceCulling = false;
184
261
  }
185
- transparentSubMeshes.data[j].render(false);
262
+ subMesh.render(false);
263
+ if (firstDraw) { // first time we draw this submesh: we replace the material context
264
+ drawWrapper = subMesh._getDrawWrapper(); // we are sure it is now non empty as we just rendered the submesh
265
+ if (drawWrapper.materialContext) {
266
+ var newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId];
267
+ if (!newMaterialContext) {
268
+ newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();
269
+ }
270
+ subMesh._getDrawWrapper().materialContext = newMaterialContext;
271
+ }
272
+ }
186
273
  if (material) {
187
274
  material.allowShaderHotSwapping = previousShaderHotSwapping;
188
275
  material.backFaceCulling = previousBFC;
@@ -190,9 +277,8 @@ var DepthPeelingRenderer = /** @class */ (function () {
190
277
  }
191
278
  };
192
279
  DepthPeelingRenderer.prototype._finalCompose = function (writeId) {
193
- this._engine._bindUnboundFramebuffer(null);
194
- this._engine.setAlphaMode(14);
195
- this._engine._alphaState.alphaBlend = false;
280
+ this._engine.restoreDefaultFramebuffer();
281
+ this._engine.setAlphaMode(0);
196
282
  this._engine.applyStates();
197
283
  this._engine.enableEffect(this._finalEffectWrapper._drawWrapper);
198
284
  this._finalEffectWrapper.effect.setTexture("uFrontColor", this._thinTextures[writeId * 3 + 1]);
@@ -204,40 +290,43 @@ var DepthPeelingRenderer = /** @class */ (function () {
204
290
  * @param transparentSubMeshes List of transparent meshes to render
205
291
  */
206
292
  DepthPeelingRenderer.prototype.render = function (transparentSubMeshes) {
207
- if (!this._blendBackEffectWrapper.effect.isReady() || !this._finalEffectWrapper.effect.isReady() || !this._updateTextures()) {
293
+ if (!this._blendBackEffectWrapper.effect.isReady() || !this._blendBackEffectWrapperPingPong.effect.isReady() || !this._finalEffectWrapper.effect.isReady() || !this._updateTextures()) {
208
294
  return;
209
295
  }
210
296
  if (!transparentSubMeshes.length) {
211
297
  this._finalCompose(1);
212
298
  return;
213
299
  }
300
+ var currentRenderPassId = this._engine.currentRenderPassId;
214
301
  this._scene.prePassRenderer._enabled = false;
302
+ if (this._useRenderPasses) {
303
+ this._engine.currentRenderPassId = this._renderPassIds[0];
304
+ }
215
305
  // Clears
216
306
  this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);
217
- var attachments = this._engine.buildTextureLayout(this._layoutCache[0]);
218
- this._engine.bindAttachments(attachments);
307
+ this._engine.bindAttachments(this._layoutCache[0]);
219
308
  this._engine.clear(this._colorCache[0], true, false, false);
220
309
  this._engine.bindFramebuffer(this._depthMrts[1].renderTarget);
310
+ this._engine.bindAttachments(this._layoutCache[0]);
221
311
  this._engine.clear(this._colorCache[1], true, false, false);
222
312
  this._engine.bindFramebuffer(this._colorMrts[0].renderTarget);
223
- attachments = this._engine.buildTextureLayout(this._layoutCache[1]);
224
- this._engine.bindAttachments(attachments);
313
+ this._engine.bindAttachments(this._layoutCache[1]);
225
314
  this._engine.clear(this._colorCache[2], true, false, false);
226
315
  this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);
316
+ this._engine.bindAttachments(this._layoutCache[1]);
227
317
  this._engine.clear(this._colorCache[2], true, false, false);
228
318
  // Draw depth for first pass
229
319
  this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);
230
- attachments = this._engine.buildTextureLayout(this._layoutCache[0]);
231
- this._engine.bindAttachments(attachments);
320
+ this._engine.bindAttachments(this._layoutCache[0]);
321
+ this._engine.setAlphaMode(6); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error
232
322
  this._engine.setAlphaEquation(3);
233
- this._engine._alphaState.alphaBlend = true;
234
323
  this._engine.depthCullingState.depthMask = false;
235
324
  this._engine.depthCullingState.depthTest = true;
236
- this._engine.depthCullingState.cull = false;
237
325
  this._engine.applyStates();
238
326
  this._currentPingPongState = 1;
239
327
  // Render
240
328
  this._renderSubMeshes(transparentSubMeshes);
329
+ this._scene.resetCachedMaterial();
241
330
  // depth peeling ping-pong
242
331
  var readId = 0;
243
332
  var writeId = 0;
@@ -245,39 +334,42 @@ var DepthPeelingRenderer = /** @class */ (function () {
245
334
  readId = i % 2;
246
335
  writeId = 1 - readId;
247
336
  this._currentPingPongState = readId;
337
+ if (this._useRenderPasses) {
338
+ this._engine.currentRenderPassId = this._renderPassIds[i + 1];
339
+ }
248
340
  // Clears
249
341
  this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);
250
- attachments = this._engine.buildTextureLayout(this._layoutCache[0]);
251
- this._engine.bindAttachments(attachments);
342
+ this._engine.bindAttachments(this._layoutCache[0]);
252
343
  this._engine.clear(this._colorCache[0], true, false, false);
253
344
  this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget);
254
- attachments = this._engine.buildTextureLayout(this._layoutCache[1]);
255
- this._engine.bindAttachments(attachments);
345
+ this._engine.bindAttachments(this._layoutCache[1]);
256
346
  this._engine.clear(this._colorCache[2], true, false, false);
257
347
  this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);
258
- attachments = this._engine.buildTextureLayout(this._layoutCache[2]);
259
- this._engine.bindAttachments(attachments);
348
+ this._engine.bindAttachments(this._layoutCache[2]);
349
+ this._engine.setAlphaMode(6); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error
260
350
  this._engine.setAlphaEquation(3);
261
- this._engine._alphaState.alphaBlend = true;
262
351
  this._engine.depthCullingState.depthTest = false;
263
352
  this._engine.applyStates();
264
353
  // Render
265
354
  this._renderSubMeshes(transparentSubMeshes);
355
+ this._scene.resetCachedMaterial();
266
356
  // Back color
267
357
  this._engine.bindFramebuffer(this._blendBackMrt.renderTarget);
268
- attachments = this._engine.buildTextureLayout(this._layoutCache[0]);
269
- this._engine.bindAttachments(attachments);
358
+ this._engine.bindAttachments(this._layoutCache[0]);
270
359
  this._engine.setAlphaEquation(0);
271
360
  this._engine.setAlphaMode(17);
272
361
  this._engine.applyStates();
273
- this._engine.enableEffect(this._blendBackEffectWrapper._drawWrapper);
274
- this._blendBackEffectWrapper.effect.setTexture("uBackColor", this._thinTextures[writeId * 3 + 2]);
275
- this._effectRenderer.render(this._blendBackEffectWrapper);
362
+ var blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;
363
+ this._engine.enableEffect(blendBackEffectWrapper._drawWrapper);
364
+ blendBackEffectWrapper.effect.setTexture("uBackColor", this._thinTextures[writeId * 3 + 2]);
365
+ this._effectRenderer.render(blendBackEffectWrapper);
276
366
  }
367
+ this._engine.currentRenderPassId = currentRenderPassId;
277
368
  // Final composition on default FB
278
369
  this._finalCompose(writeId);
279
370
  this._scene.prePassRenderer._enabled = true;
280
371
  this._engine.depthCullingState.depthMask = true;
372
+ this._engine.depthCullingState.depthTest = true;
281
373
  };
282
374
  /**
283
375
  * Disposes the depth peeling renderer and associated ressources
@@ -287,6 +379,7 @@ var DepthPeelingRenderer = /** @class */ (function () {
287
379
  this._blendBackEffectWrapper.dispose();
288
380
  this._finalEffectWrapper.dispose();
289
381
  this._effectRenderer.dispose();
382
+ this._releaseRenderPassIds();
290
383
  };
291
384
  DepthPeelingRenderer._DEPTH_CLEAR_VALUE = -99999.0;
292
385
  DepthPeelingRenderer._MIN_DEPTH = 0;