Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/single_player_map/src/lib/graphics/importer/bsp_manager.cc @ 8864

Last change on this file since 8864 was 8864, checked in by patrick, 18 years ago

new collision registration functions

File size: 38.7 KB
RevLine 
[7353]1/*
2   orxonox - the future of 3D-vertical-scrollers
[8864]3
[7353]4   Copyright (C) 2006 orx
[8864]5
[7353]6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
[8864]10
[7353]11   ### File Specific:
12   main-programmer: bottac@ee.ethz.ch
[8864]13
[8081]14   Inspired by:
15   Rendering Q3 Maps by Morgan McGuire                  http://graphics.cs.brown.edu/games/quake/quake3.html
16   Unofficial Quake 3 Map Specs by Kekoa Proudfoot      http://graphics.stanford.edu/~kekoa/q3/
[8864]17
[8081]18   Collision detection adapted from:
19   Quake 3 Collision Detection by Nathan Ostgard        http://www.devmaster.net/articles/quake3collision/
[7353]20*/
21
22
23#include "vector.h"
24#include "bsp_file.h"
25#include "bsp_manager.h"
[7385]26#include "bsp_tree_leaf.h"
[7353]27#include "p_node.h"
28#include "state.h"
29#include "debug.h"
30#include "material.h"
31#include "camera.h"
32#include "vertex_array_model.h"
[7579]33#include "world_entities/player.h"
34#include "world_entities/playable.h"
[7596]35#include "util/loading/resource_manager.h"
[7385]36// STL Containers
37#include <vector>
38#include <deque>
[7801]39#include "movie_player.h"
[7353]40
[7833]41#include "world_entity.h"
[7353]42
[8081]43#include "util/loading/load_param.h"
44#include "util/loading/factory.h"
45
[8796]46#include "aabb.h"
[8864]47#include "cr_defs.h"
[8081]48
[8490]49
[8081]50//CREATE_FACTORY( BspManager, CL_BSP_MODEL);
51
[8490]52BspManager::BspManager(WorldEntity* parent)
[7353]53{
[8724]54
[8490]55  this->parent = parent;
[8081]56  /*// open a BSP file
[7395]57  this->bspFile = new BspFile();
[8081]58  this->bspFile->scale = 0.4f;
[7596]59  this->bspFile->read(ResourceManager::getFullName("test.bsp").c_str());
[7395]60  this->bspFile->build_tree();
61  this->root  = this->bspFile->get_root();
62  this->alreadyVisible = new bool [this->bspFile->numFaces];
[8081]63  */
[8490]64
[8081]65}
[7833]66
[8081]67
68/*
69BspManager::BspManager(const TiXmlElement* root)
70{
[8864]71
72
[8081]73  if( root != NULL)
74    this->loadParams(root);
[8864]75
[7833]76  CDEngine::getInstance()->setBSPModel(this);
[8081]77} */
78
79void BspManager::load(const char* fileName, float scale)
80{
[8490]81  // open a BSP file
[8081]82  this->bspFile = new BspFile();
83  this->bspFile->scale =  scale;
84  this->bspFile->read(ResourceManager::getFullName(fileName).c_str());
85  this->bspFile->build_tree();
86  this->root  = this->bspFile->get_root();
87  this->alreadyVisible = new bool [this->bspFile->numFaces];
88
[8490]89  this->outputFraction = 1.0f;
[7353]90}
[8081]91/*
92BspManager::BspManager(const char* fileName, float scale)
93{
94  // open a BSP file
95  this->bspFile = new BspFile();
96  this->bspFile->scale =  scale;
97  this->bspFile->read(fileName);
98  this->bspFile->build_tree();
99  this->root  = this->bspFile->get_root();
100  this->alreadyVisible = new bool [this->bspFile->numFaces];
[8864]101
[8081]102  CDEngine::getInstance()->setBSPModel(this);
103}
104*/
105
[8490]106const void BspManager::tick(float time)
107{
108
[8796]109  if(!this->bspFile->MovieMaterials.empty()) {
110    ::std::vector<MoviePlayer *>::iterator it = this->bspFile->MovieMaterials.begin() ;
111    while(it != this->bspFile->MovieMaterials.end()) {
112      (*it)->tick(time);
113      it++;
114    }
115    //this->bspFile->MovieMaterials.front()->tick(time );
[8490]116
117
118  }
119
120}
[8081]121const void BspManager::draw()
[7353]122{
123
[8081]124  /*
[8030]125  this->drawDebugCube(&this->out);
126  this->out1 = this->out;
127  this->out2 = this->out;
[8490]128  if(this->collPlane != NULL) {
129    this->out1.x += this->collPlane->x*5.0;
130    this->out1.y += this->collPlane->y*5.0;
131    this->out1.z += this->collPlane->z*5.0;
[8087]132
[8490]133    this->out2.x += this->collPlane->x*10.0;
134    this->out2.y += this->collPlane->y*10.0;
135    this->out2.z += this->collPlane->z*10.0;
[8030]136  }
137  this->drawDebugCube(&this->out1);
138  this->drawDebugCube(&this->out2);
[8490]139
[8087]140  */
[8490]141
142
[7395]143  // Draw Debug Terrain
144  /*
[8087]145  this->bspFile->Materials[0]->select();
[7395]146  for(int i = 0; i <  this->bspFile->numPatches ; i++)
[8087]147        {
148                this->bspFile->VertexArrayModels[i]->draw();
149
150        }
[7395]151  */
[7353]152
153
154
[7395]155  // erase alreadyVisible
156  for(int i = 0; i < this->bspFile->numFaces; i++) this->alreadyVisible[i] = false;
157  float tmp = 0;
[7579]158  //this->opal.clear();
159  //this->trasparent.clear();
[7353]160  // Find all visible faces...
161
[7395]162  this->cam = State::getCamera()->getAbsCoor() ;
[7579]163  //this->ship = State::getCameraTargetNode()->getAbsCoor();
[7353]164
165
166
167
[7833]168
[8490]169  this->viewDir=    State::getCamera()->getAbsDirX();
[7395]170  float d = (cam.x*viewDir.x + cam.y*viewDir.y + cam.z * viewDir.z);
[7353]171
[7395]172  BspTreeNode*  ActLeaf = this->getLeaf(this->bspFile->root, &ship);
173  int viscluster = -1;
174  viscluster =((leaf*)(this->bspFile->leaves))[ ActLeaf->leafIndex].cluster; // get the players cluster (viscluster)
[7353]175
176
177
[8490]178
[8796]179  // this->checkCollision(this->root, &this->cam);   //!< Test Collision Detection
[8490]180
181
[7563]182  this->outputStartsOut = true;
183  this->outputAllSolid = false;
184  this->outputFraction = 1.0f;
[7833]185
[7801]186  if ( viscluster < 0  || ((int *)(this->bspFile->header))[35] == 0 )  //!< if (sizeof(Visdata) == 0)
[7395]187  {
[7833]188
189
190
[8490]191    // Iterate through all Leafs
[7395]192    for(int i = 0; i <  this->bspFile->numLeafs   ; i++ )
[7353]193    {
[7395]194      // cluster =  (this->bspFile->leaves)[i].cluster;
195      leaf& curLeaf = (this->bspFile->leaves)[i];
[7563]196      if(curLeaf.cluster<0) continue;
[7833]197
[7563]198      /** Do Frustum culling and draw 'em all **/
[7801]199
[8490]200      Vector dir = State::getCameraNode()->getAbsDirX();
201
[7563]202      float dist =  dir.x*this->cam.x +dir.y*this->cam.y +dir.z*this->cam.z;
203      //if(dist < 0) dist = -dist;
[7801]204      const float dMins = dir.x*(float)curLeaf.mins[0] +dir.y*(float)curLeaf.mins[1] +dir.z*(float)curLeaf.mins[2] - dist ;
205      const float dMaxs = dir.x*(float)curLeaf.maxs[0] +dir.y*(float)curLeaf.maxs[1] +dir.z*(float)curLeaf.maxs[2] - dist ;
[7833]206
[8490]207      if(dMins < -300.0 && dMaxs < -300.0) {
[8030]208        continue;
[7563]209      }
[8490]210      if( (this->cam - Vector(curLeaf.mins[0],curLeaf.mins[1], curLeaf.mins[2])).len() > 2000  && (this->cam - Vector(curLeaf.maxs[0],curLeaf.maxs[1], curLeaf.maxs[2])).len() > 2000) {
[8030]211        continue;
[7801]212      }
[7833]213
214
[7395]215      // Iterate through all faces
216      for (int j = 0; j < curLeaf.n_leaffaces ; ++j) {
[7596]217        const int g = (j +  curLeaf.leafface);
218        const int f = ((int *)this->bspFile->leafFaces)[g];
[7395]219        if (f >=0 && !this->isAlreadyVisible(f)) {
220          this->alreadyVisible[f] = true;
221          addFace(f); // "visibleFaces.append(f)"
222        }
223      }
[7353]224
225
226
227
[7395]228    } //for
[7833]229  } else {
[7579]230
[7833]231
[7395]232    unsigned int v;
233    unsigned char  visSet;
[7353]234
[7395]235    // Iterate through all Leafs
[7385]236
[7395]237    for(int i = 0; i <  this->bspFile->numLeafs   ; ++i ) {
238      leaf& camLeaf =  (this->bspFile->leaves)[ActLeaf->leafIndex] ;
239      leaf& curLeaf =  (this->bspFile->leaves)[i] ;
[7579]240      int& cluster =  curLeaf.cluster;
[7563]241
242      if(cluster < 0) continue;
[7395]243      v = ((viscluster *  ( ((int *)this->bspFile->visData)[1]) ) + (cluster / 8));
[7579]244      visSet =((char*) (this->bspFile->visData))[v + 8];
[7563]245
[7833]246      // gets bit of visSet
[7579]247      if( ((visSet) & (1 << (cluster &  7))) != 0 ) {
[7833]248
[7592]249        // Frustum culling
[7833]250
[7592]251        Vector dir;
[7833]252        dir.x = State::getCameraNode()->getAbsDirX().x;
253        dir.y =  State::getCameraNode()->getAbsDirX().y;
254        dir.z =  State::getCameraNode()->getAbsDirX().z;
[7592]255        const float dist =  dir.x*this->cam.x +dir.y*this->cam.y +dir.z*this->cam.z;
[7833]256        //if(dist < 0) dist = -dist;
[7592]257        const float dMins = dir.x*(float)curLeaf.mins[0] +dir.y*(float)curLeaf.mins[1] +dir.z*(float)curLeaf.mins[2] - dist;
258        const float dMaxs = dir.x*(float)curLeaf.maxs[0] +dir.y*(float)curLeaf.maxs[1] +dir.z*(float)curLeaf.maxs[2] - dist;
[7833]259
[8081]260        if(dMins < -50.0 && dMaxs < -  50.0) {
[7833]261          continue;
[7592]262        }
[7833]263
264
[7395]265        // Iterate through all faces
[7563]266        for (int j = 0; j < curLeaf.n_leaffaces ; ++j) {
[7579]267          const int g = (j +  curLeaf.leafface);
268          const int f = ((int *)this->bspFile->leafFaces)[g];
[7395]269
270          if (!this->isAlreadyVisible(f) && f>=0) {
271            this->addFace(f);
272            this->alreadyVisible[f] = true;
273          }
274
275        }
276
[7563]277      }// if
[7395]278
279    }//for
280
281  }//else
282
283  while(!this->opal.empty()) {
284    this->draw_face(this->opal.front());
285    this->opal.pop_front();
286  }
287  while(!this->trasparent.empty()) {
288    this->draw_face(this->trasparent.back());
289    this->trasparent.pop_back();
290  }
[8081]291  //glEnable(GL_TEXTURE_2D);
[7801]292  glActiveTextureARB(GL_TEXTURE1_ARB);
293  glBindTexture(GL_TEXTURE_2D, this->bspFile->whiteLightMap);
[7395]294
[8087]295
296
[7353]297}//draw
298
299
[7563]300
[7353]301void BspManager::draw_face(int curface)
302{
[7395]303  face& curFace =  (this->bspFile->faces)[curface];
304  const BspVertex* curVertex = (BspVertex *) this->bspFile->vertice;
305  int stride = sizeof(BspVertex);  // sizeof(Vertex)
306  int offset    = curFace.vertex;
[7801]307  if (curFace.effect != -1) return;
[7353]308  // PRINTF(0)("BSP Manager: ");
309  // PRINTF(0)("BSP Manager: type: %i  \n", curFace.texture);
[7395]310
311  //  if(  curFace.texture < 0 ) return;
312  if(curFace.type == 2) {
313    this->draw_patch( &curFace);
314    return;
315  }
[8796]316  // if(curFace.type != 1) return;
[7801]317  if((char*)(this->bspFile->textures)[curFace.texture*72]== 0) return;
[7563]318
[7544]319  if(this->lastTex != curFace.texture) {
[7833]320    if(this->bspFile->Materials[curFace.texture].animated) {
[8796]321      // glBlendFunc(GL_ZERO,GL_ONE);
[8490]322
323
324
[7801]325      if(this->bspFile->Materials[curFace.texture].aviMat->getStatus() == 2) this->bspFile->Materials[curFace.texture].aviMat->start(0);
[8490]326      //this->bspFile->Materials[curFace.texture].aviMat->tick(0.005);
[7801]327      int n =  this->bspFile->Materials[curFace.texture].aviMat->getTexture();
328      glActiveTextureARB(GL_TEXTURE0_ARB);
329      glBindTexture(GL_TEXTURE_2D, n );
[8490]330      this->lastTex = curFace.texture;
331
[7833]332    } else {
333      this->bspFile->Materials[curFace.texture].mat->select();
334      this->lastTex = curFace.texture;
[7801]335    }
[7544]336  }
[7563]337
338  if(curFace.lm_index < 0) {
[8490]339    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[7465]340    glActiveTextureARB(GL_TEXTURE1_ARB);
[7563]341    glBindTexture(GL_TEXTURE_2D, this->bspFile->whiteLightMap );
342    glEnable(GL_TEXTURE_2D);
343  } else {
[8796]344    // glEnable(GL_BLEND);
[8490]345    //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
346    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[7563]347    glActiveTextureARB(GL_TEXTURE1_ARB);
[7465]348    glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[curFace.lm_index]);
349    glEnable(GL_TEXTURE_2D);
[8796]350    //  glDisable(GL_BLEND);
[7563]351  }
352
[7801]353  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
[7833]354
355  // glColor4f(3.0,3.0,3.0,1.0);
[7544]356  glEnableClientState(GL_VERTEX_ARRAY );
357  glEnableClientState(GL_TEXTURE_COORD_ARRAY );
[7353]358  glEnableClientState(GL_NORMAL_ARRAY );
[7395]359  //  glEnableClientState(GL_COLOR_ARRAY);
360
[7563]361
[7353]362  glVertexPointer(3, GL_FLOAT, stride, &(curVertex[offset].position[0]));
[7563]363
[7465]364  glClientActiveTextureARB(GL_TEXTURE0_ARB);
[7353]365  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[0]));
[7801]366  //glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7563]367
[7465]368  glClientActiveTextureARB(GL_TEXTURE1_ARB);
369  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[1]));
[7544]370  //glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7353]371
[7563]372
[7353]373  glNormalPointer( GL_FLOAT, stride, &(curVertex[offset].normal[0]));
[7395]374  // glColorPointer(4, GL_BYTE, stride, &(curVertex[offset].color[0]));
[7353]375  glDrawElements(GL_TRIANGLES, curFace.n_meshverts,
[7395]376                 GL_UNSIGNED_INT, &(((meshvert *)this->bspFile->meshverts) [curFace.meshvert]));
[7353]377
[7465]378  glDisableClientState(GL_TEXTURE0_ARB);
379  glDisableClientState(GL_TEXTURE1_ARB);
[7353]380  glDisableClientState(GL_VERTEX_ARRAY );
[7801]381  glDisableClientState(GL_TEXTURE_COORD_ARRAY );
[7353]382  glDisableClientState(GL_NORMAL_ARRAY );
[7395]383  // glDisableClientState(GL_COLOR_ARRAY);
384
[7353]385}
386
387
388void BspManager::draw_debug_face(int curface)
389{
[7395]390  face& curFace =  (this->bspFile->faces)[curface];
391  const BspVertex* curVertex = (BspVertex *) this->bspFile->vertice;
392  int stride = 44;  // sizeof(Vertex)
393  int offset    = curFace.vertex;
394
[7353]395  // PRINTF(0)("BSP Manager: ");
396  // PRINTF(0)("BSP Manager: type: %i  \n", curFace.texture);
397
[7395]398  //  if(  curFace.texture < 0 ) return;
399  if(curFace.type == 2) {
400    this->draw_patch( &curFace);
401    return;
402  }
403  if(curFace.type == 3) return;
404  // if(this->bspFile->Materials[curFace.texture] != NULL)
[7353]405
[7395]406  this->bspFile->Materials[2].mat->select();
407  this->lastTex = 2;
408
[7353]409  glEnableClientState(GL_VERTEX_ARRAY );
410  glEnableClientState(GL_TEXTURE_COORD_ARRAY );
411  glEnableClientState(GL_NORMAL_ARRAY );
[7395]412  //glEnableClientState(GL_COLOR_ARRAY);
[7353]413  // glEnableClientState(GL_VERTEX_ARRAY );
[7465]414  glClientActiveTextureARB(GL_TEXTURE0_ARB);
[7353]415  glVertexPointer(3, GL_FLOAT, stride, &(curVertex[offset].position[0]));
[7465]416  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7395]417  // glClientActiveTextureARB(GL_TEXTURE0_ARB);
[7465]418  glClientActiveTextureARB(GL_TEXTURE1_ARB);
[7353]419  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[0]));
[7465]420  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7395]421  // glClientActiveTextureARB(GL_TEXTURE1_ARB);
422  // glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[1]));
423  //glEnableClientState(GL_NORMAL_ARRAY );
[7353]424
425  glNormalPointer( GL_FLOAT, stride, &(curVertex[offset].normal[0]));
[7395]426  //  glColorPointer(4, GL_BYTE, stride, &(curVertex[offset].color[0]));
[7353]427  glDrawElements(GL_TRIANGLES, curFace.n_meshverts,
[7395]428                 GL_UNSIGNED_INT, &(((meshvert *)this->bspFile->meshverts) [curFace.meshvert]));
429
[7353]430}
431
432void BspManager::draw_patch(face* Face)
433{
[7544]434  if(this->lastTex != Face->texture) {
[7510]435    this->bspFile->Materials[Face->texture].mat->select();
[7544]436    this->lastTex = Face->texture;
437  }
[7801]438  if (Face->effect != -1) return;
[7563]439
440
441  if(Face->lm_index < 0) {
[7465]442    glActiveTextureARB(GL_TEXTURE1_ARB);
[7511]443    glBindTexture(GL_TEXTURE_2D, this->bspFile->whiteLightMap);
[7465]444    glEnable(GL_TEXTURE_2D);
[7563]445  } else {
[7465]446    glActiveTextureARB(GL_TEXTURE1_ARB);
447    glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[Face->lm_index]);
448    glEnable(GL_TEXTURE_2D);
[7563]449  }
[7579]450  //glColor4f(3.0,3.0,3.0,1.0);
[7563]451
[7801]452  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
453  glEnable( GL_AUTO_NORMAL);
[7465]454  glEnableClientState(GL_VERTEX_ARRAY );
455  glEnableClientState(GL_TEXTURE_COORD_ARRAY );
[7801]456  for(int i = Face->n_meshverts -1; i >=0   ; i--) {
[7833]457    //glFrontFace(GL_CW);
[7395]458    //PRINTF(0)("BSP Manager: Face->size[0]: %i . \n", Face->size[0]);
[7563]459
460
[7801]461    //glEnableClientState(GL_NORMAL_ARRAY );
[7353]462
[7395]463    glVertexPointer(3, GL_FLOAT,44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).position[0]));
[7563]464
465
[7465]466    glClientActiveTextureARB(GL_TEXTURE0_ARB);
[7801]467    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7395]468    glTexCoordPointer(2, GL_FLOAT, 44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).texcoord[0][0]));
[7465]469
[7563]470
[7833]471
[7465]472    glClientActiveTextureARB(GL_TEXTURE1_ARB);
473    glTexCoordPointer(2, GL_FLOAT, 44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).texcoord[1][0]));
[7544]474    //glEnableClientState(GL_TEXTURE_COORD_ARRAY);
[7465]475
[7563]476
[7833]477    //  glNormalPointer( GL_FLOAT, 44,&((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).normal[0]) );
[7353]478
479
480
[7563]481
[7801]482    for(int row=6; row>=0; --row) {
[7395]483      glDrawElements(GL_TRIANGLE_STRIP, 2*(8), GL_UNSIGNED_INT,
484                     & (     (((GLuint*)  (this->bspFile->patchIndexes))[7*8*2*(Face->meshvert+i)+ row*2*8]  ))  );
485    }
[7563]486
[7801]487    //glFrontFace(GL_CCW);
[7395]488  }
[7465]489  glDisableClientState(GL_TEXTURE0_ARB);
490  glDisableClientState(GL_TEXTURE1_ARB);
[7801]491  glDisable(GL_AUTO_NORMAL);
[7465]492  glDisableClientState(GL_VERTEX_ARRAY );
493  glDisableClientState(GL_TEXTURE_COORD_ARRAY );
[7563]494
495
[7353]496}
497
498bool BspManager::isAlreadyVisible(int Face)
499{
[7395]500  return this->alreadyVisible[Face];
[7353]501}
502
503
504BspTreeNode*  BspManager::getLeaf(BspTreeNode* node, Vector* cam)
505{
[7395]506  float dist = 0;
507  while(!(node->isLeaf)) {
508    dist = (node->plane.x * this->cam.x + node->plane.y*this->cam.y + node->plane.z*this->cam.z) - node->d;
509    if(dist >= 0.0f) {
510      node = node->left;
511    } else {
512      node = node->right;
513    }
514  }
515  return  node;
[7353]516}
517
[7563]518void BspManager::checkBrushRay(brush* curBrush)
519{
520  float EPSILON = 0.000001;
521  float startDistance;
522  float endDistance;
[7833]523
[7563]524  float startFraction = -1.0f;
525  float endFraction = 1.0f;
526  bool startsOut = false;
527  bool endsOut = false;
[7833]528
[7563]529  Vector inputStart = State::getCameraTargetNode()->getLastAbsCoor();
530  Vector inputEnd   = State::getCameraTargetNode()->getAbsCoor();
531
[7833]532  for (int i = 0; i < curBrush->n_brushsides; i++) {
[7563]533    brushside& curBrushSide =   this->bspFile->brushSides[curBrush->brushside + i]   ;
534    plane& curPlane  =   this->bspFile->planes[curBrushSide.plane] ;
535
[7833]536    startDistance = inputStart.x * curPlane.x + inputStart.y * curPlane.y+ inputStart.z * curPlane.z - curPlane.d;
537    endDistance = inputEnd.x * curPlane.x +inputEnd.y * curPlane.y +inputEnd.z * curPlane.z -curPlane.d;
[7563]538
539    if (startDistance > 0)
540      startsOut = true;
541    if (endDistance > 0)
542      endsOut = true;
543
[7833]544    // make sure the trace isn't completely on one side of the brush
545    if (startDistance > 0 && endDistance > 0) {   // both are in front of the plane, its outside of this brush
[7563]546      return;
547    }
[7833]548    if (startDistance <= 0 && endDistance <= 0) {   // both are behind this plane, it will get clipped by another one
[7563]549      continue;
550    }
551
[7833]552    // MMM... BEEFY
553    if (startDistance > endDistance) {   // line is entering into the brush
[7563]554      float fraction = (startDistance - EPSILON) / (startDistance - endDistance);  // *
555      if (fraction > startFraction)
556        startFraction = fraction;
[8081]557      // don't store plane
558      // this->collPlane = &curPlane;
[8087]559
[8081]560    } else {   // line is leaving the brush
561      float fraction = (startDistance + EPSILON) / (startDistance - endDistance);  // *
562      if (fraction < endFraction)
563        endFraction = fraction;
564      // don't store plane
565      //this->collPlane = & curPlane;
[8087]566
[8081]567    }
568
569  }
570  if (startsOut == false) {
571    this->outputStartsOut = false;
572    if (endsOut == false)
573      this->outputAllSolid = true;
574    return;
575  }
576
577  if (startFraction < endFraction) {
578    if (startFraction > -1.0f && startFraction < outputFraction) {
579      if (startFraction < 0)
580        startFraction = 0;
[8087]581      this->outputFraction = startFraction;
[8081]582    }
583  }
584
585}
586
587void BspManager::checkBrushRayN(brush* curBrush)
588{
589  float EPSILON = 0.000001;
590  float startDistance;
591  float endDistance;
592
593  float startFraction = -1.0f;
594  float endFraction = 1.0f;
[8490]595  bool  startsOut = false;
596  bool  endsOut = false;
[8081]597
[8796]598  // Vector inputStart = State::getCameraTargetNode()->getLastAbsCoor();
599  // Vector inputEnd   = State::getCameraTargetNode()->getAbsCoor();
[8081]600
601  for (int i = 0; i < curBrush->n_brushsides; i++) {
602    brushside& curBrushSide =   this->bspFile->brushSides[curBrush->brushside + i]   ;
603    plane& curPlane  =   this->bspFile->planes[curBrushSide.plane] ;
604
605    startDistance = inputStart.x * curPlane.x + inputStart.y * curPlane.y+ inputStart.z * curPlane.z - curPlane.d;
606    endDistance = inputEnd.x * curPlane.x +inputEnd.y * curPlane.y +inputEnd.z * curPlane.z -curPlane.d;
607
608    if (startDistance > 0)
609      startsOut = true;
610    if (endDistance > 0)
611      endsOut = true;
612
613    // make sure the trace isn't completely on one side of the brush
614    if (startDistance > 0 && endDistance > 0) {   // both are in front of the plane, its outside of this brush
615      return;
616    }
617    if (startDistance <= 0 && endDistance <= 0) {   // both are behind this plane, it will get clipped by another one
618      continue;
619    }
620
621    // MMM... BEEFY
622    if (startDistance > endDistance) {   // line is entering into the brush
623      float fraction = (startDistance - EPSILON) / (startDistance - endDistance);  // *
624      if (fraction > startFraction)
625        startFraction = fraction;
[8030]626      // store plane
627      this->collPlane = &curPlane;
[8087]628
[7833]629    } else {   // line is leaving the brush
[7563]630      float fraction = (startDistance + EPSILON) / (startDistance - endDistance);  // *
631      if (fraction < endFraction)
632        endFraction = fraction;
[8030]633      // store plane
634      this->collPlane = & curPlane;
[8087]635
[7563]636    }
[7833]637
[7563]638  }
[7833]639  if (startsOut == false) {
640    this->outputStartsOut = false;
641    if (endsOut == false)
642      this->outputAllSolid = true;
643    return;
644  }
[7563]645
[7833]646  if (startFraction < endFraction) {
647    if (startFraction > -1.0f && startFraction < outputFraction) {
[7563]648      if (startFraction < 0)
649        startFraction = 0;
[8087]650      this->outputFraction = startFraction;
[7563]651    }
652  }
[7833]653
[7563]654}
655
[8490]656void BspManager::checkBrushRayN(brush* curBrush, Vector& inputStart, Vector& inputEnd)
657{
658  float EPSILON = 0.000001;
659  float startDistance;
660  float endDistance;
[8081]661
[8490]662  float startFraction = -1.0f;
663  float endFraction = 1.0f;
664  bool  startsOut = false;
665  bool  endsOut = false;
666
667  //Vector inputStart = State::getCameraTargetNode()->getLastAbsCoor();
668  //Vector inputEnd   = State::getCameraTargetNode()->getAbsCoor();
669
670  for (int i = 0; i < curBrush->n_brushsides; i++) {
671    brushside& curBrushSide =   this->bspFile->brushSides[curBrush->brushside + i]   ;
672    plane& curPlane  =   this->bspFile->planes[curBrushSide.plane] ;
673
674    startDistance = inputStart.x * curPlane.x + inputStart.y * curPlane.y+ inputStart.z * curPlane.z - curPlane.d;
675    endDistance = inputEnd.x * curPlane.x +inputEnd.y * curPlane.y +inputEnd.z * curPlane.z -curPlane.d;
676
677    if (startDistance > 0)
678      startsOut = true;
679    if (endDistance > 0)
680      endsOut = true;
681
682    // make sure the trace isn't completely on one side of the brush
683    if (startDistance > 0 && endDistance > 0) {   // both are in front of the plane, its outside of this brush
684      return;
685    }
686    if (startDistance <= 0 && endDistance <= 0) {   // both are behind this plane, it will get clipped by another one
687      continue;
688    }
689
690    // MMM... BEEFY
691    if (startDistance > endDistance) {   // line is entering into the brush
692      float fraction = (startDistance - EPSILON) / (startDistance - endDistance);  // *
693      if (fraction > startFraction)
694        startFraction = fraction;
695      // store plane
696      this->collPlane = &curPlane;
697
698    } else {   // line is leaving the brush
699      float fraction = (startDistance + EPSILON) / (startDistance - endDistance);  // *
700      if (fraction < endFraction)
701        endFraction = fraction;
702      // store plane
703      this->collPlane = & curPlane;
704
705    }
706
707  }
708  if (startsOut == false) {
709    this->outputStartsOut = false;
710    if (endsOut == false)
711      this->outputAllSolid = true;
712    return;
713  }
714
715  if (startFraction < endFraction) {
716    if (startFraction > -1.0f && startFraction < outputFraction) {
717      if (startFraction < 0)
718        startFraction = 0;
719      this->outputFraction = startFraction;
720    }
721  }
722
723}
724
725
[7563]726void BspManager::checkCollisionRay(BspTreeNode* node, float startFraction, float endFraction, Vector* start, Vector* end)
727{
728
729
730  float EPSILON = 0.000001;
731  float  endDistance = (end)->x * (node->plane.x) +(end)->y * (node->plane.y) +(end)->z * (node->plane.z)  - node->d;
732  float  startDistance = (start)->x * (node->plane.x)+ (start)->y * (node->plane.y)+ (start)->z * (node->plane.z)- node->d;
733
734
735  if(node->isLeaf) {
736    leaf& curLeaf = this->bspFile->leaves[node->leafIndex];
737    for (int i = 0; i <  curLeaf.n_leafbrushes ; i++) {
738      brush& curBrush = this->bspFile->brushes[((int*)(this->bspFile->leafBrushes))[curLeaf.leafbrush_first+i]];
739      //object *brush = &BSP.brushes[BSP.leafBrushes[leaf->firstLeafBrush + i]];
740      if (curBrush.n_brushsides > 0   &&
[7833]741          ((((BspTexture*)(this->bspFile->textures))[curBrush.texture]).contents & 1))
742        // CheckBrush( brush );
743        this->checkBrushRay(&curBrush);
[7563]744      if(curBrush.n_brushsides <=0) this->outputAllSolid = true;
745    }
746    return;
747  }
748
749
750  if (startDistance >= 0 && endDistance >= 0)     // A
751  {   // both points are in front of the plane
752    // so check the front child
753    this->checkCollisionRay(node->left,0,0,start,end);
754  } else if (startDistance < 0 && endDistance < 0)  // B
755  {   // both points are behind the plane
756    // so check the back child
757    this->checkCollisionRay(node->right,0,0,start,end);
758  } else                                            // C
759  {   // the line spans the splitting plane
760    int side;
761    float fraction1, fraction2, middleFraction;
762    Vector middle;
763
764    // STEP 1: split the segment into two
765    if (startDistance < endDistance) {
766      side = 1; // back
767      float inverseDistance = 1.0f / (startDistance - endDistance);
768      fraction1 = (startDistance + EPSILON) * inverseDistance;
769      fraction2 = (startDistance + EPSILON) * inverseDistance;
770    } else if (endDistance < startDistance) {
[7833]771      side = 0; // front(start)->x * (node->plane.x)+
[7563]772      float inverseDistance = 1.0f / (startDistance - endDistance);
773      fraction1 = (startDistance + EPSILON) * inverseDistance;
774      fraction2 = (startDistance - EPSILON) * inverseDistance;
775    } else {
776      side = 0; // front
777      fraction1 = 1.0f;
778      fraction2 = 0.0f;
779    }
780
781    // STEP 2: make sure the numbers are valid
782    if (fraction1 < 0.0f) fraction1 = 0.0f;
783    else if (fraction1 > 1.0f) fraction1 = 1.0f;
784    if (fraction2 < 0.0f) fraction2 = 0.0f;
785    else if (fraction2 > 1.0f) fraction2 = 1.0f;
786
787    // STEP 3: calculate the middle point for the first side
788    middleFraction = startFraction +
789                     (endFraction - startFraction) * fraction1;
790
791    middle.x = start->x + fraction1 * (end->x - start->x);
792    middle.y = start->y + fraction1 * (end->y - start->y);
793    middle.z = start->z + fraction1 * (end->z - start->z);
794
795    // STEP 4: check the first side
796    //CheckNode( node->children[side], startFraction, middleFraction, start, middle );
797    if(side == 0) this->checkCollisionRay(node->left,startFraction, middleFraction, start, &middle );
798
799    else this->checkCollisionRay(node->right,startFraction, middleFraction,
800                                   start, &middle );
801
802    // STEP 5: calculate the middle point for the second side
803    middleFraction = startFraction +
804                     (endFraction - startFraction) * fraction2;
805
806    middle.x = start->x + fraction2 * (end->x - start->x);
807    middle.y = start->y + fraction2 * (end->y - start->y);
808    middle.z = start->z + fraction2 * (end->z - start->z);
809
810    // STEP 6: check the second side
811    if(side == 1)this->checkCollisionRay(node->left,middleFraction, endFraction, &middle, end);
812
813    else this->checkCollisionRay(node->right,middleFraction, endFraction,&middle, end );
814
815
816  }
817
818}
[7833]819
820
[8081]821
822void BspManager::checkCollisionRayN(BspTreeNode* node, float startFraction, float endFraction, Vector* start, Vector* end)
823{
824
825
826  float EPSILON = 0.000001;
827
[8490]828  float endDistance = end->dot(node->plane) - node->d;
829  float startDistance = start->dot(node->plane) - node->d;
[8081]830
[8490]831
832  if( node->isLeaf) {
[8081]833    leaf& curLeaf = this->bspFile->leaves[node->leafIndex];
834    for (int i = 0; i <  curLeaf.n_leafbrushes ; i++) {
835      brush& curBrush = this->bspFile->brushes[((int*)(this->bspFile->leafBrushes))[curLeaf.leafbrush_first+i]];
836      //object *brush = &BSP.brushes[BSP.leafBrushes[leaf->firstLeafBrush + i]];
837      if (curBrush.n_brushsides > 0   &&
838          ((((BspTexture*)(this->bspFile->textures))[curBrush.texture]).contents & 1))
839        // CheckBrush( brush );
840        this->checkBrushRayN(&curBrush);
841      if(curBrush.n_brushsides <=0) this->outputAllSolid = true;
[8796]842    }
843
[8081]844    return;
845  }
846
847
848  if (startDistance >= 0 && endDistance >= 0)     // A
849  {   // both points are in front of the plane
850    // so check the front child
851    this->checkCollisionRayN(node->left,0,0,start,end);
852  } else if (startDistance < 0 && endDistance < 0)  // B
853  {   // both points are behind the plane
854    // so check the back child
855    this->checkCollisionRayN(node->right,0,0,start,end);
856  } else                                            // C
857  {   // the line spans the splitting plane
858    int side;
859    float fraction1, fraction2, middleFraction;
860    Vector middle;
861
862    // STEP 1: split the segment into two
863    if (startDistance < endDistance) {
864      side = 1; // back
865      float inverseDistance = 1.0f / (startDistance - endDistance);
866      fraction1 = (startDistance + EPSILON) * inverseDistance;
867      fraction2 = (startDistance + EPSILON) * inverseDistance;
868    } else if (endDistance < startDistance) {
869      side = 0; // front(start)->x * (node->plane.x)+
870      float inverseDistance = 1.0f / (startDistance - endDistance);
871      fraction1 = (startDistance + EPSILON) * inverseDistance;
872      fraction2 = (startDistance - EPSILON) * inverseDistance;
873    } else {
874      side = 0; // front
875      fraction1 = 1.0f;
876      fraction2 = 0.0f;
877    }
878
879    // STEP 2: make sure the numbers are valid
880    if (fraction1 < 0.0f) fraction1 = 0.0f;
881    else if (fraction1 > 1.0f) fraction1 = 1.0f;
882    if (fraction2 < 0.0f) fraction2 = 0.0f;
883    else if (fraction2 > 1.0f) fraction2 = 1.0f;
884
885    // STEP 3: calculate the middle point for the first side
[8490]886    middleFraction = startFraction + (endFraction - startFraction) * fraction1;
887    middle = (*start) + ((*end) - (*start)) * fraction1;
[8081]888
889
890    // STEP 4: check the first side
891    //CheckNode( node->children[side], startFraction, middleFraction, start, middle );
892    if(side == 0) this->checkCollisionRayN(node->left,startFraction, middleFraction, start, &middle );
893
894    else this->checkCollisionRayN(node->right,startFraction, middleFraction,
[8490]895                                    start, &middle );
[8081]896
897    // STEP 5: calculate the middle point for the second side
[8490]898    middleFraction = startFraction + (endFraction - startFraction) * fraction2;
899    middle = (*start) + ((*end) - (*start)) * fraction2;
[8081]900
901    // STEP 6: check the second side
902    if(side == 1)this->checkCollisionRayN(node->left,middleFraction, endFraction, &middle, end);
903
904    else this->checkCollisionRayN(node->right,middleFraction, endFraction,&middle, end );
905
906
907  }
908
909}
[8724]910
911float BspManager::checkPatchAltitude(BspTreeNode* node)
912{
913  leaf& curLeaf = this->bspFile->leaves[node->leafIndex];
[8796]914  for(int i = 0; i < curLeaf.n_leaffaces ; i++) {
[8724]915  }
916  return 10.0f;
917}
918
[8490]919void BspManager::checkCollisionBox(void)
920{
[8796]921}
922;
[8081]923
[8490]924void BspManager::TraceBox( Vector& inputStart, Vector& inputEnd,
[8796]925                           Vector& inputMins, Vector& inputMaxs )
[8490]926{
927  if (inputMins.x == 0 && inputMins.y == 0 && inputMins.z == 0 &&
[8796]928      inputMaxs.x == 0 && inputMaxs.y == 0 && inputMaxs.z == 0) {   // the user called TraceBox, but this is actually a ray
929    //!> FIXME TraceRay( inputStart, inputEnd );
930  } else {   // setup for a box
[8490]931    //traceType = TT_BOX;
932    this->traceMins = inputMins;
933    this->traceMaxs = inputMaxs;
934    this->traceExtents.x = -traceMins.x > traceMaxs.x ?
[8796]935                           -traceMins.x : traceMaxs.x;
[8490]936    this->traceExtents.y = -traceMins.y > traceMaxs.y ?
[8796]937                           -traceMins.y : traceMaxs.y;
[8490]938    this->traceExtents.z = -traceMins.z > traceMaxs.z ?
[8796]939                           -traceMins.z : traceMaxs.z;
940    //!> FIXME Trace( inputStart, inputEnd );
[8490]941  }
942}
943
[7833]944void BspManager::checkCollision(WorldEntity* worldEntity)
945{
[8724]946
[8796]947  // Init  Collision Detection
[8490]948  this->outputStartsOut = true;
949  this->outputAllSolid = false;
950  this->outputFraction = 1.0f;
[7833]951
[8796]952  // Retrieve Bounding box
953  AABB* box = worldEntity->getModelAABB();
[7833]954
[8724]955
[7833]956  Vector forwardDir = worldEntity->getAbsDirX();
[8087]957
[8724]958
[7833]959  Vector upDir = worldEntity->getAbsDirY();
[8490]960  upDir.x = 0.0;
961  upDir.y = 1.0;
962  upDir.z = 0.0;
963  Vector dest;
[8796]964
[8864]965
[8796]966  Vector position = worldEntity->getAbsCoor();       //+ upDir*10.0f ;
[8724]967  dest = worldEntity->getAbsCoor() - upDir*40.0f; //
[8490]968  Vector out = dest;
[8087]969
970
[8490]971  bool collision = false;
[8796]972  Vector position1 = position;
[8724]973  Vector position2 = position + Vector(0.0,1.0,0.0);
974  Vector dest1 = position + forwardDir*4.0f;
[8490]975  Vector dest2 = position2 + forwardDir;
976  dest = position - Vector(0.0, 40.0,0.0);
977  Vector out1;
978  Vector out2;
[7833]979
980
[8864]981
[8490]982  float height = 40;
[8864]983
984
[8796]985  if( box != NULL)
986  {
987    position = worldEntity->getAbsCoor() +  box->center; // + box->axis[1] * box->halfLength[1];
988    dest     = worldEntity->getAbsCoor() +  box->center - box->axis[1] * box->halfLength[1] * 40.0;
[8864]989
[8796]990    position1 = worldEntity->getAbsCoor() +  box->center + box->axis[0] * box->halfLength[0] * 2.0f;
991    dest1     = worldEntity->getAbsCoor() +  box->center - box->axis[0] * box->halfLength[0] *2.0f;
[8864]992
993
[8796]994    position2 = worldEntity->getAbsCoor() +  box->center + box->axis[2] * box->halfLength[2] * 2.0f;
995    dest2     = worldEntity->getAbsCoor() +  box->center - box->axis[2] * box->halfLength[2] * 2.0f;
[8864]996
[8796]997  }
998  else
999  {
[8864]1000
[8796]1001  }
[8724]1002
[8864]1003
1004
[8796]1005  //
[8490]1006  this->inputStart =  position;
1007  this->inputEnd =   dest;
1008  this->checkCollisionRayN(this->root,0.0f,1.0f, &position, &dest );
1009
[8724]1010
[8796]1011  //
1012  if(!this->outputStartsOut ) {
[8724]1013    this->collPlane = new plane;
1014    this->collPlane->x = 0.0f;
1015    this->collPlane->y = 0.0f;
1016    this->collPlane->z = 0.0f;
1017    collision = true;
[8796]1018  } else {
[8724]1019
[8796]1020    if( this->outputFraction == 1.0f) {
1021      if(this->outputAllSolid ) {
1022        this->collPlane = new plane;
1023        this->collPlane->x = 0.0f;
1024        this->collPlane->y = 0.0f;
1025        this->collPlane->z = 0.0f;
1026        collision = true;
[8864]1027      } else
[8796]1028        collision = false;
[8864]1029
1030
[8796]1031        out = dest;
[8864]1032
[8796]1033    } else {
1034      collision = true;
1035      out.x = position.x + (dest.x -position.x) * this->outputFraction;
1036      out.y = position.y + (dest.y -position.y) * this->outputFraction;
1037      out.z = position.z + (dest.z -position.z) * this->outputFraction;
[8724]1038
[8796]1039      Vector out3 = out + Vector(height*this->collPlane->x,height*this->collPlane->y,height*this->collPlane->z);
1040      this->out = out;
[7833]1041    }
[8087]1042
[8490]1043
1044  }
1045
[8796]1046  plane* testPlane = this->collPlane;
[8087]1047
[8864]1048
[8796]1049  // 2nd Collision Detection
[8724]1050  this->outputStartsOut = true;
1051  this->outputAllSolid = false;
1052  this->outputFraction = 1.0f;
[8796]1053  this->inputStart =  position1;
[8724]1054  this->inputEnd =   dest1;
[8796]1055  this->checkCollisionRayN(this->root,0.0f,1.0f, &position1, &dest1 );
[8724]1056  out.x = this->outputFraction;
[8796]1057  //out.z = this->outputFraction;
[8864]1058
1059
[8796]1060    // 3rd Collision Detection
1061  this->outputStartsOut = true;
1062  this->outputAllSolid = false;
1063  this->outputFraction = 1.0f;
1064  this->inputStart =  position2;
1065  this->inputEnd =   dest2;
1066  this->checkCollisionRayN(this->root,0.0f,1.0f, &position2, &dest2 );
1067  //out.x = this->outputFraction;
[8724]1068  out.z = this->outputFraction;
[8796]1069
[8864]1070
[8724]1071  /*
[8796]1072  This is how you would calculate the Coordinates where worldEntity Collided with the BSP world.
[8724]1073  out.x = position1.x + (dest.x -position1.x) * this->outputFraction;
1074  out.z = position1.z + (dest.z -position1.z) * this->outputFraction;
1075  */
[8796]1076
1077
[8490]1078  // Return the normal here: Normal's stored in this->collPlane;
[8864]1079  if( collision)
[8796]1080  {
[8724]1081    PRINTF(5)("We got a collision!! Are you sure: outputFraction = %f\n", this->outputFraction);
[8864]1082    worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y, this->parent, worldEntity, Vector(testPlane->x, testPlane->y, testPlane->z), out);
1083  }
1084  else  worldEntity->registerCollision(COLLISION_TYPE_AXIS_Y, this->parent, worldEntity, Vector(0.0, 2.0, 0.0), dest);
[7833]1085
1086}
1087
[8490]1088
[7353]1089void  BspManager::checkCollision(BspTreeNode* node, Vector* cam)
1090{
[7563]1091  Vector next = this->cam;
1092  next.x =   (State::getCameraTargetNode()->getLastAbsCoor()).x ;
1093  next.y =   (State::getCameraTargetNode()->getLastAbsCoor()).y ;
1094  next.z =   (State::getCameraTargetNode()->getLastAbsCoor()).z ;
1095
[7395]1096  float dist = 0;
1097  if(!(node->isLeaf)) {
1098    dist = (node->plane.x * this->cam.x + node->plane.y*this->cam.y + node->plane.z*this->cam.z) - node->d;
1099    if(dist > 4.0f) {
1100      checkCollision(node->left,cam);
1101      return;
1102    }
1103    if(dist < -4.0f) {
1104      checkCollision(node->right,cam);
1105      return;
1106    }
1107    if(dist<=4.0f && dist >= -4.0f) {
1108      checkCollision(node->left,cam);
1109      checkCollision(node->right,cam);
1110      return;
1111    }
1112    return;
1113  } else {
[7353]1114
[7395]1115    leaf& camLeaf =  ((leaf *)(this->bspFile->leaves))[(node->leafIndex ) ];
[7353]1116
[7579]1117    if (camLeaf.cluster < 0) {
[7833]1118      this->drawDebugCube(&this->cam);
1119      this->drawDebugCube(&next);
[8796]1120      // State::getPlayer()->getPlayable()->setRelCoor(-100,-100,-100);
[8490]1121      //State::getPlayer()->getPlayable()->collidesWith(NULL, State::getCameraTargetNode()->getLastAbsCoor());
[7833]1122    }
[7395]1123
1124
1125    /*
[8087]1126        for(int i = 0; i < camLeaf.n_leafbrushes && i < 10; i++ )
1127        {
1128                brush& curBrush = ((brush*)(this->bspFile->brushes))[(camLeaf.leafbrush_first +i)%this->bspFile->numLeafBrushes];
1129                if(curBrush.n_brushsides < 0) return;
1130                for(int j = 0; j < curBrush.n_brushsides; j++)
1131                {
1132                float dist = -0.1;
1133                brushside& curBrushSide = ((brushside*)(this->bspFile->brushSides))[(curBrush.brushside +j)%this->bspFile->numBrushSides];
1134                plane&      testPlane = ((plane*)(this->bspFile->planes))[curBrushSide.plane % this->bspFile->numPlanes];
1135                dist = testPlane.x * this->cam.x +  testPlane.y * this->cam.y  +  testPlane.z * this->cam.z   -testPlane.d ;
[7395]1136
[8087]1137                if(dist < -0.01f) dist = -1.0f *dist;
1138                if(dist < 1.0f){
1139                                this->drawDebugCube(&this->cam);
1140                                return;
1141                              }
1142                }
1143
1144        } */
1145
[7395]1146  }
1147  return;
[7353]1148}
1149
1150void BspManager::drawDebugCube(Vector* cam)
1151{
[7395]1152  glBegin(GL_QUADS);
[7353]1153
[7395]1154  // Bottom Face.  Red, 75% opaque, magnified texture
[7353]1155
[7395]1156  glNormal3f( 0.0f, -1.0f, 0.0f); // Needed for lighting
1157  glColor4f(0.9,0.2,0.2,.75); // Basic polygon color
[7353]1158
[7395]1159  glTexCoord2f(0.800f, 0.800f); glVertex3f(cam->x-1.0f, cam->y-1.0f,cam->z -1.0f);
1160  glTexCoord2f(0.200f, 0.800f); glVertex3f(cam->x+1.0f, cam->y-1.0f,cam->z -1.0f);
1161  glTexCoord2f(0.200f, 0.200f); glVertex3f(cam->x+ 1.0f,cam->y -1.0f,cam->z +  1.0f);
1162  glTexCoord2f(0.800f, 0.200f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z + 1.0f);
[7353]1163
1164
[7395]1165  // Top face; offset.  White, 50% opaque.
[7353]1166
[7395]1167  glNormal3f( 0.0f, 1.0f, 0.0f);  glColor4f(0.5,0.5,0.5,.5);
[7353]1168
[7395]1169  glTexCoord2f(0.005f, 1.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.0f);
1170  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
1171  glTexCoord2f(1.995f, 0.005f); glVertex3f(cam->x+ 1.0f,  cam->y+1.0f,  cam->z +1.0f);
1172  glTexCoord2f(1.995f, 1.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z -1.0f);
[7353]1173
1174
[7395]1175  // Far face.  Green, 50% opaque, non-uniform texture cooridinates.
[7353]1176
[7395]1177  glNormal3f( 0.0f, 0.0f,-1.0f);  glColor4f(0.2,0.9,0.2,.5);
[7353]1178
[7395]1179  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z -1.3f);
1180  glTexCoord2f(2.995f, 2.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.3f);
1181  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x+ 1.0f,cam->y+  1.0f, cam->z -1.3f);
1182  glTexCoord2f(0.005f, 0.005f); glVertex3f( cam->x+1.0f,cam->y -1.0f, cam->z -1.3f);
[7353]1183
1184
[7395]1185  // Right face.  Blue; 25% opaque
[7353]1186
[7395]1187  glNormal3f( 1.0f, 0.0f, 0.0f);  glColor4f(0.2,0.2,0.9,.25);
[7353]1188
[7465]1189  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y -1.0f, cam->z -1.0f);
[7395]1190  glTexCoord2f(0.995f, 0.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z -1.0f);
1191  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z + 1.0f);
1192  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y-1.0f,  cam->z +1.0f);
[7353]1193
1194
[7395]1195  // Front face; offset.  Multi-colored, 50% opaque.
[7353]1196
[7395]1197  glNormal3f( 0.0f, 0.0f, 1.0f);
[7353]1198
[7395]1199  glColor4f( 0.9f, 0.2f, 0.2f, 0.5f);
1200  glTexCoord2f( 0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f,  cam->z +1.0f);
1201  glColor4f( 0.2f, 0.9f, 0.2f, 0.5f);
1202  glTexCoord2f( 0.995f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y-1.0f,  cam->z +1.0f);
1203  glColor4f( 0.2f, 0.2f, 0.9f, 0.5f);
1204  glTexCoord2f( 0.995f, 0.995f); glVertex3f( cam->x+1.0f,  cam->y+1.0f,  cam->z +1.0f);
1205  glColor4f( 0.1f, 0.1f, 0.1f, 0.5f);
1206  glTexCoord2f( 0.005f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
1207
1208
1209  // Left Face; offset.  Yellow, varying levels of opaque.
1210
1211  glNormal3f(-1.0f, 0.0f, 0.0f);
1212
1213  glColor4f(0.9,0.9,0.2,0.0);
1214  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z -1.0f);
1215  glColor4f(0.9,0.9,0.2,0.66);
1216  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x-1.0f,cam->y -1.0f,  cam->z +1.0f);
1217  glColor4f(0.9,0.9,0.2,1.0);
1218  glTexCoord2f(0.995f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
1219  glColor4f(0.9,0.9,0.2,0.33);
1220  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.0f);
1221
1222  glEnd();
[7385]1223}
[7353]1224
[7385]1225void BspManager::addFace(int f)
1226{
[7395]1227  face& curFace =  ((face *)(this->bspFile->faces))[f];
1228  if(this->bspFile->Materials[curFace.texture].alpha) this->trasparent.push_back(f);
1229  else this->opal.push_back(f);
1230}
Note: See TracBrowser for help on using the repository browser.