material mapping supports arrays

This commit is contained in:
SamGondelman 2019-04-01 15:05:04 -07:00
parent 585a022dca
commit cf4d864e7c

View file

@ -10,18 +10,9 @@
#include "ModelBakerLogging.h"
void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) {
const auto& mapping = input.get0();
const auto& url = input.get1();
MaterialMapping materialMapping;
#include <QJsonArray>
auto mappingIter = mapping.find("materialMap");
if (mappingIter != mapping.end()) {
QByteArray materialMapValue = mappingIter.value().toByteArray();
QJsonObject materialMap = QJsonDocument::fromJson(materialMapValue).object();
if (materialMap.isEmpty()) {
qCDebug(model_baker) << "Material Map found but did not produce valid JSON:" << materialMapValue;
} else {
void processMaterialMapping(MaterialMapping& materialMapping, const QJsonObject& materialMap, const hifi::URL& url) {
auto mappingKeys = materialMap.keys();
for (auto mapping : mappingKeys) {
auto mappingJSON = materialMap[mapping];
@ -47,7 +38,8 @@ void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, con
material->setDefaultFallthrough(true);
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(), [](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(),
[](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
materialResource->moveToThread(qApp->thread());
materialResource->parsedMaterials.names.push_back("scattering");
materialResource->parsedMaterials.networkMaterials["scattering"] = material;
@ -59,7 +51,8 @@ void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, con
// Material JSON description
{
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(), [](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(),
[](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
materialResource->moveToThread(qApp->thread());
materialResource->parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument(mappingValue), url);
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>(mapping.toStdString(), materialResource));
@ -67,7 +60,32 @@ void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, con
} else if (mappingJSON.isString()) {
auto mappingValue = mappingJSON.toString();
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>(mapping.toStdString(), MaterialCache::instance().getMaterial(url.resolved(mappingValue))));
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>(mapping.toStdString(),
MaterialCache::instance().getMaterial(url.resolved(mappingValue))));
}
}
}
void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) {
const auto& mapping = input.get0();
const auto& url = input.get1();
MaterialMapping materialMapping;
auto mappingIter = mapping.find("materialMap");
if (mappingIter != mapping.end()) {
QByteArray materialMapValue = mappingIter.value().toByteArray();
QJsonDocument materialMapJSON = QJsonDocument::fromJson(materialMapValue);
if (materialMapJSON.isEmpty()) {
qCDebug(model_baker) << "Material Map found but did not produce valid JSON:" << materialMapValue;
} else if (materialMapJSON.isObject()) {
QJsonObject materialMap = materialMapJSON.object();
processMaterialMapping(materialMapping, materialMap, url);
} else {
QJsonArray materialMapArray = materialMapJSON.array();
for (auto materialMapIter : materialMapArray) {
if (materialMapIter.isObject()) {
QJsonObject materialMap = materialMapIter.toObject();
processMaterialMapping(materialMapping, materialMap, url);
}
}
}