@ -26,18 +26,20 @@
# include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
# include <ScriptCanvas/Bus/RequestBus.h>
# include <ScriptCanvas/Components/EditorGraph.h>
# include <ScriptCanvas/Components/EditorUtils.h>
# include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
# include <ScriptCanvas/Components/EditorScriptCanvasComponent.h>
# include <ScriptCanvas/Core/Node.h>
# include <ScriptCanvas/PerformanceStatisticsBus.h>
# include <LyViewPaneNames.h>
# include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
namespace EditorScriptCanvasComponentCpp
{
enum Version
{
PrefabIntegration = 10 ,
AddSourceHandle ,
// add description above
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 ;
}
@ -153,9 +174,9 @@ namespace ScriptCanvasEditor
serializeContext - > Class < EditorScriptCanvasComponent , EditorComponentBase > ( )
- > Version ( EditorScriptCanvasComponentCpp : : Version : : Current , & EditorScriptCanvasComponentVersionConverter )
- > Field ( " m_name " , & EditorScriptCanvasComponent : : m_name )
- > Field ( " m_assetHolder " , & EditorScriptCanvasComponent : : m_scriptCanvasAssetHolder )
- > Field ( " runtimeDataIsValid " , & EditorScriptCanvasComponent : : m_runtimeDataIsValid )
- > Field ( " runtimeDataOverrides " , & EditorScriptCanvasComponent : : m_variableOverrides )
- > Field ( " sourceHandle " , & EditorScriptCanvasComponent : : m_sourceHandle )
;
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 ( " Level " , 0x9aeacc13 ) )
- > Attribute ( AZ : : Edit : : Attributes : : HelpPageURL , " https://o3de.org/docs/user-guide/components/reference/scripting/script-canvas/ " )
- > DataElement ( AZ : : Edit : : UIHandlers : : Default , & EditorScriptCanvasComponent : : m_s criptCanvasAssetHolder, " Script Canvas Asset " , " Script Canvas asset associated with this component" )
- > DataElement ( AZ : : Edit : : UIHandlers : : Default , & EditorScriptCanvasComponent : : m_s ourceHandle, " Script Canvas Source File " , " Script Canvas source file associated with this component" )
- > Attribute ( AZ : : Edit : : Attributes : : Visibility , AZ : : Edit : : PropertyVisibility : : ShowChildrenOnly )
- > DataElement ( AZ : : Edit : : UIHandlers : : Default , & EditorScriptCanvasComponent : : m_variableOverrides , " Properties " , " Script Canvas Graph Properties " )
- > Attribute ( AZ : : Edit : : Attributes : : Visibility , AZ : : Edit : : PropertyVisibility : : ShowChildrenOnly )
@ -181,19 +202,13 @@ namespace ScriptCanvasEditor
}
EditorScriptCanvasComponent : : EditorScriptCanvasComponent ( )
: EditorScriptCanvasComponent ( AZ: : Data : : Asset < ScriptCanvasAsset > ( ) )
: EditorScriptCanvasComponent ( SourceHandle ( ) )
{
}
EditorScriptCanvasComponent : : EditorScriptCanvasComponent ( AZ : : Data : : Asset < ScriptCanvasAsset > asset )
: m_s criptCanvasAssetHolder( )
EditorScriptCanvasComponent : : EditorScriptCanvasComponent ( const SourceHandle & sourceHandle )
: m_s ourceHandle( sourceHandle )
{
if ( asset . GetId ( ) . IsValid ( ) )
{
m_scriptCanvasAssetHolder . SetAsset ( asset . GetId ( ) ) ;
}
m_scriptCanvasAssetHolder . SetScriptChangedCB ( [ this ] ( AZ : : Data : : AssetId assetId ) { OnScriptCanvasAssetChanged ( assetId ) ; } ) ;
}
EditorScriptCanvasComponent : : ~ EditorScriptCanvasComponent ( )
@ -209,44 +224,37 @@ namespace ScriptCanvasEditor
void EditorScriptCanvasComponent : : UpdateName ( )
{
AZ : : Data : : AssetId assetId = m_scriptCanvasAssetHolder . GetAssetId ( ) ;
if ( assetId . IsValid ( ) )
SetName ( m_sourceHandle . Path ( ) . Filename ( ) . Native ( ) ) ;
}
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).
// 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 ) ;
AzToolsFramework : : OpenViewPane ( LyViewPane : : ScriptCanvas ) ;
AZStd : : string assetPath ;
AZStd : : string assetName ;
AZ : : Outcome < int , AZStd : : string > openOutcome = AZ : : Failure ( AZStd : : string ( ) ) ;
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 ( ! jobs . empty ( ) )
if ( ! openOutcome )
{
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
assetName = assetPath ;
if ( ! assetPath . empty ( ) )
// Going to bypass the multiple selected entities flow for right now.
if ( selectedEntityIds . size ( ) = = 1 )
{
AzFramework : : StringFunc : : Path : : GetFileName ( assetPath . c_str ( ) , assetName ) ;
SetName ( assetName ) ;
}
GeneralRequestBus : : Broadcast ( & GeneralRequests : : CreateScriptCanvasAssetFor , AZStd : : make_pair ( GetEntityId ( ) , GetId ( ) ) ) ;
}
}
}
void EditorScriptCanvasComponent : : OpenEditor ( )
{
m_scriptCanvasAssetHolder . OpenEditor ( ) ;
}
void EditorScriptCanvasComponent : : Init ( )
{
EditorComponentBase : : Init ( ) ;
@ -260,6 +268,8 @@ namespace ScriptCanvasEditor
{
EditorComponentBase : : Activate ( ) ;
AzToolsFramework : : AssetSystemBus : : Handler : : BusConnect ( ) ;
AZ : : EntityId entityId = GetEntityId ( ) ;
EditorContextMenuRequestBus : : Handler : : BusConnect ( entityId ) ;
@ -268,19 +278,13 @@ namespace ScriptCanvasEditor
EditorScriptCanvasComponentLoggingBus : : Handler : : BusConnect ( entityId ) ;
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 ) ;
}
}
//=========================================================================
void EditorScriptCanvasComponent : : Deactivate ( )
{
A ssetTrackerNotification Bus: : Handler : : BusDisconnect ( ) ;
A zToolsFramework: : AssetSystem Bus: : Handler : : BusDisconnect ( ) ;
EditorScriptCanvasComponentLoggingBus : : Handler : : BusDisconnect ( ) ;
EditorLoggingComponentNotificationBus : : Broadcast ( & EditorLoggingComponentNotifications : : OnEditorScriptCanvasComponentDeactivated , GetNamedEntityId ( ) , GetGraphIdentifier ( ) ) ;
@ -297,7 +301,7 @@ namespace ScriptCanvasEditor
m_runtimeDataIsValid = false ;
auto assetTreeOutcome = LoadEditorAssetTree ( m_s criptCanvasAssetHolder. GetAssetId ( ) , m_scriptCanvasAssetHolder . GetAssetHint ( ) ) ;
auto assetTreeOutcome = LoadEditorAssetTree ( m_s ourceHandle. Id ( ) , m_sourceHandle . Path ( ) . c_str ( ) ) ;
if ( ! assetTreeOutcome . IsSuccess ( ) )
{
AZ_Warning ( " ScriptCanvas " , false , " EditorScriptCanvasComponent::BuildGameEntityData failed: %s " , assetTreeOutcome . GetError ( ) . c_str ( ) ) ;
@ -335,7 +339,8 @@ namespace ScriptCanvasEditor
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 ;
}
@ -343,123 +348,53 @@ namespace ScriptCanvasEditor
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 )
{
m_s criptCanvasAssetHolder. ClearAsset ( ) ;
m_sourceHandle = SourceHandle ( nullptr , assetId . m_guid , { } ) ;
if ( assetId . IsValid ( ) )
auto completeAsset = CompleteDescription ( m_sourceHandle ) ;
if ( completeAsset )
{
ScriptCanvasMemoryAsset : : pointer memoryAsset ;
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 ) ;
}
}
m_sourceHandle = * completeAsset ;
}
OnScriptCanvasAssetChanged ( m_sourceHandle ) ;
SetName ( m_sourceHandle . Path ( ) . Filename ( ) . Native ( ) ) ;
AzToolsFramework : : ToolsApplicationEvents : : Bus : : Broadcast ( & AzToolsFramework : : ToolsApplicationEvents : : InvalidatePropertyDisplay , AzToolsFramework : : Refresh_AttributesAndValues ) ;
}
AZ : : Data : : AssetId EditorScriptCanvasComponent : : GetAssetId ( ) const
{
return m_scriptCanvasAssetHolder . GetAssetId ( ) ;
}
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 ) ;
}
return m_sourceHandle . Id ( ) ;
}
void EditorScriptCanvasComponent : : On AssetReloaded( 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 ( ) ;
newIdentifier . m_assetId = assetId ;
newIdentifier . m_assetId = assetId . Id ( ) ;
ScriptCanvas : : GraphIdentifier oldIdentifier = GetGraphIdentifier ( ) ;
oldIdentifier . m_assetId = m_previous AssetId ;
oldIdentifier . m_assetId = m_previousHandle . Id ( ) ;
EditorLoggingComponentNotificationBus : : Broadcast ( & EditorLoggingComponentNotifications : : OnAssetSwitched , GetNamedEntityId ( ) , newIdentifier , oldIdentifier ) ;
m_previous AssetId = m_scriptCanvasAssetHolder . GetAssetId ( ) ;
m_previousHandle = m_sourceHandle . Describe ( ) ;
// Only clear our variables when we are given a new asset id
// or when the asset was explicitly set to empty.
//
// i.e. do not clear variables when we lose the catalog asset.
if ( ( assetId . IsValid ( ) & & assetId ! = m_removedCatalogId )
| | ( ! assetId . IsValid ( ) & & ! m_removed CatalogId. IsValid ( ) ) )
if ( ( assetId . IsValidDescription ( ) & & assetId . Describe ( ) ! = m_removedHandle . Describe ( ) )
| | ( ! assetId . IsValidDescription ( ) & & ! m_removedHandle . IsValidDescription ( ) ) )
{
ClearVariables ( ) ;
}
if ( assetId . IsValid ( ) )
if ( assetId . IsValidDescription ( ) )
{
AssetTrackerNotificationBus : : Handler : : BusConnect ( assetId ) ;
ScriptCanvasMemoryAsset : : pointer memoryAsset ;
AssetTrackerRequestBus : : BroadcastResult ( memoryAsset , & AssetTrackerRequests : : GetAsset , assetId ) ;
if ( memoryAsset & & memoryAsset - > GetAsset ( ) . GetStatus ( ) = = AZ : : Data : : AssetData : : AssetStatus : : Ready )
if ( auto loaded = LoadFromFile ( assetId . Path ( ) . c_str ( ) ) ; loaded . IsSuccess ( ) )
{
OnScriptCanvasAssetReady ( memoryAsset ) ;
OnScriptCanvasAssetReady ( loaded . GetValue ( ) ) ;
}
}
@ -476,39 +411,49 @@ namespace ScriptCanvasEditor
AZ : : ScriptSystemRequestBus : : Broadcast ( & AZ : : ScriptSystemRequests : : GarbageCollect ) ;
}
void EditorScriptCanvasComponent : : SetAssetId ( const AZ: : Data : : AssetId & assetId )
void EditorScriptCanvasComponent : : SetAssetId ( const SourceHandle & assetId )
{
if ( m_s criptCanvasAssetHolder. GetAssetId ( ) ! = assetId )
if ( m_s ourceHandle. Describe ( ) ! = assetId . Describe ( ) )
{
// Invalidate the previously removed catalog id if we are setting a new asset id
m_removed CatalogId. SetInvalid ( ) ;
SetPrimaryAsset ( assetId );
m_removed Handle = { } ;
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
{
return m_scriptCanvasAssetHolder . GetAssetId ( ) . IsValid ( ) ;
return ! m_sourceHandle . Id ( ) . IsNull ( ) ;
}
ScriptCanvas : : GraphIdentifier EditorScriptCanvasComponent : : GetGraphIdentifier ( ) const
{
// 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.
return ScriptCanvas : : GraphIdentifier ( m_s criptCanvasAssetHolder. GetAsset Id( ) , 0 ) ;
return ScriptCanvas : : GraphIdentifier ( m_s ourceHandle. Id( ) , 0 ) ;
}
void EditorScriptCanvasComponent : : OnScriptCanvasAssetReady ( const S criptCanvasMemoryAsset: : pointer memoryAsset )
void EditorScriptCanvasComponent : : OnScriptCanvasAssetReady ( const S ourceHandle& sourceHandle )
{
if ( memoryAsset- > GetFileAssetId ( ) = = m_scriptCanvasAssetHolder . GetAssetI d( ) )
if ( sourceHandle. IsVali d( ) )
{
auto assetData = memoryAsset - > GetAsset ( ) ;
[[maybe_unused]] AZ : : Entity * scriptCanvasEntity = assetData - > GetScriptCanvasEntity ( ) ;
AZ_Assert ( scriptCanvasEntity , " This graph must have a valid entity " ) ;
BuildGameEntityData ( ) ;
UpdateName ( ) ;
AzToolsFramework : : ToolsApplicationNotificationBus : : Broadcast ( & AzToolsFramework : : ToolsApplicationEvents : : InvalidatePropertyDisplay , AzToolsFramework : : Refresh_EntireTree_NewContent ) ;
}
else
{
// #sc_editor_asset clear or disable something
}
}
void EditorScriptCanvasComponent : : ClearVariables ( )