Clone of PhatAC @ https://github.com/floaterxk/PhatAC

TurbineAnimation.h 3.0KB

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