From cf40ed953bf6aa6cc7413cefb065d371f546b16c Mon Sep 17 00:00:00 2001 From: sabrina-shanman Date: Mon, 18 Mar 2019 11:56:34 -0700 Subject: [PATCH] Do not create temporary directory in ModelBaker and copy model directly to the original output folder --- libraries/baking/src/ModelBaker.cpp | 73 ++++++++---------------- libraries/baking/src/ModelBaker.h | 4 +- libraries/baking/src/baking/FSTBaker.cpp | 12 ++-- 3 files changed, 30 insertions(+), 59 deletions(-) diff --git a/libraries/baking/src/ModelBaker.cpp b/libraries/baking/src/ModelBaker.cpp index 977f773337..9568a81578 100644 --- a/libraries/baking/src/ModelBaker.cpp +++ b/libraries/baking/src/ModelBaker.cpp @@ -50,38 +50,12 @@ ModelBaker::ModelBaker(const QUrl& inputModelURL, TextureBakerThreadGetter input _textureThreadGetter(inputTextureThreadGetter), _hasBeenBaked(hasBeenBaked) { - auto tempDir = PathUtils::generateTemporaryDir(); - - if (tempDir.isEmpty()) { - handleError("Failed to create a temporary directory."); - return; - } - - _modelTempDir = tempDir; - - _originalModelFilePath = _modelTempDir.filePath(_modelURL.fileName()); - qDebug() << "Made temporary dir " << _modelTempDir; - qDebug() << "Origin file path: " << _originalModelFilePath; - - { - auto bakedFilename = _modelURL.fileName(); - if (!hasBeenBaked) { - bakedFilename = bakedFilename.left(bakedFilename.lastIndexOf('.')); - bakedFilename += BAKED_FBX_EXTENSION; - } - _bakedModelURL = _bakedOutputDir + "/" + bakedFilename; - } -} - -ModelBaker::~ModelBaker() { - if (_modelTempDir.exists()) { - if (!_modelTempDir.remove(_originalModelFilePath)) { - qCWarning(model_baking) << "Failed to remove temporary copy of model file:" << _originalModelFilePath; - } - if (!_modelTempDir.rmdir(".")) { - qCWarning(model_baking) << "Failed to remove temporary directory:" << _modelTempDir; - } + auto bakedFilename = _modelURL.fileName(); + if (!hasBeenBaked) { + bakedFilename = bakedFilename.left(bakedFilename.lastIndexOf('.')); + bakedFilename += BAKED_FBX_EXTENSION; } + _bakedModelURL = _bakedOutputDir + "/" + bakedFilename; } void ModelBaker::setOutputURLSuffix(const QUrl& outputURLSuffix) { @@ -136,7 +110,8 @@ void ModelBaker::initializeOutputDirs() { } } - if (QDir(_originalOutputDir).exists()) { + QDir originalOutputDir { _originalOutputDir }; + if (originalOutputDir.exists()) { if (_mappingURL.isEmpty()) { qWarning() << "Output path" << _originalOutputDir << "already exists. Continuing."; } @@ -144,8 +119,16 @@ void ModelBaker::initializeOutputDirs() { qCDebug(model_baking) << "Creating original output folder" << _originalOutputDir; if (!QDir().mkpath(_originalOutputDir)) { handleError("Failed to create original output folder " + _originalOutputDir); + return; } } + + if (originalOutputDir.isReadable()) { + // The output directory is available. Use that to write/read the original model file + _originalOutputModelPath = originalOutputDir.filePath(_modelURL.fileName()); + } else { + handleError("Unable to write to original output folder " + _originalOutputDir); + } } void ModelBaker::saveSourceModel() { @@ -154,7 +137,7 @@ void ModelBaker::saveSourceModel() { // load up the local file QFile localModelURL { _modelURL.toLocalFile() }; - qDebug() << "Local file url: " << _modelURL << _modelURL.toString() << _modelURL.toLocalFile() << ", copying to: " << _originalModelFilePath; + qDebug() << "Local file url: " << _modelURL << _modelURL.toString() << _modelURL.toLocalFile() << ", copying to: " << _originalOutputModelPath; if (!localModelURL.exists()) { //QMessageBox::warning(this, "Could not find " + _modelURL.toString(), ""); @@ -162,13 +145,7 @@ void ModelBaker::saveSourceModel() { return; } - // make a copy in the output folder - if (!_originalOutputDir.isEmpty()) { - qDebug() << "Copying to: " << _originalOutputDir << "/" << _modelURL.fileName(); - localModelURL.copy(_originalOutputDir + "/" + _modelURL.fileName()); - } - - localModelURL.copy(_originalModelFilePath); + localModelURL.copy(_originalOutputModelPath); // emit our signal to start the import of the model source copy emit modelLoaded(); @@ -199,13 +176,13 @@ void ModelBaker::handleModelNetworkReply() { qCDebug(model_baking) << "Downloaded" << _modelURL; // grab the contents of the reply and make a copy in the output folder - QFile copyOfOriginal(_originalModelFilePath); + QFile copyOfOriginal(_originalOutputModelPath); - qDebug(model_baking) << "Writing copy of original model file to" << _originalModelFilePath << copyOfOriginal.fileName(); + qDebug(model_baking) << "Writing copy of original model file to" << _originalOutputModelPath << copyOfOriginal.fileName(); if (!copyOfOriginal.open(QIODevice::WriteOnly)) { // add an error to the error list for this model stating that a duplicate of the original model could not be made - handleError("Could not create copy of " + _modelURL.toString() + " (Failed to open " + _originalModelFilePath + ")"); + handleError("Could not create copy of " + _modelURL.toString() + " (Failed to open " + _originalOutputModelPath + ")"); return; } if (copyOfOriginal.write(requestReply->readAll()) == -1) { @@ -216,10 +193,6 @@ void ModelBaker::handleModelNetworkReply() { // close that file now that we are done writing to it copyOfOriginal.close(); - if (!_originalOutputDir.isEmpty()) { - copyOfOriginal.copy(_originalOutputDir + "/" + _modelURL.fileName()); - } - // emit our signal to start the import of the model source copy emit modelLoaded(); } else { @@ -229,9 +202,9 @@ void ModelBaker::handleModelNetworkReply() { } void ModelBaker::bakeSourceCopy() { - QFile modelFile(_originalModelFilePath); + QFile modelFile(_originalOutputModelPath); if (!modelFile.open(QIODevice::ReadOnly)) { - handleError("Error opening " + _originalModelFilePath + " for reading"); + handleError("Error opening " + _originalOutputModelPath + " for reading"); return; } hifi::ByteArray modelData = modelFile.readAll(); @@ -243,7 +216,7 @@ void ModelBaker::bakeSourceCopy() { { auto serializer = DependencyManager::get()->getSerializerForMediaType(modelData, _modelURL, ""); if (!serializer) { - handleError("Could not recognize file type of model file " + _originalModelFilePath); + handleError("Could not recognize file type of model file " + _originalOutputModelPath); return; } hifi::VariantHash serializerMapping = _mapping; diff --git a/libraries/baking/src/ModelBaker.h b/libraries/baking/src/ModelBaker.h index 6b69d4d0ec..d9a559392f 100644 --- a/libraries/baking/src/ModelBaker.h +++ b/libraries/baking/src/ModelBaker.h @@ -46,7 +46,6 @@ public: ModelBaker(const QUrl& inputModelURL, TextureBakerThreadGetter inputTextureThreadGetter, const QString& bakedOutputDirectory, const QString& originalOutputDirectory = "", bool hasBeenBaked = false); - virtual ~ModelBaker(); void setOutputURLSuffix(const QUrl& urlSuffix); void setMappingURL(const QUrl& mappingURL); @@ -86,10 +85,9 @@ protected: QString _bakedOutputDir; QString _originalOutputDir; TextureBakerThreadGetter _textureThreadGetter; + QString _originalOutputModelPath; QString _outputMappingURL; QUrl _bakedModelURL; - QDir _modelTempDir; - QString _originalModelFilePath; protected slots: void handleModelNetworkReply(); diff --git a/libraries/baking/src/baking/FSTBaker.cpp b/libraries/baking/src/baking/FSTBaker.cpp index f76180bb58..acf3bfe1c7 100644 --- a/libraries/baking/src/baking/FSTBaker.cpp +++ b/libraries/baking/src/baking/FSTBaker.cpp @@ -49,9 +49,9 @@ void FSTBaker::bakeSourceCopy() { return; } - QFile fstFile(_originalModelFilePath); + QFile fstFile(_originalOutputModelPath); if (!fstFile.open(QIODevice::ReadOnly)) { - handleError("Error opening " + _originalModelFilePath + " for reading"); + handleError("Error opening " + _originalOutputModelPath + " for reading"); return; } @@ -60,25 +60,25 @@ void FSTBaker::bakeSourceCopy() { auto filenameField = _mapping[FILENAME_FIELD].toString(); if (filenameField.isEmpty()) { - handleError("The '" + FILENAME_FIELD + "' property in the FST file '" + _originalModelFilePath + "' could not be found"); + handleError("The '" + FILENAME_FIELD + "' property in the FST file '" + _originalOutputModelPath + "' could not be found"); return; } auto modelURL = _mappingURL.adjusted(QUrl::RemoveFilename).resolved(filenameField); auto bakeableModelURL = getBakeableModelURL(modelURL); if (bakeableModelURL.isEmpty()) { - handleError("The '" + FILENAME_FIELD + "' property in the FST file '" + _originalModelFilePath + "' could not be resolved to a valid bakeable model url"); + handleError("The '" + FILENAME_FIELD + "' property in the FST file '" + _originalOutputModelPath + "' could not be resolved to a valid bakeable model url"); return; } auto baker = getModelBakerWithOutputDirectories(bakeableModelURL, _textureThreadGetter, _bakedOutputDir, _originalOutputDir); _modelBaker = std::unique_ptr(dynamic_cast(baker.release())); if (!_modelBaker) { - handleError("The model url '" + bakeableModelURL.toString() + "' from the FST file '" + _originalModelFilePath + "' (property: '" + FILENAME_FIELD + "') could not be used to initialize a valid model baker"); + handleError("The model url '" + bakeableModelURL.toString() + "' from the FST file '" + _originalOutputModelPath + "' (property: '" + FILENAME_FIELD + "') could not be used to initialize a valid model baker"); return; } if (dynamic_cast(_modelBaker.get())) { // Could be interesting, but for now let's just prevent infinite FST loops in the most straightforward way possible - handleError("The FST file '" + _originalModelFilePath + "' (property: '" + FILENAME_FIELD + "') references another FST file. FST chaining is not supported."); + handleError("The FST file '" + _originalOutputModelPath + "' (property: '" + FILENAME_FIELD + "') references another FST file. FST chaining is not supported."); return; } _modelBaker->setMappingURL(_mappingURL);