client/EterLib/AttributeData.cpp

201 lines
5.1 KiB
C++

#include "StdAfx.h"
#include "../eterBase/Utils.h"
#include "AttributeData.h"
const char c_szAttributeDataFileHeader[] = "AttributeData";
const int c_iAttributeDataFileHeaderLength = 13;
/*DWORD CAttributeData::GetCollisionDataCount() const
{
return m_CollisionDataVector.size();
}
BOOL CAttributeData::GetCollisionDataPointer(DWORD dwIndex, const TCollisionData ** c_ppCollisionData) const
{
if (dwIndex >= GetCollisionDataCount())
return FALSE;
*c_ppCollisionData = &m_CollisionDataVector[dwIndex];
return TRUE;
}
*/
const CStaticCollisionDataVector & CAttributeData::GetCollisionDataVector() const
{
return m_StaticCollisionDataVector;
}
const THeightDataVector & CAttributeData::GetHeightDataVector() const
{
return m_HeightDataVector;
}
DWORD CAttributeData::GetHeightDataCount() const
{
return m_HeightDataVector.size();
}
BOOL CAttributeData::GetHeightDataPointer(DWORD dwIndex, const THeightData ** c_ppHeightData) const
{
if (dwIndex >= GetHeightDataCount())
return FALSE;
*c_ppHeightData = &m_HeightDataVector[dwIndex];
return TRUE;
}
float CAttributeData::GetMaximizeRadius()
{
return m_fMaximizeRadius;
}
size_t CAttributeData::AddCollisionData(const CStaticCollisionData& data)
{
m_StaticCollisionDataVector.push_back(data);
return m_StaticCollisionDataVector.size();
}
bool CAttributeData::OnLoad(int /*iSize*/, const void * c_pvBuf)
{
if (!c_pvBuf)
{
// NOTE: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴.
return true;
}
const BYTE * c_pbBuf = static_cast<const BYTE *> (c_pvBuf);
char szHeader[c_iAttributeDataFileHeaderLength+1];
memcpy(szHeader, c_pbBuf, c_iAttributeDataFileHeaderLength+1);
c_pbBuf += c_iAttributeDataFileHeaderLength+1;
if (strcmp(szHeader, c_szAttributeDataFileHeader))
return FALSE;
DWORD dwCollisionDataCount;
DWORD dwHeightDataCount;
memcpy(&dwCollisionDataCount, c_pbBuf, sizeof(DWORD));
c_pbBuf += sizeof(DWORD);
memcpy(&dwHeightDataCount, c_pbBuf, sizeof(DWORD));
c_pbBuf += sizeof(DWORD);
m_StaticCollisionDataVector.clear();
m_StaticCollisionDataVector.resize(dwCollisionDataCount);
m_HeightDataVector.clear();
m_HeightDataVector.resize(dwHeightDataCount);
for (DWORD i = 0; i < dwCollisionDataCount; ++i)
{
CStaticCollisionData & rCollisionData = m_StaticCollisionDataVector[i];
memcpy(&rCollisionData.dwType, c_pbBuf, sizeof(DWORD));
c_pbBuf += sizeof(DWORD);
memcpy(rCollisionData.szName, c_pbBuf, 32);
c_pbBuf += 32;
memcpy(&rCollisionData.v3Position, c_pbBuf, sizeof(D3DXVECTOR3));
c_pbBuf += sizeof(D3DXVECTOR3);
switch(rCollisionData.dwType)
{
case COLLISION_TYPE_PLANE:
memcpy(rCollisionData.fDimensions, c_pbBuf, 2*sizeof(float));
c_pbBuf += 2*sizeof(float);
break;
case COLLISION_TYPE_BOX:
memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float));
c_pbBuf += 3*sizeof(float);
break;
case COLLISION_TYPE_SPHERE:
memcpy(rCollisionData.fDimensions, c_pbBuf, sizeof(float));
c_pbBuf += sizeof(float);
break;
case COLLISION_TYPE_CYLINDER:
memcpy(rCollisionData.fDimensions, c_pbBuf, 2*sizeof(float));
c_pbBuf += 2*sizeof(float);
break;
case COLLISION_TYPE_AABB:
memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float));
c_pbBuf += 3*sizeof(float);
break;
case COLLISION_TYPE_OBB:
memcpy(rCollisionData.fDimensions, c_pbBuf, 3*sizeof(float));
c_pbBuf += 3*sizeof(float);
break;
}
memcpy(rCollisionData.quatRotation, c_pbBuf, sizeof(D3DXQUATERNION));
c_pbBuf += sizeof(D3DXQUATERNION);
}
for (DWORD j = 0; j < dwHeightDataCount; ++j)
{
THeightData & rHeightData = m_HeightDataVector[j];
memcpy(rHeightData.szName, c_pbBuf, 32);
c_pbBuf += 32;
DWORD dwPrimitiveCount;
memcpy(&dwPrimitiveCount, c_pbBuf, sizeof(DWORD));
c_pbBuf += sizeof(DWORD);
rHeightData.v3VertexVector.clear();
rHeightData.v3VertexVector.resize(dwPrimitiveCount);
memcpy(&rHeightData.v3VertexVector[0], c_pbBuf, dwPrimitiveCount*sizeof(D3DXVECTOR3));
c_pbBuf += dwPrimitiveCount*sizeof(D3DXVECTOR3);
// Getting Maximize Radius
for (DWORD k = 0; k < rHeightData.v3VertexVector.size(); ++k)
{
m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].x)+50.0f);
m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].y)+50.0f);
m_fMaximizeRadius = fMAX(m_fMaximizeRadius, fabs(rHeightData.v3VertexVector[k].z)+50.0f);
}
// Getting Maximize Radius
}
return true;
}
void CAttributeData::OnClear()
{
m_StaticCollisionDataVector.clear();
m_HeightDataVector.clear();
}
bool CAttributeData::OnIsEmpty() const
{
if (!m_StaticCollisionDataVector.empty())
return false;
if (!m_HeightDataVector.empty())
return false;
return true;
}
bool CAttributeData::OnIsType(TType type)
{
if (CAttributeData::Type() == type)
return true;
return CResource::OnIsType(type);
}
CAttributeData::TType CAttributeData::Type()
{
static TType s_type = StringToType("CAttributeData");
return s_type;
}
void CAttributeData::OnSelfDestruct()
{
Clear();
}
CAttributeData::CAttributeData(const char * c_szFileName) : CResource(c_szFileName)
{
m_fMaximizeRadius = 0.0f;
}
CAttributeData::~CAttributeData()
{
}