it's working!

This commit is contained in:
SamGondelman 2019-02-15 14:43:22 -08:00
parent c92b82e744
commit 3df231f1e0
3 changed files with 41 additions and 24 deletions

View file

@ -1919,6 +1919,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
auto renderable = getEntities()->renderableForEntityId(entityID); auto renderable = getEntities()->renderableForEntityId(entityID);
if (renderable) { if (renderable) {
renderable->addMaterial(material, parentMaterialName); renderable->addMaterial(material, parentMaterialName);
return true;
} }
return false; return false;
@ -1931,6 +1932,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
auto renderable = getEntities()->renderableForEntityId(entityID); auto renderable = getEntities()->renderableForEntityId(entityID);
if (renderable) { if (renderable) {
renderable->removeMaterial(material, parentMaterialName); renderable->removeMaterial(material, parentMaterialName);
return true;
} }
return false; return false;

View file

@ -117,30 +117,29 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
bool addNeeded = _retryApply; bool addNeeded = _retryApply;
bool urlChanged = false; bool urlChanged = false;
std::string newCurrentMaterialName = _currentMaterialName;
{ {
QString materialURL = entity->getMaterialURL(); QString materialURL = entity->getMaterialURL();
if (materialURL != _materialURL) { if (materialURL != _materialURL) {
_materialURL = materialURL; _materialURL = materialURL;
if (_materialURL.contains("?")) { if (_materialURL.contains("?")) {
auto split = _materialURL.split("?"); auto split = _materialURL.split("?");
_currentMaterialName = split.last().toStdString(); newCurrentMaterialName = split.last().toStdString();
} }
urlChanged = true; urlChanged = true;
} }
} }
bool usingMaterialData = _materialURL.startsWith("materialData"); bool usingMaterialData = _materialURL.startsWith("materialData");
bool materialDataChanged = false;
QUuid oldParentID = _parentID;
QString oldParentMaterialName = _parentMaterialName;
{ {
QString materialData = entity->getMaterialData(); QString materialData = entity->getMaterialData();
if (materialData != _materialData) { if (materialData != _materialData) {
_materialData = materialData; _materialData = materialData;
if (usingMaterialData) { if (usingMaterialData) {
_texturesLoaded = false; materialDataChanged = true;
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);
} }
} }
} }
@ -152,7 +151,6 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
addNeeded = true; addNeeded = true;
} }
} }
QUuid oldParentID = _parentID;
{ {
QUuid parentID = entity->getParentID(); QUuid parentID = entity->getParentID();
if (parentID != _parentID) { if (parentID != _parentID) {
@ -172,13 +170,17 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
if (urlChanged && !usingMaterialData) { if (urlChanged && !usingMaterialData) {
_networkMaterial = MaterialCache::instance().getMaterial(_materialURL); _networkMaterial = MaterialCache::instance().getMaterial(_materialURL);
auto onMaterialRequestFinished = [&, oldParentID](bool success) { auto onMaterialRequestFinished = [&, oldParentID, oldParentMaterialName, newCurrentMaterialName](bool success) {
if (success) { if (success) {
deleteMaterial(oldParentID, oldParentMaterialName);
_texturesLoaded = false; _texturesLoaded = false;
_parsedMaterials = _networkMaterial->parsedMaterials; _parsedMaterials = _networkMaterial->parsedMaterials;
setCurrentMaterialName(_currentMaterialName); setCurrentMaterialName(newCurrentMaterialName);
deleteMaterial(oldParentID);
applyMaterial(); applyMaterial();
} else {
deleteMaterial(oldParentID, oldParentMaterialName);
_retryApply = false;
_texturesLoaded = true;
} }
}; };
if (_networkMaterial) { if (_networkMaterial) {
@ -188,9 +190,16 @@ void MaterialEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo
connect(_networkMaterial.data(), &Resource::finished, this, onMaterialRequestFinished); 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 { } else {
if (deleteNeeded) { if (deleteNeeded) {
deleteMaterial(oldParentID); deleteMaterial(oldParentID, oldParentMaterialName);
} }
if (addNeeded) { if (addNeeded) {
applyMaterial(); applyMaterial();
@ -328,21 +337,21 @@ std::shared_ptr<NetworkMaterial> MaterialEntityRenderer::getMaterial() const {
} }
} }
void MaterialEntityRenderer::deleteMaterial(const QUuid& oldParentID) { void MaterialEntityRenderer::deleteMaterial(const QUuid& oldParentID, const QString& oldParentMaterialName) {
std::shared_ptr<NetworkMaterial> material = getMaterial(); std::shared_ptr<NetworkMaterial> material = _appliedMaterial;
if (!material) { if (!material || oldParentID.isNull()) {
return;
}
if (oldParentID.isNull()) {
return; return;
} }
// Our parent could be an entity or an avatar // 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; return;
} }
if (EntityTreeRenderer::removeMaterialFromAvatar(oldParentID, material, _parentMaterialName.toStdString())) { if (EntityTreeRenderer::removeMaterialFromAvatar(oldParentID, material, oldParentMaterialNameStd)) {
_appliedMaterial = nullptr;
return; return;
} }
@ -366,9 +375,11 @@ void MaterialEntityRenderer::applyTextureTransform(std::shared_ptr<NetworkMateri
void MaterialEntityRenderer::applyMaterial() { void MaterialEntityRenderer::applyMaterial() {
_retryApply = false; _retryApply = false;
std::shared_ptr<NetworkMaterial>& material = getMaterial(); std::shared_ptr<NetworkMaterial>& material = getMaterial();
QUuid parentID = _parentID; QUuid parentID = _parentID;
if (!material || parentID.isNull()) { if (!material || parentID.isNull()) {
_appliedMaterial = nullptr;
return; return;
} }
@ -377,11 +388,14 @@ void MaterialEntityRenderer::applyMaterial() {
graphics::MaterialLayer materialLayer = graphics::MaterialLayer(material, _priority); graphics::MaterialLayer materialLayer = graphics::MaterialLayer(material, _priority);
// Our parent could be an entity or an avatar // 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; return;
} }
if (EntityTreeRenderer::addMaterialToAvatar(parentID, materialLayer, _parentMaterialName.toStdString())) { if (EntityTreeRenderer::addMaterialToAvatar(parentID, materialLayer, parentMaterialName)) {
_appliedMaterial = material;
return; return;
} }

View file

@ -24,7 +24,7 @@ class MaterialEntityRenderer : public TypedEntityRenderer<MaterialEntityItem> {
using Pointer = std::shared_ptr<MaterialEntityRenderer>; using Pointer = std::shared_ptr<MaterialEntityRenderer>;
public: public:
MaterialEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {} MaterialEntityRenderer(const EntityItemPointer& entity) : Parent(entity) {}
~MaterialEntityRenderer() { deleteMaterial(_parentID); } ~MaterialEntityRenderer() { deleteMaterial(_parentID, _parentMaterialName); }
private: private:
virtual bool needsRenderUpdate() const override; virtual bool needsRenderUpdate() const override;
@ -57,10 +57,11 @@ private:
void applyTextureTransform(std::shared_ptr<NetworkMaterial>& material); void applyTextureTransform(std::shared_ptr<NetworkMaterial>& material);
void applyMaterial(); void applyMaterial();
void deleteMaterial(const QUuid& oldParentID); void deleteMaterial(const QUuid& oldParentID, const QString& oldParentMaterialName);
NetworkMaterialResourcePointer _networkMaterial; NetworkMaterialResourcePointer _networkMaterial;
NetworkMaterialResource::ParsedMaterials _parsedMaterials; NetworkMaterialResource::ParsedMaterials _parsedMaterials;
std::shared_ptr<NetworkMaterial> _appliedMaterial;
std::string _currentMaterialName; std::string _currentMaterialName;
}; };