PageRenderTime 43ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/Engine/World/VUE.cpp

#
C++ | 459 lines | 449 code | 6 blank | 4 comment | 10 complexity | 310b30a4a950a9f7e31e634fa2d9a705 MD5 | raw file
  1. #include "Math.h"
  2. #include <math.h>
  3. #include <string.h>
  4. #include "VUE.h"
  5. #include "Map.h"
  6. #include "Object.h"
  7. extern char m_Cache[4*1024*1024];
  8. vector<VUE *> VUE_Mgr::m_VueList;
  9. hash_map<string, VUE *> VUE_Mgr::m_VueMap;
  10. float VUE_Mgr::m_fFrameDelay;
  11. /////////////////////////////////////////////////////
  12. // VUE
  13. /////////////////////////////////////////////////////
  14. VUE::VUE(void)
  15. {
  16. }
  17. VUE::~VUE(void)
  18. {
  19. vector<Transforms_t *>::iterator iter = m_ObjXforms.begin();
  20. vector<Transforms_t *>::iterator end = m_ObjXforms.end();
  21. for (; iter != end; ++iter)
  22. {
  23. Transforms_t *pXform = *iter;
  24. vector<D3DXMATRIX *>::iterator iterMtx = pXform->mXforms.begin();
  25. vector<D3DXMATRIX *>::iterator endMtx = pXform->mXforms.end();
  26. for (; iterMtx != endMtx; ++iterMtx)
  27. {
  28. D3DXMATRIX *pMtx = *iterMtx;
  29. if ( pMtx )
  30. {
  31. delete pMtx;
  32. }
  33. }
  34. pXform->mXforms.clear();
  35. delete pXform;
  36. }
  37. m_ObjXforms.clear();
  38. }
  39. void VUE::VUE_ParseLine(const char *pszLine)
  40. {
  41. if ( _strnicmp(pszLine, "transform", 9) != 0 ) { return; }
  42. int l = (int)strlen(pszLine), i, idx;
  43. int nStart=-1, nEnd=-1;
  44. //1st look for quotes for the name.
  45. bool bStart=false;
  46. char szName[32];
  47. for (i=0, idx=0; i<l; i++)
  48. {
  49. if ( pszLine[i] == '"' )
  50. {
  51. if ( bStart == false ) { bStart = true; }
  52. else { szName[idx] = 0; break; }
  53. }
  54. else if ( bStart )
  55. {
  56. szName[idx] = pszLine[i]; idx++;
  57. }
  58. }
  59. i++;
  60. //now parse all the parameters.
  61. int nCurParam = 0;
  62. char szValue[256];
  63. char *pszTmp;
  64. float afParam[12];
  65. while (nCurParam < 12 )
  66. {
  67. bStart = false;
  68. while (pszLine[i] == ' ' || pszLine[i] == '\r' || pszLine[i] == '\n') { i++; }
  69. nStart = i;
  70. while (pszLine[i] != ' ' && pszLine[i] != '\r' && pszLine[i] != '\n' && pszLine[i] != 0)
  71. {
  72. szValue[i-nStart] = pszLine[i];
  73. i++;
  74. };
  75. szValue[i-nStart] = 0;
  76. afParam[nCurParam] = (float)strtod(szValue, &pszTmp);
  77. nCurParam++;
  78. };
  79. //find object in VUE and add transform...
  80. Transforms_t *pFinalObjXform=NULL;
  81. vector<Transforms_t *>::iterator iObjXformIter = m_ObjXforms.begin();
  82. vector<Transforms_t *>::iterator iObjXformEnd = m_ObjXforms.end();
  83. for (; iObjXformIter != iObjXformEnd; ++iObjXformIter)
  84. {
  85. Transforms_t *pObjXform = *iObjXformIter;
  86. if ( _stricmp(pObjXform->szVueObj, szName) == 0 )
  87. {
  88. pFinalObjXform = pObjXform;
  89. break;
  90. }
  91. }
  92. if ( pFinalObjXform == NULL )
  93. {
  94. pFinalObjXform = new Transforms_t;
  95. pFinalObjXform->bPaused = false;
  96. pFinalObjXform->bPlayOnce = false;
  97. pFinalObjXform->fCurFrameDelay = 0.0f;
  98. pFinalObjXform->nCurFrame = 0;
  99. pFinalObjXform->pObject = NULL;
  100. pFinalObjXform->pAppend = NULL;
  101. strcpy(pFinalObjXform->szVueObj, szName);
  102. m_ObjXforms.push_back( pFinalObjXform );
  103. }
  104. if ( pFinalObjXform )
  105. {
  106. D3DXMATRIX *pXform = new D3DXMATRIX;
  107. D3DXMatrixIdentity(pXform);
  108. pXform->m[0][0] = afParam[0]; pXform->m[0][1] = afParam[ 1]; pXform->m[0][2] = afParam[ 2];
  109. pXform->m[1][0] = -afParam[3]; pXform->m[1][1] = -afParam[ 4]; pXform->m[1][2] = -afParam[ 5];
  110. pXform->m[2][0] = -afParam[6]; pXform->m[2][1] = -afParam[ 7]; pXform->m[2][2] = -afParam[ 8];
  111. pXform->m[3][0] = afParam[9]; pXform->m[3][1] = afParam[10]; pXform->m[3][2] = afParam[11];
  112. pFinalObjXform->mXforms.push_back( pXform );
  113. }
  114. }
  115. bool VUE::Load(Map *pMap, char *pData, int len)
  116. {
  117. bool bSuccess = true;
  118. //now parse each line...
  119. char *pszCur = pData;
  120. char szLine[256];
  121. int lineIdx = 0;
  122. int sl = (int)strlen(pszCur);
  123. for (int l=0; l<sl; l++)
  124. {
  125. if ( pszCur[l] == '\r' || pszCur[l] == '\n' )
  126. {
  127. szLine[lineIdx] = 0;
  128. if ( lineIdx > 0 )
  129. {
  130. VUE_ParseLine(szLine);
  131. }
  132. lineIdx = 0;
  133. szLine[lineIdx] = 0;
  134. }
  135. else
  136. {
  137. szLine[lineIdx] = pszCur[l];
  138. lineIdx++;
  139. }
  140. }
  141. return bSuccess;
  142. }
  143. void VUE::Append_VUE(VUE *pVUE_Append, Object *pObj, const char *pszVueObj, bool bPause/*=true*/)
  144. {
  145. vector<Transforms_t *>::iterator iObjXformIter = m_ObjXforms.begin();
  146. vector<Transforms_t *>::iterator iObjXformEnd = m_ObjXforms.end();
  147. for (; iObjXformIter != iObjXformEnd; ++iObjXformIter)
  148. {
  149. Transforms_t *pObjXform = *iObjXformIter;
  150. if ( pObjXform->pObject == pObj && _stricmp(pObjXform->szVueObj, pszVueObj) == 0 )
  151. {
  152. pObjXform->pAppend = pVUE_Append;
  153. strcpy(pObjXform->szAppendVueObj, pszVueObj);
  154. pObjXform->bAppendPause = bPause;
  155. }
  156. }
  157. }
  158. void VUE::AttachObject(Object *pObj, const char *pszVueObj, bool bPause/*=false*/, bool bPlayOnce/*=false*/, bool b3D/*=true*/)
  159. {
  160. Obj3D *pObj3D = NULL;
  161. if ( b3D )
  162. {
  163. pObj3D = (Obj3D *)pObj;
  164. pObj3D->m_bUpdateOrient = false;
  165. }
  166. vector<Transforms_t *>::iterator iObjXformIter = m_ObjXforms.begin();
  167. vector<Transforms_t *>::iterator iObjXformEnd = m_ObjXforms.end();
  168. for (; iObjXformIter != iObjXformEnd; ++iObjXformIter)
  169. {
  170. Transforms_t *pObjXform = *iObjXformIter;
  171. if ( _stricmp(pObjXform->szVueObj, pszVueObj) == 0 )
  172. {
  173. pObjXform->bPaused = bPause;
  174. pObjXform->bPlayOnce = bPlayOnce;
  175. pObjXform->pObject = pObj;
  176. pObjXform->fCurFrameDelay = VUE_Mgr::m_fFrameDelay;
  177. pObjXform->nCurFrame = 0;
  178. pObjXform->pAppend = NULL;
  179. pObjXform->b3D = b3D;
  180. //set the initial orientation, if this VUE isn't paused...
  181. if ( !bPause )
  182. {
  183. if ( pObjXform->b3D ) { pObj3D->m_worldMtx = *pObjXform->mXforms[0]; }
  184. pObjXform->pObject->m_vLoc.Set( pObjXform->mXforms[0]->m[3][0], pObjXform->mXforms[0]->m[3][1], pObjXform->mXforms[0]->m[3][2] );
  185. }
  186. break;
  187. }
  188. }
  189. }
  190. //return false when done.
  191. bool VUE::Update(float fDeltaTime, Map *pMap)
  192. {
  193. vector<Transforms_t *>::iterator iObjXformIter = m_ObjXforms.begin();
  194. vector<Transforms_t *>::iterator iObjXformEnd = m_ObjXforms.end();
  195. for (; iObjXformIter != iObjXformEnd; ++iObjXformIter)
  196. {
  197. Transforms_t *pObjXform = *iObjXformIter;
  198. if ( pObjXform->pObject && (!pObjXform->bPaused) )
  199. {
  200. pObjXform->fCurFrameDelay -= fDeltaTime;
  201. if ( pObjXform->fCurFrameDelay <= 0.0f )
  202. {
  203. pObjXform->nCurFrame++;
  204. pObjXform->fCurFrameDelay += VUE_Mgr::m_fFrameDelay;
  205. }
  206. Obj3D *pObj3D = NULL;
  207. if (pObjXform->b3D ) { pObj3D = (Obj3D *)pObjXform->pObject; }
  208. Vector3 vPrevLoc;
  209. pObjXform->pObject->GetLoc(&vPrevLoc);
  210. //are we done?
  211. if ( pObjXform->nCurFrame >= (int)pObjXform->mXforms.size()-1 )
  212. {
  213. if ( pObjXform->mXforms.size() > 0 )
  214. {
  215. D3DXMATRIX *xform = pObjXform->mXforms[pObjXform->mXforms.size()-1];
  216. if ( pObjXform->b3D ) { pObj3D->m_worldMtx = *xform; }
  217. pObjXform->pObject->m_vLoc.Set( xform->m[3][0], xform->m[3][1], xform->m[3][2] );
  218. if ( pObjXform->bPlayOnce )
  219. {
  220. //do we now start the appended VUE?
  221. if ( pObjXform->pAppend )
  222. {
  223. pObjXform->pAppend->AttachObject( pObjXform->pObject, pObjXform->szAppendVueObj, pObjXform->bAppendPause, true, pObjXform->b3D);
  224. }
  225. pObjXform->pObject = NULL;
  226. return false;
  227. }
  228. else
  229. {
  230. pObjXform->nCurFrame = 0;
  231. }
  232. }
  233. else
  234. {
  235. pObjXform->pObject = NULL;
  236. pObjXform->nCurFrame = 0;
  237. return false;
  238. }
  239. }
  240. else
  241. {
  242. //interpolation...
  243. int fA = pObjXform->nCurFrame;
  244. int fB = pObjXform->nCurFrame+1;
  245. float s = (VUE_Mgr::m_fFrameDelay - pObjXform->fCurFrameDelay) / VUE_Mgr::m_fFrameDelay;
  246. Vector3 vXa, vYa, vZa, vPa, vXb, vYb, vZb, vPb;
  247. D3DXVECTOR3 scaleA, transA, scaleB, transB;
  248. D3DXQUATERNION quatA, quatB, quatF;
  249. D3DXMatrixDecompose(&scaleA, &quatA, &transA, pObjXform->mXforms[fA]);
  250. D3DXMatrixDecompose(&scaleB, &quatB, &transB, pObjXform->mXforms[fB]);
  251. D3DXQuaternionSlerp(&quatF, &quatA, &quatB, s);
  252. vPa.Set(transA.x, transA.y, transA.z);
  253. vPb.Set(transB.x, transB.y, transB.z);
  254. Vector3 vSa, vSb;
  255. vSa.Set(scaleA.x, scaleA.y, scaleA.z);
  256. vSb.Set(scaleB.x, scaleB.y, scaleB.z);
  257. Vector3 vP = vPa*(1.0f - s) + vPb*s;
  258. Vector3 vS = vSa*(1.0f - s) + vSb*s;
  259. //now build the final matrix...
  260. if ( pObjXform->b3D )
  261. {
  262. D3DXMATRIX scaleMtx, rotMtx;
  263. D3DXMatrixScaling(&scaleMtx, vS.x, vS.y, vS.z);
  264. D3DXMatrixRotationQuaternion(&rotMtx, &quatF);
  265. D3DXMatrixMultiply(&pObj3D->m_worldMtx, &rotMtx, &scaleMtx);
  266. pObj3D->m_worldMtx.m[3][0] = vP.x; pObj3D->m_worldMtx.m[3][1] = vP.y; pObj3D->m_worldMtx.m[3][2] = vP.z;
  267. }
  268. else
  269. {
  270. pObjXform->pObject->m_fScale = vS.x;
  271. }
  272. pObjXform->pObject->m_vLoc.Set( vP.x, vP.y, vP.z );
  273. }
  274. //need to keep track of the proper sector, uses simple collision for this.
  275. int nSector = pObjXform->pObject->GetSector();
  276. bool bCont = pMap->MoveThruSectors_NoCollide(&vPrevLoc, &pObjXform->pObject->m_vLoc, &nSector);
  277. int iIter = 0;
  278. while (bCont && iIter < 25)
  279. {
  280. bCont = pMap->MoveThruSectors_NoCollide(&vPrevLoc, &pObjXform->pObject->m_vLoc, &nSector);
  281. iIter++;
  282. };
  283. if ( nSector != pObjXform->pObject->m_nSector )
  284. {
  285. pMap->RemoveObject(pObjXform->pObject, pObjXform->pObject->m_nSector);
  286. pMap->AddObjToSector(pObjXform->pObject, nSector);
  287. pObjXform->pObject->SetSector( nSector );
  288. }
  289. }
  290. }
  291. return true;
  292. }
  293. void VUE::Unpause(int nSector)
  294. {
  295. vector<Transforms_t *>::iterator iObjXformIter = m_ObjXforms.begin();
  296. vector<Transforms_t *>::iterator iObjXformEnd = m_ObjXforms.end();
  297. for (; iObjXformIter != iObjXformEnd; ++iObjXformIter)
  298. {
  299. Transforms_t *pObjXform = *iObjXformIter;
  300. if ( pObjXform->pObject && pObjXform->pObject->GetSector() == nSector )
  301. {
  302. pObjXform->bPaused = false;
  303. pObjXform->fCurFrameDelay = VUE_Mgr::m_fFrameDelay;
  304. pObjXform->nCurFrame = 0;
  305. }
  306. }
  307. }
  308. /////////////////////////////////////////////////////
  309. // VUE_Mgr
  310. /////////////////////////////////////////////////////
  311. //destroy all loaded VUEs
  312. void VUE_Mgr::DestroyVUEs()
  313. {
  314. vector<VUE *>::iterator iter = m_VueList.begin();
  315. vector<VUE *>::iterator end = m_VueList.end();
  316. for (; iter != end; ++iter)
  317. {
  318. VUE *pVUE = *iter;
  319. delete pVUE;
  320. }
  321. m_VueList.clear();
  322. m_VueMap.clear();
  323. }
  324. //load a VUE if it doesn't exist.
  325. VUE *VUE_Mgr::LoadVUE(const char *pszFileName, Map *pMap)
  326. {
  327. //Is this VUE already loaded?
  328. hash_map<string, VUE *>::iterator iVUE = m_VueMap.find(pszFileName);
  329. if ( iVUE != m_VueMap.end() )
  330. {
  331. return iVUE->second;
  332. }
  333. //If not then load it now.
  334. long len = 0;
  335. char *pData = m_Cache;
  336. if ( pMap->m_pOptGOB && pMap->m_pOptGOB->OpenFile(pszFileName) )
  337. {
  338. len = pMap->m_pOptGOB->GetFileLen();
  339. pMap->m_pOptGOB->ReadFile(pData);
  340. pMap->m_pOptGOB->CloseFile();
  341. }
  342. else if ( pMap->m_pDarkGOB->OpenFile(pszFileName) )
  343. {
  344. len = pMap->m_pDarkGOB->GetFileLen();
  345. pMap->m_pDarkGOB->ReadFile(pData);
  346. pMap->m_pDarkGOB->CloseFile();
  347. }
  348. else
  349. {
  350. return NULL;
  351. }
  352. //save parse settings...
  353. char *pCurFileData = Map::m_pFileData;
  354. int nCurFileSize = Map::m_nFileSize;
  355. int nCurFilePtr = Map::m_nFilePtr;
  356. int nCurSeqRange0 = Map::m_SeqRange[0];
  357. int nCurSeqRange1 = Map::m_SeqRange[1];
  358. //load VUE.
  359. Map::m_pFileData = pData;
  360. Map::m_nFileSize = len;
  361. Map::m_nFilePtr = 0;
  362. Map::m_SeqRange[0] = 0;
  363. Map::m_SeqRange[1] = 0;
  364. VUE *pNewVUE = new VUE();
  365. m_VueList.push_back( pNewVUE );
  366. m_VueMap[pszFileName] = pNewVUE;
  367. pNewVUE->Load(pMap, pData, len);
  368. //restore parse settings...
  369. Map::m_pFileData = pCurFileData;
  370. Map::m_nFileSize = nCurFileSize;
  371. Map::m_nFilePtr = nCurFilePtr;
  372. Map::m_SeqRange[0] = nCurSeqRange0;
  373. Map::m_SeqRange[1] = nCurSeqRange1;
  374. return pNewVUE;
  375. }
  376. //update all the VUEs
  377. void VUE_Mgr::Update(float fDeltaTime, Map *pMap)
  378. {
  379. vector<VUE *>::iterator iter = m_VueList.begin();
  380. vector<VUE *>::iterator end = m_VueList.end();
  381. if ( fDeltaTime > m_fFrameDelay ) { fDeltaTime = m_fFrameDelay; }
  382. for (; iter != end; ++iter)
  383. {
  384. (*iter)->Update(fDeltaTime, pMap);
  385. }
  386. }
  387. //unpause all VUE transforms, where their object is in sector nSector.
  388. void VUE_Mgr::UnpauseVUE(int nSector)
  389. {
  390. vector<VUE *>::iterator iter = m_VueList.begin();
  391. vector<VUE *>::iterator end = m_VueList.end();
  392. for (; iter != end; ++iter)
  393. {
  394. (*iter)->Unpause(nSector);
  395. }
  396. }
  397. void VUE_Mgr::SetFPS(int fps)
  398. {
  399. m_fFrameDelay = 1.0f / (float)fps;
  400. }