diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/CMakeLists.txt b/Gems/Atom/Tools/AtomToolsFramework/Code/CMakeLists.txt index fb4750ce93..4cd6ad8182 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/CMakeLists.txt +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/CMakeLists.txt @@ -33,6 +33,7 @@ ly_add_target( AZ::AzQtComponents 3rdParty::Qt::Core 3rdParty::Qt::Gui + 3rdParty::Qt::Network 3rdParty::Qt::Widgets 3rdParty::Python Gem::Atom_RPI.Edit diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalServer.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalServer.h new file mode 100644 index 0000000000..4482566113 --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalServer.h @@ -0,0 +1,56 @@ +/* + * 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 + +#if !defined(Q_MOC_RUN) +#include +#include +#include +#include +#include +#endif + +namespace AtomToolsFramework +{ + //! A named local server that will manage connections and forward recieved data + class LocalServer : public QObject + { + Q_OBJECT + public: + LocalServer(); + ~LocalServer(); + + //! Start a named local server + bool Connect(const QString& serverName); + + //! Stop the server + void Disconnect(); + + //! Get server status + bool IsConnected() const; + + using ReadHandler = AZStd::function; + + //! Set a handler that recieved data will be forwarded to + void SetReadHandler(ReadHandler handler); + + private: + void AddConnection(QLocalSocket* connection); + void ReadFromConnection(QLocalSocket* connection); + void DeleteConnection(QLocalSocket* connection); + + QString m_serverName; + QLocalServer m_server; + ReadHandler m_readHandler; + }; +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalSocket.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalSocket.h new file mode 100644 index 0000000000..4eb4d533ed --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Communication/LocalSocket.h @@ -0,0 +1,45 @@ +/* + * 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 + +#if !defined(Q_MOC_RUN) +#include +#endif + +namespace AtomToolsFramework +{ + //! LocalSocket enables interprocess communication by establ;ishing a connection and sending data to a LocalServer + class LocalSocket : public QObject + { + Q_OBJECT + public: + LocalSocket(); + ~LocalSocket(); + + //! Attempt to connect to a named local server + bool Connect(const QString& serverName); + + //! Sever connection from server + void Disconnect(); + + //! Get the sockets connection status + bool IsConnected() const; + + //! Send a stream of data to the connected local server + bool Send(const QByteArray& buffer); + + private: + QString m_serverName; + QLocalSocket m_socket; + }; +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalServer.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalServer.cpp new file mode 100644 index 0000000000..6f26b00c4f --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalServer.cpp @@ -0,0 +1,108 @@ +/* + * 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 +#include +#include + +namespace AtomToolsFramework +{ + LocalServer::LocalServer() + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Creating local server\n"); + m_server.setSocketOptions(QLocalServer::WorldAccessOption); + + QObject::connect(&m_server, &QLocalServer::newConnection, this, [this]() { AddConnection(m_server.nextPendingConnection()); }); + } + + LocalServer::~LocalServer() + { + Disconnect(); + } + + bool LocalServer::Connect(const QString& serverName) + { + Disconnect(); + + m_serverName = serverName; + + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Starting: %s\n", m_serverName.toUtf8().constData()); + if (m_server.listen(m_serverName)) + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Started: %s\n", m_serverName.toUtf8().constData()); + return true; + } + + if (m_server.serverError() == QAbstractSocket::AddressInUseError) + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Restarting: %s\n", m_serverName.toUtf8().constData()); + Disconnect(); + + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Starting: %s\n", m_serverName.toUtf8().constData()); + if (m_server.listen(m_serverName)) + { + return true; + } + } + + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Starting failed: %s\n", m_serverName.toUtf8().constData()); + Disconnect(); + return false; + } + + void LocalServer::Disconnect() + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Disconnecting: %s\n", m_serverName.toUtf8().constData()); + QLocalServer::removeServer(m_serverName); + } + + bool LocalServer::IsConnected() const + { + return m_server.isListening(); + } + + void LocalServer::SetReadHandler(LocalServer::ReadHandler handler) + { + m_readHandler = handler; + } + + void LocalServer::AddConnection(QLocalSocket* connection) + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Connection added: %s\n", m_serverName.toUtf8().constData()); + QObject::connect(connection, &QLocalSocket::readyRead, this, [this, connection]() { ReadFromConnection(connection); }); + QObject::connect(connection, &QLocalSocket::disconnected, this, [this, connection]() { DeleteConnection(connection); }); + } + + void LocalServer::ReadFromConnection(QLocalSocket* connection) + { + if (connection) + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Data received: %s\n", m_serverName.toUtf8().constData()); + QByteArray buffer = connection->readAll(); + if (m_readHandler) + { + m_readHandler(buffer); + } + } + } + + void LocalServer::DeleteConnection(QLocalSocket* connection) + { + if (connection) + { + AZ_TracePrintf("AtomToolsFramework::LocalServer", "Deleting connection: %s\n", m_serverName.toUtf8().constData()); + connection->deleteLater(); + } + } +} // namespace AtomToolsFramework + +#include diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalSocket.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalSocket.cpp new file mode 100644 index 0000000000..020998bf1a --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Communication/LocalSocket.cpp @@ -0,0 +1,86 @@ +/* + * 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 +#include +#include +#include + +namespace AtomToolsFramework +{ + LocalSocket::LocalSocket() + { + } + + LocalSocket::~LocalSocket() + { + Disconnect(); + } + + bool LocalSocket::Connect(const QString& serverName) + { + Disconnect(); + + m_serverName = serverName; + + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Connecting to: %s\n", m_serverName.toUtf8().constData()); + m_socket.connectToServer(m_serverName); + + if (IsConnected()) + { + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Waiting for connection to: %s\n", m_serverName.toUtf8().constData()); + if (m_socket.waitForConnected()) + { + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Connected to: %s\n", m_serverName.toUtf8().constData()); + return true; + } + } + + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Connecting failed: %s\n", m_serverName.toUtf8().constData()); + Disconnect(); + return false; + } + + void LocalSocket::Disconnect() + { + if (IsConnected()) + { + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Disconnecting from: %s\n", m_serverName.toUtf8().constData()); + m_socket.disconnectFromServer(); + m_socket.waitForDisconnected(); + + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Closing socket\n"); + m_socket.close(); + } + } + + bool LocalSocket::IsConnected() const + { + return m_socket.isOpen(); + } + + bool LocalSocket::Send(const QByteArray& buffer) + { + if (IsConnected()) + { + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Sending data to: %s\n", m_serverName.toUtf8().constData()); + m_socket.write(buffer); + + AZ_TracePrintf("AtomToolsFramework::LocalSocket", "Waiting for write to: %s\n", m_serverName.toUtf8().constData()); + m_socket.waitForBytesWritten(); + return true; + } + return false; + } +} // namespace AtomToolsFramework + +#include diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index e8539711f7..d8ceccc724 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -10,6 +10,8 @@ # set(FILES + Include/AtomToolsFramework/Communication/LocalServer.h + Include/AtomToolsFramework/Communication/LocalSocket.h Include/AtomToolsFramework/Debug/TraceRecorder.h Include/AtomToolsFramework/DynamicProperty/DynamicProperty.h Include/AtomToolsFramework/DynamicProperty/DynamicPropertyGroup.h @@ -22,6 +24,8 @@ set(FILES Include/AtomToolsFramework/Util/MaterialPropertyUtil.h Include/AtomToolsFramework/Util/Util.h Include/AtomToolsFramework/Viewport/RenderViewportWidget.h + Source/Communication/LocalServer.cpp + Source/Communication/LocalSocket.cpp Source/Debug/TraceRecorder.cpp Source/DynamicProperty/DynamicProperty.cpp Source/DynamicProperty/DynamicPropertyGroup.cpp diff --git a/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt b/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt index 40d6a8f30a..134f605200 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt +++ b/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt @@ -93,6 +93,7 @@ ly_add_target( ly_add_target( NAME MaterialEditor EXECUTABLE NAMESPACE Gem + AUTOMOC FILES_CMAKE materialeditor_files.cmake Source/Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentModule.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentModule.cpp index a7aecf0b1f..b1a795b9f9 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentModule.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentModule.cpp @@ -13,7 +13,6 @@ #include #include -#include #include #include @@ -32,7 +31,6 @@ namespace MaterialEditor return AZ::ComponentTypeList{ azrtti_typeid(), azrtti_typeid(), - azrtti_typeid(), }; } } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp index 2fd1aac211..dbb1d18e49 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp @@ -109,7 +109,6 @@ namespace MaterialEditor void MaterialDocumentSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { - required.push_back(AZ_CRC("TargetManagerService", 0x6d5708bc)); required.push_back(AZ_CRC("AssetProcessorToolsConnection", 0x734669bc)); required.push_back(AZ_CRC("AssetDatabaseService", 0x3abf5601)); required.push_back(AZ_CRC("PropertyManagerService", 0x63a3d7ad)); @@ -135,31 +134,16 @@ namespace MaterialEditor m_documentMap.clear(); MaterialDocumentSystemRequestBus::Handler::BusConnect(); MaterialDocumentNotificationBus::Handler::BusConnect(); - AzFramework::TmMsgBus::Handler::BusConnect(AZ_CRC("OpenInMaterialEditor", 0x9f92aac8)); } void MaterialDocumentSystemComponent::Deactivate() { AZ::TickBus::Handler::BusDisconnect(); - AzFramework::TmMsgBus::Handler::BusDisconnect(); MaterialDocumentNotificationBus::Handler::BusDisconnect(); MaterialDocumentSystemRequestBus::Handler::BusDisconnect(); m_documentMap.clear(); } - void MaterialDocumentSystemComponent::OnReceivedMsg(AzFramework::TmMsgPtr msg) - { - if (msg->GetId() == AZ_CRC("OpenInMaterialEditor", 0x9f92aac8)) - { - const char* documentPath = reinterpret_cast(msg->GetCustomBlob()); - MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, documentPath); - } - else - { - AZ_Assert(false, "We received a message of an unrecognized class type!"); - } - } - AZ::Uuid MaterialDocumentSystemComponent::CreateDocument() { auto document = AZStd::make_unique(); diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h index b6c541421d..4b0ee424a7 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -35,7 +34,6 @@ namespace MaterialEditor class MaterialDocumentSystemComponent : public AZ::Component , private AZ::TickBus::Handler - , private AzFramework::TmMsgBus::Handler , private MaterialDocumentNotificationBus::Handler , private MaterialDocumentSystemRequestBus::Handler { @@ -72,11 +70,6 @@ namespace MaterialEditor void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; //////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // AzFramework::TmMsgBus::Handler overrides... - void OnReceivedMsg(AzFramework::TmMsgPtr msg) override; - ////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// // MaterialDocumentSystemRequestBus::Handler overrides... AZ::Uuid CreateDocument() override; diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp index 66be1c23bb..ea82210814 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.cpp @@ -90,6 +90,14 @@ namespace MaterialEditor }); } + MaterialEditorApplication::~MaterialEditorApplication() + { + AzToolsFramework::EditorPythonConsoleNotificationBus::Handler::BusDisconnect(); + AzToolsFramework::AssetDatabase::AssetDatabaseRequestsBus::Handler::BusDisconnect(); + MaterialEditorWindowNotificationBus::Handler::BusDisconnect(); + AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); + } + void MaterialEditorApplication::CreateReflectionManager() { Application::CreateReflectionManager(); @@ -299,12 +307,12 @@ namespace MaterialEditor return false; } - void MaterialEditorApplication::ProcessCommandLine() + void MaterialEditorApplication::ProcessCommandLine(const AZ::CommandLine& commandLine) { const AZStd::string timeoputSwitchName = "timeout"; - if (m_commandLine.HasSwitch(timeoputSwitchName)) + if (commandLine.HasSwitch(timeoputSwitchName)) { - const AZStd::string& timeoutValue = m_commandLine.GetSwitchValue(timeoputSwitchName, 0); + const AZStd::string& timeoutValue = commandLine.GetSwitchValue(timeoputSwitchName, 0); const uint32_t timeoutInMs = atoi(timeoutValue.c_str()); AZ_Printf("MaterialEditor", "Timeout scheduled, shutting down in %u ms", timeoutInMs); QTimer::singleShot(timeoutInMs, [this] { @@ -315,10 +323,10 @@ namespace MaterialEditor // Process command line options for running one or more python scripts on startup const AZStd::string runPythonScriptSwitchName = "runpython"; - size_t runPythonScriptCount = m_commandLine.GetNumSwitchValues(runPythonScriptSwitchName); + size_t runPythonScriptCount = commandLine.GetNumSwitchValues(runPythonScriptSwitchName); for (size_t runPythonScriptIndex = 0; runPythonScriptIndex < runPythonScriptCount; ++runPythonScriptIndex) { - const AZStd::string runPythonScriptPath = m_commandLine.GetSwitchValue(runPythonScriptSwitchName, runPythonScriptIndex); + const AZStd::string runPythonScriptPath = commandLine.GetSwitchValue(runPythonScriptSwitchName, runPythonScriptIndex); AZStd::vector runPythonArgs; AZ_Printf("MaterialEditor", "Launching script: %s", runPythonScriptPath.c_str()); @@ -329,17 +337,17 @@ namespace MaterialEditor } // Process command line options for opening one or more material documents on startup - size_t openDocumentCount = m_commandLine.GetNumMiscValues(); + size_t openDocumentCount = commandLine.GetNumMiscValues(); for (size_t openDocumentIndex = 0; openDocumentIndex < openDocumentCount; ++openDocumentIndex) { - const AZStd::string openDocumentPath = m_commandLine.GetMiscValue(openDocumentIndex); + const AZStd::string openDocumentPath = commandLine.GetMiscValue(openDocumentIndex); AZ_Printf("MaterialEditor", "Opening document: %s", openDocumentPath.c_str()); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::OpenDocument, openDocumentPath); } const AZStd::string exitAfterCommandsSwitchName = "exitaftercommands"; - if (m_commandLine.HasSwitch(exitAfterCommandsSwitchName)) + if (commandLine.HasSwitch(exitAfterCommandsSwitchName)) { ExitMainLoop(); } @@ -409,9 +417,50 @@ namespace MaterialEditor bool MaterialEditorApplication::LaunchDiscoveryService() { - const QStringList arguments = { "-fail_silently" }; + // Determine if this is the first launch of the tool by attempting to connect to a running server + if (m_socket.Connect(QApplication::applicationName())) + { + // If the server was located, the application is already running. + // Forward commandline options to other application instance. + QByteArray buffer; + buffer.append("ProcessCommandLine:"); + for (int argi = 1; argi < m_argC; ++argi) + { + buffer.append(QString(m_argV[argi]).append("\n").toUtf8()); + } + m_socket.Send(buffer); + m_socket.Disconnect(); + return false; + } - return AtomToolsFramework::LaunchTool("GridHub", AZ_TRAIT_MATERIALEDITOR_EXT, arguments); + // Setup server to handle basic commands + m_server.SetReadHandler([this](const QByteArray& buffer) { + // Handle commmand line params from connected socket + if (buffer.startsWith("ProcessCommandLine:")) + { + // Remove header and parse commands + AZStd::string params(buffer.data(), buffer.size()); + params = params.substr(strlen("ProcessCommandLine:")); + + AZStd::vector tokens; + AZ::StringFunc::Tokenize(params, tokens, "\n"); + + if (!tokens.empty()) + { + AZ::CommandLine commandLine; + commandLine.Parse(tokens); + ProcessCommandLine(commandLine); + } + } + }); + + // Launch local server + if (!m_server.Connect(QApplication::applicationName())) + { + return false; + } + + return true; } void MaterialEditorApplication::StartInternal() @@ -421,10 +470,14 @@ namespace MaterialEditor return; } - //[GFX TODO][ATOM-415] Try to factor out some of this stuff with AtomSampleViewerApplication - WriteStartupLog(); + if (!LaunchDiscoveryService()) + { + ExitMainLoop(); + return; + } + AzToolsFramework::AssetDatabase::AssetDatabaseRequestsBus::Handler::BusConnect(); AzToolsFramework::AssetBrowser::AssetDatabaseLocationNotificationBus::Broadcast(&AzToolsFramework::AssetBrowser::AssetDatabaseLocationNotifications::OnDatabaseInitialized); @@ -434,8 +487,6 @@ namespace MaterialEditor LoadSettings(); - LaunchDiscoveryService(); - MaterialEditorWindowNotificationBus::Handler::BusConnect(); MaterialEditor::MaterialEditorWindowFactoryRequestBus::Broadcast( @@ -450,7 +501,7 @@ namespace MaterialEditor } // Delay execution of commands and scripts post initialization - QTimer::singleShot(0, [this]() { ProcessCommandLine(); }); + QTimer::singleShot(0, [this]() { ProcessCommandLine(m_commandLine); }); } bool MaterialEditorApplication::GetAssetDatabaseLocation(AZStd::string& result) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h index 63ccbf3cec..2c66fd7c16 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/MaterialEditorApplication.h @@ -12,22 +12,20 @@ #pragma once - +#include +#include +#include +#include #include #include -#include #include - +#include #include #include #include - #include #include -#include -#include - #include #include @@ -51,7 +49,7 @@ namespace MaterialEditor using Base = AzFramework::Application; MaterialEditorApplication(int* argc, char*** argv); - virtual ~MaterialEditorApplication() = default; + virtual ~MaterialEditorApplication(); ////////////////////////////////////////////////////////////////////////// // AzFramework::Application @@ -110,7 +108,7 @@ namespace MaterialEditor void CompileCriticalAssets(); - void ProcessCommandLine(); + void ProcessCommandLine(const AZ::CommandLine& commandLine); void WriteStartupLog(); void LoadSettings(); @@ -138,5 +136,8 @@ namespace MaterialEditor bool m_activatedLocalUserSettings = false; QTimer m_timer; + + AtomToolsFramework::LocalSocket m_socket; + AtomToolsFramework::LocalServer m_server; }; } // namespace MaterialEditor diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/main.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/main.cpp index 92d76c4373..8c55adba46 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/main.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/main.cpp @@ -1,30 +1,31 @@ /* -* 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. -* -*/ + * 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. + * + */ + +#if !defined(Q_MOC_RUN) +#include #include #include -#include -#include #include -#include #include -#include -#include +#include +#include #include +#include +#include -#include #include - -#include +#include +#endif int main(int argc, char** argv) { @@ -45,15 +46,16 @@ int main(int argc, char** argv) AzQtComponents::Utilities::HandleDpiAwareness(AzQtComponents::Utilities::SystemDpiAware); MaterialEditor::MaterialEditorApplication app(&argc, &argv); + + auto globalEventFilter = new AzQtComponents::GlobalEventFilter(&app); + app.installEventFilter(globalEventFilter); + AZ::IO::FixedMaxPath engineRootPath; if (auto settingsRegistry = AZ::SettingsRegistry::Get(); settingsRegistry != nullptr) { settingsRegistry->Get(engineRootPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_EngineRootFolder); } - auto globalEventFilter = new AzQtComponents::GlobalEventFilter(&app); - app.installEventFilter(globalEventFilter); - AzQtComponents::StyleManager styleManager(&app); styleManager.initialize(&app, engineRootPath); diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentModule.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentModule.cpp index f2fd70c0e6..50b2cbb53a 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentModule.cpp +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentModule.cpp @@ -13,7 +13,6 @@ #include #include -#include #include #include @@ -32,7 +31,6 @@ namespace ShaderManagementConsole return AZ::ComponentTypeList{ azrtti_typeid(), azrtti_typeid(), - azrtti_typeid(), }; } } diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.cpp b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.cpp index f0d72c61c3..31dabe2bac 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.cpp +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.cpp @@ -105,7 +105,6 @@ namespace ShaderManagementConsole void ShaderManagementConsoleDocumentSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) { - required.push_back(AZ_CRC("TargetManagerService", 0x6d5708bc)); required.push_back(AZ_CRC("AssetProcessorToolsConnection", 0x734669bc)); required.push_back(AZ_CRC("AssetDatabaseService", 0x3abf5601)); required.push_back(AZ_CRC("PropertyManagerService", 0x63a3d7ad)); @@ -130,13 +129,11 @@ namespace ShaderManagementConsole { m_documentMap.clear(); ShaderManagementConsoleDocumentSystemRequestBus::Handler::BusConnect(); - AzFramework::TmMsgBus::Handler::BusConnect(AZ_CRC("OpenInShaderManagementConsole", 0x9f92aac8)); } void ShaderManagementConsoleDocumentSystemComponent::Deactivate() { ShaderManagementConsoleDocumentSystemRequestBus::Handler::BusDisconnect(); - AzFramework::TmMsgBus::Handler::BusDisconnect(); m_documentMap.clear(); } @@ -159,19 +156,6 @@ namespace ShaderManagementConsole return m_documentMap.erase(documentId) != 0; } - void ShaderManagementConsoleDocumentSystemComponent::OnReceivedMsg(AzFramework::TmMsgPtr msg) - { - if (msg->GetId() == AZ_CRC("OpenInShaderManagementConsole", 0x9f92aac8)) - { - const char* documentPath = reinterpret_cast(msg->GetCustomBlob()); - ShaderManagementConsoleDocumentSystemRequestBus::Broadcast(&ShaderManagementConsoleDocumentSystemRequestBus::Events::OpenDocument, documentPath); - } - else - { - AZ_Assert(false, "We received a message of an unrecognized class type!"); - } - } - AZ::Uuid ShaderManagementConsoleDocumentSystemComponent::OpenDocument(AZStd::string_view path) { return OpenDocumentImpl(path, true); diff --git a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.h b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.h index 60c205aa72..2bd7306b8b 100644 --- a/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.h +++ b/Gems/Atom/Tools/ShaderManagementConsole/Code/Source/Document/ShaderManagementConsoleDocumentSystemComponent.h @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -30,7 +29,6 @@ namespace ShaderManagementConsole //! ShaderManagementConsoleDocumentSystemComponent is the central component of the Shader Management Console Core gem class ShaderManagementConsoleDocumentSystemComponent : public AZ::Component - , private AzFramework::TmMsgBus::Handler , private ShaderManagementConsoleDocumentSystemRequestBus::Handler { public: @@ -55,11 +53,6 @@ namespace ShaderManagementConsole void Deactivate() override; //////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // TmMsgBus::Handler overrides... - void OnReceivedMsg(AzFramework::TmMsgPtr msg) override; - ////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// // ShaderManagementConsoleDocumentSystemRequestBus::Handler overrides... AZ::Uuid CreateDocument() override; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp index 94dfb39419..c32f124456 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp @@ -93,7 +93,6 @@ namespace AZ void EditorMaterialSystemComponent::Activate() { - AzFramework::TargetManagerClient::Bus::Handler::BusConnect(); EditorMaterialSystemComponentRequestBus::Handler::BusConnect(); AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect(); @@ -105,7 +104,6 @@ namespace AZ void EditorMaterialSystemComponent::Deactivate() { - AzFramework::TargetManagerClient::Bus::Handler::BusDisconnect(); EditorMaterialSystemComponentRequestBus::Handler::BusDisconnect(); AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); @@ -123,36 +121,11 @@ namespace AZ void EditorMaterialSystemComponent::OpenInMaterialEditor(const AZStd::string& sourcePath) { - if (m_materialEditorTarget.IsValid()) - { - AzFramework::TmMsg openDocumentMsg(AZ_CRC("OpenInMaterialEditor", 0x9f92aac8)); - openDocumentMsg.AddCustomBlob(sourcePath.c_str(), sourcePath.size() + 1); - AzFramework::TargetManager::Bus::Broadcast(&AzFramework::TargetManager::SendTmMessage, m_materialEditorTarget, openDocumentMsg); - } - else - { - AZ_TracePrintf("MaterialComponent", "Launching Material Editor"); + AZ_TracePrintf("MaterialComponent", "Launching Material Editor"); - QStringList arguments; - arguments.append(sourcePath.c_str()); - AtomToolsFramework::LaunchTool("MaterialEditor", ".exe", arguments); - } - } - - void EditorMaterialSystemComponent::TargetJoinedNetwork(AzFramework::TargetInfo info) - { - if (AZ::StringFunc::Equal(info.GetDisplayName(), "MaterialEditor")) - { - m_materialEditorTarget = info; - } - } - - void EditorMaterialSystemComponent::TargetLeftNetwork(AzFramework::TargetInfo info) - { - if (AZ::StringFunc::Equal(info.GetDisplayName(), "MaterialEditor")) - { - m_materialEditorTarget = {}; - } + QStringList arguments; + arguments.append(sourcePath.c_str()); + AtomToolsFramework::LaunchTool("MaterialEditor", ".exe", arguments); } void EditorMaterialSystemComponent::OnApplicationAboutToStop() diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h index 09ad1c1b9c..cb1aac9163 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -32,7 +31,6 @@ namespace AZ class EditorMaterialSystemComponent : public AZ::Component , private EditorMaterialSystemComponentRequestBus::Handler - , private AzFramework::TargetManagerClient::Bus::Handler , private AzFramework::ApplicationLifecycleEvents::Bus::Handler , public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler , public AzToolsFramework::EditorMenuNotificationBus::Handler @@ -57,10 +55,6 @@ namespace AZ //! EditorMaterialSystemComponentRequestBus::Handler overrides... void OpenInMaterialEditor(const AZStd::string& sourcePath) override; - //! AzFramework::TargetManagerClient::Bus::Handler overrides... - void TargetJoinedNetwork(AzFramework::TargetInfo info) override; - void TargetLeftNetwork(AzFramework::TargetInfo info) override; - // AzFramework::ApplicationLifecycleEvents overrides... void OnApplicationAboutToStop() override; @@ -74,9 +68,6 @@ namespace AZ void SetupThumbnails(); void TeardownThumbnails(); - // Material Editor target for interprocess communication with MaterialEditor - AzFramework::TargetInfo m_materialEditorTarget; - QAction* m_openMaterialEditorAction = nullptr; AZStd::unique_ptr m_materialBrowserInteractions;