@onerjs/serializers 9.0.2 → 9.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js +12 -10
- package/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js +11 -9
- package/glTF/2.0/Extensions/KHR_materials_coat.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_scatter.d.ts +5 -0
- package/glTF/2.0/Extensions/KHR_materials_scatter.js +8 -0
- package/glTF/2.0/Extensions/KHR_materials_scatter.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_scatter.pure.d.ts +120 -0
- package/glTF/2.0/Extensions/KHR_materials_scatter.pure.js +396 -0
- package/glTF/2.0/Extensions/KHR_materials_scatter.pure.js.map +1 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.d.ts +2 -0
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js +141 -39
- package/glTF/2.0/Extensions/KHR_materials_transmission.pure.js.map +1 -1
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js +2 -48
- package/glTF/2.0/Extensions/KHR_materials_volume.pure.js.map +1 -1
- package/glTF/2.0/Extensions/index.d.ts +1 -1
- package/glTF/2.0/Extensions/index.js +1 -1
- package/glTF/2.0/Extensions/index.js.map +1 -1
- package/glTF/2.0/Extensions/pure.d.ts +1 -1
- package/glTF/2.0/Extensions/pure.js +1 -1
- package/glTF/2.0/Extensions/pure.js.map +1 -1
- package/glTF/2.0/glTFExporter.d.ts +6 -0
- package/glTF/2.0/glTFExporter.js +9 -0
- package/glTF/2.0/glTFExporter.js.map +1 -1
- package/glTF/2.0/glTFMaterialExporter.d.ts +2 -1
- package/glTF/2.0/glTFMaterialExporter.js +68 -31
- package/glTF/2.0/glTFMaterialExporter.js.map +1 -1
- package/glTF/2.0/glTFUtilities.d.ts +37 -1
- package/glTF/2.0/glTFUtilities.js +99 -0
- package/glTF/2.0/glTFUtilities.js.map +1 -1
- package/package.json +2 -2
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.d.ts +0 -5
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js +0 -8
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.js.map +0 -1
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.d.ts +0 -45
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js +0 -145
- package/glTF/2.0/Extensions/KHR_materials_volume_scatter.pure.js.map +0 -1
|
@@ -2,6 +2,7 @@ import { GLTFExporter } from "../glTFExporter.js";
|
|
|
2
2
|
import { PBRBaseMaterial } from "@onerjs/core/Materials/PBR/pbrBaseMaterial.pure.js";
|
|
3
3
|
import { OpenPBRMaterial } from "@onerjs/core/Materials/PBR/openpbrMaterial.pure.js";
|
|
4
4
|
import { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from "@onerjs/core/Materials/Textures/textureMerger.js";
|
|
5
|
+
import { GetSampledTextureKey } from "../glTFUtilities.js";
|
|
5
6
|
const NAME = "KHR_materials_anisotropy";
|
|
6
7
|
// Convert OpenPBR anisotropy values to glTF-compatible values
|
|
7
8
|
function OpenpbrAnisotropyStrengthToGltf(baseRoughness, anisotropy) {
|
|
@@ -13,17 +14,15 @@ function OpenpbrAnisotropyStrengthToGltf(baseRoughness, anisotropy) {
|
|
|
13
14
|
return { newBaseRoughness, newAnisotropyStrength };
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
|
-
* Generate a unique ID for the merged anisotropy textures based on the internal texture data.
|
|
17
|
+
* Generate a unique ID for the merged anisotropy textures based on the internal texture data and sampling state.
|
|
17
18
|
* This is used for caching merged textures.
|
|
18
19
|
* @param babylonMaterial Source OpenPBR material
|
|
19
20
|
* @returns A unique ID string for the merged anisotropy textures
|
|
20
21
|
* @internal
|
|
21
22
|
*/
|
|
22
23
|
function GetAnisoTextureId(babylonMaterial) {
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const strengthId = anisoStrengthTexture && anisoStrengthTexture.getInternalTexture() ? anisoStrengthTexture.getInternalTexture().uniqueId : "NoStrength";
|
|
26
|
-
const tangentId = tangentTexture && tangentTexture.getInternalTexture() ? tangentTexture.getInternalTexture().uniqueId : "NoTangent";
|
|
24
|
+
const strengthId = GetSampledTextureKey(babylonMaterial.specularRoughnessAnisotropyTexture, "NoStrength");
|
|
25
|
+
const tangentId = GetSampledTextureKey(babylonMaterial.geometryTangentTexture, "NoTangent");
|
|
27
26
|
return `${strengthId}_${tangentId}`;
|
|
28
27
|
}
|
|
29
28
|
// In your postExportMaterialAsync method:
|
|
@@ -35,10 +34,13 @@ async function CreateMergedAnisotropyTexture(babylonMaterial) {
|
|
|
35
34
|
if (!(anisoStrengthTexture || tangentTexture)) {
|
|
36
35
|
return null;
|
|
37
36
|
}
|
|
38
|
-
return await MergeTexturesAsync("AnisotropyTexture",
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
return await MergeTexturesAsync("AnisotropyTexture", {
|
|
38
|
+
...CreateRGBAConfiguration(tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel
|
|
39
|
+
tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel
|
|
40
|
+
anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel
|
|
41
|
+
),
|
|
42
|
+
sharedSampling: true,
|
|
43
|
+
}, scene);
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
44
46
|
* @internal
|
|
@@ -130,7 +132,7 @@ export class KHR_materials_anisotropy {
|
|
|
130
132
|
if (babylonMaterial._useRoughnessFromMetallicTextureGreen) {
|
|
131
133
|
roughnessTexture = babylonMaterial.baseMetalnessTexture;
|
|
132
134
|
}
|
|
133
|
-
const mergedAnisoTexture = this._anisoTexturesMap[babylonMaterial
|
|
135
|
+
const mergedAnisoTexture = this._anisoTexturesMap[GetAnisoTextureId(babylonMaterial)];
|
|
134
136
|
// If no textures are being used, we'll always output glTF-style anisotropy.
|
|
135
137
|
// If using OpenPBR anisotropy, convert the constants. Otherwise, just export what we have.
|
|
136
138
|
if (!roughnessTexture && !mergedAnisoTexture) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_materials_anisotropy.pure.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsAnisotropy } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial.pure\";\r\nimport { type ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\n\r\nconst NAME = \"KHR_materials_anisotropy\";\r\n\r\n// Convert OpenPBR anisotropy values to glTF-compatible values\r\nfunction OpenpbrAnisotropyStrengthToGltf(baseRoughness: number, anisotropy: number) {\r\n const baseAlpha = baseRoughness * baseRoughness;\r\n const roughnessT = baseAlpha * Math.sqrt(2.0 / (1.0 + (1 - anisotropy) * (1 - anisotropy)));\r\n const roughnessB = (1 - anisotropy) * roughnessT;\r\n const newBaseRoughness = Math.sqrt(roughnessB);\r\n const newAnisotropyStrength = Math.min(Math.sqrt((roughnessT - baseAlpha) / Math.max(1.0 - baseAlpha, 0.0001)), 1.0);\r\n\r\n return { newBaseRoughness, newAnisotropyStrength };\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged anisotropy textures based on the internal texture data.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged anisotropy textures\r\n * @internal\r\n */\r\nfunction GetAnisoTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.specularRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryTangentTexture;\r\n const strengthId = anisoStrengthTexture && anisoStrengthTexture.getInternalTexture() ? anisoStrengthTexture!.getInternalTexture()!.uniqueId : \"NoStrength\";\r\n const tangentId = tangentTexture && tangentTexture.getInternalTexture() ? tangentTexture!.getInternalTexture()!.uniqueId : \"NoTangent\";\r\n return `${strengthId}_${tangentId}`;\r\n}\r\n\r\n// In your postExportMaterialAsync method:\r\nasync function CreateMergedAnisotropyTexture(babylonMaterial: OpenPBRMaterial): Promise<Nullable<ProceduralTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.specularRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryTangentTexture;\r\n\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(anisoStrengthTexture || tangentTexture)) {\r\n return null;\r\n }\r\n\r\n return await MergeTexturesAsync(\r\n \"AnisotropyTexture\",\r\n CreateRGBAConfiguration(\r\n tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel\r\n tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel\r\n anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel\r\n ),\r\n scene\r\n );\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_materials_anisotropy 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 private _anisoTexturesMap: Record<string, ProceduralTexture> = {};\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 the 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 if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.anisotropy.isEnabled && !babylonMaterial.anisotropy.legacy) {\r\n if (babylonMaterial.anisotropy.texture) {\r\n additionalTextures.push(babylonMaterial.anisotropy.texture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.specularRoughnessAnisotropy > 0) {\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n if (this._anisoTexturesMap[texId]) {\r\n additionalTextures.push(this._anisoTexturesMap[texId]);\r\n } else {\r\n const anisoTexture = await CreateMergedAnisotropyTexture(babylonMaterial);\r\n if (anisoTexture) {\r\n additionalTextures.push(anisoTexture);\r\n this._anisoTexturesMap[texId] = anisoTexture;\r\n }\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\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 PBRBaseMaterial) {\r\n if (!babylonMaterial.anisotropy.isEnabled || babylonMaterial.anisotropy.legacy) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const anisotropyTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.anisotropy.texture);\r\n\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: babylonMaterial.anisotropy.intensity,\r\n anisotropyRotation: babylonMaterial.anisotropy.angle,\r\n anisotropyTexture: anisotropyTextureInfo ?? undefined,\r\n };\r\n\r\n if (anisotropyInfo.anisotropyTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = anisotropyInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.specularRoughnessAnisotropy > 0) {\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n // Check if we can convert from OpenPBR anisotropy to glTF anisotropy\r\n // Conversion involves both specular roughness and anisotropic roughness changes so,\r\n // if there are textures for either, we can't reliably convert due to there potentially\r\n // being different mappings between the textures.\r\n let roughnessTexture: Nullable<BaseTexture> = babylonMaterial.specularRoughnessTexture;\r\n if (babylonMaterial._useRoughnessFromMetallicTextureGreen) {\r\n roughnessTexture = babylonMaterial.baseMetalnessTexture;\r\n }\r\n const mergedAnisoTexture = this._anisoTexturesMap[babylonMaterial.id];\r\n\r\n // If no textures are being used, we'll always output glTF-style anisotropy.\r\n // If using OpenPBR anisotropy, convert the constants. Otherwise, just export what we have.\r\n if (!roughnessTexture && !mergedAnisoTexture) {\r\n // Convert constants\r\n let newBaseRoughness = babylonMaterial.specularRoughness;\r\n let newAnisotropyStrength = babylonMaterial.specularRoughnessAnisotropy;\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n const newParams = OpenpbrAnisotropyStrengthToGltf(babylonMaterial.specularRoughness, babylonMaterial.specularRoughnessAnisotropy);\r\n newBaseRoughness = newParams.newBaseRoughness;\r\n newAnisotropyStrength = newParams.newAnisotropyStrength;\r\n }\r\n if (node.pbrMetallicRoughness) {\r\n node.pbrMetallicRoughness.roughnessFactor = newBaseRoughness;\r\n }\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: newAnisotropyStrength,\r\n anisotropyRotation: babylonMaterial.geometryTangentAngle + Math.PI * 0.5,\r\n anisotropyTexture: undefined,\r\n };\r\n node.extensions[NAME] = anisotropyInfo;\r\n return resolve(node);\r\n }\r\n\r\n const mergedAnisoTextureInfo = mergedAnisoTexture ? this._exporter._materialExporter.getTextureInfo(mergedAnisoTexture) : null;\r\n\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: babylonMaterial.specularRoughnessAnisotropy,\r\n anisotropyRotation: babylonMaterial.geometryTangentAngle,\r\n anisotropyTexture: mergedAnisoTextureInfo ? mergedAnisoTextureInfo : undefined,\r\n extensions: {},\r\n };\r\n\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n // Enable OpenPBR extension on this material.\r\n node.extensions![\"KHR_materials_openpbr\"] = {};\r\n this._exporter._glTF.extensionsUsed ||= [];\r\n if (this._exporter._glTF.extensionsUsed.indexOf(\"KHR_materials_openpbr\") === -1) {\r\n this._exporter._glTF.extensionsUsed.push(\"KHR_materials_openpbr\");\r\n }\r\n }\r\n\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n\r\n node.extensions[NAME] = anisotropyInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_materials_anisotropy glTF serializer extension with the {@link GLTFExporter}.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_materials_anisotropy(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_anisotropy(exporter));\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"KHR_materials_anisotropy.pure.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_anisotropy.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsAnisotropy } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial.pure\";\r\nimport { type ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\nimport { GetSampledTextureKey } from \"../glTFUtilities\";\r\n\r\nconst NAME = \"KHR_materials_anisotropy\";\r\n\r\n// Convert OpenPBR anisotropy values to glTF-compatible values\r\nfunction OpenpbrAnisotropyStrengthToGltf(baseRoughness: number, anisotropy: number) {\r\n const baseAlpha = baseRoughness * baseRoughness;\r\n const roughnessT = baseAlpha * Math.sqrt(2.0 / (1.0 + (1 - anisotropy) * (1 - anisotropy)));\r\n const roughnessB = (1 - anisotropy) * roughnessT;\r\n const newBaseRoughness = Math.sqrt(roughnessB);\r\n const newAnisotropyStrength = Math.min(Math.sqrt((roughnessT - baseAlpha) / Math.max(1.0 - baseAlpha, 0.0001)), 1.0);\r\n\r\n return { newBaseRoughness, newAnisotropyStrength };\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged anisotropy textures based on the internal texture data and sampling state.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged anisotropy textures\r\n * @internal\r\n */\r\nfunction GetAnisoTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const strengthId = GetSampledTextureKey(babylonMaterial.specularRoughnessAnisotropyTexture, \"NoStrength\");\r\n const tangentId = GetSampledTextureKey(babylonMaterial.geometryTangentTexture, \"NoTangent\");\r\n return `${strengthId}_${tangentId}`;\r\n}\r\n\r\n// In your postExportMaterialAsync method:\r\nasync function CreateMergedAnisotropyTexture(babylonMaterial: OpenPBRMaterial): Promise<Nullable<ProceduralTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.specularRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryTangentTexture;\r\n\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(anisoStrengthTexture || tangentTexture)) {\r\n return null;\r\n }\r\n\r\n return await MergeTexturesAsync(\r\n \"AnisotropyTexture\",\r\n {\r\n ...CreateRGBAConfiguration(\r\n tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel\r\n tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel\r\n anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel\r\n ),\r\n sharedSampling: true,\r\n },\r\n scene\r\n );\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_materials_anisotropy 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 private _anisoTexturesMap: Record<string, ProceduralTexture> = {};\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 the 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 if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.anisotropy.isEnabled && !babylonMaterial.anisotropy.legacy) {\r\n if (babylonMaterial.anisotropy.texture) {\r\n additionalTextures.push(babylonMaterial.anisotropy.texture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.specularRoughnessAnisotropy > 0) {\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n if (this._anisoTexturesMap[texId]) {\r\n additionalTextures.push(this._anisoTexturesMap[texId]);\r\n } else {\r\n const anisoTexture = await CreateMergedAnisotropyTexture(babylonMaterial);\r\n if (anisoTexture) {\r\n additionalTextures.push(anisoTexture);\r\n this._anisoTexturesMap[texId] = anisoTexture;\r\n }\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\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 PBRBaseMaterial) {\r\n if (!babylonMaterial.anisotropy.isEnabled || babylonMaterial.anisotropy.legacy) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const anisotropyTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.anisotropy.texture);\r\n\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: babylonMaterial.anisotropy.intensity,\r\n anisotropyRotation: babylonMaterial.anisotropy.angle,\r\n anisotropyTexture: anisotropyTextureInfo ?? undefined,\r\n };\r\n\r\n if (anisotropyInfo.anisotropyTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = anisotropyInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.specularRoughnessAnisotropy > 0) {\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n // Check if we can convert from OpenPBR anisotropy to glTF anisotropy\r\n // Conversion involves both specular roughness and anisotropic roughness changes so,\r\n // if there are textures for either, we can't reliably convert due to there potentially\r\n // being different mappings between the textures.\r\n let roughnessTexture: Nullable<BaseTexture> = babylonMaterial.specularRoughnessTexture;\r\n if (babylonMaterial._useRoughnessFromMetallicTextureGreen) {\r\n roughnessTexture = babylonMaterial.baseMetalnessTexture;\r\n }\r\n const mergedAnisoTexture = this._anisoTexturesMap[GetAnisoTextureId(babylonMaterial)];\r\n\r\n // If no textures are being used, we'll always output glTF-style anisotropy.\r\n // If using OpenPBR anisotropy, convert the constants. Otherwise, just export what we have.\r\n if (!roughnessTexture && !mergedAnisoTexture) {\r\n // Convert constants\r\n let newBaseRoughness = babylonMaterial.specularRoughness;\r\n let newAnisotropyStrength = babylonMaterial.specularRoughnessAnisotropy;\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n const newParams = OpenpbrAnisotropyStrengthToGltf(babylonMaterial.specularRoughness, babylonMaterial.specularRoughnessAnisotropy);\r\n newBaseRoughness = newParams.newBaseRoughness;\r\n newAnisotropyStrength = newParams.newAnisotropyStrength;\r\n }\r\n if (node.pbrMetallicRoughness) {\r\n node.pbrMetallicRoughness.roughnessFactor = newBaseRoughness;\r\n }\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: newAnisotropyStrength,\r\n anisotropyRotation: babylonMaterial.geometryTangentAngle + Math.PI * 0.5,\r\n anisotropyTexture: undefined,\r\n };\r\n node.extensions[NAME] = anisotropyInfo;\r\n return resolve(node);\r\n }\r\n\r\n const mergedAnisoTextureInfo = mergedAnisoTexture ? this._exporter._materialExporter.getTextureInfo(mergedAnisoTexture) : null;\r\n\r\n const anisotropyInfo: IKHRMaterialsAnisotropy = {\r\n anisotropyStrength: babylonMaterial.specularRoughnessAnisotropy,\r\n anisotropyRotation: babylonMaterial.geometryTangentAngle,\r\n anisotropyTexture: mergedAnisoTextureInfo ? mergedAnisoTextureInfo : undefined,\r\n extensions: {},\r\n };\r\n\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n // Enable OpenPBR extension on this material.\r\n node.extensions![\"KHR_materials_openpbr\"] = {};\r\n this._exporter._glTF.extensionsUsed ||= [];\r\n if (this._exporter._glTF.extensionsUsed.indexOf(\"KHR_materials_openpbr\") === -1) {\r\n this._exporter._glTF.extensionsUsed.push(\"KHR_materials_openpbr\");\r\n }\r\n }\r\n\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n\r\n node.extensions[NAME] = anisotropyInfo;\r\n }\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_materials_anisotropy glTF serializer extension with the {@link GLTFExporter}.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_materials_anisotropy(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_anisotropy(exporter));\r\n}\r\n"]}
|
|
@@ -3,6 +3,7 @@ import { PBRBaseMaterial } from "@onerjs/core/Materials/PBR/pbrBaseMaterial.pure
|
|
|
3
3
|
import { OpenPBRMaterial } from "@onerjs/core/Materials/PBR/openpbrMaterial.pure.js";
|
|
4
4
|
import { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from "@onerjs/core/Materials/Textures/textureMerger.js";
|
|
5
5
|
import { Texture } from "@onerjs/core/Materials/Textures/texture.pure.js";
|
|
6
|
+
import { GetSampledTextureKey } from "../glTFUtilities.js";
|
|
6
7
|
const NAME = "KHR_materials_coat";
|
|
7
8
|
// Convert OpenPBR anisotropy values to glTF-compatible values
|
|
8
9
|
function OpenpbrAnisotropyStrengthToGltf(baseRoughness, anisotropy) {
|
|
@@ -14,17 +15,15 @@ function OpenpbrAnisotropyStrengthToGltf(baseRoughness, anisotropy) {
|
|
|
14
15
|
return { newBaseRoughness, newAnisotropyStrength };
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
|
-
* Generate a unique ID for the merged anisotropy textures based on the internal texture data.
|
|
18
|
+
* Generate a unique ID for the merged anisotropy textures based on the internal texture data and sampling state.
|
|
18
19
|
* This is used for caching merged textures.
|
|
19
20
|
* @param babylonMaterial Source OpenPBR material
|
|
20
21
|
* @returns A unique ID string for the merged anisotropy textures
|
|
21
22
|
* @internal
|
|
22
23
|
*/
|
|
23
24
|
function GetAnisoTextureId(babylonMaterial) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const strengthId = anisoStrengthTexture && anisoStrengthTexture.getInternalTexture() ? anisoStrengthTexture.getInternalTexture().uniqueId : "NoStrength";
|
|
27
|
-
const tangentId = tangentTexture && tangentTexture.getInternalTexture() ? tangentTexture.getInternalTexture().uniqueId : "NoTangent";
|
|
25
|
+
const strengthId = GetSampledTextureKey(babylonMaterial.coatRoughnessAnisotropyTexture, "NoStrength");
|
|
26
|
+
const tangentId = GetSampledTextureKey(babylonMaterial.geometryCoatTangentTexture, "NoTangent");
|
|
28
27
|
return `${strengthId}_${tangentId}`;
|
|
29
28
|
}
|
|
30
29
|
/**
|
|
@@ -55,10 +54,13 @@ async function CreateMergedAnisotropyTexture(babylonMaterial) {
|
|
|
55
54
|
if (!(anisoStrengthTexture || tangentTexture)) {
|
|
56
55
|
return null;
|
|
57
56
|
}
|
|
58
|
-
return await MergeTexturesAsync("AnisotropyTexture",
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
57
|
+
return await MergeTexturesAsync("AnisotropyTexture", {
|
|
58
|
+
...CreateRGBAConfiguration(tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel
|
|
59
|
+
tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel
|
|
60
|
+
anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel
|
|
61
|
+
),
|
|
62
|
+
sharedSampling: true,
|
|
63
|
+
}, scene);
|
|
62
64
|
}
|
|
63
65
|
/**
|
|
64
66
|
* Using the coat weight and coat roughness textures, create a merged internal texture that can be used
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KHR_materials_coat.pure.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_coat.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsCoat } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial.pure\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\nimport { Texture } from \"core/Materials/Textures/texture.pure\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\n\r\nconst NAME = \"KHR_materials_coat\";\r\n\r\n// Convert OpenPBR anisotropy values to glTF-compatible values\r\nfunction OpenpbrAnisotropyStrengthToGltf(baseRoughness: number, anisotropy: number) {\r\n const baseAlpha = baseRoughness * baseRoughness;\r\n const roughnessT = baseAlpha * Math.sqrt(2.0 / (1.0 + (1 - anisotropy) * (1 - anisotropy)));\r\n const roughnessB = (1 - anisotropy) * roughnessT;\r\n const newBaseRoughness = Math.sqrt(roughnessB);\r\n const newAnisotropyStrength = Math.min(Math.sqrt((roughnessT - baseAlpha) / Math.max(1.0 - baseAlpha, 0.0001)), 1.0);\r\n\r\n return { newBaseRoughness, newAnisotropyStrength };\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged anisotropy textures based on the internal texture data.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged anisotropy textures\r\n * @internal\r\n */\r\nfunction GetAnisoTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryCoatTangentTexture;\r\n const strengthId = anisoStrengthTexture && anisoStrengthTexture.getInternalTexture() ? anisoStrengthTexture!.getInternalTexture()!.uniqueId : \"NoStrength\";\r\n const tangentId = tangentTexture && tangentTexture.getInternalTexture() ? tangentTexture!.getInternalTexture()!.uniqueId : \"NoTangent\";\r\n return `${strengthId}_${tangentId}`;\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged coat textures based on the internal texture data.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged coat textures\r\n * @internal\r\n */\r\nfunction GetCoatTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const coatTexture: Nullable<BaseTexture> = babylonMaterial.coatWeightTexture;\r\n const coatId = coatTexture && coatTexture.getInternalTexture() ? coatTexture!.getInternalTexture()!.uniqueId : \"NoCoat\";\r\n const coatRoughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n const roughnessId = coatRoughnessTexture && coatRoughnessTexture.getInternalTexture() ? coatRoughnessTexture!.getInternalTexture()!.uniqueId : \"NoRoughness\";\r\n return `${coatId}_${roughnessId}`;\r\n}\r\n\r\n/**\r\n * Creates a new texture with the anisotropy data merged together for export.\r\n * @param babylonMaterial The source OpenPBR material\r\n * @returns A new texture with the merged anisotropy data\r\n * @internal\r\n */\r\nasync function CreateMergedAnisotropyTexture(babylonMaterial: OpenPBRMaterial): Promise<Nullable<BaseTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryCoatTangentTexture;\r\n\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(anisoStrengthTexture || tangentTexture)) {\r\n return null;\r\n }\r\n\r\n return await MergeTexturesAsync(\r\n \"AnisotropyTexture\",\r\n CreateRGBAConfiguration(\r\n tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel\r\n tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel\r\n anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel\r\n ),\r\n scene\r\n );\r\n}\r\n\r\n/**\r\n * Using the coat weight and coat roughness textures, create a merged internal texture that can be used\r\n * for multiple textures (with potentially different transforms) on export.\r\n * @param babylonMaterial The source OpenPBR material\r\n * @returns A new, internal texture with the coat weight in the red channel and coat roughness in the green channel\r\n * @internal\r\n */\r\nasync function CreateMergedCoatInternalTextureAsync(babylonMaterial: OpenPBRMaterial): Promise<Nullable<InternalTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n const coatTexture: Nullable<BaseTexture> = babylonMaterial.coatWeightTexture;\r\n const coatRoughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(coatTexture || coatRoughnessTexture)) {\r\n return null;\r\n }\r\n\r\n const texture = await MergeTexturesAsync(\r\n \"CoatTexture\",\r\n CreateRGBAConfiguration(\r\n coatTexture ? CreateTextureInput(coatTexture, 0) : CreateConstantInput(1.0), // coat weight from red channel\r\n // coat roughness goes in the green channel but may come from red or green channels in the source\r\n coatRoughnessTexture ? CreateTextureInput(coatRoughnessTexture, babylonMaterial._useCoatRoughnessFromGreenChannel ? 1 : 0) : CreateConstantInput(1.0)\r\n ),\r\n scene\r\n );\r\n\r\n return texture.getInternalTexture();\r\n}\r\n\r\n/**\r\n * Creates a temporary texture based on the source texture.\r\n * @param internalTexture The source internal texture\r\n * @param sourceTexture The source of the new texture's name, and sampler info\r\n * @returns The new texture\r\n */\r\nfunction CreateTempTexture(internalTexture: InternalTexture, sourceTexture: BaseTexture): Texture {\r\n const tempTexture = new Texture(sourceTexture.name, sourceTexture.getScene());\r\n tempTexture._texture = internalTexture;\r\n tempTexture.coordinatesIndex = sourceTexture.coordinatesIndex;\r\n if (sourceTexture instanceof Texture) {\r\n tempTexture.uOffset = sourceTexture.uOffset;\r\n tempTexture.vOffset = sourceTexture.vOffset;\r\n tempTexture.uScale = sourceTexture.uScale;\r\n tempTexture.vScale = sourceTexture.vScale;\r\n tempTexture.wAng = sourceTexture.wAng;\r\n }\r\n tempTexture.wrapU = sourceTexture.wrapU;\r\n tempTexture.wrapV = sourceTexture.wrapV;\r\n return tempTexture;\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_materials_coat 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 /**\r\n * Cache that holds temporary merged textures created during export\r\n */\r\n private _mergedTexturesMap: Record<string, BaseTexture> = {};\r\n\r\n /**\r\n * Cache that holds internal textures of merged textures created during export\r\n */\r\n private _cachedInternalTexturesMap: Record<string, InternalTexture> = {};\r\n\r\n public dispose() {\r\n for (const key of Object.keys(this._mergedTexturesMap)) {\r\n const texture = this._mergedTexturesMap[key];\r\n texture.dispose();\r\n }\r\n this._mergedTexturesMap = {};\r\n for (const key of Object.keys(this._cachedInternalTexturesMap)) {\r\n const internalTexture = this._cachedInternalTexturesMap[key];\r\n internalTexture.dispose();\r\n }\r\n this._cachedInternalTexturesMap = {};\r\n }\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.clearCoat.isEnabled) {\r\n if (babylonMaterial.clearCoat.texture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.texture);\r\n }\r\n if (!babylonMaterial.clearCoat.useRoughnessFromMainTexture && babylonMaterial.clearCoat.textureRoughness) {\r\n additionalTextures.push(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n if (babylonMaterial.clearCoat.bumpTexture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.bumpTexture);\r\n }\r\n if (babylonMaterial.clearCoat.tintTexture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.tintTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.coatWeight > 0) {\r\n // We will merge the coat_weight and coat_roughness textures, if needed.\r\n // However, we want to retain the original texture's transforms and sampling info.\r\n let coatNeedsMerge = false;\r\n if (babylonMaterial.coatWeightTexture) {\r\n // If we don't have a coat_roughness texture or if the coat_weight and coat_roughness\r\n // textures are already merged, export them as-is.\r\n if (!babylonMaterial.coatRoughnessTexture) {\r\n additionalTextures.push(babylonMaterial.coatWeightTexture);\r\n } else if (\r\n babylonMaterial._useCoatRoughnessFromGreenChannel &&\r\n babylonMaterial.coatWeightTexture.getInternalTexture() === babylonMaterial.coatRoughnessTexture.getInternalTexture()\r\n ) {\r\n additionalTextures.push(babylonMaterial.coatWeightTexture);\r\n additionalTextures.push(babylonMaterial.coatRoughnessTexture);\r\n } else {\r\n coatNeedsMerge = true;\r\n }\r\n } else if (babylonMaterial.coatRoughnessTexture) {\r\n if (babylonMaterial._useCoatRoughnessFromGreenChannel) {\r\n additionalTextures.push(babylonMaterial.coatRoughnessTexture);\r\n } else {\r\n coatNeedsMerge = true;\r\n }\r\n }\r\n if (coatNeedsMerge) {\r\n // Merge the two textures together but retain the transforms for each.\r\n // We do this by caching the internal texture that is created during the merge,\r\n // and then creating temporary textures that use that internal texture but\r\n // have the original texture's transforms/sampling info.\r\n const texId = GetCoatTextureId(babylonMaterial);\r\n if (!this._cachedInternalTexturesMap[texId]) {\r\n const internalTexture = await CreateMergedCoatInternalTextureAsync(babylonMaterial);\r\n if (internalTexture) {\r\n this._cachedInternalTexturesMap[texId] = internalTexture;\r\n }\r\n }\r\n if (this._cachedInternalTexturesMap[texId]) {\r\n if (babylonMaterial.coatWeightTexture) {\r\n this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId] = CreateTempTexture(\r\n this._cachedInternalTexturesMap[texId],\r\n babylonMaterial.coatWeightTexture\r\n );\r\n additionalTextures.push(this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId]);\r\n }\r\n if (babylonMaterial.coatRoughnessTexture) {\r\n this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId] = CreateTempTexture(\r\n this._cachedInternalTexturesMap[texId],\r\n babylonMaterial.coatRoughnessTexture\r\n );\r\n additionalTextures.push(this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId]);\r\n }\r\n }\r\n }\r\n\r\n if (babylonMaterial.geometryCoatNormalTexture) {\r\n additionalTextures.push(babylonMaterial.geometryCoatNormalTexture);\r\n }\r\n\r\n if (babylonMaterial.coatColorTexture) {\r\n additionalTextures.push(babylonMaterial.coatColorTexture);\r\n }\r\n if (babylonMaterial.coatRoughnessAnisotropy > 0) {\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n if (this._mergedTexturesMap[texId]) {\r\n additionalTextures.push(this._mergedTexturesMap[texId]);\r\n } else {\r\n const anisoTexture = await CreateMergedAnisotropyTexture(babylonMaterial);\r\n if (anisoTexture) {\r\n additionalTextures.push(anisoTexture);\r\n this._mergedTexturesMap[texId] = anisoTexture;\r\n }\r\n }\r\n return additionalTextures;\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\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 PBRBaseMaterial) {\r\n if (!babylonMaterial.clearCoat.isEnabled) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const coatTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n let coatTextureRoughnessInfo;\r\n if (babylonMaterial.clearCoat.useRoughnessFromMainTexture) {\r\n coatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n } else {\r\n coatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n\r\n let coatColorTextureInfo;\r\n if (babylonMaterial.clearCoat.isTintEnabled) {\r\n coatColorTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.tintTexture);\r\n }\r\n\r\n const coatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.bumpTexture);\r\n const coatIor: number = babylonMaterial.clearCoat.indexOfRefraction;\r\n\r\n const coatInfo: IKHRMaterialsCoat = {\r\n coatFactor: babylonMaterial.clearCoat.intensity,\r\n coatTexture: coatTextureInfo ?? undefined,\r\n coatRoughnessFactor: babylonMaterial.clearCoat.roughness,\r\n coatRoughnessTexture: coatTextureRoughnessInfo ?? undefined,\r\n coatNormalTexture: coatNormalTextureInfo ?? undefined,\r\n coatColorFactor: babylonMaterial.clearCoat.tintColor.asArray(),\r\n coatColorTexture: coatColorTextureInfo ?? undefined,\r\n coatIor: coatIor !== 1.5 ? coatIor : undefined,\r\n };\r\n\r\n if (coatInfo.coatTexture !== null || coatInfo.coatRoughnessTexture !== null || coatInfo.coatRoughnessTexture !== null || coatInfo.coatColorTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = coatInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.coatWeight == 0.0) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n let coatWeightTexture: Nullable<BaseTexture>;\r\n let coatTextureInfo;\r\n if (babylonMaterial.coatWeightTexture) {\r\n if (this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId]) {\r\n coatWeightTexture = this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId];\r\n } else {\r\n coatWeightTexture = babylonMaterial.coatWeightTexture;\r\n }\r\n coatTextureInfo = this._exporter._materialExporter.getTextureInfo(coatWeightTexture);\r\n }\r\n\r\n let coatRoughnessTexture: Nullable<BaseTexture>;\r\n let coatRoughnessTextureInfo;\r\n if (babylonMaterial.coatRoughnessTexture) {\r\n if (this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId]) {\r\n coatRoughnessTexture = this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId];\r\n } else {\r\n coatRoughnessTexture = babylonMaterial.coatRoughnessTexture;\r\n }\r\n coatRoughnessTextureInfo = this._exporter._materialExporter.getTextureInfo(coatRoughnessTexture);\r\n }\r\n\r\n const coatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryCoatNormalTexture);\r\n const coatColorTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.coatColorTexture);\r\n const coatIor: number = babylonMaterial.coatIor;\r\n const coatDarkeningFactor = babylonMaterial.coatDarkening;\r\n\r\n // Check if we can convert from OpenPBR anisotropy to glTF anisotropy\r\n // Conversion involves both specular roughness and anisotropic roughness changes so,\r\n // if there are textures for either, we can't reliably convert due to there potentially\r\n // being different mappings between the textures.\r\n const roughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n const mergedAnisoTexture = this._mergedTexturesMap[texId];\r\n let coatAnisotropyStrength = 0;\r\n let coatAnisotropyRotation = 0;\r\n let coatAnisotropyTexture = undefined;\r\n if (babylonMaterial.coatRoughnessAnisotropy > 0.0) {\r\n // If no textures are being used, we'll always output glTF-style anisotropy.\r\n // If using OpenPBR anisotropy, convert the constants. Otherwise, just export what we have.\r\n if (!roughnessTexture && !mergedAnisoTexture) {\r\n // Convert constants\r\n let newBaseRoughness = babylonMaterial.coatRoughness;\r\n let newAnisotropyStrength = babylonMaterial.coatRoughnessAnisotropy;\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n const newParams = OpenpbrAnisotropyStrengthToGltf(babylonMaterial.coatRoughness, babylonMaterial.coatRoughnessAnisotropy);\r\n newBaseRoughness = newParams.newBaseRoughness;\r\n newAnisotropyStrength = newParams.newAnisotropyStrength;\r\n }\r\n if (node.pbrMetallicRoughness) {\r\n node.pbrMetallicRoughness.roughnessFactor = newBaseRoughness;\r\n }\r\n coatAnisotropyStrength = newAnisotropyStrength;\r\n coatAnisotropyRotation = babylonMaterial.geometryCoatTangentAngle + Math.PI * 0.5;\r\n coatAnisotropyTexture = undefined;\r\n } else {\r\n const mergedAnisoTextureInfo = mergedAnisoTexture ? this._exporter._materialExporter.getTextureInfo(mergedAnisoTexture) : null;\r\n\r\n coatAnisotropyStrength = babylonMaterial.coatRoughnessAnisotropy;\r\n coatAnisotropyRotation = babylonMaterial.geometryCoatTangentAngle;\r\n coatAnisotropyTexture = mergedAnisoTextureInfo ? mergedAnisoTextureInfo : undefined;\r\n }\r\n\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n // Enable OpenPBR extension on this material.\r\n node.extensions![\"KHR_materials_openpbr\"] = {};\r\n this._exporter._glTF.extensionsUsed ||= [];\r\n if (this._exporter._glTF.extensionsUsed.indexOf(\"KHR_materials_openpbr\") === -1) {\r\n this._exporter._glTF.extensionsUsed.push(\"KHR_materials_openpbr\");\r\n }\r\n }\r\n }\r\n\r\n const coatInfo: IKHRMaterialsCoat = {\r\n coatFactor: babylonMaterial.coatWeight,\r\n coatTexture: coatTextureInfo ?? undefined,\r\n coatRoughnessFactor: babylonMaterial.coatRoughness,\r\n coatRoughnessTexture: coatRoughnessTextureInfo ?? undefined,\r\n coatNormalTexture: coatNormalTextureInfo ?? undefined,\r\n coatColorFactor: babylonMaterial.coatColor.asArray(),\r\n coatColorTexture: coatColorTextureInfo ?? undefined,\r\n coatIor: coatIor !== 1.5 ? coatIor : undefined,\r\n coatDarkeningFactor: coatDarkeningFactor !== 1.0 ? coatDarkeningFactor : undefined,\r\n coatAnisotropyRotation: coatAnisotropyRotation,\r\n coatAnisotropyStrength: coatAnisotropyStrength,\r\n coatAnisotropyTexture: coatAnisotropyTexture,\r\n };\r\n\r\n if (\r\n coatInfo.coatTexture !== null ||\r\n coatInfo.coatRoughnessTexture !== null ||\r\n coatInfo.coatRoughnessTexture !== null ||\r\n coatInfo.coatAnisotropyTexture !== null ||\r\n coatInfo.coatColorTexture !== null\r\n ) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = coatInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_materials_coat glTF serializer extension with the {@link GLTFExporter}.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_materials_coat(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_coat(exporter));\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"KHR_materials_coat.pure.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_coat.pure.ts"],"names":[],"mappings":"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","sourcesContent":["import { type IMaterial, type IKHRMaterialsCoat } from \"babylonjs-gltf2interface\";\r\nimport { type IGLTFExporterExtensionV2 } from \"../glTFExporterExtension\";\r\nimport { GLTFExporter } from \"../glTFExporter\";\r\nimport { type Material } from \"core/Materials/material\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { type BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport { OpenPBRMaterial } from \"core/Materials/PBR/openpbrMaterial.pure\";\r\nimport { MergeTexturesAsync, CreateRGBAConfiguration, CreateTextureInput, CreateConstantInput } from \"core/Materials/Textures/textureMerger\";\r\nimport { Texture } from \"core/Materials/Textures/texture.pure\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { GetSampledTextureKey } from \"../glTFUtilities\";\r\n\r\nconst NAME = \"KHR_materials_coat\";\r\n\r\n// Convert OpenPBR anisotropy values to glTF-compatible values\r\nfunction OpenpbrAnisotropyStrengthToGltf(baseRoughness: number, anisotropy: number) {\r\n const baseAlpha = baseRoughness * baseRoughness;\r\n const roughnessT = baseAlpha * Math.sqrt(2.0 / (1.0 + (1 - anisotropy) * (1 - anisotropy)));\r\n const roughnessB = (1 - anisotropy) * roughnessT;\r\n const newBaseRoughness = Math.sqrt(roughnessB);\r\n const newAnisotropyStrength = Math.min(Math.sqrt((roughnessT - baseAlpha) / Math.max(1.0 - baseAlpha, 0.0001)), 1.0);\r\n\r\n return { newBaseRoughness, newAnisotropyStrength };\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged anisotropy textures based on the internal texture data and sampling state.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged anisotropy textures\r\n * @internal\r\n */\r\nfunction GetAnisoTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const strengthId = GetSampledTextureKey(babylonMaterial.coatRoughnessAnisotropyTexture, \"NoStrength\");\r\n const tangentId = GetSampledTextureKey(babylonMaterial.geometryCoatTangentTexture, \"NoTangent\");\r\n return `${strengthId}_${tangentId}`;\r\n}\r\n\r\n/**\r\n * Generate a unique ID for the merged coat textures based on the internal texture data.\r\n * This is used for caching merged textures.\r\n * @param babylonMaterial Source OpenPBR material\r\n * @returns A unique ID string for the merged coat textures\r\n * @internal\r\n */\r\nfunction GetCoatTextureId(babylonMaterial: OpenPBRMaterial): string {\r\n const coatTexture: Nullable<BaseTexture> = babylonMaterial.coatWeightTexture;\r\n const coatId = coatTexture && coatTexture.getInternalTexture() ? coatTexture!.getInternalTexture()!.uniqueId : \"NoCoat\";\r\n const coatRoughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n const roughnessId = coatRoughnessTexture && coatRoughnessTexture.getInternalTexture() ? coatRoughnessTexture!.getInternalTexture()!.uniqueId : \"NoRoughness\";\r\n return `${coatId}_${roughnessId}`;\r\n}\r\n\r\n/**\r\n * Creates a new texture with the anisotropy data merged together for export.\r\n * @param babylonMaterial The source OpenPBR material\r\n * @returns A new texture with the merged anisotropy data\r\n * @internal\r\n */\r\nasync function CreateMergedAnisotropyTexture(babylonMaterial: OpenPBRMaterial): Promise<Nullable<BaseTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n\r\n const anisoStrengthTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessAnisotropyTexture;\r\n const tangentTexture = babylonMaterial.geometryCoatTangentTexture;\r\n\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(anisoStrengthTexture || tangentTexture)) {\r\n return null;\r\n }\r\n\r\n return await MergeTexturesAsync(\r\n \"AnisotropyTexture\",\r\n {\r\n ...CreateRGBAConfiguration(\r\n tangentTexture ? CreateTextureInput(tangentTexture, 0) : CreateConstantInput(1.0), // tangent x from red channel\r\n tangentTexture ? CreateTextureInput(tangentTexture, 1) : CreateConstantInput(0.0), // tangent y from green channel\r\n anisoStrengthTexture ? CreateTextureInput(anisoStrengthTexture, 0) : CreateConstantInput(1.0) // Anisotropy from red channel\r\n ),\r\n sharedSampling: true,\r\n },\r\n scene\r\n );\r\n}\r\n\r\n/**\r\n * Using the coat weight and coat roughness textures, create a merged internal texture that can be used\r\n * for multiple textures (with potentially different transforms) on export.\r\n * @param babylonMaterial The source OpenPBR material\r\n * @returns A new, internal texture with the coat weight in the red channel and coat roughness in the green channel\r\n * @internal\r\n */\r\nasync function CreateMergedCoatInternalTextureAsync(babylonMaterial: OpenPBRMaterial): Promise<Nullable<InternalTexture>> {\r\n const scene = babylonMaterial.getScene();\r\n const coatTexture: Nullable<BaseTexture> = babylonMaterial.coatWeightTexture;\r\n const coatRoughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n // If we don't have any textures, we don't need to generate anything.\r\n if (!(coatTexture || coatRoughnessTexture)) {\r\n return null;\r\n }\r\n\r\n const texture = await MergeTexturesAsync(\r\n \"CoatTexture\",\r\n CreateRGBAConfiguration(\r\n coatTexture ? CreateTextureInput(coatTexture, 0) : CreateConstantInput(1.0), // coat weight from red channel\r\n // coat roughness goes in the green channel but may come from red or green channels in the source\r\n coatRoughnessTexture ? CreateTextureInput(coatRoughnessTexture, babylonMaterial._useCoatRoughnessFromGreenChannel ? 1 : 0) : CreateConstantInput(1.0)\r\n ),\r\n scene\r\n );\r\n\r\n return texture.getInternalTexture();\r\n}\r\n\r\n/**\r\n * Creates a temporary texture based on the source texture.\r\n * @param internalTexture The source internal texture\r\n * @param sourceTexture The source of the new texture's name, and sampler info\r\n * @returns The new texture\r\n */\r\nfunction CreateTempTexture(internalTexture: InternalTexture, sourceTexture: BaseTexture): Texture {\r\n const tempTexture = new Texture(sourceTexture.name, sourceTexture.getScene());\r\n tempTexture._texture = internalTexture;\r\n tempTexture.coordinatesIndex = sourceTexture.coordinatesIndex;\r\n if (sourceTexture instanceof Texture) {\r\n tempTexture.uOffset = sourceTexture.uOffset;\r\n tempTexture.vOffset = sourceTexture.vOffset;\r\n tempTexture.uScale = sourceTexture.uScale;\r\n tempTexture.vScale = sourceTexture.vScale;\r\n tempTexture.wAng = sourceTexture.wAng;\r\n }\r\n tempTexture.wrapU = sourceTexture.wrapU;\r\n tempTexture.wrapV = sourceTexture.wrapV;\r\n return tempTexture;\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_materials_coat 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 /**\r\n * Cache that holds temporary merged textures created during export\r\n */\r\n private _mergedTexturesMap: Record<string, BaseTexture> = {};\r\n\r\n /**\r\n * Cache that holds internal textures of merged textures created during export\r\n */\r\n private _cachedInternalTexturesMap: Record<string, InternalTexture> = {};\r\n\r\n public dispose() {\r\n for (const key of Object.keys(this._mergedTexturesMap)) {\r\n const texture = this._mergedTexturesMap[key];\r\n texture.dispose();\r\n }\r\n this._mergedTexturesMap = {};\r\n for (const key of Object.keys(this._cachedInternalTexturesMap)) {\r\n const internalTexture = this._cachedInternalTexturesMap[key];\r\n internalTexture.dispose();\r\n }\r\n this._cachedInternalTexturesMap = {};\r\n }\r\n\r\n /** @internal */\r\n public get wasUsed() {\r\n return this._wasUsed;\r\n }\r\n\r\n public async postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]> {\r\n const additionalTextures: BaseTexture[] = [];\r\n if (babylonMaterial instanceof PBRBaseMaterial) {\r\n if (babylonMaterial.clearCoat.isEnabled) {\r\n if (babylonMaterial.clearCoat.texture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.texture);\r\n }\r\n if (!babylonMaterial.clearCoat.useRoughnessFromMainTexture && babylonMaterial.clearCoat.textureRoughness) {\r\n additionalTextures.push(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n if (babylonMaterial.clearCoat.bumpTexture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.bumpTexture);\r\n }\r\n if (babylonMaterial.clearCoat.tintTexture) {\r\n additionalTextures.push(babylonMaterial.clearCoat.tintTexture);\r\n }\r\n return additionalTextures;\r\n }\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.coatWeight > 0) {\r\n // We will merge the coat_weight and coat_roughness textures, if needed.\r\n // However, we want to retain the original texture's transforms and sampling info.\r\n let coatNeedsMerge = false;\r\n if (babylonMaterial.coatWeightTexture) {\r\n // If we don't have a coat_roughness texture or if the coat_weight and coat_roughness\r\n // textures are already merged, export them as-is.\r\n if (!babylonMaterial.coatRoughnessTexture) {\r\n additionalTextures.push(babylonMaterial.coatWeightTexture);\r\n } else if (\r\n babylonMaterial._useCoatRoughnessFromGreenChannel &&\r\n babylonMaterial.coatWeightTexture.getInternalTexture() === babylonMaterial.coatRoughnessTexture.getInternalTexture()\r\n ) {\r\n additionalTextures.push(babylonMaterial.coatWeightTexture);\r\n additionalTextures.push(babylonMaterial.coatRoughnessTexture);\r\n } else {\r\n coatNeedsMerge = true;\r\n }\r\n } else if (babylonMaterial.coatRoughnessTexture) {\r\n if (babylonMaterial._useCoatRoughnessFromGreenChannel) {\r\n additionalTextures.push(babylonMaterial.coatRoughnessTexture);\r\n } else {\r\n coatNeedsMerge = true;\r\n }\r\n }\r\n if (coatNeedsMerge) {\r\n // Merge the two textures together but retain the transforms for each.\r\n // We do this by caching the internal texture that is created during the merge,\r\n // and then creating temporary textures that use that internal texture but\r\n // have the original texture's transforms/sampling info.\r\n const texId = GetCoatTextureId(babylonMaterial);\r\n if (!this._cachedInternalTexturesMap[texId]) {\r\n const internalTexture = await CreateMergedCoatInternalTextureAsync(babylonMaterial);\r\n if (internalTexture) {\r\n this._cachedInternalTexturesMap[texId] = internalTexture;\r\n }\r\n }\r\n if (this._cachedInternalTexturesMap[texId]) {\r\n if (babylonMaterial.coatWeightTexture) {\r\n this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId] = CreateTempTexture(\r\n this._cachedInternalTexturesMap[texId],\r\n babylonMaterial.coatWeightTexture\r\n );\r\n additionalTextures.push(this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId]);\r\n }\r\n if (babylonMaterial.coatRoughnessTexture) {\r\n this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId] = CreateTempTexture(\r\n this._cachedInternalTexturesMap[texId],\r\n babylonMaterial.coatRoughnessTexture\r\n );\r\n additionalTextures.push(this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId]);\r\n }\r\n }\r\n }\r\n\r\n if (babylonMaterial.geometryCoatNormalTexture) {\r\n additionalTextures.push(babylonMaterial.geometryCoatNormalTexture);\r\n }\r\n\r\n if (babylonMaterial.coatColorTexture) {\r\n additionalTextures.push(babylonMaterial.coatColorTexture);\r\n }\r\n if (babylonMaterial.coatRoughnessAnisotropy > 0) {\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n if (this._mergedTexturesMap[texId]) {\r\n additionalTextures.push(this._mergedTexturesMap[texId]);\r\n } else {\r\n const anisoTexture = await CreateMergedAnisotropyTexture(babylonMaterial);\r\n if (anisoTexture) {\r\n additionalTextures.push(anisoTexture);\r\n this._mergedTexturesMap[texId] = anisoTexture;\r\n }\r\n }\r\n return additionalTextures;\r\n }\r\n return additionalTextures;\r\n }\r\n }\r\n\r\n return [];\r\n }\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 PBRBaseMaterial) {\r\n if (!babylonMaterial.clearCoat.isEnabled) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n const coatTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n let coatTextureRoughnessInfo;\r\n if (babylonMaterial.clearCoat.useRoughnessFromMainTexture) {\r\n coatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.texture);\r\n } else {\r\n coatTextureRoughnessInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.textureRoughness);\r\n }\r\n\r\n let coatColorTextureInfo;\r\n if (babylonMaterial.clearCoat.isTintEnabled) {\r\n coatColorTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.tintTexture);\r\n }\r\n\r\n const coatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.clearCoat.bumpTexture);\r\n const coatIor: number = babylonMaterial.clearCoat.indexOfRefraction;\r\n\r\n const coatInfo: IKHRMaterialsCoat = {\r\n coatFactor: babylonMaterial.clearCoat.intensity,\r\n coatTexture: coatTextureInfo ?? undefined,\r\n coatRoughnessFactor: babylonMaterial.clearCoat.roughness,\r\n coatRoughnessTexture: coatTextureRoughnessInfo ?? undefined,\r\n coatNormalTexture: coatNormalTextureInfo ?? undefined,\r\n coatColorFactor: babylonMaterial.clearCoat.tintColor.asArray(),\r\n coatColorTexture: coatColorTextureInfo ?? undefined,\r\n coatIor: coatIor !== 1.5 ? coatIor : undefined,\r\n };\r\n\r\n if (coatInfo.coatTexture !== null || coatInfo.coatRoughnessTexture !== null || coatInfo.coatRoughnessTexture !== null || coatInfo.coatColorTexture !== null) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = coatInfo;\r\n } else if (babylonMaterial instanceof OpenPBRMaterial) {\r\n if (babylonMaterial.coatWeight == 0.0) {\r\n resolve(node);\r\n return;\r\n }\r\n\r\n this._wasUsed = true;\r\n\r\n node.extensions = node.extensions || {};\r\n\r\n let coatWeightTexture: Nullable<BaseTexture>;\r\n let coatTextureInfo;\r\n if (babylonMaterial.coatWeightTexture) {\r\n if (this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId]) {\r\n coatWeightTexture = this._mergedTexturesMap[babylonMaterial.coatWeightTexture.uniqueId];\r\n } else {\r\n coatWeightTexture = babylonMaterial.coatWeightTexture;\r\n }\r\n coatTextureInfo = this._exporter._materialExporter.getTextureInfo(coatWeightTexture);\r\n }\r\n\r\n let coatRoughnessTexture: Nullable<BaseTexture>;\r\n let coatRoughnessTextureInfo;\r\n if (babylonMaterial.coatRoughnessTexture) {\r\n if (this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId]) {\r\n coatRoughnessTexture = this._mergedTexturesMap[babylonMaterial.coatRoughnessTexture.uniqueId];\r\n } else {\r\n coatRoughnessTexture = babylonMaterial.coatRoughnessTexture;\r\n }\r\n coatRoughnessTextureInfo = this._exporter._materialExporter.getTextureInfo(coatRoughnessTexture);\r\n }\r\n\r\n const coatNormalTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.geometryCoatNormalTexture);\r\n const coatColorTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial.coatColorTexture);\r\n const coatIor: number = babylonMaterial.coatIor;\r\n const coatDarkeningFactor = babylonMaterial.coatDarkening;\r\n\r\n // Check if we can convert from OpenPBR anisotropy to glTF anisotropy\r\n // Conversion involves both specular roughness and anisotropic roughness changes so,\r\n // if there are textures for either, we can't reliably convert due to there potentially\r\n // being different mappings between the textures.\r\n const roughnessTexture: Nullable<BaseTexture> = babylonMaterial.coatRoughnessTexture;\r\n const texId = GetAnisoTextureId(babylonMaterial);\r\n const mergedAnisoTexture = this._mergedTexturesMap[texId];\r\n let coatAnisotropyStrength = 0;\r\n let coatAnisotropyRotation = 0;\r\n let coatAnisotropyTexture = undefined;\r\n if (babylonMaterial.coatRoughnessAnisotropy > 0.0) {\r\n // If no textures are being used, we'll always output glTF-style anisotropy.\r\n // If using OpenPBR anisotropy, convert the constants. Otherwise, just export what we have.\r\n if (!roughnessTexture && !mergedAnisoTexture) {\r\n // Convert constants\r\n let newBaseRoughness = babylonMaterial.coatRoughness;\r\n let newAnisotropyStrength = babylonMaterial.coatRoughnessAnisotropy;\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n const newParams = OpenpbrAnisotropyStrengthToGltf(babylonMaterial.coatRoughness, babylonMaterial.coatRoughnessAnisotropy);\r\n newBaseRoughness = newParams.newBaseRoughness;\r\n newAnisotropyStrength = newParams.newAnisotropyStrength;\r\n }\r\n if (node.pbrMetallicRoughness) {\r\n node.pbrMetallicRoughness.roughnessFactor = newBaseRoughness;\r\n }\r\n coatAnisotropyStrength = newAnisotropyStrength;\r\n coatAnisotropyRotation = babylonMaterial.geometryCoatTangentAngle + Math.PI * 0.5;\r\n coatAnisotropyTexture = undefined;\r\n } else {\r\n const mergedAnisoTextureInfo = mergedAnisoTexture ? this._exporter._materialExporter.getTextureInfo(mergedAnisoTexture) : null;\r\n\r\n coatAnisotropyStrength = babylonMaterial.coatRoughnessAnisotropy;\r\n coatAnisotropyRotation = babylonMaterial.geometryCoatTangentAngle;\r\n coatAnisotropyTexture = mergedAnisoTextureInfo ? mergedAnisoTextureInfo : undefined;\r\n }\r\n\r\n if (!babylonMaterial._useGltfStyleAnisotropy) {\r\n // Enable OpenPBR extension on this material.\r\n node.extensions![\"KHR_materials_openpbr\"] = {};\r\n this._exporter._glTF.extensionsUsed ||= [];\r\n if (this._exporter._glTF.extensionsUsed.indexOf(\"KHR_materials_openpbr\") === -1) {\r\n this._exporter._glTF.extensionsUsed.push(\"KHR_materials_openpbr\");\r\n }\r\n }\r\n }\r\n\r\n const coatInfo: IKHRMaterialsCoat = {\r\n coatFactor: babylonMaterial.coatWeight,\r\n coatTexture: coatTextureInfo ?? undefined,\r\n coatRoughnessFactor: babylonMaterial.coatRoughness,\r\n coatRoughnessTexture: coatRoughnessTextureInfo ?? undefined,\r\n coatNormalTexture: coatNormalTextureInfo ?? undefined,\r\n coatColorFactor: babylonMaterial.coatColor.asArray(),\r\n coatColorTexture: coatColorTextureInfo ?? undefined,\r\n coatIor: coatIor !== 1.5 ? coatIor : undefined,\r\n coatDarkeningFactor: coatDarkeningFactor !== 1.0 ? coatDarkeningFactor : undefined,\r\n coatAnisotropyRotation: coatAnisotropyRotation,\r\n coatAnisotropyStrength: coatAnisotropyStrength,\r\n coatAnisotropyTexture: coatAnisotropyTexture,\r\n };\r\n\r\n if (\r\n coatInfo.coatTexture !== null ||\r\n coatInfo.coatRoughnessTexture !== null ||\r\n coatInfo.coatRoughnessTexture !== null ||\r\n coatInfo.coatAnisotropyTexture !== null ||\r\n coatInfo.coatColorTexture !== null\r\n ) {\r\n this._exporter._materialNeedsUVsSet.add(babylonMaterial);\r\n }\r\n\r\n node.extensions[NAME] = coatInfo;\r\n }\r\n resolve(node);\r\n });\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Registers the KHR_materials_coat glTF serializer extension with the {@link GLTFExporter}.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport function RegisterKHR_materials_coat(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n GLTFExporter.RegisterExtension(NAME, (exporter) => new KHR_materials_coat(exporter));\r\n}\r\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-exports the pure implementation and applies the runtime registration side effect.
|
|
3
|
+
* Import "./KHR_materials_scatter.pure" for tree-shakeable, side-effect-free usage.
|
|
4
|
+
*/
|
|
5
|
+
export * from "./KHR_materials_scatter.pure.js";
|
|
6
|
+
import { RegisterKHR_materials_scatter } from "./KHR_materials_scatter.pure.js";
|
|
7
|
+
RegisterKHR_materials_scatter();
|
|
8
|
+
//# sourceMappingURL=KHR_materials_scatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KHR_materials_scatter.js","sourceRoot":"","sources":["../../../../../../dev/serializers/src/glTF/2.0/Extensions/KHR_materials_scatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,8BAA8B,CAAC;AAE7C,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,6BAA6B,EAAE,CAAC","sourcesContent":["/**\r\n * Re-exports the pure implementation and applies the runtime registration side effect.\r\n * Import \"./KHR_materials_scatter.pure\" for tree-shakeable, side-effect-free usage.\r\n */\r\nexport * from \"./KHR_materials_scatter.pure\";\r\n\r\nimport { RegisterKHR_materials_scatter } from \"./KHR_materials_scatter.pure\";\r\nRegisterKHR_materials_scatter();\r\n"]}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { type IMaterial } from "babylonjs-gltf2interface";
|
|
2
|
+
import { type IGLTFExporterExtensionV2 } from "../glTFExporterExtension.js";
|
|
3
|
+
import { GLTFExporter } from "../glTFExporter.js";
|
|
4
|
+
import { type Material } from "@onerjs/core/Materials/material.js";
|
|
5
|
+
import { type BaseTexture } from "@onerjs/core/Materials/Textures/baseTexture.js";
|
|
6
|
+
/**
|
|
7
|
+
* TODO: In-progress specification
|
|
8
|
+
* [Specification](https://github.com/KhronosGroup/glTF/blob/7ea427ed55d44427e83c0a6d1c87068b1a4151c5/extensions/2.0/Khronos/KHR_materials_scatter/README.md)
|
|
9
|
+
*/
|
|
10
|
+
export declare class KHR_materials_scatter implements IGLTFExporterExtensionV2 {
|
|
11
|
+
/** Name of this extension */
|
|
12
|
+
readonly name = "KHR_materials_scatter";
|
|
13
|
+
/** Defines whether this extension is enabled */
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
/** Defines whether this extension is required */
|
|
16
|
+
required: boolean;
|
|
17
|
+
private _exporter;
|
|
18
|
+
private _wasUsed;
|
|
19
|
+
private _scatterResults;
|
|
20
|
+
constructor(exporter: GLTFExporter);
|
|
21
|
+
dispose(): void;
|
|
22
|
+
/** @internal */
|
|
23
|
+
get wasUsed(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* After exporting a material, bake the combined multi-scatter color texture (if any).
|
|
26
|
+
* @param context GLTF context of the material
|
|
27
|
+
* @param node exported GLTF node
|
|
28
|
+
* @param babylonMaterial corresponding babylon material
|
|
29
|
+
* @returns array of additional textures to export
|
|
30
|
+
*/
|
|
31
|
+
postExportMaterialAdditionalTexturesAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<BaseTexture[]>;
|
|
32
|
+
private _isExtensionEnabled;
|
|
33
|
+
/**
|
|
34
|
+
* Bake the KHR_materials_scatter data for an OpenPBR material, dispatching on thin-walled vs volumetric.
|
|
35
|
+
* @param mat the OpenPBR material to bake scatter data for
|
|
36
|
+
* @returns the scatter strength, multi-scatter color, and anisotropy (constants and/or baked textures)
|
|
37
|
+
*/
|
|
38
|
+
private _bakeScatterAsync;
|
|
39
|
+
/**
|
|
40
|
+
* Per-pixel transmission fraction operand `T / (T + S(1 - T))` (= `T / (1 - (1 - T)(1 - S))`) from the
|
|
41
|
+
* (possibly textured) transmission weight `T` and subsurface weight `S`. Folds to a constant when
|
|
42
|
+
* neither weight has a texture. The subsurface fraction is `1 - transmissionFraction`. Weights are read
|
|
43
|
+
* from the glTF-convention channels (transmission R; subsurface A when packed in alpha, otherwise R).
|
|
44
|
+
* The fraction is computed in one fused pass into a floating-point target (when supported), so small
|
|
45
|
+
* weights don't cancel out in 8-bit intermediates; callers quantize only their final output.
|
|
46
|
+
* @param mat the OpenPBR material whose weights drive the fraction
|
|
47
|
+
* @returns an operand carrying the transmission fraction (constant or baked texture)
|
|
48
|
+
*/
|
|
49
|
+
private _computeTransmissionFractionAsync;
|
|
50
|
+
/**
|
|
51
|
+
* Bake the constant slab fractions used only for the scatter anisotropy blend (glTF has no
|
|
52
|
+
* anisotropy texture, so anisotropy always uses the constant weights).
|
|
53
|
+
* @param mat the OpenPBR material whose constant weights drive the fractions
|
|
54
|
+
* @returns the constant transmission and subsurface fractions of the dielectric
|
|
55
|
+
*/
|
|
56
|
+
private _constantFractions;
|
|
57
|
+
/**
|
|
58
|
+
* Volumetric scatter: glTF stores a single multi-scatter color blended from the transmission and
|
|
59
|
+
* subsurface slabs, with `scatterStrength = 1`.
|
|
60
|
+
*
|
|
61
|
+
* OpenPBR represents the two slabs as:
|
|
62
|
+
* - The transmission slab stores `transmission_scatter = extinction * singleScatterAlbedo` (OpenPBR 1.1),
|
|
63
|
+
* where the renderer's extinction is `-log(transmissionColor)` with the absorption shifted to be
|
|
64
|
+
* non-negative. We recover the single-scatter albedo by dividing the scattering coefficient by the
|
|
65
|
+
* extinction emitted by KHR_materials_volume (which the importer multiplies back), then convert it
|
|
66
|
+
* to a multi-scatter albedo (the quantity KHR_materials_scatter stores). glTF attenuation can't be
|
|
67
|
+
* textured, so the emitted extinction is derived from the untextured factors; texels whose scattering
|
|
68
|
+
* coefficient exceeds it are approximated by clamping the albedo to one. Without a transmission depth
|
|
69
|
+
* no extinction is emitted, so the per-texel renderer extinction is used instead.
|
|
70
|
+
* - The subsurface slab stores `subsurface_color`, which is already a multi-scatter albedo.
|
|
71
|
+
*
|
|
72
|
+
* The two are blended by `lerp(subsurface, transmission, transmissionFraction)` (the two fractions
|
|
73
|
+
* sum to one). The whole computation is exact per-pixel when any slab or weight carries a texture,
|
|
74
|
+
* and folds to a constant factor when none do.
|
|
75
|
+
*
|
|
76
|
+
* TODO: OpenPBR 1.2 will define `transmission_scatter` as the single-scatter albedo directly,
|
|
77
|
+
* which removes the extinction division below.
|
|
78
|
+
* @param mat the OpenPBR material to bake volumetric scatter data for
|
|
79
|
+
* @returns scatter strength (always 1), the blended multi-scatter color, and blended anisotropy
|
|
80
|
+
*/
|
|
81
|
+
private _bakeVolumetricScatterAsync;
|
|
82
|
+
/**
|
|
83
|
+
* Read back a texture and return the maximum of each RGB channel.
|
|
84
|
+
* @param texture the texture to read (unsigned-byte, or floating-point read back as 32-bit floats)
|
|
85
|
+
* @returns the per-channel maxima, normalized to [0, 1] for unsigned-byte textures
|
|
86
|
+
*/
|
|
87
|
+
private _readChannelMaximaAsync;
|
|
88
|
+
/**
|
|
89
|
+
* Thin-walled scatter: there is no volumetric slab, so the multi-scatter color is simply
|
|
90
|
+
* `subsurface_color` and the scatter strength is the subsurface fraction of the dielectric
|
|
91
|
+
* `S(1-T) / (1 - (1-T)(1-S))` (= `1 - transmissionFraction`). This is the exact inverse of the
|
|
92
|
+
* loader's thin-walled `ThinWalledScatterWeightsAsync`, so it round-trips.
|
|
93
|
+
* @param mat the OpenPBR material to bake thin-walled scatter data for
|
|
94
|
+
* @returns the subsurface fraction as scatter strength, subsurface_color as multi-scatter color, and subsurface anisotropy
|
|
95
|
+
*/
|
|
96
|
+
private _bakeThinWalledScatterAsync;
|
|
97
|
+
/**
|
|
98
|
+
* glTF reads multiscatterColorTexture as sRGB, but the exporter writes texels as stored. Linear textures and
|
|
99
|
+
* hardware sRGB buffers both sample as linear values, so bake their RGB into a new sRGB-encoded texture that
|
|
100
|
+
* keeps the source UV set, wrap modes and transform. Textures that already store sRGB bytes need no change.
|
|
101
|
+
* @param name the name of the encoded texture
|
|
102
|
+
* @param texture the source color texture, which is not modified or disposed
|
|
103
|
+
* @param outputOptions render-target options for the encoded texture
|
|
104
|
+
* @returns a new texture owned by the caller, or null when the source can be exported as-is
|
|
105
|
+
*/
|
|
106
|
+
private _encodeColorTextureAsSrgbAsync;
|
|
107
|
+
/**
|
|
108
|
+
* After exporting a material
|
|
109
|
+
* @param context GLTF context of the material
|
|
110
|
+
* @param node exported GLTF node
|
|
111
|
+
* @param babylonMaterial corresponding babylon material
|
|
112
|
+
* @returns promise that resolves with the updated node
|
|
113
|
+
*/
|
|
114
|
+
postExportMaterialAsync?(context: string, node: IMaterial, babylonMaterial: Material): Promise<IMaterial>;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Registers the KHR_materials_scatter glTF serializer extension with the {@link GLTFExporter}.
|
|
118
|
+
* Safe to call multiple times; only the first call has an effect.
|
|
119
|
+
*/
|
|
120
|
+
export declare function RegisterKHR_materials_scatter(): void;
|