@onerjs/core 8.28.7 → 8.28.8

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 (50) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Lights/Clustered/clusteredLightContainer.js +4 -3
  4. package/Lights/Clustered/clusteredLightContainer.js.map +1 -1
  5. package/Lights/pointLight.js +6 -4
  6. package/Lights/pointLight.js.map +1 -1
  7. package/Lights/rectAreaLight.js +6 -4
  8. package/Lights/rectAreaLight.js.map +1 -1
  9. package/Lights/spotLight.js +3 -2
  10. package/Lights/spotLight.js.map +1 -1
  11. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +11 -0
  12. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +73 -26
  13. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  14. package/Materials/PBR/openpbrMaterial.js +1 -1
  15. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  16. package/Meshes/mesh.js +7 -6
  17. package/Meshes/mesh.js.map +1 -1
  18. package/PostProcesses/thinTAAPostProcess.js +1 -1
  19. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  20. package/Rendering/boundingBoxRenderer.js +4 -3
  21. package/Rendering/boundingBoxRenderer.js.map +1 -1
  22. package/Rendering/edgesRenderer.js +4 -3
  23. package/Rendering/edgesRenderer.js.map +1 -1
  24. package/Shaders/ShadersInclude/gaussianSplatting.js +10 -2
  25. package/Shaders/ShadersInclude/gaussianSplatting.js.map +1 -1
  26. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +2 -2
  27. package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  28. package/Shaders/gaussianSplattingDepth.fragment.d.ts +5 -0
  29. package/Shaders/gaussianSplattingDepth.fragment.js +11 -0
  30. package/Shaders/gaussianSplattingDepth.fragment.js.map +1 -0
  31. package/Shaders/gaussianSplattingDepth.vertex.d.ts +8 -0
  32. package/Shaders/gaussianSplattingDepth.vertex.js +17 -0
  33. package/Shaders/gaussianSplattingDepth.vertex.js.map +1 -0
  34. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js +7 -1
  35. package/ShadersWGSL/ShadersInclude/gaussianSplatting.js.map +1 -1
  36. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js +1 -1
  37. package/ShadersWGSL/ShadersInclude/openpbrBaseLayerData.js.map +1 -1
  38. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +2 -2
  39. package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
  40. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js +1 -1
  41. package/ShadersWGSL/ShadersInclude/openpbrFragmentSamplersDeclaration.js.map +1 -1
  42. package/ShadersWGSL/gaussianSplattingDepth.fragment.d.ts +6 -0
  43. package/ShadersWGSL/gaussianSplattingDepth.fragment.js +17 -0
  44. package/ShadersWGSL/gaussianSplattingDepth.fragment.js.map +1 -0
  45. package/ShadersWGSL/gaussianSplattingDepth.vertex.d.ts +8 -0
  46. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +19 -0
  47. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -0
  48. package/package.json +1 -1
  49. package/scene.js +6 -5
  50. package/scene.js.map +1 -1
@@ -157,7 +157,7 @@ export class ThinTAAPostProcess extends EffectWrapper {
157
157
  if (this.reprojectHistory && this._taaMaterialManager) {
158
158
  // Applying jitter to the projection matrix messes with the velocity buffer,
159
159
  // so we do it as a final vertex step in a material plugin instead
160
- this._nextJitterOffset( /*this._taaMaterialManager.jitter*/);
160
+ this._nextJitterOffset(this._taaMaterialManager.jitter);
161
161
  }
162
162
  else {
163
163
  // Use the projection matrix by default since it supports most materials
@@ -1 +1 @@
1
- {"version":3,"file":"thinTAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinTAAPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, EffectWrapperCreationOptions, Scene } from \"core/index\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { TAAMaterialManager } from \"./RenderPipeline/Pipelines/taaMaterialManager\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class ThinTAAPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"taa\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"factor\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"historySampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/taa.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/taa.fragment\"));\r\n }\r\n }\r\n\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 8)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n public factor = 0.05;\r\n\r\n /**\r\n * The camera to use for the post process\r\n */\r\n public camera: Nullable<Camera>;\r\n\r\n private _disabled = false;\r\n /**\r\n * Whether the TAA is disabled\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n if (this._disabled === value) {\r\n return;\r\n }\r\n this._disabled = value;\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;\r\n }\r\n this._reset();\r\n }\r\n\r\n private _textureWidth = 0;\r\n /**\r\n * The width of the texture in which to render\r\n */\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n this._reset();\r\n }\r\n\r\n private _textureHeight = 0;\r\n /**\r\n * The height of the texture in which to render\r\n */\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n public disableOnCameraMove = true;\r\n\r\n private _reprojectHistory = false;\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n * If set the \"velocitySampler\" has to be provided.\r\n */\r\n public get reprojectHistory(): boolean {\r\n return this._reprojectHistory;\r\n }\r\n\r\n public set reprojectHistory(reproject: boolean) {\r\n if (this._reprojectHistory === reproject) {\r\n return;\r\n }\r\n this._reprojectHistory = reproject;\r\n\r\n if (reproject) {\r\n if (!this._taaMaterialManager) {\r\n this._taaMaterialManager = new TAAMaterialManager(this._scene);\r\n }\r\n // The velocity buffer may be old so reset for one frame\r\n this._reset();\r\n }\r\n\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = reproject && !this._disabled;\r\n }\r\n\r\n this._updateEffect();\r\n }\r\n\r\n private _clampHistory = false;\r\n /**\r\n * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.\r\n * This can help further reduce ghosting and artifacts.\r\n */\r\n public get clampHistory(): boolean {\r\n return this._clampHistory;\r\n }\r\n\r\n public set clampHistory(clamp: boolean) {\r\n if (this._clampHistory === clamp) {\r\n return;\r\n }\r\n this._clampHistory = clamp;\r\n this._updateEffect();\r\n }\r\n\r\n private _scene: Scene;\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n private _taaMaterialManager: Nullable<TAAMaterialManager>;\r\n\r\n /**\r\n * Constructs a new TAA post process\r\n * @param name Name of the effect\r\n * @param scene The scene the post process belongs to\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: scene.getEngine(),\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinTAAPostProcess.FragmentUrl,\r\n uniforms: ThinTAAPostProcess.Uniforms,\r\n samplers: ThinTAAPostProcess.Samplers,\r\n });\r\n\r\n this._scene = scene;\r\n this._hs = new Halton2DSequence(this.samples);\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._hs.setDimensions(this._textureWidth / 2, this._textureHeight / 2);\r\n this._hs.next();\r\n this._firstUpdate = true;\r\n }\r\n\r\n /** @internal */\r\n public _updateJitter() {\r\n if (this.reprojectHistory && this._taaMaterialManager) {\r\n // Applying jitter to the projection matrix messes with the velocity buffer,\r\n // so we do it as a final vertex step in a material plugin instead\r\n this._nextJitterOffset(/*this._taaMaterialManager.jitter*/);\r\n } else {\r\n // Use the projection matrix by default since it supports most materials\r\n this._updateProjectionMatrix();\r\n }\r\n }\r\n\r\n protected _nextJitterOffset(output = new Vector2()): Vector2 {\r\n if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {\r\n this._hs.next();\r\n }\r\n output.set(this._hs.x, this._hs.y);\r\n return output;\r\n }\r\n\r\n protected _updateProjectionMatrix(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.camera && !this.camera.hasMoved) {\r\n if (this.camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n const projMat = this.camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n } else {\r\n // We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame\r\n const projMat = this.camera.getProjectionMatrix(true);\r\n projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);\r\n }\r\n }\r\n\r\n this._hs.next();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"factor\", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n }\r\n\r\n public override dispose() {\r\n this._taaMaterialManager?.dispose();\r\n super.dispose();\r\n }\r\n\r\n private _updateEffect(): void {\r\n const defines: string[] = [];\r\n // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers\r\n const samplers = [\"textureSampler\", \"historySampler\"];\r\n if (this._reprojectHistory) {\r\n defines.push(\"#define TAA_REPROJECT_HISTORY\");\r\n samplers.push(\"velocitySampler\");\r\n }\r\n if (this._clampHistory) {\r\n defines.push(\"#define TAA_CLAMP_HISTORY\");\r\n }\r\n this.updateEffect(defines.join(\"\\n\"), null, samplers);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"thinTAAPostProcess.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/thinTAAPostProcess.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, EffectWrapperCreationOptions, Scene } from \"core/index\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Halton2DSequence } from \"core/Maths/halton2DSequence\";\r\nimport { Vector2 } from \"core/Maths/math.vector\";\r\nimport { EffectWrapper } from \"core/Materials/effectRenderer\";\r\nimport { TAAMaterialManager } from \"./RenderPipeline/Pipelines/taaMaterialManager\";\r\n\r\n/**\r\n * Simple implementation of Temporal Anti-Aliasing (TAA).\r\n * This can be used to improve image quality for still pictures (screenshots for e.g.).\r\n */\r\nexport class ThinTAAPostProcess extends EffectWrapper {\r\n /**\r\n * The fragment shader url\r\n */\r\n public static readonly FragmentUrl = \"taa\";\r\n\r\n /**\r\n * The list of uniforms used by the effect\r\n */\r\n public static readonly Uniforms = [\"factor\"];\r\n\r\n /**\r\n * The list of samplers used by the effect\r\n */\r\n public static readonly Samplers = [\"historySampler\"];\r\n\r\n protected override _gatherImports(useWebGPU: boolean, list: Promise<any>[]) {\r\n if (useWebGPU) {\r\n this._webGPUReady = true;\r\n list.push(import(\"../ShadersWGSL/taa.fragment\"));\r\n } else {\r\n list.push(import(\"../Shaders/taa.fragment\"));\r\n }\r\n }\r\n\r\n private _samples = 8;\r\n /**\r\n * Number of accumulated samples (default: 8)\r\n */\r\n public set samples(samples: number) {\r\n if (this._samples === samples) {\r\n return;\r\n }\r\n\r\n this._samples = samples;\r\n this._hs.regenerate(samples);\r\n }\r\n\r\n public get samples(): number {\r\n return this._samples;\r\n }\r\n\r\n /**\r\n * The factor used to blend the history frame with current frame (default: 0.05)\r\n */\r\n public factor = 0.05;\r\n\r\n /**\r\n * The camera to use for the post process\r\n */\r\n public camera: Nullable<Camera>;\r\n\r\n private _disabled = false;\r\n /**\r\n * Whether the TAA is disabled\r\n */\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value: boolean) {\r\n if (this._disabled === value) {\r\n return;\r\n }\r\n this._disabled = value;\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = !value && this.reprojectHistory;\r\n }\r\n this._reset();\r\n }\r\n\r\n private _textureWidth = 0;\r\n /**\r\n * The width of the texture in which to render\r\n */\r\n public get textureWidth() {\r\n return this._textureWidth;\r\n }\r\n\r\n public set textureWidth(width: number) {\r\n if (this._textureWidth === width) {\r\n return;\r\n }\r\n this._textureWidth = width;\r\n this._reset();\r\n }\r\n\r\n private _textureHeight = 0;\r\n /**\r\n * The height of the texture in which to render\r\n */\r\n public get textureHeight() {\r\n return this._textureHeight;\r\n }\r\n\r\n public set textureHeight(height: number) {\r\n if (this._textureHeight === height) {\r\n return;\r\n }\r\n this._textureHeight = height;\r\n this._reset();\r\n }\r\n\r\n /**\r\n * Disable TAA on camera move (default: true).\r\n * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)\r\n */\r\n public disableOnCameraMove = true;\r\n\r\n private _reprojectHistory = false;\r\n /**\r\n * Enables reprojecting the history texture with a per-pixel velocity.\r\n * If set the \"velocitySampler\" has to be provided.\r\n */\r\n public get reprojectHistory(): boolean {\r\n return this._reprojectHistory;\r\n }\r\n\r\n public set reprojectHistory(reproject: boolean) {\r\n if (this._reprojectHistory === reproject) {\r\n return;\r\n }\r\n this._reprojectHistory = reproject;\r\n\r\n if (reproject) {\r\n if (!this._taaMaterialManager) {\r\n this._taaMaterialManager = new TAAMaterialManager(this._scene);\r\n }\r\n // The velocity buffer may be old so reset for one frame\r\n this._reset();\r\n }\r\n\r\n if (this._taaMaterialManager) {\r\n this._taaMaterialManager.isEnabled = reproject && !this._disabled;\r\n }\r\n\r\n this._updateEffect();\r\n }\r\n\r\n private _clampHistory = false;\r\n /**\r\n * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.\r\n * This can help further reduce ghosting and artifacts.\r\n */\r\n public get clampHistory(): boolean {\r\n return this._clampHistory;\r\n }\r\n\r\n public set clampHistory(clamp: boolean) {\r\n if (this._clampHistory === clamp) {\r\n return;\r\n }\r\n this._clampHistory = clamp;\r\n this._updateEffect();\r\n }\r\n\r\n private _scene: Scene;\r\n private _hs: Halton2DSequence;\r\n private _firstUpdate = true;\r\n private _taaMaterialManager: Nullable<TAAMaterialManager>;\r\n\r\n /**\r\n * Constructs a new TAA post process\r\n * @param name Name of the effect\r\n * @param scene The scene the post process belongs to\r\n * @param options Options to configure the effect\r\n */\r\n constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) {\r\n super({\r\n ...options,\r\n name,\r\n engine: scene.getEngine(),\r\n useShaderStore: true,\r\n useAsPostProcess: true,\r\n fragmentShader: ThinTAAPostProcess.FragmentUrl,\r\n uniforms: ThinTAAPostProcess.Uniforms,\r\n samplers: ThinTAAPostProcess.Samplers,\r\n });\r\n\r\n this._scene = scene;\r\n this._hs = new Halton2DSequence(this.samples);\r\n }\r\n\r\n /** @internal */\r\n public _reset(): void {\r\n this._hs.setDimensions(this._textureWidth / 2, this._textureHeight / 2);\r\n this._hs.next();\r\n this._firstUpdate = true;\r\n }\r\n\r\n /** @internal */\r\n public _updateJitter() {\r\n if (this.reprojectHistory && this._taaMaterialManager) {\r\n // Applying jitter to the projection matrix messes with the velocity buffer,\r\n // so we do it as a final vertex step in a material plugin instead\r\n this._nextJitterOffset(this._taaMaterialManager.jitter);\r\n } else {\r\n // Use the projection matrix by default since it supports most materials\r\n this._updateProjectionMatrix();\r\n }\r\n }\r\n\r\n protected _nextJitterOffset(output = new Vector2()): Vector2 {\r\n if (!this.camera || !this.camera.hasMoved || !this.disableOnCameraMove) {\r\n this._hs.next();\r\n }\r\n output.set(this._hs.x, this._hs.y);\r\n return output;\r\n }\r\n\r\n protected _updateProjectionMatrix(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n if (this.camera && !this.camera.hasMoved) {\r\n if (this.camera.mode === Camera.PERSPECTIVE_CAMERA) {\r\n const projMat = this.camera.getProjectionMatrix();\r\n projMat.setRowFromFloats(2, this._hs.x, this._hs.y, projMat.m[10], projMat.m[11]);\r\n } else {\r\n // We must force the update of the projection matrix so that m[12] and m[13] are recomputed, as we modified them the previous frame\r\n const projMat = this.camera.getProjectionMatrix(true);\r\n projMat.setRowFromFloats(3, this._hs.x + projMat.m[12], this._hs.y + projMat.m[13], projMat.m[14], projMat.m[15]);\r\n }\r\n }\r\n\r\n this._hs.next();\r\n }\r\n\r\n public override bind(noDefaultBindings = false) {\r\n super.bind(noDefaultBindings);\r\n\r\n if (this.disabled) {\r\n return;\r\n }\r\n\r\n const effect = this._drawWrapper.effect!;\r\n\r\n effect.setFloat(\"factor\", (this.camera?.hasMoved && this.disableOnCameraMove) || this._firstUpdate ? 1 : this.factor);\r\n\r\n this._firstUpdate = false;\r\n }\r\n\r\n public override dispose() {\r\n this._taaMaterialManager?.dispose();\r\n super.dispose();\r\n }\r\n\r\n private _updateEffect(): void {\r\n const defines: string[] = [];\r\n // There seems to be an issue where `updateEffect` sometimes doesn't include the initial samplers\r\n const samplers = [\"textureSampler\", \"historySampler\"];\r\n if (this._reprojectHistory) {\r\n defines.push(\"#define TAA_REPROJECT_HISTORY\");\r\n samplers.push(\"velocitySampler\");\r\n }\r\n if (this._clampHistory) {\r\n defines.push(\"#define TAA_CLAMP_HISTORY\");\r\n }\r\n this.updateEffect(defines.join(\"\\n\"), null, samplers);\r\n }\r\n}\r\n"]}
@@ -472,6 +472,7 @@ export class BoundingBoxRenderer {
472
472
  }
473
473
  this.onBeforeBoxRenderingObservable.notifyObservers(DummyBoundingBox);
474
474
  let instancesCount = 0;
475
+ const floatingOriginOffset = this.scene.floatingOriginOffset;
475
476
  for (let boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {
476
477
  const boundingBox = this.renderList.data[boundingBoxIndex];
477
478
  if (boundingBox._tag !== renderingGroupId) {
@@ -491,9 +492,9 @@ export class BoundingBoxRenderer {
491
492
  m[11] = median._z; // Translate Z
492
493
  const offset = instancesCount * 16;
493
494
  TempMatrix.multiplyToArray(boundingBox.getWorldMatrix(), matrices, offset);
494
- matrices[offset + 12] -= this.scene.floatingOriginOffset.x;
495
- matrices[offset + 13] -= this.scene.floatingOriginOffset.y;
496
- matrices[offset + 14] -= this.scene.floatingOriginOffset.z;
495
+ matrices[offset + 12] -= floatingOriginOffset.x;
496
+ matrices[offset + 13] -= floatingOriginOffset.y;
497
+ matrices[offset + 14] -= floatingOriginOffset.z;
497
498
  instancesCount++;
498
499
  }
499
500
  const engine = this.scene.getEngine();
@@ -1 +1 @@
1
- {"version":3,"file":"boundingBoxRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/boundingBoxRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scene } from \"../scene\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { BoundingBox } from \"../Culling/boundingBox\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { 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\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal (Backing field) */\r\n _boundingBoxRenderer: BoundingBoxRenderer;\r\n\r\n /** @internal (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 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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /** @internal (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\nconst TempMatrix = Matrix.Identity();\r\nconst TempVec1 = new Vector3();\r\nconst TempVec2 = new Vector3();\r\n// `Matrix.asArray` returns its internal array, so it can be directly updated\r\nconst TempMatrixArray = TempMatrix.asArray();\r\n\r\n// BoundingBox copies from it, so it's safe to reuse vectors here\r\nconst DummyBoundingBox = new BoundingBox(TempVec1, TempVec1);\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 * When {@link BoundingBoxRenderer.useInstances} enabled,\r\n * this would only be triggered once for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\r\n */\r\n public onBeforeBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after rendering a bounding box\r\n * When {@link BoundingBoxRenderer.useInstances} enabled,\r\n * this would only be triggered once for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\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 /** Shader language used by the renderer */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public renderList = new SmartArray<BoundingBox>(32);\r\n\r\n private _colorShader: ShaderMaterial;\r\n private _colorShaderForOcclusionQuery: 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 private _renderPassIdForOcclusionQuery: number;\r\n /**\r\n * Internal buffer for instanced rendering\r\n */\r\n private _matrixBuffer: Nullable<Buffer> = null;\r\n private _matrices: Nullable<Float32Array> = null;\r\n\r\n /**\r\n * Internal state of whether instanced rendering enabled\r\n */\r\n protected _useInstances = false;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = 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\r\n const engine = this.scene.getEngine();\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n scene._addComponent(this);\r\n this._uniformBufferFront = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererFront\", true);\r\n this._buildUniformLayout(this._uniformBufferFront);\r\n this._uniformBufferBack = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererBack\", true);\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 /**\r\n * Checks if the renderer is ready asynchronously.\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000)\r\n * @returns The promise that resolves when the renderer is ready\r\n */\r\n public async whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise<void> {\r\n this._prepareResources();\r\n return await new Promise((resolve) => {\r\n _RetryWithInterval(\r\n () => {\r\n return this._colorShader.isReady();\r\n },\r\n () => {\r\n resolve();\r\n },\r\n (err, isTimeout) => {\r\n if (!isTimeout) {\r\n Logger.Error(\"BoundingBoxRenderer: An unexpected error occurred while waiting for the renderer to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(`BoundingBoxRenderer: Timeout while waiting for the renderer to be ready.`);\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n },\r\n timeStep,\r\n maxTimeout\r\n );\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _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 /** @internal */\r\n public _preActiveMesh(mesh: AbstractMesh): void {\r\n if (mesh.showBoundingBox || this.scene.forceShowBoundingBoxes) {\r\n const 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(\r\n \"colorShader\",\r\n this.scene,\r\n \"boundingBoxRenderer\",\r\n {\r\n attributes: [VertexBuffer.PositionKind, \"world0\", \"world1\", \"world2\", \"world3\"],\r\n\r\n uniforms: [\"world\", \"viewProjection\", \"viewProjectionR\", \"color\"],\r\n uniformBuffers: [\"BoundingBoxRenderer\"],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/boundingBoxRenderer.vertex\"), import(\"../ShadersWGSL/boundingBoxRenderer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/boundingBoxRenderer.vertex\"), import(\"../Shaders/boundingBoxRenderer.fragment\")]);\r\n }\r\n },\r\n },\r\n false\r\n );\r\n this._colorShader.setDefine(\"INSTANCES\", this._useInstances);\r\n this._colorShader.doNotSerialize = true;\r\n\r\n this._colorShader.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n this._colorShaderForOcclusionQuery = new ShaderMaterial(\r\n \"colorShaderOccQuery\",\r\n this.scene,\r\n \"boundingBoxRenderer\",\r\n {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\", \"viewProjectionR\", \"color\"],\r\n uniformBuffers: [\"BoundingBoxRenderer\"],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/boundingBoxRenderer.vertex\"), import(\"../ShadersWGSL/boundingBoxRenderer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/boundingBoxRenderer.vertex\"), import(\"../Shaders/boundingBoxRenderer.fragment\")]);\r\n }\r\n },\r\n },\r\n true\r\n );\r\n this._colorShaderForOcclusionQuery.doNotSerialize = true;\r\n\r\n this._colorShaderForOcclusionQuery.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n const engine = this.scene.getEngine();\r\n const 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 const 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 const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n this._createIndexBuffer();\r\n\r\n if (this._matrixBuffer) {\r\n this._matrixBuffer._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\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 if (this._useInstances) {\r\n this._renderInstanced(renderingGroupId);\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 const engine = this.scene.getEngine();\r\n engine.setDepthWrite(false);\r\n\r\n const transformMatrix = this.scene.getTransformMatrix();\r\n\r\n for (let boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n const boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n\r\n this._createWrappersForBoundingBox(boundingBox);\r\n this.onBeforeBoxRenderingObservable.notifyObservers(boundingBox);\r\n\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n const diff = max.subtract(min);\r\n const median = min.add(diff.scale(0.5));\r\n\r\n const 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, 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.updateColor4(\"color\", this.backColor, 1);\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, 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.updateColor4(\"color\", this.frontColor, 1);\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 private _createWrappersForBoundingBox(boundingBox: BoundingBox | BoundingBoxRenderer): void {\r\n if (!boundingBox._drawWrapperFront) {\r\n const engine = this.scene.getEngine();\r\n\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\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 const engine = this.scene.getEngine();\r\n\r\n if (this._renderPassIdForOcclusionQuery === undefined) {\r\n this._renderPassIdForOcclusionQuery = engine.createRenderPassId(`Render pass for occlusion query`);\r\n }\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this._renderPassIdForOcclusionQuery;\r\n\r\n this._prepareResources();\r\n\r\n const subMesh = mesh.subMeshes[0];\r\n\r\n if (!this._colorShaderForOcclusionQuery.isReady(mesh, undefined, subMesh) || !mesh.hasBoundingInfo) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n return;\r\n }\r\n\r\n if (!this._fillIndexBuffer) {\r\n this._fillIndexBuffer = engine.createIndexBuffer(this._fillIndexData!);\r\n }\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n\r\n engine.setDepthWrite(false);\r\n engine.setColorWrite(false);\r\n\r\n const boundingBox = mesh.getBoundingInfo().boundingBox;\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n const diff = max.subtract(min);\r\n const median = min.add(diff.scale(0.5));\r\n\r\n const 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 drawWrapper = subMesh._drawWrapper;\r\n\r\n this._colorShaderForOcclusionQuery._preBind(drawWrapper);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._fillIndexBuffer, <Effect>drawWrapper.effect);\r\n\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToGreater();\r\n } else {\r\n engine.setDepthFunctionToLess();\r\n }\r\n\r\n this.scene.resetCachedMaterial();\r\n\r\n this._uniformBufferFront.bindToEffect(drawWrapper.effect!, \"BoundingBoxRenderer\");\r\n this._uniformBufferFront.updateMatrix(\"world\", worldMatrix);\r\n this._uniformBufferFront.updateMatrix(\"viewProjection\", this.scene.getTransformMatrix());\r\n this._uniformBufferFront.update();\r\n\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 36);\r\n\r\n this._colorShaderForOcclusionQuery.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n engine.setColorWrite(true);\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /**\r\n * Sets whether to use instanced rendering.\r\n * When not enabled, BoundingBoxRenderer renders in a loop,\r\n * calling engine.drawElementsType for each bounding box in renderList,\r\n * making every bounding box 1 or 2 draw call.\r\n * When enabled, it collects bounding boxes to render,\r\n * and render all boxes in 1 or 2 draw call.\r\n * This could make the rendering with many bounding boxes much faster than not enabled,\r\n * but could result in a difference in rendering result if\r\n * {@link BoundingBoxRenderer.showBackLines} enabled,\r\n * because drawing the black/white part of each box one after the other\r\n * can be different from drawing the black part of all boxes and then the white part.\r\n * Also, when enabled, events of {@link BoundingBoxRenderer.onBeforeBoxRenderingObservable}\r\n * and {@link BoundingBoxRenderer.onAfterBoxRenderingObservable} would only be triggered once\r\n * for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\r\n * @param val whether to use instanced rendering\r\n */\r\n public set useInstances(val: boolean) {\r\n this._useInstances = val;\r\n if (this._colorShader) {\r\n this._colorShader.setDefine(\"INSTANCES\", val);\r\n }\r\n if (!val) {\r\n this._cleanupInstances();\r\n }\r\n }\r\n\r\n public get useInstances(): boolean {\r\n return this._useInstances;\r\n }\r\n\r\n /**\r\n * Instanced render the bounding boxes of a specific rendering group\r\n * @param renderingGroupId defines the rendering group to render\r\n */\r\n private _renderInstanced(renderingGroupId: number): void {\r\n if (this.renderList.length === 0 || !this.enabled) {\r\n return;\r\n }\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady()) {\r\n return;\r\n }\r\n\r\n const colorShader = this._colorShader;\r\n let matrices = this._matrices;\r\n const expectedLength = this.renderList.length * 16;\r\n if (!matrices || matrices.length < expectedLength || matrices.length > expectedLength * 2) {\r\n matrices = new Float32Array(expectedLength);\r\n this._matrices = matrices;\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.notifyObservers(DummyBoundingBox);\r\n\r\n let instancesCount = 0;\r\n\r\n for (let boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n const boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n\r\n const diff = max.subtractToRef(min, TempVec2);\r\n const median = min.addToRef(diff.scaleToRef(0.5, TempVec1), TempVec1);\r\n\r\n const m = TempMatrixArray;\r\n\r\n // Directly update the matrix values in column-major order\r\n m[0] = diff._x; // Scale X\r\n m[3] = median._x; // Translate X\r\n\r\n m[5] = diff._y; // Scale Y\r\n m[7] = median._y; // Translate Y\r\n\r\n m[10] = diff._z; // Scale Z\r\n m[11] = median._z; // Translate Z\r\n\r\n const offset = instancesCount * 16;\r\n TempMatrix.multiplyToArray(boundingBox.getWorldMatrix(), matrices, offset);\r\n\r\n matrices[offset + 12] -= this.scene.floatingOriginOffset.x;\r\n matrices[offset + 13] -= this.scene.floatingOriginOffset.y;\r\n matrices[offset + 14] -= this.scene.floatingOriginOffset.z;\r\n instancesCount++;\r\n }\r\n\r\n const engine = this.scene.getEngine();\r\n // keeps the original depth function and depth write\r\n const depthFunction = engine.getDepthFunction() ?? Constants.LEQUAL;\r\n const depthWrite = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n const matrixBuffer = this._matrixBuffer;\r\n if (matrixBuffer?.isUpdatable() && matrixBuffer.getData() === matrices) {\r\n matrixBuffer.update(matrices);\r\n } else {\r\n this._createInstanceBuffer(matrices);\r\n }\r\n\r\n this._createWrappersForBoundingBox(this);\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n const transformMatrix = this.scene.getTransformMatrix();\r\n\r\n if (this.showBackLines) {\r\n const drawWrapperBack = this._drawWrapperBack ?? colorShader._getDrawWrapper();\r\n\r\n colorShader._preBind(drawWrapperBack);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, 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 const _uniformBufferBack: UniformBuffer = this._uniformBufferBack;\r\n\r\n _uniformBufferBack.bindToEffect(drawWrapperBack.effect!, \"BoundingBoxRenderer\");\r\n _uniformBufferBack.updateColor4(\"color\", this.backColor, 1);\r\n _uniformBufferBack.updateMatrix(\"viewProjection\", transformMatrix);\r\n _uniformBufferBack.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24, instancesCount);\r\n }\r\n\r\n const drawWrapperFront = colorShader._getDrawWrapper();\r\n\r\n colorShader._preBind(drawWrapperFront);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, 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 const _uniformBufferFront: UniformBuffer = this._uniformBufferFront;\r\n _uniformBufferFront.bindToEffect(drawWrapperFront.effect!, \"BoundingBoxRenderer\");\r\n _uniformBufferFront.updateColor4(\"color\", this.frontColor, 1);\r\n _uniformBufferFront.updateMatrix(\"viewProjection\", transformMatrix);\r\n _uniformBufferFront.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24, instancesCount);\r\n\r\n this.onAfterBoxRenderingObservable.notifyObservers(DummyBoundingBox);\r\n\r\n colorShader.unbind();\r\n engine.setDepthFunction(depthFunction);\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n\r\n /**\r\n * Creates buffer for instanced rendering\r\n * @param buffer buffer to set\r\n */\r\n private _createInstanceBuffer(buffer: Float32Array): void {\r\n const vertexBuffers = this._vertexBuffers;\r\n this._cleanupInstanceBuffer();\r\n const matrixBuffer = new Buffer(this.scene.getEngine(), buffer, true, 16, false, true);\r\n\r\n vertexBuffers.world0 = matrixBuffer.createVertexBuffer(\"world0\", 0, 4);\r\n vertexBuffers.world1 = matrixBuffer.createVertexBuffer(\"world1\", 4, 4);\r\n vertexBuffers.world2 = matrixBuffer.createVertexBuffer(\"world2\", 8, 4);\r\n vertexBuffers.world3 = matrixBuffer.createVertexBuffer(\"world3\", 12, 4);\r\n\r\n this._matrixBuffer = matrixBuffer;\r\n }\r\n\r\n /**\r\n * Clean up buffers for instanced rendering\r\n */\r\n private _cleanupInstanceBuffer(): void {\r\n const vertexBuffers = this._vertexBuffers;\r\n if (vertexBuffers.world0) {\r\n vertexBuffers.world0.dispose();\r\n delete vertexBuffers.world0;\r\n }\r\n if (vertexBuffers.world1) {\r\n vertexBuffers.world1.dispose();\r\n delete vertexBuffers.world1;\r\n }\r\n if (vertexBuffers.world2) {\r\n vertexBuffers.world2.dispose();\r\n delete vertexBuffers.world2;\r\n }\r\n if (vertexBuffers.world3) {\r\n vertexBuffers.world3.dispose();\r\n delete vertexBuffers.world3;\r\n }\r\n this._matrices = null;\r\n if (this._matrixBuffer) {\r\n this._matrixBuffer.dispose();\r\n this._matrixBuffer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Clean up resources for instanced rendering\r\n */\r\n private _cleanupInstances(): void {\r\n this._cleanupInstanceBuffer();\r\n if (this._drawWrapperFront) {\r\n this._drawWrapperFront.dispose();\r\n this._drawWrapperFront = null;\r\n }\r\n if (this._drawWrapperBack) {\r\n this._drawWrapperBack.dispose();\r\n this._drawWrapperBack = null;\r\n }\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._renderPassIdForOcclusionQuery !== undefined) {\r\n this.scene.getEngine().releaseRenderPassId(this._renderPassIdForOcclusionQuery);\r\n this._renderPassIdForOcclusionQuery = undefined as any;\r\n }\r\n\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 this._colorShaderForOcclusionQuery.dispose();\r\n\r\n this._uniformBufferFront.dispose();\r\n this._uniformBufferBack.dispose();\r\n\r\n const 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 this._cleanupInstances();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"boundingBoxRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/boundingBoxRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Scene } from \"../scene\";\r\nimport { Buffer, VertexBuffer } from \"../Buffers/buffer\";\r\nimport type { SubMesh } from \"../Meshes/subMesh\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { SmartArray } from \"../Misc/smartArray\";\r\nimport type { Nullable, FloatArray, IndicesArray } from \"../types\";\r\nimport type { ISceneComponent } from \"../sceneComponent\";\r\nimport { SceneComponentConstants } from \"../sceneComponent\";\r\nimport { BoundingBox } from \"../Culling/boundingBox\";\r\nimport type { Effect } from \"../Materials/effect\";\r\nimport { Material } from \"../Materials/material\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport type { 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\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _RetryWithInterval } from \"../Misc/timingTools\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\ndeclare module \"../scene\" {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface Scene {\r\n /** @internal (Backing field) */\r\n _boundingBoxRenderer: BoundingBoxRenderer;\r\n\r\n /** @internal (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 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 // eslint-disable-next-line @typescript-eslint/naming-convention\r\n export interface AbstractMesh {\r\n /** @internal (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\nconst TempMatrix = Matrix.Identity();\r\nconst TempVec1 = new Vector3();\r\nconst TempVec2 = new Vector3();\r\n// `Matrix.asArray` returns its internal array, so it can be directly updated\r\nconst TempMatrixArray = TempMatrix.asArray();\r\n\r\n// BoundingBox copies from it, so it's safe to reuse vectors here\r\nconst DummyBoundingBox = new BoundingBox(TempVec1, TempVec1);\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 * When {@link BoundingBoxRenderer.useInstances} enabled,\r\n * this would only be triggered once for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\r\n */\r\n public onBeforeBoxRenderingObservable = new Observable<BoundingBox>();\r\n\r\n /**\r\n * Observable raised after rendering a bounding box\r\n * When {@link BoundingBoxRenderer.useInstances} enabled,\r\n * this would only be triggered once for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\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 /** Shader language used by the renderer */\r\n protected _shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n /**\r\n * Gets the shader language used in this renderer.\r\n */\r\n public get shaderLanguage(): ShaderLanguage {\r\n return this._shaderLanguage;\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public renderList = new SmartArray<BoundingBox>(32);\r\n\r\n private _colorShader: ShaderMaterial;\r\n private _colorShaderForOcclusionQuery: 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 private _renderPassIdForOcclusionQuery: number;\r\n /**\r\n * Internal buffer for instanced rendering\r\n */\r\n private _matrixBuffer: Nullable<Buffer> = null;\r\n private _matrices: Nullable<Float32Array> = null;\r\n\r\n /**\r\n * Internal state of whether instanced rendering enabled\r\n */\r\n protected _useInstances = false;\r\n\r\n /** @internal */\r\n public _drawWrapperFront: Nullable<DrawWrapper> = null;\r\n /** @internal */\r\n public _drawWrapperBack: Nullable<DrawWrapper> = 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\r\n const engine = this.scene.getEngine();\r\n if (engine.isWebGPU) {\r\n this._shaderLanguage = ShaderLanguage.WGSL;\r\n }\r\n\r\n scene._addComponent(this);\r\n this._uniformBufferFront = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererFront\", true);\r\n this._buildUniformLayout(this._uniformBufferFront);\r\n this._uniformBufferBack = new UniformBuffer(this.scene.getEngine(), undefined, undefined, \"BoundingBoxRendererBack\", true);\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 /**\r\n * Checks if the renderer is ready asynchronously.\r\n * @param timeStep Time step in ms between retries (default is 16)\r\n * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000)\r\n * @returns The promise that resolves when the renderer is ready\r\n */\r\n public async whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise<void> {\r\n this._prepareResources();\r\n return await new Promise((resolve) => {\r\n _RetryWithInterval(\r\n () => {\r\n return this._colorShader.isReady();\r\n },\r\n () => {\r\n resolve();\r\n },\r\n (err, isTimeout) => {\r\n if (!isTimeout) {\r\n Logger.Error(\"BoundingBoxRenderer: An unexpected error occurred while waiting for the renderer to be ready.\");\r\n if (err) {\r\n Logger.Error(err);\r\n if (err.stack) {\r\n Logger.Error(err.stack);\r\n }\r\n }\r\n } else {\r\n Logger.Error(`BoundingBoxRenderer: Timeout while waiting for the renderer to be ready.`);\r\n if (err) {\r\n Logger.Error(err);\r\n }\r\n }\r\n },\r\n timeStep,\r\n maxTimeout\r\n );\r\n });\r\n }\r\n\r\n /** @internal */\r\n public _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 /** @internal */\r\n public _preActiveMesh(mesh: AbstractMesh): void {\r\n if (mesh.showBoundingBox || this.scene.forceShowBoundingBoxes) {\r\n const 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(\r\n \"colorShader\",\r\n this.scene,\r\n \"boundingBoxRenderer\",\r\n {\r\n attributes: [VertexBuffer.PositionKind, \"world0\", \"world1\", \"world2\", \"world3\"],\r\n\r\n uniforms: [\"world\", \"viewProjection\", \"viewProjectionR\", \"color\"],\r\n uniformBuffers: [\"BoundingBoxRenderer\"],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/boundingBoxRenderer.vertex\"), import(\"../ShadersWGSL/boundingBoxRenderer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/boundingBoxRenderer.vertex\"), import(\"../Shaders/boundingBoxRenderer.fragment\")]);\r\n }\r\n },\r\n },\r\n false\r\n );\r\n this._colorShader.setDefine(\"INSTANCES\", this._useInstances);\r\n this._colorShader.doNotSerialize = true;\r\n\r\n this._colorShader.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n this._colorShaderForOcclusionQuery = new ShaderMaterial(\r\n \"colorShaderOccQuery\",\r\n this.scene,\r\n \"boundingBoxRenderer\",\r\n {\r\n attributes: [VertexBuffer.PositionKind],\r\n uniforms: [\"world\", \"viewProjection\", \"viewProjectionR\", \"color\"],\r\n uniformBuffers: [\"BoundingBoxRenderer\"],\r\n shaderLanguage: this._shaderLanguage,\r\n extraInitializationsAsync: async () => {\r\n if (this._shaderLanguage === ShaderLanguage.WGSL) {\r\n await Promise.all([import(\"../ShadersWGSL/boundingBoxRenderer.vertex\"), import(\"../ShadersWGSL/boundingBoxRenderer.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../Shaders/boundingBoxRenderer.vertex\"), import(\"../Shaders/boundingBoxRenderer.fragment\")]);\r\n }\r\n },\r\n },\r\n true\r\n );\r\n this._colorShaderForOcclusionQuery.doNotSerialize = true;\r\n\r\n this._colorShaderForOcclusionQuery.reservedDataStore = {\r\n hidden: true,\r\n };\r\n\r\n const engine = this.scene.getEngine();\r\n const 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 const 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 const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (vb) {\r\n vb._rebuild();\r\n }\r\n this._createIndexBuffer();\r\n\r\n if (this._matrixBuffer) {\r\n this._matrixBuffer._rebuild();\r\n }\r\n }\r\n\r\n /**\r\n * @internal\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 if (this._useInstances) {\r\n this._renderInstanced(renderingGroupId);\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 const engine = this.scene.getEngine();\r\n engine.setDepthWrite(false);\r\n\r\n const transformMatrix = this.scene.getTransformMatrix();\r\n\r\n for (let boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n const boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n\r\n this._createWrappersForBoundingBox(boundingBox);\r\n this.onBeforeBoxRenderingObservable.notifyObservers(boundingBox);\r\n\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n const diff = max.subtract(min);\r\n const median = min.add(diff.scale(0.5));\r\n\r\n const 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, 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.updateColor4(\"color\", this.backColor, 1);\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, 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.updateColor4(\"color\", this.frontColor, 1);\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 private _createWrappersForBoundingBox(boundingBox: BoundingBox | BoundingBoxRenderer): void {\r\n if (!boundingBox._drawWrapperFront) {\r\n const engine = this.scene.getEngine();\r\n\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\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 const engine = this.scene.getEngine();\r\n\r\n if (this._renderPassIdForOcclusionQuery === undefined) {\r\n this._renderPassIdForOcclusionQuery = engine.createRenderPassId(`Render pass for occlusion query`);\r\n }\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this._renderPassIdForOcclusionQuery;\r\n\r\n this._prepareResources();\r\n\r\n const subMesh = mesh.subMeshes[0];\r\n\r\n if (!this._colorShaderForOcclusionQuery.isReady(mesh, undefined, subMesh) || !mesh.hasBoundingInfo) {\r\n engine.currentRenderPassId = currentRenderPassId;\r\n return;\r\n }\r\n\r\n if (!this._fillIndexBuffer) {\r\n this._fillIndexBuffer = engine.createIndexBuffer(this._fillIndexData!);\r\n }\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n\r\n engine.setDepthWrite(false);\r\n engine.setColorWrite(false);\r\n\r\n const boundingBox = mesh.getBoundingInfo().boundingBox;\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n const diff = max.subtract(min);\r\n const median = min.add(diff.scale(0.5));\r\n\r\n const 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 drawWrapper = subMesh._drawWrapper;\r\n\r\n this._colorShaderForOcclusionQuery._preBind(drawWrapper);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._fillIndexBuffer, <Effect>drawWrapper.effect);\r\n\r\n if (useReverseDepthBuffer) {\r\n engine.setDepthFunctionToGreater();\r\n } else {\r\n engine.setDepthFunctionToLess();\r\n }\r\n\r\n this.scene.resetCachedMaterial();\r\n\r\n this._uniformBufferFront.bindToEffect(drawWrapper.effect!, \"BoundingBoxRenderer\");\r\n this._uniformBufferFront.updateMatrix(\"world\", worldMatrix);\r\n this._uniformBufferFront.updateMatrix(\"viewProjection\", this.scene.getTransformMatrix());\r\n this._uniformBufferFront.update();\r\n\r\n engine.drawElementsType(Material.TriangleFillMode, 0, 36);\r\n\r\n this._colorShaderForOcclusionQuery.unbind();\r\n engine.setDepthFunctionToLessOrEqual();\r\n engine.setDepthWrite(true);\r\n engine.setColorWrite(true);\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /**\r\n * Sets whether to use instanced rendering.\r\n * When not enabled, BoundingBoxRenderer renders in a loop,\r\n * calling engine.drawElementsType for each bounding box in renderList,\r\n * making every bounding box 1 or 2 draw call.\r\n * When enabled, it collects bounding boxes to render,\r\n * and render all boxes in 1 or 2 draw call.\r\n * This could make the rendering with many bounding boxes much faster than not enabled,\r\n * but could result in a difference in rendering result if\r\n * {@link BoundingBoxRenderer.showBackLines} enabled,\r\n * because drawing the black/white part of each box one after the other\r\n * can be different from drawing the black part of all boxes and then the white part.\r\n * Also, when enabled, events of {@link BoundingBoxRenderer.onBeforeBoxRenderingObservable}\r\n * and {@link BoundingBoxRenderer.onAfterBoxRenderingObservable} would only be triggered once\r\n * for one rendering, instead of once every bounding box.\r\n * Events would be triggered with a dummy box to keep backwards compatibility,\r\n * the passed bounding box has no meaning and should be ignored.\r\n * @param val whether to use instanced rendering\r\n */\r\n public set useInstances(val: boolean) {\r\n this._useInstances = val;\r\n if (this._colorShader) {\r\n this._colorShader.setDefine(\"INSTANCES\", val);\r\n }\r\n if (!val) {\r\n this._cleanupInstances();\r\n }\r\n }\r\n\r\n public get useInstances(): boolean {\r\n return this._useInstances;\r\n }\r\n\r\n /**\r\n * Instanced render the bounding boxes of a specific rendering group\r\n * @param renderingGroupId defines the rendering group to render\r\n */\r\n private _renderInstanced(renderingGroupId: number): void {\r\n if (this.renderList.length === 0 || !this.enabled) {\r\n return;\r\n }\r\n this._prepareResources();\r\n\r\n if (!this._colorShader.isReady()) {\r\n return;\r\n }\r\n\r\n const colorShader = this._colorShader;\r\n let matrices = this._matrices;\r\n const expectedLength = this.renderList.length * 16;\r\n if (!matrices || matrices.length < expectedLength || matrices.length > expectedLength * 2) {\r\n matrices = new Float32Array(expectedLength);\r\n this._matrices = matrices;\r\n }\r\n\r\n this.onBeforeBoxRenderingObservable.notifyObservers(DummyBoundingBox);\r\n\r\n let instancesCount = 0;\r\n const floatingOriginOffset = this.scene.floatingOriginOffset;\r\n\r\n for (let boundingBoxIndex = 0; boundingBoxIndex < this.renderList.length; boundingBoxIndex++) {\r\n const boundingBox = this.renderList.data[boundingBoxIndex];\r\n if (boundingBox._tag !== renderingGroupId) {\r\n continue;\r\n }\r\n\r\n const min = boundingBox.minimum;\r\n const max = boundingBox.maximum;\r\n\r\n const diff = max.subtractToRef(min, TempVec2);\r\n const median = min.addToRef(diff.scaleToRef(0.5, TempVec1), TempVec1);\r\n\r\n const m = TempMatrixArray;\r\n\r\n // Directly update the matrix values in column-major order\r\n m[0] = diff._x; // Scale X\r\n m[3] = median._x; // Translate X\r\n\r\n m[5] = diff._y; // Scale Y\r\n m[7] = median._y; // Translate Y\r\n\r\n m[10] = diff._z; // Scale Z\r\n m[11] = median._z; // Translate Z\r\n\r\n const offset = instancesCount * 16;\r\n TempMatrix.multiplyToArray(boundingBox.getWorldMatrix(), matrices, offset);\r\n\r\n matrices[offset + 12] -= floatingOriginOffset.x;\r\n matrices[offset + 13] -= floatingOriginOffset.y;\r\n matrices[offset + 14] -= floatingOriginOffset.z;\r\n instancesCount++;\r\n }\r\n\r\n const engine = this.scene.getEngine();\r\n // keeps the original depth function and depth write\r\n const depthFunction = engine.getDepthFunction() ?? Constants.LEQUAL;\r\n const depthWrite = engine.getDepthWrite();\r\n engine.setDepthWrite(false);\r\n const matrixBuffer = this._matrixBuffer;\r\n if (matrixBuffer?.isUpdatable() && matrixBuffer.getData() === matrices) {\r\n matrixBuffer.update(matrices);\r\n } else {\r\n this._createInstanceBuffer(matrices);\r\n }\r\n\r\n this._createWrappersForBoundingBox(this);\r\n\r\n const useReverseDepthBuffer = engine.useReverseDepthBuffer;\r\n const transformMatrix = this.scene.getTransformMatrix();\r\n\r\n if (this.showBackLines) {\r\n const drawWrapperBack = this._drawWrapperBack ?? colorShader._getDrawWrapper();\r\n\r\n colorShader._preBind(drawWrapperBack);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, 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 const _uniformBufferBack: UniformBuffer = this._uniformBufferBack;\r\n\r\n _uniformBufferBack.bindToEffect(drawWrapperBack.effect!, \"BoundingBoxRenderer\");\r\n _uniformBufferBack.updateColor4(\"color\", this.backColor, 1);\r\n _uniformBufferBack.updateMatrix(\"viewProjection\", transformMatrix);\r\n _uniformBufferBack.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24, instancesCount);\r\n }\r\n\r\n const drawWrapperFront = colorShader._getDrawWrapper();\r\n\r\n colorShader._preBind(drawWrapperFront);\r\n\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, 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 const _uniformBufferFront: UniformBuffer = this._uniformBufferFront;\r\n _uniformBufferFront.bindToEffect(drawWrapperFront.effect!, \"BoundingBoxRenderer\");\r\n _uniformBufferFront.updateColor4(\"color\", this.frontColor, 1);\r\n _uniformBufferFront.updateMatrix(\"viewProjection\", transformMatrix);\r\n _uniformBufferFront.update();\r\n\r\n // Draw order\r\n engine.drawElementsType(Material.LineListDrawMode, 0, 24, instancesCount);\r\n\r\n this.onAfterBoxRenderingObservable.notifyObservers(DummyBoundingBox);\r\n\r\n colorShader.unbind();\r\n engine.setDepthFunction(depthFunction);\r\n engine.setDepthWrite(depthWrite);\r\n }\r\n\r\n /**\r\n * Creates buffer for instanced rendering\r\n * @param buffer buffer to set\r\n */\r\n private _createInstanceBuffer(buffer: Float32Array): void {\r\n const vertexBuffers = this._vertexBuffers;\r\n this._cleanupInstanceBuffer();\r\n const matrixBuffer = new Buffer(this.scene.getEngine(), buffer, true, 16, false, true);\r\n\r\n vertexBuffers.world0 = matrixBuffer.createVertexBuffer(\"world0\", 0, 4);\r\n vertexBuffers.world1 = matrixBuffer.createVertexBuffer(\"world1\", 4, 4);\r\n vertexBuffers.world2 = matrixBuffer.createVertexBuffer(\"world2\", 8, 4);\r\n vertexBuffers.world3 = matrixBuffer.createVertexBuffer(\"world3\", 12, 4);\r\n\r\n this._matrixBuffer = matrixBuffer;\r\n }\r\n\r\n /**\r\n * Clean up buffers for instanced rendering\r\n */\r\n private _cleanupInstanceBuffer(): void {\r\n const vertexBuffers = this._vertexBuffers;\r\n if (vertexBuffers.world0) {\r\n vertexBuffers.world0.dispose();\r\n delete vertexBuffers.world0;\r\n }\r\n if (vertexBuffers.world1) {\r\n vertexBuffers.world1.dispose();\r\n delete vertexBuffers.world1;\r\n }\r\n if (vertexBuffers.world2) {\r\n vertexBuffers.world2.dispose();\r\n delete vertexBuffers.world2;\r\n }\r\n if (vertexBuffers.world3) {\r\n vertexBuffers.world3.dispose();\r\n delete vertexBuffers.world3;\r\n }\r\n this._matrices = null;\r\n if (this._matrixBuffer) {\r\n this._matrixBuffer.dispose();\r\n this._matrixBuffer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Clean up resources for instanced rendering\r\n */\r\n private _cleanupInstances(): void {\r\n this._cleanupInstanceBuffer();\r\n if (this._drawWrapperFront) {\r\n this._drawWrapperFront.dispose();\r\n this._drawWrapperFront = null;\r\n }\r\n if (this._drawWrapperBack) {\r\n this._drawWrapperBack.dispose();\r\n this._drawWrapperBack = null;\r\n }\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._renderPassIdForOcclusionQuery !== undefined) {\r\n this.scene.getEngine().releaseRenderPassId(this._renderPassIdForOcclusionQuery);\r\n this._renderPassIdForOcclusionQuery = undefined as any;\r\n }\r\n\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 this._colorShaderForOcclusionQuery.dispose();\r\n\r\n this._uniformBufferFront.dispose();\r\n this._uniformBufferBack.dispose();\r\n\r\n const 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 this._cleanupInstances();\r\n }\r\n}\r\n"]}
@@ -641,6 +641,7 @@ export class EdgesRenderer {
641
641
  */
642
642
  render() {
643
643
  const scene = this._source.getScene();
644
+ const floatingOriginOffset = scene.floatingOriginOffset;
644
645
  const currentDrawWrapper = this._lineShader._getDrawWrapper();
645
646
  if (this._drawWrapper) {
646
647
  this._lineShader._setDrawWrapper(this._drawWrapper);
@@ -671,9 +672,9 @@ export class EdgesRenderer {
671
672
  let offset = 0;
672
673
  for (let i = 0; i < instanceCount; ++i) {
673
674
  this.customInstances.data[i].copyToArray(instanceStorage.instancesData, offset);
674
- instanceStorage.instancesData[offset + 12] -= scene.floatingOriginOffset.x;
675
- instanceStorage.instancesData[offset + 13] -= scene.floatingOriginOffset.y;
676
- instanceStorage.instancesData[offset + 14] -= scene.floatingOriginOffset.z;
675
+ instanceStorage.instancesData[offset + 12] -= floatingOriginOffset.x;
676
+ instanceStorage.instancesData[offset + 13] -= floatingOriginOffset.y;
677
+ instanceStorage.instancesData[offset + 14] -= floatingOriginOffset.z;
677
678
  offset += 16;
678
679
  }
679
680
  instanceStorage.instancesBuffer.updateDirectly(instanceStorage.instancesData, 0, instanceCount);