summaryrefslogtreecommitdiffstats
path: root/src/animation/AnimBlendHierarchy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/animation/AnimBlendHierarchy.cpp')
-rw-r--r--src/animation/AnimBlendHierarchy.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/animation/AnimBlendHierarchy.cpp b/src/animation/AnimBlendHierarchy.cpp
new file mode 100644
index 00000000..c7d7f198
--- /dev/null
+++ b/src/animation/AnimBlendHierarchy.cpp
@@ -0,0 +1,84 @@
+#include "common.h"
+#include "patcher.h"
+#include "AnimBlendSequence.h"
+#include "AnimBlendHierarchy.h"
+
+CAnimBlendHierarchy::CAnimBlendHierarchy(void)
+{
+ sequences = nil;
+ numSequences = 0;
+ compressed = 0;
+ totalLength = 0.0f;
+ linkPtr = 0;
+}
+
+void
+CAnimBlendHierarchy::Shutdown(void)
+{
+ RemoveAnimSequences();
+ compressed = 0;
+ linkPtr = nil;
+}
+
+void
+CAnimBlendHierarchy::SetName(char *name)
+{
+ strncpy(this->name, name, 24);
+}
+
+void
+CAnimBlendHierarchy::CalcTotalTime(void)
+{
+ int i, j;
+ float totalTime = 0.0f;
+
+ for(i = 0; i < numSequences; i++){
+ float seqTime = 0.0f;
+ for(j = 0; j < sequences[i].numFrames; j++)
+ seqTime += sequences[i].GetKeyFrame(j)->deltaTime;
+ totalTime = max(totalTime, seqTime);
+ }
+ totalLength = totalTime;
+}
+
+void
+CAnimBlendHierarchy::RemoveQuaternionFlips(void)
+{
+ int i;
+
+ for(i = 0; i < numSequences; i++)
+ sequences[i].RemoveQuaternionFlips();
+}
+
+void
+CAnimBlendHierarchy::RemoveAnimSequences(void)
+{
+ if(sequences)
+ delete[] sequences;
+ numSequences = 0;
+}
+
+void
+CAnimBlendHierarchy::Uncompress(void)
+{
+ if(totalLength == 0.0f)
+ CalcTotalTime();
+ compressed = 0;
+}
+
+void
+CAnimBlendHierarchy::RemoveUncompressedData(void)
+{
+ // useless
+ compressed = 1;
+}
+
+STARTPATCHES
+ InjectHook(0x4019A0, &CAnimBlendHierarchy::Shutdown, PATCH_JUMP);
+ InjectHook(0x4019C0, &CAnimBlendHierarchy::SetName, PATCH_JUMP);
+ InjectHook(0x4019E0, &CAnimBlendHierarchy::CalcTotalTime, PATCH_JUMP);
+ InjectHook(0x401A80, &CAnimBlendHierarchy::RemoveQuaternionFlips, PATCH_JUMP);
+ InjectHook(0x401AB0, &CAnimBlendHierarchy::RemoveAnimSequences, PATCH_JUMP);
+ InjectHook(0x401AD0, &CAnimBlendHierarchy::Uncompress, PATCH_JUMP);
+ InjectHook(0x401B00, &CAnimBlendHierarchy::RemoveUncompressedData, PATCH_JUMP);
+ENDPATCHES