void UModel::Serialize( FArchive& Ar ) { Super::Serialize( Ar ); const int32 StripVertexBufferFlag = 1; FStripDataFlags StripFlags( Ar, GetOuter() && GetOuter()->IsA(ABrush::StaticClass()) ? StripVertexBufferFlag : FStripDataFlags::None ); Ar << Bounds; if (Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_BSP_UNDO_FIX ) { TTransArray<FVector> OldVectors(this); TTransArray<FVector> OldPoints(this); TTransArray<FBspNode> OldNodes(this); OldVectors.BulkSerialize(Ar); OldPoints.BulkSerialize(Ar); OldNodes.BulkSerialize(Ar); Vectors = OldVectors; Points = OldPoints; Nodes = OldNodes; } else { Vectors.BulkSerialize(Ar); Points.BulkSerialize(Ar); Nodes.BulkSerialize(Ar); } if( Ar.IsLoading() ) { for( int32 NodeIndex=0; NodeIndex<Nodes.Num(); NodeIndex++ ) { Nodes[NodeIndex].NodeFlags &= ~(NF_IsNew|NF_IsFront|NF_IsBack); } } if (Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_BSP_UNDO_FIX ) { TTransArray<FBspSurf> OldSurfs(this); TTransArray<FVert> OldVerts(this); Ar << OldSurfs; OldVerts.BulkSerialize(Ar); Surfs = OldSurfs; Verts = OldVerts; } else { Ar << Surfs; Verts.BulkSerialize(Ar); } if( Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_REMOVE_ZONES_FROM_MODEL) { int32 NumZones; Ar << NumSharedSides << NumZones; FZoneProperties DummyZones[FBspNode::MAX_ZONES]; for( int32 i=0; i<NumZones; i++ ) { Ar << DummyZones[i]; } } else { Ar << NumSharedSides; } #if WITH_EDITOR bool bHasEditorOnlyData = !Ar.IsFilterEditorOnly(); if ( Ar.UE4Ver() < VER_UE4_REMOVE_UNUSED_UPOLYS_FROM_UMODEL ) { bHasEditorOnlyData = true; } // if we are cooking then don't save this stuff out if ( bHasEditorOnlyData ) { Ar << Polys; LeafHulls.BulkSerialize( Ar ); Leaves.BulkSerialize( Ar ); } #else bool bHasEditorOnlyData = !Ar.IsFilterEditorOnly(); if ( Ar.UE4Ver() < VER_UE4_REMOVE_UNUSED_UPOLYS_FROM_UMODEL ) { bHasEditorOnlyData = true; } if((Ar.IsLoading() || Ar.IsSaving()) && bHasEditorOnlyData) { UPolys* DummyPolys = NULL; Ar << DummyPolys; TArray<int32> DummyLeafHulls; DummyLeafHulls.BulkSerialize( Ar ); TArray<FLeaf> DummyLeaves; DummyLeaves.BulkSerialize( Ar ); } #endif Ar << RootOutside << Linked; if(Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_REMOVE_ZONES_FROM_MODEL) { TArray<int32> DummyPortalNodes; DummyPortalNodes.BulkSerialize( Ar ); } Ar << NumUniqueVertices; // load/save vertex buffer if( StripFlags.IsEditorDataStripped() == false || StripFlags.IsClassDataStripped( StripVertexBufferFlag ) == false ) { Ar << VertexBuffer; } #if WITH_EDITOR if(GIsEditor) { CalculateUniqueVertCount(); } #endif // WITH_EDITOR // serialize the lighting guid if it's there Ar << LightingGuid; Ar << LightmassSettings; }
void UModel::Serialize( FArchive& Ar ) { Super::Serialize( Ar ); const int32 StripVertexBufferFlag = 1; FStripDataFlags StripFlags( Ar, GetOuter() && GetOuter()->IsA(ABrush::StaticClass()) ? StripVertexBufferFlag : FStripDataFlags::None ); Ar << Bounds; Vectors.BulkSerialize( Ar ); Points.BulkSerialize( Ar ); Nodes.BulkSerialize( Ar ); if( Ar.IsLoading() ) { for( int32 NodeIndex=0; NodeIndex<Nodes.Num(); NodeIndex++ ) { Nodes[NodeIndex].NodeFlags &= ~(NF_IsNew|NF_IsFront|NF_IsBack); } } Ar << Surfs; Verts.BulkSerialize( Ar ); if( Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_REMOVE_ZONES_FROM_MODEL) { int32 NumZones; Ar << NumSharedSides << NumZones; FZoneProperties DummyZones[FBspNode::MAX_ZONES]; for( int32 i=0; i<NumZones; i++ ) { Ar << DummyZones[i]; } } else { Ar << NumSharedSides; } #if WITH_EDITOR Ar << Polys; LeafHulls.BulkSerialize( Ar ); Leaves.BulkSerialize( Ar ); #else if(Ar.IsLoading()) { UPolys* DummyPolys; Ar << DummyPolys; TArray<int32> DummyLeafHulls; DummyLeafHulls.BulkSerialize( Ar ); TArray<FLeaf> DummyLeaves; DummyLeaves.BulkSerialize( Ar ); } #endif Ar << RootOutside << Linked; if(Ar.IsLoading() && Ar.UE4Ver() < VER_UE4_REMOVE_ZONES_FROM_MODEL) { TArray<int32> DummyPortalNodes; DummyPortalNodes.BulkSerialize( Ar ); } Ar << NumUniqueVertices; // load/save vertex buffer if( StripFlags.IsEditorDataStripped() == false || StripFlags.IsClassDataStripped( StripVertexBufferFlag ) == false ) { Ar << VertexBuffer; } #if WITH_EDITOR if(GIsEditor) { CalculateUniqueVertCount(); } #endif // WITH_EDITOR // serialize the lighting guid if it's there Ar << LightingGuid; Ar << LightmassSettings; }
FArchive& operator<<(FArchive& Ar, package_t*& P) { Ar << P->SubstanceUids << P->Guid; Ar << P->SourceFilePath << P->SourceFileTimestamp; TArray<uint8> arArchive; if (Ar.IsLoading()) { arArchive.BulkSerialize(Ar); P->LinkData.reset(new Substance::Details::LinkDataAssembly(&arArchive[0], arArchive.Num())); } else if(Ar.IsSaving()) { Substance::Details::LinkDataAssembly *linkdata = static_cast<Substance::Details::LinkDataAssembly*>( P->getLinkData().get()); arArchive.AddZeroed(linkdata->getAssembly().size()); FMemory::Memcpy( &arArchive[0], (void*)&linkdata->getAssembly()[0], linkdata->getAssembly().size()); arArchive.BulkSerialize(Ar); } int32 GraphCount = 0; if (Ar.IsSaving()) { GraphCount = P->Graphs.Num(); } Ar << GraphCount; if (Ar.IsLoading()) { P->Graphs.AddZeroed(GraphCount); } for (int32 Idx=0 ; Idx<GraphCount ; ++Idx) { Ar << P->Graphs[Idx]; if (Ar.IsLoading()) { P->Graphs[Idx]->Parent = P; Substance::List<output_desc_t>::TIterator itO(P->Graphs[Idx]->OutputDescs.itfront()); for (; itO ; ++itO) { Substance::Details::LinkDataAssembly *linkdata = (Substance::Details::LinkDataAssembly *)P->getLinkData().get(); if (linkdata) { linkdata->setOutputFormat( (*itO).Uid, (*itO).Format); } } } } return Ar; }