Atom Tools: updated document and windows systems and buses to support multiple instances
• This change is partially to unblock physics tool prototyping. It introduces a tool ID that is passed down into systems and acts as a context for document, window, and other systems and buses. • The document system component is no longer a component. It is just a system class that can be constructed with a tool ID. Internally, it will connect to its buses and be addressable by tool ID. More than one can be instantiated, each with a unique tool ID. • These changes are still backward compatible because most of the buses were using broadcast for standalone applications. All of those calls have been updated but not all of the scripts, which should still work as is. • Got rid of the window factory request bus in favor of just instantiating the main window or any other UI in the application layer. • Fixed a couple of bugs that were discovered while making these changes. Signed-off-by: Guthrie Adams <guthadam@amazon.com>
This commit is contained in:
@@ -21,8 +21,8 @@
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
MaterialDocument::MaterialDocument()
|
||||
: AtomToolsFramework::AtomToolsDocument()
|
||||
MaterialDocument::MaterialDocument(const AZ::Crc32& toolId)
|
||||
: AtomToolsFramework::AtomToolsDocument(toolId)
|
||||
{
|
||||
MaterialDocumentRequestBus::Handler::BusConnect(m_id);
|
||||
}
|
||||
@@ -86,12 +86,12 @@ namespace MaterialEditor
|
||||
}
|
||||
}
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentObjectInfoChanged, m_id,
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentObjectInfoChanged, m_id,
|
||||
GetObjectInfoFromDynamicPropertyGroup(group.get()), false);
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentModified, m_id);
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentModified, m_id);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -826,8 +826,8 @@ namespace MaterialEditor
|
||||
|
||||
if (groupChange || groupRebuilt)
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentObjectInfoChanged, m_id,
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentNotificationBus::Events::OnDocumentObjectInfoChanged, m_id,
|
||||
GetObjectInfoFromDynamicPropertyGroup(group.get()), groupRebuilt);
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -31,9 +31,9 @@ namespace MaterialEditor
|
||||
public:
|
||||
AZ_RTTI(MaterialDocument, "{DBA269AE-892B-415C-8FA1-166B94B0E045}");
|
||||
AZ_CLASS_ALLOCATOR(MaterialDocument, AZ::SystemAllocator, 0);
|
||||
AZ_DISABLE_COPY(MaterialDocument);
|
||||
AZ_DISABLE_COPY_MOVE(MaterialDocument);
|
||||
|
||||
MaterialDocument();
|
||||
MaterialDocument(const AZ::Crc32& toolId);
|
||||
virtual ~MaterialDocument();
|
||||
|
||||
// AtomToolsFramework::AtomToolsDocument overrides...
|
||||
|
||||
@@ -42,24 +42,26 @@ void InitMaterialEditorResources()
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
static const char* GetBuildTargetName()
|
||||
{
|
||||
#if !defined(LY_CMAKE_TARGET)
|
||||
#error "LY_CMAKE_TARGET must be defined in order to add this source file to a CMake executable target"
|
||||
#endif
|
||||
return LY_CMAKE_TARGET;
|
||||
}
|
||||
|
||||
MaterialEditorApplication::MaterialEditorApplication(int* argc, char*** argv)
|
||||
: Base(argc, argv)
|
||||
: Base(GetBuildTargetName(), argc, argv)
|
||||
{
|
||||
InitMaterialEditorResources();
|
||||
|
||||
QApplication::setApplicationName("O3DE Material Editor");
|
||||
|
||||
// The settings registry has been created at this point, so add the CMake target
|
||||
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddBuildSystemTargetSpecialization(
|
||||
*AZ::SettingsRegistry::Get(), GetBuildTargetName());
|
||||
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
MaterialEditorApplication::~MaterialEditorApplication()
|
||||
{
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusDisconnect();
|
||||
m_window.reset();
|
||||
}
|
||||
@@ -101,35 +103,20 @@ namespace MaterialEditor
|
||||
{
|
||||
Base::StartCommon(systemEntity);
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Handler::RegisterDocumentType,
|
||||
[]() { return aznew MaterialDocument(); });
|
||||
}
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Handler::RegisterDocumentType,
|
||||
[](const AZ::Crc32& toolId) { return aznew MaterialDocument(toolId); });
|
||||
|
||||
AZStd::string MaterialEditorApplication::GetBuildTargetName() const
|
||||
{
|
||||
#if !defined(LY_CMAKE_TARGET)
|
||||
#error "LY_CMAKE_TARGET must be defined in order to add this source file to a CMake executable target"
|
||||
#endif
|
||||
//! Returns the build system target name of "MaterialEditor"
|
||||
return AZStd::string{ LY_CMAKE_TARGET };
|
||||
}
|
||||
m_window.reset(aznew MaterialEditorWindow(m_toolId));
|
||||
|
||||
AZStd::vector<AZStd::string> MaterialEditorApplication::GetCriticalAssetFilters() const
|
||||
{
|
||||
return AZStd::vector<AZStd::string>({ "passes/", "config/", "MaterialEditor/" });
|
||||
}
|
||||
|
||||
void MaterialEditorApplication::CreateMainWindow()
|
||||
{
|
||||
m_window.reset(aznew MaterialEditorWindow);
|
||||
m_assetBrowserInteractions.reset(aznew AtomToolsFramework::AtomToolsAssetBrowserInteractions);
|
||||
|
||||
m_assetBrowserInteractions->RegisterContextMenuActions(
|
||||
[](const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries)
|
||||
{
|
||||
return entries.front()->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Source;
|
||||
},
|
||||
[]([[maybe_unused]] QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries)
|
||||
[this]([[maybe_unused]] QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries)
|
||||
{
|
||||
const bool isMaterial = AzFramework::StringFunc::Path::IsExtension(
|
||||
entries.front()->GetFullPath().c_str(), AZ::RPI::MaterialSourceData::Extension);
|
||||
@@ -137,17 +124,17 @@ namespace MaterialEditor
|
||||
entries.front()->GetFullPath().c_str(), AZ::RPI::MaterialTypeSourceData::Extension);
|
||||
if (isMaterial || isMaterialType)
|
||||
{
|
||||
menu->addAction(QObject::tr("Open"), [entries]()
|
||||
menu->addAction(QObject::tr("Open"), [entries, this]()
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument,
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument,
|
||||
entries.front()->GetFullPath());
|
||||
});
|
||||
|
||||
const QString createActionName =
|
||||
isMaterialType ? QObject::tr("Create Material...") : QObject::tr("Create Child Material...");
|
||||
|
||||
menu->addAction(createActionName, [entries]()
|
||||
menu->addAction(createActionName, [entries, this]()
|
||||
{
|
||||
const QString defaultPath = AtomToolsFramework::GetUniqueFileInfo(
|
||||
QString(AZ::Utils::GetProjectPath().c_str()) +
|
||||
@@ -155,8 +142,8 @@ namespace MaterialEditor
|
||||
AZ_CORRECT_FILESYSTEM_SEPARATOR + "untitled." +
|
||||
AZ::RPI::MaterialSourceData::Extension).absoluteFilePath();
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile,
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile,
|
||||
entries.front()->GetFullPath(),
|
||||
AtomToolsFramework::GetSaveFileInfo(defaultPath).absoluteFilePath().toUtf8().constData());
|
||||
});
|
||||
@@ -175,9 +162,9 @@ namespace MaterialEditor
|
||||
{
|
||||
return entries.front()->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Folder;
|
||||
},
|
||||
[](QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries)
|
||||
[this](QWidget* caller, QMenu* menu, const AtomToolsFramework::AtomToolsAssetBrowserInteractions::AssetBrowserEntryVector& entries)
|
||||
{
|
||||
menu->addAction(QObject::tr("Create Material..."), [caller, entries]()
|
||||
menu->addAction(QObject::tr("Create Material..."), [caller, entries, this]()
|
||||
{
|
||||
CreateMaterialDialog createDialog(entries.front()->GetFullPath().c_str(), caller);
|
||||
createDialog.adjustSize();
|
||||
@@ -186,8 +173,8 @@ namespace MaterialEditor
|
||||
!createDialog.m_materialFileInfo.absoluteFilePath().isEmpty() &&
|
||||
!createDialog.m_materialTypeFileInfo.absoluteFilePath().isEmpty())
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile,
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::CreateDocumentFromFile,
|
||||
createDialog.m_materialTypeFileInfo.absoluteFilePath().toUtf8().constData(),
|
||||
createDialog.m_materialFileInfo.absoluteFilePath().toUtf8().constData());
|
||||
}
|
||||
@@ -195,9 +182,15 @@ namespace MaterialEditor
|
||||
});
|
||||
}
|
||||
|
||||
void MaterialEditorApplication::DestroyMainWindow()
|
||||
void MaterialEditorApplication::Destroy()
|
||||
{
|
||||
m_window.reset();
|
||||
Base::Destroy();
|
||||
}
|
||||
|
||||
AZStd::vector<AZStd::string> MaterialEditorApplication::GetCriticalAssetFilters() const
|
||||
{
|
||||
return AZStd::vector<AZStd::string>({ "passes/", "config/", "MaterialEditor/" });
|
||||
}
|
||||
|
||||
QWidget* MaterialEditorApplication::GetAppMainWindow()
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
#include <AtomToolsFramework/AssetBrowser/AtomToolsAssetBrowserInteractions.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentApplication.h>
|
||||
#include <AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h>
|
||||
#include <AzToolsFramework/API/EditorWindowRequestBus.h>
|
||||
#include <Window/MaterialEditorWindow.h>
|
||||
|
||||
@@ -21,7 +20,6 @@ namespace MaterialEditor
|
||||
class MaterialEditorApplication
|
||||
: public AtomToolsFramework::AtomToolsDocumentApplication
|
||||
, private AzToolsFramework::EditorWindowRequestBus::Handler
|
||||
, private AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_TYPE_INFO(MaterialEditor::MaterialEditorApplication, "{30F90CA5-1253-49B5-8143-19CEE37E22BB}");
|
||||
@@ -36,15 +34,11 @@ namespace MaterialEditor
|
||||
void CreateStaticModules(AZStd::vector<AZ::Module*>& outModules) override;
|
||||
const char* GetCurrentConfigurationName() const override;
|
||||
void StartCommon(AZ::Entity* systemEntity) override;
|
||||
void Destroy() override;
|
||||
|
||||
// AtomToolsFramework::AtomToolsApplication overrides...
|
||||
AZStd::string GetBuildTargetName() const override;
|
||||
AZStd::vector<AZStd::string> GetCriticalAssetFilters() const override;
|
||||
|
||||
// AtomToolsMainWindowFactoryRequestBus::Handler overrides...
|
||||
void CreateMainWindow() override;
|
||||
void DestroyMainWindow() override;
|
||||
|
||||
// AzToolsFramework::EditorWindowRequests::Bus::Handler
|
||||
QWidget* GetAppMainWindow() override;
|
||||
|
||||
|
||||
@@ -60,9 +60,10 @@ namespace MaterialEditor
|
||||
{
|
||||
static constexpr float DepthNear = 0.01f;
|
||||
|
||||
MaterialViewportWidget::MaterialViewportWidget(QWidget* parent)
|
||||
MaterialViewportWidget::MaterialViewportWidget(const AZ::Crc32& toolId, QWidget* parent)
|
||||
: AtomToolsFramework::RenderViewportWidget(parent)
|
||||
, m_ui(new Ui::MaterialViewportWidget)
|
||||
, m_toolId(toolId)
|
||||
, m_viewportController(AZStd::make_shared<MaterialEditorViewportInputController>())
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
@@ -252,7 +253,7 @@ namespace MaterialEditor
|
||||
OnFieldOfViewChanged(viewportSettings->m_fieldOfView);
|
||||
OnDisplayMapperOperationTypeChanged(viewportSettings->m_displayMapperOperationType);
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusConnect(m_toolId);
|
||||
MaterialViewportNotificationBus::Handler::BusConnect();
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
AZ::TransformNotificationBus::MultiHandler::BusConnect(m_cameraEntity->GetId());
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace MaterialEditor
|
||||
, public AZ::TransformNotificationBus::MultiHandler
|
||||
{
|
||||
public:
|
||||
MaterialViewportWidget(QWidget* parent = nullptr);
|
||||
MaterialViewportWidget(const AZ::Crc32& toolId, QWidget* parent = nullptr);
|
||||
~MaterialViewportWidget();
|
||||
|
||||
private:
|
||||
@@ -84,6 +84,8 @@ namespace MaterialEditor
|
||||
// AZ::TransformNotificationBus::MultiHandler overrides...
|
||||
void OnTransformChanged(const AZ::Transform&, const AZ::Transform&) override;
|
||||
|
||||
const AZ::Crc32 m_toolId = {};
|
||||
|
||||
using DirectionalLightHandle = AZ::Render::DirectionalLightFeatureProcessorInterface::LightHandle;
|
||||
|
||||
AZ::Data::Instance<AZ::RPI::SwapChainPass> m_swapChainPass;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/RHI/Factory.h>
|
||||
#include <Atom/RPI.Edit/Material/MaterialSourceData.h>
|
||||
#include <Atom/RPI.Edit/Material/MaterialTypeSourceData.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
@@ -36,11 +35,9 @@ AZ_POP_DISABLE_WARNING
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
MaterialEditorWindow::MaterialEditorWindow(QWidget* parent /* = 0 */)
|
||||
: Base(parent)
|
||||
MaterialEditorWindow::MaterialEditorWindow(const AZ::Crc32& toolId, QWidget* parent)
|
||||
: Base(toolId, parent)
|
||||
{
|
||||
resize(1280, 1024);
|
||||
|
||||
// Among other things, we need the window wrapper to save the main window size, position, and state
|
||||
auto mainWindowWrapper =
|
||||
new AzQtComponents::WindowDecorationWrapper(AzQtComponents::WindowDecorationWrapper::OptionAutoTitleBarButtons);
|
||||
@@ -52,36 +49,24 @@ namespace MaterialEditor
|
||||
|
||||
QApplication::setWindowIcon(QIcon(":/Icons/materialeditor.svg"));
|
||||
|
||||
AZ::Name apiName = AZ::RHI::Factory::Get().GetName();
|
||||
if (!apiName.IsEmpty())
|
||||
{
|
||||
QString title = QString{ "%1 (%2)" }.arg(QApplication::applicationName()).arg(apiName.GetCStr());
|
||||
setWindowTitle(title);
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Assert(false, "Render API name not found");
|
||||
setWindowTitle(QApplication::applicationName());
|
||||
}
|
||||
|
||||
setObjectName("MaterialEditorWindow");
|
||||
|
||||
m_toolBar = new MaterialEditorToolBar(this);
|
||||
m_toolBar->setObjectName("ToolBar");
|
||||
addToolBar(m_toolBar);
|
||||
|
||||
m_materialViewport = new MaterialViewportWidget(centralWidget());
|
||||
m_materialViewport = new MaterialViewportWidget(m_toolId, centralWidget());
|
||||
m_materialViewport->setObjectName("Viewport");
|
||||
m_materialViewport->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
centralWidget()->layout()->addWidget(m_materialViewport);
|
||||
|
||||
m_assetBrowser->SetFilterState("", AZ::RPI::StreamingImageAsset::Group, true);
|
||||
m_assetBrowser->SetFilterState("", AZ::RPI::MaterialAsset::Group, true);
|
||||
m_assetBrowser->SetOpenHandler([](const AZStd::string& absolutePath) {
|
||||
m_assetBrowser->SetOpenHandler([this](const AZStd::string& absolutePath) {
|
||||
if (AzFramework::StringFunc::Path::IsExtension(absolutePath.c_str(), AZ::RPI::MaterialSourceData::Extension))
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, absolutePath);
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Event(
|
||||
m_toolId, &AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, absolutePath);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -93,7 +78,7 @@ namespace MaterialEditor
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(absolutePath.c_str()));
|
||||
});
|
||||
|
||||
AddDockWidget("Inspector", new MaterialInspector, Qt::RightDockWidgetArea, Qt::Vertical);
|
||||
AddDockWidget("Inspector", new MaterialInspector(m_toolId), Qt::RightDockWidgetArea, Qt::Vertical);
|
||||
AddDockWidget("Viewport Settings", new ViewportSettingsInspector, Qt::LeftDockWidgetArea, Qt::Vertical);
|
||||
SetDockWidgetVisible("Viewport Settings", false);
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace MaterialEditor
|
||||
|
||||
using Base = AtomToolsFramework::AtomToolsDocumentMainWindow;
|
||||
|
||||
MaterialEditorWindow(QWidget* parent = 0);
|
||||
MaterialEditorWindow(const AZ::Crc32& toolId, QWidget* parent = 0);
|
||||
|
||||
protected:
|
||||
void ResizeViewportRenderTarget(uint32_t width, uint32_t height) override;
|
||||
|
||||
+3
-2
@@ -15,13 +15,14 @@
|
||||
|
||||
namespace MaterialEditor
|
||||
{
|
||||
MaterialInspector::MaterialInspector(QWidget* parent)
|
||||
MaterialInspector::MaterialInspector(const AZ::Crc32& toolId, QWidget* parent)
|
||||
: AtomToolsFramework::InspectorWidget(parent)
|
||||
, m_toolId(toolId)
|
||||
{
|
||||
m_windowSettings = AZ::UserSettings::CreateFind<MaterialEditorWindowSettings>(
|
||||
AZ::Crc32("MaterialEditorWindowSettings"), AZ::UserSettings::CT_GLOBAL);
|
||||
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusConnect(m_toolId);
|
||||
}
|
||||
|
||||
MaterialInspector::~MaterialInspector()
|
||||
|
||||
+3
-1
@@ -29,7 +29,7 @@ namespace MaterialEditor
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(MaterialInspector, AZ::SystemAllocator, 0);
|
||||
|
||||
explicit MaterialInspector(QWidget* parent = nullptr);
|
||||
MaterialInspector(const AZ::Crc32& toolId, QWidget* parent = nullptr);
|
||||
~MaterialInspector() override;
|
||||
|
||||
// AtomToolsFramework::InspectorRequestBus::Handler overrides...
|
||||
@@ -59,6 +59,8 @@ namespace MaterialEditor
|
||||
void RequestPropertyContextMenu([[maybe_unused]] AzToolsFramework::InstanceDataNode* pNode, const QPoint&) override {}
|
||||
void PropertySelectionChanged([[maybe_unused]] AzToolsFramework::InstanceDataNode* pNode, bool) override {}
|
||||
|
||||
const AZ::Crc32 m_toolId = {};
|
||||
|
||||
// Tracking the property that is activiley being edited in the inspector
|
||||
const AtomToolsFramework::DynamicProperty* m_activeProperty = {};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user