From 3df231f1e06cf48bdcadf21d217354465c10715d Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 15 Feb 2019 14:43:22 -0800 Subject: [PATCH] it's working! --- interface/src/Application.cpp | 2 + .../src/RenderableMaterialEntityItem.cpp | 58 ++++++++++++------- .../src/RenderableMaterialEntityItem.h | 5 +- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7691e06b5d..1bbe7a814d 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1919,6 +1919,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto renderable = getEntities()->renderableForEntityId(entityID); if (renderable) { renderable->addMaterial(material, parentMaterialName); + return true; } return false; @@ -1931,6 +1932,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo auto renderable = getEntities()->renderableForEntityId(entityID); if (renderable) { renderable->removeMaterial(material, parentMaterialName); + return true; } return false; diff --git a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp index 31b862000b..8f11bdc31f 100644 --- a/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableMaterialEntityItem.cpp @@ -117,30 +117,29 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo bool addNeeded = _retryApply; bool urlChanged = false; + std::string newCurrentMaterialName = _currentMaterialName; { QString materialURL = entity->getMaterialURL(); if (materialURL != _materialURL) { _materialURL = materialURL; if (_materialURL.contains("?")) { auto split = _materialURL.split("?"); - _currentMaterialName = split.last().toStdString(); + newCurrentMaterialName = split.last().toStdString(); } urlChanged = true; } } bool usingMaterialData = _materialURL.startsWith("materialData"); + bool materialDataChanged = false; + QUuid oldParentID = _parentID; + QString oldParentMaterialName = _parentMaterialName; { QString materialData = entity->getMaterialData(); if (materialData != _materialData) { _materialData = materialData; if (usingMaterialData) { - _texturesLoaded = false; - deleteNeeded = true; - addNeeded = true; - _parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument::fromJson(_materialData.toUtf8()), _materialURL); - // Since our material changed, the current name might not be valid anymore, so we need to update - setCurrentMaterialName(_currentMaterialName); + materialDataChanged = true; } } } @@ -152,7 +151,6 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo addNeeded = true; } } - QUuid oldParentID = _parentID; { QUuid parentID = entity->getParentID(); if (parentID != _parentID) { @@ -172,13 +170,17 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo if (urlChanged && !usingMaterialData) { _networkMaterial = MaterialCache::instance().getMaterial(_materialURL); - auto onMaterialRequestFinished = [&, oldParentID](bool success) { + auto onMaterialRequestFinished = [&, oldParentID, oldParentMaterialName, newCurrentMaterialName](bool success) { if (success) { + deleteMaterial(oldParentID, oldParentMaterialName); _texturesLoaded = false; _parsedMaterials = _networkMaterial->parsedMaterials; - setCurrentMaterialName(_currentMaterialName); - deleteMaterial(oldParentID); + setCurrentMaterialName(newCurrentMaterialName); applyMaterial(); + } else { + deleteMaterial(oldParentID, oldParentMaterialName); + _retryApply = false; + _texturesLoaded = true; } }; if (_networkMaterial) { @@ -188,9 +190,16 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo connect(_networkMaterial.data(), &Resource::finished, this, onMaterialRequestFinished); } } + } else if (materialDataChanged && usingMaterialData) { + deleteMaterial(oldParentID, oldParentMaterialName); + _texturesLoaded = false; + _parsedMaterials = NetworkMaterialResource::parseJSONMaterials(QJsonDocument::fromJson(_materialData.toUtf8()), _materialURL); + // Since our material changed, the current name might not be valid anymore, so we need to update + setCurrentMaterialName(newCurrentMaterialName); + applyMaterial(); } else { if (deleteNeeded) { - deleteMaterial(oldParentID); + deleteMaterial(oldParentID, oldParentMaterialName); } if (addNeeded) { applyMaterial(); @@ -328,21 +337,21 @@ std::shared_ptr MaterialEntityRenderer::getMaterial() const { } } -void MaterialEntityRenderer::deleteMaterial(const QUuid& oldParentID) { - std::shared_ptr material = getMaterial(); - if (!material) { - return; - } - if (oldParentID.isNull()) { +void MaterialEntityRenderer::deleteMaterial(const QUuid& oldParentID, const QString& oldParentMaterialName) { + std::shared_ptr material = _appliedMaterial; + if (!material || oldParentID.isNull()) { return; } // Our parent could be an entity or an avatar - if (EntityTreeRenderer::removeMaterialFromEntity(oldParentID, material, _parentMaterialName.toStdString())) { + std::string oldParentMaterialNameStd = oldParentMaterialName.toStdString(); + if (EntityTreeRenderer::removeMaterialFromEntity(oldParentID, material, oldParentMaterialNameStd)) { + _appliedMaterial = nullptr; return; } - if (EntityTreeRenderer::removeMaterialFromAvatar(oldParentID, material, _parentMaterialName.toStdString())) { + if (EntityTreeRenderer::removeMaterialFromAvatar(oldParentID, material, oldParentMaterialNameStd)) { + _appliedMaterial = nullptr; return; } @@ -366,9 +375,11 @@ void MaterialEntityRenderer::applyTextureTransform(std::shared_ptr& material = getMaterial(); QUuid parentID = _parentID; if (!material || parentID.isNull()) { + _appliedMaterial = nullptr; return; } @@ -377,11 +388,14 @@ void MaterialEntityRenderer::applyMaterial() { graphics::MaterialLayer materialLayer = graphics::MaterialLayer(material, _priority); // Our parent could be an entity or an avatar - if (EntityTreeRenderer::addMaterialToEntity(parentID, materialLayer, _parentMaterialName.toStdString())) { + std::string parentMaterialName = _parentMaterialName.toStdString(); + if (EntityTreeRenderer::addMaterialToEntity(parentID, materialLayer, parentMaterialName)) { + _appliedMaterial = material; return; } - if (EntityTreeRenderer::addMaterialToAvatar(parentID, materialLayer, _parentMaterialName.toStdString())) { + if (EntityTreeRenderer::addMaterialToAvatar(parentID, materialLayer, parentMaterialName)) { + _appliedMaterial = material; return; } diff --git a/libraries/entities-renderer/src/RenderableMaterialEntityItem.h b/libraries/entities-renderer/src/RenderableMaterialEntityItem.h index b68aee9d48..d714727c7a 100644 --- a/libraries/entities-renderer/src/RenderableMaterialEntityItem.h +++ b/libraries/entities-renderer/src/RenderableMaterialEntityItem.h @@ -24,7 +24,7 @@ class MaterialEntityRenderer : public TypedEntityRenderer { using Pointer = std::shared_ptr; public: MaterialEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {} - ~MaterialEntityRenderer() { deleteMaterial(_parentID); } + ~MaterialEntityRenderer() { deleteMaterial(_parentID, _parentMaterialName); } private: virtual bool needsRenderUpdate() const override; @@ -57,10 +57,11 @@ private: void applyTextureTransform(std::shared_ptr& material); void applyMaterial(); - void deleteMaterial(const QUuid& oldParentID); + void deleteMaterial(const QUuid& oldParentID, const QString& oldParentMaterialName); NetworkMaterialResourcePointer _networkMaterial; NetworkMaterialResource::ParsedMaterials _parsedMaterials; + std::shared_ptr _appliedMaterial; std::string _currentMaterialName; };