Transmit baking errors to interface for display.

This commit is contained in:
Atlante45 2017-09-12 13:43:00 -07:00
parent 48e58febc6
commit 7d9daea0f6
5 changed files with 46 additions and 25 deletions

View file

@ -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<QString>::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<BakingStatus, QString> 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<bool, AssetMeta> AssetServer::readMetaFile(AssetHash hash) {
auto metaFilePath = HIDDEN_BAKED_CONTENT_FOLDER + hash + "/" + "meta.json";
@ -1265,15 +1275,18 @@ std::pair<bool, AssetMeta> 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);

View file

@ -40,7 +40,7 @@ public:
signals:
void bakeComplete(QString assetHash, QString assetPath, QVector<QString> outputFiles);
void bakeFailed(QString assetHash, QString assetPath);
void bakeFailed(QString assetHash, QString assetPath, QString errors);
private:
std::atomic<bool> _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<BakingStatus, QString> 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<QString> 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<bool, AssetMeta> readMetaFile(AssetHash hash);

View file

@ -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);

View file

@ -66,6 +66,7 @@ enum BakingStatus {
struct MappingInfo {
AssetHash hash;
BakingStatus status;
QString bakingErrors;
};
using AssetMapping = std::map<AssetPath, MappingInfo>;

View file

@ -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);