editor sc component switched over to source handle, not yet connected to file notifications

Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
main^2^2
chcurran 4 years ago committed by Chris Burel
parent b772db5e73
commit ad8cfa5f99

@ -26,18 +26,20 @@
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h> #include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <ScriptCanvas/Bus/RequestBus.h> #include <ScriptCanvas/Bus/RequestBus.h>
#include <ScriptCanvas/Components/EditorGraph.h> #include <ScriptCanvas/Components/EditorGraph.h>
#include <ScriptCanvas/Components/EditorUtils.h>
#include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h> #include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
#include <ScriptCanvas/Components/EditorScriptCanvasComponent.h> #include <ScriptCanvas/Components/EditorScriptCanvasComponent.h>
#include <ScriptCanvas/Core/Node.h> #include <ScriptCanvas/Core/Node.h>
#include <ScriptCanvas/PerformanceStatisticsBus.h> #include <ScriptCanvas/PerformanceStatisticsBus.h>
#include <LyViewPaneNames.h>
#include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
namespace EditorScriptCanvasComponentCpp namespace EditorScriptCanvasComponentCpp
{ {
enum Version enum Version
{ {
PrefabIntegration = 10, PrefabIntegration = 10,
AddSourceHandle,
// add description above // add description above
Current Current
}; };
@ -142,6 +144,25 @@ namespace ScriptCanvasEditor
} }
} }
if (rootElement.GetVersion() < EditorScriptCanvasComponentCpp::Version::AddSourceHandle)
{
ScriptCanvasAssetHolder assetHolder;
if (!rootElement.FindSubElementAndGetData(AZ_CRC_CE("m_assetHolder"), assetHolder))
{
AZ_Error("ScriptCanvas", false, "EditorScriptCanvasComponent conversion failed: could not retrieve old 'm_assetHolder'");
return false;
}
auto assetId = assetHolder.GetAssetId();
auto path = assetHolder.GetAssetHint();
if (!rootElement.AddElementWithData(serializeContext, "runtimeDataOverrides", SourceHandle(nullptr, assetId.m_guid, path)))
{
AZ_Error("ScriptCanvas", false, "EditorScriptCanvasComponent conversion failed: failed to add 'sourceHandle'");
return false;
}
}
return true; return true;
} }
@ -153,9 +174,9 @@ namespace ScriptCanvasEditor
serializeContext->Class<EditorScriptCanvasComponent, EditorComponentBase>() serializeContext->Class<EditorScriptCanvasComponent, EditorComponentBase>()
->Version(EditorScriptCanvasComponentCpp::Version::Current, &EditorScriptCanvasComponentVersionConverter) ->Version(EditorScriptCanvasComponentCpp::Version::Current, &EditorScriptCanvasComponentVersionConverter)
->Field("m_name", &EditorScriptCanvasComponent::m_name) ->Field("m_name", &EditorScriptCanvasComponent::m_name)
->Field("m_assetHolder", &EditorScriptCanvasComponent::m_scriptCanvasAssetHolder)
->Field("runtimeDataIsValid", &EditorScriptCanvasComponent::m_runtimeDataIsValid) ->Field("runtimeDataIsValid", &EditorScriptCanvasComponent::m_runtimeDataIsValid)
->Field("runtimeDataOverrides", &EditorScriptCanvasComponent::m_variableOverrides) ->Field("runtimeDataOverrides", &EditorScriptCanvasComponent::m_variableOverrides)
->Field("sourceHandle", &EditorScriptCanvasComponent::m_sourceHandle)
; ;
if (AZ::EditContext* editContext = serializeContext->GetEditContext()) if (AZ::EditContext* editContext = serializeContext->GetEditContext())
@ -171,7 +192,7 @@ namespace ScriptCanvasEditor
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0)) ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Level", 0x9aeacc13)) ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Level", 0x9aeacc13))
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/scripting/script-canvas/") ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/scripting/script-canvas/")
->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_scriptCanvasAssetHolder, "Script Canvas Asset", "Script Canvas asset associated with this component") ->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_sourceHandle, "Script Canvas Source File", "Script Canvas source file associated with this component")
->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_variableOverrides, "Properties", "Script Canvas Graph Properties") ->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_variableOverrides, "Properties", "Script Canvas Graph Properties")
->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
@ -181,19 +202,13 @@ namespace ScriptCanvasEditor
} }
EditorScriptCanvasComponent::EditorScriptCanvasComponent() EditorScriptCanvasComponent::EditorScriptCanvasComponent()
: EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset>()) : EditorScriptCanvasComponent(SourceHandle())
{ {
} }
EditorScriptCanvasComponent::EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset) EditorScriptCanvasComponent::EditorScriptCanvasComponent(const SourceHandle& sourceHandle)
: m_scriptCanvasAssetHolder() : m_sourceHandle(sourceHandle)
{ {
if (asset.GetId().IsValid())
{
m_scriptCanvasAssetHolder.SetAsset(asset.GetId());
}
m_scriptCanvasAssetHolder.SetScriptChangedCB([this](AZ::Data::AssetId assetId) { OnScriptCanvasAssetChanged(assetId); });
} }
EditorScriptCanvasComponent::~EditorScriptCanvasComponent() EditorScriptCanvasComponent::~EditorScriptCanvasComponent()
@ -209,44 +224,37 @@ namespace ScriptCanvasEditor
void EditorScriptCanvasComponent::UpdateName() void EditorScriptCanvasComponent::UpdateName()
{ {
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId(); SetName(m_sourceHandle.Path().Filename().Native());
if (assetId.IsValid()) }
void EditorScriptCanvasComponent::OpenEditor()
{ {
// Pathname from the asset doesn't seem to return a value unless the asset has been loaded up once(which isn't done until we try to show it). AzToolsFramework::OpenViewPane(LyViewPane::ScriptCanvas);
// Using the Job system to determine the asset name instead.
AZ::Outcome<AzToolsFramework::AssetSystem::JobInfoContainer> jobOutcome = AZ::Failure();
AzToolsFramework::AssetSystemJobRequestBus::BroadcastResult(jobOutcome, &AzToolsFramework::AssetSystemJobRequestBus::Events::GetAssetJobsInfoByAssetID, assetId, false, false);
AZStd::string assetPath; AZ::Outcome<int, AZStd::string> openOutcome = AZ::Failure(AZStd::string());
AZStd::string assetName;
if (jobOutcome.IsSuccess()) if (m_sourceHandle.IsValid())
{ {
AzToolsFramework::AssetSystem::JobInfoContainer& jobs = jobOutcome.GetValue(); GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, m_sourceHandle, -1);
// Get the asset relative path if (!openOutcome)
if (!jobs.empty())
{ {
assetPath = jobs[0].m_sourceFile; AZ_Warning("Script Canvas", openOutcome, "%s", openOutcome.GetError().data());
} }
}
else if (GetEntityId().IsValid())
{
AzToolsFramework::EntityIdList selectedEntityIds;
AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(selectedEntityIds, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities);
// Get the asset file name // Going to bypass the multiple selected entities flow for right now.
assetName = assetPath; if (selectedEntityIds.size() == 1)
if (!assetPath.empty())
{ {
AzFramework::StringFunc::Path::GetFileName(assetPath.c_str(), assetName); GeneralRequestBus::Broadcast(&GeneralRequests::CreateScriptCanvasAssetFor, AZStd::make_pair(GetEntityId(), GetId()));
SetName(assetName);
}
} }
} }
} }
void EditorScriptCanvasComponent::OpenEditor()
{
m_scriptCanvasAssetHolder.OpenEditor();
}
void EditorScriptCanvasComponent::Init() void EditorScriptCanvasComponent::Init()
{ {
EditorComponentBase::Init(); EditorComponentBase::Init();
@ -260,6 +268,8 @@ namespace ScriptCanvasEditor
{ {
EditorComponentBase::Activate(); EditorComponentBase::Activate();
AzToolsFramework::AssetSystemBus::Handler::BusConnect();
AZ::EntityId entityId = GetEntityId(); AZ::EntityId entityId = GetEntityId();
EditorContextMenuRequestBus::Handler::BusConnect(entityId); EditorContextMenuRequestBus::Handler::BusConnect(entityId);
@ -268,19 +278,13 @@ namespace ScriptCanvasEditor
EditorScriptCanvasComponentLoggingBus::Handler::BusConnect(entityId); EditorScriptCanvasComponentLoggingBus::Handler::BusConnect(entityId);
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentActivated, GetNamedEntityId(), GetGraphIdentifier()); EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentActivated, GetNamedEntityId(), GetGraphIdentifier());
AZ::Data::AssetId fileAssetId = m_scriptCanvasAssetHolder.GetAssetId();
if (fileAssetId.IsValid())
{
AssetTrackerNotificationBus::Handler::BusConnect(fileAssetId);
AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent); AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
} }
}
//========================================================================= //=========================================================================
void EditorScriptCanvasComponent::Deactivate() void EditorScriptCanvasComponent::Deactivate()
{ {
AssetTrackerNotificationBus::Handler::BusDisconnect(); AzToolsFramework::AssetSystemBus::Handler::BusDisconnect();
EditorScriptCanvasComponentLoggingBus::Handler::BusDisconnect(); EditorScriptCanvasComponentLoggingBus::Handler::BusDisconnect();
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentDeactivated, GetNamedEntityId(), GetGraphIdentifier()); EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentDeactivated, GetNamedEntityId(), GetGraphIdentifier());
@ -297,7 +301,7 @@ namespace ScriptCanvasEditor
m_runtimeDataIsValid = false; m_runtimeDataIsValid = false;
auto assetTreeOutcome = LoadEditorAssetTree(m_scriptCanvasAssetHolder.GetAssetId(), m_scriptCanvasAssetHolder.GetAssetHint()); auto assetTreeOutcome = LoadEditorAssetTree(m_sourceHandle.Id(), m_sourceHandle.Path().c_str());
if (!assetTreeOutcome.IsSuccess()) if (!assetTreeOutcome.IsSuccess())
{ {
AZ_Warning("ScriptCanvas", false, "EditorScriptCanvasComponent::BuildGameEntityData failed: %s", assetTreeOutcome.GetError().c_str()); AZ_Warning("ScriptCanvas", false, "EditorScriptCanvasComponent::BuildGameEntityData failed: %s", assetTreeOutcome.GetError().c_str());
@ -335,7 +339,8 @@ namespace ScriptCanvasEditor
if (!m_runtimeDataIsValid) if (!m_runtimeDataIsValid)
{ {
AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using asset: %s", m_scriptCanvasAssetHolder.GetAssetId().ToString<AZStd::string>().c_str()); AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using asset: %s"
, m_sourceHandle.ToString().c_str());
return; return;
} }
@ -343,123 +348,53 @@ namespace ScriptCanvasEditor
runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(m_variableOverrides)); runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(m_variableOverrides));
} }
void EditorScriptCanvasComponent::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
{
if (m_removedCatalogId == assetId)
{
if (!m_scriptCanvasAssetHolder.GetAssetId().IsValid())
{
SetPrimaryAsset(assetId);
m_removedCatalogId.SetInvalid();
}
}
}
void EditorScriptCanvasComponent::OnCatalogAssetRemoved(const AZ::Data::AssetId& removedAssetId, const AZ::Data::AssetInfo& /*assetInfo*/)
{
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId();
if (assetId == removedAssetId)
{
m_removedCatalogId = assetId;
SetPrimaryAsset({});
}
}
void EditorScriptCanvasComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId) void EditorScriptCanvasComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId)
{ {
m_scriptCanvasAssetHolder.ClearAsset(); m_sourceHandle = SourceHandle(nullptr, assetId.m_guid, {});
if (assetId.IsValid()) auto completeAsset = CompleteDescription(m_sourceHandle);
if (completeAsset)
{ {
ScriptCanvasMemoryAsset::pointer memoryAsset; m_sourceHandle = *completeAsset;
AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, assetId);
if (memoryAsset)
{
m_scriptCanvasAssetHolder.SetAsset(memoryAsset->GetFileAssetId());
OnScriptCanvasAssetChanged(memoryAsset->GetFileAssetId());
SetName(memoryAsset->GetTabName());
}
else
{
auto scriptCanvasAsset = AZ::Data::AssetManager::Instance().FindAsset(assetId, AZ::Data::AssetLoadBehavior::Default);
if (scriptCanvasAsset)
{
m_scriptCanvasAssetHolder.SetAsset(assetId);
}
}
} }
OnScriptCanvasAssetChanged(m_sourceHandle);
SetName(m_sourceHandle.Path().Filename().Native());
AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues);
} }
AZ::Data::AssetId EditorScriptCanvasComponent::GetAssetId() const AZ::Data::AssetId EditorScriptCanvasComponent::GetAssetId() const
{ {
return m_scriptCanvasAssetHolder.GetAssetId(); return m_sourceHandle.Id();
}
AZ::EntityId EditorScriptCanvasComponent::GetGraphEntityId() const
{
AZ::EntityId scriptCanvasEntityId;
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId();
if (assetId.IsValid())
{
AssetTrackerRequestBus::BroadcastResult(scriptCanvasEntityId, &AssetTrackerRequests::GetScriptCanvasId, assetId);
}
return scriptCanvasEntityId;
}
void EditorScriptCanvasComponent::OnAssetReady(const ScriptCanvasMemoryAsset::pointer asset)
{
OnScriptCanvasAssetReady(asset);
}
void EditorScriptCanvasComponent::OnAssetSaved(const ScriptCanvasMemoryAsset::pointer asset, bool isSuccessful)
{
if (isSuccessful)
{
OnScriptCanvasAssetReady(asset);
}
} }
void EditorScriptCanvasComponent::OnAssetReloaded(const ScriptCanvasMemoryAsset::pointer asset) void EditorScriptCanvasComponent::OnScriptCanvasAssetChanged(const SourceHandle& assetId)
{ {
OnScriptCanvasAssetReady(asset);
}
void EditorScriptCanvasComponent::OnScriptCanvasAssetChanged(AZ::Data::AssetId assetId)
{
AssetTrackerNotificationBus::Handler::BusDisconnect();
ScriptCanvas::GraphIdentifier newIdentifier = GetGraphIdentifier(); ScriptCanvas::GraphIdentifier newIdentifier = GetGraphIdentifier();
newIdentifier.m_assetId = assetId; newIdentifier.m_assetId = assetId.Id();
ScriptCanvas::GraphIdentifier oldIdentifier = GetGraphIdentifier(); ScriptCanvas::GraphIdentifier oldIdentifier = GetGraphIdentifier();
oldIdentifier.m_assetId = m_previousAssetId; oldIdentifier.m_assetId = m_previousHandle.Id();
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnAssetSwitched, GetNamedEntityId(), newIdentifier, oldIdentifier); EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnAssetSwitched, GetNamedEntityId(), newIdentifier, oldIdentifier);
m_previousAssetId = m_scriptCanvasAssetHolder.GetAssetId(); m_previousHandle = m_sourceHandle.Describe();
// Only clear our variables when we are given a new asset id // Only clear our variables when we are given a new asset id
// or when the asset was explicitly set to empty. // or when the asset was explicitly set to empty.
// //
// i.e. do not clear variables when we lose the catalog asset. // i.e. do not clear variables when we lose the catalog asset.
if ((assetId.IsValid() && assetId != m_removedCatalogId) if ((assetId.IsValidDescription() && assetId.Describe() != m_removedHandle.Describe())
|| (!assetId.IsValid() && !m_removedCatalogId.IsValid())) || (!assetId.IsValidDescription() && !m_removedHandle.IsValidDescription()))
{ {
ClearVariables(); ClearVariables();
} }
if (assetId.IsValid()) if (assetId.IsValidDescription())
{ {
AssetTrackerNotificationBus::Handler::BusConnect(assetId); if (auto loaded = LoadFromFile(assetId.Path().c_str()); loaded.IsSuccess())
ScriptCanvasMemoryAsset::pointer memoryAsset;
AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, assetId);
if (memoryAsset && memoryAsset->GetAsset().GetStatus() == AZ::Data::AssetData::AssetStatus::Ready)
{ {
OnScriptCanvasAssetReady(memoryAsset); OnScriptCanvasAssetReady(loaded.GetValue());
} }
} }
@ -476,39 +411,49 @@ namespace ScriptCanvasEditor
AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect); AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect);
} }
void EditorScriptCanvasComponent::SetAssetId(const AZ::Data::AssetId& assetId) void EditorScriptCanvasComponent::SetAssetId(const SourceHandle& assetId)
{ {
if (m_scriptCanvasAssetHolder.GetAssetId() != assetId) if (m_sourceHandle.Describe() != assetId.Describe())
{ {
// Invalidate the previously removed catalog id if we are setting a new asset id // Invalidate the previously removed catalog id if we are setting a new asset id
m_removedCatalogId.SetInvalid(); m_removedHandle = {};
SetPrimaryAsset(assetId); SetPrimaryAsset(assetId.Id());
} }
} }
void EditorScriptCanvasComponent::SourceFileChanged(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
void EditorScriptCanvasComponent::SourceFileRemoved(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
void EditorScriptCanvasComponent::SourceFileFailed(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
bool EditorScriptCanvasComponent::HasAssetId() const bool EditorScriptCanvasComponent::HasAssetId() const
{ {
return m_scriptCanvasAssetHolder.GetAssetId().IsValid(); return !m_sourceHandle.Id().IsNull();
} }
ScriptCanvas::GraphIdentifier EditorScriptCanvasComponent::GetGraphIdentifier() const ScriptCanvas::GraphIdentifier EditorScriptCanvasComponent::GetGraphIdentifier() const
{ {
// For now we don't want to deal with disambiguating duplicates of the same script running on one entity. // For now we don't want to deal with disambiguating duplicates of the same script running on one entity.
// Should that change we need to add the component id back into this. // Should that change we need to add the component id back into this.
return ScriptCanvas::GraphIdentifier(m_scriptCanvasAssetHolder.GetAssetId(), 0); return ScriptCanvas::GraphIdentifier(m_sourceHandle.Id(), 0);
} }
void EditorScriptCanvasComponent::OnScriptCanvasAssetReady(const ScriptCanvasMemoryAsset::pointer memoryAsset) void EditorScriptCanvasComponent::OnScriptCanvasAssetReady(const SourceHandle& sourceHandle)
{ {
if (memoryAsset->GetFileAssetId() == m_scriptCanvasAssetHolder.GetAssetId()) if (sourceHandle.IsValid())
{ {
auto assetData = memoryAsset->GetAsset();
[[maybe_unused]] AZ::Entity* scriptCanvasEntity = assetData->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "This graph must have a valid entity");
BuildGameEntityData(); BuildGameEntityData();
UpdateName(); UpdateName();
AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent); AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
} }
else
{
// #sc_editor_asset clear or disable something
}
} }
void EditorScriptCanvasComponent::ClearVariables() void EditorScriptCanvasComponent::ClearVariables()

@ -17,6 +17,7 @@ AZ_POP_DISABLE_WARNING
#include <ScriptCanvas/Libraries/Core/EBusEventHandler.h> #include <ScriptCanvas/Libraries/Core/EBusEventHandler.h>
#include <ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h> #include <ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h>
#include <ScriptCanvas/Utils/NodeUtils.h> #include <ScriptCanvas/Utils/NodeUtils.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
#include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h> #include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
#include <Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h> #include <Editor/Include/ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
@ -30,6 +31,44 @@ AZ_POP_DISABLE_WARNING
namespace ScriptCanvasEditor namespace ScriptCanvasEditor
{ {
AZStd::optional<SourceHandle> CompleteDescription(const SourceHandle& source)
{
if (source.IsValidDescription())
{
return source.Describe();
}
AZStd::string watchFolder;
AZ::Data::AssetInfo assetInfo;
bool sourceInfoFound{};
if (!source.Id().IsNull())
{
AzToolsFramework::AssetSystemRequestBus::BroadcastResult
( sourceInfoFound
, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, source.Id(), assetInfo, watchFolder);
if (sourceInfoFound && !assetInfo.m_relativePath.empty())
{
return SourceHandle(nullptr, assetInfo.m_assetId.m_guid, assetInfo.m_relativePath);
}
}
if (!source.Path().empty())
{
AzToolsFramework::AssetSystemRequestBus::BroadcastResult
( sourceInfoFound
, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, source.Path().c_str(), assetInfo, watchFolder);
if (sourceInfoFound && assetInfo.m_assetId.IsValid())
{
return SourceHandle(nullptr, assetInfo.m_assetId.m_guid, assetInfo.m_relativePath);
}
}
return AZStd::nullopt;
}
////////////////////////// //////////////////////////
// NodeIdentifierFactory // NodeIdentifierFactory
////////////////////////// //////////////////////////

@ -72,7 +72,7 @@ namespace ScriptCanvasEditor
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
using BusIdType = AZ::EntityId; using BusIdType = AZ::EntityId;
virtual void SetAssetId(const AZ::Data::AssetId& assetId) = 0; virtual void SetAssetId(const SourceHandle& assetId) = 0;
virtual bool HasAssetId() const = 0; virtual bool HasAssetId() const = 0;
}; };
@ -92,31 +92,6 @@ namespace ScriptCanvasEditor
using EditorContextMenuRequestBus = AZ::EBus<EditorContextMenuRequests>; using EditorContextMenuRequestBus = AZ::EBus<EditorContextMenuRequests>;
class EditorScriptCanvasAssetNotifications : public AZ::EBusTraits
{
public:
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById;
using BusIdType = AZ::Data::AssetId;
//! Notification which fires after an EditorGraph has received it's on AssetReady callback
//! \param scriptCanvasAsset Script Canvas asset which is now ready for use in the Editor
virtual void OnScriptCanvasAssetReady(const AZ::Data::Asset<ScriptCanvas::ScriptCanvasAssetBase>& /*scriptCanvasAsset*/) {};
//! Notification which fires after an EditorGraph has received it's on AssetReloaded callback
//! \param scriptCanvasAsset Script Canvas asset which is now ready for use in the Editor
virtual void OnScriptCanvasAssetReloaded(const AZ::Data::Asset<ScriptCanvas::ScriptCanvasAssetBase>& /*scriptCanvaAsset */) {};
//! Notification which fires after an EditorGraph has received it's on AssetReady callback
//! \param AssetId AssetId of unloaded ScriptCanvas
virtual void OnScriptCanvasAssetUnloaded(const AZ::Data::AssetId& /*assetId*/) {};
//! Notification which fires after an EditorGraph has received an onAssetSaved callback
//! \param scriptCanvasAsset Script Canvas asset which was attempted to be saved
//! \param isSuccessful specified where the Script Canvas asset was successfully saved
virtual void OnScriptCanvasAssetSaved(const AZ::Data::AssetId) {};
};
using EditorScriptCanvasAssetNotificationBus = AZ::EBus<EditorScriptCanvasAssetNotifications>;
class EditorGraphRequests : public AZ::EBusTraits class EditorGraphRequests : public AZ::EBusTraits
{ {
public: public:

@ -17,6 +17,7 @@
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h> #include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
#include <ScriptCanvas/Execution/RuntimeComponent.h> #include <ScriptCanvas/Execution/RuntimeComponent.h>
#include <ScriptCanvas/Variable/VariableBus.h> #include <ScriptCanvas/Variable/VariableBus.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
namespace ScriptCanvasEditor namespace ScriptCanvasEditor
{ {
@ -34,10 +35,9 @@ namespace ScriptCanvasEditor
: public AzToolsFramework::Components::EditorComponentBase : public AzToolsFramework::Components::EditorComponentBase
, private EditorContextMenuRequestBus::Handler , private EditorContextMenuRequestBus::Handler
, private AzFramework::AssetCatalogEventBus::Handler , private AzFramework::AssetCatalogEventBus::Handler
, private AzToolsFramework::AssetSystemBus::Handler
, private EditorScriptCanvasComponentLoggingBus::Handler , private EditorScriptCanvasComponentLoggingBus::Handler
, private EditorScriptCanvasComponentRequestBus::Handler , private EditorScriptCanvasComponentRequestBus::Handler
, private AssetTrackerNotificationBus::Handler
, private AzToolsFramework::AssetSystemBus::Handler
, private AzToolsFramework::EditorEntityContextNotificationBus::Handler , private AzToolsFramework::EditorEntityContextNotificationBus::Handler
{ {
@ -46,7 +46,7 @@ namespace ScriptCanvasEditor
EditorScriptCanvasComponent(); EditorScriptCanvasComponent();
// EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset); // EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset);
EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset); EditorScriptCanvasComponent(const SourceHandle& sourceHandle);
~EditorScriptCanvasComponent() override; ~EditorScriptCanvasComponent() override;
//===================================================================== //=====================================================================
@ -70,14 +70,14 @@ namespace ScriptCanvasEditor
void OpenEditor(); void OpenEditor();
void SetName(const AZStd::string& name) { m_name = name; } void SetName(AZStd::string_view name) { m_name = name; }
const AZStd::string& GetName() const; const AZStd::string& GetName() const;
AZ::EntityId GetEditorEntityId() const { return GetEntity() ? GetEntityId() : AZ::EntityId(); } AZ::EntityId GetEditorEntityId() const { return GetEntity() ? GetEntityId() : AZ::EntityId(); }
AZ::NamedEntityId GetNamedEditorEntityId() const { return GetEntity() ? GetNamedEntityId() : AZ::NamedEntityId(); } AZ::NamedEntityId GetNamedEditorEntityId() const { return GetEntity() ? GetNamedEntityId() : AZ::NamedEntityId(); }
//===================================================================== //=====================================================================
// EditorScriptCanvasComponentRequestBus // EditorScriptCanvasComponentRequestBus
void SetAssetId(const AZ::Data::AssetId& assetId) override; void SetAssetId(const SourceHandle& assetId) override;
bool HasAssetId() const override; bool HasAssetId() const override;
//===================================================================== //=====================================================================
@ -85,13 +85,12 @@ namespace ScriptCanvasEditor
// EditorContextMenuRequestBus // EditorContextMenuRequestBus
AZ::Data::AssetId GetAssetId() const override; AZ::Data::AssetId GetAssetId() const override;
//===================================================================== //=====================================================================
AZ::EntityId GetGraphEntityId() const;
//===================================================================== //=====================================================================
// AssetTrackerNotificationBus // AssetTrackerNotificationBus
void OnAssetReady(const ScriptCanvasMemoryAsset::pointer asset) override; void OnAssetReady(const ScriptCanvasMemoryAsset::pointer asset) ;
void OnAssetSaved(const ScriptCanvasMemoryAsset::pointer asset, bool isSuccessful) override; void OnAssetSaved(const ScriptCanvasMemoryAsset::pointer asset, bool isSuccessful) ;
void OnAssetReloaded(const ScriptCanvasMemoryAsset::pointer asset) override; void OnAssetReloaded(const ScriptCanvasMemoryAsset::pointer asset) ;
//===================================================================== //=====================================================================
@ -119,25 +118,30 @@ namespace ScriptCanvasEditor
(void)incompatible; (void)incompatible;
} }
void OnCatalogAssetAdded(const AZ::Data::AssetId& assetId) override; // complete the id, load call OnScriptCanvasAssetChanged
void OnCatalogAssetRemoved(const AZ::Data::AssetId& assetId, const AZ::Data::AssetInfo& assetInfo) override; void SourceFileChanged(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override;
void OnScriptCanvasAssetChanged(AZ::Data::AssetId assetId);
// update the display icon for failure, save the values in the graph
void SourceFileRemoved(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override;
void SourceFileFailed(AZStd::string relativePath, AZStd::string scanFolder, AZ::Uuid fileAssetId) override;
void OnScriptCanvasAssetChanged(const SourceHandle& sourceHandle);
void UpdateName(); void UpdateName();
//===================================================================== //=====================================================================
void OnScriptCanvasAssetReady(const ScriptCanvasMemoryAsset::pointer asset); void OnScriptCanvasAssetReady(const SourceHandle& sourceHandle);
//===================================================================== //=====================================================================
void BuildGameEntityData(); void BuildGameEntityData();
void ClearVariables(); void ClearVariables();
private: private:
AZ::Data::AssetId m_removedCatalogId;
AZ::Data::AssetId m_previousAssetId;
AZStd::string m_name; AZStd::string m_name;
ScriptCanvasAssetHolder m_scriptCanvasAssetHolder;
bool m_runtimeDataIsValid = false; bool m_runtimeDataIsValid = false;
ScriptCanvasBuilder::BuildVariableOverrides m_variableOverrides; ScriptCanvasBuilder::BuildVariableOverrides m_variableOverrides;
SourceHandle m_sourceHandle;
SourceHandle m_previousHandle;
SourceHandle m_removedHandle;
}; };
} }

@ -21,6 +21,8 @@ namespace GraphCanvas
namespace ScriptCanvasEditor namespace ScriptCanvasEditor
{ {
AZStd::optional<SourceHandle> CompleteDescription(const SourceHandle& source);
class Graph; class Graph;
class NodePaletteModel; class NodePaletteModel;

@ -31,6 +31,7 @@ namespace ScriptCanvasEditor
{ {
void ReflectComponent::Reflect(AZ::ReflectContext* context) void ReflectComponent::Reflect(AZ::ReflectContext* context)
{ {
SourceHandle::Reflect(context);
ScriptCanvas::ScriptCanvasData::Reflect(context); ScriptCanvas::ScriptCanvasData::Reflect(context);
ScriptCanvasAssetHolder::Reflect(context); ScriptCanvasAssetHolder::Reflect(context);
EditorSettings::EditorWorkspace::Reflect(context); EditorSettings::EditorWorkspace::Reflect(context);

@ -1946,7 +1946,7 @@ namespace ScriptCanvasEditor
{ {
if (auto firstRequestBus = EditorScriptCanvasComponentRequestBus::FindFirstHandler(entity->GetId())) if (auto firstRequestBus = EditorScriptCanvasComponentRequestBus::FindFirstHandler(entity->GetId()))
{ {
firstRequestBus->SetAssetId(memoryAsset.Id()); firstRequestBus->SetAssetId(memoryAsset.Describe());
} }
} }
else else
@ -1955,7 +1955,7 @@ namespace ScriptCanvasEditor
{ {
if (editorComponent->GetAssetId() == oldId) if (editorComponent->GetAssetId() == oldId)
{ {
editorComponent->SetAssetId(memoryAsset.Id()); editorComponent->SetAssetId(memoryAsset.Describe());
break; break;
} }
} }
@ -4379,15 +4379,7 @@ namespace ScriptCanvasEditor
if (usableRequestBus) if (usableRequestBus)
{ {
ScriptCanvasMemoryAsset::pointer memoryAsset; usableRequestBus->SetAssetId(m_activeGraph.Describe());
// #sc_editor_asset
// AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, m_activeGraph);
if (memoryAsset)
{
// We need to assign the AssetId for the file asset, not the in-memory asset
usableRequestBus->SetAssetId(memoryAsset->GetFileAssetId());
}
} }
} }

@ -6,6 +6,7 @@
* *
*/ */
#include <AzCore/Component/ComponentApplicationBus.h> #include <AzCore/Component/ComponentApplicationBus.h>
#include <AzCore/Interface/Interface.h> #include <AzCore/Interface/Interface.h>
#include <AzCore/RTTI/AttributeReader.h> #include <AzCore/RTTI/AttributeReader.h>
@ -14,9 +15,8 @@
#include <AzCore/StringFunc/StringFunc.h> #include <AzCore/StringFunc/StringFunc.h>
#include <Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h> #include <Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h>
#include "Core.h"
#include "Attributes.h" #include "Attributes.h"
#include "Core.h"
#include <Core/Graph.h> #include <Core/Graph.h>
namespace ScriptCanvas namespace ScriptCanvas
@ -238,6 +238,11 @@ namespace ScriptCanvasEditor
return m_data != nullptr; return m_data != nullptr;
} }
bool SourceHandle::IsValidDescription() const
{
return !m_id.IsNull() && !m_path.empty();
}
GraphPtr SourceHandle::Mod() const GraphPtr SourceHandle::Mod() const
{ {
return m_data ? m_data->ModEditorGraph() : nullptr; return m_data ? m_data->ModEditorGraph() : nullptr;
@ -265,6 +270,30 @@ namespace ScriptCanvasEditor
return m_path == other.m_path; return m_path == other.m_path;
} }
void SourceHandle::Reflect(AZ::ReflectContext* context)
{
if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<SourceHandle>()
->Version(0)
->Field("id", &SourceHandle::m_id)
->Field("path", &SourceHandle::m_path)
;
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
{
editContext->Class<SourceHandle>("Script Canvas Source Handle", "References a source editor file")
->ClassElement(AZ::Edit::ClassElements::EditorData, "")
->Attribute(AZ::Edit::Attributes::Category, "Scripting")
->Attribute(AZ::Edit::Attributes::Icon, "Icons/ScriptCanvas/ScriptCanvas.svg")
->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/ScriptCanvas/Viewport/ScriptCanvas.svg")
->Attribute(AZ::Edit::Attributes::AutoExpand, true)
->DataElement(AZ::Edit::UIHandlers::Default, &SourceHandle::m_path);
;
}
}
}
AZStd::string SourceHandle::ToString() const AZStd::string SourceHandle::ToString() const
{ {
return AZStd::string::format return AZStd::string::format

@ -325,6 +325,8 @@ namespace ScriptCanvasEditor
AZ_TYPE_INFO(SourceHandle, "{65855A98-AE2F-427F-BFC8-69D45265E312}"); AZ_TYPE_INFO(SourceHandle, "{65855A98-AE2F-427F-BFC8-69D45265E312}");
AZ_CLASS_ALLOCATOR(SourceHandle, AZ::SystemAllocator, 0); AZ_CLASS_ALLOCATOR(SourceHandle, AZ::SystemAllocator, 0);
static void Reflect(AZ::ReflectContext* context);
SourceHandle() = default; SourceHandle() = default;
SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path); SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path);
@ -344,6 +346,8 @@ namespace ScriptCanvasEditor
bool IsValid() const; bool IsValid() const;
bool IsValidDescription() const;
GraphPtr Mod() const; GraphPtr Mod() const;
bool operator==(const SourceHandle& other) const; bool operator==(const SourceHandle& other) const;
@ -372,8 +376,8 @@ namespace ScriptCanvas
AZ_RTTI(ScriptCanvasData, "{1072E894-0C67-4091-8B64-F7DB324AD13C}"); AZ_RTTI(ScriptCanvasData, "{1072E894-0C67-4091-8B64-F7DB324AD13C}");
AZ_CLASS_ALLOCATOR(ScriptCanvasData, AZ::SystemAllocator, 0); AZ_CLASS_ALLOCATOR(ScriptCanvasData, AZ::SystemAllocator, 0);
ScriptCanvasData() {} ScriptCanvasData() = default;
virtual ~ScriptCanvasData() {} virtual ~ScriptCanvasData() = default;
ScriptCanvasData(ScriptCanvasData&& other); ScriptCanvasData(ScriptCanvasData&& other);
ScriptCanvasData& operator=(ScriptCanvasData&& other); ScriptCanvasData& operator=(ScriptCanvasData&& other);

@ -0,0 +1,69 @@
{
"Type": "JsonSerialization",
"Version": 1,
"ClassName": "ScriptCanvasData",
"ClassData": {
"m_scriptCanvas": {
"Id": {
"id": 32884619828465
},
"Name": "Script Canvas Graph",
"Components": {
"Component_[14322649685925277086]": {
"$type": "EditorGraphVariableManagerComponent",
"Id": 14322649685925277086,
"m_variableData": {
"m_nameVariableMap": [
{
"Key": {
"m_id": "{142C0457-38E5-496E-A4F2-67E91852CBCB}"
},
"Value": {
"Datum": {
"isOverloadedStorage": false,
"scriptCanvasType": {
"m_type": 4,
"m_azType": "{5CBE5640-DF5C-5A49-9195-D790881A0747}"
},
"isNullPointer": false,
"$type": "{5CBE5640-DF5C-5A49-9195-D790881A0747} AZStd::vector",
"value": [
[
0.0,
0.0,
-498814079205376.0,
0.0
],
[
0.0,
0.0,
1.1865528051967005e38,
0.0
]
],
"label": "Variable 7"
},
"VariableId": {
"m_id": "{142C0457-38E5-496E-A4F2-67E91852CBCB}"
},
"VariableName": "Variable 7"
}
},
{
"Key": {
"m_id": "{21DD2B3D-ADC9-46E1-B44C-965A6E2AE543}"
},
"Value": {
"Datum": {
"isOverloadedStorage": false,
"scriptCanvasType": {
"m_type": 4,
"m_azType": "{9ABF5933-C8FC-53CD-A518-B6AF433CF496}"
},
"isNullPointer": false,
"$type": "{9ABF5933-C8FC-53CD-A518-B6AF433CF496} AZStd::unordered_map",
"value": [
{
"Key": true,
"Value": {
"roll":
Loading…
Cancel
Save