@babylonjs/serializers 9.4.1 → 9.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { GLTFExporter } from "../glTFExporter.js";
2
2
  import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
+ import { OpenPBRMaterial } from "@babylonjs/core/Materials/PBR/openpbrMaterial.js";
3
4
  const NAME = "KHR_materials_ior";
4
5
  /**
5
6
  * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_ior/README.md)
@@ -26,7 +27,13 @@ export class KHR_materials_ior {
26
27
  if (mat.unlit) {
27
28
  return false;
28
29
  }
29
- return mat.indexOfRefraction != undefined && mat.indexOfRefraction != 1.5; // 1.5 is normative default value.
30
+ if (mat instanceof OpenPBRMaterial) {
31
+ return mat.specularIor != 1.5; // 1.5 is normative default value.
32
+ }
33
+ else if (mat instanceof PBRMaterial) {
34
+ return mat.indexOfRefraction != undefined && mat.indexOfRefraction != 1.5; // 1.5 is normative default value.
35
+ }
36
+ return false;
30
37
  }
31
38
  /**
32
39
  * After exporting a material
@@ -46,6 +53,14 @@ export class KHR_materials_ior {
46
53
  node.extensions = node.extensions || {};
47
54
  node.extensions[NAME] = iorInfo;
48
55
  }
56
+ else if (babylonMaterial instanceof OpenPBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
57
+ this._wasUsed = true;
58
+ const iorInfo = {
59
+ ior: babylonMaterial.specularIor,
60
+ };
61
+ node.extensions = node.extensions || {};
62
+ node.extensions[NAME] = iorInfo;
63
+ }
49
64
  resolve(node);
50
65
  });
51
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_ior.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_ior.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAEjC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,iBAAiB;IAY1B;QAXA,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAEhB,aAAQ,GAAG,KAAK,CAAC;IAEV,CAAC;IAEhB,cAAc;IACP,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEO,mBAAmB,CAAC,GAAgB;QACxC,mFAAmF;QACnF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,GAAG,CAAC,iBAAiB,IAAI,SAAS,IAAI,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC,kCAAkC;IACjH,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,MAAM,OAAO,GAAqB;oBAC9B,GAAG,EAAE,eAAe,CAAC,iBAAiB;iBACzC,CAAC;gBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,6DAA6D;AAC7D,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsIor } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_ior\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_ior/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_ior implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor() {}\r\n\r\n /** Dispose */\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n return mat.indexOfRefraction != undefined && mat.indexOfRefraction != 1.5; // 1.5 is normative default value.\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise, resolves with the material\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const iorInfo: IKHRMaterialsIor = {\r\n ior: babylonMaterial.indexOfRefraction,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = iorInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_ior());\r\n"]}
1
+ {"version":3,"file":"KHR_materials_ior.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_ior.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,IAAI,GAAG,mBAAmB,CAAC;AAEjC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,iBAAiB;IAY1B;QAXA,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAEhB,aAAQ,GAAG,KAAK,CAAC;IAEV,CAAC;IAEhB,cAAc;IACP,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEO,mBAAmB,CAAC,GAAkC;QAC1D,mFAAmF;QACnF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,GAAG,YAAY,eAAe,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,kCAAkC;QACrE,CAAC;aAAM,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC,iBAAiB,IAAI,SAAS,IAAI,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,CAAC,kCAAkC;QACjH,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,MAAM,OAAO,GAAqB;oBAC9B,GAAG,EAAE,eAAe,CAAC,iBAAiB;iBACzC,CAAC;gBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACpC,CAAC;iBAAM,IAAI,eAAe,YAAY,eAAe,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBACjG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,MAAM,OAAO,GAAqB;oBAC9B,GAAG,EAAE,eAAe,CAAC,WAAW;iBACnC,CAAC;gBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,6DAA6D;AAC7D,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsIor } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_ior\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_ior/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_ior implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor() {}\r\n\r\n /** Dispose */\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial | OpenPBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n if (mat instanceof OpenPBRMaterial) {\r\n return mat.specularIor != 1.5; // 1.5 is normative default value.\r\n } else if (mat instanceof PBRMaterial) {\r\n return mat.indexOfRefraction != undefined && mat.indexOfRefraction != 1.5; // 1.5 is normative default value.\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise, resolves with the material\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const iorInfo: IKHRMaterialsIor = {\r\n ior: babylonMaterial.indexOfRefraction,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = iorInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n const iorInfo: IKHRMaterialsIor = {\r\n ior: babylonMaterial.specularIor,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = iorInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_ior());\r\n"]}
@@ -2,6 +2,7 @@ import { GLTFExporter } from "../glTFExporter.js";
2
2
  import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
3
  import { Logger } from "@babylonjs/core/Misc/logger.js";
4
4
  import { OpenPBRMaterial } from "@babylonjs/core/Materials/PBR/openpbrMaterial.js";
5
+ import { Color3 } from "@babylonjs/core/Maths/math.color.js";
5
6
  const NAME = "KHR_materials_transmission";
6
7
  /**
7
8
  * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/README.md)
@@ -44,6 +45,9 @@ export class KHR_materials_transmission {
44
45
  else if (babylonMaterial instanceof OpenPBRMaterial) {
45
46
  if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionWeightTexture) {
46
47
  additionalTextures.push(babylonMaterial.transmissionWeightTexture);
48
+ if (babylonMaterial.transmissionColorTexture) {
49
+ additionalTextures.push(babylonMaterial.transmissionColorTexture);
50
+ }
47
51
  }
48
52
  if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceWeightTexture) {
49
53
  additionalTextures.push(babylonMaterial.subsurfaceWeightTexture);
@@ -117,9 +121,21 @@ export class KHR_materials_transmission {
117
121
  transmissionInfo.transmissionTexture = subsurfaceTexture;
118
122
  }
119
123
  }
120
- if (transmissionFactor === 1) {
124
+ if (babylonMaterial.transmissionDepth == 0.0 && (!babylonMaterial.transmissionColor.equals(Color3.White()) || babylonMaterial.transmissionColorTexture)) {
121
125
  if (node.pbrMetallicRoughness) {
122
- node.pbrMetallicRoughness.baseColorFactor = undefined;
126
+ if (!node.pbrMetallicRoughness.baseColorFactor) {
127
+ node.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];
128
+ }
129
+ node.pbrMetallicRoughness.baseColorFactor[0] *= babylonMaterial.transmissionColor.r;
130
+ node.pbrMetallicRoughness.baseColorFactor[1] *= babylonMaterial.transmissionColor.g;
131
+ node.pbrMetallicRoughness.baseColorFactor[2] *= babylonMaterial.transmissionColor.b;
132
+ if (babylonMaterial.transmissionColorTexture && !node.pbrMetallicRoughness.baseColorTexture) {
133
+ const transmissionColorTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionColorTexture);
134
+ if (transmissionColorTexture) {
135
+ node.pbrMetallicRoughness.baseColorTexture = transmissionColorTexture;
136
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
137
+ }
138
+ }
123
139
  }
124
140
  }
125
141
  node.extensions || (node.extensions = {});
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_transmission.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_transmission.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAE1C;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,0BAA0B;IAcnC,YAAY,QAAsB;QAblC,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAIhB,aAAQ,GAAG,KAAK,CAAC;QAGrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,cAAc;IACP,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,yCAAyC,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QAC/G,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAE7C,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,eAAe,CAAC,UAAU,CAAC,0BAA0B,IAAI,eAAe,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;oBAC3G,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;gBACnF,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC9B,CAAC;QACL,CAAC;aAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YACpD,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,eAAe,CAAC,yBAAyB,EAAE,CAAC;gBACtF,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,IAAI,eAAe,CAAC,uBAAuB,EAAE,CAAC;gBAClF,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,GAAa;QACrC,mFAAmF;QACnF,IAAI,GAAG,YAAY,eAAe,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAClE,CAAC;aAAM,IAAI,GAAG,YAAY,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5B,OAAO,CACH,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,IAAI,SAAS,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;gBACpG,CAAC,IAAI,CAAC,0BAA0B,IAAI,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,CACzE,CAAC;QACN,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QAC7F,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC;YAC9C,MAAM,kBAAkB,GAAG,UAAU,CAAC,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAE7G,MAAM,gBAAgB,GAA8B;gBAChD,kBAAkB,EAAE,kBAAkB;aACzC,CAAC;YAEF,IAAI,UAAU,CAAC,0BAA0B,EAAE,CAAC;gBACxC,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;oBAClC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;oBACnH,IAAI,mBAAmB,EAAE,CAAC;wBACtB,gBAAgB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;oBAC/D,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,yGAAyG,CAAC,CAAC;gBACrI,CAAC;YACL,CAAC;YAED,IAAI,CAAC,UAAU,KAAf,IAAI,CAAC,UAAU,GAAK,EAAE,EAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;QAC7C,CAAC;aAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,MAAM,8BAA8B,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;YACrH,MAAM,kBAAkB,GAAG,8BAA8B,GAAG,eAAe,CAAC,kBAAkB,CAAC;YAE/F,MAAM,gBAAgB,GAA8B;gBAChD,kBAAkB,EAAE,kBAAkB;aACzC,CAAC;YAEF,IAAI,eAAe,CAAC,yBAAyB,EAAE,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC;gBACvH,IAAI,mBAAmB,EAAE,CAAC;oBACtB,gBAAgB,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;gBAC/D,CAAC;YACL,CAAC;iBAAM,IAAI,eAAe,CAAC,uBAAuB,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBACzD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;gBACnH,IAAI,iBAAiB,EAAE,CAAC;oBACpB,gBAAgB,CAAC,mBAAmB,GAAG,iBAAiB,CAAC;gBAC7D,CAAC;YACL,CAAC;YAED,IAAI,kBAAkB,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,oBAAoB,CAAC,eAAe,GAAG,SAAS,CAAC;gBAC1D,CAAC;YACL,CAAC;YAED,IAAI,CAAC,UAAU,KAAf,IAAI,CAAC,UAAU,GAAK,EAAE,EAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC;QAC7C,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsTransmission } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_transmission\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_transmission implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n /** Dispose */\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.refractionIntensityTexture && babylonMaterial.subSurface.useGltfStyleTextures) {\r\n additionalTextures.push(babylonMaterial.subSurface.refractionIntensityTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionWeightTexture) {\r\n additionalTextures.push(babylonMaterial.transmissionWeightTexture);\r\n }\r\n if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceWeightTexture) {\r\n additionalTextures.push(babylonMaterial.subsurfaceWeightTexture);\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: Material): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat instanceof OpenPBRMaterial && !mat.unlit) {\r\n return mat.transmissionWeight > 0 || mat.subsurfaceWeight > 0;\r\n } else if (mat instanceof PBRMaterial && !mat.unlit) {\r\n const subs = mat.subSurface;\r\n return (\r\n (subs.isRefractionEnabled && subs.refractionIntensity != undefined && subs.refractionIntensity != 0) ||\r\n (subs.refractionIntensityTexture != null && subs.useGltfStyleTextures)\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns true if successful\r\n */\r\n public async postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n if (!this._isExtensionEnabled(babylonMaterial)) {\r\n return node;\r\n }\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n this._wasUsed = true;\r\n\r\n const subSurface = babylonMaterial.subSurface;\r\n const transmissionFactor = subSurface.refractionIntensity === 0 ? undefined : subSurface.refractionIntensity;\r\n\r\n const transmissionInfo: IKHRMaterialsTransmission = {\r\n transmissionFactor: transmissionFactor,\r\n };\r\n\r\n if (subSurface.refractionIntensityTexture) {\r\n if (subSurface.useGltfStyleTextures) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(subSurface.refractionIntensityTexture);\r\n if (transmissionTexture) {\r\n transmissionInfo.transmissionTexture = transmissionTexture;\r\n }\r\n } else {\r\n Logger.Warn(`${context}: Exporting a subsurface refraction intensity texture without \\`useGltfStyleTextures\\` is not supported`);\r\n }\r\n }\r\n\r\n node.extensions ||= {};\r\n node.extensions[NAME] = transmissionInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n this._wasUsed = true;\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const transmissionFactor = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n\r\n const transmissionInfo: IKHRMaterialsTransmission = {\r\n transmissionFactor: transmissionFactor,\r\n };\r\n\r\n if (babylonMaterial.transmissionWeightTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionWeightTexture);\r\n if (transmissionTexture) {\r\n transmissionInfo.transmissionTexture = transmissionTexture;\r\n }\r\n } else if (babylonMaterial.subsurfaceWeightTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const subsurfaceTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceWeightTexture);\r\n if (subsurfaceTexture) {\r\n transmissionInfo.transmissionTexture = subsurfaceTexture;\r\n }\r\n }\r\n\r\n if (transmissionFactor === 1) {\r\n if (node.pbrMetallicRoughness) {\r\n node.pbrMetallicRoughness.baseColorFactor = undefined;\r\n }\r\n }\r\n\r\n node.extensions ||= {};\r\n node.extensions[NAME] = transmissionInfo;\r\n }\r\n\r\n return node;\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_transmission(exporter));\r\n"]}
1
+ {"version":3,"file":"KHR_materials_transmission.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_transmission.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsTransmission } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Logger } from \"core/Misc/logger\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\n\r\nconst NAME = \"KHR_materials_transmission\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_transmission/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_transmission implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n /** Dispose */\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.refractionIntensityTexture && babylonMaterial.subSurface.useGltfStyleTextures) {\r\n additionalTextures.push(babylonMaterial.subSurface.refractionIntensityTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionWeightTexture) {\r\n additionalTextures.push(babylonMaterial.transmissionWeightTexture);\r\n if (babylonMaterial.transmissionColorTexture) {\r\n additionalTextures.push(babylonMaterial.transmissionColorTexture);\r\n }\r\n }\r\n if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceWeightTexture) {\r\n additionalTextures.push(babylonMaterial.subsurfaceWeightTexture);\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: Material): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat instanceof OpenPBRMaterial && !mat.unlit) {\r\n return mat.transmissionWeight > 0 || mat.subsurfaceWeight > 0;\r\n } else if (mat instanceof PBRMaterial && !mat.unlit) {\r\n const subs = mat.subSurface;\r\n return (\r\n (subs.isRefractionEnabled && subs.refractionIntensity != undefined && subs.refractionIntensity != 0) ||\r\n (subs.refractionIntensityTexture != null && subs.useGltfStyleTextures)\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns true if successful\r\n */\r\n public async postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n if (!this._isExtensionEnabled(babylonMaterial)) {\r\n return node;\r\n }\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n this._wasUsed = true;\r\n\r\n const subSurface = babylonMaterial.subSurface;\r\n const transmissionFactor = subSurface.refractionIntensity === 0 ? undefined : subSurface.refractionIntensity;\r\n\r\n const transmissionInfo: IKHRMaterialsTransmission = {\r\n transmissionFactor: transmissionFactor,\r\n };\r\n\r\n if (subSurface.refractionIntensityTexture) {\r\n if (subSurface.useGltfStyleTextures) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(subSurface.refractionIntensityTexture);\r\n if (transmissionTexture) {\r\n transmissionInfo.transmissionTexture = transmissionTexture;\r\n }\r\n } else {\r\n Logger.Warn(`${context}: Exporting a subsurface refraction intensity texture without \\`useGltfStyleTextures\\` is not supported`);\r\n }\r\n }\r\n\r\n node.extensions ||= {};\r\n node.extensions[NAME] = transmissionInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n this._wasUsed = true;\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const transmissionFactor = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n\r\n const transmissionInfo: IKHRMaterialsTransmission = {\r\n transmissionFactor: transmissionFactor,\r\n };\r\n\r\n if (babylonMaterial.transmissionWeightTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionWeightTexture);\r\n if (transmissionTexture) {\r\n transmissionInfo.transmissionTexture = transmissionTexture;\r\n }\r\n } else if (babylonMaterial.subsurfaceWeightTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const subsurfaceTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceWeightTexture);\r\n if (subsurfaceTexture) {\r\n transmissionInfo.transmissionTexture = subsurfaceTexture;\r\n }\r\n }\r\n\r\n if (babylonMaterial.transmissionDepth == 0.0 && (!babylonMaterial.transmissionColor.equals(Color3.White()) || babylonMaterial.transmissionColorTexture)) {\r\n if (node.pbrMetallicRoughness) {\r\n if (!node.pbrMetallicRoughness.baseColorFactor) {\r\n node.pbrMetallicRoughness.baseColorFactor = [1, 1, 1, 1];\r\n }\r\n node.pbrMetallicRoughness.baseColorFactor[0] *= babylonMaterial.transmissionColor.r;\r\n node.pbrMetallicRoughness.baseColorFactor[1] *= babylonMaterial.transmissionColor.g;\r\n node.pbrMetallicRoughness.baseColorFactor[2] *= babylonMaterial.transmissionColor.b;\r\n if (babylonMaterial.transmissionColorTexture && !node.pbrMetallicRoughness.baseColorTexture) {\r\n const transmissionColorTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionColorTexture);\r\n if (transmissionColorTexture) {\r\n node.pbrMetallicRoughness.baseColorTexture = transmissionColorTexture;\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n }\r\n }\r\n }\r\n\r\n node.extensions ||= {};\r\n node.extensions[NAME] = transmissionInfo;\r\n }\r\n\r\n return node;\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_transmission(exporter));\r\n"]}
@@ -98,7 +98,7 @@ export class KHR_materials_volume {
98
98
  node.extensions[NAME] = volumeInfo;
99
99
  }
100
100
  else if (babylonMaterial instanceof OpenPBRMaterial) {
101
- const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled && babylonMaterial.transmissionDepth > 0;
101
+ const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;
102
102
  const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;
103
103
  if (transmissionVolume || subsurfaceVolume) {
104
104
  this._wasUsed = true;
@@ -107,9 +107,9 @@ export class KHR_materials_volume {
107
107
  if (thicknessTexture) {
108
108
  this._exporter._materialNeedsUVsSet.add(babylonMaterial);
109
109
  }
110
- let transmissionAttenuationDistance = 1;
110
+ let transmissionAttenuationDistance;
111
111
  const transmissionAttenuationColor = Color3.White().asArray();
112
- if (transmissionVolume) {
112
+ if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {
113
113
  const invDepth = 1.0 / babylonMaterial.transmissionDepth;
114
114
  let transmissionExtinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
115
115
  const transmissionScatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
@@ -127,6 +127,13 @@ export class KHR_materials_volume {
127
127
  transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);
128
128
  transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);
129
129
  }
130
+ else {
131
+ // transmissionDepth == 0
132
+ transmissionAttenuationDistance = Number.MAX_VALUE;
133
+ transmissionAttenuationColor[0] = 1.0;
134
+ transmissionAttenuationColor[1] = 1.0;
135
+ transmissionAttenuationColor[2] = 1.0;
136
+ }
130
137
  let subsurfaceAttenuationDistance = 1;
131
138
  const subsurfaceAttenuationColor = Color3.White().asArray();
132
139
  if (subsurfaceVolume) {
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_volume.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.thicknessTexture) {\r\n additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.geometryThicknessTexture) {\r\n additionalTextures.push(babylonMaterial.geometryThicknessTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const subs = mat.subSurface;\r\n // this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {\r\n return false;\r\n }\r\n return (\r\n (subs.maximumThickness != undefined && subs.maximumThickness != 0) ||\r\n (subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||\r\n (subs.tintColor != undefined && subs.tintColor != Color3.White()) ||\r\n this._hasTexturesExtension(mat)\r\n );\r\n }\r\n\r\n private _hasTexturesExtension(mat: PBRMaterial): boolean {\r\n return mat.subSurface.thicknessTexture != null;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const subs = babylonMaterial.subSurface;\r\n const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;\r\n const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;\r\n const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n\r\n if (this._hasTexturesExtension(babylonMaterial)) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled && babylonMaterial.transmissionDepth > 0;\r\n const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n if (transmissionVolume || subsurfaceVolume) {\r\n this._wasUsed = true;\r\n\r\n const thicknessFactor = babylonMaterial.geometryThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;\r\n if (thicknessTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n let transmissionAttenuationDistance = 1;\r\n const transmissionAttenuationColor = Color3.White().asArray();\r\n if (transmissionVolume) {\r\n const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n let transmissionExtinctionCoefficient = new Vector3(\r\n -Math.log(babylonMaterial.transmissionColor.r) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.g) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.b) * invDepth\r\n );\r\n const transmissionScatteringCoefficient = new Vector3(\r\n babylonMaterial.transmissionScatter.r * invDepth,\r\n babylonMaterial.transmissionScatter.g * invDepth,\r\n babylonMaterial.transmissionScatter.b * invDepth\r\n );\r\n const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);\r\n const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);\r\n if (minCoeff < 0) {\r\n transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;\r\n transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;\r\n transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;\r\n }\r\n transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);\r\n const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);\r\n transmissionAttenuationDistance = 1.0 / maxCoeff;\r\n transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);\r\n }\r\n let subsurfaceAttenuationDistance = 1;\r\n const subsurfaceAttenuationColor = Color3.White().asArray();\r\n if (subsurfaceVolume) {\r\n const r = babylonMaterial.subsurfaceRadius;\r\n const radiusScale = babylonMaterial.subsurfaceRadiusScale;\r\n const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);\r\n const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));\r\n const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);\r\n subsurfaceAttenuationDistance = 1.0 / maxCoeff;\r\n subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);\r\n const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));\r\n"]}
1
+ {"version":3,"file":"KHR_materials_volume.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAEpC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,oBAAoB;IAc7B,YAAY,QAAsB;QAblC,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAIhB,aAAQ,GAAG,KAAK,CAAC;QAGrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,yCAAyC,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QAC/G,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAE7C,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC5C,IAAI,eAAe,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;oBAC9C,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,kBAAkB,CAAC;YAC9B,CAAC;QACL,CAAC;aAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YACpD,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACjF,IAAI,eAAe,CAAC,wBAAwB,EAAE,CAAC;oBAC3C,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;gBACtE,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,GAAgB;QACxC,mFAAmF;QACnF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;QAC5B,kHAAkH;QAClH,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CACH,CAAC,IAAI,CAAC,gBAAgB,IAAI,SAAS,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAClE,CAAC,IAAI,CAAC,mBAAmB,IAAI,SAAS,IAAI,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,CAAC;YAC/F,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAClC,CAAC;IACN,CAAC;IAEO,qBAAqB,CAAC,GAAgB;QAC1C,OAAO,GAAG,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,WAAW,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBACtF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC;gBACxC,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBACvF,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,SAAS,CAAC;gBAC7G,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;gBACxH,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAE3G,MAAM,UAAU,GAAwB;oBACpC,eAAe,EAAE,eAAe;oBAChC,gBAAgB,EAAE,gBAAgB;oBAClC,mBAAmB,EAAE,mBAAmB;oBACxC,gBAAgB,EAAE,gBAAgB;iBACrC,CAAC;gBAEF,IAAI,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;YACvC,CAAC;iBAAM,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;gBACpD,MAAM,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBACzG,MAAM,gBAAgB,GAAG,eAAe,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC;gBACrG,IAAI,kBAAkB,IAAI,gBAAgB,EAAE,CAAC;oBACzC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBAErB,MAAM,eAAe,GAAG,eAAe,CAAC,iBAAiB,CAAC;oBAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,wBAAwB,CAAC,IAAI,SAAS,CAAC;oBAChI,IAAI,gBAAgB,EAAE,CAAC;wBACnB,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBAC7D,CAAC;oBACD,IAAI,+BAA+B,CAAC;oBACpC,MAAM,4BAA4B,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC9D,IAAI,kBAAkB,IAAI,eAAe,CAAC,iBAAiB,GAAG,CAAC,EAAE,CAAC;wBAC9D,MAAM,QAAQ,GAAG,GAAG,GAAG,eAAe,CAAC,iBAAiB,CAAC;wBACzD,IAAI,iCAAiC,GAAG,IAAI,OAAO,CAC/C,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,EACzD,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,EACzD,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAC5D,CAAC;wBACF,MAAM,iCAAiC,GAAG,IAAI,OAAO,CACjD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,EAChD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,EAChD,eAAe,CAAC,mBAAmB,CAAC,CAAC,GAAG,QAAQ,CACnD,CAAC;wBACF,MAAM,iCAAiC,GAAG,iCAAiC,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;wBACxH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC;wBACzI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;4BACf,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;4BACrF,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;4BACrF,iCAAiC,CAAC,CAAC,GAAG,iCAAiC,CAAC,CAAC,GAAG,QAAQ,CAAC;wBACzF,CAAC;wBACD,iCAAiC,GAAG,iCAAiC,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;wBAC7G,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC;wBACzI,+BAA+B,GAAG,GAAG,GAAG,QAAQ,CAAC;wBACjD,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;wBACnH,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;wBACnH,4BAA4B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,iCAAiC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC;oBACvH,CAAC;yBAAM,CAAC;wBACJ,yBAAyB;wBACzB,+BAA+B,GAAG,MAAM,CAAC,SAAS,CAAC;wBACnD,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtC,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtC,4BAA4B,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC1C,CAAC;oBACD,IAAI,6BAA6B,GAAG,CAAC,CAAC;oBACtC,MAAM,0BAA0B,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC5D,IAAI,gBAAgB,EAAE,CAAC;wBACnB,MAAM,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;wBAC3C,MAAM,WAAW,GAAG,eAAe,CAAC,qBAAqB,CAAC;wBAC1D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC/F,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;wBAC3H,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;wBACnF,6BAA6B,GAAG,GAAG,GAAG,QAAQ,CAAC;wBAC/C,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;wBAC7F,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;wBAC7F,0BAA0B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC;oBACjG,CAAC;oBAED,MAAM,8BAA8B,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;oBACrH,MAAM,6CAA6C,GAAG,8BAA8B,GAAG,eAAe,CAAC,kBAAkB,CAAC;oBAC1H,MAAM,yDAAyD,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC;oBACtI,MAAM,WAAW,GAAG,eAAe,CAAC,kBAAkB,GAAG,yDAAyD,CAAC;oBACnH,MAAM,aAAa,GAAG,8BAA8B,GAAG,yDAAyD,CAAC;oBAEjH,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,WAAW,GAAG,0BAA0B,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;oBACrI,MAAM,mBAAmB,GAAG,+BAA+B,GAAG,WAAW,GAAG,6BAA6B,GAAG,aAAa,CAAC;oBAE1H,MAAM,UAAU,GAAwB;wBACpC,eAAe,EAAE,eAAe;wBAChC,gBAAgB,EAAE,gBAAgB;wBAClC,mBAAmB,EAAE,mBAAmB;wBACxC,gBAAgB,EAAE,gBAAgB;qBACrC,CAAC;oBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;oBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBACvC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolume } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRMaterial } from \"core/Materials/PBR/pbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\n\r\nconst NAME = \"KHR_materials_volume\";\r\n\r\n/**\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n if (this._isExtensionEnabled(babylonMaterial)) {\r\n if (babylonMaterial.subSurface.thicknessTexture) {\r\n additionalTextures.push(babylonMaterial.subSurface.thicknessTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.geometryThicknessTexture) {\r\n additionalTextures.push(babylonMaterial.geometryThicknessTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: PBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const subs = mat.subSurface;\r\n // this extension requires either the KHR_materials_transmission or KHR_materials_diffuse_transmission extensions.\r\n if (!subs.isRefractionEnabled && !subs.isTranslucencyEnabled) {\r\n return false;\r\n }\r\n return (\r\n (subs.maximumThickness != undefined && subs.maximumThickness != 0) ||\r\n (subs.tintColorAtDistance != undefined && subs.tintColorAtDistance != Number.POSITIVE_INFINITY) ||\r\n (subs.tintColor != undefined && subs.tintColor != Color3.White()) ||\r\n this._hasTexturesExtension(mat)\r\n );\r\n }\r\n\r\n private _hasTexturesExtension(mat: PBRMaterial): boolean {\r\n return mat.subSurface.thicknessTexture != null;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof PBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n const subs = babylonMaterial.subSurface;\r\n const thicknessFactor = subs.maximumThickness == 0 ? undefined : subs.maximumThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(subs.thicknessTexture) ?? undefined;\r\n const attenuationDistance = subs.tintColorAtDistance == Number.POSITIVE_INFINITY ? undefined : subs.tintColorAtDistance;\r\n const attenuationColor = subs.tintColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : subs.tintColor.asArray();\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n\r\n if (this._hasTexturesExtension(babylonMaterial)) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;\r\n if (transmissionVolume || subsurfaceVolume) {\r\n this._wasUsed = true;\r\n\r\n const thicknessFactor = babylonMaterial.geometryThickness;\r\n const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;\r\n if (thicknessTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n let transmissionAttenuationDistance;\r\n const transmissionAttenuationColor = Color3.White().asArray();\r\n if (transmissionVolume && babylonMaterial.transmissionDepth > 0) {\r\n const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n let transmissionExtinctionCoefficient = new Vector3(\r\n -Math.log(babylonMaterial.transmissionColor.r) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.g) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.b) * invDepth\r\n );\r\n const transmissionScatteringCoefficient = new Vector3(\r\n babylonMaterial.transmissionScatter.r * invDepth,\r\n babylonMaterial.transmissionScatter.g * invDepth,\r\n babylonMaterial.transmissionScatter.b * invDepth\r\n );\r\n const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);\r\n const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);\r\n if (minCoeff < 0) {\r\n transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;\r\n transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;\r\n transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;\r\n }\r\n transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);\r\n const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);\r\n transmissionAttenuationDistance = 1.0 / maxCoeff;\r\n transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);\r\n transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);\r\n } else {\r\n // transmissionDepth == 0\r\n transmissionAttenuationDistance = Number.MAX_VALUE;\r\n transmissionAttenuationColor[0] = 1.0;\r\n transmissionAttenuationColor[1] = 1.0;\r\n transmissionAttenuationColor[2] = 1.0;\r\n }\r\n let subsurfaceAttenuationDistance = 1;\r\n const subsurfaceAttenuationColor = Color3.White().asArray();\r\n if (subsurfaceVolume) {\r\n const r = babylonMaterial.subsurfaceRadius;\r\n const radiusScale = babylonMaterial.subsurfaceRadiusScale;\r\n const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);\r\n const extinctionCoeff = new Vector3(1.0 / Math.max(mfp.x, 1e-6), 1.0 / Math.max(mfp.y, 1e-6), 1.0 / Math.max(mfp.z, 1e-6));\r\n const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);\r\n subsurfaceAttenuationDistance = 1.0 / maxCoeff;\r\n subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);\r\n subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);\r\n const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;\r\n\r\n const volumeInfo: IKHRMaterialsVolume = {\r\n thicknessFactor: thicknessFactor,\r\n thicknessTexture: thicknessTexture,\r\n attenuationDistance: attenuationDistance,\r\n attenuationColor: attenuationColor,\r\n };\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume(exporter));\r\n"]}
@@ -84,18 +84,8 @@ export class KHR_materials_volume_scatter {
84
84
  let transmissionMultiscatterColor = Vector3.Zero();
85
85
  let transmissionScatterAnisotropy = 0;
86
86
  if (babylonMaterial.transmissionWeight > 0) {
87
- const invDepth = 1.0 / babylonMaterial.transmissionDepth;
88
- let transmissionExtinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
89
- const transmissionScatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
90
- const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);
91
- const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);
92
- if (minCoeff < 0) {
93
- transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;
94
- transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;
95
- transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;
96
- }
97
- transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);
98
- const ssAlbedo = new Vector3(transmissionScatteringCoefficient.x / Math.max(transmissionExtinctionCoefficient.x, 0.000001), transmissionScatteringCoefficient.y / Math.max(transmissionExtinctionCoefficient.y, 0.000001), transmissionScatteringCoefficient.z / Math.max(transmissionExtinctionCoefficient.z, 0.000001));
87
+ // In OpenPBR 1.2, the transmission_scatter_color represents the single scatter albedo.
88
+ const ssAlbedo = new Vector3(babylonMaterial.transmissionScatter.r, babylonMaterial.transmissionScatter.g, babylonMaterial.transmissionScatter.b);
99
89
  transmissionMultiscatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);
100
90
  transmissionScatterAnisotropy = babylonMaterial.transmissionScatterAnisotropy;
101
91
  }
@@ -126,6 +116,7 @@ export class KHR_materials_volume_scatter {
126
116
  }
127
117
  else if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionScatterTexture) {
128
118
  this._exporter._materialNeedsUVsSet.add(babylonMaterial);
119
+ // TODO - the transmission_scatter texture represents the single scatter albedo, not the multiscatter color. Convert it before exporting.
129
120
  const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionScatterTexture);
130
121
  if (transmissionTexture) {
131
122
  volumeInfo.multiscatterColorTexture = transmissionTexture;
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_volume_scatter.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume_scatter.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolumeScatter } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst NAME = \"KHR_materials_volume_scatter\";\r\n\r\nfunction SingleScatterToMultiScatterAlbedo(singleScatter: Vector3): Vector3 {\r\n const s = new Vector3(Math.sqrt(1.0 - singleScatter.x), Math.sqrt(1.0 - singleScatter.y), Math.sqrt(1.0 - singleScatter.z));\r\n const ones = new Vector3(1.0, 1.0, 1.0);\r\n const t = ones.subtract(s);\r\n const p = ones.subtract(new Vector3(0.139, 0.139, 0.139).multiplyInPlace(s));\r\n const k = ones.add(new Vector3(1.17, 1.17, 1.17).multiplyInPlace(s));\r\n\r\n return t.multiplyInPlace(p).divideInPlace(k);\r\n}\r\n\r\n/**\r\n * TODO: In-progress specification\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/7ea427ed55d44427e83c0a6d1c87068b1a4151c5/extensions/2.0/Khronos/KHR_materials_volume_scatter/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume_scatter implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0) {\r\n if (babylonMaterial.transmissionScatterTexture) {\r\n additionalTextures.push(babylonMaterial.transmissionScatterTexture);\r\n }\r\n }\r\n if (babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.subsurfaceColorTexture) {\r\n additionalTextures.push(babylonMaterial.subsurfaceColorTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: OpenPBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const transmissionVolume = mat.transmissionWeight > 0 && !mat.geometryThinWalled && mat.transmissionDepth > 0;\r\n const transmissionScatter = transmissionVolume && !mat.transmissionScatter.equals(Color3.Black());\r\n const subsurfaceVolume = mat.subsurfaceWeight > 0 && !mat.geometryThinWalled;\r\n if (transmissionScatter || subsurfaceVolume) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof OpenPBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n // If both transmission and subsurface volumes exist, combine them.\r\n let transmissionMultiscatterColor = Vector3.Zero();\r\n let transmissionScatterAnisotropy = 0;\r\n if (babylonMaterial.transmissionWeight > 0) {\r\n const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n let transmissionExtinctionCoefficient = new Vector3(\r\n -Math.log(babylonMaterial.transmissionColor.r) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.g) * invDepth,\r\n -Math.log(babylonMaterial.transmissionColor.b) * invDepth\r\n );\r\n const transmissionScatteringCoefficient = new Vector3(\r\n babylonMaterial.transmissionScatter.r * invDepth,\r\n babylonMaterial.transmissionScatter.g * invDepth,\r\n babylonMaterial.transmissionScatter.b * invDepth\r\n );\r\n const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);\r\n const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);\r\n if (minCoeff < 0) {\r\n transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;\r\n transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;\r\n transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;\r\n }\r\n transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);\r\n\r\n const ssAlbedo = new Vector3(\r\n transmissionScatteringCoefficient.x / Math.max(transmissionExtinctionCoefficient.x, 0.000001),\r\n transmissionScatteringCoefficient.y / Math.max(transmissionExtinctionCoefficient.y, 0.000001),\r\n transmissionScatteringCoefficient.z / Math.max(transmissionExtinctionCoefficient.z, 0.000001)\r\n );\r\n transmissionMultiscatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);\r\n transmissionScatterAnisotropy = babylonMaterial.transmissionScatterAnisotropy;\r\n }\r\n\r\n const subsurfaceMultiscatterColor = Vector3.Zero();\r\n let subsurfaceScatterAnisotropy = 0;\r\n if (babylonMaterial.subsurfaceWeight > 0) {\r\n subsurfaceMultiscatterColor.set(babylonMaterial.subsurfaceColor.r, babylonMaterial.subsurfaceColor.g, babylonMaterial.subsurfaceColor.b);\r\n subsurfaceScatterAnisotropy = babylonMaterial.subsurfaceScatterAnisotropy;\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const multiscatterColor = transmissionMultiscatterColor\r\n .multiplyByFloats(transWeight, transWeight, transWeight)\r\n .addInPlace(subsurfaceMultiscatterColor.multiplyByFloats(subsurfWeight, subsurfWeight, subsurfWeight));\r\n\r\n const volumeInfo: IKHRMaterialsVolumeScatter = {\r\n multiscatterColorFactor: multiscatterColor.asArray(),\r\n scatterAnisotropy: transmissionScatterAnisotropy * transWeight + subsurfaceScatterAnisotropy * subsurfWeight,\r\n };\r\n\r\n if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceColorTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const subsurfaceScatterTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceColorTexture);\r\n if (subsurfaceScatterTexture) {\r\n volumeInfo.multiscatterColorTexture = subsurfaceScatterTexture;\r\n }\r\n } else if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionScatterTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionScatterTexture);\r\n if (transmissionTexture) {\r\n volumeInfo.multiscatterColorTexture = transmissionTexture;\r\n }\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume_scatter(exporter), 101);\r\n"]}
1
+ {"version":3,"file":"KHR_materials_volume_scatter.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_volume_scatter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAE5C,SAAS,iCAAiC,CAAC,aAAsB;IAC7D,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5H,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,gEAAgE;AAChE,MAAM,OAAO,4BAA4B;IAcrC,YAAY,QAAsB;QAblC,6BAA6B;QACb,SAAI,GAAG,IAAI,CAAC;QAE5B,gDAAgD;QACzC,YAAO,GAAG,IAAI,CAAC;QAEtB,iDAAiD;QAC1C,aAAQ,GAAG,KAAK,CAAC;QAIhB,aAAQ,GAAG,KAAK,CAAC;QAGrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,yCAAyC,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QAC/G,MAAM,kBAAkB,GAAkB,EAAE,CAAC;QAE7C,IAAI,eAAe,YAAY,eAAe,EAAE,CAAC;YAC7C,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC;oBAC7C,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;gBACxE,CAAC;YACL,CAAC;YACD,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACvC,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;oBACzC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;gBACpE,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEO,mBAAmB,CAAC,GAAoB;QAC5C,mFAAmF;QACnF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,MAAM,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC9G,MAAM,mBAAmB,GAAG,kBAAkB,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAClG,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC;QAC7E,IAAI,mBAAmB,IAAI,gBAAgB,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;;OAMG;IACH,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,eAAe,YAAY,eAAe,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC1F,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,mEAAmE;gBACnE,IAAI,6BAA6B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,6BAA6B,GAAG,CAAC,CAAC;gBACtC,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,EAAE,CAAC;oBACzC,uFAAuF;oBACvF,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;oBAClJ,6BAA6B,GAAG,iCAAiC,CAAC,QAAQ,CAAC,CAAC;oBAC5E,6BAA6B,GAAG,eAAe,CAAC,6BAA6B,CAAC;gBAClF,CAAC;gBAED,MAAM,2BAA2B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnD,IAAI,2BAA2B,GAAG,CAAC,CAAC;gBACpC,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;oBACvC,2BAA2B,CAAC,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;oBACzI,2BAA2B,GAAG,eAAe,CAAC,2BAA2B,CAAC;gBAC9E,CAAC;gBAED,MAAM,8BAA8B,GAAG,CAAC,GAAG,GAAG,eAAe,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC,gBAAgB,CAAC;gBACrH,MAAM,6CAA6C,GAAG,8BAA8B,GAAG,eAAe,CAAC,kBAAkB,CAAC;gBAC1H,MAAM,yDAAyD,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,6CAA6C,EAAE,IAAI,CAAC,CAAC;gBACtI,MAAM,WAAW,GAAG,eAAe,CAAC,kBAAkB,GAAG,yDAAyD,CAAC;gBACnH,MAAM,aAAa,GAAG,8BAA8B,GAAG,yDAAyD,CAAC;gBAEjH,MAAM,iBAAiB,GAAG,6BAA6B;qBAClD,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;qBACvD,UAAU,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;gBAE3G,MAAM,UAAU,GAA+B;oBAC3C,uBAAuB,EAAE,iBAAiB,CAAC,OAAO,EAAE;oBACpD,iBAAiB,EAAE,6BAA6B,GAAG,WAAW,GAAG,2BAA2B,GAAG,aAAa;iBAC/G,CAAC;gBAEF,IAAI,eAAe,CAAC,gBAAgB,GAAG,CAAC,IAAI,eAAe,CAAC,sBAAsB,EAAE,CAAC;oBACjF,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBACzD,MAAM,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;oBACzH,IAAI,wBAAwB,EAAE,CAAC;wBAC3B,UAAU,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;oBACnE,CAAC;gBACL,CAAC;qBAAM,IAAI,eAAe,CAAC,kBAAkB,GAAG,CAAC,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC;oBAC9F,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBACzD,yIAAyI;oBACzI,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAAC;oBACxH,IAAI,mBAAmB,EAAE,CAAC;wBACtB,UAAU,CAAC,wBAAwB,GAAG,mBAAmB,CAAC;oBAC9D,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,4BAA4B,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC","sourcesContent":["import { type IMaterial, type IKHRMaterialsVolumeScatter } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Vector3 } from \"core/Maths/math.vector\";\r\n\r\nconst NAME = \"KHR_materials_volume_scatter\";\r\n\r\nfunction SingleScatterToMultiScatterAlbedo(singleScatter: Vector3): Vector3 {\r\n const s = new Vector3(Math.sqrt(1.0 - singleScatter.x), Math.sqrt(1.0 - singleScatter.y), Math.sqrt(1.0 - singleScatter.z));\r\n const ones = new Vector3(1.0, 1.0, 1.0);\r\n const t = ones.subtract(s);\r\n const p = ones.subtract(new Vector3(0.139, 0.139, 0.139).multiplyInPlace(s));\r\n const k = ones.add(new Vector3(1.17, 1.17, 1.17).multiplyInPlace(s));\r\n\r\n return t.multiplyInPlace(p).divideInPlace(k);\r\n}\r\n\r\n/**\r\n * TODO: In-progress specification\r\n * [Specification](https://github.com/KhronosGroup/glTF/blob/7ea427ed55d44427e83c0a6d1c87068b1a4151c5/extensions/2.0/Khronos/KHR_materials_volume_scatter/README.md)\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_volume_scatter implements IGLTFExporterExtensionV2 {\r\n /** Name of this extension */\r\n public readonly name = NAME;\r\n\r\n /** Defines whether this extension is enabled */\r\n public enabled = true;\r\n\r\n /** Defines whether this extension is required */\r\n public required = false;\r\n\r\n private _exporter: GLTFExporter;\r\n\r\n private _wasUsed = false;\r\n\r\n constructor(exporter: GLTFExporter) {\r\n this._exporter = exporter;\r\n }\r\n\r\n public dispose() {}\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n /**\r\n * After exporting a material, deal with additional textures\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns array of additional textures to export\r\n */\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n\r\n if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.transmissionWeight > 0) {\r\n if (babylonMaterial.transmissionScatterTexture) {\r\n additionalTextures.push(babylonMaterial.transmissionScatterTexture);\r\n }\r\n }\r\n if (babylonMaterial.subsurfaceWeight > 0) {\r\n if (babylonMaterial.subsurfaceColorTexture) {\r\n additionalTextures.push(babylonMaterial.subsurfaceColorTexture);\r\n }\r\n }\r\n }\r\n\r\n return additionalTextures;\r\n }\r\n\r\n private _isExtensionEnabled(mat: OpenPBRMaterial): boolean {\r\n // This extension must not be used on a material that also uses KHR_materials_unlit\r\n if (mat.unlit) {\r\n return false;\r\n }\r\n const transmissionVolume = mat.transmissionWeight > 0 && !mat.geometryThinWalled && mat.transmissionDepth > 0;\r\n const transmissionScatter = transmissionVolume && !mat.transmissionScatter.equals(Color3.Black());\r\n const subsurfaceVolume = mat.subsurfaceWeight > 0 && !mat.geometryThinWalled;\r\n if (transmissionScatter || subsurfaceVolume) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * After exporting a material\r\n * @param context GLTF context of the material\r\n * @param node exported GLTF node\r\n * @param babylonMaterial corresponding babylon material\r\n * @returns promise that resolves with the updated node\r\n */\r\n // eslint-disable-next-line no-restricted-syntax\r\n public postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial> {\r\n return new Promise((resolve) => {\r\n if (babylonMaterial instanceof OpenPBRMaterial && this._isExtensionEnabled(babylonMaterial)) {\r\n this._wasUsed = true;\r\n\r\n // If both transmission and subsurface volumes exist, combine them.\r\n let transmissionMultiscatterColor = Vector3.Zero();\r\n let transmissionScatterAnisotropy = 0;\r\n if (babylonMaterial.transmissionWeight > 0) {\r\n // In OpenPBR 1.2, the transmission_scatter_color represents the single scatter albedo.\r\n const ssAlbedo = new Vector3(babylonMaterial.transmissionScatter.r, babylonMaterial.transmissionScatter.g, babylonMaterial.transmissionScatter.b);\r\n transmissionMultiscatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);\r\n transmissionScatterAnisotropy = babylonMaterial.transmissionScatterAnisotropy;\r\n }\r\n\r\n const subsurfaceMultiscatterColor = Vector3.Zero();\r\n let subsurfaceScatterAnisotropy = 0;\r\n if (babylonMaterial.subsurfaceWeight > 0) {\r\n subsurfaceMultiscatterColor.set(babylonMaterial.subsurfaceColor.r, babylonMaterial.subsurfaceColor.g, babylonMaterial.subsurfaceColor.b);\r\n subsurfaceScatterAnisotropy = babylonMaterial.subsurfaceScatterAnisotropy;\r\n }\r\n\r\n const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;\r\n const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;\r\n const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);\r\n const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;\r\n\r\n const multiscatterColor = transmissionMultiscatterColor\r\n .multiplyByFloats(transWeight, transWeight, transWeight)\r\n .addInPlace(subsurfaceMultiscatterColor.multiplyByFloats(subsurfWeight, subsurfWeight, subsurfWeight));\r\n\r\n const volumeInfo: IKHRMaterialsVolumeScatter = {\r\n multiscatterColorFactor: multiscatterColor.asArray(),\r\n scatterAnisotropy: transmissionScatterAnisotropy * transWeight + subsurfaceScatterAnisotropy * subsurfWeight,\r\n };\r\n\r\n if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceColorTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n const subsurfaceScatterTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceColorTexture);\r\n if (subsurfaceScatterTexture) {\r\n volumeInfo.multiscatterColorTexture = subsurfaceScatterTexture;\r\n }\r\n } else if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionScatterTexture) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n // TODO - the transmission_scatter texture represents the single scatter albedo, not the multiscatter color. Convert it before exporting.\r\n const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionScatterTexture);\r\n if (transmissionTexture) {\r\n volumeInfo.multiscatterColorTexture = transmissionTexture;\r\n }\r\n }\r\n\r\n node.extensions = node.extensions || {};\r\n node.extensions[NAME] = volumeInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_volume_scatter(exporter), 101);\r\n"]}
@@ -8,6 +8,7 @@ import { GetTextureDataAsync, TextureTools } from "@babylonjs/core/Misc/textureT
8
8
  import { Texture } from "@babylonjs/core/Materials/Textures/texture.js";
9
9
  import { RawTexture } from "@babylonjs/core/Materials/Textures/rawTexture.js";
10
10
  import { Constants } from "@babylonjs/core/Engines/constants.js";
11
+ import { NullEngine } from "@babylonjs/core/Engines/nullEngine.js";
11
12
  import { EncodeImageAsync } from "@babylonjs/core/Misc/dumpTools.js";
12
13
  import { PBRBaseMaterial } from "@babylonjs/core/Materials/PBR/pbrBaseMaterial.js";
13
14
  import { SpecularPowerToRoughness } from "@babylonjs/core/Helpers/materialConversionHelper.js";
@@ -60,7 +61,14 @@ async function GetCachedImageAsync(babylonTexture) {
60
61
  return null;
61
62
  }
62
63
  if (internalTexture.invertY) {
63
- return null;
64
+ // On a real engine, the GPU has the texture stored flipped (UNPACK_FLIP_Y_WEBGL),
65
+ // while the glTF loader uploads with invertY=false. Falling back to GPU readback
66
+ // produces bytes that round-trip correctly. NullEngine has no GPU readback path,
67
+ // so the cached URL bytes are the only option.
68
+ const engine = babylonTexture.getScene()?.getEngine();
69
+ if (!(engine instanceof NullEngine)) {
70
+ return null;
71
+ }
64
72
  }
65
73
  const buffer = internalTexture._buffer;
66
74
  let data;
@@ -93,6 +101,10 @@ async function GetCachedImageAsync(babylonTexture) {
93
101
  // Failed to load texture data, fall back to GPU texture read via GetTextureDataAsync
94
102
  return null;
95
103
  }
104
+ if (data && !mimeType && internalTexture.url) {
105
+ const dataUriMatch = internalTexture.url.match(/^data:([^;,]+)/);
106
+ mimeType = dataUriMatch ? dataUriMatch[1] : GetMimeType(internalTexture.url);
107
+ }
96
108
  if (data && IsSupportedMimeType(mimeType)) {
97
109
  return new Blob([data], { type: mimeType });
98
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"glTFMaterialExporter.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\r\n/* eslint-disable github/no-then */\r\n/* eslint-disable babylonjs/available */\r\n\r\nimport {\r\n type ITextureInfo,\r\n type IMaterial,\r\n type IMaterialPbrMetallicRoughness,\r\n type IMaterialOcclusionTextureInfo,\r\n type ISampler,\r\n type IImage,\r\n ImageMimeType,\r\n MaterialAlphaMode,\r\n TextureMagFilter,\r\n TextureMinFilter,\r\n TextureWrapMode,\r\n} from \"babylonjs-gltf2interface\";\r\n\r\nimport { type DeepImmutable, type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { GetTextureDataAsync, TextureTools } from \"core/Misc/textureTools\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\n\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { type GLTFExporter } from \"./glTFExporter\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { EncodeImageAsync } from \"core/Misc/dumpTools\";\r\n\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { SpecularPowerToRoughness } from \"core/Helpers/materialConversionHelper\";\r\nimport { InternalTextureSource } from \"core/Materials/Textures/internalTexture\";\r\nimport { GetMimeType } from \"core/Misc/fileTools\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\n\r\nconst Epsilon = 1e-6;\r\nconst DielectricSpecular = new Color3(0.04, 0.04, 0.04) as DeepImmutable<Color3>;\r\nconst MaxSpecularPower = 1024;\r\nconst White = Color3.White() as DeepImmutable<Color3>;\r\nconst Black = Color3.BlackReadOnly;\r\n\r\n/**\r\n * Interface for storing specular glossiness factors\r\n * @internal\r\n */\r\ninterface IPBRSpecularGlossiness {\r\n /**\r\n * Represents the linear diffuse factors of the material\r\n */\r\n diffuseColor: Color3;\r\n specularColor: Color3;\r\n glossiness: number;\r\n}\r\n\r\ninterface IPBRMetallicRoughness {\r\n baseColor: Color3;\r\n metallic: Nullable<number>;\r\n roughness: Nullable<number>;\r\n metallicRoughnessTextureData?: Nullable<Blob>;\r\n baseColorTextureData?: Nullable<Blob>;\r\n}\r\n\r\nfunction GetFileExtensionFromMimeType(mimeType: ImageMimeType): string {\r\n switch (mimeType) {\r\n case ImageMimeType.JPEG:\r\n return \".jpg\";\r\n case ImageMimeType.PNG:\r\n return \".png\";\r\n case ImageMimeType.WEBP:\r\n return \".webp\";\r\n case ImageMimeType.AVIF:\r\n return \".avif\";\r\n case ImageMimeType.KTX2:\r\n return \".ktx2\";\r\n }\r\n}\r\n\r\n/**\r\n * @param mimeType the MIME type requested by the user\r\n * @returns true if the given mime type is compatible with glTF\r\n */\r\nfunction IsSupportedMimeType(mimeType?: string): mimeType is ImageMimeType {\r\n switch (mimeType) {\r\n case ImageMimeType.JPEG:\r\n case ImageMimeType.PNG:\r\n case ImageMimeType.WEBP:\r\n case ImageMimeType.AVIF:\r\n case ImageMimeType.KTX2:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Gets cached image from a texture, if available.\r\n * @param babylonTexture texture to check for cached image\r\n * @returns image data if found and directly usable; null otherwise\r\n */\r\nasync function GetCachedImageAsync(babylonTexture: BaseTexture): Promise<Nullable<Blob>> {\r\n const internalTexture = babylonTexture.getInternalTexture();\r\n if (!internalTexture || internalTexture.source !== InternalTextureSource.Url) {\r\n return null;\r\n }\r\n if (internalTexture.invertY) {\r\n return null;\r\n }\r\n\r\n const buffer = internalTexture._buffer;\r\n\r\n let data;\r\n let mimeType = (babylonTexture as Texture).mimeType;\r\n\r\n try {\r\n if (!buffer) {\r\n data = await Tools.LoadFileAsync(internalTexture.url);\r\n mimeType = GetMimeType(internalTexture.url) || mimeType;\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n data = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) as ArrayBuffer;\r\n } else if (buffer instanceof ArrayBuffer) {\r\n data = buffer;\r\n } else if (buffer instanceof Blob) {\r\n data = await buffer.arrayBuffer();\r\n mimeType = buffer.type || mimeType;\r\n } else if (typeof buffer === \"string\") {\r\n data = await Tools.LoadFileAsync(buffer);\r\n mimeType = GetMimeType(buffer) || mimeType;\r\n } else if (typeof HTMLImageElement !== \"undefined\" && buffer instanceof HTMLImageElement) {\r\n data = await Tools.LoadFileAsync(buffer.src);\r\n mimeType = GetMimeType(buffer.src) || mimeType;\r\n }\r\n } catch {\r\n // Failed to load texture data, fall back to GPU texture read via GetTextureDataAsync\r\n return null;\r\n }\r\n\r\n if (data && IsSupportedMimeType(mimeType)) {\r\n return new Blob([data], { type: mimeType });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Computes the metallic factor from specular glossiness values.\r\n * @param diffuse diffused value\r\n * @param specular specular value\r\n * @param oneMinusSpecularStrength one minus the specular strength\r\n * @returns metallic value\r\n * @internal\r\n */\r\nexport function _SolveMetallic(diffuse: number, specular: number, oneMinusSpecularStrength: number): number {\r\n if (specular < DielectricSpecular.r) {\r\n return 0;\r\n }\r\n\r\n const a = DielectricSpecular.r;\r\n const b = (diffuse * oneMinusSpecularStrength) / (1.0 - DielectricSpecular.r) + specular - 2.0 * DielectricSpecular.r;\r\n const c = DielectricSpecular.r - specular;\r\n const d = b * b - 4.0 * a * c;\r\n return Scalar.Clamp((-b + Math.sqrt(d)) / (2.0 * a), 0, 1);\r\n}\r\n\r\n/**\r\n * Computes the metallic/roughness factors from a Standard Material.\r\n * @internal\r\n */\r\nexport function _ConvertToGLTFPBRMetallicRoughness(babylonStandardMaterial: StandardMaterial): IMaterialPbrMetallicRoughness {\r\n const diffuse = babylonStandardMaterial.diffuseColor.toLinearSpace(babylonStandardMaterial.getScene().getEngine().useExactSrgbConversions).scale(0.5);\r\n const opacity = babylonStandardMaterial.alpha;\r\n const specularPower = Scalar.Clamp(babylonStandardMaterial.specularPower, 0, MaxSpecularPower);\r\n\r\n const roughness = SpecularPowerToRoughness(specularPower);\r\n\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {\r\n baseColorFactor: [diffuse.r, diffuse.g, diffuse.b, opacity],\r\n metallicFactor: 0,\r\n roughnessFactor: roughness,\r\n };\r\n\r\n return glTFPbrMetallicRoughness;\r\n}\r\n\r\n/**\r\n * Sets the glTF alpha mode to a glTF material from the Babylon Material\r\n * @param glTFMaterial glTF material\r\n * @param babylonMaterial Babylon material\r\n */\r\nfunction SetAlphaMode(glTFMaterial: IMaterial, babylonMaterial: Material & { alphaCutOff?: number }): void {\r\n if (babylonMaterial.needAlphaBlending()) {\r\n glTFMaterial.alphaMode = MaterialAlphaMode.BLEND;\r\n } else if (babylonMaterial.needAlphaTesting()) {\r\n glTFMaterial.alphaMode = MaterialAlphaMode.MASK;\r\n glTFMaterial.alphaCutoff = babylonMaterial.alphaCutOff;\r\n }\r\n}\r\n\r\nfunction CreateWhiteTexture(width: number, height: number, scene: Scene): Texture {\r\n const data = new Uint8Array(width * height * 4);\r\n\r\n for (let i = 0; i < data.length; i = i + 4) {\r\n data[i] = data[i + 1] = data[i + 2] = data[i + 3] = 0xff;\r\n }\r\n\r\n const rawTexture = RawTexture.CreateRGBATexture(data, width, height, scene);\r\n\r\n return rawTexture;\r\n}\r\n\r\nfunction ConvertPixelArrayToFloat32(pixels: ArrayBufferView): Float32Array {\r\n if (pixels instanceof Uint8Array) {\r\n const length = pixels.length;\r\n const buffer = new Float32Array(pixels.length);\r\n for (let i = 0; i < length; ++i) {\r\n buffer[i] = pixels[i] / 255;\r\n }\r\n return buffer;\r\n } else if (pixels instanceof Float32Array) {\r\n return pixels;\r\n } else {\r\n throw new Error(\"Unsupported pixel format!\");\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods for working with glTF material conversion properties.\r\n * @internal\r\n */\r\nexport class GLTFMaterialExporter {\r\n // Mapping to store textures\r\n private _textureMap = new Map<number, ITextureInfo>();\r\n\r\n // Mapping of internal textures to images to avoid exporting duplicate images\r\n private _internalTextureToImage: { [uniqueId: number]: { [mimeType: string]: Promise<number> } } = {};\r\n\r\n constructor(private readonly _exporter: GLTFExporter) {}\r\n\r\n public getTextureInfo(babylonTexture: Nullable<BaseTexture>): Nullable<ITextureInfo> {\r\n return babylonTexture ? (this._textureMap.get(babylonTexture.uniqueId) ?? null) : null;\r\n }\r\n\r\n public async exportStandardMaterialAsync(babylonStandardMaterial: StandardMaterial, hasUVs: boolean): Promise<number> {\r\n const pbrMetallicRoughness = _ConvertToGLTFPBRMetallicRoughness(babylonStandardMaterial);\r\n\r\n const material: IMaterial = { name: babylonStandardMaterial.name };\r\n if (babylonStandardMaterial.backFaceCulling != null && !babylonStandardMaterial.backFaceCulling) {\r\n if (!babylonStandardMaterial.twoSidedLighting) {\r\n Tools.Warn(babylonStandardMaterial.name + \": Back-face culling disabled and two-sided lighting disabled is not supported in glTF.\");\r\n }\r\n material.doubleSided = true;\r\n }\r\n\r\n if (hasUVs) {\r\n const promises: Promise<void>[] = [];\r\n\r\n const diffuseTexture = babylonStandardMaterial.diffuseTexture;\r\n if (diffuseTexture) {\r\n promises.push(\r\n this.exportTextureAsync(diffuseTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n pbrMetallicRoughness.baseColorTexture = textureInfo;\r\n }\r\n })\r\n );\r\n }\r\n\r\n const bumpTexture = babylonStandardMaterial.bumpTexture;\r\n if (bumpTexture) {\r\n promises.push(\r\n this.exportTextureAsync(bumpTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n material.normalTexture = textureInfo;\r\n if (bumpTexture.level !== 1) {\r\n material.normalTexture.scale = bumpTexture.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const emissiveTexture = babylonStandardMaterial.emissiveTexture;\r\n if (emissiveTexture) {\r\n material.emissiveFactor = [1.0, 1.0, 1.0];\r\n\r\n promises.push(\r\n this.exportTextureAsync(emissiveTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n material.emissiveTexture = textureInfo;\r\n }\r\n })\r\n );\r\n }\r\n\r\n const ambientTexture = babylonStandardMaterial.ambientTexture;\r\n if (ambientTexture) {\r\n promises.push(\r\n this.exportTextureAsync(ambientTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n const occlusionTexture: IMaterialOcclusionTextureInfo = {\r\n index: textureInfo.index,\r\n };\r\n material.occlusionTexture = occlusionTexture;\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonStandardMaterial);\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n if (babylonStandardMaterial.alpha < 1.0 || babylonStandardMaterial.opacityTexture) {\r\n if (babylonStandardMaterial.alphaMode === Constants.ALPHA_COMBINE) {\r\n material.alphaMode = MaterialAlphaMode.BLEND;\r\n } else {\r\n Tools.Warn(babylonStandardMaterial.name + \": glTF 2.0 does not support alpha mode: \" + babylonStandardMaterial.alphaMode.toString());\r\n }\r\n }\r\n\r\n if (babylonStandardMaterial.emissiveColor && !babylonStandardMaterial.emissiveColor.equalsWithEpsilon(Black, Epsilon)) {\r\n material.emissiveFactor = babylonStandardMaterial.emissiveColor.asArray();\r\n }\r\n\r\n material.pbrMetallicRoughness = pbrMetallicRoughness;\r\n SetAlphaMode(material, babylonStandardMaterial);\r\n\r\n await this._finishMaterialAsync(material, babylonStandardMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(material);\r\n return materials.length - 1;\r\n }\r\n\r\n private async _finishMaterialAsync(glTFMaterial: IMaterial, babylonMaterial: Material): Promise<void> {\r\n const textures = await this._exporter._extensionsPostExportMaterialAdditionalTexturesAsync(\"exportMaterial\", glTFMaterial, babylonMaterial);\r\n\r\n const promises: Array<Promise<Nullable<ITextureInfo>>> = [];\r\n\r\n for (const texture of textures) {\r\n promises.push(this.exportTextureAsync(texture));\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n await this._exporter._extensionsPostExportMaterialAsync(\"exportMaterial\", glTFMaterial, babylonMaterial);\r\n }\r\n\r\n /**\r\n * Resizes the two source textures to the same dimensions. If a texture is null, a default white texture is generated. If both textures are null, returns null\r\n * @param texture1 first texture to resize\r\n * @param texture2 second texture to resize\r\n * @param scene babylonjs scene\r\n * @returns resized textures or null\r\n */\r\n private _resizeTexturesToSameDimensions(texture1: Nullable<BaseTexture>, texture2: Nullable<BaseTexture>, scene: Scene): { texture1: BaseTexture; texture2: BaseTexture } {\r\n const texture1Size = texture1 ? texture1.getSize() : { width: 0, height: 0 };\r\n const texture2Size = texture2 ? texture2.getSize() : { width: 0, height: 0 };\r\n let resizedTexture1: BaseTexture;\r\n let resizedTexture2: BaseTexture;\r\n\r\n if (texture1Size.width < texture2Size.width) {\r\n if (texture1 && texture1 instanceof Texture) {\r\n resizedTexture1 = TextureTools.CreateResizedCopy(texture1, texture2Size.width, texture2Size.height, true);\r\n } else {\r\n resizedTexture1 = CreateWhiteTexture(texture2Size.width, texture2Size.height, scene);\r\n }\r\n resizedTexture2 = texture2!;\r\n } else if (texture1Size.width > texture2Size.width) {\r\n if (texture2 && texture2 instanceof Texture) {\r\n resizedTexture2 = TextureTools.CreateResizedCopy(texture2, texture1Size.width, texture1Size.height, true);\r\n } else {\r\n resizedTexture2 = CreateWhiteTexture(texture1Size.width, texture1Size.height, scene);\r\n }\r\n resizedTexture1 = texture1!;\r\n } else {\r\n resizedTexture1 = texture1!;\r\n resizedTexture2 = texture2!;\r\n }\r\n\r\n return {\r\n texture1: resizedTexture1!,\r\n texture2: resizedTexture2!,\r\n };\r\n }\r\n\r\n /**\r\n * Convert Specular Glossiness Textures to Metallic Roughness\r\n * See link below for info on the material conversions from PBR Metallic/Roughness and Specular/Glossiness\r\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/examples/convert-between-workflows-bjs/js/babylon.pbrUtilities.js\r\n * @param diffuseTexture texture used to store diffuse information\r\n * @param specularGlossinessTexture texture used to store specular and glossiness information\r\n * @param factors specular glossiness material factors\r\n * @returns pbr metallic roughness interface or null\r\n */\r\n private async _convertSpecularGlossinessTexturesToMetallicRoughnessAsync(\r\n diffuseTexture: Nullable<BaseTexture>,\r\n specularGlossinessTexture: Nullable<BaseTexture>,\r\n factors: IPBRSpecularGlossiness\r\n ): Promise<IPBRMetallicRoughness> {\r\n const promises = new Array<Promise<void>>();\r\n if (!(diffuseTexture || specularGlossinessTexture)) {\r\n return await Promise.reject(\"diffuse and specular glossiness textures are not defined!\");\r\n }\r\n\r\n const scene: Nullable<Scene> = diffuseTexture ? diffuseTexture.getScene() : specularGlossinessTexture ? specularGlossinessTexture.getScene() : null;\r\n if (scene) {\r\n const resizedTextures = this._resizeTexturesToSameDimensions(diffuseTexture, specularGlossinessTexture, scene);\r\n\r\n const diffuseSize = resizedTextures.texture1?.getSize();\r\n\r\n let diffuseBuffer: Float32Array;\r\n let specularGlossinessBuffer: Float32Array;\r\n\r\n const width = diffuseSize.width;\r\n const height = diffuseSize.height;\r\n\r\n const diffusePixels = await resizedTextures.texture1.readPixels();\r\n const specularPixels = await resizedTextures.texture2.readPixels();\r\n\r\n if (diffusePixels) {\r\n diffuseBuffer = ConvertPixelArrayToFloat32(diffusePixels);\r\n } else {\r\n return await Promise.reject(\"Failed to retrieve pixels from diffuse texture!\");\r\n }\r\n if (specularPixels) {\r\n specularGlossinessBuffer = ConvertPixelArrayToFloat32(specularPixels);\r\n } else {\r\n return await Promise.reject(\"Failed to retrieve pixels from specular glossiness texture!\");\r\n }\r\n\r\n const byteLength = specularGlossinessBuffer.byteLength;\r\n\r\n const metallicRoughnessBuffer = new Uint8Array(byteLength);\r\n const baseColorBuffer = new Uint8Array(byteLength);\r\n\r\n const strideSize = 4;\r\n const maxBaseColor = new Color3(0, 0, 0);\r\n let maxMetallic = 0;\r\n let maxRoughness = 0;\r\n\r\n for (let h = 0; h < height; ++h) {\r\n for (let w = 0; w < width; ++w) {\r\n const offset = (width * h + w) * strideSize;\r\n\r\n const diffuseColor = new Color3(diffuseBuffer[offset], diffuseBuffer[offset + 1], diffuseBuffer[offset + 2])\r\n .toLinearSpace(scene.getEngine().useExactSrgbConversions)\r\n .multiply(factors.diffuseColor);\r\n const specularColor = new Color3(specularGlossinessBuffer[offset], specularGlossinessBuffer[offset + 1], specularGlossinessBuffer[offset + 2])\r\n .toLinearSpace(scene.getEngine().useExactSrgbConversions)\r\n .multiply(factors.specularColor);\r\n const glossiness = specularGlossinessBuffer[offset + 3] * factors.glossiness;\r\n\r\n const specularGlossiness: IPBRSpecularGlossiness = {\r\n diffuseColor: diffuseColor,\r\n specularColor: specularColor,\r\n glossiness: glossiness,\r\n };\r\n\r\n const metallicRoughness = this._convertSpecularGlossinessToMetallicRoughness(specularGlossiness);\r\n maxBaseColor.r = Math.max(maxBaseColor.r, metallicRoughness.baseColor.r);\r\n maxBaseColor.g = Math.max(maxBaseColor.g, metallicRoughness.baseColor.g);\r\n maxBaseColor.b = Math.max(maxBaseColor.b, metallicRoughness.baseColor.b);\r\n maxMetallic = Math.max(maxMetallic, metallicRoughness.metallic!);\r\n maxRoughness = Math.max(maxRoughness, metallicRoughness.roughness!);\r\n\r\n baseColorBuffer[offset] = metallicRoughness.baseColor.r * 255;\r\n baseColorBuffer[offset + 1] = metallicRoughness.baseColor.g * 255;\r\n baseColorBuffer[offset + 2] = metallicRoughness.baseColor.b * 255;\r\n baseColorBuffer[offset + 3] = resizedTextures.texture1.hasAlpha ? diffuseBuffer[offset + 3] * 255 : 255;\r\n\r\n metallicRoughnessBuffer[offset] = 0;\r\n metallicRoughnessBuffer[offset + 1] = metallicRoughness.roughness! * 255;\r\n metallicRoughnessBuffer[offset + 2] = metallicRoughness.metallic! * 255;\r\n metallicRoughnessBuffer[offset + 3] = 255;\r\n }\r\n }\r\n\r\n // Retrieves the metallic roughness factors from the maximum texture values.\r\n const metallicRoughnessFactors: IPBRMetallicRoughness = {\r\n baseColor: maxBaseColor,\r\n metallic: maxMetallic,\r\n roughness: maxRoughness,\r\n };\r\n\r\n let writeOutMetallicRoughnessTexture = false;\r\n let writeOutBaseColorTexture = false;\r\n\r\n for (let h = 0; h < height; ++h) {\r\n for (let w = 0; w < width; ++w) {\r\n const destinationOffset = (width * h + w) * strideSize;\r\n\r\n baseColorBuffer[destinationOffset] /= metallicRoughnessFactors.baseColor.r > Epsilon ? metallicRoughnessFactors.baseColor.r : 1;\r\n baseColorBuffer[destinationOffset + 1] /= metallicRoughnessFactors.baseColor.g > Epsilon ? metallicRoughnessFactors.baseColor.g : 1;\r\n baseColorBuffer[destinationOffset + 2] /= metallicRoughnessFactors.baseColor.b > Epsilon ? metallicRoughnessFactors.baseColor.b : 1;\r\n\r\n const linearBaseColorPixel = Color3.FromInts(\r\n baseColorBuffer[destinationOffset],\r\n baseColorBuffer[destinationOffset + 1],\r\n baseColorBuffer[destinationOffset + 2]\r\n );\r\n const sRGBBaseColorPixel = linearBaseColorPixel.toGammaSpace(scene.getEngine().useExactSrgbConversions);\r\n baseColorBuffer[destinationOffset] = sRGBBaseColorPixel.r * 255;\r\n baseColorBuffer[destinationOffset + 1] = sRGBBaseColorPixel.g * 255;\r\n baseColorBuffer[destinationOffset + 2] = sRGBBaseColorPixel.b * 255;\r\n\r\n if (!sRGBBaseColorPixel.equalsWithEpsilon(White, Epsilon)) {\r\n writeOutBaseColorTexture = true;\r\n }\r\n\r\n metallicRoughnessBuffer[destinationOffset + 1] /= metallicRoughnessFactors.roughness! > Epsilon ? metallicRoughnessFactors.roughness! : 1;\r\n metallicRoughnessBuffer[destinationOffset + 2] /= metallicRoughnessFactors.metallic! > Epsilon ? metallicRoughnessFactors.metallic! : 1;\r\n\r\n const metallicRoughnessPixel = Color3.FromInts(255, metallicRoughnessBuffer[destinationOffset + 1], metallicRoughnessBuffer[destinationOffset + 2]);\r\n\r\n if (!metallicRoughnessPixel.equalsWithEpsilon(White, Epsilon)) {\r\n writeOutMetallicRoughnessTexture = true;\r\n }\r\n }\r\n }\r\n\r\n if (writeOutMetallicRoughnessTexture) {\r\n promises.push(\r\n EncodeImageAsync(metallicRoughnessBuffer, width, height).then((data) => {\r\n metallicRoughnessFactors.metallicRoughnessTextureData = data;\r\n })\r\n );\r\n }\r\n if (writeOutBaseColorTexture) {\r\n promises.push(\r\n EncodeImageAsync(baseColorBuffer, width, height).then((data) => {\r\n metallicRoughnessFactors.baseColorTextureData = data;\r\n })\r\n );\r\n }\r\n\r\n return await Promise.all(promises).then(() => {\r\n return metallicRoughnessFactors;\r\n });\r\n } else {\r\n return await Promise.reject(\"_ConvertSpecularGlossinessTexturesToMetallicRoughness: Scene from textures is missing!\");\r\n }\r\n }\r\n\r\n /**\r\n * Converts specular glossiness material properties to metallic roughness\r\n * @param specularGlossiness interface with specular glossiness material properties\r\n * @returns interface with metallic roughness material properties\r\n */\r\n private _convertSpecularGlossinessToMetallicRoughness(specularGlossiness: IPBRSpecularGlossiness): IPBRMetallicRoughness {\r\n const diffusePerceivedBrightness = this._getPerceivedBrightness(specularGlossiness.diffuseColor);\r\n const specularPerceivedBrightness = this._getPerceivedBrightness(specularGlossiness.specularColor);\r\n const oneMinusSpecularStrength = 1 - this._getMaxComponent(specularGlossiness.specularColor);\r\n const metallic = _SolveMetallic(diffusePerceivedBrightness, specularPerceivedBrightness, oneMinusSpecularStrength);\r\n const baseColorFromDiffuse = specularGlossiness.diffuseColor.scale(oneMinusSpecularStrength / (1.0 - DielectricSpecular.r) / Math.max(1 - metallic, Epsilon));\r\n const baseColorFromSpecular = specularGlossiness.specularColor.subtract(DielectricSpecular.scale(1 - metallic)).scale(1 / Math.max(metallic, Epsilon));\r\n let baseColor = Color3.Lerp(baseColorFromDiffuse, baseColorFromSpecular, metallic * metallic);\r\n baseColor = baseColor.clampToRef(0, 1, baseColor);\r\n\r\n const metallicRoughness: IPBRMetallicRoughness = {\r\n baseColor: baseColor,\r\n metallic: metallic,\r\n roughness: 1 - specularGlossiness.glossiness,\r\n };\r\n\r\n return metallicRoughness;\r\n }\r\n\r\n /**\r\n * Calculates the surface reflectance, independent of lighting conditions\r\n * @param color Color source to calculate brightness from\r\n * @returns number representing the perceived brightness, or zero if color is undefined\r\n */\r\n private _getPerceivedBrightness(color: Color3): number {\r\n return Math.sqrt(0.299 * color.r * color.r + 0.587 * color.g * color.g + 0.114 * color.b * color.b);\r\n }\r\n\r\n /**\r\n * Returns the maximum color component value\r\n * @param color\r\n * @returns maximum color component value, or zero if color is null or undefined\r\n */\r\n private _getMaxComponent(color: Color3): number {\r\n return Math.max(color.r, Math.max(color.g, color.b));\r\n }\r\n\r\n /**\r\n * Convert a PBRMaterial (Metallic/Roughness) to Metallic Roughness factors\r\n * @param baseColor Base color of the material\r\n * @param metallic Metallic factor of the material\r\n * @param roughness Roughness factor of the material\r\n * @param albedoTexture Albedo texture of the material\r\n * @param metallicTexture Metallic texture of the material\r\n * @param roughnessTexture Roughness texture of the material\r\n * @param babylonPBRMaterial BJS PBR Metallic Roughness Material\r\n * @param glTFPbrMetallicRoughness glTF PBR Metallic Roughness interface\r\n * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied\r\n * @returns glTF PBR Metallic Roughness factors\r\n */\r\n private async _convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n baseColor: Color3,\r\n metallic: Nullable<number>,\r\n roughness: Nullable<number>,\r\n albedoTexture: Nullable<BaseTexture>,\r\n metallicTexture: Nullable<BaseTexture>,\r\n roughnessTexture: Nullable<BaseTexture>,\r\n babylonPBRMaterial: PBRBaseMaterial | OpenPBRMaterial,\r\n glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<IPBRMetallicRoughness> {\r\n const promises: Promise<void>[] = [];\r\n\r\n const metallicRoughness: IPBRMetallicRoughness = {\r\n baseColor: baseColor,\r\n metallic: metallic,\r\n roughness: roughness,\r\n };\r\n\r\n if (hasUVs) {\r\n if (babylonPBRMaterial instanceof OpenPBRMaterial) {\r\n if (babylonPBRMaterial.geometryOpacityTexture) {\r\n // Merge baseColor and opacity\r\n const albedoId = albedoTexture && albedoTexture.getInternalTexture() ? albedoTexture.getInternalTexture()!.uniqueId : 0;\r\n const opacityId =\r\n babylonPBRMaterial.geometryOpacityTexture && babylonPBRMaterial.geometryOpacityTexture.getInternalTexture()\r\n ? babylonPBRMaterial.geometryOpacityTexture.getInternalTexture()!.uniqueId\r\n : 0;\r\n const mergedId = Number(`${albedoId}${opacityId}`);\r\n const glTFTexture = this._textureMap.get(mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n } else {\r\n promises.push(\r\n MergeTexturesAsync(\r\n \"baseColorOpacityTexture\",\r\n CreateRGBAConfiguration(\r\n albedoTexture ? CreateTextureInput(albedoTexture, 0) : CreateConstantInput(1.0),\r\n albedoTexture ? CreateTextureInput(albedoTexture, 1) : CreateConstantInput(1.0),\r\n albedoTexture ? CreateTextureInput(albedoTexture, 2) : CreateConstantInput(1.0),\r\n CreateTextureInput(babylonPBRMaterial.geometryOpacityTexture, 0)\r\n ),\r\n babylonPBRMaterial.getScene()\r\n ).then(async (mergedTexture) => {\r\n const glTFTexture = await this.exportTextureAsync(mergedTexture, mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n } else {\r\n if (albedoTexture) {\r\n promises.push(\r\n this.exportTextureAsync(albedoTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n if (babylonPBRMaterial._useMetallicFromMetallicTextureBlue && metallicTexture) {\r\n promises.push(\r\n this.exportTextureAsync(metallicTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n } else if (roughnessTexture || metallicTexture) {\r\n const metallicId = metallicTexture && metallicTexture.getInternalTexture() ? metallicTexture.getInternalTexture()!.uniqueId : 0;\r\n const roughnessId = roughnessTexture && roughnessTexture.getInternalTexture() ? roughnessTexture.getInternalTexture()!.uniqueId : 0;\r\n const mergedId = Number(`${metallicId}${roughnessId}`);\r\n const glTFTexture = this._textureMap.get(mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n } else {\r\n promises.push(\r\n MergeTexturesAsync(\r\n \"MetalRoughTexture\",\r\n CreateRGBAConfiguration(\r\n babylonPBRMaterial.ambientOcclusionTexture ? CreateTextureInput(babylonPBRMaterial.ambientOcclusionTexture, 0) : CreateConstantInput(1.0),\r\n roughnessTexture ? CreateTextureInput(roughnessTexture, 0) : CreateConstantInput(1.0),\r\n metallicTexture ? CreateTextureInput(metallicTexture, 0) : CreateConstantInput(1.0)\r\n ),\r\n babylonPBRMaterial.getScene()\r\n ).then(async (mergedTexture) => {\r\n const glTFTexture = await this.exportTextureAsync(mergedTexture, mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n } else {\r\n if (albedoTexture) {\r\n promises.push(\r\n this.exportTextureAsync(albedoTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n if (metallicTexture) {\r\n promises.push(\r\n this.exportTextureAsync(metallicTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n await Promise.all(promises);\r\n }\r\n\r\n return metallicRoughness;\r\n }\r\n\r\n private _getTextureSampler(texture: Nullable<BaseTexture>): ISampler {\r\n const sampler: ISampler = {};\r\n if (!texture || !(texture instanceof Texture)) {\r\n return sampler;\r\n }\r\n\r\n const wrapS = this._getGLTFTextureWrapMode(texture.wrapU);\r\n if (wrapS !== TextureWrapMode.REPEAT) {\r\n sampler.wrapS = wrapS;\r\n }\r\n\r\n const wrapT = this._getGLTFTextureWrapMode(texture.wrapV);\r\n if (wrapT !== TextureWrapMode.REPEAT) {\r\n sampler.wrapT = wrapT;\r\n }\r\n\r\n switch (texture.samplingMode) {\r\n case Texture.LINEAR_LINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_LINEAR_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_LINEAR_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_NEAREST;\r\n break;\r\n }\r\n }\r\n\r\n return sampler;\r\n }\r\n\r\n private _getGLTFTextureWrapMode(wrapMode: number): TextureWrapMode {\r\n switch (wrapMode) {\r\n case Texture.WRAP_ADDRESSMODE: {\r\n return TextureWrapMode.REPEAT;\r\n }\r\n case Texture.CLAMP_ADDRESSMODE: {\r\n return TextureWrapMode.CLAMP_TO_EDGE;\r\n }\r\n case Texture.MIRROR_ADDRESSMODE: {\r\n return TextureWrapMode.MIRRORED_REPEAT;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Texture Wrap Mode ${wrapMode}!`);\r\n return TextureWrapMode.REPEAT;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert a PBRMaterial (Specular/Glossiness) to Metallic Roughness factors\r\n * @param babylonPBRMaterial BJS PBR Metallic Roughness Material\r\n * @param pbrMetallicRoughness glTF PBR Metallic Roughness interface\r\n * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied\r\n * @returns glTF PBR Metallic Roughness factors\r\n */\r\n private async _convertSpecGlossFactorsToMetallicRoughnessAsync(\r\n babylonPBRMaterial: PBRBaseMaterial,\r\n pbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<IPBRMetallicRoughness> {\r\n const specGloss: IPBRSpecularGlossiness = {\r\n diffuseColor: babylonPBRMaterial._albedoColor,\r\n specularColor: babylonPBRMaterial._reflectivityColor,\r\n glossiness: babylonPBRMaterial._microSurface,\r\n };\r\n\r\n const albedoTexture = babylonPBRMaterial._albedoTexture;\r\n const reflectivityTexture = babylonPBRMaterial._reflectivityTexture;\r\n const useMicrosurfaceFromReflectivityMapAlpha = babylonPBRMaterial._useMicroSurfaceFromReflectivityMapAlpha;\r\n if (reflectivityTexture && !useMicrosurfaceFromReflectivityMapAlpha) {\r\n return await Promise.reject(\"_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported\");\r\n }\r\n\r\n if ((albedoTexture || reflectivityTexture) && hasUVs) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n\r\n const samplerIndex = this._exportTextureSampler(albedoTexture || reflectivityTexture);\r\n const metallicRoughnessFactors = await this._convertSpecularGlossinessTexturesToMetallicRoughnessAsync(albedoTexture, reflectivityTexture, specGloss);\r\n\r\n const textures = this._exporter._textures;\r\n\r\n if (metallicRoughnessFactors.baseColorTextureData) {\r\n const imageIndex = await this._exportImageAsync(`baseColor${textures.length}`, metallicRoughnessFactors.baseColorTextureData);\r\n pbrMetallicRoughness.baseColorTexture = this._exportTextureInfo(imageIndex, samplerIndex, albedoTexture?.coordinatesIndex);\r\n }\r\n\r\n if (metallicRoughnessFactors.metallicRoughnessTextureData) {\r\n const imageIndex = await this._exportImageAsync(`metallicRoughness${textures.length}`, metallicRoughnessFactors.metallicRoughnessTextureData);\r\n pbrMetallicRoughness.metallicRoughnessTexture = this._exportTextureInfo(imageIndex, samplerIndex, reflectivityTexture?.coordinatesIndex);\r\n }\r\n\r\n return metallicRoughnessFactors;\r\n } else {\r\n return this._convertSpecularGlossinessToMetallicRoughness(specGloss);\r\n }\r\n }\r\n\r\n public async exportPBRMaterialAsync(babylonPBRMaterial: PBRBaseMaterial, hasUVs: boolean): Promise<number> {\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {};\r\n\r\n const glTFMaterial: IMaterial = {\r\n name: babylonPBRMaterial.name,\r\n };\r\n\r\n const useMetallicRoughness = babylonPBRMaterial.isMetallicWorkflow();\r\n\r\n if (useMetallicRoughness) {\r\n const albedoColor = babylonPBRMaterial._albedoColor;\r\n const alpha = babylonPBRMaterial.alpha;\r\n if (albedoColor) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [albedoColor.r, albedoColor.g, albedoColor.b, alpha];\r\n }\r\n }\r\n\r\n const metallicRoughness = useMetallicRoughness\r\n ? await this._convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n babylonPBRMaterial._albedoColor,\r\n babylonPBRMaterial._metallic,\r\n babylonPBRMaterial._roughness,\r\n babylonPBRMaterial._albedoTexture,\r\n babylonPBRMaterial._metallicTexture,\r\n babylonPBRMaterial._metallicTexture,\r\n babylonPBRMaterial,\r\n glTFPbrMetallicRoughness,\r\n hasUVs\r\n )\r\n : await this._convertSpecGlossFactorsToMetallicRoughnessAsync(babylonPBRMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n\r\n await this._setMetallicRoughnessPbrMaterialAsync(metallicRoughness, babylonPBRMaterial, glTFMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n await this._finishMaterialAsync(glTFMaterial, babylonPBRMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(glTFMaterial);\r\n return materials.length - 1;\r\n }\r\n\r\n private async _setMetallicRoughnessPbrMaterialAsync(\r\n metallicRoughness: IPBRMetallicRoughness,\r\n babylonPBRMaterial: PBRBaseMaterial | OpenPBRMaterial,\r\n glTFMaterial: IMaterial,\r\n glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<void> {\r\n SetAlphaMode(glTFMaterial, babylonPBRMaterial);\r\n\r\n if (!metallicRoughness.baseColor.equalsWithEpsilon(White, Epsilon) || !Scalar.WithinEpsilon(babylonPBRMaterial.alpha, 1, Epsilon)) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [metallicRoughness.baseColor.r, metallicRoughness.baseColor.g, metallicRoughness.baseColor.b, babylonPBRMaterial.alpha];\r\n }\r\n\r\n if (metallicRoughness.metallic != null && metallicRoughness.metallic !== 1) {\r\n glTFPbrMetallicRoughness.metallicFactor = metallicRoughness.metallic;\r\n }\r\n if (metallicRoughness.roughness != null && metallicRoughness.roughness !== 1) {\r\n glTFPbrMetallicRoughness.roughnessFactor = metallicRoughness.roughness;\r\n }\r\n\r\n if (babylonPBRMaterial.backFaceCulling != null && !babylonPBRMaterial.backFaceCulling) {\r\n if (!babylonPBRMaterial._twoSidedLighting) {\r\n Tools.Warn(babylonPBRMaterial.name + \": Back-face culling disabled and two-sided lighting disabled is not supported in glTF.\");\r\n }\r\n glTFMaterial.doubleSided = true;\r\n }\r\n\r\n if (hasUVs) {\r\n const promises: Promise<void>[] = [];\r\n\r\n const bumpTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._bumpTexture : babylonPBRMaterial.geometryNormalTexture;\r\n if (bumpTexture) {\r\n promises.push(\r\n this.exportTextureAsync(bumpTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFMaterial.normalTexture = glTFTexture;\r\n if (bumpTexture.level !== 1) {\r\n glTFMaterial.normalTexture.scale = bumpTexture.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const ambientTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._ambientTexture : babylonPBRMaterial.ambientOcclusionTexture;\r\n if (ambientTexture) {\r\n promises.push(\r\n new Promise<Nullable<ITextureInfo>>(async (resolve) => {\r\n if (babylonPBRMaterial instanceof OpenPBRMaterial && glTFPbrMetallicRoughness.metallicRoughnessTexture) {\r\n // The metallicRoughnessTexture already contains the ambient occlusion data in its red channel, we don't need to export it again\r\n // However, we still need to set the texture info on the material.\r\n const samplerIndex = this._exportTextureSampler(ambientTexture);\r\n const imageIndex = this._exporter._textures[glTFPbrMetallicRoughness.metallicRoughnessTexture.index].source!;\r\n const textureInfo = this._exportTextureInfo(imageIndex, samplerIndex, ambientTexture.coordinatesIndex);\r\n this._textureMap.set(ambientTexture.uniqueId, textureInfo);\r\n this._exporter._extensionsPostExportTextures(\"exporter\", textureInfo, ambientTexture);\r\n return resolve(textureInfo);\r\n } else {\r\n return resolve(await this.exportTextureAsync(ambientTexture));\r\n }\r\n }).then(async (glTFTexture) => {\r\n if (glTFTexture) {\r\n const occlusionTexture: IMaterialOcclusionTextureInfo = {\r\n index: glTFTexture.index,\r\n texCoord: glTFTexture.texCoord,\r\n extensions: glTFTexture.extensions,\r\n };\r\n\r\n glTFMaterial.occlusionTexture = occlusionTexture;\r\n if (babylonPBRMaterial instanceof PBRBaseMaterial) {\r\n occlusionTexture.strength = babylonPBRMaterial._ambientTextureStrength;\r\n } else {\r\n occlusionTexture.strength = babylonPBRMaterial.ambientOcclusionTexture!.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const emissiveTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._emissiveTexture : babylonPBRMaterial.emissionColorTexture;\r\n if (emissiveTexture) {\r\n promises.push(\r\n this.exportTextureAsync(emissiveTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFMaterial.emissiveTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n const emissiveColor = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._emissiveColor : babylonPBRMaterial.emissionColor;\r\n if (!emissiveColor.equalsWithEpsilon(Black, Epsilon)) {\r\n glTFMaterial.emissiveFactor = emissiveColor.asArray();\r\n }\r\n\r\n glTFMaterial.pbrMetallicRoughness = glTFPbrMetallicRoughness;\r\n }\r\n\r\n public async exportOpenPBRMaterialAsync(babylonOpenPBRMaterial: OpenPBRMaterial, hasUVs: boolean): Promise<number> {\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {};\r\n\r\n const glTFMaterial: IMaterial = {\r\n name: babylonOpenPBRMaterial.name,\r\n };\r\n\r\n const albedoColor = babylonOpenPBRMaterial.baseColor;\r\n const alpha = babylonOpenPBRMaterial.geometryOpacity;\r\n if (albedoColor) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [albedoColor.r, albedoColor.g, albedoColor.b, alpha];\r\n }\r\n\r\n const metallicRoughness = await this._convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n babylonOpenPBRMaterial.baseColor,\r\n babylonOpenPBRMaterial.baseMetalness,\r\n babylonOpenPBRMaterial.specularRoughness,\r\n babylonOpenPBRMaterial.baseColorTexture,\r\n babylonOpenPBRMaterial.baseMetalnessTexture,\r\n babylonOpenPBRMaterial.specularRoughnessTexture,\r\n babylonOpenPBRMaterial,\r\n glTFPbrMetallicRoughness,\r\n hasUVs\r\n );\r\n\r\n await this._setMetallicRoughnessPbrMaterialAsync(metallicRoughness, babylonOpenPBRMaterial, glTFMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n await this._finishMaterialAsync(glTFMaterial, babylonOpenPBRMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(glTFMaterial);\r\n return materials.length - 1;\r\n }\r\n\r\n public async exportTextureAsync(babylonTexture: BaseTexture, overrideId: Nullable<number> = null): Promise<Nullable<ITextureInfo>> {\r\n let textureInfo = this._textureMap.get(overrideId ?? babylonTexture.uniqueId);\r\n if (textureInfo) {\r\n return textureInfo;\r\n }\r\n\r\n const samplerIndex = this._exportTextureSampler(babylonTexture);\r\n const imageIndex = await this._exportTextureImageAsync(babylonTexture);\r\n\r\n textureInfo = this._exportTextureInfo(imageIndex, samplerIndex, babylonTexture.coordinatesIndex);\r\n this._textureMap.set(overrideId ?? babylonTexture.uniqueId, textureInfo);\r\n\r\n this._exporter._extensionsPostExportTextures(\"exporter\", textureInfo, babylonTexture);\r\n return textureInfo;\r\n }\r\n\r\n private async _exportTextureImageAsync(babylonTexture: BaseTexture): Promise<number> {\r\n const requestedMimeType = (babylonTexture as Texture).mimeType ?? \"none\";\r\n // TODO: Add an official way for users to export using a different mime type\r\n // than the one they loaded with (which is denoted by Texture.mimeType)\r\n\r\n const internalTextureToImage = this._internalTextureToImage;\r\n const internalTextureUniqueId = babylonTexture.getInternalTexture()!.uniqueId;\r\n internalTextureToImage[internalTextureUniqueId] = internalTextureToImage[internalTextureUniqueId] || {};\r\n let imageIndexPromise = internalTextureToImage[internalTextureUniqueId][requestedMimeType];\r\n\r\n if (imageIndexPromise === undefined) {\r\n imageIndexPromise = (async () => {\r\n // Try to get the image from memory first, if applicable\r\n const cache = await GetCachedImageAsync(babylonTexture);\r\n if (cache && (requestedMimeType === \"none\" || cache.type === requestedMimeType)) {\r\n return await this._exportImageAsync(babylonTexture.name, cache);\r\n }\r\n\r\n // Preserve texture mime type if defined\r\n let mimeType = ImageMimeType.PNG;\r\n if (requestedMimeType !== \"none\") {\r\n if (IsSupportedMimeType(requestedMimeType)) {\r\n mimeType = requestedMimeType;\r\n } else {\r\n mimeType = ImageMimeType.PNG;\r\n Tools.Warn(`Unsupported media type: ${requestedMimeType}. Exporting texture as PNG.`);\r\n }\r\n }\r\n\r\n const size = babylonTexture.getSize();\r\n const pixels = await GetTextureDataAsync(babylonTexture);\r\n const imageData = await EncodeImageAsync(pixels, size.width, size.height, mimeType);\r\n\r\n return await this._exportImageAsync(babylonTexture.name, imageData);\r\n })();\r\n\r\n internalTextureToImage[internalTextureUniqueId][requestedMimeType] = imageIndexPromise;\r\n }\r\n\r\n return await imageIndexPromise;\r\n }\r\n\r\n private async _exportImageAsync(name: string, imageData: Blob): Promise<number> {\r\n const images = this._exporter._images;\r\n\r\n let image: IImage;\r\n if (this._exporter._shouldUseGlb) {\r\n image = {\r\n name: name,\r\n mimeType: imageData.type as ImageMimeType,\r\n bufferView: undefined, // Will be updated later by BufferManager\r\n };\r\n const data = await imageData.arrayBuffer();\r\n const bufferView = this._exporter._bufferManager.createBufferView(new Uint8Array(data));\r\n this._exporter._bufferManager.setBufferView(image, bufferView);\r\n } else {\r\n // Build a unique URI\r\n const baseName = name.replace(/\\.\\/|\\/|\\.\\\\|\\\\/g, \"_\");\r\n const extension = GetFileExtensionFromMimeType(imageData.type as ImageMimeType);\r\n let fileName = baseName + extension;\r\n if (images.some((image) => image.uri === fileName)) {\r\n fileName = `${baseName}_${Tools.RandomId()}${extension}`;\r\n }\r\n\r\n image = {\r\n name: name,\r\n uri: fileName,\r\n };\r\n this._exporter._imageData[fileName] = imageData; // Save image data to be written to file later\r\n }\r\n\r\n images.push(image);\r\n\r\n return images.length - 1;\r\n }\r\n\r\n private _exportTextureInfo(imageIndex: number, samplerIndex: number, coordinatesIndex?: number): ITextureInfo {\r\n const textures = this._exporter._textures;\r\n let textureIndex = textures.findIndex((t) => t.sampler == samplerIndex && t.source === imageIndex);\r\n if (textureIndex === -1) {\r\n textureIndex = textures.length;\r\n textures.push({\r\n source: imageIndex,\r\n sampler: samplerIndex,\r\n });\r\n }\r\n\r\n const textureInfo: ITextureInfo = { index: textureIndex };\r\n if (coordinatesIndex) {\r\n textureInfo.texCoord = coordinatesIndex;\r\n }\r\n return textureInfo;\r\n }\r\n\r\n private _exportTextureSampler(texture: Nullable<BaseTexture>): number {\r\n const sampler = this._getTextureSampler(texture);\r\n\r\n // if a pre-existing sampler with identical parameters exists, then reuse the previous sampler\r\n const samplers = this._exporter._samplers;\r\n const samplerIndex = samplers.findIndex(\r\n (s) => s.minFilter === sampler.minFilter && s.magFilter === sampler.magFilter && s.wrapS === sampler.wrapS && s.wrapT === sampler.wrapT\r\n );\r\n if (samplerIndex !== -1) {\r\n return samplerIndex;\r\n }\r\n\r\n samplers.push(sampler);\r\n return samplers.length - 1;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"glTFMaterialExporter.js","sourceRoot":"","sources":["../../../../../dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */\r\n/* eslint-disable github/no-then */\r\n/* eslint-disable babylonjs/available */\r\n\r\nimport {\r\n type ITextureInfo,\r\n type IMaterial,\r\n type IMaterialPbrMetallicRoughness,\r\n type IMaterialOcclusionTextureInfo,\r\n type ISampler,\r\n type IImage,\r\n ImageMimeType,\r\n MaterialAlphaMode,\r\n TextureMagFilter,\r\n TextureMinFilter,\r\n TextureWrapMode,\r\n} from \"babylonjs-gltf2interface\";\r\n\r\nimport { type DeepImmutable, type Nullable } from \"core/types\";\r\nimport { Color3 } from \"core/Maths/math.color\";\r\nimport { Scalar } from \"core/Maths/math.scalar\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { GetTextureDataAsync, TextureTools } from \"core/Misc/textureTools\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { Texture } from \"core/Materials/Textures/texture\";\r\nimport { RawTexture } from \"core/Materials/Textures/rawTexture\";\r\n\r\nimport { type Scene } from \"core/scene\";\r\n\r\nimport { type GLTFExporter } from \"./glTFExporter\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { NullEngine } from \"core/Engines/nullEngine\";\r\nimport { EncodeImageAsync } from \"core/Misc/dumpTools\";\r\n\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type StandardMaterial } from \"core/Materials/standardMaterial\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { SpecularPowerToRoughness } from \"core/Helpers/materialConversionHelper\";\r\nimport { InternalTextureSource } from \"core/Materials/Textures/internalTexture\";\r\nimport { GetMimeType } from \"core/Misc/fileTools\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\n\r\nconst Epsilon = 1e-6;\r\nconst DielectricSpecular = new Color3(0.04, 0.04, 0.04) as DeepImmutable<Color3>;\r\nconst MaxSpecularPower = 1024;\r\nconst White = Color3.White() as DeepImmutable<Color3>;\r\nconst Black = Color3.BlackReadOnly;\r\n\r\n/**\r\n * Interface for storing specular glossiness factors\r\n * @internal\r\n */\r\ninterface IPBRSpecularGlossiness {\r\n /**\r\n * Represents the linear diffuse factors of the material\r\n */\r\n diffuseColor: Color3;\r\n specularColor: Color3;\r\n glossiness: number;\r\n}\r\n\r\ninterface IPBRMetallicRoughness {\r\n baseColor: Color3;\r\n metallic: Nullable<number>;\r\n roughness: Nullable<number>;\r\n metallicRoughnessTextureData?: Nullable<Blob>;\r\n baseColorTextureData?: Nullable<Blob>;\r\n}\r\n\r\nfunction GetFileExtensionFromMimeType(mimeType: ImageMimeType): string {\r\n switch (mimeType) {\r\n case ImageMimeType.JPEG:\r\n return \".jpg\";\r\n case ImageMimeType.PNG:\r\n return \".png\";\r\n case ImageMimeType.WEBP:\r\n return \".webp\";\r\n case ImageMimeType.AVIF:\r\n return \".avif\";\r\n case ImageMimeType.KTX2:\r\n return \".ktx2\";\r\n }\r\n}\r\n\r\n/**\r\n * @param mimeType the MIME type requested by the user\r\n * @returns true if the given mime type is compatible with glTF\r\n */\r\nfunction IsSupportedMimeType(mimeType?: string): mimeType is ImageMimeType {\r\n switch (mimeType) {\r\n case ImageMimeType.JPEG:\r\n case ImageMimeType.PNG:\r\n case ImageMimeType.WEBP:\r\n case ImageMimeType.AVIF:\r\n case ImageMimeType.KTX2:\r\n return true;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Gets cached image from a texture, if available.\r\n * @param babylonTexture texture to check for cached image\r\n * @returns image data if found and directly usable; null otherwise\r\n */\r\nasync function GetCachedImageAsync(babylonTexture: BaseTexture): Promise<Nullable<Blob>> {\r\n const internalTexture = babylonTexture.getInternalTexture();\r\n if (!internalTexture || internalTexture.source !== InternalTextureSource.Url) {\r\n return null;\r\n }\r\n if (internalTexture.invertY) {\r\n // On a real engine, the GPU has the texture stored flipped (UNPACK_FLIP_Y_WEBGL),\r\n // while the glTF loader uploads with invertY=false. Falling back to GPU readback\r\n // produces bytes that round-trip correctly. NullEngine has no GPU readback path,\r\n // so the cached URL bytes are the only option.\r\n const engine = babylonTexture.getScene()?.getEngine();\r\n if (!(engine instanceof NullEngine)) {\r\n return null;\r\n }\r\n }\r\n\r\n const buffer = internalTexture._buffer;\r\n\r\n let data;\r\n let mimeType = (babylonTexture as Texture).mimeType;\r\n\r\n try {\r\n if (!buffer) {\r\n data = await Tools.LoadFileAsync(internalTexture.url);\r\n mimeType = GetMimeType(internalTexture.url) || mimeType;\r\n } else if (ArrayBuffer.isView(buffer)) {\r\n data = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength) as ArrayBuffer;\r\n } else if (buffer instanceof ArrayBuffer) {\r\n data = buffer;\r\n } else if (buffer instanceof Blob) {\r\n data = await buffer.arrayBuffer();\r\n mimeType = buffer.type || mimeType;\r\n } else if (typeof buffer === \"string\") {\r\n data = await Tools.LoadFileAsync(buffer);\r\n mimeType = GetMimeType(buffer) || mimeType;\r\n } else if (typeof HTMLImageElement !== \"undefined\" && buffer instanceof HTMLImageElement) {\r\n data = await Tools.LoadFileAsync(buffer.src);\r\n mimeType = GetMimeType(buffer.src) || mimeType;\r\n }\r\n } catch {\r\n // Failed to load texture data, fall back to GPU texture read via GetTextureDataAsync\r\n return null;\r\n }\r\n\r\n if (data && !mimeType && internalTexture.url) {\r\n const dataUriMatch = internalTexture.url.match(/^data:([^;,]+)/);\r\n mimeType = dataUriMatch ? dataUriMatch[1] : GetMimeType(internalTexture.url);\r\n }\r\n\r\n if (data && IsSupportedMimeType(mimeType)) {\r\n return new Blob([data], { type: mimeType });\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Computes the metallic factor from specular glossiness values.\r\n * @param diffuse diffused value\r\n * @param specular specular value\r\n * @param oneMinusSpecularStrength one minus the specular strength\r\n * @returns metallic value\r\n * @internal\r\n */\r\nexport function _SolveMetallic(diffuse: number, specular: number, oneMinusSpecularStrength: number): number {\r\n if (specular < DielectricSpecular.r) {\r\n return 0;\r\n }\r\n\r\n const a = DielectricSpecular.r;\r\n const b = (diffuse * oneMinusSpecularStrength) / (1.0 - DielectricSpecular.r) + specular - 2.0 * DielectricSpecular.r;\r\n const c = DielectricSpecular.r - specular;\r\n const d = b * b - 4.0 * a * c;\r\n return Scalar.Clamp((-b + Math.sqrt(d)) / (2.0 * a), 0, 1);\r\n}\r\n\r\n/**\r\n * Computes the metallic/roughness factors from a Standard Material.\r\n * @internal\r\n */\r\nexport function _ConvertToGLTFPBRMetallicRoughness(babylonStandardMaterial: StandardMaterial): IMaterialPbrMetallicRoughness {\r\n const diffuse = babylonStandardMaterial.diffuseColor.toLinearSpace(babylonStandardMaterial.getScene().getEngine().useExactSrgbConversions).scale(0.5);\r\n const opacity = babylonStandardMaterial.alpha;\r\n const specularPower = Scalar.Clamp(babylonStandardMaterial.specularPower, 0, MaxSpecularPower);\r\n\r\n const roughness = SpecularPowerToRoughness(specularPower);\r\n\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {\r\n baseColorFactor: [diffuse.r, diffuse.g, diffuse.b, opacity],\r\n metallicFactor: 0,\r\n roughnessFactor: roughness,\r\n };\r\n\r\n return glTFPbrMetallicRoughness;\r\n}\r\n\r\n/**\r\n * Sets the glTF alpha mode to a glTF material from the Babylon Material\r\n * @param glTFMaterial glTF material\r\n * @param babylonMaterial Babylon material\r\n */\r\nfunction SetAlphaMode(glTFMaterial: IMaterial, babylonMaterial: Material & { alphaCutOff?: number }): void {\r\n if (babylonMaterial.needAlphaBlending()) {\r\n glTFMaterial.alphaMode = MaterialAlphaMode.BLEND;\r\n } else if (babylonMaterial.needAlphaTesting()) {\r\n glTFMaterial.alphaMode = MaterialAlphaMode.MASK;\r\n glTFMaterial.alphaCutoff = babylonMaterial.alphaCutOff;\r\n }\r\n}\r\n\r\nfunction CreateWhiteTexture(width: number, height: number, scene: Scene): Texture {\r\n const data = new Uint8Array(width * height * 4);\r\n\r\n for (let i = 0; i < data.length; i = i + 4) {\r\n data[i] = data[i + 1] = data[i + 2] = data[i + 3] = 0xff;\r\n }\r\n\r\n const rawTexture = RawTexture.CreateRGBATexture(data, width, height, scene);\r\n\r\n return rawTexture;\r\n}\r\n\r\nfunction ConvertPixelArrayToFloat32(pixels: ArrayBufferView): Float32Array {\r\n if (pixels instanceof Uint8Array) {\r\n const length = pixels.length;\r\n const buffer = new Float32Array(pixels.length);\r\n for (let i = 0; i < length; ++i) {\r\n buffer[i] = pixels[i] / 255;\r\n }\r\n return buffer;\r\n } else if (pixels instanceof Float32Array) {\r\n return pixels;\r\n } else {\r\n throw new Error(\"Unsupported pixel format!\");\r\n }\r\n}\r\n\r\n/**\r\n * Utility methods for working with glTF material conversion properties.\r\n * @internal\r\n */\r\nexport class GLTFMaterialExporter {\r\n // Mapping to store textures\r\n private _textureMap = new Map<number, ITextureInfo>();\r\n\r\n // Mapping of internal textures to images to avoid exporting duplicate images\r\n private _internalTextureToImage: { [uniqueId: number]: { [mimeType: string]: Promise<number> } } = {};\r\n\r\n constructor(private readonly _exporter: GLTFExporter) {}\r\n\r\n public getTextureInfo(babylonTexture: Nullable<BaseTexture>): Nullable<ITextureInfo> {\r\n return babylonTexture ? (this._textureMap.get(babylonTexture.uniqueId) ?? null) : null;\r\n }\r\n\r\n public async exportStandardMaterialAsync(babylonStandardMaterial: StandardMaterial, hasUVs: boolean): Promise<number> {\r\n const pbrMetallicRoughness = _ConvertToGLTFPBRMetallicRoughness(babylonStandardMaterial);\r\n\r\n const material: IMaterial = { name: babylonStandardMaterial.name };\r\n if (babylonStandardMaterial.backFaceCulling != null && !babylonStandardMaterial.backFaceCulling) {\r\n if (!babylonStandardMaterial.twoSidedLighting) {\r\n Tools.Warn(babylonStandardMaterial.name + \": Back-face culling disabled and two-sided lighting disabled is not supported in glTF.\");\r\n }\r\n material.doubleSided = true;\r\n }\r\n\r\n if (hasUVs) {\r\n const promises: Promise<void>[] = [];\r\n\r\n const diffuseTexture = babylonStandardMaterial.diffuseTexture;\r\n if (diffuseTexture) {\r\n promises.push(\r\n this.exportTextureAsync(diffuseTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n pbrMetallicRoughness.baseColorTexture = textureInfo;\r\n }\r\n })\r\n );\r\n }\r\n\r\n const bumpTexture = babylonStandardMaterial.bumpTexture;\r\n if (bumpTexture) {\r\n promises.push(\r\n this.exportTextureAsync(bumpTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n material.normalTexture = textureInfo;\r\n if (bumpTexture.level !== 1) {\r\n material.normalTexture.scale = bumpTexture.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const emissiveTexture = babylonStandardMaterial.emissiveTexture;\r\n if (emissiveTexture) {\r\n material.emissiveFactor = [1.0, 1.0, 1.0];\r\n\r\n promises.push(\r\n this.exportTextureAsync(emissiveTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n material.emissiveTexture = textureInfo;\r\n }\r\n })\r\n );\r\n }\r\n\r\n const ambientTexture = babylonStandardMaterial.ambientTexture;\r\n if (ambientTexture) {\r\n promises.push(\r\n this.exportTextureAsync(ambientTexture).then((textureInfo) => {\r\n if (textureInfo) {\r\n const occlusionTexture: IMaterialOcclusionTextureInfo = {\r\n index: textureInfo.index,\r\n };\r\n material.occlusionTexture = occlusionTexture;\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonStandardMaterial);\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n if (babylonStandardMaterial.alpha < 1.0 || babylonStandardMaterial.opacityTexture) {\r\n if (babylonStandardMaterial.alphaMode === Constants.ALPHA_COMBINE) {\r\n material.alphaMode = MaterialAlphaMode.BLEND;\r\n } else {\r\n Tools.Warn(babylonStandardMaterial.name + \": glTF 2.0 does not support alpha mode: \" + babylonStandardMaterial.alphaMode.toString());\r\n }\r\n }\r\n\r\n if (babylonStandardMaterial.emissiveColor && !babylonStandardMaterial.emissiveColor.equalsWithEpsilon(Black, Epsilon)) {\r\n material.emissiveFactor = babylonStandardMaterial.emissiveColor.asArray();\r\n }\r\n\r\n material.pbrMetallicRoughness = pbrMetallicRoughness;\r\n SetAlphaMode(material, babylonStandardMaterial);\r\n\r\n await this._finishMaterialAsync(material, babylonStandardMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(material);\r\n return materials.length - 1;\r\n }\r\n\r\n private async _finishMaterialAsync(glTFMaterial: IMaterial, babylonMaterial: Material): Promise<void> {\r\n const textures = await this._exporter._extensionsPostExportMaterialAdditionalTexturesAsync(\"exportMaterial\", glTFMaterial, babylonMaterial);\r\n\r\n const promises: Array<Promise<Nullable<ITextureInfo>>> = [];\r\n\r\n for (const texture of textures) {\r\n promises.push(this.exportTextureAsync(texture));\r\n }\r\n\r\n await Promise.all(promises);\r\n\r\n await this._exporter._extensionsPostExportMaterialAsync(\"exportMaterial\", glTFMaterial, babylonMaterial);\r\n }\r\n\r\n /**\r\n * Resizes the two source textures to the same dimensions. If a texture is null, a default white texture is generated. If both textures are null, returns null\r\n * @param texture1 first texture to resize\r\n * @param texture2 second texture to resize\r\n * @param scene babylonjs scene\r\n * @returns resized textures or null\r\n */\r\n private _resizeTexturesToSameDimensions(texture1: Nullable<BaseTexture>, texture2: Nullable<BaseTexture>, scene: Scene): { texture1: BaseTexture; texture2: BaseTexture } {\r\n const texture1Size = texture1 ? texture1.getSize() : { width: 0, height: 0 };\r\n const texture2Size = texture2 ? texture2.getSize() : { width: 0, height: 0 };\r\n let resizedTexture1: BaseTexture;\r\n let resizedTexture2: BaseTexture;\r\n\r\n if (texture1Size.width < texture2Size.width) {\r\n if (texture1 && texture1 instanceof Texture) {\r\n resizedTexture1 = TextureTools.CreateResizedCopy(texture1, texture2Size.width, texture2Size.height, true);\r\n } else {\r\n resizedTexture1 = CreateWhiteTexture(texture2Size.width, texture2Size.height, scene);\r\n }\r\n resizedTexture2 = texture2!;\r\n } else if (texture1Size.width > texture2Size.width) {\r\n if (texture2 && texture2 instanceof Texture) {\r\n resizedTexture2 = TextureTools.CreateResizedCopy(texture2, texture1Size.width, texture1Size.height, true);\r\n } else {\r\n resizedTexture2 = CreateWhiteTexture(texture1Size.width, texture1Size.height, scene);\r\n }\r\n resizedTexture1 = texture1!;\r\n } else {\r\n resizedTexture1 = texture1!;\r\n resizedTexture2 = texture2!;\r\n }\r\n\r\n return {\r\n texture1: resizedTexture1!,\r\n texture2: resizedTexture2!,\r\n };\r\n }\r\n\r\n /**\r\n * Convert Specular Glossiness Textures to Metallic Roughness\r\n * See link below for info on the material conversions from PBR Metallic/Roughness and Specular/Glossiness\r\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/examples/convert-between-workflows-bjs/js/babylon.pbrUtilities.js\r\n * @param diffuseTexture texture used to store diffuse information\r\n * @param specularGlossinessTexture texture used to store specular and glossiness information\r\n * @param factors specular glossiness material factors\r\n * @returns pbr metallic roughness interface or null\r\n */\r\n private async _convertSpecularGlossinessTexturesToMetallicRoughnessAsync(\r\n diffuseTexture: Nullable<BaseTexture>,\r\n specularGlossinessTexture: Nullable<BaseTexture>,\r\n factors: IPBRSpecularGlossiness\r\n ): Promise<IPBRMetallicRoughness> {\r\n const promises = new Array<Promise<void>>();\r\n if (!(diffuseTexture || specularGlossinessTexture)) {\r\n return await Promise.reject(\"diffuse and specular glossiness textures are not defined!\");\r\n }\r\n\r\n const scene: Nullable<Scene> = diffuseTexture ? diffuseTexture.getScene() : specularGlossinessTexture ? specularGlossinessTexture.getScene() : null;\r\n if (scene) {\r\n const resizedTextures = this._resizeTexturesToSameDimensions(diffuseTexture, specularGlossinessTexture, scene);\r\n\r\n const diffuseSize = resizedTextures.texture1?.getSize();\r\n\r\n let diffuseBuffer: Float32Array;\r\n let specularGlossinessBuffer: Float32Array;\r\n\r\n const width = diffuseSize.width;\r\n const height = diffuseSize.height;\r\n\r\n const diffusePixels = await resizedTextures.texture1.readPixels();\r\n const specularPixels = await resizedTextures.texture2.readPixels();\r\n\r\n if (diffusePixels) {\r\n diffuseBuffer = ConvertPixelArrayToFloat32(diffusePixels);\r\n } else {\r\n return await Promise.reject(\"Failed to retrieve pixels from diffuse texture!\");\r\n }\r\n if (specularPixels) {\r\n specularGlossinessBuffer = ConvertPixelArrayToFloat32(specularPixels);\r\n } else {\r\n return await Promise.reject(\"Failed to retrieve pixels from specular glossiness texture!\");\r\n }\r\n\r\n const byteLength = specularGlossinessBuffer.byteLength;\r\n\r\n const metallicRoughnessBuffer = new Uint8Array(byteLength);\r\n const baseColorBuffer = new Uint8Array(byteLength);\r\n\r\n const strideSize = 4;\r\n const maxBaseColor = new Color3(0, 0, 0);\r\n let maxMetallic = 0;\r\n let maxRoughness = 0;\r\n\r\n for (let h = 0; h < height; ++h) {\r\n for (let w = 0; w < width; ++w) {\r\n const offset = (width * h + w) * strideSize;\r\n\r\n const diffuseColor = new Color3(diffuseBuffer[offset], diffuseBuffer[offset + 1], diffuseBuffer[offset + 2])\r\n .toLinearSpace(scene.getEngine().useExactSrgbConversions)\r\n .multiply(factors.diffuseColor);\r\n const specularColor = new Color3(specularGlossinessBuffer[offset], specularGlossinessBuffer[offset + 1], specularGlossinessBuffer[offset + 2])\r\n .toLinearSpace(scene.getEngine().useExactSrgbConversions)\r\n .multiply(factors.specularColor);\r\n const glossiness = specularGlossinessBuffer[offset + 3] * factors.glossiness;\r\n\r\n const specularGlossiness: IPBRSpecularGlossiness = {\r\n diffuseColor: diffuseColor,\r\n specularColor: specularColor,\r\n glossiness: glossiness,\r\n };\r\n\r\n const metallicRoughness = this._convertSpecularGlossinessToMetallicRoughness(specularGlossiness);\r\n maxBaseColor.r = Math.max(maxBaseColor.r, metallicRoughness.baseColor.r);\r\n maxBaseColor.g = Math.max(maxBaseColor.g, metallicRoughness.baseColor.g);\r\n maxBaseColor.b = Math.max(maxBaseColor.b, metallicRoughness.baseColor.b);\r\n maxMetallic = Math.max(maxMetallic, metallicRoughness.metallic!);\r\n maxRoughness = Math.max(maxRoughness, metallicRoughness.roughness!);\r\n\r\n baseColorBuffer[offset] = metallicRoughness.baseColor.r * 255;\r\n baseColorBuffer[offset + 1] = metallicRoughness.baseColor.g * 255;\r\n baseColorBuffer[offset + 2] = metallicRoughness.baseColor.b * 255;\r\n baseColorBuffer[offset + 3] = resizedTextures.texture1.hasAlpha ? diffuseBuffer[offset + 3] * 255 : 255;\r\n\r\n metallicRoughnessBuffer[offset] = 0;\r\n metallicRoughnessBuffer[offset + 1] = metallicRoughness.roughness! * 255;\r\n metallicRoughnessBuffer[offset + 2] = metallicRoughness.metallic! * 255;\r\n metallicRoughnessBuffer[offset + 3] = 255;\r\n }\r\n }\r\n\r\n // Retrieves the metallic roughness factors from the maximum texture values.\r\n const metallicRoughnessFactors: IPBRMetallicRoughness = {\r\n baseColor: maxBaseColor,\r\n metallic: maxMetallic,\r\n roughness: maxRoughness,\r\n };\r\n\r\n let writeOutMetallicRoughnessTexture = false;\r\n let writeOutBaseColorTexture = false;\r\n\r\n for (let h = 0; h < height; ++h) {\r\n for (let w = 0; w < width; ++w) {\r\n const destinationOffset = (width * h + w) * strideSize;\r\n\r\n baseColorBuffer[destinationOffset] /= metallicRoughnessFactors.baseColor.r > Epsilon ? metallicRoughnessFactors.baseColor.r : 1;\r\n baseColorBuffer[destinationOffset + 1] /= metallicRoughnessFactors.baseColor.g > Epsilon ? metallicRoughnessFactors.baseColor.g : 1;\r\n baseColorBuffer[destinationOffset + 2] /= metallicRoughnessFactors.baseColor.b > Epsilon ? metallicRoughnessFactors.baseColor.b : 1;\r\n\r\n const linearBaseColorPixel = Color3.FromInts(\r\n baseColorBuffer[destinationOffset],\r\n baseColorBuffer[destinationOffset + 1],\r\n baseColorBuffer[destinationOffset + 2]\r\n );\r\n const sRGBBaseColorPixel = linearBaseColorPixel.toGammaSpace(scene.getEngine().useExactSrgbConversions);\r\n baseColorBuffer[destinationOffset] = sRGBBaseColorPixel.r * 255;\r\n baseColorBuffer[destinationOffset + 1] = sRGBBaseColorPixel.g * 255;\r\n baseColorBuffer[destinationOffset + 2] = sRGBBaseColorPixel.b * 255;\r\n\r\n if (!sRGBBaseColorPixel.equalsWithEpsilon(White, Epsilon)) {\r\n writeOutBaseColorTexture = true;\r\n }\r\n\r\n metallicRoughnessBuffer[destinationOffset + 1] /= metallicRoughnessFactors.roughness! > Epsilon ? metallicRoughnessFactors.roughness! : 1;\r\n metallicRoughnessBuffer[destinationOffset + 2] /= metallicRoughnessFactors.metallic! > Epsilon ? metallicRoughnessFactors.metallic! : 1;\r\n\r\n const metallicRoughnessPixel = Color3.FromInts(255, metallicRoughnessBuffer[destinationOffset + 1], metallicRoughnessBuffer[destinationOffset + 2]);\r\n\r\n if (!metallicRoughnessPixel.equalsWithEpsilon(White, Epsilon)) {\r\n writeOutMetallicRoughnessTexture = true;\r\n }\r\n }\r\n }\r\n\r\n if (writeOutMetallicRoughnessTexture) {\r\n promises.push(\r\n EncodeImageAsync(metallicRoughnessBuffer, width, height).then((data) => {\r\n metallicRoughnessFactors.metallicRoughnessTextureData = data;\r\n })\r\n );\r\n }\r\n if (writeOutBaseColorTexture) {\r\n promises.push(\r\n EncodeImageAsync(baseColorBuffer, width, height).then((data) => {\r\n metallicRoughnessFactors.baseColorTextureData = data;\r\n })\r\n );\r\n }\r\n\r\n return await Promise.all(promises).then(() => {\r\n return metallicRoughnessFactors;\r\n });\r\n } else {\r\n return await Promise.reject(\"_ConvertSpecularGlossinessTexturesToMetallicRoughness: Scene from textures is missing!\");\r\n }\r\n }\r\n\r\n /**\r\n * Converts specular glossiness material properties to metallic roughness\r\n * @param specularGlossiness interface with specular glossiness material properties\r\n * @returns interface with metallic roughness material properties\r\n */\r\n private _convertSpecularGlossinessToMetallicRoughness(specularGlossiness: IPBRSpecularGlossiness): IPBRMetallicRoughness {\r\n const diffusePerceivedBrightness = this._getPerceivedBrightness(specularGlossiness.diffuseColor);\r\n const specularPerceivedBrightness = this._getPerceivedBrightness(specularGlossiness.specularColor);\r\n const oneMinusSpecularStrength = 1 - this._getMaxComponent(specularGlossiness.specularColor);\r\n const metallic = _SolveMetallic(diffusePerceivedBrightness, specularPerceivedBrightness, oneMinusSpecularStrength);\r\n const baseColorFromDiffuse = specularGlossiness.diffuseColor.scale(oneMinusSpecularStrength / (1.0 - DielectricSpecular.r) / Math.max(1 - metallic, Epsilon));\r\n const baseColorFromSpecular = specularGlossiness.specularColor.subtract(DielectricSpecular.scale(1 - metallic)).scale(1 / Math.max(metallic, Epsilon));\r\n let baseColor = Color3.Lerp(baseColorFromDiffuse, baseColorFromSpecular, metallic * metallic);\r\n baseColor = baseColor.clampToRef(0, 1, baseColor);\r\n\r\n const metallicRoughness: IPBRMetallicRoughness = {\r\n baseColor: baseColor,\r\n metallic: metallic,\r\n roughness: 1 - specularGlossiness.glossiness,\r\n };\r\n\r\n return metallicRoughness;\r\n }\r\n\r\n /**\r\n * Calculates the surface reflectance, independent of lighting conditions\r\n * @param color Color source to calculate brightness from\r\n * @returns number representing the perceived brightness, or zero if color is undefined\r\n */\r\n private _getPerceivedBrightness(color: Color3): number {\r\n return Math.sqrt(0.299 * color.r * color.r + 0.587 * color.g * color.g + 0.114 * color.b * color.b);\r\n }\r\n\r\n /**\r\n * Returns the maximum color component value\r\n * @param color\r\n * @returns maximum color component value, or zero if color is null or undefined\r\n */\r\n private _getMaxComponent(color: Color3): number {\r\n return Math.max(color.r, Math.max(color.g, color.b));\r\n }\r\n\r\n /**\r\n * Convert a PBRMaterial (Metallic/Roughness) to Metallic Roughness factors\r\n * @param baseColor Base color of the material\r\n * @param metallic Metallic factor of the material\r\n * @param roughness Roughness factor of the material\r\n * @param albedoTexture Albedo texture of the material\r\n * @param metallicTexture Metallic texture of the material\r\n * @param roughnessTexture Roughness texture of the material\r\n * @param babylonPBRMaterial BJS PBR Metallic Roughness Material\r\n * @param glTFPbrMetallicRoughness glTF PBR Metallic Roughness interface\r\n * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied\r\n * @returns glTF PBR Metallic Roughness factors\r\n */\r\n private async _convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n baseColor: Color3,\r\n metallic: Nullable<number>,\r\n roughness: Nullable<number>,\r\n albedoTexture: Nullable<BaseTexture>,\r\n metallicTexture: Nullable<BaseTexture>,\r\n roughnessTexture: Nullable<BaseTexture>,\r\n babylonPBRMaterial: PBRBaseMaterial | OpenPBRMaterial,\r\n glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<IPBRMetallicRoughness> {\r\n const promises: Promise<void>[] = [];\r\n\r\n const metallicRoughness: IPBRMetallicRoughness = {\r\n baseColor: baseColor,\r\n metallic: metallic,\r\n roughness: roughness,\r\n };\r\n\r\n if (hasUVs) {\r\n if (babylonPBRMaterial instanceof OpenPBRMaterial) {\r\n if (babylonPBRMaterial.geometryOpacityTexture) {\r\n // Merge baseColor and opacity\r\n const albedoId = albedoTexture && albedoTexture.getInternalTexture() ? albedoTexture.getInternalTexture()!.uniqueId : 0;\r\n const opacityId =\r\n babylonPBRMaterial.geometryOpacityTexture && babylonPBRMaterial.geometryOpacityTexture.getInternalTexture()\r\n ? babylonPBRMaterial.geometryOpacityTexture.getInternalTexture()!.uniqueId\r\n : 0;\r\n const mergedId = Number(`${albedoId}${opacityId}`);\r\n const glTFTexture = this._textureMap.get(mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n } else {\r\n promises.push(\r\n MergeTexturesAsync(\r\n \"baseColorOpacityTexture\",\r\n CreateRGBAConfiguration(\r\n albedoTexture ? CreateTextureInput(albedoTexture, 0) : CreateConstantInput(1.0),\r\n albedoTexture ? CreateTextureInput(albedoTexture, 1) : CreateConstantInput(1.0),\r\n albedoTexture ? CreateTextureInput(albedoTexture, 2) : CreateConstantInput(1.0),\r\n CreateTextureInput(babylonPBRMaterial.geometryOpacityTexture, 0)\r\n ),\r\n babylonPBRMaterial.getScene()\r\n ).then(async (mergedTexture) => {\r\n const glTFTexture = await this.exportTextureAsync(mergedTexture, mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n } else {\r\n if (albedoTexture) {\r\n promises.push(\r\n this.exportTextureAsync(albedoTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n if (babylonPBRMaterial._useMetallicFromMetallicTextureBlue && metallicTexture) {\r\n promises.push(\r\n this.exportTextureAsync(metallicTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n } else if (roughnessTexture || metallicTexture) {\r\n const metallicId = metallicTexture && metallicTexture.getInternalTexture() ? metallicTexture.getInternalTexture()!.uniqueId : 0;\r\n const roughnessId = roughnessTexture && roughnessTexture.getInternalTexture() ? roughnessTexture.getInternalTexture()!.uniqueId : 0;\r\n const mergedId = Number(`${metallicId}${roughnessId}`);\r\n const glTFTexture = this._textureMap.get(mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n } else {\r\n promises.push(\r\n MergeTexturesAsync(\r\n \"MetalRoughTexture\",\r\n CreateRGBAConfiguration(\r\n babylonPBRMaterial.ambientOcclusionTexture ? CreateTextureInput(babylonPBRMaterial.ambientOcclusionTexture, 0) : CreateConstantInput(1.0),\r\n roughnessTexture ? CreateTextureInput(roughnessTexture, 0) : CreateConstantInput(1.0),\r\n metallicTexture ? CreateTextureInput(metallicTexture, 0) : CreateConstantInput(1.0)\r\n ),\r\n babylonPBRMaterial.getScene()\r\n ).then(async (mergedTexture) => {\r\n const glTFTexture = await this.exportTextureAsync(mergedTexture, mergedId);\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n } else {\r\n if (albedoTexture) {\r\n promises.push(\r\n this.exportTextureAsync(albedoTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.baseColorTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n if (metallicTexture) {\r\n promises.push(\r\n this.exportTextureAsync(metallicTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFPbrMetallicRoughness.metallicRoughnessTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n await Promise.all(promises);\r\n }\r\n\r\n return metallicRoughness;\r\n }\r\n\r\n private _getTextureSampler(texture: Nullable<BaseTexture>): ISampler {\r\n const sampler: ISampler = {};\r\n if (!texture || !(texture instanceof Texture)) {\r\n return sampler;\r\n }\r\n\r\n const wrapS = this._getGLTFTextureWrapMode(texture.wrapU);\r\n if (wrapS !== TextureWrapMode.REPEAT) {\r\n sampler.wrapS = wrapS;\r\n }\r\n\r\n const wrapT = this._getGLTFTextureWrapMode(texture.wrapV);\r\n if (wrapT !== TextureWrapMode.REPEAT) {\r\n sampler.wrapT = wrapT;\r\n }\r\n\r\n switch (texture.samplingMode) {\r\n case Texture.LINEAR_LINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_LINEAR_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.LINEAR_NEAREST_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_LINEAR_MIPLINEAR: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_LINEAR;\r\n break;\r\n }\r\n case Texture.LINEAR_LINEAR_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.LINEAR;\r\n sampler.minFilter = TextureMinFilter.LINEAR_MIPMAP_NEAREST;\r\n break;\r\n }\r\n case Texture.NEAREST_NEAREST_MIPNEAREST: {\r\n sampler.magFilter = TextureMagFilter.NEAREST;\r\n sampler.minFilter = TextureMinFilter.NEAREST_MIPMAP_NEAREST;\r\n break;\r\n }\r\n }\r\n\r\n return sampler;\r\n }\r\n\r\n private _getGLTFTextureWrapMode(wrapMode: number): TextureWrapMode {\r\n switch (wrapMode) {\r\n case Texture.WRAP_ADDRESSMODE: {\r\n return TextureWrapMode.REPEAT;\r\n }\r\n case Texture.CLAMP_ADDRESSMODE: {\r\n return TextureWrapMode.CLAMP_TO_EDGE;\r\n }\r\n case Texture.MIRROR_ADDRESSMODE: {\r\n return TextureWrapMode.MIRRORED_REPEAT;\r\n }\r\n default: {\r\n Tools.Error(`Unsupported Texture Wrap Mode ${wrapMode}!`);\r\n return TextureWrapMode.REPEAT;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Convert a PBRMaterial (Specular/Glossiness) to Metallic Roughness factors\r\n * @param babylonPBRMaterial BJS PBR Metallic Roughness Material\r\n * @param pbrMetallicRoughness glTF PBR Metallic Roughness interface\r\n * @param hasUVs specifies if texture coordinates are present on the submesh to determine if textures should be applied\r\n * @returns glTF PBR Metallic Roughness factors\r\n */\r\n private async _convertSpecGlossFactorsToMetallicRoughnessAsync(\r\n babylonPBRMaterial: PBRBaseMaterial,\r\n pbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<IPBRMetallicRoughness> {\r\n const specGloss: IPBRSpecularGlossiness = {\r\n diffuseColor: babylonPBRMaterial._albedoColor,\r\n specularColor: babylonPBRMaterial._reflectivityColor,\r\n glossiness: babylonPBRMaterial._microSurface,\r\n };\r\n\r\n const albedoTexture = babylonPBRMaterial._albedoTexture;\r\n const reflectivityTexture = babylonPBRMaterial._reflectivityTexture;\r\n const useMicrosurfaceFromReflectivityMapAlpha = babylonPBRMaterial._useMicroSurfaceFromReflectivityMapAlpha;\r\n if (reflectivityTexture && !useMicrosurfaceFromReflectivityMapAlpha) {\r\n return await Promise.reject(\"_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported\");\r\n }\r\n\r\n if ((albedoTexture || reflectivityTexture) && hasUVs) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n\r\n const samplerIndex = this._exportTextureSampler(albedoTexture || reflectivityTexture);\r\n const metallicRoughnessFactors = await this._convertSpecularGlossinessTexturesToMetallicRoughnessAsync(albedoTexture, reflectivityTexture, specGloss);\r\n\r\n const textures = this._exporter._textures;\r\n\r\n if (metallicRoughnessFactors.baseColorTextureData) {\r\n const imageIndex = await this._exportImageAsync(`baseColor${textures.length}`, metallicRoughnessFactors.baseColorTextureData);\r\n pbrMetallicRoughness.baseColorTexture = this._exportTextureInfo(imageIndex, samplerIndex, albedoTexture?.coordinatesIndex);\r\n }\r\n\r\n if (metallicRoughnessFactors.metallicRoughnessTextureData) {\r\n const imageIndex = await this._exportImageAsync(`metallicRoughness${textures.length}`, metallicRoughnessFactors.metallicRoughnessTextureData);\r\n pbrMetallicRoughness.metallicRoughnessTexture = this._exportTextureInfo(imageIndex, samplerIndex, reflectivityTexture?.coordinatesIndex);\r\n }\r\n\r\n return metallicRoughnessFactors;\r\n } else {\r\n return this._convertSpecularGlossinessToMetallicRoughness(specGloss);\r\n }\r\n }\r\n\r\n public async exportPBRMaterialAsync(babylonPBRMaterial: PBRBaseMaterial, hasUVs: boolean): Promise<number> {\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {};\r\n\r\n const glTFMaterial: IMaterial = {\r\n name: babylonPBRMaterial.name,\r\n };\r\n\r\n const useMetallicRoughness = babylonPBRMaterial.isMetallicWorkflow();\r\n\r\n if (useMetallicRoughness) {\r\n const albedoColor = babylonPBRMaterial._albedoColor;\r\n const alpha = babylonPBRMaterial.alpha;\r\n if (albedoColor) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [albedoColor.r, albedoColor.g, albedoColor.b, alpha];\r\n }\r\n }\r\n\r\n const metallicRoughness = useMetallicRoughness\r\n ? await this._convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n babylonPBRMaterial._albedoColor,\r\n babylonPBRMaterial._metallic,\r\n babylonPBRMaterial._roughness,\r\n babylonPBRMaterial._albedoTexture,\r\n babylonPBRMaterial._metallicTexture,\r\n babylonPBRMaterial._metallicTexture,\r\n babylonPBRMaterial,\r\n glTFPbrMetallicRoughness,\r\n hasUVs\r\n )\r\n : await this._convertSpecGlossFactorsToMetallicRoughnessAsync(babylonPBRMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n\r\n await this._setMetallicRoughnessPbrMaterialAsync(metallicRoughness, babylonPBRMaterial, glTFMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n await this._finishMaterialAsync(glTFMaterial, babylonPBRMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(glTFMaterial);\r\n return materials.length - 1;\r\n }\r\n\r\n private async _setMetallicRoughnessPbrMaterialAsync(\r\n metallicRoughness: IPBRMetallicRoughness,\r\n babylonPBRMaterial: PBRBaseMaterial | OpenPBRMaterial,\r\n glTFMaterial: IMaterial,\r\n glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness,\r\n hasUVs: boolean\r\n ): Promise<void> {\r\n SetAlphaMode(glTFMaterial, babylonPBRMaterial);\r\n\r\n if (!metallicRoughness.baseColor.equalsWithEpsilon(White, Epsilon) || !Scalar.WithinEpsilon(babylonPBRMaterial.alpha, 1, Epsilon)) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [metallicRoughness.baseColor.r, metallicRoughness.baseColor.g, metallicRoughness.baseColor.b, babylonPBRMaterial.alpha];\r\n }\r\n\r\n if (metallicRoughness.metallic != null && metallicRoughness.metallic !== 1) {\r\n glTFPbrMetallicRoughness.metallicFactor = metallicRoughness.metallic;\r\n }\r\n if (metallicRoughness.roughness != null && metallicRoughness.roughness !== 1) {\r\n glTFPbrMetallicRoughness.roughnessFactor = metallicRoughness.roughness;\r\n }\r\n\r\n if (babylonPBRMaterial.backFaceCulling != null && !babylonPBRMaterial.backFaceCulling) {\r\n if (!babylonPBRMaterial._twoSidedLighting) {\r\n Tools.Warn(babylonPBRMaterial.name + \": Back-face culling disabled and two-sided lighting disabled is not supported in glTF.\");\r\n }\r\n glTFMaterial.doubleSided = true;\r\n }\r\n\r\n if (hasUVs) {\r\n const promises: Promise<void>[] = [];\r\n\r\n const bumpTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._bumpTexture : babylonPBRMaterial.geometryNormalTexture;\r\n if (bumpTexture) {\r\n promises.push(\r\n this.exportTextureAsync(bumpTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFMaterial.normalTexture = glTFTexture;\r\n if (bumpTexture.level !== 1) {\r\n glTFMaterial.normalTexture.scale = bumpTexture.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const ambientTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._ambientTexture : babylonPBRMaterial.ambientOcclusionTexture;\r\n if (ambientTexture) {\r\n promises.push(\r\n new Promise<Nullable<ITextureInfo>>(async (resolve) => {\r\n if (babylonPBRMaterial instanceof OpenPBRMaterial && glTFPbrMetallicRoughness.metallicRoughnessTexture) {\r\n // The metallicRoughnessTexture already contains the ambient occlusion data in its red channel, we don't need to export it again\r\n // However, we still need to set the texture info on the material.\r\n const samplerIndex = this._exportTextureSampler(ambientTexture);\r\n const imageIndex = this._exporter._textures[glTFPbrMetallicRoughness.metallicRoughnessTexture.index].source!;\r\n const textureInfo = this._exportTextureInfo(imageIndex, samplerIndex, ambientTexture.coordinatesIndex);\r\n this._textureMap.set(ambientTexture.uniqueId, textureInfo);\r\n this._exporter._extensionsPostExportTextures(\"exporter\", textureInfo, ambientTexture);\r\n return resolve(textureInfo);\r\n } else {\r\n return resolve(await this.exportTextureAsync(ambientTexture));\r\n }\r\n }).then(async (glTFTexture) => {\r\n if (glTFTexture) {\r\n const occlusionTexture: IMaterialOcclusionTextureInfo = {\r\n index: glTFTexture.index,\r\n texCoord: glTFTexture.texCoord,\r\n extensions: glTFTexture.extensions,\r\n };\r\n\r\n glTFMaterial.occlusionTexture = occlusionTexture;\r\n if (babylonPBRMaterial instanceof PBRBaseMaterial) {\r\n occlusionTexture.strength = babylonPBRMaterial._ambientTextureStrength;\r\n } else {\r\n occlusionTexture.strength = babylonPBRMaterial.ambientOcclusionTexture!.level;\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n const emissiveTexture = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._emissiveTexture : babylonPBRMaterial.emissionColorTexture;\r\n if (emissiveTexture) {\r\n promises.push(\r\n this.exportTextureAsync(emissiveTexture).then((glTFTexture) => {\r\n if (glTFTexture) {\r\n glTFMaterial.emissiveTexture = glTFTexture;\r\n }\r\n })\r\n );\r\n }\r\n\r\n if (promises.length > 0) {\r\n this._exporter._materialNeedsUVsSet.add(babylonPBRMaterial);\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n const emissiveColor = babylonPBRMaterial instanceof PBRBaseMaterial ? babylonPBRMaterial._emissiveColor : babylonPBRMaterial.emissionColor;\r\n if (!emissiveColor.equalsWithEpsilon(Black, Epsilon)) {\r\n glTFMaterial.emissiveFactor = emissiveColor.asArray();\r\n }\r\n\r\n glTFMaterial.pbrMetallicRoughness = glTFPbrMetallicRoughness;\r\n }\r\n\r\n public async exportOpenPBRMaterialAsync(babylonOpenPBRMaterial: OpenPBRMaterial, hasUVs: boolean): Promise<number> {\r\n const glTFPbrMetallicRoughness: IMaterialPbrMetallicRoughness = {};\r\n\r\n const glTFMaterial: IMaterial = {\r\n name: babylonOpenPBRMaterial.name,\r\n };\r\n\r\n const albedoColor = babylonOpenPBRMaterial.baseColor;\r\n const alpha = babylonOpenPBRMaterial.geometryOpacity;\r\n if (albedoColor) {\r\n glTFPbrMetallicRoughness.baseColorFactor = [albedoColor.r, albedoColor.g, albedoColor.b, alpha];\r\n }\r\n\r\n const metallicRoughness = await this._convertMetalRoughFactorsToMetallicRoughnessAsync(\r\n babylonOpenPBRMaterial.baseColor,\r\n babylonOpenPBRMaterial.baseMetalness,\r\n babylonOpenPBRMaterial.specularRoughness,\r\n babylonOpenPBRMaterial.baseColorTexture,\r\n babylonOpenPBRMaterial.baseMetalnessTexture,\r\n babylonOpenPBRMaterial.specularRoughnessTexture,\r\n babylonOpenPBRMaterial,\r\n glTFPbrMetallicRoughness,\r\n hasUVs\r\n );\r\n\r\n await this._setMetallicRoughnessPbrMaterialAsync(metallicRoughness, babylonOpenPBRMaterial, glTFMaterial, glTFPbrMetallicRoughness, hasUVs);\r\n await this._finishMaterialAsync(glTFMaterial, babylonOpenPBRMaterial);\r\n\r\n const materials = this._exporter._materials;\r\n materials.push(glTFMaterial);\r\n return materials.length - 1;\r\n }\r\n\r\n public async exportTextureAsync(babylonTexture: BaseTexture, overrideId: Nullable<number> = null): Promise<Nullable<ITextureInfo>> {\r\n let textureInfo = this._textureMap.get(overrideId ?? babylonTexture.uniqueId);\r\n if (textureInfo) {\r\n return textureInfo;\r\n }\r\n\r\n const samplerIndex = this._exportTextureSampler(babylonTexture);\r\n const imageIndex = await this._exportTextureImageAsync(babylonTexture);\r\n\r\n textureInfo = this._exportTextureInfo(imageIndex, samplerIndex, babylonTexture.coordinatesIndex);\r\n this._textureMap.set(overrideId ?? babylonTexture.uniqueId, textureInfo);\r\n\r\n this._exporter._extensionsPostExportTextures(\"exporter\", textureInfo, babylonTexture);\r\n return textureInfo;\r\n }\r\n\r\n private async _exportTextureImageAsync(babylonTexture: BaseTexture): Promise<number> {\r\n const requestedMimeType = (babylonTexture as Texture).mimeType ?? \"none\";\r\n // TODO: Add an official way for users to export using a different mime type\r\n // than the one they loaded with (which is denoted by Texture.mimeType)\r\n\r\n const internalTextureToImage = this._internalTextureToImage;\r\n const internalTextureUniqueId = babylonTexture.getInternalTexture()!.uniqueId;\r\n internalTextureToImage[internalTextureUniqueId] = internalTextureToImage[internalTextureUniqueId] || {};\r\n let imageIndexPromise = internalTextureToImage[internalTextureUniqueId][requestedMimeType];\r\n\r\n if (imageIndexPromise === undefined) {\r\n imageIndexPromise = (async () => {\r\n // Try to get the image from memory first, if applicable\r\n const cache = await GetCachedImageAsync(babylonTexture);\r\n if (cache && (requestedMimeType === \"none\" || cache.type === requestedMimeType)) {\r\n return await this._exportImageAsync(babylonTexture.name, cache);\r\n }\r\n\r\n // Preserve texture mime type if defined\r\n let mimeType = ImageMimeType.PNG;\r\n if (requestedMimeType !== \"none\") {\r\n if (IsSupportedMimeType(requestedMimeType)) {\r\n mimeType = requestedMimeType;\r\n } else {\r\n mimeType = ImageMimeType.PNG;\r\n Tools.Warn(`Unsupported media type: ${requestedMimeType}. Exporting texture as PNG.`);\r\n }\r\n }\r\n\r\n const size = babylonTexture.getSize();\r\n const pixels = await GetTextureDataAsync(babylonTexture);\r\n const imageData = await EncodeImageAsync(pixels, size.width, size.height, mimeType);\r\n\r\n return await this._exportImageAsync(babylonTexture.name, imageData);\r\n })();\r\n\r\n internalTextureToImage[internalTextureUniqueId][requestedMimeType] = imageIndexPromise;\r\n }\r\n\r\n return await imageIndexPromise;\r\n }\r\n\r\n private async _exportImageAsync(name: string, imageData: Blob): Promise<number> {\r\n const images = this._exporter._images;\r\n\r\n let image: IImage;\r\n if (this._exporter._shouldUseGlb) {\r\n image = {\r\n name: name,\r\n mimeType: imageData.type as ImageMimeType,\r\n bufferView: undefined, // Will be updated later by BufferManager\r\n };\r\n const data = await imageData.arrayBuffer();\r\n const bufferView = this._exporter._bufferManager.createBufferView(new Uint8Array(data));\r\n this._exporter._bufferManager.setBufferView(image, bufferView);\r\n } else {\r\n // Build a unique URI\r\n const baseName = name.replace(/\\.\\/|\\/|\\.\\\\|\\\\/g, \"_\");\r\n const extension = GetFileExtensionFromMimeType(imageData.type as ImageMimeType);\r\n let fileName = baseName + extension;\r\n if (images.some((image) => image.uri === fileName)) {\r\n fileName = `${baseName}_${Tools.RandomId()}${extension}`;\r\n }\r\n\r\n image = {\r\n name: name,\r\n uri: fileName,\r\n };\r\n this._exporter._imageData[fileName] = imageData; // Save image data to be written to file later\r\n }\r\n\r\n images.push(image);\r\n\r\n return images.length - 1;\r\n }\r\n\r\n private _exportTextureInfo(imageIndex: number, samplerIndex: number, coordinatesIndex?: number): ITextureInfo {\r\n const textures = this._exporter._textures;\r\n let textureIndex = textures.findIndex((t) => t.sampler == samplerIndex && t.source === imageIndex);\r\n if (textureIndex === -1) {\r\n textureIndex = textures.length;\r\n textures.push({\r\n source: imageIndex,\r\n sampler: samplerIndex,\r\n });\r\n }\r\n\r\n const textureInfo: ITextureInfo = { index: textureIndex };\r\n if (coordinatesIndex) {\r\n textureInfo.texCoord = coordinatesIndex;\r\n }\r\n return textureInfo;\r\n }\r\n\r\n private _exportTextureSampler(texture: Nullable<BaseTexture>): number {\r\n const sampler = this._getTextureSampler(texture);\r\n\r\n // if a pre-existing sampler with identical parameters exists, then reuse the previous sampler\r\n const samplers = this._exporter._samplers;\r\n const samplerIndex = samplers.findIndex(\r\n (s) => s.minFilter === sampler.minFilter && s.magFilter === sampler.magFilter && s.wrapS === sampler.wrapS && s.wrapT === sampler.wrapT\r\n );\r\n if (samplerIndex !== -1) {\r\n return samplerIndex;\r\n }\r\n\r\n samplers.push(sampler);\r\n return samplers.length - 1;\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/serializers",
3
- "version": "9.4.1",
3
+ "version": "9.5.1",
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
  "devDependencies": {
21
- "@babylonjs/core": "9.4.1",
21
+ "@babylonjs/core": "9.5.1",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@dev/serializers": "^1.0.0",
24
- "babylonjs-gltf2interface": "9.4.1"
24
+ "babylonjs-gltf2interface": "9.5.1"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@babylonjs/core": "^9.0.0",