Skip to content

Commit 6b86f53

Browse files
committed
Added UMorphTarget serializers for UE3 and UE4
1 parent 4d8ce5f commit 6b86f53

File tree

5 files changed

+188
-1
lines changed

5 files changed

+188
-1
lines changed

Unreal/UnCore.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2509,6 +2509,7 @@ enum
25092509
// it doesn't matter for this framework which version will be serialized serialized -
25102510
// 4.0 or 4.1, because 4.1 has nothing new for supported object formats compared to 4.0.
25112511
VER_UE4_0 = 342,
2512+
VER_UE4_MORPHTARGET_CPU_TANGENTZDELTA_FORMATCHANGE = 348,
25122513
VER_UE4_1 = 352,
25132514
VER_UE4_2 = 363,
25142515
VER_UE4_LOAD_FOR_EDITOR_GAME = 365,
@@ -2641,6 +2642,7 @@ struct FEditorObjectVersion
26412642
// UE4.16 = 17
26422643
// UE4.17, UE4.18 = 20
26432644
// UE4.19 = 23
2645+
AddedMorphTargetSectionIndices = 23,
26442646
// UE4.20 = 24
26452647
// UE4.21 = 26
26462648
// UE4.22 = 30
@@ -2677,7 +2679,7 @@ struct FEditorObjectVersion
26772679
if (Ar.Game < GAME_UE4(19))
26782680
return (Type)20;
26792681
if (Ar.Game < GAME_UE4(20))
2680-
return (Type)23;
2682+
return AddedMorphTargetSectionIndices;
26812683
if (Ar.Game < GAME_UE4(21))
26822684
return (Type)24;
26832685
if (Ar.Game < GAME_UE4(22))

Unreal/UnMesh3.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,50 @@ void UnpackNormals(const FPackedNormal SrcNormal[3], CMeshVertex &V)
5252
}
5353

5454

55+
/*-----------------------------------------------------------------------------
56+
UMorphTarget
57+
-----------------------------------------------------------------------------*/
58+
59+
/*static*/ void FMorphTargetDelta::Serialize3(FArchive& Ar, FMorphTargetDelta& V)
60+
{
61+
Ar << V.PositionDelta;
62+
63+
FPackedNormal TangentZDelta;
64+
Ar << TangentZDelta;
65+
V.TangentZDelta = TangentZDelta; // unpack
66+
67+
if (Ar.ArVer < 806)
68+
{
69+
uint16 Idx;
70+
Ar << Idx;
71+
V.SourceIdx = Idx;
72+
}
73+
else
74+
{
75+
Ar << V.SourceIdx;
76+
}
77+
}
78+
79+
void FMorphTargetLODModel::Serialize3(FArchive& Ar, FMorphTargetLODModel& Lod)
80+
{
81+
guard(FMorphTargetLODModel::Serialize3);
82+
83+
Lod.Vertices.Serialize2<FMorphTargetDelta::Serialize3>(Ar);
84+
Ar << Lod.NumBaseMeshVerts;
85+
86+
unguard;
87+
}
88+
89+
/*static*/ void UMorphTarget::Serialize3(FArchive& Ar)
90+
{
91+
guard(UMorphTarget::Serialize3);
92+
93+
Super::Serialize(Ar);
94+
MorphLODModels.Serialize2<FMorphTargetLODModel::Serialize3>(Ar);
95+
96+
unguard;
97+
}
98+
5599

56100
/*-----------------------------------------------------------------------------
57101
USkeletalMesh

Unreal/UnMesh3.h

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,82 @@ UE3 CLASS TREE:
1919

2020
// forwards
2121
class UMaterialInterface;
22+
class USkeletalMesh3;
23+
24+
25+
/*-----------------------------------------------------------------------------
26+
UMorphTarget
27+
-----------------------------------------------------------------------------*/
28+
29+
struct FMorphTargetDelta
30+
{
31+
FVector PositionDelta;
32+
FVector TangentZDelta; // FPackedNormal for UE3, FVector for UE4
33+
uint32 SourceIdx;
34+
35+
static void Serialize3(FArchive& Ar, FMorphTargetDelta& V);
36+
#if UNREAL4
37+
static void Serialize4(FArchive& Ar, FMorphTargetDelta& V);
38+
#endif
39+
};
40+
41+
struct FMorphTargetLODModel
42+
{
43+
TArray<FMorphTargetDelta> Vertices;
44+
int32 NumBaseMeshVerts;
45+
#if UNREAL4
46+
TArray<int32> SectionIndices;
47+
#endif
48+
49+
static void Serialize3(FArchive& Ar, FMorphTargetLODModel& Lod);
50+
#if UNREAL4
51+
static void Serialize4(FArchive& Ar, FMorphTargetLODModel& Lod);
52+
#endif
53+
};
54+
55+
class UMorphTarget : public UObject
56+
{
57+
DECLARE_CLASS(UMorphTarget, UObject);
58+
public:
59+
TArray<FMorphTargetLODModel> MorphLODModels;
60+
61+
void Serialize3(FArchive& Ar);
62+
#if UNREAL4
63+
void Serialize4(FArchive& Ar);
64+
#endif
65+
66+
virtual void Serialize(FArchive& Ar)
67+
{
68+
#if UNREAL4
69+
if (Ar.Game >= GAME_UE4_BASE)
70+
{
71+
Serialize4(Ar);
72+
return;
73+
}
74+
#endif
75+
Serialize3(Ar);
76+
}
77+
78+
#if UNREAL4
79+
BEGIN_PROP_TABLE
80+
PROP_DROP(BaseSkelMesh)
81+
END_PROP_TABLE
82+
#endif
83+
};
84+
85+
// UE3 has UMorphTargetSet to map between USkeletalMesh and UMorphTarget
86+
class UMorphTargetSet : public UObject
87+
{
88+
DECLARE_CLASS(UMorphTargetSet, UObject)
89+
public:
90+
TArray<UMorphTarget*> Targets;
91+
USkeletalMesh3* BaseSkelMesh;
92+
93+
BEGIN_PROP_TABLE
94+
PROP_ARRAY(Targets, UObject*)
95+
PROP_OBJ(BaseSkelMesh)
96+
END_PROP_TABLE
97+
};
2298

2399

24100
/*-----------------------------------------------------------------------------
@@ -738,6 +814,8 @@ class UStaticMesh3 : public UObject
738814
REGISTER_CLASS(USkeletalMeshSocket) \
739815
REGISTER_CLASS(FSkeletalMeshLODInfo) \
740816
REGISTER_CLASS_ALIAS(USkeletalMesh3, UGolemSkeletalMesh) \
817+
REGISTER_CLASS(UMorphTarget) \
818+
REGISTER_CLASS(UMorphTargetSet) \
741819
REGISTER_CLASS(FRawAnimSequenceTrack) \
742820
REGISTER_CLASS(UAnimSequence) \
743821
REGISTER_CLASS(UAnimSet) \

Unreal/UnMesh4.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,4 +2668,64 @@ void UStaticMesh4::ConvertSourceModels()
26682668
}
26692669

26702670

2671+
/*-----------------------------------------------------------------------------
2672+
UMorphTarget
2673+
-----------------------------------------------------------------------------*/
2674+
2675+
/*static*/ void FMorphTargetDelta::Serialize4(FArchive& Ar, FMorphTargetDelta& V)
2676+
{
2677+
Ar << V.PositionDelta;
2678+
2679+
if (Ar.ArVer < VER_UE4_MORPHTARGET_CPU_TANGENTZDELTA_FORMATCHANGE)
2680+
{
2681+
// Pre-UE4.1
2682+
FPackedNormal TangentZDelta;
2683+
Ar << TangentZDelta;
2684+
V.TangentZDelta = TangentZDelta; // unpack
2685+
}
2686+
else
2687+
{
2688+
Ar << V.TangentZDelta;
2689+
}
2690+
2691+
Ar << V.SourceIdx;
2692+
}
2693+
2694+
/*static*/ void FMorphTargetLODModel::Serialize4(FArchive& Ar, FMorphTargetLODModel& Lod)
2695+
{
2696+
guard(FMorphTargetLODModel::Serialize4);
2697+
2698+
Lod.Vertices.Serialize2<FMorphTargetDelta::Serialize4>(Ar);
2699+
Ar << Lod.NumBaseMeshVerts;
2700+
2701+
if (FEditorObjectVersion::Get(Ar) >= FEditorObjectVersion::AddedMorphTargetSectionIndices)
2702+
{
2703+
Ar << Lod.SectionIndices;
2704+
}
2705+
2706+
if (Ar.Game >= GAME_UE4(20))
2707+
{
2708+
// Actually using FFortniteMainBranchObjectVersion::SaveGeneratedMorphTargetByEngine
2709+
bool bGeneratedByEngine;
2710+
Ar << bGeneratedByEngine;
2711+
}
2712+
2713+
unguard;
2714+
}
2715+
2716+
void UMorphTarget::Serialize4(FArchive& Ar)
2717+
{
2718+
guard(UMorphTarget::Serialize4);
2719+
2720+
Super::Serialize(Ar);
2721+
2722+
FStripDataFlags StripFlags(Ar);
2723+
if (!StripFlags.IsDataStrippedForServer())
2724+
{
2725+
MorphLODModels.Serialize2<FMorphTargetLODModel::Serialize4>(Ar);
2726+
}
2727+
2728+
unguard;
2729+
}
2730+
26712731
#endif // UNREAL4

Unreal/UnMesh4.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ class USkeletalMesh4 : public UObject
195195
USkeleton *Skeleton;
196196
TArray<FStaticLODModel4> LODModels;
197197
TArray<FSkeletalMeshLODInfo> LODInfo;
198+
TArray<UMorphTarget*> MorphTargets;
198199
#if BORDERLANDS3
199200
byte NumVertexColorChannels;
200201
#endif
@@ -208,6 +209,7 @@ class USkeletalMesh4 : public UObject
208209
PROP_OBJ(Skeleton)
209210
PROP_BOOL(bHasVertexColors)
210211
PROP_ARRAY(LODInfo, FSkeletalMeshLODInfo)
212+
PROP_ARRAY(MorphTargets, UObject*)
211213
#if BORDERLANDS3
212214
PROP_BYTE(NumVertexColorChannels)
213215
#endif
@@ -641,6 +643,7 @@ class UAnimStreamable : public UAnimSequenceBase
641643
REGISTER_CLASS(USkeleton) \
642644
REGISTER_CLASS(FSkeletalMeshLODInfo) \
643645
REGISTER_CLASS_ALIAS(USkeletalMesh4, USkeletalMesh) \
646+
REGISTER_CLASS(UMorphTarget) \
644647
REGISTER_CLASS(UDestructibleMesh) \
645648
REGISTER_CLASS_ALIAS(UStaticMesh4, UStaticMesh) \
646649
REGISTER_CLASS(FMeshBuildSettings) \

0 commit comments

Comments
 (0)