From 83eb37b8141db997d2054a023732dcaf9b533f28 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 14 Apr 2017 18:33:36 -0700 Subject: [PATCH] add domain bake to results table --- libraries/model-baking/src/Baker.cpp | 20 ++++++++++++ libraries/model-baking/src/Baker.h | 35 ++++++++++++++++++++ libraries/model-baking/src/FBXBaker.cpp | 6 ---- libraries/model-baking/src/FBXBaker.h | 11 +++---- libraries/model-baking/src/TextureBaker.h | 4 ++- tools/oven/src/DomainBaker.h | 5 +-- tools/oven/src/ui/DomainBakeWidget.cpp | 40 ++++++++++++++++++++--- tools/oven/src/ui/DomainBakeWidget.h | 6 +++- 8 files changed, 106 insertions(+), 21 deletions(-) create mode 100644 libraries/model-baking/src/Baker.cpp create mode 100644 libraries/model-baking/src/Baker.h diff --git a/libraries/model-baking/src/Baker.cpp b/libraries/model-baking/src/Baker.cpp new file mode 100644 index 0000000000..8e118790cc --- /dev/null +++ b/libraries/model-baking/src/Baker.cpp @@ -0,0 +1,20 @@ +// +// Baker.cpp +// libraries/model-baking/src +// +// Created by Stephen Birarda on 4/14/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "ModelBakingLoggingCategory.h" + +#include "Baker.h" + +void Baker::handleError(const QString& error) { + qCCritical(model_baking).noquote() << error; + _errorList.append(error); + emit finished(); +} diff --git a/libraries/model-baking/src/Baker.h b/libraries/model-baking/src/Baker.h new file mode 100644 index 0000000000..19b1486346 --- /dev/null +++ b/libraries/model-baking/src/Baker.h @@ -0,0 +1,35 @@ +// +// Baker.h +// libraries/model-baking/src +// +// Created by Stephen Birarda on 4/14/17. +// Copyright 2017 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_Baker_h +#define hifi_Baker_h + +#include + +class Baker : public QObject { + Q_OBJECT + +public: + virtual void bake() = 0; + + bool hasErrors() const { return !_errorList.isEmpty(); } + QStringList getErrors() const { return _errorList; } + +signals: + void finished(); + +protected: + void handleError(const QString& error); + + QStringList _errorList; +}; + +#endif // hifi_Baker_h diff --git a/libraries/model-baking/src/FBXBaker.cpp b/libraries/model-baking/src/FBXBaker.cpp index 0cc484ce5c..8181932247 100644 --- a/libraries/model-baking/src/FBXBaker.cpp +++ b/libraries/model-baking/src/FBXBaker.cpp @@ -50,12 +50,6 @@ QString FBXBaker::pathToCopyOfOriginal() const { return _uniqueOutputPath + ORIGINAL_OUTPUT_SUBFOLDER + _fbxURL.fileName(); } -void FBXBaker::handleError(const QString& error) { - qCCritical(model_baking).noquote() << error; - _errorList.append(error); - emit finished(); -} - void FBXBaker::bake() { qCDebug(model_baking) << "Baking" << _fbxURL; diff --git a/libraries/model-baking/src/FBXBaker.h b/libraries/model-baking/src/FBXBaker.h index a6dd6ad55a..a44ce4d0bf 100644 --- a/libraries/model-baking/src/FBXBaker.h +++ b/libraries/model-baking/src/FBXBaker.h @@ -17,6 +17,8 @@ #include #include +#include "Baker.h" + namespace fbxsdk { class FbxManager; class FbxProperty; @@ -47,16 +49,13 @@ class TextureBaker; static const QString BAKED_FBX_EXTENSION = ".baked.fbx"; -class FBXBaker : public QObject { +class FBXBaker : public Baker { Q_OBJECT public: FBXBaker(const QUrl& fbxURL, const QString& baseOutputPath, bool copyOriginals = true); ~FBXBaker(); - Q_INVOKABLE void bake(); - - bool hasErrors() const { return !_errorList.isEmpty(); } - QStringList getErrors() const { return _errorList; } + Q_INVOKABLE virtual void bake() override; QUrl getFBXUrl() const { return _fbxURL; } QString getBakedFBXRelativePath() const { return _bakedFBXRelativePath; } @@ -92,8 +91,6 @@ private: QString pathToCopyOfOriginal() const; - void handleError(const QString& error); - QUrl _fbxURL; QString _fbxName; diff --git a/libraries/model-baking/src/TextureBaker.h b/libraries/model-baking/src/TextureBaker.h index 7394a0652e..06bac0d066 100644 --- a/libraries/model-baking/src/TextureBaker.h +++ b/libraries/model-baking/src/TextureBaker.h @@ -15,7 +15,9 @@ #include #include -class TextureBaker : public QObject { +#include "Baker.h" + +class TextureBaker : public Baker { Q_OBJECT public: diff --git a/tools/oven/src/DomainBaker.h b/tools/oven/src/DomainBaker.h index f949ddba9c..3eae758445 100644 --- a/tools/oven/src/DomainBaker.h +++ b/tools/oven/src/DomainBaker.h @@ -17,16 +17,17 @@ #include #include +#include #include -class DomainBaker : public QObject { +class DomainBaker : public Baker { Q_OBJECT public: DomainBaker(const QUrl& localEntitiesFileURL, const QString& domainName, const QString& baseOutputPath, const QUrl& destinationPath); public: - void bake(); + virtual void bake() override; signals: void finished(); diff --git a/tools/oven/src/ui/DomainBakeWidget.cpp b/tools/oven/src/ui/DomainBakeWidget.cpp index 01bc6110cb..b1f549dd00 100644 --- a/tools/oven/src/ui/DomainBakeWidget.cpp +++ b/tools/oven/src/ui/DomainBakeWidget.cpp @@ -21,6 +21,9 @@ #include #include +#include "../Oven.h" +#include "OvenMainWindow.h" + #include "DomainBakeWidget.h" static const QString DOMAIN_NAME_SETTING_KEY = "domain_name"; @@ -205,15 +208,44 @@ 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 { + auto domainBaker = std::unique_ptr { new DomainBaker(fileToBakeURL, _domainNameLineEdit->text(), outputDirectory.absolutePath(), _destinationPathLineEdit->text()) }; - // run the baker in our thread pool - QtConcurrent::run(_baker.get(), &DomainBaker::bake); + // make sure we hear from the baker when it is done + connect(domainBaker.get(), &DomainBaker::finished, this, &DomainBakeWidget::handleFinishedBaker); - return; + // run the baker in our thread pool + QtConcurrent::run(domainBaker.get(), &DomainBaker::bake); + + // add a pending row to the results window to show that this bake is in process + auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + auto resultsRowName = _domainNameLineEdit->text().isEmpty() ? fileToBakeURL.fileName() : _domainNameLineEdit->text(); + auto resultsRow = resultsWindow->addPendingResultRow(resultsRowName); + + // keep the unique ptr to the domain baker and the index to the row representing it in the results table + _bakers.emplace_back(std::move(domainBaker), resultsRow); + } +} + +void DomainBakeWidget::handleFinishedBaker() { + if (auto baker = qobject_cast(sender())) { + // add the results of this bake to the results window + auto it = std::remove_if(_bakers.begin(), _bakers.end(), [baker](const BakerRowPair& value) { + return value.first.get() == baker; + }); + + if (it != _bakers.end()) { + auto resultRow = it->second; + auto resultsWindow = qApp->getMainWindow()->showResultsWindow(); + + if (baker->hasErrors()) { + resultsWindow->changeStatusForRow(resultRow, baker->getErrors().join("\n")); + } else { + resultsWindow->changeStatusForRow(resultRow, "Success"); + } + } } } diff --git a/tools/oven/src/ui/DomainBakeWidget.h b/tools/oven/src/ui/DomainBakeWidget.h index 20b4eaa4b9..606f550203 100644 --- a/tools/oven/src/ui/DomainBakeWidget.h +++ b/tools/oven/src/ui/DomainBakeWidget.h @@ -34,10 +34,14 @@ private slots: void outputDirectoryChanged(const QString& newDirectory); + void handleFinishedBaker(); + private: void setupUI(); - std::unique_ptr _baker; + using BakerRowPair = std::pair, int>; + using BakerRowPairList = std::list; + BakerRowPairList _bakers; QLineEdit* _domainNameLineEdit; QLineEdit* _entitiesFileLineEdit;