Atom Tools: Removing unnecessary modules, components, and dead code from SMC
Looking toward creating a bare bones template for a standalone application, simplifying and removing any boilerplate wherever possible. SMC followed patterns established by material editor, subdividing everything into multiple modules, which required manually adding static modules, implementing system components with little to no functionality, and a bunch of unnecessary files for such a simple application. This change deletes unnecessary boilerplate code, moving everything into a single module, making the application class responsible for reflecting classes and buses. Signed-off-by: Guthrie Adams <guthadam@amazon.com>
This commit is contained in:
@@ -157,6 +157,7 @@ namespace AtomToolsFramework
|
||||
components.insert(
|
||||
components.end(),
|
||||
{
|
||||
azrtti_typeid<AzToolsFramework::AssetSystem::AssetSystemComponent>(),
|
||||
azrtti_typeid<AzToolsFramework::AssetBrowser::AssetBrowserComponent>(),
|
||||
azrtti_typeid<AzToolsFramework::AssetSystem::AssetSystemComponent>(),
|
||||
azrtti_typeid<AzToolsFramework::Thumbnailer::ThumbnailerComponent>(),
|
||||
|
||||
@@ -19,48 +19,10 @@ if(NOT PAL_TRAIT_ATOM_SHADER_MANAGEMENT_CONSOLE_APPLICATION_SUPPORTED)
|
||||
endif()
|
||||
|
||||
ly_add_target(
|
||||
NAME ShaderManagementConsole.Document STATIC
|
||||
NAMESPACE Gem
|
||||
FILES_CMAKE
|
||||
shadermanagementconsoledocument_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
PRIVATE
|
||||
.
|
||||
Source
|
||||
PUBLIC
|
||||
Include
|
||||
BUILD_DEPENDENCIES
|
||||
PUBLIC
|
||||
Gem::AtomToolsFramework.Static
|
||||
Gem::AtomToolsFramework.Editor
|
||||
Gem::Atom_RPI.Edit
|
||||
Gem::Atom_RPI.Public
|
||||
Gem::Atom_RHI.Reflect
|
||||
)
|
||||
|
||||
ly_add_target(
|
||||
NAME ShaderManagementConsole.Window STATIC
|
||||
NAME ShaderManagementConsole EXECUTABLE
|
||||
NAMESPACE Gem
|
||||
AUTOMOC
|
||||
AUTORCC
|
||||
FILES_CMAKE
|
||||
shadermanagementconsolewindow_files.cmake
|
||||
INCLUDE_DIRECTORIES
|
||||
PRIVATE
|
||||
.
|
||||
Source
|
||||
PUBLIC
|
||||
Include
|
||||
BUILD_DEPENDENCIES
|
||||
PUBLIC
|
||||
Gem::AtomToolsFramework.Static
|
||||
Gem::AtomToolsFramework.Editor
|
||||
Gem::Atom_RPI.Public
|
||||
)
|
||||
|
||||
ly_add_target(
|
||||
NAME ShaderManagementConsole EXECUTABLE
|
||||
NAMESPACE Gem
|
||||
FILES_CMAKE
|
||||
shadermanagementconsole_files.cmake
|
||||
${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake
|
||||
@@ -77,8 +39,9 @@ ly_add_target(
|
||||
PRIVATE
|
||||
Gem::AtomToolsFramework.Static
|
||||
Gem::AtomToolsFramework.Editor
|
||||
Gem::ShaderManagementConsole.Window
|
||||
Gem::ShaderManagementConsole.Document
|
||||
Gem::Atom_RPI.Edit
|
||||
Gem::Atom_RPI.Public
|
||||
Gem::Atom_RHI.Reflect
|
||||
RUNTIME_DEPENDENCIES
|
||||
Gem::AtomToolsFramework.Editor
|
||||
Gem::EditorPythonBindings.Editor
|
||||
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Module/Module.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
//! Entry point for Shader Management Console Document library.
|
||||
class ShaderManagementConsoleDocumentModule
|
||||
: public AZ::Module
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(ShaderManagementConsoleDocumentModule, "{81D7A170-9284-4DE9-8D92-B6B94E8A2BDF}", AZ::Module);
|
||||
AZ_CLASS_ALLOCATOR(ShaderManagementConsoleDocumentModule, AZ::SystemAllocator, 0);
|
||||
|
||||
ShaderManagementConsoleDocumentModule();
|
||||
|
||||
//! Add required SystemComponents to the SystemEntity.
|
||||
AZ::ComponentTypeList GetRequiredSystemComponents() const override;
|
||||
};
|
||||
}
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Module/Module.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
//! Entry point for Shader Management Console Window library.
|
||||
class ShaderManagementConsoleWindowModule
|
||||
: public AZ::Module
|
||||
{
|
||||
public:
|
||||
AZ_RTTI(ShaderManagementConsoleWindowModule, "{57D6239C-AE03-4ED8-9125-35C5B1625503}", AZ::Module);
|
||||
AZ_CLASS_ALLOCATOR(ShaderManagementConsoleWindowModule, AZ::SystemAllocator, 0);
|
||||
|
||||
ShaderManagementConsoleWindowModule();
|
||||
|
||||
//! Add required SystemComponents to the SystemEntity.
|
||||
AZ::ComponentTypeList GetRequiredSystemComponents() const override;
|
||||
};
|
||||
}
|
||||
+1
-1
@@ -7,12 +7,12 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <Atom/RPI.Edit/Shader/ShaderVariantListSourceData.h>
|
||||
#include <Atom/RPI.Reflect/Shader/ShaderAsset.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocument.h>
|
||||
#include <AzCore/Asset/AssetCommon.h>
|
||||
#include <AzCore/RTTI/RTTI.h>
|
||||
#include <Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentModule.h>
|
||||
#include <AzToolsFramework/Asset/AssetSystemComponent.h>
|
||||
#include <Document/ShaderManagementConsoleDocumentSystemComponent.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
ShaderManagementConsoleDocumentModule::ShaderManagementConsoleDocumentModule()
|
||||
{
|
||||
// Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
|
||||
m_descriptors.insert(m_descriptors.end(), {
|
||||
ShaderManagementConsoleDocumentSystemComponent::CreateDescriptor(),
|
||||
});
|
||||
}
|
||||
|
||||
AZ::ComponentTypeList ShaderManagementConsoleDocumentModule::GetRequiredSystemComponents() const
|
||||
{
|
||||
return AZ::ComponentTypeList{
|
||||
azrtti_typeid<AzToolsFramework::AssetSystem::AssetSystemComponent>(),
|
||||
azrtti_typeid<ShaderManagementConsoleDocumentSystemComponent>(),
|
||||
};
|
||||
}
|
||||
}
|
||||
-86
@@ -1,86 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <Document/ShaderManagementConsoleDocument.h>
|
||||
#include <Document/ShaderManagementConsoleDocumentSystemComponent.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
void ShaderManagementConsoleDocumentSystemComponent::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serialize->Class<ShaderManagementConsoleDocumentSystemComponent, AZ::Component>()
|
||||
->Version(0);
|
||||
|
||||
if (AZ::EditContext* ec = serialize->GetEditContext())
|
||||
{
|
||||
ec->Class<ShaderManagementConsoleDocumentSystemComponent>("ShaderManagementConsoleDocumentSystemComponent", "Manages documents")
|
||||
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
|
||||
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("System"))
|
||||
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->EBus<ShaderManagementConsoleDocumentRequestBus>("ShaderManagementConsoleDocumentRequestBus")
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||
->Attribute(AZ::Script::Attributes::Category, "Editor")
|
||||
->Attribute(AZ::Script::Attributes::Module, "shadermanagementconsole")
|
||||
->Event("GetShaderOptionCount", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderOptionCount)
|
||||
->Event("GetShaderOptionDescriptor", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderOptionDescriptor)
|
||||
->Event("GetShaderVariantCount", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderVariantCount)
|
||||
->Event("GetShaderVariantInfo", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderVariantInfo)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
|
||||
{
|
||||
required.push_back(AZ_CRC_CE("AtomToolsDocumentSystemService"));
|
||||
required.push_back(AZ_CRC_CE("AssetProcessorToolsConnection"));
|
||||
required.push_back(AZ_CRC_CE("AssetDatabaseService"));
|
||||
required.push_back(AZ_CRC_CE("PropertyManagerService"));
|
||||
required.push_back(AZ_CRC_CE("RPISystem"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
|
||||
{
|
||||
provided.push_back(AZ_CRC_CE("ShaderManagementConsoleDocumentSystemService"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
|
||||
{
|
||||
incompatible.push_back(AZ_CRC_CE("ShaderManagementConsoleDocumentSystemService"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::Init()
|
||||
{
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::Activate()
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Handler::RegisterDocumentType,
|
||||
[]()
|
||||
{
|
||||
return aznew ShaderManagementConsoleDocument();
|
||||
});
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleDocumentSystemComponent::Deactivate()
|
||||
{
|
||||
}
|
||||
}
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Component/Component.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
//! ShaderManagementConsoleDocumentSystemComponent
|
||||
class ShaderManagementConsoleDocumentSystemComponent
|
||||
: public AZ::Component
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(ShaderManagementConsoleDocumentSystemComponent, "{1610159D-59DC-48B1-B2D1-FCE7AFD3B012}");
|
||||
|
||||
ShaderManagementConsoleDocumentSystemComponent() = default;
|
||||
~ShaderManagementConsoleDocumentSystemComponent() = default;
|
||||
ShaderManagementConsoleDocumentSystemComponent(const ShaderManagementConsoleDocumentSystemComponent&) = delete;
|
||||
ShaderManagementConsoleDocumentSystemComponent& operator =(const ShaderManagementConsoleDocumentSystemComponent&) = delete;
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
|
||||
|
||||
private:
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// AZ::Component interface implementation
|
||||
void Init() override;
|
||||
void Activate() override;
|
||||
void Deactivate() override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
};
|
||||
}
|
||||
-2
@@ -7,5 +7,3 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define AZ_TRAIT_SHADER_MANAGEMENT_CONSOLE_EXT ""
|
||||
|
||||
|
||||
-2
@@ -7,5 +7,3 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define AZ_TRAIT_SHADER_MANAGEMENT_CONSOLE_EXT ".app"
|
||||
|
||||
|
||||
-2
@@ -7,5 +7,3 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#define AZ_TRAIT_SHADER_MANAGEMENT_CONSOLE_EXT ".exe"
|
||||
|
||||
|
||||
+201
-18
@@ -6,21 +6,90 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentModule.h>
|
||||
#include <Atom/Window/ShaderManagementConsoleWindowModule.h>
|
||||
#include <AssetDatabase/AssetDatabaseConnection.h>
|
||||
#include <Atom/RPI.Edit/Common/AssetUtils.h>
|
||||
#include <Atom/RPI.Edit/Common/JsonUtils.h>
|
||||
#include <Atom/RPI.Public/Material/Material.h>
|
||||
#include <Atom/RPI.Reflect/Asset/AssetUtils.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzCore/Settings/SettingsRegistryMergeUtils.h>
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/UI/UICore/QWidgetSavedState.h>
|
||||
#include <Document/ShaderManagementConsoleDocument.h>
|
||||
#include <Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <ShaderManagementConsoleApplication.h>
|
||||
#include <ShaderManagementConsoleRequestBus.h>
|
||||
#include <ShaderManagementConsole_Traits_Platform.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
void InitShaderManagementConsoleResources()
|
||||
{
|
||||
// Must register qt resources from other modules
|
||||
Q_INIT_RESOURCE(ShaderManagementConsole);
|
||||
Q_INIT_RESOURCE(InspectorWidget);
|
||||
Q_INIT_RESOURCE(AtomToolsAssetBrowser);
|
||||
}
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
//! This function returns the build system target name of "ShaderManagementConsole"
|
||||
AZStd::string ShaderManagementConsoleApplication::GetBuildTargetName() const
|
||||
ShaderManagementConsoleApplication::ShaderManagementConsoleApplication(int* argc, char*** argv)
|
||||
: Base(argc, argv)
|
||||
{
|
||||
#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 AZStd::string_view{ LY_CMAKE_TARGET };
|
||||
InitShaderManagementConsoleResources();
|
||||
|
||||
QApplication::setApplicationName("O3DE Shader Management Console");
|
||||
|
||||
// The settings registry has been created at this point, so add the CMake target
|
||||
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddBuildSystemTargetSpecialization(
|
||||
*AZ::SettingsRegistry::Get(), GetBuildTargetName());
|
||||
|
||||
ShaderManagementConsoleRequestBus::Handler::BusConnect();
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
ShaderManagementConsoleApplication::~ShaderManagementConsoleApplication()
|
||||
{
|
||||
ShaderManagementConsoleRequestBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusDisconnect();
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusDisconnect();
|
||||
m_window.reset();
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleApplication::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
Base::Reflect(context);
|
||||
|
||||
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->EBus<ShaderManagementConsoleRequestBus>("ShaderManagementConsoleRequestBus")
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
|
||||
->Attribute(AZ::Script::Attributes::Category, "Editor")
|
||||
->Attribute(AZ::Script::Attributes::Module, "shadermanagementconsole")
|
||||
->Event("GetSourceAssetInfo", &ShaderManagementConsoleRequestBus::Events::GetSourceAssetInfo)
|
||||
->Event("FindMaterialAssetsUsingShader", &ShaderManagementConsoleRequestBus::Events::FindMaterialAssetsUsingShader )
|
||||
->Event("GetMaterialInstanceShaderItems", &ShaderManagementConsoleRequestBus::Events::GetMaterialInstanceShaderItems)
|
||||
;
|
||||
|
||||
behaviorContext->EBus<ShaderManagementConsoleDocumentRequestBus>("ShaderManagementConsoleDocumentRequestBus")
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common)
|
||||
->Attribute(AZ::Script::Attributes::Category, "Editor")
|
||||
->Attribute(AZ::Script::Attributes::Module, "shadermanagementconsole")
|
||||
->Event("GetShaderOptionCount", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderOptionCount)
|
||||
->Event("GetShaderOptionDescriptor", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderOptionDescriptor)
|
||||
->Event("GetShaderVariantCount", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderVariantCount)
|
||||
->Event("GetShaderVariantInfo", &ShaderManagementConsoleDocumentRequestBus::Events::GetShaderVariantInfo)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
const char* ShaderManagementConsoleApplication::GetCurrentConfigurationName() const
|
||||
@@ -34,25 +103,139 @@ namespace ShaderManagementConsole
|
||||
#endif
|
||||
}
|
||||
|
||||
ShaderManagementConsoleApplication::ShaderManagementConsoleApplication(int* argc, char*** argv)
|
||||
: Base(argc, argv)
|
||||
void ShaderManagementConsoleApplication::StartCommon(AZ::Entity* systemEntity)
|
||||
{
|
||||
QApplication::setApplicationName("O3DE Shader Management Console");
|
||||
Base::StartCommon(systemEntity);
|
||||
|
||||
// The settings registry has been created at this point, so add the CMake target
|
||||
AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddBuildSystemTargetSpecialization(
|
||||
*AZ::SettingsRegistry::Get(), GetBuildTargetName());
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(
|
||||
&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Handler::RegisterDocumentType,
|
||||
[]() { return aznew ShaderManagementConsoleDocument(); });
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleApplication::CreateStaticModules(AZStd::vector<AZ::Module*>& outModules)
|
||||
AZStd::string ShaderManagementConsoleApplication::GetBuildTargetName() const
|
||||
{
|
||||
Base::CreateStaticModules(outModules);
|
||||
outModules.push_back(aznew ShaderManagementConsoleDocumentModule);
|
||||
outModules.push_back(aznew ShaderManagementConsoleWindowModule);
|
||||
#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 "ShaderManagementConsole"
|
||||
return AZStd::string_view{ LY_CMAKE_TARGET };
|
||||
}
|
||||
|
||||
AZStd::vector<AZStd::string> ShaderManagementConsoleApplication::GetCriticalAssetFilters() const
|
||||
{
|
||||
return AZStd::vector<AZStd::string>({ "passes/", "config/" });
|
||||
}
|
||||
|
||||
QWidget* ShaderManagementConsoleApplication::GetAppMainWindow()
|
||||
{
|
||||
return m_window.get();
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleApplication::CreateMainWindow()
|
||||
{
|
||||
m_assetBrowserInteractions.reset(aznew ShaderManagementConsoleBrowserInteractions);
|
||||
m_window.reset(aznew ShaderManagementConsoleWindow);
|
||||
m_window->show();
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleApplication::DestroyMainWindow()
|
||||
{
|
||||
m_window.reset();
|
||||
}
|
||||
|
||||
AZ::Data::AssetInfo ShaderManagementConsoleApplication::GetSourceAssetInfo(const AZStd::string& sourceAssetFileName)
|
||||
{
|
||||
bool result = false;
|
||||
AZ::Data::AssetInfo assetInfo;
|
||||
AZStd::string watchFolder;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
result, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, sourceAssetFileName.c_str(), assetInfo,
|
||||
watchFolder);
|
||||
AZ_Error(nullptr, result, "Failed to get the asset info for the file: %s.", sourceAssetFileName.c_str());
|
||||
|
||||
return assetInfo;
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Data::AssetId> ShaderManagementConsoleApplication::FindMaterialAssetsUsingShader(const AZStd::string& shaderFilePath)
|
||||
{
|
||||
// Collect the material types referencing the shader
|
||||
AZStd::vector<AZStd::string> materialTypeSources;
|
||||
|
||||
AzToolsFramework::AssetDatabase::AssetDatabaseConnection assetDatabaseConnection;
|
||||
assetDatabaseConnection.OpenDatabase();
|
||||
|
||||
assetDatabaseConnection.QuerySourceDependencyByDependsOnSource(
|
||||
shaderFilePath.c_str(), nullptr, AzToolsFramework::AssetDatabase::SourceFileDependencyEntry::DEP_Any,
|
||||
[&](AzToolsFramework::AssetDatabase::SourceFileDependencyEntry& sourceFileDependencyEntry)
|
||||
{
|
||||
AZStd::string assetExtension;
|
||||
if (AzFramework::StringFunc::Path::GetExtension(sourceFileDependencyEntry.m_source.c_str(), assetExtension, false))
|
||||
{
|
||||
if (assetExtension == "materialtype")
|
||||
{
|
||||
materialTypeSources.push_back(sourceFileDependencyEntry.m_source);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
AzToolsFramework::AssetDatabase::ProductDatabaseEntryContainer productDependencies;
|
||||
for (const auto& materialTypeSource : materialTypeSources)
|
||||
{
|
||||
bool result = false;
|
||||
AZ::Data::AssetInfo materialTypeSourceAssetInfo;
|
||||
AZStd::string watchFolder;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
result, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, materialTypeSource.c_str(),
|
||||
materialTypeSourceAssetInfo, watchFolder);
|
||||
|
||||
assetDatabaseConnection.QueryDirectReverseProductDependenciesBySourceGuidSubId(
|
||||
materialTypeSourceAssetInfo.m_assetId.m_guid, materialTypeSourceAssetInfo.m_assetId.m_subId,
|
||||
[&](AzToolsFramework::AssetDatabase::ProductDatabaseEntry& entry)
|
||||
{
|
||||
AZStd::string assetExtension;
|
||||
if (AzFramework::StringFunc::Path::GetExtension(entry.m_productName.c_str(), assetExtension, false))
|
||||
{
|
||||
if (assetExtension == "azmaterial")
|
||||
{
|
||||
productDependencies.push_back(entry);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Data::AssetId> results;
|
||||
results.reserve(productDependencies.size());
|
||||
for (auto product : productDependencies)
|
||||
{
|
||||
assetDatabaseConnection.QueryCombinedByProductID(
|
||||
product.m_productID,
|
||||
[&](AzToolsFramework::AssetDatabase::CombinedDatabaseEntry& combined)
|
||||
{
|
||||
results.push_back({ combined.m_sourceGuid, combined.m_subID });
|
||||
return false;
|
||||
},
|
||||
nullptr);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::RPI::ShaderCollection::Item> ShaderManagementConsoleApplication::GetMaterialInstanceShaderItems(
|
||||
const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
auto materialAsset = AZ::RPI::AssetUtils::LoadAssetById<AZ::RPI::MaterialAsset>(assetId, AZ::RPI::AssetUtils::TraceLevel::Error);
|
||||
|
||||
auto materialInstance = AZ::RPI::Material::Create(materialAsset);
|
||||
AZ_Error(
|
||||
nullptr, materialAsset, "Failed to get a material instance from product asset id: %s",
|
||||
assetId.ToString<AZStd::string>().c_str());
|
||||
|
||||
if (materialInstance != nullptr)
|
||||
{
|
||||
return AZStd::vector<AZ::RPI::ShaderCollection::Item>(
|
||||
materialInstance->GetShaderCollection().begin(), materialInstance->GetShaderCollection().end());
|
||||
}
|
||||
return AZStd::vector<AZ::RPI::ShaderCollection::Item>();
|
||||
}
|
||||
} // namespace ShaderManagementConsole
|
||||
|
||||
+28
-1
@@ -8,12 +8,21 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Atom/RPI.Reflect/Material/MaterialAsset.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentApplication.h>
|
||||
#include <AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h>
|
||||
#include <AzToolsFramework/API/EditorWindowRequestBus.h>
|
||||
#include <ShaderManagementConsoleRequestBus.h>
|
||||
#include <Window/ShaderManagementConsoleBrowserInteractions.h>
|
||||
#include <Window/ShaderManagementConsoleWindow.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
class ShaderManagementConsoleApplication
|
||||
: public AtomToolsFramework::AtomToolsDocumentApplication
|
||||
, private ShaderManagementConsoleRequestBus::Handler
|
||||
, private AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler
|
||||
, private AzToolsFramework::EditorWindowRequestBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_TYPE_INFO(ShaderManagementConsole::ShaderManagementConsoleApplication, "{A31B1AEB-4DA3-49CD-884A-CC998FF7546F}");
|
||||
@@ -21,13 +30,31 @@ namespace ShaderManagementConsole
|
||||
using Base = AtomToolsFramework::AtomToolsDocumentApplication;
|
||||
|
||||
ShaderManagementConsoleApplication(int* argc, char*** argv);
|
||||
~ShaderManagementConsoleApplication();
|
||||
|
||||
// AzFramework::Application overrides...
|
||||
void CreateStaticModules(AZStd::vector<AZ::Module*>& outModules) override;
|
||||
void Reflect(AZ::ReflectContext* context) override;
|
||||
const char* GetCurrentConfigurationName() const override;
|
||||
void StartCommon(AZ::Entity* systemEntity) override;
|
||||
|
||||
// AtomToolsFramework::AtomToolsApplication overrides...
|
||||
AZStd::string GetBuildTargetName() const override;
|
||||
AZStd::vector<AZStd::string> GetCriticalAssetFilters() const override;
|
||||
|
||||
// AzToolsFramework::EditorWindowRequests::Bus::Handler
|
||||
QWidget* GetAppMainWindow() override;
|
||||
|
||||
// AtomToolsMainWindowFactoryRequestBus::Handler overrides...
|
||||
void CreateMainWindow() override;
|
||||
void DestroyMainWindow() override;
|
||||
|
||||
// ShaderManagementConsoleRequestBus::Handler overrides...
|
||||
AZ::Data::AssetInfo GetSourceAssetInfo(const AZStd::string& sourceAssetFileName) override;
|
||||
AZStd::vector<AZ::Data::AssetId> FindMaterialAssetsUsingShader(const AZStd::string& shaderFilePath) override;
|
||||
AZStd::vector<AZ::RPI::ShaderCollection::Item> GetMaterialInstanceShaderItems(const AZ::Data::AssetId& assetId) override;
|
||||
|
||||
private:
|
||||
AZStd::unique_ptr<ShaderManagementConsoleWindow> m_window;
|
||||
AZStd::unique_ptr<ShaderManagementConsoleBrowserInteractions> m_assetBrowserInteractions;
|
||||
};
|
||||
} // namespace ShaderManagementConsole
|
||||
|
||||
-201
@@ -1,201 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <Atom/RPI.Reflect/Shader/ShaderAsset.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentRequestBus.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzQtComponents/Utilities/DesktopUtilities.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetSelectionModel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Search/Filter.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h>
|
||||
#include <Window/ShaderManagementConsoleBrowserWidget.h>
|
||||
#include <Window/ui_ShaderManagementConsoleBrowserWidget.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <QDesktopServices>
|
||||
#include <QUrl>
|
||||
#include <QMessageBox>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
ShaderManagementConsoleBrowserWidget::ShaderManagementConsoleBrowserWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, m_ui(new Ui::ShaderManagementConsoleBrowserWidget)
|
||||
{
|
||||
using namespace AzToolsFramework::AssetBrowser;
|
||||
|
||||
m_ui->setupUi(this);
|
||||
|
||||
m_ui->m_searchWidget->Setup(true, true);
|
||||
m_ui->m_searchWidget->SetFilterState("", AZ::RPI::ShaderAsset::Group, true);
|
||||
m_ui->m_searchWidget->setMinimumSize(QSize(150, 0));
|
||||
|
||||
// Get the asset browser model
|
||||
AssetBrowserModel* assetBrowserModel = nullptr;
|
||||
AssetBrowserComponentRequestBus::BroadcastResult(assetBrowserModel, &AssetBrowserComponentRequests::GetAssetBrowserModel);
|
||||
AZ_Assert(assetBrowserModel, "Failed to get file browser model");
|
||||
|
||||
// Hook up the data set to the tree view
|
||||
m_filterModel = aznew AssetBrowserFilterModel(this);
|
||||
m_filterModel->setSourceModel(assetBrowserModel);
|
||||
m_filterModel->SetFilter(CreateFilter());
|
||||
|
||||
m_ui->m_assetBrowserTreeViewWidget->setModel(m_filterModel);
|
||||
m_ui->m_assetBrowserTreeViewWidget->SetShowSourceControlIcons(true);
|
||||
m_ui->m_assetBrowserTreeViewWidget->setSelectionMode(QAbstractItemView::SelectionMode::ExtendedSelection);
|
||||
|
||||
// Maintains the tree expansion state between runs
|
||||
m_ui->m_assetBrowserTreeViewWidget->SetName("AssetBrowserTreeView_main");
|
||||
|
||||
connect(m_ui->m_searchWidget->GetFilter().data(), &AssetBrowserEntryFilter::updatedSignal, m_filterModel, &AssetBrowserFilterModel::filterUpdatedSlot);
|
||||
connect(m_filterModel, &AssetBrowserFilterModel::filterChanged, this, [this]()
|
||||
{
|
||||
const bool hasFilter = !m_ui->m_searchWidget->GetFilterString().isEmpty();
|
||||
constexpr bool selectFirstFilteredIndex = true;
|
||||
m_ui->m_assetBrowserTreeViewWidget->UpdateAfterFilter(hasFilter, selectFirstFilteredIndex);
|
||||
});
|
||||
connect(m_ui->m_assetBrowserTreeViewWidget, &AssetBrowserTreeView::activated, this, &ShaderManagementConsoleBrowserWidget::OpenSelectedEntries);
|
||||
connect(m_ui->m_assetBrowserTreeViewWidget, &AssetBrowserTreeView::selectionChangedSignal, [this]() {
|
||||
const auto& selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets();
|
||||
if (!selectedAssets.empty())
|
||||
{
|
||||
m_ui->m_previewerFrame->Display(selectedAssets.front());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->m_previewerFrame->Clear();
|
||||
}
|
||||
});
|
||||
|
||||
AssetBrowserModelNotificationBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
ShaderManagementConsoleBrowserWidget::~ShaderManagementConsoleBrowserWidget()
|
||||
{
|
||||
// Maintains the tree expansion state between runs
|
||||
m_ui->m_assetBrowserTreeViewWidget->SaveState();
|
||||
AtomToolsFramework::AtomToolsDocumentNotificationBus::Handler::BusDisconnect();
|
||||
AssetBrowserModelNotificationBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
AzToolsFramework::AssetBrowser::FilterConstType ShaderManagementConsoleBrowserWidget::CreateFilter() const
|
||||
{
|
||||
using namespace AzToolsFramework::AssetBrowser;
|
||||
|
||||
QSharedPointer<EntryTypeFilter> sourceFilter(new EntryTypeFilter);
|
||||
sourceFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Source);
|
||||
|
||||
QSharedPointer<EntryTypeFilter> folderFilter(new EntryTypeFilter);
|
||||
folderFilter->SetEntryType(AssetBrowserEntry::AssetEntryType::Folder);
|
||||
|
||||
QSharedPointer<CompositeFilter> sourceOrFolderFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::OR));
|
||||
sourceOrFolderFilter->AddFilter(sourceFilter);
|
||||
sourceOrFolderFilter->AddFilter(folderFilter);
|
||||
|
||||
QSharedPointer<CompositeFilter> finalFilter(new CompositeFilter(CompositeFilter::LogicOperatorType::AND));
|
||||
finalFilter->AddFilter(sourceOrFolderFilter);
|
||||
finalFilter->AddFilter(m_ui->m_searchWidget->GetFilter());
|
||||
|
||||
return finalFilter;
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleBrowserWidget::OpenSelectedEntries()
|
||||
{
|
||||
const AZStd::vector<AssetBrowserEntry*> entries = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets();
|
||||
|
||||
const int multiSelectPromptThreshold = 10;
|
||||
if (entries.size() >= multiSelectPromptThreshold)
|
||||
{
|
||||
if (QMessageBox::question(
|
||||
QApplication::activeWindow(),
|
||||
QString("Attemptng to open %1 files").arg(entries.size()),
|
||||
"Would you like to open anyway?",
|
||||
QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (const AssetBrowserEntry* entry : entries)
|
||||
{
|
||||
const SourceAssetBrowserEntry* sourceEntry = azrtti_cast<const SourceAssetBrowserEntry*>(entry);
|
||||
if (!sourceEntry)
|
||||
{
|
||||
const ProductAssetBrowserEntry* productEntry = azrtti_cast<const ProductAssetBrowserEntry*>(entry);
|
||||
if (productEntry)
|
||||
{
|
||||
sourceEntry = azrtti_cast<const SourceAssetBrowserEntry*>(productEntry->GetParent());
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceEntry)
|
||||
{
|
||||
if (AzFramework::StringFunc::Path::IsExtension(sourceEntry->GetFullPath().c_str(), AZ::RPI::ShaderVariantListSourceData::Extension))
|
||||
{
|
||||
AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Broadcast(&AtomToolsFramework::AtomToolsDocumentSystemRequestBus::Events::OpenDocument, sourceEntry->GetFullPath());
|
||||
}
|
||||
else
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(sourceEntry->GetFullPath().c_str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleBrowserWidget::EntryAdded(const AssetBrowserEntry* entry)
|
||||
{
|
||||
if (m_pathToSelect.empty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const SourceAssetBrowserEntry* sourceEntry = azrtti_cast<const SourceAssetBrowserEntry*>(entry);
|
||||
if (!sourceEntry)
|
||||
{
|
||||
const ProductAssetBrowserEntry* productEntry = azrtti_cast<const ProductAssetBrowserEntry*>(entry);
|
||||
if (productEntry)
|
||||
{
|
||||
sourceEntry = azrtti_cast<const SourceAssetBrowserEntry*>(productEntry->GetParent());
|
||||
}
|
||||
}
|
||||
|
||||
if (sourceEntry)
|
||||
{
|
||||
AZStd::string sourcePath = sourceEntry->GetFullPath();
|
||||
AzFramework::StringFunc::Path::Normalize(sourcePath);
|
||||
if (m_pathToSelect == sourcePath)
|
||||
{
|
||||
m_ui->m_assetBrowserTreeViewWidget->SelectFileAtPath(m_pathToSelect);
|
||||
m_pathToSelect.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleBrowserWidget::OnDocumentOpened(const AZ::Uuid& documentId)
|
||||
{
|
||||
AZStd::string absolutePath;
|
||||
AtomToolsFramework::AtomToolsDocumentRequestBus::EventResult(absolutePath, documentId, &AtomToolsFramework::AtomToolsDocumentRequestBus::Events::GetAbsolutePath);
|
||||
if (!absolutePath.empty())
|
||||
{
|
||||
m_pathToSelect = absolutePath;
|
||||
AzFramework::StringFunc::Path::Normalize(m_pathToSelect);
|
||||
m_ui->m_assetBrowserTreeViewWidget->SelectFileAtPath(m_pathToSelect);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ShaderManagementConsole
|
||||
|
||||
#include <Window/moc_ShaderManagementConsoleBrowserWidget.cpp>
|
||||
+12
-5
@@ -6,15 +6,17 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
#include <AtomToolsFramework/Util/Util.h>
|
||||
#include <AzCore/Name/Name.h>
|
||||
#include <AzQtComponents/Components/WindowDecorationWrapper.h>
|
||||
#include <Document/ShaderManagementConsoleDocumentRequestBus.h>
|
||||
#include <Window/ShaderManagementConsoleWindow.h>
|
||||
#include <AzCore/Utils/Utils.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <QDesktopServices>
|
||||
#include <QFileDialog>
|
||||
#include <QHeaderView>
|
||||
#include <QStandardItemModel>
|
||||
#include <QTableView>
|
||||
@@ -39,10 +41,6 @@ namespace ShaderManagementConsole
|
||||
|
||||
setObjectName("ShaderManagementConsoleWindow");
|
||||
|
||||
m_toolBar = new ShaderManagementConsoleToolBar(this);
|
||||
m_toolBar->setObjectName("ToolBar");
|
||||
addToolBar(m_toolBar);
|
||||
|
||||
m_assetBrowser->SetFilterState("", AZ::RPI::ShaderAsset::Group, true);
|
||||
m_assetBrowser->SetOpenHandler([](const AZStd::string& absolutePath) {
|
||||
if (AzFramework::StringFunc::Path::IsExtension(absolutePath.c_str(), AZ::RPI::ShaderVariantListSourceData::Extension))
|
||||
@@ -63,10 +61,19 @@ namespace ShaderManagementConsole
|
||||
m_actionNew->setEnabled(false);
|
||||
m_actionSaveAsChild->setVisible(false);
|
||||
m_actionSaveAsChild->setEnabled(false);
|
||||
m_actionSaveAll->setVisible(false);
|
||||
m_actionSaveAll->setEnabled(false);
|
||||
|
||||
OnDocumentOpened(AZ::Uuid::CreateNull());
|
||||
}
|
||||
|
||||
bool ShaderManagementConsoleWindow::GetOpenDocumentParams(AZStd::string& openPath)
|
||||
{
|
||||
openPath = QFileDialog::getOpenFileName(
|
||||
this, tr("Open Document"), AZ::Utils::GetProjectPath().c_str(), tr("Files (*.%1)").arg(AZ::RPI::ShaderVariantListSourceData::Extension)).toUtf8().constData();
|
||||
return !openPath.empty();
|
||||
}
|
||||
|
||||
QWidget* ShaderManagementConsoleWindow::CreateDocumentTabView(const AZ::Uuid& documentId)
|
||||
{
|
||||
AZStd::unordered_set<AZStd::string> optionNames;
|
||||
|
||||
+1
-3
@@ -14,7 +14,6 @@
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentMainWindow.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <Window/ToolBar/ShaderManagementConsoleToolBar.h>
|
||||
#include <QStandardItemModel>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
#endif
|
||||
@@ -36,8 +35,7 @@ namespace ShaderManagementConsole
|
||||
~ShaderManagementConsoleWindow() = default;
|
||||
|
||||
protected:
|
||||
bool GetOpenDocumentParams(AZStd::string& openPath) override;
|
||||
QWidget* CreateDocumentTabView(const AZ::Uuid& documentId) override;
|
||||
|
||||
ShaderManagementConsoleToolBar* m_toolBar = {};
|
||||
};
|
||||
} // namespace ShaderManagementConsole
|
||||
|
||||
-206
@@ -1,206 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AssetDatabase/AssetDatabaseConnection.h>
|
||||
#include <Atom/RPI.Edit/Common/AssetUtils.h>
|
||||
#include <Atom/RPI.Edit/Common/JsonUtils.h>
|
||||
#include <Atom/RPI.Public/Material/Material.h>
|
||||
#include <Atom/RPI.Reflect/Asset/AssetUtils.h>
|
||||
#include <AtomToolsFramework/Document/AtomToolsDocumentSystemRequestBus.h>
|
||||
#include <AzCore/RTTI/BehaviorContext.h>
|
||||
#include <AzCore/Serialization/EditContext.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/UI/UICore/QWidgetSavedState.h>
|
||||
#include <Window/ShaderManagementConsoleWindow.h>
|
||||
#include <Window/ShaderManagementConsoleWindowComponent.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QMessageBox>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
void ShaderManagementConsoleWindowComponent::Reflect(AZ::ReflectContext* context)
|
||||
{
|
||||
if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
|
||||
{
|
||||
serialize->Class<ShaderManagementConsoleWindowComponent, AZ::Component>()
|
||||
->Version(0);
|
||||
}
|
||||
|
||||
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
|
||||
{
|
||||
behaviorContext->EBus<ShaderManagementConsoleRequestBus>("ShaderManagementConsoleRequestBus")
|
||||
->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
|
||||
->Attribute(AZ::Script::Attributes::Category, "Editor")
|
||||
->Attribute(AZ::Script::Attributes::Module, "shadermanagementconsole")
|
||||
->Event("GetSourceAssetInfo", &ShaderManagementConsoleRequestBus::Events::GetSourceAssetInfo)
|
||||
->Event("FindMaterialAssetsUsingShader", &ShaderManagementConsoleRequestBus::Events::FindMaterialAssetsUsingShader )
|
||||
->Event("GetMaterialInstanceShaderItems", &ShaderManagementConsoleRequestBus::Events::GetMaterialInstanceShaderItems)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
|
||||
{
|
||||
required.push_back(AZ_CRC_CE("AssetBrowserService"));
|
||||
required.push_back(AZ_CRC_CE("PropertyManagerService"));
|
||||
required.push_back(AZ_CRC_CE("SourceControlService"));
|
||||
required.push_back(AZ_CRC_CE("AtomToolsMainWindowSystemService"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
|
||||
{
|
||||
provided.push_back(AZ_CRC_CE("ShaderManagementConsoleWindowService"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
|
||||
{
|
||||
incompatible.push_back(AZ_CRC_CE("ShaderManagementConsoleWindowService"));
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::Init()
|
||||
{
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::Activate()
|
||||
{
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusConnect();
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusConnect();
|
||||
ShaderManagementConsoleRequestBus::Handler::BusConnect();
|
||||
AzToolsFramework::SourceControlConnectionRequestBus::Broadcast(&AzToolsFramework::SourceControlConnectionRequests::EnableSourceControl, true);
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::Deactivate()
|
||||
{
|
||||
ShaderManagementConsoleRequestBus::Handler::BusDisconnect();
|
||||
AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler::BusDisconnect();
|
||||
AzToolsFramework::EditorWindowRequestBus::Handler::BusDisconnect();
|
||||
|
||||
m_window.reset();
|
||||
}
|
||||
|
||||
QWidget* ShaderManagementConsoleWindowComponent::GetAppMainWindow()
|
||||
{
|
||||
return m_window.get();
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::CreateMainWindow()
|
||||
{
|
||||
m_assetBrowserInteractions.reset(aznew ShaderManagementConsoleBrowserInteractions);
|
||||
|
||||
m_window.reset(aznew ShaderManagementConsoleWindow);
|
||||
m_window->show();
|
||||
}
|
||||
|
||||
void ShaderManagementConsoleWindowComponent::DestroyMainWindow()
|
||||
{
|
||||
m_window.reset();
|
||||
}
|
||||
|
||||
AZ::Data::AssetInfo ShaderManagementConsoleWindowComponent::GetSourceAssetInfo(const AZStd::string& sourceAssetFileName)
|
||||
{
|
||||
bool result = false;
|
||||
AZ::Data::AssetInfo assetInfo;
|
||||
AZStd::string watchFolder;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
result, &AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath, sourceAssetFileName.c_str(), assetInfo,
|
||||
watchFolder);
|
||||
AZ_Error(nullptr, result, "Failed to get the asset info for the file: %s.", sourceAssetFileName.c_str());
|
||||
|
||||
return assetInfo;
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Data::AssetId> ShaderManagementConsoleWindowComponent::FindMaterialAssetsUsingShader(const AZStd::string& shaderFilePath)
|
||||
{
|
||||
// Collect the material types referencing the shader
|
||||
AZStd::vector<AZStd::string> materialTypeSources;
|
||||
|
||||
AzToolsFramework::AssetDatabase::AssetDatabaseConnection assetDatabaseConnection;
|
||||
assetDatabaseConnection.OpenDatabase();
|
||||
|
||||
assetDatabaseConnection.QuerySourceDependencyByDependsOnSource(
|
||||
shaderFilePath.c_str(),
|
||||
nullptr,
|
||||
AzToolsFramework::AssetDatabase::SourceFileDependencyEntry::DEP_Any,
|
||||
[&](AzToolsFramework::AssetDatabase::SourceFileDependencyEntry& sourceFileDependencyEntry) {
|
||||
AZStd::string assetExtension;
|
||||
if (AzFramework::StringFunc::Path::GetExtension(sourceFileDependencyEntry.m_source.c_str(), assetExtension, false))
|
||||
{
|
||||
if (assetExtension == "materialtype")
|
||||
{
|
||||
materialTypeSources.push_back(sourceFileDependencyEntry.m_source);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
AzToolsFramework::AssetDatabase::ProductDatabaseEntryContainer productDependencies;
|
||||
for (const auto& materialTypeSource : materialTypeSources)
|
||||
{
|
||||
bool result = false;
|
||||
AZ::Data::AssetInfo materialTypeSourceAssetInfo;
|
||||
AZStd::string watchFolder;
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(
|
||||
result,
|
||||
&AzToolsFramework::AssetSystem::AssetSystemRequest::GetSourceInfoBySourcePath,
|
||||
materialTypeSource.c_str(),
|
||||
materialTypeSourceAssetInfo,
|
||||
watchFolder
|
||||
);
|
||||
|
||||
assetDatabaseConnection.QueryDirectReverseProductDependenciesBySourceGuidSubId(
|
||||
materialTypeSourceAssetInfo.m_assetId.m_guid,
|
||||
materialTypeSourceAssetInfo.m_assetId.m_subId,
|
||||
[&](AzToolsFramework::AssetDatabase::ProductDatabaseEntry& entry) {
|
||||
AZStd::string assetExtension;
|
||||
if (AzFramework::StringFunc::Path::GetExtension(entry.m_productName.c_str(), assetExtension, false))
|
||||
{
|
||||
if (assetExtension == "azmaterial")
|
||||
{
|
||||
productDependencies.push_back(entry);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Data::AssetId> results;
|
||||
results.reserve(productDependencies.size());
|
||||
for (auto product : productDependencies)
|
||||
{
|
||||
assetDatabaseConnection.QueryCombinedByProductID(
|
||||
product.m_productID,
|
||||
[&](AzToolsFramework::AssetDatabase::CombinedDatabaseEntry& combined) {
|
||||
results.push_back({combined.m_sourceGuid, combined.m_subID});
|
||||
return false;
|
||||
},
|
||||
nullptr
|
||||
);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::RPI::ShaderCollection::Item> ShaderManagementConsoleWindowComponent::GetMaterialInstanceShaderItems(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
auto materialAsset = AZ::RPI::AssetUtils::LoadAssetById<AZ::RPI::MaterialAsset>(assetId, AZ::RPI::AssetUtils::TraceLevel::Error);
|
||||
|
||||
auto materialInstance = AZ::RPI::Material::Create(materialAsset);
|
||||
AZ_Error(nullptr, materialAsset, "Failed to get a material instance from product asset id: %s", assetId.ToString<AZStd::string>().c_str());
|
||||
|
||||
if (materialInstance != nullptr)
|
||||
{
|
||||
return AZStd::vector<AZ::RPI::ShaderCollection::Item>(materialInstance->GetShaderCollection().begin(), materialInstance->GetShaderCollection().end());
|
||||
}
|
||||
return AZStd::vector<AZ::RPI::ShaderCollection::Item>();
|
||||
}
|
||||
}
|
||||
-76
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Atom/Core/ShaderManagementConsoleRequestBus.h>
|
||||
#include <Atom/RPI.Reflect/Material/MaterialAsset.h>
|
||||
#include <AtomToolsFramework/Window/AtomToolsMainWindowFactoryRequestBus.h>
|
||||
|
||||
#include <AzCore/Component/Component.h>
|
||||
#include <AzToolsFramework/API/EditorWindowRequestBus.h>
|
||||
|
||||
#include <Window/ShaderManagementConsoleBrowserInteractions.h>
|
||||
#include <Window/ShaderManagementConsoleWindow.h>
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
//! ShaderManagementConsoleWindowComponent is the entry point for the Shader Management Console gem user interface, and is mainly
|
||||
//! used for initialization and registration of other classes, including ShaderManagementConsoleWindow.
|
||||
class ShaderManagementConsoleWindowComponent
|
||||
: public AZ::Component
|
||||
, private AtomToolsFramework::AtomToolsMainWindowFactoryRequestBus::Handler
|
||||
, private ShaderManagementConsoleRequestBus::Handler
|
||||
, private AzToolsFramework::EditorWindowRequestBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(ShaderManagementConsoleWindowComponent, "{03976F19-3C74-49FE-A15F-7D3CADBA616C}");
|
||||
|
||||
static void Reflect(AZ::ReflectContext* context);
|
||||
|
||||
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
|
||||
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
|
||||
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
|
||||
|
||||
private:
|
||||
// Temporary structure when generating shader variants.
|
||||
struct ShaderVariantListInfo
|
||||
{
|
||||
AZStd::string m_materialFileName;
|
||||
AZStd::vector<AZ::RPI::ShaderCollection::Item> m_shaderItems;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// AzToolsFramework::EditorWindowRequests::Bus::Handler
|
||||
QWidget* GetAppMainWindow() override;
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// AtomToolsMainWindowFactoryRequestBus::Handler overrides...
|
||||
void CreateMainWindow() override;
|
||||
void DestroyMainWindow() override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// ShaderManagementConsoleRequestBus::Handler overrides...
|
||||
AZ::Data::AssetInfo GetSourceAssetInfo(const AZStd::string& sourceAssetFileName) override;
|
||||
AZStd::vector<AZ::Data::AssetId> FindMaterialAssetsUsingShader(const AZStd::string& shaderFilePath) override;
|
||||
AZStd::vector<AZ::RPI::ShaderCollection::Item> GetMaterialInstanceShaderItems(const AZ::Data::AssetId& assetId) override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// AZ::Component interface implementation
|
||||
void Init() override;
|
||||
void Activate() override;
|
||||
void Deactivate() override;
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AZStd::unique_ptr<ShaderManagementConsoleWindow> m_window;
|
||||
AZStd::unique_ptr<ShaderManagementConsoleBrowserInteractions> m_assetBrowserInteractions;
|
||||
};
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <Atom/Window/ShaderManagementConsoleWindowModule.h>
|
||||
#include <Window/ShaderManagementConsoleWindowComponent.h>
|
||||
|
||||
void InitShaderManagementConsoleResources()
|
||||
{
|
||||
// Must register qt resources from other modules
|
||||
Q_INIT_RESOURCE(ShaderManagementConsole);
|
||||
Q_INIT_RESOURCE(InspectorWidget);
|
||||
Q_INIT_RESOURCE(AtomToolsAssetBrowser);
|
||||
}
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
ShaderManagementConsoleWindowModule::ShaderManagementConsoleWindowModule()
|
||||
{
|
||||
InitShaderManagementConsoleResources();
|
||||
|
||||
// Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
|
||||
m_descriptors.insert(m_descriptors.end(), {
|
||||
ShaderManagementConsoleWindowComponent::CreateDescriptor(),
|
||||
});
|
||||
}
|
||||
|
||||
AZ::ComponentTypeList ShaderManagementConsoleWindowModule::GetRequiredSystemComponents() const
|
||||
{
|
||||
return AZ::ComponentTypeList{
|
||||
azrtti_typeid<ShaderManagementConsoleWindowComponent>(),
|
||||
};
|
||||
}
|
||||
} // namespace ShaderManagementConsole
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/PlatformDef.h>
|
||||
#include <Window/ToolBar/ShaderManagementConsoleToolBar.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT
|
||||
#include <AzQtComponents/Components/Widgets/ToolBar.h>
|
||||
#include <QMenu>
|
||||
#include <QToolButton>
|
||||
#include <QAction>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
ShaderManagementConsoleToolBar::ShaderManagementConsoleToolBar(QWidget* parent)
|
||||
: QToolBar(parent)
|
||||
{
|
||||
AzQtComponents::ToolBar::addMainToolBarStyle(this);
|
||||
}
|
||||
|
||||
ShaderManagementConsoleToolBar::~ShaderManagementConsoleToolBar()
|
||||
{
|
||||
}
|
||||
} // namespace ShaderManagementConsole
|
||||
|
||||
#include <Window/ToolBar/moc_ShaderManagementConsoleToolBar.cpp>
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <QToolBar>
|
||||
#endif
|
||||
|
||||
namespace ShaderManagementConsole
|
||||
{
|
||||
class ModelComboBox;
|
||||
class LightingPresetComboBox;
|
||||
|
||||
class ShaderManagementConsoleToolBar
|
||||
: public QToolBar
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
ShaderManagementConsoleToolBar(QWidget* parent = 0);
|
||||
~ShaderManagementConsoleToolBar();
|
||||
|
||||
private:
|
||||
};
|
||||
} // namespace ShaderManagementConsole
|
||||
@@ -7,8 +7,19 @@
|
||||
#
|
||||
|
||||
set(FILES
|
||||
Source/Document/ShaderManagementConsoleDocumentRequestBus.h
|
||||
Source/Document/ShaderManagementConsoleDocument.cpp
|
||||
Source/Document/ShaderManagementConsoleDocument.h
|
||||
|
||||
Source/Window/ShaderManagementConsoleBrowserInteractions.h
|
||||
Source/Window/ShaderManagementConsoleBrowserInteractions.cpp
|
||||
Source/Window/ShaderManagementConsoleWindow.h
|
||||
Source/Window/ShaderManagementConsoleWindow.cpp
|
||||
Source/Window/ShaderManagementConsole.qrc
|
||||
|
||||
Source/main.cpp
|
||||
Source/ShaderManagementConsoleApplication.cpp
|
||||
Source/ShaderManagementConsoleApplication.h
|
||||
Source/ShaderManagementConsoleRequestBus.h
|
||||
../Scripts/GenerateShaderVariantListForMaterials.py
|
||||
)
|
||||
|
||||
-17
@@ -1,17 +0,0 @@
|
||||
#
|
||||
# Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
#
|
||||
#
|
||||
|
||||
set(FILES
|
||||
Include/Atom/Document/ShaderManagementConsoleDocumentModule.h
|
||||
Include/Atom/Document/ShaderManagementConsoleDocumentRequestBus.h
|
||||
Source/Document/ShaderManagementConsoleDocument.cpp
|
||||
Source/Document/ShaderManagementConsoleDocument.h
|
||||
Source/Document/ShaderManagementConsoleDocumentModule.cpp
|
||||
Source/Document/ShaderManagementConsoleDocumentSystemComponent.cpp
|
||||
Source/Document/ShaderManagementConsoleDocumentSystemComponent.h
|
||||
)
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
#
|
||||
# Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
#
|
||||
#
|
||||
|
||||
set(FILES
|
||||
Include/Atom/Window/ShaderManagementConsoleWindowModule.h
|
||||
Include/Atom/Core/ShaderManagementConsoleRequestBus.h
|
||||
Source/Window/ShaderManagementConsoleBrowserInteractions.h
|
||||
Source/Window/ShaderManagementConsoleBrowserInteractions.cpp
|
||||
Source/Window/ShaderManagementConsoleWindow.h
|
||||
Source/Window/ShaderManagementConsoleWindow.cpp
|
||||
Source/Window/ShaderManagementConsoleWindowModule.cpp
|
||||
Source/Window/ShaderManagementConsole.qrc
|
||||
Source/Window/ShaderManagementConsoleWindowComponent.h
|
||||
Source/Window/ShaderManagementConsoleWindowComponent.cpp
|
||||
Source/Window/ToolBar/ShaderManagementConsoleToolBar.h
|
||||
Source/Window/ToolBar/ShaderManagementConsoleToolBar.cpp
|
||||
)
|
||||
Reference in New Issue
Block a user