Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jun 15, 2005, 7:05:39 PM (20 years ago)
Author:
patrick
Message:

orxonox/trunk: implemented an elegant draw function to display the tree in different ways

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orxonox/trunk/src/lib/collision_detection/obb_tree_node.cc

    r4633 r4635  
    439439
    440440
    441 void OBBTreeNode::drawBV(int depth) const
    442 {
    443   glBegin(GL_TRIANGLES);
    444   glColor3f(1.0, 1.0, 1.0);
    445   for(int i = 0; i < this->bvElement->numOfVertices; ++i)
     441void OBBTreeNode::drawBV(int depth, int drawMode) const
     442{
     443  //OBBTree::material->select();
     444
     445  this->obbTree->getMaterial(depth)->select();
     446
     447  /* draw the model itself, there is some problem concerning this: the vertices are drawn multiple times */
     448  if( drawMode & DRAW_MODEL || drawMode & DRAW_ALL)
     449  {
     450    glBegin(GL_TRIANGLES);
     451    glColor3f(1.0, 1.0, 1.0);
     452    for(int i = 0; i < this->bvElement->numOfVertices; ++i)
    446453    {
    447454      glVertex3f(this->bvElement->vertices[i][0], this->bvElement->vertices[i][1], this->bvElement->vertices[i][2]);
    448455      //printf("v(%f, %f, %f)\n", this->vertices[i][0], this->vertices[i][1], this->vertices[i][2]);
    449456    }
    450   glEnd();
    451   //this->drawBVPolygon(depth);
    452 }
    453 
    454 
    455 void OBBTreeNode::drawBVPolygon(int depth) const
    456 {
    457   //OBBTree::material->select();
    458 
    459   this->obbTree->getMaterial(depth)->select();
     457    glEnd();
     458  }
     459
    460460
    461461  /* draw world axes */
     
    473473
    474474
    475 
    476   /* draw the obb axes */
    477 //   glBegin(GL_LINES);
    478 //   glColor3f(0.0, 0.4, 0.3);
    479 //   glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
    480 //   glVertex3f(this->bvElement->center->x + this->bvElement->axis[0]->x * this->bvElement->halfLength[0],
    481 //              this->bvElement->center->y + this->bvElement->axis[0]->y * this->bvElement->halfLength[0],
    482 //              this->bvElement->center->z + this->bvElement->axis[0]->z * this->bvElement->halfLength[0]);
    483 //
    484 //   glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
    485 //   glVertex3f(this->bvElement->center->x + this->bvElement->axis[1]->x * this->bvElement->halfLength[1],
    486 //              this->bvElement->center->y + this->bvElement->axis[1]->y * this->bvElement->halfLength[1],
    487 //              this->bvElement->center->z + this->bvElement->axis[1]->z * this->bvElement->halfLength[1]);
    488 //
    489 //   glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
    490 //   glVertex3f(this->bvElement->center->x + this->bvElement->axis[2]->x * this->bvElement->halfLength[2],
    491 //              this->bvElement->center->y + this->bvElement->axis[2]->y * this->bvElement->halfLength[2],
    492 //              this->bvElement->center->z + this->bvElement->axis[2]->z * this->bvElement->halfLength[2]);
    493 //   glEnd();
    494 
    495 
    496   Vector cen = *this->bvElement->center;
    497   Vector** axis = this->bvElement->axis;
    498   float* len = this->bvElement->halfLength;
    499 
    500   /* draw bounding box */
    501   glBegin(GL_LINE_LOOP);
    502   glColor3f(0.3, 0.4, 0.7);
    503   glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
    504              cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
    505              cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
    506   glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
    507              cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
    508              cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
    509   glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
    510              cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
    511              cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
    512   glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
    513              cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
    514              cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
    515   glEnd();
    516 
    517   glBegin(GL_LINE_LOOP);
    518   glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
    519              cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
    520              cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
    521   glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
    522              cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
    523              cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
    524   glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
    525              cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
    526              cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
    527   glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
    528              cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
    529              cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
    530   glEnd();
    531 
    532   glBegin(GL_LINE_LOOP);
    533   glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
    534              cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
    535              cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
    536   glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
    537              cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
    538              cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
    539   glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
    540              cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
    541              cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
    542   glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
    543              cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
    544              cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
    545   glEnd();
    546 
    547   glBegin(GL_LINE_LOOP);
    548   glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
    549              cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
    550              cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
    551   glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
    552              cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
    553              cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
    554   glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
    555              cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
    556              cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
    557   glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
    558              cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
    559              cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
    560   glEnd();
    561 
    562 
    563   if( true)//depth != 0)
    564   {
    565     /* now draw the separation plane */
    566     Vector a1 = *this->bvElement->axis[(this->longestAxisIndex + 1)%3];
    567     Vector a2 = *this->bvElement->axis[(this->longestAxisIndex + 2)%3];
    568     Vector c = *this->bvElement->center;
    569     float l1 = this->bvElement->halfLength[(this->longestAxisIndex + 1)%3];
    570     float l2 = this->bvElement->halfLength[(this->longestAxisIndex + 2)%3];
    571     glBegin(GL_QUADS);
    572     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);
    573     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);
    574     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);
    575     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);
    576     glEnd();
     475  if( drawMode & DRAW_BV_AXIS || drawMode & DRAW_ALL)
     476  {
     477    if( drawMode & DRAW_SINGLE && depth == 0)
     478    {
     479      /* draw the obb axes */
     480      glBegin(GL_LINES);
     481      glColor3f(0.0, 0.4, 0.3);
     482      glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
     483      glVertex3f(this->bvElement->center->x + this->bvElement->axis[0]->x * this->bvElement->halfLength[0],
     484                 this->bvElement->center->y + this->bvElement->axis[0]->y * this->bvElement->halfLength[0],
     485                 this->bvElement->center->z + this->bvElement->axis[0]->z * this->bvElement->halfLength[0]);
     486
     487      glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
     488      glVertex3f(this->bvElement->center->x + this->bvElement->axis[1]->x * this->bvElement->halfLength[1],
     489                 this->bvElement->center->y + this->bvElement->axis[1]->y * this->bvElement->halfLength[1],
     490                 this->bvElement->center->z + this->bvElement->axis[1]->z * this->bvElement->halfLength[1]);
     491
     492      glVertex3f(this->bvElement->center->x, this->bvElement->center->y, this->bvElement->center->z);
     493      glVertex3f(this->bvElement->center->x + this->bvElement->axis[2]->x * this->bvElement->halfLength[2],
     494                 this->bvElement->center->y + this->bvElement->axis[2]->y * this->bvElement->halfLength[2],
     495                 this->bvElement->center->z + this->bvElement->axis[2]->z * this->bvElement->halfLength[2]);
     496      glEnd();
     497    }
     498  }
     499
     500
     501  if( drawMode & DRAW_BV_POLYGON || drawMode & DRAW_ALL)
     502  {
     503    if( drawMode & DRAW_SINGLE && depth == 0)
     504    {
     505      Vector cen = *this->bvElement->center;
     506      Vector** axis = this->bvElement->axis;
     507      float* len = this->bvElement->halfLength;
     508
     509      /* draw bounding box */
     510      glBegin(GL_LINE_LOOP);
     511      glColor3f(0.3, 0.4, 0.7);
     512      glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
     513                 cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
     514                 cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
     515      glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
     516                 cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
     517                 cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
     518      glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
     519                 cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
     520                 cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
     521      glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
     522                 cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
     523                 cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
     524      glEnd();
     525
     526      glBegin(GL_LINE_LOOP);
     527      glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
     528                 cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
     529                 cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
     530      glVertex3f(cen.x + axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
     531                 cen.y + axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
     532                 cen.z + axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
     533      glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
     534                 cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
     535                 cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
     536      glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
     537                 cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
     538                 cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
     539      glEnd();
     540
     541      glBegin(GL_LINE_LOOP);
     542      glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] + axis[2]->x * len[2],
     543                 cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] + axis[2]->y * len[2],
     544                 cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] + axis[2]->z * len[2]);
     545      glVertex3f(cen.x - axis[0]->x * len[0] - axis[1]->x * len[1] - axis[2]->x * len[2],
     546                 cen.y - axis[0]->y * len[0] - axis[1]->y * len[1] - axis[2]->y * len[2],
     547                 cen.z - axis[0]->z * len[0] - axis[1]->z * len[1] - axis[2]->z * len[2]);
     548      glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
     549                 cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
     550                 cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
     551      glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
     552                 cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
     553                 cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
     554      glEnd();
     555
     556      glBegin(GL_LINE_LOOP);
     557      glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
     558                 cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
     559                 cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
     560      glVertex3f(cen.x - axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
     561                 cen.y - axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
     562                 cen.z - axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
     563      glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] + axis[2]->x * len[2],
     564                 cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] + axis[2]->y * len[2],
     565                 cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] + axis[2]->z * len[2]);
     566      glVertex3f(cen.x + axis[0]->x * len[0] + axis[1]->x * len[1] - axis[2]->x * len[2],
     567                 cen.y + axis[0]->y * len[0] + axis[1]->y * len[1] - axis[2]->y * len[2],
     568                 cen.z + axis[0]->z * len[0] + axis[1]->z * len[1] - axis[2]->z * len[2]);
     569      glEnd();
     570    }
     571  }
     572
     573  if( drawMode & DRAW_SEPARATING_PLANE || drawMode & DRAW_ALL)
     574  {
     575    if( drawMode & DRAW_SINGLE && depth == 0)
     576    {
     577      /* now draw the separation plane */
     578      Vector a1 = *this->bvElement->axis[(this->longestAxisIndex + 1)%3];
     579      Vector a2 = *this->bvElement->axis[(this->longestAxisIndex + 2)%3];
     580      Vector c = *this->bvElement->center;
     581      float l1 = this->bvElement->halfLength[(this->longestAxisIndex + 1)%3];
     582      float l2 = this->bvElement->halfLength[(this->longestAxisIndex + 2)%3];
     583      glBegin(GL_QUADS);
     584      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);
     585      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);
     586      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);
     587      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);
     588      glEnd();
     589    }
    577590  }
    578591
    579592  if( this->nodeLeft != NULL && depth != 0 )
    580     this->nodeLeft->drawBVPolygon(depth - 1);
     593    this->nodeLeft->drawBV(depth - 1, drawMode);
    581594  if( this->nodeRight != NULL && depth != 0)
    582     this->nodeRight->drawBVPolygon(depth - 1);
    583 
    584 }
    585 
    586 
    587 void OBBTreeNode::drawBVBlended(int depth) const
    588 {}
     595    this->nodeRight->drawBV(depth - 1, drawMode);
     596
     597}
     598
    589599
    590600
Note: See TracChangeset for help on using the changeset viewer.