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