@babylonjs/serializers 9.0.0 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/3MF/3mfSerializer.js.map +1 -1
  2. package/3MF/core/model/3mf.builder.d.ts +4 -7
  3. package/3MF/core/model/3mf.builder.js +2 -1
  4. package/3MF/core/model/3mf.builder.js.map +1 -1
  5. package/3MF/core/model/3mf.d.ts +1 -2
  6. package/3MF/core/model/3mf.js +1 -1
  7. package/3MF/core/model/3mf.js.map +1 -1
  8. package/3MF/core/model/3mf.opc.d.ts +2 -2
  9. package/3MF/core/model/3mf.opc.interfaces.d.ts +1 -1
  10. package/3MF/core/model/3mf.opc.interfaces.js.map +1 -1
  11. package/3MF/core/model/3mf.opc.js +1 -1
  12. package/3MF/core/model/3mf.opc.js.map +1 -1
  13. package/3MF/core/model/3mf.serializer.d.ts +1 -2
  14. package/3MF/core/model/3mf.serializer.js.map +1 -1
  15. package/3MF/core/xml/xml.builder.bytes.d.ts +1 -1
  16. package/3MF/core/xml/xml.builder.bytes.js.map +1 -1
  17. package/3MF/core/xml/xml.builder.d.ts +1 -1
  18. package/3MF/core/xml/xml.builder.js.map +1 -1
  19. package/3MF/core/xml/xml.builder.string.d.ts +1 -1
  20. package/3MF/core/xml/xml.builder.string.js.map +1 -1
  21. package/3MF/core/xml/xml.interfaces.d.ts +1 -1
  22. package/3MF/core/xml/xml.interfaces.js.map +1 -1
  23. package/3MF/core/xml/xml.serializer.format.d.ts +1 -1
  24. package/3MF/core/xml/xml.serializer.format.js.map +1 -1
  25. package/BVH/bvhSerializer.d.ts +1 -1
  26. package/BVH/bvhSerializer.js.map +1 -1
  27. package/OBJ/objSerializer.d.ts +1 -1
  28. package/OBJ/objSerializer.js.map +1 -1
  29. package/USDZ/usdzExporter.d.ts +2 -2
  30. package/USDZ/usdzExporter.js.map +1 -1
  31. package/exportUtils.d.ts +1 -1
  32. package/exportUtils.js.map +1 -1
  33. package/glTF/2.0/Extensions/EXT_lights_area.d.ts +4 -4
  34. package/glTF/2.0/Extensions/EXT_lights_area.js.map +1 -1
  35. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.d.ts +5 -5
  36. package/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.js.map +1 -1
  37. package/glTF/2.0/Extensions/EXT_texture_avif.d.ts +1 -1
  38. package/glTF/2.0/Extensions/EXT_texture_avif.js.map +1 -1
  39. package/glTF/2.0/Extensions/EXT_texture_webp.d.ts +1 -1
  40. package/glTF/2.0/Extensions/EXT_texture_webp.js.map +1 -1
  41. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.d.ts +3 -3
  42. package/glTF/2.0/Extensions/KHR_draco_mesh_compression.js.map +1 -1
  43. package/glTF/2.0/Extensions/KHR_lights_punctual.d.ts +4 -4
  44. package/glTF/2.0/Extensions/KHR_lights_punctual.js.map +1 -1
  45. package/glTF/2.0/Extensions/KHR_materials_anisotropy.d.ts +4 -4
  46. package/glTF/2.0/Extensions/KHR_materials_anisotropy.js.map +1 -1
  47. package/glTF/2.0/Extensions/KHR_materials_clearcoat.d.ts +4 -4
  48. package/glTF/2.0/Extensions/KHR_materials_clearcoat.js.map +1 -1
  49. package/glTF/2.0/Extensions/KHR_materials_coat.d.ts +4 -4
  50. package/glTF/2.0/Extensions/KHR_materials_coat.js.map +1 -1
  51. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.d.ts +4 -4
  52. package/glTF/2.0/Extensions/KHR_materials_diffuse_roughness.js.map +1 -1
  53. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.d.ts +4 -4
  54. package/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.js.map +1 -1
  55. package/glTF/2.0/Extensions/KHR_materials_dispersion.d.ts +3 -3
  56. package/glTF/2.0/Extensions/KHR_materials_dispersion.js.map +1 -1
  57. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.d.ts +3 -3
  58. package/glTF/2.0/Extensions/KHR_materials_emissive_strength.js.map +1 -1
  59. package/glTF/2.0/Extensions/KHR_materials_fuzz.d.ts +4 -4
  60. package/glTF/2.0/Extensions/KHR_materials_fuzz.js.map +1 -1
  61. package/glTF/2.0/Extensions/KHR_materials_ior.d.ts +3 -3
  62. package/glTF/2.0/Extensions/KHR_materials_ior.js.map +1 -1
  63. package/glTF/2.0/Extensions/KHR_materials_iridescence.d.ts +4 -4
  64. package/glTF/2.0/Extensions/KHR_materials_iridescence.js.map +1 -1
  65. package/glTF/2.0/Extensions/KHR_materials_openpbr.d.ts +3 -3
  66. package/glTF/2.0/Extensions/KHR_materials_openpbr.js.map +1 -1
  67. package/glTF/2.0/Extensions/KHR_materials_sheen.d.ts +4 -4
  68. package/glTF/2.0/Extensions/KHR_materials_sheen.js.map +1 -1
  69. package/glTF/2.0/Extensions/KHR_materials_specular.d.ts +4 -4
  70. package/glTF/2.0/Extensions/KHR_materials_specular.js.map +1 -1
  71. package/glTF/2.0/Extensions/KHR_materials_transmission.d.ts +4 -4
  72. package/glTF/2.0/Extensions/KHR_materials_transmission.js +13 -2
  73. package/glTF/2.0/Extensions/KHR_materials_transmission.js.map +1 -1
  74. package/glTF/2.0/Extensions/KHR_materials_unlit.d.ts +3 -3
  75. package/glTF/2.0/Extensions/KHR_materials_unlit.js.map +1 -1
  76. package/glTF/2.0/Extensions/KHR_materials_volume.d.ts +4 -4
  77. package/glTF/2.0/Extensions/KHR_materials_volume.js +48 -4
  78. package/glTF/2.0/Extensions/KHR_materials_volume.js.map +1 -1
  79. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +4 -4
  80. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js +53 -24
  81. package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +1 -1
  82. package/glTF/2.0/Extensions/KHR_texture_basisu.d.ts +1 -1
  83. package/glTF/2.0/Extensions/KHR_texture_basisu.js.map +1 -1
  84. package/glTF/2.0/Extensions/KHR_texture_transform.d.ts +3 -3
  85. package/glTF/2.0/Extensions/KHR_texture_transform.js.map +1 -1
  86. package/glTF/2.0/bufferManager.d.ts +2 -2
  87. package/glTF/2.0/bufferManager.js.map +1 -1
  88. package/glTF/2.0/dataWriter.d.ts +1 -1
  89. package/glTF/2.0/dataWriter.js.map +1 -1
  90. package/glTF/2.0/glTFAnimation.d.ts +5 -6
  91. package/glTF/2.0/glTFAnimation.js.map +1 -1
  92. package/glTF/2.0/glTFData.js.map +1 -1
  93. package/glTF/2.0/glTFExporter.d.ts +7 -7
  94. package/glTF/2.0/glTFExporter.js.map +1 -1
  95. package/glTF/2.0/glTFExporterExtension.d.ts +8 -8
  96. package/glTF/2.0/glTFExporterExtension.js.map +1 -1
  97. package/glTF/2.0/glTFMaterialExporter.d.ts +5 -5
  98. package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
  99. package/glTF/2.0/glTFMorphTargetsUtilities.d.ts +4 -4
  100. package/glTF/2.0/glTFMorphTargetsUtilities.js.map +1 -1
  101. package/glTF/2.0/glTFSerializer.d.ts +4 -4
  102. package/glTF/2.0/glTFSerializer.js.map +1 -1
  103. package/glTF/2.0/glTFUtilities.d.ts +7 -9
  104. package/glTF/2.0/glTFUtilities.js.map +1 -1
  105. package/legacy/legacy-3mfSerializer.js +3 -3
  106. package/legacy/legacy-3mfSerializer.js.map +1 -1
  107. package/legacy/legacy-bvhSerializer.js +3 -3
  108. package/legacy/legacy-bvhSerializer.js.map +1 -1
  109. package/legacy/legacy-glTF2Serializer.js +5 -4
  110. package/legacy/legacy-glTF2Serializer.js.map +1 -1
  111. package/legacy/legacy-objSerializer.js +3 -3
  112. package/legacy/legacy-objSerializer.js.map +1 -1
  113. package/legacy/legacy-stlSerializer.js +3 -3
  114. package/legacy/legacy-stlSerializer.js.map +1 -1
  115. package/legacy/legacy-usdzSerializer.js +3 -3
  116. package/legacy/legacy-usdzSerializer.js.map +1 -1
  117. package/legacy/legacy.js +0 -1
  118. package/legacy/legacy.js.map +1 -1
  119. package/package.json +6 -6
  120. package/readme.md +10 -16
  121. package/stl/stlSerializer.js.map +1 -1
@@ -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":"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","sourcesContent":["import type { IMaterial, 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,6 @@
1
- import type { IMaterial } from "babylonjs-gltf2interface";
2
- import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
- import type { Material } from "@babylonjs/core/Materials/material.js";
1
+ import { type IMaterial } from "babylonjs-gltf2interface";
2
+ import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
+ import { type Material } from "@babylonjs/core/Materials/material.js";
4
4
  /**
5
5
  * @internal
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_materials_unlit.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_unlit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,qDAAuC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,sDAAwC;AAEnE,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAEnC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,mBAAmB;IAY5B;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,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;gBACzC,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC;YAC1C,CAAC;iBAAM,IAAI,eAAe,YAAY,gBAAgB,EAAE,CAAC;gBACrD,aAAa,GAAG,eAAe,CAAC,eAAe,CAAC;YACpD,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;oBAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;gBACzB,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC","sourcesContent":["import type { IMaterial } 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 { StandardMaterial } from \"core/Materials/standardMaterial\";\r\n\r\nconst NAME = \"KHR_materials_unlit\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_unlit 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 /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public dispose() {}\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 let unlitMaterial = false;\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n unlitMaterial = babylonMaterial.unlit;\r\n } else if (babylonMaterial instanceof StandardMaterial) {\r\n unlitMaterial = babylonMaterial.disableLighting;\r\n }\r\n\r\n if (unlitMaterial) {\r\n this._wasUsed = true;\r\n\r\n if (node.extensions == null) {\r\n node.extensions = {};\r\n }\r\n\r\n node.extensions[NAME] = {};\r\n }\r\n\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, () => new KHR_materials_unlit());\r\n"]}
1
+ {"version":3,"file":"KHR_materials_unlit.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_unlit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,MAAM,IAAI,GAAG,qBAAqB,CAAC;AAEnC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,mBAAmB;IAY5B;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,gBAAgB;IAChB,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAEM,OAAO,KAAI,CAAC;IAEnB,gDAAgD;IACzC,uBAAuB,CAAE,OAAe,EAAE,IAAe,EAAE,eAAyB;QACvF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,IAAI,eAAe,YAAY,WAAW,EAAE,CAAC;gBACzC,aAAa,GAAG,eAAe,CAAC,KAAK,CAAC;YAC1C,CAAC;iBAAM,IAAI,eAAe,YAAY,gBAAgB,EAAE,CAAC;gBACrD,aAAa,GAAG,eAAe,CAAC,eAAe,CAAC;YACpD,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBAErB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;oBAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;gBACzB,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC","sourcesContent":["import { type IMaterial } 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 { StandardMaterial } from \"core/Materials/standardMaterial\";\r\n\r\nconst NAME = \"KHR_materials_unlit\";\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_materials_unlit 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 /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public dispose() {}\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 let unlitMaterial = false;\r\n\r\n if (babylonMaterial instanceof PBRMaterial) {\r\n unlitMaterial = babylonMaterial.unlit;\r\n } else if (babylonMaterial instanceof StandardMaterial) {\r\n unlitMaterial = babylonMaterial.disableLighting;\r\n }\r\n\r\n if (unlitMaterial) {\r\n this._wasUsed = true;\r\n\r\n if (node.extensions == null) {\r\n node.extensions = {};\r\n }\r\n\r\n node.extensions[NAME] = {};\r\n }\r\n\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, () => new KHR_materials_unlit());\r\n"]}
@@ -1,8 +1,8 @@
1
- import type { IMaterial } from "babylonjs-gltf2interface";
2
- import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
1
+ import { type IMaterial } from "babylonjs-gltf2interface";
2
+ import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
3
  import { GLTFExporter } from "../glTFExporter.js";
4
- import type { Material } from "@babylonjs/core/Materials/material.js";
5
- import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
4
+ import { type Material } from "@babylonjs/core/Materials/material.js";
5
+ import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
6
6
  /**
7
7
  * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_volume/README.md)
8
8
  */
@@ -1,6 +1,7 @@
1
1
  import { GLTFExporter } from "../glTFExporter.js";
2
2
  import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial.js";
3
3
  import { Color3 } from "@babylonjs/core/Maths/math.color.js";
4
+ import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
4
5
  import { OpenPBRMaterial } from "@babylonjs/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, 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"]}
@@ -1,8 +1,8 @@
1
- import type { IMaterial } from "babylonjs-gltf2interface";
2
- import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
1
+ import { type IMaterial } from "babylonjs-gltf2interface";
2
+ import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
3
3
  import { GLTFExporter } from "../glTFExporter.js";
4
- import type { Material } from "@babylonjs/core/Materials/material.js";
5
- import type { BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
4
+ import { type Material } from "@babylonjs/core/Materials/material.js";
5
+ import { type BaseTexture } from "@babylonjs/core/Materials/Textures/baseTexture.js";
6
6
  /**
7
7
  * TODO: In-progress specification
8
8
  * [Specification](https://github.com/KhronosGroup/glTF/blob/7ea427ed55d44427e83c0a6d1c87068b1a4151c5/extensions/2.0/Khronos/KHR_materials_volume_scatter/README.md)
@@ -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":"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","sourcesContent":["import type { IMaterial, 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"]}
@@ -1,4 +1,4 @@
1
- import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
1
+ import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
2
2
  import { GLTFExporter } from "../glTFExporter.js";
3
3
  /**
4
4
  * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_basisu/README.md)
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_texture_basisu.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_texture_basisu.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,0CAA4B;AAGlD,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAElC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,kBAAkB;IAS3B,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAID,YAAY,QAAsB;QAdlB,SAAI,GAAG,IAAI,CAAC;QAErB,YAAO,GAAG,IAAI,CAAC;QAEf,aAAQ,GAAG,IAAI,CAAC;QAEf,aAAQ,GAAG,KAAK,CAAC;QASrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEZ,iBAAiB,CAAC,CAAS,EAAE,WAAuC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC;QACjE,IAAI,cAAc,0CAAuB,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,OAAO,CAAC,UAAU,KAAlB,OAAO,CAAC,UAAU,GAAK,EAAE,EAAC;QAC1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YACvB,MAAM,EAAE,UAAU;SACrB,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n/* eslint-disable babylonjs/available */\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\nimport { GLTFExporter } from \"../glTFExporter\";\nimport { GetMimeType } from \"core/Misc/fileTools\";\nimport { ImageMimeType } from \"babylonjs-gltf2interface\";\n\nconst NAME = \"KHR_texture_basisu\";\n\n/**\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_basisu/README.md)\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_texture_basisu implements IGLTFExporterExtensionV2 {\n public readonly name = NAME;\n\n public enabled = true;\n\n public required = true;\n\n private _wasUsed = false;\n\n public get wasUsed() {\n return this._wasUsed;\n }\n\n private _exporter: GLTFExporter;\n\n constructor(exporter: GLTFExporter) {\n this._exporter = exporter;\n }\n\n public dispose() {}\n\n public postExportTexture(_: string, textureInfo: BABYLON.GLTF2.ITextureInfo): void {\n const texture = this._exporter._textures[textureInfo.index];\n const imageIndex = texture.source;\n if (imageIndex === undefined) {\n return;\n }\n\n const image = this._exporter._images[imageIndex];\n const sourceMimeType = image.mimeType || GetMimeType(image.uri!);\n if (sourceMimeType !== ImageMimeType.KTX2) {\n return;\n }\n\n texture.source = undefined;\n texture.extensions ||= {};\n texture.extensions[NAME] = {\n source: imageIndex,\n };\n\n this._wasUsed = true;\n }\n}\n\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_texture_basisu(exporter));\n"]}
1
+ {"version":3,"file":"KHR_texture_basisu.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_texture_basisu.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAElC;;GAEG;AACH,gEAAgE;AAChE,MAAM,OAAO,kBAAkB;IAS3B,IAAW,OAAO;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAID,YAAY,QAAsB;QAdlB,SAAI,GAAG,IAAI,CAAC;QAErB,YAAO,GAAG,IAAI,CAAC;QAEf,aAAQ,GAAG,IAAI,CAAC;QAEf,aAAQ,GAAG,KAAK,CAAC;QASrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAEM,OAAO,KAAI,CAAC;IAEZ,iBAAiB,CAAC,CAAS,EAAE,WAAuC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,CAAC,GAAI,CAAC,CAAC;QACjE,IAAI,cAAc,0CAAuB,EAAE,CAAC;YACxC,OAAO;QACX,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;QAC3B,OAAO,CAAC,UAAU,KAAlB,OAAO,CAAC,UAAU,GAAK,EAAE,EAAC;QAC1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;YACvB,MAAM,EAAE,UAAU;SACrB,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable jsdoc/require-jsdoc */\n/* eslint-disable babylonjs/available */\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\nimport { GLTFExporter } from \"../glTFExporter\";\nimport { GetMimeType } from \"core/Misc/fileTools\";\nimport { ImageMimeType } from \"babylonjs-gltf2interface\";\n\nconst NAME = \"KHR_texture_basisu\";\n\n/**\n * [Specification](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_texture_basisu/README.md)\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class KHR_texture_basisu implements IGLTFExporterExtensionV2 {\n public readonly name = NAME;\n\n public enabled = true;\n\n public required = true;\n\n private _wasUsed = false;\n\n public get wasUsed() {\n return this._wasUsed;\n }\n\n private _exporter: GLTFExporter;\n\n constructor(exporter: GLTFExporter) {\n this._exporter = exporter;\n }\n\n public dispose() {}\n\n public postExportTexture(_: string, textureInfo: BABYLON.GLTF2.ITextureInfo): void {\n const texture = this._exporter._textures[textureInfo.index];\n const imageIndex = texture.source;\n if (imageIndex === undefined) {\n return;\n }\n\n const image = this._exporter._images[imageIndex];\n const sourceMimeType = image.mimeType || GetMimeType(image.uri!);\n if (sourceMimeType !== ImageMimeType.KTX2) {\n return;\n }\n\n texture.source = undefined;\n texture.extensions ||= {};\n texture.extensions[NAME] = {\n source: imageIndex,\n };\n\n this._wasUsed = true;\n }\n}\n\nGLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_texture_basisu(exporter));\n"]}
@@ -1,6 +1,6 @@
1
- import type { ITextureInfo } from "babylonjs-gltf2interface";
2
- import type { Texture } from "@babylonjs/core/Materials/Textures/texture.js";
3
- import type { IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
1
+ import { type ITextureInfo } from "babylonjs-gltf2interface";
2
+ import { type Texture } from "@babylonjs/core/Materials/Textures/texture.js";
3
+ import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
4
4
  /**
5
5
  * @internal
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"KHR_texture_transform.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_texture_transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ITextureInfo, IKHRTextureTransform } from \"babylonjs-gltf2interface\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport type { Texture } from \"core/Materials/Textures/texture\";\r\nimport type { IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\n\r\nconst NAME = \"KHR_texture_transform\";\r\n\r\n/**\r\n * Computes the adjusted offset for a rotation centered about the origin.\r\n * @internal\r\n */\r\nfunction AdjustOffsetForRotationCenter(babylonTexture: Texture): [number, number] {\r\n const { uOffset, vOffset, uRotationCenter, vRotationCenter, uScale, vScale, wAng } = babylonTexture;\r\n const cosAngle = Math.cos(wAng);\r\n const sinAngle = Math.sin(wAng);\r\n const scaledURotationCenter = uRotationCenter * uScale;\r\n const scaledVRotationCenter = vRotationCenter * vScale;\r\n const deltaU = scaledURotationCenter * (1 - cosAngle) + scaledVRotationCenter * sinAngle;\r\n const deltaV = scaledVRotationCenter * (1 - cosAngle) - scaledURotationCenter * sinAngle;\r\n return [uOffset + deltaU, vOffset + deltaV];\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_texture_transform 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 /** Reference to the glTF exporter */\r\n private _wasUsed = false;\r\n\r\n constructor() {}\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 public postExportTexture?(context: string, textureInfo: ITextureInfo, babylonTexture: Texture): void {\r\n const scene = babylonTexture.getScene();\r\n if (!scene) {\r\n Tools.Warn(`${context}: \"scene\" is not defined for Babylon texture ${babylonTexture.name}!`);\r\n }\r\n\r\n /*\r\n * The KHR_texture_transform schema only supports w rotation around the origin.\r\n * See https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates.\r\n */\r\n if (babylonTexture.uAng !== 0 || babylonTexture.vAng !== 0) {\r\n Tools.Warn(`${context}: Texture ${babylonTexture.name} with rotation in the u or v axis is not supported in glTF.`);\r\n // Usually, we'd always early return here if the texture uses an unsupported combination of transform properties,\r\n // but we're making an exception here to maintain backwards compatibility.\r\n if (babylonTexture.uRotationCenter !== 0 || babylonTexture.vRotationCenter !== 0) {\r\n return;\r\n }\r\n }\r\n\r\n const textureTransform: IKHRTextureTransform = {};\r\n let transformIsRequired = false;\r\n\r\n if (babylonTexture.uOffset !== 0 || babylonTexture.vOffset !== 0) {\r\n textureTransform.offset = [babylonTexture.uOffset, babylonTexture.vOffset];\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.uScale !== 1 || babylonTexture.vScale !== 1) {\r\n textureTransform.scale = [babylonTexture.uScale, babylonTexture.vScale];\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.wAng !== 0) {\r\n if (babylonTexture.uRotationCenter !== 0 || babylonTexture.vRotationCenter !== 0) {\r\n // See https://github.com/mrdoob/three.js/issues/15831 for more details.\r\n if (babylonTexture.homogeneousRotationInUVTransform && babylonTexture.uScale !== babylonTexture.vScale) {\r\n Tools.Warn(\r\n `${context}: Texture ${babylonTexture.name} with homogenousRotationInUVTransform, non-uniform scaling, and non-zero rotation cannot be exported with ${NAME}.`\r\n );\r\n return;\r\n }\r\n Tools.Warn(`${context}: Texture ${babylonTexture.name} with non-origin rotation center will be exported using an adjusted offset with ${NAME}.`);\r\n textureTransform.offset = AdjustOffsetForRotationCenter(babylonTexture);\r\n }\r\n textureTransform.rotation = -babylonTexture.wAng;\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.coordinatesIndex !== 0) {\r\n textureTransform.texCoord = babylonTexture.coordinatesIndex;\r\n transformIsRequired = true;\r\n }\r\n\r\n if (!transformIsRequired) {\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n if (!textureInfo.extensions) {\r\n textureInfo.extensions = {};\r\n }\r\n textureInfo.extensions[NAME] = textureTransform;\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, () => new KHR_texture_transform());\r\n"]}
1
+ {"version":3,"file":"KHR_texture_transform.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_texture_transform.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ITextureInfo, type IKHRTextureTransform } from \"babylonjs-gltf2interface\";\r\nimport { Tools } from \"core/Misc/tools\";\r\nimport { type Texture } from \"core/Materials/Textures/texture\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\n\r\nconst NAME = \"KHR_texture_transform\";\r\n\r\n/**\r\n * Computes the adjusted offset for a rotation centered about the origin.\r\n * @internal\r\n */\r\nfunction AdjustOffsetForRotationCenter(babylonTexture: Texture): [number, number] {\r\n const { uOffset, vOffset, uRotationCenter, vRotationCenter, uScale, vScale, wAng } = babylonTexture;\r\n const cosAngle = Math.cos(wAng);\r\n const sinAngle = Math.sin(wAng);\r\n const scaledURotationCenter = uRotationCenter * uScale;\r\n const scaledVRotationCenter = vRotationCenter * vScale;\r\n const deltaU = scaledURotationCenter * (1 - cosAngle) + scaledVRotationCenter * sinAngle;\r\n const deltaV = scaledVRotationCenter * (1 - cosAngle) - scaledURotationCenter * sinAngle;\r\n return [uOffset + deltaU, vOffset + deltaV];\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport class KHR_texture_transform 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 /** Reference to the glTF exporter */\r\n private _wasUsed = false;\r\n\r\n constructor() {}\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 public postExportTexture?(context: string, textureInfo: ITextureInfo, babylonTexture: Texture): void {\r\n const scene = babylonTexture.getScene();\r\n if (!scene) {\r\n Tools.Warn(`${context}: \"scene\" is not defined for Babylon texture ${babylonTexture.name}!`);\r\n }\r\n\r\n /*\r\n * The KHR_texture_transform schema only supports w rotation around the origin.\r\n * See https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform#gltf-schema-updates.\r\n */\r\n if (babylonTexture.uAng !== 0 || babylonTexture.vAng !== 0) {\r\n Tools.Warn(`${context}: Texture ${babylonTexture.name} with rotation in the u or v axis is not supported in glTF.`);\r\n // Usually, we'd always early return here if the texture uses an unsupported combination of transform properties,\r\n // but we're making an exception here to maintain backwards compatibility.\r\n if (babylonTexture.uRotationCenter !== 0 || babylonTexture.vRotationCenter !== 0) {\r\n return;\r\n }\r\n }\r\n\r\n const textureTransform: IKHRTextureTransform = {};\r\n let transformIsRequired = false;\r\n\r\n if (babylonTexture.uOffset !== 0 || babylonTexture.vOffset !== 0) {\r\n textureTransform.offset = [babylonTexture.uOffset, babylonTexture.vOffset];\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.uScale !== 1 || babylonTexture.vScale !== 1) {\r\n textureTransform.scale = [babylonTexture.uScale, babylonTexture.vScale];\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.wAng !== 0) {\r\n if (babylonTexture.uRotationCenter !== 0 || babylonTexture.vRotationCenter !== 0) {\r\n // See https://github.com/mrdoob/three.js/issues/15831 for more details.\r\n if (babylonTexture.homogeneousRotationInUVTransform && babylonTexture.uScale !== babylonTexture.vScale) {\r\n Tools.Warn(\r\n `${context}: Texture ${babylonTexture.name} with homogenousRotationInUVTransform, non-uniform scaling, and non-zero rotation cannot be exported with ${NAME}.`\r\n );\r\n return;\r\n }\r\n Tools.Warn(`${context}: Texture ${babylonTexture.name} with non-origin rotation center will be exported using an adjusted offset with ${NAME}.`);\r\n textureTransform.offset = AdjustOffsetForRotationCenter(babylonTexture);\r\n }\r\n textureTransform.rotation = -babylonTexture.wAng;\r\n transformIsRequired = true;\r\n }\r\n\r\n if (babylonTexture.coordinatesIndex !== 0) {\r\n textureTransform.texCoord = babylonTexture.coordinatesIndex;\r\n transformIsRequired = true;\r\n }\r\n\r\n if (!transformIsRequired) {\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n if (!textureInfo.extensions) {\r\n textureInfo.extensions = {};\r\n }\r\n textureInfo.extensions[NAME] = textureTransform;\r\n }\r\n}\r\n\r\nGLTFExporter.RegisterExtension(NAME, () => new KHR_texture_transform());\r\n"]}
@@ -1,5 +1,5 @@
1
- import type { TypedArray } from "@babylonjs/core/types.js";
2
- import type { AccessorComponentType, AccessorType, IAccessor, IBufferView } from "babylonjs-gltf2interface";
1
+ import { type TypedArray } from "@babylonjs/core/types.js";
2
+ import { type AccessorComponentType, type AccessorType, type IAccessor, type IBufferView } from "babylonjs-gltf2interface";
3
3
  type TypedArrayForglTF = Exclude<TypedArray, Float64Array | BigInt64Array | BigUint64Array>;
4
4
  interface IPropertyWithBufferView {
5
5
  bufferView?: number;