📄 terrain.h
字号:
#pragma once
#include "object.h"
#include "Camera.h"
#include "RiceIndices.h"
#include "Field.h"
#include "TerrainTexture.h"
#include <vector>
#include <d3d9.h>
struct SPatch
{
LPDIRECT3DVERTEXBUFFER9 m_pVB;
LPDIRECT3DVERTEXBUFFER9 m_pVBNormal;
LPDIRECT3DINDEXBUFFER9 m_pIB;
int m_nIndexCount;
};
class CTerrain :
public CObject
{
public:
CTerrain(void);
~CTerrain(void);
virtual void Render(void);
public:
// 顶点格式
struct SVertexData
{
enum { FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX2 };
D3DXVECTOR3 position; // 位置
D3DXVECTOR3 normal; // 法线
float tu, tv; // 纹理坐标
float tu1, tv1; // 纹理坐标1
};
// 法线的顶点格式
struct SNormalVertexData
{
enum { FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE };
D3DXVECTOR3 position; // 位置
DWORD diffuse; // 颜色
};
public:
// 创建、销毁
bool Create(int nSize);
void Destroy(void);
// 随机生成高度数据
// fRoughness: 粗糙度(0.0f - 1.0f)
// fSlab: 层次趋向(0.0f - 1.0f)
// nBlur: 模糊次数
void RandomHeight(float fRoughness = 0.5f, float fSlab = 0.5f, int nBlur = 2);
// 更新模型细节
void UpdateDetail(CCamera* pCamera, int nEyeshot);
// 是否绘制法线
void SetDrawNormal(bool bDraw){
m_bDrawNormal = bDraw;
}
bool IsDrawNormal(void){
return m_bDrawNormal;
}
// 高度缩放
void SetHeightScale(float fScale){
m_fHeightScale = fScale;
}
float GetHeightScale(void){
return m_fHeightScale;
}
// 地形尺寸
int GetSize(void){
return m_nSize;
}
// 地形块尺寸
int GetPatchSize(void){
return m_nPatchSize;
}
// 地形高度最大值
float GetMaxHeight(void){
assert(m_field.IsValid());
return m_field.GetMaxHeight() * m_fHeightScale;
}
private:
// 设置模型
HRESULT SetupGeometry(void);
// 设置法线模型
HRESULT SetupNormalGeometry(void);
// 设置索引
HRESULT SetupIndexBuffer(void);
// 设置材质
void SetupMaterial(void);
// 索引映射
void MapIndices(LPDWORD pOut, const STile* pTile);
private:
CRiceIndicesMng m_RiceIndicesMng; // "米"字索引模板管理器
CField m_field; // 用于管理地形高度及细节等
CFieldTexturePainter m_TexturePainter; // 用于生成地形纹理
SPatch* m_Patchs; // 地形块数组
LPDIRECT3DTEXTURE9 m_pTexture; // 地形纹理指针
LPDIRECT3DTEXTURE9 m_pDetailTexture; // 细节纹理指针
D3DMATERIAL9 m_Material; // 材质
bool m_bDrawNormal; // 是否绘制法线
float m_fHeightScale; // 高度缩放
int m_nSize; // 地形尺寸
int m_nPatchSize; // 地形块尺寸
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -