From e32929dce2742336b84310cf2f0a729e59307319 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Mon, 11 Jul 2016 17:40:07 -0700 Subject: [PATCH] added support for material map in FST file --- libraries/fbx/src/FBXReader.cpp | 2 +- libraries/fbx/src/FBXReader.h | 2 +- libraries/fbx/src/FBXReader_Material.cpp | 27 ++++++++++++++++-------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 8c9cdb2110..6afaf933f2 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -1366,7 +1366,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS geometry.meshExtents.reset(); // Create the Material Library - consolidateFBXMaterials(); + consolidateFBXMaterials(mapping); geometry.materials = _fbxMaterials; // see if any materials have texture children diff --git a/libraries/fbx/src/FBXReader.h b/libraries/fbx/src/FBXReader.h index 606c6832d0..d2d433d53e 100644 --- a/libraries/fbx/src/FBXReader.h +++ b/libraries/fbx/src/FBXReader.h @@ -444,7 +444,7 @@ public: QHash _fbxMaterials; - void consolidateFBXMaterials(); + void consolidateFBXMaterials(const QVariantHash& mapping); bool _loadLightmaps = true; float _lightmapOffset = 0.0f; diff --git a/libraries/fbx/src/FBXReader_Material.cpp b/libraries/fbx/src/FBXReader_Material.cpp index 0517dcd4ec..48b210b88e 100644 --- a/libraries/fbx/src/FBXReader_Material.cpp +++ b/libraries/fbx/src/FBXReader_Material.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include "FBXReader.h" #include @@ -67,9 +69,13 @@ FBXTexture FBXReader::getTexture(const QString& textureID) { return texture; } -void FBXReader::consolidateFBXMaterials() { - - // foreach (const QString& materialID, materials) { +void FBXReader::consolidateFBXMaterials(const QVariantHash& mapping) { + + QString materialMapString = mapping.value("materialMap").toString(); + QJsonDocument materialMapDocument = QJsonDocument::fromJson(materialMapString.toUtf8()); + QJsonObject materialMap = materialMapDocument.object(); + + // foreach (const QString& materialID, materials) { for (QHash::iterator it = _fbxMaterials.begin(); it != _fbxMaterials.end(); it++) { FBXMaterial& material = (*it); @@ -253,12 +259,15 @@ void FBXReader::consolidateFBXMaterials() { } } - if (material.name.contains("body_mat") || material.name.contains("skin")) { - material._material->setScattering(1.0); - if (!material.emissiveTexture.isNull()) { - material.scatteringTexture = material.emissiveTexture; - material.emissiveTexture = FBXTexture(); - } + if (materialMap.contains(material.name)) { + QJsonObject materialOptions = materialMap.value(material.name).toObject(); + float scattering = materialOptions.contains("scattering") ? materialOptions.value("scattering").toDouble() : 1.0f; + QByteArray scatteringMap = materialOptions.value("scatteringMap").toVariant().toByteArray(); + qDebug() << "Replacing material:" << material.name << "with skin scattering effect. scattering:" << scattering << "scatteringMap:" << scatteringMap; + material._material->setScattering(scattering); + material.scatteringTexture = FBXTexture(); + material.scatteringTexture.name = material.name + ".scatteringMap"; + material.scatteringTexture.filename = scatteringMap; } if (material.opacity <= 0.0f) {