EditorScriptCanvasComponent.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusConnect();
  53. m_handlerSourceCompiled = m_configuration.ConnectToSourceCompiled([](const Configuration&)
  54. {
  55. AzToolsFramework::ToolsApplicationNotificationBus::Broadcast
  56. ( &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay
  57. , AzToolsFramework::Refresh_EntireTree_NewContent);
  58. });
  59. m_configuration.Refresh();
  60. AzToolsFramework::ToolsApplicationNotificationBus::Broadcast
  61. ( &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay
  62. , AzToolsFramework::Refresh_EntireTree_NewContent);
  63. }
  64. void EditorScriptCanvasComponent::Deactivate()
  65. {
  66. EditorComponentBase::Deactivate();
  67. AzToolsFramework::EditorEntityContextNotificationBus::Handler::BusDisconnect();
  68. }
  69. void EditorScriptCanvasComponent::BuildGameEntity(AZ::Entity* gameEntity)
  70. {
  71. if (!m_configuration.HasSource())
  72. {
  73. return;
  74. }
  75. if (auto buildVariableOptional = m_configuration.CompileLatest())
  76. {
  77. auto runtimeComponent = gameEntity->CreateComponent<ScriptCanvas::RuntimeComponent>();
  78. runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(*buildVariableOptional));
  79. }
  80. else
  81. {
  82. AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using source: %s"
  83. , m_configuration.GetSource().ToString().c_str());
  84. }
  85. }
  86. void EditorScriptCanvasComponent::Reflect(AZ::ReflectContext* context)
  87. {
  88. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  89. {
  90. serializeContext->Class<EditorScriptCanvasComponent, EditorComponentBase>()
  91. ->Version(Version::Current, &Deprecated::EditorScriptCanvasComponentVersionConverter::Convert)
  92. ->Field("configuration", &EditorScriptCanvasComponent::m_configuration)
  93. ;
  94. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  95. {
  96. 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.")
  97. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  98. ->Attribute(AZ::Edit::Attributes::Category, "Scripting")
  99. ->Attribute(AZ::Edit::Attributes::Icon, "Icons/ScriptCanvas/ScriptCanvas.svg")
  100. ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/ScriptCanvas/Viewport/ScriptCanvas.svg")
  101. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  102. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c))
  103. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
  104. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Level", 0x9aeacc13))
  105. ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/scripting/script-canvas/")
  106. ->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_configuration, "Configuration", "Script Selection and Property Overrides")
  107. ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
  108. ;
  109. }
  110. }
  111. if (AZ::JsonRegistrationContext* jsonContext = azrtti_cast<AZ::JsonRegistrationContext*>(context))
  112. {
  113. jsonContext->Serializer<AZ::EditorScriptCanvasComponentSerializer>()->HandlesType<EditorScriptCanvasComponent>();
  114. }
  115. }
  116. void EditorScriptCanvasComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId)
  117. {
  118. m_configuration.Refresh(SourceHandle(nullptr, assetId.m_guid));
  119. }
  120. }