- #include "StdAfx.h"
- #include "GrpObjectInstance.h"
- #include "../eterBase/Timer.h"
- void CGraphicObjectInstance::OnInitialize()
- {
- ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID));
- }
- void CGraphicObjectInstance::Clear()
- {
- if (m_CullingHandle)
- {
- CCullingManager::Instance().Unregister(m_CullingHandle);
- m_CullingHandle = NULL;
- }
- ClearHeightInstance();
- m_isVisible = TRUE;
- m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;
- m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;
- //m_fRotation = 0.0f;
- m_fYaw = m_fPitch = m_fRoll = 0.0f;
- D3DXMatrixIdentity(&m_worldMatrix);
- m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;
- m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;
- D3DXMatrixIdentity(&m_matAbsoluteTrans);
- D3DXMatrixIdentity(&m_matScale);
- D3DXMatrixIdentity(&m_matPositon);
- ZeroMemory(m_abyPortalID, sizeof(m_abyPortalID));
- OnClear();
- }
- bool CGraphicObjectInstance::Render()
- {
- /*
- if (m_CullingHandle)
- {
- SpherePack * ps = m_CullingHandle->GetParent();
- CScreen s;
- s.SetColorOperation();
- //s.SetDiffuseColor(1,isShow()?1:0,0);
- //s.RenderCircle2d(m_CullingHandle->GetCenter().x,m_CullingHandle->GetCenter().y,m_CullingHandle->GetCenter().z,m_CullingHandle->GetRadius());
- s.SetDiffuseColor(1,isShow()?1:0,ps->HasSpherePackFlag(SPF_PARTIAL)?1:0);
- s.RenderCircle2d(ps->GetCenter().x,ps->GetCenter().y,ps->GetCenter().z,ps->GetRadius());
- }
- //*/
- if (!isShow())
- return false;
- OnRender();
- return true;
- }
- void CGraphicObjectInstance::BlendRender()
- {
- if (!isShow())
- return;
- OnBlendRender();
- }
- void CGraphicObjectInstance::RenderToShadowMap()
- {
- if (!isShow())
- return;
- OnRenderToShadowMap();
- }
- void CGraphicObjectInstance::RenderShadow()
- {
- if (!isShow())
- return;
- OnRenderShadow();
- }
- void CGraphicObjectInstance::RenderPCBlocker()
- {
- if (!isShow())
- return;
- OnRenderPCBlocker();
- }
- void CGraphicObjectInstance::Update()
- {
- OnUpdate();
- UpdateBoundingSphere();
- }
- void CGraphicObjectInstance::Deform()
- {
- if (!isShow())
- return;
- OnDeform();
- }
- void CGraphicObjectInstance::Transform()
- {
- D3DXMATRIX out;
- D3DXMATRIX scale;
- if (m_v3Scale.x > 0.0f)
- {
- D3DXMatrixIdentity(&scale);
- scale._11 = m_v3Scale.x;
- scale._22 = m_v3Scale.y;
- scale._33 = m_v3Scale.z;
- D3DXMatrixMultiply(&out, &m_mRotation, &scale);
- }
- else
- out = m_mRotation;
- D3DXMATRIX temp;
- D3DXMatrixMultiply(&temp, &m_matPositon, &out);
- m_worldMatrix = temp;
- m_worldMatrix._41 += m_v3Position.x;
- m_worldMatrix._42 += m_v3Position.y;
- m_worldMatrix._43 += m_v3Position.z;
- D3DXMatrixMultiply(&temp, &m_matPositon, &m_matScale);
- D3DXMATRIX temp2;
- D3DXMatrixMultiply(&temp2, &temp, &m_mRotation);
- m_matAbsoluteTrans = temp2;
- m_matAbsoluteTrans._41 = m_vecScalePos.x + m_v3Position.x + m_matAbsoluteTrans._41;
- m_matAbsoluteTrans._42 = m_vecScalePos.y + m_v3Position.y + m_matAbsoluteTrans._42;
- m_matAbsoluteTrans._43 = m_vecScalePos.z + m_v3Position.z + m_matAbsoluteTrans._43;
- }
- const D3DXVECTOR3 & CGraphicObjectInstance::GetPosition() const
- {
- return m_v3Position;
- }
- const D3DXVECTOR3 & CGraphicObjectInstance::GetScale() const
- {
- return m_v3Scale;
- }
- float CGraphicObjectInstance::GetRotation()
- {
- return GetRoll();
- }
- float CGraphicObjectInstance::GetYaw()
- {
- return m_fYaw;
- }
- float CGraphicObjectInstance::GetPitch()
- {
- return m_fPitch;
- }
- float CGraphicObjectInstance::GetRoll()
- {
- return m_fRoll;
- }
- D3DXMATRIX & CGraphicObjectInstance::GetTransform()
- {
- return m_worldMatrix;
- }
- void CGraphicObjectInstance::SetRotationQuaternion(const D3DXQUATERNION &q)
- {
- D3DXMatrixRotationQuaternion(&m_mRotation, &q);
- }
- void CGraphicObjectInstance::SetRotationMatrix(const D3DXMATRIX & m)
- {
- m_mRotation = m;
- }
- void CGraphicObjectInstance::SetRotation(float fRotation)
- {
- m_fYaw = 0;
- m_fPitch = 0;
- m_fRoll = fRotation;
- D3DXMatrixRotationZ(&m_mRotation, D3DXToRadian(fRotation));
- }
- void CGraphicObjectInstance::SetRotation(float fYaw, float fPitch, float fRoll)
- {
- //m_fRotation = fRotation;
- m_fYaw = fYaw;
- m_fPitch = fPitch;
- m_fRoll = fRoll;
- D3DXMatrixRotationYawPitchRoll(&m_mRotation, D3DXToRadian(fYaw), D3DXToRadian(fPitch), D3DXToRadian(fRoll));
- }
- void CGraphicObjectInstance::SetPosition(float x, float y, float z)
- {
- m_v3Position.x = x;
- m_v3Position.y = y;
- m_v3Position.z = z;
- }
- void CGraphicObjectInstance::SetPosition(const D3DXVECTOR3 & newposition)
- {
- m_v3Position = newposition;
- }
- void CGraphicObjectInstance::SetScale(float x, float y, float z)
- {
- m_v3Scale.x = x;
- m_v3Scale.y = y;
- m_v3Scale.z = z;
- }
- void CGraphicObjectInstance::Show()
- {
- m_isVisible = true;
- }
- void CGraphicObjectInstance::Hide()
- {
- m_isVisible = false;
- }
- bool CGraphicObjectInstance::isShow()
- {
- return m_isVisible;
- }
- //
- //////////////////////////////////////////////////////////////////////////
- D3DXVECTOR4 & CGraphicObjectInstance::GetWTBBoxVertex(const unsigned char & c_rucNumTBBoxVertex)
- {
- return m_v4TBBox[c_rucNumTBBoxVertex];
- }
- bool CGraphicObjectInstance::isIntersect(const CRay & c_rRay, float * pu, float * pv, float * pt)
- {
- D3DXVECTOR3 v3Start, v3Dir;
- float fRayRange;
- c_rRay.GetStartPoint(&v3Start);
- c_rRay.GetDirection(&v3Dir, &fRayRange);
- TPosition posVertices[8];
- posVertices[0] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z);
- posVertices[1] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMin.z);
- posVertices[2] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z);
- posVertices[3] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMin.z);
- posVertices[4] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z);
- posVertices[5] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMin.y, m_v3TBBoxMax.z);
- posVertices[6] = TPosition(m_v3TBBoxMin.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z);
- posVertices[7] = TPosition(m_v3TBBoxMax.x, m_v3TBBoxMax.y, m_v3TBBoxMax.z);
- TIndex Indices[36] = {0, 1, 2, 1, 3, 2,
- 2, 0, 6, 0, 4, 6,
- 0, 1, 4, 1, 5, 4,
- 1, 3, 5, 3, 7, 5,
- 3, 2, 7, 2, 6, 7,
- 4, 5, 6, 5, 7, 6};
- int triCount = 12;
- WORD* pcurIdx = (WORD*)Indices;
- while (triCount--)
- {
- if (IntersectTriangle(v3Start, v3Dir,
- posVertices[pcurIdx[0]],
- posVertices[pcurIdx[1]],
- posVertices[pcurIdx[2]],
- pu, pv, pt))
- {
- return true;
- }
- pcurIdx += 3;
- }
- return false;
- }
- void CGraphicObjectInstance::SetScaleNew(float x, float y, float z)
- {
- m_vecScaleNew.x = x;
- m_vecScaleNew.y = y;
- m_vecScaleNew.z = z;
- D3DXMatrixScaling(&m_matScale, x, y, z);
- }
- void CGraphicObjectInstance::SetScaleNew(const D3DXVECTOR3 & newscale)
- {
- m_vecScaleNew = newscale;
- D3DXMatrixScaling(&m_matScale, m_vecScaleNew.x, m_vecScaleNew.y, m_vecScaleNew.z);
- }
- void CGraphicObjectInstance::SetScalePosition(float x, float y, float z)
- {
- m_vecScalePos.x = x;
- m_vecScalePos.y = y;
- m_vecScalePos.z = z;
- }
- void CGraphicObjectInstance::SetScalePosition(const D3DXVECTOR3 & newposition)
- {
- m_vecScalePos = newposition;
- }
- CGraphicObjectInstance::CGraphicObjectInstance()
- {
- m_CullingHandle = 0;
- Initialize();
- }
- void CGraphicObjectInstance::Initialize()
- {
- if (m_CullingHandle)
- CCullingManager::Instance().Unregister(m_CullingHandle);
- m_CullingHandle = 0;
- m_pHeightAttributeInstance = NULL;
- m_isVisible = TRUE;
- m_BlockCamera = false;
- m_v3Position.x = m_v3Position.y = m_v3Position.z = 0.0f;
- m_v3Scale.x = m_v3Scale.y = m_v3Scale.z = 0.0f;
- m_fYaw = m_fPitch = m_fRoll = 0.0f;
- D3DXMatrixIdentity(&m_worldMatrix);
- D3DXMatrixIdentity(&m_mRotation);
- m_vecScalePos.x = m_vecScalePos.y = m_vecScalePos.z = 0.0f;
- m_vecScaleNew.x = m_vecScaleNew.y = m_vecScaleNew.z = 0.0f;
- D3DXMatrixIdentity(&m_matAbsoluteTrans);
- D3DXMatrixIdentity(&m_matScale);
- D3DXMatrixIdentity(&m_matPositon);
- OnInitialize();
- }
- CGraphicObjectInstance::~CGraphicObjectInstance()
- {
- Initialize();
- }
- void CGraphicObjectInstance::UpdateBoundingSphere()
- {
- if (m_CullingHandle)
- {
- Vector3d center;
- float radius;
- GetBoundingSphere(center,radius);
- if (radius != m_CullingHandle->GetRadius())
- m_CullingHandle->NewPosRadius(center,radius);
- else
- m_CullingHandle->NewPos(center);
- }
- }
- void CGraphicObjectInstance::RegisterBoundingSphere()
- {
- if (m_CullingHandle)
- CCullingManager::Instance().Unregister(m_CullingHandle);
- m_CullingHandle = CCullingManager::Instance().Register(this);
- }
- void CGraphicObjectInstance::AddCollision(const CStaticCollisionData * pscd, const D3DXMATRIX* pMat)
- {
- m_StaticCollisionInstanceVector.push_back(CBaseCollisionInstance::BuildCollisionInstance(pscd, pMat));
- }
- void CGraphicObjectInstance::ClearCollision()
- {
- CCollisionInstanceVector::iterator it;
- for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
- {
- (*it)->Destroy();
- }
- m_StaticCollisionInstanceVector.clear();
- }
- bool CGraphicObjectInstance::CollisionDynamicSphere(const CDynamicSphereInstance & s) const
- {
- CCollisionInstanceVector::const_iterator it;
- for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
- {
- if ((*it)->CollisionDynamicSphere(s))
- return true;
- }
- return false;
- }
- bool CGraphicObjectInstance::MovementCollisionDynamicSphere(const CDynamicSphereInstance & s) const
- {
- CCollisionInstanceVector::const_iterator it;
- for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
- {
- if ((*it)->MovementCollisionDynamicSphere(s))
- return true;
- }
- return false;
- }
- D3DXVECTOR3 CGraphicObjectInstance::GetCollisionMovementAdjust(const CDynamicSphereInstance & s) const
- {
- CCollisionInstanceVector::const_iterator it;
- for(it = m_StaticCollisionInstanceVector.begin();it!=m_StaticCollisionInstanceVector.end();++it)
- {
- if ((*it)->MovementCollisionDynamicSphere(s))
- return (*it)->GetCollisionMovementAdjust(s);
- }
- return D3DXVECTOR3(0.0f,0.0f,0.0f);
- }
- void CGraphicObjectInstance::UpdateCollisionData(const CStaticCollisionDataVector * pscdVector)
- {
- ClearCollision();
- OnUpdateCollisionData(pscdVector);
- }
- DWORD CGraphicObjectInstance::GetCollisionInstanceCount()
- {
- return m_StaticCollisionInstanceVector.size();
- }
- CBaseCollisionInstance * CGraphicObjectInstance::GetCollisionInstanceData(DWORD dwIndex)
- {
- if (dwIndex>m_StaticCollisionInstanceVector.size())
- {
- return 0;
- }
- return m_StaticCollisionInstanceVector[dwIndex];
- }
- //////////////////////////////////////////////////////////////////////////
- // Height
- void CGraphicObjectInstance::SetHeightInstance(CAttributeInstance * pAttributeInstance)
- {
- m_pHeightAttributeInstance = pAttributeInstance;
- }
- void CGraphicObjectInstance::ClearHeightInstance()
- {
- m_pHeightAttributeInstance = NULL;
- }
- void CGraphicObjectInstance::UpdateHeightInstance(CAttributeInstance * pAttributeInstance)
- {
- ClearHeightInstance();
- OnUpdateHeighInstance(pAttributeInstance);
- }
- bool CGraphicObjectInstance::IsObjectHeight()
- {
- if (m_pHeightAttributeInstance)
- return true;
- return false;
- }
- bool CGraphicObjectInstance::GetObjectHeight(float fX, float fY, float * pfHeight)
- {
- if (!m_pHeightAttributeInstance)
- return false;
- return OnGetObjectHeight(fX, fY, pfHeight);
- }
- void CGraphicObjectInstance::SetPortal(DWORD dwIndex, int iID)
- {
- if (dwIndex >= PORTAL_ID_MAX_NUM)
- {
- assert(dwIndex < PORTAL_ID_MAX_NUM);
- return;
- }
- m_abyPortalID[dwIndex] = iID;
- }
- int CGraphicObjectInstance::GetPortal(DWORD dwIndex)
- {
- if (dwIndex >= PORTAL_ID_MAX_NUM)
- {
- assert(dwIndex < PORTAL_ID_MAX_NUM);
- return 0;
- }
- return m_abyPortalID[dwIndex];
- }