AssetImporterPlugin.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AssetImporterPlugin.h>
  9. #include <AssetImporterWindow.h>
  10. #include <AzCore/Component/ComponentApplication.h>
  11. #include <ImporterRootDisplay.h>
  12. #include <QtViewPaneManager.h>
  13. #include <SceneAPI/SceneCore/Events/AssetImportRequest.h>
  14. #include <SceneAPI/SceneCore/Utilities/Reporting.h>
  15. #include <LyViewPaneNames.h>
  16. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  17. AssetImporterPlugin* AssetImporterPlugin::s_instance;
  18. AssetImporterPlugin::AssetImporterPlugin(IEditor* editor)
  19. : m_editor(editor)
  20. , m_assetBrowserContextProvider()
  21. , m_sceneSerializationHandler()
  22. {
  23. s_instance = this;
  24. m_sceneUIModule = LoadSceneLibrary("SceneUI", true);
  25. m_sceneSerializationHandler.Activate();
  26. AzToolsFramework::ToolsApplicationRequestBus::Broadcast(
  27. &AzToolsFramework::ToolsApplicationRequests::CreateAndAddEntityFromComponentTags,
  28. AZStd::vector<AZ::Crc32>({ AZ::SceneAPI::Events::AssetImportRequest::GetAssetImportRequestComponentTag() }), "AssetImportersEntity");
  29. if (AZ::ReflectionEnvironment::GetReflectionManager())
  30. {
  31. AZ::ReflectionEnvironment::GetReflectionManager()->Reflect(
  32. SceneSettingsAssetImporterForScriptRequestHandler::RTTI_Type(),
  33. [](AZ::ReflectContext* context)
  34. {
  35. SceneSettingsAssetImporterForScriptRequestHandler::Reflect(context);
  36. SceneSettingsRootDisplayScriptRequestHandler::Reflect(context);
  37. });
  38. }
  39. m_requestHandler = AZStd::make_shared<SceneSettingsAssetImporterForScriptRequestHandler>();
  40. }
  41. void AssetImporterPlugin::Release()
  42. {
  43. if (m_assetImporterWindow)
  44. {
  45. delete m_assetImporterWindow;
  46. }
  47. m_sceneSerializationHandler.Deactivate();
  48. auto uninit = m_sceneUIModule->GetFunction<AZ::UninitializeDynamicModuleFunction>(AZ::UninitializeDynamicModuleFunctionName);
  49. if (uninit)
  50. {
  51. (*uninit)();
  52. }
  53. m_sceneUIModule.reset();
  54. }
  55. AZStd::unique_ptr<AZ::DynamicModuleHandle> AssetImporterPlugin::LoadSceneLibrary(const char* name, bool explicitInit)
  56. {
  57. using ReflectFunc = void(*)(AZ::SerializeContext*);
  58. AZStd::unique_ptr<AZ::DynamicModuleHandle> module = AZ::DynamicModuleHandle::Create(name);
  59. if (module)
  60. {
  61. module->Load();
  62. if (explicitInit)
  63. {
  64. // Explicitly initialize all modules. Because we're loading them twice (link time, and now-time), we need to explicitly uninit them.
  65. auto init = module->GetFunction<AZ::InitializeDynamicModuleFunction>(AZ::InitializeDynamicModuleFunctionName);
  66. if (init)
  67. {
  68. (*init)();
  69. }
  70. }
  71. ReflectFunc reflect = module->GetFunction<ReflectFunc>("Reflect");
  72. if (reflect)
  73. {
  74. (*reflect)(nullptr);
  75. }
  76. return module;
  77. }
  78. else
  79. {
  80. AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Failed to initialize library '%s'", name);
  81. return nullptr;
  82. }
  83. }
  84. QMainWindow* AssetImporterPlugin::EditImportSettings(const AZStd::string& sourceFilePath)
  85. {
  86. if (!m_assetImporterWindow)
  87. {
  88. return nullptr;
  89. }
  90. AssetImporterWindow* assetImporterWindow = qobject_cast<AssetImporterWindow*>(m_assetImporterWindow);
  91. if (!assetImporterWindow)
  92. {
  93. return nullptr;
  94. }
  95. assetImporterWindow->OpenFile(sourceFilePath);
  96. return m_assetImporterWindow;
  97. }
  98. QMainWindow* AssetImporterPlugin::OpenImportSettings()
  99. {
  100. // Can only be one asset importer window at a time
  101. if (m_assetImporterWindow)
  102. {
  103. return nullptr;
  104. }
  105. m_assetImporterWindow = new AssetImporterWindow();
  106. return m_assetImporterWindow;
  107. }
  108. bool AssetImporterPlugin::SaveBeforeClosing()
  109. {
  110. if (!m_assetImporterWindow)
  111. {
  112. return false;
  113. }
  114. AssetImporterWindow* assetImporterWindow = qobject_cast<AssetImporterWindow*>(m_assetImporterWindow);
  115. if (!assetImporterWindow)
  116. {
  117. return false;
  118. }
  119. bool canClose = assetImporterWindow->CanClose();
  120. if (canClose)
  121. {
  122. delete m_assetImporterWindow;
  123. }
  124. return !canClose;
  125. }
  126. SceneSettingsAssetImporterForScriptRequestHandler::SceneSettingsAssetImporterForScriptRequestHandler()
  127. {
  128. SceneSettingsAssetImporterForScriptRequestBus::Handler::BusConnect();
  129. }
  130. SceneSettingsAssetImporterForScriptRequestHandler ::~SceneSettingsAssetImporterForScriptRequestHandler()
  131. {
  132. SceneSettingsAssetImporterForScriptRequestBus::Handler::BusDisconnect();
  133. }
  134. void SceneSettingsAssetImporterForScriptRequestHandler::Reflect(AZ::ReflectContext* context)
  135. {
  136. if (auto* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  137. {
  138. serialize->Class<SceneSettingsAssetImporterForScriptRequestHandler>()->Version(0);
  139. }
  140. if (AZ::BehaviorContext* behavior = azrtti_cast<AZ::BehaviorContext*>(context))
  141. {
  142. behavior->EBus<SceneSettingsAssetImporterForScriptRequestBus>("SceneSettingsAssetImporterForScriptRequestBus")
  143. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
  144. ->Attribute(AZ::Script::Attributes::Module, "qt")
  145. ->Event("EditImportSettings", &SceneSettingsAssetImporterForScriptRequestBus::Events::EditImportSettings);
  146. }
  147. }
  148. AZ::u64 SceneSettingsAssetImporterForScriptRequestHandler::EditImportSettings(const AZStd::string& sourceFilePath)
  149. {
  150. QMainWindow* importSettingsWindow = AssetImporterPlugin::GetInstance()->EditImportSettings(sourceFilePath);
  151. if (!importSettingsWindow)
  152. {
  153. // There doesn't seem to be a defined invalid Qt WId, so this matches
  154. // the behavior of the QtForPythonSystemComponent.cpp, which uses a window ID of 0 if it
  155. // can't find the real window ID.
  156. return 0;
  157. }
  158. // This is a helper function, to let Python invoke the scene settings tool.
  159. // Qt objects can't be passed back to Python, so pass the ID of the window.
  160. return aznumeric_cast<AZ::u64>(importSettingsWindow->winId());
  161. }