EditorScriptCanvasComponent.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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/Asset/AssetManagerBus.h>
  9. #include <AzCore/Component/ComponentApplicationBus.h>
  10. #include <AzCore/Component/NamedEntityId.h>
  11. #include <AzCore/IO/FileIO.h>
  12. #include <AzCore/Script/ScriptSystemBus.h>
  13. #include <AzCore/Serialization/EditContext.h>
  14. #include <AzCore/Serialization/IdUtils.h>
  15. #include <AzCore/Serialization/Json/RegistrationContext.h>
  16. #include <AzCore/Serialization/Utils.h>
  17. #include <AzFramework/Asset/AssetSystemBus.h>
  18. #include <AzFramework/StringFunc/StringFunc.h>
  19. #include <AzToolsFramework/API/EditorAssetSystemAPI.h>
  20. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  21. #include <Builder/ScriptCanvasBuilder.h>
  22. #include <Core/ScriptCanvasBus.h>
  23. #include <LyViewPaneNames.h>
  24. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  25. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  26. #include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
  27. #include <ScriptCanvas/Bus/RequestBus.h>
  28. #include <ScriptCanvas/Components/EditorDeprecationData.h>
  29. #include <ScriptCanvas/Components/EditorGraph.h>
  30. #include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
  31. #include <ScriptCanvas/Components/EditorScriptCanvasComponent.h>
  32. #include <ScriptCanvas/Components/EditorUtils.h>
  33. #include <ScriptCanvas/Execution/RuntimeComponent.h>
  34. namespace ScriptCanvasEditor
  35. {
  36. EditorScriptCanvasComponent::EditorScriptCanvasComponent()
  37. : EditorScriptCanvasComponent(SourceHandle())
  38. {
  39. }
  40. EditorScriptCanvasComponent::EditorScriptCanvasComponent(const SourceHandle& sourceHandle)
  41. : m_configuration(sourceHandle)
  42. {
  43. }
  44. EditorScriptCanvasComponent::~EditorScriptCanvasComponent()
  45. {
  46. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
  47. }
  48. void EditorScriptCanvasComponent::Activate()
  49. {
  50. using namespace AzToolsFramework;
  51. EditorComponentBase::Activate();
  52. auto entityId = GetEntityId();
  53. if (entityId.IsValid())
  54. {
  55. EditorScriptCanvasComponentRequestBus::Handler::BusConnect(entityId);
  56. }
  57. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect();
  58. m_handlerSourceCompiled = m_configuration.ConnectToSourceCompiled([this](const Configuration&)
  59. {
  60. this->InvalidatePropertyDisplay(AzToolsFramework::Refresh_EntireTree);
  61. });
  62. m_handlerSourcePropertiesChanged = m_configuration.ConnectToPropertiesChanged([this](const Configuration&)
  63. {
  64. this->SetDirty();
  65. });
  66. m_configuration.Refresh();
  67. InvalidatePropertyDisplay(AzToolsFramework::Refresh_EntireTree);
  68. }
  69. void EditorScriptCanvasComponent::Deactivate()
  70. {
  71. m_handlerSourceCompiled.Disconnect();
  72. EditorComponentBase::Deactivate();
  73. EditorScriptCanvasComponentRequestBus::Handler::BusDisconnect();
  74. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
  75. }
  76. void EditorScriptCanvasComponent::BuildGameEntity(AZ::Entity* gameEntity)
  77. {
  78. if (!m_configuration.HasSource())
  79. {
  80. return;
  81. }
  82. if (auto buildVariableOptional = m_configuration.CompileLatest())
  83. {
  84. auto runtimeComponent = gameEntity->CreateComponent<ScriptCanvas::RuntimeComponent>();
  85. runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(*buildVariableOptional));
  86. }
  87. else
  88. {
  89. AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using source: %s"
  90. , m_configuration.GetSource().ToString().c_str());
  91. }
  92. }
  93. void EditorScriptCanvasComponent::Reflect(AZ::ReflectContext* context)
  94. {
  95. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  96. {
  97. serializeContext->Class<EditorScriptCanvasComponent, EditorComponentBase>()
  98. ->Version(Version::Current, &Deprecated::EditorScriptCanvasComponentVersionConverter::Convert)
  99. ->Field("configuration", &EditorScriptCanvasComponent::m_configuration)
  100. ;
  101. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  102. {
  103. editContext->Class<EditorScriptCanvasComponent>("Script Canvas", "The Script Canvas component allows you to add a Script Canvas asset to a component, and have it execute on the specified entity.")
  104. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  105. ->Attribute(AZ::Edit::Attributes::Category, "Scripting")
  106. ->Attribute(AZ::Edit::Attributes::Icon, "Icons/ScriptCanvas/ScriptCanvas.svg")
  107. ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/ScriptCanvas/Viewport/ScriptCanvas.svg")
  108. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  109. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
  110. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("UI"))
  111. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Level"))
  112. ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://www.o3de.org/docs/user-guide/components/reference/scripting/script-canvas/")
  113. ->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_configuration, "Configuration", "Script Selection and Property Overrides")
  114. ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
  115. ;
  116. }
  117. }
  118. if (AZ::JsonRegistrationContext* jsonContext = azrtti_cast<AZ::JsonRegistrationContext*>(context))
  119. {
  120. jsonContext->Serializer<AZ::EditorScriptCanvasComponentSerializer>()->HandlesType<EditorScriptCanvasComponent>();
  121. }
  122. }
  123. void EditorScriptCanvasComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId)
  124. {
  125. SetDirty();
  126. m_configuration.Refresh(SourceHandle(nullptr, assetId.m_guid));
  127. }
  128. void EditorScriptCanvasComponent::SetAssetId(const SourceHandle& assetId)
  129. {
  130. if (assetId.IsDescriptionValid()
  131. && (!m_configuration.HasSource() || m_configuration.GetSource().Describe() != assetId.Describe()))
  132. {
  133. this->SetPrimaryAsset(assetId.Id());
  134. }
  135. }
  136. bool EditorScriptCanvasComponent::HasAssetId() const
  137. {
  138. return m_configuration.HasSource() && m_configuration.GetSource().IsDescriptionValid();
  139. }
  140. }