/*
* 这些代码是由Jeff Molofee 与2000年写的,再次我必须感谢Fredric Echols,因为他使这些代码看起来更简洁和高效,并使他易于使用。
* 如果你发现这些代码对你有所帮助,请访问我的站点 http://nehe.gamedev.net/default.asp ,并让我知道。
*********************************************************************************************************************************
* 基于texture.cpp文件修改
* 这份文档是由DancingWind翻译的,如果有什么错误请e-mail:zhouwei02@mails.tsinghua.edu.cn
* //old code //不用了代码用//删除
* /********************************************************************************************************************/ /*
* new code //新的代码位于两排/*************/ /*之间,便于查找
* /********************************************************************************************************************/ /*
/***********************************新添的代码***********************************************************************************/
/********************************************************************************************************************************/
/*********************包含链接的库文件*******************************************************************************************/
#pragma comment( lib, "opengl32.lib" )
#pragma comment( lib, "glu32.lib" )
#pragma comment( lib, "glut32.lib")
#pragma comment( lib, "glew32.lib")
#pragma comment( lib, "glaux.lib")
#pragma comment( lib, "vfw32.lib" )
/********************************************************************************************************************************/
#include <windows.h> // Windows的头文件
#include "glew.h" // 包含最新的gl.h,glu.h库
//#include <glut.h> // 包含OpenGL实用库
#include <stdio.h> // 标准输入/输出库的头文件
#include <math.h> // 数学库函数
#include "glaux.h" // GLaux库的头文件
/***********************************新添的代码***********************************************************************************/
#include <stdarg.h> // 用来定义可变参数的头文件
GLuint base; // 绘制字体的显示列表的开始位置
GLfloat rot;
GLfloat cnt1; // 字体移动计数器1
GLfloat cnt2; // 字体移动计数器2
/********************************************************************************************************************************/
GLfloat xrot; // X 旋转量
GLfloat yrot; // Y 旋转量
GLfloat zrot; // Z 旋转量
GLuint texture[1]; // 存储一个纹理
HDC hDC=NULL; // 窗口着色描述表句柄
HGLRC hRC=NULL; // OpenGL渲染描述表句柄
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
bool keys[256]; // 保存键盘按键的数组
bool active=TRUE; // 窗口的活动标志,缺省为TRUE
bool fullscreen=TRUE; // 全屏标志缺省,缺省设定成全屏模式
GLYPHMETRICSFLOAT gmf[256];
GLfloat rtri; // 用于三角形的角度
GLfloat rquad; // 用于四边形的角度
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // WndProc的定义
/***********************************新添的代码***********************************************************************************/
GLvoid BuildFont(GLvoid) // 创建位图字体
{
HFONT font; // 字体句柄
HFONT oldfont; // 旧的字体句柄
base = glGenLists(96); // 创建96个显示列表
font = CreateFont( -24, // 字体高度
0, // 字体宽度
0, // 字体的旋转角度 Angle Of Escapement
0, // 字体底线的旋转角度Orientation Angle
FW_BOLD, // 字体的重量
FALSE, // 是否使用斜体
FALSE, // 是否使用下划线
FALSE, // 是否使用删除线
ANSI_CHARSET, // 设置字符集
OUT_TT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁剪精度
ANTIALIASED_QUALITY, // 输出质量
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
"Comic Sans MS"); // 字体名称
oldfont = (HFONT)SelectObject(hDC, font); // 选择我们需要的字体
wglUseFontBitmaps(hDC, 32, 96, base); // 创建96个显示列表,绘制从ASCII码为32-128的字符
SelectObject(hDC, oldfont); // 选择原来的字体
DeleteObject(font); // 删除字体
}
GLvoid KillFont(GLvoid) // 删除显示列表
{
glDeleteLists(base, 96); //删除96个显示列表
}
GLvoid glPrint(const char *fmt, ...) // 自定义GL输出字体函数
{
float length=0;
char text[256]; // 保存文字串
va_list ap; // 指向一个变量列表的指针
if (fmt == NULL) // 如果无输入则返回
return;
va_start(ap, fmt); // 分析可变参数
vsprintf(text, fmt, ap); // 把参数值写入字符串
va_end(ap); // 结束分析
for (unsigned int loop=0;loop<(strlen(text));loop++) // Loop To Find Text Length
{
length+=gmf[text[loop]].gmfCellIncX; // Increase Length By Each Characters Width
}
glTranslatef(-length/2,0.0f,0.0f);
glPushAttrib(GL_LIST_BIT); // 把显示列表属性压入属性堆栈
glListBase(base - 32); // 设置显示列表的基础值
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // 调用显示列表绘制字符串
glPopAttrib(); // 弹出属性堆栈
}
/********************************************************************************************************************************/
AUX_RGBImageRec *LoadBMP(CHAR *Filename) // 载入位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保文件名已提供
{
return NULL; // 如果没提供,返回 NULL
}
File=fopen(Filename,"r"); // 尝试打开文件
if (File) // 文件存在么?
{
fclose(File); // 关闭句柄
return auxDIBImageLoadA(Filename); // 载入位图并返回指针
}
return NULL; // 如果载入失败,返回 NULL
}
int LoadGLTextures() // 载入位图(调用上面的代码)并转换成纹理
{
int Status=FALSE; // 状态指示器
AUX_RGBImageRec *TextureImage[1]; // 创建纹理的存储空间
memset(TextureImage,0,sizeof(void *)*1); // 将指针设为 NULL
// 载入位图,检查有无错误,如果位图没找到则退出
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE; // 将 Status 设为 TRUE
glGenTextures(1, &texture[0]); // 创建纹理
// 使用来自位图数据生成 的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // 线形滤波
}
if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 Status
}
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将Height设为1
}
glViewport(0,0,width,height); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
int InitGL(GLvoid) // 此处开始对OpenGL进行所有设置
{
//if (!LoadGLTextures()) // 调用纹理载入子例程
//{
// return FALSE; // 如果未能载入,返回FALSE
//}
glEnable(GL_TEXTURE_2D); // 启用纹理映射
glShadeModel(GL_SMOOTH); // 启用阴影平滑
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 黑色背景
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // �