mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:58:27 +02:00
material mapping supports arrays
This commit is contained in:
parent
585a022dca
commit
cf4d864e7c
1 changed files with 66 additions and 48 deletions
|
@ -10,6 +10,62 @@
|
||||||
|
|
||||||
#include "ModelBakerLogging.h"
|
#include "ModelBakerLogging.h"
|
||||||
|
|
||||||
|
#include <QJsonArray>
|
||||||
|
|
||||||
|
void processMaterialMapping(MaterialMapping& materialMapping, const QJsonObject& materialMap, const hifi::URL& url) {
|
||||||
|
auto mappingKeys = materialMap.keys();
|
||||||
|
for (auto mapping : mappingKeys) {
|
||||||
|
auto mappingJSON = materialMap[mapping];
|
||||||
|
if (mappingJSON.isObject()) {
|
||||||
|
auto mappingValue = mappingJSON.toObject();
|
||||||
|
|
||||||
|
// Old subsurface scattering mapping
|
||||||
|
{
|
||||||
|
auto scatteringIter = mappingValue.find("scattering");
|
||||||
|
auto scatteringMapIter = mappingValue.find("scatteringMap");
|
||||||
|
if (scatteringIter != mappingValue.end() || scatteringMapIter != mappingValue.end()) {
|
||||||
|
std::shared_ptr<NetworkMaterial> material = std::make_shared<NetworkMaterial>();
|
||||||
|
|
||||||
|
if (scatteringIter != mappingValue.end()) {
|
||||||
|
float scattering = (float)scatteringIter.value().toDouble();
|
||||||
|
material->setScattering(scattering);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scatteringMapIter != mappingValue.end()) {
|
||||||
|
QString scatteringMap = scatteringMapIter.value().toString();
|
||||||
|
material->setScatteringMap(scatteringMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
material->setDefaultFallthrough(true);
|
||||||
|
|
||||||
|
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(),
|
||||||
|
[](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
|
||||||
|
materialResource->moveToThread(qApp->thread());
|
||||||
|
materialResource->parsedMaterials.names.push_back("scattering");
|
||||||
|
materialResource->parsedMaterials.networkMaterials["scattering"] = material;
|
||||||
|
|
||||||
|
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>("mat::" + mapping.toStdString(), materialResource));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Material JSON description
|
||||||
|
{
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (mappingJSON.isString()) {
|
||||||
|
auto mappingValue = mappingJSON.toString();
|
||||||
|
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) {
|
void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, const Input& input, Output& output) {
|
||||||
const auto& mapping = input.get0();
|
const auto& mapping = input.get0();
|
||||||
const auto& url = input.get1();
|
const auto& url = input.get1();
|
||||||
|
@ -18,56 +74,18 @@ void ParseMaterialMappingTask::run(const baker::BakeContextPointer& context, con
|
||||||
auto mappingIter = mapping.find("materialMap");
|
auto mappingIter = mapping.find("materialMap");
|
||||||
if (mappingIter != mapping.end()) {
|
if (mappingIter != mapping.end()) {
|
||||||
QByteArray materialMapValue = mappingIter.value().toByteArray();
|
QByteArray materialMapValue = mappingIter.value().toByteArray();
|
||||||
QJsonObject materialMap = QJsonDocument::fromJson(materialMapValue).object();
|
QJsonDocument materialMapJSON = QJsonDocument::fromJson(materialMapValue);
|
||||||
if (materialMap.isEmpty()) {
|
if (materialMapJSON.isEmpty()) {
|
||||||
qCDebug(model_baker) << "Material Map found but did not produce valid JSON:" << materialMapValue;
|
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 {
|
} else {
|
||||||
auto mappingKeys = materialMap.keys();
|
QJsonArray materialMapArray = materialMapJSON.array();
|
||||||
for (auto mapping : mappingKeys) {
|
for (auto materialMapIter : materialMapArray) {
|
||||||
auto mappingJSON = materialMap[mapping];
|
if (materialMapIter.isObject()) {
|
||||||
if (mappingJSON.isObject()) {
|
QJsonObject materialMap = materialMapIter.toObject();
|
||||||
auto mappingValue = mappingJSON.toObject();
|
processMaterialMapping(materialMapping, materialMap, url);
|
||||||
|
|
||||||
// Old subsurface scattering mapping
|
|
||||||
{
|
|
||||||
auto scatteringIter = mappingValue.find("scattering");
|
|
||||||
auto scatteringMapIter = mappingValue.find("scatteringMap");
|
|
||||||
if (scatteringIter != mappingValue.end() || scatteringMapIter != mappingValue.end()) {
|
|
||||||
std::shared_ptr<NetworkMaterial> material = std::make_shared<NetworkMaterial>();
|
|
||||||
|
|
||||||
if (scatteringIter != mappingValue.end()) {
|
|
||||||
float scattering = (float)scatteringIter.value().toDouble();
|
|
||||||
material->setScattering(scattering);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scatteringMapIter != mappingValue.end()) {
|
|
||||||
QString scatteringMap = scatteringMapIter.value().toString();
|
|
||||||
material->setScatteringMap(scatteringMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
material->setDefaultFallthrough(true);
|
|
||||||
|
|
||||||
NetworkMaterialResourcePointer materialResource = NetworkMaterialResourcePointer(new NetworkMaterialResource(), [](NetworkMaterialResource* ptr) { ptr->deleteLater(); });
|
|
||||||
materialResource->moveToThread(qApp->thread());
|
|
||||||
materialResource->parsedMaterials.names.push_back("scattering");
|
|
||||||
materialResource->parsedMaterials.networkMaterials["scattering"] = material;
|
|
||||||
|
|
||||||
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>("mat::" + mapping.toStdString(), materialResource));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Material JSON description
|
|
||||||
{
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (mappingJSON.isString()) {
|
|
||||||
auto mappingValue = mappingJSON.toString();
|
|
||||||
materialMapping.push_back(std::pair<std::string, NetworkMaterialResourcePointer>(mapping.toStdString(), MaterialCache::instance().getMaterial(url.resolved(mappingValue))));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue