diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 3b7d18f1d8..5e7647263a 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -976,6 +976,8 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { data.extracted.mesh.meshIndex = meshIndex++; QVector materials; QVector textures; + bool isMaterialPerPolygon = false; + foreach (const FBXNode& child, object.children) { if (child.name == "Vertices") { data.vertices = createVec3Vector(getDoubleVector(child)); @@ -1105,8 +1107,16 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { foreach (const FBXNode& subdata, child.children) { if (subdata.name == "Materials") { materials = getIntVector(subdata); + } else if (subdata.name == "MappingInformationType") { + if (subdata.properties.at(0) == "ByPolygon") { + isMaterialPerPolygon = true; + } else { + isMaterialPerPolygon = false; + } } } + + } else if (child.name == "LayerElementTexture") { foreach (const FBXNode& subdata, child.children) { if (subdata.name == "TextureId") { @@ -1116,6 +1126,12 @@ ExtractedMesh extractMesh(const FBXNode& object, unsigned int& meshIndex) { } } + + bool isMultiMaterial = false; + if (isMaterialPerPolygon) { + isMultiMaterial = true; + } + // convert the polygons to quads and triangles int polygonIndex = 0; QHash, int> materialTextureParts; @@ -2104,6 +2120,9 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping, if (type.contains("diffuse")) { diffuseTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); + } 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)); } else if (type.contains("bump") || type.contains("normal")) { bumpTextures.insert(getID(connection.properties, 2), getID(connection.properties, 1)); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 22204e00f2..31b030f75a 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -2239,10 +2239,17 @@ bool NetworkMeshPart::isTranslucent() const { return diffuseTexture && diffuseTexture->isTranslucent(); } + +bool NetworkMesh::isPartTranslucent(const FBXMesh& fbxMesh, int partIndex) const { + assert(partIndex >= 0); + assert(partIndex < parts.size()); + return (parts.at(partIndex).isTranslucent() || fbxMesh.parts.at(partIndex).opacity != 1.0f); +} + int NetworkMesh::getTranslucentPartCount(const FBXMesh& fbxMesh) const { int count = 0; for (int i = 0; i < parts.size(); i++) { - if (parts.at(i).isTranslucent() || fbxMesh.parts.at(i).opacity != 1.0f) { + if (isPartTranslucent(fbxMesh, i)) { count++; } } diff --git a/libraries/render-utils/src/GeometryCache.h b/libraries/render-utils/src/GeometryCache.h index 812d12b846..f70eae6380 100644 --- a/libraries/render-utils/src/GeometryCache.h +++ b/libraries/render-utils/src/GeometryCache.h @@ -398,6 +398,7 @@ public: QVector parts; int getTranslucentPartCount(const FBXMesh& fbxMesh) const; + bool isPartTranslucent(const FBXMesh& fbxMesh, int partIndex) const; }; #endif // hifi_GeometryCache_h diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 43579892a7..8839a5b463 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1824,11 +1824,10 @@ void Model::segregateMeshGroups() { translucentMesh = hasTangents = hasSpecular = hasLightmap = isSkinned = false; } - // Debug... + // Create the render payloads int totalParts = mesh.parts.size(); for (int partIndex = 0; partIndex < totalParts; partIndex++) { - // this is a good place to create our renderPayloads - if (translucentMesh) { + if (networkMesh.isPartTranslucent(mesh, partIndex)) { _transparentRenderItems << std::make_shared(true, this, i, partIndex); } else { _opaqueRenderItems << std::make_shared(false, this, i, partIndex);