Update the FileIO Aliases (#4186)
* Update the FileIOAlias naming to make the cache, project root and engine root paths more clear The alias of `@root@`, `@assets@`, and `@projectplatformcache@` has been collapsed to `@projectproductassets@` The alias of `@devroot@` and `@engroot@` has been collapsed to `@engroot@` The alias of `@devassets@` and `@projectroot@` has been collapsed to `@projectroot@` Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated use of devassets and devroot properties in python Those properties now use projectroot and engroot Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updating the alias @engroot@ alias path comment in each platform specific LocalFileIO_*.cpp file Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed hardcoded size of 9 for the product asset alias. The ResolvePath function now just appends the @projectproductassets@ alias with the input path Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Remove duplicate @projectproductassets@ check in ProcessFileTreeRequest Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fix for typos in Hydra python test Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated LocalFileIO::Copy call on Windows to use the Unicode aware CopyFileW API Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the AWSMetreicsGemAllocatorFixture to properly suppress asset cache write errors for Test file creation. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed unneeded call to set the @projectproductasstes@ alias at the bottom of the AssetSeedManagerTest SetUp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Added a deprecated alias map to the FileIO System When a deprecated alias is accessed, the FileIO System logs an AZ_Error and indicates the alias that should be used Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated python test scripts to use the projectroot binding Retrieving the AutomatedTesting project path based on "<devroot>/AutomatedTesting" has been removed. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated references to devroot and devgame within the codebase The GetAbsoluteDevGameFolderPath functions has been replaced with direct call to AZ::Utils::GetProjectPath The GetAbsoluteDevRootFolderPath functions has been replaced with direct calls to AZ::Utils::GetEnginePath Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated <engroot>/AutomatedTesting references to projectroot Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced references that assumes the project path is <engroot>/AutomatedTesting with <projectroot> in the AutomatedTesting python test Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Correct casing in emfxworkspace file Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed newly added AppendPathParts function Removed the Path constructors which accepts a PathIterable instance The PathIterable isn't safe to return to a user of the Path class as it might be referencing temporary paths supplied via PathView arguments Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed unused parameter warning Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Undid change to the LexicallyProximate function to set the path result to the base path. It needs to return the *this path if the pathResult is empty Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Moved the LocalFileIO ConvertToAbsolutePath implementations to AZ::Utils Fixed the ConvertToAbsolutePath implementation for Unix platforms to use a buffer that is size PATH_MAX(4096 on all our supported Unix platforms). Because the buffer before was AZ::IO::MaxPathLength which as a size of 1024, this was resulting in the Unix `realpath` function smashing the stack when it converts a path to an absolute path that is longer than 1024 characters Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the EditorCore.Tests to attach the AZ Environment to the EditorCore shared library that is statically loaded on launch. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed for DeprecatedAlaisesKeyVisitor Visit function causing the non string_view overloads being hidden causing a hidden base class function warning Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Changed the AWSMetricsGemMock to use a temporary for writing test assets Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the LocalFileIO::ResolvePath function to use HasRootPath to determine if a path starts with a root path such as "D:", "D:/" or "/" IsAbsolute was not the corect check as the path of "D:" is a relative path. To be absolute according to the Windows the path must have a root directory. i.e "D:/" or "D:\" Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed absolute path comment from LocalFile_UnixLike.cpp and LocalFile_Android.cpp FindFiles implementations Updated the ConvertToAlias to supply an AZ::IO::FixedMaxPath Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced usage of the @projectproductassets@ alias with @engroot@ when referring to the LmbrCentral source folder in the CopyDependencyBuilderTest and the SeedBuilderTests Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the ScriptCanvas Upgrade Tool to output backed up files to the Project User Path instead of the engine root Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed whitespacing issues in Application.cpp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Remove unnecessary creation of a FixedMaxPath in the UpgradeTool.cpp Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Modified testSeedFolder variable in the SeedBuilderTests to use the @engroot@ alias instead of @projectproductassets@/.. alias when referring to the LmbrCentral Gem source path Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated references to the Project Asset Cache in the PythonTests. Those tests no longer use the logic `azlmbr.paths.projectroot / "Cache" / "pc"` to retrieve a path to the cache root but instead the `azlmbr.paths.projectproductassets` constant Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed the FileIO Deprecated Alias test on Windows Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removing @projectsourceassets@ alias, as it is only used once. Updated the PhysX EditorSystemComponent.cpp to query the ProjectPath form the SettingsRegistry. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Replaced @projectproductassets@ alias with @products@ Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Rollback changes to the PhysX EditorSystemComponent.cpp The changes to use the ProjectPath from the SettingsRegistry has been implemented in PR #4497 Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
643bd84739
commit
f648cb1fd8
@@ -278,17 +278,16 @@ void CFolderTreeCtrl::LoadTreeRec(const QString& currentFolder)
|
||||
|
||||
void CFolderTreeCtrl::AddItem(const QString& path)
|
||||
{
|
||||
QString folder;
|
||||
QString fileNameWithoutExtension;
|
||||
QString ext;
|
||||
|
||||
Path::Split(path, folder, fileNameWithoutExtension, ext);
|
||||
AZ::IO::FixedMaxPath folder{ AZ::IO::PathView(path.toUtf8().constData()) };
|
||||
AZ::IO::FixedMaxPath fileNameWithoutExtension = folder.Extension();
|
||||
folder = folder.ParentPath();
|
||||
|
||||
auto regex = QRegExp(m_fileNameSpec, Qt::CaseInsensitive, QRegExp::Wildcard);
|
||||
if (regex.exactMatch(path))
|
||||
{
|
||||
CTreeItem* folderTreeItem = CreateFolderItems(folder);
|
||||
folderTreeItem->AddChild(fileNameWithoutExtension, path, eTreeImage_File);
|
||||
CTreeItem* folderTreeItem = CreateFolderItems(QString::fromUtf8(folder.c_str(), static_cast<int>(folder.Native().size())));
|
||||
folderTreeItem->AddChild(QString::fromUtf8(fileNameWithoutExtension.c_str(),
|
||||
static_cast<int>(fileNameWithoutExtension.Native().size())), path, eTreeImage_File);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ public:
|
||||
protected:
|
||||
void SetupEnvironment() override
|
||||
{
|
||||
AttachEditorCoreAZEnvironment(AZ::Environment::GetInstance());
|
||||
m_allocatorScope.ActivateAllocators();
|
||||
m_cryPak = new NiceMock<CryPakMock>();
|
||||
|
||||
@@ -49,6 +50,7 @@ protected:
|
||||
{
|
||||
delete m_cryPak;
|
||||
m_allocatorScope.DeactivateAllocators();
|
||||
DetachEditorCoreAZEnvironment();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -5,22 +5,29 @@
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
#include "EditorDefs.h"
|
||||
#include <AzTest/AzTest.h>
|
||||
#include "Util/PathUtil.h"
|
||||
#include <CrySystemBus.h>
|
||||
|
||||
TEST(PathUtil, GamePathToFullPath_DoesNotBufferOverflow)
|
||||
#include <AzCore/UnitTest/TestTypes.h>
|
||||
#include <Util/PathUtil.h>
|
||||
namespace UnitTest
|
||||
{
|
||||
// There are no test assertions in this test because the purpose is just to verify that the test runs without crashing
|
||||
QString pngExtension(".png");
|
||||
class PathUtil
|
||||
: public ScopedAllocatorSetupFixture
|
||||
{
|
||||
};
|
||||
|
||||
// Create a string of lenth AZ_MAX_PATH_LEN that ends in .png
|
||||
QString longStringMaxPath(AZ_MAX_PATH_LEN, 'x');
|
||||
longStringMaxPath.replace(longStringMaxPath.length() - pngExtension.length(), longStringMaxPath.length(), pngExtension);
|
||||
Path::GamePathToFullPath(longStringMaxPath);
|
||||
TEST_F(PathUtil, GamePathToFullPath_DoesNotBufferOverflow)
|
||||
{
|
||||
// There are no test assertions in this test because the purpose is just to verify that the test runs without crashing
|
||||
QString pngExtension(".png");
|
||||
|
||||
QString longStringMaxPathPlusOne(AZ_MAX_PATH_LEN + 1, 'x');
|
||||
longStringMaxPathPlusOne.replace(longStringMaxPathPlusOne.length() - pngExtension.length(), longStringMaxPathPlusOne.length(), pngExtension);
|
||||
Path::GamePathToFullPath(longStringMaxPathPlusOne);
|
||||
// Create a string of length AZ_MAX_PATH_LEN that ends in .png
|
||||
QString longStringMaxPath(AZ_MAX_PATH_LEN, 'x');
|
||||
longStringMaxPath.replace(longStringMaxPath.length() - pngExtension.length(), longStringMaxPath.length(), pngExtension);
|
||||
AZ_TEST_START_TRACE_SUPPRESSION;
|
||||
Path::GamePathToFullPath(longStringMaxPath);
|
||||
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
|
||||
|
||||
QString longStringMaxPathPlusOne(AZ_MAX_PATH_LEN + 1, 'x');
|
||||
longStringMaxPathPlusOne.replace(longStringMaxPathPlusOne.length() - pngExtension.length(), longStringMaxPathPlusOne.length(), pngExtension);
|
||||
Path::GamePathToFullPath(longStringMaxPathPlusOne);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2642,7 +2642,7 @@ void CCryEditApp::OnFileResaveSlices()
|
||||
sliceAssetInfos.reserve(5000);
|
||||
AZ::Data::AssetCatalogRequests::AssetEnumerationCB sliceCountCb = [&sliceAssetInfos]([[maybe_unused]] const AZ::Data::AssetId id, const AZ::Data::AssetInfo& info)
|
||||
{
|
||||
// Only add slices and nothing that has been temporarily added to the catalog with a macro in it (ie @devroot@)
|
||||
// Only add slices and nothing that has been temporarily added to the catalog with a macro in it (ie @engroot@)
|
||||
if (info.m_assetType == azrtti_typeid<AZ::SliceAsset>() && info.m_relativePath[0] != '@')
|
||||
{
|
||||
sliceAssetInfos.push_back(info);
|
||||
|
||||
@@ -1108,7 +1108,7 @@ bool CCryEditDoc::SaveLevel(const QString& filename)
|
||||
if (QFileInfo(filename).isRelative())
|
||||
{
|
||||
// Resolving the path through resolvepath would normalize and lowcase it, and in this case, we don't want that.
|
||||
fullPathName = Path::ToUnixPath(QDir(QString::fromUtf8(gEnv->pFileIO->GetAlias("@devassets@"))).absoluteFilePath(fullPathName));
|
||||
fullPathName = Path::ToUnixPath(QDir(QString::fromUtf8(gEnv->pFileIO->GetAlias("@projectroot@"))).absoluteFilePath(fullPathName));
|
||||
}
|
||||
|
||||
if (!CFileUtil::OverwriteFile(fullPathName))
|
||||
@@ -2159,7 +2159,7 @@ bool CCryEditDoc::LoadXmlArchiveArray(TDocMultiArchive& arrXmlAr, const QString&
|
||||
xmlAr.bLoading = true;
|
||||
|
||||
// bound to the level folder, as if it were the assets folder.
|
||||
// this mounts (whateverlevelname.ly) as @assets@/Levels/whateverlevelname/ and thus it works...
|
||||
// this mounts (whateverlevelname.ly) as @products@/Levels/whateverlevelname/ and thus it works...
|
||||
bool openLevelPakFileSuccess = pIPak->OpenPack(levelPath.toUtf8().data(), absoluteLevelPath.toUtf8().data());
|
||||
if (!openLevelPakFileSuccess)
|
||||
{
|
||||
|
||||
@@ -91,7 +91,7 @@ CPythonScriptsDialog::CPythonScriptsDialog(QWidget* parent)
|
||||
{
|
||||
AZ::IO::Path newSourcePath = jsonSourcePathPointer;
|
||||
// Resolve any file aliases first - Do not use ResolvePath() as that assumes
|
||||
// any relative path is underneath the @assets@ alias
|
||||
// any relative path is underneath the @products@ alias
|
||||
if (auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); fileIoBase != nullptr)
|
||||
{
|
||||
AZ::IO::FixedMaxPath replacedAliasPath;
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// Editor
|
||||
#include "CryEdit.h"
|
||||
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CEditorFileMonitor::CEditorFileMonitor()
|
||||
{
|
||||
@@ -177,26 +179,14 @@ void CEditorFileMonitor::OnFileMonitorChange(const SFileChangeInfo& rChange)
|
||||
// Make file relative to PrimaryCD folder.
|
||||
QString filename = rChange.filename;
|
||||
|
||||
// Remove game directory if present in path.
|
||||
const QString rootPath =
|
||||
QDir::fromNativeSeparators(QString::fromLatin1(Path::GetEditingRootFolder().c_str()));
|
||||
if (filename.startsWith(rootPath, Qt::CaseInsensitive))
|
||||
{
|
||||
filename = filename.right(filename.length() - rootPath.length());
|
||||
}
|
||||
// Make path relative to the the project directory
|
||||
AZ::IO::Path projectPath{ AZ::Utils::GetProjectPath() };
|
||||
AZ::IO::FixedMaxPath projectRelativeFilePath = AZ::IO::PathView(filename.toUtf8().constData()).LexicallyProximate(
|
||||
projectPath);
|
||||
|
||||
// Make sure there is no leading slash
|
||||
if (!filename.isEmpty() && (filename[0] == '\\' || filename[0] == '/'))
|
||||
if (!projectRelativeFilePath.empty())
|
||||
{
|
||||
filename = filename.mid(1);
|
||||
}
|
||||
|
||||
if (!filename.isEmpty())
|
||||
{
|
||||
//remove game name. Make it relative to the game folder
|
||||
const QString filenameRelGame = RemoveGameName(filename);
|
||||
const int extIndex = filename.lastIndexOf('.');
|
||||
const QString ext = filename.right(filename.length() - 1 - extIndex);
|
||||
AZ::IO::PathView ext = projectRelativeFilePath.Extension();
|
||||
|
||||
// Check for File Monitor callback
|
||||
std::vector<SFileChangeCallback>::iterator iter;
|
||||
@@ -207,15 +197,11 @@ void CEditorFileMonitor::OnFileMonitorChange(const SFileChangeInfo& rChange)
|
||||
// We compare against length of callback string, so we get directory matches as well as full filenames
|
||||
if (sCallback.pListener)
|
||||
{
|
||||
if (sCallback.extension == "*" || ext.compare(sCallback.extension, Qt::CaseInsensitive) == 0)
|
||||
if (sCallback.extension == "*" || AZ::IO::PathView(sCallback.extension.toUtf8().constData()) == ext)
|
||||
{
|
||||
if (filenameRelGame.compare(sCallback.item, Qt::CaseInsensitive) == 0)
|
||||
if (AZ::IO::PathView(sCallback.item.toUtf8().constData()) == projectRelativeFilePath)
|
||||
{
|
||||
sCallback.pListener->OnFileChange(qPrintable(filenameRelGame), IFileChangeListener::EChangeType(rChange.changeType));
|
||||
}
|
||||
else if (filename.compare(sCallback.item, Qt::CaseInsensitive) == 0)
|
||||
{
|
||||
sCallback.pListener->OnFileChange(qPrintable(filename), IFileChangeListener::EChangeType(rChange.changeType));
|
||||
sCallback.pListener->OnFileChange(qPrintable(projectRelativeFilePath.c_str()), IFileChangeListener::EChangeType(rChange.changeType));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1895,7 +1895,7 @@ void SandboxIntegrationManager::MakeSliceFromEntities(const AzToolsFramework::En
|
||||
AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(entitiesAndDescendants,
|
||||
&AzToolsFramework::ToolsApplicationRequestBus::Events::GatherEntitiesAndAllDescendents, entities);
|
||||
|
||||
const AZStd::string slicesAssetsPath = "@devassets@/Slices";
|
||||
const AZStd::string slicesAssetsPath = "@projectroot@/Slices";
|
||||
|
||||
if (!gEnv->pFileIO->Exists(slicesAssetsPath.c_str()))
|
||||
{
|
||||
|
||||
@@ -30,6 +30,7 @@ class CXTPDockingPaneLayout; // Needed for settings.h
|
||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
||||
#include <AzCore/IO/Path/Path.h>
|
||||
#include <AzCore/std/functional.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <Util/PathUtil.h>
|
||||
@@ -47,41 +48,6 @@ class CXTPDockingPaneLayout; // Needed for settings.h
|
||||
const char* AssetImporterWindow::s_documentationWebAddress = "http://docs.aws.amazon.com/lumberyard/latest/userguide/char-fbx-importer.html";
|
||||
const AZ::Uuid AssetImporterWindow::s_browseTag = AZ::Uuid::CreateString("{C240D2E1-BFD2-4FFA-BB5B-CC0FA389A5D3}");
|
||||
|
||||
void MakeUserFriendlySourceAssetPath(QString& out, const QString& sourcePath)
|
||||
{
|
||||
char devAssetsRoot[AZ_MAX_PATH_LEN] = { 0 };
|
||||
if (!gEnv->pFileIO->ResolvePath("@devroot@", devAssetsRoot, AZ_MAX_PATH_LEN))
|
||||
{
|
||||
out = sourcePath;
|
||||
return;
|
||||
}
|
||||
|
||||
AZStd::replace(devAssetsRoot, devAssetsRoot + AZ_MAX_PATH_LEN- 1, AZ_WRONG_FILESYSTEM_SEPARATOR, AZ_CORRECT_FILESYSTEM_SEPARATOR);
|
||||
|
||||
// Find if the sourcePathArray is a sub directory of the devAssets folder
|
||||
// Keep reference to sourcePathArray long enough to use in PathView
|
||||
QByteArray sourcePathArray = sourcePath.toUtf8();
|
||||
AZ::IO::PathView sourcePathRootView(sourcePathArray.data());
|
||||
AZ::IO::PathView devAssetsRootView(devAssetsRoot);
|
||||
auto [sourcePathIter, devAssetsIter] = AZStd::mismatch(sourcePathRootView.begin(), sourcePathRootView.end(),
|
||||
devAssetsRootView.begin(), devAssetsRootView.end());
|
||||
// If the devAssets path iterator is not equal to the end, then there was a mismistch while comparing it
|
||||
// against the source path indicating that the source path is not a sub-directory
|
||||
if (devAssetsIter != devAssetsRootView.end())
|
||||
{
|
||||
out = sourcePath;
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = aznumeric_cast<int>(strlen(devAssetsRoot));
|
||||
if (sourcePath.at(offset) == AZ_CORRECT_FILESYSTEM_SEPARATOR)
|
||||
{
|
||||
++offset;
|
||||
}
|
||||
out = sourcePath.right(sourcePath.length() - offset);
|
||||
|
||||
}
|
||||
|
||||
AssetImporterWindow::AssetImporterWindow()
|
||||
: AssetImporterWindow(nullptr)
|
||||
{
|
||||
@@ -102,7 +68,7 @@ AssetImporterWindow::AssetImporterWindow(QWidget* parent)
|
||||
|
||||
AssetImporterWindow::~AssetImporterWindow()
|
||||
{
|
||||
AZ_Assert(m_processingOverlayIndex == AZ::SceneAPI::UI::OverlayWidget::s_invalidOverlayIndex,
|
||||
AZ_Assert(m_processingOverlayIndex == AZ::SceneAPI::UI::OverlayWidget::s_invalidOverlayIndex,
|
||||
"Processing overlay (and potentially background thread) still active at destruction.");
|
||||
AZ_Assert(!m_processingOverlay, "Processing overlay (and potentially background thread) still active at destruction.");
|
||||
}
|
||||
@@ -133,7 +99,7 @@ void AssetImporterWindow::OpenFile(const AZStd::string& filePath)
|
||||
QMessageBox::warning(this, "In progress", "Unable to close one or more windows at this time.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
OpenFileInternal(filePath);
|
||||
}
|
||||
|
||||
@@ -146,7 +112,7 @@ void AssetImporterWindow::closeEvent(QCloseEvent* ev)
|
||||
|
||||
if (m_processingOverlay)
|
||||
{
|
||||
AZ_Assert(m_processingOverlayIndex != AZ::SceneAPI::UI::OverlayWidget::s_invalidOverlayIndex,
|
||||
AZ_Assert(m_processingOverlayIndex != AZ::SceneAPI::UI::OverlayWidget::s_invalidOverlayIndex,
|
||||
"Processing overlay present, but not the index in the overlay for it.");
|
||||
if (m_processingOverlay->HasProcessingCompleted())
|
||||
{
|
||||
@@ -157,7 +123,7 @@ void AssetImporterWindow::closeEvent(QCloseEvent* ev)
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::critical(this, "Processing In Progress", "Unable to close the result window at this time.",
|
||||
QMessageBox::critical(this, "Processing In Progress", "Unable to close the result window at this time.",
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
ev->ignore();
|
||||
return;
|
||||
@@ -165,7 +131,7 @@ void AssetImporterWindow::closeEvent(QCloseEvent* ev)
|
||||
}
|
||||
else
|
||||
{
|
||||
QMessageBox::critical(this, "Processing In Progress", "Please wait until processing has completed to try again.",
|
||||
QMessageBox::critical(this, "Processing In Progress", "Please wait until processing has completed to try again.",
|
||||
QMessageBox::Ok, QMessageBox::Ok);
|
||||
ev->ignore();
|
||||
return;
|
||||
@@ -199,7 +165,9 @@ void AssetImporterWindow::Init()
|
||||
// Load the style sheets
|
||||
AzQtComponents::StylesheetPreprocessor styleSheetProcessor(nullptr);
|
||||
|
||||
AZStd::string mainWindowQSSPath = Path::GetEditingRootFolder() + "\\Editor\\Styles\\AssetImporterWindow.qss";
|
||||
auto mainWindowQSSPath = AZ::IO::Path(AZ::Utils::GetEnginePath()) / "Assets";
|
||||
mainWindowQSSPath /= "Editor/Styles/AssetImporterWindow.qss";
|
||||
mainWindowQSSPath.MakePreferred();
|
||||
QFile mainWindowStyleSheetFile(mainWindowQSSPath.c_str());
|
||||
if (mainWindowStyleSheetFile.open(QFile::ReadOnly))
|
||||
{
|
||||
@@ -212,7 +180,7 @@ void AssetImporterWindow::Init()
|
||||
{
|
||||
ui->m_actionInspect->setVisible(false);
|
||||
}
|
||||
|
||||
|
||||
ResetMenuAccess(WindowState::InitialNothingLoaded);
|
||||
|
||||
// Setup the overlay system, and set the root to be the root display. The root display has the browse,
|
||||
@@ -220,7 +188,7 @@ void AssetImporterWindow::Init()
|
||||
m_overlay.reset(aznew AZ::SceneAPI::UI::OverlayWidget(this));
|
||||
m_rootDisplay.reset(aznew ImporterRootDisplay(m_serializeContext));
|
||||
connect(m_rootDisplay.data(), &ImporterRootDisplay::UpdateClicked, this, &AssetImporterWindow::UpdateClicked);
|
||||
|
||||
|
||||
connect(m_overlay.data(), &AZ::SceneAPI::UI::OverlayWidget::LayerAdded, this, &AssetImporterWindow::OverlayLayerAdded);
|
||||
connect(m_overlay.data(), &AZ::SceneAPI::UI::OverlayWidget::LayerRemoved, this, &AssetImporterWindow::OverlayLayerRemoved);
|
||||
|
||||
@@ -242,7 +210,7 @@ void AssetImporterWindow::Init()
|
||||
AZStd::string joinedExtensions;
|
||||
AzFramework::StringFunc::Join(joinedExtensions, extensions.begin(), extensions.end(), " or ");
|
||||
|
||||
AZStd::string firstLineText =
|
||||
AZStd::string firstLineText =
|
||||
AZStd::string::format(
|
||||
"%s files are available for use after placing them in any folder within your game project. "
|
||||
"These files will automatically be processed and may be accessed via the Asset Browser. <a href=\"%s\">Learn more...</a>",
|
||||
@@ -250,13 +218,13 @@ void AssetImporterWindow::Init()
|
||||
|
||||
ui->m_initialPromptFirstLine->setText(firstLineText.c_str());
|
||||
|
||||
AZStd::string secondLineText =
|
||||
AZStd::string secondLineText =
|
||||
AZStd::string::format("To adjust the %s settings, right-click the file in the Asset Browser and select \"Edit Settings\" from the context menu.", joinedExtensions.c_str());
|
||||
ui->m_initialPromptSecondLine->setText(secondLineText.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
AZStd::string firstLineText =
|
||||
AZStd::string firstLineText =
|
||||
AZStd::string::format(
|
||||
"Files are available for use after placing them in any folder within your game project. "
|
||||
"These files will automatically be processed and may be accessed via the Asset Browser. <a href=\"%s\">Learn more...</a>", s_documentationWebAddress);
|
||||
@@ -282,12 +250,12 @@ void AssetImporterWindow::OpenFileInternal(const AZStd::string& filePath)
|
||||
auto asyncLoadHandler = AZStd::make_shared<AZ::SceneAPI::SceneUI::AsyncOperationProcessingHandler>(
|
||||
s_browseTag,
|
||||
[this, filePath]()
|
||||
{
|
||||
m_assetImporterDocument->LoadScene(filePath);
|
||||
{
|
||||
m_assetImporterDocument->LoadScene(filePath);
|
||||
},
|
||||
[this]()
|
||||
{
|
||||
HandleAssetLoadingCompleted();
|
||||
HandleAssetLoadingCompleted();
|
||||
}, this);
|
||||
|
||||
m_processingOverlay.reset(new ProcessingOverlayWidget(m_overlay.data(), ProcessingOverlayWidget::Layout::Loading, s_browseTag));
|
||||
@@ -304,7 +272,7 @@ bool AssetImporterWindow::IsAllowedToChangeSourceFile()
|
||||
return true;
|
||||
}
|
||||
|
||||
QMessageBox messageBox(QMessageBox::Icon::NoIcon, "Unsaved changes",
|
||||
QMessageBox messageBox(QMessageBox::Icon::NoIcon, "Unsaved changes",
|
||||
"You have unsaved changes. Do you want to discard those changes?",
|
||||
QMessageBox::StandardButton::Discard | QMessageBox::StandardButton::Cancel, this);
|
||||
messageBox.exec();
|
||||
@@ -406,7 +374,7 @@ void AssetImporterWindow::OnSceneResetRequested()
|
||||
else
|
||||
{
|
||||
m_assetImporterDocument->ClearScene();
|
||||
AZ_TracePrintf(ErrorWindow, "Manifest reset returned in '%s'",
|
||||
AZ_TracePrintf(ErrorWindow, "Manifest reset returned in '%s'",
|
||||
result.GetResult() == ProcessingResult::Failure ? "Failure" : "Ignored");
|
||||
}
|
||||
},
|
||||
@@ -456,7 +424,7 @@ void AssetImporterWindow::OnInspect()
|
||||
// make sure the inspector doesn't outlive the AssetImporterWindow, since we own the data it will be inspecting.
|
||||
auto* theInspectWidget = aznew AZ::SceneAPI::UI::SceneGraphInspectWidget(*m_assetImporterDocument->GetScene());
|
||||
QObject::connect(this, &QObject::destroyed, theInspectWidget, [theInspectWidget]() { theInspectWidget->window()->close(); } );
|
||||
|
||||
|
||||
m_overlay->PushLayer(label, theInspectWidget, "Scene Inspector", buttons);
|
||||
}
|
||||
|
||||
@@ -483,7 +451,7 @@ void AssetImporterWindow::OverlayLayerRemoved()
|
||||
else
|
||||
{
|
||||
ResetMenuAccess(WindowState::InitialNothingLoaded);
|
||||
|
||||
|
||||
ui->m_initialBrowseContainer->show();
|
||||
m_rootDisplay->hide();
|
||||
}
|
||||
@@ -533,8 +501,9 @@ void AssetImporterWindow::HandleAssetLoadingCompleted()
|
||||
m_fullSourcePath = m_assetImporterDocument->GetScene()->GetSourceFilename();
|
||||
SetTitle(m_fullSourcePath.c_str());
|
||||
|
||||
QString userFriendlyFileName;
|
||||
MakeUserFriendlySourceAssetPath(userFriendlyFileName, m_fullSourcePath.c_str());
|
||||
AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath();
|
||||
AZ::IO::FixedMaxPath relativeSourcePath = AZ::IO::PathView(m_fullSourcePath).LexicallyProximate(projectPath);
|
||||
auto userFriendlyFileName = QString::fromUtf8(relativeSourcePath.c_str(), static_cast<int>(relativeSourcePath.Native().size()));
|
||||
m_rootDisplay->SetSceneDisplay(userFriendlyFileName, m_assetImporterDocument->GetScene());
|
||||
|
||||
// Once we've browsed to something successfully, we need to hide the initial browse button layer and
|
||||
|
||||
@@ -7,9 +7,11 @@
|
||||
*/
|
||||
|
||||
#include <AzCore/Debug/Profiler.h>
|
||||
#include <AzCore/IO/Path/Path.h>
|
||||
#include <AzCore/IO/SystemFile.h>
|
||||
#include <AzCore/std/algorithm.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
|
||||
#include <AzToolsFramework/Debug/TraceContext.h>
|
||||
@@ -50,22 +52,15 @@ namespace AZ
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZStd::string cleanPath = filePath;
|
||||
if (AzFramework::StringFunc::Path::IsRelative(filePath.c_str()))
|
||||
AZ::IO::Path enginePath;
|
||||
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
|
||||
{
|
||||
const char* absolutePath = nullptr;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(absolutePath,
|
||||
&AzToolsFramework::AssetSystemRequestBus::Events::GetAbsoluteDevRootFolderPath);
|
||||
AZ_Assert(absolutePath, "Unable to retrieve the dev folder path");
|
||||
AzFramework::StringFunc::Path::Join(absolutePath, cleanPath.c_str(), cleanPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Normalizing is not needed if the path is relative as Join(...) will also normalize.
|
||||
AzFramework::StringFunc::Path::Normalize(cleanPath);
|
||||
settingsRegistry->Get(enginePath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder);
|
||||
}
|
||||
|
||||
auto sceneIt = m_scenes.find(cleanPath);
|
||||
AZ::IO::Path cleanPath = (enginePath / filePath).LexicallyNormal();
|
||||
|
||||
auto sceneIt = m_scenes.find(cleanPath.Native());
|
||||
if (sceneIt != m_scenes.end())
|
||||
{
|
||||
AZStd::shared_ptr<SceneAPI::Containers::Scene> scene = sceneIt->second.lock();
|
||||
@@ -98,14 +93,14 @@ namespace AZ
|
||||
}
|
||||
|
||||
AZStd::shared_ptr<SceneAPI::Containers::Scene> scene =
|
||||
AssetImportRequest::LoadSceneFromVerifiedPath(cleanPath, sceneSourceGuid, AssetImportRequest::RequestingApplication::Editor, SceneAPI::SceneCore::LoadingComponent::TYPEINFO_Uuid());
|
||||
AssetImportRequest::LoadSceneFromVerifiedPath(cleanPath.Native(), sceneSourceGuid, AssetImportRequest::RequestingApplication::Editor, SceneAPI::SceneCore::LoadingComponent::TYPEINFO_Uuid());
|
||||
if (!scene)
|
||||
{
|
||||
AZ_TracePrintf(Utilities::ErrorWindow, "Failed to load the requested scene.");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_scenes.emplace(AZStd::move(cleanPath), scene);
|
||||
m_scenes.emplace(AZStd::move(cleanPath.Native()), scene);
|
||||
|
||||
return scene;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,6 @@ namespace ProjectSettingsTool
|
||||
, LastPathBus::Handler()
|
||||
, m_ui(new Ui::ProjectSettingsToolWidget())
|
||||
, m_reconfigureProcess()
|
||||
, m_devRoot(GetDevRoot())
|
||||
, m_projectRoot(GetProjectRoot())
|
||||
, m_projectName(GetProjectName())
|
||||
, m_plistsInitVector(
|
||||
|
||||
@@ -147,7 +147,6 @@ namespace ProjectSettingsTool
|
||||
// The process used to reconfigure settings
|
||||
QProcess m_reconfigureProcess;
|
||||
|
||||
AZStd::string m_devRoot;
|
||||
AZStd::string m_projectRoot;
|
||||
AZStd::string m_projectName;
|
||||
|
||||
|
||||
@@ -27,37 +27,31 @@ namespace
|
||||
}
|
||||
|
||||
template<typename StringType>
|
||||
StringType GetAbsoluteDevRoot()
|
||||
StringType GetAbsoluteEngineRoot()
|
||||
{
|
||||
const char* devRoot = nullptr;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
devRoot,
|
||||
&AzToolsFramework::AssetSystemRequestBus::Handler::GetAbsoluteDevRootFolderPath);
|
||||
AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
|
||||
|
||||
if (!devRoot)
|
||||
if (engineRoot.empty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
StringType devRootString(devRoot);
|
||||
ToUnixPath(devRootString);
|
||||
return devRootString;
|
||||
StringType engineRootString(engineRoot.c_str());
|
||||
ToUnixPath(engineRootString);
|
||||
return engineRootString;
|
||||
}
|
||||
|
||||
template<typename StringType>
|
||||
StringType GetAbsoluteProjectRoot()
|
||||
{
|
||||
const char* projectRoot = nullptr;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
projectRoot,
|
||||
&AzToolsFramework::AssetSystemRequestBus::Handler::GetAbsoluteDevGameFolderPath);
|
||||
AZ::IO::FixedMaxPath projectRoot = AZ::Utils::GetProjectPath();
|
||||
|
||||
if (!projectRoot)
|
||||
if (projectRoot.empty())
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
StringType projectRootString(projectRoot);
|
||||
StringType projectRootString(projectRoot.c_str());
|
||||
ToUnixPath(projectRootString);
|
||||
return projectRootString;
|
||||
}
|
||||
@@ -87,9 +81,9 @@ namespace ProjectSettingsTool
|
||||
return reinterpret_cast<void*>(func);
|
||||
}
|
||||
|
||||
AZStd::string GetDevRoot()
|
||||
AZStd::string GetEngineRoot()
|
||||
{
|
||||
return GetAbsoluteDevRoot<AZStd::string>();
|
||||
return GetAbsoluteEngineRoot<AZStd::string>();
|
||||
}
|
||||
AZStd::string GetProjectRoot()
|
||||
{
|
||||
@@ -104,7 +98,7 @@ namespace ProjectSettingsTool
|
||||
QString SelectXmlFromFileDialog(const QString& currentFile)
|
||||
{
|
||||
// The selected file must be relative to this path
|
||||
QString defaultPath = GetAbsoluteDevRoot<QString>();
|
||||
QString defaultPath = GetAbsoluteEngineRoot<QString>();
|
||||
QString startPath;
|
||||
|
||||
// Choose the starting path for file dialog
|
||||
@@ -139,7 +133,7 @@ namespace ProjectSettingsTool
|
||||
|
||||
QString SelectImageFromFileDialog(const QString& currentFile)
|
||||
{
|
||||
QString defaultPath = QStringLiteral("%1Code%2/Resources/").arg(GetAbsoluteDevRoot<QString>(), ::GetProjectName<QString>());
|
||||
QString defaultPath = QStringLiteral("%1Code%2/Resources/").arg(GetAbsoluteEngineRoot<QString>(), ::GetProjectName<QString>());
|
||||
|
||||
QString startPath;
|
||||
|
||||
@@ -188,7 +182,7 @@ namespace ProjectSettingsTool
|
||||
// Android
|
||||
if (group <= ImageGroup::AndroidPortrait)
|
||||
{
|
||||
root = GetDevRoot() + "/Code/Tools/Android/ProjectBuilder/app_";
|
||||
root = GetEngineRoot() + "/Code/Tools/Android/ProjectBuilder/app_";
|
||||
}
|
||||
//Ios
|
||||
else
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
namespace ProjectSettingsTool
|
||||
{
|
||||
void* ConvertFunctorToVoid(AZStd::pair<QValidator::State, const QString>(*func)(const QString&));
|
||||
AZStd::string GetDevRoot();
|
||||
AZStd::string GetEngineRoot();
|
||||
AZStd::string GetProjectRoot();
|
||||
AZStd::string GetProjectName();
|
||||
|
||||
|
||||
@@ -935,8 +935,9 @@ void SEditorSettings::LoadDefaultGamePaths()
|
||||
searchPaths[EDITOR_PATH_MATERIALS].push_back((Path::GetEditingGameDataFolder() + "/Materials").c_str());
|
||||
}
|
||||
|
||||
AZStd::string iconsPath;
|
||||
AZ::StringFunc::Path::Join(Path::GetEditingRootFolder().c_str(), "Editor/UI/Icons", iconsPath);
|
||||
auto iconsPath = AZ::IO::Path(AZ::Utils::GetEnginePath()) / "Assets";
|
||||
iconsPath /= "Editor/UI/Icons";
|
||||
iconsPath.MakePreferred();
|
||||
searchPaths[EDITOR_PATH_UI_ICONS].push_back(iconsPath.c_str());
|
||||
}
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ void CSequenceBatchRenderDialog::OnRenderItemSelChange()
|
||||
// Enable/disable the 'remove'/'update' button properly.
|
||||
bool bNoSelection = !m_ui->m_renderList->selectionModel()->hasSelection();
|
||||
m_ui->BATCH_RENDER_REMOVE_SEQ->setEnabled(bNoSelection ? false : true);
|
||||
|
||||
|
||||
CheckForEnableUpdateButton();
|
||||
|
||||
if (bNoSelection)
|
||||
@@ -360,7 +360,7 @@ void CSequenceBatchRenderDialog::OnRenderItemSelChange()
|
||||
cvarsText += item.cvars[static_cast<int>(i)];
|
||||
cvarsText += "\r\n";
|
||||
}
|
||||
m_ui->m_cvarsEdit->setPlainText(cvarsText);
|
||||
m_ui->m_cvarsEdit->setPlainText(cvarsText);
|
||||
}
|
||||
|
||||
void CSequenceBatchRenderDialog::CheckForEnableUpdateButton()
|
||||
@@ -494,7 +494,7 @@ void CSequenceBatchRenderDialog::OnSavePreset()
|
||||
}
|
||||
|
||||
void CSequenceBatchRenderDialog::stashActiveViewportResolution()
|
||||
{
|
||||
{
|
||||
// stash active resolution in global vars
|
||||
activeViewportWidth = resolutions[0][0];
|
||||
activeViewportHeight = resolutions[0][1];
|
||||
@@ -502,7 +502,7 @@ void CSequenceBatchRenderDialog::stashActiveViewportResolution()
|
||||
if (activeViewport)
|
||||
{
|
||||
activeViewport->GetDimensions(&activeViewportWidth, &activeViewportHeight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CSequenceBatchRenderDialog::OnGo()
|
||||
@@ -640,7 +640,7 @@ void CSequenceBatchRenderDialog::OnResolutionSelected()
|
||||
int defaultH;
|
||||
const QString currentCustomResText = m_ui->m_resolutionCombo->currentText();
|
||||
GetResolutionFromCustomResText(currentCustomResText.toStdString().c_str(), defaultW, defaultH);
|
||||
|
||||
|
||||
CCustomResolutionDlg resDlg(defaultW, defaultH, this);
|
||||
if (resDlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
@@ -752,7 +752,7 @@ bool CSequenceBatchRenderDialog::LoadOutputOptions(const QString& pathname)
|
||||
{
|
||||
const QString customResText = resolutionNode->getContent();
|
||||
m_ui->m_resolutionCombo->setItemText(curSel, customResText);
|
||||
|
||||
|
||||
GetResolutionFromCustomResText(customResText.toStdString().c_str(), m_customResW, m_customResH);
|
||||
}
|
||||
m_ui->m_resolutionCombo->setCurrentIndex(curSel);
|
||||
@@ -907,12 +907,12 @@ void CSequenceBatchRenderDialog::CaptureItemStart()
|
||||
folder += "/";
|
||||
folder += itemText;
|
||||
|
||||
// If this is a relative path, prepend the @assets@ folder to match where the Renderer is going
|
||||
// If this is a relative path, prepend the @products@ folder to match where the Renderer is going
|
||||
// to dump the frame buffer image captures.
|
||||
if (AzFramework::StringFunc::Path::IsRelative(folder.toUtf8().data()))
|
||||
{
|
||||
AZStd::string absolutePath;
|
||||
AZStd::string assetsRoot = AZ::IO::FileIOBase::GetInstance()->GetAlias("@assets@");
|
||||
AZStd::string assetsRoot = AZ::IO::FileIOBase::GetInstance()->GetAlias("@products@");
|
||||
AzFramework::StringFunc::Path::Join(assetsRoot.c_str(), folder.toUtf8().data(), absolutePath);
|
||||
folder = absolutePath.c_str();
|
||||
}
|
||||
@@ -962,7 +962,7 @@ void CSequenceBatchRenderDialog::CaptureItemStart()
|
||||
m_renderContext.cvarDisplayInfoBU = cvarDebugInfo->GetIVal();
|
||||
if (renderItem.disableDebugInfo && cvarDebugInfo->GetIVal())
|
||||
{
|
||||
const int DISPLAY_INFO_OFF = 0;
|
||||
const int DISPLAY_INFO_OFF = 0;
|
||||
cvarDebugInfo->Set(DISPLAY_INFO_OFF);
|
||||
}
|
||||
}
|
||||
@@ -1100,13 +1100,13 @@ void CSequenceBatchRenderDialog::OnUpdateEnd(IAnimSequence* sequence)
|
||||
sequence->SetActiveDirector(m_renderContext.pActiveDirectorBU);
|
||||
|
||||
const auto imageFormat = m_ui->m_imageFormatCombo->currentText();
|
||||
|
||||
|
||||
SRenderItem renderItem = m_renderItems[m_renderContext.currentItemIndex];
|
||||
if (m_bFFMPEGCommandAvailable && renderItem.bCreateVideo)
|
||||
{
|
||||
// Create a video using the ffmpeg plug-in from captured images.
|
||||
m_renderContext.processingFFMPEG = true;
|
||||
|
||||
|
||||
AZStd::string outputFolder = m_renderContext.captureOptions.folder;
|
||||
auto future = QtConcurrent::run(
|
||||
[renderItem, outputFolder, imageFormat]
|
||||
@@ -1238,7 +1238,7 @@ void CSequenceBatchRenderDialog::OnKickIdleTimout()
|
||||
}
|
||||
|
||||
void CSequenceBatchRenderDialog::OnKickIdle()
|
||||
{
|
||||
{
|
||||
if (m_renderContext.captureState == CaptureState::WarmingUpAfterResChange)
|
||||
{
|
||||
OnUpdateWarmingUpAfterResChange();
|
||||
@@ -1254,7 +1254,7 @@ void CSequenceBatchRenderDialog::OnKickIdle()
|
||||
else if (m_renderContext.captureState == CaptureState::Capturing)
|
||||
{
|
||||
OnUpdateCapturing();
|
||||
}
|
||||
}
|
||||
else if (m_renderContext.captureState == CaptureState::End)
|
||||
{
|
||||
OnUpdateEnd(m_renderContext.endingSequence);
|
||||
|
||||
+33
-167
@@ -11,9 +11,9 @@
|
||||
|
||||
#include "PathUtil.h"
|
||||
|
||||
#include <AzCore/IO/SystemFile.h> // for AZ_MAX_PATH_LEN
|
||||
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h> // for ebus events
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzFramework/API/ApplicationAPI.h>
|
||||
#include <AzCore/std/string/conversions.h>
|
||||
#include <AzFramework/IO/LocalFileIO.h>
|
||||
@@ -179,7 +179,7 @@ namespace Path
|
||||
EBUS_EVENT_RESULT(engineRoot, AzFramework::ApplicationRequests::Bus, GetEngineRoot);
|
||||
return QString(engineRoot);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
QString& ReplaceFilename(const QString& strFilepath, const QString& strFilename, QString& strOutputFilename, bool bCallCaselessPath)
|
||||
{
|
||||
@@ -216,30 +216,21 @@ namespace Path
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
QString GetResolvedUserSandboxFolder()
|
||||
{
|
||||
char resolvedPath[AZ_MAX_PATH_LEN] = { 0 };
|
||||
gEnv->pFileIO->ResolvePath(GetUserSandboxFolder().toUtf8().data(), resolvedPath, AZ_MAX_PATH_LEN);
|
||||
return QString::fromLatin1(resolvedPath);
|
||||
AZ::IO::FixedMaxPath userSandboxFolderPath;
|
||||
gEnv->pFileIO->ResolvePath(userSandboxFolderPath, GetUserSandboxFolder().toUtf8().constData());
|
||||
return QString::fromUtf8(userSandboxFolderPath.c_str(), static_cast<int>(userSandboxFolderPath.Native().size()));
|
||||
}
|
||||
|
||||
// internal function, you should use GetEditingGameDataFolder instead.
|
||||
AZStd::string GetGameAssetsFolder()
|
||||
{
|
||||
const char* resultValue = nullptr;
|
||||
EBUS_EVENT_RESULT(resultValue, AzToolsFramework::AssetSystemRequestBus, GetAbsoluteDevGameFolderPath);
|
||||
if (!resultValue)
|
||||
AZ::IO::Path projectPath;
|
||||
if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr)
|
||||
{
|
||||
if ((gEnv) && (gEnv->pFileIO))
|
||||
{
|
||||
resultValue = gEnv->pFileIO->GetAlias("@devassets@");
|
||||
}
|
||||
settingsRegistry->Get(projectPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_ProjectPath);
|
||||
}
|
||||
|
||||
if (!resultValue)
|
||||
{
|
||||
resultValue = ".";
|
||||
}
|
||||
|
||||
return resultValue;
|
||||
return projectPath.Native();
|
||||
}
|
||||
|
||||
/// Get the data folder
|
||||
@@ -258,26 +249,6 @@ namespace Path
|
||||
return str;
|
||||
}
|
||||
|
||||
//! Get the root folder (in source control or other writable assets) where you should save root data.
|
||||
AZStd::string GetEditingRootFolder()
|
||||
{
|
||||
const char* resultValue = nullptr;
|
||||
EBUS_EVENT_RESULT(resultValue, AzToolsFramework::AssetSystemRequestBus, GetAbsoluteDevRootFolderPath);
|
||||
|
||||
if (!resultValue)
|
||||
{
|
||||
if ((gEnv) && (gEnv->pFileIO))
|
||||
{
|
||||
resultValue = gEnv->pFileIO->GetAlias("@devassets@");
|
||||
}
|
||||
}
|
||||
if (!resultValue)
|
||||
{
|
||||
resultValue = ".";
|
||||
}
|
||||
return resultValue;
|
||||
}
|
||||
|
||||
|
||||
AZStd::string MakeModPathFromGamePath(const char* relGamePath)
|
||||
{
|
||||
@@ -335,165 +306,60 @@ namespace Path
|
||||
return "";
|
||||
}
|
||||
|
||||
bool relPathfound = false;
|
||||
bool relPathFound = false;
|
||||
AZStd::string relativePath;
|
||||
AZStd::string fullAssetPath(fullPath.toUtf8().data());
|
||||
EBUS_EVENT_RESULT(relPathfound, AzToolsFramework::AssetSystemRequestBus, GetRelativeProductPathFromFullSourceOrProductPath, fullAssetPath, relativePath);
|
||||
EBUS_EVENT_RESULT(relPathFound, AzToolsFramework::AssetSystemRequestBus, GetRelativeProductPathFromFullSourceOrProductPath, fullAssetPath, relativePath);
|
||||
|
||||
if (relPathfound)
|
||||
if (relPathFound)
|
||||
{
|
||||
// do not normalize this path, it will already be an appropriate asset ID.
|
||||
return CaselessPaths(relativePath.c_str());
|
||||
}
|
||||
|
||||
char rootpath[_MAX_PATH] = { 0 };
|
||||
azstrcpy(rootpath, _MAX_PATH, Path::GetEditingRootFolder().c_str());
|
||||
|
||||
if (bRelativeToGameFolder)
|
||||
{
|
||||
azstrcpy(rootpath, _MAX_PATH, Path::GetEditingGameDataFolder().c_str());
|
||||
}
|
||||
|
||||
QString rootPathNormalized(rootpath);
|
||||
QString srcPathNormalized(fullPath);
|
||||
|
||||
#if defined(AZ_PLATFORM_WINDOWS)
|
||||
// avoid confusing PathRelativePathTo
|
||||
rootPathNormalized.replace('/', '\\');
|
||||
srcPathNormalized.replace('/', '\\');
|
||||
#endif
|
||||
AZ::IO::FixedMaxPath rootPath = bRelativeToGameFolder ? AZ::Utils::GetProjectPath() : AZ::Utils::GetEnginePath();
|
||||
AZ::IO::FixedMaxPath resolvedFullPath;
|
||||
AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(resolvedFullPath, fullPath.toUtf8().constData());
|
||||
|
||||
// Create relative path
|
||||
char resolvedSrcPath[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(srcPathNormalized.toUtf8().data(), resolvedSrcPath, AZ_MAX_PATH_LEN);
|
||||
QByteArray path = QDir(rootPathNormalized).relativeFilePath(resolvedSrcPath).toUtf8();
|
||||
if (path.isEmpty())
|
||||
{
|
||||
return fullPath;
|
||||
}
|
||||
|
||||
// The following code is required because the windows PathRelativePathTo function will always return "./SomePath" instead of just "SomePath"
|
||||
// Only remove single dot (.) and slash parts of a path, never the double dot (..)
|
||||
const char* pBuffer = path.data();
|
||||
bool bHasDot = false;
|
||||
while (*pBuffer && pBuffer != path.end())
|
||||
{
|
||||
switch (*pBuffer)
|
||||
{
|
||||
case '.':
|
||||
if (bHasDot)
|
||||
{
|
||||
// Found a double dot, rewind and stop removing
|
||||
pBuffer--;
|
||||
break;
|
||||
}
|
||||
// Fall through intended
|
||||
case '/':
|
||||
case '\\':
|
||||
bHasDot = (*pBuffer == '.');
|
||||
pBuffer++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
QString relPath = pBuffer;
|
||||
return CaselessPaths(relPath);
|
||||
return CaselessPaths(resolvedFullPath.LexicallyProximate(rootPath).MakePreferred().c_str());
|
||||
}
|
||||
|
||||
QString GamePathToFullPath(const QString& path)
|
||||
{
|
||||
using namespace AzToolsFramework;
|
||||
AZ_Warning("GamePathToFullPath", path.size() <= AZ_MAX_PATH_LEN, "Path exceeds maximum path length of %d", AZ_MAX_PATH_LEN);
|
||||
if ((gEnv) && (gEnv->pFileIO) && gEnv->pCryPak && path.size() <= AZ_MAX_PATH_LEN)
|
||||
AZ_Warning("GamePathToFullPath", path.size() <= AZ::IO::MaxPathLength, "Path exceeds maximum path length of %zu", AZ::IO::MaxPathLength);
|
||||
if (path.size() <= AZ::IO::MaxPathLength)
|
||||
{
|
||||
// first, adjust the file name for mods:
|
||||
bool fullPathfound = false;
|
||||
AZStd::string assetFullPath;
|
||||
AZStd::string adjustedFilePath = path.toUtf8().data();
|
||||
AssetSystemRequestBus::BroadcastResult(fullPathfound, &AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath, adjustedFilePath, assetFullPath);
|
||||
if (fullPathfound)
|
||||
bool fullPathFound = false;
|
||||
AZ::IO::Path assetFullPath;
|
||||
AZ::IO::Path adjustedFilePath = path.toUtf8().constData();
|
||||
AssetSystemRequestBus::BroadcastResult(fullPathFound, &AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath,
|
||||
adjustedFilePath.Native(), assetFullPath.Native());
|
||||
if (fullPathFound)
|
||||
{
|
||||
//if the bus message succeeds than normalize and lowercase the path
|
||||
AzFramework::StringFunc::Path::Normalize(assetFullPath);
|
||||
return assetFullPath.c_str();
|
||||
//if the bus message succeeds than normalize
|
||||
return assetFullPath.LexicallyNormal().c_str();
|
||||
}
|
||||
// if the bus message didn't succeed, 'guess' the source assets:
|
||||
// if the bus message didn't succeed, check if he path exist as a resolved path
|
||||
else
|
||||
{
|
||||
// Not all systems have been converted to use local paths. Some editor files save XML files directly, and a full or correctly aliased path is already passed in.
|
||||
// If the path passed in exists already, then return the resolved filepath
|
||||
if (AZ::IO::FileIOBase::GetDirectInstance()->Exists(adjustedFilePath.c_str()))
|
||||
{
|
||||
char resolvedPath[AZ_MAX_PATH_LEN + PathUtil::maxAliasLength] = { 0 };
|
||||
AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(adjustedFilePath.c_str(), resolvedPath, AZ_MAX_PATH_LEN + PathUtil::maxAliasLength);
|
||||
return QString::fromUtf8(resolvedPath);
|
||||
AZ::IO::FixedMaxPath resolvedPath;
|
||||
AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(resolvedPath, adjustedFilePath);
|
||||
return QString::fromUtf8(resolvedPath.c_str(), static_cast<int>(resolvedPath.Native().size()));
|
||||
}
|
||||
// if we get here it means that the Asset Processor does not know about this file. most of the time we should never get here
|
||||
// the rest of this code just does a bunch of heuristic guesses in case of missing files or if the user has hand-edited
|
||||
// the asset cache by moving files in via some other means or external process.
|
||||
if (adjustedFilePath[0] != '@')
|
||||
{
|
||||
const char* prefix = (adjustedFilePath[0] == '/' || adjustedFilePath[0] == '\\') ? "@devassets@" : "@devassets@/";
|
||||
adjustedFilePath = prefix + adjustedFilePath;
|
||||
}
|
||||
|
||||
char szAdjustedFile[AZ_MAX_PATH_LEN + PathUtil::maxAliasLength] = { 0 };
|
||||
gEnv->pFileIO->ResolvePath(adjustedFilePath.c_str(), szAdjustedFile, AZ_ARRAY_SIZE(szAdjustedFile));
|
||||
|
||||
if ((azstrnicmp(szAdjustedFile, "@devassets@", 11) == 0) && ((szAdjustedFile[11] == '/') || (szAdjustedFile[11] == '\\')))
|
||||
{
|
||||
if (!gEnv->pCryPak->IsFileExist(szAdjustedFile))
|
||||
{
|
||||
AZStd::string newName(szAdjustedFile);
|
||||
AzFramework::StringFunc::Replace(newName, "@devassets@", "@devroot@/engine", false);
|
||||
|
||||
if (gEnv->pCryPak->IsFileExist(newName.c_str()))
|
||||
{
|
||||
azstrcpy(szAdjustedFile, AZ_ARRAY_SIZE(szAdjustedFile), newName.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
// getting tricky here, try @devroot@ alone, in case its 'editor'
|
||||
AzFramework::StringFunc::Replace(newName, "@devassets@", "@devroot@", false);
|
||||
if (gEnv->pCryPak->IsFileExist(szAdjustedFile))
|
||||
{
|
||||
azstrcpy(szAdjustedFile, AZ_ARRAY_SIZE(szAdjustedFile), newName.c_str());
|
||||
}
|
||||
// give up, best guess is just @devassets@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// we should very rarely actually get to this point in the code.
|
||||
|
||||
// szAdjustedFile may contain an alias at this point. (@assets@/blah.whatever)
|
||||
// there is a case in which the loose asset exists only within a pak file for some reason
|
||||
// this is not recommended but it is possible.in that case, we want to return the original szAdjustedFile
|
||||
// without touching it or resolving it so that crypak can open it successfully.
|
||||
char adjustedPath[AZ_MAX_PATH_LEN + PathUtil::maxAliasLength] = { 0 };
|
||||
if (gEnv->pFileIO->ResolvePath(szAdjustedFile, adjustedPath, AZ_MAX_PATH_LEN + PathUtil::maxAliasLength)) // resolve to full path
|
||||
{
|
||||
if ((gEnv->pCryPak->IsFileExist(adjustedPath)) || (!gEnv->pCryPak->IsFileExist(szAdjustedFile)))
|
||||
{
|
||||
// note that if we get here, then EITHER
|
||||
// the file exists as a loose asset in the actual adjusted path
|
||||
// OR the file does not exist in the original passed-in aliased name (like '@assets@/whatever')
|
||||
// in which case we may as well just resolve the path to a full path and return it.
|
||||
assetFullPath = adjustedPath;
|
||||
AzFramework::StringFunc::Path::Normalize(assetFullPath);
|
||||
azstrcpy(szAdjustedFile, AZ_MAX_PATH_LEN + PathUtil::maxAliasLength, assetFullPath.c_str());
|
||||
}
|
||||
// if the above case succeeded then it means that the file does NOT exist loose
|
||||
// but DOES exist in a pak, in which case we leave szAdjustedFile with the alias on the front of it, meaning
|
||||
// fopens via crypak will actually succeed.
|
||||
}
|
||||
return szAdjustedFile;
|
||||
return path;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
return QString{};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,9 +44,6 @@ namespace Path
|
||||
//! always returns a full path
|
||||
EDITOR_CORE_API AZStd::string GetEditingGameDataFolder();
|
||||
|
||||
//! Get the root folder (in source control or other writable assets) where you should save root data.
|
||||
EDITOR_CORE_API AZStd::string GetEditingRootFolder();
|
||||
|
||||
//! Set the current mod NAME for editing purposes. After doing this the above functions will take this into account
|
||||
//! name only, please!
|
||||
EDITOR_CORE_API void SetModName(const char* input);
|
||||
@@ -69,93 +66,6 @@ namespace Path
|
||||
return strPath;
|
||||
}
|
||||
|
||||
//! Split full file name to path and filename
|
||||
//! @param filepath [IN] Full file name inclusing path.
|
||||
//! @param path [OUT] Extracted file path.
|
||||
//! @param file [OUT] Extracted file (with extension).
|
||||
inline void Split(const QString& filepath, QString& path, QString& file)
|
||||
{
|
||||
char path_buffer[_MAX_PATH];
|
||||
char drive[_MAX_DRIVE];
|
||||
char dir[_MAX_DIR];
|
||||
char fname[_MAX_FNAME];
|
||||
char ext[_MAX_EXT];
|
||||
#ifdef AZ_COMPILER_MSVC
|
||||
_splitpath_s(filepath.toUtf8().data(), drive, AZ_ARRAY_SIZE(drive), dir, AZ_ARRAY_SIZE(dir), fname, AZ_ARRAY_SIZE(fname), ext, AZ_ARRAY_SIZE(ext));
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), drive, dir, 0, 0);
|
||||
path = path_buffer;
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), 0, 0, fname, ext);
|
||||
#else
|
||||
_splitpath(filepath.toUtf8().data(), drive, dir, fname, ext);
|
||||
_makepath(path_buffer, drive, dir, 0, 0);
|
||||
path = path_buffer;
|
||||
_makepath(path_buffer, 0, 0, fname, ext);
|
||||
#endif
|
||||
file = path_buffer;
|
||||
}
|
||||
inline void Split(const AZStd::string& filepath, AZStd::string& path, AZStd::string& file)
|
||||
{
|
||||
char path_buffer[_MAX_PATH];
|
||||
char drive[_MAX_DRIVE];
|
||||
char dir[_MAX_DIR];
|
||||
char fname[_MAX_FNAME];
|
||||
char ext[_MAX_EXT];
|
||||
#ifdef AZ_COMPILER_MSVC
|
||||
_splitpath_s(filepath.c_str(), drive, AZ_ARRAY_SIZE(drive), dir, AZ_ARRAY_SIZE(dir), 0, 0, 0, 0);
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), drive, dir, 0, 0);
|
||||
path = path_buffer;
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), 0, 0, fname, ext);
|
||||
#else
|
||||
_splitpath(filepath.c_str(), drive, dir, fname, ext);
|
||||
_makepath(path_buffer, drive, dir, 0, 0);
|
||||
path = path_buffer;
|
||||
_makepath(path_buffer, 0, 0, fname, ext);
|
||||
#endif
|
||||
file = path_buffer;
|
||||
}
|
||||
|
||||
//! Split full file name to path and filename
|
||||
//! @param filepath [IN] Full file name inclusing path.
|
||||
//! @param path [OUT] Extracted file path.
|
||||
//! @param filename [OUT] Extracted file (without extension).
|
||||
//! @param ext [OUT] Extracted files extension.
|
||||
inline void Split(const QString& filepath, QString& path, QString& filename, QString& fext)
|
||||
{
|
||||
char path_buffer[_MAX_PATH];
|
||||
char drive[_MAX_DRIVE];
|
||||
char dir[_MAX_DIR];
|
||||
char fname[_MAX_FNAME];
|
||||
char ext[_MAX_EXT];
|
||||
#ifdef AZ_COMPILER_MSVC
|
||||
_splitpath_s(filepath.toUtf8().data(), drive, AZ_ARRAY_SIZE(drive), dir, AZ_ARRAY_SIZE(dir), fname, AZ_ARRAY_SIZE(fname), ext, AZ_ARRAY_SIZE(ext));
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), drive, dir, 0, 0);
|
||||
#else
|
||||
_splitpath(filepath.toUtf8().data(), drive, dir, fname, ext);
|
||||
_makepath(path_buffer, drive, dir, 0, 0);
|
||||
#endif
|
||||
path = path_buffer;
|
||||
filename = fname;
|
||||
fext = ext;
|
||||
}
|
||||
inline void Split(const AZStd::string& filepath, AZStd::string& path, AZStd::string& filename, AZStd::string& fext)
|
||||
{
|
||||
char path_buffer[_MAX_PATH];
|
||||
char drive[_MAX_DRIVE];
|
||||
char dir[_MAX_DIR];
|
||||
char fname[_MAX_FNAME];
|
||||
char ext[_MAX_EXT];
|
||||
#ifdef AZ_COMPILER_MSVC
|
||||
_splitpath_s(filepath.c_str(), drive, AZ_ARRAY_SIZE(drive), dir, AZ_ARRAY_SIZE(dir), fname, AZ_ARRAY_SIZE(fname), ext, AZ_ARRAY_SIZE(ext));
|
||||
_makepath_s(path_buffer, AZ_ARRAY_SIZE(path_buffer), drive, dir, 0, 0);
|
||||
#else
|
||||
_splitpath(filepath.c_str(), drive, dir, fname, ext);
|
||||
_makepath(path_buffer, drive, dir, 0, 0);
|
||||
#endif
|
||||
path = path_buffer;
|
||||
filename = fname;
|
||||
fext = ext;
|
||||
}
|
||||
|
||||
//! Split path into segments
|
||||
//! @param filepath [IN] path
|
||||
inline QStringList SplitIntoSegments(const QString& path)
|
||||
|
||||
Reference in New Issue
Block a user