From 091dae730bcc9d11bcb03b9dc069ffb41bda7c39 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 15 Nov 2017 16:03:26 -0800 Subject: [PATCH 01/16] Add versioning to Asset Server --- assignment-client/src/assets/AssetServer.cpp | 135 ++++++++++++------ assignment-client/src/assets/AssetServer.h | 39 ++++- .../resources/web/settings/js/settings.js | 4 + libraries/baking/src/TextureBaker.cpp | 7 + libraries/baking/src/TextureBaker.h | 3 + 5 files changed, 140 insertions(+), 48 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 87827a27d9..cbddb2fe56 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -33,6 +33,10 @@ #include #include #include +void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { +void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { + +#include #include "AssetServerLogging.h" #include "BakeAssetTask.h" @@ -46,15 +50,75 @@ static const uint8_t CPU_AFFINITY_COUNT_LOW = 1; static const int INTERFACE_RUNNING_CHECK_FREQUENCY_MS = 1000; #endif -const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server"; - static const QStringList BAKEABLE_MODEL_EXTENSIONS = { "fbx" }; static QStringList BAKEABLE_TEXTURE_EXTENSIONS; static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = {}; + static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx"; static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx"; static const QString BAKED_SCRIPT_SIMPLE_NAME = "asset.js"; +static const ModelBakeVersion CURRENT_MODEL_BAKE_VERSION = ModelBakeVersion::BetterModelBaking; +static const TextureBakeVersion CURRENT_TEXTURE_BAKE_VERSION = TextureBakeVersion::Initial; +static const ScriptBakeVersion CURRENT_SCRIPT_BAKE_VERSION = ScriptBakeVersion::Initial; + +BakedAssetType assetTypeForExtension(const QString& extension) { + auto extensionLower = extension.toLower(); + if (BAKEABLE_MODEL_EXTENSIONS.contains(extensionLower)) { + return Model; + } else if (BAKEABLE_TEXTURE_EXTENSIONS.contains(extensionLower.toLocal8Bit())) { + return Texture; + } else if (BAKEABLE_SCRIPT_EXTENSIONS.contains(extensionLower)) { + return Script; + } + return Undefined; +} + +BakedAssetType assetTypeForFilename(const QString& filename) { + auto dotIndex = filename.lastIndexOf("."); + if (dotIndex == -1) { + return BakedAssetType::Undefined; + } + + auto extension = filename.mid(dotIndex + 1); + return assetTypeForExtension(extension); +} + +QString bakedFilenameForAssetType(BakedAssetType type) { + switch (type) { + case Model: + return BAKED_MODEL_SIMPLE_NAME; + case Texture: + return BAKED_TEXTURE_SIMPLE_NAME; + case Script: + return BAKED_SCRIPT_SIMPLE_NAME; + default: + return ""; + } +} + +BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { + switch (type) { + case Model: + return (BakeVersion)ModelBakeVersion::BetterModelBaking; + case Texture: + return (BakeVersion)TextureBakeVersion::Initial; + case Script: + return (BakeVersion)ScriptBakeVersion::FixEmptyScripts; + default: + return 0; + } +} + +QString toSlug(BakedAssetType type) { + switch (type) { + Model: return "model"; + Texture: return "texture"; + } +} + +const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server"; + void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { qDebug() << "Starting bake for: " << assetPath << assetHash; auto it = _pendingBakes.find(assetHash); @@ -167,36 +231,31 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU return false; } - auto dotIndex = path.lastIndexOf("."); - if (dotIndex == -1) { + BakedAssetType type = assetTypeForFilename(path); + + if (type == Undefined) { return false; } - auto extension = path.mid(dotIndex + 1); - - QString bakedFilename; - bool loaded; AssetMeta meta; std::tie(loaded, meta) = readMetaFile(assetHash); - // TODO: Allow failed bakes that happened on old versions to be re-baked - if (loaded && meta.failedLastBake) { + if (type == Texture && !loaded) { return false; } - if (BAKEABLE_MODEL_EXTENSIONS.contains(extension)) { - bakedFilename = BAKED_MODEL_SIMPLE_NAME; - } else if (loaded && BAKEABLE_TEXTURE_EXTENSIONS.contains(extension.toLocal8Bit())) { - bakedFilename = BAKED_TEXTURE_SIMPLE_NAME; - } else if (BAKEABLE_SCRIPT_EXTENSIONS.contains(extension)) { - bakedFilename = BAKED_SCRIPT_SIMPLE_NAME; - } else { + auto currentVersion = currentBakeVersionForAssetType(type); + + if (loaded && (meta.failedLastBake && meta.bakeVersion >= currentVersion)) { return false; } + QString bakedFilename = bakedFilenameForAssetType(type); + auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; auto bakedPath = AssetUtils::HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; - return _fileMappings.find(bakedPath) == _fileMappings.end(); + bool bakedMappingExists = _fileMappings.find(bakedPath) == _fileMappings.end(); + return !bakedMappingExists || (meta.bakeVersion < currentVersion); } bool interfaceRunning() { @@ -598,15 +657,9 @@ void AssetServer::handleGetMappingOperation(ReceivedMessage& message, NLPacketLi // first, figure out from the mapping extension what type of file this is auto assetPathExtension = assetPath.mid(assetPath.lastIndexOf('.') + 1).toLower(); - QString bakedRootFile; - if (BAKEABLE_MODEL_EXTENSIONS.contains(assetPathExtension)) { - bakedRootFile = BAKED_MODEL_SIMPLE_NAME; - } else if (BAKEABLE_TEXTURE_EXTENSIONS.contains(assetPathExtension.toLocal8Bit())) { - bakedRootFile = BAKED_TEXTURE_SIMPLE_NAME; - } else if (BAKEABLE_SCRIPT_EXTENSIONS.contains(assetPathExtension)) { - bakedRootFile = BAKED_SCRIPT_SIMPLE_NAME; - } + auto type = assetTypeForFilename(assetPath); + QString bakedRootFile = bakedFilenameForAssetType(type); auto originalAssetHash = it->second; QString redirectedAssetHash; @@ -1284,6 +1337,7 @@ void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath, meta.failedLastBake = true; meta.lastBakeErrors = errors; + meta.bakeVersion = (BakeVersion)CURRENT_MODEL_BAKE_VERSION; writeMetaFile(originalAssetHash, meta); @@ -1381,6 +1435,7 @@ void AssetServer::handleCompletedBake(QString originalAssetHash, QString origina AssetMeta meta; meta.failedLastBake = true; meta.lastBakeErrors = errorReason; + meta.bakeVersion = (BakeVersion)ModelBakeVersion::BetterModelBaking; writeMetaFile(originalAssetHash, meta); } @@ -1447,7 +1502,7 @@ bool AssetServer::writeMetaFile(AssetUtils::AssetHash originalAssetHash, const A // construct the JSON that will be in the meta file QJsonObject metaFileObject; - metaFileObject[BAKE_VERSION_KEY] = meta.bakeVersion; + metaFileObject[BAKE_VERSION_KEY] = (int)meta.bakeVersion; metaFileObject[FAILED_LAST_BAKE_KEY] = meta.failedLastBake; metaFileObject[LAST_BAKE_ERRORS_KEY] = meta.lastBakeErrors; @@ -1479,27 +1534,13 @@ bool AssetServer::setBakingEnabled(const AssetUtils::AssetPathList& paths, bool for (const auto& path : paths) { auto it = _fileMappings.find(path); if (it != _fileMappings.end()) { + auto type = assetTypeForFilename(path); + if (type == Undefined) { + continue; + } + QString bakedFilename = bakedFilenameForAssetType(type); + auto hash = it->second; - - auto dotIndex = path.lastIndexOf("."); - if (dotIndex == -1) { - continue; - } - - auto extension = path.mid(dotIndex + 1); - - QString bakedFilename; - - if (BAKEABLE_MODEL_EXTENSIONS.contains(extension)) { - bakedFilename = BAKED_MODEL_SIMPLE_NAME; - } else if (BAKEABLE_TEXTURE_EXTENSIONS.contains(extension.toLocal8Bit()) && hasMetaFile(hash)) { - bakedFilename = BAKED_TEXTURE_SIMPLE_NAME; - } else if (BAKEABLE_SCRIPT_EXTENSIONS.contains(extension)) { - bakedFilename = BAKED_SCRIPT_SIMPLE_NAME; - } else { - continue; - } - auto bakedMapping = getBakeMapping(hash, bakedFilename); auto it = _fileMappings.find(bakedMapping); diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 00ab27c74d..4d869b05f7 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -23,8 +23,45 @@ #include "RegisteredMetaTypes.h" +#include + +namespace std { + template <> + struct hash { + size_t operator()(const QString& v) const { return qHash(v); } + }; +} + +using BakeVersion = int; + +enum BakedAssetType : int { + Model = 0, + Texture, + Script, + + NUM_ASSET_TYPES, + Undefined +}; + +enum class ModelBakeVersion : BakeVersion { + Initial = 0, + BetterModelBaking, +}; + +enum class TextureBakeVersion : BakeVersion { + Initial = 0, +}; + +enum class ScriptBakeVersion : BakeVersion { + Initial = 0, + FixEmptyScripts = 1 +}; + struct AssetMeta { - int bakeVersion { 0 }; + AssetMeta() { + } + + BakeVersion bakeVersion; bool failedLastBake { false }; QString lastBakeErrors; }; diff --git a/domain-server/resources/web/settings/js/settings.js b/domain-server/resources/web/settings/js/settings.js index e67ea43158..0a675263ca 100644 --- a/domain-server/resources/web/settings/js/settings.js +++ b/domain-server/resources/web/settings/js/settings.js @@ -128,6 +128,10 @@ $(document).ready(function(){ createTemporaryDomain(); }); + $('#' + Settings.FORM_ID).on('change', 'select', function(){ + $("input[name='" + $(this).attr('data-hidden-input') + "']").val($(this).val()).change() + }); + $('#' + Settings.FORM_ID).on('click', '#' + Settings.DISCONNECT_ACCOUNT_BTN_ID, function(e){ $(this).blur(); disonnectHighFidelityAccount(); diff --git a/libraries/baking/src/TextureBaker.cpp b/libraries/baking/src/TextureBaker.cpp index b6edd07965..c10997462e 100644 --- a/libraries/baking/src/TextureBaker.cpp +++ b/libraries/baking/src/TextureBaker.cpp @@ -41,6 +41,13 @@ TextureBaker::TextureBaker(const QUrl& textureURL, image::TextureUsage::Type tex } } +TextureBaker::~TextureBaker() { + for (auto filepath : _temporaryFilesCreated) { + QFile f{filepath}; + f.remove(); + } +} + void TextureBaker::bake() { // once our texture is loaded, kick off a the processing connect(this, &TextureBaker::originalTextureLoaded, this, &TextureBaker::processTexture); diff --git a/libraries/baking/src/TextureBaker.h b/libraries/baking/src/TextureBaker.h index 90ecfe52f7..7d4d5c1f90 100644 --- a/libraries/baking/src/TextureBaker.h +++ b/libraries/baking/src/TextureBaker.h @@ -30,6 +30,7 @@ public: TextureBaker(const QUrl& textureURL, image::TextureUsage::Type textureType, const QDir& outputDirectory, const QString& bakedFilename = QString(), const QByteArray& textureContent = QByteArray()); + ~TextureBaker() override; const QByteArray& getOriginalTexture() const { return _originalTexture; } @@ -61,6 +62,8 @@ private: QDir _outputDirectory; QString _bakedTextureFileName; + std::vector _temporaryFilesCreated; + std::atomic _abortProcessing { false }; }; From 6ac8cdecd122b9465318e58fef7fe55319ac42b9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 21 Nov 2017 15:13:05 -0800 Subject: [PATCH 02/16] Re-enable js baking --- assignment-client/src/assets/AssetServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index cbddb2fe56..a9225fc200 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -52,7 +52,7 @@ static const int INTERFACE_RUNNING_CHECK_FREQUENCY_MS = 1000; static const QStringList BAKEABLE_MODEL_EXTENSIONS = { "fbx" }; static QStringList BAKEABLE_TEXTURE_EXTENSIONS; -static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = {}; +static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = { "js" }; static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx"; static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx"; From 6f3155db322dbfdac585e6214fb421277c988e4f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 21 Nov 2017 16:54:07 -0800 Subject: [PATCH 03/16] Fix existing baked assets not being recognized --- assignment-client/src/assets/AssetServer.cpp | 85 +++++++++++++++----- assignment-client/src/assets/AssetServer.h | 11 +-- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index a9225fc200..a8e6ecddb7 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -100,7 +100,7 @@ QString bakedFilenameForAssetType(BakedAssetType type) { BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { switch (type) { case Model: - return (BakeVersion)ModelBakeVersion::BetterModelBaking; + return (BakeVersion)ModelBakeVersion::Initial; case Texture: return (BakeVersion)TextureBakeVersion::Initial; case Script: @@ -110,12 +110,40 @@ BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { } } -QString toSlug(BakedAssetType type) { - switch (type) { - Model: return "model"; - Texture: return "texture"; +struct BakedTypeInfo { + BakedAssetType type; + const char* slug; + BakeVersion currentVersion; + const char* bakedName; +}; + +constexpr std::array BAKED_TYPE_INFO { { + { + Model, + "model", + (BakeVersion)ModelBakeVersion::Initial, + "asset.fbx", + }, + { + Texture, + "texture", + (BakeVersion)TextureBakeVersion::Initial, + "texture.ktx", + }, + { + Script, + "script", + (BakeVersion)ScriptBakeVersion::FixEmptyScripts, + "asset.js", } -} +}}; + +static_assert(BAKED_TYPE_INFO[BakedAssetType::Model].type == BakedAssetType::Model, + "Model should be in correct index"); +static_assert(BAKED_TYPE_INFO[BakedAssetType::Texture].type == BakedAssetType::Texture, + "Texture should be in correct index"); +static_assert(BAKED_TYPE_INFO[BakedAssetType::Script].type == BakedAssetType::Script, + "Script should be in correct index"); const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server"; @@ -251,6 +279,10 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU return false; } + if (meta.bakeVersion < currentVersion) { + return true; + } + QString bakedFilename = bakedFilenameForAssetType(type); auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; auto bakedPath = AssetUtils::HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; @@ -706,9 +738,19 @@ void AssetServer::handleGetMappingOperation(ReceivedMessage& message, NLPacketLi auto query = QUrlQuery(url.query()); bool isSkybox = query.hasQueryItem("skybox"); if (isSkybox) { - writeMetaFile(originalAssetHash); - if (!bakingDisabled) { - maybeBake(assetPath, originalAssetHash); + bool loaded; + AssetMeta meta; + std::tie(loaded, meta) = readMetaFile(originalAssetHash); + + if (!loaded) { + AssetMeta needsBakingMeta; + needsBakingMeta.bakeVersion = NEEDS_BAKING_BAKE_VERSION; + + writeMetaFile(originalAssetHash, needsBakingMeta); + if (!bakingDisabled) { + maybeBake(assetPath, originalAssetHash); + } + } } } @@ -1335,9 +1377,12 @@ void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath, std::tie(loaded, meta) = readMetaFile(originalAssetHash); + auto type = assetTypeForFilename(assetPath); + auto currentTypeVersion = currentBakeVersionForAssetType(type); + meta.failedLastBake = true; meta.lastBakeErrors = errors; - meta.bakeVersion = (BakeVersion)CURRENT_MODEL_BAKE_VERSION; + meta.bakeVersion = currentTypeVersion; writeMetaFile(originalAssetHash, meta); @@ -1427,18 +1472,20 @@ void AssetServer::handleCompletedBake(QString originalAssetHash, QString origina qWarning() << "Failed to remove temporary directory:" << bakedTempOutputDir; } - if (!errorCompletingBake) { - // create the meta file to store which version of the baking process we just completed - writeMetaFile(originalAssetHash); - } else { + auto type = assetTypeForFilename(originalAssetPath); + auto currentTypeVersion = currentBakeVersionForAssetType(type); + + AssetMeta meta; + meta.bakeVersion = currentTypeVersion; + meta.failedLastBake = errorCompletingBake; + + if (errorCompletingBake) { qWarning() << "Could not complete bake for" << originalAssetHash; - AssetMeta meta; - meta.failedLastBake = true; meta.lastBakeErrors = errorReason; - meta.bakeVersion = (BakeVersion)ModelBakeVersion::BetterModelBaking; - writeMetaFile(originalAssetHash, meta); } + writeMetaFile(originalAssetHash, meta); + _pendingBakes.remove(originalAssetHash); } @@ -1475,7 +1522,7 @@ std::pair AssetServer::readMetaFile(AssetUtils::AssetHash hash) if (error.error == QJsonParseError::NoError && doc.isObject()) { auto root = doc.object(); - auto bakeVersion = root[BAKE_VERSION_KEY].toInt(-1); + auto bakeVersion = root[BAKE_VERSION_KEY].toInt(INITIAL_BAKE_VERSION); auto failedLastBake = root[FAILED_LAST_BAKE_KEY]; auto lastBakeErrors = root[LAST_BAKE_ERRORS_KEY]; diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 4d869b05f7..f9b876e7a4 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -33,6 +33,8 @@ namespace std { } using BakeVersion = int; +static const BakeVersion INITIAL_BAKE_VERSION = 0; +static const BakeVersion NEEDS_BAKING_BAKE_VERSION = -1; enum BakedAssetType : int { Model = 0, @@ -44,17 +46,16 @@ enum BakedAssetType : int { }; enum class ModelBakeVersion : BakeVersion { - Initial = 0, - BetterModelBaking, + Initial = INITIAL_BAKE_VERSION }; enum class TextureBakeVersion : BakeVersion { - Initial = 0, + Initial = INITIAL_BAKE_VERSION, }; enum class ScriptBakeVersion : BakeVersion { - Initial = 0, - FixEmptyScripts = 1 + Initial = INITIAL_BAKE_VERSION, + FixEmptyScripts, }; struct AssetMeta { From 8a89e8f9fb3db8d78ff3d706e922ef4262905bf8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 22 Nov 2017 15:23:16 -0800 Subject: [PATCH 04/16] Remove BakedTypeInfo --- assignment-client/src/assets/AssetServer.cpp | 35 -------------------- 1 file changed, 35 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index a8e6ecddb7..73f198c3d6 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -110,41 +110,6 @@ BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { } } -struct BakedTypeInfo { - BakedAssetType type; - const char* slug; - BakeVersion currentVersion; - const char* bakedName; -}; - -constexpr std::array BAKED_TYPE_INFO { { - { - Model, - "model", - (BakeVersion)ModelBakeVersion::Initial, - "asset.fbx", - }, - { - Texture, - "texture", - (BakeVersion)TextureBakeVersion::Initial, - "texture.ktx", - }, - { - Script, - "script", - (BakeVersion)ScriptBakeVersion::FixEmptyScripts, - "asset.js", - } -}}; - -static_assert(BAKED_TYPE_INFO[BakedAssetType::Model].type == BakedAssetType::Model, - "Model should be in correct index"); -static_assert(BAKED_TYPE_INFO[BakedAssetType::Texture].type == BakedAssetType::Texture, - "Texture should be in correct index"); -static_assert(BAKED_TYPE_INFO[BakedAssetType::Script].type == BakedAssetType::Script, - "Script should be in correct index"); - const QString ASSET_SERVER_LOGGING_TARGET_NAME = "asset-server"; void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { From e38ef699cc7fe8d84b46bfc3b4c38a0c46466df9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 27 Nov 2017 08:43:47 -0800 Subject: [PATCH 05/16] Remove BakingVersion.h --- assignment-client/src/assets/AssetServer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 73f198c3d6..6a12984f01 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -36,8 +36,6 @@ void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { -#include - #include "AssetServerLogging.h" #include "BakeAssetTask.h" #include "SendAssetTask.h" From 99c3e6cf783ee24615f9ae03b4e701390f709920 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 5 Dec 2017 16:19:13 -0800 Subject: [PATCH 06/16] Remove unused _temporaryFilesCreated from TextureBaker --- libraries/baking/src/TextureBaker.cpp | 7 ------- libraries/baking/src/TextureBaker.h | 3 --- 2 files changed, 10 deletions(-) diff --git a/libraries/baking/src/TextureBaker.cpp b/libraries/baking/src/TextureBaker.cpp index c10997462e..b6edd07965 100644 --- a/libraries/baking/src/TextureBaker.cpp +++ b/libraries/baking/src/TextureBaker.cpp @@ -41,13 +41,6 @@ TextureBaker::TextureBaker(const QUrl& textureURL, image::TextureUsage::Type tex } } -TextureBaker::~TextureBaker() { - for (auto filepath : _temporaryFilesCreated) { - QFile f{filepath}; - f.remove(); - } -} - void TextureBaker::bake() { // once our texture is loaded, kick off a the processing connect(this, &TextureBaker::originalTextureLoaded, this, &TextureBaker::processTexture); diff --git a/libraries/baking/src/TextureBaker.h b/libraries/baking/src/TextureBaker.h index 7d4d5c1f90..90ecfe52f7 100644 --- a/libraries/baking/src/TextureBaker.h +++ b/libraries/baking/src/TextureBaker.h @@ -30,7 +30,6 @@ public: TextureBaker(const QUrl& textureURL, image::TextureUsage::Type textureType, const QDir& outputDirectory, const QString& bakedFilename = QString(), const QByteArray& textureContent = QByteArray()); - ~TextureBaker() override; const QByteArray& getOriginalTexture() const { return _originalTexture; } @@ -62,8 +61,6 @@ private: QDir _outputDirectory; QString _bakedTextureFileName; - std::vector _temporaryFilesCreated; - std::atomic _abortProcessing { false }; }; From 0003a32701a3b25ccaf93e10d7f955c49fbe1b87 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 6 Dec 2017 14:04:44 -0800 Subject: [PATCH 07/16] Fix AssetServer not detecting missing bakeVersion --- assignment-client/src/assets/AssetServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 6a12984f01..a7a91800d1 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -1485,7 +1485,7 @@ std::pair AssetServer::readMetaFile(AssetUtils::AssetHash hash) if (error.error == QJsonParseError::NoError && doc.isObject()) { auto root = doc.object(); - auto bakeVersion = root[BAKE_VERSION_KEY].toInt(INITIAL_BAKE_VERSION); + auto bakeVersion = root[BAKE_VERSION_KEY].toInt(-1); auto failedLastBake = root[FAILED_LAST_BAKE_KEY]; auto lastBakeErrors = root[LAST_BAKE_ERRORS_KEY]; From 9a7497c9ec2176881e0c720903e80386f0ea28ab Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 8 Dec 2017 15:37:31 -0800 Subject: [PATCH 08/16] Update AssetServer to check for baking disabled on startup --- assignment-client/src/assets/AssetServer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index a7a91800d1..7b68057aa0 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -228,6 +228,17 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU return false; } + QString bakedFilename = bakedFilenameForAssetType(type); + auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; + auto mappingIt = _fileMappings.find(bakedPath); + bool bakedMappingExists = mappingIt != _fileMappings.end(); + + // If the path is mapped to the original file's hash, baking has been disabled for this + // asset + if (bakedMappingExists && mappingIt->second == assetHash) { + return false; + } + bool loaded; AssetMeta meta; std::tie(loaded, meta) = readMetaFile(assetHash); From df8a25cbdc02a1d99d757ec9b61d5afa12fe1562 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 8 Dec 2017 16:58:17 -0800 Subject: [PATCH 09/16] Add warning to AssetServer.h to update bake version in .cpp --- assignment-client/src/assets/AssetServer.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index f9b876e7a4..55cad8ebd6 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -45,14 +45,18 @@ enum BakedAssetType : int { Undefined }; +// ATTENTION! If you change the current version for an asset type, you will also +// need to update the function currentBakeVersionForAssetType() inside of AssetServer.cpp. enum class ModelBakeVersion : BakeVersion { Initial = INITIAL_BAKE_VERSION }; +// ATTENTION! See above. enum class TextureBakeVersion : BakeVersion { Initial = INITIAL_BAKE_VERSION, }; +// ATTENTION! See above. enum class ScriptBakeVersion : BakeVersion { Initial = INITIAL_BAKE_VERSION, FixEmptyScripts, From 6ed89fb9cc23fe1da69f02048739c2c108954577 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Mar 2018 11:41:44 -0800 Subject: [PATCH 10/16] Cleanup asset server versioning changes --- assignment-client/src/assets/AssetServer.cpp | 20 +++++++------------- assignment-client/src/assets/AssetServer.h | 17 +++++++---------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 7b68057aa0..9f2352d9f1 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -33,8 +33,6 @@ #include #include #include -void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { -void AssetServer::bakeAsset(const AssetUtils::AssetHash& assetHash, const AssetUtils::AssetPath& assetPath, const QString& filePath) { #include "AssetServerLogging.h" #include "BakeAssetTask.h" @@ -56,9 +54,9 @@ static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx"; static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx"; static const QString BAKED_SCRIPT_SIMPLE_NAME = "asset.js"; -static const ModelBakeVersion CURRENT_MODEL_BAKE_VERSION = ModelBakeVersion::BetterModelBaking; -static const TextureBakeVersion CURRENT_TEXTURE_BAKE_VERSION = TextureBakeVersion::Initial; -static const ScriptBakeVersion CURRENT_SCRIPT_BAKE_VERSION = ScriptBakeVersion::Initial; +static const ModelBakeVersion CURRENT_MODEL_BAKE_VERSION = (ModelBakeVersion)((BakeVersion)ModelBakeVersion::COUNT - 1); +static const TextureBakeVersion CURRENT_TEXTURE_BAKE_VERSION = (TextureBakeVersion)((BakeVersion)TextureBakeVersion::COUNT - 1); +static const ScriptBakeVersion CURRENT_SCRIPT_BAKE_VERSION = (ScriptBakeVersion)((BakeVersion)ScriptBakeVersion::COUNT - 1); BakedAssetType assetTypeForExtension(const QString& extension) { auto extensionLower = extension.toLower(); @@ -98,11 +96,11 @@ QString bakedFilenameForAssetType(BakedAssetType type) { BakeVersion currentBakeVersionForAssetType(BakedAssetType type) { switch (type) { case Model: - return (BakeVersion)ModelBakeVersion::Initial; + return (BakeVersion)CURRENT_MODEL_BAKE_VERSION; case Texture: - return (BakeVersion)TextureBakeVersion::Initial; + return (BakeVersion)CURRENT_TEXTURE_BAKE_VERSION; case Script: - return (BakeVersion)ScriptBakeVersion::FixEmptyScripts; + return (BakeVersion)CURRENT_SCRIPT_BAKE_VERSION; default: return 0; } @@ -229,7 +227,7 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU } QString bakedFilename = bakedFilenameForAssetType(type); - auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; + auto bakedPath = AssetUtils::HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; auto mappingIt = _fileMappings.find(bakedPath); bool bakedMappingExists = mappingIt != _fileMappings.end(); @@ -257,10 +255,6 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU return true; } - QString bakedFilename = bakedFilenameForAssetType(type); - auto bakedPath = HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; - auto bakedPath = AssetUtils::HIDDEN_BAKED_CONTENT_FOLDER + assetHash + "/" + bakedFilename; - bool bakedMappingExists = _fileMappings.find(bakedPath) == _fileMappings.end(); return !bakedMappingExists || (meta.bakeVersion < currentVersion); } diff --git a/assignment-client/src/assets/AssetServer.h b/assignment-client/src/assets/AssetServer.h index 55cad8ebd6..a55a15e6fc 100644 --- a/assignment-client/src/assets/AssetServer.h +++ b/assignment-client/src/assets/AssetServer.h @@ -23,15 +23,6 @@ #include "RegisteredMetaTypes.h" -#include - -namespace std { - template <> - struct hash { - size_t operator()(const QString& v) const { return qHash(v); } - }; -} - using BakeVersion = int; static const BakeVersion INITIAL_BAKE_VERSION = 0; static const BakeVersion NEEDS_BAKING_BAKE_VERSION = -1; @@ -48,18 +39,24 @@ enum BakedAssetType : int { // ATTENTION! If you change the current version for an asset type, you will also // need to update the function currentBakeVersionForAssetType() inside of AssetServer.cpp. enum class ModelBakeVersion : BakeVersion { - Initial = INITIAL_BAKE_VERSION + Initial = INITIAL_BAKE_VERSION, + + COUNT }; // ATTENTION! See above. enum class TextureBakeVersion : BakeVersion { Initial = INITIAL_BAKE_VERSION, + + COUNT }; // ATTENTION! See above. enum class ScriptBakeVersion : BakeVersion { Initial = INITIAL_BAKE_VERSION, FixEmptyScripts, + + COUNT }; struct AssetMeta { From 5448099a9397212915451e52026094e3d3eb99bf Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 6 Mar 2018 09:10:41 -0800 Subject: [PATCH 11/16] Fix baker CLI not correctly exiting on failure We previusly were exiting while still inside of the QApplication ctor, before the event loop had been started. This fixes that by queueing up the baking to occur after the ctor has completed. --- tools/oven/src/BakerCLI.cpp | 1 + tools/oven/src/BakerCLI.h | 3 +++ tools/oven/src/OvenCLIApplication.cpp | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/oven/src/BakerCLI.cpp b/tools/oven/src/BakerCLI.cpp index f5af5455fb..428b85f1cc 100644 --- a/tools/oven/src/BakerCLI.cpp +++ b/tools/oven/src/BakerCLI.cpp @@ -63,6 +63,7 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& } else { qCDebug(model_baking) << "Failed to determine baker type for file" << inputUrl; QCoreApplication::exit(OVEN_STATUS_CODE_FAIL); + return; } // invoke the bake method on the baker thread diff --git a/tools/oven/src/BakerCLI.h b/tools/oven/src/BakerCLI.h index 4f5b6607b0..bf33b625dd 100644 --- a/tools/oven/src/BakerCLI.h +++ b/tools/oven/src/BakerCLI.h @@ -14,6 +14,7 @@ #include #include +#include #include @@ -31,6 +32,8 @@ class BakerCLI : public QObject { public: BakerCLI(OvenCLIApplication* parent); + +public slots: void bakeFile(QUrl inputUrl, const QString& outputPath, const QString& type = QString::null); private slots: diff --git a/tools/oven/src/OvenCLIApplication.cpp b/tools/oven/src/OvenCLIApplication.cpp index 38d9963eeb..2fb8ea03f2 100644 --- a/tools/oven/src/OvenCLIApplication.cpp +++ b/tools/oven/src/OvenCLIApplication.cpp @@ -40,7 +40,8 @@ OvenCLIApplication::OvenCLIApplication(int argc, char* argv[]) : QUrl inputUrl(QDir::fromNativeSeparators(parser.value(CLI_INPUT_PARAMETER))); QUrl outputUrl(QDir::fromNativeSeparators(parser.value(CLI_OUTPUT_PARAMETER))); QString type = parser.isSet(CLI_TYPE_PARAMETER) ? parser.value(CLI_TYPE_PARAMETER) : QString::null; - cli->bakeFile(inputUrl, outputUrl.toString(), type); + QMetaObject::invokeMethod(cli, "bakeFile", Qt::QueuedConnection, Q_ARG(QUrl, inputUrl), + Q_ARG(QString, outputUrl.toString()), Q_ARG(QString, type)); } else { parser.showHelp(); QCoreApplication::quit(); From c555590e9b737a5f7a02cdfd6a64d3d36e9e2a05 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 6 Mar 2018 09:12:47 -0800 Subject: [PATCH 12/16] Enable support for baking JS files inside of the oven --- tools/oven/src/BakerCLI.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/oven/src/BakerCLI.cpp b/tools/oven/src/BakerCLI.cpp index 428b85f1cc..045034be2b 100644 --- a/tools/oven/src/BakerCLI.cpp +++ b/tools/oven/src/BakerCLI.cpp @@ -18,6 +18,7 @@ #include "ModelBakingLoggingCategory.h" #include "BakerCLI.h" #include "FBXBaker.h" +#include "JSBaker.h" #include "TextureBaker.h" BakerCLI::BakerCLI(OvenCLIApplication* parent) : QObject(parent) { @@ -34,6 +35,7 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& qDebug() << "Baking file type: " << type; static const QString MODEL_EXTENSION { "fbx" }; + static const QString SCRIPT_EXTENSION { "js" }; QString extension = type; @@ -44,6 +46,7 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& // check what kind of baker we should be creating bool isFBX = extension == MODEL_EXTENSION; + bool isScript = extension == SCRIPT_EXTENSION; bool isSupportedImage = QImageReader::supportedImageFormats().contains(extension.toLatin1()); @@ -57,6 +60,9 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& outputPath) }; _baker->moveToThread(Oven::instance().getNextWorkerThread()); + } else if (isScript) { + _baker = std::unique_ptr { new JSBaker(inputUrl, outputPath) }; + _baker->moveToThread(qApp->getNextWorkerThread()); } else if (isSupportedImage) { _baker = std::unique_ptr { new TextureBaker(inputUrl, image::TextureUsage::CUBE_TEXTURE, outputPath) }; _baker->moveToThread(Oven::instance().getNextWorkerThread()); From 0a00227ce3373463f46f8e0d0c53652140724865 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 6 Mar 2018 09:20:24 -0800 Subject: [PATCH 13/16] Update message for failed bakes inside of AssetServer.cpp --- assignment-client/src/assets/AssetServer.cpp | 2 +- tools/oven/src/BakerCLI.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 9f2352d9f1..0c2953774f 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -1338,7 +1338,7 @@ QString getBakeMapping(const AssetUtils::AssetHash& hash, const QString& relativ } void AssetServer::handleFailedBake(QString originalAssetHash, QString assetPath, QString errors) { - qDebug() << "Failed: " << originalAssetHash << assetPath << errors; + qDebug() << "Failed to bake: " << originalAssetHash << assetPath << "(" << errors << ")"; bool loaded; AssetMeta meta; diff --git a/tools/oven/src/BakerCLI.cpp b/tools/oven/src/BakerCLI.cpp index 045034be2b..35550cdca8 100644 --- a/tools/oven/src/BakerCLI.cpp +++ b/tools/oven/src/BakerCLI.cpp @@ -62,7 +62,7 @@ void BakerCLI::bakeFile(QUrl inputUrl, const QString& outputPath, const QString& _baker->moveToThread(Oven::instance().getNextWorkerThread()); } else if (isScript) { _baker = std::unique_ptr { new JSBaker(inputUrl, outputPath) }; - _baker->moveToThread(qApp->getNextWorkerThread()); + _baker->moveToThread(Oven::instance().getNextWorkerThread()); } else if (isSupportedImage) { _baker = std::unique_ptr { new TextureBaker(inputUrl, image::TextureUsage::CUBE_TEXTURE, outputPath) }; _baker->moveToThread(Oven::instance().getNextWorkerThread()); From 42324d79f1b5d7f52d2e3feedb7ff42e334e02bc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Mar 2018 12:15:54 -0700 Subject: [PATCH 14/16] Remove unused DS settings.js change --- domain-server/resources/web/settings/js/settings.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/domain-server/resources/web/settings/js/settings.js b/domain-server/resources/web/settings/js/settings.js index 0a675263ca..e67ea43158 100644 --- a/domain-server/resources/web/settings/js/settings.js +++ b/domain-server/resources/web/settings/js/settings.js @@ -128,10 +128,6 @@ $(document).ready(function(){ createTemporaryDomain(); }); - $('#' + Settings.FORM_ID).on('change', 'select', function(){ - $("input[name='" + $(this).attr('data-hidden-input') + "']").val($(this).val()).change() - }); - $('#' + Settings.FORM_ID).on('click', '#' + Settings.DISCONNECT_ACCOUNT_BTN_ID, function(e){ $(this).blur(); disonnectHighFidelityAccount(); From 655636c44f23d53e2b4e175440417382b7676201 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Mar 2018 12:16:12 -0700 Subject: [PATCH 15/16] Remove redundant if block in AssetServer.cpp --- assignment-client/src/assets/AssetServer.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index 0c2953774f..e1fb7e4d49 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -251,10 +251,6 @@ bool AssetServer::needsToBeBaked(const AssetUtils::AssetPath& path, const AssetU return false; } - if (meta.bakeVersion < currentVersion) { - return true; - } - return !bakedMappingExists || (meta.bakeVersion < currentVersion); } From d2ae30f8e052c7e334fb53b16465657a717e7279 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Mar 2018 16:22:59 -0700 Subject: [PATCH 16/16] Disable support for baking scripts in the Asset Server --- assignment-client/src/assets/AssetServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/assets/AssetServer.cpp b/assignment-client/src/assets/AssetServer.cpp index e1fb7e4d49..1eb43a45a5 100644 --- a/assignment-client/src/assets/AssetServer.cpp +++ b/assignment-client/src/assets/AssetServer.cpp @@ -48,7 +48,7 @@ static const int INTERFACE_RUNNING_CHECK_FREQUENCY_MS = 1000; static const QStringList BAKEABLE_MODEL_EXTENSIONS = { "fbx" }; static QStringList BAKEABLE_TEXTURE_EXTENSIONS; -static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = { "js" }; +static const QStringList BAKEABLE_SCRIPT_EXTENSIONS = { }; static const QString BAKED_MODEL_SIMPLE_NAME = "asset.fbx"; static const QString BAKED_TEXTURE_SIMPLE_NAME = "texture.ktx";