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();
}