www.pudn.com > 3dterrain.zip > DrawGLScene.cpp


////////////////////////////////////////////////////////////////////// 
// scene.cpp: implementation of the scene class. 
// 
////////////////////////////////////////////////////////////////////// 
#include "scene.h" 
////////////////////////////////////////////////////////////////////// 
// Tu je vsetko co sa kresli 
 
void scene::DrawGLScene() 
{ 
	if(keys['L'] && keys[VK_CONTROL]){ english = !english; keys['L']=0; } 
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	//cisti buffer v aktualnom viewporte a to iba color a hlbkovy bit 
	Prepni_do_3D(); 
	glLoadIdentity(); 
//	GetCursorPos(&MouseBod);			// pre zobrazenie kurzora 
//	mouse_x = MouseBod.x; 
//	mouse_y = screen_y-1-MouseBod.y; 
	 
	c->MoveWorld(fps); 
	if(keys[VK_SHIFT])c->zmena=1; 
	if(keys['K']){	kolizia = !kolizia; c->zmena = 1; keys['K']=0; } 
	if(c->zmena&&kolizia) 
	{ 
//		sky_box->CheckCollision(&c->vp,0.25f); 
		c->vp.y = plocha->Height(c->vp.x, c->vp.z)+1.0f; 
		c->d(); 
	} 
 
	if(ciary)glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
	else	 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
	 
	glDisable(GL_CULL_FACE );		// kvoli sky_boxu 
	 
	if(keys['V']){	draw_sky_box=!draw_sky_box;keys['V']=0;} 
	if(draw_sky_box) 
	{ 
		glDepthMask(0); 
		glPushMatrix(); 
		glTranslatef( c->vp.x, c->vp.y, c->vp.z ); 
		sky_box->Render(); 
		glPopMatrix(); 
		glDepthMask(1); 
	} 
 
	if( !keys['A'] && !keys['D'] ) 
	{ 
		if(keys[VK_ADD]){ clip_distance += 10.f/fps; c->zmena = 1; } 
		if(keys[VK_SUBTRACT]){ clip_distance -= 10.f/fps; c->zmena = 1; } 
		glFogf(GL_FOG_START, 0.6*clip_distance);			// startovacia vzdialenost 
		glFogf(GL_FOG_END, clip_distance);					// ukoncovacia vzdialenost 
	} 
 
	if(keys['L']){	svetlo = !svetlo; keys['L']=0; } 
	if(keys['P']){	ciary = !ciary;keys['P']=0;	} 
	if(keys['N']){	normals = !normals;keys['N']=0;	}	 
 
	if(keys['C']){	cull_face = !cull_face; keys['C']=0; } 
	if(keys['F']) 
	{	 
		fog++; 
		if(fog>2)fog=0; 
		if(fog==1)glEnable(GL_FOG);  
		else glDisable(GL_FOG);  
		keys['F']=0; 
	} 
 
	if(cull_face) glEnable(GL_CULL_FACE );//	else glDisable(GL_CULL_FACE ); 
 
	if(c->zmena && !keys['O']) 
	{ 
		Frustum.CalculateFrustum(); 
		plocha->OcTree->Maz_a_nastav_pasy(); 
	} 
 
	if(keys['T']){	toc_svetlom=!toc_svetlom; keys['T']=0;} 
	if(svetlo) 
	{ 
		if( toc_svetlom ) 
		{ 
			uhol_rotacie_svetla += 30.f/fps; 
			if(uhol_rotacie_svetla > 360.f) uhol_rotacie_svetla -= 360.f; 
 
			smer_svetla[0] =   0.5477225575f * (float) sin( uhol_rotacie_svetla * PI180); 
		//	smer_svetla[1] =   0.83666f; 
			smer_svetla[2] = - 0.5477225575f * (float) cos( uhol_rotacie_svetla * PI180); 
		//	smer_svetla[3] =   0.0f; 
 
			if(!normalove_svetlo) plocha->Vypocitaj_osvetlenie( &smer_svetla[0] ); 
			glLightfv ( GL_LIGHT0, GL_POSITION, smer_svetla  );		// pozicia difuzneho svetla 
		} 
 
		if(keys['A'] && (keys[VK_ADD] || keys[VK_SUBTRACT] || keys[VK_SHIFT])) 
		{ 
			if(keys[VK_ADD])plocha->Ambient += 0.1f/fps; 
			if(keys[VK_SUBTRACT])plocha->Ambient -= 0.1f/fps; 
			if(keys[VK_SHIFT]) plocha->Ambient = 0.0f; 
			if(!normalove_svetlo) plocha->Vypocitaj_osvetlenie( &smer_svetla[0] ); 
		} 
		else if(keys['D'] && (keys[VK_ADD] || keys[VK_SUBTRACT] || keys[VK_SHIFT])) 
		{ 
			if(keys[VK_ADD])plocha->Diffuse += 0.1f/fps; 
			if(keys[VK_SUBTRACT])plocha->Diffuse -= 0.1f/fps; 
			if(keys[VK_SHIFT]) plocha->Diffuse = 1.0f; 
			if(!normalove_svetlo) plocha->Vypocitaj_osvetlenie( &smer_svetla[0] ); 
		} 
 
		if(keys['D'] && keys['A']) 
		{ 
			float s = plocha->Ambient + plocha->Diffuse; 
			if(s>0.01f) 
			{ 
				plocha->Ambient /= s; 
				plocha->Diffuse /= s; 
			} 
			else 
			{ 
				plocha->Ambient = 0; 
				plocha->Diffuse = 0; 
			} 
			if(!normalove_svetlo) plocha->Vypocitaj_osvetlenie( &smer_svetla[0] ); 
		} 
 
		if(keys['B']) 
		{	 
			normalove_svetlo=!normalove_svetlo; 
			if(!normalove_svetlo) plocha->Vypocitaj_osvetlenie( &smer_svetla[0] ); 
			keys['B']=0; 
		} 
 
		if(normalove_svetlo) 
		{ 
			float l[4]; 
			l[0] = plocha->Diffuse;	l[1] = plocha->Diffuse;	l[2] = plocha->Diffuse;	l[3] = 1.0f; 
			glLightfv ( GL_LIGHT0, GL_DIFFUSE, l ); 
			l[0] = plocha->Ambient;	l[1] = plocha->Ambient;	l[2] = plocha->Ambient; 
			glLightModelfv ( GL_LIGHT_MODEL_AMBIENT, l ); 
			glLightfv ( GL_LIGHT0, GL_POSITION, smer_svetla  ); 
 
			glEnable(GL_LIGHTING); 
			plocha->Kresli_glBegin_normal(); 
			glDisable(GL_LIGHTING);					// vypnutie osvetlenia 
		} 
		else  
		{ 
			plocha->Kresli_glBegin_colors(); 
		} 
	} 
	else	plocha->Kresli_glBegin(); 
 
	 
	if(fog==2) 
	{ 
		if(c->zmena && !keys['Y']) 
		{ 
			plocha->Vypocitaj_Fog( &c->vp.x, clip_distance); 
		//	plocha->Maz_fog(); 
			plocha->Vypocitaj_Volumetric_Fog_Sphere( &c->vp.x, &Frustum); 
			plocha->Vypocitaj_Volumetric_Fog_Plate( &c->vp.x ); 
		} 
		plocha->Kresli_Fog(); 
	} 
 
	if(keys['Q'])plocha->OcTree->Kresli_kocky(); 
 
	if(ciary)glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
 
 
	if(normals) plocha->Kresli_normaly(); 
 
	glColor4f(1,1,1,1); 
//	glLoadIdentity(); 
//	glDisable(GL_TEXTURE_2D); 
//	Kurzor(); 
//	glEnable(GL_TEXTURE_2D); 
	 
	setup->Render(); 
 
	font0->Begin(); 
	fps = 1.0f / timer0.GetTime(); 
	timer0.Reset(); 
	fps_counter.GetAvgFps(1.f/fps,0.2f); 
	gcvt( (double)fps_counter.avg_fps, 4, text); 
	font0->Print(0,0,text,0); 
	 
	if(keys['S']) 
	{ 
	//	plocha->SaveTextura_map(); 
		SaveScreen_TGA(); 
		keys['S'] = 0; 
	} 
 
	gcvt( (double)plocha->triangles, 8, text); 
	font0->Print(26,1,text,0); 
	font0->Print(0,1,english ? "Triangles on scene:":"Trojuholnikov na scene:",0); 
	gcvt( (double)plocha->triangles*fps, 8, text); 
	font0->Print(26,2,text,0); 
	font0->Print(0,2,english ? "Triangles pre second:" : "Trojuholnikov za sekundu:",0); 
	gcvt( (double)clip_distance, 8, text); 
	font0->Print(24,3,text,0); 
	font0->Print(0,3,english ? "Cliping distance:" : "Orezavacia vzdialenost:",0); 
 
	if(svetlo) 
	{ 
		gcvt( (double)plocha->Ambient, 4, text); 
		font0->Print(24,4,text,0); 
		font0->Print(0,4,"Ambient:",0); 
 
		gcvt( (double)plocha->Diffuse, 4, text); 
		font0->Print(24,5,text,0); 
		font0->Print(0,5,"Diffuse:",0); 
		 
		gcvt( (double)uhol_rotacie_svetla, 4, text); 
		font0->Print(24,6,text,0); 
		font0->Print(0,6,english ? "Angle:" : "Uhol:",0); 
	} 
 
	if(kolizia)font0->Print(55,0,english ? "Collision" : "Kolizia",0); 
	if(cull_face)font0->Print(55,1,"Cull face",0); 
	if(svetlo) 
	{	 
		if(normalove_svetlo)font0->Print(55,2,english ? "OpenGL lighting":"OpenGL svetlo",0); 
		else font0->Print(55,2,english ? "glColor lighting" : "glColor svetlo",0); 
	} 
	if(fog==1)font0->Print(55,3,"OpenGL fog",0); 
	else if(fog==2)font0->Print(55,3,"blending fog",0); 
	if(c->zmena)font0->Print(55,4,english ? "modification" : "zmena",0); 
	c->zmena = 0; 
 
	if(keys['H'])							// zobrazenie helpu 
	{ 
		int i=3; 
		glDisable(GL_TEXTURE_2D); 
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
		glColor4f(0,0,0,0.6f); 
		glLoadIdentity(); 
		glBegin(GL_QUADS); 
			glVertex2i(0,0); 
			glVertex2i(800,0); 
			glVertex2i(800,555); 
			glVertex2i(0,555); 
		glEnd(); 
		glColor4f(1,1,1,1); 
		glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_COLOR); 
		glEnable(GL_TEXTURE_2D); 
 
		if(english) 
		{ 
			font0->Print(15,i++,"Program: Teren",0); 
			glColor3f(0.9f,0.9f,1.0f); 
			font0->Print(8,i++,"Programmer: Marek Mizanin - www.mizanin.szm.sk",0); 
			glColor3f(1.0f,1.0f,1.0f); 
			font0->Print(10,i++,"Controls:",0); 
			font0->Print(2,i++,"K - on/off collision detection",1); 
			font0->Print(2,i++,"P - on/off wire frame",1); 
			font0->Print(2,i++,"C - on/off cull face",1); 
			font0->Print(2,i++,"F - change fog",1); 
			font0->Print(2,i++,"M - don't draw transition",1); 
			font0->Print(2,i++,"Z - don't draw squares without transition",1); 
			font0->Print(2,i++,"+ and - setting cliping distance",1); 
			font0->Print(2,i++,"Q - draw cube of octree",1); 
			font0->Print(2,i++,"O - don't recompute terrain through new view",1); 
			font0->Print(2,i++,"V - on/off sky box",1); 
			 
			font0->Print(2,i++,"R - reset camera",1); 
			font0->Print(2,i++,"H - help",1);	 
			 
			font0->Print(2,i++,"Setting for lighting",0); 
			font0->Print(2,i++,"L - on/off lighting",1); 
			font0->Print(2,i++,"N - on/off show normal vectors",1); 
			font0->Print(2,i++,"A - with + and - setting Amblied",1); 
			font0->Print(2,i++,"D - with + and - setting Diffuse",1); 
			font0->Print(2,i++,"shift and D - set Diffuse to 1",1); 
			font0->Print(2,i++,"shift and A - set Amblied to 0",1); 
			font0->Print(2,i++,"A and D - recompute Amblied and Diffuse so as their sum = 1",1); 
			font0->Print(2,i++,"T - off/on rotating with light",1); 
			font0->Print(2,i++,"B - toggle between ligting through glNormal and ligting through glColor",1); 
			font0->Print(2,i++,"ligting through glColor:",1); 
			font0->Print(4,i++,"- for each vertex: ",1); 
			font0->Print(4,i++,"- brightness = E.N",1); 
			font0->Print(4,i++,"- vertex_color = brightness * Diffuse + Ambient",1); 
			font0->Print(4,i++,"- computation by CPU",1); 
			font0->Print(4,i++,"- faster if graphical card not have T&L",1); 
			 
			font0->Print(2,i++,"ligting through glNormal:",1); 
			font0->Print(4,i++,"- computation by OpenGL",1); 
			font0->Print(4,i++,"- if graphical card have T&L then computation by GPU",1); 
 
		} 
		else 
		{ 
			font0->Print(15,i++,"Program: Teren",0); 
			glColor3f(0.9f,0.9f,1.0f); 
			font0->Print(8,i++,"Naprogramoval: Marek Mizanin - www.mizanin.szm.sk",0); 
			glColor3f(1.0f,1.0f,1.0f); 
			font0->Print(10,i++,"Pouzivane klavesy:",0); 
			font0->Print(2,i++,"K - zapne/vypne detekciu kolizie",1); 
			font0->Print(2,i++,"P - zapne/vypne zobrazovanie ciar",1); 
			font0->Print(2,i++,"C - zapne/vypne cull face",1); 
			font0->Print(2,i++,"F - nastavuje hmlu (fog)",1); 
			font0->Print(2,i++,"M - nekresli prechody",1); 
			font0->Print(2,i++,"Z - nekresli stvorce bez prechodov",1); 
			font0->Print(2,i++,"+ a - nastavuje orezavaciu vzdialenost",1); 
			font0->Print(2,i++,"Q - kresli kocky oktanoveho stromu",1); 
			font0->Print(2,i++,"O - neprepocitava teren cez novy pohlad",1); 
			font0->Print(2,i++,"V - zapne/vypne sky box",1); 
			 
			font0->Print(2,i++,"R - reset kamery",1); 
			font0->Print(2,i++,"H - help",1);	 
			 
			font0->Print(2,i++,"Nastavenie svetla",0); 
			font0->Print(2,i++,"L - zapne/vypne svetlo",1); 
			font0->Print(2,i++,"N - zapne/vypne zobrazovanie normalovych vektorov",1); 
			font0->Print(2,i++,"A - s +a- nastavuje Amblied - okolite rozptilene svetlo",1); 
			font0->Print(2,i++,"D - s +a- nastavuje Diffuse - difuzne svetlo",1); 
			font0->Print(2,i++,"shift a D - nastavy Diffuse na 1",1); 
			font0->Print(2,i++,"shift a A - nastavy Amblied na 0",1); 
			font0->Print(2,i++,"A a D - prepocita Amblied a Diffuse tak aby ich sucet bol 1",1); 
			font0->Print(2,i++,"T - vypne/zapne tocenie svetlom",1); 
			font0->Print(2,i++,"B - prepina medzi osvetlenim cez glNormal a osvetlenim cez glColor",1); 
			font0->Print(2,i++,"osvetlenie cez glColor:",1); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16,"- vypocita sa farba pre kazdy vrchol a ta sa pouziva pri vykreslovanii",1,0.75f,0.75f); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16-12,"- vypocet je nutny ak sa zmeni poloha svetla",1,0.75f,0.75f); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16-24,"- najprv vypocitam jas a to skalarnym sucinom smeroveho vektora svetla a normaloveho vektora bodu",1,0.75f,0.75f); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16-36,"- farba_bodu = jas * Diffuse + Ambient",1,0.75f,0.75f); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16-48,"- rychlejsie ako osvetlenie cez OpenGL ale iba pri statickom osvetleni",1,0.75f,0.75f); 
			font0->Print_xy_scale(30,screen_y_font - (i+1)*16-60,"- rychlejsi je iba na graf. kartach bez T&L",1,0.75f,0.75f); 
			font0->Print(2,i+5,"osvetlenie cez glNormal:",1); 
			font0->Print_xy_scale(300,screen_y_font - (i+6)*16,"- osvetlenie vypocita OpenGL pomocou zadanych normal",1,0.75f,0.75f); 
		} 
	} 
	font0->End(); 
}