⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 renderer.cpp.svn-base

📁 自己做的小游戏
💻 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 + -