mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 06:19:02 +02:00
it's working!
This commit is contained in:
parent
c92b82e744
commit
3df231f1e0
3 changed files with 41 additions and 24 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue