Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/bsp_model/src/lib/graphics/importer/bsp_manager.cc @ 7510

Last change on this file since 7510 was 7510, checked in by bensch, 18 years ago

orxonox/bsp_model: Material should support multiple Textures now

File size: 15.8 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2006 orx
5
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.
10
11   ### File Specific:
12   main-programmer: bottac@ee.ethz.ch
13*/
14
15
16#include "vector.h"
17#include "bsp_file.h"
18#include "bsp_manager.h"
19#include "bsp_tree_leaf.h"
20#include "p_node.h"
21#include "state.h"
22#include "debug.h"
23#include "material.h"
24#include "camera.h"
25#include "vertex_array_model.h"
26
27// STL Containers
28#include <vector>
29#include <deque>
30
31
32
33
34BspManager::BspManager()
35{
36  // open a BSP file
37  this->bspFile = new BspFile();
38  this->bspFile->read("/root/data/Kanti175.bsp");
39  this->bspFile->build_tree();
40  this->root  = this->bspFile->get_root();
41  this->alreadyVisible = new bool [this->bspFile->numFaces];
42}
43
44void BspManager::draw()
45{
46
47
48
49
50
51  // Draw Debug Terrain
52  /*
53  this->bspFile->Materials[0]->select();
54  for(int i = 0; i <  this->bspFile->numPatches ; i++)
55        {
56                this->bspFile->VertexArrayModels[i]->draw();
57
58        }
59  */
60
61
62
63  // erase alreadyVisible
64  for(int i = 0; i < this->bspFile->numFaces; i++) this->alreadyVisible[i] = false;
65  float tmp = 0;
66  this->opal.clear();
67  this->trasparent.clear();
68  // Find all visible faces...
69
70  this->cam = State::getCamera()->getAbsCoor() ;
71  this->ship = State::getCameraTargetNode()->getAbsCoor();
72
73
74
75
76  this->cam = State::getCameraTargetNode()->getAbsCoor();
77  this->viewDir=    State::getCameraTarget()->getAbsCoor() -  State::getCamera()->getAbsCoor() ;
78  float d = (cam.x*viewDir.x + cam.y*viewDir.y + cam.z * viewDir.z);
79
80  BspTreeNode*  ActLeaf = this->getLeaf(this->bspFile->root, &ship);
81  int viscluster = -1;
82  viscluster =((leaf*)(this->bspFile->leaves))[ ActLeaf->leafIndex].cluster; // get the players cluster (viscluster)
83
84
85
86
87  this->checkCollision(this->root, &this->cam);   //!< Test Collision Detection
88
89  if (true /*(((int *)(this->bspFile->header))[35] == 0 )  || viscluster < 0*/)  //!< if (sizeof(Visdata) == 0)
90  {
91    /** Do Frustum culling and draw 'em all **/
92
93    // Iterate through all Leafspublic final double readLEDouble()
94    for(int i = 0; i <  this->bspFile->numLeafs   ; i++ )
95    {
96      // cluster =  (this->bspFile->leaves)[i].cluster;
97      leaf& curLeaf = (this->bspFile->leaves)[i];
98
99
100      // Iterate through all faces
101      for (int j = 0; j < curLeaf.n_leaffaces ; ++j) {
102        const int f = ( j +  ((leaf *) (this->bspFile->leaves))[i].leafface) % this->bspFile->numFaces;
103        if (f >=0 && !this->isAlreadyVisible(f)) {
104          this->alreadyVisible[f] = true;
105          /*    if(ActLeaf->leafIndex == i)public final double readLEDouble()
106                {
107                        this->alreadyVisible[i] = false;
108                        this->draw_debug_face(f);
109                        this->alreadyVisible[i] = true;
110                }
111                else */
112          addFace(f); // "visibleFaces.append(f)"
113        }
114      }
115
116
117
118
119    } //for
120  } else {
121    int cluster;
122    int seven = 7;
123    unsigned char  one = 1;
124    unsigned int v;
125    unsigned char  visSet;
126
127    // Iterate through all Leafs
128
129    for(int i = 0; i <  this->bspFile->numLeafs   ; ++i ) {
130      leaf& camLeaf =  (this->bspFile->leaves)[ActLeaf->leafIndex] ;
131      leaf& curLeaf =  (this->bspFile->leaves)[i] ;
132      cluster =  curLeaf.cluster;
133
134      if(cluster <0) continue;
135      v = ((viscluster *  ( ((int *)this->bspFile->visData)[1]) ) + (cluster / 8));
136      visSet =((unsigned char*) (this->bspFile->visData))[v+8];
137
138
139      if( ((visSet) & ((unsigned char)1 <<(unsigned char) (cluster &  7))) == 0 )
140      {
141        // Iterate through all faces
142        for (int j = 0; j < curLeaf.n_leaffaces ; ++j)
143        {
144          const int f = (j +  curLeaf.leafface) % this->bspFile->numFaces;
145
146
147          if (!this->isAlreadyVisible(f) && f>=0) {
148            this->addFace(f);
149            this->alreadyVisible[f] = true;
150          }
151
152        }
153
154    }// if
155
156    }//for
157
158  }//else
159
160  while(!this->opal.empty()) {
161    this->draw_face(this->opal.front());
162    this->opal.pop_front();
163  }
164  while(!this->trasparent.empty()) {
165    this->draw_face(this->trasparent.back());
166    this->trasparent.pop_back();
167  }
168
169
170}//draw
171
172void BspManager::draw_leaf()
173{}
174
175void BspManager::draw_face(int curface)
176{
177  face& curFace =  (this->bspFile->faces)[curface];
178  const BspVertex* curVertex = (BspVertex *) this->bspFile->vertice;
179  int stride = sizeof(BspVertex);  // sizeof(Vertex)
180  int offset    = curFace.vertex;
181
182  // PRINTF(0)("BSP Manager: ");
183  // PRINTF(0)("BSP Manager: type: %i  \n", curFace.texture);
184
185  //  if(  curFace.texture < 0 ) return;
186  if(curFace.type == 2) {
187    this->draw_patch( &curFace);
188    return;
189  }
190  if(curFace.type == 3) return;
191  // if(this->bspFile->Materials[curFace.texture] != NULL)
192  //if(this->lastTex != curFace.texture) {
193    this->bspFile->Materials[curFace.texture].mat->select();
194  //   this->lastTex = curFace.texture;
195  //}
196
197    if(curFace.lm_index < 0)
198    {
199      glActiveTextureARB(GL_TEXTURE1_ARB);
200      glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[this->bspFile->whiteLightMap]);
201      glEnable(GL_TEXTURE_2D);
202    }
203    else
204    {
205    glActiveTextureARB(GL_TEXTURE1_ARB);
206    glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[curFace.lm_index]);
207    glEnable(GL_TEXTURE_2D);
208    }
209
210    glColor4f(3.0,3.0,3.0,0.9);
211  glEnableClientState(GL_VERTEX_ARRAY );
212  //glEnableClientState(GL_TEXTURE_COORD_ARRAY );
213  glEnableClientState(GL_NORMAL_ARRAY );
214  //  glEnableClientState(GL_COLOR_ARRAY);
215
216
217  glVertexPointer(3, GL_FLOAT, stride, &(curVertex[offset].position[0]));
218
219  glClientActiveTextureARB(GL_TEXTURE0_ARB);
220  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[0]));
221  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
222
223  glClientActiveTextureARB(GL_TEXTURE1_ARB);
224  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[1]));
225  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
226
227
228  glNormalPointer( GL_FLOAT, stride, &(curVertex[offset].normal[0]));
229  // glColorPointer(4, GL_BYTE, stride, &(curVertex[offset].color[0]));
230  glDrawElements(GL_TRIANGLES, curFace.n_meshverts,
231                 GL_UNSIGNED_INT, &(((meshvert *)this->bspFile->meshverts) [curFace.meshvert]));
232
233  glDisableClientState(GL_TEXTURE0_ARB);
234  glDisableClientState(GL_TEXTURE1_ARB);
235  glDisableClientState(GL_VERTEX_ARRAY );
236  //glDisableClientState(GL_TEXTURE_COORD_ARRAY );
237  glDisableClientState(GL_NORMAL_ARRAY );
238  // glDisableClientState(GL_COLOR_ARRAY);
239
240}
241
242
243void BspManager::draw_debug_face(int curface)
244{
245  face& curFace =  (this->bspFile->faces)[curface];
246  const BspVertex* curVertex = (BspVertex *) this->bspFile->vertice;
247  int stride = 44;  // sizeof(Vertex)
248  int offset    = curFace.vertex;
249
250  // PRINTF(0)("BSP Manager: ");
251  // PRINTF(0)("BSP Manager: type: %i  \n", curFace.texture);
252
253  //  if(  curFace.texture < 0 ) return;
254  if(curFace.type == 2) {
255    this->draw_patch( &curFace);
256    return;
257  }
258  if(curFace.type == 3) return;
259  // if(this->bspFile->Materials[curFace.texture] != NULL)
260
261  this->bspFile->Materials[2].mat->select();
262  this->lastTex = 2;
263
264  glEnableClientState(GL_VERTEX_ARRAY );
265  glEnableClientState(GL_TEXTURE_COORD_ARRAY );
266  glEnableClientState(GL_NORMAL_ARRAY );
267  //glEnableClientState(GL_COLOR_ARRAY);
268  // glEnableClientState(GL_VERTEX_ARRAY );
269  glClientActiveTextureARB(GL_TEXTURE0_ARB);
270  glVertexPointer(3, GL_FLOAT, stride, &(curVertex[offset].position[0]));
271  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
272  // glClientActiveTextureARB(GL_TEXTURE0_ARB);
273  glClientActiveTextureARB(GL_TEXTURE1_ARB);
274  glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[0]));
275  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
276  // glClientActiveTextureARB(GL_TEXTURE1_ARB);
277  // glTexCoordPointer(2, GL_FLOAT, stride, &(curVertex[offset].texcoord[1]));
278  //glEnableClientState(GL_NORMAL_ARRAY );
279
280  glNormalPointer( GL_FLOAT, stride, &(curVertex[offset].normal[0]));
281  //  glColorPointer(4, GL_BYTE, stride, &(curVertex[offset].color[0]));
282  glDrawElements(GL_TRIANGLES, curFace.n_meshverts,
283                 GL_UNSIGNED_INT, &(((meshvert *)this->bspFile->meshverts) [curFace.meshvert]));
284
285}
286
287void BspManager::draw_patch(face* Face)
288{
289  if(this->lastTex != Face->texture) {
290    this->bspFile->Materials[Face->texture].mat->select();
291    this->lastTex = Face->texture;
292  }
293
294
295
296  if(Face->lm_index < 0)
297  {
298    glActiveTextureARB(GL_TEXTURE1_ARB);
299    glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[this->bspFile->whiteLightMap]);
300    glEnable(GL_TEXTURE_2D);
301  }
302  else
303  {
304    glActiveTextureARB(GL_TEXTURE1_ARB);
305    glBindTexture(GL_TEXTURE_2D, this->bspFile->glLightMapTextures[Face->lm_index]);
306    glEnable(GL_TEXTURE_2D);
307}
308    glColor4f(3.0,3.0,3.0,0.9);
309
310  glEnable( GL_AUTO_NORMAL);
311  glEnableClientState(GL_VERTEX_ARRAY );
312  glEnableClientState(GL_TEXTURE_COORD_ARRAY );
313  for(int i = 0; i < Face->n_meshverts  ; i++) {
314    glFrontFace(GL_CW);
315    //PRINTF(0)("BSP Manager: Face->size[0]: %i . \n", Face->size[0]);
316
317
318    glEnableClientState(GL_NORMAL_ARRAY );
319
320    glVertexPointer(3, GL_FLOAT,44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).position[0]));
321
322
323    glClientActiveTextureARB(GL_TEXTURE0_ARB);
324    glTexCoordPointer(2, GL_FLOAT, 44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).texcoord[0][0]));
325    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
326
327
328    glClientActiveTextureARB(GL_TEXTURE1_ARB);
329    glTexCoordPointer(2, GL_FLOAT, 44, &((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).texcoord[1][0]));
330    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
331
332
333    glNormalPointer( GL_FLOAT, 44,&((((BspVertex*)(this->bspFile->patchVertice))[8*8*(Face->meshvert+i)]).normal[0]) );
334
335    // We'll need multitexture suport for lightning
336    //glClientActiveTextureARB(GL_TEXTURE0_ARB);
337    //glTexCoordPointer(2, GL_FLOAT,0, &vertex[0].textureCoord);
338    //glClientActiveTextureARB(GL_TEXTURE1_ARB);
339    //glTexCoordPointer(2, GL_FLOAT, sizeof(BSPVertex), &vertex[0].lightmapCoord);
340
341
342    for(int row=0; row<7; ++row) {
343      glDrawElements(GL_TRIANGLE_STRIP, 2*(8), GL_UNSIGNED_INT,
344                     & (     (((GLuint*)  (this->bspFile->patchIndexes))[7*8*2*(Face->meshvert+i)+ row*2*8]  ))  );
345    }
346
347    glFrontFace(GL_CCW);
348  }
349  glDisableClientState(GL_TEXTURE0_ARB);
350  glDisableClientState(GL_TEXTURE1_ARB);
351  glDisable(GL_AUTO_NORMAL);
352  glDisableClientState(GL_VERTEX_ARRAY );
353  glDisableClientState(GL_TEXTURE_COORD_ARRAY );
354
355  glBegin(GL_QUADS);
356
357  glEnd();
358}
359
360bool BspManager::isAlreadyVisible(int Face)
361{
362  return this->alreadyVisible[Face];
363}
364
365
366BspTreeNode*  BspManager::getLeaf(BspTreeNode* node, Vector* cam)
367{
368  float dist = 0;
369  while(!(node->isLeaf)) {
370    dist = (node->plane.x * this->cam.x + node->plane.y*this->cam.y + node->plane.z*this->cam.z) - node->d;
371    if(dist >= 0.0f) {
372      node = node->left;
373    } else {
374      node = node->right;
375
376    }
377  }
378  return  node;
379}
380
381void  BspManager::checkCollision(BspTreeNode* node, Vector* cam)
382{
383  float dist = 0;
384  if(!(node->isLeaf)) {
385    dist = (node->plane.x * this->cam.x + node->plane.y*this->cam.y + node->plane.z*this->cam.z) - node->d;
386    if(dist > 4.0f) {
387      checkCollision(node->left,cam);
388      return;
389    }
390    if(dist < -4.0f) {
391      checkCollision(node->right,cam);
392      return;
393    }
394    if(dist<=4.0f && dist >= -4.0f) {
395      checkCollision(node->left,cam);
396      checkCollision(node->right,cam);
397      return;
398    }
399    return;
400  } else {
401
402    leaf& camLeaf =  ((leaf *)(this->bspFile->leaves))[(node->leafIndex ) ];
403
404    if (camLeaf.cluster < 0) {this->drawDebugCube(&this->cam);}
405
406
407    /*
408        for(int i = 0; i < camLeaf.n_leafbrushes && i < 10; i++ )
409        {
410                brush& curBrush = ((brush*)(this->bspFile->brushes))[(camLeaf.leafbrush_first +i)%this->bspFile->numLeafBrushes];
411                if(curBrush.n_brushsides < 0) return;
412                for(int j = 0; j < curBrush.n_brushsides; j++)
413                {
414                float dist = -0.1;
415                brushside& curBrushSide = ((brushside*)(this->bspFile->brushSides))[(curBrush.brushside +j)%this->bspFile->numBrushSides];
416                plane&      testPlane = ((plane*)(this->bspFile->planes))[curBrushSide.plane % this->bspFile->numPlanes];
417                dist = testPlane.x * this->cam.x +  testPlane.y * this->cam.y  +  testPlane.z * this->cam.z   -testPlane.d ;
418
419                if(dist < -0.01f) dist = -1.0f *dist;
420                if(dist < 1.0f){
421                                this->drawDebugCube(&this->cam);
422                                return;
423                              }
424                }
425
426        } */
427
428  }
429  return;
430}
431
432void BspManager::drawDebugCube(Vector* cam)
433{
434  glBegin(GL_QUADS);
435
436  // Bottom Face.  Red, 75% opaque, magnified texture
437
438  glNormal3f( 0.0f, -1.0f, 0.0f); // Needed for lighting
439  glColor4f(0.9,0.2,0.2,.75); // Basic polygon color
440
441  glTexCoord2f(0.800f, 0.800f); glVertex3f(cam->x-1.0f, cam->y-1.0f,cam->z -1.0f);
442  glTexCoord2f(0.200f, 0.800f); glVertex3f(cam->x+1.0f, cam->y-1.0f,cam->z -1.0f);
443  glTexCoord2f(0.200f, 0.200f); glVertex3f(cam->x+ 1.0f,cam->y -1.0f,cam->z +  1.0f);
444  glTexCoord2f(0.800f, 0.200f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z + 1.0f);
445
446
447  // Top face; offset.  White, 50% opaque.
448
449  glNormal3f( 0.0f, 1.0f, 0.0f);  glColor4f(0.5,0.5,0.5,.5);
450
451  glTexCoord2f(0.005f, 1.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.0f);
452  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
453  glTexCoord2f(1.995f, 0.005f); glVertex3f(cam->x+ 1.0f,  cam->y+1.0f,  cam->z +1.0f);
454  glTexCoord2f(1.995f, 1.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z -1.0f);
455
456
457  // Far face.  Green, 50% opaque, non-uniform texture cooridinates.
458
459  glNormal3f( 0.0f, 0.0f,-1.0f);  glColor4f(0.2,0.9,0.2,.5);
460
461  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z -1.3f);
462  glTexCoord2f(2.995f, 2.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.3f);
463  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x+ 1.0f,cam->y+  1.0f, cam->z -1.3f);
464  glTexCoord2f(0.005f, 0.005f); glVertex3f( cam->x+1.0f,cam->y -1.0f, cam->z -1.3f);
465
466
467  // Right face.  Blue; 25% opaque
468
469  glNormal3f( 1.0f, 0.0f, 0.0f);  glColor4f(0.2,0.2,0.9,.25);
470
471  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y -1.0f, cam->z -1.0f);
472  glTexCoord2f(0.995f, 0.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z -1.0f);
473  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x+ 1.0f, cam->y+ 1.0f, cam->z + 1.0f);
474  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y-1.0f,  cam->z +1.0f);
475
476
477  // Front face; offset.  Multi-colored, 50% opaque.
478
479  glNormal3f( 0.0f, 0.0f, 1.0f);
480
481  glColor4f( 0.9f, 0.2f, 0.2f, 0.5f);
482  glTexCoord2f( 0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f,  cam->z +1.0f);
483  glColor4f( 0.2f, 0.9f, 0.2f, 0.5f);
484  glTexCoord2f( 0.995f, 0.005f); glVertex3f(cam->x+ 1.0f, cam->y-1.0f,  cam->z +1.0f);
485  glColor4f( 0.2f, 0.2f, 0.9f, 0.5f);
486  glTexCoord2f( 0.995f, 0.995f); glVertex3f( cam->x+1.0f,  cam->y+1.0f,  cam->z +1.0f);
487  glColor4f( 0.1f, 0.1f, 0.1f, 0.5f);
488  glTexCoord2f( 0.005f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
489
490
491  // Left Face; offset.  Yellow, varying levels of opaque.
492
493  glNormal3f(-1.0f, 0.0f, 0.0f);
494
495  glColor4f(0.9,0.9,0.2,0.0);
496  glTexCoord2f(0.005f, 0.005f); glVertex3f(cam->x-1.0f, cam->y-1.0f, cam->z -1.0f);
497  glColor4f(0.9,0.9,0.2,0.66);
498  glTexCoord2f(0.995f, 0.005f); glVertex3f(cam->x-1.0f,cam->y -1.0f,  cam->z +1.0f);
499  glColor4f(0.9,0.9,0.2,1.0);
500  glTexCoord2f(0.995f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f,  cam->z +1.0f);
501  glColor4f(0.9,0.9,0.2,0.33);
502  glTexCoord2f(0.005f, 0.995f); glVertex3f(cam->x-1.0f, cam->y+ 1.0f, cam->z -1.0f);
503
504  glEnd();
505}
506
507void BspManager::addFace(int f)
508{
509  face& curFace =  ((face *)(this->bspFile->faces))[f];
510  if(this->bspFile->Materials[curFace.texture].alpha) this->trasparent.push_back(f);
511  else this->opal.push_back(f);
512}
Note: See TracBrowser for help on using the repository browser.