50 lines
1.7 KiB
C++
50 lines
1.7 KiB
C++
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
|
|
||
|
|
#include "Serialization/ArchiveDescribeReference.h"
|
||
|
|
#include "UObject/UnrealType.h"
|
||
|
|
|
||
|
|
FArchiveDescribeReference::FArchiveDescribeReference(UObject* Src, UObject* InTarget, FOutputDevice& InOutput): Source(Src), Target(InTarget), Output(InOutput)
|
||
|
|
{
|
||
|
|
// use the optimized RefLink to skip over properties which don't contain object references
|
||
|
|
ArIsObjectReferenceCollector = true;
|
||
|
|
|
||
|
|
ArIgnoreArchetypeRef = false;
|
||
|
|
ArIgnoreOuterRef = true;
|
||
|
|
ArIgnoreClassRef = false;
|
||
|
|
|
||
|
|
Source->Serialize(*this);
|
||
|
|
}
|
||
|
|
|
||
|
|
FArchive& FArchiveDescribeReference::operator<<(class UObject*& Obj)
|
||
|
|
{
|
||
|
|
if (Obj == Target)
|
||
|
|
{
|
||
|
|
if (GetSerializedProperty())
|
||
|
|
{
|
||
|
|
Output.Logf(TEXT(" [%s]"), *GetSerializedProperty()->GetFullName());
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Output.Logf(TEXT(" [native]"));
|
||
|
|
}
|
||
|
|
PTRINT BigOffset = ((uint8*)&Obj) - (uint8*)Source;
|
||
|
|
if (BigOffset > 0 && BigOffset < Source->GetClass()->GetPropertiesSize())
|
||
|
|
{
|
||
|
|
int32 Offset = int32(BigOffset);
|
||
|
|
UClass* UseClass = Source->GetClass();
|
||
|
|
UClass* SuperClass = UseClass->GetSuperClass();
|
||
|
|
while (1)
|
||
|
|
{
|
||
|
|
if (!SuperClass || Offset >= SuperClass->GetPropertiesSize())
|
||
|
|
{
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
UseClass = SuperClass;
|
||
|
|
SuperClass = UseClass->GetSuperClass();
|
||
|
|
}
|
||
|
|
Output.Logf(TEXT(" class %s offset %d, offset from UObject %d "), *UseClass->GetName(), SuperClass ? Offset - SuperClass->GetPropertiesSize() : Offset, Offset);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return *this;
|
||
|
|
}
|