From 7d9daea0f6346a6274fb3654312aea1249b59228 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 12 Sep 2017 13:43:00 -0700 Subject: [PATCH] Transmit baking errors to interface for display. --- assignment-client/src/assets/AssetServer.cpp | 56 ++++++++++++------- assignment-client/src/assets/AssetServer.h | 7 ++- .../AssetMappingsScriptingInterface.cpp | 1 + libraries/networking/src/AssetUtils.h | 1 + libraries/networking/src/MappingRequest.cpp | 6 +- 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index cee4c77170..6da299ea87 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -83,7 +83,8 @@ void BakeAssetTask::run() { if (baker->hasErrors()) { qDebug() << "Failed to bake: " << _assetHash << _assetPath << baker->getErrors(); - emit bakeFailed(_assetHash, _assetPath); + auto errors = baker->getErrors().join('\n'); // Join error list into a single string for convenience + emit bakeFailed(_assetHash, _assetPath, errors); } else { auto vectorOutputFiles = QVector::fromStdVector(baker->getOutputFiles()); qDebug() << "Finished baking: " << _assetHash << _assetPath << vectorOutputFiles; @@ -112,19 +113,19 @@ QString AssetServer::getPathToAssetHash(const AssetHash& assetHash) { return _filesDirectory.absoluteFilePath(assetHash); } -BakingStatus AssetServer::getAssetStatus(const AssetPath& path, const AssetHash& hash) { +std::pair AssetServer::getAssetStatus(const AssetPath& path, const AssetHash& hash) { auto it = _pendingBakes.find(hash); if (it != _pendingBakes.end()) { - return (*it)->isBaking() ? Baking : Pending; + return { (*it)->isBaking() ? Baking : Pending, "" }; } if (path.startsWith(HIDDEN_BAKED_CONTENT_FOLDER)) { - return Baked; + return { Baked, "" }; } auto dotIndex = path.lastIndexOf("."); if (dotIndex == -1) { - return Irrelevant; + return { Irrelevant, "" }; } auto extension = path.mid(dotIndex + 1); @@ -136,28 +137,28 @@ BakingStatus AssetServer::getAssetStatus(const AssetPath& path, const AssetHash& } else if (BAKEABLE_TEXTURE_EXTENSIONS.contains(extension.toLocal8Bit()) && hasMetaFile(hash)) { bakedFilename = BAKED_TEXTURE_SIMPLE_NAME; } else { - return Irrelevant; + return { Irrelevant, "" }; } auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + hash + "/" + bakedFilename; auto jt = _fileMappings.find(bakedPath); if (jt != _fileMappings.end()) { if (jt->second == hash) { - bool loaded; - AssetMeta meta; - - std::tie(loaded, meta) = readMetaFile(hash); - if (loaded && meta.failedLastBake) { - return Error; - } - - return NotBaked; + return { NotBaked, "" }; } else { - return Baked; + return { Baked, "" }; + } + } else { + bool loaded; + AssetMeta meta; + + std::tie(loaded, meta) = readMetaFile(hash); + if (loaded && meta.failedLastBake) { + return { Error, meta.lastBakeErrors }; } } - return Pending; + return { Pending, "" }; } void AssetServer::bakeAssets() { @@ -564,7 +565,14 @@ void AssetServer::handleGetAllMappingOperation(ReceivedMessage& message, SharedN auto hash = it->second; replyPacket.writeString(mapping); replyPacket.write(QByteArray::fromHex(hash.toUtf8())); - replyPacket.writePrimitive(getAssetStatus(mapping, hash)); + + BakingStatus status; + QString lastBakeErrors; + std::tie(status, lastBakeErrors) = getAssetStatus(mapping, hash); + replyPacket.writePrimitive(status); + if (status == Error) { + replyPacket.writeString(lastBakeErrors); + } } } @@ -1146,8 +1154,8 @@ QString getBakeMapping(const AssetHash& hash, const QString& relativeFilePath) { return HIDDEN_BAKED_CONTENT_FOLDER + hash + "/" + relativeFilePath; } -void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath) { - qDebug() << "Failed: " << originalAssetHash << assetPath; +void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath, QString errors) { + qDebug() << "Failed: " << originalAssetHash << assetPath << errors; bool loaded; AssetMeta meta; @@ -1155,6 +1163,7 @@ void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath) std::tie(loaded, meta) = readMetaFile(originalAssetHash); meta.failedLastBake = true; + meta.lastBakeErrors = errors; writeMetaFile(originalAssetHash, meta); } @@ -1239,6 +1248,7 @@ void AssetServer::handleCompletedBake(QString originalAssetHash, QString origina static const QString BAKE_VERSION_KEY = "bake_version"; static const QString APP_VERSION_KEY = "app_version"; static const QString FAILED_LAST_BAKE_KEY = "failed_last_bake"; +static const QString LAST_BAKE_ERRORS_KEY = "last_bake_errors"; std::pair AssetServer::readMetaFile(AssetHash hash) { auto metaFilePath = HIDDEN_BAKED_CONTENT_FOLDER + hash + "/" + "meta.json"; @@ -1265,15 +1275,18 @@ std::pair AssetServer::readMetaFile(AssetHash hash) { auto bakeVersion = root[BAKE_VERSION_KEY].toInt(-1); auto appVersion = root[APP_VERSION_KEY].toInt(-1); auto failedLastBake = root[FAILED_LAST_BAKE_KEY]; + auto lastBakeErrors = root[LAST_BAKE_ERRORS_KEY]; if (bakeVersion != -1 && appVersion != -1 - && failedLastBake.isBool()) { + && failedLastBake.isBool() + && lastBakeErrors.isString()) { AssetMeta meta; meta.bakeVersion = bakeVersion; meta.applicationVersion = appVersion; meta.failedLastBake = failedLastBake.toBool(); + meta.lastBakeErrors = failedLastBake.toString(); return { true, meta }; } else { @@ -1292,6 +1305,7 @@ bool AssetServer::writeMetaFile(AssetHash originalAssetHash, const AssetMeta& me metaFileObject[BAKE_VERSION_KEY] = meta.bakeVersion; metaFileObject[APP_VERSION_KEY] = meta.applicationVersion; metaFileObject[FAILED_LAST_BAKE_KEY] = meta.failedLastBake; + metaFileObject[LAST_BAKE_ERRORS_KEY] = meta.lastBakeErrors; QJsonDocument metaFileDoc; metaFileDoc.setObject(metaFileObject); diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 4a36825764..8641f5498f 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -40,7 +40,7 @@ public: signals: void bakeComplete(QString assetHash, QString assetPath, QVector outputFiles); - void bakeFailed(QString assetHash, QString assetPath); + void bakeFailed(QString assetHash, QString assetPath, QString errors); private: std::atomic _isBaking { false }; @@ -56,6 +56,7 @@ struct AssetMeta { int bakeVersion { 0 }; int applicationVersion { 0 }; bool failedLastBake { false }; + QString lastBakeErrors; }; class AssetServer : public ThreadedAssignment { @@ -108,7 +109,7 @@ private: QString getPathToAssetHash(const AssetHash& assetHash); - BakingStatus getAssetStatus(const AssetPath& path, const AssetHash& hash); + std::pair getAssetStatus(const AssetPath& path, const AssetHash& hash); void bakeAssets(); void maybeBake(const AssetPath& path, const AssetHash& hash); @@ -119,7 +120,7 @@ private: /// Move baked content for asset to baked directory and update baked status void handleCompletedBake(QString originalAssetHash, QString assetPath, QVector bakedFilePaths); - void handleFailedBake(QString originalAssetHash, QString assetPath); + void handleFailedBake(QString originalAssetHash, QString assetPath, QString errors); /// Create meta file to describe baked content for original asset std::pair readMetaFile(AssetHash hash); diff --git a/interface/src/scripting/AssetMappingsScriptingInterface.cpp b/interface/src/scripting/AssetMappingsScriptingInterface.cpp index 70deabd412..14e0ef5b28 100644 --- a/interface/src/scripting/AssetMappingsScriptingInterface.cpp +++ b/interface/src/scripting/AssetMappingsScriptingInterface.cpp @@ -261,6 +261,7 @@ void AssetMappingModel::refresh() { // update status auto statusString = isFolder ? "--" : bakingStatusToString(mapping.second.status); lastItem->setData(statusString, Qt::UserRole + 5); + lastItem->setData(mapping.second.bakingErrors, Qt::UserRole + 6); } Q_ASSERT(fullPath == path); diff --git a/libraries/networking/src/AssetUtils.h b/libraries/networking/src/AssetUtils.h index c09c725f22..a7c053c3d6 100644 --- a/libraries/networking/src/AssetUtils.h +++ b/libraries/networking/src/AssetUtils.h @@ -66,6 +66,7 @@ enum BakingStatus { struct MappingInfo { AssetHash hash; BakingStatus status; + QString bakingErrors; }; using AssetMapping = std::map; diff --git a/libraries/networking/src/MappingRequest.cpp b/libraries/networking/src/MappingRequest.cpp index 588d8ecc88..a79105e3ab 100644 --- a/libraries/networking/src/MappingRequest.cpp +++ b/libraries/networking/src/MappingRequest.cpp @@ -137,8 +137,12 @@ void GetAllMappingsRequest::doStart() { auto path = message->readString(); auto hash = message->read(SHA256_HASH_LENGTH).toHex(); BakingStatus status; + QString lastBakeErrors; message->readPrimitive(&status); - _mappings[path] = { hash, status }; + if (status == BakingStatus::Error) { + lastBakeErrors = message->readString(); + } + _mappings[path] = { hash, status, lastBakeErrors }; } } emit finished(this);