📄 terrain.h
字号:
#ifndef TERRAIN_H
#define TERRAIN_H
#include <cmath>
#include <string>
#include <vector>
#include <windows.h>
#include <gl\glee.h> // 扩展库(此程序中非必须)
#include "toolFun.h"
#include "ImageLoad.h"
#include "Vector3.h"
#pragma warning(disable : 4996)
using std::string;
using std::vector;
//--------------
// HeightMap类
//--------------
class HeightMap
{
public:
// 局部枚举
//enum TextureTileType
//{
// LowestTile = 0, // 最低砖瓦纹理,例如:土地,灰尘
// LowTile, // 较低砖瓦纹理,例如:草地
// HighTile, // 较高砖瓦纹理,例如:岩石
// HighestTile // 最高砖瓦纹理,例如:积雪
//};
// 地形光照类型枚举
enum IlluminationType
{
BaseOnTerrainHeight = 0, // 基于高度的
BaseOnSlopeIllumination, // 基于斜坡的
FromOutsideIlluminationFile,// 来自外部导入的照明文件
NoIllumination
};
// 局部类定义
// 纹理作用区域类
struct TextureRegion
{
// 默认构造函数
TextureRegion():m_iLowHeight(0),m_iOptimalHeight(0),m_iHighHeight(0){}
// 公有数据
GLint m_iLowHeight; // 作用区域底限(0%)
GLint m_iOptimalHeight; // 最佳区域(100%)
GLint m_iHighHeight; // 作用区域上限(0%)
};
// 纹理砖瓦管理类,用于使用几个纹理生成地形纹理
struct TextureTileManeger
{
// 默认构造函数
TextureTileManeger():m_vecTexture(),m_vecTextureRegion(){}
// 析构函数
~TextureTileManeger();
// 公有数据
vector<ImageLoad*> m_vecTexture;
vector<TextureRegion*> m_vecTextureRegion;
};
// 默认构造函数
HeightMap():m_pHeightData(NULL),m_iHeightMapSize(0),m_fScale(0.0f),
m_TextureTileManeger(),m_uiTerrainTextureID(0),m_pTerrainData(NULL),
m_iTerrainTextureSize(0),m_bEnableDetailTexture(GL_FALSE),
m_iRepeatDetailTexture(0),m_DetailTexture(),m_IlluminationType(NoIllumination),
m_vecIlluminationColor(),m_pIlluminationData(NULL),m_iIlluminationMapSize(0),
m_fMinBrightness(0.0f),m_fMaxBrightness(0.0f),m_fIlluminationSoftness(0.0f),
m_iDirectionX(0),m_iDirectionZ(0){}
// 虚析构函数
virtual ~HeightMap();
// 释放高度数据资源
GLvoid CleanUpHeightData();
// 释放地形纹理数据资源
GLvoid CleanUpTerrainTextureData();
// 释放光照数据资源
GLvoid CleanUpIlluminationData();
// 从文件载入高度图
GLboolean LoadHeightMapFromFile(const string &heightMapFilePath, GLint size);
// 将高度图数据写进一个文件中
GLboolean WriteHeightMapToFile(const string &heightMapFileName) const;
// 从文件中载入照明图
GLboolean LoadIlluminationMapFromFile(const string &illuminationFilePath, GLint size);
// 将照明图写进一个文件中
GLboolean WriteIlluminationMapToFile(const string &illuminationMapFileName) const;
// 使用Fault Formation算法生成地形
GLboolean GenerateTerrainWithFault(GLuint size, GLint iterationTime,
GLint minHeight, GLint maxDelta, GLfloat filter);
// 使用Midpoint Displacement算法生成随机地形
GLboolean GenerateTerrainWithPlasma(GLint size, GLfloat roughness);
// 载入地形纹理砖瓦
GLboolean LoadTerrainTextureTile(const string &texturePath);
// 为纹理砖瓦创建对应的区域对象
GLvoid GenerateTextureTileRegion()
{
// 分配每个纹理砖瓦的区域对象
for (size_t i = 0; i < m_TextureTileManeger.m_vecTexture.size(); ++i)
{
m_TextureTileManeger.m_vecTextureRegion.push_back(new TextureRegion);
}
}
// 生成detail纹理
GLboolean GenerateDetailTexture(const string &texturePath)
{
return m_DetailTexture.GenerateTexture(texturePath);
}
// 生成地形纹理
GLboolean GenerateTerrainTexture(GLint size);
// 自定义生成照明图参数
GLvoid CustomizeSlopeIlluminationParameter(GLfloat minBrightness, GLfloat maxBrightness,
GLfloat softness, GLint directionX, GLint directionZ)
{
m_fMinBrightness = minBrightness;
m_fMaxBrightness = maxBrightness;
m_fIlluminationSoftness = softness;
m_iDirectionX = directionX;
m_iDirectionZ = directionZ;
}
// 生成根据高度图生成照明图
GLboolean GenerateIlluminationMapAccordingHeightMap(IlluminationType illuminationType);
// 将高度图小图
GLvoid RenderHeightSmallMap(GLint windowWidth, GLint windowHeight) const;
// 将照明图小图
GLvoid RenderIlluminationSmallMap(GLint windowWidth, GLint windowHeight) const;
// 绘制高度图,纯虚函数
virtual GLvoid Render() const = 0;
// 设置detail纹理重复次数
GLvoid SetDetailRepeat(GLint repeatDetailTexture)
{
m_iRepeatDetailTexture = repeatDetailTexture;
}
// 设置detail纹理启动标志
GLvoid SetDetailTextureFlag(GLboolean flag)
{
m_bEnableDetailTexture = flag;
}
// 返回高度图尺寸
GLuint GetTerrainSize() const
{
return m_iHeightMapSize;
}
// 高度图缩放值
GLfloat GetScale() const
{
return m_fScale;
}
// 设置高度图缩放值
GLvoid SetScale(GLfloat scale)
{
m_fScale = scale;
}
// 设置高度图中指定点的高度值
GLvoid SetHeightAtPoint(GLubyte height, GLint x, GLint z)
{
m_pHeightData[z*m_iHeightMapSize + x] = height;
}
// 返回高度图中指定点的高度值
GLubyte GetHeightAtPoint(GLint x, GLint z) const
{
return m_pHeightData[z*m_iHeightMapSize + x];
}
// 返回高度图中指定点的缩放后的高度值
GLubyte GetScaleHeightAtPoint(GLint x, GLint z) const
{
return m_pHeightData[z*m_iHeightMapSize + x]*m_fScale;
}
// 设置简单基于高度的光照颜色
GLvoid SetIlluminationColor(const Vector3 &illuminationColor)
{
m_vecIlluminationColor = illuminationColor;
}
// 得到此顶点的被照明程度
GLubyte GetIlluminationDegreeAtPoint(GLint x, GLint z) const
{
if (m_pIlluminationData != NULL)
{
return m_pIlluminationData[m_iIlluminationMapSize*z + x];
}
else
{
return 255; // 默认为完全光照
}
}
// 设置照明图指定位置的照明度
GLvoid SetBrightnessAtPoint(GLint x, GLint z, GLubyte illuminationDegree)
{
if (m_pIlluminationData != NULL)
{
m_pIlluminationData[m_iIlluminationMapSize*z + x] = illuminationDegree;
}
}
protected:
// 地形高度图数据成员
GLubyte *m_pHeightData; // 高度图数据
GLint m_iHeightMapSize; // 高度图尺寸
GLfloat m_fScale; // 高度图的缩放值
// 地形纹理数据成员
TextureTileManeger m_TextureTileManeger; // 地形砖瓦管理对象
GLuint m_uiTerrainTextureID; // 地形纹理标识
GLubyte *m_pTerrainData; // 地形纹理数据
GLint m_iTerrainTextureSize; // 地形纹理尺寸
GLboolean m_bEnableDetailTexture; // 启动detail纹理标志
GLint m_iRepeatDetailTexture; // detail纹理重复次数
ImageLoad m_DetailTexture; // detail纹理对象
// 照明数据成员
IlluminationType m_IlluminationType;// 使用的照明类型
Vector3 m_vecIlluminationColor; // 简单基于高度的照明颜色
GLubyte *m_pIlluminationData; // 照明图数据
GLint m_iIlluminationMapSize; // 照明图尺寸
// 生成照明图的相关参数成员
GLfloat m_fMinBrightness; // 照明最小和最大亮度
GLfloat m_fMaxBrightness;
GLfloat m_fIlluminationSoftness; // 照明柔和度
GLint m_iDirectionX; // 照明方向(相对于高度图的方向)
GLint m_iDirectionZ;
private:
// 私有操作
// 屏蔽掉复制控制函数
HeightMap(const HeightMap &rhs);
HeightMap &operator =(const HeightMap &rhs);
// 将值规范在范围内
GLfloat StandardizationValue(GLfloat value)
{
if (value > 255.0f)
{
value = 255.0f;
}
else if (value < 0.0f)
{
value = 0.0f;
}
return value;
}
// 规范化地形高度值到0 -- 255的范围内
GLboolean NormalizeTerrain(GLfloat *heightData);
// 为使用Fault Formation算法生成"部分"地形进行过滤融合
GLvoid FilterHeightArea(GLfloat* heightData, GLint stride, GLuint count, GLfloat filter);
// 以各个方向对整个地形进行过滤融合
GLvoid FilterHeightField(GLfloat *heightData, GLfloat filter);
// 得到指定纹理砖瓦的纹理坐标
GLvoid GetTileTexCoord(ImageLoad *pTexture, GLint &x, GLint &y);
// 对计算地形纹理坐标对应的高度图上的差值后的高
// 度值,解除了地形纹理尺寸对高度图尺寸的依赖性
GLubyte InterpolateHeight(GLint x, GLint z, GLfloat ratio);
// 根据指定的地形高度值提取此纹理砖瓦的颜色贡献百分比
GLfloat CalulateContributionPercent(GLint tileIndex, GLubyte height);
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -