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! 
}