diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 500f856450..2be04c30bd 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -865,11 +865,10 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS } } else if (object.name == "Material") { FBXMaterial material; - if (object.properties.at(1).toByteArray().contains("StingrayPBS")) { - material.isPBSMaterial = true; - } + material.name = (object.properties.at(1).toString()); foreach (const FBXNode& subobject, object.children) { bool properties = false; + QByteArray propertyName; int index; if (subobject.name == "Properties60") { @@ -882,25 +881,33 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS propertyName = "P"; index = 4; } - if (!material.isPBSMaterial && properties) { - foreach (const FBXNode& property, subobject.children) { + if (properties) { + std::vector unknowns; + foreach(const FBXNode& property, subobject.children) { if (property.name == propertyName) { if (property.properties.at(0) == "DiffuseColor") { material.diffuseColor = getVec3(property.properties, index); - } else if (property.properties.at(0) == "Diffuse") { - material.diffuseColor = getVec3(property.properties, index); } else if (property.properties.at(0) == "DiffuseFactor") { material.diffuseFactor = property.properties.at(index).value(); + } else if (property.properties.at(0) == "Diffuse") { + // material.diffuseColor = getVec3(property.properties, index); + // material.diffuseFactor = 1.0; } else if (property.properties.at(0) == "SpecularColor") { material.specularColor = getVec3(property.properties, index); - } else if (property.properties.at(0) == "Specular") { - material.specularColor = getVec3(property.properties, index); } else if (property.properties.at(0) == "SpecularFactor") { material.specularFactor = property.properties.at(index).value(); + } else if (property.properties.at(0) == "Specular") { + // material.specularColor = getVec3(property.properties, index); + // material.specularFactor = 1.0; - } else if (property.properties.at(0) == "Emissive") { + } else if (property.properties.at(0) == "EmissiveColor") { material.emissiveColor = getVec3(property.properties, index); + } else if (property.properties.at(0) == "EmissiveFactor") { + material.emissiveFactor = property.properties.at(index).value(); + } else if (property.properties.at(0) == "Emissive") { + // material.emissiveColor = getVec3(property.properties, index); + // material.emissiveFactor = 1.0; } else if (property.properties.at(0) == "Shininess") { material.shininess = property.properties.at(index).value(); @@ -908,42 +915,39 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS } else if (property.properties.at(0) == "Opacity") { material.opacity = property.properties.at(index).value(); } -#if defined(DEBUG_FBXREADER) - else { - const QString propname = property.properties.at(0).toString(); - if (propname == "EmissiveFactor") { - } - } -#endif - } - } - } else if (material.isPBSMaterial && properties) { - std::vector unknowns; - foreach(const FBXNode& property, subobject.children) { - if (property.name == propertyName) { - if (property.properties.at(0) == "Maya|use_normal_map") { + // Sting Ray Material Properties!!!! + else if (property.properties.at(0) == "Maya|use_normal_map") { + material.isPBSMaterial = true; material.useNormalMap = (bool)property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|base_color") { + material.isPBSMaterial = true; material.diffuseColor = getVec3(property.properties, index); } else if (property.properties.at(0) == "Maya|use_color_map") { + material.isPBSMaterial = true; material.useAlbedoMap = (bool) property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|roughness") { + material.isPBSMaterial = true; material.roughness = property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|use_roughness_map") { + material.isPBSMaterial = true; material.useRoughnessMap = (bool)property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|metallic") { + material.isPBSMaterial = true; material.metallic = property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|use_metallic_map") { + material.isPBSMaterial = true; material.useMetallicMap = (bool)property.properties.at(index).value(); - } else if (property.properties.at(0) == "Maya|emissive") { + material.isPBSMaterial = true; material.emissiveColor = getVec3(property.properties, index); } else if (property.properties.at(0) == "Maya|emissive_intensity") { + material.isPBSMaterial = true; material.emissiveIntensity = property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|use_emissive_map") { + material.isPBSMaterial = true; material.useEmissiveMap = (bool)property.properties.at(index).value(); } else if (property.properties.at(0) == "Maya|use_ao_map") { @@ -1071,7 +1075,9 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS if (connection.properties.at(0) == "OP") { int counter = 0; QByteArray type = connection.properties.at(3).toByteArray().toLower(); - if ((type.contains("diffuse") && !type.contains("tex_global_diffuse"))) { + if (type.contains("DiffuseFactor")) { + diffuseFactorTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); + } else if ((type.contains("diffuse") && !type.contains("tex_global_diffuse"))) { diffuseTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); } else if (type.contains("tex_color_map")) { diffuseTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 3fefd837f3..53918bd149 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -143,6 +143,8 @@ public: float specularFactor = 1.0f; glm::vec3 emissiveColor{ 0.0f }; + float emissiveFactor = 0.0f; + float shininess = 23.0f; float opacity = 1.0f; @@ -151,6 +153,7 @@ public: float emissiveIntensity{ 1.0f }; QString materialID; + QString name; model::MaterialPointer _material; FBXTexture normalTexture; @@ -417,6 +420,7 @@ public: QHash diffuseTextures; + QHash diffuseFactorTextures; QHash transparentTextures; QHash bumpTextures; QHash normalTextures; diff --git a/libraries/fbx/src/FBXReader_Material.cpp b/libraries/fbx/src/FBXReader_Material.cpp index d87eac405f..f3b728ef46 100644 --- a/libraries/fbx/src/FBXReader_Material.cpp +++ b/libraries/fbx/src/FBXReader_Material.cpp @@ -68,12 +68,22 @@ void FBXReader::consolidateFBXMaterials() { // the pure material associated with this part bool detectDifferentUVs = false; FBXTexture diffuseTexture; + FBXTexture diffuseFactorTexture; QString diffuseTextureID = diffuseTextures.value(material.materialID); - if (!diffuseTextureID.isNull()) { + QString diffuseFactorTextureID = diffuseFactorTextures.value(material.materialID); + + if (!diffuseFactorTextureID.isNull() || !diffuseTextureID.isNull()) { + // If both factor and color are specified, color wins + if (!diffuseFactorTextureID.isNull() && diffuseTextureID.isNull()) { + diffuseTextureID = diffuseFactorTextureID; + // Avoid the DiffuseFactor effect in this case because here Maya would put 0.5... + material.diffuseFactor = 1.0; + } + diffuseTexture = getTexture(diffuseTextureID); - + // FBX files generated by 3DSMax have an intermediate texture parent, apparently - foreach (const QString& childTextureID, _connectionChildMap.values(diffuseTextureID)) { + foreach(const QString& childTextureID, _connectionChildMap.values(diffuseTextureID)) { if (_textureFilenames.contains(childTextureID)) { diffuseTexture = getTexture(diffuseTextureID); } @@ -173,11 +183,10 @@ void FBXReader::consolidateFBXMaterials() { // Finally create the true material representation material._material = std::make_shared(); - material._material->setEmissive(material.emissiveColor); + material._material->setEmissive(material.emissiveColor * material.emissiveFactor); + // Do not use the Diffuse Factor from FBX at all, this simpliies the export path auto diffuse = material.diffuseColor; - // FIXME: Do not use the Diffuse Factor yet as some FBX models have it set to 0 - // diffuse *= material.diffuseFactor; material._material->setAlbedo(diffuse); if (material.isPBSMaterial) {