diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 1be3bbb5f6..70de307f1b 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -1035,7 +1035,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS } else if (type.contains("transparentcolor")) { // it should be TransparentColor... // THis is how Maya assign a texture that affect diffuse color AND transparency ? - diffuseTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); + opacityTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); } else if (type.contains("bump")) { bumpTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); } else if (type.contains("normal")) { diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 51cb5baf9f..8b1b0d2588 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -402,6 +402,7 @@ public: QHash specularTextures; QHash emissiveTextures; QHash ambientTextures; + QHash opacityTextures; QHash _fbxMaterials; diff --git a/libraries/fbx/src/FBXReader_Material.cpp b/libraries/fbx/src/FBXReader_Material.cpp index b2b6d12d01..1329fccc3a 100644 --- a/libraries/fbx/src/FBXReader_Material.cpp +++ b/libraries/fbx/src/FBXReader_Material.cpp @@ -70,8 +70,7 @@ void FBXReader::consolidateFBXMaterials() { FBXTexture diffuseTexture; QString diffuseTextureID = diffuseTextures.value(material.materialID); if (!diffuseTextureID.isNull()) { - diffuseTexture = getTexture(diffuseTextureID); - + diffuseTexture = getTexture(diffuseTextureID); // FBX files generated by 3DSMax have an intermediate texture parent, apparently foreach (const QString& childTextureID, _connectionChildMap.values(diffuseTextureID)) { if (_textureFilenames.contains(childTextureID)) { @@ -80,10 +79,16 @@ void FBXReader::consolidateFBXMaterials() { } material.diffuseTexture = diffuseTexture; - material.opacityTexture = diffuseTexture; - detectDifferentUVs = (diffuseTexture.texcoordSet != 0) || (!diffuseTexture.transform.isIdentity()); } + + FBXTexture opacityTexture; + QString opacityTextureID = opacityTextures.value(material.materialID); + if (!opacityTextureID.isNull()) { + opacityTexture = getTexture(opacityTextureID); + material.opacityTexture = opacityTexture; + } + FBXTexture normalTexture; QString bumpTextureID = bumpTextures.value(material.materialID); diff --git a/libraries/model-networking/src/model-networking/ModelCache.cpp b/libraries/model-networking/src/model-networking/ModelCache.cpp index 0023163edc..ef649fd7ae 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.cpp +++ b/libraries/model-networking/src/model-networking/ModelCache.cpp @@ -155,6 +155,8 @@ void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& u material->specularTexture = textureCache->getTexture(url); } else if (material->emissiveTextureName == name) { material->emissiveTexture = textureCache->getTexture(url); + } else if (material->opacityTextureName == name) { + material->opacityTexture = textureCache->getTexture(url); } } } else { @@ -285,7 +287,16 @@ static NetworkMaterial* buildNetworkMaterial(const FBXMaterial& material, const diffuseMap->setTextureTransform(material.diffuseTexture.transform); material._material->setTextureMap(model::MaterialKey::DIFFUSE_MAP, diffuseMap); - material._material->setTextureMap(model::MaterialKey::TRANSPARENT_MAP, diffuseMap); + } + if (!material.opacityTexture.filename.isEmpty()) { + networkMaterial->opacityTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.opacityTexture.filename)), DEFAULT_TEXTURE, material.opacityTexture.content); + networkMaterial->opacityTextureName = material.opacityTexture.name; + + auto opacityMap = model::TextureMapPointer(new model::TextureMap()); + opacityMap->setTextureSource(networkMaterial->opacityTexture->_textureSource); + opacityMap->setTextureTransform(material.opacityTexture.transform); + + material._material->setTextureMap(model::MaterialKey::TRANSPARENT_MAP, opacityMap); } if (!material.normalTexture.filename.isEmpty()) { networkMaterial->normalTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.normalTexture.filename)), (material.normalTexture.isBumpmap ? BUMP_TEXTURE : NORMAL_TEXTURE), material.normalTexture.content); diff --git a/libraries/model-networking/src/model-networking/ModelCache.h b/libraries/model-networking/src/model-networking/ModelCache.h index b2d81c5900..53f17f4e6c 100644 --- a/libraries/model-networking/src/model-networking/ModelCache.h +++ b/libraries/model-networking/src/model-networking/ModelCache.h @@ -182,6 +182,8 @@ public: QSharedPointer specularTexture; QString emissiveTextureName; QSharedPointer emissiveTexture; + QString opacityTextureName; + QSharedPointer opacityTexture; };