www.pudn.com > 3dterrain.zip > scene.cpp
//////////////////////////////////////////////////////////////////////
// scene.cpp: implementation of the scene class.
//
//////////////////////////////////////////////////////////////////////
#include "scene.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
scene::scene()
{
int j;
// zistime ci je mozne pouzit rozsirenie orezanie hrany pri texturovani
char *extensions;
extensions=strdup((char *) glGetString(GL_EXTENSIONS)); // Fetch Extension String
int len=strlen(extensions);
for (int i=0; ifont = font0;
load = new Loader;
//////////////////////////////////////
// smerniky na instancie na triedy nastavim na NULL, aby som ich potom nemazal
// obj = NULL;
c = NULL;
sky_box = NULL;
setup = NULL;
//////////////////////////////////////
// textury
textura = 0;
//////////////////////////////////////
// prepinace
svetlo=1; texturovanie=1; ciary=0; anim=1; normals=0; kolizia=1; cull_face=1; draw_sky_box=0;
toc_svetlom = 1; fog = 2; normalove_svetlo = 1;
fps = 200; // v pripade ze nieco zavisy od fps
clip_distance = vzdialena_orezavacia_rovina;
uhol_rotacie_svetla = 120.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;
//////////////////////////////////////
// nacitanie textur
j=0;
//////////////////////////////////////
// vytvarame instancie pouzivanych tried
c = new Camera;
// obj = new C3ds("data/model/1.3ds");
sky_box = new dxf("data/sky_box_jpg.dxf");
plocha = new Terrain("data/teren.txt");
setup = new Csetup;
setup->font = font0;
if(error)return;
plocha->OcTree->Frustum = &Frustum;
plocha->Vypocitaj_osvetlenie( &smer_svetla[0] );
InitGL(); // nastavenie z-buffra,svetla,...
//ShowCursor(0);
if(load!=NULL)delete load;
}
scene::~scene()
{
// int i;
//////////////////////////////////////
// mazeme instancie tried
if(font0!=NULL)delete font0;
if(c!=NULL)delete c;
// if(obj!=NULL)delete obj;
if(sky_box!=NULL)delete sky_box;
if(setup!=NULL)delete setup;
if(plocha!=NULL)delete plocha; // rušíme plocha
//////////////////////////////////////
// mazeme textury
// glDeleteTextures( 1, &texture[i]);
KillGL();
ShowCursor(1);
}
void scene::InitGL(void)
{
if(!fullscreen)
{
RECT WindowRect; // miesto pre velkost okna
WindowRect.left=(long)0;
WindowRect.top=(long)0;
GetClientRect(hWnd,&WindowRect); //zistenie rozmerov uzivatelskej casti okna
ReSizeGLScene(WindowRect.right,WindowRect.bottom); //nastavenie perspektivy
}
else ReSizeGLScene(screen_x, screen_y); //definovana v tomto subore
glEnable(GL_TEXTURE_2D); // Povolenie zobrazovanie textúr
glShadeModel(GL_SMOOTH); /*nastavuje tienovanie
GL_SMOOTH - objekty su tienovane t.j. prechody medzi farbami bodov su plinule (gouradovo (s)tienovanie)
GL_FLAT - objekty nie su tienovane ziadne plinule prechody */
// glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //specifikuje hodnoty na cistenie pomocou glClear par.: red, green, blue, alpha (cierny podklad)
glClearColor(0.6f, 0.6f, 0.6f, 0.0f); //specifikuje hodnoty na cistenie pomocou glClear par.: red, green, blue, alpha (cierny podklad)
glClearDepth(1.0f); //specifikuje hodnoty na cistenie pomocou glClear par.: depth (hlbka)
/* ZAPNUTIE HLBKOVEHO TESTU */
glEnable(GL_DEPTH_TEST); // zapne hĺbkový test
glDepthFunc(GL_LEQUAL); // typ hĺbkového testu
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // “reálnejšie” perspektívne výpočty
// GLfloat LightAmbient[] = { 0.3f, 0.3f, 0.3f, 1.0f }; //svetlo ktore osvetluje zo vsetkych stran rovnako (okolite svetlo)
GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; //svetlo ktore osvetluje zo vsetkych stran rovnako (okolite svetlo)
GLfloat LightDiffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; //smerove, alebo bodove svetlo - svetlo svieti z pozicie zadanej pomocou premennej LightPosition
GLfloat LightPosition[4]= { 0.0f, 0.0f, 1.0f, 0.0f }; //smer difuzneho svetla - ak je 4 zlozka 0 - smerove svetlo, ak nie je 0 potom s jedna o bodove svetlo so suradnicami x,y,z
glLightModelfv ( GL_LIGHT_MODEL_AMBIENT, LightAmbient ); // nastavenie okoliteho (Ambient) svetla
glLightfv ( GL_LIGHT0, GL_DIFFUSE, LightDiffuse ); // nastavenie difuzneho svetla
glLightfv ( GL_LIGHT0, GL_POSITION, LightPosition ); // pozicia difuzneho svetla
glEnable ( GL_LIGHT0 ); // aktivovanie svetla 0
GLfloat mat_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
// GLfloat mat_specular[] = { 0.9f, 0.9f, 0.9f, 1.0f };
// GLfloat mat_shininess[] = { 128.0f };
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE , mat_diffuse);
// glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
// glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
GLfloat fogColor[4] = {0.6f,0.6f,0.6f,1.0f}; // Fog Color
glFogfv(GL_FOG_COLOR, fogColor); // farba hmly
// glFogi(GL_FOG_MODE, GL_EXP); // mod hmly
// glFogf(GL_FOG_DENSITY, 0.1f); // hustota hmly
glFogi(GL_FOG_MODE,GL_LINEAR);
glHint(GL_FOG_HINT, GL_DONT_CARE); // dalsie nastavenie
glFogf(GL_FOG_START, 0.5*clip_distance); // startovacia vzdialenost
glFogf(GL_FOG_END, clip_distance); // ukoncovacia vzdialenost
// glEnable(GL_FOG);
glCullFace( GL_BACK );
glEnable(GL_CULL_FACE );
glColor3f(1.0f,1.0f,1.0f); // biela farba
}
void scene::KillGL()
{
}
void scene::Kurzor(void) // zisti poziciu mysi a zobrazy kurzor
{
/* GetCursorPos(&MouseBod); //nacitanie pozicie mysi
glBegin(GL_LINES);
glVertex2i(MouseBod.x+velkost_kurzoru+1,screen_y-1-MouseBod.y);
glVertex2i(MouseBod.x-velkost_kurzoru+1,screen_y-1-MouseBod.y);
glVertex2i(MouseBod.x+1,screen_y-1-MouseBod.y+velkost_kurzoru);
glVertex2i(MouseBod.x+1,screen_y-1-MouseBod.y-velkost_kurzoru);
glEnd();
*/
glBegin(GL_LINES);
glVertex2i(mouse_x+velkost_kurzoru+1,mouse_y);
glVertex2i(mouse_x-velkost_kurzoru+1,mouse_y);
glVertex2i(mouse_x+1,mouse_y+velkost_kurzoru);
glVertex2i(mouse_x+1,mouse_y-velkost_kurzoru);
glEnd();
}
void scene::ReSizeGLScene(int width, int height)
{
sirka = width;
vyska = height;
ReSizeGLScene_2D(width, height);
}
void scene::ReSizeGLScene_3D(int width, int height) // funkcia pre zmenu velkosti okna
{ // vola sa v pripade zmeny velkosti okna, zmenu z(na) fullscreen
if (height==0) height=1;
glViewport(0,0,width,height); // Viewport (pohlad)
glMatrixMode(GL_PROJECTION); // projekcia
glLoadIdentity(); // Reset pohladu - nacita jednotkovu maticu
// gluPerspective(uhol_kamery,(GLfloat)width/(GLfloat)height,blizka_orezavacia_rovina,vzdialena_orezavacia_rovina);
gluPerspective(uhol_kamery,(GLfloat)width/(GLfloat)height,blizka_orezavacia_rovina,clip_distance);
/* gluPerspective - nastavuje perspektivu kamery, ako bude vypadat priestor z pohladu kamery.
1. parameter urcuje zorný uhol kamery. 2.param. - gldAspect je pomer výšky a šírky zobrazovanej plochy.
3. par. udava vzdialenost od ktorej je vidiet vykreslovane objekty
4. par. udava vzdialenost do ktorej je vidiet vykreslovane objekty */
glMatrixMode(GL_MODELVIEW); // Modelview
glLoadIdentity(); // Reset The Modelview Matrix
}
void scene::ReSizeGLScene_2D(int width, int height) // funkcia pre zmenu velkosti okna
{
if (height==0) height=1;
glViewport(0,0,width,height); // Viewport (pohlad)
glMatrixMode(GL_PROJECTION); // projekcia
glLoadIdentity(); // Reset pohladu - nacita jednotkovu maticu
glOrtho(0,screen_x,0,screen_y,-1,1); // nastavuje standardne pravouhle premietanie
glMatrixMode(GL_MODELVIEW); // Modelview
glLoadIdentity(); // Reset The Modelview Matrix
}
void scene::Prepni_do_3D(void) // rychle prepnutie do 3D
{
glEnable(GL_DEPTH_TEST );
glMatrixMode(GL_PROJECTION); // projekcia
glLoadIdentity(); // Reset pohladu - nacita jednotkovu maticu
//gluPerspective(uhol_kamery,(float)sirka/(float)vyska,blizka_orezavacia_rovina,vzdialena_orezavacia_rovina);
gluPerspective(uhol_kamery,(GLfloat)sirka/(GLfloat)vyska,blizka_orezavacia_rovina,clip_distance);
/* gluPerspective - nastavuje perspektivu kamery, ako bude vypadat priestor z pohladu kamery.
1. parameter urcuje zorný uhol kamery. 2.param. - gldAspect je pomer výšky a šírky zobrazovanej plochy.
3. par. udava vzdialenost od ktorej je vidiet vykreslovane objekty
4. par. udava vzdialenost do ktorej je vidiet vykreslovane objekty */
glMatrixMode(GL_MODELVIEW); // Modelview
glLoadIdentity();
}
void scene::Prepni_do_2D(void) // rychle prepnutie do 2D
{
if(svetlo)glDisable(GL_LIGHTING); // vypne svetlo
if(ciary)glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); // vypne ciarovy rezim
if(!texturovanie)glEnable(GL_TEXTURE_2D); // zapne texturovanie
glDisable(GL_DEPTH_TEST );
glMatrixMode(GL_PROJECTION); // projekcia
glLoadIdentity(); // Reset pohladu - nacita jednotkovu maticu
glOrtho(0,screen_x,0,screen_y,-1,1);// nastavuje standardne pravouhle premietanie
glMatrixMode(GL_MODELVIEW); // Modelview
glLoadIdentity(); // Reset The Modelview Matrix
}
void scene::SaveScreen_RAW()
{
FILE *sub;
unsigned char* buf = new unsigned char[3*screen_x*screen_y];
unsigned char* pom = new unsigned char[3*screen_x*screen_y];
char file[30];
if(buf==NULL || pom==NULL)
{
if(buf==NULL)delete[] buf;
if(pom==NULL)delete[] pom;
return;
}
glReadPixels(0, 0, screen_x, screen_y, GL_RGB, GL_UNSIGNED_BYTE, buf);
for(int i=0; iB - pozri specifikaciu TGA formatu.
if (mode >= 3) {
for (int i = 0; i < width * height * mode; i += mode)
{
rb = buf[i];
buf[i] = buf[i+2];
buf[i+2] = rb;
}
}
// tu sa zapisuje hlavicka
fwrite(&ctmp, sizeof(unsigned char), 1, sub);
fwrite(&ctmp, sizeof(unsigned char), 1, sub);
fwrite(&type, sizeof(unsigned char), 1, sub);
fwrite(&itmp, sizeof(short int), 1, sub);
fwrite(&itmp, sizeof(short int), 1, sub);
fwrite(&ctmp, sizeof(unsigned char), 1, sub);
fwrite(&itmp, sizeof(short int), 1, sub);
fwrite(&itmp, sizeof(short int), 1, sub);
fwrite(&width, sizeof(short int), 1, sub);
fwrite(&height, sizeof(short int), 1, sub);
fwrite(&pixelDepth, sizeof(unsigned char), 1, sub);
fwrite(&ctmp, sizeof(unsigned char), 1, sub);
fwrite(buf, 3*screen_x*screen_y, 1, sub);
delete[] buf;
fclose(sub);
}
bool scene::isInString(char *string, const char *search)
{
int pos=0;
int maxpos=strlen(search)-1;
int len=strlen(string);
char *other;
for (int i=0; i1) && string[i-1]=='\n'))
{ // New Extension Begins Here!
other=&string[i];
pos=0; // Begin New Search
while (string[i]!='\n')
{ // Search Whole Extension-String
if (string[i]==search[pos]) pos++; // Next Position
if ((pos>maxpos) && string[i+1]=='\n') return true; // We Have A Winner!
i++;
}
}
}
return false; // Sorry, Not Found!
}