@@ -122,14 +122,14 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
122
122
pAnimationHierarchy->SetNumSequences ( AnimationNode.TotalObjects );
123
123
pAnimationHierarchy->SetAnimationBlockID ( 0 );
124
124
125
- const unsigned short TotalSequences = IFP_TOTAL_SEQUENCES + pAnimationHierarchy->GetNumSequences ( );
125
+ const unsigned short TotalSequences = cIFPSequences + pAnimationHierarchy->GetNumSequences ( );
126
126
ifpAnimation.pSequencesMemory = ( char * ) operator new ( 12 * TotalSequences + 4 ); // Allocate memory for sequences ( 12 * seq_count + 4 )
127
127
128
128
pAnimationHierarchy->SetSequences ( reinterpret_cast < CAnimBlendSequenceSAInterface * > ( ifpAnimation.pSequencesMemory + 4 ) );
129
129
130
- std::map < std::string, _CAnimBlendSequence > MapOfSequences;
130
+ std::map < std::string, CAnimBlendSequenceSAInterface > MapOfSequences;
131
131
132
- unsigned short TotalUnknownSequences = 0 ;
132
+ WORD wUnknownSequences = 0 ;
133
133
134
134
bool bFirstSeq = true ;
135
135
for (size_t SequenceIndex = 0 ; SequenceIndex < pAnimationHierarchy->GetNumSequences ( ); SequenceIndex++)
@@ -138,40 +138,18 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
138
138
139
139
readBuffer < Object >(&ObjectNode);
140
140
141
- std::string BoneName = convertStringToMapKey (ObjectNode.Name );
142
- std::string CorrectBoneName;
143
-
144
- bool bUnknownSequence = false ;
145
- if (ObjectNode.BoneID == -1 )
146
- {
147
- ObjectNode.BoneID = getBoneIDFromName (BoneName);
148
- if (ObjectNode.BoneID == -1 )
149
- {
150
- bUnknownSequence = true ;
151
- }
141
+ std::string strCorrectBoneName;
142
+ ParseSequenceObject ( ObjectNode, strCorrectBoneName );
152
143
153
- CorrectBoneName = getCorrectBoneNameFromName (BoneName);
154
- }
155
- else
156
- {
157
- CorrectBoneName = getCorrectBoneNameFromID (ObjectNode.BoneID );
158
- if (CorrectBoneName == " Unknown" )
159
- {
160
- CorrectBoneName = getCorrectBoneNameFromName (BoneName);
161
- }
162
- }
163
-
164
- memset (ObjectNode.Name , 0 , sizeof (Object::Name));
165
- strncpy (ObjectNode.Name , CorrectBoneName.c_str (), CorrectBoneName.size () +1 );
166
-
167
-
168
144
CAnimBlendSequenceSAInterface AnimationSequence;
169
145
CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = &AnimationSequence;
146
+
147
+ bool bUnknownSequence = ObjectNode.BoneID == -1 ;
170
148
if (bUnknownSequence)
171
149
{
172
- size_t UnkownSequenceIndex = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
150
+ size_t UnkownSequenceIndex = cIFPSequences + wUnknownSequences ;
173
151
pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( UnkownSequenceIndex );
174
- TotalUnknownSequences ++;
152
+ wUnknownSequences ++;
175
153
}
176
154
177
155
std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
@@ -225,36 +203,17 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
225
203
226
204
if ( !bUnknownSequence )
227
205
{
228
- _CAnimBlendSequence * pAnimSequenceInterface = (_CAnimBlendSequence*)pAnimationSequence->GetInterface ();
229
- MapOfSequences [ CorrectBoneName ] = (_CAnimBlendSequence)*pAnimSequenceInterface;
206
+ MapOfSequences [ strCorrectBoneName ] = *pAnimationSequence->GetInterface ();
230
207
}
231
208
}
232
209
}
233
210
234
- std::map < std::string, _CAnimBlendSequence >::iterator it;
235
- for (size_t SequenceIndex = 0 ; SequenceIndex < IFP_TOTAL_SEQUENCES; SequenceIndex++)
236
- {
237
- std::string BoneName = BoneNames[SequenceIndex];
238
- DWORD BoneID = BoneIds[SequenceIndex];
239
-
240
- CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( SequenceIndex );
211
+ CopySequencesWithDummies ( pAnimManager, pAnimationHierarchy, MapOfSequences );
241
212
242
- it = MapOfSequences.find (BoneName);
243
- if (it != MapOfSequences.end ())
244
- {
245
- memcpy ( pAnimationSequenceInterface, &it->second , sizeof ( CAnimBlendSequenceSAInterface ) );
246
- }
247
- else
248
- {
249
- std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
250
- InsertAnimationDummySequence ( pAnimationSequence, BoneName, BoneID );
251
- }
252
- }
253
-
254
- *(DWORD *)ifpAnimation.pSequencesMemory = IFP_TOTAL_SEQUENCES + TotalUnknownSequences;
213
+ *(DWORD *)ifpAnimation.pSequencesMemory = cIFPSequences + wUnknownSequences;
255
214
256
215
// This order is very important. As we need support for all 32 bones, we must change the total sequences count
257
- pAnimationHierarchy->SetNumSequences ( IFP_TOTAL_SEQUENCES + TotalUnknownSequences );
216
+ pAnimationHierarchy->SetNumSequences ( cIFPSequences + wUnknownSequences );
258
217
259
218
if ( !pAnimationHierarchy->isRunningCompressed ( ) )
260
219
{
@@ -265,16 +224,39 @@ void CClientIFP::ReadIFPVersion2( bool anp3)
265
224
}
266
225
}
267
226
227
+ void CClientIFP::CopySequencesWithDummies ( CAnimManager * pAnimManager, std::unique_ptr < CAnimBlendHierarchy > & pAnimationHierarchy, std::map < std::string, CAnimBlendSequenceSAInterface > & mapOfSequences )
228
+ {
229
+ std::map < std::string, CAnimBlendSequenceSAInterface >::iterator it;
230
+ for (size_t SequenceIndex = 0 ; SequenceIndex < cIFPSequences; SequenceIndex++)
231
+ {
232
+ std::string BoneName = BoneNames[SequenceIndex];
233
+ DWORD BoneID = BoneIds[SequenceIndex];
234
+
235
+ CAnimBlendSequenceSAInterface * pAnimationSequenceInterface = pAnimationHierarchy->GetSequence ( SequenceIndex );
236
+
237
+ it = mapOfSequences.find (BoneName);
238
+ if (it != mapOfSequences.end ())
239
+ {
240
+ memcpy ( pAnimationSequenceInterface, &it->second , sizeof ( CAnimBlendSequenceSAInterface ) );
241
+ }
242
+ else
243
+ {
244
+ std::unique_ptr < CAnimBlendSequence > pAnimationSequence = pAnimManager->GetCustomAnimBlendSequence ( pAnimationSequenceInterface );
245
+ InsertAnimationDummySequence ( pAnimationSequence, BoneName, BoneID );
246
+ }
247
+ }
248
+ }
249
+
268
250
void CClientIFP::ReadIFPVersion1 ( )
269
251
{
270
252
/* uint32_t OffsetEOF;
271
253
272
254
readBuffer < uint32_t > ( &OffsetEOF );
273
- ROUNDSIZE (OffsetEOF);
255
+ RoundSize (OffsetEOF);
274
256
275
257
IFP_INFO Info;
276
258
readBytes ( &Info, sizeof ( IFP_BASE ) );
277
- ROUNDSIZE (Info.Base.Size);
259
+ RoundSize (Info.Base.Size);
278
260
279
261
readBytes(&Info.Entries, Info.Base.Size);
280
262
@@ -291,7 +273,7 @@ void CClientIFP::ReadIFPVersion1 ( )
291
273
292
274
IFP_NAME Name;
293
275
readBuffer < IFP_NAME > ( &Name );
294
- ROUNDSIZE ( Name.Base.Size );
276
+ RoundSize ( Name.Base.Size );
295
277
296
278
char AnimationName [ 24 ];
297
279
readCString (AnimationName, Name.Base.Size);
@@ -309,8 +291,8 @@ void CClientIFP::ReadIFPVersion1 ( )
309
291
310
292
IFP_DGAN Dgan;
311
293
readBytes ( &Dgan, sizeof ( IFP_BASE ) * 2 );
312
- ROUNDSIZE ( Dgan.Base.Size );
313
- ROUNDSIZE ( Dgan.Info.Base.Size );
294
+ RoundSize ( Dgan.Base.Size );
295
+ RoundSize ( Dgan.Info.Base.Size );
314
296
315
297
//ofs << "going to read Dgan.Info.Entries | Dgan.Info.Base.Size : " << Dgan.Info.Base.Size << std::endl;
316
298
@@ -322,23 +304,23 @@ void CClientIFP::ReadIFPVersion1 ( )
322
304
pAnimHierarchy->m_nAnimBlockId = 0;
323
305
pAnimHierarchy->field_B = 0;
324
306
325
- const unsigned short TotalSequences = IFP_TOTAL_SEQUENCES + pAnimHierarchy->m_nSeqCount;
307
+ const unsigned short TotalSequences = cIFPSequences + pAnimHierarchy->m_nSeqCount;
326
308
ifpAnimation.pSequencesMemory = ( char * ) operator new ( 12 * TotalSequences + 4 ); // Allocate memory for sequences ( 12 * seq_count + 4 )
327
309
328
310
pAnimHierarchy->m_pSequences = ( _CAnimBlendSequence * )( ifpAnimation.pSequencesMemory+ 4 );
329
311
330
312
std::map < std::string, _CAnimBlendSequence > MapOfSequences;
331
313
332
- unsigned short TotalUnknownSequences = 0;
314
+ unsigned short wUnknownSequences = 0;
333
315
for (size_t SequenceIndex = 0; SequenceIndex < pAnimHierarchy->m_nSeqCount; SequenceIndex++)
334
316
{
335
317
IFP_CPAN Cpan;
336
318
readBuffer < IFP_CPAN > ( &Cpan );
337
- ROUNDSIZE ( Cpan.Base.Size );
319
+ RoundSize ( Cpan.Base.Size );
338
320
339
321
IFP_ANIM Anim;
340
322
readBytes ( &Anim, sizeof ( IFP_BASE ) );
341
- ROUNDSIZE ( Anim.Base.Size );
323
+ RoundSize ( Anim.Base.Size );
342
324
343
325
readBytes ( &Anim.Name, Anim.Base.Size );
344
326
@@ -381,7 +363,7 @@ void CClientIFP::ReadIFPVersion1 ( )
381
363
_CAnimBlendSequence * pUnkownSequence = nullptr;
382
364
if (bUnknownSequence)
383
365
{
384
- size_t UnkownSequenceIndex = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
366
+ size_t UnkownSequenceIndex = cIFPSequences + wUnknownSequences ;
385
367
pUnkownSequence = (_CAnimBlendSequence*)((BYTE*)pAnimHierarchy->m_pSequences + (sizeof(_CAnimBlendSequence) * UnkownSequenceIndex));
386
368
387
369
_CAnimBlendSequence_Constructor ( pUnkownSequence );
@@ -390,7 +372,7 @@ void CClientIFP::ReadIFPVersion1 ( )
390
372
391
373
OLD__CAnimBlendSequence_SetBoneTag ( pUnkownSequence, BoneID );
392
374
393
- TotalUnknownSequences ++;
375
+ wUnknownSequences ++;
394
376
}
395
377
else
396
378
{
@@ -444,7 +426,7 @@ void CClientIFP::ReadIFPVersion1 ( )
444
426
}
445
427
446
428
std::map < std::string, _CAnimBlendSequence >::iterator it;
447
- for (size_t SequenceIndex = 0; SequenceIndex < IFP_TOTAL_SEQUENCES ; SequenceIndex++)
429
+ for (size_t SequenceIndex = 0; SequenceIndex < cIFPSequences ; SequenceIndex++)
448
430
{
449
431
std::string BoneName = BoneNames[SequenceIndex];
450
432
DWORD BoneID = BoneIds[SequenceIndex];
@@ -464,10 +446,10 @@ void CClientIFP::ReadIFPVersion1 ( )
464
446
}
465
447
}
466
448
467
- *(DWORD *)ifpAnimation.pSequencesMemory = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
449
+ *(DWORD *)ifpAnimation.pSequencesMemory = cIFPSequences + wUnknownSequences ;
468
450
469
451
// This order is very important. As we need support for all 32 bones, we must change the total sequences count
470
- pAnimHierarchy->m_nSeqCount = IFP_TOTAL_SEQUENCES + TotalUnknownSequences ;
452
+ pAnimHierarchy->m_nSeqCount = cIFPSequences + wUnknownSequences ;
471
453
472
454
//ofs << std::endl << std::endl;
473
455
@@ -572,7 +554,7 @@ std::string CClientIFP::convertStringToMapKey (char * String)
572
554
return ConvertedString;
573
555
}
574
556
575
- IFP_FrameType CClientIFP::getFrameTypeFromFourCC ( char * FourCC )
557
+ CClientIFP:: IFP_FrameType CClientIFP::getFrameTypeFromFourCC ( char * FourCC )
576
558
{
577
559
if (strncmp (FourCC, " KRTS" , 4 ) == 0 )
578
560
{
@@ -1087,6 +1069,35 @@ std::string CClientIFP::getCorrectBoneNameFromName(std::string const& BoneName)
1087
1069
return BoneName;
1088
1070
}
1089
1071
1072
+ constexpr void CClientIFP::RoundSize ( uint32_t & u32Size )
1073
+ {
1074
+ if ( u32Size & 3 )
1075
+ {
1076
+ u32Size += 4 - ( u32Size & 3 );
1077
+ }
1078
+ }
1079
+
1080
+ void CClientIFP::ParseSequenceObject ( Object & ObjectNode, std::string & CorrectBoneName )
1081
+ {
1082
+ std::string BoneName = convertStringToMapKey ( ObjectNode.Name );
1083
+
1084
+ if (ObjectNode.BoneID == -1 )
1085
+ {
1086
+ ObjectNode.BoneID = getBoneIDFromName ( BoneName );
1087
+ CorrectBoneName = getCorrectBoneNameFromName ( BoneName );
1088
+ }
1089
+ else
1090
+ {
1091
+ CorrectBoneName = getCorrectBoneNameFromID ( ObjectNode.BoneID );
1092
+ if ( CorrectBoneName == " Unknown" )
1093
+ {
1094
+ CorrectBoneName = getCorrectBoneNameFromName ( BoneName );
1095
+ }
1096
+ }
1097
+
1098
+ strncpy ( ObjectNode.Name , CorrectBoneName.c_str (), CorrectBoneName.size () +1 );
1099
+ }
1100
+
1090
1101
CAnimBlendHierarchySAInterface * CClientIFP::GetAnimationHierarchy ( const SString & strAnimationName )
1091
1102
{
1092
1103
for ( auto it = m_pVecAnimations->begin (); it != m_pVecAnimations->end (); ++it )
0 commit comments