3
0

EditorCommonFeaturesSystemComponent.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 <AzCore/Component/ComponentApplicationLifecycle.h>
  9. #include <AzCore/Serialization/EditContext.h>
  10. #include <AzCore/Serialization/EditContextConstants.inl>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. #include <AzCore/Utils/Utils.h>
  13. #include <AzFramework/API/ApplicationAPI.h>
  14. #include <AzToolsFramework/API/EditorCameraBus.h>
  15. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  16. #include <EditorCommonFeaturesSystemComponent.h>
  17. #include <SharedPreview/SharedThumbnail.h>
  18. #include <SkinnedMesh/SkinnedMeshDebugDisplay.h>
  19. #include <IEditor.h>
  20. namespace AZ
  21. {
  22. namespace Render
  23. {
  24. static IEditor* GetLegacyEditor()
  25. {
  26. IEditor* editor = nullptr;
  27. AzToolsFramework::EditorRequestBus::BroadcastResult(editor, &AzToolsFramework::EditorRequestBus::Events::GetEditor);
  28. return editor;
  29. }
  30. EditorCommonFeaturesSystemComponent::EditorCommonFeaturesSystemComponent() = default;
  31. EditorCommonFeaturesSystemComponent::~EditorCommonFeaturesSystemComponent() = default;
  32. //! Main system component for the Atom Common Feature Gem's editor/tools module.
  33. void EditorCommonFeaturesSystemComponent::Reflect(AZ::ReflectContext* context)
  34. {
  35. if (AZ::SerializeContext* serialize = azrtti_cast<AZ::SerializeContext*>(context))
  36. {
  37. serialize->Class<EditorCommonFeaturesSystemComponent, AZ::Component>()
  38. ->Version(1)
  39. ->Field("Atom Level Default Asset Path", &EditorCommonFeaturesSystemComponent::m_atomLevelDefaultAssetPath);
  40. if (AZ::EditContext* ec = serialize->GetEditContext())
  41. {
  42. ec->Class<EditorCommonFeaturesSystemComponent>("AtomEditorCommonFeaturesSystemComponent",
  43. "Configures editor- and tool-specific functionality for common render features.")
  44. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  45. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  46. ->DataElement(nullptr, &EditorCommonFeaturesSystemComponent::m_atomLevelDefaultAssetPath, "Atom Level Default Asset Path",
  47. "path to the slice the instantiate for a new Atom level")
  48. ;
  49. }
  50. }
  51. }
  52. void EditorCommonFeaturesSystemComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  53. {
  54. provided.push_back(AZ_CRC("EditorCommonFeaturesService", 0x94945c0c));
  55. }
  56. void EditorCommonFeaturesSystemComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible)
  57. {
  58. incompatible.push_back(AZ_CRC("EditorCommonFeaturesService", 0x94945c0c));
  59. }
  60. void EditorCommonFeaturesSystemComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required)
  61. {
  62. required.push_back(AZ_CRC_CE("ThumbnailerService"));
  63. required.push_back(AZ_CRC_CE("PreviewRendererSystem"));
  64. }
  65. void EditorCommonFeaturesSystemComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent)
  66. {
  67. AZ_UNUSED(dependent);
  68. }
  69. void EditorCommonFeaturesSystemComponent::Init()
  70. {
  71. }
  72. void EditorCommonFeaturesSystemComponent::Activate()
  73. {
  74. m_skinnedMeshDebugDisplay = AZStd::make_unique<SkinnedMeshDebugDisplay>();
  75. AzToolsFramework::EditorLevelNotificationBus::Handler::BusConnect();
  76. AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusConnect();
  77. if (auto settingsRegistry{ AZ::SettingsRegistry::Get() }; settingsRegistry != nullptr)
  78. {
  79. auto LifecycleCallback = [this](const AZ::SettingsRegistryInterface::NotifyEventArgs&)
  80. {
  81. SetupThumbnails();
  82. };
  83. AZ::ComponentApplicationLifecycle::RegisterHandler(*settingsRegistry, m_criticalAssetsHandler,
  84. AZStd::move(LifecycleCallback), "CriticalAssetsCompiled");
  85. }
  86. AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect();
  87. }
  88. void EditorCommonFeaturesSystemComponent::Deactivate()
  89. {
  90. AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect();
  91. m_criticalAssetsHandler = {};
  92. AzToolsFramework::EditorLevelNotificationBus::Handler::BusDisconnect();
  93. AzToolsFramework::AssetBrowser::PreviewerRequestBus::Handler::BusDisconnect();
  94. m_skinnedMeshDebugDisplay.reset();
  95. TeardownThumbnails();
  96. }
  97. void EditorCommonFeaturesSystemComponent::OnNewLevelCreated()
  98. {
  99. bool isPrefabSystemEnabled = false;
  100. AzFramework::ApplicationRequests::Bus::BroadcastResult(
  101. isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled);
  102. if (!isPrefabSystemEnabled)
  103. {
  104. AZ::Data::AssetCatalogRequestBus::BroadcastResult(
  105. m_levelDefaultSliceAssetId, &AZ::Data::AssetCatalogRequests::GetAssetIdByPath, m_atomLevelDefaultAssetPath.c_str(),
  106. azrtti_typeid<AZ::SliceAsset>(), false);
  107. if (m_levelDefaultSliceAssetId.IsValid())
  108. {
  109. AZ::Data::Asset<AZ::Data::AssetData> asset = AZ::Data::AssetManager::Instance().GetAsset<AZ::SliceAsset>(
  110. m_levelDefaultSliceAssetId, AZ::Data::AssetLoadBehavior::Default);
  111. asset.BlockUntilLoadComplete();
  112. if (asset)
  113. {
  114. AZ::Vector3 cameraPosition = AZ::Vector3::CreateZero();
  115. bool activeCameraFound = false;
  116. Camera::EditorCameraRequestBus::BroadcastResult(
  117. activeCameraFound, &Camera::EditorCameraRequestBus::Events::GetActiveCameraPosition, cameraPosition);
  118. if (activeCameraFound)
  119. {
  120. AZ::Transform worldTransform = AZ::Transform::CreateTranslation(cameraPosition);
  121. AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusConnect();
  122. IEditor* editor = GetLegacyEditor();
  123. if (editor && !editor->IsUndoSuspended())
  124. {
  125. editor->SuspendUndo();
  126. }
  127. AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast(
  128. &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::InstantiateEditorSlice, asset,
  129. worldTransform);
  130. }
  131. }
  132. }
  133. }
  134. }
  135. void EditorCommonFeaturesSystemComponent::OnSliceInstantiated(const AZ::Data::AssetId& sliceAssetId, AZ::SliceComponent::SliceInstanceAddress& sliceAddress, const AzFramework::SliceInstantiationTicket& /*ticket*/)
  136. {
  137. if (m_levelDefaultSliceAssetId == sliceAssetId)
  138. {
  139. const AZ::SliceComponent::EntityList& entities = sliceAddress.GetInstance()->GetInstantiated()->m_entities;
  140. AZStd::vector<AZ::EntityId> entityIds;
  141. entityIds.reserve(entities.size());
  142. for (const Entity* entity : entities)
  143. {
  144. entityIds.push_back(entity->GetId());
  145. }
  146. //Detach instantiated env probe entities from engine slice
  147. AzToolsFramework::SliceEditorEntityOwnershipServiceRequestBus::Broadcast(
  148. &AzToolsFramework::SliceEditorEntityOwnershipServiceRequests::DetachSliceEntities, entityIds);
  149. sliceAddress.SetInstance(nullptr);
  150. sliceAddress.SetReference(nullptr);
  151. AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusDisconnect();
  152. IEditor* editor = GetLegacyEditor();
  153. if(editor)
  154. {
  155. //save after level default slice fully instantiated
  156. editor->SaveDocument();
  157. if (editor->IsUndoSuspended())
  158. {
  159. editor->ResumeUndo();
  160. }
  161. }
  162. }
  163. }
  164. void EditorCommonFeaturesSystemComponent::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAssetId, const AzFramework::SliceInstantiationTicket& /*ticket*/)
  165. {
  166. if (m_levelDefaultSliceAssetId == sliceAssetId)
  167. {
  168. GetLegacyEditor()->ResumeUndo();
  169. AzToolsFramework::SliceEditorEntityOwnershipServiceNotificationBus::Handler::BusDisconnect();
  170. AZ_Warning("EditorCommonFeaturesSystemComponent", false, "Failed to instantiate default Atom environment slice.");
  171. }
  172. }
  173. const AzToolsFramework::AssetBrowser::PreviewerFactory* EditorCommonFeaturesSystemComponent::GetPreviewerFactory(
  174. const AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry) const
  175. {
  176. return m_previewerFactory->IsEntrySupported(entry) ? m_previewerFactory.get() : nullptr;
  177. }
  178. void EditorCommonFeaturesSystemComponent::OnApplicationAboutToStop()
  179. {
  180. TeardownThumbnails();
  181. }
  182. void EditorCommonFeaturesSystemComponent::SetupThumbnails()
  183. {
  184. using namespace AzToolsFramework::Thumbnailer;
  185. using namespace LyIntegration;
  186. ThumbnailerRequestBus::Broadcast(
  187. &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(SharedThumbnailCache));
  188. if (!m_thumbnailRenderer)
  189. {
  190. m_thumbnailRenderer = AZStd::make_unique<AZ::LyIntegration::SharedThumbnailRenderer>();
  191. }
  192. if (!m_previewerFactory)
  193. {
  194. m_previewerFactory = AZStd::make_unique<LyIntegration::SharedPreviewerFactory>();
  195. }
  196. }
  197. void EditorCommonFeaturesSystemComponent::TeardownThumbnails()
  198. {
  199. using namespace AzToolsFramework::Thumbnailer;
  200. using namespace LyIntegration;
  201. ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::UnregisterThumbnailProvider, SharedThumbnailCache::ProviderName);
  202. m_thumbnailRenderer.reset();
  203. m_previewerFactory.reset();
  204. }
  205. } // namespace Render
  206. } // namespace AZ