📄 cterrain.h
字号:
/////////////////////////////////////////////////////////////////
//实现了读取高度图RAW,BMP,PNP,JPG等图片高度 ,并能创建一个规则地形,指定宽度,长度和顶点数
//并能产生随机高度地图
/////////////////////////////////////////////////////////////////
#ifndef _CTerrain_H_
#define _CTerrain_H_
#include "FileHeads.h"
#include <vector>
class CTerrain
{
public:
/** 地形顶点
*/
struct TerrainVertex
{
float x, y, z;
float tu, tv;
float tu2, tv2;
enum FVF
{
FVF_Flags = D3DFVF_XYZ | D3DFVF_TEX2
};
};
/// 地形的材质
D3DMATERIAL9 m_TerrainMaterial;
LPDIRECT3DDEVICE9 m_pDevice;
/// 地形的VertexBuffer
LPDIRECT3DVERTEXBUFFER9 m_pTerrainVB;
/// 地形的IndexBuffer
LPDIRECT3DINDEXBUFFER9 m_pTerrainIB;
/// 高度图纹理
LPDIRECT3DTEXTURE9 m_pHeightMap;
/// 地形表面纹理
LPDIRECT3DTEXTURE9 m_pTerrainTextures;
/// 细节纹理, 用来表现地表细节,如沙石等小颗粒。
LPDIRECT3DTEXTURE9 m_pDetailTexture;
/// 将高度图纹理的数据保存在内存里,以便查找。
BYTE *m_HeightBuffer;
D3DSURFACE_DESC m_HeightMapDesc;
std::vector<int> _heightmap;
CTerrain();
~CTerrain();
//初始化地形
//NX和NZ不可以大于像素个数的1/2 否则报错 点的密度越小,越平滑
bool Init(LPDIRECT3DDEVICE9 pDevice,float LX,float LZ,int NX,int NZ,float fMaxHeight,LPSTR pHeightMapName, UINT uiHeightmapLevel,
LPSTR pTexName, LPSTR pDetailTexture, UINT uiDetailLevel);
//根据像素分配顶点数目,只需要指定地图的长度即可
bool Init(LPDIRECT3DDEVICE9 pDevice,float LX,float fMaxHeight,LPSTR pHeightMapName, UINT uiHeightmapLevel,
LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
//定义一个长度任意,宽度任意,XY方向上点任意,高度随机的地图
bool Init(LPDIRECT3DDEVICE9 pD3DDevice,float LX, float LZ, int NX, int NZ, float fMaxHeight,
LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
bool InitHeightMap(LPDIRECT3DDEVICE9 pDevice,float LX,float LZ,int NX,int NZ,float fMaxHeight,string pHeightMapName,
LPSTR pTexName = NULL, LPSTR pDetailTexture = NULL , UINT uiDetailLevel =2);
//渲染地形
//这里要注意众多渲染状态的设置,尤其是Texture Alpha Blending和光照。
void Render(D3DXMATRIX matWorld1);
//操作地形的方法接口
void setHeightEntry(int x, int y, float value);
float getHeight(float x, float z);
float getHeightEntry(int x, int y);
private:
int m_nNumVertsAlongX ; // x轴有多少个顶点
int m_nNumVertsAlongZ; // z轴有多少个顶点
float m_fMeshLengthAlongX; // x方向上面的长度
float m_fMeshLengthAlongZ; // z方向上面的长度
int m_nMeshCount; //网格数目(m_nNumVertsAlongX-1)*(m_nNumVertsAlongZ-1)
int m_nMeshVertCount;//整个网格的定点(m_nNumVertsAlongX*m_nNumVertsAlongZ)
float m_fMaxHeight; /// 地形最大高度
float m_fTileLengthX;/// 每个地形块的长度(x方向上两个顶点间的距离)
float m_fTileLengthZ;/// 每个地形块的长度(z方向上两个顶点间的距离)
float m_fTileLength;//当不指定宽度和顶点数目时,生成的方格边长
float m_fWidth;//地图长度
float m_fTempBase;//单位高度
D3DXMATRIX m_matWorld;
UINT m_uiNumXTile;/// x方向上地形块数目
UINT m_uiNumZTile;/// y方向上地形块数目
UINT m_uiNumTiles; /// 地形块总数
UINT m_uiNumVertices; /// 顶点数目
UINT m_uiNumIndices; /// 索引数目
UINT m_uiHeightmapLevel;//
UINT m_uiDetailLevel;//
bool readMap(string fileName);
bool loadTexture(string fileName);
//创建顶点缓冲区
bool computeVertices();
//创建在一定范围内随机高度的地图
bool computeVertices(float MaxHeight);
//创建索引缓冲区
bool computeIndices();
//产生一个基于光照的阴影纹理
bool genTexture(D3DXVECTOR3* directionToLight);
bool lightTerrain(D3DXVECTOR3* directionToLight);
float computeShade(int cellRow, int cellCol, D3DXVECTOR3* directionToLight);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -