2022-04-12 15:55:39 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "StateTreeReference.h"
# include "StateTree.h"
2022-05-10 10:15:17 -04:00
2022-09-28 01:06:15 -04:00
# include UE_INLINE_GENERATED_CPP_BY_NAME(StateTreeReference)
2024-01-09 07:30:16 -05:00
void FStateTreeReference : : SyncParameters ( )
{
if ( StateTree = = nullptr )
{
Parameters . Reset ( ) ;
}
else
{
// In editor builds, sync with overrides.
Parameters . MigrateToNewBagInstanceWithOverrides ( StateTree - > GetDefaultParameters ( ) , PropertyOverrides ) ;
// Remove overrides that do not exists anymore
if ( ! PropertyOverrides . IsEmpty ( ) )
{
2024-01-10 04:37:25 -05:00
if ( const UPropertyBag * Bag = Parameters . GetPropertyBagStruct ( ) )
2024-01-09 07:30:16 -05:00
{
2024-01-10 04:37:25 -05:00
for ( TArray < FGuid > : : TIterator It = PropertyOverrides . CreateIterator ( ) ; It ; + + It )
2024-01-09 07:30:16 -05:00
{
2024-01-10 04:37:25 -05:00
if ( ! Bag - > FindPropertyDescByID ( * It ) )
{
It . RemoveCurrentSwap ( ) ;
}
2024-01-09 07:30:16 -05:00
}
}
}
}
}
2022-08-29 14:47:43 -04:00
void FStateTreeReference : : SyncParametersToMatchStateTree ( FInstancedPropertyBag & ParametersToSync ) const
2022-04-12 15:55:39 -04:00
{
if ( StateTree = = nullptr )
{
2022-05-10 10:15:17 -04:00
ParametersToSync . Reset ( ) ;
2022-04-12 15:55:39 -04:00
}
2022-05-10 10:15:17 -04:00
else
2022-04-12 15:55:39 -04:00
{
2022-05-10 10:15:17 -04:00
ParametersToSync . MigrateToNewBagInstance ( StateTree - > GetDefaultParameters ( ) ) ;
2022-04-12 15:55:39 -04:00
}
2022-05-10 10:15:17 -04:00
}
2022-04-12 15:55:39 -04:00
2022-05-10 10:15:17 -04:00
bool FStateTreeReference : : RequiresParametersSync ( ) const
{
2024-01-09 07:30:16 -05:00
bool bShouldSync = false ;
if ( StateTree )
{
const FInstancedPropertyBag & DefaultParameters = StateTree - > GetDefaultParameters ( ) ;
const UPropertyBag * DefaultParametersBag = DefaultParameters . GetPropertyBagStruct ( ) ;
const UPropertyBag * ParametersBag = Parameters . GetPropertyBagStruct ( ) ;
// Mismatching property bags, needs sync.
if ( DefaultParametersBag ! = ParametersBag )
{
bShouldSync = true ;
}
else if ( ParametersBag & & DefaultParametersBag )
{
// Check if non-overridden parameters are not identical, needs sync.
const uint8 * SourceAddress = DefaultParameters . GetValue ( ) . GetMemory ( ) ;
const uint8 * TargetAddress = Parameters . GetValue ( ) . GetMemory ( ) ;
check ( SourceAddress ) ;
check ( TargetAddress ) ;
for ( const FPropertyBagPropertyDesc & Desc : ParametersBag - > GetPropertyDescs ( ) )
{
// Skip overridden
if ( PropertyOverrides . Contains ( Desc . ID ) )
{
continue ;
}
const uint8 * SourceValueAddress = SourceAddress + Desc . CachedProperty - > GetOffset_ForInternal ( ) ;
const uint8 * TargetValueAddress = TargetAddress + Desc . CachedProperty - > GetOffset_ForInternal ( ) ;
if ( ! Desc . CachedProperty - > Identical ( SourceValueAddress , TargetValueAddress ) )
{
// Mismatching values, should sync.
bShouldSync = true ;
break ;
}
}
}
}
else
{
// Empty state tree should not have parameters
bShouldSync = Parameters . IsValid ( ) ;
}
return bShouldSync ;
2022-04-12 15:55:39 -04:00
}
2022-08-29 14:47:43 -04:00
void FStateTreeReference : : ConditionallySyncParameters ( ) const
{
if ( RequiresParametersSync ( ) )
{
FStateTreeReference * NonConstThis = const_cast < FStateTreeReference * > ( this ) ;
NonConstThis - > SyncParameters ( ) ;
UE_LOG ( LogStateTree , Warning , TEXT ( " Parameters for '%s' stored in StateTreeReference were auto-fixed to be usable at runtime. " ) , * GetNameSafe ( StateTree ) ) ;
}
}
2022-09-28 01:06:15 -04:00
2024-01-09 07:30:16 -05:00
void FStateTreeReference : : SetPropertyOverridden ( const FGuid PropertyID , const bool bIsOverridden )
{
if ( bIsOverridden )
{
PropertyOverrides . AddUnique ( PropertyID ) ;
}
else
{
PropertyOverrides . Remove ( PropertyID ) ;
ConditionallySyncParameters ( ) ;
}
}
bool FStateTreeReference : : Serialize ( FStructuredArchive : : FSlot Slot )
{
Slot . GetUnderlyingArchive ( ) . UsingCustomVersion ( FStateTreeCustomVersion : : GUID ) ;
return false ; // Let the default serializer handle serializing.
}
void FStateTreeReference : : PostSerialize ( const FArchive & Ar )
{
const int32 CurrentVersion = Ar . CustomVer ( FStateTreeCustomVersion : : GUID ) ;
if ( CurrentVersion < FStateTreeCustomVersion : : OverridableParameters )
{
// In earlier versions, all parameters were overwritten.
if ( const UPropertyBag * Bag = Parameters . GetPropertyBagStruct ( ) )
{
for ( const FPropertyBagPropertyDesc & Desc : Bag - > GetPropertyDescs ( ) )
{
PropertyOverrides . Add ( Desc . ID ) ;
}
}
}
}