Merge branch 'main' into MultiplayerPipeline

This commit is contained in:
pereslav
2021-04-29 16:53:36 +01:00
2300 changed files with 3968 additions and 19987 deletions
+19 -1
View File
@@ -70,7 +70,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
ly_add_target(
NAME AWSCore.Editor MODULE
NAMESPACE Gem
OUTPUT_SUBDIRECTORY AWSCoreEditorPlugins
FILES_CMAKE
awscore_editor_shared_files.cmake
INCLUDE_DIRECTORIES
@@ -85,6 +84,25 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS)
Gem::AWSCore.Static
Gem::AWSCore.Editor.Static
)
ly_add_target(
NAME AWSCore.ResourceMappintTool MODULE
NAMESPACE Gem
OUTPUT_SUBDIRECTORY AWSCoreEditorQtBin
FILES_CMAKE
awscore_resourcemappingtool_files.cmake
INCLUDE_DIRECTORIES
PRIVATE
Include/Private
PUBLIC
Include/Public
BUILD_DEPENDENCIES
PRIVATE
3rdParty::Qt::Core
3rdParty::Qt::Widgets
AZ::AzToolsFramework
)
ly_add_dependencies(AWSCore.Editor AWSCore.ResourceMappintTool)
endif()
################################################################################
@@ -18,6 +18,11 @@
#include <QMenu>
namespace AzFramework
{
class ProcessWatcher;
}
namespace AWSCore
{
class AWSCoreEditorMenu
@@ -25,7 +30,11 @@ namespace AWSCore
, AWSCoreEditorRequestBus::Handler
{
public:
static constexpr const char ResourceMappingToolPath[] = "Gems/AWSCore/Code/Tools/ResourceMappingTool/resource_mapping_tool.cmd";
static constexpr const char AWSResourceMappingToolReadMeWarningText[] =
"Failed to launch Resource Mapping Tool, please follow <a href=\"file:///%s\">README</a> to setup tool before using it.";
static constexpr const char AWSResourceMappingToolIsRunningText[] = "Resource Mapping Tool is running...";
static constexpr const char AWSResourceMappingToolLogWarningText[] =
"Failed to launch Resource Mapping Tool, please check <a href=\"file:///%s\">logs</a> for details.";
static constexpr const char AWSResourceMappingToolActionText[] = "AWS Resource Mapping Tool...";
static constexpr const char CredentialConfigurationActionText[] = "Credential Configuration";
static constexpr const char CredentialConfigurationUrl[] = "https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/credentials.html";
@@ -40,23 +49,17 @@ namespace AWSCore
~AWSCoreEditorMenu();
private:
void InitializeEngineRootFolder();
void InitializeResourceMappingToolAction();
void InitializeAWSDocActions();
void InitializeAWSFeatureGemActions();
void StartResourceMappingProcess();
// AWSCoreEditorRequestBus interface implementation
void SetAWSClientAuthEnabled() override;
void SetAWSMetricsEnabled() override;
void SetAWSFeatureActionsEnabled(const AZStd::string actionText);
AZStd::string m_engineRootFolder;
AZStd::mutex m_resourceMappingToolMutex;
bool m_resourceMappintToolIsRunning;
AZStd::thread m_resourceMappingToolThread;
// To improve experience, use process watcher to keep track of ongoing tool process
AZStd::unique_ptr<AzFramework::ProcessWatcher> m_resourceMappingToolWatcher;
};
} // namespace AWSCore
@@ -0,0 +1,42 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include <AzCore/std/string/string.h>
#include <QAction>
namespace AWSCore
{
class AWSCoreResourceMappingToolAction
: public QAction
{
public:
static constexpr const char ResourceMappingToolDirectoryPath[] = "Gems/AWSCore/Code/Tools/ResourceMappingTool";
static constexpr const char EngineWindowsPythonEntryScriptPath[] = "python/python.cmd";
AWSCoreResourceMappingToolAction(const QString& text);
AZStd::string GetToolLaunchCommand() const;
AZStd::string GetToolLogPath() const;
AZStd::string GetToolReadMePath() const;
private:
bool m_isDebug;
AZStd::string m_enginePythonEntryPath;
AZStd::string m_toolScriptPath;
AZStd::string m_toolQtBinDirectoryPath;
AZStd::string m_toolLogPath;
AZStd::string m_toolReadMePath;
};
} // namespace AWSCore
@@ -13,17 +13,20 @@
#include <AzCore/Debug/Trace.h>
#include <AzCore/IO/FileIO.h>
#include <AzCore/Jobs/JobFunction.h>
#include <AzFramework/Process/ProcessWatcher.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AWSCoreEditor_Traits_Platform.h>
#include <Editor/UI/AWSCoreEditorMenu.h>
#include <Editor/UI/AWSCoreResourceMappingToolAction.h>
#include <QAction>
#include <QApplication>
#include <QDesktopServices>
#include <QIcon>
#include <QList>
#include <QMessageBox>
#include <QObject>
#include <QProcess>
#include <QString>
#include <QUrl>
@@ -31,15 +34,9 @@ namespace AWSCore
{
AWSCoreEditorMenu::AWSCoreEditorMenu(const QString& text)
: QMenu(text)
, m_engineRootFolder("")
, m_resourceMappintToolIsRunning(false)
, m_resourceMappingToolWatcher(nullptr)
{
InitializeEngineRootFolder();
#ifdef AWSCORE_EDITOR_RESOURCE_MAPPING_TOOL_ENABLED
InitializeResourceMappingToolAction();
this->addSeparator();
#endif
InitializeAWSDocActions();
this->addSeparator();
InitializeAWSFeatureGemActions();
@@ -50,46 +47,58 @@ namespace AWSCore
AWSCoreEditorMenu::~AWSCoreEditorMenu()
{
AWSCoreEditorRequestBus::Handler::BusDisconnect();
if (m_resourceMappingToolThread.joinable())
if (m_resourceMappingToolWatcher)
{
m_resourceMappingToolThread.join();
}
}
void AWSCoreEditorMenu::InitializeEngineRootFolder()
{
auto engineRootFolder = AZ::IO::FileIOBase::GetInstance()->GetAlias("@engroot@");
if (!engineRootFolder)
{
AZ_Error("AWSCoreEditorMenu", false, "Failed to initialize engine root folder path.");
}
else
{
m_engineRootFolder = engineRootFolder;
if (m_resourceMappingToolWatcher->IsProcessRunning())
{
m_resourceMappingToolWatcher->TerminateProcess(AZ::u32(-1));
}
m_resourceMappingToolWatcher.reset();
}
this->clear();
}
void AWSCoreEditorMenu::InitializeResourceMappingToolAction()
{
QAction* resourceMappingAction = new QAction(QObject::tr(AWSResourceMappingToolActionText));
QObject::connect(resourceMappingAction, &QAction::triggered, this, [this]() {
AZStd::lock_guard<AZStd::mutex> lockGuard{m_resourceMappingToolMutex};
if (!m_resourceMappintToolIsRunning)
{
m_resourceMappintToolIsRunning = true;
if (m_resourceMappingToolThread.joinable())
#ifdef AWSCORE_EDITOR_RESOURCE_MAPPING_TOOL_ENABLED
AWSCoreResourceMappingToolAction* resourceMappingTool =
new AWSCoreResourceMappingToolAction(QObject::tr(AWSResourceMappingToolActionText));
QObject::connect(resourceMappingTool, &QAction::triggered, this,
[resourceMappingTool, this]() {
AZStd::string launchCommand = resourceMappingTool->GetToolLaunchCommand();
if (launchCommand.empty())
{
m_resourceMappingToolThread.join();
AZStd::string resourceMappingToolReadMePath = resourceMappingTool->GetToolReadMePath();
AZStd::string message = AZStd::string::format(AWSResourceMappingToolReadMeWarningText, resourceMappingToolReadMePath.c_str());
QMessageBox::warning(QApplication::activeWindow(), "Warning", message.c_str(), QMessageBox::Ok);
return;
}
if (m_resourceMappingToolWatcher && m_resourceMappingToolWatcher->IsProcessRunning())
{
QMessageBox::information(QApplication::activeWindow(), "Info", AWSResourceMappingToolIsRunningText, QMessageBox::Ok);
return;
}
if (m_resourceMappingToolWatcher)
{
m_resourceMappingToolWatcher.reset();
}
AzFramework::ProcessLauncher::ProcessLaunchInfo processLaunchInfo;
processLaunchInfo.m_commandlineParameters = launchCommand;
processLaunchInfo.m_showWindow = false;
m_resourceMappingToolWatcher = AZStd::unique_ptr<AzFramework::ProcessWatcher>(
AzFramework::ProcessWatcher::LaunchProcess(processLaunchInfo, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE));
if (!m_resourceMappingToolWatcher || !m_resourceMappingToolWatcher->IsProcessRunning())
{
AZStd::string resourceMappingToolLogPath = resourceMappingTool->GetToolLogPath();
AZStd::string message = AZStd::string::format(AWSResourceMappingToolLogWarningText, resourceMappingToolLogPath.c_str());
QMessageBox::warning(QApplication::activeWindow(), "Warning", message.c_str(), QMessageBox::Ok);
}
m_resourceMappingToolThread = AZStd::thread(AZStd::bind(&AWSCoreEditorMenu::StartResourceMappingProcess, this));
}
else
{
AZ_Warning("AWSCoreEditorMenu", false, "Resource Mapping Tool is already running...");
}
});
this->addAction(resourceMappingAction);
this->addAction(resourceMappingTool);
this->addSeparator();
#endif
}
void AWSCoreEditorMenu::InitializeAWSDocActions()
@@ -124,31 +133,6 @@ namespace AWSCore
this->addAction(metrics);
}
void AWSCoreEditorMenu::StartResourceMappingProcess()
{
AZStd::string toolScriptPath = AZStd::string::format("%s/%s", m_engineRootFolder.c_str(), ResourceMappingToolPath);
AzFramework::StringFunc::Path::Normalize(toolScriptPath);
QProcess resourceMappingToolProcess;
resourceMappingToolProcess.setProgram("cmd.exe");
resourceMappingToolProcess.setArguments({"/C", toolScriptPath.c_str()});
resourceMappingToolProcess.start();
while (!resourceMappingToolProcess.waitForFinished())
{
if (resourceMappingToolProcess.state() != QProcess::Running)
{
break;
}
}
if (resourceMappingToolProcess.exitCode() != 0)
{
AZ_Error("AWSCoreEditorMenu", false,
"Failed to launch Resource Mapping Tool, please follow README to setup tool before using it.");
}
AZStd::lock_guard<AZStd::mutex> lockGuard{m_resourceMappingToolMutex};
m_resourceMappintToolIsRunning = false;
}
void AWSCoreEditorMenu::SetAWSClientAuthEnabled()
{
SetAWSFeatureActionsEnabled(AWSClientAuthActionText);
@@ -0,0 +1,134 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzCore/IO/FileIO.h>
#include <AzCore/Utils/Utils.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <Editor/UI/AWSCoreResourceMappingToolAction.h>
namespace AWSCore
{
AWSCoreResourceMappingToolAction::AWSCoreResourceMappingToolAction(const QString& text)
: QAction(text)
, m_isDebug(false)
, m_enginePythonEntryPath("")
, m_toolScriptPath("")
, m_toolQtBinDirectoryPath("")
, m_toolLogPath("")
, m_toolReadMePath("")
{
auto engineRootPath = AZ::IO::FileIOBase::GetInstance()->GetAlias("@engroot@");
if (!engineRootPath)
{
AZ_Error("AWSCoreEditor", false, "Failed to determine engine root path.");
}
else
{
m_enginePythonEntryPath = AZStd::string::format("%s/%s", engineRootPath, EngineWindowsPythonEntryScriptPath);
AzFramework::StringFunc::Path::Normalize(m_enginePythonEntryPath);
if (!AZ::IO::SystemFile::Exists(m_enginePythonEntryPath.c_str()))
{
AZ_Error("AWSCoreEditor", false, "Failed to find engine python entry at %s.", m_enginePythonEntryPath.c_str());
m_enginePythonEntryPath.clear();
}
m_toolScriptPath = AZStd::string::format("%s/%s/resource_mapping_tool.py", engineRootPath, ResourceMappingToolDirectoryPath);
AzFramework::StringFunc::Path::Normalize(m_toolScriptPath);
if (!AZ::IO::SystemFile::Exists(m_toolScriptPath.c_str()))
{
AZ_Error("AWSCoreEditor", false, "Failed to find ResourceMappingTool python script at %s.", m_toolScriptPath.c_str());
m_toolScriptPath.clear();
}
m_toolLogPath = AZStd::string::format("%s/%s/resource_mapping_tool.log", engineRootPath, ResourceMappingToolDirectoryPath);
AzFramework::StringFunc::Path::Normalize(m_toolLogPath);
if (!AZ::IO::SystemFile::Exists(m_toolLogPath.c_str()))
{
AZ_Error("AWSCoreEditor", false, "Failed to find ResourceMappingTool log file at %s.", m_toolLogPath.c_str());
m_toolLogPath.clear();
}
m_toolReadMePath = AZStd::string::format("%s/%s/README.md", engineRootPath, ResourceMappingToolDirectoryPath);
AzFramework::StringFunc::Path::Normalize(m_toolReadMePath);
if (!AZ::IO::SystemFile::Exists(m_toolReadMePath.c_str()))
{
AZ_Error("AWSCoreEditor", false, "Failed to find ResourceMappingTool README file at %s.", m_toolReadMePath.c_str());
m_toolReadMePath.clear();
}
char executablePath[AZ_MAX_PATH_LEN];
auto result = AZ::Utils::GetExecutablePath(executablePath, AZ_MAX_PATH_LEN);
if (result.m_pathStored != AZ::Utils::ExecutablePathResult::Success)
{
AZ_Error("AWSCoreEditor", false, "Failed to find engine executable path.");
}
else
{
if (result.m_pathIncludesFilename)
{
// Remove the file name if it exists, and keep the parent folder only
char* lastSeparatorAddress = strrchr(executablePath, AZ_CORRECT_FILESYSTEM_SEPARATOR);
if (lastSeparatorAddress)
{
*lastSeparatorAddress = '\0';
}
}
}
AZStd::string binDirectoryPath(executablePath);
auto lastSeparator = binDirectoryPath.find_last_of(AZ_CORRECT_FILESYSTEM_SEPARATOR);
if (lastSeparator != AZStd::string::npos)
{
m_isDebug = binDirectoryPath.substr(lastSeparator).contains("debug");
}
m_toolQtBinDirectoryPath = AZStd::string::format("%s/%s", binDirectoryPath.c_str(), "AWSCoreEditorQtBin");
AzFramework::StringFunc::Path::Normalize(m_toolQtBinDirectoryPath);
if (!AZ::IO::SystemFile::Exists(m_toolQtBinDirectoryPath.c_str()))
{
AZ_Error("AWSCoreEditor", false, "Failed to find ResourceMappingTool Qt binaries at %s.", m_toolQtBinDirectoryPath.c_str());
m_toolQtBinDirectoryPath.clear();
}
}
}
AZStd::string AWSCoreResourceMappingToolAction::GetToolLaunchCommand() const
{
if (m_enginePythonEntryPath.empty() || m_toolScriptPath.empty() || m_toolQtBinDirectoryPath.empty())
{
return "";
}
if (m_isDebug)
{
return AZStd::string::format(
"%s debug %s --binaries_path %s --debug",
m_enginePythonEntryPath.c_str(), m_toolScriptPath.c_str(), m_toolQtBinDirectoryPath.c_str());
}
else
{
return AZStd::string::format(
"%s %s --binaries_path %s",
m_enginePythonEntryPath.c_str(), m_toolScriptPath.c_str(), m_toolQtBinDirectoryPath.c_str());
}
}
AZStd::string AWSCoreResourceMappingToolAction::GetToolLogPath() const
{
return m_toolLogPath;
}
AZStd::string AWSCoreResourceMappingToolAction::GetToolReadMePath() const
{
return m_toolReadMePath;
}
} // namespace AWSCore
@@ -36,7 +36,6 @@ class AWSCoreEditorSystemComponentTest
AWSCoreEditorUIFixture::SetUp();
AWSCoreFixture::SetUp();
m_localFileIO->SetAlias("@engroot@", "dummy engine root");
m_serializeContext = AZStd::make_unique<AZ::SerializeContext>();
m_serializeContext->CreateEditContext();
m_behaviorContext = AZStd::make_unique<AZ::BehaviorContext>();
@@ -46,7 +45,9 @@ class AWSCoreEditorSystemComponentTest
m_entity = aznew AZ::Entity();
m_coreEditorSystemsComponent.reset(m_entity->CreateComponent<AWSCoreEditorSystemComponent>());
AZ_TEST_START_TRACE_SUPPRESSION;
m_entity->Init();
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
m_entity->Activate();
}
@@ -27,8 +27,6 @@ class AWSCoreEditorManagerTest
{
AWSCoreEditorUIFixture::SetUp();
AWSCoreFixture::SetUp();
m_localFileIO->SetAlias("@engroot@", "dummy engine root");
}
void TearDown() override
@@ -40,6 +38,8 @@ class AWSCoreEditorManagerTest
TEST_F(AWSCoreEditorManagerTest, AWSCoreEditorManager_Constructor_HaveExpectedUIResourcesCreated)
{
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreEditorManager testManager;
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
EXPECT_TRUE(testManager.GetAWSCoreEditorMenu());
}
@@ -35,8 +35,6 @@ class AWSCoreEditorMenuTest
{
AWSCoreEditorUIFixture::SetUp();
AWSCoreFixture::SetUp();
m_localFileIO->SetAlias("@engroot@", "dummy engine root");
}
void TearDown() override
@@ -48,7 +46,6 @@ class AWSCoreEditorMenuTest
TEST_F(AWSCoreEditorMenuTest, AWSCoreEditorMenu_NoEngineRootFolder_ExpectOneError)
{
m_localFileIO->ClearAlias("@engroot@");
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreEditorMenu testMenu("dummy title");
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
@@ -56,7 +53,9 @@ TEST_F(AWSCoreEditorMenuTest, AWSCoreEditorMenu_NoEngineRootFolder_ExpectOneErro
TEST_F(AWSCoreEditorMenuTest, AWSCoreEditorMenu_GetAllActions_GetExpectedNumberOfActions)
{
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreEditorMenu testMenu("dummy title");
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
QList<QAction*> actualActions = testMenu.actions();
#ifdef AWSCORE_EDITOR_RESOURCE_MAPPING_TOOL_ENABLED
@@ -68,7 +67,9 @@ TEST_F(AWSCoreEditorMenuTest, AWSCoreEditorMenu_GetAllActions_GetExpectedNumberO
TEST_F(AWSCoreEditorMenuTest, AWSCoreEditorMenu_BroadcastFeatureGemsAreEnabled_CorrespondingActionsAreEnabled)
{
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreEditorMenu testMenu("dummy title");
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
AWSCoreEditorRequestBus::Broadcast(&AWSCoreEditorRequests::SetAWSClientAuthEnabled);
AWSCoreEditorRequestBus::Broadcast(&AWSCoreEditorRequests::SetAWSMetricsEnabled);
@@ -0,0 +1,57 @@
/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <AzTest/AzTest.h>
#include <Editor/UI/AWSCoreResourceMappingToolAction.h>
#include <Editor/UI/AWSCoreEditorUIFixture.h>
#include <TestFramework/AWSCoreFixture.h>
#include <QAction>
using namespace AWSCore;
class AWSCoreResourceMappingToolActionTest
: public AWSCoreFixture
, public AWSCoreEditorUIFixture
{
void SetUp() override
{
AWSCoreEditorUIFixture::SetUp();
AWSCoreFixture::SetUp();
m_localFileIO->SetAlias("@engroot@", "dummy engine root");
}
void TearDown() override
{
AWSCoreFixture::TearDown();
AWSCoreEditorUIFixture::TearDown();
}
};
TEST_F(AWSCoreResourceMappingToolActionTest, AWSCoreResourceMappingToolAction_NoEngineRootFolder_ExpectOneError)
{
m_localFileIO->ClearAlias("@engroot@");
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreResourceMappingToolAction testAction("dummy title");
AZ_TEST_STOP_TRACE_SUPPRESSION(1); // expect the above have thrown an AZ_Error
}
TEST_F(AWSCoreResourceMappingToolActionTest, AWSCoreResourceMappingToolAction_UnableToFindExpectedFileOrFolder_ExpectFiveErrorsAndEmptyResult)
{
AZ_TEST_START_TRACE_SUPPRESSION;
AWSCoreResourceMappingToolAction testAction("dummy title");
AZ_TEST_STOP_TRACE_SUPPRESSION_NO_COUNT;
EXPECT_TRUE(testAction.GetToolLaunchCommand() == "");
EXPECT_TRUE(testAction.GetToolLogPath() == "");
EXPECT_TRUE(testAction.GetToolReadMePath() == "");
}
@@ -3,45 +3,44 @@
## Setup aws config and credential
Resource mapping tool is using boto3 to interact with aws services:
* Follow boto3
* Read boto3
[Configuration](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html) to setup default aws region.
* Follow boto3
* Read boto3
[Credentials](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html) to setup default profile or credential keys.
Or follow **AWS CLI** configuration which can be reused by boto3 lib:
* Follow
[Quick configuration with aws configure](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)
**In Progress** - Override default aws profile in resource mapping tool
## Python Environment Setup Options
### 1. Engine python environment
In order to use engine python environment, it requires to link Qt binaries for this tool.
### 1. Engine python environment (Including Editor)
1. In order to use engine python environment, it requires to link Qt binaries for this tool.
Follow cmake instructions to configure your project, for example:
```
$ cmake -B <BUILD_FOLDER> -S . -G "Visual Studio 16 2019" -DLY_3RDPARTY_PATH=<PATH_TO_3RDPARTY> -DLY_PROJECTS=<PROJECT_NAME>
```
```
$ cmake -B <BUILD_FOLDER> -S . -G "Visual Studio 16 2019" -DLY_3RDPARTY_PATH=<PATH_TO_3RDPARTY> -DLY_PROJECTS=<PROJECT_NAME>
```
2. At this point, double check engine python environment gets setup under *<ENGINE_ROOT_PATH>/python/runtime* directory
Build project with **AWSCore.Editor** target to generate required Qt binaries.
(Or use **Editor** target)
3. Build project with **AWSCore.Editor** (or **AWSCore.ResourceMappintTool**, or **Editor**) target to generate required Qt binaries.
```
$ cmake --build <BUILD_FOLDER> --target AWSCore.Editor --config <CONFIG> -j <NUM_JOBS>
```
```
$ cmake --build <BUILD_FOLDER> --target AWSCore.Editor --config <CONFIG> -j <NUM_JOBS>
```
Launch resource mapping tool under engine root folder:
#### Windows
##### release mode
```
$ python\python.cmd Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\profile\AWSCoreEditorPlugins
```
##### debug mode
```
$ python\python.cmd debug Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\debug\AWSCoreEditorPlugins
```
4. At this point, double check Qt binaries gets generated under *<BUILD_FOLDER>/bin/<CONFIG_FOLDER>/AWSCoreEditorQtBin* directory
5. Launch resource mapping tool under engine root folder:
* Windows
* release mode
```
$ python\python.cmd Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\profile\AWSCoreEditorQtBin
```
* debug mode
```
$ python\python.cmd debug Gems\AWSCore\Code\Tools\ResourceMappingTool\resource_mapping_tool.py --binaries_path <PATH_TO_BUILD_FOLDER>\bin\debug\AWSCoreEditorQtBin
```
* Note - Editor is integrated with the same engine python environment to launch Resource Mapping Tool. If it is failed to launch the tool
in Editor, please follow above steps to make sure expected scripts/binaries are present.
### 2. Python virtual environment
This project is set up like a standard Python project. The initialization
@@ -51,47 +50,42 @@ directory. To create the virtualenv it assumes that there is a `python3`
package. If for any reason the automatic creation of the virtualenv fails,
you can create the virtualenv manually.
To manually create a virtualenv on MacOS and Linux:
1. To manually create a virtualenv:
* Windows
```
$ python -m venv .env
```
* Mac or Linux
```
$ python3 -m venv .env
```
```
$ python -m venv .env
```
2. Once the virtualenv is created, you can use the following step to activate your virtualenv:
* Windows
```
% .env\Scripts\activate.bat
```
* Mac or Linux
```
$ source .env/bin/activate
```
Once the virtualenv is created, you can use the following step to activate your virtualenv.
3. Once the virtualenv is activated, you can install the required dependencies:
* Windows
```
$ pip install -r requirements.txt
```
* Mac or Linux
```
$ pip3 install -r requirements.txt
```
```
$ source .env/bin/activate
```
If you are a Windows platform, you would activate the virtualenv like this:
```
% .env\Scripts\activate.bat
```
Once the virtualenv is activated, you can install the required dependencies.
```
$ pip install -r requirements.txt
```
#### 2.1 Launch Options
##### 2.1.1 Launch Resource Mapping Tool from python directly
At this point you can launch tool like other standard python project.
```
$ python resource_mapping_tool.py
```
##### 2.1.2 Launch Resource Mapping Tool from batch script/Editor
Update `resource_mapping_tool.cmd` with your virtualenv full path.
* **VIRTUALENV_PATH**: Fill this variable with your virtualenv full path.
Then you can launch the resource mapping tool by running the batch script directly.
```
$ resource_mapping_tool.cmd
```
Or you can launch the resource mapping tool from menu action Cloud services/AWS Resource Mapping Tool...
4. At this point you can launch tool like other standard python project.
* Windows
```
$ python resource_mapping_tool.py
```
* Mac or Linux
```
$ python3 resource_mapping_tool.py
```
@@ -1,24 +0,0 @@
@ECHO OFF
REM
REM All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
REM its licensors.
REM
REM For complete copyright and license terms please see the LICENSE at the root of this
REM distribution (the "License"). All use of this software is governed by the License,
REM or, if provided, by the license below or the license accompanying this file. Do not
REM remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
REM
REM Original file Copyright Crytek GMBH or its affiliates, used under license.
REM
SETLOCAL
SET CMD_DIR=%~dp0
SET CMD_DIR=%CMD_DIR:~0,-1%
SET VIRTUALENV_PATH=
SET RESOURCE_MAPPING_DIR=%CMD_DIR%
SET LOCAL_PYTHONPATH=%VIRTUALENV_PATH%\Scripts\python.exe
%LOCAL_PYTHONPATH% %RESOURCE_MAPPING_DIR%\resource_mapping_tool.py %* && exit 0
exit 1
@@ -19,7 +19,7 @@ from utils import file_utils
# arguments setup
argument_parser: ArgumentParser = ArgumentParser()
argument_parser.add_argument('--binaries_path', help='Path to QT Binaries necessary for PySide.')
argument_parser.add_argument('--debug', action='store_true', help='Execute on debug mode.')
argument_parser.add_argument('--debug', action='store_true', help='Execute on debug mode to enable DEBUG logging level')
arguments: Namespace = argument_parser.parse_args()
# logging setup
@@ -13,7 +13,9 @@ set(FILES
Include/Private/AWSCoreEditorSystemComponent.h
Include/Private/Editor/AWSCoreEditorManager.h
Include/Private/Editor/UI/AWSCoreEditorMenu.h
Include/Private/Editor/UI/AWSCoreResourceMappingToolAction.h
Source/AWSCoreEditorSystemComponent.cpp
Source/Editor/AWSCoreEditorManager.cpp
Source/Editor/UI/AWSCoreEditorMenu.cpp
Source/Editor/UI/AWSCoreResourceMappingToolAction.cpp
)
@@ -13,6 +13,7 @@ set(FILES
Tests/AWSCoreEditorSystemComponentTest.cpp
Tests/Editor/UI/AWSCoreEditorMenuTest.cpp
Tests/Editor/UI/AWSCoreEditorUIFixture.h
Tests/Editor/UI/AWSCoreResourceMappingToolActionTest.cpp
Tests/Editor/AWSCoreEditorManagerTest.cpp
Tests/Editor/AWSCoreEditorTest.cpp
)
@@ -10,5 +10,6 @@
#
set(FILES
Source/ScriptCanvasDiagnosticLibraryGem.cpp
Include/Private/Editor/UI/AWSCoreResourceMappingToolAction.h
Source/Editor/UI/AWSCoreResourceMappingToolAction.cpp
)
@@ -188,26 +188,6 @@ namespace ImageProcessingAtom
// the request will contain the CreateJobResponse you constructed earlier, including any keys and values you placed into the hash table
void ImageBuilderWorker::ProcessJob(const AssetBuilderSDK::ProcessJobRequest& request, AssetBuilderSDK::ProcessJobResponse& response)
{
// Exclude the "Engine/EngineAssets/Textures/rotrandom.dds" which is not a legit dds file but required by Cry3dEngine.
// [GFX TODO] Remove this block of code when removing Cry3dEngine and its engine assets entirely.
AZStd::string assetFileName;
AzFramework::StringFunc::Path::GetFullFileName(request.m_sourceFile.data(), assetFileName);
if (azstricmp(assetFileName.data(), "rotrandom.dds") == 0)
{
AZStd::string assetPath = request.m_fullPath;
AzFramework::ApplicationRequests::Bus::Broadcast(&AzFramework::ApplicationRequests::MakePathRootRelative, assetPath);
// The MakePathRootRelative only normalize but not convert the path to lower case, we need to call NormalizePath to convert it to lower case
AzFramework::ApplicationRequests::Bus::Broadcast(&AzFramework::ApplicationRequests::NormalizePath, assetPath);
AZStd::string excludePath = "Engine/EngineAssets/Textures/rotrandom.dds";
AzFramework::ApplicationRequests::Bus::Broadcast(&AzFramework::ApplicationRequests::NormalizePath, excludePath);
if (assetPath == excludePath)
{
response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Success;
return;
}
}
// Before we begin, let's make sure we are not meant to abort.
AssetBuilderSDK::JobCancelListener jobCancelListener(request.m_jobId);
@@ -22,13 +22,13 @@ namespace ImageProcessingAtom
{
namespace Thumbnails
{
const int ImageThumbnailSize = 200;
static constexpr const int ImageThumbnailSize = 256;
//////////////////////////////////////////////////////////////////////////
// ImageThumbnail
//////////////////////////////////////////////////////////////////////////
ImageThumbnail::ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize)
: Thumbnail(key, thumbnailSize)
ImageThumbnail::ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key)
: Thumbnail(key)
{
auto sourceKey = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceThumbnailKey*>(key.data());
if (sourceKey)
@@ -66,7 +66,7 @@ namespace ImageProcessingAtom
AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent(
AZ::RPI::StreamingImageAsset::RTTI_Type(), &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail,
m_key,
m_thumbnailSize);
ImageThumbnailSize);
// wait for response from thumbnail renderer
m_renderWait.acquire();
}
@@ -34,7 +34,7 @@ namespace ImageProcessingAtom
{
Q_OBJECT
public:
ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize);
ImageThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key);
~ImageThumbnail() override;
//! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides...
@@ -19,3 +19,7 @@
#define AZ_TRAIT_ASTC_COMPRESSION 1
static const float4 s_AzslDebugColor = float4(165.0 / 255.0, 30.0 / 255.0, 36.0 / 255.0, 1);
// Uniform limitation need to be taken into consideration for mobile devices
// [ATOM-14949]
#define AZ_TRAIT_CONSTANT_BUFFER_LIMITATIONS 1
@@ -25,6 +25,7 @@
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzCore/Casting/numeric_cast.h>
#include <AzCore/IO/SystemFile.h>
#include <AzCore/Utils/Utils.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzFramework/API/ApplicationAPI.h>
@@ -299,6 +300,9 @@ namespace AZ
// we transfer to a set, to order the folders, uniquify them, and ensure deterministic build behavior
AZStd::set<AZStd::string> scanFoldersSet;
// Add the project path to list of include paths
AZ::IO::FixedMaxPathString projectPath = AZ::Utils::GetProjectPath();
scanFoldersSet.emplace(projectPath.c_str(), projectPath.size());
// but while we transfer to the set, we're going to keep only folders where +/ShaderLib exists
for (AZStd::string folder : scanFoldersVector)
{
@@ -310,14 +314,12 @@ namespace AZ
} // the folders constructed this fashion constitute the base of automatic include search paths
// get the engine root:
AZStd::string engineRoot;
AzFramework::ApplicationRequests::Bus::BroadcastResult(engineRoot, &AzFramework::ApplicationRequests::GetEngineRoot);
AzFramework::StringFunc::Path::Normalize(engineRoot);
AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath();
// add optional additional options
for (AZStd::string& path : options.m_projectIncludePaths)
{
AzFramework::StringFunc::Path::Join(engineRoot.c_str(), path.c_str(), path);
path = (engineRoot / path).String();
DeleteFromSet(path, scanFoldersSet); // no need to add a path two times.
}
// back-insert the default paths (after the config-read paths we just read)
@@ -13,7 +13,7 @@
#include <AzCore/EBus/EBus.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
namespace AZ
{
@@ -43,15 +43,15 @@ namespace AZ
EBusConnectionPolicy<Bus>::Connect(busPtr, context, handler, connectLock, id);
// Check if bootstrap scene already exists and fire notifications if it does
AZStd::vector<AzFramework::Scene*> scenes;
AzFramework::SceneSystemRequestBus::BroadcastResult(scenes, &AzFramework::SceneSystemRequests::GetAllScenes);
AZ_Assert(scenes.size() > 0, "AzFramework didn't set up any scenes.");
auto sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "Notification bus called before the scene system has been initialized.");
AZStd::shared_ptr<AzFramework::Scene> mainScene = sceneSystem->GetScene(AzFramework::Scene::MainSceneName);
AZ_Assert(mainScene, "AzFramework didn't set up any scenes.");
// Assume first scene is the default scene
AZ::RPI::Scene* defaultScene = scenes.at(0)->GetSubsystem<AZ::RPI::Scene>();
if (defaultScene && defaultScene->GetDefaultRenderPipeline())
AZ::RPI::ScenePtr* defaultScene = mainScene->FindSubsystem<AZ::RPI::ScenePtr>();
if (defaultScene && *defaultScene && (*defaultScene)->GetDefaultRenderPipeline())
{
handler->OnBootstrapSceneReady(defaultScene);
handler->OnBootstrapSceneReady(defaultScene->get());
}
}
};
@@ -13,7 +13,7 @@
#include <AzCore/EBus/EBus.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
namespace AZ::Render::Bootstrap
@@ -269,7 +269,7 @@ namespace AZ
// Register scene to RPI system so it will be processed/rendered per tick
RPI::RPISystemInterface::Get()->RegisterScene(atomScene);
scene->SetSubsystem(atomScene.get());
scene->SetSubsystem(atomScene);
atomSceneHandle = atomScene;
@@ -279,11 +279,19 @@ namespace AZ
void BootstrapSystemComponent::CreateDefaultScene()
{
// Bind atomScene to the GameEntityContext's AzFramework::Scene
AZStd::vector<AzFramework::Scene*> scenes;
AzFramework::SceneSystemRequestBus::BroadcastResult(scenes, &AzFramework::SceneSystemRequests::GetAllScenes);
AZ_Assert(scenes.size() > 0, "Error: Scenes missing during system component initialization"); // This should never happen unless scene creation has changed.
m_defaultFrameworkScene = scenes[0];
m_defaultScene = GetOrCreateAtomSceneFromAzScene(m_defaultFrameworkScene);
m_defaultFrameworkScene = AzFramework::SceneSystemInterface::Get()->GetScene(AzFramework::Scene::MainSceneName);
// This should never happen unless scene creation has changed.
AZ_Assert(m_defaultFrameworkScene, "Error: Scenes missing during system component initialization");
m_sceneRemovalHandler = AzFramework::Scene::RemovalEvent::Handler(
[this](AzFramework::Scene&, AzFramework::Scene::RemovalEventType eventType)
{
if (eventType == AzFramework::Scene::RemovalEventType::Zombified)
{
m_defaultFrameworkScene.reset();
}
});
m_defaultFrameworkScene->ConnectToEvents(m_sceneRemovalHandler);
m_defaultScene = GetOrCreateAtomSceneFromAzScene(m_defaultFrameworkScene.get());
}
bool BootstrapSystemComponent::EnsureDefaultRenderPipelineInstalledForScene(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext)
@@ -405,15 +413,6 @@ namespace AZ
AzFramework::WindowNotificationBus::Handler::BusDisconnect();
}
void BootstrapSystemComponent::SceneAboutToBeRemoved(AzFramework::Scene& scene)
{
if (&scene == m_defaultFrameworkScene)
{
// Set to nullptr so we don't try to unbind the RPI::Scene from it later.
m_defaultFrameworkScene = nullptr;
}
}
AzFramework::NativeWindowHandle BootstrapSystemComponent::GetDefaultWindowHandle()
{
return m_windowHandle;
@@ -17,7 +17,7 @@
#include <AzFramework/Asset/AssetCatalogBus.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <AzFramework/Windowing/NativeWindow.h>
#include <AzFramework/Windowing/WindowBus.h>
@@ -45,7 +45,6 @@ namespace AZ
, public TickBus::Handler
, public AzFramework::WindowNotificationBus::Handler
, public AzFramework::AssetCatalogEventBus::Handler
, private AzFramework::SceneSystemNotificationBus::Handler
, public AzFramework::WindowSystemNotificationBus::Handler
, public AzFramework::WindowSystemRequestBus::Handler
, public Render::Bootstrap::DefaultWindowBus::Handler
@@ -90,9 +89,6 @@ namespace AZ
// AzFramework::AssetCatalogEventBus::Handler overrides ...
void OnCatalogLoaded(const char* catalogFile) override;
// AzFramework::SceneSystemNotificationBus::Handler overrides ...
void SceneAboutToBeRemoved(AzFramework::Scene& scene) override;
// AzFramework::WindowSystemNotificationBus::Handler overrides ...
void OnWindowCreated(AzFramework::NativeWindowHandle windowHandle) override;
@@ -104,12 +100,14 @@ namespace AZ
void CreateWindowContext();
AzFramework::Scene::RemovalEvent::Handler m_sceneRemovalHandler;
AZStd::unique_ptr<AzFramework::NativeWindow> m_nativeWindow;
AzFramework::NativeWindowHandle m_windowHandle = nullptr;
RPI::ViewportContextPtr m_viewportContext;
RPI::ScenePtr m_defaultScene = nullptr;
AzFramework::Scene* m_defaultFrameworkScene = nullptr;
AZStd::shared_ptr<AzFramework::Scene> m_defaultFrameworkScene = nullptr;
float m_simulateTime = 0;
float m_deltaTime = 0.016f;
@@ -0,0 +1,43 @@
{
"Type": "JsonSerialization",
"Version": 1,
"ClassName": "PassAsset",
"ClassData": {
"PassTemplate": {
"Name": "ReflectionScreenSpaceBlurMobilePassTemplate",
"PassClass": "ReflectionScreenSpaceBlurPass",
"Slots": [
{
"Name": "PreviousFrameInputOutput",
"SlotType": "InputOutput",
"ScopeAttachmentUsage": "Shader"
}
],
"ImageAttachments": [
{
"Name": "PreviousFrameImage",
"SizeSource": {
"Source": {
"Pass": "Parent",
"Attachment": "SpecularInput"
}
},
"ImageDescriptor": {
"Format": "R8G8B8A8_SINT",
"MipLevels": "8",
"SharedQueueMask": "Graphics"
}
}
],
"Connections": [
{
"LocalSlot": "PreviousFrameInputOutput",
"AttachmentRef": {
"Pass": "This",
"Attachment": "PreviousFrameImage"
}
}
]
}
}
}
@@ -0,0 +1,137 @@
{
"Type": "JsonSerialization",
"Version": 1,
"ClassName": "PassAsset",
"ClassData": {
"PassTemplate": {
"Name": "ReflectionScreenSpaceMobilePassTemplate",
"PassClass": "ParentPass",
"Slots": [
{
"Name": "NormalInput",
"SlotType": "Input",
"ScopeAttachmentUsage": "Shader"
},
{
"Name": "SpecularF0Input",
"SlotType": "Input",
"ScopeAttachmentUsage": "Shader"
},
{
"Name": "SpecularInput",
"SlotType": "Input",
"ScopeAttachmentUsage": "Shader"
},
{
"Name": "DepthStencilInput",
"SlotType": "Input",
"ScopeAttachmentUsage": "DepthStencil"
},
{
"Name": "ReflectionInputOutput",
"SlotType": "InputOutput",
"ScopeAttachmentUsage": "RenderTarget"
}
],
"PassRequests": [
{
"Name": "ReflectionScreenSpaceBlurMobilePass",
"TemplateName": "ReflectionScreenSpaceBlurMobilePassTemplate"
},
{
"Name": "ReflectionScreenSpaceTracePass",
"TemplateName": "ReflectionScreenSpaceTracePassTemplate",
"Connections": [
{
"LocalSlot": "DepthStencilTextureInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "DepthStencilInput"
}
},
{
"LocalSlot": "NormalInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "NormalInput"
}
},
{
"LocalSlot": "DepthStencilInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "DepthStencilInput"
}
},
{
"LocalSlot": "SpecularF0Input",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "SpecularF0Input"
}
}
]
},
{
"Name": "ReflectionScreenSpaceCompositePass",
"TemplateName": "ReflectionScreenSpaceCompositePassTemplate",
"ExecuteAfter": [
"ReflectionScreenSpaceBlurPass"
],
"Connections": [
{
"LocalSlot": "TraceInput",
"AttachmentRef": {
"Pass": "ReflectionScreenSpaceTracePass",
"Attachment": "Output"
}
},
{
"LocalSlot": "PreviousFrameBufferInput",
"AttachmentRef": {
"Pass": "ReflectionScreenSpaceBlurPass",
"Attachment": "PreviousFrameInputOutput"
}
},
{
"LocalSlot": "NormalInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "NormalInput"
}
},
{
"LocalSlot": "SpecularF0Input",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "SpecularF0Input"
}
},
{
"LocalSlot": "DepthStencilTextureInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "DepthStencilInput"
}
},
{
"LocalSlot": "DepthStencilInput",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "DepthStencilInput"
}
},
{
"LocalSlot": "Output",
"AttachmentRef": {
"Pass": "Parent",
"Attachment": "ReflectionInputOutput"
}
}
]
}
]
}
}
}
@@ -247,8 +247,10 @@
}
},
{
"Name": "ReflectionScreenSpacePass",
"TemplateName": "ReflectionScreenSpacePassTemplate",
// Using cut-down version of screen space reflection for handling the attachment format compatibility issues.
// This is used for mobile devices with limited capabilities.
"Name": "ReflectionScreenSpaceMobilePass",
"TemplateName": "ReflectionScreenSpaceMobilePassTemplate",
"Enabled": false,
"Connections": [
{
@@ -285,11 +285,6 @@ namespace AZ
// This is not 100% correct, but in most cases it will give us the correct result.
info.depthClampEnable = rasterState.m_depthClipEnable ? VK_FALSE : VK_TRUE;
}
else if (!rasterState.m_depthClipEnable)
{
AZ_Error("Vulkan", false, "Depth clipping is being used but it's not supported on this device");
return RHI::ResultCode::InvalidArgument;
}
switch (rasterState.m_fillMode)
{
@@ -35,7 +35,7 @@
#include <AzCore/Script/ScriptTimePoint.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
namespace AZ
{
@@ -28,6 +28,8 @@
#include <AzCore/Jobs/JobFunction.h>
#include <AzCore/Jobs/JobEmpty.h>
#include <AzFramework/Entity/EntityContext.h>
namespace AZ
{
namespace RPI
@@ -71,12 +73,15 @@ namespace AZ
Scene* Scene::GetSceneForEntityContextId(AzFramework::EntityContextId entityContextId)
{
// Find the scene for this entity context.
AzFramework::Scene* scene = nullptr;
AzFramework::SceneSystemRequestBus::BroadcastResult(scene, &AzFramework::SceneSystemRequestBus::Events::GetSceneFromEntityContextId, entityContextId);
AZStd::shared_ptr<AzFramework::Scene> scene = AzFramework::EntityContext::FindContainingScene(entityContextId);
if (scene)
{
// Get the RPI::Scene subsystem from the AZFramework Scene.
return scene->GetSubsystem<RPI::Scene>();
RPI::ScenePtr* scenePtr = scene->FindSubsystem<RPI::ScenePtr>();
if (scenePtr)
{
return scenePtr->get();
}
}
return nullptr;
}
@@ -33,6 +33,7 @@ namespace AZ
nativeWindow,
&AzFramework::WindowRequestBus::Events::GetClientAreaSize);
AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow);
AzFramework::ViewportRequestBus::Handler::BusConnect(id);
m_onProjectionMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix)
{
@@ -48,6 +49,9 @@ namespace AZ
ViewportContext::~ViewportContext()
{
AzFramework::WindowNotificationBus::Handler::BusDisconnect();
AzFramework::ViewportRequestBus::Handler::BusDisconnect();
if (m_currentPipeline)
{
m_currentPipeline->RemoveFromRenderTick();
@@ -63,6 +63,7 @@ namespace AtomToolsFramework
AZStd::vector<AZStd::string> m_vectorLabels;
bool m_visible = true;
bool m_readOnly = false;
bool m_showThumbnail = false;
};
//! Wraps an AZStd::any value and configuration so that it can be displayed and edited in a ReflectedPropertyEditor.
@@ -82,7 +82,7 @@ namespace AtomToolsFramework
AZ::RPI::ConstViewportContextPtr GetViewportContext() const;
//! Creates an AZ::RPI::ScenePtr for the given scene and assigns it to the current ViewportContext.
//! If useDefaultRenderPipeline is specified, this will initialize the scene with a rendering pipeline.
void SetScene(AzFramework::Scene* scene, bool useDefaultRenderPipeline = true);
void SetScene(const AZStd::shared_ptr<AzFramework::Scene>& scene, bool useDefaultRenderPipeline = true);
//! Gets the default camera that's been automatically registered to our ViewportContext.
AZ::RPI::ViewPtr GetDefaultCamera();
AZ::RPI::ConstViewPtr GetDefaultCamera() const;
@@ -141,6 +141,7 @@ namespace AtomToolsFramework
AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::EnumValues, &DynamicProperty::GetEnumValues);
AddEditDataAttributeMemberFunction(AZ::Edit::Attributes::ChangeNotify, &DynamicProperty::OnDataChanged);
AddEditDataAttribute(AZ::Edit::Attributes::ShowProductAssetFileName, false);
AddEditDataAttribute(AZ_CRC_CE("Thumbnail"), m_config.m_showThumbnail);
switch (m_config.m_dataType)
{
@@ -118,7 +118,7 @@ namespace AtomToolsFramework
return m_viewportContext;
}
void RenderViewportWidget::SetScene(AzFramework::Scene* scene, bool useDefaultRenderPipeline)
void RenderViewportWidget::SetScene(const AZStd::shared_ptr<AzFramework::Scene>& scene, bool useDefaultRenderPipeline)
{
if (scene == nullptr)
{
@@ -128,7 +128,7 @@ namespace AtomToolsFramework
AZ::RPI::ScenePtr atomScene;
auto initializeScene = [&](AZ::Render::Bootstrap::Request* bootstrapRequests)
{
atomScene = bootstrapRequests->GetOrCreateAtomSceneFromAzScene(scene);
atomScene = bootstrapRequests->GetOrCreateAtomSceneFromAzScene(scene.get());
if (useDefaultRenderPipeline)
{
// atomScene may already have a default render pipeline installed.
@@ -771,6 +771,7 @@ namespace MaterialEditor
if (propertyIndexInBounds)
{
AtomToolsFramework::ConvertToPropertyConfig(propertyConfig, propertyDefinition);
propertyConfig.m_showThumbnail = true;
propertyConfig.m_originalValue = AtomToolsFramework::ConvertToEditableType(m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]);
propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(parentPropertyValues[propertyIndex.GetIndex()]);
propertyConfig.m_groupName = m_materialTypeSourceData.FindGroup(groupNameId)->m_displayName;
@@ -810,6 +811,7 @@ namespace MaterialEditor
propertyConfig.m_originalValue = propertyConfig.m_defaultValue;
propertyConfig.m_parentValue = propertyConfig.m_defaultValue;
propertyConfig.m_readOnly = true;
propertyConfig.m_showThumbnail = true;
m_properties[propertyConfig.m_id] = AtomToolsFramework::DynamicProperty(propertyConfig);
@@ -88,10 +88,12 @@ namespace MaterialEditor
m_scene->SetShaderResourceGroupCallback(callback);
// Bind m_defaultScene to the GameEntityContext's AzFramework::Scene
AZStd::vector<AzFramework::Scene*> scenes;
AzFramework::SceneSystemRequestBus::BroadcastResult(scenes, &AzFramework::SceneSystemRequests::GetAllScenes);
AZ_Assert(scenes.size() > 0, "Error: Scenes missing during system component initialization"); // This should never happen unless scene creation has changed.
scenes.at(0)->SetSubsystem(m_scene.get());
auto sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "MaterialViewportRenderer was unable to get the scene system during construction.");
AZStd::shared_ptr<AzFramework::Scene> mainScene = sceneSystem->GetScene(AzFramework::Scene::MainSceneName);
// This should never happen unless scene creation has changed.
AZ_Assert(mainScene, "Main scenes missing during system component initialization");
mainScene->SetSubsystem(m_scene);
// Create a render pipeline from the specified asset for the window context and add the pipeline to the scene
AZ::Data::Asset<AZ::RPI::AnyAsset> pipelineAsset = AZ::RPI::AssetUtils::LoadAssetByProductPath<AZ::RPI::AnyAsset>(m_defaultPipelineAssetPath.c_str(), AZ::RPI::AssetUtils::TraceLevel::Error);
@@ -275,6 +277,13 @@ namespace MaterialEditor
}
m_lightHandles.clear();
auto sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "MaterialViewportRenderer was unable to get the scene system during destruction.");
AZStd::shared_ptr<AzFramework::Scene> mainScene = sceneSystem->GetScene(AzFramework::Scene::MainSceneName);
// This should never happen unless scene creation has changed.
AZ_Assert(mainScene, "Main scenes missing during system component destruction");
mainScene->UnsetSubsystem(m_scene);
m_swapChainPass = nullptr;
AZ::RPI::RPISystemInterface::Get()->UnregisterScene(m_scene);
m_scene = nullptr;
@@ -110,30 +110,19 @@ namespace MaterialEditor
{
using namespace AzToolsFramework::AssetBrowser;
// Material Browser uses the following filters:
// 1. [All source files (no products) that contain products matching the assetType specified by searchWidget (default is materials and textures)]
// 2. [All folders (including empty folders)]
// 3. [All Sources and folders matching the search text typed in search widget]
// Final filter = ((1 OR 2) AND 3)
QSharedPointer<EntryTypeFilter> sourceFilter(new EntryTypeFilter);
sourceFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Source);
QSharedPointer<CompositeFilter> assetTypeFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::AND));
assetTypeFilter->AddFilter(sourceFilter);
assetTypeFilter->AddFilter(m_ui->m_searchWidget->GetTypesFilter());
QSharedPointer<EntryTypeFilter> folderFilter(new EntryTypeFilter);
folderFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Folder);
QSharedPointer<CompositeFilter> sourceOrFolderFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::OR));
sourceOrFolderFilter->AddFilter(assetTypeFilter);
sourceOrFolderFilter->AddFilter(sourceFilter);
sourceOrFolderFilter->AddFilter(folderFilter);
QSharedPointer<CompositeFilter> finalFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::AND));
finalFilter->AddFilter(sourceOrFolderFilter);
finalFilter->AddFilter(m_ui->m_searchWidget->GetStringFilter());
finalFilter->SetFilterPropagation(AssetBrowserEntryFilter::PropagateDirection::Down);
finalFilter->AddFilter(m_ui->m_searchWidget->GetFilter());
return finalFilter;
}
@@ -10,6 +10,7 @@
#
set(GEM_DEPENDENCIES
Gem::Atom_RHI_Null.Private
Gem::Atom_RHI_DX12.Private
Gem::Atom_RHI_Vulkan.Private
Gem::Atom_RHI.Private
@@ -28,6 +28,7 @@
#include <AzToolsFramework/Thumbnails/SourceControlThumbnail.h>
#include <AtomToolsFramework/Util/Util.h>
#include <Atom/RPI.Edit/Shader/ShaderVariantListSourceData.h>
#include <Atom/Document/ShaderManagementConsoleDocumentSystemRequestBus.h>
#include <Source/Window/ShaderManagementConsoleBrowserInteractions.h>
@@ -81,7 +82,14 @@ namespace ShaderManagementConsole
{
menu->addAction("Open", [entry]()
{
QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str()));
if (AzFramework::StringFunc::Path::IsExtension(entry->GetFullPath().c_str(), AZ::RPI::ShaderVariantListSourceData::Extension))
{
ShaderManagementConsoleDocumentSystemRequestBus::Broadcast(&ShaderManagementConsoleDocumentSystemRequestBus::Events::OpenDocument, entry->GetFullPath().c_str());
}
else
{
QDesktopServices::openUrl(QUrl::fromLocalFile(entry->GetFullPath().c_str()));
}
});
menu->addAction("Duplicate...", [entry, caller]()
@@ -100,20 +108,27 @@ namespace ShaderManagementConsole
}
});
menu->addAction("Run Python on Asset...", [entry]()
{
const QString script = QFileDialog::getOpenFileName(nullptr, "Run Script", QString(), QString("*.py"));
if (!script.isEmpty())
{
AZStd::vector<AZStd::string_view> pythonArgs { entry->GetFullPath() };
AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), pythonArgs);
}
});
menu->addAction(AzQtComponents::fileBrowserActionName(), [entry]()
{
AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str());
});
menu->addSeparator();
menu->addAction("Generate Shader Variant List", [entry]() {
const QString script = "@engroot@/Gems/Atom/Tools/ShaderManagementConsole/Scripts/GenerateShaderVariantListForMaterials.py";
AZStd::vector<AZStd::string_view> pythonArgs{ entry->GetFullPath() };
AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), pythonArgs);
});
menu->addAction("Run Python on Asset...", [entry]()
{
const QString script = QFileDialog::getOpenFileName(nullptr, "Run Script", QString(), QString("*.py"));
if (!script.isEmpty())
{
AzQtComponents::ShowFileOnDesktop(entry->GetFullPath().c_str());
});
AZStd::vector<AZStd::string_view> pythonArgs { entry->GetFullPath() };
AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByFilenameWithArgs, script.toUtf8().constData(), pythonArgs);
}
});
AddPerforceMenuActions(caller, menu, entry);
}
@@ -368,6 +368,7 @@ namespace ShaderManagementConsole
// The document tab contains a table view.
auto tableView = new QTableView(m_centralWidget);
tableView->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
auto model = new QStandardItemModel();
tableView->setModel(model);
@@ -15,4 +15,5 @@ set(FILES
Source/ShaderManagementConsoleApplication.h
Include/Atom/Document/ShaderManagementConsoleDocumentModule.h
Source/Document/ShaderManagementConsoleDocumentModule.cpp
../Scripts/GenerateShaderVariantListForMaterials.py
)
@@ -10,6 +10,7 @@
#
set(GEM_DEPENDENCIES
Gem::Atom_RHI_Null.Private
Gem::Atom_RHI_DX12.Private
Gem::Atom_RHI_Vulkan.Private
Gem::Atom_RHI.Private
@@ -24,15 +24,6 @@ from PySide2 import QtWidgets
PROJECT_SHADER_VARIANTS_FOLDER = "ShaderVariants"
def prompt_message_box(text, informativeText = None, qButtons = QtWidgets.QMessageBox.Yes|QtWidgets.QMessageBox.No|QtWidgets.QMessageBox.Cancel):
msgBox = QtWidgets.QMessageBox()
msgBox.setText(text)
if informativeText:
msgBox.setInformativeText(informativeText)
msgBox.setStandardButtons(qButtons)
return msgBox.exec()
def clean_existing_shadervariantlist_files(filePaths):
for file in filePaths:
if os.path.exists(file):
@@ -66,21 +57,32 @@ def main():
shaderAssetInfo.relativePath
)
response = prompt_message_box(
"Generating .shadervariantlist File",
"This process may take a while. Would you like to save the generated .shadervariantlist file in the project folder? " \
"Otherwise, it will be saved in the same location as the .shader file."
msgBox = QtWidgets.QMessageBox(
QtWidgets.QMessageBox.Question,
"Choose Save Location for .shadervariantlist File",
"Save .shadervariantlist file in Project folder or in the same folder as shader file?"
)
projectButton = msgBox.addButton("Project Folder", QtWidgets.QMessageBox.AcceptRole)
msgBox.addButton("Same Folder as Shader", QtWidgets.QMessageBox.AcceptRole)
cancelButton = msgBox.addButton("Cancel", QtWidgets.QMessageBox.RejectRole)
msgBox.exec()
is_save_in_project_folder = False
if response == QtWidgets.QMessageBox.Yes:
if msgBox.clickedButton() == projectButton:
is_save_in_project_folder = True
elif response == QtWidgets.QMessageBox.Cancel:
elif msgBox.clickedButton() == cancelButton:
return
# This loop collects all uniquely-identified shader items used by the materials based on its shader variant id.
shader_file = os.path.basename(filename)
shaderVariantIds = []
shaderVariantListShaderOptionGroups = []
for materialAssetId in materialAssetIds:
progressDialog = QtWidgets.QProgressDialog(f"Generating .shadervariantlist file for:\n{shader_file}", "Cancel", 0, len(materialAssetIds))
progressDialog.setMaximumWidth(400)
progressDialog.setMaximumHeight(100)
progressDialog.setModal(True)
progressDialog.setWindowTitle("Generating Shader Variant List")
for i, materialAssetId in enumerate(materialAssetIds):
materialInstanceShaderItems = azlmbr.shadermanagementconsole.ShaderManagementConsoleRequestBus(azlmbr.bus.Broadcast, 'GetMaterialInstanceShaderItems', materialAssetId)
for shaderItem in materialInstanceShaderItems:
@@ -102,8 +104,14 @@ def main():
shaderVariantIds.append(shaderVariantId)
shaderVariantListShaderOptionGroups.append(shaderItem.GetShaderOptionGroup())
progressDialog.setValue(i)
if progressDialog.wasCanceled():
return
progressDialog.close()
# Generate the shader variant list data by collecting shader option name-value pairs.s
shaderVariantList = azlmbr.shader.ShaderVariantListSourceData ()
shaderVariantList = azlmbr.shader.ShaderVariantListSourceData()
shaderVariantList.shaderFilePath = shaderAssetInfo.relativePath
shaderVariants = []
stableId = 1
@@ -144,17 +152,26 @@ def main():
shaderVariantListFilePath = projectShaderVariantListFilePath
else:
shaderVariantListFilePath = defaultShaderVariantListFilePath
print(f"Saving .shadervariantlist file into: {shaderVariantListFilePath}")
shaderVariantListFilePath = shaderVariantListFilePath.replace("\\", "/")
azlmbr.shader.SaveShaderVariantListSourceData(shaderVariantListFilePath, shaderVariantList)
# Open the document in shader management console
azlmbr.shadermanagementconsole.ShaderManagementConsoleDocumentSystemRequestBus(
result = azlmbr.shadermanagementconsole.ShaderManagementConsoleDocumentSystemRequestBus(
azlmbr.bus.Broadcast,
'OpenDocument',
shaderVariantListFilePath
)
if not result.IsNull():
msgBox = QtWidgets.QMessageBox(
QtWidgets.QMessageBox.Information,
"Shader Variant List File Successfully Generated",
f".shadervariantlist file was saved in:\n{shaderVariantListFilePath}",
QtWidgets.QMessageBox.Ok
)
msgBox.exec()
print("==== End shader variant script ============================================================")
if __name__ == "__main__":
@@ -1263,7 +1263,12 @@ namespace AZ::AtomBridge
const char* text,
bool center)
{
AzFramework::FontDrawInterface* fontDrawInterface = AZ::Interface<AzFramework::FontQueryInterface>::Get()->GetDefaultFontDrawInterface();
auto fontQueryInterface = AZ::Interface<AzFramework::FontQueryInterface>::Get();
if (!fontQueryInterface)
{
return;
}
AzFramework::FontDrawInterface* fontDrawInterface = fontQueryInterface->GetDefaultFontDrawInterface();
if (!fontDrawInterface || !text || size == 0.0f)
{
return;
@@ -48,8 +48,8 @@ namespace AZ
"AssetCollectionAsyncLoaderTest", "The AssetCollectionAsyncLoaderTest component allows you to test the API provided by AssetCollectionAsyncLoader")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Test")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Comment.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Comment.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Comment.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Comment.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZStd::vector<AZ::Crc32>({ AZ_CRC("Level", 0x9aeacc13), AZ_CRC("Game", 0x232b318c), AZ_CRC("Layer", 0xe4db211a) }))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->DataElement(AZ::Edit::UIHandlers::LineEdit, &AssetCollectionAsyncLoaderTestComponent::m_pathToAssetListJson, "", "Path To Asset List")
@@ -99,8 +99,8 @@ void FlyCameraInputComponent::Reflect(AZ::ReflectContext* reflection)
editContext->Class<FlyCameraInputComponent>("Fly Camera Input", "The Fly Camera Input allows you to control the camera")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute("Category", "Gameplay")
->Attribute("Icon", "Editor/Icons/Components/CameraRig.svg")
->Attribute("ViewportIcon", "Editor/Icons/Components/Viewport/CameraRig.png")
->Attribute("Icon", "Icons/Components/CameraRig.svg")
->Attribute("ViewportIcon", "Icons/Components/Viewport/CameraRig.png")
->Attribute("AutoExpand", true)
->Attribute("AppearsInAddComponentMenu", AZ_CRC("Game", 0x232b318c))
->DataElement(0, &FlyCameraInputComponent::m_moveSpeed, "Move Speed", "Speed at which the camera moves")
@@ -24,7 +24,7 @@
#include <map>
#include <AzFramework/Font/FontInterface.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h>
@@ -40,7 +40,6 @@ namespace AZ
class AtomFont
: public ICryFont
, public AzFramework::FontQueryInterface
, public AzFramework::SceneSystemNotificationBus::Handler
{
friend class FFont;
@@ -92,8 +91,7 @@ namespace AZ
AzFramework::FontDrawInterface* GetFontDrawInterface(AzFramework::FontId fontId) const override;
AzFramework::FontDrawInterface* GetDefaultFontDrawInterface() const override;
// SceneSystemNotificationBus handlers
void SceneAboutToBeRemoved(AzFramework::Scene& scene) override;
void SceneAboutToBeRemoved(AzFramework::Scene& scene);
// Atom DynamicDraw interface management
@@ -137,6 +135,8 @@ namespace AZ
XmlNodeRef LoadFontFamilyXml(const char* fontFamilyName, string& outputDirectory, string& outputFullPath);
private:
AzFramework::ISceneSystem::SceneEvent::Handler m_sceneEventHandler;
FontMap m_fonts;
FontFamilyMap m_fontFamilies; //!< Map font family names to weak ptrs so we can construct shared_ptrs but not keep a ref ourselves.
FontFamilyReverseLookupMap m_fontFamilyReverseLookup; //<! FontFamily pointer reverse-lookup for quick removal
@@ -353,6 +353,18 @@ AZ::AtomFont::AtomFont(ISystem* system)
"Reload all fonts");
#endif
AZ::Interface<AzFramework::FontQueryInterface>::Register(this);
m_sceneEventHandler = AzFramework::ISceneSystem::SceneEvent::Handler(
[this](AzFramework::ISceneSystem::EventType eventType, const AZStd::shared_ptr<AzFramework::Scene>& scene)
{
if (eventType == AzFramework::ISceneSystem::EventType::ScenePendingRemoval)
{
SceneAboutToBeRemoved(*scene);
}
});
auto sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "Font created before the scene system is available.");
sceneSystem->ConnectToEvents(m_sceneEventHandler);
}
AZ::AtomFont::~AtomFont()
@@ -851,12 +863,14 @@ XmlNodeRef AZ::AtomFont::LoadFontFamilyXml(const char* fontFamilyName, string& o
void AZ::AtomFont::SceneAboutToBeRemoved(AzFramework::Scene& scene)
{
AZ::RPI::Scene* rpiScene = scene.GetSubsystem<AZ::RPI::Scene>();
AZStd::lock_guard<AZStd::shared_mutex> lock(m_sceneToDynamicDrawMutex);
if ( auto it = m_sceneToDynamicDrawMap.find(rpiScene); it != m_sceneToDynamicDrawMap.end())
AZ::RPI::ScenePtr* rpiScene = scene.FindSubsystem<AZ::RPI::ScenePtr>();
if (rpiScene)
{
m_sceneToDynamicDrawMap.erase(it);
AZStd::lock_guard<AZStd::shared_mutex> lock(m_sceneToDynamicDrawMutex);
if (auto it = m_sceneToDynamicDrawMap.find(rpiScene->get()); it != m_sceneToDynamicDrawMap.end())
{
m_sceneToDynamicDrawMap.erase(it);
}
}
}
@@ -49,8 +49,8 @@ namespace AZ
"Light", "A light which emits from a point or goemetric shape.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-light.html")
@@ -44,8 +44,8 @@ namespace AZ
"Directional Light", "A directional light to cast a shadow of meshes onto meshes.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO][ATOM-1998] create icons.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO][ATOM-1998] create icons.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO][ATOM-1998] create icons.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO][ATOM-1998] create icons.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [GFX TODO][ATOM-1998] create page
@@ -39,8 +39,8 @@ namespace AZ
"Decal (Atom)", "The Decal component allows an entity to project a texture or material onto a mesh")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-decal.html")
@@ -25,7 +25,7 @@
#include <AzFramework/Entity/EntityContextBus.h>
#include <AzFramework/Entity/EntityContext.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <AzCore/RTTI/BehaviorContext.h>
@@ -43,8 +43,8 @@ namespace AZ
"Diffuse Probe Grid", "The DiffuseProbeGrid component generates a grid of diffuse light probes for global illumination")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::PrimaryAssetType, AZ::AzTypeInfo<RPI::ModelAsset>::Uuid())
@@ -34,8 +34,8 @@ namespace AZ
"Grid", "Adds grid to the scene")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-grid.html")
@@ -34,8 +34,8 @@ namespace AZ
"Global Skylight (IBL)", "Adds image based illumination to the scene")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-imagebasedlight.html")
@@ -137,8 +137,8 @@ namespace AZ
"Material", "The material component specifies the material to use for this entity")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-material.html")
@@ -250,6 +250,7 @@ namespace AZ
propertyConfig.m_id = AZ::RPI::MaterialPropertyId(groupNameId, propertyDefinition.m_nameId).GetFullName();
propertyConfig.m_groupName = groupDisplayName;
const auto& propertyIndex = m_editData.m_materialAsset->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyConfig.m_id);
propertyConfig.m_showThumbnail = true;
propertyConfig.m_defaultValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]);
propertyConfig.m_parentValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialTypeAsset->GetDefaultPropertyValues()[propertyIndex.GetIndex()]);
propertyConfig.m_originalValue = AtomToolsFramework::ConvertToEditableType(m_editData.m_materialAsset->GetPropertyValues()[propertyIndex.GetIndex()]);
@@ -21,13 +21,13 @@ namespace AZ
{
namespace Thumbnails
{
const int MaterialThumbnailSize = 200;
static constexpr const int MaterialThumbnailSize = 512; // 512 is the default size in render to texture pass
//////////////////////////////////////////////////////////////////////////
// MaterialThumbnail
//////////////////////////////////////////////////////////////////////////
MaterialThumbnail::MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize)
: Thumbnail(key, thumbnailSize)
MaterialThumbnail::MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key)
: Thumbnail(key)
{
m_assetId = GetAssetId(key, RPI::MaterialAsset::RTTI_Type());
if (!m_assetId.IsValid())
@@ -47,7 +47,7 @@ namespace AZ
RPI::MaterialAsset::RTTI_Type(),
&AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail,
m_key,
m_thumbnailSize);
MaterialThumbnailSize);
// wait for response from thumbnail renderer
m_renderWait.acquire();
}
@@ -36,7 +36,7 @@ namespace AZ
{
Q_OBJECT
public:
MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize);
MaterialThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key);
~MaterialThumbnail() override;
//! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides...
@@ -44,8 +44,8 @@ namespace AZ
"Mesh", "The mesh component is the primary method of adding visual geometry to entities")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-mesh.html")
@@ -27,7 +27,7 @@
#include <AzFramework/Entity/EntityContextBus.h>
#include <AzFramework/Entity/EntityContext.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <AzCore/RTTI/BehaviorContext.h>
@@ -22,13 +22,13 @@ namespace AZ
{
namespace Thumbnails
{
const int MeshThumbnailSize = 200;
static constexpr const int MeshThumbnailSize = 512; // 512 is the default size in render to texture pass
//////////////////////////////////////////////////////////////////////////
// MeshThumbnail
//////////////////////////////////////////////////////////////////////////
MeshThumbnail::MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize)
: Thumbnail(key, thumbnailSize)
MeshThumbnail::MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key)
: Thumbnail(key)
{
m_assetId = GetAssetId(key, RPI::ModelAsset::RTTI_Type());
if (!m_assetId.IsValid())
@@ -48,7 +48,7 @@ namespace AZ
RPI::ModelAsset::RTTI_Type(),
&AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail,
m_key,
m_thumbnailSize);
MeshThumbnailSize);
// wait for response from thumbnail renderer
m_renderWait.acquire();
}
@@ -35,7 +35,7 @@ namespace AZ
{
Q_OBJECT
public:
MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key, int thumbnailSize);
MeshThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey key);
~MeshThumbnail() override;
//! AzToolsFramework::ThumbnailerRendererNotificationBus::Handler overrides...
@@ -32,8 +32,8 @@ namespace AZ
"Bloom", "Controls the Bloom")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [TODO ATOM-2672][PostFX] need create page for PostProcessing.
@@ -32,8 +32,8 @@ namespace AZ
"DepthOfField", "Controls the Depth of Field.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.y
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.y
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [GFX TODO][ATOM-2672][PostFX] need create page for PostProcessing.
@@ -32,8 +32,8 @@ namespace AZ
"Display Mapper", "The display mapper applying on the look modification process.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO][ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO][ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO][ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO][ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZStd::vector<AZ::Crc32>({ AZ_CRC("Level", 0x9aeacc13), AZ_CRC("Game", 0x232b318c) }))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [GFX TODO][ATOM-2672][PostFX] need to create page for PostProcessing.
@@ -32,8 +32,8 @@ namespace AZ
"PostFX Layer", "This component enables the entity to specify post process settings")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "")
@@ -32,8 +32,8 @@ namespace AZ
"Exposure Control", "Exposure component control exposure value for rendered scene.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [TODO ATOM-2672][PostFX] need create page for PostProcessing.
@@ -32,8 +32,8 @@ namespace AZ
"PostFX Gradient Weight Modifier", "Modifies PostFX override factor based on a gradient signal sampled from an entity")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "")
@@ -32,8 +32,8 @@ namespace AZ
"Look Modification", "The look modification process.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [TODO ATOM-2672][PostFX] need to create page for PostProcessing.
@@ -32,8 +32,8 @@ namespace AZ
"Radius Weight Modifier", "Modifies PostFX override factor based on proximity of an influencer against this entity's bounding sphere")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "")
@@ -32,8 +32,8 @@ namespace AZ
"PostFX Shape Weight Modifier", "Modifies PostFX override factor based on proximity of an influencer against this entity's bounding sphere")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "")
@@ -32,8 +32,8 @@ namespace AZ
"SSAO", "Controls SSAO.")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [GFX TODO][ATOM-2672][PostFX] need create page for PostProcessing.
@@ -49,8 +49,8 @@ namespace AZ
"Reflection Probe", "The ReflectionProbe component captures an IBL specular reflection at a specific position in the level")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
@@ -25,7 +25,7 @@
#include <AzFramework/Entity/EntityContextBus.h>
#include <AzFramework/Entity/EntityContext.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <AzCore/RTTI/BehaviorContext.h>
@@ -32,8 +32,8 @@ namespace AZ
"Deferred Fog", "Controls the Deferred Fog")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png") // [GFX TODO ATOM-2672][PostFX] need to create icons for PostProcessing.
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "https://") // [TODO][ATOM-13427] Create Wiki for Deferred Fog
@@ -31,8 +31,8 @@ namespace AZ
"Entity Reference", "Contains a reference list to other entities")
->ClassElement(Edit::ClassElements::EditorData, "")
->Attribute(Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(Edit::Attributes::AutoExpand, true)
->Attribute(Edit::Attributes::HelpPageURL, "")
@@ -14,7 +14,7 @@
#include <SkinnedMesh/SkinnedMeshDebugDisplay.h>
#include <Atom/Feature/SkinnedMesh/SkinnedMeshStatsBus.h>
#include <Atom/RPI.Public/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <AzToolsFramework/Entity/EditorEntityContextBus.h>
@@ -32,8 +32,8 @@ namespace AZ
"HDRi Skybox", "SkyBox component render the background of your scene with cubemap")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "")
@@ -32,8 +32,8 @@ namespace AZ
"Physical Sky", "Physical Sky render the background of your scene with physical simulation")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Atom")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "editor/icons/components/viewport/component_placeholder.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Component_Placeholder.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Component_Placeholder.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::HelpPageURL, "")
@@ -82,8 +82,9 @@ namespace AZ
return m_data;
}
void CommonThumbnailRenderer::RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, [[maybe_unused]] int thumbnailSize)
void CommonThumbnailRenderer::RenderThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, int thumbnailSize)
{
m_data->m_thumbnailSize = thumbnailSize;
m_data->m_thumbnailQueue.push(thumbnailKey);
if (m_currentStep == Step::None)
{
@@ -42,7 +42,7 @@ namespace AZ
RPI::ScenePtr m_scene;
AZStd::string m_sceneName = "Material Thumbnail Scene";
AZStd::string m_pipelineName = "Material Thumbnail Pipeline";
AzFramework::Scene* m_frameworkScene = nullptr;
AZStd::shared_ptr<AzFramework::Scene> m_frameworkScene;
RPI::RenderPipelinePtr m_renderPipeline;
AZStd::unique_ptr<AzFramework::EntityContext> m_entityContext;
AZStd::vector<AZStd::string> m_passHierarchy;
@@ -52,6 +52,7 @@ namespace AZ
double m_simulateTime = 0.0f;
float m_deltaTime = 0.0f;
int m_thumbnailSize = 512;
//! Incoming thumbnail requests are appended to this queue and processed one at a time in OnTick function.
AZStd::queue<AzToolsFramework::Thumbnailer::SharedThumbnailKey> m_thumbnailQueue;
@@ -100,24 +100,15 @@ namespace AZ
data->m_scene->SetShaderResourceGroupCallback(callback);
// Bind m_defaultScene to the GameEntityContext's AzFramework::Scene
Outcome<AzFramework::Scene*, AZStd::string> createSceneOutcome;
AzFramework::SceneSystemRequestBus::BroadcastResult(
createSceneOutcome,
&AzFramework::SceneSystemRequests::CreateScene,
data->m_sceneName);
auto* sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "Thumbnail system failed to get scene system implementation.");
Outcome<AZStd::shared_ptr<AzFramework::Scene>, AZStd::string> createSceneOutcome =
sceneSystem->CreateScene(data->m_sceneName);
AZ_Assert(createSceneOutcome, createSceneOutcome.GetError().c_str()); // This should never happen unless scene creation has changed.
createSceneOutcome.GetValue()->SetSubsystem(data->m_scene.get());
data->m_frameworkScene = createSceneOutcome.GetValue();
data->m_frameworkScene->SetSubsystem(data->m_scene.get());
bool success = false;
AzFramework::SceneSystemRequestBus::BroadcastResult(
success,
&AzFramework::SceneSystemRequests::SetSceneForEntityContextId,
data->m_entityContext->GetContextId(),
data->m_frameworkScene);
AZ_Assert(success, "Unable to set entity context on AzFramework::Scene: %s", data->m_sceneName.c_str());
data->m_frameworkScene = createSceneOutcome.TakeValue();
data->m_frameworkScene->SetSubsystem(data->m_scene);
data->m_frameworkScene->SetSubsystem(data->m_entityContext.get());
// Create a render pipeline from the specified asset for the window context and add the pipeline to the scene
RPI::RenderPipelineDescriptor pipelineDesc;
pipelineDesc.m_mainViewTagName = "MainCamera";
@@ -14,7 +14,7 @@
#include <Atom/RPI.Public/RPISystemInterface.h>
#include <Atom/RPI.Public/Scene.h>
#include <AzFramework/Scene/Scene.h>
#include <AzFramework/Scene/SceneSystemBus.h>
#include <AzFramework/Scene/SceneSystemInterface.h>
#include <Thumbnails/Rendering/ThumbnailRendererContext.h>
#include <Thumbnails/Rendering/ThumbnailRendererData.h>
#include <Thumbnails/Rendering/ThumbnailRendererSteps/ReleaseResourcesStep.h>
@@ -49,11 +49,13 @@ namespace AZ
m_context->GetData()->m_scene->Deactivate();
m_context->GetData()->m_scene->RemoveRenderPipeline(m_context->GetData()->m_renderPipeline->GetId());
RPI::RPISystemInterface::Get()->UnregisterScene(m_context->GetData()->m_scene);
bool sceneRemovedSuccessfully = false;
AzFramework::SceneSystemRequestBus::BroadcastResult(
sceneRemovedSuccessfully,
&AzFramework::SceneSystemRequests::RemoveScene,
m_context->GetData()->m_sceneName);
auto sceneSystem = AzFramework::SceneSystemInterface::Get();
AZ_Assert(sceneSystem, "Thumbnail system failed to get scene system implementation.");
[[maybe_unused]] bool sceneRemovedSuccessfully = sceneSystem->RemoveScene(m_context->GetData()->m_sceneName);
AZ_Assert(
sceneRemovedSuccessfully, "Thumbnail system was unable to remove scene '%s' from the scene system.",
m_context->GetData()->m_sceneName.c_str());
m_context->GetData()->m_scene = nullptr;
m_context->GetData()->m_renderPipeline = nullptr;
}
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<CmdLine Description="Generate ATL Data">"$(WwiseProjectPath)\..\..\..\Tools\Python\python3.cmd" "$(WwiseProjectPath)\..\..\..\Gems\AudioEngineWwise\Tools\WwiseATLGen\wwise_atl_gen_tool.py" --autoLoad --atlName generated_controls.xml --atlPath "$(WwiseProjectPath)\..\..\libs\gameaudio\wwise" --bankPath "$(WwiseProjectPath)\..\wwise"</CmdLine>
<CmdLine Description="Generate ATL Data">"$(WwiseProjectPath)\..\..\..\python\python.cmd" "$(WwiseProjectPath)\..\..\..\Gems\AudioEngineWwise\Tools\WwiseATLGen\wwise_atl_gen_tool.py" --autoLoad --atlName generated_controls.xml --atlPath "$(WwiseProjectPath)\..\..\libs\gameaudio\wwise" --bankPath "$(WwiseProjectPath)\..\wwise"</CmdLine>
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<CmdLine Description="Copy Streamed Files and Generate Dependency Info">"$(WwiseExePath)\CopyStreamedFiles.exe" -info "$(InfoFilePath)" -outputpath "$(SoundBankPath)" -banks "$(SoundBankListAsTextFile)" -languages "$(LanguageList)"
"$(WwiseProjectPath)\..\..\..\Tools\Python\python3.cmd" "$(WwiseProjectPath)\..\..\..\Gems\AudioEngineWwise\Tools\WwiseAuthoringScripts\bank_info_parser.py" "$(InfoFilePath)" "$(SoundBankPath)"</CmdLine>
"$(WwiseProjectPath)\..\..\..\python.cmd" "$(WwiseProjectPath)\..\..\..\Gems\AudioEngineWwise\Tools\WwiseAuthoringScripts\bank_info_parser.py" "$(InfoFilePath)" "$(SoundBankPath)"</CmdLine>
@@ -147,7 +147,7 @@ namespace AudioControls
QWidgetAction* pWidgetAction = new QWidgetAction(this);
m_unassignedFilterButton = new QFilterButton(QIcon(":/Editor/Icons/Unassigned.svg"), "", this);
m_unassignedFilterButton = new QFilterButton(QIcon(":/Icons/Unassigned.svg"), "", this);
m_unassignedFilterButton->SetText("Unassigned");
m_unassignedFilterButton->SetChecked(m_showUnassignedControls);
pWidgetAction->setDefaultWidget(m_unassignedFilterButton);
@@ -1,5 +1,5 @@
<RCC>
<qresource prefix="/Editor/Icons">
<qresource prefix="/Icons">
<file alias="Bank_Icon.png">Icons/Bank_Icon.png</file>
<file alias="Config_Blue_Icon.png">Icons/Config_Blue_Icon.png</file>
<file alias="Config_Green_Icon.png">Icons/Config_Green_Icon.png</file>
@@ -26,26 +26,26 @@ namespace AudioControls
switch (type)
{
case AudioControls::eACET_TRIGGER:
iconFile = ":/Editor/Icons/Trigger_Icon.svg";
iconFile = ":/Icons/Trigger_Icon.svg";
break;
case AudioControls::eACET_RTPC:
iconFile = ":/Editor/Icons/RTPC_Icon.svg";
iconFile = ":/Icons/RTPC_Icon.svg";
break;
case AudioControls::eACET_SWITCH:
iconFile = ":/Editor/Icons/Switch_Icon.svg";
iconFile = ":/Icons/Switch_Icon.svg";
break;
case AudioControls::eACET_SWITCH_STATE:
iconFile = ":/Editor/Icons/Property_Icon.svg";
iconFile = ":/Icons/Property_Icon.svg";
break;
case AudioControls::eACET_ENVIRONMENT:
iconFile = ":/Editor/Icons/Environment_Icon.svg";
iconFile = ":/Icons/Environment_Icon.svg";
break;
case AudioControls::eACET_PRELOAD:
iconFile = ":/Editor/Icons/Preload_Icon.svg";
iconFile = ":/Icons/Preload_Icon.svg";
break;
default:
// should make a "default"/empty icon...
iconFile = ":/Editor/Icons/RTPC_Icon.svg";
iconFile = ":/Icons/RTPC_Icon.svg";
}
QIcon icon(iconFile);
@@ -56,16 +56,16 @@ namespace AudioControls
//-------------------------------------------------------------------------------------------//
inline QIcon GetFolderIcon()
{
QIcon icon = QIcon(":/Editor/Icons/Folder_Icon.svg");
icon.addFile(":/Editor/Icons/Folder_Icon_Selected.svg", QSize(), QIcon::Selected);
QIcon icon = QIcon(":/Icons/Folder_Icon.svg");
icon.addFile(":/Icons/Folder_Icon_Selected.svg", QSize(), QIcon::Selected);
return icon;
}
//-------------------------------------------------------------------------------------------//
inline QIcon GetSoundBankIcon()
{
QIcon icon = QIcon(":/Editor/Icons/Preload_Icon.svg");
icon.addFile(":/Editor/Icons/Preload_Icon.svg", QSize(), QIcon::Selected);
QIcon icon = QIcon(":/Icons/Preload_Icon.svg");
icon.addFile(":/Icons/Preload_Icon.svg", QSize(), QIcon::Selected);
return icon;
}
@@ -78,22 +78,22 @@ namespace AudioControls
switch (group)
{
case 0:
path = ":/Editor/Icons/folder purple.svg";
path = ":/Icons/folder purple.svg";
break;
case 1:
path = ":/Editor/Icons/folder blue.svg";
path = ":/Icons/folder blue.svg";
break;
case 2:
path = ":/Editor/Icons/folder green.svg";
path = ":/Icons/folder green.svg";
break;
case 3:
path = ":/Editor/Icons/folder red.svg";
path = ":/Icons/folder red.svg";
break;
case 4:
path = ":/Editor/Icons/folder yellow.svg";
path = ":/Icons/folder yellow.svg";
break;
default:
path = "Editor/Icons/folder red.svg";
path = "Icons/folder red.svg";
break;
}
@@ -104,7 +104,7 @@ namespace Blast
const char* BlastAssetHandler::GetBrowserIcon() const
{
return "Editor/Icons/Components/Box.png";
return "Icons/Components/Box.png";
}
void BlastAssetHandler::GetAssetTypeExtensions(AZStd::vector<AZStd::string>& extensions)
@@ -39,8 +39,8 @@ namespace Blast
"Blast Family", "Used to add a Blast family for destruction that will spawn Blast actors")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Destruction")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(
AZ::Edit::Attributes::HelpPageURL,
@@ -61,8 +61,8 @@ namespace Blast
"Blast Family Mesh Data", "Used to keep track of mesh assets for a Blast family")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Destruction")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->Attribute(
AZ::Edit::Attributes::HelpPageURL,
@@ -55,8 +55,8 @@ namespace Blast
"Blast Slice Storage Component", "Used process blast slice data")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Physics")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Box.png")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Box.png")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->Attribute(AZ::Edit::Attributes::AddableByUser, false)
@@ -339,7 +339,7 @@ namespace Blast
const char* EditorBlastSliceAssetHandler::GetBrowserIcon() const
{
return "Editor/Icons/Components/Box.png";
return "Icons/Components/Box.png";
}
void EditorBlastSliceAssetHandler::GetAssetTypeExtensions(AZStd::vector<AZStd::string>& extensions)
-1
View File
@@ -52,7 +52,6 @@ add_subdirectory(ScriptCanvas)
add_subdirectory(ScriptedEntityTweener)
add_subdirectory(StartingPointMovement)
add_subdirectory(StartingPointInput)
add_subdirectory(ScriptCanvasDiagnosticLibrary)
add_subdirectory(ScriptCanvasPhysics)
add_subdirectory(StartingPointCamera)
add_subdirectory(Presence)
@@ -37,7 +37,7 @@ namespace DebugDraw
"DebugDraw Line", "Draws debug line on the screen from this entity's location to specified end entity's location.")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Debugging")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/DebugDrawLine.svg")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/DebugDrawLine.svg")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->DataElement(0, &EditorDebugDrawLineComponent::m_element, "Line element settings", "Settings for the line element.")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDebugDrawLineComponent::OnPropertyUpdate)
@@ -37,7 +37,7 @@ namespace DebugDraw
"DebugDraw Obb", "Draws debug obb on the screen from this entity's location to specified end entity's location.")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Debugging")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/DebugDrawObb.svg")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/DebugDrawObb.svg")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->DataElement(0, &EditorDebugDrawObbComponent::m_element, "Obb element settings", "Settings for the obb element.")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDebugDrawObbComponent::OnPropertyUpdate)
@@ -37,7 +37,7 @@ namespace DebugDraw
"DebugDraw Ray", "Draws debug ray on the screen from this entity's location to specified end entity's location.")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Debugging")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/DebugDrawRay.svg")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/DebugDrawRay.svg")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->DataElement(0, &EditorDebugDrawRayComponent::m_element, "Ray element settings", "Settings for the ray element.")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDebugDrawRayComponent::OnPropertyUpdate)
@@ -37,7 +37,7 @@ namespace DebugDraw
"DebugDraw Sphere", "Draws debug ray on the screen from this entity's location to specified end entity's location.")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Debugging")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/DebugDrawSphere.svg")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/DebugDrawSphere.svg")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->DataElement(0, &EditorDebugDrawSphereComponent::m_element, "Sphere element settings", "Settings for the sphere element.")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDebugDrawSphereComponent::OnPropertyUpdate)
@@ -37,7 +37,7 @@ namespace DebugDraw
"DebugDraw Text", "Draws debug text on the screen at this entity's location.")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Debugging")
->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/DebugDrawText.svg")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/DebugDrawText.svg")
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
->DataElement(0, &EditorDebugDrawTextComponent::m_element, "Text element settings", "Settings for the text element.")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorDebugDrawTextComponent::OnPropertyUpdate)

Some files were not shown because too many files have changed in this diff Show More