1. #pragma once
  2. #include "GrpColorInstance.h"
  3. #include "GrpScreen.h"
  4. #include "CullingManager.h"
  5. #include "CollisionData.h"
  6. #include "AttributeInstance.h"
  7. enum
  8. {
  9. THING_OBJECT = 0xadf21f13,
  10. TREE_OBJECT = 0x8ac9f7a6,
  11. ACTOR_OBJECT = 0x29a76c24,
  12. EFFECT_OBJECT = 0x1cfa97c6,
  13. DUNGEON_OBJECT = 0x18326035,
  14. };
  15. enum
  16. {
  17. PORTAL_ID_MAX_NUM = 8,
  18. };
  19. class CGraphicObjectInstance : public CGraphicCollisionObject
  20. {
  21. public:
  22. CGraphicObjectInstance();
  23. virtual ~CGraphicObjectInstance();
  24. virtual int GetType() const = 0;
  25. public:
  26. const D3DXVECTOR3 & GetPosition() const;
  27. const D3DXVECTOR3 & GetScale() const;
  28. float GetRotation();
  29. float GetYaw();
  30. float GetPitch();
  31. float GetRoll();
  32. void SetPosition(float x, float y, float z);
  33. void SetPosition(const D3DXVECTOR3 & newposition);
  34. void SetScale(float x, float y, float z);
  35. void SetRotation(float fRotation);
  36. void SetRotation(float fYaw, float fPitch, float fRoll);
  37. void SetRotationQuaternion(const D3DXQUATERNION &q);
  38. void SetRotationMatrix(const D3DXMATRIX & m);
  39. void SetScaleNew(float x, float y, float z);
  40. void SetScaleNew(const D3DXVECTOR3 & newscale);
  41. void SetScalePosition(float x, float y, float z);
  42. void SetScalePosition(const D3DXVECTOR3 & newposition);
  43. void Clear();
  44. void Update();
  45. bool Render();
  46. void BlendRender();
  47. void RenderToShadowMap();
  48. void RenderShadow();
  49. void RenderPCBlocker();
  50. void Deform();
  51. void Transform();
  52. void Show();
  53. void Hide();
  54. bool isShow();
  55. // Camera Block
  56. void BlockCamera(bool bBlock) {m_BlockCamera = bBlock;}
  57. bool BlockCamera() { return m_BlockCamera; }
  58. // Ray Test
  59. bool isIntersect(const CRay & c_rRay, float * pu, float * pv, float * pt);
  60. // Bounding Box
  61. D3DXVECTOR4 & GetWTBBoxVertex(const unsigned char & c_rucNumTBBoxVertex);
  62. D3DXVECTOR3 & GetTBBoxMin() { return m_v3TBBoxMin; }
  63. D3DXVECTOR3 & GetTBBoxMax() { return m_v3TBBoxMax; }
  64. D3DXVECTOR3 & GetBBoxMin() { return m_v3BBoxMin; }
  65. D3DXVECTOR3 & GetBBoxMax() { return m_v3BBoxMax; }
  66. // Matrix
  67. D3DXMATRIX & GetTransform();
  68. const D3DXMATRIX& GetWorldMatrix() { return m_worldMatrix; }
  69. // Portal
  70. void SetPortal(DWORD dwIndex, int iID);
  71. int GetPortal(DWORD dwIndex);
  72. // Initialize
  73. void Initialize();
  74. virtual void OnInitialize();
  75. // Bounding Sphere
  76. public:
  77. void UpdateBoundingSphere();
  78. void RegisterBoundingSphere();
  79. virtual bool GetBoundingSphere(D3DXVECTOR3 & v3Center, float & fRadius) = 0;
  80. virtual void OnRender() = 0;
  81. virtual void OnBlendRender() = 0;
  82. virtual void OnRenderToShadowMap() = 0;
  83. virtual void OnRenderShadow() = 0;
  84. virtual void OnRenderPCBlocker() = 0;
  85. virtual void OnClear(){}
  86. virtual void OnUpdate(){}
  87. virtual void OnDeform(){}
  88. protected:
  89. D3DXVECTOR3 m_v3Position;
  90. D3DXVECTOR3 m_v3Scale;
  91. float m_fYaw;
  92. float m_fPitch;
  93. float m_fRoll;
  94. D3DXMATRIX m_mRotation;
  95. bool m_isVisible;
  96. D3DXMATRIX m_worldMatrix;
  97. // Camera Block
  98. bool m_BlockCamera;
  99. // Bounding Box
  100. D3DXVECTOR4 m_v4TBBox[8];
  101. D3DXVECTOR3 m_v3TBBoxMin, m_v3TBBoxMax;
  102. D3DXVECTOR3 m_v3BBoxMin, m_v3BBoxMax;
  103. // Portal
  104. BYTE m_abyPortalID[PORTAL_ID_MAX_NUM];
  105. D3DXVECTOR3 m_vecScalePos;
  106. D3DXVECTOR3 m_vecScaleNew;
  107. D3DXMATRIX m_matAbsoluteTrans;
  108. D3DXMATRIX m_matScale;
  109. D3DXMATRIX m_matPositon;
  110. // Culling
  111. CCullingManager::CullingHandle m_CullingHandle;
  112. // Static Collision Data
  113. public:
  114. void AddCollision(const CStaticCollisionData * pscd, const D3DXMATRIX * pMat);
  115. void ClearCollision();
  116. bool CollisionDynamicSphere(const CDynamicSphereInstance & s) const;
  117. bool MovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const;
  118. D3DXVECTOR3 GetCollisionMovementAdjust(const CDynamicSphereInstance & s) const;
  119. void UpdateCollisionData(const CStaticCollisionDataVector * pscdVector = 0);
  120. protected:
  121. CCollisionInstanceVector m_StaticCollisionInstanceVector;
  122. virtual void OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector) = 0;
  123. // using in WorldEditor
  124. public:
  125. DWORD GetCollisionInstanceCount();
  126. CBaseCollisionInstance * GetCollisionInstanceData(DWORD dwIndex);
  127. // Height Data
  128. public:
  129. void SetHeightInstance(CAttributeInstance * pAttributeInstance);
  130. void ClearHeightInstance();
  131. void UpdateHeightInstance(CAttributeInstance * pAttributeInstance = 0);
  132. bool IsObjectHeight();
  133. bool GetObjectHeight(float fX, float fY, float * pfHeight);
  134. protected:
  135. CAttributeInstance * m_pHeightAttributeInstance;
  136. virtual void OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance) = 0;
  137. virtual bool OnGetObjectHeight(float fX, float fY, float * pfHeight) = 0;
  138. };