client/GameLib/TerrainPatch.h

251 lines
6.0 KiB
C++

// TerrainPatch.h: interface for the CTerrainPatch class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TERRAINPATCH_H__CDD52438_D542_433C_8748_3A15C910A65E__INCLUDED_)
#define AFX_TERRAINPATCH_H__CDD52438_D542_433C_8748_3A15C910A65E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "../eterlib/GrpVertexBuffer.h"
#include "../PRTerrainLib/Terrain.h"
#pragma pack(push)
#pragma pack(1)
struct HardwareTransformPatch_SSourceVertex
{
D3DXVECTOR3 kPosition;
D3DXVECTOR3 kNormal;
};
struct SoftwareTransformPatch_SSourceVertex
{
D3DXVECTOR3 kPosition;
D3DXVECTOR3 kNormal;
DWORD dwDiffuse;
};
struct SWaterVertex
{
float x, y, z; // position
DWORD dwDiffuse;
};
#pragma pack(pop)
class CTerrainPatch
{
public:
enum
{
PATCH_TYPE_PLAIN = 0,
PATCH_TYPE_HILL,
PATCH_TYPE_CLIFF,
};
enum
{
TERRAIN_VERTEX_COUNT = (CTerrainImpl::PATCH_XSIZE+1)*(CTerrainImpl::PATCH_YSIZE+1)
};
static bool SOFTWARE_TRANSFORM_PATCH_ENABLE;
public:
CTerrainPatch() { Clear(); }
~CTerrainPatch() { Clear(); }
void Clear();
void ClearID() { SetID(0xFFFFFFFF); }
void SetMinX(float fMinX) { m_fMinX = fMinX; }
float GetMinX() { return m_fMinX; }
void SetMaxX(float fMaxX) { m_fMaxX = fMaxX; }
float GetMaxX() { return m_fMaxX; }
void SetMinY(float fMinY) { m_fMinY = fMinY; }
float GetMinY() { return m_fMinY; }
void SetMaxY(float fMaxY) { m_fMaxY = fMaxY; }
float GetMaxY() { return m_fMaxY; }
void SetMinZ(float fMinZ) { m_fMinZ = fMinZ; }
float GetMinZ() { return m_fMinZ; }
void SetMaxZ(float fMaxZ) { m_fMaxZ = fMaxZ; }
float GetMaxZ() { return m_fMaxZ; }
bool IsUse() { return m_bUse; }
void SetUse(bool bUse) { m_bUse = bUse; }
bool IsWaterExist() { return m_bWaterExist; }
void SetWaterExist(bool bWaterExist) { m_bWaterExist = bWaterExist; }
DWORD GetID() { return m_dwID; }
void SetID(DWORD dwID) { m_dwID = dwID; }
void SetType(BYTE byType) { m_byType = byType; }
BYTE GetType() { return m_byType; }
void NeedUpdate(bool bNeedUpdate) { m_bNeedUpdate = bNeedUpdate;}
bool NeedUpdate() { return m_bNeedUpdate; }
UINT GetWaterFaceCount();
void SoftwareTransformPatch_UpdateTerrainLighting(DWORD dwVersion, const D3DLIGHT8& c_rkLight, const D3DMATERIAL8& c_rkMtrl);
void BuildTerrainVertexBuffer(HardwareTransformPatch_SSourceVertex* akSrcVertex);
void BuildWaterVertexBuffer(SWaterVertex* akSrcVertex, UINT uWaterVertexCount);
protected:
void __BuildHardwareTerrainVertexBuffer(HardwareTransformPatch_SSourceVertex* akSrcVertex);
void __BuildSoftwareTerrainVertexBuffer(HardwareTransformPatch_SSourceVertex* akSrcVertex);
private:
float m_fMinX;
float m_fMaxX;
float m_fMinY;
float m_fMaxY;
float m_fMinZ;
float m_fMaxZ;
bool m_bUse;
bool m_bWaterExist;
DWORD m_dwID;
DWORD m_dwWaterPriCount;
CGraphicVertexBuffer m_WaterVertexBuffer;
BYTE m_byType;
bool m_bNeedUpdate;
DWORD m_dwVersion;
public:
CGraphicVertexBuffer* GetWaterVertexBufferPointer() { return &m_WaterVertexBuffer;}
public:
CGraphicVertexBuffer* HardwareTransformPatch_GetVertexBufferPtr() {return &m_kHT.m_kVB;}
protected:
struct SHardwareTransformPatch
{
CGraphicVertexBuffer m_kVB;
} m_kHT;
public:
SoftwareTransformPatch_SSourceVertex* SoftwareTransformPatch_GetTerrainVertexDataPtr()
{return m_kST.m_akTerrainVertex;}
protected:
struct SSoftwareTransformPatch
{
SoftwareTransformPatch_SSourceVertex* m_akTerrainVertex;
SSoftwareTransformPatch();
~SSoftwareTransformPatch();
void Create();
void Destroy();
void __Initialize();
} m_kST;
};
class CTerrainPatchProxy
{
public:
CTerrainPatchProxy();
virtual ~CTerrainPatchProxy();
void Clear();
void SetCenterPosition(const D3DXVECTOR3& c_rv3Center);
bool IsIn(const D3DXVECTOR3& c_rv3Target, float fRadius);
bool isUsed() { return m_bUsed; }
void SetUsed(bool bUsed) { m_bUsed = bUsed; }
short GetPatchNum() { return m_sPatchNum; }
void SetPatchNum(short sPatchNum) { m_sPatchNum = sPatchNum; }
BYTE GetTerrainNum() { return m_byTerrainNum; }
void SetTerrainNum(BYTE byTerrainNum) { m_byTerrainNum = byTerrainNum; }
void SetTerrainPatch(CTerrainPatch * pTerrainPatch) { m_pTerrainPatch = pTerrainPatch;}
bool isWaterExists();
UINT GetWaterFaceCount();
float GetMinX();
float GetMaxX();
float GetMinY();
float GetMaxY();
float GetMinZ();
float GetMaxZ();
// Vertex Buffer
CGraphicVertexBuffer * GetWaterVertexBufferPointer();
SoftwareTransformPatch_SSourceVertex* SoftwareTransformPatch_GetTerrainVertexDataPtr();
CGraphicVertexBuffer* HardwareTransformPatch_GetVertexBufferPtr();
void SoftwareTransformPatch_UpdateTerrainLighting(DWORD dwVersion, const D3DLIGHT8& c_rkLight, const D3DMATERIAL8& c_rkMtrl);
protected:
bool m_bUsed;
short m_sPatchNum; // Patch Number
BYTE m_byTerrainNum;
CTerrainPatch * m_pTerrainPatch;
D3DXVECTOR3 m_v3Center;
};
inline bool CTerrainPatchProxy::isWaterExists()
{
return m_pTerrainPatch->IsWaterExist();
}
inline float CTerrainPatchProxy::GetMinX()
{
return m_pTerrainPatch->GetMinX();
}
inline float CTerrainPatchProxy::GetMaxX()
{
return m_pTerrainPatch->GetMaxX();
}
inline float CTerrainPatchProxy::GetMinY()
{
return m_pTerrainPatch->GetMinY();
}
inline float CTerrainPatchProxy::GetMaxY()
{
return m_pTerrainPatch->GetMaxY();
}
inline float CTerrainPatchProxy::GetMinZ()
{
return m_pTerrainPatch->GetMinZ();
}
inline float CTerrainPatchProxy::GetMaxZ()
{
return m_pTerrainPatch->GetMaxZ();
}
inline CGraphicVertexBuffer * CTerrainPatchProxy::GetWaterVertexBufferPointer()
{
return m_pTerrainPatch->GetWaterVertexBufferPointer();
}
#endif // !defined(AFX_TERRAINPATCH_H__CDD52438_D542_433C_8748_3A15C910A65E__INCLUDED_)