static bool GameUsesFCompactIndex(FArchive &Ar) { #if UC2 if (Ar.Engine() == GAME_UE2X && Ar.ArVer >= 145) return false; #endif #if VANGUARD if (Ar.Game == GAME_Vanguard && Ar.ArVer >= 128 && Ar.ArLicenseeVer >= 25) return false; #endif #if UNREAL3 if (Ar.Engine() >= GAME_UE3) return false; #endif return true; }
void UVertMesh::Serialize(FArchive &Ar) { guard(UVertMesh::Serialize); #if UNREAL1 if (Ar.Engine() == GAME_UE1) { SerializeVertMesh1(Ar); RotOrigin.Roll = -RotOrigin.Roll; //?? return; } #endif // UNREAL1 Super::Serialize(Ar); RotOrigin.Roll = -RotOrigin.Roll; //?? Ar << AnimMeshVerts << StreamVersion; // FAnimMeshVertexStream: may skip this (simply seek archive) Ar << Verts2 << f150; Ar << AnimSeqs << Normals; Ar << VertexCount << FrameCount; Ar << BoundingBoxes << BoundingSpheres; unguard; }
void USkeletalMesh::Serialize(FArchive &Ar) { guard(USkeletalMesh::Serialize); assert(Ar.Game < GAME_UE3); #if UNREAL1 if (Ar.Engine() == GAME_UE1) { SerializeSkelMesh1(Ar); return; } #endif #if BIOSHOCK if (Ar.Game == GAME_Bioshock) { SerializeBioshockMesh(Ar); return; } #endif Super::Serialize(Ar); #if SPLINTER_CELL if (Ar.Game == GAME_SplinterCell) { SerializeSCell(Ar); return; } #endif // SPLINTER_CELL #if TRIBES3 TRIBES_HDR(Ar, 4); #endif Ar << Points2; #if BATTLE_TERR if (Ar.Game == GAME_BattleTerr && Ar.ArVer >= 134) { TArray<FVector> Points3; Ar << Points3; } #endif // BATTLE_TERR Ar << RefSkeleton; #if DEBUG_SKELMESH appPrintf("RefSkeleton: %d bones\n", RefSkeleton.Num()); for (int i1 = 0; i1 < RefSkeleton.Num(); i1++) appPrintf(" [%d] n=%s p=%d\n", i1, *RefSkeleton[i1].Name, RefSkeleton[i1].ParentIndex); #endif // DEBUG_SKELMESH #if SWRC if (Ar.Game == GAME_RepCommando && Ar.ArVer >= 142) { for (int i = 0; i < RefSkeleton.Num(); i++) { FMeshBone &B = RefSkeleton[i]; B.BonePos.Orientation.X *= -1; B.BonePos.Orientation.Y *= -1; B.BonePos.Orientation.Z *= -1; } } if (Ar.Game == GAME_RepCommando && Version >= 5) { TArray<FMeshAnimLinkSWRC> Anims; Ar << Anims; if (Anims.Num() >= 1) Animation = Anims[0].Anim; } else #endif // SWRC Ar << Animation; #if AA2 if (Ar.Game == GAME_AA2 && Ar.ArLicenseeVer >= 22) { TArray<UObject*> unk230; Ar << unk230; } #endif // AA2 Ar << SkeletalDepth << WeightIndices << BoneInfluences; #if SWRC if (Ar.Game == GAME_RepCommando && Ar.ArVer >= 140) { TArray<FAttachSocketSWRC> Sockets; Ar << Sockets; //?? convert } else #endif // SWRC { Ar << AttachAliases << AttachBoneNames << AttachCoords; } if (Version <= 1) { // appNotify("SkeletalMesh of version %d\n", Version); TArray<FLODMeshSection> tmp1, tmp2; TArray<word> tmp3; Ar << tmp1 << tmp2 << tmp3; // copy and convert data from old mesh format UpgradeMesh(); } else { #if UC2 if (Ar.Engine() == GAME_UE2X && Ar.ArVer >= 136) { int f338; Ar << f338; } #endif // UC2 #if SWRC if (Ar.Game == GAME_RepCommando) { int f1C4; if (Version >= 6) Ar << f1C4; Ar << LODModels; if (Version < 5) Ar << f224; Ar << Points << Wedges << Triangles << VertInfluences; Ar << CollapseWedge << f1C8; goto skip_remaining; } #endif // SWRC #if EOS if (Ar.Game == GAME_EOS) { int unk1; UObject* unk2; UObject* unk3; if (Version >= 6) Ar << unk1 << unk2; if (Version >= 7) Ar << unk3; Ar << LODModels; goto skip_remaining; } #endif // EOS #if 0 // Shui Hu Q Zhuan 2 Online if (Ar.ArVer == 126 && Ar.ArLicenseeVer == 1) { // skip LOD models int Num; Ar << AR_INDEX(Num); for (int i = 0; i < Num; i++) { int Pos; Ar << Pos; Ar.Seek(Ar.Tell() + Pos - 4); } goto after_lods; } #endif Ar << LODModels; after_lods: Ar << f224 << Points; #if BATTLE_TERR if (Ar.Game == GAME_BattleTerr && Ar.ArVer >= 134) { TLazyArray<int> unk15C; Ar << unk15C; } #endif // BATTLE_TERR Ar << Wedges << Triangles << VertInfluences; Ar << CollapseWedge << f1C8; } #if TRIBES3 if ((Ar.Game == GAME_Tribes3 || Ar.Game == GAME_Swat4) && t3_hdrSV >= 3) { #if 0 // it looks like format of following data was chenged sinse // data was prepared, and game executeble does not load these // LazyArrays (otherwise error should occur) -- so we are // simply skipping these arrays TLazyArray<FT3Unk1> unk1; TLazyArray<FMeshWedge> unk2; TLazyArray<word> unk3; Ar << unk1 << unk2 << unk3; #else SkipLazyArray(Ar); SkipLazyArray(Ar); SkipLazyArray(Ar); #endif // nothing interesting below ... goto skip_remaining; } #endif // TRIBES3 #if BATTLE_TERR if (Ar.Game == GAME_BattleTerr) goto skip_remaining; #endif #if UC2 if (Ar.Engine() == GAME_UE2X) goto skip_remaining; #endif #if LINEAGE2 if (Ar.Game == GAME_Lineage2) { int unk1, unk3, unk4; TArray<float> unk2; if (Ar.ArVer >= 118 && Ar.ArLicenseeVer >= 3) Ar << unk1; if (Ar.ArVer >= 123 && Ar.ArLicenseeVer >= 0x12) Ar << unk2; if (Ar.ArVer >= 120) Ar << unk3; // AuthKey ? if (Ar.ArLicenseeVer >= 0x23) Ar << unk4; ConvertMesh(); return; } #endif // LINEAGE2 if (Ar.ArVer >= 120) { Ar << AuthKey; } #if LOCO if (Ar.Game == GAME_Loco) goto skip_remaining; // Loco codepath is similar to UT2004, but sometimes has different version switches #endif #if UT2 if (Ar.Game == GAME_UT2) { // UT2004 has branched version of UE2, which is slightly different // in comparison with generic UE2, which is used in all other UE2 games. if (Ar.ArVer >= 122) Ar << KarmaProps << BoundingSpheres << BoundingBoxes << f32C; if (Ar.ArVer >= 127) Ar << CollisionMesh; ConvertMesh(); return; } #endif // UT2 // generic UE2 code if (Ar.ArVer >= 124) Ar << KarmaProps << BoundingSpheres << BoundingBoxes; if (Ar.ArVer >= 125) Ar << f32C; #if XIII if (Ar.Game == GAME_XIII) goto skip_remaining; #endif #if RAGNAROK2 if (Ar.Game == GAME_Ragnarok2 && Ar.ArVer >= 131) { float unk1, unk2; Ar << unk1 << unk2; } #endif // RAGNAROK2 if (Ar.ArLicenseeVer && (Ar.Tell() != Ar.GetStopper())) { appPrintf("Serializing SkeletalMesh'%s' of unknown game: %d unreal bytes\n", Name, Ar.GetStopper() - Ar.Tell()); skip_remaining: DROP_REMAINING_DATA(Ar); } ConvertMesh(); unguard; }
void UTexture::Serialize(FArchive &Ar) { guard(UTexture::Serialize); Super::Serialize(Ar); #if BIOSHOCK TRIBES_HDR(Ar, 0x2E); if (Ar.Game == GAME_Bioshock && t3_hdrSV >= 1) Ar << CachedBulkDataSize; if (Ar.Game == GAME_Bioshock && Format == 12) // remap format; note: Bioshock used 3DC name, but real format is DXT5N Format = TEXF_DXT5N; #endif // BIOSHOCK #if SWRC if (Ar.Game == GAME_RepCommando) { if (Format == 14) Format = TEXF_CxV8U8; //?? not verified } #endif // SWRC #if VANGUARD if (Ar.Game == GAME_Vanguard && Ar.ArVer >= 128 && Ar.ArLicenseeVer >= 25) { // has some table for fast mipmap lookups Ar.Seek(Ar.Tell() + 142); // skip that table // serialize mips using AR_INDEX count (this game uses int for array counts in all other places) int Count; Ar << AR_INDEX(Count); Mips.AddDefaulted(Count); for (int i = 0; i < Count; i++) Ar << Mips[i]; return; } #endif // VANGUARD #if AA2 if (Ar.Game == GAME_AA2 && Ar.ArLicenseeVer >= 8) { int unk; // always 10619 Ar << unk; } #endif // AA2 Ar << Mips; if (Ar.Engine() == GAME_UE1) { // UE1 bMasked = false; // ignored by UE1, used surface.PolyFlags instead (but UE2 ignores PolyFlags ...) if (bHasComp) // skip compressed mipmaps { TArray<FMipmap> CompMips; Ar << CompMips; } } #if XIII if (Ar.Game == GAME_XIII) { if (Ar.ArLicenseeVer >= 42) { // serialize palette if (Format == TEXF_P8 || Format == 13) // 13 == TEXF_P4 { assert(!Palette); Palette = new UPalette; Ar << Palette->Colors; } } if (Ar.ArLicenseeVer >= 55) Ar.Seek(Ar.Tell() + 3); } #endif // XIII #if EXTEEL if (Ar.Game == GAME_Exteel) { // note: this property is serialized as UObject's property too byte MaterialType; // enum GFMaterialType Ar << MaterialType; } #endif // EXTEEL unguard; }