Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/cleanup/src/lib/collision_detection/obb_tree_node.cc @ 10601

Last change on this file since 10601 was 10601, checked in by rennerc, 17 years ago

i hope i fixed some bugs :D

File size: 35.9 KB
RevLine 
[4588]1/*
[4541]2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 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
[4617]11### File Specific:
[4541]12   main-programmer: Patrick Boenzli
13*/
14
[7711]15#define DEBUG_SPECIAL_MODULE 3/* DEBUG_MODULE_COLLISION_DETECTION*/
[4541]16
17#include "obb_tree_node.h"
[7711]18#include "obb_tree.h"
[4542]19#include "obb.h"
[7711]20
[10013]21#include "collision_tube.h"
[10033]22#include "world_entity.h"
[10013]23
[5674]24#include "matrix.h"
[6022]25#include "model.h"
[5028]26#include "world_entity.h"
[6617]27#include "plane.h"
[4541]28
[5481]29#include "color.h"
[7711]30#include "glincl.h"
[4543]31
[7711]32#include <list>
33#include <vector>
[5511]34#include "debug.h"
[4572]35
36
37
[4541]38
39
[9406]40
[5430]41GLUquadricObj* OBBTreeNode_sphereObj = NULL;
[4630]42
[9869]43ObjectListDefinition(OBBTreeNode);
[4541]44/**
[4836]45 *  standard constructor
[7711]46 * @param tree: reference to the obb tree
47 * @param depth: the depth of the obb tree to generate
[4617]48 */
[7711]49OBBTreeNode::OBBTreeNode (const OBBTree& tree, OBBTreeNode* prev, int depth)
50    : BVTreeNode()
[4541]51{
[9869]52  this->registerObject(this, OBBTreeNode::_objectList);
[7711]53
54  this->obbTree = &tree;
55  this->nodePrev = prev;
56  this->depth = depth;
57  this->nextID = 0;
58
[4618]59  this->nodeLeft = NULL;
60  this->nodeRight = NULL;
[4814]61  this->bvElement = NULL;
[4630]62
[7711]63  this->triangleIndexList1 = NULL;
64  this->triangleIndexList2 = NULL;
[4638]65
[7711]66  this->modelInf = NULL;
67  this->triangleIndexes = NULL;
68
[5693]69  if( OBBTreeNode_sphereObj == NULL)
[5430]70    OBBTreeNode_sphereObj = gluNewQuadric();
[7711]71
72  this->owner = NULL;
73
74  /* debug ids */
75  if( this->nodePrev)
76    this->treeIndex = 100 * this->depth + this->nodePrev->getID();
77  else
78    this->treeIndex = 0;
[4541]79}
80
81
82/**
[4836]83 *  standard deconstructor
[4617]84 */
[4588]85OBBTreeNode::~OBBTreeNode ()
[4541]86{
[4814]87  if( this->nodeLeft)
88    delete this->nodeLeft;
89  if( this->nodeRight)
90    delete this->nodeRight;
[7711]91
[4814]92  if( this->bvElement)
93    delete this->bvElement;
[4541]94}
95
96
[9235]97
98void OBBTreeNode::createBox(Vector start, Vector end)
99{
100
101  this->bvElement = new OBB();
102  this->nodeLeft = NULL;
103  this->nodeRight = NULL;
104//   this->depth = 0;
105
106  this->bvElement->center = (end - start) * 0.5f;
107  this->bvElement->halfLength[0] = (end.x - start.x) * 0.5f;
108  this->bvElement->halfLength[1] = (end.y - start.y) * 0.5f;
109  this->bvElement->halfLength[2] = (end.z - start.z) * 0.5f;
110
111  this->bvElement->axis[0] = Vector(1,0,0);
112  this->bvElement->axis[1] = Vector(0,1,0);
113  this->bvElement->axis[2] = Vector(0,0,1);
114}
115
116
117
[5684]118/**
119 *  creates a new BVTree or BVTree partition
120 * @param depth: how much more depth-steps to go: if == 1 don't go any deeper!
121 * @param modInfo: model informations from the abstrac model
[5689]122 *
[5684]123 * this function creates the Bounding Volume tree from a modelInfo struct and bases its calculations
124 * on the triangle informations (triangle soup not polygon soup)
125 */
[7711]126void OBBTreeNode::spawnBVTree(const modelInfo& modelInf, const int* triangleIndexes, int length)
[5684]127{
[7734]128  PRINTF(4)("\n==============================Creating OBB Tree Node==================\n");
129  PRINT(4)(" OBB Tree Infos: \n");
130  PRINT(4)("\tDepth: %i \n\tTree Index: %i \n\tNumber of Triangles: %i\n", depth, this->treeIndex, length);
[5684]131  this->depth = depth;
[4542]132
[5684]133  this->bvElement = new OBB();
[7711]134  this->bvElement->modelInf = &modelInf;
135  this->bvElement->triangleIndexes = triangleIndexes;
136  this->bvElement->triangleIndexesLength = length;
[5684]137
[7711]138  /* create the bounding boxes in three steps */
139  this->calculateBoxCovariance(*this->bvElement, modelInf, triangleIndexes, length);
140  this->calculateBoxEigenvectors(*this->bvElement, modelInf, triangleIndexes, length);
141  this->calculateBoxAxis(*this->bvElement, modelInf, triangleIndexes, length);
[4614]142
[7711]143  /* do we need to descent further in the obb tree?*/
[4614]144  if( likely( this->depth > 0))
145  {
[7711]146    this->forkBox(*this->bvElement);
[4626]147
[7711]148    if( this->triangleIndexLength1 >= 3)
[4638]149    {
[7711]150      this->nodeLeft = new OBBTreeNode(*this->obbTree, this, depth - 1);
151      this->nodeLeft->spawnBVTree(modelInf, this->triangleIndexList1, this->triangleIndexLength1);
[4638]152    }
[7711]153    if( this->triangleIndexLength2 >= 3)
[4638]154    {
[7711]155      this->nodeRight = new OBBTreeNode(*this->obbTree, this, depth - 1);
156      this->nodeRight->spawnBVTree(modelInf, this->triangleIndexList2, this->triangleIndexLength2);
[4638]157    }
[4614]158  }
[4557]159}
160
161
162
[7711]163/**
164 *  calculate the box covariance matrix
165 * @param box: reference to the box
166 * @param modelInf: the model info structure of the model
167 * @param tirangleIndexes: an array with the indexes of the triangles inside this
168 * @param length: the length of the indexes array
169 */
170void OBBTreeNode::calculateBoxCovariance(OBB& box, const modelInfo& modelInf, const int* triangleIndexes, int length)
[4557]171{
[4543]172  float     facelet[length];                         //!< surface area of the i'th triangle of the convex hull
[5428]173  float     face = 0.0f;                             //!< surface area of the entire convex hull
[4588]174  Vector    centroid[length];                        //!< centroid of the i'th convex hull
[4557]175  Vector    center;                                  //!< the center of the entire hull
[4544]176  Vector    p, q, r;                                 //!< holder of the polygon data, much more conveniant to work with Vector than sVec3d
[4545]177  Vector    t1, t2;                                  //!< temporary values
[8316]178  float     covariance[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};//!< the covariance matrix
[4588]179
[7711]180  /* fist compute all the convex hull face/facelets and centroids */
181  for( int i = 0; i < length ; ++i)
[4648]182  {
[7711]183    p = &modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[0]];
184    q = &modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[1]];
185    r = &modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[2]];
[4638]186
[7711]187    /* finding the facelet surface via cross-product */
188    t1 = p - q;
189    t2 = p - r;
190    facelet[i] = 0.5f * /*fabs*/( t1.cross(t2).len() );
191    /* update the entire convex hull surface */
192    face += facelet[i];
[4638]193
[7711]194    /* calculate the cetroid of the hull triangles */
195    centroid[i] = (p + q + r) / 3.0f;
196    /* now calculate the centroid of the entire convex hull, weighted average of triangle centroids */
197    center += centroid[i] * facelet[i];
198    /* the arithmetical center */
[4648]199  }
[7711]200  /* take the average of the centroid sum */
201  center /= face;
[4588]202
203
[7711]204  /* now calculate the covariance matrix - if not written in three for-loops,
205     it would compute faster: minor */
206  for( int j = 0; j < 3; ++j)
[4648]207  {
[7711]208    for( int k = 0; k < 3; ++k)
[4648]209    {
[7711]210      for( int i = 0; i < length; ++i)
[4648]211      {
[7711]212        p = (&modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[0]]);
213        q = (&modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[1]]);
214        r = (&modelInf.pVertices[modelInf.pTriangles[triangleIndexes[i]].indexToVertices[2]]);
[4648]215
[7711]216        covariance[j][k] = facelet[i] * (9.0f * centroid[i][j] * centroid[i][k] + p[j] * p[k] +
217                           q[j] * q[k] + r[j] * r[k]);
[4648]218      }
[7711]219      covariance[j][k] = covariance[j][k] / (12.0f * face) - center[j] * center[k];
[4648]220    }
221  }
[7711]222  for( int i = 0; i < 3; ++i)
[4617]223  {
[7711]224    box.covarianceMatrix[i][0] = covariance[i][0];
225    box.covarianceMatrix[i][1] = covariance[i][1];
226    box.covarianceMatrix[i][2] = covariance[i][2];
[4617]227  }
[7711]228  box.center = center;
[4562]229
[7711]230  /* debug output section*/
[7734]231  PRINTF(4)("\nOBB Covariance Matrix:\n");
[4674]232  for(int j = 0; j < 3; ++j)
233  {
[7734]234    PRINT(4)("\t\t");
[4674]235    for(int k = 0; k < 3; ++k)
236    {
[7734]237      PRINT(4)("%11.4f\t", covariance[j][k]);
[4674]238    }
[7734]239    PRINT(4)("\n");
[4674]240  }
[7734]241  PRINTF(4)("\nWeighteed OBB Center:\n\t\t%11.4f\t %11.4f\t %11.4f\n", center.x, center.y, center.z);
[4631]242}
[4557]243
[4631]244
245
[7711]246/**
247 *  calculate the eigenvectors for the object oriented box
248 * @param box: reference to the box
249 * @param modelInf: the model info structure of the model
250 * @param tirangleIndexes: an array with the indexes of the triangles inside this
251 * @param length: the length of the indexes array
252 */
253void OBBTreeNode::calculateBoxEigenvectors(OBB& box, const modelInfo& modelInf,
254    const int* triangleIndexes, int length)
[4631]255{
256
[7711]257  Vector         axis[3];                            //!< the references to the obb axis
258  Matrix         covMat(  box.covarianceMatrix  );   //!< covariance matrix (in the matrix dataform)
259
260  /*
261  now getting spanning vectors of the sub-space:
[4617]262  the eigenvectors of a symmertric matrix, such as the
263  covarience matrix are mutually orthogonal.
264  after normalizing them, they can be used as a the basis
265  vectors
[4557]266  */
[4588]267
[7711]268  /* calculate the axis */
[5674]269  covMat.getEigenVectors(axis[0], axis[1], axis[2] );
[7711]270  box.axis[0] = axis[0];
271  box.axis[1] = axis[1];
272  box.axis[2] = axis[2];
[4627]273
[7735]274  // this is for axis aligned bouning boxes only
[7711]275//   box.axis[0] = Vector(1,0,0);
276//   box.axis[1] = Vector(0,1,0);
277//   box.axis[2] = Vector(0,0,1);
[5449]278
[7734]279  PRINTF(4)("Eigenvectors:\n");
280  PRINT(4)("\t\t%11.2f \t%11.2f \t%11.2f\n", box.axis[0].x, box.axis[0].y, box.axis[0].z);
281  PRINT(4)("\t\t%11.2f \t%11.2f \t%11.2f\n", box.axis[1].x, box.axis[1].y, box.axis[1].z);
282  PRINT(4)("\t\t%11.2f \t%11.2f \t%11.2f\n", box.axis[2].x, box.axis[2].y, box.axis[2].z);
[4632]283}
[4588]284
[4626]285
[5684]286
287
[7711]288/**
[9869]289 * @brief calculate the eigenvectors for the object oriented box
[7711]290 * @param box: reference to the box
291 * @param modelInf: the model info structure of the model
292 * @param tirangleIndexes: an array with the indexes of the triangles inside this
293 * @param length: the length of the indexes array
294 */
295void OBBTreeNode::calculateBoxAxis(OBB& box, const modelInfo& modelInf, const int* triangleIndexes, int length)
[4631]296{
[4630]297
[7734]298  PRINTF(4)("Calculate Box Axis\n");
[4576]299  /* now get the axis length */
[4578]300  float               tmpLength;                             //!< tmp save point for the length
[7711]301  Plane               p0(box.axis[0], box.center);           //!< the axis planes
302  Plane               p1(box.axis[1], box.center);           //!< the axis planes
303  Plane               p2(box.axis[2], box.center);           //!< the axis planes
304  float               maxLength[3];                          //!< maximal lenth of the axis
305  float               minLength[3];                          //!< minimal length of the axis
306  const float*        tmpVec;                                //!< variable taking tmp vectors
307  float               centerOffset[3];
[4588]308
[7711]309  /* get the maximal dimensions of the body in all directions */
310  /* for the initialisation the value just has to be inside of the polygon soup -> first vertices (rand) */
311  for( int k = 0; k  < 3; k++)
312  {
313    tmpVec = (&modelInf.pVertices[modelInf.pTriangles[triangleIndexes[0]].indexToVertices[0]]);
314    Plane* p;
315    if( k == 0)
316      p = &p0;
317    else if( k == 1)
318      p = &p1;
319    else
320      p = &p2;
321    maxLength[k] = p->distancePoint(tmpVec);
322    minLength[k] = p->distancePoint(tmpVec);
[4658]323
[7711]324    for( int j = 0; j < length; ++j) {
325      for( int i = 0; i < 3; ++i) {
326        tmpVec = &modelInf.pVertices[modelInf.pTriangles[triangleIndexes[j]].indexToVertices[i]];
327        tmpLength = p->distancePoint(tmpVec);
[4658]328
[7711]329        if( tmpLength > maxLength[k])
330          maxLength[k] = tmpLength;
331        else if( tmpLength < minLength[k])
332          minLength[k] = tmpLength;
333      }
[4658]334    }
[7711]335  }
[4658]336
337
338
[7711]339  /* calculate the real centre of the body by using the axis length */
340  for( int i = 0; i < 3; ++i)
341  {
342    if( maxLength[i] > 0.0f && minLength[i] > 0.0f)  // both axis positiv
343      centerOffset[i] = minLength[i] + (maxLength[i] - minLength[i]) / 2.0f;
344    else if( maxLength[i] > 0.0f && maxLength[i] < 0.0f) // positiv and negativ
345      centerOffset[i] = (maxLength[i] + minLength[i]) / 2.0f;
346    else //both negativ
347     centerOffset[i] = minLength[i] + (maxLength[i] - minLength[i]) / 2.0f;
[4658]348
[7711]349    box.halfLength[i] = (maxLength[i] - minLength[i]) / 2.0f;
350  }
[4578]351
[7711]352  box.center += (box.axis[0] * centerOffset[0]);
353  box.center += (box.axis[1] * centerOffset[1]);
354  box.center += (box.axis[2] * centerOffset[2]);
[4585]355
356
[7734]357  PRINTF(4)("\n");
358  PRINT(4)("\tAxis halflength x: %11.2f (max: %11.2f, \tmin: %11.2f), offset: %11.2f\n", box.halfLength[0], maxLength[0], minLength[0], centerOffset[0]);
359  PRINT(4)("\tAxis halflength y: %11.2f (max: %11.2f, \tmin: %11.2f), offset: %11.2f\n", box.halfLength[1], maxLength[1], minLength[1], centerOffset[1] );
360  PRINT(4)("\tAxis halflength z: %11.2f (max: %11.2f, \tmin: %11.2f), offset: %11.2f\n", box.halfLength[2], maxLength[2], minLength[2], centerOffset[2]);
[4542]361}
362
363
[4609]364
365/**
[9869]366 * @brief this separates an ob-box in the middle
[7711]367 * @param box: the box to separate
368 *
369 * this will separate the box into to smaller boxes. the separation is done along the middle of the longest axis
[4609]370 */
[7711]371void OBBTreeNode::forkBox(OBB& box)
[4557]372{
[7711]373
[7734]374  PRINTF(4)("Fork Box\n");
[7711]375  PRINTF(4)("Calculating the longest Axis\n");
[4557]376  /* get the longest axis of the box */
[7711]377  float               longestAxis = -1.0f;                 //!< the length of the longest axis
378  int                 longestAxisIndex = 0;                //!< this is the nr of the longest axis
[4609]379
[7711]380
381  /* now get the longest axis of the three exiting */
382  for( int i = 0; i < 3; ++i)
[4609]383  {
[7711]384    if( longestAxis < box.halfLength[i])
[4557]385    {
[7711]386      longestAxis = box.halfLength[i];
387      longestAxisIndex = i;
[4557]388    }
[4609]389  }
[9008]390  this->bvElement->radius = longestAxis;
[7734]391  PRINTF(4)("\nLongest Axis is: Nr %i with a half-length of:%11.2f\n", longestAxisIndex, longestAxis);
[4588]392
[4609]393
[7711]394  PRINTF(4)("Separating along the longest axis\n");
[4557]395  /* get the closest vertex near the center */
[7711]396  float               tmpDist;                             //!< variable to save diverse distances temporarily
397  Plane               middlePlane(box.axis[longestAxisIndex], box.center); //!< the middle plane
[4588]398
[4609]399
[4611]400  /* now definin the separation plane through this specified nearest point and partition
[4617]401  the points depending on which side they are located
[4611]402  */
[7711]403  std::list<int>           partition1;                           //!< the vertex partition 1
404  std::list<int>           partition2;                           //!< the vertex partition 2
405  float*                   triangleCenter = new float[3];        //!< the center of the triangle
406  const float*             a;                                    //!< triangle  edge a
407  const float*             b;                                    //!< triangle  edge b
408  const float*             c;                                    //!< triangle  edge c
[4611]409
[4710]410
[7711]411  /* find the center of the box */
412  this->separationPlane = Plane(box.axis[longestAxisIndex], box.center);
413  this->sepPlaneCenter[0] = box.center.x;
414  this->sepPlaneCenter[1] = box.center.y;
415  this->sepPlaneCenter[2] = box.center.z;
416  this->longestAxisIndex = longestAxisIndex;
[4632]417
[7711]418  for( int i = 0; i < box.triangleIndexesLength; ++i)
[4612]419  {
[7711]420    /* first calculate the middle of the triangle */
421    a = &box.modelInf->pVertices[box.modelInf->pTriangles[box.triangleIndexes[i]].indexToVertices[0]];
422    b = &box.modelInf->pVertices[box.modelInf->pTriangles[box.triangleIndexes[i]].indexToVertices[1]];
423    c = &box.modelInf->pVertices[box.modelInf->pTriangles[box.triangleIndexes[i]].indexToVertices[2]];
424
425    triangleCenter[0] = (a[0] + b[0] + c[0]) / 3.0f;
426    triangleCenter[1] = (a[1] + b[1] + c[1]) / 3.0f;
427    triangleCenter[2] = (a[2] + b[2] + c[2]) / 3.0f;
428    tmpDist = this->separationPlane.distancePoint(*((sVec3D*)triangleCenter));
429
430    if( tmpDist > 0.0f)
431      partition1.push_back(box.triangleIndexes[i]); /* positive numbers plus zero */
432    else if( tmpDist < 0.0f)
433      partition2.push_back(box.triangleIndexes[i]); /* negatice numbers */
434    else {
435      partition1.push_back(box.triangleIndexes[i]); /* 0.0f? unprobable... */
436      partition2.push_back(box.triangleIndexes[i]);
437    }
[4612]438  }
[9406]439  delete [] triangleCenter;
[7734]440  PRINTF(4)("\nPartition1: got \t%i Vertices \nPartition2: got \t%i Vertices\n", partition1.size(), partition2.size());
[4611]441
[4612]442
[4613]443  /* now comes the separation into two different sVec3D arrays */
444  int                index;                                //!< index storage place
[7711]445  int*               triangleIndexList1;                   //!< the vertex list 1
446  int*               triangleIndexList2;                   //!< the vertex list 2
447  std::list<int>::iterator element;                        //!< the list iterator
[4613]448
[7711]449  triangleIndexList1 = new int[partition1.size()];
450  triangleIndexList2 = new int[partition2.size()];
[4613]451
[7711]452  for( element = partition1.begin(), index = 0; element != partition1.end(); element++, index++)
453    triangleIndexList1[index] = (*element);
[4613]454
[7711]455  for( element = partition2.begin(), index = 0; element != partition2.end(); element++, index++)
456    triangleIndexList2[index] = (*element);
[4613]457
[7711]458  if( this->triangleIndexList1!= NULL)
459    delete[] this->triangleIndexList1;
460  this->triangleIndexList1 = triangleIndexList1;
461  this->triangleIndexLength1 = partition1.size();
[4613]462
[7711]463  if( this->triangleIndexList2 != NULL)
464    delete[] this->triangleIndexList2;
465  this->triangleIndexList2 = triangleIndexList2;
466  this->triangleIndexLength2 = partition2.size();
[4557]467}
468
469
[4626]470
[7732]471/**
472 * collides one tree with an other
473 *  @param treeNode the other bv tree node
474 *  @param nodeA  the worldentity belonging to this bv
475 *  @param nodeB the worldentity belonging to treeNode
476 */
[5028]477void OBBTreeNode::collideWith(BVTreeNode* treeNode, WorldEntity* nodeA, WorldEntity* nodeB)
[4695]478{
[7732]479  if( unlikely(treeNode == NULL || nodeA == NULL || nodeB == NULL))
[7711]480    return;
481
[10033]482  PRINTF(4)("collideWith\n");
483  PRINTF(5)("Checking OBB %i vs %i: ", this->getIndex(), treeNode->getIndex());
484
485  // check if these world entities have registered for a collision reaction between each other
486//   if( !nodeA->isReactive( *nodeB) && !nodeB->isReactive( *nodeA) )
[10013]487//     return;
488
[10033]489  // now use bounding spheres as a first collision estimation
[9406]490//   float distanceMax = this->bvElement->radius + ((OBBTreeNode*)treeNode)->bvElement->radius;
491//   float distance = fabs((nodeA->getAbsCoor() - nodeB->getAbsCoor()).len());
[10033]492//   if( distance > distanceMax)
493//     return;
[9008]494
[7732]495  // for now only collide with OBBTreeNodes
496  this->collideWithOBB((OBBTreeNode*)treeNode, nodeA, nodeB);
497}
[7711]498
[7732]499
500
501/**
502 * collides one obb tree with an other
503 *  @param treeNode the other bv tree node
504 *  @param nodeA  the worldentity belonging to this bv
505 *  @param nodeB the worldentity belonging to treeNode
506 */
507void OBBTreeNode::collideWithOBB(OBBTreeNode* treeNode, WorldEntity* nodeA, WorldEntity* nodeB)
508{
[7734]509
510  if( this->overlapTest(this->bvElement, treeNode->bvElement, nodeA, nodeB))
[4695]511  {
[9406]512    PRINTF(5)("collision @ lvl %i, object %s vs. %s, (%p, %p)\n", this->depth, nodeA->getClassCName(), nodeB->getClassCName(), this->nodeLeft, this->nodeRight);
[5038]513
[8190]514
515    // left node
[7735]516    if( this->nodeLeft != NULL )
[4704]517    {
[7732]518      if( this->overlapTest(this->nodeLeft->bvElement, treeNode->bvElement, nodeA, nodeB))
[4704]519      {
[9008]520        bool bAdvance = false;
[8190]521        if( treeNode->nodeLeft != NULL)
522          this->nodeLeft->collideWith(treeNode->nodeLeft, nodeA, nodeB);
[9008]523        else
524          bAdvance = true;
525
[8190]526        if( treeNode->nodeRight != NULL)
527          this->nodeLeft->collideWith(treeNode->nodeRight, nodeA, nodeB);
[9008]528        else
529          bAdvance = true;
530
531        if( bAdvance)
532          this->nodeLeft->collideWith(treeNode, nodeA, nodeB);  // go down the other tree also
[4704]533      }
534    }
[8190]535
536    // right node
537    if( this->nodeRight != NULL )
[4704]538    {
[8190]539      if( this->overlapTest(this->nodeRight->bvElement, treeNode->bvElement, nodeA, nodeB))
[4704]540      {
[9008]541        bool bAdvance = false;
542
[8190]543        if( treeNode->nodeLeft != NULL)
544          this->nodeRight->collideWith(treeNode->nodeLeft, nodeA, nodeB);
[9008]545        else
546          bAdvance = true;
547
[8190]548        if( treeNode->nodeRight != NULL)
549          this->nodeRight->collideWith(treeNode->nodeRight, nodeA, nodeB);
[9008]550        else
551          bAdvance = true;
552
553        if( bAdvance)
554          this->nodeRight->collideWith(treeNode, nodeA, nodeB);  // go down the other tree also
[4704]555      }
[5044]556    }
[5028]557
[8190]558
559    // hybrid mode: we reached the end of this obbtree, now reach the end of the other tree
560    if( this->nodeLeft == NULL && this->nodeRight == NULL)
[5044]561    {
[8190]562      if( treeNode->nodeLeft != NULL)
563        this->collideWith(treeNode->nodeLeft, nodeA, nodeB);
564      if( treeNode->nodeRight != NULL)
565        this->collideWith(treeNode->nodeRight, nodeA, nodeB);
[4704]566    }
[5044]567
[8190]568
569    // now check if we reached the end of both trees
570    if( unlikely((this->nodeRight == NULL && this->nodeLeft == NULL) &&
571        (treeNode->nodeRight == NULL && treeNode->nodeLeft == NULL)) )
572    {
[10013]573      //PRINTF(0)("----------------------------------------------\n\n\n\n\n\n--------------------------------\n\n\n");
574      CoRe::CollisionTube::getInstance()->registerCollisionEvent( nodeA, nodeB, (BoundingVolume*)this->bvElement, (BoundingVolume*)treeNode->bvElement);
[8190]575    }
576
[4695]577  }
578}
[4542]579
580
[7732]581/**
582 * this actualy checks if one obb box touches the other
583 * @param boxA the box from nodeA
584 * @param boxB the box from nodeB
585 * @param nodeA the node itself
586 * @param nodeB the node itself
587 */
588bool OBBTreeNode::overlapTest(OBB* boxA, OBB* boxB, WorldEntity* nodeA, WorldEntity* nodeB)
[4695]589{
[9235]590
[7711]591  //HACK remove this again
592  this->owner = nodeA;
593  //   if( boxB == NULL || boxA == NULL)
594  //     return false;
595
[4696]596  /* first check all axis */
[7713]597  Vector      t;
598  float       rA = 0.0f;
599  float       rB = 0.0f;
600  Vector      l;
601  Vector      rotAxisA[3];
602  Vector      rotAxisB[3];
[4626]603
[7732]604  rotAxisA[0] =  nodeA->getAbsDir().apply(boxA->axis[0]);
605  rotAxisA[1] =  nodeA->getAbsDir().apply(boxA->axis[1]);
606  rotAxisA[2] =  nodeA->getAbsDir().apply(boxA->axis[2]);
[4708]607
[7732]608  rotAxisB[0] =  nodeB->getAbsDir().apply(boxB->axis[0]);
609  rotAxisB[1] =  nodeB->getAbsDir().apply(boxB->axis[1]);
610  rotAxisB[2] =  nodeB->getAbsDir().apply(boxB->axis[2]);
[4708]611
[7732]612  t = nodeA->getAbsCoor() + nodeA->getAbsDir().apply(boxA->center) - ( nodeB->getAbsCoor() + nodeB->getAbsDir().apply(boxB->center));
[4708]613
[4703]614  /* All 3 axis of the object A */
[4701]615  for( int j = 0; j < 3; ++j)
[4705]616  {
617    rA = 0.0f;
618    rB = 0.0f;
[4708]619    l = rotAxisA[j];
[4705]620
[7732]621    rA += fabs(boxA->halfLength[0] * rotAxisA[0].dot(l));
622    rA += fabs(boxA->halfLength[1] * rotAxisA[1].dot(l));
623    rA += fabs(boxA->halfLength[2] * rotAxisA[2].dot(l));
[4705]624
[7732]625    rB += fabs(boxB->halfLength[0] * rotAxisB[0].dot(l));
626    rB += fabs(boxB->halfLength[1] * rotAxisB[1].dot(l));
627    rB += fabs(boxB->halfLength[2] * rotAxisB[2].dot(l));
[4705]628
[7711]629    PRINTF(5)("s = %f, rA+rB = %f\n", fabs(t.dot(l)), rA+rB);
[4705]630
[10601]631    //TODO valgrind complains about uninitialised value here
[4705]632    if( (rA + rB) < fabs(t.dot(l)))
[4700]633    {
[7711]634      PRINTF(4)("no Collision\n");
[4705]635      return false;
636    }
637  }
[4700]638
[4705]639  /* All 3 axis of the object B */
640  for( int j = 0; j < 3; ++j)
641  {
642    rA = 0.0f;
643    rB = 0.0f;
[4708]644    l = rotAxisB[j];
[4701]645
[7732]646    rA += fabs(boxA->halfLength[0] * rotAxisA[0].dot(l));
647    rA += fabs(boxA->halfLength[1] * rotAxisA[1].dot(l));
648    rA += fabs(boxA->halfLength[2] * rotAxisA[2].dot(l));
[4700]649
[7732]650    rB += fabs(boxB->halfLength[0] * rotAxisB[0].dot(l));
651    rB += fabs(boxB->halfLength[1] * rotAxisB[1].dot(l));
652    rB += fabs(boxB->halfLength[2] * rotAxisB[2].dot(l));
[4703]653
[7711]654    PRINTF(5)("s = %f, rA+rB = %f\n", fabs(t.dot(l)), rA+rB);
[4705]655
656    if( (rA + rB) < fabs(t.dot(l)))
657    {
[7711]658      PRINTF(4)("no Collision\n");
[4705]659      return false;
[4701]660    }
[4705]661  }
[4700]662
[4705]663
664  /* Now check for all face cross products */
665
666  for( int j = 0; j < 3; ++j)
667  {
668    for(int k = 0; k < 3; ++k )
[4701]669    {
670      rA = 0.0f;
671      rB = 0.0f;
[4708]672      l = rotAxisA[j].cross(rotAxisB[k]);
[4701]673
[7732]674      rA += fabs(boxA->halfLength[0] * rotAxisA[0].dot(l));
675      rA += fabs(boxA->halfLength[1] * rotAxisA[1].dot(l));
676      rA += fabs(boxA->halfLength[2] * rotAxisA[2].dot(l));
[4701]677
[7732]678      rB += fabs(boxB->halfLength[0] * rotAxisB[0].dot(l));
679      rB += fabs(boxB->halfLength[1] * rotAxisB[1].dot(l));
680      rB += fabs(boxB->halfLength[2] * rotAxisB[2].dot(l));
[4701]681
[7711]682      PRINTF(5)("s = %f, rA+rB = %f\n", fabs(t.dot(l)), rA+rB);
[4703]683
[4701]684      if( (rA + rB) < fabs(t.dot(l)))
685      {
[7711]686        PRINTF(4)("keine Kollision\n");
[4701]687        return false;
688      }
[4703]689    }
[4705]690  }
[4701]691
[7711]692  /* FIXME: there is no collision mark set now */
[7732]693     boxA->bCollided = true; /* use this ONLY(!!!!) for drawing operations */
694     boxB->bCollided = true;
[4701]695
[7711]696
697  PRINTF(4)("Kollision!\n");
[4705]698  return true;
[4695]699}
700
701
[7711]702/**
703 *
704 * draw the BV tree - debug mode
705 */
[5481]706void OBBTreeNode::drawBV(int depth, int drawMode, const Vector& color,  bool top) const
[4553]707{
[9235]708
[7711]709  /* this function can be used to draw the triangles and/or the points only  */
710  if( 1 /*drawMode & DRAW_MODEL || drawMode & DRAW_ALL*/)
[4635]711  {
[7711]712    if( depth == 0/*!(drawMode & DRAW_SINGLE && depth != 0)*/)
[4622]713    {
[9235]714      if( 0 /*drawMode & DRAW_POINTS*/)
[7711]715      {
[4712]716        glBegin(GL_POINTS);
[7711]717        glColor3f(0.3, 0.8, 0.54);
[8316]718        for(unsigned int i = 0; i < this->bvElement->modelInf->numVertices*3; i+=3)
[7711]719          glVertex3f(this->bvElement->modelInf->pVertices[i],
720                     this->bvElement->modelInf->pVertices[i+1],
721                     this->bvElement->modelInf->pVertices[i+2]);
722        glEnd();
[4638]723      }
[4622]724    }
[4635]725  }
[4542]726
[5481]727  if (top)
728  {
729    glPushAttrib(GL_ENABLE_BIT);
730    glDisable(GL_LIGHTING);
731    glDisable(GL_TEXTURE_2D);
732  }
733  glColor3f(color.x, color.y, color.z);
[4542]734
[5481]735
[4589]736  /* draw world axes */
[8776]737//   if( 1 /*drawMode & DRAW_BV_AXIS*/)
738//   {
739//     glBegin(GL_LINES);
740//     glColor3f(1.0, 0.0, 0.0);
741//     glVertex3f(0.0, 0.0, 0.0);
742//     glVertex3f(3.0, 0.0, 0.0);
743//
744//     glColor3f(0.0, 1.0, 0.0);
745//     glVertex3f(0.0, 0.0, 0.0);
746//     glVertex3f(0.0, 3.0, 0.0);
747//
748//     glColor3f(0.0, 0.0, 1.0);
749//     glVertex3f(0.0, 0.0, 0.0);
750//     glVertex3f(0.0, 0.0, 3.0);
751//     glEnd();
752//   }
[4589]753
754
[7711]755  if( 1/*drawMode & DRAW_BV_AXIS || drawMode & DRAW_ALL*/)
[4635]756  {
[7711]757    if( 1/*drawMode & DRAW_SINGLE && depth != 0*/)
[4635]758    {
759      /* draw the obb axes */
760      glBegin(GL_LINES);
[7711]761      glColor3f(1.0, 0.0, 0.0);
762      glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z);
763      glVertex3f(this->bvElement->center.x + this->bvElement->axis[0].x * this->bvElement->halfLength[0],
764                 this->bvElement->center.y + this->bvElement->axis[0].y * this->bvElement->halfLength[0],
765                 this->bvElement->center.z + this->bvElement->axis[0].z * this->bvElement->halfLength[0]);
[4589]766
[7711]767      glColor3f(0.0, 1.0, 0.0);
768      glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z);
769      glVertex3f(this->bvElement->center.x + this->bvElement->axis[1].x * this->bvElement->halfLength[1],
770                 this->bvElement->center.y + this->bvElement->axis[1].y * this->bvElement->halfLength[1],
771                 this->bvElement->center.z + this->bvElement->axis[1].z * this->bvElement->halfLength[1]);
[4588]772
[7711]773      glColor3f(0.0, 0.0, 1.0);
774      glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z);
775      glVertex3f(this->bvElement->center.x + this->bvElement->axis[2].x * this->bvElement->halfLength[2],
776                 this->bvElement->center.y + this->bvElement->axis[2].y * this->bvElement->halfLength[2],
777                 this->bvElement->center.z + this->bvElement->axis[2].z * this->bvElement->halfLength[2]);
[4635]778      glEnd();
779    }
780  }
[4581]781
[4588]782
[4674]783  /* DRAW POLYGONS */
[4673]784  if( drawMode & DRAW_BV_POLYGON || drawMode & DRAW_ALL || drawMode & DRAW_BV_BLENDED)
[4635]785  {
[5487]786    if (top)
787    {
788      glEnable(GL_BLEND);
789      glBlendFunc(GL_SRC_ALPHA, GL_ONE);
790    }
791
[7711]792    if( this->nodeLeft == NULL && this->nodeRight == NULL)
[4710]793      depth = 0;
[4588]794
[7711]795    if( depth == 0 /*!(drawMode & DRAW_SINGLE && depth != 0)*/)
[5481]796    {
[4670]797
[4588]798
[7711]799      Vector cen = this->bvElement->center;
800      Vector* axis = this->bvElement->axis;
801      float* len = this->bvElement->halfLength;
[4588]802
[7711]803      if( this->bvElement->bCollided)
804      {
805        glColor4f(1.0, 1.0, 1.0, .5); // COLLISION COLOR
806      }
807      else if( drawMode & DRAW_BV_BLENDED)
808      {
809        glColor4f(color.x, color.y, color.z, .5);
810      }
[4588]811
[7711]812      // debug out
813      if( this->obbTree->getOwner() != NULL)
814      {
[9406]815        PRINTF(4)("debug poly draw: depth: %i, mode: %i, entity-name: %s, class: %s\n", depth, drawMode, this->obbTree->getOwner()->getCName(), this->obbTree->getOwner()->getClassCName());
[7711]816      }
817      else
818        PRINTF(4)("debug poly draw: depth: %i, mode: %i\n", depth, drawMode);
[4670]819
[4671]820
[7711]821      /* draw bounding box */
822      if( drawMode & DRAW_BV_BLENDED)
823        glBegin(GL_QUADS);
824      else
825        glBegin(GL_LINE_LOOP);
826      glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
827                 cen.y + axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
828                 cen.z + axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
[4671]829      glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
830                 cen.y + axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
831                 cen.z + axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
832      glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
833                 cen.y + axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
834                 cen.z + axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
[7711]835      glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
836                 cen.y + axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
837                 cen.z + axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
838      glEnd();
839
840      if( drawMode & DRAW_BV_BLENDED)
841        glBegin(GL_QUADS);
842      else
843        glBegin(GL_LINE_LOOP);
844      glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
845                 cen.y + axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
846                 cen.z + axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
847      glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
848                 cen.y + axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
849                 cen.z + axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
[4671]850      glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
851                 cen.y - axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
852                 cen.z - axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
[7711]853      glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
854                 cen.y - axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
855                 cen.z - axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
[4671]856      glEnd();
857
[7711]858      if( drawMode & DRAW_BV_BLENDED)
859        glBegin(GL_QUADS);
860      else
861        glBegin(GL_LINE_LOOP);
862      glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
863                 cen.y - axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
864                 cen.z - axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
865      glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
866                 cen.y - axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
867                 cen.z - axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
868      glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
869                 cen.y - axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
870                 cen.z - axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
[4671]871      glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
872                 cen.y - axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
873                 cen.z - axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
[7711]874      glEnd();
875
876      if( drawMode & DRAW_BV_BLENDED)
877        glBegin(GL_QUADS);
878      else
879        glBegin(GL_LINE_LOOP);
880      glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
881                 cen.y - axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
882                 cen.z - axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
883      glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
884                 cen.y - axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
885                 cen.z - axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
[4671]886      glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
887                 cen.y + axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
888                 cen.z + axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
[7711]889      glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
890                 cen.y + axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
891                 cen.z + axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
[4671]892      glEnd();
893
894
[7711]895      if( drawMode & DRAW_BV_BLENDED)
896      {
897        glBegin(GL_QUADS);
898        glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
899                   cen.y - axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
900                   cen.z - axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
901        glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] - axis[2].x * len[2],
902                   cen.y + axis[0].y * len[0] + axis[1].y * len[1] - axis[2].y * len[2],
903                   cen.z + axis[0].z * len[0] + axis[1].z * len[1] - axis[2].z * len[2]);
904        glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
905                   cen.y + axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
906                   cen.z + axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
907        glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] - axis[2].x * len[2],
908                   cen.y - axis[0].y * len[0] - axis[1].y * len[1] - axis[2].y * len[2],
909                   cen.z - axis[0].z * len[0] - axis[1].z * len[1] - axis[2].z * len[2]);
910        glEnd();
911
912        glBegin(GL_QUADS);
913        glVertex3f(cen.x - axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
914                   cen.y - axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
915                   cen.z - axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
916        glVertex3f(cen.x + axis[0].x * len[0] + axis[1].x * len[1] + axis[2].x * len[2],
917                   cen.y + axis[0].y * len[0] + axis[1].y * len[1] + axis[2].y * len[2],
918                   cen.z + axis[0].z * len[0] + axis[1].z * len[1] + axis[2].z * len[2]);
919        glVertex3f(cen.x + axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
920                   cen.y + axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
921                   cen.z + axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
922        glVertex3f(cen.x - axis[0].x * len[0] - axis[1].x * len[1] + axis[2].x * len[2],
923                   cen.y - axis[0].y * len[0] - axis[1].y * len[1] + axis[2].y * len[2],
924                   cen.z - axis[0].z * len[0] - axis[1].z * len[1] + axis[2].z * len[2]);
925        glEnd();
926      }
927
928      if( drawMode & DRAW_BV_BLENDED)
929        glColor3f(color.x, color.y, color.z);
[4635]930    }
931  }
[4588]932
[4674]933  /* DRAW SEPARATING PLANE */
[4635]934  if( drawMode & DRAW_SEPARATING_PLANE || drawMode & DRAW_ALL)
[4632]935  {
[4636]936    if( !(drawMode & DRAW_SINGLE && depth != 0))
[4635]937    {
[4671]938      if( drawMode & DRAW_BV_BLENDED)
[5481]939        glColor4f(color.x, color.y, color.z, .6);
[4671]940
[7711]941      /* now draw the separation plane */
942      Vector a1 = this->bvElement->axis[(this->longestAxisIndex + 1)%3];
943      Vector a2 = this->bvElement->axis[(this->longestAxisIndex + 2)%3];
944      Vector c = this->bvElement->center;
945      float l1 = this->bvElement->halfLength[(this->longestAxisIndex + 1)%3];
946      float l2 = this->bvElement->halfLength[(this->longestAxisIndex + 2)%3];
947      glBegin(GL_QUADS);
948      glVertex3f(c.x + a1.x * l1 + a2.x * l2, c.y + a1.y * l1+ a2.y * l2, c.z + a1.z * l1 + a2.z * l2);
949      glVertex3f(c.x - a1.x * l1 + a2.x * l2, c.y - a1.y * l1+ a2.y * l2, c.z - a1.z * l1 + a2.z * l2);
950      glVertex3f(c.x - a1.x * l1 - a2.x * l2, c.y - a1.y * l1- a2.y * l2, c.z - a1.z * l1 - a2.z * l2);
951      glVertex3f(c.x + a1.x * l1 - a2.x * l2, c.y + a1.y * l1- a2.y * l2, c.z + a1.z * l1 - a2.z * l2);
952      glEnd();
[4671]953
[7711]954      if( drawMode & DRAW_BV_BLENDED)
955        glColor4f(color.x, color.y, color.z, 1.0);
[4671]956
[4635]957    }
[4632]958  }
[4588]959
[4702]960
961
[5481]962  if (depth > 0)
963  {
964    if( this->nodeLeft != NULL)
[5494]965      this->nodeLeft->drawBV(depth - 1, drawMode, Color::HSVtoRGB(Color::RGBtoHSV(color)+Vector(15.0,0.0,0.0)), false);
[5481]966    if( this->nodeRight != NULL)
[5494]967      this->nodeRight->drawBV(depth - 1, drawMode, Color::HSVtoRGB(Color::RGBtoHSV(color)+Vector(30.0,0.0,0.0)), false);
[5481]968  }
969  this->bvElement->bCollided = false;
[4588]970
[5481]971  if (top)
972    glPopAttrib();
[4557]973}
[4542]974
975
[4568]976
[4746]977void OBBTreeNode::debug() const
[4568]978{
[7711]979  PRINT(0)("========OBBTreeNode::debug()=====\n");
980  PRINT(0)(" Current depth: %i", this->depth);
981  PRINT(0)(" ");
982  PRINT(0)("=================================\n");
[4617]983}
Note: See TracBrowser for help on using the repository browser.