本文整理汇总了C++中uscriptstruct::ICppStructOps类的典型用法代码示例。如果您正苦于以下问题:C++ ICppStructOps类的具体用法?C++ ICppStructOps怎么用?C++ ICppStructOps使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ICppStructOps类的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: SerializeCustomDeltaProperty
bool FObjectReplicator::SerializeCustomDeltaProperty( UNetConnection * Connection, void * Src, UProperty * Property, int32 ArrayDim, FNetBitWriter & OutBunch, TSharedPtr<INetDeltaBaseState> &NewFullState, TSharedPtr<INetDeltaBaseState> & OldState )
{
check( NewFullState.IsValid() == false ); // NewState is passed in as NULL and instantiated within this function if necessary
SCOPE_CYCLE_COUNTER( STAT_NetSerializeItemDeltaTime );
UStructProperty * StructProperty = CastChecked< UStructProperty >( Property );
//------------------------------------------------
// Custom NetDeltaSerialization
//------------------------------------------------
if ( !ensure( ( StructProperty->Struct->StructFlags & STRUCT_NetDeltaSerializeNative ) != 0 ) )
{
return false;
}
FNetDeltaSerializeInfo Parms;
FNetSerializeCB NetSerializeCB( Connection->Driver );
Parms.OutBunch = &OutBunch;
Parms.Map = Connection->PackageMap;
Parms.OldState = OldState.Get();
Parms.NewState = &NewFullState;
Parms.NetSerializeCB = &NetSerializeCB;
UScriptStruct::ICppStructOps * CppStructOps = StructProperty->Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_NetSerializeNative
check(!StructProperty->Struct->InheritedCppStructOps()); // else should not have STRUCT_NetSerializeNative
Parms.Struct = StructProperty->Struct;
return CppStructOps->NetDeltaSerialize( Parms, Property->ContainerPtrToValuePtr<void>( Src, ArrayDim ) );
}
开发者ID:Tigrouzen,项目名称:UnrealEngine-4,代码行数:35,代码来源:DataReplication.cpp
示例2: ConvertFromType
bool UStructProperty::ConvertFromType(const FPropertyTag& Tag, FArchive& Ar, uint8* Data, UStruct* DefaultsStruct, bool& bOutAdvanceProperty)
{
bOutAdvanceProperty = false;
auto CanSerializeFromStructWithDifferentName = [](const FArchive& InAr, const FPropertyTag& PropertyTag, const UStructProperty* StructProperty)
{
if (InAr.UE4Ver() < VER_UE4_STRUCT_GUID_IN_PROPERTY_TAG)
{
// Old Implementation
return StructProperty && !StructProperty->UseBinaryOrNativeSerialization(InAr);
}
return PropertyTag.StructGuid.IsValid() && StructProperty && StructProperty->Struct && (PropertyTag.StructGuid == StructProperty->Struct->GetCustomGuid());
};
if (Struct)
{
if ((Struct->StructFlags & STRUCT_SerializeFromMismatchedTag) && (Tag.Type != NAME_StructProperty || (Tag.StructName != Struct->GetFName())) && Struct->StructFlags & STRUCT_SerializeFromMismatchedTag)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps && CppStructOps->HasSerializeFromMismatchedTag()); // else should not have STRUCT_SerializeFromMismatchedTag
void* DestAddress = ContainerPtrToValuePtr<void>(Data, Tag.ArrayIndex);
if (CppStructOps->SerializeFromMismatchedTag(Tag, Ar, DestAddress))
{
bOutAdvanceProperty = true;
}
else
{
UE_LOG(LogClass, Warning, TEXT("SerializeFromMismatchedTag failed: Type mismatch in %s of %s - Previous (%s) Current(StructProperty) for package: %s"), *Tag.Name.ToString(), *GetName(), *Tag.Type.ToString(), *Ar.GetArchiveName());
}
return true;
}
else if (Tag.Type == NAME_StructProperty && Tag.StructName != Struct->GetFName() && !CanSerializeFromStructWithDifferentName(Ar, Tag, this))
{
//handle Vector -> Vector4 upgrades here because using the SerializeFromMismatchedTag system would cause a dependency from Core -> CoreUObject
if (Tag.StructName == NAME_Vector && Struct->GetFName() == NAME_Vector4)
{
void* DestAddress = ContainerPtrToValuePtr<void>(Data, Tag.ArrayIndex);
FVector OldValue;
Ar << OldValue;
//only set X/Y/Z. The W should already have been set to the property specific default and we don't want to trash it by forcing 0 or 1.
FVector4* DestValue = (FVector4*)DestAddress;
DestValue->X = OldValue.X;
DestValue->Y = OldValue.Y;
DestValue->Z = OldValue.Z;
}
else
{
UE_LOG(LogClass, Warning, TEXT("Property %s of %s has a struct type mismatch (tag %s != prop %s) in package: %s. If that struct got renamed, add an entry to ActiveStructRedirects."),
*Tag.Name.ToString(), *GetName(), *Tag.StructName.ToString(), *Struct->GetName(), *Ar.GetArchiveName());
}
return true;
}
}
return false;
}
开发者ID:zhaoyizheng0930,项目名称:UnrealEngine,代码行数:57,代码来源:PropertyStruct.cpp
示例3: HasNoOpConstructor
bool UStructProperty::HasNoOpConstructor() const
{
Struct->PrepareCppStructOps();
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
if (CppStructOps && CppStructOps->HasNoopConstructor())
{
return true;
}
return false;
}
开发者ID:zhaoyizheng0930,项目名称:UnrealEngine,代码行数:10,代码来源:PropertyStruct.cpp
示例4: ExportTextItem
void UStructProperty::ExportTextItem( FString& ValueStr, const void* PropertyValue, const void* DefaultValue, UObject* Parent, int32 PortFlags, UObject* ExportRootScope ) const
{
if (Struct->StructFlags & STRUCT_ExportTextItemNative)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_ExportTextItemNative
check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_ExportTextItemNative
if (CppStructOps->ExportTextItem(ValueStr, PropertyValue, DefaultValue, Parent, PortFlags, ExportRootScope))
{
return;
}
}
UStructProperty_ExportTextItem(Struct, ValueStr, PropertyValue, DefaultValue, Parent, PortFlags, ExportRootScope);
}
开发者ID:1vanK,项目名称:AHRUnrealEngine,代码行数:15,代码来源:PropertyStruct.cpp
示例5: SerializeItem
void UStructProperty::SerializeItem( FArchive& Ar, void* Value, int32 MaxReadBytes, void const* Defaults ) const
{
const bool bUseBinarySerialization = UseBinarySerialization(Ar);
const bool bUseNativeSerialization = UseNativeSerialization();
// Preload struct before serialization tracking to not double count time.
if ( bUseBinarySerialization || bUseNativeSerialization)
{
Ar.Preload( Struct );
}
bool bItemSerialized = false;
if (bUseNativeSerialization)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_SerializeNative
check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_SerializeNative
bItemSerialized = CppStructOps->Serialize(Ar, Value);
}
if (!bItemSerialized)
{
if( bUseBinarySerialization )
{
// Struct is already preloaded above.
if ( !Ar.IsPersistent() && Ar.GetPortFlags() != 0 && !Struct->ShouldSerializeAtomically(Ar) )
{
Struct->SerializeBinEx( Ar, Value, Defaults, Struct );
}
else
{
Struct->SerializeBin( Ar, Value, MaxReadBytes );
}
}
else
{
Struct->SerializeTaggedProperties( Ar, (uint8*)Value, Struct, (uint8*)Defaults );
}
}
if (Struct->StructFlags & STRUCT_PostSerializeNative)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_PostSerializeNative
check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_PostSerializeNative
CppStructOps->PostSerialize(Ar, Value);
}
}
开发者ID:1vanK,项目名称:AHRUnrealEngine,代码行数:48,代码来源:PropertyStruct.cpp
示例6: NetSerializeItem
bool UStructProperty::NetSerializeItem( FArchive& Ar, UPackageMap* Map, void* Data, TArray<uint8> * MetaData ) const
{
//------------------------------------------------
// Custom NetSerialization
//------------------------------------------------
if (Struct->StructFlags & STRUCT_NetSerializeNative)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_NetSerializeNative
bool bSuccess = true;
bool bMapped = CppStructOps->NetSerialize(Ar, Map, bSuccess, Data);
if (!bSuccess)
{
UE_LOG(LogProperty, Warning, TEXT("Native NetSerialize %s (%s) failed."), *GetFullName(), *Struct->GetFullName() );
}
return bMapped;
}
UE_LOG( LogProperty, Fatal, TEXT( "Deprecated code path" ) );
return 1;
}
开发者ID:zhaoyizheng0930,项目名称:UnrealEngine,代码行数:22,代码来源:PropertyStruct.cpp
示例7: NetSerializeStruct
virtual void NetSerializeStruct( UScriptStruct* Struct, FArchive& Ar, UPackageMap* Map, void* Data, bool& bHasUnmapped )
{
if (Struct->StructFlags & STRUCT_NetSerializeNative)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_NetSerializeNative
check(!Struct->InheritedCppStructOps()); // else should not have STRUCT_NetSerializeNative
bool bSuccess = true;
if (!CppStructOps->NetSerialize(Ar, Map, bSuccess, Data))
{
bHasUnmapped = true;
}
if (!bSuccess)
{
UE_LOG(LogRep, Warning, TEXT("NetSerializeStruct: Native NetSerialize %s failed."), *Struct->GetFullName());
}
}
else
{
TSharedPtr<FRepLayout> RepLayout = Driver->GetStructRepLayout(Struct);
RepLayout->SerializePropertiesForStruct(Struct, Ar, Map, Data, bHasUnmapped);
}
}
开发者ID:frobro98,项目名称:UnrealSource,代码行数:24,代码来源:DataReplication.cpp
示例8: ReceivedBunch
//.........这里部分代码省略.........
FMemMark Mark(FMemStack::Get());
uint8 * Data = DestObj ? ReplicatedProp->ContainerPtrToValuePtr<uint8>(DestObj, Element) : NewZeroed<uint8>(FMemStack::Get(),ReplicatedProp->ElementSize);
TArray<uint8> MetaData;
PTRINT Offset = 0;
// Copy current value over to Recent for comparison
if ( DestRecent )
{
Offset = ReplicatedProp->ContainerPtrToValuePtr<uint8>(DestRecent, Element) - DestRecent;
check( Offset >= 0 && Offset < RepState->StaticBuffer.Num() ); //@todo if we move properties outside of the memory block, then this will not work anyway
ReplicatedProp->CopySingleValue( DestRecent + Offset, Data );
}
// Receive custom delta property.
UStructProperty * StructProperty = Cast< UStructProperty >( ReplicatedProp );
if ( StructProperty == NULL )
{
// This property isn't custom delta
UE_LOG( LogNetTraffic, Error, TEXT( "Property isn't custom delta %s" ), *ReplicatedProp->GetName() );
return false;
}
UScriptStruct * InnerStruct = StructProperty->Struct;
if ( !( InnerStruct->StructFlags & STRUCT_NetDeltaSerializeNative ) )
{
// This property isn't custom delta
UE_LOG( LogNetTraffic, Error, TEXT( "Property isn't custom delta %s" ), *ReplicatedProp->GetName() );
return false;
}
UScriptStruct::ICppStructOps * CppStructOps = InnerStruct->GetCppStructOps();
check( CppStructOps );
check( !InnerStruct->InheritedCppStructOps() );
FNetDeltaSerializeInfo Parms;
FNetSerializeCB NetSerializeCB( OwningChannel->Connection->Driver );
Parms.DebugName = StructProperty->GetName();
Parms.Struct = InnerStruct;
Parms.Map = PackageMap;
Parms.InArchive = &Bunch;
Parms.NetSerializeCB = &NetSerializeCB;
// Call the custom delta serialize function to handle it
CppStructOps->NetDeltaSerialize( Parms, Data );
if ( Bunch.IsError() )
{
UE_LOG( LogNet, Error, TEXT( "ReceivedBunch: NetDeltaSerialize - Bunch.IsError() == true: %s" ), *Object->GetFullName() );
return false;
}
// See if it changed from our local value
bool PropertyChanged = true;
if ( DestRecent )
{
// POD types can do a memcmp with a call to Identical
if ( ReplicatedProp->Identical( DestRecent + Offset, Data ) )
{
PropertyChanged = false;
开发者ID:Tigrouzen,项目名称:UnrealEngine-4,代码行数:67,代码来源:DataReplication.cpp
示例9: ImportText_Static
const TCHAR* UStructProperty::ImportText_Static(UScriptStruct* InStruct, const FString& Name, const TCHAR* InBuffer, void* Data, int32 PortFlags, UObject* Parent, FOutputDevice* ErrorText)
{
auto Struct = InStruct;
if (Struct->StructFlags & STRUCT_ImportTextItemNative)
{
UScriptStruct::ICppStructOps* CppStructOps = Struct->GetCppStructOps();
check(CppStructOps); // else should not have STRUCT_ImportTextItemNative
if (CppStructOps->ImportTextItem(InBuffer, Data, PortFlags, Parent, ErrorText))
{
return InBuffer;
}
}
TArray<FDefinedProperty> DefinedProperties;
// this keeps track of the number of errors we've logged, so that we can add new lines when logging more than one error
int32 ErrorCount = 0;
const TCHAR* Buffer = InBuffer;
if (*Buffer++ == TCHAR('('))
{
// Parse all properties.
while (*Buffer != TCHAR(')'))
{
// parse and import the value
Buffer = ImportSingleProperty(Buffer, Data, Struct, Parent, PortFlags | PPF_Delimited, ErrorText, DefinedProperties);
// skip any remaining text before the next property value
SkipWhitespace(Buffer);
int32 SubCount = 0;
while ( *Buffer && *Buffer != TCHAR('\r') && *Buffer != TCHAR('\n') &&
(SubCount > 0 || *Buffer != TCHAR(')')) && (SubCount > 0 || *Buffer != TCHAR(',')) )
{
SkipWhitespace(Buffer);
if (*Buffer == TCHAR('\"'))
{
do
{
Buffer++;
} while (*Buffer && *Buffer != TCHAR('\"') && *Buffer != TCHAR('\n') && *Buffer != TCHAR('\r'));
if (*Buffer != TCHAR('\"'))
{
ErrorText->Logf(TEXT("%sImportText (%s): Bad quoted string at: %s"), ErrorCount++ > 0 ? LINE_TERMINATOR : TEXT(""), *Name, Buffer);
return NULL;
}
}
else if( *Buffer == TCHAR('(') )
{
SubCount++;
}
else if( *Buffer == TCHAR(')') )
{
SubCount--;
if( SubCount < 0 )
{
ErrorText->Logf(TEXT("%sImportText (%s): Too many closing parenthesis in: %s"), ErrorCount++ > 0 ? LINE_TERMINATOR : TEXT(""), *Name, InBuffer);
return NULL;
}
}
Buffer++;
}
if( SubCount > 0 )
{
ErrorText->Logf(TEXT("%sImportText(%s): Not enough closing parenthesis in: %s"), ErrorCount++ > 0 ? LINE_TERMINATOR : TEXT(""), *Name, InBuffer);
return NULL;
}
// Skip comma.
if( *Buffer==TCHAR(',') )
{
// Skip comma.
Buffer++;
}
else if( *Buffer!=TCHAR(')') )
{
ErrorText->Logf(TEXT("%sImportText (%s): Missing closing parenthesis: %s"), ErrorCount++ > 0 ? LINE_TERMINATOR : TEXT(""), *Name, InBuffer);
return NULL;
}
SkipWhitespace(Buffer);
}
// Skip trailing ')'.
Buffer++;
}
else
{
ErrorText->Logf(TEXT("%sImportText (%s): Missing opening parenthesis: %s"), ErrorCount++ > 0 ? LINE_TERMINATOR : TEXT(""), *Name, InBuffer);
return NULL;
}
return Buffer;
}
开发者ID:zhaoyizheng0930,项目名称:UnrealEngine,代码行数:92,代码来源:PropertyStruct.cpp
示例10: ReceivedBunch
//.........这里部分代码省略.........
Bunch.SerializeIntPacked( Element );
if ( Element >= (uint32)ReplicatedProp->ArrayDim )
{
UE_LOG(LogRep, Error, TEXT("Element index too large %s in %s"), *ReplicatedProp->GetName(), *Object->GetFullName());
return false;
}
}
// Pointer to destination.
uint8* Data = ReplicatedProp->ContainerPtrToValuePtr<uint8>((uint8*)Object, Element);
TArray<uint8> MetaData;
const PTRINT DataOffset = Data - (uint8*)Object;
// Receive custom delta property.
UStructProperty * StructProperty = Cast< UStructProperty >( ReplicatedProp );
if ( StructProperty == NULL )
{
// This property isn't custom delta
UE_LOG(LogRepTraffic, Error, TEXT("Property isn't custom delta %s"), *ReplicatedProp->GetName());
return false;
}
UScriptStruct * InnerStruct = StructProperty->Struct;
if ( !( InnerStruct->StructFlags & STRUCT_NetDeltaSerializeNative ) )
{
// This property isn't custom delta
UE_LOG(LogRepTraffic, Error, TEXT("Property isn't custom delta %s"), *ReplicatedProp->GetName());
return false;
}
UScriptStruct::ICppStructOps * CppStructOps = InnerStruct->GetCppStructOps();
check( CppStructOps );
check( !InnerStruct->InheritedCppStructOps() );
FNetDeltaSerializeInfo Parms;
FNetSerializeCB NetSerializeCB( OwningChannel->Connection->Driver );
Parms.DebugName = StructProperty->GetName();
Parms.Struct = InnerStruct;
Parms.Map = PackageMap;
Parms.Reader = &Bunch;
Parms.NetSerializeCB = &NetSerializeCB;
// Call the custom delta serialize function to handle it
CppStructOps->NetDeltaSerialize( Parms, Data );
if ( Bunch.IsError() )
{
UE_LOG(LogNet, Error, TEXT("ReceivedBunch: NetDeltaSerialize - Bunch.IsError() == true: %s"), *Object->GetFullName());
return false;
}
if ( Parms.bOutHasMoreUnmapped )
{
UnmappedCustomProperties.Add( DataOffset, StructProperty );
bOutHasUnmapped = true;
}
// Successfully received it.
UE_LOG(LogRepTraffic, Log, TEXT(" %s - %s"), *Object->GetName(), *ReplicatedProp->GetName());
开发者ID:frobro98,项目名称:UnrealSource,代码行数:66,代码来源:DataReplication.cpp
示例11: UpdateUnmappedObjects
void FObjectReplicator::UpdateUnmappedObjects( bool & bOutHasMoreUnmapped )
{
UObject* Object = GetObject();
if ( Object == NULL || Object->IsPendingKill() )
{
bOutHasMoreUnmapped = false;
return;
}
if ( Connection->State == USOCK_Closed )
{
UE_LOG(LogNet, Warning, TEXT("FObjectReplicator::UpdateUnmappedObjects: Connection->State == USOCK_Closed"));
return;
}
checkf( RepState->RepNotifies.Num() == 0, TEXT("Failed RepState RepNotifies check. Num=%d. Object=%s"), RepState->RepNotifies.Num(), *Object->GetFullName() );
checkf( RepNotifies.Num() == 0, TEXT("Failed replicator RepNotifies check. Num=%d. Object=%s."), RepNotifies.Num(), *Object->GetFullName() );
bool bSomeObjectsWereMapped = false;
// Let the rep layout update any unmapped properties
RepLayout->UpdateUnmappedObjects( RepState, Connection->PackageMap, Object, bSomeObjectsWereMapped, bOutHasMoreUnmapped );
// Update unmapped objects for custom properties (currently just fast tarray)
for ( auto It = UnmappedCustomProperties.CreateIterator(); It; ++It )
{
const int32 Offset = It.Key();
UStructProperty* StructProperty = It.Value();
UScriptStruct* InnerStruct = StructProperty->Struct;
check( InnerStruct->StructFlags & STRUCT_NetDeltaSerializeNative );
UScriptStruct::ICppStructOps* CppStructOps = InnerStruct->GetCppStructOps();
check( CppStructOps );
check( !InnerStruct->InheritedCppStructOps() );
FNetDeltaSerializeInfo Parms;
FNetSerializeCB NetSerializeCB( OwningChannel->Connection->Driver );
Parms.DebugName = StructProperty->GetName();
Parms.Struct = InnerStruct;
Parms.Map = Connection->PackageMap;
Parms.NetSerializeCB = &NetSerializeCB;
Parms.bUpdateUnmappedObjects = true;
Parms.bCalledPreNetReceive = bSomeObjectsWereMapped; // RepLayout used this to flag whether PreNetReceive was called
Parms.Object = Object;
// Call the custom delta serialize function to handle it
CppStructOps->NetDeltaSerialize( Parms, (uint8*)Object + Offset );
// Merge in results
bSomeObjectsWereMapped |= Parms.bOutSomeObjectsWereMapped;
bOutHasMoreUnmapped |= Parms.bOutHasMoreUnmapped;
if ( Parms.bOutSomeObjectsWereMapped )
{
// If we mapped a property, call the rep notify
TArray<uint8> MetaData;
QueuePropertyRepNotify( Object, StructProperty, 0, MetaData );
}
// If this property no longer has unmapped objects, we can stop checking it
if ( !Parms.bOutHasMoreUnmapped )
{
It.RemoveCurrent();
}
}
// Call any rep notifies that need to happen when object pointers change
// Pass in false to override the check for queued bunches. Otherwise, if the owning channel has queued bunches,
// the RepNotifies will remain in the list and the check for 0 RepNotifies above will fail next time.
CallRepNotifies(false);
if ( bSomeObjectsWereMapped )
{
// If we mapped some objects, make sure to call PostNetReceive (some game code will need to think this was actually replicated to work)
PostNetReceive();
}
}
开发者ID:frobro98,项目名称:UnrealSource,代码行数:83,代码来源:DataReplication.cpp
注:本文中的uscriptstruct::ICppStructOps类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论