Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

cModelGroup.cpp 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #include "stdafx.h"
  2. #include "cModelGroup.h"
  3. #include "cByteStream.h"
  4. #include "BSPTypes.h"
  5. cModelGroup::cModelGroup()
  6. {
  7. m_pTranslation = cPoint3D(0,0,0);
  8. for (int i=0;i<4;i++)
  9. m_fRotation[i] = 0;
  10. m_fAnimT;
  11. m_pfAnim = 0;
  12. m_fKeyData = NULL;
  13. m_dwDefaultAnim = 0;
  14. m_dwCurAnim = 0;
  15. m_dwEndFrame = 0;
  16. }
  17. cModelGroup::~cModelGroup()
  18. {
  19. for (std::vector<cModel *>::iterator i = m_vModels.begin(); i != m_vModels.end(); i++)
  20. delete *i;
  21. delete []m_fKeyData;
  22. }
  23. void cModelGroup::PlayAnimation(DWORD dwAnim, DWORD dwStartFrame, DWORD dwEndFrame, float fPlaySpeed)
  24. {
  25. m_fAnimT = dwStartFrame/fPlaySpeed;
  26. m_fPlaySpeed = fPlaySpeed;
  27. m_dwEndFrame = dwEndFrame;
  28. m_dwCurAnim = dwAnim;
  29. delete []m_fKeyData;
  30. m_fKeyData = NULL;
  31. //now, load animation data
  32. m_pfAnim = m_Portal->OpenEntry(dwAnim);
  33. if (!m_pfAnim)
  34. return;
  35. //crazyass motherfucking kewtcode
  36. int a,num_parts,num_frames,*num;
  37. int count,stride,skip;
  38. int anim_type;
  39. float *flt;
  40. DWORD *hex,*start,fil;
  41. BYTE *frames;
  42. frames=(BYTE *) m_pfAnim->data;
  43. if (!frames) return;
  44. start=(DWORD *)frames; fil=*start;
  45. num=(int *)&frames[4]; anim_type=*num; num++; num_parts=*num; num++; num_frames=*num;
  46. //init member data (killacode)
  47. m_fKeyData = new float[num_frames*num_parts*7];
  48. ZeroMemory(m_fKeyData, num_frames*num_parts*7*sizeof(float));
  49. m_iNumFrames = num_frames;
  50. m_iNumParts = num_parts;
  51. if (dwEndFrame == 0xFFFFFFFF)
  52. m_dwEndFrame = m_iNumFrames;
  53. //Index frame data
  54. skip=16;
  55. if ((anim_type==1)||(anim_type==3)) skip+=(num_frames*7*4);
  56. stride=num_parts*7;
  57. flt=(float *) &frames[skip];
  58. for (a=0;a<num_frames;a++)
  59. {
  60. memcpy(&m_fKeyData[a*num_parts*7], flt, 7*num_parts*sizeof(float));
  61. flt+=stride; hex=(DWORD *)flt;
  62. if (*hex==0) flt++; else
  63. {
  64. count=hex[0]; hex++;
  65. while (count)
  66. {
  67. if (hex[0]==0x01) hex+=3; else //0x01,0x00,soundref
  68. if (hex[0]==0x02) hex+=3; else //0x02,0x00,0x0C
  69. if (hex[0]==0x03) hex+=9; else //0x03,0x00,0x14,6floats
  70. if (hex[0]==0x05) hex+=3; else //0x05,0x00,0xBB401
  71. if (hex[0]==0x06) hex+=3; else //0x06,0x01,0x01
  72. if (hex[0]==0x07) hex+=6; else //0x07,0x00,0x0A,1.0,1.0,0x00
  73. if (hex[0]==0x0D) hex+=12; else //0x0D,lotsa stuff (3 floats in there somewhere)
  74. if (hex[0]==0x0F) hex+=3; else //0x0F,0x00,0x01
  75. if (hex[0]==0x11) hex+=2; else //0x11,0x00
  76. if (hex[0]==0x13) hex+=4; else //0x13,0x00,someREF,0x00
  77. if (hex[0]==0x14) hex+=5; else //0x14,0x00,0x00,0x00,0x00
  78. if (hex[0]==0x15) hex+=6; else //0x15,0x00,soundref,3floats
  79. if (hex[0]==0x16) hex+=5; else //0x16,0x00,0x00,2floats
  80. {
  81. // Whine ("Unknown ANIM_EXTRA","(FILE:0x%08X):(OFS:0x%04X):(EXTRA:0x%08X)",
  82. // (anm),(hex-start)*4,*hex);
  83. MessageBeep(-1);
  84. return;
  85. }
  86. count--;
  87. }
  88. flt=(float *)hex;
  89. }
  90. }
  91. }
  92. void cModelGroup::UpdateAnim(float fTime)
  93. {
  94. if (!m_dwCurAnim)
  95. return;
  96. m_fAnimT += fTime;
  97. DWORD iFrameNum = (int)(m_fPlaySpeed*m_fAnimT);
  98. if ((!m_fKeyData) || ((iFrameNum >= m_dwEndFrame) && (m_dwCurAnim != m_dwDefaultAnim)))
  99. {
  100. // delete []m_fKeyData;
  101. // return;
  102. //revert to default anim
  103. PlayAnimation(m_dwDefaultAnim, 0, 0xFFFFFFFF, 30.0f);
  104. iFrameNum = 0;
  105. //in case it fucks up
  106. if (!m_fKeyData)
  107. return;
  108. }
  109. iFrameNum %= m_iNumFrames;
  110. //Animate the nodes
  111. // for (a=0;a<m_iNumParts;a++)
  112. for (int a=0;a<(int) m_vModels.size();a++)
  113. {
  114. float *flt = &m_fKeyData[iFrameNum*m_iNumParts*7];
  115. flt += a*7;
  116. m_vModels[a]->SetTranslation(cPoint3D(flt[0], flt[1], flt[2]));
  117. m_vModels[a]->SetRotation(flt[3], flt[4], flt[5], flt[6]);
  118. }
  119. }
  120. int cModelGroup::Draw()
  121. {
  122. int tricount = 0;
  123. glPushMatrix();
  124. glTranslatef(m_pTranslation.x, m_pTranslation.y, m_pTranslation.z);
  125. glScalef(m_fScale, m_fScale, m_fScale);
  126. float s = m_fRotation[1]*m_fRotation[1] + m_fRotation[2]*m_fRotation[2] + m_fRotation[3]*m_fRotation[3];
  127. if (s > 0)
  128. glRotatef(2*acos(m_fRotation[0])*180.0f/(float)M_PI, m_fRotation[1]/s, m_fRotation[2]/s, m_fRotation[3]/s);
  129. for (std::vector<cModel *>::iterator smi = m_vModels.begin(); smi != m_vModels.end(); smi++)
  130. {
  131. tricount += (*smi)->Draw();
  132. }
  133. glPopMatrix();
  134. return tricount;
  135. }
  136. void cModelGroup::SetScale(float fScale)
  137. {
  138. m_fScale = fScale;
  139. }
  140. void cModelGroup::SetTranslation(cPoint3D Translation)
  141. {
  142. m_pTranslation = Translation;
  143. }
  144. void cModelGroup::SetRotation(float Rot1, float Rot2, float Rot3, float Rot4)
  145. {
  146. m_fRotation[0] = Rot1;
  147. m_fRotation[1] = Rot2;
  148. m_fRotation[2] = Rot3;
  149. m_fRotation[3] = Rot4;
  150. }
  151. bool cModelGroup::ReadDungeon(DWORD dwDungeon, WORD wDungeonPart, std::vector<WORD> * v_Textures)
  152. {
  153. cModel *mModel = new cModel();
  154. bool bRet = mModel->ReadDungeonPart(dwDungeon, wDungeonPart, v_Textures);
  155. if (!bRet)
  156. {
  157. delete mModel;
  158. return false;
  159. }
  160. m_vModels.push_back(mModel);
  161. return true;
  162. }
  163. bool cModelGroup::ReadModel(DWORD dwModel, std::vector<stPaletteSwap> *vPaletteSwaps, std::vector<stTextureSwap> *vTextureSwaps, std::vector<stModelSwap> *vModelSwaps)
  164. {
  165. //clear out the old
  166. for (std::vector<cModel *>::iterator i = m_vModels.begin(); i != m_vModels.end(); i++)
  167. delete *i;
  168. m_vModels.clear();
  169. if (((dwModel & 0xFF000000) >> 24) == 1){
  170. cModel *mModel = new cModel();
  171. bool bRet = mModel->ReadModel(dwModel);
  172. if (!bRet)
  173. {
  174. delete mModel;
  175. return false;
  176. }
  177. m_vModels.push_back(mModel);
  178. }
  179. if (((dwModel & 0xFF000000) >> 24) == 2)
  180. {
  181. cPortalFile *pf = m_Portal->OpenEntry(dwModel);
  182. if (!pf)
  183. {
  184. return false;
  185. }
  186. cByteStream pBS(pf->data, pf->length);
  187. pBS.ReadBegin();
  188. DWORD dwID = pBS.ReadDWORD();
  189. DWORD dwType = pBS.ReadDWORD();
  190. DWORD dwNumObjs = pBS.ReadDWORD();
  191. //Load Basic Objects
  192. for (DWORD i = 0; i < dwNumObjs; i++)
  193. {
  194. cModel *mModel = new cModel();
  195. DWORD dwSubModel = pBS.ReadDWORD();
  196. if (vModelSwaps)
  197. {
  198. for (std::vector<stModelSwap>::iterator h = vModelSwaps->begin(); h != vModelSwaps->end(); h++)
  199. {
  200. if ((*h).modelIndex == i)
  201. {
  202. dwSubModel = 0x01000000 | (*h).newModel;
  203. break;
  204. }
  205. }
  206. }
  207. bool bRet = mModel->ReadModel(dwSubModel, i, vPaletteSwaps, vTextureSwaps);
  208. if (!bRet)
  209. {
  210. delete mModel;
  211. return false;
  212. }
  213. m_vModels.push_back(mModel);
  214. }
  215. //Figure out what the hell the rest of this stuff is later
  216. if (dwType & 1)
  217. {
  218. for (DWORD i = 0; i < dwNumObjs; i++)
  219. {
  220. DWORD dwUnknown = pBS.ReadDWORD();
  221. }
  222. }
  223. if (dwType & 2)
  224. {
  225. for (DWORD i = 0; i < dwNumObjs; i++)
  226. {
  227. float fScaleX = pBS.ReadFloat();
  228. float fScaleY = pBS.ReadFloat();
  229. float fScaleZ = pBS.ReadFloat();
  230. }
  231. }
  232. if (dwType & 4)
  233. {
  234. }
  235. if (dwType & 8)
  236. {
  237. }
  238. DWORD dwLT94Count = pBS.ReadDWORD();
  239. for (DWORD i = 0; i < dwLT94Count; i++)
  240. {
  241. DWORD dwKey = pBS.ReadDWORD();
  242. DWORD dwLandcell = pBS.ReadDWORD();
  243. float fX = pBS.ReadFloat();
  244. float fY = pBS.ReadFloat();
  245. float fZ = pBS.ReadFloat();
  246. float fW = pBS.ReadFloat();
  247. float fA = pBS.ReadFloat();
  248. float fB = pBS.ReadFloat();
  249. float fC = pBS.ReadFloat();
  250. }
  251. DWORD dwLT98Count = pBS.ReadDWORD();
  252. for (DWORD i = 0; i < dwLT98Count; i++)
  253. {
  254. DWORD dwKey = pBS.ReadDWORD();
  255. DWORD dwLandcell = pBS.ReadDWORD();
  256. float fX = pBS.ReadFloat();
  257. float fY = pBS.ReadFloat();
  258. float fZ = pBS.ReadFloat();
  259. float fW = pBS.ReadFloat();
  260. float fA = pBS.ReadFloat();
  261. float fB = pBS.ReadFloat();
  262. float fC = pBS.ReadFloat();
  263. }
  264. DWORD dwPT9CCount = pBS.ReadDWORD();
  265. if (dwPT9CCount > 1) dwPT9CCount= 1;
  266. for (DWORD i = 0; i < dwPT9CCount; i++)
  267. {
  268. DWORD dwKey = pBS.ReadDWORD();
  269. for (DWORD h = 0; h < dwNumObjs; h++)
  270. {
  271. stLocation tpld;
  272. tpld.xOffset = pBS.ReadFloat();
  273. tpld.yOffset = pBS.ReadFloat();
  274. tpld.zOffset = pBS.ReadFloat();
  275. tpld.wHeading = pBS.ReadFloat();
  276. tpld.aHeading = pBS.ReadFloat();
  277. tpld.bHeading = pBS.ReadFloat();
  278. tpld.cHeading = pBS.ReadFloat();
  279. // tpld.landblock = 0;
  280. // cPoint3D tp3d;
  281. // tp3d.CalcFromLocation(&tpld);
  282. m_vModels[h]->SetTranslation(cPoint3D(tpld.xOffset, tpld.yOffset, tpld.zOffset));
  283. m_vModels[h]->SetRotation(tpld.wHeading, tpld.aHeading, tpld.bHeading, tpld.cHeading);
  284. }
  285. /* DWORD dwHookCount = pBS.ReadDWORD();
  286. for (DWORD h = 0; h < dwHookCount; h++)
  287. {
  288. //Unpack AnimHook
  289. }*/
  290. }
  291. }
  292. return true;
  293. }
  294. void cModelGroup::SetDefaultAnim(DWORD dwAnim)
  295. {
  296. m_dwDefaultAnim = dwAnim;
  297. if (!m_dwCurAnim)
  298. m_dwCurAnim = m_dwDefaultAnim;
  299. }