working on material mapping

This commit is contained in:
SamGondelman 2019-02-12 09:22:31 -08:00
parent 77a8ddb3f0
commit 61346437da
6 changed files with 31 additions and 17 deletions

View file

@ -2,4 +2,6 @@ set(TARGET_NAME model-baker)
setup_hifi_library()
link_hifi_libraries(shared shaders task gpu graphics hfm material-networking)
include_hifi_library_headers(networking)
include_hifi_library_headers(networking)
include_hifi_library_headers(image)
include_hifi_library_headers(ktx)

View file

@ -3,3 +3,6 @@ setup_hifi_library()
link_hifi_libraries(shared shaders networking graphics fbx material-networking model-baker)
include_hifi_library_headers(hfm)
include_hifi_library_headers(task)
include_hifi_library_headers(gpu)
include_hifi_library_headers(image)
include_hifi_library_headers(ktx)

View file

@ -365,7 +365,7 @@ public:
virtual ~Resource();
virtual QString getType() const { return "Resource"; }
/// Returns the key last used to identify this resource in the unused map.
int getLRUKey() const { return _lruKey; }
@ -374,13 +374,13 @@ public:
/// Sets the load priority for one owner.
virtual void setLoadPriority(const QPointer<QObject>& owner, float priority);
/// Sets a set of priorities at once.
virtual void setLoadPriorities(const QHash<QPointer<QObject>, float>& priorities);
/// Clears the load priority for one owner.
virtual void clearLoadPriority(const QPointer<QObject>& owner);
/// Returns the highest load priority across all owners.
float getLoadPriority();

View file

@ -64,6 +64,7 @@ void CauterizedModel::createRenderItemSet() {
_modelMeshRenderItems.clear();
_modelMeshMaterialNames.clear();
_modelMeshRenderItemShapes.clear();
_priorityMap.clear();
Transform transform;
transform.setTranslation(_translation);

View file

@ -1434,6 +1434,7 @@ void Model::createRenderItemSet() {
_modelMeshRenderItems.clear();
_modelMeshMaterialNames.clear();
_modelMeshRenderItemShapes.clear();
_priorityMap.clear();
Transform transform;
transform.setTranslation(_translation);
@ -1525,30 +1526,30 @@ void Model::applyMaterialMapping() {
PrimitiveMode primitiveMode = getPrimitiveMode();
bool useDualQuaternionSkinning = _useDualQuaternionSkinning;
render::Transaction transaction;
std::unordered_map<unsigned int, quint16> priorityMap;
auto& materialMapping = getMaterialMapping();
qDebug() << "boop" << materialMapping.size();
for (auto& mapping : materialMapping) {
std::set<unsigned int> shapeIDs = getMeshIDsFromMaterialID(QString(mapping.first.c_str()));
qDebug() << "boop2" << mapping.first.c_str() << shapeIDs.size();
if (shapeIDs.size() == 0) {
auto networkMaterialResource = mapping.second;
if (!networkMaterialResource || shapeIDs.size() == 0) {
continue;
}
auto networkMaterialResource = mapping.second;
qDebug() << (bool)networkMaterialResource;
if (networkMaterialResource && networkMaterialResource->isLoaded() && networkMaterialResource->parsedMaterials.names.size() > 0) {
auto materialLoaded = [this, networkMaterialResource, shapeIDs, renderItemsKey, primitiveMode, useDualQuaternionSkinning]() {
qDebug() << "boop2" << networkMaterialResource->isFailed() << networkMaterialResource->parsedMaterials.names.size();
if (networkMaterialResource->isFailed() || networkMaterialResource->parsedMaterials.names.size() > 0) {
return;
}
render::Transaction transaction;
auto networkMaterial = networkMaterialResource->parsedMaterials.networkMaterials[networkMaterialResource->parsedMaterials.names[0]];
for (auto shapeID : shapeIDs) {
qDebug() << "boop3" << shapeID << _modelMeshRenderItemIDs.size();
if (shapeID < _modelMeshRenderItemIDs.size()) {
auto itemID = _modelMeshRenderItemIDs[shapeID];
auto meshIndex = _modelMeshRenderItemShapes[shapeID].meshIndex;
bool invalidatePayloadShapeKey = shouldInvalidatePayloadShapeKey(meshIndex);
graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, ++priorityMap[shapeID]);
graphics::MaterialLayer material = graphics::MaterialLayer(networkMaterial, ++_priorityMap[shapeID]);
transaction.updateItem<ModelMeshPartPayload>(itemID, [material, renderItemsKey,
invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) {
invalidatePayloadShapeKey, primitiveMode, useDualQuaternionSkinning](ModelMeshPartPayload& data) {
data.addMaterial(material);
// if the material changed, we might need to update our item key or shape key
data.updateKey(renderItemsKey);
@ -1556,9 +1557,15 @@ void Model::applyMaterialMapping() {
});
}
}
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
};
qDebug() << "boop" << networkMaterialResource->isLoaded();
if (networkMaterialResource->isLoaded()) {
materialLoaded();
} else {
connect(networkMaterialResource.data(), &Resource::finished, materialLoaded);
}
}
AbstractViewStateInterface::instance()->getMain3DScene()->enqueueTransaction(transaction);
}
void Model::addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName) {

View file

@ -374,6 +374,7 @@ signals:
protected:
std::unordered_map<unsigned int, quint16> _priorityMap; // only used for materialMapping
void applyMaterialMapping();
void setBlendshapeCoefficients(const QVector<float>& coefficients) { _blendshapeCoefficients = coefficients; }