📄 main.cpp
字号:
#include <ctime>
#include <string>
#include <iostream>
#include "BruteForce.h"
using namespace std;
BruteForce g_BruteForce;
// 多重纹理扩展函数
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;
GLfloat g_fMinIllumination = 0.2f;
GLfloat g_MaxIllumination = 0.9f;
GLint g_iSoftess = 15;
GLint g_iDerctionX = 1;
GLint g_iDerctionZ = 1;
//---------ChangeSize---------------
// 描述:当窗口大小尺寸发生变化时
// 调用以更新窗口尺寸状态
// 参数;width - 窗口宽度(单位为像素)
// height - 窗口高度
// 返回:无
//----------------------------------
void ChangeSize(int width, int height)
{
if (height == 0) // 防止被零除
{
height = 1; // 将Height设为1
}
glViewport(0,0,width,height); // 将视口得当大小设置为窗口客户区域的大小
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 设置透视图
gluPerspective(45.0f,(GLfloat) width/(GLfloat) height,1.0f,1000.0f);
//gluPerspective(45.0f, width/height,1.0f,1000.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
//---------CleanUp------------
// 描述:释放对象或显示列表
// 参数;无
// 返回:无
//----------------------------
void CleanUp()
{
}
//---------RetGenerateIlluminationMap------------
// 描述:重新生成照明图
// 参数;无
// 返回:无
//----------------------------
GLvoid RetGenerateIlluminationMap()
{
// 销毁前一个照明图
g_BruteForce.CleanUpIlluminationData();
// 定义slope照明参数
g_BruteForce.CustomizeSlopeIlluminationParameter(g_fMinIllumination, g_MaxIllumination, g_iSoftess, g_iDerctionX, g_iDerctionZ);
// 生成照明图
if (g_BruteForce.GenerateIlluminationMapAccordingHeightMap(HeightMap::BaseOnSlopeIllumination) != GL_TRUE)
{
exit(-1);
}
}
//---------KeysBoard----------
// 描述:处理键盘输入
// 参数;key - 键位码
// x -
// y -
// 返回:无
//---------------------------
void KeysBoard(unsigned char key, int x, int y)
{
switch (key)
{
case 27: // 按下Esc退出键
{
CleanUp(); // 清除相关分配的资源
exit(0);
}
case 'A':
case 'a':
{
// 使用Fault Formation算法生成地形
if (g_BruteForce.GenerateTerrainWithPlasma(128, 1.0f) != GL_TRUE)
{
exit(-1);
}
// 使用Fault Formation算法生成地形
//if (g_BruteForce.GenerateTerrainWithFault(128, 64, 0, 2555, 0.25f) != GL_TRUE)
//{
// exit(-1);
//}
// 设置地形缩放比例
g_BruteForce.SetScale(0.25f);
glutPostRedisplay();
break;
}
case 'S':
case 's':
{
// 生成地形纹理
if (g_BruteForce.GenerateTerrainTexture(256) != GL_TRUE)
{
exit(-1);
}
glutPostRedisplay();
break;
}
case 'D':
case 'd':
{
static GLboolean flag = GL_TRUE;
flag = !flag;
// 启动detail纹理
g_BruteForce.SetDetailTextureFlag(flag);
glutPostRedisplay();
break;
}
case '1':
{
g_fMinIllumination += 0.01f;
if (g_fMinIllumination >= g_MaxIllumination)
{
g_fMinIllumination -= 0.01f;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '2':
{
g_fMinIllumination -= 0.01f;
if (g_fMinIllumination < 0.0f)
{
g_fMinIllumination += 0.01f;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '3':
{
g_MaxIllumination += 0.01f;
if (g_MaxIllumination > 1.0f)
{
g_MaxIllumination -= 0.01f;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '4':
{
g_MaxIllumination -= 0.01f;
if (g_MaxIllumination <= g_fMinIllumination)
{
g_MaxIllumination += 0.01f;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '5':
{
++g_iSoftess;
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '6':
{
--g_iSoftess;
if (g_iSoftess <= 0)
{
++g_iSoftess;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '7':
{
++g_iDerctionX;
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '8':
{
--g_iDerctionX;
if (g_iDerctionX <= 0)
{
++g_iDerctionX;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '9':
{
++g_iDerctionZ;
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
case '0':
{
--g_iDerctionZ;
if (g_iDerctionZ <= 0)
{
++g_iDerctionZ;
}
// 重新生成照明图
RetGenerateIlluminationMap();
glutPostRedisplay();
break;
}
default:
{
break;
}
}
}
//---------InitGL-----------------
// 描述:初始化渲染状态
// 参数;无
// 返回:无
//--------------------------------
void InitGL()
{
//glEnable(GL_LIGHT0); // 启动0号光源
//glEnable(GL_LIGHTING); // 启动光照(光照计算)
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 背景颜色
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glEnable(GL_DEPTH_TEST); // 启用深度测试
glEnable(GL_CULL_FACE); // 启动被面剔除
glFrontFace(GL_CCW); // 使逆向绘制的面为正面
glEnable(GL_TEXTURE_2D); // 默认启动启用二维纹理
// 告诉OpenGL我们希望进行最好的透视修正
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告诉系统对透视进行修正
// 设置随机种子
srand( time(NULL) );
const string TexturePath[4] = { "lowestTile.bmp", "lowTile.bmp",
"HighTile.bmp", "highestTile.bmp" };
// 载入纹理砖瓦
for (GLint i = 0; i < 4; ++i)
{
if (g_BruteForce.LoadTerrainTextureTile(TexturePath[i]) != GL_TRUE)
{
exit(-1);
}
}
// 为纹理砖瓦创建对应的区域对象
g_BruteForce.GenerateTextureTileRegion();
// 载入detail纹理
if (g_BruteForce.GenerateDetailTexture("detailMap.jpg") != GL_TRUE)
{
exit(-1);
}
// 设置detail纹理的重复次数
g_BruteForce.SetDetailRepeat(8);
// 启动detail纹理
g_BruteForce.SetDetailTextureFlag(GL_TRUE);
// 使用Fault Formation算法生成地形
if (g_BruteForce.GenerateTerrainWithPlasma(128, 1.0f) != GL_TRUE)
{
exit(-1);
}
// 使用Fault Formation算法生成地形
//if (g_BruteForce.GenerateTerrainWithFault(128, 64, 0, 2555, 0.25f) != GL_TRUE)
//{
// exit(-1);
//}
// 设置地形缩放比例
g_BruteForce.SetScale(0.25f);
// 生成地形混合纹理
if (g_BruteForce.GenerateTerrainTexture(256) != GL_TRUE)
{
exit(-1);
}
// 载入照明图
//if (g_BruteForce.LoadIlluminationMapFromFile("lightmap.raw", 128) != GL_TRUE)
//{
// exit(-1);
//}
// 定义slope照明参数
g_BruteForce.CustomizeSlopeIlluminationParameter(0.2f, 0.9f, 15, 1, 1);
// 生成照明图
if (g_BruteForce.GenerateIlluminationMapAccordingHeightMap(HeightMap::BaseOnSlopeIllumination) != GL_TRUE)
{
exit(-1);
}
// 设置""照明"颜色
g_BruteForce.SetIlluminationColor( Vector3(1.0f, 1.0f, 1.0f) );
// 检测是否支持多重纹理,并获得多重纹理函数
if (GL_ARB_multitexture)
{
glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress("glMultiTexCoord2fARB");
glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
}
else
{
exit(-1);
}
}
//---------RenderScene------------
// 描述:绘制场景
// 参数;无
// 返回:无
//--------------------------------
void RenderScene()
{
// 设置标题文本
ostringstream strStream;
strStream << "MinIllumination: " << g_fMinIllumination << " MaxIllumination: "
<< g_MaxIllumination << " Softess: " << g_iSoftess << " iDerctionX: " << g_iDerctionX
<< " DerctionZ: " << g_iDerctionZ;
string str = strStream.str();
glutSetWindowTitle(str.c_str());
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
glMatrixMode(GL_MODELVIEW); // 设置操作矩阵为模型视图矩阵
glLoadIdentity(); // 重置当前的模型观察矩阵
glPushMatrix(); // 保存当前模型观察矩阵
// 设置照相机的位置和视线方向
//gluLookAt( 313.04019f, 390.87973f, 134.16623f,
// 312.54050f, 390.01370f, 134.14877f,
// 0.0f, 1.0f, 0.0f );
gluLookAt( 131.26527f, 208.49095f, 155.22302f,
130.94115f, 207.63378f, 154.82277f,
0.0f, 1.0f, 0.0f );
// 绘制高度地形照明小图
g_BruteForce.RenderIlluminationSmallMap(640, 480);
// 绘制高度地形
glPushMatrix( );
//glScalef(2.0f, 2.0f, 2.0f);
g_BruteForce.Render();
glPopMatrix( );
glPopMatrix(); // 恢复模型观察矩阵
// 刷新绘制命令
glutSwapBuffers();
}
// 主入口函数
int main(int argc, char* argv[])
{
// 初始化Glut
glutInit(&argc, argv);
// 启动双缓冲,RGBA颜色缓冲和深度缓冲区
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
// 设置窗口尺寸
glutInitWindowSize(640,480);
// 创建窗口
glutCreateWindow("Glut框架");
// 设置回调函数
glutReshapeFunc(ChangeSize);
glutKeyboardFunc(KeysBoard);
glutDisplayFunc(RenderScene);
glutIdleFunc(RenderScene); // 设置管理背景过程函数
// 初始化绘制状态
InitGL();
// 进入主程序循环
glutMainLoop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -