diff --git a/libraries/model-baking/src/FBXBaker.cpp b/libraries/model-baking/src/FBXBaker.cpp index 437a2f197d..561ce61994 100644 --- a/libraries/model-baking/src/FBXBaker.cpp +++ b/libraries/model-baking/src/FBXBaker.cpp @@ -22,7 +22,7 @@ #include "FBXBaker.h" -FBXBaker::FBXBaker(QUrl fbxURL, QString baseOutputPath, bool copyOriginals) : +FBXBaker::FBXBaker(const QUrl& fbxURL, const QString& baseOutputPath, bool copyOriginals) : _fbxURL(fbxURL), _baseOutputPath(baseOutputPath), _copyOriginals(copyOriginals) diff --git a/libraries/model-baking/src/FBXBaker.h b/libraries/model-baking/src/FBXBaker.h index cc357cd251..9843d8f298 100644 --- a/libraries/model-baking/src/FBXBaker.h +++ b/libraries/model-baking/src/FBXBaker.h @@ -47,7 +47,7 @@ class TextureBaker; class FBXBaker : public QObject { Q_OBJECT public: - FBXBaker(QUrl fbxURL, QString baseOutputPath, bool copyOriginals = true); + FBXBaker(const QUrl& fbxURL, const QString& baseOutputPath, bool copyOriginals = true); ~FBXBaker(); void start(); diff --git a/tools/oven/src/DomainBaker.cpp b/tools/oven/src/DomainBaker.cpp index dbd080d5a7..c3953aeda3 100644 --- a/tools/oven/src/DomainBaker.cpp +++ b/tools/oven/src/DomainBaker.cpp @@ -20,18 +20,45 @@ #include "DomainBaker.h" -DomainBaker::DomainBaker(const QUrl& localModelFileURL, QString baseOutputPath) : +DomainBaker::DomainBaker(const QUrl& localModelFileURL, const QString& domainName, const QString& baseOutputPath) : _localEntitiesFileURL(localModelFileURL), + _domainName(domainName), _baseOutputPath(baseOutputPath) { } void DomainBaker::start() { + setupOutputFolder(); loadLocalFile(); enumerateEntities(); } +void DomainBaker::setupOutputFolder() { + // in order to avoid overwriting previous bakes, we create a special output folder with the domain name and timestamp + + // first, construct the directory name + auto domainPrefix = !_domainName.isEmpty() ? _domainName + "-" : ""; + auto timeNow = QDateTime::currentDateTime(); + + static const QString FOLDER_TIMESTAMP_FORMAT = "yyyyMMdd-hhmmss"; + QString outputDirectoryName = domainPrefix + timeNow.toString(FOLDER_TIMESTAMP_FORMAT); + + // make sure we can create that directory + QDir baseDir { _baseOutputPath }; + + if (!baseDir.mkpath(outputDirectoryName)) { + + // add an error to specify that the output directory could not be created + + return; + } + + // store the unique output path so we can re-use it when saving baked models + baseDir.cd(outputDirectoryName); + _uniqueOutputPath = baseDir.absolutePath(); +} + void DomainBaker::loadLocalFile() { // load up the local entities file QFile modelsFile { _localEntitiesFileURL.toLocalFile() }; @@ -96,7 +123,7 @@ void DomainBaker::enumerateEntities() { // setup an FBXBaker for this URL, as long as we don't already have one if (!_bakers.contains(modelURL)) { - QSharedPointer baker { new FBXBaker(modelURL, _baseOutputPath) }; + QSharedPointer baker { new FBXBaker(modelURL, _uniqueOutputPath) }; // start the baker baker->start(); diff --git a/tools/oven/src/DomainBaker.h b/tools/oven/src/DomainBaker.h index 50a2a12759..c0fc40bb93 100644 --- a/tools/oven/src/DomainBaker.h +++ b/tools/oven/src/DomainBaker.h @@ -21,7 +21,7 @@ class DomainBaker : public QObject { Q_OBJECT public: - DomainBaker(const QUrl& localEntitiesFileURL, QString baseOutputPath); + DomainBaker(const QUrl& localEntitiesFileURL, const QString& domainName, const QString& baseOutputPath); public slots: void start(); @@ -30,13 +30,16 @@ signals: void finished(); private: + void setupOutputFolder(); void loadLocalFile(); void enumerateEntities(); QUrl _localEntitiesFileURL; + QString _domainName; QString _baseOutputPath; - QJsonArray _entities; + QString _uniqueOutputPath; + QJsonArray _entities; QHash> _bakers; }; diff --git a/tools/oven/src/ui/DomainBakeWidget.cpp b/tools/oven/src/ui/DomainBakeWidget.cpp index d5d5901ffa..9d73036a96 100644 --- a/tools/oven/src/ui/DomainBakeWidget.cpp +++ b/tools/oven/src/ui/DomainBakeWidget.cpp @@ -38,6 +38,17 @@ void DomainBakeWidget::setupUI() { int rowIndex = 0; + // setup a section to enter the name of the domain being baked + QLabel* domainNameLabel = new QLabel("Domain Name"); + + _domainNameLineEdit = new QLineEdit; + _domainNameLineEdit->setPlaceholderText("welcome"); + + gridLayout->addWidget(domainNameLabel); + gridLayout->addWidget(_domainNameLineEdit, rowIndex, 1, 1, -1); + + ++rowIndex; + // setup a section to choose the file being baked QLabel* entitiesFileLabel = new QLabel("Entities File"); @@ -160,7 +171,9 @@ void DomainBakeWidget::bakeButtonClicked() { if (!_entitiesFileLineEdit->text().isEmpty()) { // everything seems to be in place, kick off a bake for this entities file now auto fileToBakeURL = QUrl::fromLocalFile(_entitiesFileLineEdit->text()); - _baker = std::unique_ptr { new DomainBaker(fileToBakeURL, outputDirectory.absolutePath()) }; + _baker = std::unique_ptr { + new DomainBaker(fileToBakeURL, _domainNameLineEdit->text(), outputDirectory.absolutePath()) + }; _baker->start(); return; diff --git a/tools/oven/src/ui/DomainBakeWidget.h b/tools/oven/src/ui/DomainBakeWidget.h index 485f80683c..38a2c6a577 100644 --- a/tools/oven/src/ui/DomainBakeWidget.h +++ b/tools/oven/src/ui/DomainBakeWidget.h @@ -39,6 +39,7 @@ private: std::unique_ptr _baker; + QLineEdit* _domainNameLineEdit; QLineEdit* _entitiesFileLineEdit; QLineEdit* _outputDirLineEdit;