mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 00:47:33 +02:00
working on material mapping
This commit is contained in:
parent
77a8ddb3f0
commit
61346437da
6 changed files with 31 additions and 17 deletions
|
@ -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)
|
|
@ -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)
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ void CauterizedModel::createRenderItemSet() {
|
|||
_modelMeshRenderItems.clear();
|
||||
_modelMeshMaterialNames.clear();
|
||||
_modelMeshRenderItemShapes.clear();
|
||||
_priorityMap.clear();
|
||||
|
||||
Transform transform;
|
||||
transform.setTranslation(_translation);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in a new issue