1
1
#include < StdInc.h>
2
- #include " ../game_sa/CAnimBlendSequenceSA.h"
2
+ #include " game/CAnimBlendSequence.h"
3
+ #include " game/CAnimBlendHierarchy.h"
3
4
4
5
CClientIFP::CClientIFP (class CClientManager * pManager, ElementID ID) : CClientEntity(ID)
5
6
{
@@ -70,14 +71,13 @@ void CClientIFP::ReadIFPVersion1()
70
71
SDgan Dgan;
71
72
ReadDgan (Dgan);
72
73
73
- std::unique_ptr<CAnimBlendHierarchy> pAnimationHierarchy = m_pAnimManager->GetCustomAnimBlendHierarchy (&Animation.Hierarchy );
74
- InitializeAnimationHierarchy (pAnimationHierarchy, Animation.Name , Dgan.Info .Entries );
75
- Animation.pSequencesMemory = AllocateSequencesMemory (pAnimationHierarchy);
74
+ Animation.pHierarchy = m_pAnimManager->GetCustomAnimBlendHierarchy ();
75
+ InitializeAnimationHierarchy (Animation.pHierarchy , Animation.Name , Dgan.Info .Entries );
76
+ Animation.pSequencesMemory = AllocateSequencesMemory (Animation.pHierarchy );
77
+ Animation.pHierarchy ->SetSequences (reinterpret_cast <CAnimBlendSequenceSAInterface*>(Animation.pSequencesMemory + 4 ));
76
78
77
- pAnimationHierarchy->SetSequences (reinterpret_cast <CAnimBlendSequenceSAInterface*>(Animation.pSequencesMemory + 4 ));
78
-
79
- *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (pAnimationHierarchy);
80
- PreProcessAnimationHierarchy (pAnimationHierarchy);
79
+ *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (Animation.pHierarchy );
80
+ PreProcessAnimationHierarchy (Animation.pHierarchy );
81
81
}
82
82
}
83
83
@@ -94,33 +94,31 @@ void CClientIFP::ReadIFPVersion2(bool bAnp3)
94
94
95
95
Animation.Name = AnimationNode.Name ;
96
96
Animation.uiNameHash = HashString (Animation.Name .ToLower ());
97
+ Animation.pHierarchy = m_pAnimManager->GetCustomAnimBlendHierarchy ();
98
+ InitializeAnimationHierarchy (Animation.pHierarchy , AnimationNode.Name , AnimationNode.TotalObjects );
97
99
98
- auto pAnimationHierarchy = m_pAnimManager->GetCustomAnimBlendHierarchy (&Animation.Hierarchy );
99
- InitializeAnimationHierarchy (pAnimationHierarchy, AnimationNode.Name , AnimationNode.TotalObjects );
100
-
101
- Animation.pSequencesMemory = AllocateSequencesMemory (pAnimationHierarchy);
102
- pAnimationHierarchy->SetSequences (reinterpret_cast <CAnimBlendSequenceSAInterface*>(Animation.pSequencesMemory + 4 ));
100
+ Animation.pSequencesMemory = AllocateSequencesMemory (Animation.pHierarchy );
101
+ Animation.pHierarchy ->SetSequences (reinterpret_cast <CAnimBlendSequenceSAInterface*>(Animation.pSequencesMemory + 4 ));
103
102
104
- *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (pAnimationHierarchy );
105
- PreProcessAnimationHierarchy (pAnimationHierarchy );
103
+ *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (Animation. pHierarchy );
104
+ PreProcessAnimationHierarchy (Animation. pHierarchy );
106
105
}
107
106
}
108
107
109
108
WORD CClientIFP::ReadSequencesWithDummies (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy)
110
109
{
111
- std::map<DWORD, CAnimBlendSequenceSAInterface> MapOfSequences;
112
- WORD wUnknownSequences = ReadSequences (pAnimationHierarchy, MapOfSequences);
113
-
114
- CopySequencesWithDummies (pAnimationHierarchy, MapOfSequences);
110
+ SequenceMapType MapOfSequences;
111
+ WORD wUnknownSequences = ReadSequences (pAnimationHierarchy, MapOfSequences);
115
112
113
+ MoveSequencesWithDummies (pAnimationHierarchy, MapOfSequences);
116
114
WORD cSequences = m_kcIFPSequences + wUnknownSequences;
117
115
118
116
// As we need support for all 32 bones, we must change the total sequences count
119
117
pAnimationHierarchy->SetNumSequences (cSequences);
120
118
return cSequences;
121
119
}
122
120
123
- WORD CClientIFP::ReadSequences (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy, std::map<DWORD, CAnimBlendSequenceSAInterface> & MapOfSequences)
121
+ WORD CClientIFP::ReadSequences (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy, SequenceMapType & MapOfSequences)
124
122
{
125
123
if (m_bVersion1)
126
124
{
@@ -129,8 +127,7 @@ WORD CClientIFP::ReadSequences(std::unique_ptr<CAnimBlendHierarchy>& pAnimationH
129
127
return ReadSequencesVersion2 (pAnimationHierarchy, MapOfSequences);
130
128
}
131
129
132
- WORD CClientIFP::ReadSequencesVersion1 (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy,
133
- std::map<DWORD, CAnimBlendSequenceSAInterface>& MapOfSequences)
130
+ WORD CClientIFP::ReadSequencesVersion1 (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy, SequenceMapType& MapOfSequences)
134
131
{
135
132
WORD wUnknownSequences = 0 ;
136
133
for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences (); SequenceIndex++)
@@ -142,31 +139,31 @@ WORD CClientIFP::ReadSequencesVersion1(std::unique_ptr<CAnimBlendHierarchy>&
142
139
continue ;
143
140
}
144
141
145
- CAnimBlendSequenceSAInterface AnimationSequence;
146
- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = &AnimationSequence;
147
-
142
+ std::unique_ptr<CAnimBlendSequence> pAnimationSequence;
148
143
bool bUnknownSequence = iBoneID == eBoneType::UNKNOWN;
149
144
if (bUnknownSequence)
150
145
{
151
146
size_t UnkownSequenceIndex = m_kcIFPSequences + wUnknownSequences;
152
- pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
147
+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
148
+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
153
149
wUnknownSequences++;
154
150
}
155
-
156
- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
151
+ else
152
+ {
153
+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence ();
154
+ }
157
155
InitializeAnimationSequence (pAnimationSequence, Anim.Name , iBoneID);
158
156
159
157
eFrameType iFrameType = ReadKfrm ();
160
158
if ((ReadSequenceKeyFrames (pAnimationSequence, iFrameType, Anim.Frames )) && (!bUnknownSequence))
161
159
{
162
- MapOfSequences[iBoneID] = *pAnimationSequence-> GetInterface ( );
160
+ MapOfSequences[iBoneID] = std::move (pAnimationSequence );
163
161
}
164
162
}
165
163
return wUnknownSequences;
166
164
}
167
165
168
- WORD CClientIFP::ReadSequencesVersion2 (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy,
169
- std::map<DWORD, CAnimBlendSequenceSAInterface>& MapOfSequences)
166
+ WORD CClientIFP::ReadSequencesVersion2 (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy,SequenceMapType& MapOfSequences)
170
167
{
171
168
WORD wUnknownSequences = 0 ;
172
169
for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences (); SequenceIndex++)
@@ -176,22 +173,24 @@ WORD CClientIFP::ReadSequencesVersion2(std::unique_ptr<CAnimBlendHierarchy>&
176
173
177
174
bool bUnknownSequence = ObjectNode.BoneID == eBoneType::UNKNOWN;
178
175
179
- CAnimBlendSequenceSAInterface AnimationSequence;
180
- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = &AnimationSequence;
176
+ std::unique_ptr<CAnimBlendSequence> pAnimationSequence;
181
177
if (bUnknownSequence)
182
178
{
183
179
size_t UnkownSequenceIndex = m_kcIFPSequences + wUnknownSequences;
184
- pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
180
+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
181
+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
185
182
wUnknownSequences++;
186
183
}
187
-
188
- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
184
+ else
185
+ {
186
+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence ();
187
+ }
189
188
InitializeAnimationSequence (pAnimationSequence, ObjectNode.Name , ObjectNode.BoneID );
190
189
191
190
eFrameType iFrameType = static_cast <eFrameType>(ObjectNode.FrameType );
192
191
if ((ReadSequenceKeyFrames (pAnimationSequence, iFrameType, ObjectNode.TotalFrames )) && (!bUnknownSequence))
193
192
{
194
- MapOfSequences[ObjectNode.BoneID ] = *pAnimationSequence-> GetInterface ( );
193
+ MapOfSequences[ObjectNode.BoneID ] = std::move (pAnimationSequence );
195
194
}
196
195
}
197
196
return wUnknownSequences;
@@ -443,23 +442,25 @@ void CClientIFP::PreProcessAnimationHierarchy(std::unique_ptr<CAnimBlendHierarch
443
442
}
444
443
}
445
444
446
- void CClientIFP::CopySequencesWithDummies (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy,
447
- std::map<DWORD, CAnimBlendSequenceSAInterface>& mapOfSequences)
445
+ void CClientIFP::MoveSequencesWithDummies (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy, SequenceMapType& mapOfSequences)
448
446
{
449
447
for (size_t SequenceIndex = 0 ; SequenceIndex < m_kcIFPSequences; SequenceIndex++)
450
448
{
451
449
SString BoneName = m_karrstrBoneNames[SequenceIndex];
452
450
DWORD BoneID = m_karruBoneIds[SequenceIndex];
453
451
454
- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (SequenceIndex);
452
+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (SequenceIndex);
453
+ auto pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
455
454
auto it = mapOfSequences.find (BoneID);
456
455
if (it != mapOfSequences.end ())
457
456
{
458
- *pAnimationSequenceInterface = it->second ;
457
+ auto pMapAnimSequenceInterface = it->second ->GetInterface ();
458
+ pAnimationSequence->CopySequenceProperties (pMapAnimSequenceInterface);
459
+ // Delete the interface because we are moving, not copying
460
+ delete pMapAnimSequenceInterface;
459
461
}
460
462
else
461
463
{
462
- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
463
464
InsertAnimationDummySequence (pAnimationSequence, BoneName, BoneID);
464
465
}
465
466
}
@@ -1072,7 +1073,7 @@ CAnimBlendHierarchySAInterface* CClientIFP::GetAnimationHierarchy(const SString&
1072
1073
[&uiAnimationNameHash](SAnimation const & Animation) { return Animation.uiNameHash == uiAnimationNameHash; });
1073
1074
if (it != m_pVecAnimations->end ())
1074
1075
{
1075
- return & it->Hierarchy ;
1076
+ return it->pHierarchy -> GetInterface () ;
1076
1077
}
1077
1078
return nullptr ;
1078
1079
}
0 commit comments