Skip to content

Commit 63398af

Browse files
committed
Created CIFPAnimations class for keeping IFP animations only
1 parent 19f1156 commit 63398af

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include <StdInc.h>
2+
3+
CIFPAnimations::CIFPAnimations ( void )
4+
{
5+
6+
}
7+
8+
CIFPAnimations::~CIFPAnimations ( void )
9+
{
10+
printf("~CIFPAnimations(): CIFPAnimations destoryed\n");
11+
DeleteAnimations ( );
12+
}
13+
14+
void CIFPAnimations::DeleteAnimations ( void )
15+
{
16+
hCMemoryMgr_Free OLD_CMemoryMgr_Free = (hCMemoryMgr_Free)0x0072F430;
17+
auto OLD_CAnimBlendHierarchy_RemoveFromUncompressedCache = (hCAnimBlendHierarchy_RemoveFromUncompressedCache)0x004D42A0;
18+
19+
for ( size_t i = 0; i < vecAnimations.size(); i++ )
20+
{
21+
IFP_Animation * ifpAnimation = &vecAnimations[i];
22+
23+
OLD_CAnimBlendHierarchy_RemoveFromUncompressedCache ( (int)&ifpAnimation->Hierarchy );
24+
25+
for (unsigned short SequenceIndex = 0; SequenceIndex < ifpAnimation->Hierarchy.m_nSeqCount; SequenceIndex++)
26+
{
27+
_CAnimBlendSequence * pSequence = (_CAnimBlendSequence*)((BYTE*)ifpAnimation->Hierarchy.m_pSequences + (sizeof(_CAnimBlendSequence) * SequenceIndex));
28+
29+
if ( !( (pSequence->m_nFlags >> 3) & 1 ) ) // If ( !OneBigChunkForAllSequences )
30+
{
31+
OLD_CMemoryMgr_Free ( pSequence->m_pFrames ); //*(void **)(pThis + 8)); //pSequence->m_pFrames );
32+
}
33+
else
34+
{
35+
if ( SequenceIndex == 0 )
36+
{
37+
// All frames of all sequences are allocated on one memory block, so free that one
38+
// and break the loop
39+
OLD_CMemoryMgr_Free ( pSequence->m_pFrames );
40+
break;
41+
}
42+
}
43+
44+
}
45+
delete ifpAnimation->pSequencesMemory;
46+
}
47+
48+
printf("CIFPAnimations::DeleteAnimations: IFP Animations have been unloaded successfully!\n");
49+
50+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#pragma
2+
#ifndef __CIFPANIMATIONS_H
3+
#define __CIFPANIMATIONS_H
4+
#include "../mods/deathmatch/logic/IFP/IFPLoader.h"
5+
6+
class CIFPAnimations
7+
{
8+
public:
9+
// This is set to true when unloadIFP function is called, it means that animations
10+
// can be unloaded when iReferences reaches zero, if this boolean is set to true
11+
bool bUnloadOnZeroReferences;
12+
// incremented when a new CAnimBlendAssociationSAInteface is created and decremented
13+
// when destructor of that animation is called
14+
DWORD iReferences;
15+
std::vector < IFP_Animation > vecAnimations;
16+
17+
public:
18+
CIFPAnimations ( void );
19+
~CIFPAnimations ( void );
20+
21+
void DeleteAnimations ( void );
22+
23+
};
24+
#endif

0 commit comments

Comments
 (0)