@babylonjs/viewer 7.24.0 → 7.25.0

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.
package/labs/texture.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { CubeTexture } from "@babylonjs/core/Materials/Textures/cubeTexture.js";
2
2
  import { InternalTexture } from "@babylonjs/core/Materials/Textures/internalTexture.js";
3
- import { Scalar } from "@babylonjs/core/Maths/math.scalar.js";
4
3
  import { Texture } from "@babylonjs/core/Materials/Textures/texture.js";
5
4
  /**
6
5
  * WebGL Pixel Formats
@@ -195,7 +194,7 @@ export var TextureUtils = /** @class */ (function () {
195
194
  var kMinimumVariance = 0.0005;
196
195
  var alphaG = roughness * roughness + kMinimumVariance;
197
196
  var microsurfaceAverageSlopeTexels = alphaG * textureCube.Width;
198
- var environmentSpecularLOD = TextureUtils.EnvironmentLODScale * Scalar.Log2(microsurfaceAverageSlopeTexels) + TextureUtils.EnvironmentLODOffset;
197
+ var environmentSpecularLOD = TextureUtils.EnvironmentLODScale * Math.log2(microsurfaceAverageSlopeTexels) + TextureUtils.EnvironmentLODOffset;
199
198
  var maxLODIndex = textureCube.source.length - 1;
200
199
  var mipmapIndex = Math.min(Math.max(Math.round(environmentSpecularLOD), 0), maxLODIndex);
201
200
  lod = TextureUtils.GetBabylonCubeTexture(scene, new TextureCube(6408 /* PixelFormat.RGBA */, 5121 /* PixelType.UNSIGNED_BYTE */, [textureCube.source[mipmapIndex]]), false, true, true);
@@ -1 +1 @@
1
- {"version":3,"file":"texture.js","sourceRoot":"","sources":["../../../../tools/viewer/src/labs/texture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"core/Materials/Textures/internalTexture\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\n\r\n/**\r\n * WebGL Pixel Formats\r\n */\r\nexport const enum PixelFormat {\r\n DEPTH_COMPONENT = 0x1902,\r\n ALPHA = 0x1906,\r\n RGB = 0x1907,\r\n RGBA = 0x1908,\r\n LUMINANCE = 0x1909,\r\n LUMINANCE_ALPHA = 0x190a,\r\n}\r\n\r\n/**\r\n * WebGL Pixel Types\r\n */\r\nexport const enum PixelType {\r\n UNSIGNED_BYTE = 0x1401,\r\n UNSIGNED_SHORT_4_4_4_4 = 0x8033,\r\n UNSIGNED_SHORT_5_5_5_1 = 0x8034,\r\n UNSIGNED_SHORT_5_6_5 = 0x8363,\r\n}\r\n\r\n/**\r\n * WebGL Texture Magnification Filter\r\n */\r\nexport const enum TextureMagFilter {\r\n NEAREST = 0x2600,\r\n LINEAR = 0x2601,\r\n}\r\n\r\n/**\r\n * WebGL Texture Minification Filter\r\n */\r\nexport const enum TextureMinFilter {\r\n NEAREST = 0x2600,\r\n LINEAR = 0x2601,\r\n NEAREST_MIPMAP_NEAREST = 0x2700,\r\n LINEAR_MIPMAP_NEAREST = 0x2701,\r\n NEAREST_MIPMAP_LINEAR = 0x2702,\r\n LINEAR_MIPMAP_LINEAR = 0x2703,\r\n}\r\n\r\n/**\r\n * WebGL Texture Wrap Modes\r\n */\r\nexport const enum TextureWrapMode {\r\n REPEAT = 0x2901,\r\n CLAMP_TO_EDGE = 0x812f,\r\n MIRRORED_REPEAT = 0x8370,\r\n}\r\n\r\n/**\r\n * Raw texture data and descriptor sufficient for WebGL texture upload\r\n */\r\nexport interface TextureData {\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n /**\r\n * Height of image\r\n */\r\n height: number;\r\n /**\r\n * Format of pixels in data\r\n */\r\n format: PixelFormat;\r\n /**\r\n * Row byte alignment of pixels in data\r\n */\r\n alignment: number;\r\n /**\r\n * Pixel data\r\n */\r\n data: ArrayBufferView;\r\n}\r\n\r\n/**\r\n * Wraps sampling parameters for a WebGL texture\r\n */\r\nexport interface SamplingParameters {\r\n /**\r\n * Magnification mode when upsampling from a WebGL texture\r\n */\r\n magFilter?: TextureMagFilter;\r\n /**\r\n * Minification mode when upsampling from a WebGL texture\r\n */\r\n minFilter?: TextureMinFilter;\r\n /**\r\n * X axis wrapping mode when sampling out of a WebGL texture bounds\r\n */\r\n wrapS?: TextureWrapMode;\r\n /**\r\n * Y axis wrapping mode when sampling out of a WebGL texture bounds\r\n */\r\n wrapT?: TextureWrapMode;\r\n /**\r\n * Anisotropic filtering samples\r\n */\r\n maxAnisotropy?: number;\r\n}\r\n\r\n/**\r\n * Represents a valid WebGL texture source for use in texImage2D\r\n */\r\nexport type TextureSource = TextureData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;\r\n\r\n/**\r\n * A generic set of texture mipmaps (where index 0 has the largest dimension)\r\n */\r\nexport type Mipmaps<T> = Array<T>;\r\n\r\n/**\r\n * A set of 6 cubemap arranged in the order [+x, -x, +y, -y, +z, -z]\r\n */\r\nexport type Faces<T> = Array<T>;\r\n\r\n/**\r\n * A set of texture mipmaps specifically for 2D textures in WebGL (where index 0 has the largest dimension)\r\n */\r\nexport type Mipmaps2D = Mipmaps<TextureSource>;\r\n\r\n/**\r\n * A set of texture mipmaps specifically for cubemap textures in WebGL (where index 0 has the largest dimension)\r\n */\r\nexport type MipmapsCube = Mipmaps<Faces<TextureSource>>;\r\n\r\n/**\r\n * A minimal WebGL cubemap descriptor\r\n */\r\nexport class TextureCube {\r\n /**\r\n * Returns the width of a face of the texture or 0 if not available\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get Width(): number {\r\n return this.source && this.source[0] && this.source[0][0] ? this.source[0][0].width : 0;\r\n }\r\n\r\n /**\r\n * Returns the height of a face of the texture or 0 if not available\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get Height(): number {\r\n return this.source && this.source[0] && this.source[0][0] ? this.source[0][0].height : 0;\r\n }\r\n\r\n /**\r\n * constructor\r\n * @param internalFormat WebGL pixel format for the texture on the GPU\r\n * @param type WebGL pixel type of the supplied data and texture on the GPU\r\n * @param source An array containing mipmap levels of faces, where each mipmap level is an array of faces and each face is a TextureSource object\r\n */\r\n constructor(\r\n public internalFormat: PixelFormat,\r\n public type: PixelType,\r\n public source: MipmapsCube = []\r\n ) {}\r\n}\r\n\r\n/**\r\n * A static class providing methods to aid working with Bablyon textures.\r\n */\r\nexport class TextureUtils {\r\n /**\r\n * A prefix used when storing a babylon texture object reference on a Spectre texture object\r\n */\r\n public static BabylonTextureKeyPrefix = \"__babylonTexture_\";\r\n\r\n /**\r\n * Controls anisotropic filtering for deserialized textures.\r\n */\r\n public static MaxAnisotropy = 4;\r\n\r\n /**\r\n * Returns a BabylonCubeTexture instance from a Spectre texture cube, subject to sampling parameters.\r\n * If such a texture has already been requested in the past, this texture will be returned, otherwise a new one will be created.\r\n * The advantage of this is to enable working with texture objects without the need to initialize on the GPU until desired.\r\n * @param scene A Babylon Scene instance\r\n * @param textureCube A Spectre TextureCube object\r\n * @param automaticMipmaps Pass true to enable automatic mipmap generation where possible (requires power of images)\r\n * @param environment Specifies that the texture will be used as an environment\r\n * @param singleLod Specifies that the texture will be a singleLod (for environment)\r\n * @returns Babylon cube texture\r\n */\r\n public static GetBabylonCubeTexture(scene: Scene, textureCube: TextureCube, automaticMipmaps: boolean, environment = false, singleLod = false): CubeTexture {\r\n if (!textureCube) {\r\n throw new Error(\"no texture cube provided\");\r\n }\r\n\r\n let parameters: SamplingParameters;\r\n if (environment) {\r\n parameters = singleLod ? TextureUtils._EnvironmentSingleMipSampling : TextureUtils._EnvironmentSampling;\r\n } else {\r\n parameters = {\r\n magFilter: TextureMagFilter.NEAREST,\r\n minFilter: TextureMinFilter.NEAREST,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n };\r\n }\r\n\r\n const key = TextureUtils.BabylonTextureKeyPrefix + parameters.magFilter + \"\" + parameters.minFilter + \"\" + parameters.wrapS + \"\" + parameters.wrapT;\r\n\r\n let babylonTexture: CubeTexture = (<any>textureCube)[key];\r\n\r\n if (!babylonTexture) {\r\n //initialize babylon texture\r\n babylonTexture = new CubeTexture(\"\", scene);\r\n if (environment) {\r\n babylonTexture.lodGenerationOffset = TextureUtils.EnvironmentLODOffset;\r\n babylonTexture.lodGenerationScale = TextureUtils.EnvironmentLODScale;\r\n }\r\n\r\n babylonTexture.gammaSpace = false;\r\n\r\n const internalTexture = new InternalTexture(scene.getEngine(), InternalTextureSource.CubeRaw);\r\n const glTexture = internalTexture._hardwareTexture?.underlyingResource;\r\n //babylon properties\r\n internalTexture.isCube = true;\r\n internalTexture.generateMipMaps = false;\r\n\r\n babylonTexture._texture = internalTexture;\r\n\r\n TextureUtils.ApplySamplingParameters(babylonTexture, parameters);\r\n\r\n const maxMipLevel = automaticMipmaps ? 0 : textureCube.source.length - 1;\r\n let texturesUploaded = 0;\r\n\r\n const textureComplete = function () {\r\n return texturesUploaded === (maxMipLevel + 1) * 6;\r\n };\r\n\r\n const uploadFace = function (i: number, level: number, face: TextureSource) {\r\n if (!glTexture) {\r\n return;\r\n }\r\n\r\n if (i === 0 && level === 0) {\r\n internalTexture.width = face.width;\r\n internalTexture.height = face.height;\r\n }\r\n\r\n const gl = (<any>scene.getEngine())._gl;\r\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, glTexture);\r\n (scene.getEngine() as Engine)._unpackFlipY(false);\r\n if (face instanceof HTMLElement || face instanceof ImageData) {\r\n gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, textureCube.internalFormat, textureCube.internalFormat, textureCube.type, <any>face);\r\n } else {\r\n const textureData = <TextureData>face;\r\n gl.texImage2D(\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + i,\r\n level,\r\n textureCube.internalFormat,\r\n textureData.width,\r\n textureData.height,\r\n 0,\r\n textureData.format,\r\n textureCube.type,\r\n textureData.data\r\n );\r\n }\r\n\r\n texturesUploaded++;\r\n\r\n if (textureComplete()) {\r\n //generate mipmaps\r\n if (automaticMipmaps) {\r\n const w = face.width;\r\n const h = face.height;\r\n const isPot = (w !== 0 && w & (w - 1)) === 0 && (h !== 0 && h & (h - 1)) === 0;\r\n if (isPot) {\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n }\r\n }\r\n\r\n // Upload Separate lods in case there is no support for texture lod.\r\n if (environment && !scene.getEngine().getCaps().textureLOD && !singleLod) {\r\n const mipSlices = 3;\r\n for (let i = 0; i < mipSlices; i++) {\r\n const lodKey = TextureUtils.BabylonTextureKeyPrefix + \"lod\" + i;\r\n let lod: CubeTexture = (<any>textureCube)[lodKey];\r\n\r\n //initialize lod texture if it doesn't already exist\r\n if (lod == null && textureCube.Width) {\r\n //compute LOD from even spacing in smoothness (matching shader calculation)\r\n const smoothness = i / (mipSlices - 1);\r\n const roughness = 1 - smoothness;\r\n const kMinimumVariance = 0.0005;\r\n const alphaG = roughness * roughness + kMinimumVariance;\r\n const microsurfaceAverageSlopeTexels = alphaG * textureCube.Width;\r\n\r\n const environmentSpecularLOD = TextureUtils.EnvironmentLODScale * Scalar.Log2(microsurfaceAverageSlopeTexels) + TextureUtils.EnvironmentLODOffset;\r\n\r\n const maxLODIndex = textureCube.source.length - 1;\r\n const mipmapIndex = Math.min(Math.max(Math.round(environmentSpecularLOD), 0), maxLODIndex);\r\n\r\n lod = TextureUtils.GetBabylonCubeTexture(\r\n scene,\r\n new TextureCube(PixelFormat.RGBA, PixelType.UNSIGNED_BYTE, [textureCube.source[mipmapIndex]]),\r\n false,\r\n true,\r\n true\r\n );\r\n\r\n if (i === 0) {\r\n internalTexture._lodTextureLow = lod;\r\n } else if (i === 1) {\r\n internalTexture._lodTextureMid = lod;\r\n } else {\r\n internalTexture._lodTextureHigh = lod;\r\n }\r\n\r\n (<any>textureCube)[lodKey] = lod;\r\n }\r\n }\r\n }\r\n\r\n internalTexture.isReady = true;\r\n }\r\n\r\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\r\n scene.getEngine().resetTextureCache();\r\n };\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n const faces = textureCube.source[i];\r\n for (let j = 0; j < faces.length; j++) {\r\n const face = faces[j];\r\n if (face instanceof HTMLImageElement && !face.complete) {\r\n face.addEventListener(\r\n \"load\",\r\n () => {\r\n uploadFace(j, i, face);\r\n },\r\n false\r\n );\r\n } else {\r\n uploadFace(j, i, face);\r\n }\r\n }\r\n }\r\n\r\n scene.getEngine().resetTextureCache();\r\n\r\n babylonTexture.isReady = () => {\r\n return textureComplete();\r\n };\r\n\r\n (<any>textureCube)[key] = babylonTexture;\r\n }\r\n\r\n return babylonTexture;\r\n }\r\n\r\n /**\r\n * Applies Spectre SamplingParameters to a Babylon texture by directly setting texture parameters on the internal WebGLTexture as well as setting Babylon fields\r\n * @param babylonTexture Babylon texture to apply texture to (requires the Babylon texture has an initialize _texture field)\r\n * @param parameters Spectre SamplingParameters to apply\r\n */\r\n public static ApplySamplingParameters(babylonTexture: BaseTexture, parameters: SamplingParameters) {\r\n const scene = babylonTexture.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n const gl = (<any>scene.getEngine())._gl;\r\n\r\n const target = babylonTexture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n const internalTexture = babylonTexture._texture;\r\n if (!internalTexture) {\r\n return;\r\n }\r\n const glTexture = internalTexture._hardwareTexture?.underlyingResource;\r\n gl.bindTexture(target, glTexture);\r\n\r\n if (parameters.magFilter != null) {\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, parameters.magFilter);\r\n }\r\n if (parameters.minFilter != null) {\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, parameters.minFilter);\r\n }\r\n if (parameters.wrapS != null) {\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, parameters.wrapS);\r\n }\r\n if (parameters.wrapT != null) {\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, parameters.wrapT);\r\n }\r\n\r\n //set babylon wrap modes from sampling parameter\r\n switch (parameters.wrapS) {\r\n case TextureWrapMode.REPEAT:\r\n babylonTexture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n babylonTexture.wrapU = Texture.MIRROR_ADDRESSMODE;\r\n break;\r\n default:\r\n babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n switch (parameters.wrapT) {\r\n case TextureWrapMode.REPEAT:\r\n babylonTexture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n babylonTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n babylonTexture.wrapV = Texture.MIRROR_ADDRESSMODE;\r\n break;\r\n default:\r\n babylonTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n if (parameters.maxAnisotropy != null && parameters.maxAnisotropy > 1) {\r\n const anisotropicExt = gl.getExtension(\"EXT_texture_filter_anisotropic\");\r\n if (anisotropicExt) {\r\n const maxAnisotropicSamples = gl.getParameter(anisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\r\n const maxAnisotropy = Math.min(parameters.maxAnisotropy, maxAnisotropicSamples);\r\n gl.texParameterf(target, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy);\r\n babylonTexture.anisotropicFilteringLevel = maxAnisotropy;\r\n }\r\n }\r\n\r\n gl.bindTexture(target, null);\r\n scene.getEngine().resetTextureCache();\r\n }\r\n\r\n private static _EnvironmentSampling: SamplingParameters = {\r\n magFilter: TextureMagFilter.LINEAR,\r\n minFilter: TextureMinFilter.LINEAR_MIPMAP_LINEAR,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n maxAnisotropy: 1,\r\n };\r\n\r\n private static _EnvironmentSingleMipSampling: SamplingParameters = {\r\n magFilter: TextureMagFilter.LINEAR,\r\n minFilter: TextureMinFilter.LINEAR,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n maxAnisotropy: 1,\r\n };\r\n\r\n //from \"/Internal/Lighting.EnvironmentFilterScale\" in Engine/*/Configuration.cpp\r\n /**\r\n * Environment preprocessing dedicated value (Internal Use or Advanced only).\r\n */\r\n public static EnvironmentLODScale = 0.8;\r\n /**\r\n * Environment preprocessing dedicated value (Internal Use or Advanced only)..\r\n */\r\n public static EnvironmentLODOffset = 1.0;\r\n}\r\n"]}
1
+ {"version":3,"file":"texture.js","sourceRoot":"","sources":["../../../../tools/viewer/src/labs/texture.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Scene } from \"core/scene\";\r\nimport { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"core/Materials/Textures/internalTexture\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\n\r\n/**\r\n * WebGL Pixel Formats\r\n */\r\nexport const enum PixelFormat {\r\n DEPTH_COMPONENT = 0x1902,\r\n ALPHA = 0x1906,\r\n RGB = 0x1907,\r\n RGBA = 0x1908,\r\n LUMINANCE = 0x1909,\r\n LUMINANCE_ALPHA = 0x190a,\r\n}\r\n\r\n/**\r\n * WebGL Pixel Types\r\n */\r\nexport const enum PixelType {\r\n UNSIGNED_BYTE = 0x1401,\r\n UNSIGNED_SHORT_4_4_4_4 = 0x8033,\r\n UNSIGNED_SHORT_5_5_5_1 = 0x8034,\r\n UNSIGNED_SHORT_5_6_5 = 0x8363,\r\n}\r\n\r\n/**\r\n * WebGL Texture Magnification Filter\r\n */\r\nexport const enum TextureMagFilter {\r\n NEAREST = 0x2600,\r\n LINEAR = 0x2601,\r\n}\r\n\r\n/**\r\n * WebGL Texture Minification Filter\r\n */\r\nexport const enum TextureMinFilter {\r\n NEAREST = 0x2600,\r\n LINEAR = 0x2601,\r\n NEAREST_MIPMAP_NEAREST = 0x2700,\r\n LINEAR_MIPMAP_NEAREST = 0x2701,\r\n NEAREST_MIPMAP_LINEAR = 0x2702,\r\n LINEAR_MIPMAP_LINEAR = 0x2703,\r\n}\r\n\r\n/**\r\n * WebGL Texture Wrap Modes\r\n */\r\nexport const enum TextureWrapMode {\r\n REPEAT = 0x2901,\r\n CLAMP_TO_EDGE = 0x812f,\r\n MIRRORED_REPEAT = 0x8370,\r\n}\r\n\r\n/**\r\n * Raw texture data and descriptor sufficient for WebGL texture upload\r\n */\r\nexport interface TextureData {\r\n /**\r\n * Width of image\r\n */\r\n width: number;\r\n /**\r\n * Height of image\r\n */\r\n height: number;\r\n /**\r\n * Format of pixels in data\r\n */\r\n format: PixelFormat;\r\n /**\r\n * Row byte alignment of pixels in data\r\n */\r\n alignment: number;\r\n /**\r\n * Pixel data\r\n */\r\n data: ArrayBufferView;\r\n}\r\n\r\n/**\r\n * Wraps sampling parameters for a WebGL texture\r\n */\r\nexport interface SamplingParameters {\r\n /**\r\n * Magnification mode when upsampling from a WebGL texture\r\n */\r\n magFilter?: TextureMagFilter;\r\n /**\r\n * Minification mode when upsampling from a WebGL texture\r\n */\r\n minFilter?: TextureMinFilter;\r\n /**\r\n * X axis wrapping mode when sampling out of a WebGL texture bounds\r\n */\r\n wrapS?: TextureWrapMode;\r\n /**\r\n * Y axis wrapping mode when sampling out of a WebGL texture bounds\r\n */\r\n wrapT?: TextureWrapMode;\r\n /**\r\n * Anisotropic filtering samples\r\n */\r\n maxAnisotropy?: number;\r\n}\r\n\r\n/**\r\n * Represents a valid WebGL texture source for use in texImage2D\r\n */\r\nexport type TextureSource = TextureData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;\r\n\r\n/**\r\n * A generic set of texture mipmaps (where index 0 has the largest dimension)\r\n */\r\nexport type Mipmaps<T> = Array<T>;\r\n\r\n/**\r\n * A set of 6 cubemap arranged in the order [+x, -x, +y, -y, +z, -z]\r\n */\r\nexport type Faces<T> = Array<T>;\r\n\r\n/**\r\n * A set of texture mipmaps specifically for 2D textures in WebGL (where index 0 has the largest dimension)\r\n */\r\nexport type Mipmaps2D = Mipmaps<TextureSource>;\r\n\r\n/**\r\n * A set of texture mipmaps specifically for cubemap textures in WebGL (where index 0 has the largest dimension)\r\n */\r\nexport type MipmapsCube = Mipmaps<Faces<TextureSource>>;\r\n\r\n/**\r\n * A minimal WebGL cubemap descriptor\r\n */\r\nexport class TextureCube {\r\n /**\r\n * Returns the width of a face of the texture or 0 if not available\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get Width(): number {\r\n return this.source && this.source[0] && this.source[0][0] ? this.source[0][0].width : 0;\r\n }\r\n\r\n /**\r\n * Returns the height of a face of the texture or 0 if not available\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public get Height(): number {\r\n return this.source && this.source[0] && this.source[0][0] ? this.source[0][0].height : 0;\r\n }\r\n\r\n /**\r\n * constructor\r\n * @param internalFormat WebGL pixel format for the texture on the GPU\r\n * @param type WebGL pixel type of the supplied data and texture on the GPU\r\n * @param source An array containing mipmap levels of faces, where each mipmap level is an array of faces and each face is a TextureSource object\r\n */\r\n constructor(\r\n public internalFormat: PixelFormat,\r\n public type: PixelType,\r\n public source: MipmapsCube = []\r\n ) {}\r\n}\r\n\r\n/**\r\n * A static class providing methods to aid working with Bablyon textures.\r\n */\r\nexport class TextureUtils {\r\n /**\r\n * A prefix used when storing a babylon texture object reference on a Spectre texture object\r\n */\r\n public static BabylonTextureKeyPrefix = \"__babylonTexture_\";\r\n\r\n /**\r\n * Controls anisotropic filtering for deserialized textures.\r\n */\r\n public static MaxAnisotropy = 4;\r\n\r\n /**\r\n * Returns a BabylonCubeTexture instance from a Spectre texture cube, subject to sampling parameters.\r\n * If such a texture has already been requested in the past, this texture will be returned, otherwise a new one will be created.\r\n * The advantage of this is to enable working with texture objects without the need to initialize on the GPU until desired.\r\n * @param scene A Babylon Scene instance\r\n * @param textureCube A Spectre TextureCube object\r\n * @param automaticMipmaps Pass true to enable automatic mipmap generation where possible (requires power of images)\r\n * @param environment Specifies that the texture will be used as an environment\r\n * @param singleLod Specifies that the texture will be a singleLod (for environment)\r\n * @returns Babylon cube texture\r\n */\r\n public static GetBabylonCubeTexture(scene: Scene, textureCube: TextureCube, automaticMipmaps: boolean, environment = false, singleLod = false): CubeTexture {\r\n if (!textureCube) {\r\n throw new Error(\"no texture cube provided\");\r\n }\r\n\r\n let parameters: SamplingParameters;\r\n if (environment) {\r\n parameters = singleLod ? TextureUtils._EnvironmentSingleMipSampling : TextureUtils._EnvironmentSampling;\r\n } else {\r\n parameters = {\r\n magFilter: TextureMagFilter.NEAREST,\r\n minFilter: TextureMinFilter.NEAREST,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n };\r\n }\r\n\r\n const key = TextureUtils.BabylonTextureKeyPrefix + parameters.magFilter + \"\" + parameters.minFilter + \"\" + parameters.wrapS + \"\" + parameters.wrapT;\r\n\r\n let babylonTexture: CubeTexture = (<any>textureCube)[key];\r\n\r\n if (!babylonTexture) {\r\n //initialize babylon texture\r\n babylonTexture = new CubeTexture(\"\", scene);\r\n if (environment) {\r\n babylonTexture.lodGenerationOffset = TextureUtils.EnvironmentLODOffset;\r\n babylonTexture.lodGenerationScale = TextureUtils.EnvironmentLODScale;\r\n }\r\n\r\n babylonTexture.gammaSpace = false;\r\n\r\n const internalTexture = new InternalTexture(scene.getEngine(), InternalTextureSource.CubeRaw);\r\n const glTexture = internalTexture._hardwareTexture?.underlyingResource;\r\n //babylon properties\r\n internalTexture.isCube = true;\r\n internalTexture.generateMipMaps = false;\r\n\r\n babylonTexture._texture = internalTexture;\r\n\r\n TextureUtils.ApplySamplingParameters(babylonTexture, parameters);\r\n\r\n const maxMipLevel = automaticMipmaps ? 0 : textureCube.source.length - 1;\r\n let texturesUploaded = 0;\r\n\r\n const textureComplete = function () {\r\n return texturesUploaded === (maxMipLevel + 1) * 6;\r\n };\r\n\r\n const uploadFace = function (i: number, level: number, face: TextureSource) {\r\n if (!glTexture) {\r\n return;\r\n }\r\n\r\n if (i === 0 && level === 0) {\r\n internalTexture.width = face.width;\r\n internalTexture.height = face.height;\r\n }\r\n\r\n const gl = (<any>scene.getEngine())._gl;\r\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, glTexture);\r\n (scene.getEngine() as Engine)._unpackFlipY(false);\r\n if (face instanceof HTMLElement || face instanceof ImageData) {\r\n gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level, textureCube.internalFormat, textureCube.internalFormat, textureCube.type, <any>face);\r\n } else {\r\n const textureData = <TextureData>face;\r\n gl.texImage2D(\r\n gl.TEXTURE_CUBE_MAP_POSITIVE_X + i,\r\n level,\r\n textureCube.internalFormat,\r\n textureData.width,\r\n textureData.height,\r\n 0,\r\n textureData.format,\r\n textureCube.type,\r\n textureData.data\r\n );\r\n }\r\n\r\n texturesUploaded++;\r\n\r\n if (textureComplete()) {\r\n //generate mipmaps\r\n if (automaticMipmaps) {\r\n const w = face.width;\r\n const h = face.height;\r\n const isPot = (w !== 0 && w & (w - 1)) === 0 && (h !== 0 && h & (h - 1)) === 0;\r\n if (isPot) {\r\n gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\r\n }\r\n }\r\n\r\n // Upload Separate lods in case there is no support for texture lod.\r\n if (environment && !scene.getEngine().getCaps().textureLOD && !singleLod) {\r\n const mipSlices = 3;\r\n for (let i = 0; i < mipSlices; i++) {\r\n const lodKey = TextureUtils.BabylonTextureKeyPrefix + \"lod\" + i;\r\n let lod: CubeTexture = (<any>textureCube)[lodKey];\r\n\r\n //initialize lod texture if it doesn't already exist\r\n if (lod == null && textureCube.Width) {\r\n //compute LOD from even spacing in smoothness (matching shader calculation)\r\n const smoothness = i / (mipSlices - 1);\r\n const roughness = 1 - smoothness;\r\n const kMinimumVariance = 0.0005;\r\n const alphaG = roughness * roughness + kMinimumVariance;\r\n const microsurfaceAverageSlopeTexels = alphaG * textureCube.Width;\r\n\r\n const environmentSpecularLOD = TextureUtils.EnvironmentLODScale * Math.log2(microsurfaceAverageSlopeTexels) + TextureUtils.EnvironmentLODOffset;\r\n\r\n const maxLODIndex = textureCube.source.length - 1;\r\n const mipmapIndex = Math.min(Math.max(Math.round(environmentSpecularLOD), 0), maxLODIndex);\r\n\r\n lod = TextureUtils.GetBabylonCubeTexture(\r\n scene,\r\n new TextureCube(PixelFormat.RGBA, PixelType.UNSIGNED_BYTE, [textureCube.source[mipmapIndex]]),\r\n false,\r\n true,\r\n true\r\n );\r\n\r\n if (i === 0) {\r\n internalTexture._lodTextureLow = lod;\r\n } else if (i === 1) {\r\n internalTexture._lodTextureMid = lod;\r\n } else {\r\n internalTexture._lodTextureHigh = lod;\r\n }\r\n\r\n (<any>textureCube)[lodKey] = lod;\r\n }\r\n }\r\n }\r\n\r\n internalTexture.isReady = true;\r\n }\r\n\r\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\r\n scene.getEngine().resetTextureCache();\r\n };\r\n\r\n for (let i = 0; i <= maxMipLevel; i++) {\r\n const faces = textureCube.source[i];\r\n for (let j = 0; j < faces.length; j++) {\r\n const face = faces[j];\r\n if (face instanceof HTMLImageElement && !face.complete) {\r\n face.addEventListener(\r\n \"load\",\r\n () => {\r\n uploadFace(j, i, face);\r\n },\r\n false\r\n );\r\n } else {\r\n uploadFace(j, i, face);\r\n }\r\n }\r\n }\r\n\r\n scene.getEngine().resetTextureCache();\r\n\r\n babylonTexture.isReady = () => {\r\n return textureComplete();\r\n };\r\n\r\n (<any>textureCube)[key] = babylonTexture;\r\n }\r\n\r\n return babylonTexture;\r\n }\r\n\r\n /**\r\n * Applies Spectre SamplingParameters to a Babylon texture by directly setting texture parameters on the internal WebGLTexture as well as setting Babylon fields\r\n * @param babylonTexture Babylon texture to apply texture to (requires the Babylon texture has an initialize _texture field)\r\n * @param parameters Spectre SamplingParameters to apply\r\n */\r\n public static ApplySamplingParameters(babylonTexture: BaseTexture, parameters: SamplingParameters) {\r\n const scene = babylonTexture.getScene();\r\n if (!scene) {\r\n return;\r\n }\r\n const gl = (<any>scene.getEngine())._gl;\r\n\r\n const target = babylonTexture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n const internalTexture = babylonTexture._texture;\r\n if (!internalTexture) {\r\n return;\r\n }\r\n const glTexture = internalTexture._hardwareTexture?.underlyingResource;\r\n gl.bindTexture(target, glTexture);\r\n\r\n if (parameters.magFilter != null) {\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, parameters.magFilter);\r\n }\r\n if (parameters.minFilter != null) {\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, parameters.minFilter);\r\n }\r\n if (parameters.wrapS != null) {\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, parameters.wrapS);\r\n }\r\n if (parameters.wrapT != null) {\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, parameters.wrapT);\r\n }\r\n\r\n //set babylon wrap modes from sampling parameter\r\n switch (parameters.wrapS) {\r\n case TextureWrapMode.REPEAT:\r\n babylonTexture.wrapU = Texture.WRAP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n babylonTexture.wrapU = Texture.MIRROR_ADDRESSMODE;\r\n break;\r\n default:\r\n babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n switch (parameters.wrapT) {\r\n case TextureWrapMode.REPEAT:\r\n babylonTexture.wrapV = Texture.WRAP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.CLAMP_TO_EDGE:\r\n babylonTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n break;\r\n case TextureWrapMode.MIRRORED_REPEAT:\r\n babylonTexture.wrapV = Texture.MIRROR_ADDRESSMODE;\r\n break;\r\n default:\r\n babylonTexture.wrapV = Texture.CLAMP_ADDRESSMODE;\r\n }\r\n\r\n if (parameters.maxAnisotropy != null && parameters.maxAnisotropy > 1) {\r\n const anisotropicExt = gl.getExtension(\"EXT_texture_filter_anisotropic\");\r\n if (anisotropicExt) {\r\n const maxAnisotropicSamples = gl.getParameter(anisotropicExt.MAX_TEXTURE_MAX_ANISOTROPY_EXT);\r\n const maxAnisotropy = Math.min(parameters.maxAnisotropy, maxAnisotropicSamples);\r\n gl.texParameterf(target, anisotropicExt.TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy);\r\n babylonTexture.anisotropicFilteringLevel = maxAnisotropy;\r\n }\r\n }\r\n\r\n gl.bindTexture(target, null);\r\n scene.getEngine().resetTextureCache();\r\n }\r\n\r\n private static _EnvironmentSampling: SamplingParameters = {\r\n magFilter: TextureMagFilter.LINEAR,\r\n minFilter: TextureMinFilter.LINEAR_MIPMAP_LINEAR,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n maxAnisotropy: 1,\r\n };\r\n\r\n private static _EnvironmentSingleMipSampling: SamplingParameters = {\r\n magFilter: TextureMagFilter.LINEAR,\r\n minFilter: TextureMinFilter.LINEAR,\r\n wrapS: TextureWrapMode.CLAMP_TO_EDGE,\r\n wrapT: TextureWrapMode.CLAMP_TO_EDGE,\r\n maxAnisotropy: 1,\r\n };\r\n\r\n //from \"/Internal/Lighting.EnvironmentFilterScale\" in Engine/*/Configuration.cpp\r\n /**\r\n * Environment preprocessing dedicated value (Internal Use or Advanced only).\r\n */\r\n public static EnvironmentLODScale = 0.8;\r\n /**\r\n * Environment preprocessing dedicated value (Internal Use or Advanced only)..\r\n */\r\n public static EnvironmentLODOffset = 1.0;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/viewer",
3
- "version": "7.24.0",
3
+ "version": "7.25.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -13,15 +13,15 @@
13
13
  ],
14
14
  "scripts": {
15
15
  "build": "npm run clean && npm run compile",
16
- "clean": "rimraf dist && rimraf *.tsbuildinfo && rimraf \"./**/*.!(md|json|build.json)\"",
16
+ "clean": "rimraf dist && rimraf *.tsbuildinfo -g && rimraf \"./**/*.!(md|json|build.json)\" -g",
17
17
  "compile": "tsc -b tsconfig.build.json --verbose",
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "dependencies": {
21
- "@babylonjs/core": "^7.24.0",
22
- "@babylonjs/loaders": "^7.24.0",
23
- "babylonjs-gltf2interface": "^7.24.0",
24
- "babylonjs-viewer-assets": "^7.24.0",
21
+ "@babylonjs/core": "^7.25.0",
22
+ "@babylonjs/loaders": "^7.25.0",
23
+ "babylonjs-gltf2interface": "^7.25.0",
24
+ "babylonjs-viewer-assets": "^7.25.0",
25
25
  "deepmerge": "~4.2.2",
26
26
  "handlebars": "~4.7.7",
27
27
  "pepjs": "~0.5.3",
package/viewer/viewer.js CHANGED
@@ -78,7 +78,7 @@ var AbstractViewer = /** @class */ (function () {
78
78
  this.baseId = containerElement.id;
79
79
  }
80
80
  else {
81
- this.baseId = containerElement.id = "bjs" + Math.random().toString(32).substr(2, 8);
81
+ this.baseId = containerElement.id = "bjs" + Math.random().toString(32).substring(2, 10);
82
82
  }
83
83
  this._registeredOnBeforeRenderFunctions = [];
84
84
  this._configurationContainer = new ConfigurationContainer();
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../../tools/viewer/src/viewer/viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"core/Engines/engine\";\r\nimport type { ISceneLoaderPlugin, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport type { Observable } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { RenderingManager } from \"core/Rendering/renderingManager\";\r\nimport type { TargetCamera } from \"core/Cameras/targetCamera\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Effect } from \"core/Materials/effect\";\r\nimport { processConfigurationCompatibility } from \"../configuration/configurationCompatibility\";\r\nimport { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport { viewerGlobals } from \"../configuration/globals\";\r\nimport { RenderOnlyConfigurationLoader } from \"../configuration/renderOnlyLoader\";\r\n// eslint-disable-next-line import/no-internal-modules\r\nimport { deepmerge } from \"../helper/index\";\r\nimport { ModelLoader } from \"../loader/modelLoader\";\r\nimport { ObservablesManager } from \"../managers/observablesManager\";\r\nimport { SceneManager } from \"../managers/sceneManager\";\r\nimport { telemetryManager } from \"../managers/telemetryManager\";\r\nimport type { ViewerModel } from \"../model/viewerModel\";\r\nimport { viewerManager } from \"./viewerManager\";\r\nimport type { ViewerConfiguration } from \"../configuration/configuration\";\r\nimport type { IObserversConfiguration } from \"../configuration/interfaces/observersConfiguration\";\r\nimport type { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\r\nimport type { GLTFFileLoader } from \"loaders/glTF/glTFFileLoader\";\r\nimport \"core/Misc/observable.extensions\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * The AbstractViewer is the center of Babylon's viewer.\r\n * It is the basic implementation of the default viewer and is responsible of loading and showing the model and the templates\r\n */\r\nexport abstract class AbstractViewer {\r\n /**\r\n * Babylon Engine corresponding with this viewer\r\n */\r\n public engine: Engine;\r\n /**\r\n * The ID of this viewer. it will be generated randomly or use the HTML Element's ID.\r\n */\r\n public readonly baseId: string;\r\n\r\n /**\r\n * The last loader used to load a model.\r\n * @deprecated\r\n */\r\n public lastUsedLoader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n /**\r\n * The ModelLoader instance connected with this viewer.\r\n */\r\n public modelLoader: ModelLoader;\r\n\r\n /**\r\n * A flag that controls whether or not the render loop should be executed\r\n */\r\n public runRenderLoop: boolean = true;\r\n\r\n /**\r\n * The scene manager connected with this viewer instance\r\n */\r\n public sceneManager: SceneManager;\r\n\r\n // observables\r\n /**\r\n * Will notify when the scene was initialized\r\n */\r\n public get onSceneInitObservable(): Observable<Scene> {\r\n return this.observablesManager.onSceneInitObservable;\r\n }\r\n /**\r\n * will notify when the engine was initialized\r\n */\r\n public get onEngineInitObservable(): Observable<Engine> {\r\n return this.observablesManager.onEngineInitObservable;\r\n }\r\n\r\n /**\r\n * Will notify when a new model was added to the scene.\r\n * Note that added does not necessarily mean loaded!\r\n */\r\n public get onModelAddedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelAddedObservable;\r\n }\r\n /**\r\n * will notify after every model load\r\n */\r\n public get onModelLoadedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelLoadedObservable;\r\n }\r\n /**\r\n * will notify when any model notify of progress\r\n */\r\n public get onModelLoadProgressObservable(): Observable<ISceneLoaderProgressEvent> {\r\n return this.observablesManager.onModelLoadProgressObservable;\r\n }\r\n /**\r\n * will notify when any model load failed.\r\n */\r\n public get onModelLoadErrorObservable(): Observable<{ message: string; exception: any }> {\r\n return this.observablesManager.onModelLoadErrorObservable;\r\n }\r\n /**\r\n * Will notify when a model was removed from the scene;\r\n */\r\n public get onModelRemovedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelRemovedObservable;\r\n }\r\n /**\r\n * will notify when a new loader was initialized.\r\n * Used mainly to know when a model starts loading.\r\n */\r\n public get onLoaderInitObservable(): Observable<ISceneLoaderPlugin | ISceneLoaderPluginAsync> {\r\n return this.observablesManager.onLoaderInitObservable;\r\n }\r\n /**\r\n * Observers registered here will be executed when the entire load process has finished.\r\n */\r\n public get onInitDoneObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onViewerInitDoneObservable;\r\n }\r\n\r\n /**\r\n * Functions added to this observable will be executed on each frame rendered.\r\n */\r\n public get onFrameRenderedObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onFrameRenderedObservable;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when VR more is entered.\r\n */\r\n public get onEnteringVRObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onEnteringVRObservable;\r\n }\r\n /**\r\n * Observers registered here will be executed when VR mode is exited.\r\n */\r\n public get onExitingVRObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onExitingVRObservable;\r\n }\r\n\r\n public observablesManager: ObservablesManager;\r\n\r\n /**\r\n * The canvas associated with this viewer\r\n */\r\n protected _canvas: HTMLCanvasElement;\r\n\r\n /**\r\n * The (single) canvas of this viewer\r\n */\r\n public get canvas(): HTMLCanvasElement {\r\n return this._canvas;\r\n }\r\n\r\n /**\r\n * is this viewer disposed?\r\n */\r\n protected _isDisposed: boolean = false;\r\n\r\n /**\r\n * registered onBeforeRender functions.\r\n * This functions are also registered at the native scene. The reference can be used to unregister them.\r\n */\r\n protected _registeredOnBeforeRenderFunctions: Array<() => void>;\r\n /**\r\n * The configuration loader of this viewer\r\n */\r\n protected _configurationLoader: RenderOnlyConfigurationLoader;\r\n\r\n /**\r\n * Is the viewer already initialized. for internal use.\r\n */\r\n protected _isInit: boolean;\r\n\r\n protected _configurationContainer: ConfigurationContainer;\r\n\r\n public get configurationContainer() {\r\n return this._configurationContainer;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected getConfigurationLoader() {\r\n return new RenderOnlyConfigurationLoader();\r\n }\r\n\r\n constructor(\r\n public containerElement: Element,\r\n initialConfiguration: ViewerConfiguration = {}\r\n ) {\r\n // if exists, use the container id. otherwise, generate a random string.\r\n if (containerElement.id) {\r\n this.baseId = containerElement.id;\r\n } else {\r\n this.baseId = containerElement.id = \"bjs\" + Math.random().toString(32).substr(2, 8);\r\n }\r\n\r\n this._registeredOnBeforeRenderFunctions = [];\r\n\r\n this._configurationContainer = new ConfigurationContainer();\r\n\r\n this.observablesManager = new ObservablesManager();\r\n\r\n this.modelLoader = new ModelLoader(this.observablesManager, this._configurationContainer);\r\n\r\n RenderingManager.AUTOCLEAR = false;\r\n\r\n // extend the configuration\r\n this._configurationLoader = this.getConfigurationLoader();\r\n this._configurationLoader.loadConfiguration(initialConfiguration, (configuration) => {\r\n this._onConfigurationLoaded(configuration);\r\n });\r\n\r\n this.onSceneInitObservable.add(() => {\r\n this.updateConfiguration();\r\n });\r\n\r\n this.onInitDoneObservable.add(() => {\r\n this._isInit = true;\r\n this.engine.runRenderLoop(this._render);\r\n });\r\n\r\n this._prepareContainerElement();\r\n\r\n // add this viewer to the viewer manager\r\n viewerManager.addViewer(this);\r\n }\r\n\r\n /**\r\n * get the baseId of this viewer\r\n * @returns the baseId of this viewer\r\n */\r\n public getBaseId(): string {\r\n return this.baseId;\r\n }\r\n\r\n /**\r\n * Do we have a canvas to render on, and is it a part of the scene\r\n * @returns true if the canvas is in the DOM\r\n */\r\n public isCanvasInDOM(): boolean {\r\n return !!this._canvas && !!this._canvas.parentElement;\r\n }\r\n\r\n /**\r\n * Is the engine currently set to render even when the page is in background\r\n */\r\n public get renderInBackground() {\r\n return this.engine && this.engine.renderEvenInBackground;\r\n }\r\n\r\n /**\r\n * Set the viewer's background rendering flag.\r\n */\r\n public set renderInBackground(value: boolean) {\r\n if (this.engine) {\r\n this.engine.renderEvenInBackground = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the configuration object. This is a reference only.\r\n * The configuration can ONLY be updated using the updateConfiguration function.\r\n * changing this object will have no direct effect on the scene.\r\n */\r\n public get configuration(): ViewerConfiguration {\r\n return this._configurationContainer.configuration;\r\n }\r\n\r\n /**\r\n * force resizing the engine.\r\n */\r\n public forceResize() {\r\n this._resize();\r\n }\r\n\r\n protected _hdToggled: boolean = false;\r\n\r\n public toggleHD() {\r\n this._hdToggled = !this._hdToggled;\r\n\r\n const scale = this._hdToggled ? Math.max(0.5, 1 / (window.devicePixelRatio || 2)) : 1;\r\n\r\n this.engine.setHardwareScalingLevel(scale);\r\n }\r\n\r\n protected _vrToggled: boolean = false;\r\n private _vrModelRepositioning: number = 0;\r\n protected _vrScale: number = 1;\r\n\r\n protected _vrInit: boolean = false;\r\n\r\n public toggleVR() {\r\n if (!this._vrInit) {\r\n this._initVR();\r\n }\r\n\r\n if (this.sceneManager.vrHelper && !this.sceneManager.vrHelper.isInVRMode) {\r\n // make sure the floor is set\r\n if (this.sceneManager.environmentHelper && this.sceneManager.environmentHelper.ground) {\r\n this.sceneManager.vrHelper.addFloorMesh(this.sceneManager.environmentHelper.ground);\r\n }\r\n\r\n this._vrToggled = true;\r\n this.sceneManager.vrHelper.enterVR();\r\n\r\n // position the vr camera to be in front of the object or wherever the user has configured it to be\r\n if (this.sceneManager.vrHelper.currentVRCamera && this.sceneManager.vrHelper.currentVRCamera !== this.sceneManager.camera) {\r\n if (this.configuration.vr && this.configuration.vr.cameraPosition !== undefined) {\r\n this.sceneManager.vrHelper.currentVRCamera.position.copyFromFloats(\r\n this.configuration.vr.cameraPosition.x,\r\n this.configuration.vr.cameraPosition.y,\r\n this.configuration.vr.cameraPosition.z\r\n );\r\n } else {\r\n this.sceneManager.vrHelper.currentVRCamera.position.copyFromFloats(0, this.sceneManager.vrHelper.currentVRCamera.position.y, -1);\r\n }\r\n (<TargetCamera>this.sceneManager.vrHelper.currentVRCamera).rotationQuaternion &&\r\n (<TargetCamera>this.sceneManager.vrHelper.currentVRCamera).rotationQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // set the height of the model to be what the user has configured, or floating by default\r\n if (this.configuration.vr && this.configuration.vr.modelHeightCorrection !== undefined) {\r\n if (typeof this.configuration.vr.modelHeightCorrection === \"number\") {\r\n this._vrModelRepositioning = this.configuration.vr.modelHeightCorrection;\r\n } else if (this.configuration.vr.modelHeightCorrection) {\r\n this._vrModelRepositioning = this.sceneManager.vrHelper.currentVRCamera.position.y / 2;\r\n } else {\r\n this._vrModelRepositioning = 0;\r\n }\r\n }\r\n\r\n // scale the model\r\n if (this.sceneManager.models.length) {\r\n const boundingVectors = this.sceneManager.models[0].rootMesh.getHierarchyBoundingVectors();\r\n const sizeVec = boundingVectors.max.subtract(boundingVectors.min);\r\n const maxDimension = Math.max(sizeVec.x, sizeVec.y, sizeVec.z);\r\n this._vrScale = 1 / maxDimension;\r\n if (this.configuration.vr && this.configuration.vr.objectScaleFactor) {\r\n this._vrScale *= this.configuration.vr.objectScaleFactor;\r\n }\r\n\r\n this.sceneManager.models[0].rootMesh.scaling.scaleInPlace(this._vrScale);\r\n\r\n // reposition the object to \"float\" in front of the user\r\n this.sceneManager.models[0].rootMesh.position.y += this._vrModelRepositioning;\r\n this.sceneManager.models[0].rootMesh.rotationQuaternion = null;\r\n }\r\n\r\n // scale the environment to match the model\r\n if (this.sceneManager.environmentHelper) {\r\n this.sceneManager.environmentHelper.ground && this.sceneManager.environmentHelper.ground.scaling.scaleInPlace(this._vrScale);\r\n this.sceneManager.environmentHelper.skybox && this.sceneManager.environmentHelper.skybox.scaling.scaleInPlace(this._vrScale);\r\n }\r\n\r\n // post processing\r\n if (this.sceneManager.defaultRenderingPipelineEnabled && this.sceneManager.defaultRenderingPipeline) {\r\n this.sceneManager.defaultRenderingPipeline.imageProcessingEnabled = false;\r\n this.sceneManager.defaultRenderingPipeline.prepare();\r\n }\r\n } else {\r\n this._vrModelRepositioning = 0;\r\n }\r\n } else {\r\n if (this.sceneManager.vrHelper) {\r\n this.sceneManager.vrHelper.exitVR();\r\n }\r\n }\r\n }\r\n\r\n protected _initVR() {\r\n if (this.sceneManager.vrHelper) {\r\n this.observablesManager.onExitingVRObservable.add(() => {\r\n if (this._vrToggled) {\r\n this._vrToggled = false;\r\n\r\n // undo the scaling of the model\r\n if (this.sceneManager.models.length) {\r\n this.sceneManager.models[0].rootMesh.scaling.scaleInPlace(1 / this._vrScale);\r\n this.sceneManager.models[0].rootMesh.position.y -= this._vrModelRepositioning;\r\n }\r\n\r\n // undo the scaling of the environment\r\n if (this.sceneManager.environmentHelper) {\r\n this.sceneManager.environmentHelper.ground && this.sceneManager.environmentHelper.ground.scaling.scaleInPlace(1 / this._vrScale);\r\n this.sceneManager.environmentHelper.skybox && this.sceneManager.environmentHelper.skybox.scaling.scaleInPlace(1 / this._vrScale);\r\n }\r\n\r\n // post processing\r\n if (this.sceneManager.defaultRenderingPipelineEnabled && this.sceneManager.defaultRenderingPipeline) {\r\n this.sceneManager.defaultRenderingPipeline.imageProcessingEnabled = true;\r\n this.sceneManager.defaultRenderingPipeline.prepare();\r\n }\r\n\r\n // clear set height and width\r\n this.canvas.removeAttribute(\"height\");\r\n this.canvas.removeAttribute(\"width\");\r\n this.engine.resize();\r\n }\r\n });\r\n }\r\n\r\n this._vrInit = true;\r\n }\r\n\r\n /**\r\n * The resize function that will be registered with the window object\r\n */\r\n protected _resize = (): void => {\r\n // Only resize if Canvas is in the DOM\r\n if (!this.isCanvasInDOM()) {\r\n return;\r\n }\r\n\r\n if (this.canvas.clientWidth <= 0 || this.canvas.clientHeight <= 0) {\r\n return;\r\n }\r\n\r\n if (this.configuration.engine && this.configuration.engine.disableResize) {\r\n return;\r\n }\r\n\r\n this.engine.resize();\r\n };\r\n\r\n protected _onConfigurationLoaded(configuration: ViewerConfiguration) {\r\n this._configurationContainer.configuration = deepmerge(this.configuration || {}, configuration);\r\n if (this.configuration.observers) {\r\n this._configureObservers(this.configuration.observers);\r\n }\r\n // TODO remove this after testing, as this is done in the updateConfiguration as well.\r\n if (this.configuration.loaderPlugins) {\r\n Object.keys(this.configuration.loaderPlugins).forEach((name) => {\r\n if (this.configuration.loaderPlugins && this.configuration.loaderPlugins[name]) {\r\n this.modelLoader.addPlugin(name);\r\n }\r\n });\r\n }\r\n\r\n this.observablesManager.onViewerInitStartedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Force a single render loop execution.\r\n */\r\n public forceRender() {\r\n this._render(true);\r\n }\r\n\r\n /**\r\n * render loop that will be executed by the engine\r\n * @param force\r\n */\r\n protected _render = (force: boolean = false): void => {\r\n if (force || (this.sceneManager.scene && this.sceneManager.scene.activeCamera)) {\r\n if (this.runRenderLoop || force) {\r\n this.engine.performanceMonitor.enable();\r\n this.sceneManager.scene.render();\r\n this.onFrameRenderedObservable.notifyObservers(this);\r\n } else {\r\n this.engine.performanceMonitor.disable();\r\n\r\n // update camera instead of rendering\r\n this.sceneManager.scene.activeCamera && this.sceneManager.scene.activeCamera.update();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Takes a screenshot of the scene and returns it as a base64 encoded png.\r\n * @param callback optional callback that will be triggered when screenshot is done.\r\n * @param width Optional screenshot width (default to 512).\r\n * @param height Optional screenshot height (default to 512).\r\n * @returns a promise with the screenshot data\r\n */\r\n public takeScreenshot(callback?: (data: string) => void, width = 0, height = 0): Promise<string> {\r\n width = width || this.canvas.clientWidth;\r\n height = height || this.canvas.clientHeight;\r\n\r\n // Create the screenshot\r\n return new Promise<string>((resolve, reject) => {\r\n try {\r\n Tools.CreateScreenshot(this.engine, this.sceneManager.camera, { width, height }, (data) => {\r\n if (callback) {\r\n callback(data);\r\n }\r\n resolve(data);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the current viewer configuration with new values.\r\n * Only provided information will be updated, old configuration values will be kept.\r\n * If this.configuration was manually changed, you can trigger this function with no parameters,\r\n * and the entire configuration will be updated.\r\n * @param newConfiguration the partial configuration to update or a URL to a JSON holding the updated configuration\r\n *\r\n */\r\n public updateConfiguration(newConfiguration: Partial<ViewerConfiguration> | string = this.configuration) {\r\n if (typeof newConfiguration === \"string\") {\r\n Tools.LoadFile(\r\n newConfiguration,\r\n (data) => {\r\n try {\r\n const newData = JSON.parse(data.toString()) as ViewerConfiguration;\r\n return this.updateConfiguration(newData);\r\n } catch (e) {\r\n Logger.Log(\"Error parsing file \" + newConfiguration);\r\n }\r\n },\r\n undefined,\r\n undefined,\r\n undefined,\r\n (error) => {\r\n Logger.Log([\"Error parsing file \" + newConfiguration, error]);\r\n }\r\n );\r\n } else {\r\n //backcompat\r\n processConfigurationCompatibility(newConfiguration);\r\n // update this.configuration with the new data\r\n this._configurationContainer.configuration = deepmerge(this.configuration || {}, newConfiguration);\r\n\r\n this.sceneManager.updateConfiguration(newConfiguration);\r\n\r\n // observers in configuration\r\n if (newConfiguration.observers) {\r\n this._configureObservers(newConfiguration.observers);\r\n }\r\n\r\n if (newConfiguration.loaderPlugins) {\r\n Object.keys(newConfiguration.loaderPlugins).forEach((name) => {\r\n if (newConfiguration.loaderPlugins && newConfiguration.loaderPlugins[name]) {\r\n this.modelLoader.addPlugin(name);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * this is used to register native functions using the configuration object.\r\n * This will configure the observers.\r\n * @param observersConfiguration observers configuration\r\n */\r\n protected _configureObservers(observersConfiguration: IObserversConfiguration) {\r\n if (observersConfiguration.onEngineInit) {\r\n this.onEngineInitObservable.add((window as any)[observersConfiguration.onEngineInit]);\r\n } else {\r\n if (observersConfiguration.onEngineInit === \"\" && this.configuration.observers && this.configuration.observers!.onEngineInit) {\r\n this.onEngineInitObservable.removeCallback((window as any)[this.configuration.observers!.onEngineInit!]);\r\n }\r\n }\r\n if (observersConfiguration.onSceneInit) {\r\n this.onSceneInitObservable.add((window as any)[observersConfiguration.onSceneInit]);\r\n } else {\r\n if (observersConfiguration.onSceneInit === \"\" && this.configuration.observers && this.configuration.observers!.onSceneInit) {\r\n this.onSceneInitObservable.removeCallback((window as any)[this.configuration.observers!.onSceneInit!]);\r\n }\r\n }\r\n if (observersConfiguration.onModelLoaded) {\r\n this.onModelLoadedObservable.add((window as any)[observersConfiguration.onModelLoaded]);\r\n } else {\r\n if (observersConfiguration.onModelLoaded === \"\" && this.configuration.observers && this.configuration.observers!.onModelLoaded) {\r\n this.onModelLoadedObservable.removeCallback((window as any)[this.configuration.observers!.onModelLoaded!]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the entire viewer including the scene and the engine\r\n */\r\n public dispose() {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n window.removeEventListener(\"resize\", this._resize);\r\n\r\n if (this.sceneManager) {\r\n if (this.sceneManager.scene && this.sceneManager.scene.activeCamera) {\r\n this.sceneManager.scene.activeCamera.detachControl();\r\n }\r\n this.sceneManager.dispose();\r\n }\r\n\r\n this._fpsTimeoutInterval && clearInterval(this._fpsTimeoutInterval);\r\n\r\n this.observablesManager.dispose();\r\n\r\n this.modelLoader.dispose();\r\n\r\n if (this.engine) {\r\n this.engine.dispose();\r\n }\r\n\r\n viewerManager.removeViewer(this);\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This will prepare the container element for the viewer\r\n */\r\n protected abstract _prepareContainerElement(): void;\r\n\r\n /**\r\n * This function will execute when the HTML templates finished initializing.\r\n * It should initialize the engine and continue execution.\r\n *\r\n * @returns The viewer object will be returned after the object was loaded.\r\n */\r\n protected _onTemplatesLoaded(): Promise<AbstractViewer> {\r\n return Promise.resolve(this);\r\n }\r\n\r\n /**\r\n * This will force the creation of an engine and a scene.\r\n * It will also load a model if preconfigured.\r\n * But first - it will load the extendible onTemplateLoaded()!\r\n * @returns A promise that will resolve when the template was loaded\r\n */\r\n protected _onTemplateLoaded(): Promise<AbstractViewer> {\r\n // check if viewer was disposed right after created\r\n if (this._isDisposed) {\r\n return Promise.reject(\"viewer was disposed\");\r\n }\r\n return this._onTemplatesLoaded().then(() => {\r\n const autoLoad = typeof this.configuration.model === \"string\" || (this.configuration.model && this.configuration.model.url);\r\n return this._initEngine()\r\n .then((engine) => {\r\n return this.onEngineInitObservable.notifyObserversWithPromise(engine);\r\n })\r\n .then(() => {\r\n this._initTelemetryEvents();\r\n if (autoLoad) {\r\n return this.loadModel(this.configuration.model!)\r\n .catch(() => {})\r\n .then(() => {\r\n return this.sceneManager.scene;\r\n });\r\n } else {\r\n return this.sceneManager.scene || this.sceneManager.initScene(this.configuration.scene);\r\n }\r\n })\r\n .then(() => {\r\n return this.onInitDoneObservable.notifyObserversWithPromise(this);\r\n })\r\n .catch((e) => {\r\n Tools.Warn(e.toString());\r\n return this;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Initialize the engine. Returns a promise in case async calls are needed.\r\n *\r\n * @protected\r\n * @returns {Promise<Engine>}\r\n * @memberof Viewer\r\n */\r\n protected _initEngine(): Promise<Engine> {\r\n // init custom shaders\r\n this._injectCustomShaders();\r\n\r\n //let canvasElement = this.templateManager.getCanvas();\r\n if (!this.canvas) {\r\n return Promise.reject(\"Canvas element not found!\");\r\n }\r\n const config = this.configuration.engine || {};\r\n // TDO enable further configuration\r\n\r\n // check for webgl2 support, force-disable if needed.\r\n if (viewerGlobals.disableWebGL2Support) {\r\n config.engineOptions = config.engineOptions || {};\r\n config.engineOptions.disableWebGL2Support = true;\r\n }\r\n\r\n if (this.configuration[\"3dCommerceCertified\"]) {\r\n config.engineOptions = config.engineOptions || {};\r\n config.engineOptions.forceSRGBBufferSupportState = true;\r\n const loader = SceneLoader.GetPluginForExtension(\".gltf\");\r\n if (loader) {\r\n (loader as GLTFFileLoader).transparencyAsCoverage = true;\r\n }\r\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\r\n if (plugin.name === \"gltf\") {\r\n const loader = plugin as GLTFFileLoader;\r\n loader.transparencyAsCoverage = true;\r\n }\r\n });\r\n }\r\n\r\n this.engine = new Engine(this.canvas, !!config.antialiasing, config.engineOptions);\r\n\r\n if (!config.disableResize) {\r\n window.addEventListener(\"resize\", this._resize);\r\n }\r\n\r\n if (this.configuration.engine) {\r\n if (this.configuration.engine.adaptiveQuality) {\r\n const scale = Math.max(0.5, 1 / (window.devicePixelRatio || 2));\r\n this.engine.setHardwareScalingLevel(scale);\r\n }\r\n if (this.configuration.engine.hdEnabled) {\r\n this.toggleHD();\r\n }\r\n }\r\n\r\n // create a new template manager for this viewer\r\n this.sceneManager = new SceneManager(this.engine, this._configurationContainer, this.observablesManager);\r\n\r\n return Promise.resolve(this.engine);\r\n }\r\n\r\n private _isLoading: boolean;\r\n\r\n /**\r\n * Initialize a model loading. The returned object (a ViewerModel object) will be loaded in the background.\r\n * The difference between this and loadModel is that loadModel will fulfill the promise when the model finished loading.\r\n *\r\n * @param modelConfig model configuration to use when loading the model.\r\n * @param clearScene should the scene be cleared before loading this model\r\n * @returns a ViewerModel object that is not yet fully loaded.\r\n */\r\n public initModel(modelConfig: string | File | IModelConfiguration, clearScene: boolean = true): ViewerModel {\r\n let configuration: IModelConfiguration;\r\n if (typeof modelConfig === \"string\") {\r\n configuration = {\r\n url: modelConfig,\r\n };\r\n } else if (modelConfig instanceof File) {\r\n configuration = {\r\n file: modelConfig,\r\n root: \"file:\",\r\n };\r\n } else {\r\n configuration = modelConfig;\r\n }\r\n\r\n if (!configuration.url && !configuration.file) {\r\n throw new Error(\"no model provided\");\r\n }\r\n\r\n if (clearScene) {\r\n this.sceneManager.clearScene(true, false);\r\n }\r\n\r\n //merge the configuration for future models:\r\n if (this.configuration.model && typeof this.configuration.model === \"object\") {\r\n const globalConfig = deepmerge({}, this.configuration.model);\r\n configuration = deepmerge(globalConfig, configuration);\r\n if (modelConfig instanceof File) {\r\n configuration.file = modelConfig;\r\n }\r\n } else {\r\n this.configuration.model = configuration;\r\n }\r\n\r\n this._isLoading = true;\r\n\r\n const model = this.modelLoader.load(configuration);\r\n\r\n this.lastUsedLoader = model.loader;\r\n model.onLoadErrorObservable.add((errorObject) => {\r\n this.onModelLoadErrorObservable.notifyObserversWithPromise(errorObject);\r\n });\r\n model.onLoadProgressObservable.add((progressEvent) => {\r\n this.onModelLoadProgressObservable.notifyObserversWithPromise(progressEvent);\r\n });\r\n this.onLoaderInitObservable.notifyObserversWithPromise(this.lastUsedLoader);\r\n\r\n model.onLoadedObservable.add(() => {\r\n this._isLoading = false;\r\n });\r\n\r\n return model;\r\n }\r\n\r\n /**\r\n * load a model using the provided configuration.\r\n * This function, as opposed to initModel, will return a promise that resolves when the model is loaded, and rejects with error.\r\n * If you want to attach to the observables of the model, use initModel instead.\r\n *\r\n * @param modelConfig the model configuration or URL to load.\r\n * @param clearScene Should the scene be cleared before loading the model\r\n * @returns a Promise the fulfills when the model finished loading successfully.\r\n */\r\n public loadModel(modelConfig: string | File | IModelConfiguration, clearScene: boolean = true): Promise<ViewerModel> {\r\n if (this._isLoading) {\r\n // We can decide here whether or not to cancel the lst load, but the developer can do that.\r\n return Promise.reject(\"another model is curently being loaded.\");\r\n }\r\n\r\n return Promise.resolve(this.sceneManager.scene)\r\n .then((scene) => {\r\n if (!scene) {\r\n return this.sceneManager.initScene(this.configuration.scene);\r\n }\r\n return scene;\r\n })\r\n .then(() => {\r\n const model = this.initModel(modelConfig, clearScene);\r\n return new Promise<ViewerModel>((resolve, reject) => {\r\n // at this point, configuration.model is an object, not a string\r\n model.onLoadedObservable.add(() => {\r\n resolve(model);\r\n });\r\n model.onLoadErrorObservable.add((error) => {\r\n reject(error);\r\n });\r\n });\r\n });\r\n }\r\n\r\n private _fpsTimeoutInterval: number;\r\n\r\n protected _initTelemetryEvents() {\r\n telemetryManager.broadcast(\"Engine Capabilities\", this.baseId, this.engine.getCaps());\r\n telemetryManager.broadcast(\"Platform Details\", this.baseId, {\r\n userAgent: navigator.userAgent,\r\n platform: navigator.platform,\r\n });\r\n\r\n telemetryManager.flushWebGLErrors(this.engine, this.baseId);\r\n\r\n const trackFPS: Function = () => {\r\n telemetryManager.broadcast(\"Current FPS\", this.baseId, { fps: this.engine.getFps() });\r\n };\r\n\r\n trackFPS();\r\n // Track the FPS again after 60 seconds\r\n this._fpsTimeoutInterval = window.setInterval(trackFPS, 60 * 1000);\r\n }\r\n\r\n /**\r\n * Injects all the spectre shader in the babylon shader store\r\n */\r\n protected _injectCustomShaders(): void {\r\n const customShaders = this.configuration.customShaders;\r\n // Inject all the spectre shader in the babylon shader store.\r\n if (!customShaders) {\r\n return;\r\n }\r\n if (customShaders.shaders) {\r\n Object.keys(customShaders.shaders).forEach((key) => {\r\n // typescript considers a callback \"unsafe\", so... '!'\r\n Effect.ShadersStore[key] = customShaders!.shaders![key];\r\n });\r\n }\r\n if (customShaders.includes) {\r\n Object.keys(customShaders.includes).forEach((key) => {\r\n // typescript considers a callback \"unsafe\", so... '!'\r\n Effect.IncludesShadersStore[key] = customShaders!.includes![key];\r\n });\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../../tools/viewer/src/viewer/viewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"core/Engines/engine\";\r\nimport type { ISceneLoaderPlugin, ISceneLoaderPluginAsync, ISceneLoaderProgressEvent } from \"core/Loading/sceneLoader\";\r\nimport { SceneLoader } from \"core/Loading/sceneLoader\";\r\nimport type { Observable } from \"core/Misc/observable\";\r\nimport type { Scene } from \"core/scene\";\r\nimport { RenderingManager } from \"core/Rendering/renderingManager\";\r\nimport type { TargetCamera } from \"core/Cameras/targetCamera\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { Effect } from \"core/Materials/effect\";\r\nimport { processConfigurationCompatibility } from \"../configuration/configurationCompatibility\";\r\nimport { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport { viewerGlobals } from \"../configuration/globals\";\r\nimport { RenderOnlyConfigurationLoader } from \"../configuration/renderOnlyLoader\";\r\n// eslint-disable-next-line import/no-internal-modules\r\nimport { deepmerge } from \"../helper/index\";\r\nimport { ModelLoader } from \"../loader/modelLoader\";\r\nimport { ObservablesManager } from \"../managers/observablesManager\";\r\nimport { SceneManager } from \"../managers/sceneManager\";\r\nimport { telemetryManager } from \"../managers/telemetryManager\";\r\nimport type { ViewerModel } from \"../model/viewerModel\";\r\nimport { viewerManager } from \"./viewerManager\";\r\nimport type { ViewerConfiguration } from \"../configuration/configuration\";\r\nimport type { IObserversConfiguration } from \"../configuration/interfaces/observersConfiguration\";\r\nimport type { IModelConfiguration } from \"../configuration/interfaces/modelConfiguration\";\r\nimport type { GLTFFileLoader } from \"loaders/glTF/glTFFileLoader\";\r\nimport \"core/Misc/observable.extensions\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/**\r\n * The AbstractViewer is the center of Babylon's viewer.\r\n * It is the basic implementation of the default viewer and is responsible of loading and showing the model and the templates\r\n */\r\nexport abstract class AbstractViewer {\r\n /**\r\n * Babylon Engine corresponding with this viewer\r\n */\r\n public engine: Engine;\r\n /**\r\n * The ID of this viewer. it will be generated randomly or use the HTML Element's ID.\r\n */\r\n public readonly baseId: string;\r\n\r\n /**\r\n * The last loader used to load a model.\r\n * @deprecated\r\n */\r\n public lastUsedLoader: ISceneLoaderPlugin | ISceneLoaderPluginAsync;\r\n /**\r\n * The ModelLoader instance connected with this viewer.\r\n */\r\n public modelLoader: ModelLoader;\r\n\r\n /**\r\n * A flag that controls whether or not the render loop should be executed\r\n */\r\n public runRenderLoop: boolean = true;\r\n\r\n /**\r\n * The scene manager connected with this viewer instance\r\n */\r\n public sceneManager: SceneManager;\r\n\r\n // observables\r\n /**\r\n * Will notify when the scene was initialized\r\n */\r\n public get onSceneInitObservable(): Observable<Scene> {\r\n return this.observablesManager.onSceneInitObservable;\r\n }\r\n /**\r\n * will notify when the engine was initialized\r\n */\r\n public get onEngineInitObservable(): Observable<Engine> {\r\n return this.observablesManager.onEngineInitObservable;\r\n }\r\n\r\n /**\r\n * Will notify when a new model was added to the scene.\r\n * Note that added does not necessarily mean loaded!\r\n */\r\n public get onModelAddedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelAddedObservable;\r\n }\r\n /**\r\n * will notify after every model load\r\n */\r\n public get onModelLoadedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelLoadedObservable;\r\n }\r\n /**\r\n * will notify when any model notify of progress\r\n */\r\n public get onModelLoadProgressObservable(): Observable<ISceneLoaderProgressEvent> {\r\n return this.observablesManager.onModelLoadProgressObservable;\r\n }\r\n /**\r\n * will notify when any model load failed.\r\n */\r\n public get onModelLoadErrorObservable(): Observable<{ message: string; exception: any }> {\r\n return this.observablesManager.onModelLoadErrorObservable;\r\n }\r\n /**\r\n * Will notify when a model was removed from the scene;\r\n */\r\n public get onModelRemovedObservable(): Observable<ViewerModel> {\r\n return this.observablesManager.onModelRemovedObservable;\r\n }\r\n /**\r\n * will notify when a new loader was initialized.\r\n * Used mainly to know when a model starts loading.\r\n */\r\n public get onLoaderInitObservable(): Observable<ISceneLoaderPlugin | ISceneLoaderPluginAsync> {\r\n return this.observablesManager.onLoaderInitObservable;\r\n }\r\n /**\r\n * Observers registered here will be executed when the entire load process has finished.\r\n */\r\n public get onInitDoneObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onViewerInitDoneObservable;\r\n }\r\n\r\n /**\r\n * Functions added to this observable will be executed on each frame rendered.\r\n */\r\n public get onFrameRenderedObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onFrameRenderedObservable;\r\n }\r\n\r\n /**\r\n * Observers registered here will be executed when VR more is entered.\r\n */\r\n public get onEnteringVRObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onEnteringVRObservable;\r\n }\r\n /**\r\n * Observers registered here will be executed when VR mode is exited.\r\n */\r\n public get onExitingVRObservable(): Observable<AbstractViewer> {\r\n return this.observablesManager.onExitingVRObservable;\r\n }\r\n\r\n public observablesManager: ObservablesManager;\r\n\r\n /**\r\n * The canvas associated with this viewer\r\n */\r\n protected _canvas: HTMLCanvasElement;\r\n\r\n /**\r\n * The (single) canvas of this viewer\r\n */\r\n public get canvas(): HTMLCanvasElement {\r\n return this._canvas;\r\n }\r\n\r\n /**\r\n * is this viewer disposed?\r\n */\r\n protected _isDisposed: boolean = false;\r\n\r\n /**\r\n * registered onBeforeRender functions.\r\n * This functions are also registered at the native scene. The reference can be used to unregister them.\r\n */\r\n protected _registeredOnBeforeRenderFunctions: Array<() => void>;\r\n /**\r\n * The configuration loader of this viewer\r\n */\r\n protected _configurationLoader: RenderOnlyConfigurationLoader;\r\n\r\n /**\r\n * Is the viewer already initialized. for internal use.\r\n */\r\n protected _isInit: boolean;\r\n\r\n protected _configurationContainer: ConfigurationContainer;\r\n\r\n public get configurationContainer() {\r\n return this._configurationContainer;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n protected getConfigurationLoader() {\r\n return new RenderOnlyConfigurationLoader();\r\n }\r\n\r\n constructor(\r\n public containerElement: Element,\r\n initialConfiguration: ViewerConfiguration = {}\r\n ) {\r\n // if exists, use the container id. otherwise, generate a random string.\r\n if (containerElement.id) {\r\n this.baseId = containerElement.id;\r\n } else {\r\n this.baseId = containerElement.id = \"bjs\" + Math.random().toString(32).substring(2, 10);\r\n }\r\n\r\n this._registeredOnBeforeRenderFunctions = [];\r\n\r\n this._configurationContainer = new ConfigurationContainer();\r\n\r\n this.observablesManager = new ObservablesManager();\r\n\r\n this.modelLoader = new ModelLoader(this.observablesManager, this._configurationContainer);\r\n\r\n RenderingManager.AUTOCLEAR = false;\r\n\r\n // extend the configuration\r\n this._configurationLoader = this.getConfigurationLoader();\r\n this._configurationLoader.loadConfiguration(initialConfiguration, (configuration) => {\r\n this._onConfigurationLoaded(configuration);\r\n });\r\n\r\n this.onSceneInitObservable.add(() => {\r\n this.updateConfiguration();\r\n });\r\n\r\n this.onInitDoneObservable.add(() => {\r\n this._isInit = true;\r\n this.engine.runRenderLoop(this._render);\r\n });\r\n\r\n this._prepareContainerElement();\r\n\r\n // add this viewer to the viewer manager\r\n viewerManager.addViewer(this);\r\n }\r\n\r\n /**\r\n * get the baseId of this viewer\r\n * @returns the baseId of this viewer\r\n */\r\n public getBaseId(): string {\r\n return this.baseId;\r\n }\r\n\r\n /**\r\n * Do we have a canvas to render on, and is it a part of the scene\r\n * @returns true if the canvas is in the DOM\r\n */\r\n public isCanvasInDOM(): boolean {\r\n return !!this._canvas && !!this._canvas.parentElement;\r\n }\r\n\r\n /**\r\n * Is the engine currently set to render even when the page is in background\r\n */\r\n public get renderInBackground() {\r\n return this.engine && this.engine.renderEvenInBackground;\r\n }\r\n\r\n /**\r\n * Set the viewer's background rendering flag.\r\n */\r\n public set renderInBackground(value: boolean) {\r\n if (this.engine) {\r\n this.engine.renderEvenInBackground = value;\r\n }\r\n }\r\n\r\n /**\r\n * Get the configuration object. This is a reference only.\r\n * The configuration can ONLY be updated using the updateConfiguration function.\r\n * changing this object will have no direct effect on the scene.\r\n */\r\n public get configuration(): ViewerConfiguration {\r\n return this._configurationContainer.configuration;\r\n }\r\n\r\n /**\r\n * force resizing the engine.\r\n */\r\n public forceResize() {\r\n this._resize();\r\n }\r\n\r\n protected _hdToggled: boolean = false;\r\n\r\n public toggleHD() {\r\n this._hdToggled = !this._hdToggled;\r\n\r\n const scale = this._hdToggled ? Math.max(0.5, 1 / (window.devicePixelRatio || 2)) : 1;\r\n\r\n this.engine.setHardwareScalingLevel(scale);\r\n }\r\n\r\n protected _vrToggled: boolean = false;\r\n private _vrModelRepositioning: number = 0;\r\n protected _vrScale: number = 1;\r\n\r\n protected _vrInit: boolean = false;\r\n\r\n public toggleVR() {\r\n if (!this._vrInit) {\r\n this._initVR();\r\n }\r\n\r\n if (this.sceneManager.vrHelper && !this.sceneManager.vrHelper.isInVRMode) {\r\n // make sure the floor is set\r\n if (this.sceneManager.environmentHelper && this.sceneManager.environmentHelper.ground) {\r\n this.sceneManager.vrHelper.addFloorMesh(this.sceneManager.environmentHelper.ground);\r\n }\r\n\r\n this._vrToggled = true;\r\n this.sceneManager.vrHelper.enterVR();\r\n\r\n // position the vr camera to be in front of the object or wherever the user has configured it to be\r\n if (this.sceneManager.vrHelper.currentVRCamera && this.sceneManager.vrHelper.currentVRCamera !== this.sceneManager.camera) {\r\n if (this.configuration.vr && this.configuration.vr.cameraPosition !== undefined) {\r\n this.sceneManager.vrHelper.currentVRCamera.position.copyFromFloats(\r\n this.configuration.vr.cameraPosition.x,\r\n this.configuration.vr.cameraPosition.y,\r\n this.configuration.vr.cameraPosition.z\r\n );\r\n } else {\r\n this.sceneManager.vrHelper.currentVRCamera.position.copyFromFloats(0, this.sceneManager.vrHelper.currentVRCamera.position.y, -1);\r\n }\r\n (<TargetCamera>this.sceneManager.vrHelper.currentVRCamera).rotationQuaternion &&\r\n (<TargetCamera>this.sceneManager.vrHelper.currentVRCamera).rotationQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // set the height of the model to be what the user has configured, or floating by default\r\n if (this.configuration.vr && this.configuration.vr.modelHeightCorrection !== undefined) {\r\n if (typeof this.configuration.vr.modelHeightCorrection === \"number\") {\r\n this._vrModelRepositioning = this.configuration.vr.modelHeightCorrection;\r\n } else if (this.configuration.vr.modelHeightCorrection) {\r\n this._vrModelRepositioning = this.sceneManager.vrHelper.currentVRCamera.position.y / 2;\r\n } else {\r\n this._vrModelRepositioning = 0;\r\n }\r\n }\r\n\r\n // scale the model\r\n if (this.sceneManager.models.length) {\r\n const boundingVectors = this.sceneManager.models[0].rootMesh.getHierarchyBoundingVectors();\r\n const sizeVec = boundingVectors.max.subtract(boundingVectors.min);\r\n const maxDimension = Math.max(sizeVec.x, sizeVec.y, sizeVec.z);\r\n this._vrScale = 1 / maxDimension;\r\n if (this.configuration.vr && this.configuration.vr.objectScaleFactor) {\r\n this._vrScale *= this.configuration.vr.objectScaleFactor;\r\n }\r\n\r\n this.sceneManager.models[0].rootMesh.scaling.scaleInPlace(this._vrScale);\r\n\r\n // reposition the object to \"float\" in front of the user\r\n this.sceneManager.models[0].rootMesh.position.y += this._vrModelRepositioning;\r\n this.sceneManager.models[0].rootMesh.rotationQuaternion = null;\r\n }\r\n\r\n // scale the environment to match the model\r\n if (this.sceneManager.environmentHelper) {\r\n this.sceneManager.environmentHelper.ground && this.sceneManager.environmentHelper.ground.scaling.scaleInPlace(this._vrScale);\r\n this.sceneManager.environmentHelper.skybox && this.sceneManager.environmentHelper.skybox.scaling.scaleInPlace(this._vrScale);\r\n }\r\n\r\n // post processing\r\n if (this.sceneManager.defaultRenderingPipelineEnabled && this.sceneManager.defaultRenderingPipeline) {\r\n this.sceneManager.defaultRenderingPipeline.imageProcessingEnabled = false;\r\n this.sceneManager.defaultRenderingPipeline.prepare();\r\n }\r\n } else {\r\n this._vrModelRepositioning = 0;\r\n }\r\n } else {\r\n if (this.sceneManager.vrHelper) {\r\n this.sceneManager.vrHelper.exitVR();\r\n }\r\n }\r\n }\r\n\r\n protected _initVR() {\r\n if (this.sceneManager.vrHelper) {\r\n this.observablesManager.onExitingVRObservable.add(() => {\r\n if (this._vrToggled) {\r\n this._vrToggled = false;\r\n\r\n // undo the scaling of the model\r\n if (this.sceneManager.models.length) {\r\n this.sceneManager.models[0].rootMesh.scaling.scaleInPlace(1 / this._vrScale);\r\n this.sceneManager.models[0].rootMesh.position.y -= this._vrModelRepositioning;\r\n }\r\n\r\n // undo the scaling of the environment\r\n if (this.sceneManager.environmentHelper) {\r\n this.sceneManager.environmentHelper.ground && this.sceneManager.environmentHelper.ground.scaling.scaleInPlace(1 / this._vrScale);\r\n this.sceneManager.environmentHelper.skybox && this.sceneManager.environmentHelper.skybox.scaling.scaleInPlace(1 / this._vrScale);\r\n }\r\n\r\n // post processing\r\n if (this.sceneManager.defaultRenderingPipelineEnabled && this.sceneManager.defaultRenderingPipeline) {\r\n this.sceneManager.defaultRenderingPipeline.imageProcessingEnabled = true;\r\n this.sceneManager.defaultRenderingPipeline.prepare();\r\n }\r\n\r\n // clear set height and width\r\n this.canvas.removeAttribute(\"height\");\r\n this.canvas.removeAttribute(\"width\");\r\n this.engine.resize();\r\n }\r\n });\r\n }\r\n\r\n this._vrInit = true;\r\n }\r\n\r\n /**\r\n * The resize function that will be registered with the window object\r\n */\r\n protected _resize = (): void => {\r\n // Only resize if Canvas is in the DOM\r\n if (!this.isCanvasInDOM()) {\r\n return;\r\n }\r\n\r\n if (this.canvas.clientWidth <= 0 || this.canvas.clientHeight <= 0) {\r\n return;\r\n }\r\n\r\n if (this.configuration.engine && this.configuration.engine.disableResize) {\r\n return;\r\n }\r\n\r\n this.engine.resize();\r\n };\r\n\r\n protected _onConfigurationLoaded(configuration: ViewerConfiguration) {\r\n this._configurationContainer.configuration = deepmerge(this.configuration || {}, configuration);\r\n if (this.configuration.observers) {\r\n this._configureObservers(this.configuration.observers);\r\n }\r\n // TODO remove this after testing, as this is done in the updateConfiguration as well.\r\n if (this.configuration.loaderPlugins) {\r\n Object.keys(this.configuration.loaderPlugins).forEach((name) => {\r\n if (this.configuration.loaderPlugins && this.configuration.loaderPlugins[name]) {\r\n this.modelLoader.addPlugin(name);\r\n }\r\n });\r\n }\r\n\r\n this.observablesManager.onViewerInitStartedObservable.notifyObservers(this);\r\n }\r\n\r\n /**\r\n * Force a single render loop execution.\r\n */\r\n public forceRender() {\r\n this._render(true);\r\n }\r\n\r\n /**\r\n * render loop that will be executed by the engine\r\n * @param force\r\n */\r\n protected _render = (force: boolean = false): void => {\r\n if (force || (this.sceneManager.scene && this.sceneManager.scene.activeCamera)) {\r\n if (this.runRenderLoop || force) {\r\n this.engine.performanceMonitor.enable();\r\n this.sceneManager.scene.render();\r\n this.onFrameRenderedObservable.notifyObservers(this);\r\n } else {\r\n this.engine.performanceMonitor.disable();\r\n\r\n // update camera instead of rendering\r\n this.sceneManager.scene.activeCamera && this.sceneManager.scene.activeCamera.update();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Takes a screenshot of the scene and returns it as a base64 encoded png.\r\n * @param callback optional callback that will be triggered when screenshot is done.\r\n * @param width Optional screenshot width (default to 512).\r\n * @param height Optional screenshot height (default to 512).\r\n * @returns a promise with the screenshot data\r\n */\r\n public takeScreenshot(callback?: (data: string) => void, width = 0, height = 0): Promise<string> {\r\n width = width || this.canvas.clientWidth;\r\n height = height || this.canvas.clientHeight;\r\n\r\n // Create the screenshot\r\n return new Promise<string>((resolve, reject) => {\r\n try {\r\n Tools.CreateScreenshot(this.engine, this.sceneManager.camera, { width, height }, (data) => {\r\n if (callback) {\r\n callback(data);\r\n }\r\n resolve(data);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the current viewer configuration with new values.\r\n * Only provided information will be updated, old configuration values will be kept.\r\n * If this.configuration was manually changed, you can trigger this function with no parameters,\r\n * and the entire configuration will be updated.\r\n * @param newConfiguration the partial configuration to update or a URL to a JSON holding the updated configuration\r\n *\r\n */\r\n public updateConfiguration(newConfiguration: Partial<ViewerConfiguration> | string = this.configuration) {\r\n if (typeof newConfiguration === \"string\") {\r\n Tools.LoadFile(\r\n newConfiguration,\r\n (data) => {\r\n try {\r\n const newData = JSON.parse(data.toString()) as ViewerConfiguration;\r\n return this.updateConfiguration(newData);\r\n } catch (e) {\r\n Logger.Log(\"Error parsing file \" + newConfiguration);\r\n }\r\n },\r\n undefined,\r\n undefined,\r\n undefined,\r\n (error) => {\r\n Logger.Log([\"Error parsing file \" + newConfiguration, error]);\r\n }\r\n );\r\n } else {\r\n //backcompat\r\n processConfigurationCompatibility(newConfiguration);\r\n // update this.configuration with the new data\r\n this._configurationContainer.configuration = deepmerge(this.configuration || {}, newConfiguration);\r\n\r\n this.sceneManager.updateConfiguration(newConfiguration);\r\n\r\n // observers in configuration\r\n if (newConfiguration.observers) {\r\n this._configureObservers(newConfiguration.observers);\r\n }\r\n\r\n if (newConfiguration.loaderPlugins) {\r\n Object.keys(newConfiguration.loaderPlugins).forEach((name) => {\r\n if (newConfiguration.loaderPlugins && newConfiguration.loaderPlugins[name]) {\r\n this.modelLoader.addPlugin(name);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * this is used to register native functions using the configuration object.\r\n * This will configure the observers.\r\n * @param observersConfiguration observers configuration\r\n */\r\n protected _configureObservers(observersConfiguration: IObserversConfiguration) {\r\n if (observersConfiguration.onEngineInit) {\r\n this.onEngineInitObservable.add((window as any)[observersConfiguration.onEngineInit]);\r\n } else {\r\n if (observersConfiguration.onEngineInit === \"\" && this.configuration.observers && this.configuration.observers!.onEngineInit) {\r\n this.onEngineInitObservable.removeCallback((window as any)[this.configuration.observers!.onEngineInit!]);\r\n }\r\n }\r\n if (observersConfiguration.onSceneInit) {\r\n this.onSceneInitObservable.add((window as any)[observersConfiguration.onSceneInit]);\r\n } else {\r\n if (observersConfiguration.onSceneInit === \"\" && this.configuration.observers && this.configuration.observers!.onSceneInit) {\r\n this.onSceneInitObservable.removeCallback((window as any)[this.configuration.observers!.onSceneInit!]);\r\n }\r\n }\r\n if (observersConfiguration.onModelLoaded) {\r\n this.onModelLoadedObservable.add((window as any)[observersConfiguration.onModelLoaded]);\r\n } else {\r\n if (observersConfiguration.onModelLoaded === \"\" && this.configuration.observers && this.configuration.observers!.onModelLoaded) {\r\n this.onModelLoadedObservable.removeCallback((window as any)[this.configuration.observers!.onModelLoaded!]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Dispose the entire viewer including the scene and the engine\r\n */\r\n public dispose() {\r\n if (this._isDisposed) {\r\n return;\r\n }\r\n window.removeEventListener(\"resize\", this._resize);\r\n\r\n if (this.sceneManager) {\r\n if (this.sceneManager.scene && this.sceneManager.scene.activeCamera) {\r\n this.sceneManager.scene.activeCamera.detachControl();\r\n }\r\n this.sceneManager.dispose();\r\n }\r\n\r\n this._fpsTimeoutInterval && clearInterval(this._fpsTimeoutInterval);\r\n\r\n this.observablesManager.dispose();\r\n\r\n this.modelLoader.dispose();\r\n\r\n if (this.engine) {\r\n this.engine.dispose();\r\n }\r\n\r\n viewerManager.removeViewer(this);\r\n this._isDisposed = true;\r\n }\r\n\r\n /**\r\n * This will prepare the container element for the viewer\r\n */\r\n protected abstract _prepareContainerElement(): void;\r\n\r\n /**\r\n * This function will execute when the HTML templates finished initializing.\r\n * It should initialize the engine and continue execution.\r\n *\r\n * @returns The viewer object will be returned after the object was loaded.\r\n */\r\n protected _onTemplatesLoaded(): Promise<AbstractViewer> {\r\n return Promise.resolve(this);\r\n }\r\n\r\n /**\r\n * This will force the creation of an engine and a scene.\r\n * It will also load a model if preconfigured.\r\n * But first - it will load the extendible onTemplateLoaded()!\r\n * @returns A promise that will resolve when the template was loaded\r\n */\r\n protected _onTemplateLoaded(): Promise<AbstractViewer> {\r\n // check if viewer was disposed right after created\r\n if (this._isDisposed) {\r\n return Promise.reject(\"viewer was disposed\");\r\n }\r\n return this._onTemplatesLoaded().then(() => {\r\n const autoLoad = typeof this.configuration.model === \"string\" || (this.configuration.model && this.configuration.model.url);\r\n return this._initEngine()\r\n .then((engine) => {\r\n return this.onEngineInitObservable.notifyObserversWithPromise(engine);\r\n })\r\n .then(() => {\r\n this._initTelemetryEvents();\r\n if (autoLoad) {\r\n return this.loadModel(this.configuration.model!)\r\n .catch(() => {})\r\n .then(() => {\r\n return this.sceneManager.scene;\r\n });\r\n } else {\r\n return this.sceneManager.scene || this.sceneManager.initScene(this.configuration.scene);\r\n }\r\n })\r\n .then(() => {\r\n return this.onInitDoneObservable.notifyObserversWithPromise(this);\r\n })\r\n .catch((e) => {\r\n Tools.Warn(e.toString());\r\n return this;\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Initialize the engine. Returns a promise in case async calls are needed.\r\n *\r\n * @protected\r\n * @returns {Promise<Engine>}\r\n * @memberof Viewer\r\n */\r\n protected _initEngine(): Promise<Engine> {\r\n // init custom shaders\r\n this._injectCustomShaders();\r\n\r\n //let canvasElement = this.templateManager.getCanvas();\r\n if (!this.canvas) {\r\n return Promise.reject(\"Canvas element not found!\");\r\n }\r\n const config = this.configuration.engine || {};\r\n // TDO enable further configuration\r\n\r\n // check for webgl2 support, force-disable if needed.\r\n if (viewerGlobals.disableWebGL2Support) {\r\n config.engineOptions = config.engineOptions || {};\r\n config.engineOptions.disableWebGL2Support = true;\r\n }\r\n\r\n if (this.configuration[\"3dCommerceCertified\"]) {\r\n config.engineOptions = config.engineOptions || {};\r\n config.engineOptions.forceSRGBBufferSupportState = true;\r\n const loader = SceneLoader.GetPluginForExtension(\".gltf\");\r\n if (loader) {\r\n (loader as GLTFFileLoader).transparencyAsCoverage = true;\r\n }\r\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\r\n if (plugin.name === \"gltf\") {\r\n const loader = plugin as GLTFFileLoader;\r\n loader.transparencyAsCoverage = true;\r\n }\r\n });\r\n }\r\n\r\n this.engine = new Engine(this.canvas, !!config.antialiasing, config.engineOptions);\r\n\r\n if (!config.disableResize) {\r\n window.addEventListener(\"resize\", this._resize);\r\n }\r\n\r\n if (this.configuration.engine) {\r\n if (this.configuration.engine.adaptiveQuality) {\r\n const scale = Math.max(0.5, 1 / (window.devicePixelRatio || 2));\r\n this.engine.setHardwareScalingLevel(scale);\r\n }\r\n if (this.configuration.engine.hdEnabled) {\r\n this.toggleHD();\r\n }\r\n }\r\n\r\n // create a new template manager for this viewer\r\n this.sceneManager = new SceneManager(this.engine, this._configurationContainer, this.observablesManager);\r\n\r\n return Promise.resolve(this.engine);\r\n }\r\n\r\n private _isLoading: boolean;\r\n\r\n /**\r\n * Initialize a model loading. The returned object (a ViewerModel object) will be loaded in the background.\r\n * The difference between this and loadModel is that loadModel will fulfill the promise when the model finished loading.\r\n *\r\n * @param modelConfig model configuration to use when loading the model.\r\n * @param clearScene should the scene be cleared before loading this model\r\n * @returns a ViewerModel object that is not yet fully loaded.\r\n */\r\n public initModel(modelConfig: string | File | IModelConfiguration, clearScene: boolean = true): ViewerModel {\r\n let configuration: IModelConfiguration;\r\n if (typeof modelConfig === \"string\") {\r\n configuration = {\r\n url: modelConfig,\r\n };\r\n } else if (modelConfig instanceof File) {\r\n configuration = {\r\n file: modelConfig,\r\n root: \"file:\",\r\n };\r\n } else {\r\n configuration = modelConfig;\r\n }\r\n\r\n if (!configuration.url && !configuration.file) {\r\n throw new Error(\"no model provided\");\r\n }\r\n\r\n if (clearScene) {\r\n this.sceneManager.clearScene(true, false);\r\n }\r\n\r\n //merge the configuration for future models:\r\n if (this.configuration.model && typeof this.configuration.model === \"object\") {\r\n const globalConfig = deepmerge({}, this.configuration.model);\r\n configuration = deepmerge(globalConfig, configuration);\r\n if (modelConfig instanceof File) {\r\n configuration.file = modelConfig;\r\n }\r\n } else {\r\n this.configuration.model = configuration;\r\n }\r\n\r\n this._isLoading = true;\r\n\r\n const model = this.modelLoader.load(configuration);\r\n\r\n this.lastUsedLoader = model.loader;\r\n model.onLoadErrorObservable.add((errorObject) => {\r\n this.onModelLoadErrorObservable.notifyObserversWithPromise(errorObject);\r\n });\r\n model.onLoadProgressObservable.add((progressEvent) => {\r\n this.onModelLoadProgressObservable.notifyObserversWithPromise(progressEvent);\r\n });\r\n this.onLoaderInitObservable.notifyObserversWithPromise(this.lastUsedLoader);\r\n\r\n model.onLoadedObservable.add(() => {\r\n this._isLoading = false;\r\n });\r\n\r\n return model;\r\n }\r\n\r\n /**\r\n * load a model using the provided configuration.\r\n * This function, as opposed to initModel, will return a promise that resolves when the model is loaded, and rejects with error.\r\n * If you want to attach to the observables of the model, use initModel instead.\r\n *\r\n * @param modelConfig the model configuration or URL to load.\r\n * @param clearScene Should the scene be cleared before loading the model\r\n * @returns a Promise the fulfills when the model finished loading successfully.\r\n */\r\n public loadModel(modelConfig: string | File | IModelConfiguration, clearScene: boolean = true): Promise<ViewerModel> {\r\n if (this._isLoading) {\r\n // We can decide here whether or not to cancel the lst load, but the developer can do that.\r\n return Promise.reject(\"another model is curently being loaded.\");\r\n }\r\n\r\n return Promise.resolve(this.sceneManager.scene)\r\n .then((scene) => {\r\n if (!scene) {\r\n return this.sceneManager.initScene(this.configuration.scene);\r\n }\r\n return scene;\r\n })\r\n .then(() => {\r\n const model = this.initModel(modelConfig, clearScene);\r\n return new Promise<ViewerModel>((resolve, reject) => {\r\n // at this point, configuration.model is an object, not a string\r\n model.onLoadedObservable.add(() => {\r\n resolve(model);\r\n });\r\n model.onLoadErrorObservable.add((error) => {\r\n reject(error);\r\n });\r\n });\r\n });\r\n }\r\n\r\n private _fpsTimeoutInterval: number;\r\n\r\n protected _initTelemetryEvents() {\r\n telemetryManager.broadcast(\"Engine Capabilities\", this.baseId, this.engine.getCaps());\r\n telemetryManager.broadcast(\"Platform Details\", this.baseId, {\r\n userAgent: navigator.userAgent,\r\n platform: navigator.platform,\r\n });\r\n\r\n telemetryManager.flushWebGLErrors(this.engine, this.baseId);\r\n\r\n const trackFPS: Function = () => {\r\n telemetryManager.broadcast(\"Current FPS\", this.baseId, { fps: this.engine.getFps() });\r\n };\r\n\r\n trackFPS();\r\n // Track the FPS again after 60 seconds\r\n this._fpsTimeoutInterval = window.setInterval(trackFPS, 60 * 1000);\r\n }\r\n\r\n /**\r\n * Injects all the spectre shader in the babylon shader store\r\n */\r\n protected _injectCustomShaders(): void {\r\n const customShaders = this.configuration.customShaders;\r\n // Inject all the spectre shader in the babylon shader store.\r\n if (!customShaders) {\r\n return;\r\n }\r\n if (customShaders.shaders) {\r\n Object.keys(customShaders.shaders).forEach((key) => {\r\n // typescript considers a callback \"unsafe\", so... '!'\r\n Effect.ShadersStore[key] = customShaders!.shaders![key];\r\n });\r\n }\r\n if (customShaders.includes) {\r\n Object.keys(customShaders.includes).forEach((key) => {\r\n // typescript considers a callback \"unsafe\", so... '!'\r\n Effect.IncludesShadersStore[key] = customShaders!.includes![key];\r\n });\r\n }\r\n }\r\n}\r\n"]}