diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index 421512ce0..15dd30471 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -1199,6 +1199,7 @@ namespace FlaxEditor { public byte AutoReloadScriptsOnMainWindowFocus; public byte ForceScriptCompilationOnStartup; + public byte UseAssetImportPathRelative; public byte AutoRebuildCSG; public float AutoRebuildCSGTimeoutMs; public byte AutoRebuildNavMesh; diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index 7e81a7f58..79a5bfe61 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -794,6 +794,9 @@ public: static void SetOptions(ManagedEditor::InternalOptions* options) { ManagedEditor::ManagedEditorOptions = *options; + + // Apply options + AssetsImportingManager::UseImportPathRelative = ManagedEditor::ManagedEditorOptions.UseAssetImportPathRelative != 0; } static void DrawNavMesh() diff --git a/Source/Editor/Managed/ManagedEditor.h b/Source/Editor/Managed/ManagedEditor.h index 8d6547377..dd3ebb3bb 100644 --- a/Source/Editor/Managed/ManagedEditor.h +++ b/Source/Editor/Managed/ManagedEditor.h @@ -26,6 +26,7 @@ public: { byte AutoReloadScriptsOnMainWindowFocus = 1; byte ForceScriptCompilationOnStartup = 1; + byte UseAssetImportPathRelative = 1; byte AutoRebuildCSG = 1; float AutoRebuildCSGTimeoutMs = 50; byte AutoRebuildNavMesh = 1; diff --git a/Source/Editor/Options/GeneralOptions.cs b/Source/Editor/Options/GeneralOptions.cs index 5f05cae2c..ea3b0bee9 100644 --- a/Source/Editor/Options/GeneralOptions.cs +++ b/Source/Editor/Options/GeneralOptions.cs @@ -148,6 +148,13 @@ namespace FlaxEditor.Options [EditorDisplay("Scripting", "Auto Save Visual Script On Play Start"), EditorOrder(505), Tooltip("Determines whether automatically save the Visual Script asset editors when starting the play mode in editor.")] public bool AutoSaveVisualScriptOnPlayStart { get; set; } = true; + /// + /// If checked, imported file path will be stored relative to the project folder within imported asset metadata. Otherwise will use absolute path. + /// + [DefaultValue(true)] + [EditorDisplay("Content"), EditorOrder(550)] + public bool UseAssetImportPathRelative { get; set; } = true; + /// /// Gets or sets a value indicating whether perform automatic CSG rebuild on brush change. /// diff --git a/Source/Editor/Options/OptionsModule.cs b/Source/Editor/Options/OptionsModule.cs index 0b4476e0a..7d83f7dba 100644 --- a/Source/Editor/Options/OptionsModule.cs +++ b/Source/Editor/Options/OptionsModule.cs @@ -186,6 +186,7 @@ namespace FlaxEditor.Options Editor.InternalOptions internalOptions; internalOptions.AutoReloadScriptsOnMainWindowFocus = (byte)(Options.General.AutoReloadScriptsOnMainWindowFocus ? 1 : 0); internalOptions.ForceScriptCompilationOnStartup = (byte)(Options.General.ForceScriptCompilationOnStartup ? 1 : 0); + internalOptions.UseAssetImportPathRelative = (byte)(Options.General.UseAssetImportPathRelative ? 1 : 0); internalOptions.AutoRebuildCSG = (byte)(Options.General.AutoRebuildCSG ? 1 : 0); internalOptions.AutoRebuildCSGTimeoutMs = Options.General.AutoRebuildCSGTimeoutMs; internalOptions.AutoRebuildNavMesh = (byte)(Options.General.AutoRebuildNavMesh ? 1 : 0); diff --git a/Source/Engine/Content/BinaryAsset.cpp b/Source/Engine/Content/BinaryAsset.cpp index 99c91cc4a..f247d46d4 100644 --- a/Source/Engine/Content/BinaryAsset.cpp +++ b/Source/Engine/Content/BinaryAsset.cpp @@ -4,15 +4,16 @@ #include "Cache/AssetsCache.h" #include "Storage/ContentStorageManager.h" #include "Loading/Tasks/LoadAssetDataTask.h" +#include "Factories/BinaryAssetFactory.h" #include "Engine/ContentImporters/AssetsImportingManager.h" #include "Engine/Content/Content.h" #include "Engine/Serialization/JsonTools.h" #include "Engine/Debug/Exceptions/JsonParseException.h" -#include "Factories/BinaryAssetFactory.h" #include "Engine/Threading/ThreadPoolTask.h" #if USE_EDITOR #include "Engine/Platform/FileSystem.h" #include "Engine/Threading/Threading.h" +#include "Engine/Engine/Globals.h" #endif REGISTER_BINARY_ASSET_ABSTRACT(BinaryAsset, "FlaxEngine.BinaryAsset"); @@ -123,6 +124,12 @@ void BinaryAsset::GetImportMetadata(String& path, String& username) const { path = JsonTools::GetString(document, "ImportPath"); username = JsonTools::GetString(document, "ImportUsername"); + if (path.HasChars() && FileSystem::IsRelative(path)) + { + // Convert path back to thr absolute (eg. if stored in relative format) + path = Globals::ProjectFolder / path; + StringUtils::PathRemoveRelativeParts(path); + } } else { diff --git a/Source/Engine/ContentImporters/AssetsImportingManager.cpp b/Source/Engine/ContentImporters/AssetsImportingManager.cpp index 9c654aada..2b80d3454 100644 --- a/Source/Engine/ContentImporters/AssetsImportingManager.cpp +++ b/Source/Engine/ContentImporters/AssetsImportingManager.cpp @@ -3,6 +3,7 @@ #if COMPILE_WITH_ASSETS_IMPORTER #include "AssetsImportingManager.h" +#include "Engine/Core/Log.h" #include "Engine/Core/Utilities.h" #include "Engine/Serialization/JsonWriters.h" #include "Engine/Threading/MainThreadTask.h" @@ -10,9 +11,9 @@ #include "Engine/Content/Content.h" #include "Engine/Content/Cache/AssetsCache.h" #include "Engine/Engine/EngineService.h" -#include "Engine/Core/Log.h" #include "Engine/Platform/FileSystem.h" #include "Engine/Platform/Platform.h" +#include "Engine/Engine/Globals.h" #include "ImportTexture.h" #include "ImportModelFile.h" #include "ImportAudio.h" @@ -71,6 +72,7 @@ AssetsImportingManagerService AssetsImportingManagerServiceInstance; Array AssetsImportingManager::Importers; Array AssetsImportingManager::Creators; +bool AssetsImportingManager::UseImportPathRelative = false; CreateAssetContext::CreateAssetContext(const StringView& inputPath, const StringView& outputPath, const Guid& id, void* arg) { @@ -161,7 +163,15 @@ bool CreateAssetContext::AllocateChunk(int32 index) void CreateAssetContext::AddMeta(JsonWriter& writer) const { writer.JKEY("ImportPath"); - writer.String(InputPath); + if (AssetsImportingManager::UseImportPathRelative && !FileSystem::IsRelative(InputPath)) + { + const String relativePath = FileSystem::ConvertAbsolutePathToRelative(Globals::ProjectFolder, InputPath); + writer.String(relativePath); + } + else + { + writer.String(InputPath); + } writer.JKEY("ImportUsername"); writer.String(Platform::GetUserName()); } diff --git a/Source/Engine/ContentImporters/AssetsImportingManager.h b/Source/Engine/ContentImporters/AssetsImportingManager.h index 0ec23d6bb..c329ea10a 100644 --- a/Source/Engine/ContentImporters/AssetsImportingManager.h +++ b/Source/Engine/ContentImporters/AssetsImportingManager.h @@ -22,6 +22,11 @@ public: /// static Array Creators; + /// + /// If true store asset import path relative to the current workspace, otherwise will store absolute path. + /// + static bool UseImportPathRelative; + public: /// /// The create texture tag (using internal import pipeline to crate texture asset from custom image source).