📄 terrain.h
字号:
// Terrain.h: interface for the CTerrain class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TERRAIN_H__1E862FA9_9700_4156_96AC_E241005BE200__INCLUDED_)
#define AFX_TERRAIN_H__1E862FA9_9700_4156_96AC_E241005BE200__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/*
struct TERRAINDATA
{
BYTE nIndex;
BYTE nMainTexID;
// BYTE nTileTexX;
// BYTE nTileTexZ;
char * pHeightBuf;
// char * pTuBuf;
// char * pTvBuf;
TERRAINDATA() : nIndex(0), nMainTexID(0), nTileTexX(0), nTileTexZ(0),
pHeightBuf(0), pTuBuf(0), pTvBuf(0)
{
}
~TERRAINDATA()
{
SAFE_DELETE(pHeightBuf);
SAFE_DELETE(pTuBuf);
SAFE_DELETE(pTvBuf);
}
};
*/
//#pragma pack(4)
struct TERRAINDATA
{
BYTE nIndex;
float * pfHeightBuf;
TERRAINDATA() : nIndex(0), pfHeightBuf(0)
{
}
~TERRAINDATA()
{
SAFE_DELETE(pfHeightBuf);
}
};
struct MAPRANGE
{
BYTE nType;
float fSx;
float fSy;
float fEx;
float fEy;
MAPRANGE() : nType(0),fSx(0.0f),fSy(0.0f),fEx(0.0f),fEy(0.0f)
{
}
};
struct TERRAINHEADER
{
BYTE nCountX;
BYTE nCountY;
BYTE nWidht;
BYTE nHeight;
float fWorldStartX;
float fWorldStartY;
float fScaleX;
float fScaleY;
float fTextureX;
float fTextureY;
BYTE iBaseX;
BYTE iBaseY;
MAPRANGE MoveRange;
BYTE nObjRangeCnt;
MAPRANGE * pObjRange;
BYTE nStartRangeCnt;
MAPRANGE * pStartRange;
TERRAINDATA * pData;
BYTE nTextureCount;
TERRAINHEADER() : nCountX(0), nCountY(0), nWidht(0), nHeight(0), fWorldStartX(0.0f), fWorldStartY(0.0f),
fScaleX(0.0f), fScaleY(0.0f), fTextureX(0.0f), fTextureY(0.0f), iBaseX(0), iBaseY(0),
MoveRange(),nObjRangeCnt(0),pObjRange(NULL), nStartRangeCnt(0),pStartRange(NULL),
pData(NULL), nTextureCount(0)
{
}
~TERRAINHEADER()
{
SAFE_DELETE_ARRAY(pData);
}
};
struct OBJ_MODEL
{
BYTE nIndex;
BYTE nPart;
BYTE nBreak;
BYTE nBlend;
// CMCModel * pModel;
CMCObject * pObject;
OBJ_MODEL() : nIndex(0), nPart(0),nBreak(0),nBlend(0),pObject(NULL)
{
}
~OBJ_MODEL()
{
// SAFE_DELETE(pModel);
}
};
/*
struct OBJ_PARTS
{
CMD3Parts * pPart;
OBJ_MODEL * pObjModel;
OBJ_PARTS() : pPart(NULL),pObjModel(NULL)
{
}
~OBJ_PARTS()
{
SAFE_DELETE(pPart);
// SAFE_DELETE(pModel);
}
};
*/
struct SDIVIDE{
WORD wIndex;
int iIndex1;
int iIndex2;
int iIndex3;
D3DXVECTOR2 v2LeftTop;
D3DXVECTOR2 v2RightTop;
D3DXVECTOR2 v2LeftBottom;
D3DXVECTOR2 v2RightBottom;
int iVertIndexLT;
int iVertIndexRT;
int iVertIndexLB;
int iVertIndexRB;
SDIVIDE * pChild;
};
typedef vector<SDIVIDE *> vSDivide;
typedef std::map<WORD , SDIVIDE *> mapSDivide;
struct SDIVIDEINDEX{
WORD wIndex;
WORD wIndexNum[3];
};
typedef std::map<WORD , SDIVIDEINDEX *> mapSDivideIndex;
struct SDIVIDEMAP{
//WORD wIndex;
short iMapLevel; // 磊弗芭俊 辑凯阑 持磊.. -1 捞恭 滚赴 磊籍..
D3DXVECTOR3 vMax;
D3DXVECTOR3 vMin;
D3DXVECTOR2 v2LeftTop;
D3DXVECTOR2 v2RightTop;
D3DXVECTOR2 v2LeftBottom;
D3DXVECTOR2 v2RightBottom;
// SDIVIDEMAP * pChildLT;
// SDIVIDEMAP * pChildRT;
// SDIVIDEMAP * pChildLB;
// SDIVIDEMAP * pChildRB;
//vSDivide * pDivide;
//mapSDivide * pDivide;
//mapSDivide mapDivide;
int nIndexBufCount;
SDIVIDEINDEX * pIndexBuf;
SDIVIDEMAP * pParentDivide;
int nChildCount;
SDIVIDEMAP * pChildDivide;
//vSDivide * pChildDivide;
};
struct SDIVIDEMAPEX{
//WORD wIndex;
WORD wMapIndex;
short iMapLevel; // 磊弗芭俊 辑凯阑 持磊.. -1 捞恭 滚赴 磊籍..
D3DXVECTOR3 vMax;
D3DXVECTOR3 vMin;
D3DXVECTOR3 vCenter;
float fRadius;
D3DXVECTOR2 v2LeftTop;
D3DXVECTOR2 v2RightTop;
D3DXVECTOR2 v2LeftBottom;
D3DXVECTOR2 v2RightBottom;
D3DXVECTOR3 v3LeftTop;
D3DXVECTOR3 v3RightTop;
D3DXVECTOR3 v3LeftBottom;
D3DXVECTOR3 v3RightBottom;
int nIndexBufCount;
SDIVIDEINDEX * pIndexBuf;
SDIVIDEMAPEX * pParentDivide;
int nChildCount;
SDIVIDEMAPEX * pChildDivide;
};
typedef std::map<float , SDIVIDEMAPEX *> mapSDivideEx; // 坷抚瞒鉴 沥纺
//typedef std::map<float , SDIVIDEMAPEX *, greater<float>> mapSDivideExMax; // 郴覆瞒鉴 沥纺
class CBuildObject;
class CBillboard;
class CParticle;
class CGunEmitter;
class CMachineGun;
class CHandGun;
class CDecal;
class CTerrain
{
public:
CTerrain();
virtual ~CTerrain();
void Init();
HRESULT FindMap( vector<CBaseBuildObject *> &listParts, const char* szFile , BYTE nIndex );
HRESULT Create( vector<CBaseBuildObject *> &listParts, const char* szFile=NULL);
HRESULT CreateEx( vector<CBaseBuildObject *> &listParts, const char* szFile=NULL );
HRESULT CreateShadow( const char* szFile );
HRESULT CreateExMap( const char* szFile=NULL );
HRESULT CreateSky( const char* szFile=NULL );
HRESULT CreateBack( const char* szFile=NULL );
HRESULT CreateInfoEx( vector<CBaseBuildObject *> &listParts, const char* szFile = NULL );
HRESULT CreateShadowInfo( const char* szFile = NULL );
// HRESULT CreateTerrain( int nCntX, int nCntY, int nWidht, int nHeight, float fScale );
HRESULT CreateTerrain( int nCntX, int nCntY, int nWidht, int nHeight, float fScaleX, float fScaleY,
BOOL bTileMap, BOOL bBaseRender, int nMapTileX, int nMapTileY, int nMapBaseX, int nMapBaseY); // 埃父俊 粱 持厘.
HRESULT SetSplitMap( void );
bool CreateFromFile( const char* szFile=NULL, int nCntX=1, int nCntY=1, int nWidht=64, int nHeight=64, float fScale=1.0f );
void CleanupTerrain();
HRESULT InvalidateDeviceObjects();
HRESULT RestoreDeviceObjects();
bool CreateTerrainfromFile();
HRESULT CreateIndexVertexBuf(); // 烙矫风 累诀..
// 甘盒且肺流
VOID LoadDivideMap( HANDLE hFile, SDIVIDEMAPEX * pDivideMap );
VOID DestroyDivideMeshEx( SDIVIDEMAPEX * pDivideMap );
DWORD FindVertexMapEX( float fX, float fZ, SDIVIDEMAPEX * pDivide, int &Count );
DWORD FindFireMap( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, SDIVIDEMAPEX * pDivide, int &Count );
DWORD FindDivMapIndex( SDIVIDEMAPEX * pDivide, WORD nIndex );
public:
int GetMaxTerrainCnt() { return m_TerrainCnt; }
int GetTerrainWidht() { return m_TerrainX; }
int GetTerrainHeight() { return m_TerrainY; }
int GetWorldWidth() { return m_dwWorldWidth; }
int GetWorldHeight() { return m_dwWorldHeight; }
FLOAT GetHeightWorld( float x, float z );
FLOAT GetHeightWorld( D3DXVECTOR3 vPos );
FLOAT GetHeightWorldEx( float fObjCoordX, float fObjCoordZ );
// void GetVertexWorld( float x, float z );
// CTerrainMash * GetTerrainMash() { return m_pTerrainMash; }
// CTerrainMash * GetTerrainMash( int nIndex = 0 ) { return &m_pTerrainMash[nIndex]; }
CTerrainMash * GetTerrainMash( int nIndex = 0 ) { return &m_pTerrainMash[nIndex]; }
VOID MashRender();
VOID RenderTerrain( BOOL bWire );
VOID RenderTerrainEx();
VOID RenderShwTerrain();
VOID RenderExMap();
VOID RenderSky();
VOID RenderBack();
VOID RenderAlphaMap( D3DXMATRIXA16 matTemp );
inline VOID SetHeader(TERRAINHEADER * pData, BYTE nCount)
{
m_pTerrainData = pData;
m_TextureCount = nCount;
}
// 面倒肺流..
BOOL CheckCollision( D3DXVECTOR3 vOrg, D3DXVECTOR3 * vDir, FLOAT fTargetDist,
FLOAT * fDist, D3DXVECTOR3 * vCollPos );
BOOL CheckCollisionEx( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, D3DXVECTOR3 * vCollPos );
// BOOL CheckCollisionEx( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, FLOAT &fDist, D3DXVECTOR3 &vCollPos,
// SDIVIDEMAP * pDivideMap, WORD &wColIndex );
int CheckCollisionEx( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, FLOAT &fDist, D3DXVECTOR3 &vCollPos,
SDIVIDEMAPEX * pDivideMap, WORD &wColIndex );
BOOL CheckCollision( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, FLOAT fX, FLOAT fZ,
FLOAT &fDist, D3DXVECTOR3 &vCollPos );
int FireCollisionEx( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, FLOAT &fDist,
D3DXVECTOR3 &vCollPos, SDIVIDEMAPEX * pDivideMap, WORD &wColIndex );
int FireCollision( D3DXVECTOR3 vOrg, D3DXVECTOR3 vDir, FLOAT &fDist,
D3DXVECTOR3 &vCollPos, SDIVIDEMAPEX * pDivideMap, WORD &wColIndex );
//BOOL Targetting( CCollision * pPick ); // い屈 鸥百泼..
BOOL TriangleIntersect(PICKING *ptagInfo, DWORD dwPickCnt); // 瘤屈 面倒..
void AddBulidObject( CBaseBuildObject * pObject, D3DXVECTOR3 vPos );
void GetZoneFromPt( const float fX, const float fZ, int* pnZoneX, int* pnZoneZ );
void GetZone( float fX, float fZ, int &iZoneX, int &iZoneZ );
DWORD GetRenderTri() { return m_dwTriangle; }
CEffectManager * GetEffectManager() { return m_pEffectManager; }
void RenderEffect();
//MCFVFVERTEX * GetVertexMap() { return m_pVertex; }
MCOBJVERTEX * GetVertexMap() { return m_pVertex; }
MCFVFINDEX * GetIndexMap() { return m_pIndex; }
DWORD GetVertexBufCount() { return m_iVertexCount; }
DWORD GetIndexBufCount() { return m_iFaceCount; }
private:
bool MakeAlphaMap( LPDIRECT3DTEXTURE9 &pTex, int nSizeX, int nSizeY, BYTE * pBuf );
VOID CullTerrain();
BOOL IsOutOfRangeObj( float x, float z );
float GetCellHeightObj( float x, float z );
VOID FrustumCull( SDIVIDEMAPEX * pDivideMap, CFrustum * pFrustum );
int IsInFrustum( SDIVIDEMAPEX * pDivideMap, CFrustum * pFrustum );
HRESULT CreateSubBuffer();
VOID ReadMeterial( HANDLE hFile, SMETERIALDATA * pMeterial, const char * szFileName );
VOID RenderMeterial( SMETERIALDATA * pMeterial );
VOID RenderBlendMeterial( SMETERIALDATA * pMeterial );
MCTEXTUREEX * FindMeterial( int nClass, int nPass, SMETERIALDATA * pMeterial );
VOID DeleteMeterial( SMETERIALDATA * pMeterial );
private:
int m_TerrainCnt;
int m_TerrainX;
int m_TerrainY;
CTerrainMash * m_pTerrainMash;
DWORD m_dwWorldWidth;
DWORD m_dwWorldHeight;
DWORD m_dwZoneWidth;
DWORD m_dwZoneHeight;
TERRAINHEADER * m_pTerrainData;
LPDIRECT3DTEXTURE9 * m_TerrainTexture;
BYTE m_TextureCount;
short m_nObjectCount;
OBJ_MODEL * m_pObjModel;
DWORD m_dwTriangle;
DWORD m_dwMapCount;
D3DXMATRIX m_mFrustumProj;
// 捞蒲飘 瓤苞绰 胺俊辑父 甸绢啊聪瘪.. 傲 咯扁促 持厘.. 烙矫风父..
CEffectManager * m_pEffectManager;
MCOBJVERTEX * m_pVertex;
MCFVFINDEX * m_pIndex;
MCTEXTUREEX ** m_pTexture;
int m_nTexCount;
DWORD m_iVertexCount;
DWORD m_iFaceCount;
float m_fMashEndX;
float m_fMashEndZ;
float m_fMashStartx;
float m_fMashStartz;
float m_fXSize;
float m_fZSize;
float m_fXLange;
float m_fZLange;
SMETERIALDATA * m_pRootMtl;
LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_pIndexBuffer;
D3DMATERIAL9 * m_pMaterials;
// 溅档快..
MCFVFVERTEX * m_pShadowVertex;
MCFVFINDEX * m_pShadowIndex;
int m_iShadowVtxCnt;
DWORD m_iShadowFaceCnt;
MCTEXTURE * m_pShadowTex;
LPDIRECT3DVERTEXBUFFER9 m_pShwVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_pShwIndexBuffer;
// 犬厘 顶..
MCFVFVERTEX * m_pExMapVertex;
MCFVFINDEX * m_pExMapIndex;
MCTEXTURE ** m_pExMapTexture;
int m_nExMapTexCount;
DWORD m_iExMapVertexCount;
DWORD m_iExMapFaceCount;
LPDIRECT3DVERTEXBUFFER9 m_pExMapVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_pExMapIndexBuffer;
D3DMATERIAL9 * m_pExMapMaterials;
// 窍疵捞..
MCFVFVERTEX * m_pSkyVertex;
MCFVFINDEX * m_pSkyIndex;
MCTEXTURE ** m_pSkyTexture;
int m_nSkyTexCount;
DWORD m_iSkyVertexCount;
DWORD m_iSkyFaceCount;
LPDIRECT3DVERTEXBUFFER9 m_pSkyVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_pSkyIndexBuffer;
D3DMATERIAL9 * m_pSkyMaterials;
// 华 硅版..
MCFVFVERTEX * m_pBackVertex;
MCFVFINDEX * m_pBackIndex;
MCTEXTURE ** m_pBackTexture;
int m_nBackTexCount;
DWORD m_iBackVertexCount;
DWORD m_iBackFaceCount;
LPDIRECT3DVERTEXBUFFER9 m_pBackVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_pBackIndexBuffer;
D3DMATERIAL9 * m_pBackMaterials;
// 甘 律暗 沥焊 持磊.. 快秋秋..
SDIVIDEMAPEX * m_pRootDivideMapEx;
SDIVIDEMAPEX * m_pColDivideMapEx[5];
int m_nColCountEx;
SDIVIDEMAPEX * m_pRootTest;
mapSDivideEx m_vlCullDivideMap;
LPDIRECT3DINDEXBUFFER9 * m_pIndexBufferEx;
vector<WORD> * m_pvlIndex;
protected:
public:
D3DXVECTOR2 m_v2Max;
D3DXVECTOR2 m_v2Min;
int m_nChkCount;
int m_nChkCount2;
float m_fHeight;
int m_nCol;
CDecal * m_pDecal;
protected:
enum QuadLocation { COMPLETELY_OUT = 0,
PARTIALLY_IN = 1,
COMPLETELY_IN = 2,
UNKNOWN = -1 };
};
#endif // !defined(AFX_TERRAIN_H__1E862FA9_9700_4156_96AC_E241005BE200__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -