#include <GL/glu.h>
#include <string>
#include "scene.h"
#include "config.h"
#include "heightfield.h"
#include <stdio.h>
#include <math.h>
#include <iostream>
#include "texture.h"
#include <errno.h>
#include "airplane.h"
Go to the source code of this file.
Classes | |
struct | Model_partStruct |
struct | ModelStruct |
Functions | |
void | normalize (double v[3]) |
Point3Struct | operator+ (Point3Struct p1, Point3Struct p2) |
int | addModel (std::string) |
void | deleteModels () |
void | drawFaces (int handle, double scale) |
void | drawModel (int model, int handle, double X, double Y, double Z, double x, double y, double z, double fi, double theta, double psi, double scale) |
Variables | |
std::string | model_name [MODEL_N] |
bool | model_in_use [MODEL_N] |
unsigned int | model_index [MODEL_N] |
bool | model_use_list [MODEL_N] |
int | model_handle [MODEL_N] |
Model_partStruct | Model_part |
ModelStruct | Model |
void * | Model_parts |
int | model_parts_size = 0 |
void * | Models |
int | models_size = 0 |
void * | Vertices |
int | vertices_size = 0 |
void * | Normals |
void * | Faces |
int | faces_size = 0 |
|
Definition at line 137 of file scene.cpp. References Faces, faces_size, Model_partStruct::ind_faces, ModelStruct::ind_model_parts, Model_partStruct::ind_vertices, Model_parts, model_parts_size, Models, models_size, Model_partStruct::nfaces, ModelStruct::nmodel_parts, Normals, Model_partStruct::nvertices, Point3, Vertices, and vertices_size.
00138 { 00139 00140 00141 ModelStruct newModel; 00142 Model_partStruct newPart; 00143 00144 FILE *file = fopen (filename.c_str(), "rb"); 00145 //int _errno = errno; 00146 if (file == NULL) 00147 { 00148 perror( filename.c_str() ); 00149 return (-1); 00150 } 00151 00152 newModel.ind_model_parts = model_parts_size; 00153 00154 int n = fread( &newModel.nmodel_parts, sizeof(int), 1, file); 00155 if (n != 1) { 00156 printf( "Error reading the number of parts of the model. \n"); 00157 return (-1); 00158 } 00159 00160 model_parts_size += newModel.nmodel_parts; 00161 Model_parts = realloc ( Model_parts, model_parts_size*sizeof(Model_partStruct)); 00162 00163 00164 for (int i=0; i < newModel.nmodel_parts; i++) 00165 { 00166 n = fread( &newPart.nvertices, sizeof(int), 1, file ); 00167 if (n != 1) { printf( "Error reading the number of vertices. \n"); return (-1); } 00168 00169 n = fread ( &newPart.nfaces, sizeof(int), 1, file ); 00170 if (n != 1) { printf( "Error reading the number of faces. \n"); return (-1); } 00171 00172 //now reallocating memory for vertices and appending new vertices 00173 newPart.ind_vertices = vertices_size; 00174 vertices_size = (newPart.ind_vertices + newPart.nvertices); 00175 Vertices = realloc ( Vertices, vertices_size*sizeof(Point3) ); 00176 00177 00178 n = fread ( ((Point3 *) Vertices + newPart.ind_vertices), sizeof(Point3), newPart.nvertices, file ); 00179 if (n != newPart.nvertices) 00180 { printf( "Error reading vertices from the file %s. \n Only %d vertices were read. \n", filename.c_str(), n); 00181 return (-1); 00182 } 00183 00184 //now reallocating memory for normals and appending new normals 00185 newPart.ind_faces = faces_size; 00186 faces_size = newPart.ind_faces + newPart.nfaces; 00187 00188 Normals = realloc ( Normals, faces_size*sizeof(Point3) ); 00189 00190 n = fread ( ((Point3 *) Normals + newPart.ind_faces), sizeof(Point3), newPart.nfaces, file ); 00191 if (n != newPart.nfaces) 00192 { printf( "Error reading normals from the file %s. \n Only %d normals were read. \n", filename.c_str(), n); 00193 return (-1); 00194 } 00195 00196 //now reallocating memory for faces and appending new faces 00197 Faces = realloc (Faces, (faces_size)*sizeof(long)*3 ); 00198 00199 00200 n = fread ( ((long *) Faces + newPart.ind_faces*3), sizeof(long), newPart.nfaces*3, file ); 00201 if (n != newPart.nfaces*3) 00202 { printf( "Error reading faces from the file %s. \n Only %d faces were read. \n", filename.c_str(), n); 00203 return (-1); 00204 } 00205 00206 //adding new model part to global array 00207 memcpy ( ((Model_partStruct *)Model_parts + newModel.ind_model_parts + i ), (void *) &newPart, sizeof(Model_partStruct) ); 00208 00209 }//end for 00210 00211 //adding new model to global array 00212 models_size ++; 00213 Models = realloc ( Models, models_size*sizeof(ModelStruct)); 00214 00215 memcpy ( ((ModelStruct *)Models + models_size - 1 ), (void *) &newModel, sizeof(ModelStruct) ); 00216 00217 //cout << "start of faces array " << (int) ((long *)Faces) << endl; 00218 //cout << "end of faces array " << (int) ((long *)Faces + (faces_size - 1)*3) << endl; 00219 00220 00221 00222 return (models_size - 1); 00223 00224 } |
|
Definition at line 126 of file scene.cpp. References Faces, Model_parts, Models, Normals, and Vertices. Referenced by main().
00127 { 00128 free (Model_parts); 00129 free (Models); 00130 free (Vertices); 00131 free (Normals); 00132 free (Faces); 00133 } |
|
Draw Faces Given the array of vertices and array of faces this function ouputs the vertices of triangle strips or triangles defining these faces Input: handle, scaling factor glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT ); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture(TEX_CHECK)); Definition at line 232 of file scene.cpp. References Faces, Model_partStruct::ind_faces, ModelStruct::ind_model_parts, Model_partStruct::ind_vertices, Model_parts, Models, Model_partStruct::nfaces, normal, Normals, Point3, and Vertices. Referenced by drawModel().
00233 { 00234 ModelStruct *model = ((ModelStruct *)Models + handle); 00235 Model_partStruct *model_part; 00236 //printf(" model has %d model_parts \n", model -> nmodel_parts); 00237 00238 Point3 vertex[3]; 00239 Point3Struct * vertex_ptr; 00240 Point3 normal; 00241 Point3Struct * normal_ptr; 00242 long face; 00243 long *face_ptr; 00244 00245 double A, B, C, D; 00246 double cosalpha, cosbeta, cosgamma, mu; 00247 Point3 tex[3]; 00248 00249 double oldbeta; 00250 double alpha, beta, gamma; 00251 00252 //setDiffuseMaterialColor( colorWhite ); 00253 00254 00255 00256 //cout << "start of faces array " << (int) ((long *)Faces) << endl; 00257 00258 //glPushMatrix(); 00259 00260 00261 00262 glDisable( GL_TEXTURE_GEN_S); 00263 glDisable( GL_TEXTURE_GEN_T); 00264 glDisable( GL_TEXTURE_GEN_R); 00265 /* 00266 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 00267 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); 00268 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST ); 00269 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL ); 00270 */ 00278 for (int i=0; i < model -> nmodel_parts; i++) 00279 {//drawing every part as a separate object 00280 //cout << "drawing part " << i << endl; 00281 //cout.flush(); 00282 00283 model_part = ((Model_partStruct *)Model_parts + model->ind_model_parts + i); 00284 00285 //cout << "start of the face " << (int) ((long *)Faces + model_part->ind_faces) << endl; 00286 //cout << "end of the face " << (int) ((long *)Faces + model_part->ind_faces + (model_part->nfaces-1)*3 + 2) << endl; 00287 00288 //glPushMatrix(); 00289 00290 for (int j=0; j < model_part->nfaces; j++ ) 00291 {//drawing every face 00292 00293 //cout << j << ","; 00294 //cout.flush(); 00295 normal_ptr = ((Point3 *)Normals + model_part->ind_faces + j); 00296 normal = *normal_ptr; 00297 00298 for (int k=0; k < 3; k++ ) 00299 { 00300 face_ptr = ((long *)Faces + model_part->ind_faces*3 + j*3 + k); 00301 face = *face_ptr; 00302 00303 vertex_ptr = ((Point3 *)Vertices + model_part->ind_vertices + face); 00304 vertex[k] = *vertex_ptr; 00305 00306 }//end for k 00307 00308 /* 00309 //determining the coefficients in plane's equation 00310 A = ( (vertex[1].y - vertex[0].y)*(vertex[2].z - vertex[0].z) ) - ( (vertex[1].z - vertex[0].z)*(vertex[2].y - vertex[0].y) ); 00311 B = ( (vertex[1].z - vertex[0].z)*(vertex[2].x - vertex[0].x) ) - ( (vertex[2].z - vertex[0].z)*(vertex[1].x - vertex[0].x) ); 00312 C = ( (vertex[1].x - vertex[0].x)*(vertex[2].y - vertex[0].y) ) - ( (vertex[1].y - vertex[0].y)*(vertex[2].x - vertex[0].x) ); 00313 D = - ( vertex[0].x*A + vertex[0].y*B + vertex[0].z*C ); 00314 00315 if (D < 0) 00316 { 00317 //normalizing 00318 D = -D; 00319 A = -A; 00320 B = -B; 00321 C = -C; 00322 } 00323 00324 //computing normalized equation of the plane 00325 //since (D >= 0) we certainly know which root to take for mu 00326 mu = (-1) / sqrt( A*A + B*B + C*C ); 00327 00328 //printf(" mu = %f, A = %f, B = %f, C = %f, D = %f \n", mu, A, B, C, D ); 00329 00330 cosalpha = mu * A; 00331 cosbeta = mu * B; 00332 cosgamma = mu * C; 00333 00334 alpha = acos (cosgamma);// - M_PI/2; 00335 beta = acos (cosbeta) ; 00336 gamma = acos (cosgamma) ; 00337 00338 oldbeta = beta; 00339 //alpha += M_PI/2; 00340 00341 beta *= cos(alpha ); 00342 //beta += M_PI/2; 00343 gamma = gamma*(cos(oldbeta ) ) ; 00344 gamma = gamma*(sin(alpha)); 00345 //gamma += M_PI; 00346 //gamma *=sin(alpha ); 00347 00348 glDisable(GL_TEXTURE_2D); 00349 glMatrixMode ( GL_TEXTURE ); 00350 glLoadIdentity (); 00351 00352 glRotated ( gamma * 180.0f/M_PI , 0, 1, 0); 00353 glRotated ( beta * 180.0f/M_PI, 0, 0, 1); 00354 glRotated ( alpha * 180.0f/M_PI, 1, 0, 0); 00355 00356 glMatrixMode (GL_MODELVIEW); 00357 00358 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); 00359 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); 00360 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT ); 00361 00362 glEnable(GL_TEXTURE_2D); 00363 glBindTexture(GL_TEXTURE_2D, texture(TEX_CHECK)); 00364 00365 //printf(" cos is %f, %f, %f \n", cosalpha, cosbeta, cosgamma ); 00366 //printf(" acos is %f, %f, %f \n", acos(cosalpha)*180.0f/M_PI, acos(cosbeta)*180/M_PI, acos(cosgamma)*180/M_PI ); 00367 00368 //glMatrixMode (GL_MODELVIEW); 00369 00370 for (int k=0; k<3; k++) 00371 { 00372 tex[k].x = vertex[k].x*scale/5; 00373 tex[k].y = vertex[k].y*scale/5; 00374 tex[k].z = vertex[k].z*scale/5; 00375 } 00376 00377 00378 */ 00379 //printf(" x=%f y=%f \n", texture[0].x, texture[0].y); 00380 glBegin(GL_TRIANGLES); 00382 glNormal3d( normal.x, normal.y, normal.z); 00383 00384 for (int k=0; k<3; k++) 00385 { 00386 // glTexCoord3d( tex[k].x, tex[k].y, tex[k].z ); 00387 glVertex3d( vertex[k].x, vertex[k].y, vertex[k].z); 00388 }//end for k 00389 glEnd(); 00390 00391 //glPopMatrix(); 00392 }//end for j 00393 00394 //glPopMatrix(); 00395 00396 }//end for i 00397 glDisable(GL_TEXTURE_2D); 00398 //glPopMatrix(); 00399 00400 00401 00402 00403 //cout << " all parts are drawn"; 00404 //cout.flush(); 00405 00406 /* 00407 glBegin(GL_TRIANGLES); 00408 00409 glNormal3d( normal.x / len, normal.y / len, normal.z / len ); 00410 glVertex3d(vertexa.x, vertexa.y, vertexa.z); 00411 00412 00413 glNormal3d( normal.x / len, normal.y / len, normal.z / len ); 00414 glVertex3d(vertexb.x, vertexb.y, vertexb.z); 00415 00416 00417 glNormal3d( normal.x / len, normal.y / len, normal.z / len ); 00418 glVertex3d(vertexc.x, vertexc.y, vertexc.z); 00419 00420 } 00421 glEnd(); 00422 */ 00423 } |
|
Definition at line 426 of file scene.cpp. References drawFaces(), g_cellsize, g_show_axis, and gethf(). Referenced by __drawModel().
00427 { 00428 00429 if (handle == -1) 00430 { 00431 printf(" Incorrect model handler. Probably, model was not initialized properly. \n "); 00432 exit(1); 00433 } 00434 00435 float hf; 00436 00437 hf = gethf( (int) round(x/g_cellsize), (int) round (y/g_cellsize) ); 00438 00439 //hf *= g_fHeightScale; 00440 00441 //hf -= g_fHeight; 00442 //we start to output vertices in order, defined by face array 00443 //int n= sizeof(gallows_1_face)/ (sizeof(long)*3); 00444 00445 00446 glDisable(GL_AUTO_NORMAL); 00447 glEnable(GL_NORMALIZE); 00448 glDisable(GL_CULL_FACE); 00449 glCullFace(GL_NONE); 00450 glMatrixMode(GL_MODELVIEW); 00451 glPushMatrix(); 00452 glTranslated(x, z + hf, y); 00453 glTranslated(-X, -Z, -Y);//, 0);/-Z);//-Y*g_cellsize, -Z); 00454 glRotated(fi, 1, 0, 0); 00455 glRotated(theta, 0, 1, 0); 00456 glRotated(psi, 0, 0, 1); 00457 glScaled(scale, scale, scale); 00458 /* 00459 if ( model_use_list[model] ) 00460 { 00461 glCallList ( model_index[model] ); 00462 } 00463 else 00464 { 00465 */ 00466 drawFaces (handle, scale); 00467 // } 00468 glPopMatrix(); 00469 00470 glDisable(GL_AUTO_NORMAL); 00471 glDisable(GL_NORMALIZE); 00472 00473 //setDiffuseMaterialColor( colorWhite ); 00474 //coordinate axises for object 00475 if (g_show_axis) 00476 { 00477 glPushMatrix(); 00478 glMatrixMode(GL_MODELVIEW); 00479 glTranslated(x*g_cellsize, z + hf, y*g_cellsize); 00480 glTranslated(-X*g_cellsize, -Z, -Y*g_cellsize);//, 0);//-Z);//-Y*g_cellsize, -Z); 00481 00482 glLineWidth(2); 00483 glBegin(GL_LINES); 00484 glColor3d(1, 0, 0); 00485 glVertex3d(0, 0, 0); 00486 glColor3d(1, 0, 0); 00487 glVertex3d(10, 0, 0); 00488 glEnd(); 00489 00490 glBegin(GL_LINES); 00491 glColor3d(0, 1, 0); 00492 glVertex3d(0, 0, 0); 00493 glColor3d(0, 1, 0); 00494 glVertex3d(0, 12, 0); 00495 glEnd(); 00496 00497 glBegin(GL_LINES); 00498 glColor3d(0, 0, 1); 00499 glVertex3d(0, 0, 0); 00500 glColor3d(0, 0, 1); 00501 glVertex3d(0, 0, 15); 00502 glEnd(); 00503 glLineWidth(1); 00504 00505 glColor3d(1, 1, 1); 00506 00507 glPopMatrix(); 00508 } 00509 00510 //setDiffuseMaterialColor( colorWhite ); 00511 00512 00513 //printf("\n X %f, Y %f , Z %f, ", X, Y, Z); 00514 00515 00516 } |
|
Definition at line 67 of file scene.cpp.
00068 { 00069 double d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); 00070 if (d != 0.0) 00071 { 00072 v[0] /= d; 00073 v[1] /= d; 00074 v[2] /= d; 00075 } 00076 else 00077 printf(" zero normal?! hmm, strange...\n"); 00078 00079 //printf(" len of normal is %f \n", sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2] ) ); 00080 } |
|
Definition at line 83 of file scene.cpp. References Point3, Point3Struct::x, Point3Struct::y, and Point3Struct::z.
|
|
Definition at line 116 of file scene.cpp. Referenced by addModel(), deleteModels(), and drawFaces(). |
|
Definition at line 117 of file scene.cpp. Referenced by addModel(). |
|
|
|
Definition at line 64 of file scene.cpp. Referenced by __drawModel(), and initGL(). |
|
Initial value: { true, true, true, true, false, true, false, false, true, true, true, true, true, true, true, false, } Definition at line 41 of file scene.cpp. Referenced by initGL(), and renderScene(). |
|
Definition at line 62 of file scene.cpp. Referenced by initGL(), and renderScene(). |
|
Initial value: { "gallows", "gallows_rope", "iron_maiden", "crypt", "diablo", "casket_closed", "casket_opened", "casket_opened2", "giljotina1(derevo)", "giljotina2(metal)", "giljotina3(chelovek)", "giljotina4(korzina)", "graveyard", "mancage_1(derevo)", "mancage_2(metal)", "prosto-chelovek", } Definition at line 21 of file scene.cpp. Referenced by initGL(). |
|
|
|
Definition at line 106 of file scene.cpp. Referenced by addModel(), deleteModels(), and drawFaces(). |
|
Definition at line 107 of file scene.cpp. Referenced by addModel(). |
|
Definition at line 63 of file scene.cpp. Referenced by initGL(), and renderScene(). |
|
Definition at line 108 of file scene.cpp. Referenced by addModel(), deleteModels(), and drawFaces(). |
|
Definition at line 109 of file scene.cpp. Referenced by addModel(). |
|
Definition at line 115 of file scene.cpp. Referenced by addModel(), deleteModels(), and drawFaces(). |
|
Definition at line 113 of file scene.cpp. Referenced by addModel(), deleteModels(), and drawFaces(). |
|
Definition at line 114 of file scene.cpp. Referenced by addModel(). |