@babylonjs/viewer 5.45.2 → 5.47.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.
@@ -35,11 +35,11 @@ export interface PBREnvironment {
35
35
  /**
36
36
  * Environment map representations: layouts, projections and approximations
37
37
  */
38
- export declare type MapType = "irradiance_sh_coefficients_9" | "cubemap_faces";
38
+ export type MapType = "irradiance_sh_coefficients_9" | "cubemap_faces";
39
39
  /**
40
40
  * Image type used for environment map
41
41
  */
42
- export declare type ImageType = "png";
42
+ export type ImageType = "png";
43
43
  /**
44
44
  * A generic field in JSON that report's its type
45
45
  */
@@ -88,11 +88,11 @@ export interface ImageSet<T> extends TypedObject<MapType> {
88
88
  /**
89
89
  * A set of cubemap faces
90
90
  */
91
- export declare type CubemapFaces = ImageSet<Array<ByteRange>>;
91
+ export type CubemapFaces = ImageSet<Array<ByteRange>>;
92
92
  /**
93
93
  * A single image containing an atlas of equirectangular-projection maps across all mip levels
94
94
  */
95
- export declare type EquirectangularMipmapAtlas = ImageSet<ByteRange>;
95
+ export type EquirectangularMipmapAtlas = ImageSet<ByteRange>;
96
96
  /**
97
97
  * A static class proving methods to aid parsing Spectre environment files
98
98
  */
@@ -70,7 +70,7 @@ var EnvironmentDeserializer = /** @class */ (function () {
70
70
  switch (descriptor.specular.type) {
71
71
  case "cubemap_faces": {
72
72
  var specularDescriptor = descriptor.specular;
73
- var specularTexture = (environment.specularTexture = new TextureCube(6408 /* RGBA */, 5121 /* UNSIGNED_BYTE */));
73
+ var specularTexture = (environment.specularTexture = new TextureCube(6408 /* PixelFormat.RGBA */, 5121 /* PixelType.UNSIGNED_BYTE */));
74
74
  environment.textureIntensityScale = specularDescriptor.multiplier != null ? specularDescriptor.multiplier : 1.0;
75
75
  var mipmaps = specularDescriptor.mipmaps;
76
76
  var imageType = specularDescriptor.imageType;
@@ -1 +1 @@
1
- {"version":3,"file":"environmentSerializer.js","sourceRoot":"","sources":["../../../../tools/viewer/src/labs/environmentSerializer.ts"],"names":[],"mappings":"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AAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAEhI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAEhI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClG,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Vector3 } from \"core/Maths/math\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { TextureCube, PixelFormat, PixelType } from \"./texture\";\r\n\r\n/**\r\n * Spherical polynomial coefficients (counter part to spherical harmonic coefficients used in shader irradiance calculation)\r\n * @ignoreChildren\r\n */\r\nexport interface SphericalPolynomalCoefficients {\r\n x: Vector3;\r\n y: Vector3;\r\n z: Vector3;\r\n xx: Vector3;\r\n yy: Vector3;\r\n zz: Vector3;\r\n yz: Vector3;\r\n zx: Vector3;\r\n xy: Vector3;\r\n}\r\n\r\n/**\r\n * Wraps data and maps required for environments with physically based rendering\r\n */\r\nexport interface PBREnvironment {\r\n /**\r\n * Spherical Polynomial Coefficients representing an irradiance map\r\n */\r\n irradiancePolynomialCoefficients: SphericalPolynomalCoefficients;\r\n\r\n /**\r\n * Specular cubemap\r\n */\r\n specularTexture?: TextureCube;\r\n /**\r\n * A scale factor applied to RGB values after reading from environment maps\r\n */\r\n textureIntensityScale: number;\r\n}\r\n\r\n/**\r\n * Environment map representations: layouts, projections and approximations\r\n */\r\nexport type MapType = \"irradiance_sh_coefficients_9\" | \"cubemap_faces\";\r\n\r\n/**\r\n * Image type used for environment map\r\n */\r\nexport type ImageType = \"png\";\r\n\r\n//Payload Descriptor\r\n\r\n/**\r\n * A generic field in JSON that report's its type\r\n */\r\nexport interface TypedObject<T> {\r\n type: T;\r\n}\r\n\r\n/**\r\n * Describes a range of bytes starting at byte pos (inclusive) and finishing at byte pos + length - 1\r\n */\r\nexport interface ByteRange {\r\n pos: number;\r\n length: number;\r\n}\r\n\r\n/**\r\n * Complete Spectre Environment JSON Descriptor\r\n */\r\nexport interface EnvJsonDescriptor {\r\n radiance: TypedObject<MapType>;\r\n irradiance: TypedObject<MapType>;\r\n specular: TypedObject<MapType>;\r\n}\r\n\r\n/**\r\n * Spherical harmonic coefficients to provide an irradiance map\r\n */\r\nexport interface IrradianceSHCoefficients9 extends TypedObject<MapType> {\r\n l00: Array<number>;\r\n\r\n l1_1: Array<number>;\r\n l10: Array<number>;\r\n l11: Array<number>;\r\n\r\n l2_2: Array<number>;\r\n l2_1: Array<number>;\r\n l20: Array<number>;\r\n l21: Array<number>;\r\n l22: Array<number>;\r\n}\r\n\r\n/**\r\n * A generic set of images, where the image content is specified by byte ranges in the mipmaps field\r\n */\r\nexport interface ImageSet<T> extends TypedObject<MapType> {\r\n imageType: ImageType;\r\n width: number;\r\n height: number;\r\n mipmaps: Array<T>;\r\n multiplier: number;\r\n}\r\n\r\n/**\r\n * A set of cubemap faces\r\n */\r\nexport type CubemapFaces = ImageSet<Array<ByteRange>>;\r\n\r\n/**\r\n * A single image containing an atlas of equirectangular-projection maps across all mip levels\r\n */\r\nexport type EquirectangularMipmapAtlas = ImageSet<ByteRange>;\r\n\r\n/**\r\n * A static class proving methods to aid parsing Spectre environment files\r\n */\r\nexport class EnvironmentDeserializer {\r\n /**\r\n * Parses an arraybuffer into a new PBREnvironment object\r\n * @param arrayBuffer The arraybuffer of the Spectre environment file\r\n * @returns a PBREnvironment object\r\n */\r\n public static Parse(arrayBuffer: ArrayBuffer): PBREnvironment {\r\n const environment: PBREnvironment = {\r\n //irradiance\r\n irradiancePolynomialCoefficients: {\r\n x: new Vector3(0, 0, 0),\r\n y: new Vector3(0, 0, 0),\r\n z: new Vector3(0, 0, 0),\r\n xx: new Vector3(0, 0, 0),\r\n yy: new Vector3(0, 0, 0),\r\n zz: new Vector3(0, 0, 0),\r\n yz: new Vector3(0, 0, 0),\r\n zx: new Vector3(0, 0, 0),\r\n xy: new Vector3(0, 0, 0),\r\n },\r\n\r\n //specular\r\n textureIntensityScale: 1.0,\r\n };\r\n\r\n //read .env\r\n const littleEndian = false;\r\n\r\n const magicBytes = [0x86, 0x16, 0x87, 0x96, 0xf6, 0xd6, 0x96, 0x36];\r\n\r\n const dataView = new DataView(arrayBuffer);\r\n let pos = 0;\r\n\r\n for (let i = 0; i < magicBytes.length; i++) {\r\n if (dataView.getUint8(pos++) !== magicBytes[i]) {\r\n Tools.Error(\"Not a Spectre environment map\");\r\n }\r\n }\r\n\r\n const version = dataView.getUint16(pos, littleEndian);\r\n pos += 2;\r\n\r\n if (version !== 1) {\r\n Tools.Warn('Unsupported Spectre environment map version \"' + version + '\"');\r\n }\r\n\r\n //read json descriptor - collect characters up to null terminator\r\n let descriptorString = \"\";\r\n let charCode = 0x00;\r\n while ((charCode = dataView.getUint8(pos++))) {\r\n descriptorString += String.fromCharCode(charCode);\r\n }\r\n\r\n const descriptor: EnvJsonDescriptor = JSON.parse(descriptorString);\r\n\r\n const payloadPos = pos;\r\n\r\n //irradiance\r\n switch (descriptor.irradiance.type) {\r\n case \"irradiance_sh_coefficients_9\": {\r\n //irradiance\r\n const harmonics = <IrradianceSHCoefficients9>descriptor.irradiance;\r\n\r\n EnvironmentDeserializer._ConvertSHIrradianceToLambertianRadiance(harmonics);\r\n\r\n //harmonics now represent radiance\r\n EnvironmentDeserializer._ConvertSHToSP(harmonics, environment.irradiancePolynomialCoefficients);\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled MapType descriptor.irradiance.type (\" + descriptor.irradiance.type + \")\");\r\n }\r\n\r\n //specular\r\n switch (descriptor.specular.type) {\r\n case \"cubemap_faces\": {\r\n const specularDescriptor = <CubemapFaces>descriptor.specular;\r\n\r\n const specularTexture = (environment.specularTexture = new TextureCube(PixelFormat.RGBA, PixelType.UNSIGNED_BYTE));\r\n environment.textureIntensityScale = specularDescriptor.multiplier != null ? specularDescriptor.multiplier : 1.0;\r\n\r\n const mipmaps = specularDescriptor.mipmaps;\r\n const imageType = specularDescriptor.imageType;\r\n\r\n for (let l = 0; l < mipmaps.length; l++) {\r\n const faceRanges = mipmaps[l];\r\n\r\n specularTexture.source[l] = [];\r\n\r\n for (let i = 0; i < 6; i++) {\r\n const range = faceRanges[i];\r\n const bytes = new Uint8Array(arrayBuffer, payloadPos + range.pos, range.length);\r\n\r\n switch (imageType) {\r\n case \"png\": {\r\n //construct image element from bytes\r\n const image = new Image();\r\n const src = URL.createObjectURL(new Blob([bytes], { type: \"image/png\" }));\r\n image.src = src;\r\n specularTexture.source[l][i] = image;\r\n\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled ImageType descriptor.specular.imageType (\" + imageType + \")\");\r\n }\r\n }\r\n }\r\n\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled MapType descriptor.specular.type (\" + descriptor.specular.type + \")\");\r\n }\r\n\r\n return environment;\r\n }\r\n\r\n /**\r\n * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.\r\n *\t L = (1/pi) * E * rho\r\n *\r\n * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n */\r\n private static _ConvertSHIrradianceToLambertianRadiance(harmonics: any): void {\r\n EnvironmentDeserializer._ScaleSH(harmonics, 1 / Math.PI);\r\n // The resultant SH now represents outgoing radiance, so includes the Lambert 1/pi normalisation factor but without albedo (rho) applied\r\n // (The pixel shader must apply albedo after texture fetches, etc).\r\n }\r\n\r\n /**\r\n * Convert spherical harmonics to spherical polynomial coefficients\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n * @param outPolynomialCoefficents Polynomial coefficients (9) object to store result\r\n */\r\n private static _ConvertSHToSP(harmonics: any, outPolynomialCoefficents: SphericalPolynomalCoefficients) {\r\n const rPi = 1 / Math.PI;\r\n\r\n //x\r\n outPolynomialCoefficents.x.x = 1.02333 * harmonics.l11[0] * rPi;\r\n outPolynomialCoefficents.x.y = 1.02333 * harmonics.l11[1] * rPi;\r\n outPolynomialCoefficents.x.z = 1.02333 * harmonics.l11[2] * rPi;\r\n\r\n outPolynomialCoefficents.y.x = 1.02333 * harmonics.l1_1[0] * rPi;\r\n outPolynomialCoefficents.y.y = 1.02333 * harmonics.l1_1[1] * rPi;\r\n outPolynomialCoefficents.y.z = 1.02333 * harmonics.l1_1[2] * rPi;\r\n\r\n outPolynomialCoefficents.z.x = 1.02333 * harmonics.l10[0] * rPi;\r\n outPolynomialCoefficents.z.y = 1.02333 * harmonics.l10[1] * rPi;\r\n outPolynomialCoefficents.z.z = 1.02333 * harmonics.l10[2] * rPi;\r\n\r\n //xx\r\n outPolynomialCoefficents.xx.x = (0.886277 * harmonics.l00[0] - 0.247708 * harmonics.l20[0] + 0.429043 * harmonics.l22[0]) * rPi;\r\n outPolynomialCoefficents.xx.y = (0.886277 * harmonics.l00[1] - 0.247708 * harmonics.l20[1] + 0.429043 * harmonics.l22[1]) * rPi;\r\n outPolynomialCoefficents.xx.z = (0.886277 * harmonics.l00[2] - 0.247708 * harmonics.l20[2] + 0.429043 * harmonics.l22[2]) * rPi;\r\n\r\n outPolynomialCoefficents.yy.x = (0.886277 * harmonics.l00[0] - 0.247708 * harmonics.l20[0] - 0.429043 * harmonics.l22[0]) * rPi;\r\n outPolynomialCoefficents.yy.y = (0.886277 * harmonics.l00[1] - 0.247708 * harmonics.l20[1] - 0.429043 * harmonics.l22[1]) * rPi;\r\n outPolynomialCoefficents.yy.z = (0.886277 * harmonics.l00[2] - 0.247708 * harmonics.l20[2] - 0.429043 * harmonics.l22[2]) * rPi;\r\n\r\n outPolynomialCoefficents.zz.x = (0.886277 * harmonics.l00[0] + 0.495417 * harmonics.l20[0]) * rPi;\r\n outPolynomialCoefficents.zz.y = (0.886277 * harmonics.l00[1] + 0.495417 * harmonics.l20[1]) * rPi;\r\n outPolynomialCoefficents.zz.z = (0.886277 * harmonics.l00[2] + 0.495417 * harmonics.l20[2]) * rPi;\r\n\r\n //yz\r\n outPolynomialCoefficents.yz.x = 0.858086 * harmonics.l2_1[0] * rPi;\r\n outPolynomialCoefficents.yz.y = 0.858086 * harmonics.l2_1[1] * rPi;\r\n outPolynomialCoefficents.yz.z = 0.858086 * harmonics.l2_1[2] * rPi;\r\n\r\n outPolynomialCoefficents.zx.x = 0.858086 * harmonics.l21[0] * rPi;\r\n outPolynomialCoefficents.zx.y = 0.858086 * harmonics.l21[1] * rPi;\r\n outPolynomialCoefficents.zx.z = 0.858086 * harmonics.l21[2] * rPi;\r\n\r\n outPolynomialCoefficents.xy.x = 0.858086 * harmonics.l2_2[0] * rPi;\r\n outPolynomialCoefficents.xy.y = 0.858086 * harmonics.l2_2[1] * rPi;\r\n outPolynomialCoefficents.xy.z = 0.858086 * harmonics.l2_2[2] * rPi;\r\n }\r\n\r\n /**\r\n * Multiplies harmonic coefficients in place\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n * @param scaleFactor Value to multiply by\r\n */\r\n private static _ScaleSH(harmonics: any, scaleFactor: number) {\r\n harmonics.l00[0] *= scaleFactor;\r\n harmonics.l00[1] *= scaleFactor;\r\n harmonics.l00[2] *= scaleFactor;\r\n harmonics.l1_1[0] *= scaleFactor;\r\n harmonics.l1_1[1] *= scaleFactor;\r\n harmonics.l1_1[2] *= scaleFactor;\r\n harmonics.l10[0] *= scaleFactor;\r\n harmonics.l10[1] *= scaleFactor;\r\n harmonics.l10[2] *= scaleFactor;\r\n harmonics.l11[0] *= scaleFactor;\r\n harmonics.l11[1] *= scaleFactor;\r\n harmonics.l11[2] *= scaleFactor;\r\n harmonics.l2_2[0] *= scaleFactor;\r\n harmonics.l2_2[1] *= scaleFactor;\r\n harmonics.l2_2[2] *= scaleFactor;\r\n harmonics.l2_1[0] *= scaleFactor;\r\n harmonics.l2_1[1] *= scaleFactor;\r\n harmonics.l2_1[2] *= scaleFactor;\r\n harmonics.l20[0] *= scaleFactor;\r\n harmonics.l20[1] *= scaleFactor;\r\n harmonics.l20[2] *= scaleFactor;\r\n harmonics.l21[0] *= scaleFactor;\r\n harmonics.l21[1] *= scaleFactor;\r\n harmonics.l21[2] *= scaleFactor;\r\n harmonics.l22[0] *= scaleFactor;\r\n harmonics.l22[1] *= scaleFactor;\r\n harmonics.l22[2] *= scaleFactor;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"environmentSerializer.js","sourceRoot":"","sources":["../../../../tools/viewer/src/labs/environmentSerializer.ts"],"names":[],"mappings":"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AAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAEhI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAChI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAEhI,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClG,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClG,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAElG,IAAI;QACJ,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAEnE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAElE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnE,wBAAwB,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACY,gCAAQ,GAAvB,UAAwB,SAAc,EAAE,WAAmB;QACvD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;QAChC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;IACpC,CAAC;IACL,8BAAC;AAAD,CAAC,AArND,IAqNC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { Vector3 } from \"core/Maths/math\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { TextureCube, PixelFormat, PixelType } from \"./texture\";\r\n\r\n/**\r\n * Spherical polynomial coefficients (counter part to spherical harmonic coefficients used in shader irradiance calculation)\r\n * @ignoreChildren\r\n */\r\nexport interface SphericalPolynomalCoefficients {\r\n x: Vector3;\r\n y: Vector3;\r\n z: Vector3;\r\n xx: Vector3;\r\n yy: Vector3;\r\n zz: Vector3;\r\n yz: Vector3;\r\n zx: Vector3;\r\n xy: Vector3;\r\n}\r\n\r\n/**\r\n * Wraps data and maps required for environments with physically based rendering\r\n */\r\nexport interface PBREnvironment {\r\n /**\r\n * Spherical Polynomial Coefficients representing an irradiance map\r\n */\r\n irradiancePolynomialCoefficients: SphericalPolynomalCoefficients;\r\n\r\n /**\r\n * Specular cubemap\r\n */\r\n specularTexture?: TextureCube;\r\n /**\r\n * A scale factor applied to RGB values after reading from environment maps\r\n */\r\n textureIntensityScale: number;\r\n}\r\n\r\n/**\r\n * Environment map representations: layouts, projections and approximations\r\n */\r\nexport type MapType = \"irradiance_sh_coefficients_9\" | \"cubemap_faces\";\r\n\r\n/**\r\n * Image type used for environment map\r\n */\r\nexport type ImageType = \"png\";\r\n\r\n//Payload Descriptor\r\n\r\n/**\r\n * A generic field in JSON that report's its type\r\n */\r\nexport interface TypedObject<T> {\r\n type: T;\r\n}\r\n\r\n/**\r\n * Describes a range of bytes starting at byte pos (inclusive) and finishing at byte pos + length - 1\r\n */\r\nexport interface ByteRange {\r\n pos: number;\r\n length: number;\r\n}\r\n\r\n/**\r\n * Complete Spectre Environment JSON Descriptor\r\n */\r\nexport interface EnvJsonDescriptor {\r\n radiance: TypedObject<MapType>;\r\n irradiance: TypedObject<MapType>;\r\n specular: TypedObject<MapType>;\r\n}\r\n\r\n/**\r\n * Spherical harmonic coefficients to provide an irradiance map\r\n */\r\nexport interface IrradianceSHCoefficients9 extends TypedObject<MapType> {\r\n l00: Array<number>;\r\n\r\n l1_1: Array<number>;\r\n l10: Array<number>;\r\n l11: Array<number>;\r\n\r\n l2_2: Array<number>;\r\n l2_1: Array<number>;\r\n l20: Array<number>;\r\n l21: Array<number>;\r\n l22: Array<number>;\r\n}\r\n\r\n/**\r\n * A generic set of images, where the image content is specified by byte ranges in the mipmaps field\r\n */\r\nexport interface ImageSet<T> extends TypedObject<MapType> {\r\n imageType: ImageType;\r\n width: number;\r\n height: number;\r\n mipmaps: Array<T>;\r\n multiplier: number;\r\n}\r\n\r\n/**\r\n * A set of cubemap faces\r\n */\r\nexport type CubemapFaces = ImageSet<Array<ByteRange>>;\r\n\r\n/**\r\n * A single image containing an atlas of equirectangular-projection maps across all mip levels\r\n */\r\nexport type EquirectangularMipmapAtlas = ImageSet<ByteRange>;\r\n\r\n/**\r\n * A static class proving methods to aid parsing Spectre environment files\r\n */\r\nexport class EnvironmentDeserializer {\r\n /**\r\n * Parses an arraybuffer into a new PBREnvironment object\r\n * @param arrayBuffer The arraybuffer of the Spectre environment file\r\n * @returns a PBREnvironment object\r\n */\r\n public static Parse(arrayBuffer: ArrayBuffer): PBREnvironment {\r\n const environment: PBREnvironment = {\r\n //irradiance\r\n irradiancePolynomialCoefficients: {\r\n x: new Vector3(0, 0, 0),\r\n y: new Vector3(0, 0, 0),\r\n z: new Vector3(0, 0, 0),\r\n xx: new Vector3(0, 0, 0),\r\n yy: new Vector3(0, 0, 0),\r\n zz: new Vector3(0, 0, 0),\r\n yz: new Vector3(0, 0, 0),\r\n zx: new Vector3(0, 0, 0),\r\n xy: new Vector3(0, 0, 0),\r\n },\r\n\r\n //specular\r\n textureIntensityScale: 1.0,\r\n };\r\n\r\n //read .env\r\n const littleEndian = false;\r\n\r\n const magicBytes = [0x86, 0x16, 0x87, 0x96, 0xf6, 0xd6, 0x96, 0x36];\r\n\r\n const dataView = new DataView(arrayBuffer);\r\n let pos = 0;\r\n\r\n for (let i = 0; i < magicBytes.length; i++) {\r\n if (dataView.getUint8(pos++) !== magicBytes[i]) {\r\n Tools.Error(\"Not a Spectre environment map\");\r\n }\r\n }\r\n\r\n const version = dataView.getUint16(pos, littleEndian);\r\n pos += 2;\r\n\r\n if (version !== 1) {\r\n Tools.Warn('Unsupported Spectre environment map version \"' + version + '\"');\r\n }\r\n\r\n //read json descriptor - collect characters up to null terminator\r\n let descriptorString = \"\";\r\n let charCode = 0x00;\r\n while ((charCode = dataView.getUint8(pos++))) {\r\n descriptorString += String.fromCharCode(charCode);\r\n }\r\n\r\n const descriptor: EnvJsonDescriptor = JSON.parse(descriptorString);\r\n\r\n const payloadPos = pos;\r\n\r\n //irradiance\r\n switch (descriptor.irradiance.type) {\r\n case \"irradiance_sh_coefficients_9\": {\r\n //irradiance\r\n const harmonics = <IrradianceSHCoefficients9>descriptor.irradiance;\r\n\r\n EnvironmentDeserializer._ConvertSHIrradianceToLambertianRadiance(harmonics);\r\n\r\n //harmonics now represent radiance\r\n EnvironmentDeserializer._ConvertSHToSP(harmonics, environment.irradiancePolynomialCoefficients);\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled MapType descriptor.irradiance.type (\" + descriptor.irradiance.type + \")\");\r\n }\r\n\r\n //specular\r\n switch (descriptor.specular.type) {\r\n case \"cubemap_faces\": {\r\n const specularDescriptor = <CubemapFaces>descriptor.specular;\r\n\r\n const specularTexture = (environment.specularTexture = new TextureCube(PixelFormat.RGBA, PixelType.UNSIGNED_BYTE));\r\n environment.textureIntensityScale = specularDescriptor.multiplier != null ? specularDescriptor.multiplier : 1.0;\r\n\r\n const mipmaps = specularDescriptor.mipmaps;\r\n const imageType = specularDescriptor.imageType;\r\n\r\n for (let l = 0; l < mipmaps.length; l++) {\r\n const faceRanges = mipmaps[l];\r\n\r\n specularTexture.source[l] = [];\r\n\r\n for (let i = 0; i < 6; i++) {\r\n const range = faceRanges[i];\r\n const bytes = new Uint8Array(arrayBuffer, payloadPos + range.pos, range.length);\r\n\r\n switch (imageType) {\r\n case \"png\": {\r\n //construct image element from bytes\r\n const image = new Image();\r\n const src = URL.createObjectURL(new Blob([bytes], { type: \"image/png\" }));\r\n image.src = src;\r\n specularTexture.source[l][i] = image;\r\n\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled ImageType descriptor.specular.imageType (\" + imageType + \")\");\r\n }\r\n }\r\n }\r\n\r\n break;\r\n }\r\n default:\r\n Tools.Error(\"Unhandled MapType descriptor.specular.type (\" + descriptor.specular.type + \")\");\r\n }\r\n\r\n return environment;\r\n }\r\n\r\n /**\r\n * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.\r\n *\t L = (1/pi) * E * rho\r\n *\r\n * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n */\r\n private static _ConvertSHIrradianceToLambertianRadiance(harmonics: any): void {\r\n EnvironmentDeserializer._ScaleSH(harmonics, 1 / Math.PI);\r\n // The resultant SH now represents outgoing radiance, so includes the Lambert 1/pi normalisation factor but without albedo (rho) applied\r\n // (The pixel shader must apply albedo after texture fetches, etc).\r\n }\r\n\r\n /**\r\n * Convert spherical harmonics to spherical polynomial coefficients\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n * @param outPolynomialCoefficents Polynomial coefficients (9) object to store result\r\n */\r\n private static _ConvertSHToSP(harmonics: any, outPolynomialCoefficents: SphericalPolynomalCoefficients) {\r\n const rPi = 1 / Math.PI;\r\n\r\n //x\r\n outPolynomialCoefficents.x.x = 1.02333 * harmonics.l11[0] * rPi;\r\n outPolynomialCoefficents.x.y = 1.02333 * harmonics.l11[1] * rPi;\r\n outPolynomialCoefficents.x.z = 1.02333 * harmonics.l11[2] * rPi;\r\n\r\n outPolynomialCoefficents.y.x = 1.02333 * harmonics.l1_1[0] * rPi;\r\n outPolynomialCoefficents.y.y = 1.02333 * harmonics.l1_1[1] * rPi;\r\n outPolynomialCoefficents.y.z = 1.02333 * harmonics.l1_1[2] * rPi;\r\n\r\n outPolynomialCoefficents.z.x = 1.02333 * harmonics.l10[0] * rPi;\r\n outPolynomialCoefficents.z.y = 1.02333 * harmonics.l10[1] * rPi;\r\n outPolynomialCoefficents.z.z = 1.02333 * harmonics.l10[2] * rPi;\r\n\r\n //xx\r\n outPolynomialCoefficents.xx.x = (0.886277 * harmonics.l00[0] - 0.247708 * harmonics.l20[0] + 0.429043 * harmonics.l22[0]) * rPi;\r\n outPolynomialCoefficents.xx.y = (0.886277 * harmonics.l00[1] - 0.247708 * harmonics.l20[1] + 0.429043 * harmonics.l22[1]) * rPi;\r\n outPolynomialCoefficents.xx.z = (0.886277 * harmonics.l00[2] - 0.247708 * harmonics.l20[2] + 0.429043 * harmonics.l22[2]) * rPi;\r\n\r\n outPolynomialCoefficents.yy.x = (0.886277 * harmonics.l00[0] - 0.247708 * harmonics.l20[0] - 0.429043 * harmonics.l22[0]) * rPi;\r\n outPolynomialCoefficents.yy.y = (0.886277 * harmonics.l00[1] - 0.247708 * harmonics.l20[1] - 0.429043 * harmonics.l22[1]) * rPi;\r\n outPolynomialCoefficents.yy.z = (0.886277 * harmonics.l00[2] - 0.247708 * harmonics.l20[2] - 0.429043 * harmonics.l22[2]) * rPi;\r\n\r\n outPolynomialCoefficents.zz.x = (0.886277 * harmonics.l00[0] + 0.495417 * harmonics.l20[0]) * rPi;\r\n outPolynomialCoefficents.zz.y = (0.886277 * harmonics.l00[1] + 0.495417 * harmonics.l20[1]) * rPi;\r\n outPolynomialCoefficents.zz.z = (0.886277 * harmonics.l00[2] + 0.495417 * harmonics.l20[2]) * rPi;\r\n\r\n //yz\r\n outPolynomialCoefficents.yz.x = 0.858086 * harmonics.l2_1[0] * rPi;\r\n outPolynomialCoefficents.yz.y = 0.858086 * harmonics.l2_1[1] * rPi;\r\n outPolynomialCoefficents.yz.z = 0.858086 * harmonics.l2_1[2] * rPi;\r\n\r\n outPolynomialCoefficents.zx.x = 0.858086 * harmonics.l21[0] * rPi;\r\n outPolynomialCoefficents.zx.y = 0.858086 * harmonics.l21[1] * rPi;\r\n outPolynomialCoefficents.zx.z = 0.858086 * harmonics.l21[2] * rPi;\r\n\r\n outPolynomialCoefficents.xy.x = 0.858086 * harmonics.l2_2[0] * rPi;\r\n outPolynomialCoefficents.xy.y = 0.858086 * harmonics.l2_2[1] * rPi;\r\n outPolynomialCoefficents.xy.z = 0.858086 * harmonics.l2_2[2] * rPi;\r\n }\r\n\r\n /**\r\n * Multiplies harmonic coefficients in place\r\n * @param harmonics Spherical harmonic coefficients (9)\r\n * @param scaleFactor Value to multiply by\r\n */\r\n private static _ScaleSH(harmonics: any, scaleFactor: number) {\r\n harmonics.l00[0] *= scaleFactor;\r\n harmonics.l00[1] *= scaleFactor;\r\n harmonics.l00[2] *= scaleFactor;\r\n harmonics.l1_1[0] *= scaleFactor;\r\n harmonics.l1_1[1] *= scaleFactor;\r\n harmonics.l1_1[2] *= scaleFactor;\r\n harmonics.l10[0] *= scaleFactor;\r\n harmonics.l10[1] *= scaleFactor;\r\n harmonics.l10[2] *= scaleFactor;\r\n harmonics.l11[0] *= scaleFactor;\r\n harmonics.l11[1] *= scaleFactor;\r\n harmonics.l11[2] *= scaleFactor;\r\n harmonics.l2_2[0] *= scaleFactor;\r\n harmonics.l2_2[1] *= scaleFactor;\r\n harmonics.l2_2[2] *= scaleFactor;\r\n harmonics.l2_1[0] *= scaleFactor;\r\n harmonics.l2_1[1] *= scaleFactor;\r\n harmonics.l2_1[2] *= scaleFactor;\r\n harmonics.l20[0] *= scaleFactor;\r\n harmonics.l20[1] *= scaleFactor;\r\n harmonics.l20[2] *= scaleFactor;\r\n harmonics.l21[0] *= scaleFactor;\r\n harmonics.l21[1] *= scaleFactor;\r\n harmonics.l21[2] *= scaleFactor;\r\n harmonics.l22[0] *= scaleFactor;\r\n harmonics.l22[1] *= scaleFactor;\r\n harmonics.l22[2] *= scaleFactor;\r\n }\r\n}\r\n"]}
package/labs/texture.d.ts CHANGED
@@ -100,23 +100,23 @@ export interface SamplingParameters {
100
100
  /**
101
101
  * Represents a valid WebGL texture source for use in texImage2D
102
102
  */
103
- export declare type TextureSource = TextureData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;
103
+ export type TextureSource = TextureData | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement;
104
104
  /**
105
105
  * A generic set of texture mipmaps (where index 0 has the largest dimension)
106
106
  */
107
- export declare type Mipmaps<T> = Array<T>;
107
+ export type Mipmaps<T> = Array<T>;
108
108
  /**
109
109
  * A set of 6 cubemap arranged in the order [+x, -x, +y, -y, +z, -z]
110
110
  */
111
- export declare type Faces<T> = Array<T>;
111
+ export type Faces<T> = Array<T>;
112
112
  /**
113
113
  * A set of texture mipmaps specifically for 2D textures in WebGL (where index 0 has the largest dimension)
114
114
  */
115
- export declare type Mipmaps2D = Mipmaps<TextureSource>;
115
+ export type Mipmaps2D = Mipmaps<TextureSource>;
116
116
  /**
117
117
  * A set of texture mipmaps specifically for cubemap textures in WebGL (where index 0 has the largest dimension)
118
118
  */
119
- export declare type MipmapsCube = Mipmaps<Faces<TextureSource>>;
119
+ export type MipmapsCube = Mipmaps<Faces<TextureSource>>;
120
120
  /**
121
121
  * A minimal WebGL cubemap descriptor
122
122
  */
package/labs/texture.js CHANGED
@@ -73,10 +73,10 @@ var TextureUtils = /** @class */ (function () {
73
73
  }
74
74
  else {
75
75
  parameters = {
76
- magFilter: 9728 /* NEAREST */,
77
- minFilter: 9728 /* NEAREST */,
78
- wrapS: 33071 /* CLAMP_TO_EDGE */,
79
- wrapT: 33071 /* CLAMP_TO_EDGE */,
76
+ magFilter: 9728 /* TextureMagFilter.NEAREST */,
77
+ minFilter: 9728 /* TextureMinFilter.NEAREST */,
78
+ wrapS: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
79
+ wrapT: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
80
80
  };
81
81
  }
82
82
  var key = TextureUtils.BabylonTextureKeyPrefix + parameters.magFilter + "" + parameters.minFilter + "" + parameters.wrapS + "" + parameters.wrapT;
@@ -147,7 +147,7 @@ var TextureUtils = /** @class */ (function () {
147
147
  var environmentSpecularLOD = TextureUtils.EnvironmentLODScale * Scalar.Log2(microsurfaceAverageSlopeTexels) + TextureUtils.EnvironmentLODOffset;
148
148
  var maxLODIndex = textureCube.source.length - 1;
149
149
  var mipmapIndex = Math.min(Math.max(Math.round(environmentSpecularLOD), 0), maxLODIndex);
150
- lod = TextureUtils.GetBabylonCubeTexture(scene, new TextureCube(6408 /* RGBA */, 5121 /* UNSIGNED_BYTE */, [textureCube.source[mipmapIndex]]), false, true, true);
150
+ lod = TextureUtils.GetBabylonCubeTexture(scene, new TextureCube(6408 /* PixelFormat.RGBA */, 5121 /* PixelType.UNSIGNED_BYTE */, [textureCube.source[mipmapIndex]]), false, true, true);
151
151
  if (i_1 === 0) {
152
152
  internalTexture_1._lodTextureLow = lod;
153
153
  }
@@ -227,26 +227,26 @@ var TextureUtils = /** @class */ (function () {
227
227
  }
228
228
  //set babylon wrap modes from sampling parameter
229
229
  switch (parameters.wrapS) {
230
- case 10497 /* REPEAT */:
230
+ case 10497 /* TextureWrapMode.REPEAT */:
231
231
  babylonTexture.wrapU = Texture.WRAP_ADDRESSMODE;
232
232
  break;
233
- case 33071 /* CLAMP_TO_EDGE */:
233
+ case 33071 /* TextureWrapMode.CLAMP_TO_EDGE */:
234
234
  babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;
235
235
  break;
236
- case 33648 /* MIRRORED_REPEAT */:
236
+ case 33648 /* TextureWrapMode.MIRRORED_REPEAT */:
237
237
  babylonTexture.wrapU = Texture.MIRROR_ADDRESSMODE;
238
238
  break;
239
239
  default:
240
240
  babylonTexture.wrapU = Texture.CLAMP_ADDRESSMODE;
241
241
  }
242
242
  switch (parameters.wrapT) {
243
- case 10497 /* REPEAT */:
243
+ case 10497 /* TextureWrapMode.REPEAT */:
244
244
  babylonTexture.wrapV = Texture.WRAP_ADDRESSMODE;
245
245
  break;
246
- case 33071 /* CLAMP_TO_EDGE */:
246
+ case 33071 /* TextureWrapMode.CLAMP_TO_EDGE */:
247
247
  babylonTexture.wrapV = Texture.CLAMP_ADDRESSMODE;
248
248
  break;
249
- case 33648 /* MIRRORED_REPEAT */:
249
+ case 33648 /* TextureWrapMode.MIRRORED_REPEAT */:
250
250
  babylonTexture.wrapV = Texture.MIRROR_ADDRESSMODE;
251
251
  break;
252
252
  default:
@@ -273,17 +273,17 @@ var TextureUtils = /** @class */ (function () {
273
273
  */
274
274
  TextureUtils.MaxAnisotropy = 4;
275
275
  TextureUtils._EnvironmentSampling = {
276
- magFilter: 9729 /* LINEAR */,
277
- minFilter: 9987 /* LINEAR_MIPMAP_LINEAR */,
278
- wrapS: 33071 /* CLAMP_TO_EDGE */,
279
- wrapT: 33071 /* CLAMP_TO_EDGE */,
276
+ magFilter: 9729 /* TextureMagFilter.LINEAR */,
277
+ minFilter: 9987 /* TextureMinFilter.LINEAR_MIPMAP_LINEAR */,
278
+ wrapS: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
279
+ wrapT: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
280
280
  maxAnisotropy: 1,
281
281
  };
282
282
  TextureUtils._EnvironmentSingleMipSampling = {
283
- magFilter: 9729 /* LINEAR */,
284
- minFilter: 9729 /* LINEAR */,
285
- wrapS: 33071 /* CLAMP_TO_EDGE */,
286
- wrapT: 33071 /* CLAMP_TO_EDGE */,
283
+ magFilter: 9729 /* TextureMagFilter.LINEAR */,
284
+ minFilter: 9729 /* TextureMinFilter.LINEAR */,
285
+ wrapS: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
286
+ wrapT: 33071 /* TextureWrapMode.CLAMP_TO_EDGE */,
287
287
  maxAnisotropy: 1,
288
288
  };
289
289
  //from "/Internal/Lighting.EnvironmentFilterScale" in Engine/*/Configuration.cpp
@@ -1 +1 @@
1
- {"version":3,"file":"texture.js","sourceRoot":"","sources":["../../../../tools/viewer/src/labs/texture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,0DAA4C;AAClE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,8DAAgD;AACjG,OAAO,EAAE,MAAM,EAAE,6CAA+B;AAEhD,OAAO,EAAE,OAAO,EAAE,sDAAwC;AAkI1D;;GAEG;AACH;IAiBI;;;;;OAKG;IACH,qBAAmB,cAA2B,EAAS,IAAe,EAAS,MAAwB;QAAxB,uBAAA,EAAA,WAAwB;QAApF,mBAAc,GAAd,cAAc,CAAa;QAAS,SAAI,GAAJ,IAAI,CAAW;QAAS,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAlB3G,sBAAW,8BAAK;QAJhB;;WAEG;QACH,gEAAgE;aAChE;YACI,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC;;;OAAA;IAMD,sBAAW,+BAAM;QAJjB;;WAEG;QACH,gEAAgE;aAChE;YACI,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;;;OAAA;IASL,kBAAC;AAAD,CAAC,AAxBD,IAwBC;;AAED;;GAEG;AACH;IAAA;IAsSA,CAAC;IA3RG;;;;;;;;;;OAUG;IACW,kCAAqB,GAAnC,UAAoC,KAAY,EAAE,WAAwB,EAAE,gBAAyB,EAAE,WAAmB,EAAE,SAAiB;;QAAtC,4BAAA,EAAA,mBAAmB;QAAE,0BAAA,EAAA,iBAAiB;QACzI,IAAI,CAAC,WAAW,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC/C;QAED,IAAI,UAA8B,CAAC;QACnC,IAAI,WAAW,EAAE;YACb,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC,CAAC,YAAY,CAAC,oBAAoB,CAAC;SAC3G;aAAM;YACH,UAAU,GAAG;gBACT,SAAS,oBAA0B;gBACnC,SAAS,oBAA0B;gBACnC,KAAK,2BAA+B;gBACpC,KAAK,2BAA+B;aACvC,CAAC;SACL;QAED,IAAM,GAAG,GAAG,YAAY,CAAC,uBAAuB,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAEpJ,IAAI,cAAc,GAAsB,WAAY,CAAC,GAAG,CAAC,CAAC;QAE1D,IAAI,CAAC,cAAc,EAAE;YACjB,4BAA4B;YAC5B,cAAc,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE;gBACb,cAAc,CAAC,mBAAmB,GAAG,YAAY,CAAC,oBAAoB,CAAC;gBACvE,cAAc,CAAC,kBAAkB,GAAG,YAAY,CAAC,mBAAmB,CAAC;aACxE;YAED,cAAc,CAAC,UAAU,GAAG,KAAK,CAAC;YAElC,IAAM,iBAAe,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC9F,IAAM,WAAS,GAAG,MAAA,iBAAe,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;YACvE,oBAAoB;YACpB,iBAAe,CAAC,MAAM,GAAG,IAAI,CAAC;YAC9B,iBAAe,CAAC,eAAe,GAAG,KAAK,CAAC;YAExC,cAAc,CAAC,QAAQ,GAAG,iBAAe,CAAC;YAE1C,YAAY,CAAC,uBAAuB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAEjE,IAAM,aAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACzE,IAAI,kBAAgB,GAAG,CAAC,CAAC;YAEzB,IAAM,iBAAe,GAAG;gBACpB,OAAO,kBAAgB,KAAK,CAAC,aAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC;YAEF,IAAM,YAAU,GAAG,UAAU,CAAS,EAAE,KAAa,EAAE,IAAmB;gBACtE,IAAI,CAAC,WAAS,EAAE;oBACZ,OAAO;iBACV;gBAED,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;oBACxB,iBAAe,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;oBACnC,iBAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;iBACxC;gBAED,IAAM,EAAE,GAAS,KAAK,CAAC,SAAS,EAAG,CAAC,GAAG,CAAC;gBACxC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB,EAAE,WAAS,CAAC,CAAC;gBAC/C,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,YAAY,SAAS,EAAE;oBAC1D,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,2BAA2B,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,EAAO,IAAI,CAAC,CAAC;iBACjJ;qBAAM;oBACH,IAAM,WAAW,GAAgB,IAAI,CAAC;oBACtC,EAAE,CAAC,UAAU,CACT,EAAE,CAAC,2BAA2B,GAAG,CAAC,EAClC,KAAK,EACL,WAAW,CAAC,cAAc,EAC1B,WAAW,CAAC,KAAK,EACjB,WAAW,CAAC,MAAM,EAClB,CAAC,EACD,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CAAC;iBACL;gBAED,kBAAgB,EAAE,CAAC;gBAEnB,IAAI,iBAAe,EAAE,EAAE;oBACnB,kBAAkB;oBAClB,IAAI,gBAAgB,EAAE;wBAClB,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;wBACrB,IAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;wBACtB,IAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAC/E,IAAI,KAAK,EAAE;4BACP,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;yBAC1C;qBACJ;oBAED,oEAAoE;oBACpE,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE;wBACtE,IAAM,SAAS,GAAG,CAAC,CAAC;wBACpB,KAAK,IAAI,GAAC,GAAG,CAAC,EAAE,GAAC,GAAG,SAAS,EAAE,GAAC,EAAE,EAAE;4BAChC,IAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,GAAG,KAAK,GAAG,GAAC,CAAC;4BAChE,IAAI,GAAG,GAAsB,WAAY,CAAC,MAAM,CAAC,CAAC;4BAElD,oDAAoD;4BACpD,IAAI,GAAG,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE;gCAClC,2EAA2E;gCAC3E,IAAM,UAAU,GAAG,GAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gCACvC,IAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC;gCACjC,IAAM,gBAAgB,GAAG,MAAM,CAAC;gCAChC,IAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC;gCACxD,IAAM,8BAA8B,GAAG,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;gCAElE,IAAM,sBAAsB,GAAG,YAAY,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,GAAG,YAAY,CAAC,oBAAoB,CAAC;gCAElJ,IAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gCAClD,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gCAE3F,GAAG,GAAG,YAAY,CAAC,qBAAqB,CACpC,KAAK,EACL,IAAI,WAAW,4CAA4C,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAC7F,KAAK,EACL,IAAI,EACJ,IAAI,CACP,CAAC;gCAEF,IAAI,GAAC,KAAK,CAAC,EAAE;oCACT,iBAAe,CAAC,cAAc,GAAG,GAAG,CAAC;iCACxC;qCAAM,IAAI,GAAC,KAAK,CAAC,EAAE;oCAChB,iBAAe,CAAC,cAAc,GAAG,GAAG,CAAC;iCACxC;qCAAM;oCACH,iBAAe,CAAC,eAAe,GAAG,GAAG,CAAC;iCACzC;gCAEK,WAAY,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;6BACpC;yBACJ;qBACJ;oBAED,iBAAe,CAAC,OAAO,GAAG,IAAI,CAAC;iBAClC;gBAED,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBAC1C,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC1C,CAAC,CAAC;oCAEO,CAAC;gBACN,IAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wCAC3B,CAAC;oBACN,IAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,YAAY,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBACpD,IAAI,CAAC,gBAAgB,CACjB,MAAM,EACN;4BACI,YAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;wBAC3B,CAAC,EACD,KAAK,CACR,CAAC;qBACL;yBAAM;wBACH,YAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;qBAC1B;;gBAZL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;4BAA5B,CAAC;iBAaT;;YAfL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAW,EAAE,CAAC,EAAE;wBAA5B,CAAC;aAgBT;YAED,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAEtC,cAAc,CAAC,OAAO,GAAG;gBACrB,OAAO,iBAAe,EAAE,CAAC;YAC7B,CAAC,CAAC;YAEI,WAAY,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;SAC5C;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACW,oCAAuB,GAArC,UAAsC,cAA2B,EAAE,UAA8B;;QAC7F,IAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE;YACR,OAAO;SACV;QACD,IAAM,EAAE,GAAS,KAAK,CAAC,SAAS,EAAG,CAAC,GAAG,CAAC;QAExC,IAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAE3E,IAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO;SACV;QACD,IAAM,SAAS,GAAG,MAAA,eAAe,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;QACvE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAElC,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE;YAC9B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;SACzE;QACD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE;YAC9B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;SACzE;QACD,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;YAC1B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;SACjE;QACD,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;YAC1B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;SACjE;QAED,gDAAgD;QAChD,QAAQ,UAAU,CAAC,KAAK,EAAE;YACtB;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBAChD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;gBAClD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;SACxD;QAED,QAAQ,UAAU,CAAC,KAAK,EAAE;YACtB;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBAChD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;gBAClD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;SACxD;QAED,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;YAClE,IAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE;gBAChB,IAAM,qBAAqB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC;gBAC7F,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBAChF,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;gBACnF,cAAc,CAAC,yBAAyB,GAAG,aAAa,CAAC;aAC5D;SACJ;QAED,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;IA1QD;;OAEG;IACW,oCAAuB,GAAG,mBAAmB,CAAC;IAE5D;;OAEG;IACW,0BAAa,GAAG,CAAC,CAAC;IAoQjB,iCAAoB,GAAuB;QACtD,SAAS,mBAAyB;QAClC,SAAS,iCAAuC;QAChD,KAAK,2BAA+B;QACpC,KAAK,2BAA+B;QACpC,aAAa,EAAE,CAAC;KACnB,CAAC;IAEa,0CAA6B,GAAuB;QAC/D,SAAS,mBAAyB;QAClC,SAAS,mBAAyB;QAClC,KAAK,2BAA+B;QACpC,KAAK,2BAA+B;QACpC,aAAa,EAAE,CAAC;KACnB,CAAC;IAEF,gFAAgF;IAChF;;OAEG;IACW,gCAAmB,GAAG,GAAG,CAAC;IACxC;;OAEG;IACW,iCAAoB,GAAG,GAAG,CAAC;IAC7C,mBAAC;CAAA,AAtSD,IAsSC;SAtSY,YAAY","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\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(public internalFormat: PixelFormat, public type: PixelType, public source: MipmapsCube = []) {}\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()._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":"AACA,OAAO,EAAE,WAAW,EAAE,0DAA4C;AAClE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,8DAAgD;AACjG,OAAO,EAAE,MAAM,EAAE,6CAA+B;AAEhD,OAAO,EAAE,OAAO,EAAE,sDAAwC;AAkI1D;;GAEG;AACH;IAiBI;;;;;OAKG;IACH,qBAAmB,cAA2B,EAAS,IAAe,EAAS,MAAwB;QAAxB,uBAAA,EAAA,WAAwB;QAApF,mBAAc,GAAd,cAAc,CAAa;QAAS,SAAI,GAAJ,IAAI,CAAW;QAAS,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAlB3G,sBAAW,8BAAK;QAJhB;;WAEG;QACH,gEAAgE;aAChE;YACI,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC;;;OAAA;IAMD,sBAAW,+BAAM;QAJjB;;WAEG;QACH,gEAAgE;aAChE;YACI,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,CAAC;;;OAAA;IASL,kBAAC;AAAD,CAAC,AAxBD,IAwBC;;AAED;;GAEG;AACH;IAAA;IAsSA,CAAC;IA3RG;;;;;;;;;;OAUG;IACW,kCAAqB,GAAnC,UAAoC,KAAY,EAAE,WAAwB,EAAE,gBAAyB,EAAE,WAAmB,EAAE,SAAiB;;QAAtC,4BAAA,EAAA,mBAAmB;QAAE,0BAAA,EAAA,iBAAiB;QACzI,IAAI,CAAC,WAAW,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;SAC/C;QAED,IAAI,UAA8B,CAAC;QACnC,IAAI,WAAW,EAAE;YACb,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC,CAAC,YAAY,CAAC,oBAAoB,CAAC;SAC3G;aAAM;YACH,UAAU,GAAG;gBACT,SAAS,qCAA0B;gBACnC,SAAS,qCAA0B;gBACnC,KAAK,2CAA+B;gBACpC,KAAK,2CAA+B;aACvC,CAAC;SACL;QAED,IAAM,GAAG,GAAG,YAAY,CAAC,uBAAuB,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QAEpJ,IAAI,cAAc,GAAsB,WAAY,CAAC,GAAG,CAAC,CAAC;QAE1D,IAAI,CAAC,cAAc,EAAE;YACjB,4BAA4B;YAC5B,cAAc,GAAG,IAAI,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE;gBACb,cAAc,CAAC,mBAAmB,GAAG,YAAY,CAAC,oBAAoB,CAAC;gBACvE,cAAc,CAAC,kBAAkB,GAAG,YAAY,CAAC,mBAAmB,CAAC;aACxE;YAED,cAAc,CAAC,UAAU,GAAG,KAAK,CAAC;YAElC,IAAM,iBAAe,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC9F,IAAM,WAAS,GAAG,MAAA,iBAAe,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;YACvE,oBAAoB;YACpB,iBAAe,CAAC,MAAM,GAAG,IAAI,CAAC;YAC9B,iBAAe,CAAC,eAAe,GAAG,KAAK,CAAC;YAExC,cAAc,CAAC,QAAQ,GAAG,iBAAe,CAAC;YAE1C,YAAY,CAAC,uBAAuB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YAEjE,IAAM,aAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACzE,IAAI,kBAAgB,GAAG,CAAC,CAAC;YAEzB,IAAM,iBAAe,GAAG;gBACpB,OAAO,kBAAgB,KAAK,CAAC,aAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC,CAAC;YAEF,IAAM,YAAU,GAAG,UAAU,CAAS,EAAE,KAAa,EAAE,IAAmB;gBACtE,IAAI,CAAC,WAAS,EAAE;oBACZ,OAAO;iBACV;gBAED,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE;oBACxB,iBAAe,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;oBACnC,iBAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;iBACxC;gBAED,IAAM,EAAE,GAAS,KAAK,CAAC,SAAS,EAAG,CAAC,GAAG,CAAC;gBACxC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB,EAAE,WAAS,CAAC,CAAC;gBAC/C,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,YAAY,SAAS,EAAE;oBAC1D,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,2BAA2B,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,EAAO,IAAI,CAAC,CAAC;iBACjJ;qBAAM;oBACH,IAAM,WAAW,GAAgB,IAAI,CAAC;oBACtC,EAAE,CAAC,UAAU,CACT,EAAE,CAAC,2BAA2B,GAAG,CAAC,EAClC,KAAK,EACL,WAAW,CAAC,cAAc,EAC1B,WAAW,CAAC,KAAK,EACjB,WAAW,CAAC,MAAM,EAClB,CAAC,EACD,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,IAAI,CACnB,CAAC;iBACL;gBAED,kBAAgB,EAAE,CAAC;gBAEnB,IAAI,iBAAe,EAAE,EAAE;oBACnB,kBAAkB;oBAClB,IAAI,gBAAgB,EAAE;wBAClB,IAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;wBACrB,IAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;wBACtB,IAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;wBAC/E,IAAI,KAAK,EAAE;4BACP,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;yBAC1C;qBACJ;oBAED,oEAAoE;oBACpE,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,IAAI,CAAC,SAAS,EAAE;wBACtE,IAAM,SAAS,GAAG,CAAC,CAAC;wBACpB,KAAK,IAAI,GAAC,GAAG,CAAC,EAAE,GAAC,GAAG,SAAS,EAAE,GAAC,EAAE,EAAE;4BAChC,IAAM,MAAM,GAAG,YAAY,CAAC,uBAAuB,GAAG,KAAK,GAAG,GAAC,CAAC;4BAChE,IAAI,GAAG,GAAsB,WAAY,CAAC,MAAM,CAAC,CAAC;4BAElD,oDAAoD;4BACpD,IAAI,GAAG,IAAI,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE;gCAClC,2EAA2E;gCAC3E,IAAM,UAAU,GAAG,GAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;gCACvC,IAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC;gCACjC,IAAM,gBAAgB,GAAG,MAAM,CAAC;gCAChC,IAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC;gCACxD,IAAM,8BAA8B,GAAG,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC;gCAElE,IAAM,sBAAsB,GAAG,YAAY,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,GAAG,YAAY,CAAC,oBAAoB,CAAC;gCAElJ,IAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gCAClD,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;gCAE3F,GAAG,GAAG,YAAY,CAAC,qBAAqB,CACpC,KAAK,EACL,IAAI,WAAW,kEAA4C,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAC7F,KAAK,EACL,IAAI,EACJ,IAAI,CACP,CAAC;gCAEF,IAAI,GAAC,KAAK,CAAC,EAAE;oCACT,iBAAe,CAAC,cAAc,GAAG,GAAG,CAAC;iCACxC;qCAAM,IAAI,GAAC,KAAK,CAAC,EAAE;oCAChB,iBAAe,CAAC,cAAc,GAAG,GAAG,CAAC;iCACxC;qCAAM;oCACH,iBAAe,CAAC,eAAe,GAAG,GAAG,CAAC;iCACzC;gCAEK,WAAY,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;6BACpC;yBACJ;qBACJ;oBAED,iBAAe,CAAC,OAAO,GAAG,IAAI,CAAC;iBAClC;gBAED,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBAC1C,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC1C,CAAC,CAAC;oCAEO,CAAC;gBACN,IAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wCAC3B,CAAC;oBACN,IAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACtB,IAAI,IAAI,YAAY,gBAAgB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;wBACpD,IAAI,CAAC,gBAAgB,CACjB,MAAM,EACN;4BACI,YAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;wBAC3B,CAAC,EACD,KAAK,CACR,CAAC;qBACL;yBAAM;wBACH,YAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;qBAC1B;;gBAZL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;4BAA5B,CAAC;iBAaT;;YAfL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,aAAW,EAAE,CAAC,EAAE;wBAA5B,CAAC;aAgBT;YAED,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAEtC,cAAc,CAAC,OAAO,GAAG;gBACrB,OAAO,iBAAe,EAAE,CAAC;YAC7B,CAAC,CAAC;YAEI,WAAY,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC;SAC5C;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACW,oCAAuB,GAArC,UAAsC,cAA2B,EAAE,UAA8B;;QAC7F,IAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,EAAE;YACR,OAAO;SACV;QACD,IAAM,EAAE,GAAS,KAAK,CAAC,SAAS,EAAG,CAAC,GAAG,CAAC;QAExC,IAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAE3E,IAAM,eAAe,GAAG,cAAc,CAAC,QAAQ,CAAC;QAChD,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO;SACV;QACD,IAAM,SAAS,GAAG,MAAA,eAAe,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;QACvE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAElC,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE;YAC9B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;SACzE;QACD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE;YAC9B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;SACzE;QACD,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;YAC1B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;SACjE;QACD,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE;YAC1B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;SACjE;QAED,gDAAgD;QAChD,QAAQ,UAAU,CAAC,KAAK,EAAE;YACtB;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBAChD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;gBAClD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;SACxD;QAED,QAAQ,UAAU,CAAC,KAAK,EAAE;YACtB;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC;gBAChD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;gBAClD,MAAM;YACV;gBACI,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;SACxD;QAED,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;YAClE,IAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC;YACzE,IAAI,cAAc,EAAE;gBAChB,IAAM,qBAAqB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC;gBAC7F,IAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBAChF,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,0BAA0B,EAAE,aAAa,CAAC,CAAC;gBACnF,cAAc,CAAC,yBAAyB,GAAG,aAAa,CAAC;aAC5D;SACJ;QAED,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC7B,KAAK,CAAC,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;IA1QD;;OAEG;IACW,oCAAuB,GAAG,mBAAmB,CAAC;IAE5D;;OAEG;IACW,0BAAa,GAAG,CAAC,CAAC;IAoQjB,iCAAoB,GAAuB;QACtD,SAAS,oCAAyB;QAClC,SAAS,kDAAuC;QAChD,KAAK,2CAA+B;QACpC,KAAK,2CAA+B;QACpC,aAAa,EAAE,CAAC;KACnB,CAAC;IAEa,0CAA6B,GAAuB;QAC/D,SAAS,oCAAyB;QAClC,SAAS,oCAAyB;QAClC,KAAK,2CAA+B;QACpC,KAAK,2CAA+B;QACpC,aAAa,EAAE,CAAC;KACnB,CAAC;IAEF,gFAAgF;IAChF;;OAEG;IACW,gCAAmB,GAAG,GAAG,CAAC;IACxC;;OAEG;IACW,iCAAoB,GAAG,GAAG,CAAC;IAC7C,mBAAC;CAAA,AAtSD,IAsSC;SAtSY,YAAY","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\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(public internalFormat: PixelFormat, public type: PixelType, public source: MipmapsCube = []) {}\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()._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"]}
@@ -887,7 +887,7 @@ var SceneManager = /** @class */ (function () {
887
887
  if (groundSize) {
888
888
  options.groundSize = groundSize;
889
889
  }
890
- options.enableGroundShadow = groundConfig_1 === true || groundConfig_1.receiveShadows;
890
+ options.enableGroundShadow = groundConfiguration === true || groundConfig_1.receiveShadows;
891
891
  if (groundConfig_1.shadowLevel !== undefined) {
892
892
  options.groundShadowLevel = groundConfig_1.shadowLevel;
893
893
  }
@@ -1358,15 +1358,15 @@ var SceneManager = /** @class */ (function () {
1358
1358
  }
1359
1359
  // constructing behavior
1360
1360
  switch (type) {
1361
- case 0 /* AUTOROTATION */:
1361
+ case 0 /* CameraBehavior.AUTOROTATION */:
1362
1362
  this.camera.useAutoRotationBehavior = enabled;
1363
1363
  behavior = this.camera.autoRotationBehavior;
1364
1364
  break;
1365
- case 1 /* BOUNCING */:
1365
+ case 1 /* CameraBehavior.BOUNCING */:
1366
1366
  this.camera.useBouncingBehavior = enabled;
1367
1367
  behavior = this.camera.bouncingBehavior;
1368
1368
  break;
1369
- case 2 /* FRAMING */:
1369
+ case 2 /* CameraBehavior.FRAMING */:
1370
1370
  this.camera.useFramingBehavior = enabled;
1371
1371
  behavior = this.camera.framingBehavior;
1372
1372
  break;
@@ -1382,11 +1382,11 @@ var SceneManager = /** @class */ (function () {
1382
1382
  }
1383
1383
  // post attach configuration. Some functionalities require the attached camera.
1384
1384
  switch (type) {
1385
- case 0 /* AUTOROTATION */:
1385
+ case 0 /* CameraBehavior.AUTOROTATION */:
1386
1386
  break;
1387
- case 1 /* BOUNCING */:
1387
+ case 1 /* CameraBehavior.BOUNCING */:
1388
1388
  break;
1389
- case 2 /* FRAMING */:
1389
+ case 2 /* CameraBehavior.FRAMING */:
1390
1390
  this._observablesManager &&
1391
1391
  this._observablesManager.onModelLoadedObservable.add(function (model) {
1392
1392
  if (config.zoomOnBoundingInfo) {
@@ -1 +1 @@
1
- {"version":3,"file":"sceneManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/managers/sceneManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type {\r\n ILightConfiguration,\r\n ISceneConfiguration,\r\n ISceneOptimizerConfiguration,\r\n ICameraConfiguration,\r\n ISkyboxConfiguration,\r\n IGroundConfiguration,\r\n IModelConfiguration,\r\n IDefaultRenderingPipelineConfiguration,\r\n IVRConfiguration,\r\n} from \"../configuration/interfaces/index\";\r\nimport type { ViewerConfiguration } from \"../configuration/configuration\";\r\nimport { getConfigurationKey } from \"../configuration/configuration\";\r\nimport type { ViewerModel } from \"../model/viewerModel\";\r\nimport { ModelState } from \"../model/viewerModel\";\r\nimport { extendClassWithConfig, deepmerge } from \"../helper/index\";\r\nimport { CameraBehavior } from \"../interfaces\";\r\nimport { ViewerLabs } from \"../labs/viewerLabs\";\r\nimport { getCustomOptimizerByName } from \"../optimizer/custom/index\";\r\nimport type { ObservablesManager } from \"../managers/observablesManager\";\r\nimport type { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport type { IEnvironmentMapConfiguration } from \"../configuration/interfaces/environmentMapConfiguration\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { SceneOptimizer, SceneOptimizerOptions } from \"core/Misc/sceneOptimizer\";\r\nimport { ArcRotateCamera } from \"core/Cameras/arcRotateCamera\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { IEnvironmentHelperOptions } from \"core/Helpers/environmentHelper\";\r\nimport { EnvironmentHelper } from \"core/Helpers/environmentHelper\";\r\nimport type { VRExperienceHelper, VRExperienceHelperOptions } from \"core/Cameras/VR/vrExperienceHelper\";\r\nimport { Color3, Quaternion, Vector3, Axis, Matrix } from \"core/Maths/math\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { DefaultRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport { Animation } from \"core/Animations/index\";\r\nimport { AnimationPropertiesOverride } from \"core/Animations/animationPropertiesOverride\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { IShadowLight } from \"core/Lights/shadowLight\";\r\nimport { ShadowLight } from \"core/Lights/shadowLight\";\r\nimport { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { SpotLight } from \"core/Lights/spotLight\";\r\nimport type { PointLight } from \"core/Lights/pointLight\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { Tags } from \"core/Misc/tags\";\r\nimport type { Behavior } from \"core/Behaviors/behavior\";\r\nimport type { FramingBehavior } from \"core/Behaviors/Cameras/framingBehavior\";\r\nimport { Scene } from \"core/scene\";\r\nimport { ShadowGenerator } from \"core/Lights/Shadows/shadowGenerator\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport \"core/Audio/audioSceneComponent\";\r\nimport \"core/Helpers/sceneHelpers\";\r\nimport \"core/Misc/observable.extensions\";\r\n\r\n/**\r\n * This interface describes the structure of the variable sent with the configuration observables of the scene manager.\r\n * O - the type of object we are dealing with (Light, ArcRotateCamera, Scene, etc')\r\n * T - the configuration type\r\n */\r\nexport interface IPostConfigurationCallback<OBJ, CONF> {\r\n newConfiguration: CONF;\r\n sceneManager: SceneManager;\r\n object: OBJ;\r\n model?: ViewerModel;\r\n}\r\n\r\nexport class SceneManager {\r\n //Observers\r\n /**\r\n * Will notify when the scene was initialized\r\n */\r\n onSceneInitObservable: Observable<Scene>;\r\n /**\r\n * Will notify after the scene was configured. Can be used to further configure the scene\r\n */\r\n onSceneConfiguredObservable: Observable<IPostConfigurationCallback<Scene, ISceneConfiguration>>;\r\n /**\r\n * Will notify after the scene optimized was configured. Can be used to further configure the scene optimizer\r\n */\r\n onSceneOptimizerConfiguredObservable: Observable<IPostConfigurationCallback<SceneOptimizer, ISceneOptimizerConfiguration | boolean>>;\r\n /**\r\n * Will notify after the camera was configured. Can be used to further configure the camera\r\n */\r\n onCameraConfiguredObservable: Observable<IPostConfigurationCallback<ArcRotateCamera, ICameraConfiguration>>;\r\n /**\r\n * Will notify after the lights were configured. Can be used to further configure lights\r\n */\r\n onLightsConfiguredObservable: Observable<IPostConfigurationCallback<Array<Light>, { [name: string]: ILightConfiguration | boolean | number }>>;\r\n /**\r\n * Will notify after the model(s) were configured. Can be used to further configure models\r\n */\r\n onModelsConfiguredObservable: Observable<IPostConfigurationCallback<Array<ViewerModel>, IModelConfiguration>>;\r\n /**\r\n * Will notify after the environment was configured. Can be used to further configure the environment\r\n */\r\n onEnvironmentConfiguredObservable: Observable<\r\n IPostConfigurationCallback<EnvironmentHelper, { skybox?: ISkyboxConfiguration | boolean; ground?: IGroundConfiguration | boolean }>\r\n >;\r\n\r\n /**\r\n * Will notify after the model(s) were configured. Can be used to further configure models\r\n */\r\n onVRConfiguredObservable: Observable<IPostConfigurationCallback<VRExperienceHelper, IVRConfiguration>>;\r\n\r\n /**\r\n * The Babylon Scene of this viewer\r\n */\r\n public scene: Scene;\r\n /**\r\n * The camera used in this viewer\r\n */\r\n public camera: ArcRotateCamera;\r\n /**\r\n * Babylon's scene optimizer\r\n */\r\n public sceneOptimizer?: SceneOptimizer;\r\n /**\r\n * Models displayed in this viewer.\r\n */\r\n public models: Array<ViewerModel>;\r\n /**\r\n * Babylon's environment helper of this viewer\r\n */\r\n public environmentHelper?: EnvironmentHelper;\r\n\r\n //The following are configuration objects, default values.\r\n protected _defaultHighpTextureType: number;\r\n protected _shadowGeneratorBias: number;\r\n protected _defaultPipelineTextureType: number;\r\n\r\n /**\r\n * The maximum number of shadows supported by the current viewer\r\n */\r\n protected _maxShadows: number;\r\n /**\r\n * is HDR supported?\r\n */\r\n private _hdrSupport: boolean;\r\n\r\n private readonly _white = Color3.White();\r\n\r\n private _forceShadowUpdate: boolean = false;\r\n\r\n /**\r\n * The labs variable consists of objects that will have their API change.\r\n * Please be careful when using labs in production.\r\n */\r\n public labs: ViewerLabs;\r\n\r\n private _defaultRenderingPipeline: Nullable<DefaultRenderingPipeline>;\r\n\r\n private _assetsRootURL: string;\r\n\r\n public get defaultRenderingPipeline() {\r\n return this._defaultRenderingPipeline;\r\n }\r\n\r\n protected _vrHelper?: VRExperienceHelper;\r\n\r\n public get vrHelper() {\r\n return this._vrHelper;\r\n }\r\n\r\n constructor(private _engine: Engine, private _configurationContainer: ConfigurationContainer, private _observablesManager?: ObservablesManager) {\r\n this.models = [];\r\n\r\n this.onCameraConfiguredObservable = new Observable();\r\n this.onLightsConfiguredObservable = new Observable();\r\n this.onModelsConfiguredObservable = new Observable();\r\n this.onSceneConfiguredObservable = new Observable();\r\n this.onSceneInitObservable = new Observable();\r\n this.onSceneOptimizerConfiguredObservable = new Observable();\r\n this.onEnvironmentConfiguredObservable = new Observable();\r\n this.onVRConfiguredObservable = new Observable();\r\n\r\n //this._viewer.onEngineInitObservable.add(() => {\r\n this._handleHardwareLimitations();\r\n //});\r\n\r\n this.onSceneInitObservable.add((scene) => {\r\n this.scene.animationPropertiesOverride = this.scene.animationPropertiesOverride || new AnimationPropertiesOverride();\r\n\r\n this.labs = new ViewerLabs(scene);\r\n\r\n const updateShadows = () => {\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n // Processing shadows if animates\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n scene.registerBeforeRender(() => {\r\n if (this._forceShadowUpdate || (scene.animatables && scene.animatables.length > 0)) {\r\n // make sure all models are loaded\r\n updateShadows();\r\n this._forceShadowUpdate = false;\r\n } else if (\r\n !this.models.every((model) => {\r\n if (!model.shadowsRenderedAfterLoad) {\r\n model.shadowsRenderedAfterLoad = true;\r\n return false;\r\n }\r\n return model.state === ModelState.COMPLETE && !model.currentAnimation;\r\n })\r\n ) {\r\n updateShadows();\r\n }\r\n });\r\n return this._observablesManager && this._observablesManager.onSceneInitObservable.notifyObserversWithPromise(this.scene);\r\n });\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n // Processing shadows if animates\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n }\r\n }\r\n this._focusOnModel(model);\r\n });\r\n\r\n this._observablesManager.onModelAddedObservable.add((model) => {\r\n this.models.push(model);\r\n });\r\n this._observablesManager.onModelRemovedObservable.add((model) => {\r\n this.models.splice(this.models.indexOf(model), 1);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns a boolean representing HDR support\r\n */\r\n public get isHdrSupported() {\r\n return this._hdrSupport;\r\n }\r\n\r\n /**\r\n * Return the main color defined in the configuration.\r\n */\r\n public get mainColor(): Color3 {\r\n return this._configurationContainer.mainColor;\r\n }\r\n\r\n public get reflectionColor(): Color3 {\r\n return this._configurationContainer.reflectionColor;\r\n }\r\n\r\n public get animationBlendingEnabled() {\r\n return this.scene && this.scene.animationPropertiesOverride!.enableBlending;\r\n }\r\n\r\n public set animationBlendingEnabled(value: boolean) {\r\n this.scene.animationPropertiesOverride!.enableBlending = value;\r\n }\r\n\r\n public get observablesManager() {\r\n return this._observablesManager;\r\n }\r\n\r\n private _processShadows: boolean = true;\r\n\r\n /**\r\n * The flag defining whether shadows are rendered constantly or once.\r\n */\r\n public get processShadows() {\r\n return this._processShadows;\r\n }\r\n\r\n /**\r\n * Should shadows be rendered every frame, or only once and stop.\r\n * This can be used to optimize a scene.\r\n *\r\n * Not that the shadows will NOT disapear but will remain in place.\r\n * @param process if true shadows will be updated once every frame. if false they will stop being updated.\r\n */\r\n public set processShadows(process: boolean) {\r\n const refreshType = process ? RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYFRAME : RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = refreshType;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._processShadows = process;\r\n }\r\n\r\n private _groundEnabled: boolean = true;\r\n\r\n public get groundEnabled() {\r\n return this._groundEnabled;\r\n }\r\n\r\n public set groundEnabled(newValue: boolean) {\r\n if (newValue === this._groundEnabled) {\r\n return;\r\n }\r\n\r\n this._groundEnabled = newValue;\r\n\r\n if (this.environmentHelper && this.environmentHelper.ground) {\r\n this.environmentHelper.ground.setEnabled(this._groundEnabled);\r\n }\r\n }\r\n\r\n private _groundMirrorEnabled = true;\r\n /**\r\n * gets whether the reflection is disabled.\r\n */\r\n public get groundMirrorEnabled(): boolean {\r\n return this._groundMirrorEnabled;\r\n }\r\n /**\r\n * sets whether the reflection is disabled.\r\n */\r\n public set groundMirrorEnabled(value: boolean) {\r\n if (this._groundMirrorEnabled === value) {\r\n return;\r\n }\r\n\r\n this._groundMirrorEnabled = value;\r\n if (this.environmentHelper && this.environmentHelper.groundMaterial && this.environmentHelper.groundMirror) {\r\n if (!value) {\r\n this.environmentHelper.groundMaterial.reflectionTexture = null;\r\n } else {\r\n this.environmentHelper.groundMaterial.reflectionTexture = this.environmentHelper.groundMirror;\r\n }\r\n }\r\n }\r\n\r\n private _defaultRenderingPipelineEnabled: boolean = false;\r\n\r\n public get defaultRenderingPipelineEnabled() {\r\n return this._defaultRenderingPipelineEnabled;\r\n }\r\n\r\n public set defaultRenderingPipelineEnabled(value: boolean) {\r\n if (value === this._defaultRenderingPipelineEnabled) {\r\n return;\r\n }\r\n\r\n this._defaultRenderingPipelineEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the engine flags to unlock all babylon features.\r\n * Can also be configured using the scene.flags configuration object\r\n */\r\n public unlockBabylonFeatures() {\r\n this.scene.shadowsEnabled = true;\r\n this.scene.particlesEnabled = true;\r\n this.scene.postProcessesEnabled = true;\r\n this.scene.collisionsEnabled = true;\r\n this.scene.lightsEnabled = true;\r\n this.scene.texturesEnabled = true;\r\n this.scene.lensFlaresEnabled = true;\r\n this.scene.proceduralTexturesEnabled = true;\r\n this.scene.renderTargetsEnabled = true;\r\n this.scene.spritesEnabled = true;\r\n this.scene.skeletonsEnabled = true;\r\n this.scene.audioEnabled = true;\r\n }\r\n\r\n /**\r\n * initialize the scene. Calling this function again will dispose the old scene, if exists.\r\n * @param sceneConfiguration\r\n */\r\n public initScene(sceneConfiguration: ISceneConfiguration = {}): Promise<Scene> {\r\n // if the scene exists, dispose it.\r\n if (this.scene) {\r\n this.scene.dispose();\r\n }\r\n\r\n // create a new scene\r\n this.scene = new Scene(this._engine);\r\n\r\n this._configurationContainer.scene = this.scene;\r\n\r\n // set a default PBR material\r\n if (!sceneConfiguration.defaultMaterial) {\r\n const defaultMaterial = new PBRMaterial(\"defaultMaterial\", this.scene);\r\n defaultMaterial.reflectivityColor = new Color3(0.1, 0.1, 0.1);\r\n defaultMaterial.microSurface = 0.6;\r\n\r\n if (this.scene.defaultMaterial) {\r\n this.scene.defaultMaterial.dispose();\r\n }\r\n\r\n this.scene.defaultMaterial = defaultMaterial;\r\n }\r\n\r\n this.scene.animationPropertiesOverride = new AnimationPropertiesOverride();\r\n\r\n Animation.AllowMatricesInterpolation = true;\r\n\r\n /*if (sceneConfiguration.glow) {\r\n let options: Partial<IGlowLayerOptions> = {\r\n mainTextureFixedSize: 512\r\n };\r\n if (typeof sceneConfiguration.glow === 'object') {\r\n options = sceneConfiguration.glow\r\n }\r\n var gl = new GlowLayer(\"glow\", this.scene, options);\r\n }*/\r\n\r\n return this.onSceneInitObservable.notifyObserversWithPromise(this.scene);\r\n }\r\n\r\n public clearScene(clearModels: boolean = true, clearLights: boolean = false) {\r\n if (clearModels) {\r\n this.models.forEach((m) => m.dispose());\r\n this.models.length = 0;\r\n }\r\n if (clearLights) {\r\n this.scene.lights.forEach((l) => l.dispose());\r\n }\r\n }\r\n\r\n private _globalConfiguration: ViewerConfiguration = {};\r\n\r\n /**\r\n * This will update the scene's configuration, including camera, lights, environment.\r\n * @param newConfiguration the delta that should be configured. This includes only the changes\r\n */\r\n public updateConfiguration(newConfiguration: Partial<ViewerConfiguration>) {\r\n if (this._configurationContainer) {\r\n this._globalConfiguration = this._configurationContainer.configuration;\r\n } else {\r\n this._globalConfiguration = newConfiguration;\r\n }\r\n\r\n // update scene configuration\r\n if (newConfiguration.scene) {\r\n this._configureScene(newConfiguration.scene);\r\n }\r\n\r\n // optimizer\r\n if (newConfiguration.optimizer !== undefined) {\r\n this._configureOptimizer(newConfiguration.optimizer);\r\n }\r\n\r\n // configure model\r\n /*if (newConfiguration.model && typeof newConfiguration.model === 'object') {\r\n this._configureModel(newConfiguration.model);\r\n }*/\r\n\r\n // lights\r\n this._configureLights(newConfiguration.lights);\r\n\r\n // environment\r\n if (newConfiguration.skybox !== undefined || newConfiguration.ground !== undefined) {\r\n this._configureEnvironment(newConfiguration.skybox, newConfiguration.ground);\r\n }\r\n\r\n // camera\r\n this._configureCamera(newConfiguration.camera);\r\n\r\n if (newConfiguration.environmentMap !== undefined) {\r\n this._configureEnvironmentMap(newConfiguration.environmentMap);\r\n }\r\n\r\n if (newConfiguration.vr !== undefined) {\r\n this._configureVR(newConfiguration.vr);\r\n }\r\n\r\n if (newConfiguration.lab) {\r\n // rendering pipelines\r\n if (newConfiguration.lab.defaultRenderingPipelines) {\r\n const pipelineConfig = newConfiguration.lab.defaultRenderingPipelines;\r\n if (typeof pipelineConfig === \"boolean\") {\r\n this.defaultRenderingPipelineEnabled = pipelineConfig;\r\n } else {\r\n this.defaultRenderingPipelineEnabled = true;\r\n }\r\n }\r\n\r\n if (this.environmentHelper && newConfiguration.lab.environmentMainColor) {\r\n const mainColor = new Color3(newConfiguration.lab.environmentMainColor.r, newConfiguration.lab.environmentMainColor.g, newConfiguration.lab.environmentMainColor.b);\r\n this.environmentHelper.setMainColor(mainColor);\r\n }\r\n\r\n if (newConfiguration.lab.globalLightRotation !== undefined) {\r\n // rotate all lights that are shadow lights\r\n this.scene.lights\r\n .filter((light) => light instanceof ShadowLight)\r\n .forEach((light) => {\r\n // casting and '!' are safe, due to the constraints tested before\r\n this.labs.rotateShadowLight(<ShadowLight>light, newConfiguration.lab!.globalLightRotation!);\r\n });\r\n this._forceShadowUpdate = true;\r\n }\r\n }\r\n\r\n if (this._defaultRenderingPipeline && this._defaultRenderingPipeline.imageProcessing) {\r\n this._defaultRenderingPipeline.imageProcessing.fromLinearSpace = true;\r\n }\r\n\r\n if (this._defaultRenderingPipelineShouldBuild && this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n }\r\n }\r\n\r\n private _defaultRenderingPipelineShouldBuild: boolean = true;\r\n\r\n private _rebuildPostprocesses(configuration?: IDefaultRenderingPipelineConfiguration): void {\r\n if (!this._defaultRenderingPipelineEnabled || !getConfigurationKey(\"scene.imageProcessingConfiguration.isEnabled\", this._globalConfiguration)) {\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipeline.dispose();\r\n this._defaultRenderingPipeline = null;\r\n this.scene.autoClearDepthAndStencil = true;\r\n this.scene.autoClear = true;\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n }\r\n\r\n return;\r\n }\r\n\r\n const pipelineConfig = configuration || (this._globalConfiguration.lab && this._globalConfiguration.lab.defaultRenderingPipelines);\r\n if (pipelineConfig) {\r\n if (!this._defaultRenderingPipeline) {\r\n // Create pipeline in manual mode to avoid triggering multiple shader compilations\r\n this._defaultRenderingPipeline = new DefaultRenderingPipeline(\"default rendering pipeline\", this._hdrSupport, this.scene, [this.camera], false);\r\n }\r\n this.scene.autoClear = false;\r\n this.scene.autoClearDepthAndStencil = false;\r\n this._defaultRenderingPipelineShouldBuild = true;\r\n\r\n let bloomEnabled = this._bloomEnabled;\r\n\r\n if (typeof pipelineConfig !== \"boolean\") {\r\n extendClassWithConfig(this._defaultRenderingPipeline, pipelineConfig);\r\n this._bloomEnabled = !!pipelineConfig.bloomEnabled;\r\n this._fxaaEnabled = !!pipelineConfig.fxaaEnabled;\r\n bloomEnabled = this._bloomEnabled && pipelineConfig.bloomWeight !== undefined && pipelineConfig.bloomWeight > 0;\r\n\r\n this._defaultRenderingPipeline.bloomWeight = (pipelineConfig.bloomWeight !== undefined && pipelineConfig.bloomWeight) || this._defaultRenderingPipeline.bloomWeight;\r\n }\r\n\r\n this._defaultRenderingPipeline.bloomEnabled = bloomEnabled;\r\n this._defaultRenderingPipeline.fxaaEnabled = this.fxaaEnabled;\r\n }\r\n }\r\n\r\n // default from rendering pipeline\r\n private _bloomEnabled: boolean = false;\r\n\r\n public get bloomEnabled() {\r\n return this._bloomEnabled;\r\n }\r\n\r\n public set bloomEnabled(value: boolean) {\r\n if (this._bloomEnabled === value) {\r\n return;\r\n }\r\n\r\n this._bloomEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n // default from rendering pipeline\r\n private _fxaaEnabled: boolean = false;\r\n\r\n public get fxaaEnabled() {\r\n return this._fxaaEnabled;\r\n }\r\n\r\n public set fxaaEnabled(value: boolean) {\r\n if (this._fxaaEnabled === value) {\r\n return;\r\n }\r\n\r\n this._fxaaEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setDefaultMaterial(sceneConfig: ISceneConfiguration) {}\r\n\r\n /**\r\n * internally configure the scene using the provided configuration.\r\n * The scene will not be recreated, but just updated.\r\n * @param sceneConfig the (new) scene configuration\r\n */\r\n protected _configureScene(sceneConfig: ISceneConfiguration) {\r\n // sanity check!\r\n if (!this.scene) {\r\n return;\r\n }\r\n\r\n const cc = sceneConfig.clearColor;\r\n const oldcc = this.scene.clearColor;\r\n if (cc) {\r\n if (cc.r !== undefined) {\r\n oldcc.r = cc.r;\r\n }\r\n if (cc.g !== undefined) {\r\n oldcc.g = cc.g;\r\n }\r\n if (cc.b !== undefined) {\r\n oldcc.b = cc.b;\r\n }\r\n if (cc.a !== undefined) {\r\n oldcc.a = cc.a;\r\n }\r\n }\r\n\r\n if (sceneConfig.assetsRootURL) {\r\n this._assetsRootURL = sceneConfig.assetsRootURL;\r\n }\r\n\r\n // image processing configuration - optional.\r\n if (sceneConfig.imageProcessingConfiguration) {\r\n extendClassWithConfig(this.scene.imageProcessingConfiguration, sceneConfig.imageProcessingConfiguration);\r\n }\r\n //animation properties override\r\n if (sceneConfig.animationPropertiesOverride) {\r\n extendClassWithConfig(this.scene.animationPropertiesOverride, sceneConfig.animationPropertiesOverride);\r\n }\r\n if (sceneConfig.environmentTexture) {\r\n if (!(this.scene.environmentTexture && (<CubeTexture>this.scene.environmentTexture).url === sceneConfig.environmentTexture)) {\r\n if (this.scene.environmentTexture && this.scene.environmentTexture.dispose) {\r\n this.scene.environmentTexture.dispose();\r\n }\r\n const environmentTexture = CubeTexture.CreateFromPrefilteredData(sceneConfig.environmentTexture, this.scene);\r\n this.scene.environmentTexture = environmentTexture;\r\n }\r\n }\r\n\r\n if (sceneConfig.debug === true) {\r\n this.scene.debugLayer.show();\r\n } else if (sceneConfig.debug === false) {\r\n if (this.scene.debugLayer.isVisible()) {\r\n this.scene.debugLayer.hide();\r\n }\r\n }\r\n\r\n if (sceneConfig.disableHdr) {\r\n this._handleHardwareLimitations(false);\r\n } else {\r\n this._handleHardwareLimitations(true);\r\n }\r\n\r\n if (sceneConfig.renderInBackground !== undefined) {\r\n this._engine.renderEvenInBackground = !!sceneConfig.renderInBackground;\r\n }\r\n\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (canvas) {\r\n if (this.camera && sceneConfig.disableCameraControl) {\r\n this.camera.detachControl();\r\n } else if (this.camera && sceneConfig.disableCameraControl === false) {\r\n this.camera.attachControl();\r\n }\r\n }\r\n\r\n this.setDefaultMaterial(sceneConfig);\r\n\r\n if (sceneConfig.flags) {\r\n extendClassWithConfig(this.scene, sceneConfig.flags);\r\n }\r\n\r\n this.onSceneConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.scene,\r\n newConfiguration: sceneConfig,\r\n });\r\n }\r\n\r\n /**\r\n * Configure the scene optimizer.\r\n * The existing scene optimizer will be disposed and a new one will be created.\r\n * @param optimizerConfig the (new) optimizer configuration\r\n */\r\n protected _configureOptimizer(optimizerConfig: ISceneOptimizerConfiguration | boolean) {\r\n if (typeof optimizerConfig === \"boolean\") {\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n delete this.sceneOptimizer;\r\n }\r\n if (optimizerConfig) {\r\n this.sceneOptimizer = new SceneOptimizer(this.scene);\r\n this.sceneOptimizer.start();\r\n }\r\n } else {\r\n let optimizerOptions: SceneOptimizerOptions = new SceneOptimizerOptions(optimizerConfig.targetFrameRate, optimizerConfig.trackerDuration);\r\n // check for degradation\r\n if (optimizerConfig.degradation) {\r\n switch (optimizerConfig.degradation) {\r\n case \"low\":\r\n optimizerOptions = SceneOptimizerOptions.LowDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n case \"moderate\":\r\n optimizerOptions = SceneOptimizerOptions.ModerateDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n case \"hight\":\r\n optimizerOptions = SceneOptimizerOptions.HighDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n }\r\n }\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n }\r\n if (optimizerConfig.custom) {\r\n const customOptimizer = getCustomOptimizerByName(optimizerConfig.custom, optimizerConfig.improvementMode);\r\n if (customOptimizer) {\r\n optimizerOptions.addCustomOptimization(\r\n () => {\r\n return customOptimizer(this);\r\n },\r\n () => {\r\n return `Babylon Viewer ${optimizerConfig.custom} custom optimization`;\r\n }\r\n );\r\n }\r\n }\r\n this.sceneOptimizer = new SceneOptimizer(this.scene, optimizerOptions, optimizerConfig.autoGeneratePriorities, optimizerConfig.improvementMode);\r\n this.sceneOptimizer.start();\r\n }\r\n\r\n this.onSceneOptimizerConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.sceneOptimizer!,\r\n newConfiguration: optimizerConfig,\r\n });\r\n }\r\n\r\n /**\r\n * configure all models using the configuration.\r\n * @param modelConfiguration the configuration to use to reconfigure the models\r\n */\r\n /*protected _configureModel(modelConfiguration: Partial<IModelConfiguration>) {\r\n this.models.forEach(model => {\r\n model.updateConfiguration(modelConfiguration);\r\n });\r\n\r\n this.onModelsConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.models,\r\n newConfiguration: modelConfiguration\r\n });\r\n }*/\r\n\r\n protected _configureVR(vrConfig: IVRConfiguration) {\r\n if (vrConfig.disabled) {\r\n if (this._vrHelper) {\r\n if (this._vrHelper.isInVRMode) {\r\n this._vrHelper.exitVR();\r\n }\r\n this._vrHelper.dispose();\r\n this._vrHelper = undefined;\r\n }\r\n return;\r\n }\r\n const vrOptions: VRExperienceHelperOptions = deepmerge(\r\n {\r\n useCustomVRButton: true,\r\n createDeviceOrientationCamera: false,\r\n trackPosition: true,\r\n },\r\n vrConfig.vrOptions || {}\r\n );\r\n\r\n this._vrHelper = this.scene.createDefaultVRExperience(vrOptions);\r\n if (!vrConfig.disableInteractions) {\r\n this._vrHelper.enableInteractions();\r\n }\r\n if (!vrConfig.disableTeleportation) {\r\n const floorMeshName = vrConfig.overrideFloorMeshName || \"BackgroundPlane\";\r\n this._vrHelper.enableTeleportation({\r\n floorMeshName,\r\n });\r\n }\r\n if (vrConfig.rotateUsingControllers) {\r\n let rotationOffset: Quaternion | null;\r\n this._vrHelper.onControllerMeshLoadedObservable.add((controller) => {\r\n controller.onTriggerStateChangedObservable.add((data) => {\r\n if (controller.mesh && controller.mesh.rotationQuaternion) {\r\n if (data.pressed) {\r\n if (!rotationOffset) {\r\n this.models[0].rootMesh.rotationQuaternion = this.models[0].rootMesh.rotationQuaternion || new Quaternion();\r\n rotationOffset = controller.mesh.rotationQuaternion.conjugate().multiply(this.models[0].rootMesh.rotationQuaternion!);\r\n }\r\n } else {\r\n rotationOffset = null;\r\n }\r\n }\r\n });\r\n this.scene.registerBeforeRender(() => {\r\n if (this.models[0]) {\r\n if (rotationOffset && controller.mesh && controller.mesh.rotationQuaternion) {\r\n this.models[0].rootMesh.rotationQuaternion!.copyFrom(controller.mesh.rotationQuaternion).multiplyInPlace(rotationOffset);\r\n } else {\r\n this.models[0].rootMesh.rotationQuaternion = null;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n this._vrHelper.onEnteringVRObservable.add(() => {\r\n if (this._observablesManager) {\r\n this._observablesManager.onEnteringVRObservable.notifyObservers(this);\r\n }\r\n });\r\n this._vrHelper.onExitingVRObservable.add(() => {\r\n if (this._observablesManager) {\r\n this._observablesManager.onExitingVRObservable.notifyObservers(this);\r\n }\r\n });\r\n this.onVRConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this._vrHelper,\r\n newConfiguration: vrConfig,\r\n });\r\n }\r\n\r\n protected _configureEnvironmentMap(environmentMapConfiguration: IEnvironmentMapConfiguration): any {\r\n if (environmentMapConfiguration.texture) {\r\n this.scene.environmentTexture = new CubeTexture(this._getAssetUrl(environmentMapConfiguration.texture), this.scene);\r\n }\r\n\r\n //sanity check\r\n if (this.scene.environmentTexture) {\r\n const rotatquatRotationionY = Quaternion.RotationAxis(Axis.Y, environmentMapConfiguration.rotationY || 0);\r\n Matrix.FromQuaternionToRef(rotatquatRotationionY, this.scene.environmentTexture.getReflectionTextureMatrix());\r\n }\r\n\r\n // process mainColor changes:\r\n if (environmentMapConfiguration.mainColor) {\r\n this._configurationContainer.mainColor = this.mainColor || Color3.White();\r\n const mc = environmentMapConfiguration.mainColor;\r\n if (mc.r !== undefined) {\r\n this.mainColor.r = mc.r;\r\n }\r\n if (mc.g !== undefined) {\r\n this.mainColor.g = mc.g;\r\n }\r\n if (mc.b !== undefined) {\r\n this.mainColor.b = mc.b;\r\n }\r\n\r\n this.reflectionColor.copyFrom(this.mainColor);\r\n\r\n const environmentTint = getConfigurationKey(\"environmentMap.tintLevel\", this._globalConfiguration) || 0;\r\n\r\n // reflection color\r\n this.reflectionColor.toLinearSpaceToRef(this.reflectionColor);\r\n this.reflectionColor.scaleToRef(1 / this.scene.imageProcessingConfiguration.exposure, this.reflectionColor);\r\n const tmpColor3 = Color3.Lerp(this._white, this.reflectionColor, environmentTint);\r\n this.reflectionColor.copyFrom(tmpColor3);\r\n\r\n //update the environment, if exists\r\n if (this.environmentHelper) {\r\n if (this.environmentHelper.groundMaterial) {\r\n this.environmentHelper.groundMaterial._perceptualColor = this.mainColor;\r\n }\r\n\r\n if (this.environmentHelper.skyboxMaterial) {\r\n this.environmentHelper.skyboxMaterial._perceptualColor = this.mainColor;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * (Re) configure the camera. The camera will only be created once and from this point will only be reconfigured.\r\n * @param cameraConfig the new camera configuration\r\n */\r\n protected _configureCamera(cameraConfig: ICameraConfiguration = {}) {\r\n if (!this.scene.activeCamera) {\r\n // Inline scene.createDefaultCamera to reduce file size\r\n // Dispose existing camera in replace mode.\r\n if (this.scene.activeCamera) {\r\n (this.scene.activeCamera as ArcRotateCamera).dispose();\r\n this.scene.activeCamera = null;\r\n }\r\n // Camera\r\n if (!this.scene.activeCamera) {\r\n const worldExtends = this.scene.getWorldExtends();\r\n const worldSize = worldExtends.max.subtract(worldExtends.min);\r\n const worldCenter = worldExtends.min.add(worldSize.scale(0.5));\r\n\r\n let radius = worldSize.length() * 1.5;\r\n // empty scene scenario!\r\n if (!isFinite(radius)) {\r\n radius = 1;\r\n worldCenter.copyFromFloats(0, 0, 0);\r\n }\r\n\r\n const arcRotateCamera = new ArcRotateCamera(\"default camera\", -(Math.PI / 2), Math.PI / 2, radius, worldCenter, this.scene);\r\n arcRotateCamera.lowerRadiusLimit = radius * 0.01;\r\n arcRotateCamera.wheelPrecision = 100 / radius;\r\n const camera = arcRotateCamera;\r\n\r\n camera.minZ = radius * 0.01;\r\n camera.maxZ = radius * 1000;\r\n camera.speed = radius * 0.2;\r\n this.scene.activeCamera = camera;\r\n }\r\n const canvas = this.scene.getEngine().getInputElement();\r\n if (canvas) {\r\n this.scene.activeCamera.attachControl();\r\n }\r\n\r\n this.camera = <ArcRotateCamera>this.scene.activeCamera!;\r\n this.camera.setTarget(Vector3.Zero());\r\n }\r\n if (!this.camera) {\r\n this.camera = <ArcRotateCamera>this.scene.activeCamera!;\r\n }\r\n if (cameraConfig.position) {\r\n const newPosition = this.camera.position.clone();\r\n extendClassWithConfig(newPosition, cameraConfig.position);\r\n this.camera.setPosition(newPosition);\r\n }\r\n\r\n if (cameraConfig.target) {\r\n const newTarget = this.camera.target.clone();\r\n extendClassWithConfig(newTarget, cameraConfig.target);\r\n this.camera.setTarget(newTarget);\r\n } /*else if (this.models.length && !cameraConfig.disableAutoFocus) {\r\n this._focusOnModel(this.models[0]);\r\n }*/\r\n\r\n if (cameraConfig.rotation) {\r\n this.camera.rotationQuaternion = new Quaternion(cameraConfig.rotation.x || 0, cameraConfig.rotation.y || 0, cameraConfig.rotation.z || 0, cameraConfig.rotation.w || 0);\r\n }\r\n\r\n if (cameraConfig.behaviors) {\r\n for (const name in cameraConfig.behaviors) {\r\n if (cameraConfig.behaviors[name] !== undefined) {\r\n this._setCameraBehavior(name, cameraConfig.behaviors[name]);\r\n }\r\n }\r\n }\r\n\r\n const sceneExtends = this.scene.getWorldExtends((mesh) => {\r\n return !this.environmentHelper || (mesh !== this.environmentHelper.ground && mesh !== this.environmentHelper.rootMesh && mesh !== this.environmentHelper.skybox);\r\n });\r\n const sceneDiagonal = sceneExtends.max.subtract(sceneExtends.min);\r\n const sceneDiagonalLength = sceneDiagonal.length();\r\n if (isFinite(sceneDiagonalLength)) {\r\n this.camera.upperRadiusLimit = sceneDiagonalLength * 4;\r\n }\r\n\r\n // sanity check!\r\n if (this.scene.imageProcessingConfiguration) {\r\n this.scene.imageProcessingConfiguration.colorCurvesEnabled = true;\r\n this.scene.imageProcessingConfiguration.vignetteEnabled = true;\r\n this.scene.imageProcessingConfiguration.toneMappingEnabled = !!getConfigurationKey(\"camera.toneMappingEnabled\", this._globalConfiguration);\r\n }\r\n\r\n extendClassWithConfig(this.camera, cameraConfig);\r\n\r\n this.onCameraConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.camera,\r\n newConfiguration: cameraConfig,\r\n });\r\n }\r\n\r\n private _focusOnModel = (model: ViewerModel) => {\r\n const boundingInfo = model.rootMesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n this.camera.setTarget(center);\r\n this.camera.alpha = (this._globalConfiguration.camera && this._globalConfiguration.camera.alpha) || this.camera.alpha;\r\n this.camera.beta = (this._globalConfiguration.camera && this._globalConfiguration.camera.beta) || this.camera.beta;\r\n this.camera.radius = (this._globalConfiguration.camera && this._globalConfiguration.camera.radius) || this.camera.radius;\r\n\r\n const sceneDiagonalLenght = sizeVec.length();\r\n if (isFinite(sceneDiagonalLenght)) {\r\n this.camera.upperRadiusLimit = sceneDiagonalLenght * 4;\r\n }\r\n\r\n if (this._configurationContainer.configuration) {\r\n this._configureEnvironment(this._configurationContainer.configuration.skybox, this._configurationContainer.configuration.ground);\r\n }\r\n /*this.scene.lights.filter(light => light instanceof ShadowLight).forEach(light => {\r\n // casting ais safe, due to the constraints tested before\r\n (<ShadowLight>light).setDirectionToTarget(center);\r\n });*/\r\n };\r\n\r\n protected _configureEnvironment(skyboxConifguration?: ISkyboxConfiguration | boolean, groundConfiguration?: IGroundConfiguration | boolean) {\r\n if (!skyboxConifguration && !groundConfiguration) {\r\n if (this.environmentHelper) {\r\n this.environmentHelper.dispose();\r\n this.environmentHelper = undefined;\r\n }\r\n } else {\r\n const options: Partial<IEnvironmentHelperOptions> = {\r\n createGround: !!groundConfiguration && this._groundEnabled,\r\n createSkybox: !!skyboxConifguration,\r\n setupImageProcessing: false, // will be done at the scene level!,\r\n };\r\n\r\n // will that cause problems with model ground configuration?\r\n /*if (model) {\r\n const boundingInfo = model.rootMesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n options.groundYBias = -center.y;\r\n }*/\r\n\r\n if (groundConfiguration) {\r\n const groundConfig = typeof groundConfiguration === \"boolean\" ? {} : groundConfiguration;\r\n\r\n const groundSize = groundConfig.size || (typeof skyboxConifguration === \"object\" && skyboxConifguration.scale);\r\n if (groundSize) {\r\n options.groundSize = groundSize;\r\n }\r\n\r\n options.enableGroundShadow = groundConfig === true || groundConfig.receiveShadows;\r\n if (groundConfig.shadowLevel !== undefined) {\r\n options.groundShadowLevel = groundConfig.shadowLevel;\r\n }\r\n options.enableGroundMirror = !!groundConfig.mirror && this.groundMirrorEnabled;\r\n if (groundConfig.texture) {\r\n options.groundTexture = this._getAssetUrl(groundConfig.texture);\r\n }\r\n if (groundConfig.color) {\r\n options.groundColor = new Color3(groundConfig.color.r, groundConfig.color.g, groundConfig.color.b);\r\n }\r\n\r\n if (groundConfig.opacity !== undefined) {\r\n options.groundOpacity = groundConfig.opacity;\r\n }\r\n\r\n if (groundConfig.mirror) {\r\n options.enableGroundMirror = true;\r\n // to prevent undefines\r\n if (typeof groundConfig.mirror === \"object\") {\r\n if (groundConfig.mirror.amount !== undefined) {\r\n options.groundMirrorAmount = groundConfig.mirror.amount;\r\n }\r\n if (groundConfig.mirror.sizeRatio !== undefined) {\r\n options.groundMirrorSizeRatio = groundConfig.mirror.sizeRatio;\r\n }\r\n if (groundConfig.mirror.blurKernel !== undefined) {\r\n options.groundMirrorBlurKernel = groundConfig.mirror.blurKernel;\r\n }\r\n if (groundConfig.mirror.fresnelWeight !== undefined) {\r\n options.groundMirrorFresnelWeight = groundConfig.mirror.fresnelWeight;\r\n }\r\n if (groundConfig.mirror.fallOffDistance !== undefined) {\r\n options.groundMirrorFallOffDistance = groundConfig.mirror.fallOffDistance;\r\n }\r\n if (this._defaultPipelineTextureType !== undefined) {\r\n options.groundMirrorTextureType = this._defaultPipelineTextureType;\r\n }\r\n }\r\n }\r\n }\r\n\r\n let postInitSkyboxMaterial = false;\r\n if (skyboxConifguration) {\r\n const conf = skyboxConifguration === true ? {} : skyboxConifguration;\r\n if (conf.material && conf.material.imageProcessingConfiguration) {\r\n options.setupImageProcessing = false; // will be configured later manually.\r\n }\r\n const skyboxSize = conf.scale;\r\n if (skyboxSize) {\r\n options.skyboxSize = skyboxSize;\r\n }\r\n options.sizeAuto = !options.skyboxSize;\r\n if (conf.color) {\r\n options.skyboxColor = new Color3(conf.color.r, conf.color.g, conf.color.b);\r\n }\r\n if (conf.cubeTexture && conf.cubeTexture.url) {\r\n if (typeof conf.cubeTexture.url === \"string\") {\r\n options.skyboxTexture = this._getAssetUrl(conf.cubeTexture.url);\r\n } else {\r\n // init later!\r\n postInitSkyboxMaterial = true;\r\n }\r\n }\r\n\r\n if (conf.material) {\r\n postInitSkyboxMaterial = true;\r\n }\r\n }\r\n\r\n options.setupImageProcessing = false; // TMP\r\n\r\n if (!this.environmentHelper) {\r\n this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n } else {\r\n // unlikely, but there might be a new scene! we need to dispose.\r\n\r\n // get the scene used by the envHelper\r\n const scene: Scene = this.environmentHelper.rootMesh.getScene();\r\n // is it a different scene? Oh no!\r\n if (scene !== this.scene) {\r\n this.environmentHelper.dispose();\r\n this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n } else {\r\n // recreate the ground\r\n if (this.environmentHelper.ground) {\r\n this.environmentHelper.ground.dispose();\r\n }\r\n // recreate the skybox\r\n if (this.environmentHelper.skybox) {\r\n this.environmentHelper.skybox.dispose();\r\n }\r\n\r\n this.environmentHelper.updateOptions(options)!;\r\n // update doesn't change the size of the skybox and ground, so we have to recreate!\r\n //this.environmentHelper.dispose();\r\n //this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n }\r\n }\r\n\r\n if (this.environmentHelper.rootMesh && this._globalConfiguration.scene && this._globalConfiguration.scene.environmentRotationY !== undefined) {\r\n this.environmentHelper.rootMesh.rotation.y = this._globalConfiguration.scene.environmentRotationY;\r\n }\r\n\r\n const groundConfig = typeof groundConfiguration === \"boolean\" ? {} : groundConfiguration;\r\n if (this.environmentHelper.groundMaterial && groundConfig) {\r\n this.environmentHelper.groundMaterial._perceptualColor = this.mainColor;\r\n if (groundConfig.material) {\r\n extendClassWithConfig(this.environmentHelper.groundMaterial, groundConfig.material);\r\n }\r\n\r\n if (this.environmentHelper.groundMirror) {\r\n const mirrorClearColor = this.environmentHelper.groundMaterial._perceptualColor.toLinearSpace();\r\n // TODO user camera exposure value to set the mirror clear color\r\n const exposure = Math.pow(2.0, -this.scene.imageProcessingConfiguration.exposure) * Math.PI;\r\n mirrorClearColor.scaleToRef(1 / exposure, mirrorClearColor);\r\n\r\n this.environmentHelper.groundMirror.clearColor.r = Scalar.Clamp(mirrorClearColor.r);\r\n this.environmentHelper.groundMirror.clearColor.g = Scalar.Clamp(mirrorClearColor.g);\r\n this.environmentHelper.groundMirror.clearColor.b = Scalar.Clamp(mirrorClearColor.b);\r\n this.environmentHelper.groundMirror.clearColor.a = 1;\r\n\r\n if (!this.groundMirrorEnabled) {\r\n this.environmentHelper.groundMaterial.reflectionTexture = null;\r\n }\r\n }\r\n }\r\n\r\n const skyboxMaterial = this.environmentHelper.skyboxMaterial;\r\n if (skyboxMaterial) {\r\n skyboxMaterial._perceptualColor = this.mainColor;\r\n\r\n if (postInitSkyboxMaterial) {\r\n if (typeof skyboxConifguration === \"object\" && skyboxConifguration.material) {\r\n extendClassWithConfig(skyboxMaterial, skyboxConifguration.material);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n this._updateGroundMirrorRenderList(model);\r\n });\r\n\r\n this.onEnvironmentConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.environmentHelper!,\r\n newConfiguration: {\r\n skybox: skyboxConifguration,\r\n ground: groundConfiguration,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * configure the lights.\r\n * @param lightsConfiguration the (new) light(s) configuration\r\n */\r\n protected _configureLights(lightsConfiguration: { [name: string]: ILightConfiguration | boolean | number } = {}) {\r\n // sanity check!\r\n const lightKeys = Object.keys(lightsConfiguration).filter((name) => name !== \"globalRotation\");\r\n\r\n if (!lightKeys.length) {\r\n if (!this.scene.lights.length) {\r\n new HemisphericLight(\"default light\", Vector3.Up(), this.scene);\r\n }\r\n } else {\r\n let lightsAvailable: Array<string> = this.scene.lights.map((light) => light.name);\r\n // compare to the global (!) configuration object and dispose unneeded:\r\n const lightsToConfigure = Object.keys(this._globalConfiguration.lights || []);\r\n if (Object.keys(lightsToConfigure).length !== lightsAvailable.length) {\r\n lightsAvailable.forEach((lName) => {\r\n if (lightsToConfigure.indexOf(lName) === -1) {\r\n this.scene.getLightByName(lName)!.dispose();\r\n }\r\n });\r\n }\r\n\r\n lightKeys.forEach((name) => {\r\n let lightConfig: ILightConfiguration = { type: 0 };\r\n if (typeof lightsConfiguration[name] === \"object\") {\r\n lightConfig = <ILightConfiguration>lightsConfiguration[name];\r\n }\r\n if (typeof lightsConfiguration[name] === \"number\") {\r\n lightConfig.type = <number>lightsConfiguration[name];\r\n }\r\n\r\n lightConfig.name = name;\r\n\r\n let light: Light;\r\n // light is not already available\r\n if (lightsAvailable.indexOf(name) === -1) {\r\n const constructor = Light.GetConstructorFromName(lightConfig.type, lightConfig.name, this.scene);\r\n if (!constructor) {\r\n return;\r\n }\r\n light = constructor();\r\n } else {\r\n // available? get it from the scene\r\n light = <Light>this.scene.getLightByName(name);\r\n if (typeof lightsConfiguration[name] === \"boolean\") {\r\n lightConfig.type = light.getTypeID();\r\n }\r\n lightsAvailable = lightsAvailable.filter((ln) => ln !== name);\r\n if (lightConfig.type !== undefined && light.getTypeID() !== lightConfig.type) {\r\n light.dispose();\r\n const constructor = Light.GetConstructorFromName(lightConfig.type, lightConfig.name, this.scene);\r\n if (!constructor) {\r\n return;\r\n }\r\n light = constructor();\r\n }\r\n }\r\n\r\n // if config set the light to false, dispose it.\r\n if (lightsConfiguration[name] === false) {\r\n light.dispose();\r\n return;\r\n }\r\n\r\n //enabled\r\n const enabled = lightConfig.enabled !== undefined ? lightConfig.enabled : !lightConfig.disabled;\r\n light.setEnabled(enabled);\r\n\r\n extendClassWithConfig(light, lightConfig);\r\n\r\n //position. Some lights don't support shadows\r\n if (light instanceof ShadowLight) {\r\n // set default values\r\n light.shadowMinZ = light.shadowMinZ || 0.2;\r\n light.shadowMaxZ = Math.min(10, light.shadowMaxZ || 10); //large far clips reduce shadow depth precision\r\n\r\n if (lightConfig.target) {\r\n if (light.setDirectionToTarget) {\r\n const target = Vector3.Zero().copyFromFloats(lightConfig.target.x, lightConfig.target.y, lightConfig.target.z);\r\n light.setDirectionToTarget(target);\r\n }\r\n } else if (lightConfig.direction) {\r\n const direction = Vector3.Zero().copyFromFloats(lightConfig.direction.x, lightConfig.direction.y, lightConfig.direction.z);\r\n light.direction = direction;\r\n }\r\n\r\n let isShadowEnabled = false;\r\n if (light.getTypeID() === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n (<DirectionalLight>light).shadowFrustumSize = lightConfig.shadowFrustumSize || 2;\r\n isShadowEnabled = true;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n const spotLight: SpotLight = <SpotLight>light;\r\n if (lightConfig.spotAngle !== undefined) {\r\n spotLight.angle = (lightConfig.spotAngle * Math.PI) / 180;\r\n }\r\n if (spotLight.angle && lightConfig.shadowFieldOfView) {\r\n spotLight.shadowAngleScale = lightConfig.shadowFieldOfView / spotLight.angle;\r\n }\r\n isShadowEnabled = true;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_POINTLIGHT) {\r\n if (lightConfig.shadowFieldOfView) {\r\n (<PointLight>light).shadowAngle = (lightConfig.shadowFieldOfView * Math.PI) / 180;\r\n }\r\n isShadowEnabled = true;\r\n }\r\n\r\n let shadowGenerator = <ShadowGenerator>light.getShadowGenerator();\r\n if (isShadowEnabled && lightConfig.shadowEnabled && this._maxShadows) {\r\n const bufferSize = lightConfig.shadowBufferSize || 256;\r\n\r\n if (!shadowGenerator) {\r\n shadowGenerator = new ShadowGenerator(bufferSize, light);\r\n }\r\n\r\n const blurKernel = this.getBlurKernel(light, bufferSize);\r\n shadowGenerator.bias = this._shadowGeneratorBias;\r\n shadowGenerator.blurKernel = blurKernel;\r\n //override defaults\r\n extendClassWithConfig(shadowGenerator, lightConfig.shadowConfig || {});\r\n\r\n // add the focus meshes to the shadow list\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n this._updateShadowRenderList(shadowGenerator, model);\r\n });\r\n\r\n //if (model) {\r\n this._updateShadowRenderList(shadowGenerator);\r\n //}\r\n } else if (shadowGenerator) {\r\n shadowGenerator.dispose();\r\n }\r\n }\r\n });\r\n\r\n // render priority\r\n const globalLightsConfiguration = this._globalConfiguration.lights || {};\r\n Object.keys(globalLightsConfiguration)\r\n .sort()\r\n .forEach((name, idx) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n // const configuration = globalLightsConfiguration[name];\r\n const light = this.scene.getLightByName(name);\r\n // sanity check\r\n if (!light) {\r\n return;\r\n }\r\n light.renderPriority = -idx;\r\n });\r\n }\r\n\r\n this.onLightsConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.scene.lights,\r\n newConfiguration: lightsConfiguration,\r\n });\r\n }\r\n\r\n private _shadowGroundPlane: Nullable<AbstractMesh>;\r\n\r\n private _updateShadowRenderList(shadowGenerator: ShadowGenerator, model?: ViewerModel, resetList?: boolean) {\r\n const focusMeshes = model ? model.meshes : this.scene.meshes;\r\n // add the focus meshes to the shadow list\r\n const shadownMap = shadowGenerator.getShadowMap();\r\n if (!shadownMap) {\r\n return;\r\n }\r\n if (resetList && shadownMap.renderList) {\r\n shadownMap.renderList.length = 0;\r\n } else {\r\n shadownMap.renderList = shadownMap.renderList || [];\r\n }\r\n for (let index = 0; index < focusMeshes.length; index++) {\r\n const mesh = focusMeshes[index];\r\n if (Tags.MatchesQuery(mesh, \"castShadow\") && shadownMap.renderList.indexOf(mesh) === -1) {\r\n shadownMap.renderList.push(mesh);\r\n }\r\n }\r\n\r\n if (!this._shadowGroundPlane) {\r\n if (shadowGenerator.useBlurCloseExponentialShadowMap) {\r\n const shadowGroundPlane = CreatePlane(\"shadowGroundPlane\", { size: 100 }, this.scene);\r\n shadowGroundPlane.useVertexColors = false;\r\n //material isn't ever used in rendering, just used to set back face culling\r\n shadowGroundPlane.material = new PBRMaterial(\"shadowGroundPlaneMaterial\", this.scene);\r\n shadowGroundPlane.material.backFaceCulling = false;\r\n shadowGroundPlane.rotation.x = Math.PI * 0.5;\r\n shadowGroundPlane.freezeWorldMatrix();\r\n this._shadowGroundPlane = shadowGroundPlane;\r\n this.scene.removeMesh(shadowGroundPlane);\r\n }\r\n } else {\r\n if (!shadowGenerator.useBlurCloseExponentialShadowMap) {\r\n this._shadowGroundPlane.dispose();\r\n this._shadowGroundPlane = null;\r\n }\r\n }\r\n\r\n if (this._shadowGroundPlane && shadownMap.renderList.indexOf(this._shadowGroundPlane) === -1) {\r\n shadownMap.renderList.push(this._shadowGroundPlane);\r\n }\r\n }\r\n\r\n private _updateGroundMirrorRenderList(model?: ViewerModel, resetList?: boolean) {\r\n if (this.environmentHelper && this.environmentHelper.groundMirror && this.environmentHelper.groundMirror.renderList) {\r\n const focusMeshes = model ? model.meshes : this.scene.meshes;\r\n const renderList = this.environmentHelper.groundMirror.renderList;\r\n if (resetList) {\r\n renderList.length = 0;\r\n }\r\n for (let index = 0; index < focusMeshes.length; index++) {\r\n const mesh = focusMeshes[index];\r\n if (renderList.indexOf(mesh) === -1) {\r\n renderList.push(mesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the shadow map blur kernel according to the light configuration.\r\n * @param light The light used to generate the shadows\r\n * @param bufferSize The size of the shadow map\r\n * @returns the kernel blur size\r\n */\r\n public getBlurKernel(light: IShadowLight, bufferSize: number): number {\r\n let normalizedBlurKernel = 0.05; // TODO Should come from the config.\r\n if (light.getTypeID() === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / (<DirectionalLight>light).shadowFrustumSize;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_POINTLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / (<PointLight>light).shadowAngle;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / ((<SpotLight>light).angle * (<SpotLight>light).shadowAngleScale);\r\n }\r\n\r\n const minimumBlurKernel = 5 / (bufferSize / 256); //magic number that aims to keep away sawtooth shadows\r\n\r\n const blurKernel = Math.max(bufferSize * normalizedBlurKernel, minimumBlurKernel);\r\n return blurKernel;\r\n }\r\n\r\n /**\r\n * Alters render settings to reduce features based on hardware feature limitations\r\n * @param enableHDR Allows the viewer to run in HDR mode.\r\n */\r\n protected _handleHardwareLimitations(enableHDR = true) {\r\n //flip rendering settings switches based on hardware support\r\n const maxVaryingRows = this._engine.getCaps().maxVaryingVectors;\r\n const maxFragmentSamplers = this._engine.getCaps().maxTexturesImageUnits;\r\n\r\n //shadows are disabled if there's not enough varyings for a single shadow\r\n if (maxVaryingRows < 8 || maxFragmentSamplers < 8) {\r\n this._maxShadows = 0;\r\n } else {\r\n this._maxShadows = 3;\r\n }\r\n\r\n //can we render to any >= 16-bit targets (required for HDR)\r\n const caps = this._engine.getCaps();\r\n const linearHalfFloatTargets = caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering;\r\n const linearFloatTargets = caps.textureFloatRender && caps.textureFloatLinearFiltering;\r\n\r\n this._hdrSupport = enableHDR && !!(linearFloatTargets || linearHalfFloatTargets);\r\n\r\n if (linearHalfFloatTargets) {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n this._shadowGeneratorBias = 0.002;\r\n } else if (linearFloatTargets) {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_FLOAT;\r\n this._shadowGeneratorBias = 0.001;\r\n } else {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n this._shadowGeneratorBias = 0.001;\r\n }\r\n\r\n this._defaultPipelineTextureType = this._hdrSupport ? this._defaultHighpTextureType : Constants.TEXTURETYPE_UNSIGNED_INT;\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 // this.onCameraConfiguredObservable.clear();\r\n this.onEnvironmentConfiguredObservable.clear();\r\n this.onLightsConfiguredObservable.clear();\r\n this.onModelsConfiguredObservable.clear();\r\n this.onSceneConfiguredObservable.clear();\r\n this.onSceneInitObservable.clear();\r\n this.onSceneOptimizerConfiguredObservable.clear();\r\n this.onVRConfiguredObservable.clear();\r\n\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n }\r\n\r\n if (this.environmentHelper) {\r\n this.environmentHelper.dispose();\r\n }\r\n\r\n this.models.forEach((model) => {\r\n model.dispose();\r\n });\r\n\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipeline.dispose();\r\n }\r\n\r\n this.models.length = 0;\r\n\r\n if (this.scene) {\r\n this.scene.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Get an environment asset url by using the configuration if the path is not absolute.\r\n * @param url Asset url\r\n * @returns The Asset url using the `environmentAssetsRootURL` if the url is not an absolute path.\r\n */\r\n private _getAssetUrl(url: string): string {\r\n let returnUrl = url;\r\n if (url && url.toLowerCase().indexOf(\"//\") === -1) {\r\n if (!this._assetsRootURL) {\r\n // Tools.Warn(\"Please, specify the root url of your assets before loading the configuration (labs.environmentAssetsRootURL) or disable the background through the viewer options.\");\r\n return url;\r\n }\r\n\r\n returnUrl = this._assetsRootURL + returnUrl;\r\n }\r\n\r\n return returnUrl;\r\n }\r\n\r\n private _cameraBehaviorMapping: { [name: string]: number } = {};\r\n\r\n private _setCameraBehavior(\r\n name: string,\r\n behaviorConfig:\r\n | boolean\r\n | number\r\n | {\r\n type: number;\r\n [propName: string]: any;\r\n }\r\n ) {\r\n let behavior: Behavior<ArcRotateCamera> | null;\r\n let type: number;\r\n if (typeof behaviorConfig === \"object\") {\r\n type = behaviorConfig.type;\r\n } else if (typeof behaviorConfig === \"number\") {\r\n type = behaviorConfig;\r\n } else {\r\n type = this._cameraBehaviorMapping[name];\r\n }\r\n\r\n if (type === undefined) {\r\n return;\r\n }\r\n\r\n const config: { [propName: string]: any } = typeof behaviorConfig === \"object\" ? behaviorConfig : {};\r\n\r\n let enabled = true;\r\n if (typeof behaviorConfig === \"boolean\") {\r\n enabled = behaviorConfig;\r\n }\r\n\r\n // constructing behavior\r\n switch (type) {\r\n case CameraBehavior.AUTOROTATION:\r\n this.camera.useAutoRotationBehavior = enabled;\r\n behavior = this.camera.autoRotationBehavior;\r\n break;\r\n case CameraBehavior.BOUNCING:\r\n this.camera.useBouncingBehavior = enabled;\r\n behavior = this.camera.bouncingBehavior;\r\n break;\r\n case CameraBehavior.FRAMING:\r\n this.camera.useFramingBehavior = enabled;\r\n behavior = this.camera.framingBehavior;\r\n break;\r\n default:\r\n behavior = null;\r\n break;\r\n }\r\n\r\n if (behavior) {\r\n this._cameraBehaviorMapping[name] = type;\r\n\r\n if (typeof behaviorConfig === \"object\") {\r\n extendClassWithConfig(behavior, behaviorConfig);\r\n }\r\n }\r\n\r\n // post attach configuration. Some functionalities require the attached camera.\r\n switch (type) {\r\n case CameraBehavior.AUTOROTATION:\r\n break;\r\n case CameraBehavior.BOUNCING:\r\n break;\r\n case CameraBehavior.FRAMING:\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n if (config.zoomOnBoundingInfo) {\r\n (<FramingBehavior>behavior).zoomOnMeshHierarchy(model.rootMesh);\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sceneManager.js","sourceRoot":"","sources":["../../../../tools/viewer/src/managers/sceneManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nimport type {\r\n ILightConfiguration,\r\n ISceneConfiguration,\r\n ISceneOptimizerConfiguration,\r\n ICameraConfiguration,\r\n ISkyboxConfiguration,\r\n IGroundConfiguration,\r\n IModelConfiguration,\r\n IDefaultRenderingPipelineConfiguration,\r\n IVRConfiguration,\r\n} from \"../configuration/interfaces/index\";\r\nimport type { ViewerConfiguration } from \"../configuration/configuration\";\r\nimport { getConfigurationKey } from \"../configuration/configuration\";\r\nimport type { ViewerModel } from \"../model/viewerModel\";\r\nimport { ModelState } from \"../model/viewerModel\";\r\nimport { extendClassWithConfig, deepmerge } from \"../helper/index\";\r\nimport { CameraBehavior } from \"../interfaces\";\r\nimport { ViewerLabs } from \"../labs/viewerLabs\";\r\nimport { getCustomOptimizerByName } from \"../optimizer/custom/index\";\r\nimport type { ObservablesManager } from \"../managers/observablesManager\";\r\nimport type { ConfigurationContainer } from \"../configuration/configurationContainer\";\r\nimport type { IEnvironmentMapConfiguration } from \"../configuration/interfaces/environmentMapConfiguration\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { SceneOptimizer, SceneOptimizerOptions } from \"core/Misc/sceneOptimizer\";\r\nimport { ArcRotateCamera } from \"core/Cameras/arcRotateCamera\";\r\nimport { Light } from \"core/Lights/light\";\r\nimport type { IEnvironmentHelperOptions } from \"core/Helpers/environmentHelper\";\r\nimport { EnvironmentHelper } from \"core/Helpers/environmentHelper\";\r\nimport type { VRExperienceHelper, VRExperienceHelperOptions } from \"core/Cameras/VR/vrExperienceHelper\";\r\nimport { Color3, Quaternion, Vector3, Axis, Matrix } from \"core/Maths/math\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { DefaultRenderingPipeline } from \"core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\nimport { Animation } from \"core/Animations/index\";\r\nimport { AnimationPropertiesOverride } from \"core/Animations/animationPropertiesOverride\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport type { IShadowLight } from \"core/Lights/shadowLight\";\r\nimport { ShadowLight } from \"core/Lights/shadowLight\";\r\nimport { CubeTexture } from \"core/Materials/Textures/cubeTexture\";\r\nimport type { DirectionalLight } from \"core/Lights/directionalLight\";\r\nimport { HemisphericLight } from \"core/Lights/hemisphericLight\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport type { SpotLight } from \"core/Lights/spotLight\";\r\nimport type { PointLight } from \"core/Lights/pointLight\";\r\nimport type { AbstractMesh } from \"core/Meshes/abstractMesh\";\r\nimport { CreatePlane } from \"core/Meshes/Builders/planeBuilder\";\r\nimport { Tags } from \"core/Misc/tags\";\r\nimport type { Behavior } from \"core/Behaviors/behavior\";\r\nimport type { FramingBehavior } from \"core/Behaviors/Cameras/framingBehavior\";\r\nimport { Scene } from \"core/scene\";\r\nimport { ShadowGenerator } from \"core/Lights/Shadows/shadowGenerator\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport \"core/Audio/audioSceneComponent\";\r\nimport \"core/Helpers/sceneHelpers\";\r\nimport \"core/Misc/observable.extensions\";\r\n\r\n/**\r\n * This interface describes the structure of the variable sent with the configuration observables of the scene manager.\r\n * O - the type of object we are dealing with (Light, ArcRotateCamera, Scene, etc')\r\n * T - the configuration type\r\n */\r\nexport interface IPostConfigurationCallback<OBJ, CONF> {\r\n newConfiguration: CONF;\r\n sceneManager: SceneManager;\r\n object: OBJ;\r\n model?: ViewerModel;\r\n}\r\n\r\nexport class SceneManager {\r\n //Observers\r\n /**\r\n * Will notify when the scene was initialized\r\n */\r\n onSceneInitObservable: Observable<Scene>;\r\n /**\r\n * Will notify after the scene was configured. Can be used to further configure the scene\r\n */\r\n onSceneConfiguredObservable: Observable<IPostConfigurationCallback<Scene, ISceneConfiguration>>;\r\n /**\r\n * Will notify after the scene optimized was configured. Can be used to further configure the scene optimizer\r\n */\r\n onSceneOptimizerConfiguredObservable: Observable<IPostConfigurationCallback<SceneOptimizer, ISceneOptimizerConfiguration | boolean>>;\r\n /**\r\n * Will notify after the camera was configured. Can be used to further configure the camera\r\n */\r\n onCameraConfiguredObservable: Observable<IPostConfigurationCallback<ArcRotateCamera, ICameraConfiguration>>;\r\n /**\r\n * Will notify after the lights were configured. Can be used to further configure lights\r\n */\r\n onLightsConfiguredObservable: Observable<IPostConfigurationCallback<Array<Light>, { [name: string]: ILightConfiguration | boolean | number }>>;\r\n /**\r\n * Will notify after the model(s) were configured. Can be used to further configure models\r\n */\r\n onModelsConfiguredObservable: Observable<IPostConfigurationCallback<Array<ViewerModel>, IModelConfiguration>>;\r\n /**\r\n * Will notify after the environment was configured. Can be used to further configure the environment\r\n */\r\n onEnvironmentConfiguredObservable: Observable<\r\n IPostConfigurationCallback<EnvironmentHelper, { skybox?: ISkyboxConfiguration | boolean; ground?: IGroundConfiguration | boolean }>\r\n >;\r\n\r\n /**\r\n * Will notify after the model(s) were configured. Can be used to further configure models\r\n */\r\n onVRConfiguredObservable: Observable<IPostConfigurationCallback<VRExperienceHelper, IVRConfiguration>>;\r\n\r\n /**\r\n * The Babylon Scene of this viewer\r\n */\r\n public scene: Scene;\r\n /**\r\n * The camera used in this viewer\r\n */\r\n public camera: ArcRotateCamera;\r\n /**\r\n * Babylon's scene optimizer\r\n */\r\n public sceneOptimizer?: SceneOptimizer;\r\n /**\r\n * Models displayed in this viewer.\r\n */\r\n public models: Array<ViewerModel>;\r\n /**\r\n * Babylon's environment helper of this viewer\r\n */\r\n public environmentHelper?: EnvironmentHelper;\r\n\r\n //The following are configuration objects, default values.\r\n protected _defaultHighpTextureType: number;\r\n protected _shadowGeneratorBias: number;\r\n protected _defaultPipelineTextureType: number;\r\n\r\n /**\r\n * The maximum number of shadows supported by the current viewer\r\n */\r\n protected _maxShadows: number;\r\n /**\r\n * is HDR supported?\r\n */\r\n private _hdrSupport: boolean;\r\n\r\n private readonly _white = Color3.White();\r\n\r\n private _forceShadowUpdate: boolean = false;\r\n\r\n /**\r\n * The labs variable consists of objects that will have their API change.\r\n * Please be careful when using labs in production.\r\n */\r\n public labs: ViewerLabs;\r\n\r\n private _defaultRenderingPipeline: Nullable<DefaultRenderingPipeline>;\r\n\r\n private _assetsRootURL: string;\r\n\r\n public get defaultRenderingPipeline() {\r\n return this._defaultRenderingPipeline;\r\n }\r\n\r\n protected _vrHelper?: VRExperienceHelper;\r\n\r\n public get vrHelper() {\r\n return this._vrHelper;\r\n }\r\n\r\n constructor(private _engine: Engine, private _configurationContainer: ConfigurationContainer, private _observablesManager?: ObservablesManager) {\r\n this.models = [];\r\n\r\n this.onCameraConfiguredObservable = new Observable();\r\n this.onLightsConfiguredObservable = new Observable();\r\n this.onModelsConfiguredObservable = new Observable();\r\n this.onSceneConfiguredObservable = new Observable();\r\n this.onSceneInitObservable = new Observable();\r\n this.onSceneOptimizerConfiguredObservable = new Observable();\r\n this.onEnvironmentConfiguredObservable = new Observable();\r\n this.onVRConfiguredObservable = new Observable();\r\n\r\n //this._viewer.onEngineInitObservable.add(() => {\r\n this._handleHardwareLimitations();\r\n //});\r\n\r\n this.onSceneInitObservable.add((scene) => {\r\n this.scene.animationPropertiesOverride = this.scene.animationPropertiesOverride || new AnimationPropertiesOverride();\r\n\r\n this.labs = new ViewerLabs(scene);\r\n\r\n const updateShadows = () => {\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n // Processing shadows if animates\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n scene.registerBeforeRender(() => {\r\n if (this._forceShadowUpdate || (scene.animatables && scene.animatables.length > 0)) {\r\n // make sure all models are loaded\r\n updateShadows();\r\n this._forceShadowUpdate = false;\r\n } else if (\r\n !this.models.every((model) => {\r\n if (!model.shadowsRenderedAfterLoad) {\r\n model.shadowsRenderedAfterLoad = true;\r\n return false;\r\n }\r\n return model.state === ModelState.COMPLETE && !model.currentAnimation;\r\n })\r\n ) {\r\n updateShadows();\r\n }\r\n });\r\n return this._observablesManager && this._observablesManager.onSceneInitObservable.notifyObserversWithPromise(this.scene);\r\n });\r\n if (this._observablesManager) {\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n if (generators) {\r\n // Processing shadows if animates\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n }\r\n }\r\n this._focusOnModel(model);\r\n });\r\n\r\n this._observablesManager.onModelAddedObservable.add((model) => {\r\n this.models.push(model);\r\n });\r\n this._observablesManager.onModelRemovedObservable.add((model) => {\r\n this.models.splice(this.models.indexOf(model), 1);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns a boolean representing HDR support\r\n */\r\n public get isHdrSupported() {\r\n return this._hdrSupport;\r\n }\r\n\r\n /**\r\n * Return the main color defined in the configuration.\r\n */\r\n public get mainColor(): Color3 {\r\n return this._configurationContainer.mainColor;\r\n }\r\n\r\n public get reflectionColor(): Color3 {\r\n return this._configurationContainer.reflectionColor;\r\n }\r\n\r\n public get animationBlendingEnabled() {\r\n return this.scene && this.scene.animationPropertiesOverride!.enableBlending;\r\n }\r\n\r\n public set animationBlendingEnabled(value: boolean) {\r\n this.scene.animationPropertiesOverride!.enableBlending = value;\r\n }\r\n\r\n public get observablesManager() {\r\n return this._observablesManager;\r\n }\r\n\r\n private _processShadows: boolean = true;\r\n\r\n /**\r\n * The flag defining whether shadows are rendered constantly or once.\r\n */\r\n public get processShadows() {\r\n return this._processShadows;\r\n }\r\n\r\n /**\r\n * Should shadows be rendered every frame, or only once and stop.\r\n * This can be used to optimize a scene.\r\n *\r\n * Not that the shadows will NOT disapear but will remain in place.\r\n * @param process if true shadows will be updated once every frame. if false they will stop being updated.\r\n */\r\n public set processShadows(process: boolean) {\r\n const refreshType = process ? RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYFRAME : RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n\r\n for (const light of this.scene.lights) {\r\n const generators = light.getShadowGenerators();\r\n\r\n if (generators) {\r\n const iterator = generators.values();\r\n for (let key = iterator.next(); key.done !== true; key = iterator.next()) {\r\n const generator = key.value;\r\n const shadowMap = generator.getShadowMap();\r\n if (shadowMap) {\r\n shadowMap.refreshRate = refreshType;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._processShadows = process;\r\n }\r\n\r\n private _groundEnabled: boolean = true;\r\n\r\n public get groundEnabled() {\r\n return this._groundEnabled;\r\n }\r\n\r\n public set groundEnabled(newValue: boolean) {\r\n if (newValue === this._groundEnabled) {\r\n return;\r\n }\r\n\r\n this._groundEnabled = newValue;\r\n\r\n if (this.environmentHelper && this.environmentHelper.ground) {\r\n this.environmentHelper.ground.setEnabled(this._groundEnabled);\r\n }\r\n }\r\n\r\n private _groundMirrorEnabled = true;\r\n /**\r\n * gets whether the reflection is disabled.\r\n */\r\n public get groundMirrorEnabled(): boolean {\r\n return this._groundMirrorEnabled;\r\n }\r\n /**\r\n * sets whether the reflection is disabled.\r\n */\r\n public set groundMirrorEnabled(value: boolean) {\r\n if (this._groundMirrorEnabled === value) {\r\n return;\r\n }\r\n\r\n this._groundMirrorEnabled = value;\r\n if (this.environmentHelper && this.environmentHelper.groundMaterial && this.environmentHelper.groundMirror) {\r\n if (!value) {\r\n this.environmentHelper.groundMaterial.reflectionTexture = null;\r\n } else {\r\n this.environmentHelper.groundMaterial.reflectionTexture = this.environmentHelper.groundMirror;\r\n }\r\n }\r\n }\r\n\r\n private _defaultRenderingPipelineEnabled: boolean = false;\r\n\r\n public get defaultRenderingPipelineEnabled() {\r\n return this._defaultRenderingPipelineEnabled;\r\n }\r\n\r\n public set defaultRenderingPipelineEnabled(value: boolean) {\r\n if (value === this._defaultRenderingPipelineEnabled) {\r\n return;\r\n }\r\n\r\n this._defaultRenderingPipelineEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n /**\r\n * Sets the engine flags to unlock all babylon features.\r\n * Can also be configured using the scene.flags configuration object\r\n */\r\n public unlockBabylonFeatures() {\r\n this.scene.shadowsEnabled = true;\r\n this.scene.particlesEnabled = true;\r\n this.scene.postProcessesEnabled = true;\r\n this.scene.collisionsEnabled = true;\r\n this.scene.lightsEnabled = true;\r\n this.scene.texturesEnabled = true;\r\n this.scene.lensFlaresEnabled = true;\r\n this.scene.proceduralTexturesEnabled = true;\r\n this.scene.renderTargetsEnabled = true;\r\n this.scene.spritesEnabled = true;\r\n this.scene.skeletonsEnabled = true;\r\n this.scene.audioEnabled = true;\r\n }\r\n\r\n /**\r\n * initialize the scene. Calling this function again will dispose the old scene, if exists.\r\n * @param sceneConfiguration\r\n */\r\n public initScene(sceneConfiguration: ISceneConfiguration = {}): Promise<Scene> {\r\n // if the scene exists, dispose it.\r\n if (this.scene) {\r\n this.scene.dispose();\r\n }\r\n\r\n // create a new scene\r\n this.scene = new Scene(this._engine);\r\n\r\n this._configurationContainer.scene = this.scene;\r\n\r\n // set a default PBR material\r\n if (!sceneConfiguration.defaultMaterial) {\r\n const defaultMaterial = new PBRMaterial(\"defaultMaterial\", this.scene);\r\n defaultMaterial.reflectivityColor = new Color3(0.1, 0.1, 0.1);\r\n defaultMaterial.microSurface = 0.6;\r\n\r\n if (this.scene.defaultMaterial) {\r\n this.scene.defaultMaterial.dispose();\r\n }\r\n\r\n this.scene.defaultMaterial = defaultMaterial;\r\n }\r\n\r\n this.scene.animationPropertiesOverride = new AnimationPropertiesOverride();\r\n\r\n Animation.AllowMatricesInterpolation = true;\r\n\r\n /*if (sceneConfiguration.glow) {\r\n let options: Partial<IGlowLayerOptions> = {\r\n mainTextureFixedSize: 512\r\n };\r\n if (typeof sceneConfiguration.glow === 'object') {\r\n options = sceneConfiguration.glow\r\n }\r\n var gl = new GlowLayer(\"glow\", this.scene, options);\r\n }*/\r\n\r\n return this.onSceneInitObservable.notifyObserversWithPromise(this.scene);\r\n }\r\n\r\n public clearScene(clearModels: boolean = true, clearLights: boolean = false) {\r\n if (clearModels) {\r\n this.models.forEach((m) => m.dispose());\r\n this.models.length = 0;\r\n }\r\n if (clearLights) {\r\n this.scene.lights.forEach((l) => l.dispose());\r\n }\r\n }\r\n\r\n private _globalConfiguration: ViewerConfiguration = {};\r\n\r\n /**\r\n * This will update the scene's configuration, including camera, lights, environment.\r\n * @param newConfiguration the delta that should be configured. This includes only the changes\r\n */\r\n public updateConfiguration(newConfiguration: Partial<ViewerConfiguration>) {\r\n if (this._configurationContainer) {\r\n this._globalConfiguration = this._configurationContainer.configuration;\r\n } else {\r\n this._globalConfiguration = newConfiguration;\r\n }\r\n\r\n // update scene configuration\r\n if (newConfiguration.scene) {\r\n this._configureScene(newConfiguration.scene);\r\n }\r\n\r\n // optimizer\r\n if (newConfiguration.optimizer !== undefined) {\r\n this._configureOptimizer(newConfiguration.optimizer);\r\n }\r\n\r\n // configure model\r\n /*if (newConfiguration.model && typeof newConfiguration.model === 'object') {\r\n this._configureModel(newConfiguration.model);\r\n }*/\r\n\r\n // lights\r\n this._configureLights(newConfiguration.lights);\r\n\r\n // environment\r\n if (newConfiguration.skybox !== undefined || newConfiguration.ground !== undefined) {\r\n this._configureEnvironment(newConfiguration.skybox, newConfiguration.ground);\r\n }\r\n\r\n // camera\r\n this._configureCamera(newConfiguration.camera);\r\n\r\n if (newConfiguration.environmentMap !== undefined) {\r\n this._configureEnvironmentMap(newConfiguration.environmentMap);\r\n }\r\n\r\n if (newConfiguration.vr !== undefined) {\r\n this._configureVR(newConfiguration.vr);\r\n }\r\n\r\n if (newConfiguration.lab) {\r\n // rendering pipelines\r\n if (newConfiguration.lab.defaultRenderingPipelines) {\r\n const pipelineConfig = newConfiguration.lab.defaultRenderingPipelines;\r\n if (typeof pipelineConfig === \"boolean\") {\r\n this.defaultRenderingPipelineEnabled = pipelineConfig;\r\n } else {\r\n this.defaultRenderingPipelineEnabled = true;\r\n }\r\n }\r\n\r\n if (this.environmentHelper && newConfiguration.lab.environmentMainColor) {\r\n const mainColor = new Color3(newConfiguration.lab.environmentMainColor.r, newConfiguration.lab.environmentMainColor.g, newConfiguration.lab.environmentMainColor.b);\r\n this.environmentHelper.setMainColor(mainColor);\r\n }\r\n\r\n if (newConfiguration.lab.globalLightRotation !== undefined) {\r\n // rotate all lights that are shadow lights\r\n this.scene.lights\r\n .filter((light) => light instanceof ShadowLight)\r\n .forEach((light) => {\r\n // casting and '!' are safe, due to the constraints tested before\r\n this.labs.rotateShadowLight(<ShadowLight>light, newConfiguration.lab!.globalLightRotation!);\r\n });\r\n this._forceShadowUpdate = true;\r\n }\r\n }\r\n\r\n if (this._defaultRenderingPipeline && this._defaultRenderingPipeline.imageProcessing) {\r\n this._defaultRenderingPipeline.imageProcessing.fromLinearSpace = true;\r\n }\r\n\r\n if (this._defaultRenderingPipelineShouldBuild && this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n }\r\n }\r\n\r\n private _defaultRenderingPipelineShouldBuild: boolean = true;\r\n\r\n private _rebuildPostprocesses(configuration?: IDefaultRenderingPipelineConfiguration): void {\r\n if (!this._defaultRenderingPipelineEnabled || !getConfigurationKey(\"scene.imageProcessingConfiguration.isEnabled\", this._globalConfiguration)) {\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipeline.dispose();\r\n this._defaultRenderingPipeline = null;\r\n this.scene.autoClearDepthAndStencil = true;\r\n this.scene.autoClear = true;\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = false;\r\n }\r\n\r\n return;\r\n }\r\n\r\n const pipelineConfig = configuration || (this._globalConfiguration.lab && this._globalConfiguration.lab.defaultRenderingPipelines);\r\n if (pipelineConfig) {\r\n if (!this._defaultRenderingPipeline) {\r\n // Create pipeline in manual mode to avoid triggering multiple shader compilations\r\n this._defaultRenderingPipeline = new DefaultRenderingPipeline(\"default rendering pipeline\", this._hdrSupport, this.scene, [this.camera], false);\r\n }\r\n this.scene.autoClear = false;\r\n this.scene.autoClearDepthAndStencil = false;\r\n this._defaultRenderingPipelineShouldBuild = true;\r\n\r\n let bloomEnabled = this._bloomEnabled;\r\n\r\n if (typeof pipelineConfig !== \"boolean\") {\r\n extendClassWithConfig(this._defaultRenderingPipeline, pipelineConfig);\r\n this._bloomEnabled = !!pipelineConfig.bloomEnabled;\r\n this._fxaaEnabled = !!pipelineConfig.fxaaEnabled;\r\n bloomEnabled = this._bloomEnabled && pipelineConfig.bloomWeight !== undefined && pipelineConfig.bloomWeight > 0;\r\n\r\n this._defaultRenderingPipeline.bloomWeight = (pipelineConfig.bloomWeight !== undefined && pipelineConfig.bloomWeight) || this._defaultRenderingPipeline.bloomWeight;\r\n }\r\n\r\n this._defaultRenderingPipeline.bloomEnabled = bloomEnabled;\r\n this._defaultRenderingPipeline.fxaaEnabled = this.fxaaEnabled;\r\n }\r\n }\r\n\r\n // default from rendering pipeline\r\n private _bloomEnabled: boolean = false;\r\n\r\n public get bloomEnabled() {\r\n return this._bloomEnabled;\r\n }\r\n\r\n public set bloomEnabled(value: boolean) {\r\n if (this._bloomEnabled === value) {\r\n return;\r\n }\r\n\r\n this._bloomEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n // default from rendering pipeline\r\n private _fxaaEnabled: boolean = false;\r\n\r\n public get fxaaEnabled() {\r\n return this._fxaaEnabled;\r\n }\r\n\r\n public set fxaaEnabled(value: boolean) {\r\n if (this._fxaaEnabled === value) {\r\n return;\r\n }\r\n\r\n this._fxaaEnabled = value;\r\n this._rebuildPostprocesses();\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipelineShouldBuild = false;\r\n this._defaultRenderingPipeline.prepare();\r\n this.scene.imageProcessingConfiguration.applyByPostProcess = true;\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public setDefaultMaterial(sceneConfig: ISceneConfiguration) {}\r\n\r\n /**\r\n * internally configure the scene using the provided configuration.\r\n * The scene will not be recreated, but just updated.\r\n * @param sceneConfig the (new) scene configuration\r\n */\r\n protected _configureScene(sceneConfig: ISceneConfiguration) {\r\n // sanity check!\r\n if (!this.scene) {\r\n return;\r\n }\r\n\r\n const cc = sceneConfig.clearColor;\r\n const oldcc = this.scene.clearColor;\r\n if (cc) {\r\n if (cc.r !== undefined) {\r\n oldcc.r = cc.r;\r\n }\r\n if (cc.g !== undefined) {\r\n oldcc.g = cc.g;\r\n }\r\n if (cc.b !== undefined) {\r\n oldcc.b = cc.b;\r\n }\r\n if (cc.a !== undefined) {\r\n oldcc.a = cc.a;\r\n }\r\n }\r\n\r\n if (sceneConfig.assetsRootURL) {\r\n this._assetsRootURL = sceneConfig.assetsRootURL;\r\n }\r\n\r\n // image processing configuration - optional.\r\n if (sceneConfig.imageProcessingConfiguration) {\r\n extendClassWithConfig(this.scene.imageProcessingConfiguration, sceneConfig.imageProcessingConfiguration);\r\n }\r\n //animation properties override\r\n if (sceneConfig.animationPropertiesOverride) {\r\n extendClassWithConfig(this.scene.animationPropertiesOverride, sceneConfig.animationPropertiesOverride);\r\n }\r\n if (sceneConfig.environmentTexture) {\r\n if (!(this.scene.environmentTexture && (<CubeTexture>this.scene.environmentTexture).url === sceneConfig.environmentTexture)) {\r\n if (this.scene.environmentTexture && this.scene.environmentTexture.dispose) {\r\n this.scene.environmentTexture.dispose();\r\n }\r\n const environmentTexture = CubeTexture.CreateFromPrefilteredData(sceneConfig.environmentTexture, this.scene);\r\n this.scene.environmentTexture = environmentTexture;\r\n }\r\n }\r\n\r\n if (sceneConfig.debug === true) {\r\n this.scene.debugLayer.show();\r\n } else if (sceneConfig.debug === false) {\r\n if (this.scene.debugLayer.isVisible()) {\r\n this.scene.debugLayer.hide();\r\n }\r\n }\r\n\r\n if (sceneConfig.disableHdr) {\r\n this._handleHardwareLimitations(false);\r\n } else {\r\n this._handleHardwareLimitations(true);\r\n }\r\n\r\n if (sceneConfig.renderInBackground !== undefined) {\r\n this._engine.renderEvenInBackground = !!sceneConfig.renderInBackground;\r\n }\r\n\r\n const canvas = this._engine.getInputElement();\r\n\r\n if (canvas) {\r\n if (this.camera && sceneConfig.disableCameraControl) {\r\n this.camera.detachControl();\r\n } else if (this.camera && sceneConfig.disableCameraControl === false) {\r\n this.camera.attachControl();\r\n }\r\n }\r\n\r\n this.setDefaultMaterial(sceneConfig);\r\n\r\n if (sceneConfig.flags) {\r\n extendClassWithConfig(this.scene, sceneConfig.flags);\r\n }\r\n\r\n this.onSceneConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.scene,\r\n newConfiguration: sceneConfig,\r\n });\r\n }\r\n\r\n /**\r\n * Configure the scene optimizer.\r\n * The existing scene optimizer will be disposed and a new one will be created.\r\n * @param optimizerConfig the (new) optimizer configuration\r\n */\r\n protected _configureOptimizer(optimizerConfig: ISceneOptimizerConfiguration | boolean) {\r\n if (typeof optimizerConfig === \"boolean\") {\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n delete this.sceneOptimizer;\r\n }\r\n if (optimizerConfig) {\r\n this.sceneOptimizer = new SceneOptimizer(this.scene);\r\n this.sceneOptimizer.start();\r\n }\r\n } else {\r\n let optimizerOptions: SceneOptimizerOptions = new SceneOptimizerOptions(optimizerConfig.targetFrameRate, optimizerConfig.trackerDuration);\r\n // check for degradation\r\n if (optimizerConfig.degradation) {\r\n switch (optimizerConfig.degradation) {\r\n case \"low\":\r\n optimizerOptions = SceneOptimizerOptions.LowDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n case \"moderate\":\r\n optimizerOptions = SceneOptimizerOptions.ModerateDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n case \"hight\":\r\n optimizerOptions = SceneOptimizerOptions.HighDegradationAllowed(optimizerConfig.targetFrameRate);\r\n break;\r\n }\r\n }\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n }\r\n if (optimizerConfig.custom) {\r\n const customOptimizer = getCustomOptimizerByName(optimizerConfig.custom, optimizerConfig.improvementMode);\r\n if (customOptimizer) {\r\n optimizerOptions.addCustomOptimization(\r\n () => {\r\n return customOptimizer(this);\r\n },\r\n () => {\r\n return `Babylon Viewer ${optimizerConfig.custom} custom optimization`;\r\n }\r\n );\r\n }\r\n }\r\n this.sceneOptimizer = new SceneOptimizer(this.scene, optimizerOptions, optimizerConfig.autoGeneratePriorities, optimizerConfig.improvementMode);\r\n this.sceneOptimizer.start();\r\n }\r\n\r\n this.onSceneOptimizerConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.sceneOptimizer!,\r\n newConfiguration: optimizerConfig,\r\n });\r\n }\r\n\r\n /**\r\n * configure all models using the configuration.\r\n * @param modelConfiguration the configuration to use to reconfigure the models\r\n */\r\n /*protected _configureModel(modelConfiguration: Partial<IModelConfiguration>) {\r\n this.models.forEach(model => {\r\n model.updateConfiguration(modelConfiguration);\r\n });\r\n\r\n this.onModelsConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.models,\r\n newConfiguration: modelConfiguration\r\n });\r\n }*/\r\n\r\n protected _configureVR(vrConfig: IVRConfiguration) {\r\n if (vrConfig.disabled) {\r\n if (this._vrHelper) {\r\n if (this._vrHelper.isInVRMode) {\r\n this._vrHelper.exitVR();\r\n }\r\n this._vrHelper.dispose();\r\n this._vrHelper = undefined;\r\n }\r\n return;\r\n }\r\n const vrOptions: VRExperienceHelperOptions = deepmerge(\r\n {\r\n useCustomVRButton: true,\r\n createDeviceOrientationCamera: false,\r\n trackPosition: true,\r\n },\r\n vrConfig.vrOptions || {}\r\n );\r\n\r\n this._vrHelper = this.scene.createDefaultVRExperience(vrOptions);\r\n if (!vrConfig.disableInteractions) {\r\n this._vrHelper.enableInteractions();\r\n }\r\n if (!vrConfig.disableTeleportation) {\r\n const floorMeshName = vrConfig.overrideFloorMeshName || \"BackgroundPlane\";\r\n this._vrHelper.enableTeleportation({\r\n floorMeshName,\r\n });\r\n }\r\n if (vrConfig.rotateUsingControllers) {\r\n let rotationOffset: Quaternion | null;\r\n this._vrHelper.onControllerMeshLoadedObservable.add((controller) => {\r\n controller.onTriggerStateChangedObservable.add((data) => {\r\n if (controller.mesh && controller.mesh.rotationQuaternion) {\r\n if (data.pressed) {\r\n if (!rotationOffset) {\r\n this.models[0].rootMesh.rotationQuaternion = this.models[0].rootMesh.rotationQuaternion || new Quaternion();\r\n rotationOffset = controller.mesh.rotationQuaternion.conjugate().multiply(this.models[0].rootMesh.rotationQuaternion!);\r\n }\r\n } else {\r\n rotationOffset = null;\r\n }\r\n }\r\n });\r\n this.scene.registerBeforeRender(() => {\r\n if (this.models[0]) {\r\n if (rotationOffset && controller.mesh && controller.mesh.rotationQuaternion) {\r\n this.models[0].rootMesh.rotationQuaternion!.copyFrom(controller.mesh.rotationQuaternion).multiplyInPlace(rotationOffset);\r\n } else {\r\n this.models[0].rootMesh.rotationQuaternion = null;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n this._vrHelper.onEnteringVRObservable.add(() => {\r\n if (this._observablesManager) {\r\n this._observablesManager.onEnteringVRObservable.notifyObservers(this);\r\n }\r\n });\r\n this._vrHelper.onExitingVRObservable.add(() => {\r\n if (this._observablesManager) {\r\n this._observablesManager.onExitingVRObservable.notifyObservers(this);\r\n }\r\n });\r\n this.onVRConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this._vrHelper,\r\n newConfiguration: vrConfig,\r\n });\r\n }\r\n\r\n protected _configureEnvironmentMap(environmentMapConfiguration: IEnvironmentMapConfiguration): any {\r\n if (environmentMapConfiguration.texture) {\r\n this.scene.environmentTexture = new CubeTexture(this._getAssetUrl(environmentMapConfiguration.texture), this.scene);\r\n }\r\n\r\n //sanity check\r\n if (this.scene.environmentTexture) {\r\n const rotatquatRotationionY = Quaternion.RotationAxis(Axis.Y, environmentMapConfiguration.rotationY || 0);\r\n Matrix.FromQuaternionToRef(rotatquatRotationionY, this.scene.environmentTexture.getReflectionTextureMatrix());\r\n }\r\n\r\n // process mainColor changes:\r\n if (environmentMapConfiguration.mainColor) {\r\n this._configurationContainer.mainColor = this.mainColor || Color3.White();\r\n const mc = environmentMapConfiguration.mainColor;\r\n if (mc.r !== undefined) {\r\n this.mainColor.r = mc.r;\r\n }\r\n if (mc.g !== undefined) {\r\n this.mainColor.g = mc.g;\r\n }\r\n if (mc.b !== undefined) {\r\n this.mainColor.b = mc.b;\r\n }\r\n\r\n this.reflectionColor.copyFrom(this.mainColor);\r\n\r\n const environmentTint = getConfigurationKey(\"environmentMap.tintLevel\", this._globalConfiguration) || 0;\r\n\r\n // reflection color\r\n this.reflectionColor.toLinearSpaceToRef(this.reflectionColor);\r\n this.reflectionColor.scaleToRef(1 / this.scene.imageProcessingConfiguration.exposure, this.reflectionColor);\r\n const tmpColor3 = Color3.Lerp(this._white, this.reflectionColor, environmentTint);\r\n this.reflectionColor.copyFrom(tmpColor3);\r\n\r\n //update the environment, if exists\r\n if (this.environmentHelper) {\r\n if (this.environmentHelper.groundMaterial) {\r\n this.environmentHelper.groundMaterial._perceptualColor = this.mainColor;\r\n }\r\n\r\n if (this.environmentHelper.skyboxMaterial) {\r\n this.environmentHelper.skyboxMaterial._perceptualColor = this.mainColor;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * (Re) configure the camera. The camera will only be created once and from this point will only be reconfigured.\r\n * @param cameraConfig the new camera configuration\r\n */\r\n protected _configureCamera(cameraConfig: ICameraConfiguration = {}) {\r\n if (!this.scene.activeCamera) {\r\n // Inline scene.createDefaultCamera to reduce file size\r\n // Dispose existing camera in replace mode.\r\n if (this.scene.activeCamera) {\r\n (this.scene.activeCamera as ArcRotateCamera).dispose();\r\n this.scene.activeCamera = null;\r\n }\r\n // Camera\r\n if (!this.scene.activeCamera) {\r\n const worldExtends = this.scene.getWorldExtends();\r\n const worldSize = worldExtends.max.subtract(worldExtends.min);\r\n const worldCenter = worldExtends.min.add(worldSize.scale(0.5));\r\n\r\n let radius = worldSize.length() * 1.5;\r\n // empty scene scenario!\r\n if (!isFinite(radius)) {\r\n radius = 1;\r\n worldCenter.copyFromFloats(0, 0, 0);\r\n }\r\n\r\n const arcRotateCamera = new ArcRotateCamera(\"default camera\", -(Math.PI / 2), Math.PI / 2, radius, worldCenter, this.scene);\r\n arcRotateCamera.lowerRadiusLimit = radius * 0.01;\r\n arcRotateCamera.wheelPrecision = 100 / radius;\r\n const camera = arcRotateCamera;\r\n\r\n camera.minZ = radius * 0.01;\r\n camera.maxZ = radius * 1000;\r\n camera.speed = radius * 0.2;\r\n this.scene.activeCamera = camera;\r\n }\r\n const canvas = this.scene.getEngine().getInputElement();\r\n if (canvas) {\r\n this.scene.activeCamera.attachControl();\r\n }\r\n\r\n this.camera = <ArcRotateCamera>this.scene.activeCamera!;\r\n this.camera.setTarget(Vector3.Zero());\r\n }\r\n if (!this.camera) {\r\n this.camera = <ArcRotateCamera>this.scene.activeCamera!;\r\n }\r\n if (cameraConfig.position) {\r\n const newPosition = this.camera.position.clone();\r\n extendClassWithConfig(newPosition, cameraConfig.position);\r\n this.camera.setPosition(newPosition);\r\n }\r\n\r\n if (cameraConfig.target) {\r\n const newTarget = this.camera.target.clone();\r\n extendClassWithConfig(newTarget, cameraConfig.target);\r\n this.camera.setTarget(newTarget);\r\n } /*else if (this.models.length && !cameraConfig.disableAutoFocus) {\r\n this._focusOnModel(this.models[0]);\r\n }*/\r\n\r\n if (cameraConfig.rotation) {\r\n this.camera.rotationQuaternion = new Quaternion(cameraConfig.rotation.x || 0, cameraConfig.rotation.y || 0, cameraConfig.rotation.z || 0, cameraConfig.rotation.w || 0);\r\n }\r\n\r\n if (cameraConfig.behaviors) {\r\n for (const name in cameraConfig.behaviors) {\r\n if (cameraConfig.behaviors[name] !== undefined) {\r\n this._setCameraBehavior(name, cameraConfig.behaviors[name]);\r\n }\r\n }\r\n }\r\n\r\n const sceneExtends = this.scene.getWorldExtends((mesh) => {\r\n return !this.environmentHelper || (mesh !== this.environmentHelper.ground && mesh !== this.environmentHelper.rootMesh && mesh !== this.environmentHelper.skybox);\r\n });\r\n const sceneDiagonal = sceneExtends.max.subtract(sceneExtends.min);\r\n const sceneDiagonalLength = sceneDiagonal.length();\r\n if (isFinite(sceneDiagonalLength)) {\r\n this.camera.upperRadiusLimit = sceneDiagonalLength * 4;\r\n }\r\n\r\n // sanity check!\r\n if (this.scene.imageProcessingConfiguration) {\r\n this.scene.imageProcessingConfiguration.colorCurvesEnabled = true;\r\n this.scene.imageProcessingConfiguration.vignetteEnabled = true;\r\n this.scene.imageProcessingConfiguration.toneMappingEnabled = !!getConfigurationKey(\"camera.toneMappingEnabled\", this._globalConfiguration);\r\n }\r\n\r\n extendClassWithConfig(this.camera, cameraConfig);\r\n\r\n this.onCameraConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.camera,\r\n newConfiguration: cameraConfig,\r\n });\r\n }\r\n\r\n private _focusOnModel = (model: ViewerModel) => {\r\n const boundingInfo = model.rootMesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n this.camera.setTarget(center);\r\n this.camera.alpha = (this._globalConfiguration.camera && this._globalConfiguration.camera.alpha) || this.camera.alpha;\r\n this.camera.beta = (this._globalConfiguration.camera && this._globalConfiguration.camera.beta) || this.camera.beta;\r\n this.camera.radius = (this._globalConfiguration.camera && this._globalConfiguration.camera.radius) || this.camera.radius;\r\n\r\n const sceneDiagonalLenght = sizeVec.length();\r\n if (isFinite(sceneDiagonalLenght)) {\r\n this.camera.upperRadiusLimit = sceneDiagonalLenght * 4;\r\n }\r\n\r\n if (this._configurationContainer.configuration) {\r\n this._configureEnvironment(this._configurationContainer.configuration.skybox, this._configurationContainer.configuration.ground);\r\n }\r\n /*this.scene.lights.filter(light => light instanceof ShadowLight).forEach(light => {\r\n // casting ais safe, due to the constraints tested before\r\n (<ShadowLight>light).setDirectionToTarget(center);\r\n });*/\r\n };\r\n\r\n protected _configureEnvironment(skyboxConifguration?: ISkyboxConfiguration | boolean, groundConfiguration?: IGroundConfiguration | boolean) {\r\n if (!skyboxConifguration && !groundConfiguration) {\r\n if (this.environmentHelper) {\r\n this.environmentHelper.dispose();\r\n this.environmentHelper = undefined;\r\n }\r\n } else {\r\n const options: Partial<IEnvironmentHelperOptions> = {\r\n createGround: !!groundConfiguration && this._groundEnabled,\r\n createSkybox: !!skyboxConifguration,\r\n setupImageProcessing: false, // will be done at the scene level!,\r\n };\r\n\r\n // will that cause problems with model ground configuration?\r\n /*if (model) {\r\n const boundingInfo = model.rootMesh.getHierarchyBoundingVectors(true);\r\n const sizeVec = boundingInfo.max.subtract(boundingInfo.min);\r\n const halfSizeVec = sizeVec.scale(0.5);\r\n const center = boundingInfo.min.add(halfSizeVec);\r\n options.groundYBias = -center.y;\r\n }*/\r\n\r\n if (groundConfiguration) {\r\n const groundConfig = typeof groundConfiguration === \"boolean\" ? {} : groundConfiguration;\r\n\r\n const groundSize = groundConfig.size || (typeof skyboxConifguration === \"object\" && skyboxConifguration.scale);\r\n if (groundSize) {\r\n options.groundSize = groundSize;\r\n }\r\n\r\n options.enableGroundShadow = groundConfiguration === true || groundConfig.receiveShadows;\r\n if (groundConfig.shadowLevel !== undefined) {\r\n options.groundShadowLevel = groundConfig.shadowLevel;\r\n }\r\n options.enableGroundMirror = !!groundConfig.mirror && this.groundMirrorEnabled;\r\n if (groundConfig.texture) {\r\n options.groundTexture = this._getAssetUrl(groundConfig.texture);\r\n }\r\n if (groundConfig.color) {\r\n options.groundColor = new Color3(groundConfig.color.r, groundConfig.color.g, groundConfig.color.b);\r\n }\r\n\r\n if (groundConfig.opacity !== undefined) {\r\n options.groundOpacity = groundConfig.opacity;\r\n }\r\n\r\n if (groundConfig.mirror) {\r\n options.enableGroundMirror = true;\r\n // to prevent undefines\r\n if (typeof groundConfig.mirror === \"object\") {\r\n if (groundConfig.mirror.amount !== undefined) {\r\n options.groundMirrorAmount = groundConfig.mirror.amount;\r\n }\r\n if (groundConfig.mirror.sizeRatio !== undefined) {\r\n options.groundMirrorSizeRatio = groundConfig.mirror.sizeRatio;\r\n }\r\n if (groundConfig.mirror.blurKernel !== undefined) {\r\n options.groundMirrorBlurKernel = groundConfig.mirror.blurKernel;\r\n }\r\n if (groundConfig.mirror.fresnelWeight !== undefined) {\r\n options.groundMirrorFresnelWeight = groundConfig.mirror.fresnelWeight;\r\n }\r\n if (groundConfig.mirror.fallOffDistance !== undefined) {\r\n options.groundMirrorFallOffDistance = groundConfig.mirror.fallOffDistance;\r\n }\r\n if (this._defaultPipelineTextureType !== undefined) {\r\n options.groundMirrorTextureType = this._defaultPipelineTextureType;\r\n }\r\n }\r\n }\r\n }\r\n\r\n let postInitSkyboxMaterial = false;\r\n if (skyboxConifguration) {\r\n const conf = skyboxConifguration === true ? {} : skyboxConifguration;\r\n if (conf.material && conf.material.imageProcessingConfiguration) {\r\n options.setupImageProcessing = false; // will be configured later manually.\r\n }\r\n const skyboxSize = conf.scale;\r\n if (skyboxSize) {\r\n options.skyboxSize = skyboxSize;\r\n }\r\n options.sizeAuto = !options.skyboxSize;\r\n if (conf.color) {\r\n options.skyboxColor = new Color3(conf.color.r, conf.color.g, conf.color.b);\r\n }\r\n if (conf.cubeTexture && conf.cubeTexture.url) {\r\n if (typeof conf.cubeTexture.url === \"string\") {\r\n options.skyboxTexture = this._getAssetUrl(conf.cubeTexture.url);\r\n } else {\r\n // init later!\r\n postInitSkyboxMaterial = true;\r\n }\r\n }\r\n\r\n if (conf.material) {\r\n postInitSkyboxMaterial = true;\r\n }\r\n }\r\n\r\n options.setupImageProcessing = false; // TMP\r\n\r\n if (!this.environmentHelper) {\r\n this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n } else {\r\n // unlikely, but there might be a new scene! we need to dispose.\r\n\r\n // get the scene used by the envHelper\r\n const scene: Scene = this.environmentHelper.rootMesh.getScene();\r\n // is it a different scene? Oh no!\r\n if (scene !== this.scene) {\r\n this.environmentHelper.dispose();\r\n this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n } else {\r\n // recreate the ground\r\n if (this.environmentHelper.ground) {\r\n this.environmentHelper.ground.dispose();\r\n }\r\n // recreate the skybox\r\n if (this.environmentHelper.skybox) {\r\n this.environmentHelper.skybox.dispose();\r\n }\r\n\r\n this.environmentHelper.updateOptions(options)!;\r\n // update doesn't change the size of the skybox and ground, so we have to recreate!\r\n //this.environmentHelper.dispose();\r\n //this.environmentHelper = new EnvironmentHelper(options, this.scene);\r\n }\r\n }\r\n\r\n if (this.environmentHelper.rootMesh && this._globalConfiguration.scene && this._globalConfiguration.scene.environmentRotationY !== undefined) {\r\n this.environmentHelper.rootMesh.rotation.y = this._globalConfiguration.scene.environmentRotationY;\r\n }\r\n\r\n const groundConfig = typeof groundConfiguration === \"boolean\" ? {} : groundConfiguration;\r\n if (this.environmentHelper.groundMaterial && groundConfig) {\r\n this.environmentHelper.groundMaterial._perceptualColor = this.mainColor;\r\n if (groundConfig.material) {\r\n extendClassWithConfig(this.environmentHelper.groundMaterial, groundConfig.material);\r\n }\r\n\r\n if (this.environmentHelper.groundMirror) {\r\n const mirrorClearColor = this.environmentHelper.groundMaterial._perceptualColor.toLinearSpace();\r\n // TODO user camera exposure value to set the mirror clear color\r\n const exposure = Math.pow(2.0, -this.scene.imageProcessingConfiguration.exposure) * Math.PI;\r\n mirrorClearColor.scaleToRef(1 / exposure, mirrorClearColor);\r\n\r\n this.environmentHelper.groundMirror.clearColor.r = Scalar.Clamp(mirrorClearColor.r);\r\n this.environmentHelper.groundMirror.clearColor.g = Scalar.Clamp(mirrorClearColor.g);\r\n this.environmentHelper.groundMirror.clearColor.b = Scalar.Clamp(mirrorClearColor.b);\r\n this.environmentHelper.groundMirror.clearColor.a = 1;\r\n\r\n if (!this.groundMirrorEnabled) {\r\n this.environmentHelper.groundMaterial.reflectionTexture = null;\r\n }\r\n }\r\n }\r\n\r\n const skyboxMaterial = this.environmentHelper.skyboxMaterial;\r\n if (skyboxMaterial) {\r\n skyboxMaterial._perceptualColor = this.mainColor;\r\n\r\n if (postInitSkyboxMaterial) {\r\n if (typeof skyboxConifguration === \"object\" && skyboxConifguration.material) {\r\n extendClassWithConfig(skyboxMaterial, skyboxConifguration.material);\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n this._updateGroundMirrorRenderList(model);\r\n });\r\n\r\n this.onEnvironmentConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.environmentHelper!,\r\n newConfiguration: {\r\n skybox: skyboxConifguration,\r\n ground: groundConfiguration,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * configure the lights.\r\n * @param lightsConfiguration the (new) light(s) configuration\r\n */\r\n protected _configureLights(lightsConfiguration: { [name: string]: ILightConfiguration | boolean | number } = {}) {\r\n // sanity check!\r\n const lightKeys = Object.keys(lightsConfiguration).filter((name) => name !== \"globalRotation\");\r\n\r\n if (!lightKeys.length) {\r\n if (!this.scene.lights.length) {\r\n new HemisphericLight(\"default light\", Vector3.Up(), this.scene);\r\n }\r\n } else {\r\n let lightsAvailable: Array<string> = this.scene.lights.map((light) => light.name);\r\n // compare to the global (!) configuration object and dispose unneeded:\r\n const lightsToConfigure = Object.keys(this._globalConfiguration.lights || []);\r\n if (Object.keys(lightsToConfigure).length !== lightsAvailable.length) {\r\n lightsAvailable.forEach((lName) => {\r\n if (lightsToConfigure.indexOf(lName) === -1) {\r\n this.scene.getLightByName(lName)!.dispose();\r\n }\r\n });\r\n }\r\n\r\n lightKeys.forEach((name) => {\r\n let lightConfig: ILightConfiguration = { type: 0 };\r\n if (typeof lightsConfiguration[name] === \"object\") {\r\n lightConfig = <ILightConfiguration>lightsConfiguration[name];\r\n }\r\n if (typeof lightsConfiguration[name] === \"number\") {\r\n lightConfig.type = <number>lightsConfiguration[name];\r\n }\r\n\r\n lightConfig.name = name;\r\n\r\n let light: Light;\r\n // light is not already available\r\n if (lightsAvailable.indexOf(name) === -1) {\r\n const constructor = Light.GetConstructorFromName(lightConfig.type, lightConfig.name, this.scene);\r\n if (!constructor) {\r\n return;\r\n }\r\n light = constructor();\r\n } else {\r\n // available? get it from the scene\r\n light = <Light>this.scene.getLightByName(name);\r\n if (typeof lightsConfiguration[name] === \"boolean\") {\r\n lightConfig.type = light.getTypeID();\r\n }\r\n lightsAvailable = lightsAvailable.filter((ln) => ln !== name);\r\n if (lightConfig.type !== undefined && light.getTypeID() !== lightConfig.type) {\r\n light.dispose();\r\n const constructor = Light.GetConstructorFromName(lightConfig.type, lightConfig.name, this.scene);\r\n if (!constructor) {\r\n return;\r\n }\r\n light = constructor();\r\n }\r\n }\r\n\r\n // if config set the light to false, dispose it.\r\n if (lightsConfiguration[name] === false) {\r\n light.dispose();\r\n return;\r\n }\r\n\r\n //enabled\r\n const enabled = lightConfig.enabled !== undefined ? lightConfig.enabled : !lightConfig.disabled;\r\n light.setEnabled(enabled);\r\n\r\n extendClassWithConfig(light, lightConfig);\r\n\r\n //position. Some lights don't support shadows\r\n if (light instanceof ShadowLight) {\r\n // set default values\r\n light.shadowMinZ = light.shadowMinZ || 0.2;\r\n light.shadowMaxZ = Math.min(10, light.shadowMaxZ || 10); //large far clips reduce shadow depth precision\r\n\r\n if (lightConfig.target) {\r\n if (light.setDirectionToTarget) {\r\n const target = Vector3.Zero().copyFromFloats(lightConfig.target.x, lightConfig.target.y, lightConfig.target.z);\r\n light.setDirectionToTarget(target);\r\n }\r\n } else if (lightConfig.direction) {\r\n const direction = Vector3.Zero().copyFromFloats(lightConfig.direction.x, lightConfig.direction.y, lightConfig.direction.z);\r\n light.direction = direction;\r\n }\r\n\r\n let isShadowEnabled = false;\r\n if (light.getTypeID() === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n (<DirectionalLight>light).shadowFrustumSize = lightConfig.shadowFrustumSize || 2;\r\n isShadowEnabled = true;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n const spotLight: SpotLight = <SpotLight>light;\r\n if (lightConfig.spotAngle !== undefined) {\r\n spotLight.angle = (lightConfig.spotAngle * Math.PI) / 180;\r\n }\r\n if (spotLight.angle && lightConfig.shadowFieldOfView) {\r\n spotLight.shadowAngleScale = lightConfig.shadowFieldOfView / spotLight.angle;\r\n }\r\n isShadowEnabled = true;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_POINTLIGHT) {\r\n if (lightConfig.shadowFieldOfView) {\r\n (<PointLight>light).shadowAngle = (lightConfig.shadowFieldOfView * Math.PI) / 180;\r\n }\r\n isShadowEnabled = true;\r\n }\r\n\r\n let shadowGenerator = <ShadowGenerator>light.getShadowGenerator();\r\n if (isShadowEnabled && lightConfig.shadowEnabled && this._maxShadows) {\r\n const bufferSize = lightConfig.shadowBufferSize || 256;\r\n\r\n if (!shadowGenerator) {\r\n shadowGenerator = new ShadowGenerator(bufferSize, light);\r\n }\r\n\r\n const blurKernel = this.getBlurKernel(light, bufferSize);\r\n shadowGenerator.bias = this._shadowGeneratorBias;\r\n shadowGenerator.blurKernel = blurKernel;\r\n //override defaults\r\n extendClassWithConfig(shadowGenerator, lightConfig.shadowConfig || {});\r\n\r\n // add the focus meshes to the shadow list\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n this._updateShadowRenderList(shadowGenerator, model);\r\n });\r\n\r\n //if (model) {\r\n this._updateShadowRenderList(shadowGenerator);\r\n //}\r\n } else if (shadowGenerator) {\r\n shadowGenerator.dispose();\r\n }\r\n }\r\n });\r\n\r\n // render priority\r\n const globalLightsConfiguration = this._globalConfiguration.lights || {};\r\n Object.keys(globalLightsConfiguration)\r\n .sort()\r\n .forEach((name, idx) => {\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n // const configuration = globalLightsConfiguration[name];\r\n const light = this.scene.getLightByName(name);\r\n // sanity check\r\n if (!light) {\r\n return;\r\n }\r\n light.renderPriority = -idx;\r\n });\r\n }\r\n\r\n this.onLightsConfiguredObservable.notifyObservers({\r\n sceneManager: this,\r\n object: this.scene.lights,\r\n newConfiguration: lightsConfiguration,\r\n });\r\n }\r\n\r\n private _shadowGroundPlane: Nullable<AbstractMesh>;\r\n\r\n private _updateShadowRenderList(shadowGenerator: ShadowGenerator, model?: ViewerModel, resetList?: boolean) {\r\n const focusMeshes = model ? model.meshes : this.scene.meshes;\r\n // add the focus meshes to the shadow list\r\n const shadownMap = shadowGenerator.getShadowMap();\r\n if (!shadownMap) {\r\n return;\r\n }\r\n if (resetList && shadownMap.renderList) {\r\n shadownMap.renderList.length = 0;\r\n } else {\r\n shadownMap.renderList = shadownMap.renderList || [];\r\n }\r\n for (let index = 0; index < focusMeshes.length; index++) {\r\n const mesh = focusMeshes[index];\r\n if (Tags.MatchesQuery(mesh, \"castShadow\") && shadownMap.renderList.indexOf(mesh) === -1) {\r\n shadownMap.renderList.push(mesh);\r\n }\r\n }\r\n\r\n if (!this._shadowGroundPlane) {\r\n if (shadowGenerator.useBlurCloseExponentialShadowMap) {\r\n const shadowGroundPlane = CreatePlane(\"shadowGroundPlane\", { size: 100 }, this.scene);\r\n shadowGroundPlane.useVertexColors = false;\r\n //material isn't ever used in rendering, just used to set back face culling\r\n shadowGroundPlane.material = new PBRMaterial(\"shadowGroundPlaneMaterial\", this.scene);\r\n shadowGroundPlane.material.backFaceCulling = false;\r\n shadowGroundPlane.rotation.x = Math.PI * 0.5;\r\n shadowGroundPlane.freezeWorldMatrix();\r\n this._shadowGroundPlane = shadowGroundPlane;\r\n this.scene.removeMesh(shadowGroundPlane);\r\n }\r\n } else {\r\n if (!shadowGenerator.useBlurCloseExponentialShadowMap) {\r\n this._shadowGroundPlane.dispose();\r\n this._shadowGroundPlane = null;\r\n }\r\n }\r\n\r\n if (this._shadowGroundPlane && shadownMap.renderList.indexOf(this._shadowGroundPlane) === -1) {\r\n shadownMap.renderList.push(this._shadowGroundPlane);\r\n }\r\n }\r\n\r\n private _updateGroundMirrorRenderList(model?: ViewerModel, resetList?: boolean) {\r\n if (this.environmentHelper && this.environmentHelper.groundMirror && this.environmentHelper.groundMirror.renderList) {\r\n const focusMeshes = model ? model.meshes : this.scene.meshes;\r\n const renderList = this.environmentHelper.groundMirror.renderList;\r\n if (resetList) {\r\n renderList.length = 0;\r\n }\r\n for (let index = 0; index < focusMeshes.length; index++) {\r\n const mesh = focusMeshes[index];\r\n if (renderList.indexOf(mesh) === -1) {\r\n renderList.push(mesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the shadow map blur kernel according to the light configuration.\r\n * @param light The light used to generate the shadows\r\n * @param bufferSize The size of the shadow map\r\n * @returns the kernel blur size\r\n */\r\n public getBlurKernel(light: IShadowLight, bufferSize: number): number {\r\n let normalizedBlurKernel = 0.05; // TODO Should come from the config.\r\n if (light.getTypeID() === Light.LIGHTTYPEID_DIRECTIONALLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / (<DirectionalLight>light).shadowFrustumSize;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_POINTLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / (<PointLight>light).shadowAngle;\r\n } else if (light.getTypeID() === Light.LIGHTTYPEID_SPOTLIGHT) {\r\n normalizedBlurKernel = normalizedBlurKernel / ((<SpotLight>light).angle * (<SpotLight>light).shadowAngleScale);\r\n }\r\n\r\n const minimumBlurKernel = 5 / (bufferSize / 256); //magic number that aims to keep away sawtooth shadows\r\n\r\n const blurKernel = Math.max(bufferSize * normalizedBlurKernel, minimumBlurKernel);\r\n return blurKernel;\r\n }\r\n\r\n /**\r\n * Alters render settings to reduce features based on hardware feature limitations\r\n * @param enableHDR Allows the viewer to run in HDR mode.\r\n */\r\n protected _handleHardwareLimitations(enableHDR = true) {\r\n //flip rendering settings switches based on hardware support\r\n const maxVaryingRows = this._engine.getCaps().maxVaryingVectors;\r\n const maxFragmentSamplers = this._engine.getCaps().maxTexturesImageUnits;\r\n\r\n //shadows are disabled if there's not enough varyings for a single shadow\r\n if (maxVaryingRows < 8 || maxFragmentSamplers < 8) {\r\n this._maxShadows = 0;\r\n } else {\r\n this._maxShadows = 3;\r\n }\r\n\r\n //can we render to any >= 16-bit targets (required for HDR)\r\n const caps = this._engine.getCaps();\r\n const linearHalfFloatTargets = caps.textureHalfFloatRender && caps.textureHalfFloatLinearFiltering;\r\n const linearFloatTargets = caps.textureFloatRender && caps.textureFloatLinearFiltering;\r\n\r\n this._hdrSupport = enableHDR && !!(linearFloatTargets || linearHalfFloatTargets);\r\n\r\n if (linearHalfFloatTargets) {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_HALF_FLOAT;\r\n this._shadowGeneratorBias = 0.002;\r\n } else if (linearFloatTargets) {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_FLOAT;\r\n this._shadowGeneratorBias = 0.001;\r\n } else {\r\n this._defaultHighpTextureType = Constants.TEXTURETYPE_UNSIGNED_INT;\r\n this._shadowGeneratorBias = 0.001;\r\n }\r\n\r\n this._defaultPipelineTextureType = this._hdrSupport ? this._defaultHighpTextureType : Constants.TEXTURETYPE_UNSIGNED_INT;\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 // this.onCameraConfiguredObservable.clear();\r\n this.onEnvironmentConfiguredObservable.clear();\r\n this.onLightsConfiguredObservable.clear();\r\n this.onModelsConfiguredObservable.clear();\r\n this.onSceneConfiguredObservable.clear();\r\n this.onSceneInitObservable.clear();\r\n this.onSceneOptimizerConfiguredObservable.clear();\r\n this.onVRConfiguredObservable.clear();\r\n\r\n if (this.sceneOptimizer) {\r\n this.sceneOptimizer.stop();\r\n this.sceneOptimizer.dispose();\r\n }\r\n\r\n if (this.environmentHelper) {\r\n this.environmentHelper.dispose();\r\n }\r\n\r\n this.models.forEach((model) => {\r\n model.dispose();\r\n });\r\n\r\n if (this._defaultRenderingPipeline) {\r\n this._defaultRenderingPipeline.dispose();\r\n }\r\n\r\n this.models.length = 0;\r\n\r\n if (this.scene) {\r\n this.scene.dispose();\r\n }\r\n }\r\n\r\n /**\r\n * Get an environment asset url by using the configuration if the path is not absolute.\r\n * @param url Asset url\r\n * @returns The Asset url using the `environmentAssetsRootURL` if the url is not an absolute path.\r\n */\r\n private _getAssetUrl(url: string): string {\r\n let returnUrl = url;\r\n if (url && url.toLowerCase().indexOf(\"//\") === -1) {\r\n if (!this._assetsRootURL) {\r\n // Tools.Warn(\"Please, specify the root url of your assets before loading the configuration (labs.environmentAssetsRootURL) or disable the background through the viewer options.\");\r\n return url;\r\n }\r\n\r\n returnUrl = this._assetsRootURL + returnUrl;\r\n }\r\n\r\n return returnUrl;\r\n }\r\n\r\n private _cameraBehaviorMapping: { [name: string]: number } = {};\r\n\r\n private _setCameraBehavior(\r\n name: string,\r\n behaviorConfig:\r\n | boolean\r\n | number\r\n | {\r\n type: number;\r\n [propName: string]: any;\r\n }\r\n ) {\r\n let behavior: Behavior<ArcRotateCamera> | null;\r\n let type: number;\r\n if (typeof behaviorConfig === \"object\") {\r\n type = behaviorConfig.type;\r\n } else if (typeof behaviorConfig === \"number\") {\r\n type = behaviorConfig;\r\n } else {\r\n type = this._cameraBehaviorMapping[name];\r\n }\r\n\r\n if (type === undefined) {\r\n return;\r\n }\r\n\r\n const config: { [propName: string]: any } = typeof behaviorConfig === \"object\" ? behaviorConfig : {};\r\n\r\n let enabled = true;\r\n if (typeof behaviorConfig === \"boolean\") {\r\n enabled = behaviorConfig;\r\n }\r\n\r\n // constructing behavior\r\n switch (type) {\r\n case CameraBehavior.AUTOROTATION:\r\n this.camera.useAutoRotationBehavior = enabled;\r\n behavior = this.camera.autoRotationBehavior;\r\n break;\r\n case CameraBehavior.BOUNCING:\r\n this.camera.useBouncingBehavior = enabled;\r\n behavior = this.camera.bouncingBehavior;\r\n break;\r\n case CameraBehavior.FRAMING:\r\n this.camera.useFramingBehavior = enabled;\r\n behavior = this.camera.framingBehavior;\r\n break;\r\n default:\r\n behavior = null;\r\n break;\r\n }\r\n\r\n if (behavior) {\r\n this._cameraBehaviorMapping[name] = type;\r\n\r\n if (typeof behaviorConfig === \"object\") {\r\n extendClassWithConfig(behavior, behaviorConfig);\r\n }\r\n }\r\n\r\n // post attach configuration. Some functionalities require the attached camera.\r\n switch (type) {\r\n case CameraBehavior.AUTOROTATION:\r\n break;\r\n case CameraBehavior.BOUNCING:\r\n break;\r\n case CameraBehavior.FRAMING:\r\n this._observablesManager &&\r\n this._observablesManager.onModelLoadedObservable.add((model) => {\r\n if (config.zoomOnBoundingInfo) {\r\n (<FramingBehavior>behavior).zoomOnMeshHierarchy(model.rootMesh);\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/viewer",
3
- "version": "5.45.2",
3
+ "version": "5.47.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -18,10 +18,10 @@
18
18
  "postcompile": "build-tools -c add-js-to-es6"
19
19
  },
20
20
  "dependencies": {
21
- "@babylonjs/core": "^5.45.2",
22
- "@babylonjs/loaders": "^5.45.2",
23
- "babylonjs-gltf2interface": "^5.45.2",
24
- "babylonjs-viewer-assets": "^5.45.2",
21
+ "@babylonjs/core": "^5.47.0",
22
+ "@babylonjs/loaders": "^5.47.0",
23
+ "babylonjs-gltf2interface": "^5.47.0",
24
+ "babylonjs-viewer-assets": "^5.47.0",
25
25
  "deepmerge": "~4.2.2",
26
26
  "handlebars": "~4.7.7",
27
27
  "pepjs": "~0.5.3",