home *** CD-ROM | disk | FTP | other *** search
/ Enter 2005 March / ENTER.ISO / files / fwp-0.0.6-win32-installer.exe / Arena.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-12-19  |  6.6 KB  |  242 lines

  1. #include "Arena.h"
  2.  
  3. #include "Tokenizer.h"
  4. #include "log.h"
  5. #include "File.h"
  6. #include "Game.h"
  7. #include "ModelHandler.h"
  8. #include "Gui.h"
  9. #include "RendererInfo.h"
  10. #include "Renderer.h"
  11. //#include "Game.h"
  12.  
  13. #include "Octree.h"
  14. #include "Quadtree.h"
  15. #include "Q3bspLoader.h"
  16.  
  17. #include <stdlib.h>
  18.  
  19.  
  20. Arena::Arena(const char* filename){
  21.     model=NULL;
  22.     collisionModel=NULL;
  23.     sptree=NULL;
  24.     skybox=NULL;
  25.  
  26. //    q3bsp=NULL;
  27.  
  28.     mapTexture=NULL;
  29.     thumbnailTexture=NULL;
  30.     vectorInit3d(0.0f, 0.0f, 0.0f, min);
  31.     vectorInit3d(0.0f, 0.0f, 0.0f, max);
  32.  
  33.     spawnpoints.clear();
  34.     supplypads.clear();
  35.  
  36.     vectorInit4d(0.0f, 0.0f, 0.0f, 0.0f, fogColor);
  37.     fogDensity = 0.0f;
  38.     fogStart = 0.0f;
  39.     fogEnd = 0.0f;
  40.     fogEnabled = false;
  41.  
  42.     gravity = 0.0f;
  43.  
  44.     File *f = new File(filename, "rt");
  45.  
  46.     if(f->isOpen()){
  47.         readFromFile(f);
  48.         f->close();
  49.     }else{
  50.         fatal("(in Arena::Arena()): Couldn't open file '%s'.\n\n", filename);
  51.     }
  52.  
  53. }
  54.  
  55. Arena::~Arena(){
  56.     if(thumbnailTexture!=NULL)
  57.         delete thumbnailTexture;
  58.  
  59.     if(name!=NULL)
  60.         delete[] name;
  61.  
  62.     if(sptree!=NULL)
  63.         delete sptree;
  64.  
  65.     if(model!=NULL)
  66.         delete model;
  67.  
  68.     if(skybox!=NULL)
  69.         delete skybox;
  70.  
  71. //    if(q3bsp!=NULL)
  72. //        delete q3bsp;
  73.  
  74.     spawnpoints.clear();
  75.     supplypads.clear();
  76.  
  77. }
  78.  
  79. void Arena::render(){
  80.     if(skybox != NULL && Renderer::info.var.renderSkybox){// render skybox
  81.         //glDisable(GL_LIGHTING);
  82.         Renderer::disableLighting();
  83.         glDepthMask(GL_FALSE);
  84.         glDisable(GL_CULL_FACE);
  85.         glPushMatrix();
  86.         glTranslatef(Game::cam.pos[0], Game::cam.pos[1], Game::cam.pos[2]);
  87.         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  88.         Renderer::renderModel(skybox);
  89.         glPopMatrix();
  90.         glEnable(GL_CULL_FACE);
  91.         //glEnable(GL_LIGHTING);
  92.         Renderer::enableLighting();
  93.         glDepthMask(GL_TRUE);
  94.     }// end skybox
  95.  
  96.     if(Renderer::info.var.useFog && fogEnabled){
  97.         glFogi(GL_FOG_MODE, GL_LINEAR);
  98.         glHint(GL_FOG_HINT, GL_NICEST);
  99.         glFogf(GL_FOG_DENSITY, fogDensity);
  100.         glFogfv(GL_FOG_COLOR, fogColor);
  101.         glFogf(GL_FOG_START, fogStart);
  102.         glFogf(GL_FOG_END, fogEnd);
  103.         glEnable(GL_FOG);
  104.     }else{
  105.        glDisable(GL_FOG);
  106.     }
  107.  
  108.     if(sptree!=NULL)
  109.         sptree->render();
  110.  
  111.     if( Renderer::info.var.renderSpawnpoints ){
  112.         for(unsigned int i=0;i<spawnpoints.size();i++){
  113.             if( spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED) ){
  114.                 glColor3f(1.0f, 0.0f, 0.0f);
  115.             }
  116.             if( spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE) ){
  117.                 glColor3f(0.0f, 0.0f, 1.0f);
  118.             }
  119.             if( (spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED)) && (spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE))){
  120.                 glColor3f(1.0f, 0.0f, 1.0f);
  121.             }
  122.             if( !(spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED)) && !(spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE))){
  123.                 glColor3f(0.0f, 1.0f, 0.0f);
  124.             }
  125.             
  126.             Renderer::debug_renderAABB(spawnpoints[i].min, spawnpoints[i].max);
  127.         }
  128.     }
  129. }
  130.  
  131. void Arena::readFromFile(File* f){
  132.     char buff[256];
  133.     Tokenizer t(" =\t\n\r\"", "\"");
  134.  
  135.     while(f->readLine(256, buff, true) != -1){
  136.     
  137. //        printf("line: %s\n", buff);
  138.         t.tokenize(buff);
  139.  
  140.         if(t.tokc==0)
  141.             continue;
  142.  
  143. //        if(t.tokc!=2){
  144. //            warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens (needed 2 but read %i).\n\n", f->file, f->line, t.tokc);
  145. //            continue;
  146. //        }
  147.  
  148.         if(streq(t.tokv[0], "name")){
  149.  
  150.             name=newString(t.tokv[1]);
  151.             Gui::loadingMenu->updateHeading(name);    // THINKABOUTME: irgendwie scheisse das hier zu machen...
  152.         }else if(streq(t.tokv[0], "thumbnailTexture")){
  153.             thumbnailTexture=new Texture(t.tokv[1], 0.0f);
  154.             Gui::loadingMenu->updateCenterTexture(thumbnailTexture);
  155.         }else if(streq(t.tokv[0], "model")){
  156.             loadModel(t.tokv[1]);
  157.         }else if(streq(t.tokv[0], "skybox")){
  158.             log("Loading skybox...\n");
  159.             skybox = new Model(t.tokv[1]);
  160.         }else if(streq(t.tokv[0], "min")){
  161.             sscanf(t.tokv[1], "%f %f %f", &min[0], &min[1], &min[2]);
  162.         }else if(streq(t.tokv[0], "max")){
  163.             sscanf(t.tokv[1], "%f %f %f", &max[0], &max[1], &max[2]);
  164.         }else if(streq(t.tokv[0], "fogColor")){
  165.             sscanf(t.tokv[1], "%f %f %f %f", &fogColor[0], &fogColor[1], &fogColor[2], &fogColor[3]);
  166.         }else if(streq(t.tokv[0], "fogStart")){
  167.             fogStart=(float)atof(t.tokv[1]);
  168.         }else if(streq(t.tokv[0], "fogEnd")){
  169.             fogEnd=(float)atof(t.tokv[1]);
  170.         }else if(streq(t.tokv[0], "fogDensity")){
  171.             fogDensity=(float)atof(t.tokv[1]);
  172.         }else if(streq(t.tokv[0], "fogEnabled")){
  173.             fogEnabled=(atoi(t.tokv[1]) != 0);
  174.  
  175.         }else if(streq(t.tokv[0], "gravity")){
  176.             gravity=(float)atof(t.tokv[1]);
  177.         }else if(streq(t.tokv[0], "spawnpoint")){
  178.             if( t.tokc != 4 ){
  179.                 warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens after keyword 'spawnpoint'.\n\n", f->filename, f->line);
  180.                 continue;
  181.             }
  182.  
  183.             spawnpoint_t sp;
  184.             sscanf(t.tokv[2], "%f %f %f", &sp.min[0], &sp.min[1], &sp.min[2]);
  185.             sscanf(t.tokv[3], "%f %f %f", &sp.max[0], &sp.max[1], &sp.max[2]);
  186.             sp.teamFlags = 0;
  187.             Tokenizer t2(t.tokv[1], ", |", "");
  188.             for(int i=0;i<t2.tokc;i++){
  189.                 if( streq(t2.tokv[i], "spectators") ){
  190.                     sp.teamFlags |= (0x01 << GAME_TEAM_SPECTATORS);
  191.                 }else if( streq(t2.tokv[i], "players") ){
  192.                     sp.teamFlags |= (0x01 << GAME_TEAM_PLAYERS);
  193.                 }else if( streq(t2.tokv[i], "red") ){
  194.                     sp.teamFlags |= (0x01 << GAME_TEAM_RED);
  195.                 }else if( streq(t2.tokv[i], "blue") ){
  196.                     sp.teamFlags |= (0x01 << GAME_TEAM_BLUE);
  197.                 }else{
  198.                     warn("(in Arena::readFromFile() (%s, line %i)): Invalid team in spawnpoint definition ('%s').\n\n", f->filename, f->line, t2.tokv[i]);
  199.                 }
  200.             }
  201.  
  202.             spawnpoints.push_back(sp);
  203.  
  204.         }else if(streq(t.tokv[0], "supplypad")){
  205.             if( t.tokc != 2 ){
  206.                 warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens after keyword 'supplypad'.\n\n", f->filename, f->line);
  207.                 continue;
  208.             }
  209.  
  210.             supplypad_t sp;
  211.             sscanf(t.tokv[1], "%f %f %f", &sp.pos[0], &sp.pos[1], &sp.pos[2]);
  212.             supplypads.push_back(sp);
  213.  
  214.         }else{
  215.             warn("(in Arena::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
  216.         }
  217.     }
  218. }
  219.  
  220. void Arena::loadModel(const char* filename){
  221.     model = new Model(filename);
  222.     if( (model->max[1]-model->min[1])/(model->max[0]-model->min[0]) < 0.3f){
  223.         sptree = new Quadtree(model);
  224.     }else{
  225.         sptree = new Octree(model);
  226.     }
  227.  
  228.     delete model;
  229.     model=NULL;
  230.  
  231. //    if(!strcasecmp(&filename[strlen(filename)-3], "bsp"))
  232. //        sptree->q3bspExtension=Q3bspLoader::q3bspExtension;
  233. }
  234.  
  235. Face* Arena::getFaceIntersectingAABB(vec3_t min, vec3_t max){
  236.     return sptree->root->getFaceIntersectingAABB(min, max);
  237. }
  238.  
  239. Face* Arena::getFrontFacingFaceIntersectingAABB(vec3_t min, vec3_t max, vec3_t dir){
  240.     return sptree->root->getFrontFacingFaceIntersectingAABB(min, max, dir);
  241. }
  242.