|
@@ -436,11 +436,11 @@ inline void SetSamplerWrap(SamplerWrap& wrap, aiTextureMapMode map)
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetTexSampler(const aiMaterial* mat, Ref<Texture> texture, aiTextureType tt, unsigned int slot)
|
|
|
+void glTF2Exporter::GetTexSampler(const aiMaterial& mat, Ref<Texture> texture, aiTextureType tt, unsigned int slot)
|
|
|
{
|
|
|
aiString aId;
|
|
|
std::string id;
|
|
|
- if (aiGetMaterialString(mat, AI_MATKEY_GLTF_MAPPINGID(tt, slot), &aId) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialString(&mat, AI_MATKEY_GLTF_MAPPINGID(tt, slot), &aId) == AI_SUCCESS) {
|
|
|
id = aId.C_Str();
|
|
|
}
|
|
|
|
|
@@ -455,49 +455,52 @@ void glTF2Exporter::GetTexSampler(const aiMaterial* mat, Ref<Texture> texture, a
|
|
|
SamplerMagFilter filterMag;
|
|
|
SamplerMinFilter filterMin;
|
|
|
|
|
|
- if (aiGetMaterialInteger(mat, AI_MATKEY_MAPPINGMODE_U(tt, slot), (int*)&mapU) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialInteger(&mat, AI_MATKEY_MAPPINGMODE_U(tt, slot), (int*)&mapU) == AI_SUCCESS) {
|
|
|
SetSamplerWrap(texture->sampler->wrapS, mapU);
|
|
|
}
|
|
|
|
|
|
- if (aiGetMaterialInteger(mat, AI_MATKEY_MAPPINGMODE_V(tt, slot), (int*)&mapV) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialInteger(&mat, AI_MATKEY_MAPPINGMODE_V(tt, slot), (int*)&mapV) == AI_SUCCESS) {
|
|
|
SetSamplerWrap(texture->sampler->wrapT, mapV);
|
|
|
}
|
|
|
|
|
|
- if (aiGetMaterialInteger(mat, AI_MATKEY_GLTF_MAPPINGFILTER_MAG(tt, slot), (int*)&filterMag) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialInteger(&mat, AI_MATKEY_GLTF_MAPPINGFILTER_MAG(tt, slot), (int*)&filterMag) == AI_SUCCESS) {
|
|
|
texture->sampler->magFilter = filterMag;
|
|
|
}
|
|
|
|
|
|
- if (aiGetMaterialInteger(mat, AI_MATKEY_GLTF_MAPPINGFILTER_MIN(tt, slot), (int*)&filterMin) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialInteger(&mat, AI_MATKEY_GLTF_MAPPINGFILTER_MIN(tt, slot), (int*)&filterMin) == AI_SUCCESS) {
|
|
|
texture->sampler->minFilter = filterMin;
|
|
|
}
|
|
|
|
|
|
aiString name;
|
|
|
- if (aiGetMaterialString(mat, AI_MATKEY_GLTF_MAPPINGNAME(tt, slot), &name) == AI_SUCCESS) {
|
|
|
+ if (aiGetMaterialString(&mat, AI_MATKEY_GLTF_MAPPINGNAME(tt, slot), &name) == AI_SUCCESS) {
|
|
|
texture->sampler->name = name.C_Str();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTexProp(const aiMaterial* mat, unsigned int& prop, const char* propName, aiTextureType tt, unsigned int slot)
|
|
|
+void glTF2Exporter::GetMatTexProp(const aiMaterial& mat, unsigned int& prop, const char* propName, aiTextureType tt, unsigned int slot)
|
|
|
{
|
|
|
std::string textureKey = std::string(_AI_MATKEY_TEXTURE_BASE) + "." + propName;
|
|
|
|
|
|
- mat->Get(textureKey.c_str(), tt, slot, prop);
|
|
|
+ mat.Get(textureKey.c_str(), tt, slot, prop);
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTexProp(const aiMaterial* mat, float& prop, const char* propName, aiTextureType tt, unsigned int slot)
|
|
|
+void glTF2Exporter::GetMatTexProp(const aiMaterial& mat, float& prop, const char* propName, aiTextureType tt, unsigned int slot)
|
|
|
{
|
|
|
std::string textureKey = std::string(_AI_MATKEY_TEXTURE_BASE) + "." + propName;
|
|
|
|
|
|
- mat->Get(textureKey.c_str(), tt, slot, prop);
|
|
|
+ mat.Get(textureKey.c_str(), tt, slot, prop);
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTex(const aiMaterial* mat, Ref<Texture>& texture, aiTextureType tt, unsigned int slot = 0)
|
|
|
+void glTF2Exporter::GetMatTex(const aiMaterial& mat, Ref<Texture>& texture, unsigned int &texCoord, aiTextureType tt, unsigned int slot = 0)
|
|
|
{
|
|
|
- if (mat->GetTextureCount(tt) > 0) {
|
|
|
+ if (mat.GetTextureCount(tt) > 0) {
|
|
|
aiString tex;
|
|
|
|
|
|
- if (mat->Get(AI_MATKEY_TEXTURE(tt, slot), tex) == AI_SUCCESS) {
|
|
|
+ // Read texcoord (UV map index)
|
|
|
+ mat.Get(AI_MATKEY_UVWSRC(tt, slot), texCoord);
|
|
|
+
|
|
|
+ if (mat.Get(AI_MATKEY_TEXTURE(tt, slot), tex) == AI_SUCCESS) {
|
|
|
std::string path = tex.C_Str();
|
|
|
|
|
|
if (path.size() > 0) {
|
|
@@ -567,45 +570,45 @@ void glTF2Exporter::GetMatTex(const aiMaterial* mat, Ref<Texture>& texture, aiTe
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTex(const aiMaterial* mat, TextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
+void glTF2Exporter::GetMatTex(const aiMaterial& mat, TextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
{
|
|
|
Ref<Texture>& texture = prop.texture;
|
|
|
|
|
|
- GetMatTex(mat, texture, tt, slot);
|
|
|
+ GetMatTex(mat, texture, prop.texCoord, tt, slot);
|
|
|
|
|
|
- if (texture) {
|
|
|
- GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
- }
|
|
|
+ //if (texture) {
|
|
|
+ // GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
+ //}
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTex(const aiMaterial* mat, NormalTextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
+void glTF2Exporter::GetMatTex(const aiMaterial& mat, NormalTextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
{
|
|
|
Ref<Texture>& texture = prop.texture;
|
|
|
|
|
|
- GetMatTex(mat, texture, tt, slot);
|
|
|
+ GetMatTex(mat, texture, prop.texCoord, tt, slot);
|
|
|
|
|
|
if (texture) {
|
|
|
- GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
+ //GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
GetMatTexProp(mat, prop.scale, "scale", tt, slot);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void glTF2Exporter::GetMatTex(const aiMaterial* mat, OcclusionTextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
+void glTF2Exporter::GetMatTex(const aiMaterial& mat, OcclusionTextureInfo& prop, aiTextureType tt, unsigned int slot = 0)
|
|
|
{
|
|
|
Ref<Texture>& texture = prop.texture;
|
|
|
|
|
|
- GetMatTex(mat, texture, tt, slot);
|
|
|
+ GetMatTex(mat, texture, prop.texCoord, tt, slot);
|
|
|
|
|
|
if (texture) {
|
|
|
- GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
+ //GetMatTexProp(mat, prop.texCoord, "texCoord", tt, slot);
|
|
|
GetMatTexProp(mat, prop.strength, "strength", tt, slot);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-aiReturn glTF2Exporter::GetMatColor(const aiMaterial* mat, vec4& prop, const char* propName, int type, int idx)
|
|
|
+aiReturn glTF2Exporter::GetMatColor(const aiMaterial& mat, vec4& prop, const char* propName, int type, int idx) const
|
|
|
{
|
|
|
aiColor4D col;
|
|
|
- aiReturn result = mat->Get(propName, type, idx, col);
|
|
|
+ aiReturn result = mat.Get(propName, type, idx, col);
|
|
|
|
|
|
if (result == AI_SUCCESS) {
|
|
|
prop[0] = col.r; prop[1] = col.g; prop[2] = col.b; prop[3] = col.a;
|
|
@@ -614,37 +617,116 @@ aiReturn glTF2Exporter::GetMatColor(const aiMaterial* mat, vec4& prop, const cha
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-aiReturn glTF2Exporter::GetMatColor(const aiMaterial* mat, vec3& prop, const char* propName, int type, int idx)
|
|
|
+aiReturn glTF2Exporter::GetMatColor(const aiMaterial& mat, vec3& prop, const char* propName, int type, int idx) const
|
|
|
{
|
|
|
aiColor3D col;
|
|
|
- aiReturn result = mat->Get(propName, type, idx, col);
|
|
|
+ aiReturn result = mat.Get(propName, type, idx, col);
|
|
|
|
|
|
if (result == AI_SUCCESS) {
|
|
|
- prop[0] = col.r; prop[1] = col.g; prop[2] = col.b;
|
|
|
+ prop[0] = col.r;
|
|
|
+ prop[1] = col.g;
|
|
|
+ prop[2] = col.b;
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+bool glTF2Exporter::GetMatSpecGloss(const aiMaterial &mat, glTF2::PbrSpecularGlossiness &pbrSG) {
|
|
|
+ bool result = false;
|
|
|
+ // If has Glossiness, a Specular Color or Specular Texture, use the KHR_materials_pbrSpecularGlossiness extension
|
|
|
+ // NOTE: This extension is being considered for deprecation (Dec 2020), may be replaced by KHR_material_specular
|
|
|
+
|
|
|
+ if (mat.Get(AI_MATKEY_GLOSSINESS_FACTOR, pbrSG.glossinessFactor) == AI_SUCCESS) {
|
|
|
+ result = true;
|
|
|
+ } else {
|
|
|
+ // Don't have explicit glossiness, convert from pbr roughness or legacy shininess
|
|
|
+ float shininess;
|
|
|
+ if (mat.Get(AI_MATKEY_ROUGHNESS_FACTOR, shininess) == AI_SUCCESS) {
|
|
|
+ pbrSG.glossinessFactor = 1.0f - shininess; // Extension defines this way
|
|
|
+ } else if (mat.Get(AI_MATKEY_SHININESS, shininess) == AI_SUCCESS) {
|
|
|
+ pbrSG.glossinessFactor = shininess / 1000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (GetMatColor(mat, pbrSG.specularFactor, AI_MATKEY_COLOR_SPECULAR) == AI_SUCCESS) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ // Add any appropriate textures
|
|
|
+ GetMatTex(mat, pbrSG.specularGlossinessTexture, aiTextureType_SPECULAR);
|
|
|
+
|
|
|
+ result = result || pbrSG.specularGlossinessTexture.texture;
|
|
|
+
|
|
|
+ if (result) {
|
|
|
+ // Likely to always have diffuse
|
|
|
+ GetMatTex(mat, pbrSG.diffuseTexture, aiTextureType_DIFFUSE);
|
|
|
+ GetMatColor(mat, pbrSG.diffuseFactor, AI_MATKEY_COLOR_DIFFUSE);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+bool glTF2Exporter::GetMatSheen(const aiMaterial &mat, glTF2::MaterialSheen &sheen) {
|
|
|
+ // Return true if got any valid Sheen properties or textures
|
|
|
+ if (GetMatColor(mat, sheen.sheenColorFactor, AI_MATKEY_SHEEN_COLOR_FACTOR) != aiReturn_SUCCESS)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Default Sheen color factor {0,0,0} disables Sheen, so do not export
|
|
|
+ if (sheen.sheenColorFactor == defaultSheenFactor)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ mat.Get(AI_MATKEY_SHEEN_ROUGHNESS_FACTOR, sheen.sheenRoughnessFactor);
|
|
|
+
|
|
|
+ GetMatTex(mat, sheen.sheenColorTexture, AI_MATKEY_SHEEN_COLOR_TEXTURE);
|
|
|
+ GetMatTex(mat, sheen.sheenRoughnessTexture, AI_MATKEY_SHEEN_ROUGHNESS_TEXTURE);
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+bool glTF2Exporter::GetMatClearcoat(const aiMaterial &mat, glTF2::MaterialClearcoat &clearcoat) {
|
|
|
+ if (mat.Get(AI_MATKEY_CLEARCOAT_FACTOR, clearcoat.clearcoatFactor) != aiReturn_SUCCESS) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Clearcoat factor of zero disables Clearcoat, so do not export
|
|
|
+ if (clearcoat.clearcoatFactor == 0.0f)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ mat.Get(AI_MATKEY_CLEARCOAT_ROUGHNESS_FACTOR, clearcoat.clearcoatRoughnessFactor);
|
|
|
+
|
|
|
+ GetMatTex(mat, clearcoat.clearcoatTexture, AI_MATKEY_CLEARCOAT_TEXTURE);
|
|
|
+ GetMatTex(mat, clearcoat.clearcoatRoughnessTexture, AI_MATKEY_CLEARCOAT_ROUGHNESS_TEXTURE);
|
|
|
+ GetMatTex(mat, clearcoat.clearcoatNormalTexture, AI_MATKEY_CLEARCOAT_NORMAL_TEXTURE);
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+bool glTF2Exporter::GetMatTransmission(const aiMaterial &mat, glTF2::MaterialTransmission &transmission) {
|
|
|
+ bool result = mat.Get(AI_MATKEY_TRANSMISSION_FACTOR, transmission.transmissionFactor) == aiReturn_SUCCESS;
|
|
|
+ GetMatTex(mat, transmission.transmissionTexture, AI_MATKEY_TRANSMISSION_TEXTURE);
|
|
|
+ return result || transmission.transmissionTexture.texture;
|
|
|
+}
|
|
|
+
|
|
|
void glTF2Exporter::ExportMaterials()
|
|
|
{
|
|
|
aiString aiName;
|
|
|
for (unsigned int i = 0; i < mScene->mNumMaterials; ++i) {
|
|
|
- const aiMaterial* mat = mScene->mMaterials[i];
|
|
|
+ ai_assert(mScene->mMaterials[i] != nullptr);
|
|
|
+
|
|
|
+ const aiMaterial & mat = *(mScene->mMaterials[i]);
|
|
|
|
|
|
std::string id = "material_" + ai_to_string(i);
|
|
|
|
|
|
Ref<Material> m = mAsset->materials.Create(id);
|
|
|
|
|
|
std::string name;
|
|
|
- if (mat->Get(AI_MATKEY_NAME, aiName) == AI_SUCCESS) {
|
|
|
+ if (mat.Get(AI_MATKEY_NAME, aiName) == AI_SUCCESS) {
|
|
|
name = aiName.C_Str();
|
|
|
}
|
|
|
name = mAsset->FindUniqueID(name, "material");
|
|
|
|
|
|
m->name = name;
|
|
|
|
|
|
- GetMatTex(mat, m->pbrMetallicRoughness.baseColorTexture, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_TEXTURE);
|
|
|
+ GetMatTex(mat, m->pbrMetallicRoughness.baseColorTexture, aiTextureType_BASE_COLOR);
|
|
|
|
|
|
if (!m->pbrMetallicRoughness.baseColorTexture.texture) {
|
|
|
//if there wasn't a baseColorTexture defined in the source, fallback to any diffuse texture
|
|
@@ -653,26 +735,26 @@ void glTF2Exporter::ExportMaterials()
|
|
|
|
|
|
GetMatTex(mat, m->pbrMetallicRoughness.metallicRoughnessTexture, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE);
|
|
|
|
|
|
- if (GetMatColor(mat, m->pbrMetallicRoughness.baseColorFactor, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_BASE_COLOR_FACTOR) != AI_SUCCESS) {
|
|
|
+ if (GetMatColor(mat, m->pbrMetallicRoughness.baseColorFactor, AI_MATKEY_BASE_COLOR) != AI_SUCCESS) {
|
|
|
// if baseColorFactor wasn't defined, then the source is likely not a metallic roughness material.
|
|
|
//a fallback to any diffuse color should be used instead
|
|
|
GetMatColor(mat, m->pbrMetallicRoughness.baseColorFactor, AI_MATKEY_COLOR_DIFFUSE);
|
|
|
}
|
|
|
|
|
|
- if (mat->Get(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLIC_FACTOR, m->pbrMetallicRoughness.metallicFactor) != AI_SUCCESS) {
|
|
|
+ if (mat.Get(AI_MATKEY_METALLIC_FACTOR, m->pbrMetallicRoughness.metallicFactor) != AI_SUCCESS) {
|
|
|
//if metallicFactor wasn't defined, then the source is likely not a PBR file, and the metallicFactor should be 0
|
|
|
m->pbrMetallicRoughness.metallicFactor = 0;
|
|
|
}
|
|
|
|
|
|
// get roughness if source is gltf2 file
|
|
|
- if (mat->Get(AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_ROUGHNESS_FACTOR, m->pbrMetallicRoughness.roughnessFactor) != AI_SUCCESS) {
|
|
|
+ if (mat.Get(AI_MATKEY_ROUGHNESS_FACTOR, m->pbrMetallicRoughness.roughnessFactor) != AI_SUCCESS) {
|
|
|
// otherwise, try to derive and convert from specular + shininess values
|
|
|
aiColor4D specularColor;
|
|
|
ai_real shininess;
|
|
|
|
|
|
if (
|
|
|
- mat->Get(AI_MATKEY_COLOR_SPECULAR, specularColor) == AI_SUCCESS &&
|
|
|
- mat->Get(AI_MATKEY_SHININESS, shininess) == AI_SUCCESS
|
|
|
+ mat.Get(AI_MATKEY_COLOR_SPECULAR, specularColor) == AI_SUCCESS &&
|
|
|
+ mat.Get(AI_MATKEY_SHININESS, shininess) == AI_SUCCESS
|
|
|
) {
|
|
|
// convert specular color to luminance
|
|
|
float specularIntensity = specularColor[0] * 0.2125f + specularColor[1] * 0.7154f + specularColor[2] * 0.0721f;
|
|
@@ -693,17 +775,17 @@ void glTF2Exporter::ExportMaterials()
|
|
|
GetMatTex(mat, m->emissiveTexture, aiTextureType_EMISSIVE);
|
|
|
GetMatColor(mat, m->emissiveFactor, AI_MATKEY_COLOR_EMISSIVE);
|
|
|
|
|
|
- mat->Get(AI_MATKEY_TWOSIDED, m->doubleSided);
|
|
|
- mat->Get(AI_MATKEY_GLTF_ALPHACUTOFF, m->alphaCutoff);
|
|
|
+ mat.Get(AI_MATKEY_TWOSIDED, m->doubleSided);
|
|
|
+ mat.Get(AI_MATKEY_GLTF_ALPHACUTOFF, m->alphaCutoff);
|
|
|
|
|
|
aiString alphaMode;
|
|
|
|
|
|
- if (mat->Get(AI_MATKEY_GLTF_ALPHAMODE, alphaMode) == AI_SUCCESS) {
|
|
|
+ if (mat.Get(AI_MATKEY_GLTF_ALPHAMODE, alphaMode) == AI_SUCCESS) {
|
|
|
m->alphaMode = alphaMode.C_Str();
|
|
|
} else {
|
|
|
float opacity;
|
|
|
|
|
|
- if (mat->Get(AI_MATKEY_OPACITY, opacity) == AI_SUCCESS) {
|
|
|
+ if (mat.Get(AI_MATKEY_OPACITY, opacity) == AI_SUCCESS) {
|
|
|
if (opacity < 1) {
|
|
|
m->alphaMode = "BLEND";
|
|
|
m->pbrMetallicRoughness.baseColorFactor[3] *= opacity;
|
|
@@ -711,85 +793,44 @@ void glTF2Exporter::ExportMaterials()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- bool hasPbrSpecularGlossiness = false;
|
|
|
- mat->Get(AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS, hasPbrSpecularGlossiness);
|
|
|
-
|
|
|
- if (hasPbrSpecularGlossiness) {
|
|
|
-
|
|
|
- if (!mAsset->extensionsUsed.KHR_materials_pbrSpecularGlossiness) {
|
|
|
- mAsset->extensionsUsed.KHR_materials_pbrSpecularGlossiness = true;
|
|
|
- }
|
|
|
-
|
|
|
+ {
|
|
|
+ // KHR_materials_pbrSpecularGlossiness extension
|
|
|
+ // NOTE: This extension is being considered for deprecation (Dec 2020)
|
|
|
PbrSpecularGlossiness pbrSG;
|
|
|
-
|
|
|
- GetMatColor(mat, pbrSG.diffuseFactor, AI_MATKEY_COLOR_DIFFUSE);
|
|
|
- GetMatColor(mat, pbrSG.specularFactor, AI_MATKEY_COLOR_SPECULAR);
|
|
|
-
|
|
|
- if (mat->Get(AI_MATKEY_GLTF_PBRSPECULARGLOSSINESS_GLOSSINESS_FACTOR, pbrSG.glossinessFactor) != AI_SUCCESS) {
|
|
|
- float shininess;
|
|
|
-
|
|
|
- if (mat->Get(AI_MATKEY_SHININESS, shininess) == AI_SUCCESS) {
|
|
|
- pbrSG.glossinessFactor = shininess / 1000;
|
|
|
- }
|
|
|
+ if (GetMatSpecGloss(mat, pbrSG)) {
|
|
|
+ mAsset->extensionsUsed.KHR_materials_pbrSpecularGlossiness = true;
|
|
|
+ m->pbrSpecularGlossiness = Nullable<PbrSpecularGlossiness>(pbrSG);
|
|
|
}
|
|
|
-
|
|
|
- GetMatTex(mat, pbrSG.diffuseTexture, aiTextureType_DIFFUSE);
|
|
|
- GetMatTex(mat, pbrSG.specularGlossinessTexture, aiTextureType_SPECULAR);
|
|
|
-
|
|
|
- m->pbrSpecularGlossiness = Nullable<PbrSpecularGlossiness>(pbrSG);
|
|
|
}
|
|
|
|
|
|
- bool unlit;
|
|
|
- if (mat->Get(AI_MATKEY_GLTF_UNLIT, unlit) == AI_SUCCESS && unlit) {
|
|
|
+ // glTFv2 is either PBR or Unlit
|
|
|
+ aiShadingMode shadingMode = aiShadingMode_PBR_BRDF;
|
|
|
+ mat.Get(AI_MATKEY_SHADING_MODEL, shadingMode);
|
|
|
+ if (shadingMode == aiShadingMode_Unlit) {
|
|
|
mAsset->extensionsUsed.KHR_materials_unlit = true;
|
|
|
m->unlit = true;
|
|
|
- }
|
|
|
-
|
|
|
- bool hasMaterialSheen = false;
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_SHEEN, hasMaterialSheen);
|
|
|
-
|
|
|
- if (hasMaterialSheen) {
|
|
|
- mAsset->extensionsUsed.KHR_materials_sheen = true;
|
|
|
-
|
|
|
- MaterialSheen sheen;
|
|
|
-
|
|
|
- GetMatColor(mat, sheen.sheenColorFactor, AI_MATKEY_GLTF_MATERIAL_SHEEN_COLOR_FACTOR);
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_SHEEN_ROUGHNESS_FACTOR, sheen.sheenRoughnessFactor);
|
|
|
- GetMatTex(mat, sheen.sheenColorTexture, AI_MATKEY_GLTF_MATERIAL_SHEEN_COLOR_TEXTURE);
|
|
|
- GetMatTex(mat, sheen.sheenRoughnessTexture, AI_MATKEY_GLTF_MATERIAL_SHEEN_ROUGHNESS_TEXTURE);
|
|
|
-
|
|
|
- m->materialSheen = Nullable<MaterialSheen>(sheen);
|
|
|
- }
|
|
|
-
|
|
|
- bool hasMaterialClearcoat = false;
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_CLEARCOAT, hasMaterialClearcoat);
|
|
|
-
|
|
|
- if (hasMaterialClearcoat) {
|
|
|
- mAsset->extensionsUsed.KHR_materials_clearcoat= true;
|
|
|
-
|
|
|
- MaterialClearcoat clearcoat;
|
|
|
-
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_CLEARCOAT_FACTOR, clearcoat.clearcoatFactor);
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_CLEARCOAT_ROUGHNESS_FACTOR, clearcoat.clearcoatRoughnessFactor);
|
|
|
- GetMatTex(mat, clearcoat.clearcoatTexture, AI_MATKEY_GLTF_MATERIAL_CLEARCOAT_TEXTURE);
|
|
|
- GetMatTex(mat, clearcoat.clearcoatRoughnessTexture, AI_MATKEY_GLTF_MATERIAL_CLEARCOAT_ROUGHNESS_TEXTURE);
|
|
|
- GetMatTex(mat, clearcoat.clearcoatNormalTexture, AI_MATKEY_GLTF_MATERIAL_CLEARCOAT_NORMAL_TEXTURE);
|
|
|
-
|
|
|
- m->materialClearcoat = Nullable<MaterialClearcoat>(clearcoat);
|
|
|
- }
|
|
|
-
|
|
|
- bool hasMaterialTransmission = false;
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_TRANSMISSION, hasMaterialTransmission);
|
|
|
-
|
|
|
- if (hasMaterialTransmission) {
|
|
|
- mAsset->extensionsUsed.KHR_materials_transmission = true;
|
|
|
-
|
|
|
- MaterialTransmission transmission;
|
|
|
+ } else {
|
|
|
+ // These extensions are not compatible with KHR_materials_unlit or KHR_materials_pbrSpecularGlossiness
|
|
|
+ if (!m->pbrSpecularGlossiness.isPresent) {
|
|
|
+ // Sheen
|
|
|
+ MaterialSheen sheen;
|
|
|
+ if (GetMatSheen(mat, sheen)) {
|
|
|
+ mAsset->extensionsUsed.KHR_materials_sheen = true;
|
|
|
+ m->materialSheen = Nullable<MaterialSheen>(sheen);
|
|
|
+ }
|
|
|
|
|
|
- mat->Get(AI_MATKEY_GLTF_MATERIAL_TRANSMISSION_FACTOR, transmission.transmissionFactor);
|
|
|
- GetMatTex(mat, transmission.transmissionTexture, AI_MATKEY_GLTF_MATERIAL_TRANSMISSION_TEXTURE);
|
|
|
+ MaterialClearcoat clearcoat;
|
|
|
+ if (GetMatClearcoat(mat, clearcoat)) {
|
|
|
+ mAsset->extensionsUsed.KHR_materials_clearcoat = true;
|
|
|
+ m->materialClearcoat = Nullable<MaterialClearcoat>(clearcoat);
|
|
|
+ }
|
|
|
|
|
|
- m->materialTransmission = Nullable<MaterialTransmission>(transmission);
|
|
|
+ MaterialTransmission transmission;
|
|
|
+ if (GetMatTransmission(mat, transmission)) {
|
|
|
+ mAsset->extensionsUsed.KHR_materials_transmission = true;
|
|
|
+ m->materialTransmission = Nullable<MaterialTransmission>(transmission);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|