00001 /********************************************************************* 00002 * Software License Agreement (BSD License) 00003 * 00004 * Copyright (c) 2010, LABUST, UNIZG-FER 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 00011 * * Redistributions of source code must retain the above copyright 00012 * notice, this list of conditions and the following disclaimer. 00013 * * Redistributions in binary form must reproduce the above 00014 * copyright notice, this list of conditions and the following 00015 * disclaimer in the documentation and/or other materials provided 00016 * with the distribution. 00017 * * Neither the name of the LABUST nor the names of its 00018 * contributors may be used to endorse or promote products derived 00019 * from this software without specific prior written permission. 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00024 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00025 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00026 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00027 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00028 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00029 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00030 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00031 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 * 00034 * Created on: 13.06.2013. 00035 * Author: Dula Nad 00036 *********************************************************************/ 00037 #include <labust/gui/AAGui.hpp> 00038 #include <GL/glut.h> 00039 #include <SOIL/SOIL.h> 00040 #include <fmod/fmod.hpp> 00041 #include <fmod/fmod_errors.h> 00042 #include <fmod/fmod_event.hpp> 00043 #include <fmod/fmod_event_net.hpp> 00044 #include <iostream> 00045 #include <fstream> 00046 #include <cmath> 00047 00048 using labust::gui::AAGui; 00049 00050 //int width = 500; 00051 //int height = 500; 00052 // 00054 //GLuint texture; 00055 //GLuint skyboxTexture[6]; 00056 // 00058 //struct Polygon 00059 //{ 00060 // int numVertices; 00061 // int indicesOffset; 00062 // float directOcclusion; 00063 // float reverbOcclusion; 00064 // FMOD_VECTOR normal; 00065 //}; 00066 // 00067 //struct Mesh 00068 //{ 00069 // int numVertices; 00070 // FMOD_VECTOR *vertices; 00071 // float (*texcoords)[2]; 00072 // int numPolygons; 00073 // Polygon* polygons; 00074 // int numIndices; 00075 // int *indices; 00076 // FMOD::Geometry *geometry; 00077 //}; 00078 // 00079 //class GlutCloseClass 00080 //{ 00081 // public: 00082 // GlutCloseClass() {}; 00083 // ~GlutCloseClass(); 00084 //}; 00085 // 00086 //GlutCloseClass gCloseObject; 00087 // 00088 //Mesh walls; 00089 //Mesh rotatingMesh; 00090 // 00091 //void display(void); 00092 //void reshapeFunc(int w, int h); 00093 //void mouseFunc(int button, int state, int x, int y); 00094 //void motionFunc(int x, int y); 00095 //void specialKeyUpFunc(int key, int x, int y); 00096 void specialKeyFunc(int key, int x, int y); 00097 //void keyboardUpFunc(unsigned char key, int x, int y); 00098 //void keyboardFunc(unsigned char key, int x, int y); 00099 //void timerFunc(int nValue); 00100 GLuint loadTexture(const char *filename); 00101 GLuint loadTexturePNG(const char *filename); 00102 //void initGeometry(const char* szFileName, Mesh& mesh, bool alter = false); 00103 //void ERRCHECK(FMOD_RESULT result); 00104 00105 int INTERFACE_UPDATETIME = 15; 00106 00107 AAGui::AAGui() 00108 { 00109 this->init(); 00110 } 00111 00112 void AAGui::start() 00113 { 00114 glutMainLoop(); 00115 } 00116 00117 AAGui::AAGui(const std::string& path) 00118 { 00119 this->init(); 00120 this->loadTextures(path); 00121 } 00122 00123 int width = 500; 00124 int height = 500; 00125 00126 void AAGui::init() 00127 { 00128 int argc(0); 00129 char* argv[0]; 00130 //No glut configuration is needed really 00131 glutInit(&argc, argv); 00132 00133 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 00134 glutInitWindowSize(width, height); 00135 glutCreateWindow("Audio guidance"); 00136 // glutDisplayFunc(display); 00137 // glutReshapeFunc(reshapeFunc); 00138 // glutMouseFunc(mouseFunc); 00139 // glutMotionFunc(motionFunc); 00140 // glutKeyboardFunc(keyboardFunc); 00141 // glutKeyboardUpFunc(keyboardUpFunc); 00142 glutSpecialFunc(specialKeyFunc); 00143 // glutSpecialUpFunc(specialKeyUpFunc); 00144 } 00145 00146 void AAGui::loadTextures(const std::string& path) 00147 { 00148 std::cout<<"Loading textures from "<<path<<std::endl; 00149 texture = loadTexture((path + "/texture.img").c_str()); 00150 skyboxTexture[0] = loadTexturePNG((path + "/front.png").c_str()); 00151 skyboxTexture[1] = loadTexturePNG((path + "/right.png").c_str()); 00152 skyboxTexture[2] = loadTexturePNG((path + "/back.png").c_str()); 00153 skyboxTexture[3] = loadTexturePNG((path + "/left.png").c_str()); 00154 skyboxTexture[4] = loadTexturePNG((path + "/top.png").c_str()); 00155 skyboxTexture[5] = loadTexturePNG((path + "/bottom.png").c_str()); 00156 std::cout<<"done.\n"; 00157 00158 // setup lighting 00159 GLfloat lightDiffuse[] = {1.0, 1.0, 1.0, 1.0}; 00160 GLfloat lightPosition[] = {300.0, 1000.0, 400.0, 0.0}; 00161 GLfloat lightAmbiant[] = {1.25, 1.25, 1.25, 1.0}; 00162 glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); 00163 glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 00164 glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbiant); 00165 glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.0f); 00166 glEnable(GL_LIGHT0); 00167 glEnable(GL_LIGHTING); 00168 00169 // setup fog(water) 00170 GLfloat fogColor[4] = {0.0f,0.1f,0.9f,1.0f}; 00171 00172 glFogi(GL_FOG_MODE, GL_EXP); // Fog Mode 00173 glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color 00174 glFogf(GL_FOG_DENSITY, 0.15f); // How Dense Will The Fog Be 00175 glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value 00176 glFogf(GL_FOG_START, 0.0f); // Fog Start Depth 00177 glFogf(GL_FOG_END, 1.0f); // Fog End Depth 00178 00179 glEnable(GL_DEPTH_TEST); 00180 00181 glMatrixMode(GL_MODELVIEW); 00182 glLoadIdentity(); 00183 } 00184 00185 void AAGui::drawSkyBox(float xListenerPos, float yListenerPos) 00186 { 00187 glPushMatrix(); 00188 glTranslatef(xListenerPos, 0.0f, yListenerPos); 00189 glDisable(GL_LIGHTING); 00190 /* 00191 Walls 00192 */ 00193 glBindTexture(GL_TEXTURE_2D, skyboxTexture[0]); 00194 glBegin(GL_QUADS); 00195 glTexCoord2f(1.0f, 1.0f); glVertex3f(-150.0f, -150.0f, -150.0f); 00196 glTexCoord2f(1.0f, 0.0f); glVertex3f(-150.0f, 150.0f, -150.0f); 00197 glTexCoord2f(0.0f, 0.0f); glVertex3f(150.0f, 150.0f, -150.0f); 00198 glTexCoord2f(0.0f, 1.0f); glVertex3f(150.0f, -150.0f, -150.0f); 00199 glEnd(); 00200 00201 glBindTexture(GL_TEXTURE_2D, skyboxTexture[1]); 00202 glBegin(GL_QUADS); 00203 glTexCoord2f(1.0f, 1.0f); glVertex3f(150.0f, -150.0f, -150.0f); 00204 glTexCoord2f(1.0f, 0.0f); glVertex3f(150.0f, 150.0f,-150.0f); 00205 glTexCoord2f(0.0f, 0.0f); glVertex3f(150.0f, 150.0f, 150.0f); 00206 glTexCoord2f(0.0f, 1.0f); glVertex3f(150.0f, -150.0f, 150.0f); 00207 glEnd(); 00208 00209 glBindTexture(GL_TEXTURE_2D, skyboxTexture[2]); 00210 glBegin(GL_QUADS); 00211 glTexCoord2f(0.0f, 1.0f); glVertex3f(-150.0f, -150.0f, 150.0f); 00212 glTexCoord2f(0.0f, 0.0f); glVertex3f(-150.0f, 150.0f, 150.0f); 00213 glTexCoord2f(1.0f, 0.0f); glVertex3f(150.0f, 150.0f, 150.0f); 00214 glTexCoord2f(1.0f, 1.0f); glVertex3f(150.0f, -150.0f, 150.0f); 00215 glEnd(); 00216 00217 glBindTexture(GL_TEXTURE_2D, skyboxTexture[3]); 00218 glBegin(GL_QUADS); 00219 glTexCoord2f(0.0f, 1.0f); glVertex3f(-150.0f, -150.0f, -150.0f); 00220 glTexCoord2f(0.0f, 0.0f); glVertex3f(-150.0f, 150.0f, -150.0f); 00221 glTexCoord2f(1.0f, 0.0f); glVertex3f(-150.0f, 150.0f, 150.0f); 00222 glTexCoord2f(1.0f, 1.0f); glVertex3f(-150.0f, -150.0f, 150.0f); 00223 glEnd(); 00224 00225 /* 00226 Top 00227 */ 00228 glBindTexture(GL_TEXTURE_2D, skyboxTexture[4]); 00229 glBegin(GL_QUADS); 00230 glTexCoord2f(1.0f, 0.0f); glVertex3f(-150.0f, 150.0f, -150.0f); 00231 glTexCoord2f(1.0f, 1.0f); glVertex3f(150.0f, 150.0f, -150.0f); 00232 glTexCoord2f(0.0f, 1.0f); glVertex3f(150.0f, 150.0f, 150.0f); 00233 glTexCoord2f(0.0f, 0.0f); glVertex3f(-150.0f, 150.0f, 150.0f); 00234 glEnd(); 00235 00236 /* 00237 Bottom 00238 */ 00239 glBindTexture(GL_TEXTURE_2D, skyboxTexture[5]); 00240 glBegin(GL_QUADS); 00241 glTexCoord2f(0.0f, 1.0f); glVertex3f(-150.0f, -150.0f, -150.0f); 00242 glTexCoord2f(0.0f, 0.0f); glVertex3f(150.0f, -150.0f, -150.0f); 00243 glTexCoord2f(1.0f, 0.0f); glVertex3f(150.0f, -150.0f, 150.0f); 00244 glTexCoord2f(1.0f, 1.0f); glVertex3f(-150.0f, -150.0f, 150.0f); 00245 glEnd(); 00246 00247 glEnable(GL_LIGHTING); 00248 glPopMatrix(); 00249 } 00250 00251 // 00252 //void display(void) 00253 //{ 00254 // // Show listener position 00255 // { 00256 // char text[64]; 00257 // 00258 // sprintf(text, "Listener Pos: (%.2f, %.2f, %.2f)", xListenerPos, yListenerPos, zListenerPos); 00259 // #ifdef SHOW_GUI_DEBUG_TEXT 00260 // debugText.push(std::string(text)); 00261 // #endif 00262 // } 00263 // // Show cpu usage position 00264 // { 00265 // char text[64]; 00266 // float dsp, stream, geometry, update, total; 00267 // 00268 // fmodSystem->getCPUUsage(&dsp, &stream, &geometry, &update, &total); 00269 // sprintf(text, "CPU Usage : (%.2f, %.2f, %.2f, %.2f, %.2f)", dsp, stream, geometry, update, total); 00270 // #ifdef SHOW_GUI_DEBUG_TEXT 00271 // debugText.push(std::string(text)); 00272 // #endif 00273 // } 00274 // 00275 // /* 00276 // 3D RENDERING 00277 // */ 00278 // 00279 // // update view 00280 // glMatrixMode(GL_PROJECTION); 00281 // glLoadIdentity(); 00282 // gluPerspective( 00283 // 60.0, // fov 00284 // (float)width / (float)height, // aspect 00285 // 0.1, // near 00286 // 500.0 // far 00287 // ); 00288 // 00289 // 00290 // glRotatef(xRotation, 1.0f, 0.0f, 0.0f); 00291 // glRotatef(yRotation, 0.0f, 1.0f, 0.0f); 00292 // glTranslatef(-xListenerPosRel, -yListenerPos, -zListenerPosRel); 00293 // glMatrixMode(GL_MODELVIEW); 00294 // glLoadIdentity(); 00295 // 00296 // // clear 00297 // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 00298 // glClearColor(0.4, 0.6f, 1.0f, 0.0f); 00299 // 00300 // glEnable(GL_TEXTURE_2D); 00301 // glBindTexture( GL_TEXTURE_2D, texture ); 00302 // 00303 // // draw geometry 00304 // drawGeometry(walls); 00305 // drawGeometry(rotatingMesh); 00306 // 00307 // // draw skybox 00308 // drawSkyBox(); 00309 // 00310 // glDisable(GL_TEXTURE_2D); 00311 // 00312 // // draw sound objects 00313 // int object; 00314 // if (TaskMode == 3) 00315 // {object=6;} 00316 // else 00317 // {object=0;} 00318 // //for (object = 0; object < NUM_OBJECTS-6; object++) 00319 // { 00320 // char txt[256]; 00321 // 00322 // 00323 // float directOcclusion = 1.0f; 00324 // float reverbOcclusion = 1.0f; 00325 // 00326 // // set colour baced on direct occlusion 00328 // float intensity = 1.0f;// - directOcclusion; 00329 // 00330 // glPolygonMode(GL_FRONT_AND_BACK, rendermode); 00331 // glPushMatrix(); 00332 // //glTranslatef(objects[object].xPos, objects[object].yPos, objects[object].zPos); 00333 // glTranslatef(0, objects[object].yPos, 0); 00334 // 00335 // sprintf(txt, "Sound object (%d): %.2f, %.2f, %.2f", object, objects[object].xPos, objects[object].yPos, objects[object].zPos); 00336 // #ifdef SHOW_GUI_DEBUG_TEXT 00337 // debugText.push(std::string(txt)); 00338 // #endif 00339 // 00340 // glPushAttrib(GL_LIGHTING_BIT); 00341 // 00342 // intensity *= 0.75f; 00343 // float color[4] = { intensity, intensity, 0.0f, 0.0f }; 00344 // if(object == 0) 00345 // {//objekt broj 0 je ofarban crveno 00346 // color[1] = 0; 00347 // //std::cout<<objects[0].zPos<<" "<<objects[0].xPos<<std::endl; 00348 // //std::cout<<std::endl; 00349 // } 00350 // glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, color); 00351 // intensity *= 0.5f; 00352 // float ambient[4] = { intensity, intensity, 0.0f, 0.0f }; 00353 // if(object == 0) 00354 // {//objekt broj 0 je ofarban crveno 00355 // ambient[1] = 0; 00356 // } 00357 // 00358 // glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); 00359 // 00360 // 00361 // glRotatef(accumulatedTime * 200.0f, 0.0f, 1.0f, 0.0f); 00362 // { 00363 // FMOD_VECTOR soundorientation; 00364 // float rad = (accumulatedTime * 200.0f); 00365 // 00366 // rad *= 3.14159f; 00367 // rad /= 180.0f; 00368 // 00369 // soundorientation.x = 0;//sinf(rad); 00370 // soundorientation.y = 0; 00371 // soundorientation.z = 0;//cosf(rad); 00372 // 00373 // objects[object].event->set3DAttributes(0, 0, &soundorientation); 00374 // } 00375 // 00376 // glutSolidTeapot(1.f);//SolidTorus(0.15f, 0.6f, 8, 16); 00377 // glPopAttrib(); 00378 // glPopMatrix(); 00379 // } 00380 // 00381 // /* 00382 // Draw blue transparent blue quads to entry to water room 00383 // */ 00384 // drawWaterRoom(); 00385 // 00386 // /* 00387 // Do water effects if we are in the water room 00388 // */ 00389 // inWater(); 00390 // 00391 // 00392 // /* 00393 // 2D RENDERING 00394 // */ 00395 // glMatrixMode(GL_PROJECTION); 00396 // glLoadIdentity(); 00397 // gluOrtho2D(0.0f, (GLsizei)width, 0.0f, (GLsizei)height); 00398 // glMatrixMode(GL_MODELVIEW); 00399 // glLoadIdentity(); 00400 // 00401 // glDisable(GL_LIGHTING); 00402 // glDisable(GL_NORMALIZE); 00403 // glDisable(GL_DEPTH_TEST); 00404 // 00405 // /* 00406 // Render text 00407 // */ 00408 // renderUiText(); 00409 // 00410 // 00411 // glEnable(GL_DEPTH_TEST); 00412 // glEnable(GL_LIGHTING); 00413 // glEnable(GL_LIGHT0); 00414 // glEnable(GL_NORMALIZE); 00415 // glShadeModel(GL_SMOOTH); 00416 // glPolygonMode(GL_FRONT_AND_BACK, rendermode); 00417 // 00418 // // finish 00419 // glutSwapBuffers(); 00420 //} 00421 // 00422 //void reshapeFunc(int w, int h) 00423 //{ 00424 // width = w; 00425 // height = h; 00426 // glViewport(0, 0, (GLsizei)w, (GLsizei)h); 00427 //} 00428 // 00429 //void mouseFunc(int button, int state, int x, int y) 00430 //{ 00431 // switch (button) 00432 // { 00433 // case GLUT_LEFT_BUTTON: 00434 // if (state == GLUT_DOWN) 00435 // { 00436 // doRotate = true; 00437 // xMouse = x; 00438 // yMouse = y; 00439 // } 00440 // else 00441 // if (state == GLUT_UP) 00442 // { 00443 // doRotate = false; 00444 // } 00445 // break; 00446 // 00447 // default: 00448 // break; 00449 // } 00450 //} 00451 // 00452 //void motionFunc(int x, int y) 00453 //{ 00454 // //TONI s misom se moze rotirati a ne kretati naprijed-nazad 00455 // std::string SingleLog; 00456 // int test = 0; 00457 // 00458 // int dx = x - xMouse; 00459 // int dy = y - yMouse; 00460 // 00461 // // view rotation about y-axis 00462 // yRotation += (float)dx * 0.5f; 00463 // if (yRotation > 180.0f) 00464 // yRotation -= 360.0f; 00465 // else 00466 // if (yRotation < -180.0f) 00467 // yRotation += 360.0f; 00468 // 00469 // // view rotation about x-axis 00470 // const float xExtent = 88.0f; 00471 // //TONI izmjena u redu ispod, da se ne mice gore-dolje vec samo lijevo-desno 00472 // xRotation += 0.0f;//(float)dy * 0.5f; 00473 // if (xRotation > xExtent) 00474 // xRotation = xExtent; 00475 // else 00476 // if (xRotation < -xExtent) 00477 // xRotation = -xExtent; 00478 // 00479 // xMouse = x; 00480 // yMouse = y; 00481 //} 00482 // 00483 //void keyboardFunc(unsigned char key, int x, int y) 00484 //{ 00485 // key1 = key; 00486 // switch (key) 00487 // { 00488 // case 'w': 00489 // moveForward = true; 00490 // break; 00491 // case 's': 00492 // moveBackward = true; 00493 // break; 00494 // case 'j': 00495 // moveRotateAntiClock = true; 00496 // break; 00497 // case 'l': 00498 // moveRotateClock = true; 00499 // break; 00500 // case 'a': 00501 // moveLeft = true; 00502 // break; 00503 // case 'd': 00504 // moveRight = true; 00505 // break; 00506 // case ' ': 00507 // moveUp = true; 00508 // break; 00509 // case 'c': 00510 // moveDown = true; 00511 // break; 00512 // case 'z' : 00513 // ambientVolDown = true; 00514 // break; 00515 // case 'Z' : 00516 // ambientVolUp = true; 00517 // break; 00518 // case 'v': 00519 // masterVolDown = true; 00520 // break; 00521 // case 'V': 00522 // masterVolUp = true; 00523 // break; 00524 // 00525 // case 'p': 00526 // { 00527 // float value; 00528 // 00529 // fmodEventParameter->getValue(&value); 00530 // 00531 // fmodEventParameter->setValue(value - 20.0f); 00532 // } 00533 // break; 00534 // 00535 // case 'P': 00536 // { 00537 // float value; 00538 // 00539 // fmodEventParameter->getValue(&value); 00540 // 00541 // fmodEventParameter->setValue(value + 20.0f); 00542 // } 00543 // break; 00544 // 00545 // case 'f': 00546 // moveFast = true; 00547 // break; 00548 // } 00549 //} 00550 // 00551 //void keyboardUpFunc(unsigned char key, int x, int y) 00552 //{ 00553 // key1 = 0; 00554 // switch (key) 00555 // { 00556 // case 'w': 00557 // moveForward = false; 00558 // break; 00559 // case 's': 00560 // moveBackward = false; 00561 // break; 00562 // case 'j': 00563 // moveRotateAntiClock = false; 00564 // break; 00565 // case 'l': 00566 // moveRotateClock = false; 00567 // case 'a': 00568 // moveLeft = false; 00569 // break; 00570 // case 'd': 00571 // moveRight = false; 00572 // break; 00573 // case ' ': 00574 // moveUp = false; 00575 // break; 00576 // case 'c': 00577 // moveDown = false; 00578 // break; 00579 // case 'z' : 00580 // ambientVolDown = false; 00581 // break; 00582 // case 'Z' : 00583 // ambientVolUp = false; 00584 // break; 00585 // case 'v': 00586 // masterVolDown = false; 00587 // break; 00588 // case 'V': 00589 // masterVolUp = false; 00590 // break; 00591 // case 'f': 00592 // moveFast = false; 00593 // break; 00594 // case 27: 00595 // exit(1); 00596 // break; 00597 // } 00598 //} 00599 // 00600 void specialKeyFunc(int key, int x, int y) 00601 { 00602 /* switch (key) 00603 { 00604 00605 }*/ 00606 00607 //key = key; 00608 } 00609 // 00610 //void specialKeyUpFunc(int key, int x, int y) 00611 //{ 00612 // switch (key) 00613 // { 00614 // case GLUT_KEY_F1: 00615 // showhelp = !showhelp; 00616 // break; 00617 // case GLUT_KEY_F2: 00618 // if(fullscreen) 00619 // { 00620 // glutPositionWindow(20,40); 00621 // glutReshapeWindow(500,500); 00622 // fullscreen = false; 00623 // } 00624 // else 00625 // { 00626 // glutFullScreen(); 00627 // fullscreen = true; 00628 // } 00629 // break; 00630 // case GLUT_KEY_F3: 00631 // rendermode = (rendermode == GL_LINE ? GL_FILL : GL_LINE); 00632 // break; 00633 // case GLUT_KEY_F11: 00634 // showdebug = !showdebug; 00635 // break; 00636 // case GLUT_KEY_F8: 00637 // rotatingMesh.geometry->setActive(false); 00638 // walls.geometry->setActive(false); 00639 // break; 00640 // case GLUT_KEY_F9: 00641 // rotatingMesh.geometry->setActive(true); 00642 // walls.geometry->setActive(true); 00643 // break; 00644 // } 00645 //} 00646 // 00647 //void timerFunc(int nValue) 00648 //{ 00649 // std::string TimeLog; 00650 // static bool firsttime = true; 00651 // FMOD_RESULT result; 00652 // 00653 // //doGeometryMovement(); 00654 // 00655 // doSoundMovement(); 00656 // doListenerMovement(); 00657 // doUpdateVolume(); 00658 // 00659 // result = FMOD::NetEventSystem_Update(); 00660 // ERRCHECK(result); 00661 // result = fmodEventSystem->update(); 00662 // ERRCHECK(result); 00663 // 00664 // accumulatedTime += (float)INTERFACE_UPDATETIME / 1000.0f; 00665 // 00666 // glutPostRedisplay(); 00667 // glutTimerFunc(INTERFACE_UPDATETIME, timerFunc, 0); 00668 // 00669 //#if 0 00670 // if (firsttime) 00671 // { 00672 // SetWindowPos( 00673 // GetForegroundWindow(), // handle to window 00674 // HWND_TOPMOST, // placement-order handle 00675 // 0, // horizontal position 00676 // 0, // vertical position 00677 // width, // width 00678 // height, // height 00679 // SWP_NOMOVE 00680 // ); 00681 // firsttime = false; 00682 // } 00683 //#endif 00684 //} 00685 // 00686 GLuint loadTexturePNG(const char *filename) 00687 { 00688 GLuint texture = SOIL_load_OGL_texture(filename, 0, 0, 0); 00689 glBindTexture(GL_TEXTURE_2D, texture); 00690 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 00691 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 00692 00693 return texture; 00694 } 00695 00696 GLuint loadTexture(const char *filename) 00697 { 00698 GLuint texture; 00699 int width; 00700 int height; 00701 unsigned char *data; 00702 FILE *file; 00703 00704 // open texture data 00705 file = fopen( filename, "rb" ); 00706 if ( file == NULL ) 00707 return 0; 00708 00709 width = 128; 00710 height = 128; 00711 data = (unsigned char*)malloc(width * height * 3); 00712 00713 fread(data, width * height * 3, 1, file ); 00714 fclose(file); 00715 00716 glGenTextures(1, &texture); 00717 glBindTexture(GL_TEXTURE_2D, texture); 00718 00719 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 00720 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); 00721 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); 00722 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 00723 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 00724 00725 gluBuild2DMipmaps( 00726 GL_TEXTURE_2D, 00727 3, 00728 width, 00729 height, 00730 GL_RGB, 00731 GL_UNSIGNED_BYTE, 00732 data); 00733 00734 free(data); 00735 00736 return texture; 00737 } 00738 // 00739 //void initGeometry(const char* szFileName, Mesh& mesh, bool alter) 00740 //{ 00741 // FMOD_RESULT result; 00742 // 00743 // FILE* file = fopen(szFileName, "rb"); 00744 // if (file) 00745 // { 00746 // // read vertices 00747 // fread(&mesh.numVertices, sizeof (mesh.numVertices), 1, file); 00748 // mesh.vertices = new FMOD_VECTOR[mesh.numVertices]; 00749 // mesh.texcoords = new float[mesh.numVertices][2]; 00750 // fread(mesh.vertices, sizeof (float) * 3, mesh.numVertices, file); 00751 // fread(mesh.texcoords, sizeof (float) * 2, mesh.numVertices, file); 00752 // 00753 // 00754 // fread(&mesh.numIndices, sizeof (mesh.numIndices), 1, file); 00755 // mesh.indices = new int[mesh.numIndices]; 00756 // fread(mesh.indices, sizeof (int), mesh.numIndices, file); 00757 // 00758 // 00759 // fread(&mesh.numPolygons, sizeof (mesh.numPolygons), 1, file); 00760 // mesh.polygons = new Polygon[mesh.numPolygons]; 00761 // 00762 // // read polygons 00763 // for (int poly = 0; poly < mesh.numPolygons; poly++) 00764 // { 00765 // Polygon* polygon = &mesh.polygons[poly]; 00766 // 00767 // 00768 // fread(&polygon->numVertices, sizeof (polygon->numVertices), 1, file); 00769 // fread(&polygon->indicesOffset, sizeof (polygon->indicesOffset), 1, file); 00770 // fread(&polygon->directOcclusion, sizeof (polygon->directOcclusion), 1, file); 00771 // fread(&polygon->reverbOcclusion, sizeof (polygon->reverbOcclusion), 1, file); 00772 // 00773 // int* indices = &mesh.indices[polygon->indicesOffset]; 00774 // 00775 // // calculate polygon normal 00776 // float xN = 0.0f; 00777 // float yN = 0.0f; 00778 // float zN = 0.0f; 00779 // // todo: return an error if a polygon has less then 3 vertices. 00780 // for (int vertex = 0; vertex < polygon->numVertices - 2; vertex++) 00781 // { 00782 // float xA = mesh.vertices[indices[vertex + 1]].x -mesh.vertices[indices[0]].x; 00783 // float yA = mesh.vertices[indices[vertex + 1]].y -mesh.vertices[indices[0]].y; 00784 // float zA = mesh.vertices[indices[vertex + 1]].z -mesh.vertices[indices[0]].z; 00785 // float xB = mesh.vertices[indices[vertex + 2]].x -mesh.vertices[indices[0]].x; 00786 // float yB = mesh.vertices[indices[vertex + 2]].y -mesh.vertices[indices[0]].y; 00787 // float zB = mesh.vertices[indices[vertex + 2]].z -mesh.vertices[indices[0]].z; 00788 // // cross product 00789 // xN += yA * zB - zA * yB; 00790 // yN += zA * xB - xA * zB; 00791 // zN += xA * yB - yA * xB; 00792 // } 00793 // float fMagnidued = (float)sqrt(xN * xN + yN * yN + zN * zN); 00794 // if (fMagnidued > 0.0f) // a tollerance here might be called for 00795 // { 00796 // xN /= fMagnidued; 00797 // yN /= fMagnidued; 00798 // zN /= fMagnidued; 00799 // } 00800 // polygon->normal.x = xN; 00801 // polygon->normal.y = yN; 00802 // polygon->normal.z = zN; 00803 // } 00804 // fclose(file); 00805 // } 00806 // 00807 // result = fmodSystem->createGeometry(mesh.numPolygons, mesh.numIndices, &mesh.geometry); 00808 // ERRCHECK(result); 00809 // 00810 // /* 00811 // Tell FMOD about the geometry 00812 // */ 00813 // for (int poly = 0; poly < mesh.numPolygons; poly++) 00814 // { 00815 // Polygon* polygon = &mesh.polygons[poly]; 00816 // FMOD_VECTOR vertices[16]; 00817 // for (int i = 0; i < polygon->numVertices; i++) 00818 // vertices[i] = mesh.vertices[mesh.indices[polygon->indicesOffset + i]]; 00819 // int polygonIndex = 0; 00820 // 00821 // if (alter && polygon->directOcclusion == 0.85f) 00822 // { 00823 // // polygon->directOcclusion = 0.95f; 00824 // } 00825 // 00826 // result = mesh.geometry->addPolygon( 00827 // polygon->directOcclusion, 00828 // polygon->reverbOcclusion, 00829 // false, // single sided 00830 // polygon->numVertices, 00831 // vertices, 00832 // &polygonIndex); 00833 // ERRCHECK(result); 00834 // } 00835 //} 00836 // 00837 //void ERRCHECK(FMOD_RESULT result) 00838 //{ 00839 // if (result != FMOD_OK) 00840 // { 00841 // printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result)); 00842 // exit(-1); 00843 // } 00844 //} 00845 //