-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathTurbineAnimation.h
108 lines (84 loc) · 2.98 KB
/
TurbineAnimation.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#pragma once
#include "TurbineObject.h"
#include "AnimationPackage.h"
// The guts of the frame data are lists:
struct PartOrientation
{
inline BYTE* ReadData(BYTE* pbData) {
return (BYTE *)ReadData((float *)pbData);
}
inline float* ReadData(float* pData) {
tx = pData[0];
ty = pData[1];
tz = pData[2];
rw = pData[3];
rx = pData[4];
ry = pData[5];
rz = pData[6];
return (pData + 7);
}
float tx, ty, tz; // X Y Z translation
float rw, rx, ry, rz; // W X Y Z rotation
};
// The guts of the frame data are lists:
struct PartEvent
{
inline BYTE* ReadData(BYTE *pbData) {
EventID = ((DWORD *)pbData)[0];
pbData += 4;
switch (EventID)
{
case 0x01: memcpy(EventData, pbData, 8); pbData += 8; break; // 0x00, soundref
case 0x02: memcpy(EventData, pbData, 8); pbData += 8; break; // 0x00, 0x0C
case 0x03: memcpy(EventData, pbData, 32); pbData += 32; break; // 0x00, 0x14, 4 floats, 0x77D45F0E, 0xDCBAABCD?
case 0x05: memcpy(EventData, pbData, 8); pbData += 8; break; // 0x00, 0xBB401
case 0x06: memcpy(EventData, pbData, 8); pbData += 8; break; // 0x01, 0x01
case 0x07: memcpy(EventData, pbData, 20); pbData += 20; break; // 0x00, 0x0A, 1.0, 1.0, 0x00
case 0x0D: memcpy(EventData, pbData, 44); pbData += 44; break;
case 0x0F: memcpy(EventData, pbData, 8); pbData += 8; break; // 0x00,0x01
case 0x11: memcpy(EventData, pbData, 4); pbData += 4; break; // 0x00
case 0x13: memcpy(EventData, pbData, 12); pbData += 12; break; // 0x00, someREF, 0x00
case 0x14: memcpy(EventData, pbData, 16); pbData += 16; break; // 0x00, 0x00, 0x00, 0x00
case 0x15: memcpy(EventData, pbData, 20); pbData += 20; break; // 0x00, soundref, 3 floats
case 0x16: memcpy(EventData, pbData, 16); pbData += 16; break; // 0x00, 0x00, 2floats
default:
LOG(Animation, Warning, "Unknown animation event %08X!\n", EventID);
}
return pbData;
}
DWORD EventID;
DWORD EventData[15]; // To avoid using more dynamic memory, static max size of 15.
};
class TurbineAnimationFrame;
class TurbineAnimation;
class TurbineAnimationFrame
{
public:
TurbineAnimationFrame();
~TurbineAnimationFrame();
BYTE* InitializeTranslations(BYTE *pbFrame, int iPartCount);
BYTE* InitializeEvents(BYTE *pbFrame);
void ExecuteFrame(CPhysicsObj* pWeenie, AnimationPackage* pAnimation);
private:
PartOrientation* m_pTranslations;
PartEvent* m_pEvents;
};
typedef TurbineAnimationFrame ANIMATIONFRAME;
class TurbineAnimation : public TurbineObject
{
public:
TurbineAnimation(DWORD dwID);
~TurbineAnimation();
void Initialize(BYTE *pbData, DWORD dwLength);
BYTE* InitializeFrames(BYTE *pbFrames, unsigned int iType, unsigned int iPartCount, unsigned int iFrameCount);
inline unsigned int GetFrameCount();
inline ANIMATIONFRAME* GetFrame(int iFrame);
long GetFrameByTime(float fTime, float fSpeed);
bool Execute(CPhysicsObj* pWeenie, AnimationPackage* pAnimation);
private:
ANIMATIONFRAME* m_pFrames;
unsigned int m_iType;
unsigned int m_iPartCount;
unsigned int m_iFrameCount;
};
typedef TurbineAnimation ANIMATION;