📄 renderer.cpp.svn-base
字号:
#include "Renderer.h"
#include <windows.h>
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include "ChaosPrint.h"
#include "SkyBox.h"
#include "../game/util.h"
#include "../game/unit.h"
#include "../game/custom_time.h"
#include "../gamedata/fireball.h"
#include <list>
Renderer::Renderer(void)
{
}
Renderer::~Renderer(void)
{
}
void DisplayBMP(GLuint texture)
{
//BMP
glPushMatrix();
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glColor3f(1,1,1);
glBindTexture(GL_TEXTURE_2D,texture);
glLoadIdentity();
glTranslatef(0,0,-2.4);
glRasterPos2f(0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex3f(-1.33,-1,0);
glTexCoord2f(1,0);
glVertex3f(1.33,-1,0);
glTexCoord2f(1,1);
glVertex3f(1.33,1,0);
glTexCoord2f(0,1);
glVertex3f(-1.33,1,0);
glEnd();
glPopMatrix();
}
void DisplayCoord()
{
//显示坐标
float x,y,z;
x = player.pos.x;
z = player.pos.z;
y = player.pos.y;
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glColor3f(1,0,0);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(-0.55, 0.4,0.0);
ChaosPrint::glPrint("%5.2f %5.2f %5.2f", x,y,z); // Print GL Text To The Screen
glPopMatrix();
}
void DisplayPutout()
{
//putout
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glColor3f(0,0,1);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(-0.2, -0.37,0.0);
ChaosPrint::glPrint(putout); // Print GL Text To The Screen
glPopMatrix();
}
void DisplayFPS()
{
//计算并显示FPS
DWORD nowtime;
nowtime = timeGetTime();
if(!count) lasttime = nowtime;
if(count<5)count++;
else
{
fps = 5000.0/(nowtime-lasttime);
count =0;
}
glPushMatrix();
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glColor3f(1,0,0);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(0.45, 0.4,0.0);
ChaosPrint::glPrint("FPS %5.2f", fps); // Print GL Text To The Screen
glPopMatrix();
}
void DisplayNumtris()
{
//显示三角形绘制数量
glPushMatrix();
glColor3f(1,0,0);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(-0.30, 0.4,0.0);
ChaosPrint::glPrint("TRIANGLES: %d", numtriangles); // Print GL Text To The Screen
glPopMatrix();
}
void Selection(void) // This Is Where Selection Is Done
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
GLfloat x,y,z,lx,ly,lz;
glPushMatrix();
// 变换要绘图函数里的顺序一样,否则坐标转换会产生错误
/* glScalef(m_srtMatrix[0], m_srtMatrix[1], m_srtMatrix[2]); // 缩放、平移、旋转变换
glRotatef(m_srtMatrix[3], 1.0f, 0.0f, 0.0f);
glRotatef(m_srtMatrix[4], 0.0f, 1.0f, 0.0f);
glRotatef(m_srtMatrix[5], 0.0f, 0.0f, 1.0f);
glTranslatef(m_srtMatrix[6], m_srtMatrix[7], m_srtMatrix[8]);
*/
x = camera.position.x;
y = camera.position.y;
z = camera.position.z;
lx = camera.lookat.x;
ly = camera.lookat.y;
lz = camera.lookat.z;
glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = mouseX;
winY = 768 - mouseY;
glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
selection.x = (float)posX;
selection.y = (float)posY;
selection.z = (float)posZ;
glColor3f(1,0,0);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(-0.30, 0.0,0.0);
//list<FireBall>::iterator i = fireBalls.begin();
//if (i != fireBalls.end())
// ChaosPrint::glPrint("%f %f %f %d %d %d",
// i->pos.x, i->pos.y, i->pos.z, fireBalls.size(), i->collideId, i->SenderID);
//else
// ChaosPrint::glPrint("%d %u %d ",fireBalls.size(), curT, caixiao);
}
int DisplayTrees()
{
list<Tree>::iterator i = trees.begin();
int numtriangles = 0;
while(i!=trees.end())
{
numtriangles+=i->RenderTree();
i++;
}
return numtriangles;
}
void DisplayFireBalls()
{
list<FireBall>::iterator i = fireBalls.begin();
while(i!=fireBalls.end())
{
i->Render();
i++;
}
}
void DisplayUnits()
{
//绘制Player
float x,y,z;
x = player.pos.x;
y = player.pos.y;
z = player.pos.z;
glPushMatrix();
glTranslatef(x,y,z);
glRotatef(player.rotY+270, 0., 1., 0.);//
glRotatef(-90, 1., 0., 0.);
glScalef( 0.1, 0.1, 0.1 );
glCullFace( GL_FRONT );
glEnable(GL_TEXTURE_2D);
// glEnable(GL_LIGHTING);
static float prev;
float curr = GetTickCount( ) / 1000.0;
player.model->AdvanceFrame(curr - prev);
player.model->DrawModel( );
glPopMatrix();
//绘制Units
list<GameObject>::iterator i = units.begin();
while(i!=units.end())
{
x = i->pos.x;
y = i->pos.y;
z = i->pos.z;
glPushMatrix();
// glLoadIdentity();
glTranslatef(x,y,z);
glRotatef(i->rotY+270, 0., 1., 0.);
glRotatef(-90, 1., 0., 0.);
glScalef( 0.1, 0.1, 0.1 );
glCullFace( GL_FRONT );
glEnable(GL_TEXTURE_2D);
// glEnable(GL_LIGHTING);
i->model->AdvanceFrame(curr - prev);
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
i->model->DrawModel( );
//glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glPopMatrix();
i++;
}
prev = curr;
}
void DisplayExplosion()
{
// 渲染/混合爆炸效果
glEnable(GL_BLEND); // 使用混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glDepthMask(GL_FALSE); // 禁用深度缓存
glBindTexture(GL_TEXTURE_2D, bmptexture[5]); // 设置纹理
list<FireBall>::iterator i = fireBalls.begin();
while(i!=fireBalls.end()) // 渲染20个爆炸效果
{
if(i->exploded)
{
glPushMatrix();
float alpha = 1 - (curT - i->explosionTime)/1000.0;// 设置alpha
if(alpha>0){
float scale = 1 + (curT - i->explosionTime)/1000.0;
// 设置颜色
glColor4f(1.f,0.f,0.f,alpha);
glScalef(scale,scale,scale);
// 设置位置
glTranslatef(i->pos.x/scale,i->pos.y/scale,i->pos.z/scale);
glBegin(GL_QUADS);
glRotatef(-45,0,1,0);
glNormal3f(0,0,1);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.00,-0.80,0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.50,-0.80,0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.50,0.80,0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.50,0.80,0);
glNormal3f(0,0,-1);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5,0.8,0);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.50,0.80,0);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.50,-0.80,0);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.50,-0.80,0);
glNormal3f(1,0,0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,-0.80,1.00);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,-0.80,-1.00);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0,0.80,-1.00);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0,0.80,1.00);
glNormal3f(-1,0,0);
glTexCoord2f(0.0f, 0.0f); glVertex3f(0,0.80,1.00);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0,0.80,-1.00);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0,-0.80,-1.00);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0,-0.80,1.00);
glEnd();
}
glPopMatrix();
}
i++;
}
glDisable(GL_BLEND);
glDepthMask(GL_TRUE); // 禁用深度缓存
}
//显示玩家血量
void DisplayHealth()
{
glPushMatrix();
glColor3f(1,0,0);
glLoadIdentity(); // Reset The Current Modelview Matrix
glTranslatef(0.0f,0.0f,-1.0f); // Move One Unit Into The Screen
glRasterPos3f(0.45, 0.35,0.0);
ChaosPrint::glPrint("HP: %d", player.health); // Print GL Text To The Screen
glPopMatrix();
}
int Renderer::render(void)
{
numtriangles = 0;
float df = 100.0;
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[] = {300.0,200.0,250.0,1.0};//enable light
GLfloat spec[]={1.0, 1.0 ,1.0 ,1.0}; //sets specular highlight of balls
GLfloat posl[]={0,400,0,1}; //position of ligth source
GLfloat amb[]={0.2f, 0.2f, 0.2f ,1.0f}; //global ambient
GLfloat amb2[]={0.3f, 0.3f, 0.3f ,1.0f}; //ambient of lightsource
/* glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);*/
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0,GL_POSITION,LightPosition);
glLightfv(GL_LIGHT0,GL_AMBIENT,amb2);
glEnable(GL_LIGHT0);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,amb);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
// glEnable(GL_BLEND);
// glBlendFunc(GL_SRC_ALPHA, GL_ONE);
/*glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
*/ glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glMaterialfv(GL_FRONT,GL_SPECULAR,spec);
glMaterialfv(GL_FRONT,GL_SHININESS,&df);
gluLookAt(
camera.position.x, camera.position.y, camera.position.z,
camera.lookat.x, camera.lookat.y, camera.lookat.z,
0.f,1.f,0.f);
//绘制地形
if(displayMap)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,bmptexture[1]);
numtriangles+=map.RenderMap();
}
//绘制树
if (displayTrees)
numtriangles+=DisplayTrees();
if(displayMap)
DisplayUnits();
DisplayExplosion();
if(displayBMP)
DisplayBMP(bmptexture[4]);
else
{
DisplayCoord();
DisplayFPS();
DisplayNumtris();
DisplayPutout();
DisplayFireBalls();
DisplayHealth();
Selection();
}
// SkyBox::RenderSky(1000,1000,1000,1000,0,1000);
glFlush();
SwapBuffers(hDC);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -