11#include < StdInc.h>
2- #include " ../game_sa/CAnimBlendSequenceSA.h"
2+ #include " game/CAnimBlendSequence.h"
3+ #include " game/CAnimBlendHierarchy.h"
34
45CClientIFP::CClientIFP (class CClientManager * pManager, ElementID ID) : CClientEntity(ID)
56{
@@ -70,14 +71,13 @@ void CClientIFP::ReadIFPVersion1()
7071 SDgan Dgan;
7172 ReadDgan (Dgan);
7273
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 ));
7678
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 );
8181 }
8282}
8383
@@ -94,33 +94,31 @@ void CClientIFP::ReadIFPVersion2(bool bAnp3)
9494
9595 Animation.Name = AnimationNode.Name ;
9696 Animation.uiNameHash = HashString (Animation.Name .ToLower ());
97+ Animation.pHierarchy = m_pAnimManager->GetCustomAnimBlendHierarchy ();
98+ InitializeAnimationHierarchy (Animation.pHierarchy , AnimationNode.Name , AnimationNode.TotalObjects );
9799
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 ));
103102
104- *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (pAnimationHierarchy );
105- PreProcessAnimationHierarchy (pAnimationHierarchy );
103+ *(DWORD*)Animation.pSequencesMemory = ReadSequencesWithDummies (Animation. pHierarchy );
104+ PreProcessAnimationHierarchy (Animation. pHierarchy );
106105 }
107106}
108107
109108WORD CClientIFP::ReadSequencesWithDummies (std::unique_ptr<CAnimBlendHierarchy>& pAnimationHierarchy)
110109{
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);
115112
113+ MoveSequencesWithDummies (pAnimationHierarchy, MapOfSequences);
116114 WORD cSequences = m_kcIFPSequences + wUnknownSequences;
117115
118116 // As we need support for all 32 bones, we must change the total sequences count
119117 pAnimationHierarchy->SetNumSequences (cSequences);
120118 return cSequences;
121119}
122120
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)
124122{
125123 if (m_bVersion1)
126124 {
@@ -129,8 +127,7 @@ WORD CClientIFP::ReadSequences(std::unique_ptr<CAnimBlendHierarchy>& pAnimationH
129127 return ReadSequencesVersion2 (pAnimationHierarchy, MapOfSequences);
130128}
131129
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)
134131{
135132 WORD wUnknownSequences = 0 ;
136133 for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences (); SequenceIndex++)
@@ -142,31 +139,31 @@ WORD CClientIFP::ReadSequencesVersion1(std::unique_ptr<CAnimBlendHierarchy>&
142139 continue ;
143140 }
144141
145- CAnimBlendSequenceSAInterface AnimationSequence;
146- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = &AnimationSequence;
147-
142+ std::unique_ptr<CAnimBlendSequence> pAnimationSequence;
148143 bool bUnknownSequence = iBoneID == eBoneType::UNKNOWN;
149144 if (bUnknownSequence)
150145 {
151146 size_t UnkownSequenceIndex = m_kcIFPSequences + wUnknownSequences;
152- pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
147+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
148+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
153149 wUnknownSequences++;
154150 }
155-
156- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
151+ else
152+ {
153+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence ();
154+ }
157155 InitializeAnimationSequence (pAnimationSequence, Anim.Name , iBoneID);
158156
159157 eFrameType iFrameType = ReadKfrm ();
160158 if ((ReadSequenceKeyFrames (pAnimationSequence, iFrameType, Anim.Frames )) && (!bUnknownSequence))
161159 {
162- MapOfSequences[iBoneID] = *pAnimationSequence-> GetInterface ( );
160+ MapOfSequences[iBoneID] = std::move (pAnimationSequence );
163161 }
164162 }
165163 return wUnknownSequences;
166164}
167165
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)
170167{
171168 WORD wUnknownSequences = 0 ;
172169 for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences (); SequenceIndex++)
@@ -176,22 +173,24 @@ WORD CClientIFP::ReadSequencesVersion2(std::unique_ptr<CAnimBlendHierarchy>&
176173
177174 bool bUnknownSequence = ObjectNode.BoneID == eBoneType::UNKNOWN;
178175
179- CAnimBlendSequenceSAInterface AnimationSequence;
180- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = &AnimationSequence;
176+ std::unique_ptr<CAnimBlendSequence> pAnimationSequence;
181177 if (bUnknownSequence)
182178 {
183179 size_t UnkownSequenceIndex = m_kcIFPSequences + wUnknownSequences;
184- pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
180+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (UnkownSequenceIndex);
181+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
185182 wUnknownSequences++;
186183 }
187-
188- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
184+ else
185+ {
186+ pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence ();
187+ }
189188 InitializeAnimationSequence (pAnimationSequence, ObjectNode.Name , ObjectNode.BoneID );
190189
191190 eFrameType iFrameType = static_cast <eFrameType>(ObjectNode.FrameType );
192191 if ((ReadSequenceKeyFrames (pAnimationSequence, iFrameType, ObjectNode.TotalFrames )) && (!bUnknownSequence))
193192 {
194- MapOfSequences[ObjectNode.BoneID ] = *pAnimationSequence-> GetInterface ( );
193+ MapOfSequences[ObjectNode.BoneID ] = std::move (pAnimationSequence );
195194 }
196195 }
197196 return wUnknownSequences;
@@ -443,23 +442,25 @@ void CClientIFP::PreProcessAnimationHierarchy(std::unique_ptr<CAnimBlendHierarch
443442 }
444443}
445444
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)
448446{
449447 for (size_t SequenceIndex = 0 ; SequenceIndex < m_kcIFPSequences; SequenceIndex++)
450448 {
451449 SString BoneName = m_karrstrBoneNames[SequenceIndex];
452450 DWORD BoneID = m_karruBoneIds[SequenceIndex];
453451
454- CAnimBlendSequenceSAInterface* pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (SequenceIndex);
452+ auto pAnimationSequenceInterface = pAnimationHierarchy->GetSequence (SequenceIndex);
453+ auto pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
455454 auto it = mapOfSequences.find (BoneID);
456455 if (it != mapOfSequences.end ())
457456 {
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;
459461 }
460462 else
461463 {
462- std::unique_ptr<CAnimBlendSequence> pAnimationSequence = m_pAnimManager->GetCustomAnimBlendSequence (pAnimationSequenceInterface);
463464 InsertAnimationDummySequence (pAnimationSequence, BoneName, BoneID);
464465 }
465466 }
@@ -1072,7 +1073,7 @@ CAnimBlendHierarchySAInterface* CClientIFP::GetAnimationHierarchy(const SString&
10721073 [&uiAnimationNameHash](SAnimation const & Animation) { return Animation.uiNameHash == uiAnimationNameHash; });
10731074 if (it != m_pVecAnimations->end ())
10741075 {
1075- return & it->Hierarchy ;
1076+ return it->pHierarchy -> GetInterface () ;
10761077 }
10771078 return nullptr ;
10781079}
0 commit comments