diff --git a/interface/src/renderer/GeometryCache.cpp b/interface/src/renderer/GeometryCache.cpp index 1742afba05..9052ec910f 100644 --- a/interface/src/renderer/GeometryCache.cpp +++ b/interface/src/renderer/GeometryCache.cpp @@ -547,7 +547,8 @@ NetworkGeometry::NetworkGeometry(const QUrl& url, const QSharedPointer& owner) { } void NetworkGeometry::setTextureWithNameToURL(const QString& name, const QUrl& url) { - for (int i = 0; i < _meshes.size(); i++) { - NetworkMesh& mesh = _meshes[i]; - for (int j = 0; j < mesh.parts.size(); j++) { - NetworkMeshPart& part = mesh.parts[j]; - - QSharedPointer matchingTexture = QSharedPointer(); - if (part.diffuseTextureName == name) { - part.diffuseTexture = + if (_meshes.size() > 0) { + for (int i = 0; i < _meshes.size(); i++) { + NetworkMesh& mesh = _meshes[i]; + for (int j = 0; j < mesh.parts.size(); j++) { + NetworkMeshPart& part = mesh.parts[j]; + + QSharedPointer matchingTexture = QSharedPointer(); + if (part.diffuseTextureName == name) { + part.diffuseTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, _geometry.meshes[i].isEye, QByteArray()); - part.diffuseTexture->setLoadPriorities(_loadPriorities); - } else if (part.normalTextureName == name) { - part.normalTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, - false, QByteArray()); - part.normalTexture->setLoadPriorities(_loadPriorities); - } else if (part.specularTextureName == name) { - part.specularTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, - false, QByteArray()); - part.specularTexture->setLoadPriorities(_loadPriorities); + part.diffuseTexture->setLoadPriorities(_loadPriorities); + } else if (part.normalTextureName == name) { + part.normalTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + false, QByteArray()); + part.normalTexture->setLoadPriorities(_loadPriorities); + } else if (part.specularTextureName == name) { + part.specularTexture = Application::getInstance()->getTextureCache()->getTexture(url, DEFAULT_TEXTURE, + false, QByteArray()); + part.specularTexture->setLoadPriorities(_loadPriorities); + } } } + } else { + qDebug() << "Adding a name url pair to pending" << name << url; + // we don't have meshes downloaded yet, so hold this texture as pending + _pendingTextureChanges.insert(name, url); } } @@ -760,6 +769,15 @@ QStringList NetworkGeometry::getTextureNames() const { return result; } +void NetworkGeometry::replaceTexturesWithPendingChanges() { + QHash::Iterator it = _pendingTextureChanges.begin(); + + while (it != _pendingTextureChanges.end()) { + setTextureWithNameToURL(it.key(), it.value()); + it = _pendingTextureChanges.erase(it); + } +} + /// Reads geometry in a worker thread. class GeometryReader : public QRunnable { public: @@ -807,6 +825,7 @@ void NetworkGeometry::init() { _geometry = FBXGeometry(); _meshes.clear(); _lods.clear(); + _pendingTextureChanges.clear(); _request.setUrl(_url); Resource::init(); } diff --git a/interface/src/renderer/GeometryCache.h b/interface/src/renderer/GeometryCache.h index 28f1341b5f..e58177533c 100644 --- a/interface/src/renderer/GeometryCache.h +++ b/interface/src/renderer/GeometryCache.h @@ -113,7 +113,7 @@ public: void setTextureWithNameToURL(const QString& name, const QUrl& url); QStringList getTextureNames() const; - + protected: virtual void init(); @@ -122,6 +122,8 @@ protected: Q_INVOKABLE void setGeometry(const FBXGeometry& geometry); +private slots: + void replaceTexturesWithPendingChanges(); private: friend class GeometryCache; @@ -139,6 +141,8 @@ private: QWeakPointer _lodParent; QHash, QVector > _jointMappings; + + QHash _pendingTextureChanges; }; /// The state associated with a single mesh part.