void UObjectPropertyBase::InstanceSubobjects(void* Data, void const* DefaultData, UObject* Owner, FObjectInstancingGraph* InstanceGraph ) { for ( int32 ArrayIndex = 0; ArrayIndex < ArrayDim; ArrayIndex++ ) { UObject* CurrentValue = GetObjectPropertyValue((uint8*)Data + ArrayIndex * ElementSize); if ( CurrentValue ) { UObject *SubobjectTemplate = DefaultData ? GetObjectPropertyValue((uint8*)DefaultData + ArrayIndex * ElementSize): NULL; UObject* NewValue = InstanceGraph->InstancePropertyValue(SubobjectTemplate, CurrentValue, Owner, HasAnyPropertyFlags(CPF_Transient), HasAnyPropertyFlags(CPF_InstancedReference)); SetObjectPropertyValue((uint8*)Data + ArrayIndex * ElementSize, NewValue); } } }
void UDelegateProperty::InstanceSubobjects(void* Data, void const* DefaultData, UObject* Owner, FObjectInstancingGraph* InstanceGraph ) { for( int32 i=0; i<ArrayDim; i++ ) { FScriptDelegate& DestDelegate = ((FScriptDelegate*)Data)[i]; UObject* CurrentUObject = DestDelegate.GetUObject(); if (CurrentUObject) { UObject *Template = NULL; if (DefaultData) { FScriptDelegate& DefaultDelegate = ((FScriptDelegate*)DefaultData)[i]; Template = DefaultDelegate.GetUObject(); } UObject* NewUObject = InstanceGraph->InstancePropertyValue(Template, CurrentUObject, Owner, HasAnyPropertyFlags(CPF_Transient), false, true); DestDelegate.BindUFunction(NewUObject, DestDelegate.GetFunctionName()); } } }
void UMulticastDelegateProperty::InstanceSubobjects(void* Data, void const* DefaultData, UObject* Owner, FObjectInstancingGraph* InstanceGraph ) { if (DefaultData) { for( int32 i=0; i<ArrayDim; i++ ) { FMulticastScriptDelegate& DestDelegate = ((FMulticastScriptDelegate*)Data)[i]; FMulticastScriptDelegate& DefaultDelegate = ((FMulticastScriptDelegate*)DefaultData)[i]; // Fix up references to the class default object (if necessary) FMulticastScriptDelegate::FInvocationList::TIterator CurInvocation( DestDelegate.InvocationList ); FMulticastScriptDelegate::FInvocationList::TIterator DefaultInvocation( DefaultDelegate.InvocationList ); for(; CurInvocation && DefaultInvocation; ++CurInvocation, ++DefaultInvocation ) { FScriptDelegate& DestDelegateInvocation = *CurInvocation; UObject* CurrentUObject = DestDelegateInvocation.GetUObject(); if (CurrentUObject) { FScriptDelegate& DefaultDelegateInvocation = *DefaultInvocation; UObject *Template = DefaultDelegateInvocation.GetUObject(); UObject* NewUObject = InstanceGraph->InstancePropertyValue(Template, CurrentUObject, Owner, HasAnyPropertyFlags(CPF_Transient), false, true); DestDelegateInvocation.BindUFunction(NewUObject, DestDelegateInvocation.GetFunctionName()); } } // now finish up the ones for which there is no default for(; CurInvocation; ++CurInvocation ) { FScriptDelegate& DestDelegateInvocation = *CurInvocation; UObject* CurrentUObject = DestDelegateInvocation.GetUObject(); if (CurrentUObject) { UObject* NewUObject = InstanceGraph->InstancePropertyValue(NULL, CurrentUObject, Owner, HasAnyPropertyFlags(CPF_Transient), false, true); DestDelegateInvocation.BindUFunction(NewUObject, DestDelegateInvocation.GetFunctionName()); } } } } else // no default data { for( int32 i=0; i<ArrayDim; i++ ) { FMulticastScriptDelegate& DestDelegate = ((FMulticastScriptDelegate*)Data)[i]; for( FMulticastScriptDelegate::FInvocationList::TIterator CurInvocation( DestDelegate.InvocationList ); CurInvocation; ++CurInvocation ) { FScriptDelegate& DestDelegateInvocation = *CurInvocation; UObject* CurrentUObject = DestDelegateInvocation.GetUObject(); if (CurrentUObject) { UObject* NewUObject = InstanceGraph->InstancePropertyValue(NULL, CurrentUObject, Owner, HasAnyPropertyFlags(CPF_Transient), false, true); DestDelegateInvocation.BindUFunction(NewUObject, DestDelegateInvocation.GetFunctionName()); } } } } }