1. #include "StdAfx.h"
  2. #include "../eterbase/Debug.h"
  3. #include "../eterlib/Camera.h"
  4. #include "../eterBase/Timer.h"
  5. #include "ThingInstance.h"
  6. #include "Thing.h"
  7. #include "ModelInstance.h"
  8. CDynamicPool<CGraphicThingInstance> CGraphicThingInstance::ms_kPool;
  9. CGraphicThing* CGraphicThingInstance::GetBaseThingPtr()
  10. {
  11. if (m_modelThingSetVector.empty())
  12. return NULL;
  13. TModelThingSet& rkModelThingSet=m_modelThingSetVector[0];
  14. if (rkModelThingSet.m_pLODThingRefVector.empty())
  15. return NULL;
  16. CGraphicThing::TRef* proThing=rkModelThingSet.m_pLODThingRefVector[0];
  17. if (!proThing)
  18. return NULL;
  19. CGraphicThing::TRef roThing=*proThing;
  20. return roThing.GetPointer();
  21. }
  22. bool CGraphicThingInstance::LessRenderOrder(CGraphicThingInstance* pkThingInst)
  23. {
  24. return (GetBaseThingPtr()<pkThingInst->GetBaseThingPtr());
  25. }
  26. void CGraphicThingInstance::CreateSystem(UINT uCapacity)
  27. {
  28. ms_kPool.Create(uCapacity);
  29. }
  30. void CGraphicThingInstance::DestroySystem()
  31. {
  32. ms_kPool.Destroy();
  33. }
  34. CGraphicThingInstance* CGraphicThingInstance::New()
  35. {
  36. return ms_kPool.Alloc();
  37. }
  38. void CGraphicThingInstance::Delete(CGraphicThingInstance* pkThingInst)
  39. {
  40. pkThingInst->Clear();
  41. ms_kPool.Free(pkThingInst);
  42. }
  43. void CGraphicThingInstance::SetMotionAtEnd()
  44. {
  45. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), std::void_mem_fun(&CGrannyLODController::SetMotionAtEnd));
  46. }
  47. bool CGraphicThingInstance::Picking(const D3DXVECTOR3 & v, const D3DXVECTOR3 & dir, float & out_x, float & out_y)
  48. {
  49. if (!m_pHeightAttributeInstance)
  50. return false;
  51. return m_pHeightAttributeInstance->Picking(v,dir,out_x,out_y);
  52. }
  53. void CGraphicThingInstance::OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector)
  54. {
  55. assert(pscdVector);
  56. CStaticCollisionDataVector::const_iterator it;
  57. for(it = pscdVector->begin();it!=pscdVector->end();++it)
  58. {
  59. AddCollision(&(*it),&GetTransform());
  60. }
  61. }
  62. void CGraphicThingInstance::OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance)
  63. {
  64. assert(pAttributeInstance);
  65. SetHeightInstance(pAttributeInstance);
  66. }
  67. bool CGraphicThingInstance::OnGetObjectHeight(float fX, float fY, float * pfHeight)
  68. {
  69. if (m_pHeightAttributeInstance && m_pHeightAttributeInstance->GetHeight(fX, fY, pfHeight))
  70. return true;
  71. return false;
  72. }
  73. void CGraphicThingInstance::BuildBoundingSphere()
  74. {
  75. D3DXVECTOR3 v3Min, v3Max;
  76. GetBoundBox(0, &v3Min, &v3Max);
  77. m_v3Center = (v3Min + v3Max) * 0.5f;
  78. D3DXVECTOR3 vDelta = (v3Max - v3Min);
  79. m_fRadius = D3DXVec3Length(&vDelta) * 0.5f + 50.0f; // extra length for attached objects
  80. }
  81. bool CGraphicThingInstance::GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius)
  82. {
  83. if (m_fRadius <= 0)
  84. {
  85. BuildBoundingSphere();
  86. fRadius = m_fRadius;
  87. v3Center = m_v3Center;
  88. }
  89. else
  90. {
  91. fRadius = m_fRadius;
  92. v3Center = m_v3Center;
  93. }
  94. D3DXVec3TransformCoord(&v3Center, &v3Center, &GetTransform());
  95. return true;
  96. }
  97. void CGraphicThingInstance::BuildBoundingAABB()
  98. {
  99. D3DXVECTOR3 v3Min, v3Max;
  100. GetBoundBox(0, &v3Min, &v3Max);
  101. m_v3Center = (v3Min + v3Max) * 0.5f;
  102. m_v3Min = v3Min;
  103. m_v3Max = v3Max;
  104. }
  105. bool CGraphicThingInstance::GetBoundingAABB(D3DXVECTOR3 & v3Min, D3DXVECTOR3 & v3Max)
  106. {
  107. BuildBoundingAABB();
  108. v3Min = m_v3Min;
  109. v3Max = m_v3Max;
  110. D3DXVec3TransformCoord(&m_v3Center, &m_v3Center, &GetTransform());
  111. return true;
  112. }
  113. void CGraphicThingInstance::CalculateBBox()
  114. {
  115. GetBoundBox(&m_v3BBoxMin, &m_v3BBoxMax);
  116. m_v4TBBox[0] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
  117. m_v4TBBox[1] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
  118. m_v4TBBox[2] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMin.z, 1.0f);
  119. m_v4TBBox[3] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMin.z, 1.0f);
  120. m_v4TBBox[4] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
  121. m_v4TBBox[5] = D3DXVECTOR4(m_v3BBoxMin.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);
  122. m_v4TBBox[6] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMin.y, m_v3BBoxMax.z, 1.0f);
  123. m_v4TBBox[7] = D3DXVECTOR4(m_v3BBoxMax.x, m_v3BBoxMax.y, m_v3BBoxMax.z, 1.0f);
  124. const D3DXMATRIX & c_rmatTransform = GetTransform();
  125. for (DWORD i = 0; i < 8; ++i)
  126. {
  127. D3DXVec4Transform(&m_v4TBBox[i], &m_v4TBBox[i], &c_rmatTransform);
  128. if (0 == i)
  129. {
  130. m_v3TBBoxMin.x = m_v4TBBox[i].x;
  131. m_v3TBBoxMin.y = m_v4TBBox[i].y;
  132. m_v3TBBoxMin.z = m_v4TBBox[i].z;
  133. m_v3TBBoxMax.x = m_v4TBBox[i].x;
  134. m_v3TBBoxMax.y = m_v4TBBox[i].y;
  135. m_v3TBBoxMax.z = m_v4TBBox[i].z;
  136. }
  137. else
  138. {
  139. if (m_v3TBBoxMin.x > m_v4TBBox[i].x)
  140. m_v3TBBoxMin.x = m_v4TBBox[i].x;
  141. if (m_v3TBBoxMax.x < m_v4TBBox[i].x)
  142. m_v3TBBoxMax.x = m_v4TBBox[i].x;
  143. if (m_v3TBBoxMin.y > m_v4TBBox[i].y)
  144. m_v3TBBoxMin.y = m_v4TBBox[i].y;
  145. if (m_v3TBBoxMax.y < m_v4TBBox[i].y)
  146. m_v3TBBoxMax.y = m_v4TBBox[i].y;
  147. if (m_v3TBBoxMin.z > m_v4TBBox[i].z)
  148. m_v3TBBoxMin.z = m_v4TBBox[i].z;
  149. if (m_v3TBBoxMax.z < m_v4TBBox[i].z)
  150. m_v3TBBoxMax.z = m_v4TBBox[i].z;
  151. }
  152. }
  153. }
  154. bool CGraphicThingInstance::CreateDeviceObjects()
  155. {
  156. CGrannyLODController::FCreateDeviceObjects createDeviceObjects;
  157. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), createDeviceObjects);
  158. return true;
  159. }
  160. void CGraphicThingInstance::DestroyDeviceObjects()
  161. {
  162. CGrannyLODController::FDestroyDeviceObjects destroyDeviceObjects;
  163. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), destroyDeviceObjects);
  164. }
  165. bool CGraphicThingInstance::CheckModelInstanceIndex(int iModelInstance)
  166. {
  167. if (iModelInstance < 0)
  168. return false;
  169. int max = m_LODControllerVector.size();
  170. if (iModelInstance >= max)
  171. return false;
  172. return true;
  173. }
  174. bool CGraphicThingInstance::CheckModelThingIndex(int iModelThing)
  175. {
  176. if (iModelThing < 0)
  177. return false;
  178. int max = m_modelThingSetVector.size();
  179. if (iModelThing >= max)
  180. return false;
  181. return true;
  182. }
  183. bool CGraphicThingInstance::CheckMotionThingIndex(DWORD dwMotionKey)
  184. {
  185. std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
  186. if (m_roMotionThingMap.end() == itor)
  187. return false;
  188. return true;
  189. }
  190. bool CGraphicThingInstance::GetMotionThingPointer(DWORD dwKey, CGraphicThing ** ppMotion)
  191. {
  192. if (!CheckMotionThingIndex(dwKey))
  193. return false;
  194. *ppMotion = m_roMotionThingMap[dwKey]->GetPointer();
  195. return true;
  196. }
  197. bool CGraphicThingInstance::IsMotionThing()
  198. {
  199. return !m_roMotionThingMap.empty();
  200. }
  201. void CGraphicThingInstance::ReserveModelInstance(int iCount)
  202. {
  203. stl_wipe(m_LODControllerVector);
  204. for (int i = 0; i < iCount; ++i)
  205. {
  206. CGrannyLODController * pInstance = new CGrannyLODController;
  207. m_LODControllerVector.push_back(pInstance);
  208. }
  209. }
  210. void CGraphicThingInstance::ReserveModelThing(int iCount)
  211. {
  212. m_modelThingSetVector.resize(iCount);
  213. }
  214. bool CGraphicThingInstance::FindBoneIndex(int iModelInstance, const char* c_szBoneName, int* iRetBone)
  215. {
  216. assert(CheckModelInstanceIndex(iModelInstance));
  217. CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelInstance]->GetModelInstance();
  218. if (!pModelInstance)
  219. return false;
  220. return pModelInstance->GetBoneIndexByName(c_szBoneName, iRetBone);
  221. }
  222. void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, int iSrcModelInstance)
  223. {
  224. if (!CheckModelInstanceIndex(iSrcModelInstance))
  225. {
  226. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
  227. return;
  228. }
  229. if (!CheckModelInstanceIndex(iDstModelInstance))
  230. {
  231. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
  232. return;
  233. }
  234. CGrannyLODController * pSrcLODController = m_LODControllerVector[iSrcModelInstance];
  235. CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
  236. pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName);
  237. }
  238. void CGraphicThingInstance::AttachModelInstance(int iDstModelInstance, const char * c_szBoneName, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance)
  239. {
  240. if (!CheckModelInstanceIndex(iDstModelInstance))
  241. {
  242. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
  243. return;
  244. }
  245. if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance))
  246. {
  247. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, c_szBoneName=%s, iSrcModelInstance=%d)", iDstModelInstance, c_szBoneName, iSrcModelInstance);
  248. return;
  249. }
  250. CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
  251. CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance];
  252. pDstLODController->AttachModelInstance(pSrcLODController, c_szBoneName);
  253. }
  254. void CGraphicThingInstance::DetachModelInstance(int iDstModelInstance, CGraphicThingInstance & rSrcInstance, int iSrcModelInstance)
  255. {
  256. if (!CheckModelInstanceIndex(iDstModelInstance))
  257. {
  258. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance);
  259. return;
  260. }
  261. if (!rSrcInstance.CheckModelInstanceIndex(iSrcModelInstance))
  262. {
  263. TraceError("CGraphicThingInstance::AttachModelInstance(iDstModelInstance=%d, iSrcModelInstance=%d)", iDstModelInstance, iSrcModelInstance);
  264. return;
  265. }
  266. CGrannyLODController * pDstLODController = m_LODControllerVector[iDstModelInstance];
  267. CGrannyLODController * pSrcLODController = rSrcInstance.m_LODControllerVector[iSrcModelInstance];
  268. pDstLODController->DetachModelInstance(pSrcLODController);
  269. }
  270. bool CGraphicThingInstance::GetBonePosition(int iModelIndex, int iBoneIndex, float * pfx, float * pfy, float * pfz)
  271. {
  272. assert(CheckModelInstanceIndex(iModelIndex));
  273. CGrannyModelInstance * pModelInstance = m_LODControllerVector[iModelIndex]->GetModelInstance();
  274. if (!pModelInstance)
  275. return false;
  276. const float * pfMatrix = pModelInstance->GetBoneMatrixPointer(iBoneIndex);
  277. *pfx = pfMatrix[12];
  278. *pfy = pfMatrix[13];
  279. *pfz = pfMatrix[14];
  280. return true;
  281. }
  282. //iSkelInstance °¡ ÀÖÀ¸¸é ±âº» º»¿¡ Link(º»ÀÌ ºÙ´Â°Í)½ÃÅ°°í,
  283. //¾øÀ¸¸é ±âº» º»¿¡ attach(ÁÂÇ¥¸¸ °¡Á®´Ù ¾²´Â°Í) µË´Ï´Ù.
  284. bool CGraphicThingInstance::SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance)
  285. {
  286. if (!CheckModelInstanceIndex(iDstModelInstance))
  287. {
  288. TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel);
  289. return false;
  290. }
  291. if (!CheckModelThingIndex(iSrcModelThing))
  292. {
  293. TraceError("CGraphicThingInstance::SetModelInstance(iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iDstModelInstance, iSrcModelThing, iSrcModel);
  294. return false;
  295. }
  296. CGrannyLODController * pController = m_LODControllerVector[iDstModelInstance];
  297. if (!pController)
  298. return false;
  299. // HAIR_LINK
  300. CGrannyLODController * pSkelController = NULL;
  301. if (iSkelInstance != DONTUSEVALUE)
  302. {
  303. if (!CheckModelInstanceIndex(iSkelInstance))
  304. {
  305. TraceError("CGraphicThingInstance::SetModelInstanceByOtherSkeletonInstance(iSkelInstance=%d, iDstModelInstance=%d, pModelThing=%d, iSrcModel=%d)\n", iSkelInstance, iDstModelInstance, iSrcModelThing, iSrcModel);
  306. return false;
  307. }
  308. pSkelController = m_LODControllerVector[iSkelInstance];
  309. if (!pSkelController)
  310. return false;
  311. }
  312. // END_OF_HAIR_LINK
  313. TModelThingSet & rModelThingSet = m_modelThingSetVector[iSrcModelThing];
  314. pController->Clear();
  315. for (DWORD i = 0; i < rModelThingSet.m_pLODThingRefVector.size(); ++i)
  316. {
  317. if (rModelThingSet.m_pLODThingRefVector[i]->IsNull())
  318. return false;
  319. pController->AddModel(rModelThingSet.m_pLODThingRefVector[i]->GetPointer(), iSrcModel, pSkelController);
  320. }
  321. return true;
  322. }
  323. void CGraphicThingInstance::SetMaterialImagePointer(UINT ePart, const char* c_szImageName, CGraphicImage* pImage)
  324. {
  325. if (ePart>=m_LODControllerVector.size())
  326. {
  327. TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d)<uPartCount(%d), c_szImageName=%s, pImage=%s) - ePart OUT OF RANGE",
  328. ePart, m_LODControllerVector.size(), c_szImageName, pImage->GetFileName());
  329. return;
  330. }
  331. if (!m_LODControllerVector[ePart])
  332. {
  333. TraceError("CGraphicThingInstance::SetMaterialImagePointer(ePart(%d), c_szImageName=%s, pImage=%s) - ePart Data is NULL",
  334. ePart, m_LODControllerVector.size(), c_szImageName, pImage->GetFileName());
  335. return;
  336. }
  337. m_LODControllerVector[ePart]->SetMaterialImagePointer(c_szImageName, pImage);
  338. }
  339. void CGraphicThingInstance::SetMaterialData(UINT ePart, const char* c_szImageName, SMaterialData kMaterialData)
  340. {
  341. if (ePart>=m_LODControllerVector.size())
  342. {
  343. TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)<uPartCount(%d)) - ePart OUT OF RANGE",
  344. ePart, m_LODControllerVector.size());
  345. return;
  346. }
  347. if (!m_LODControllerVector[ePart])
  348. {
  349. TraceError("CGraphicThingInstance::SetMaterialData(ePart(%d)) - ePart Data is NULL",
  350. ePart, m_LODControllerVector.size());
  351. return;
  352. }
  353. m_LODControllerVector[ePart]->SetMaterialData(c_szImageName, kMaterialData);
  354. }
  355. void CGraphicThingInstance::SetSpecularInfo(UINT ePart, const char* c_szMtrlName, BOOL bEnable, float fPower)
  356. {
  357. if (ePart>=m_LODControllerVector.size())
  358. {
  359. TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)<uPartCount(%d)) - ePart OUT OF RANGE",
  360. ePart, m_LODControllerVector.size());
  361. return;
  362. }
  363. if (!m_LODControllerVector[ePart])
  364. {
  365. TraceError("CGraphicThingInstance::SetSpecularInfo(ePart(%d)) - ePart Data is NULL",
  366. ePart, m_LODControllerVector.size());
  367. return;
  368. }
  369. m_LODControllerVector[ePart]->SetSpecularInfo(c_szMtrlName, bEnable, fPower);
  370. }
  371. bool CGraphicThingInstance::SetMotion(DWORD dwMotionKey, float blendTime, int loopCount, float speedRatio)
  372. {
  373. if (!CheckMotionThingIndex(dwMotionKey))
  374. return false;
  375. std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
  376. CGraphicThing::TRef * proMotionThing = itor->second;
  377. CGraphicThing * pMotionThing = proMotionThing->GetPointer();
  378. if (!pMotionThing)
  379. return false;
  380. if (!pMotionThing->CheckMotionIndex(0))
  381. return false;
  382. CGrannyLODController::FSetMotionPointer SetMotionPointer;
  383. SetMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0);
  384. SetMotionPointer.m_blendTime = blendTime;
  385. SetMotionPointer.m_loopCount = loopCount;
  386. SetMotionPointer.m_speedRatio = speedRatio;
  387. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetMotionPointer);
  388. return true;
  389. }
  390. bool CGraphicThingInstance::ChangeMotion(DWORD dwMotionKey, int loopCount, float speedRatio)
  391. {
  392. if (!CheckMotionThingIndex(dwMotionKey))
  393. return false;
  394. std::map<DWORD, CGraphicThing::TRef *>::iterator itor = m_roMotionThingMap.find(dwMotionKey);
  395. CGraphicThing::TRef * proMotionThing = itor->second;
  396. CGraphicThing * pMotionThing = proMotionThing->GetPointer();
  397. if (!pMotionThing)
  398. return false;
  399. if (!pMotionThing->CheckMotionIndex(0))
  400. return false;
  401. CGrannyLODController::FChangeMotionPointer ChangeMotionPointer;
  402. ChangeMotionPointer.m_pMotion = pMotionThing->GetMotionPointer(0);
  403. ChangeMotionPointer.m_loopCount = loopCount;
  404. ChangeMotionPointer.m_speedRatio = speedRatio;
  405. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ChangeMotionPointer);
  406. return true;
  407. }
  408. void CGraphicThingInstance::SetEndStopMotion()
  409. {
  410. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FEndStopMotionPointer());
  411. }
  412. void CGraphicThingInstance::RegisterModelThing(int iModelThing, CGraphicThing * pModelThing)
  413. {
  414. if (!CheckModelThingIndex(iModelThing))
  415. {
  416. TraceError("CGraphicThingInstance::RegisterModelThing(iModelThing=%d, pModelThing=%s)\n", iModelThing, pModelThing->GetFileName());
  417. return;
  418. }
  419. m_modelThingSetVector[iModelThing].Clear();
  420. if (pModelThing)
  421. RegisterLODThing(iModelThing, pModelThing);
  422. }
  423. void CGraphicThingInstance::RegisterLODThing(int iModelThing, CGraphicThing * pModelThing)
  424. {
  425. assert(CheckModelThingIndex(iModelThing));
  426. CGraphicThing::TRef * pModelRef = new CGraphicThing::TRef;
  427. pModelRef->SetPointer(pModelThing);
  428. m_modelThingSetVector[iModelThing].m_pLODThingRefVector.push_back(pModelRef);
  429. }
  430. void CGraphicThingInstance::RegisterMotionThing(DWORD dwMotionKey, CGraphicThing* pMotionThing)
  431. {
  432. CGraphicThing::TRef * pMotionRef = new CGraphicThing::TRef;
  433. pMotionRef->SetPointer(pMotionThing);
  434. m_roMotionThingMap.insert(std::map<DWORD, CGraphicThing::TRef *>::value_type(dwMotionKey, pMotionRef));
  435. }
  436. void CGraphicThingInstance::ResetLocalTime()
  437. {
  438. //m_clockLast = GrannyGetSystemSeconds();
  439. m_fLastLocalTime = 0.0f;
  440. m_fLocalTime = 0.0f;
  441. CGrannyLODController::FResetLocalTime resetLocalTime;
  442. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), resetLocalTime);
  443. }
  444. /*
  445. void CGraphicThingInstance::SetMotionSpeed(float fRate)
  446. {
  447. m_fMotionTimeSpeed = fRate;
  448. }
  449. */
  450. void CGraphicThingInstance::InsertDelay(float fDelay)
  451. {
  452. m_fDelay = fDelay;
  453. }
  454. float CGraphicThingInstance::GetLastLocalTime()
  455. {
  456. return m_fLastLocalTime;
  457. }
  458. float CGraphicThingInstance::GetLocalTime()
  459. {
  460. return m_fLocalTime;
  461. }
  462. float CGraphicThingInstance::GetSecondElapsed()
  463. {
  464. return m_fSecondElapsed;
  465. }
  466. float CGraphicThingInstance::GetAverageSecondElapsed()
  467. {
  468. return m_fAverageSecondElapsed;
  469. }
  470. bool CGraphicThingInstance::Intersect(float* pu, float* pv, float* pt)
  471. {
  472. if (!CGraphicObjectInstance::isShow())
  473. return false;
  474. if (!m_bUpdated)
  475. return false;
  476. if (m_LODControllerVector.empty())
  477. {
  478. //TraceError("CGraphicThingInstance::Intersect - m_LODControllerVector is empty");
  479. return false;
  480. }
  481. return m_LODControllerVector[0]->Intersect(&GetTransform(), pu, pv, pt);
  482. }
  483. void CGraphicThingInstance::GetBoundBox(D3DXVECTOR3* vtMin, D3DXVECTOR3* vtMax)
  484. {
  485. vtMin->x = vtMin->y = vtMin->z = 100000.0f;
  486. vtMax->x = vtMax->y = vtMax->z = -100000.0f;
  487. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), CGrannyLODController::FBoundBox(vtMin, vtMax));
  488. }
  489. BOOL CGraphicThingInstance::GetBoundBox(DWORD dwModelInstanceIndex, D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax)
  490. {
  491. if (!CheckModelInstanceIndex(dwModelInstanceIndex))
  492. return FALSE;
  493. vtMin->x = vtMin->y = vtMin->z = 100000.0f;
  494. vtMax->x = vtMax->y = vtMax->z = -100000.0f;
  495. CGrannyLODController * pController = m_LODControllerVector[dwModelInstanceIndex];
  496. if (!pController->isModelInstance())
  497. return FALSE;
  498. CGrannyModelInstance * pModelInstance = pController->GetModelInstance();
  499. pModelInstance->GetBoundBox(vtMin, vtMax);
  500. return TRUE;
  501. }
  502. BOOL CGraphicThingInstance::GetBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix)
  503. {
  504. if (!CheckModelInstanceIndex(dwModelInstanceIndex))
  505. return FALSE;
  506. CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance();
  507. if (!pModelInstance)
  508. return FALSE;
  509. *ppMatrix = (D3DXMATRIX *)pModelInstance->GetBoneMatrixPointer(dwBoneIndex);
  510. if (!*ppMatrix)
  511. return FALSE;
  512. return TRUE;
  513. }
  514. BOOL CGraphicThingInstance::GetCompositeBoneMatrix(DWORD dwModelInstanceIndex, DWORD dwBoneIndex, D3DXMATRIX ** ppMatrix)
  515. {
  516. if (!CheckModelInstanceIndex(dwModelInstanceIndex))
  517. return FALSE;
  518. CGrannyModelInstance * pModelInstance = m_LODControllerVector[dwModelInstanceIndex]->GetModelInstance();
  519. if (!pModelInstance)
  520. {
  521. //TraceError("CGraphicThingInstance::GetCompositeBoneMatrix(dwModelInstanceIndex=%d, dwBoneIndex=%d, D3DXMATRIX ** ppMatrix)", dwModelInstanceIndex, dwBoneIndex);
  522. return FALSE;
  523. }
  524. *ppMatrix = (D3DXMATRIX *)pModelInstance->GetCompositeBoneMatrixPointer(dwBoneIndex);
  525. return TRUE;
  526. }
  527. void CGraphicThingInstance::UpdateTransform(D3DXMATRIX * pMatrix, float fSecondsElapsed, int iModelInstanceIndex)
  528. {
  529. //TraceError("%s",GetBaseThingPtr()->GetFileName());
  530. int nLODCount=m_LODControllerVector.size();
  531. if (iModelInstanceIndex>=nLODCount)
  532. {
  533. //TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d)",
  534. // fSecondsElapsed, iModelInstanceIndex, nLODCount);
  535. return;
  536. }
  537. CGrannyLODController* pkLODCtrl=m_LODControllerVector[iModelInstanceIndex];
  538. if (!pkLODCtrl)
  539. {
  540. //TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - m_LODControllerVector[iModelInstanceIndex] == NULL",
  541. // fSecondsElapsed, iModelInstanceIndex, nLODCount);
  542. return;
  543. }
  544. CGrannyModelInstance * pModelInstance = pkLODCtrl->GetModelInstance();
  545. if (!pModelInstance)
  546. {
  547. /* TraceError("void CGraphicThingInstance::UpdateTransform(pMatrix, fSecondsElapsed=%f, iModelInstanceIndex=%d/nLODCount=%d) - pkLODCtrl->GetModelInstance() == NULL",
  548. fSecondsElapsed, iModelInstanceIndex, nLODCount);*/
  549. return;
  550. }
  551. pModelInstance->UpdateTransform(pMatrix, fSecondsElapsed);
  552. }
  553. void CGraphicThingInstance::DeformAll()
  554. {
  555. m_bUpdated = true;
  556. CGrannyLODController::FDeformAll deform;
  557. deform.mc_pWorldMatrix = &m_worldMatrix;
  558. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), deform);
  559. }
  560. void CGraphicThingInstance::DeformNoSkin()
  561. {
  562. m_bUpdated = true;
  563. for (std::vector<CGrannyLODController*>::size_type i = 0; i != m_LODControllerVector.size(); i++)
  564. {
  565. if (i == 5)
  566. {
  567. CGrannyLODController* pkLOD = m_LODControllerVector[i];
  568. if (pkLOD->isModelInstance())
  569. pkLOD->DeformNoSkin(&m_matAbsoluteTrans);
  570. }
  571. else
  572. {
  573. CGrannyLODController* pkLOD = m_LODControllerVector[i];
  574. if (pkLOD->isModelInstance())
  575. pkLOD->DeformNoSkin(&m_worldMatrix);
  576. }
  577. }
  578. }
  579. void CGraphicThingInstance::OnDeform()
  580. {
  581. m_bUpdated = true;
  582. for (std::vector<CGrannyLODController*>::size_type i = 0; i != m_LODControllerVector.size(); i++)
  583. {
  584. if (i == 5)
  585. {
  586. CGrannyLODController* pkLOD = m_LODControllerVector[i];
  587. if (pkLOD->isModelInstance())
  588. pkLOD->Deform(&m_matAbsoluteTrans);
  589. }
  590. else
  591. {
  592. CGrannyLODController* pkLOD = m_LODControllerVector[i];
  593. if (pkLOD->isModelInstance())
  594. pkLOD->Deform(&m_worldMatrix);
  595. }
  596. }
  597. }
  598. void CGraphicThingInstance::__SetLocalTime(float fLocalTime)
  599. {
  600. m_fLastLocalTime = m_fLocalTime;
  601. m_fLocalTime = fLocalTime;
  602. CGrannyLODController::FSetLocalTime SetLocalTime;
  603. SetLocalTime.fLocalTime = fLocalTime;
  604. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), SetLocalTime);
  605. }
  606. void CGraphicThingInstance::UpdateLODLevel()
  607. {
  608. CCamera * pcurCamera = CCameraManager::Instance().GetCurrentCamera();
  609. if (!pcurCamera)
  610. {
  611. TraceError("CGraphicThingInstance::UpdateLODLevel - GetCurrentCamera() == NULL");
  612. return;
  613. }
  614. const D3DXVECTOR3 & c_rv3TargetPosition = pcurCamera->GetTarget();
  615. const D3DXVECTOR3 & c_rv3CameraPosition = pcurCamera->GetEye();
  616. const D3DXVECTOR3 & c_v3Position = GetPosition();
  617. // NOTE : Áß½ÉÀ¸·ÎºÎÅÍÀÇ °Å¸® °è»ê¿¡ z°ª Â÷ÀÌ´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. - [levites]
  618. CGrannyLODController::FUpdateLODLevel update;
  619. update.fDistanceFromCenter = sqrtf((c_rv3TargetPosition.x - c_v3Position.x) * (c_rv3TargetPosition.x - c_v3Position.x) +
  620. (c_rv3TargetPosition.y - c_v3Position.y) * (c_rv3TargetPosition.y - c_v3Position.y));
  621. update.fDistanceFromCamera = sqrtf((c_rv3CameraPosition.x - c_v3Position.x) * (c_rv3CameraPosition.x - c_v3Position.x) +
  622. (c_rv3CameraPosition.y - c_v3Position.y) * (c_rv3CameraPosition.y - c_v3Position.y) +
  623. (c_rv3CameraPosition.z - c_v3Position.z) * (c_rv3CameraPosition.z - c_v3Position.z));
  624. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update);
  625. }
  626. void CGraphicThingInstance::UpdateTime()
  627. {
  628. //granny_system_clock clockNow = GrannyGetSystemSeconds();
  629. //m_fSecondElapsed = GrannyGetSecondsElapsed(&m_clockLast, &clockNow) * m_fMotionTimeSpeed;
  630. //DWORD t1=ELTimer_GetMSec();
  631. m_fSecondElapsed=CTimer::Instance().GetElapsedSecond();
  632. if (m_fDelay > m_fSecondElapsed)
  633. {
  634. m_fDelay -= m_fSecondElapsed;
  635. m_fSecondElapsed = 0.0f;
  636. }
  637. else
  638. {
  639. m_fSecondElapsed -= m_fDelay;
  640. m_fDelay = 0.0f;
  641. }
  642. m_fLastLocalTime = m_fLocalTime;
  643. m_fLocalTime += m_fSecondElapsed;
  644. m_fAverageSecondElapsed = m_fAverageSecondElapsed + (m_fSecondElapsed - m_fAverageSecondElapsed) / 4.0f;
  645. //m_clockLast = clockNow;
  646. CGrannyLODController::FUpdateTime update;
  647. update.fElapsedTime = m_fSecondElapsed;
  648. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), update);
  649. }
  650. void CGraphicThingInstance::OnUpdate()
  651. {
  652. #ifdef __PERFORMANCE_CHECKER__
  653. DWORD t1=timeGetTime();
  654. #endif
  655. UpdateLODLevel();
  656. #ifdef __PERFORMANCE_CHECKER__
  657. DWORD t2=timeGetTime();
  658. #endif
  659. UpdateTime();
  660. #ifdef __PERFORMANCE_CHECKER__
  661. DWORD t3=timeGetTime();
  662. #endif
  663. #ifdef __PERFORMANCE_CHECKER__
  664. {
  665. static FILE* fp=fopen("perf_thing_onupdate.txt", "w");
  666. if (t3-t1>3)
  667. {
  668. fprintf(fp, "GTU.Total %d (Time %f)\n",
  669. t3-t1, ELTimer_GetMSec()/1000.0f);
  670. fprintf(fp, "GTU.CAL %d\n", t2-t1);
  671. fprintf(fp, "GTU.UP %d\n", t3-t2);
  672. fprintf(fp, "-------------------------------- \n");
  673. fflush(fp);
  674. }
  675. fflush(fp);
  676. }
  677. #endif
  678. }
  679. void CGraphicThingInstance::OnRender()
  680. {
  681. RenderWithOneTexture();
  682. }
  683. void CGraphicThingInstance::OnBlendRender()
  684. {
  685. BlendRenderWithOneTexture();
  686. }
  687. void CGraphicThingInstance::RenderWithOneTexture()
  688. {
  689. //assert(m_bUpdated);
  690. if (!m_bUpdated)
  691. return;
  692. CGrannyLODController::FRenderWithOneTexture render;
  693. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render);
  694. }
  695. void CGraphicThingInstance::BlendRenderWithOneTexture()
  696. {
  697. //assert(m_bUpdated);
  698. if (!m_bUpdated)
  699. return;
  700. CGrannyLODController::FBlendRenderWithOneTexture blendRender;
  701. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender);
  702. }
  703. void CGraphicThingInstance::RenderWithTwoTexture()
  704. {
  705. //assert(m_bUpdated);
  706. if (!m_bUpdated)
  707. return;
  708. CGrannyLODController::FRenderWithTwoTexture render;
  709. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), render);
  710. }
  711. void CGraphicThingInstance::BlendRenderWithTwoTexture()
  712. {
  713. //assert(m_bUpdated);
  714. if (!m_bUpdated)
  715. return;
  716. CGrannyLODController::FRenderWithTwoTexture blendRender;
  717. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), blendRender);
  718. }
  719. void CGraphicThingInstance::OnRenderToShadowMap()
  720. {
  721. if (!m_bUpdated)
  722. return;
  723. CGrannyLODController::FRenderToShadowMap RenderToShadowMap;
  724. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderToShadowMap);
  725. }
  726. void CGraphicThingInstance::OnRenderShadow()
  727. {
  728. CGrannyLODController::FRenderShadow RenderShadow;
  729. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderShadow);
  730. }
  731. void CGraphicThingInstance::OnRenderPCBlocker()
  732. {
  733. CGrannyLODController::FRenderWithOneTexture RenderPCBlocker;
  734. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), RenderPCBlocker);
  735. }
  736. DWORD CGraphicThingInstance::GetLODControllerCount() const
  737. {
  738. return m_LODControllerVector.size();
  739. }
  740. CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex) const
  741. {
  742. assert(dwModelIndex < m_LODControllerVector.size());
  743. return m_LODControllerVector[dwModelIndex];
  744. }
  745. CGrannyLODController * CGraphicThingInstance::GetLODControllerPointer(DWORD dwModelIndex)
  746. {
  747. assert(dwModelIndex < m_LODControllerVector.size());
  748. return m_LODControllerVector[dwModelIndex];
  749. }
  750. BYTE CGraphicThingInstance::GetLODLevel(DWORD dwModelInstance)
  751. {
  752. assert(dwModelInstance < m_LODControllerVector.size());
  753. return (m_LODControllerVector[dwModelInstance]->GetLODLevel());
  754. }
  755. float CGraphicThingInstance::GetHeight()
  756. {
  757. if (m_LODControllerVector.empty())
  758. return 0.0f;
  759. CGrannyModelInstance * pModelInstance = m_LODControllerVector[0]->GetModelInstance();
  760. if (!pModelInstance)
  761. return 0.0f;
  762. D3DXVECTOR3 vtMin, vtMax;
  763. pModelInstance->GetBoundBox(&vtMin, &vtMax);
  764. return fabs(vtMin.z - vtMax.z);
  765. }
  766. void CGraphicThingInstance::ReloadTexture()
  767. {
  768. CGrannyLODController::FReloadTexture ReloadTexture;
  769. std::for_each(m_LODControllerVector.begin(), m_LODControllerVector.end(), ReloadTexture);
  770. }
  771. bool CGraphicThingInstance::HaveBlendThing()
  772. {
  773. for (int i = 0; i < m_LODControllerVector.size(); i++)
  774. {
  775. if (m_LODControllerVector[i]->HaveBlendThing())
  776. return true;
  777. }
  778. return false;
  779. }
  780. void CGraphicThingInstance::OnClear()
  781. {
  782. stl_wipe(m_LODControllerVector);
  783. stl_wipe_second(m_roMotionThingMap);
  784. for (DWORD d = 0; d < m_modelThingSetVector.size(); ++d)
  785. m_modelThingSetVector[d].Clear();
  786. }
  787. void CGraphicThingInstance::OnInitialize()
  788. {
  789. m_bUpdated = false;
  790. m_fLastLocalTime = 0.0f;
  791. m_fLocalTime = 0.0f;
  792. m_fDelay = 0.0;
  793. m_fSecondElapsed = 0.0f;
  794. m_fAverageSecondElapsed = 0.03f;
  795. m_fRadius = -1.0f;
  796. m_v3Center = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
  797. ResetLocalTime();
  798. }
  799. CGraphicThingInstance::CGraphicThingInstance()
  800. {
  801. Initialize();
  802. }
  803. CGraphicThingInstance::~CGraphicThingInstance()
  804. {
  805. }