1. #include "StdAfx.h"
  2. #include "GrpObjectInstance.h"
  3. #include "../eterBase/Timer.h"
  4. void CGraphicObjectInstance::OnInitialize()
  5. {
  6. ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID));
  7. }
  8. void CGraphicObjectInstance::Clear()
  9. {
  10. if (m_CullingHandle)
  11. {
  12. CCullingManager::Instance().Unregister(m_CullingHandle);
  13. m_CullingHandle = NULL;
  14. }
  15. ClearHeightInstance();
  16. m_isVisible = TRUE;
  17. m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;
  18. m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;
  19. //m_fRotation = 0.0f;
  20. m_fYaw = m_fPitch = m_fRoll = 0.0f;
  21. D3DXMatrixIdentity(&m_worldMatrix);
  22. m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;
  23. m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;
  24. D3DXMatrixIdentity(&m_matAbsoluteTrans);
  25. D3DXMatrixIdentity(&m_matScale);
  26. D3DXMatrixIdentity(&m_matPositon);
  27. ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID));
  28. OnClear();
  29. }
  30. bool CGraphicObjectInstance::Render()
  31. {
  32. /*
  33. if (m_CullingHandle)
  34. {
  35. SpherePack * ps = m_CullingHandle->GetParent();
  36. CScreen s;
  37. s.SetColorOperation();
  38. //s.SetDiffuseColor(1,isShow()?1:0,0);
  39. //s.RenderCircle2d(m_CullingHandle->GetCenter().x,m_CullingHandle->GetCenter().y,m_CullingHandle->GetCenter().z,m_CullingHandle->GetRadius());
  40. s.SetDiffuseColor(1,isShow()?1:0,ps->HasSpherePackFlag(SPF_PARTIAL)?1:0);
  41. s.RenderCircle2d(ps->GetCenter().x,ps->GetCenter().y,ps->GetCenter().z,ps->GetRadius());
  42. }
  43. //*/
  44. if (!isShow())
  45. return false;
  46. OnRender();
  47. return true;
  48. }
  49. void CGraphicObjectInstance::BlendRender()
  50. {
  51. if (!isShow())
  52. return;
  53. OnBlendRender();
  54. }
  55. void CGraphicObjectInstance::RenderToShadowMap()
  56. {
  57. if (!isShow())
  58. return;
  59. OnRenderToShadowMap();
  60. }
  61. void CGraphicObjectInstance::RenderShadow()
  62. {
  63. if (!isShow())
  64. return;
  65. OnRenderShadow();
  66. }
  67. void CGraphicObjectInstance::RenderPCBlocker()
  68. {
  69. if (!isShow())
  70. return;
  71. OnRenderPCBlocker();
  72. }
  73. void CGraphicObjectInstance::Update()
  74. {
  75. OnUpdate();
  76. UpdateBoundingSphere();
  77. }
  78. void CGraphicObjectInstance::Deform()
  79. {
  80. if (!isShow())
  81. return;
  82. OnDeform();
  83. }
  84. void CGraphicObjectInstance::Transform()
  85. {
  86. D3DXMATRIX out;
  87. D3DXMATRIX scale;
  88. if (m_v3Scale.x > 0.0f)
  89. {
  90. D3DXMatrixIdentity(&scale);
  91. scale._11 = m_v3Scale.x;
  92. scale._22 = m_v3Scale.y;
  93. scale._33 = m_v3Scale.z;
  94. D3DXMatrixMultiply(&out, &m_mRotation, &scale);
  95. }
  96. else
  97. out = m_mRotation;
  98. D3DXMATRIX temp;
  99. D3DXMatrixMultiply(&temp, &m_matPositon, &out);
  100. m_worldMatrix = temp;
  101. m_worldMatrix._41 += m_v3Position.x;
  102. m_worldMatrix._42 += m_v3Position.y;
  103. m_worldMatrix._43 += m_v3Position.z;
  104. D3DXMatrixMultiply(&temp, &m_matPositon, &m_matScale);
  105. D3DXMATRIX temp2;
  106. D3DXMatrixMultiply(&temp2, &temp, &m_mRotation);
  107. m_matAbsoluteTrans = temp2;
  108. m_matAbsoluteTrans._41 = m_vecScalePos.x + m_v3Position.x + m_matAbsoluteTrans._41;
  109. m_matAbsoluteTrans._42 = m_vecScalePos.y + m_v3Position.y + m_matAbsoluteTrans._42;
  110. m_matAbsoluteTrans._43 = m_vecScalePos.z + m_v3Position.z + m_matAbsoluteTrans._43;
  111. }
  112. const D3DXVECTOR3 & CGraphicObjectInstance::GetPosition() const
  113. {
  114. return m_v3Position;
  115. }
  116. const D3DXVECTOR3 & CGraphicObjectInstance::GetScale() const
  117. {
  118. return m_v3Scale;
  119. }
  120. float CGraphicObjectInstance::GetRotation()
  121. {
  122. return GetRoll();
  123. }
  124. float CGraphicObjectInstance::GetYaw()
  125. {
  126. return m_fYaw;
  127. }
  128. float CGraphicObjectInstance::GetPitch()
  129. {
  130. return m_fPitch;
  131. }
  132. float CGraphicObjectInstance::GetRoll()
  133. {
  134. return m_fRoll;
  135. }
  136. D3DXMATRIX & CGraphicObjectInstance::GetTransform()
  137. {
  138. return m_worldMatrix;
  139. }
  140. void CGraphicObjectInstance::SetRotationQuaternion(const D3DXQUATERNION &q)
  141. {
  142. D3DXMatrixRotationQuaternion(&m_mRotation, &q);
  143. }
  144. void CGraphicObjectInstance::SetRotationMatrix(const D3DXMATRIX & m)
  145. {
  146. m_mRotation = m;
  147. }
  148. void CGraphicObjectInstance::SetRotation(float fRotation)
  149. {
  150. m_fYaw = 0;
  151. m_fPitch = 0;
  152. m_fRoll = fRotation;
  153. D3DXMatrixRotationZ(&m_mRotation, D3DXToRadian(fRotation));
  154. }
  155. void CGraphicObjectInstance::SetRotation(float fYaw, float fPitch, float fRoll)
  156. {
  157. //m_fRotation = fRotation;
  158. m_fYaw = fYaw;
  159. m_fPitch = fPitch;
  160. m_fRoll = fRoll;
  161. D3DXMatrixRotationYawPitchRoll(&m_mRotation, D3DXToRadian(fYaw), D3DXToRadian(fPitch), D3DXToRadian(fRoll));
  162. }
  163. void CGraphicObjectInstance::SetPosition(float x, float y, float z)
  164. {
  165. m_v3Position.x = x;
  166. m_v3Position.y = y;
  167. m_v3Position.z = z;
  168. }
  169. void CGraphicObjectInstance::SetPosition(const D3DXVECTOR3 & newposition)
  170. {
  171. m_v3Position = newposition;
  172. }
  173. void CGraphicObjectInstance::SetScale(float x, float y, float z)
  174. {
  175. m_v3Scale.x = x;
  176. m_v3Scale.y = y;
  177. m_v3Scale.z = z;
  178. }
  179. void CGraphicObjectInstance::Show()
  180. {
  181. m_isVisible = true;
  182. }
  183. void CGraphicObjectInstance::Hide()
  184. {
  185. m_isVisible = false;
  186. }
  187. bool CGraphicObjectInstance::isShow()
  188. {
  189. return m_isVisible;
  190. }
  191. //
  192. //////////////////////////////////////////////////////////////////////////
  193. D3DXVECTOR4 & CGraphicObjectInstance::GetWTBBoxVertex(const unsigned char & c_rucNumTBBoxVertex)
  194. {
  195. return m_v4TBBox[c_rucNumTBBoxVertex];
  196. }
  197. bool CGraphicObjectInstance::isIntersect(const CRay & c_rRay, float * pu, float * pv, float * pt)
  198. {
  199. D3DXVECTOR3 v3Start, v3Dir;
  200. float fRayRange;
  201. c_rRay.GetStartPoint(&v3Start);
  202. c_rRay.GetDirection(&v3Dir, &fRayRange);
  203. TPosition posVertices[8];
  204. posVertices[0] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z);
  205. posVertices[1] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z);
  206. posVertices[2] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z);
  207. posVertices[3] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z);
  208. posVertices[4] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z);
  209. posVertices[5] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z);
  210. posVertices[6] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z);
  211. posVertices[7] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z);
  212. TIndex Indices[36] = {0, 1, 2, 1, 3, 2,
  213. 2, 0, 6, 0, 4, 6,
  214. 0, 1, 4, 1, 5, 4,
  215. 1, 3, 5, 3, 7, 5,
  216. 3, 2, 7, 2, 6, 7,
  217. 4, 5, 6, 5, 7, 6};
  218. int triCount = 12;
  219. WORD* pcurIdx = (WORD*)Indices;
  220. while (triCount--)
  221. {
  222. if (IntersectTriangle(v3Start, v3Dir,
  223. posVertices[pcurIdx[0]],
  224. posVertices[pcurIdx[1]],
  225. posVertices[pcurIdx[2]],
  226. pu, pv, pt))
  227. {
  228. return true;
  229. }
  230. pcurIdx += 3;
  231. }
  232. return false;
  233. }
  234. void CGraphicObjectInstance::SetScaleNew(float x, float y, float z)
  235. {
  236. m_vecScaleNew.x = x;
  237. m_vecScaleNew.y = y;
  238. m_vecScaleNew.z = z;
  239. D3DXMatrixScaling(&m_matScale, x, y, z);
  240. }
  241. void CGraphicObjectInstance::SetScaleNew(const D3DXVECTOR3 & newscale)
  242. {
  243. m_vecScaleNew = newscale;
  244. D3DXMatrixScaling(&m_matScale, m_vecScaleNew.x, m_vecScaleNew.y, m_vecScaleNew.z);
  245. }
  246. void CGraphicObjectInstance::SetScalePosition(float x, float y, float z)
  247. {
  248. m_vecScalePos.x = x;
  249. m_vecScalePos.y = y;
  250. m_vecScalePos.z = z;
  251. }
  252. void CGraphicObjectInstance::SetScalePosition(const D3DXVECTOR3 & newposition)
  253. {
  254. m_vecScalePos = newposition;
  255. }
  256. CGraphicObjectInstance::CGraphicObjectInstance()
  257. {
  258. m_CullingHandle = 0;
  259. Initialize();
  260. }
  261. void CGraphicObjectInstance::Initialize()
  262. {
  263. if (m_CullingHandle)
  264. CCullingManager::Instance().Unregister(m_CullingHandle);
  265. m_CullingHandle = 0;
  266. m_pHeightAttributeInstance = NULL;
  267. m_isVisible = TRUE;
  268. m_BlockCamera = false;
  269. m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;
  270. m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;
  271. m_fYaw = m_fPitch = m_fRoll = 0.0f;
  272. D3DXMatrixIdentity(&m_worldMatrix);
  273. D3DXMatrixIdentity(&m_mRotation);
  274. m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;
  275. m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;
  276. D3DXMatrixIdentity(&m_matAbsoluteTrans);
  277. D3DXMatrixIdentity(&m_matScale);
  278. D3DXMatrixIdentity(&m_matPositon);
  279. OnInitialize();
  280. }
  281. CGraphicObjectInstance::~CGraphicObjectInstance()
  282. {
  283. Initialize();
  284. }
  285. void CGraphicObjectInstance::UpdateBoundingSphere()
  286. {
  287. if (m_CullingHandle)
  288. {
  289. Vector3d center;
  290. float radius;
  291. GetBoundingSphere(center,radius);
  292. if (radius != m_CullingHandle->GetRadius())
  293. m_CullingHandle->NewPosRadius(center,radius);
  294. else
  295. m_CullingHandle->NewPos(center);
  296. }
  297. }
  298. void CGraphicObjectInstance::RegisterBoundingSphere()
  299. {
  300. if (m_CullingHandle)
  301. CCullingManager::Instance().Unregister(m_CullingHandle);
  302. m_CullingHandle = CCullingManager::Instance().Register(this);
  303. }
  304. void CGraphicObjectInstance::AddCollision(const CStaticCollisionData * pscd, const D3DXMATRIX* pMat)
  305. {
  306. m_StaticCollisionInstanceVector.push_back(CBaseCollisionInstance::BuildCollisionInstance(pscd, pMat));
  307. }
  308. void CGraphicObjectInstance::ClearCollision()
  309. {
  310. CCollisionInstanceVector::iterator it;
  311. for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
  312. {
  313. (*it)->Destroy();
  314. }
  315. m_StaticCollisionInstanceVector.clear();
  316. }
  317. bool CGraphicObjectInstance::CollisionDynamicSphere(const CDynamicSphereInstance & s) const
  318. {
  319. CCollisionInstanceVector::const_iterator it;
  320. for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
  321. {
  322. if ((*it)->CollisionDynamicSphere(s))
  323. return true;
  324. }
  325. return false;
  326. }
  327. bool CGraphicObjectInstance::MovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const
  328. {
  329. CCollisionInstanceVector::const_iterator it;
  330. for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
  331. {
  332. if ((*it)->MovementCollisionDynamicSphere(s))
  333. return true;
  334. }
  335. return false;
  336. }
  337. D3DXVECTOR3 CGraphicObjectInstance::GetCollisionMovementAdjust(const CDynamicSphereInstance & s) const
  338. {
  339. CCollisionInstanceVector::const_iterator it;
  340. for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
  341. {
  342. if ((*it)->MovementCollisionDynamicSphere(s))
  343. return (*it)->GetCollisionMovementAdjust(s);
  344. }
  345. return D3DXVECTOR3(0.0f,0.0f,0.0f);
  346. }
  347. void CGraphicObjectInstance::UpdateCollisionData(const CStaticCollisionDataVector * pscdVector)
  348. {
  349. ClearCollision();
  350. OnUpdateCollisionData(pscdVector);
  351. }
  352. DWORD CGraphicObjectInstance::GetCollisionInstanceCount()
  353. {
  354. return m_StaticCollisionInstanceVector.size();
  355. }
  356. CBaseCollisionInstance * CGraphicObjectInstance::GetCollisionInstanceData(DWORD dwIndex)
  357. {
  358. if (dwIndex>m_StaticCollisionInstanceVector.size())
  359. {
  360. return 0;
  361. }
  362. return m_StaticCollisionInstanceVector[dwIndex];
  363. }
  364. //////////////////////////////////////////////////////////////////////////
  365. // Height
  366. void CGraphicObjectInstance::SetHeightInstance(CAttributeInstance * pAttributeInstance)
  367. {
  368. m_pHeightAttributeInstance = pAttributeInstance;
  369. }
  370. void CGraphicObjectInstance::ClearHeightInstance()
  371. {
  372. m_pHeightAttributeInstance = NULL;
  373. }
  374. void CGraphicObjectInstance::UpdateHeightInstance(CAttributeInstance * pAttributeInstance)
  375. {
  376. ClearHeightInstance();
  377. OnUpdateHeighInstance(pAttributeInstance);
  378. }
  379. bool CGraphicObjectInstance::IsObjectHeight()
  380. {
  381. if (m_pHeightAttributeInstance)
  382. return true;
  383. return false;
  384. }
  385. bool CGraphicObjectInstance::GetObjectHeight(float fX, float fY, float * pfHeight)
  386. {
  387. if (!m_pHeightAttributeInstance)
  388. return false;
  389. return OnGetObjectHeight(fX, fY, pfHeight);
  390. }
  391. void CGraphicObjectInstance::SetPortal(DWORD dwIndex, int iID)
  392. {
  393. if (dwIndex >= PORTAL_ID_MAX_NUM)
  394. {
  395. assert(dwIndex < PORTAL_ID_MAX_NUM);
  396. return;
  397. }
  398. m_abyPortalID[dwIndex] = iID;
  399. }
  400. int CGraphicObjectInstance::GetPortal(DWORD dwIndex)
  401. {
  402. if (dwIndex >= PORTAL_ID_MAX_NUM)
  403. {
  404. assert(dwIndex < PORTAL_ID_MAX_NUM);
  405. return 0;
  406. }
  407. return m_abyPortalID[dwIndex];
  408. }