@onerjs/serializers 8.46.4 → 8.46.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,13 +45,16 @@ export class KHR_materials_transmission {
45
45
  if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionWeightTexture) {
46
46
  additionalTextures.push(babylonMaterial.transmissionWeightTexture);
47
47
  }
48
+ if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceWeightTexture) {
49
+ additionalTextures.push(babylonMaterial.subsurfaceWeightTexture);
50
+ }
48
51
  }
49
52
  return additionalTextures;
50
53
  }
51
54
  _isExtensionEnabled(mat) {
52
55
  // This extension must not be used on a material that also uses KHR_materials_unlit
53
56
  if (mat instanceof OpenPBRMaterial && !mat.unlit) {
54
- return mat.transmissionWeight > 0;
57
+ return mat.transmissionWeight > 0 || mat.subsurfaceWeight > 0;
55
58
  }
56
59
  else if (mat instanceof PBRMaterial && !mat.unlit) {
57
60
  const subs = mat.subSurface;
@@ -95,7 +98,8 @@ export class KHR_materials_transmission {
95
98
  }
96
99
  else if (babylonMaterial instanceof OpenPBRMaterial) {
97
100
  this._wasUsed = true;
98
- const transmissionFactor = babylonMaterial.transmissionWeight;
101
+ const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;
102
+ const transmissionFactor = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;
99
103
  const transmissionInfo = {
100
104
  transmissionFactor: transmissionFactor,
101
105
  };
@@ -106,6 +110,13 @@ export class KHR_materials_transmission {
106
110
  transmissionInfo.transmissionTexture = transmissionTexture;
107
111
  }
108
112
  }
113
+ else if (babylonMaterial.subsurfaceWeightTexture) {
114
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
115
+ const subsurfaceTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceWeightTexture);
116
+ if (subsurfaceTexture) {
117
+ transmissionInfo.transmissionTexture = subsurfaceTexture;
118
+ }
119
+ }
109
120
  if (transmissionFactor === 1) {
110
121
  if (node.pbrMetallicRoughness) {
111
122
  node.pbrMetallicRoughness.baseColorFactor = undefined;
@@ -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;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,CAAC;QACtC,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,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,CAAC;YAE9D,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;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 }\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;\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 transmissionFactor = 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 }\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\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,6 +1,7 @@
1
1
  import { GLTFExporter } from "../glTFExporter.js";
2
2
  import { PBRMaterial } from "@onerjs/core/Materials/PBR/pbrMaterial.js";
3
3
  import { Color3 } from "@onerjs/core/Maths/math.color.js";
4
+ import { Vector3 } from "@onerjs/core/Maths/math.vector.js";
4
5
  import { OpenPBRMaterial } from "@onerjs/core/Materials/PBR/openpbrMaterial.js";
5
6
  const NAME = "KHR_materials_volume";
6
7
  /**
@@ -41,7 +42,7 @@ export class KHR_materials_volume {
41
42
  }
42
43
  }
43
44
  else if (babylonMaterial instanceof OpenPBRMaterial) {
44
- if (babylonMaterial.transmissionWeight > 0) {
45
+ if (babylonMaterial.transmissionWeight > 0 || babylonMaterial.subsurfaceWeight > 0) {
45
46
  if (babylonMaterial.geometryThicknessTexture) {
46
47
  additionalTextures.push(babylonMaterial.geometryThicknessTexture);
47
48
  }
@@ -97,12 +98,55 @@ export class KHR_materials_volume {
97
98
  node.extensions[NAME] = volumeInfo;
98
99
  }
99
100
  else if (babylonMaterial instanceof OpenPBRMaterial) {
100
- if (babylonMaterial.transmissionWeight > 0) {
101
+ const transmissionVolume = babylonMaterial.transmissionWeight > 0 && !babylonMaterial.geometryThinWalled && babylonMaterial.transmissionDepth > 0;
102
+ const subsurfaceVolume = babylonMaterial.subsurfaceWeight > 0 && !babylonMaterial.geometryThinWalled;
103
+ if (transmissionVolume || subsurfaceVolume) {
101
104
  this._wasUsed = true;
102
105
  const thicknessFactor = babylonMaterial.geometryThickness;
103
106
  const thicknessTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryThicknessTexture) ?? undefined;
104
- const attenuationDistance = babylonMaterial.transmissionDepth;
105
- const attenuationColor = babylonMaterial.transmissionColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : babylonMaterial.transmissionColor.asArray();
107
+ if (thicknessTexture) {
108
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
109
+ }
110
+ let transmissionAttenuationDistance = 1;
111
+ const transmissionAttenuationColor = Color3.White().asArray();
112
+ if (transmissionVolume) {
113
+ const invDepth = 1.0 / babylonMaterial.transmissionDepth;
114
+ let transmissionExtinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
115
+ const transmissionScatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
116
+ const transmissionAbsorptionCoefficient = transmissionExtinctionCoefficient.subtract(transmissionScatteringCoefficient);
117
+ const minCoeff = Math.min(transmissionAbsorptionCoefficient.x, transmissionAbsorptionCoefficient.y, transmissionAbsorptionCoefficient.z);
118
+ if (minCoeff < 0) {
119
+ transmissionAbsorptionCoefficient.x = transmissionAbsorptionCoefficient.x - minCoeff;
120
+ transmissionAbsorptionCoefficient.y = transmissionAbsorptionCoefficient.y - minCoeff;
121
+ transmissionAbsorptionCoefficient.z = transmissionAbsorptionCoefficient.z - minCoeff;
122
+ }
123
+ transmissionExtinctionCoefficient = transmissionAbsorptionCoefficient.add(transmissionScatteringCoefficient);
124
+ const maxCoeff = Math.max(transmissionExtinctionCoefficient.x, transmissionExtinctionCoefficient.y, transmissionExtinctionCoefficient.z);
125
+ transmissionAttenuationDistance = 1.0 / maxCoeff;
126
+ transmissionAttenuationColor[0] = Math.exp(-transmissionExtinctionCoefficient.x * transmissionAttenuationDistance);
127
+ transmissionAttenuationColor[1] = Math.exp(-transmissionExtinctionCoefficient.y * transmissionAttenuationDistance);
128
+ transmissionAttenuationColor[2] = Math.exp(-transmissionExtinctionCoefficient.z * transmissionAttenuationDistance);
129
+ }
130
+ let subsurfaceAttenuationDistance = 1;
131
+ const subsurfaceAttenuationColor = Color3.White().asArray();
132
+ if (subsurfaceVolume) {
133
+ const r = babylonMaterial.subsurfaceRadius;
134
+ const radiusScale = babylonMaterial.subsurfaceRadiusScale;
135
+ const mfp = new Vector3(radiusScale.r, radiusScale.g, radiusScale.b).multiplyByFloats(r, r, r);
136
+ 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));
137
+ const maxCoeff = Math.max(extinctionCoeff.x, extinctionCoeff.y, extinctionCoeff.z);
138
+ subsurfaceAttenuationDistance = 1.0 / maxCoeff;
139
+ subsurfaceAttenuationColor[0] = Math.exp(-extinctionCoeff.x * subsurfaceAttenuationDistance);
140
+ subsurfaceAttenuationColor[1] = Math.exp(-extinctionCoeff.y * subsurfaceAttenuationDistance);
141
+ subsurfaceAttenuationColor[2] = Math.exp(-extinctionCoeff.z * subsurfaceAttenuationDistance);
142
+ }
143
+ const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;
144
+ const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;
145
+ const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);
146
+ const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
147
+ const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
148
+ const attenuationColor = transmissionAttenuationColor.map((c, i) => c * transWeight + subsurfaceAttenuationColor[i] * subsurfWeight);
149
+ const attenuationDistance = transmissionAttenuationDistance * transWeight + subsurfaceAttenuationDistance * subsurfWeight;
106
150
  const volumeInfo = {
107
151
  thicknessFactor: thicknessFactor,
108
152
  thicknessTexture: thicknessTexture,
@@ -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 { 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) {\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 if (babylonMaterial.transmissionWeight > 0) {\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 const attenuationDistance = babylonMaterial.transmissionDepth;\r\n const attenuationColor = babylonMaterial.transmissionColor.equalsFloats(1.0, 1.0, 1.0) ? undefined : babylonMaterial.transmissionColor.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 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":"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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"]}
@@ -47,6 +47,11 @@ export class KHR_materials_volume_scatter {
47
47
  additionalTextures.push(babylonMaterial.transmissionScatterTexture);
48
48
  }
49
49
  }
50
+ if (babylonMaterial.subsurfaceWeight > 0) {
51
+ if (babylonMaterial.subsurfaceColorTexture) {
52
+ additionalTextures.push(babylonMaterial.subsurfaceColorTexture);
53
+ }
54
+ }
50
55
  }
51
56
  return additionalTextures;
52
57
  }
@@ -55,10 +60,13 @@ export class KHR_materials_volume_scatter {
55
60
  if (mat.unlit) {
56
61
  return false;
57
62
  }
58
- if (mat.transmissionWeight == 0 || mat.transmissionScatter.equals(Color3.Black())) {
59
- return false;
63
+ const transmissionVolume = mat.transmissionWeight > 0 && !mat.geometryThinWalled && mat.transmissionDepth > 0;
64
+ const transmissionScatter = transmissionVolume && !mat.transmissionScatter.equals(Color3.Black());
65
+ const subsurfaceVolume = mat.subsurfaceWeight > 0 && !mat.geometryThinWalled;
66
+ if (transmissionScatter || subsurfaceVolume) {
67
+ return true;
60
68
  }
61
- return true;
69
+ return false;
62
70
  }
63
71
  /**
64
72
  * After exporting a material
@@ -72,23 +80,51 @@ export class KHR_materials_volume_scatter {
72
80
  return new Promise((resolve) => {
73
81
  if (babylonMaterial instanceof OpenPBRMaterial && this._isExtensionEnabled(babylonMaterial)) {
74
82
  this._wasUsed = true;
75
- const invDepth = 1.0 / babylonMaterial.transmissionDepth;
76
- const extinctionCoefficient = new Vector3(-Math.log(babylonMaterial.transmissionColor.r) * invDepth, -Math.log(babylonMaterial.transmissionColor.g) * invDepth, -Math.log(babylonMaterial.transmissionColor.b) * invDepth);
77
- const scatteringCoefficient = new Vector3(babylonMaterial.transmissionScatter.r * invDepth, babylonMaterial.transmissionScatter.g * invDepth, babylonMaterial.transmissionScatter.b * invDepth);
78
- const absorptionCoefficient = extinctionCoefficient.subtract(scatteringCoefficient);
79
- const minCoeff = Math.min(absorptionCoefficient.x, absorptionCoefficient.y, absorptionCoefficient.z);
80
- if (minCoeff < 0.0) {
81
- absorptionCoefficient.subtractInPlace(new Vector3(minCoeff, minCoeff, minCoeff));
82
- // Set extinction coefficient after shifting the absorption to be non-negative.
83
- extinctionCoefficient.copyFrom(absorptionCoefficient).addInPlace(scatteringCoefficient);
83
+ // If both transmission and subsurface volumes exist, combine them.
84
+ let transmissionMultiscatterColor = Vector3.Zero();
85
+ let transmissionScatterAnisotropy = 0;
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));
99
+ transmissionMultiscatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);
100
+ transmissionScatterAnisotropy = babylonMaterial.transmissionScatterAnisotropy;
101
+ }
102
+ const subsurfaceMultiscatterColor = Vector3.Zero();
103
+ let subsurfaceScatterAnisotropy = 0;
104
+ if (babylonMaterial.subsurfaceWeight > 0) {
105
+ subsurfaceMultiscatterColor.set(babylonMaterial.subsurfaceColor.r, babylonMaterial.subsurfaceColor.g, babylonMaterial.subsurfaceColor.b);
106
+ subsurfaceScatterAnisotropy = babylonMaterial.subsurfaceScatterAnisotropy;
84
107
  }
85
- const ssAlbedo = new Vector3(scatteringCoefficient.x / extinctionCoefficient.x, scatteringCoefficient.y / extinctionCoefficient.y, scatteringCoefficient.z / extinctionCoefficient.z);
86
- const multiScatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);
108
+ const subsurfaceFractionOfDielectric = (1.0 - babylonMaterial.transmissionWeight) * babylonMaterial.subsurfaceWeight;
109
+ const subsurfaceAndTransmissionFractionOfDielectric = subsurfaceFractionOfDielectric + babylonMaterial.transmissionWeight;
110
+ const reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric = 1.0 / Math.max(subsurfaceAndTransmissionFractionOfDielectric, 1e-6);
111
+ const transWeight = babylonMaterial.transmissionWeight * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
112
+ const subsurfWeight = subsurfaceFractionOfDielectric * reciprocalOfSubsurfaceAndTransmissionFractionOfDielectric;
113
+ const multiscatterColor = transmissionMultiscatterColor
114
+ .multiplyByFloats(transWeight, transWeight, transWeight)
115
+ .addInPlace(subsurfaceMultiscatterColor.multiplyByFloats(subsurfWeight, subsurfWeight, subsurfWeight));
87
116
  const volumeInfo = {
88
- multiscatterColor: multiScatterColor.asArray(),
89
- scatterAnisotropy: babylonMaterial.transmissionScatterAnisotropy,
117
+ multiscatterColorFactor: multiscatterColor.asArray(),
118
+ scatterAnisotropy: transmissionScatterAnisotropy * transWeight + subsurfaceScatterAnisotropy * subsurfWeight,
90
119
  };
91
- if (babylonMaterial.transmissionScatterTexture) {
120
+ if (babylonMaterial.subsurfaceWeight > 0 && babylonMaterial.subsurfaceColorTexture) {
121
+ this._exporter._materialNeedsUVsSet.add(babylonMaterial);
122
+ const subsurfaceScatterTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.subsurfaceColorTexture);
123
+ if (subsurfaceScatterTexture) {
124
+ volumeInfo.multiscatterColorTexture = subsurfaceScatterTexture;
125
+ }
126
+ }
127
+ else if (babylonMaterial.transmissionWeight > 0 && babylonMaterial.transmissionScatterTexture) {
92
128
  this._exporter._materialNeedsUVsSet.add(babylonMaterial);
93
129
  const transmissionTexture = this._exporter._materialExporter.getTextureInfo(babylonMaterial.transmissionScatterTexture);
94
130
  if (transmissionTexture) {
@@ -97,13 +133,6 @@ export class KHR_materials_volume_scatter {
97
133
  }
98
134
  node.extensions = node.extensions || {};
99
135
  node.extensions[NAME] = volumeInfo;
100
- // Now go back and set the extinction coefficient in the volume info.
101
- if (node.extensions["KHR_materials_volume"]) {
102
- const volumeExt = node.extensions["KHR_materials_volume"];
103
- const maxExtinction = Math.max(extinctionCoefficient.x, extinctionCoefficient.y, extinctionCoefficient.z);
104
- volumeExt.attenuationDistance = 1.0 / Math.max(maxExtinction, 0.0001);
105
- volumeExt.attenuationColor = new Color3(Math.exp(-extinctionCoefficient.x * volumeExt.attenuationDistance), Math.exp(-extinctionCoefficient.y * volumeExt.attenuationDistance), Math.exp(-extinctionCoefficient.z * volumeExt.attenuationDistance)).asArray();
106
- }
107
136
  }
108
137
  resolve(node);
109
138
  });
@@ -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":"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;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,IAAI,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YAChF,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,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;gBACrB,MAAM,QAAQ,GAAG,GAAG,GAAG,eAAe,CAAC,iBAAiB,CAAC;gBACzD,MAAM,qBAAqB,GAAG,IAAI,OAAO,CACrC,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;gBACF,MAAM,qBAAqB,GAAG,IAAI,OAAO,CACrC,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;gBACF,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;gBACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBACrG,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;oBACjB,qBAAqB,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;oBACjF,+EAA+E;oBAC/E,qBAAqB,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;gBAC5F,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,OAAO,CACxB,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,EACjD,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,EACjD,qBAAqB,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CACpD,CAAC;gBACF,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,QAAQ,CAAC,CAAC;gBAEtE,MAAM,UAAU,GAA+B;oBAC3C,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE;oBAC9C,iBAAiB,EAAE,eAAe,CAAC,6BAA6B;iBACnE,CAAC;gBAEF,IAAI,eAAe,CAAC,0BAA0B,EAAE,CAAC;oBAC7C,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;oBACzD,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;gBAEnC,qEAAqE;gBACrE,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;oBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAQ,CAAC;oBACjE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;oBAC1G,SAAS,CAAC,mBAAmB,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;oBACtE,SAAS,CAAC,gBAAgB,GAAG,IAAI,MAAM,CACnC,IAAI,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,GAAG,SAAS,CAAC,mBAAmB,CAAC,EAClE,IAAI,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,GAAG,SAAS,CAAC,mBAAmB,CAAC,EAClE,IAAI,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,GAAG,SAAS,CAAC,mBAAmB,CAAC,CACrE,CAAC,OAAO,EAAE,CAAC;gBAChB,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,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 }\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 if (mat.transmissionWeight == 0 || mat.transmissionScatter.equals(Color3.Black())) {\r\n return false;\r\n }\r\n return true;\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 const invDepth = 1.0 / babylonMaterial.transmissionDepth;\r\n const extinctionCoefficient = 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 scatteringCoefficient = 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 absorptionCoefficient = extinctionCoefficient.subtract(scatteringCoefficient);\r\n const minCoeff = Math.min(absorptionCoefficient.x, absorptionCoefficient.y, absorptionCoefficient.z);\r\n if (minCoeff < 0.0) {\r\n absorptionCoefficient.subtractInPlace(new Vector3(minCoeff, minCoeff, minCoeff));\r\n // Set extinction coefficient after shifting the absorption to be non-negative.\r\n extinctionCoefficient.copyFrom(absorptionCoefficient).addInPlace(scatteringCoefficient);\r\n }\r\n\r\n const ssAlbedo = new Vector3(\r\n scatteringCoefficient.x / extinctionCoefficient.x,\r\n scatteringCoefficient.y / extinctionCoefficient.y,\r\n scatteringCoefficient.z / extinctionCoefficient.z\r\n );\r\n const multiScatterColor = SingleScatterToMultiScatterAlbedo(ssAlbedo);\r\n\r\n const volumeInfo: IKHRMaterialsVolumeScatter = {\r\n multiscatterColor: multiScatterColor.asArray(),\r\n scatterAnisotropy: babylonMaterial.transmissionScatterAnisotropy,\r\n };\r\n\r\n if (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 // Now go back and set the extinction coefficient in the volume info.\r\n if (node.extensions[\"KHR_materials_volume\"]) {\r\n const volumeExt = node.extensions[\"KHR_materials_volume\"] as any;\r\n const maxExtinction = Math.max(extinctionCoefficient.x, extinctionCoefficient.y, extinctionCoefficient.z);\r\n volumeExt.attenuationDistance = 1.0 / Math.max(maxExtinction, 0.0001);\r\n volumeExt.attenuationColor = new Color3(\r\n Math.exp(-extinctionCoefficient.x * volumeExt.attenuationDistance),\r\n Math.exp(-extinctionCoefficient.y * volumeExt.attenuationDistance),\r\n Math.exp(-extinctionCoefficient.z * volumeExt.attenuationDistance)\r\n ).asArray();\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_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":"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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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onerjs/serializers",
3
- "version": "8.46.4",
3
+ "version": "8.46.8",
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
- "@onerjs/core": "8.46.4",
21
+ "@onerjs/core": "8.46.8",
22
22
  "@dev/build-tools": "^1.0.0",
23
23
  "@dev/serializers": "^1.0.0",
24
- "babylonjs-gltf2interface": "^8.46.4"
24
+ "babylonjs-gltf2interface": "^8.46.8"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "@onerjs/core": "^8.0.0",