diff --git a/libraries/fbx/src/OBJReader.cpp b/libraries/fbx/src/OBJReader.cpp index 3eff3bdec5..1dfb7a4587 100644 --- a/libraries/fbx/src/OBJReader.cpp +++ b/libraries/fbx/src/OBJReader.cpp @@ -194,10 +194,10 @@ void OBJFace::addFrom(const OBJFace* face, int index) { // add using data from f } bool OBJReader::isValidTexture(const QByteArray &filename) { - if (!_url) { + if (_url.isEmpty()) { return false; } - QUrl candidateUrl = _url->resolved(QUrl(filename)); + QUrl candidateUrl = _url.resolved(QUrl(filename)); QNetworkReply *netReply = request(candidateUrl, true); bool isValid = netReply->isFinished() && (netReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200); netReply->deleteLater(); @@ -330,7 +330,7 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi } QByteArray groupName = tokenizer.getDatum(); currentGroup = groupName; - } else if (token == "mtllib" && _url) { + } else if (token == "mtllib" && !_url.isEmpty()) { if (tokenizer.nextToken() != OBJTokenizer::DATUM_TOKEN) { break; } @@ -340,7 +340,7 @@ bool OBJReader::parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mappi } librariesSeen[libraryName] = true; // Throw away any path part of libraryName, and merge against original url. - QUrl libraryUrl = _url->resolved(QUrl(libraryName).fileName()); + QUrl libraryUrl = _url.resolved(QUrl(libraryName).fileName()); #ifdef WANT_DEBUG qCDebug(modelformat) << "OBJ Reader new library:" << libraryName << " at:" << libraryUrl; #endif @@ -415,17 +415,14 @@ done: } -FBXGeometry* OBJReader::readOBJ(const QByteArray& model, const QVariantHash& mapping) { - QBuffer buffer(const_cast(&model)); +FBXGeometry* OBJReader::readOBJ(QByteArray& model, const QVariantHash& mapping, const QUrl& url) { + + QBuffer buffer { &model }; buffer.open(QIODevice::ReadOnly); - return readOBJ(&buffer, mapping, nullptr); -} - - -FBXGeometry* OBJReader::readOBJ(QIODevice* device, const QVariantHash& mapping, QUrl* url) { + FBXGeometry* geometryPtr = new FBXGeometry(); FBXGeometry& geometry = *geometryPtr; - OBJTokenizer tokenizer(device); + OBJTokenizer tokenizer { &buffer }; float scaleGuess = 1.0f; _url = url; @@ -463,8 +460,8 @@ FBXGeometry* OBJReader::readOBJ(QIODevice* device, const QVariantHash& mapping, // Some .obj files use the convention that a group with uv coordinates that doesn't define a material, should use // a texture with the same basename as the .obj file. - if (url) { - QString filename = url->fileName(); + if (!url.isEmpty()) { + QString filename = url.fileName(); int extIndex = filename.lastIndexOf('.'); // by construction, this does not fail QString basename = filename.remove(extIndex + 1, sizeof("obj")); OBJMaterial& preDefinedMaterial = materials[SMART_DEFAULT_MATERIAL_NAME]; diff --git a/libraries/fbx/src/OBJReader.h b/libraries/fbx/src/OBJReader.h index df4c88553e..0e59c5ad8a 100644 --- a/libraries/fbx/src/OBJReader.h +++ b/libraries/fbx/src/OBJReader.h @@ -71,10 +71,10 @@ public: QHash materials; QNetworkReply* request(QUrl& url, bool isTest); - FBXGeometry* readOBJ(const QByteArray& model, const QVariantHash& mapping); - FBXGeometry* readOBJ(QIODevice* device, const QVariantHash& mapping, QUrl* url); + FBXGeometry* readOBJ(QByteArray& model, const QVariantHash& mapping, const QUrl& url = QUrl()); + private: - QUrl* _url = nullptr; + QUrl _url; QHash librariesSeen; bool parseOBJGroup(OBJTokenizer& tokenizer, const QVariantHash& mapping, FBXGeometry& geometry, float& scaleGuess); diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index db7c25012c..a58df10cc6 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -1703,7 +1703,7 @@ void GeometryReader::run() { const float lightmapLevel = 1.0f; fbxgeo = readFBX(_data, _mapping, _url.path(), grabLightmaps, lightmapLevel); } else if (_url.path().toLower().endsWith(".obj")) { - fbxgeo = OBJReader().readOBJ(_data, _mapping); + fbxgeo = OBJReader().readOBJ(_data, _mapping, _url); } else { QString errorStr("usupported format"); emit onError(NetworkGeometry::ModelParseError, errorStr);