home *** CD-ROM | disk | FTP | other *** search
- #include "Arena.h"
-
- #include "Tokenizer.h"
- #include "log.h"
- #include "File.h"
- #include "Game.h"
- #include "ModelHandler.h"
- #include "Gui.h"
- #include "RendererInfo.h"
- #include "Renderer.h"
- //#include "Game.h"
-
- #include "Octree.h"
- #include "Quadtree.h"
- #include "Q3bspLoader.h"
-
- #include <stdlib.h>
-
-
- Arena::Arena(const char* filename){
- model=NULL;
- collisionModel=NULL;
- sptree=NULL;
- skybox=NULL;
-
- // q3bsp=NULL;
-
- mapTexture=NULL;
- thumbnailTexture=NULL;
- vectorInit3d(0.0f, 0.0f, 0.0f, min);
- vectorInit3d(0.0f, 0.0f, 0.0f, max);
-
- spawnpoints.clear();
- supplypads.clear();
-
- vectorInit4d(0.0f, 0.0f, 0.0f, 0.0f, fogColor);
- fogDensity = 0.0f;
- fogStart = 0.0f;
- fogEnd = 0.0f;
- fogEnabled = false;
-
- gravity = 0.0f;
-
- File *f = new File(filename, "rt");
-
- if(f->isOpen()){
- readFromFile(f);
- f->close();
- }else{
- fatal("(in Arena::Arena()): Couldn't open file '%s'.\n\n", filename);
- }
-
- }
-
- Arena::~Arena(){
- if(thumbnailTexture!=NULL)
- delete thumbnailTexture;
-
- if(name!=NULL)
- delete[] name;
-
- if(sptree!=NULL)
- delete sptree;
-
- if(model!=NULL)
- delete model;
-
- if(skybox!=NULL)
- delete skybox;
-
- // if(q3bsp!=NULL)
- // delete q3bsp;
-
- spawnpoints.clear();
- supplypads.clear();
-
- }
-
- void Arena::render(){
- if(skybox != NULL && Renderer::info.var.renderSkybox){// render skybox
- //glDisable(GL_LIGHTING);
- Renderer::disableLighting();
- glDepthMask(GL_FALSE);
- glDisable(GL_CULL_FACE);
- glPushMatrix();
- glTranslatef(Game::cam.pos[0], Game::cam.pos[1], Game::cam.pos[2]);
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
- Renderer::renderModel(skybox);
- glPopMatrix();
- glEnable(GL_CULL_FACE);
- //glEnable(GL_LIGHTING);
- Renderer::enableLighting();
- glDepthMask(GL_TRUE);
- }// end skybox
-
- if(Renderer::info.var.useFog && fogEnabled){
- glFogi(GL_FOG_MODE, GL_LINEAR);
- glHint(GL_FOG_HINT, GL_NICEST);
- glFogf(GL_FOG_DENSITY, fogDensity);
- glFogfv(GL_FOG_COLOR, fogColor);
- glFogf(GL_FOG_START, fogStart);
- glFogf(GL_FOG_END, fogEnd);
- glEnable(GL_FOG);
- }else{
- glDisable(GL_FOG);
- }
-
- if(sptree!=NULL)
- sptree->render();
-
- if( Renderer::info.var.renderSpawnpoints ){
- for(unsigned int i=0;i<spawnpoints.size();i++){
- if( spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED) ){
- glColor3f(1.0f, 0.0f, 0.0f);
- }
- if( spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE) ){
- glColor3f(0.0f, 0.0f, 1.0f);
- }
- if( (spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED)) && (spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE))){
- glColor3f(1.0f, 0.0f, 1.0f);
- }
- if( !(spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_RED)) && !(spawnpoints[i].teamFlags & (0x01 << GAME_TEAM_BLUE))){
- glColor3f(0.0f, 1.0f, 0.0f);
- }
-
- Renderer::debug_renderAABB(spawnpoints[i].min, spawnpoints[i].max);
- }
- }
- }
-
- void Arena::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- while(f->readLine(256, buff, true) != -1){
-
- // printf("line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
-
- // if(t.tokc!=2){
- // warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens (needed 2 but read %i).\n\n", f->file, f->line, t.tokc);
- // continue;
- // }
-
- if(streq(t.tokv[0], "name")){
-
- name=newString(t.tokv[1]);
- Gui::loadingMenu->updateHeading(name); // THINKABOUTME: irgendwie scheisse das hier zu machen...
- }else if(streq(t.tokv[0], "thumbnailTexture")){
- thumbnailTexture=new Texture(t.tokv[1], 0.0f);
- Gui::loadingMenu->updateCenterTexture(thumbnailTexture);
- }else if(streq(t.tokv[0], "model")){
- loadModel(t.tokv[1]);
- }else if(streq(t.tokv[0], "skybox")){
- log("Loading skybox...\n");
- skybox = new Model(t.tokv[1]);
- }else if(streq(t.tokv[0], "min")){
- sscanf(t.tokv[1], "%f %f %f", &min[0], &min[1], &min[2]);
- }else if(streq(t.tokv[0], "max")){
- sscanf(t.tokv[1], "%f %f %f", &max[0], &max[1], &max[2]);
- }else if(streq(t.tokv[0], "fogColor")){
- sscanf(t.tokv[1], "%f %f %f %f", &fogColor[0], &fogColor[1], &fogColor[2], &fogColor[3]);
- }else if(streq(t.tokv[0], "fogStart")){
- fogStart=(float)atof(t.tokv[1]);
- }else if(streq(t.tokv[0], "fogEnd")){
- fogEnd=(float)atof(t.tokv[1]);
- }else if(streq(t.tokv[0], "fogDensity")){
- fogDensity=(float)atof(t.tokv[1]);
- }else if(streq(t.tokv[0], "fogEnabled")){
- fogEnabled=(atoi(t.tokv[1]) != 0);
-
- }else if(streq(t.tokv[0], "gravity")){
- gravity=(float)atof(t.tokv[1]);
- }else if(streq(t.tokv[0], "spawnpoint")){
- if( t.tokc != 4 ){
- warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens after keyword 'spawnpoint'.\n\n", f->filename, f->line);
- continue;
- }
-
- spawnpoint_t sp;
- sscanf(t.tokv[2], "%f %f %f", &sp.min[0], &sp.min[1], &sp.min[2]);
- sscanf(t.tokv[3], "%f %f %f", &sp.max[0], &sp.max[1], &sp.max[2]);
- sp.teamFlags = 0;
- Tokenizer t2(t.tokv[1], ", |", "");
- for(int i=0;i<t2.tokc;i++){
- if( streq(t2.tokv[i], "spectators") ){
- sp.teamFlags |= (0x01 << GAME_TEAM_SPECTATORS);
- }else if( streq(t2.tokv[i], "players") ){
- sp.teamFlags |= (0x01 << GAME_TEAM_PLAYERS);
- }else if( streq(t2.tokv[i], "red") ){
- sp.teamFlags |= (0x01 << GAME_TEAM_RED);
- }else if( streq(t2.tokv[i], "blue") ){
- sp.teamFlags |= (0x01 << GAME_TEAM_BLUE);
- }else{
- warn("(in Arena::readFromFile() (%s, line %i)): Invalid team in spawnpoint definition ('%s').\n\n", f->filename, f->line, t2.tokv[i]);
- }
- }
-
- spawnpoints.push_back(sp);
-
- }else if(streq(t.tokv[0], "supplypad")){
- if( t.tokc != 2 ){
- warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens after keyword 'supplypad'.\n\n", f->filename, f->line);
- continue;
- }
-
- supplypad_t sp;
- sscanf(t.tokv[1], "%f %f %f", &sp.pos[0], &sp.pos[1], &sp.pos[2]);
- supplypads.push_back(sp);
-
- }else{
- warn("(in Arena::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
- }
-
- void Arena::loadModel(const char* filename){
- model = new Model(filename);
- if( (model->max[1]-model->min[1])/(model->max[0]-model->min[0]) < 0.3f){
- sptree = new Quadtree(model);
- }else{
- sptree = new Octree(model);
- }
-
- delete model;
- model=NULL;
-
- // if(!strcasecmp(&filename[strlen(filename)-3], "bsp"))
- // sptree->q3bspExtension=Q3bspLoader::q3bspExtension;
- }
-
- Face* Arena::getFaceIntersectingAABB(vec3_t min, vec3_t max){
- return sptree->root->getFaceIntersectingAABB(min, max);
- }
-
- Face* Arena::getFrontFacingFaceIntersectingAABB(vec3_t min, vec3_t max, vec3_t dir){
- return sptree->root->getFrontFacingFaceIntersectingAABB(min, max, dir);
- }
-