VRUT::GeometryTriangles Class Reference

Container for triangulated geometry. More...

#include <geometrytriangles.h>

Inheritance diagram for VRUT::GeometryTriangles:

VRUT::Geometry

List of all members.

Public Types

enum  PRIMITIVE_TYPE {
  TRI_LIST, TRI_FAN, TRI_STRIP, POLYGON,
  LINES, LINE_STRIP, POINTS, QUADS
}
 Prmitive organization. More...
typedef unsigned Indice
typedef VECTOR2 TexCoord
typedef std::vector< std::pair
< Indice, PRIMITIVE_TYPE > > 
TriDescList

Public Member Functions

 GeometryTriangles (const wxString &_name)
 Class constructor.
 GeometryTriangles (const GeometryTriangles &g)
 Copy constructor.
virtual void BuildAABB ()
 Build AABB - Geometry overload.
virtual std::vector< TriangleTriangulate () const
 Get geometry as list of triangles.
virtual bool Intersects (const Ray &ray, float *dist=(float *) NULL) const
virtual bool CastRay (const Ray &ray, RayIntersectionInfo &info) const
virtual void AddBox (const vector3 &position, const vector3 &size)
 Add Box to geometry.
virtual wxString ToString () const
 Get string with geometry properties - Geometry overload.
virtual GeometryClone () const
 Get copy of instance - Geometry overload.

Public Attributes

std::vector< VECTOR3vertices
 Vertices.
std::vector< Indiceindices
 Indices.
std::vector< VECTOR3normals
 Normals.
std::vector< TexCoordtexCoords
 Texture coordinates.
TriDescList triDescList
 Each element defines primitive organization and index to Indices where it starts.


Detailed Description

Container for triangulated geometry.

Definition at line 23 of file geometrytriangles.h.


Member Typedef Documentation

Definition at line 26 of file geometrytriangles.h.

Definition at line 27 of file geometrytriangles.h.

typedef std::vector<std::pair<Indice, PRIMITIVE_TYPE> > VRUT::GeometryTriangles::TriDescList

Definition at line 40 of file geometrytriangles.h.


Member Enumeration Documentation

Prmitive organization.

Enumerator:
TRI_LIST  Triangle list.
TRI_FAN  Triangle fan.
TRI_STRIP  Triangle strip.
POLYGON  Polygon.
LINES  Lines.
LINE_STRIP  Line strip.
POINTS  Points.
QUADS  Quads.

Definition at line 29 of file geometrytriangles.h.

00030               {
00031                      TRI_LIST,     
00032                      TRI_FAN,      
00033                      TRI_STRIP,    
00034                      POLYGON,      
00035                      LINES,        
00036                      LINE_STRIP,   
00037                      POINTS,              
00038                      QUADS         
00039               };


Constructor & Destructor Documentation

VRUT::GeometryTriangles::GeometryTriangles ( const wxString &  _name  )  [inline]

Class constructor.

Definition at line 54 of file geometrytriangles.h.

00054                                                         : Geometry(_name)
00055               {
00056                      type = GEOMETRY_TRIANGLE;
00057               }

VRUT::GeometryTriangles::GeometryTriangles ( const GeometryTriangles g  )  [inline]

Copy constructor.

Definition at line 60 of file geometrytriangles.h.

00060                                                              : Geometry(g)
00061               {
00062                      indices.assign(g.indices.begin(), g.indices.end());
00063                      normals.assign(g.normals.begin(), g.normals.end());
00064                      texCoords.assign(g.texCoords.begin(), g.texCoords.end());
00065                      triDescList.assign(g.triDescList.begin(), g.triDescList.end());
00066                      vertices.assign(g.vertices.begin(), g.vertices.end());
00067               }


Member Function Documentation

virtual void VRUT::GeometryTriangles::BuildAABB (  )  [inline, virtual]

Build AABB - Geometry overload.

Fix zero volume AABB

Implements VRUT::Geometry.

Definition at line 70 of file geometrytriangles.h.

00071               {
00072                      if (!vertices.empty())
00073                      {
00074                             std::vector<VECTOR3>::const_iterator v = vertices.begin();
00075                             aabb.MinBound = aabb.MaxBound = *v;
00076                             VECTOR3 * minB = &aabb.MinBound;
00077                             VECTOR3 * maxB = &aabb.MaxBound;
00078                             for (++v; v != vertices.end(); v++)
00079                             {
00080                                    if (v->x < minB->x)
00081                                           minB->x = v->x;
00082                                    else if (v->x > maxB->x)
00083                                           maxB->x = v->x;
00084                                    if (v->y < minB->y)
00085                                           minB->y = v->y;
00086                                    else if (v->y > maxB->y)
00087                                           maxB->y = v->y;
00088                                    if (v->z < minB->z)
00089                                           minB->z = v->z;
00090                                    else if (v->z > maxB->z)
00091                                           maxB->z = v->z;
00092                             }
00094                             if (ABS(minB->x - maxB->x) < EPSILON)
00095                             {
00096                                    minB->x -= EPSILON;
00097                                    maxB->x += EPSILON;
00098                             }
00099                             if (ABS(minB->y - maxB->y) < EPSILON)
00100                             {
00101                                    minB->y -= EPSILON;
00102                                    maxB->y += EPSILON;
00103                             }
00104                             if (ABS(minB->z - maxB->z) < EPSILON)
00105                             {
00106                                    minB->z -= EPSILON;
00107                                    maxB->z += EPSILON;
00108                             }
00109                      }
00110                      else
00111                      {
00112                             aabb.MinBound = aabb.MaxBound = VECTOR3(0,0,0);
00113                      }
00114               }

virtual std::vector<Triangle> VRUT::GeometryTriangles::Triangulate (  )  const [inline, virtual]

Get geometry as list of triangles.

Implements VRUT::Geometry.

Definition at line 117 of file geometrytriangles.h.

00118               {
00119                      size_t indiceIndex = 0;
00120                      size_t maxInd = indices.size();
00121                      std::vector<Triangle> triangleList;
00122 
00123                      for (GeometryTriangles::TriDescList::const_iterator indPrimType = triDescList.begin();
00124                             indPrimType != triDescList.end(); indPrimType++)
00125                      {
00126                             GeometryTriangles::TriDescList::const_iterator endIndPrimType = indPrimType + 1;
00127                             size_t endInd = ( endIndPrimType == triDescList.end() ? maxInd : endIndPrimType->first );
00128                             endInd = __min( endInd, maxInd );
00129 
00130                             switch (indPrimType->second)
00131                             {
00132                             case GeometryTriangles::TRI_LIST:
00133                                    for ( ;       indiceIndex + 2 < endInd; )
00134                                    {
00135                                           Triangle triangle;
00136                                           triangle.v1 = vertices[indices[indiceIndex++]]._v;
00137                                           triangle.v2 = vertices[indices[indiceIndex++]]._v;
00138                                           triangle.v3 = vertices[indices[indiceIndex++]]._v;
00139                                           triangleList.push_back(triangle);
00140                                    }
00141                                    break;
00142                             case GeometryTriangles::TRI_FAN:
00143                             case GeometryTriangles::POLYGON:
00144                                    {
00145                                           VECTOR3 last1, last2;
00146                                           if (indiceIndex + 1 < endInd)
00147                                           {
00148                                                  last1 = vertices[indices[indiceIndex++]]._v;
00149                                                  last2 = vertices[indices[indiceIndex++]]._v;
00150                                           }
00151                                           for ( ;       indiceIndex < endInd; )
00152                                           {
00153                                                  VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00154                                                  triangleList.push_back(Triangle(last1, last2, next));
00155                                                  last2 = next;
00156                                           }
00157                                    }
00158                                    break;
00159                             case GeometryTriangles::TRI_STRIP:
00160                                    {
00161                                           VECTOR3 last1, last2;
00162                                           if (indiceIndex + 1 < endInd)
00163                                           {
00164                                                  last1 = vertices[indices[indiceIndex++]]._v;
00165                                                  last2 = vertices[indices[indiceIndex++]]._v;
00166                                           }
00167                                           bool sw = true;
00168                                           for ( ;       indiceIndex < endInd; sw = !sw)
00169                                           {
00170                                                  VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00171                                                  if (sw)
00172                                                         triangleList.push_back(Triangle(last1, next, last2));
00173                                                  else
00174                                                         triangleList.push_back(Triangle(last1, last2, next));
00175                                                  last1 = last2;
00176                                                  last2 = next;
00177                                           }
00178                                    }
00179                                    break;
00180                             case GeometryTriangles::QUADS:
00181                                    for ( ;       indiceIndex + 3 < endInd; )
00182                                    {
00183                                           VECTOR3 v0 = vertices[indices[indiceIndex++]]._v;
00184                                           VECTOR3 v1 = vertices[indices[indiceIndex++]]._v;
00185                                           VECTOR3 v2 = vertices[indices[indiceIndex++]]._v;
00186                                           VECTOR3 v3 = vertices[indices[indiceIndex++]]._v;
00187                                           triangleList.push_back(Triangle(v0, v1, v2));
00188                                           triangleList.push_back(Triangle(v0, v2, v3));
00189                                    }
00190                                    break;
00191                             default:
00192                                    break;
00193                             }
00194                      }
00195                      return triangleList;
00196               }

virtual bool VRUT::GeometryTriangles::Intersects ( const Ray ray,
float *  dist = (float *)NULL 
) const [inline, virtual]

Check if ray intersects geometry, get intersection point distance from ray origin if it does - Geometry overload NOTE: everything must be in one space (model space by default), dist will be in that space too!

Implements VRUT::Geometry.

Definition at line 200 of file geometrytriangles.h.

00201               {
00202                      float bestDist = MAX_FLOAT;
00203                      bool found = false;
00204                      size_t indiceIndex = 0;
00205                      size_t maxInd = indices.size();
00206 
00207                      for (GeometryTriangles::TriDescList::const_iterator indPrimType = triDescList.begin();
00208                             indPrimType != triDescList.end(); indPrimType++)
00209                      {
00210                             GeometryTriangles::TriDescList::const_iterator endIndPrimType = indPrimType + 1;
00211                             size_t endInd = ( endIndPrimType == triDescList.end() ? maxInd : endIndPrimType->first );
00212                             endInd = __min( endInd, maxInd );
00213 
00214                             switch (indPrimType->second)
00215                             {
00216                             case GeometryTriangles::TRI_LIST:
00217                                    for ( ;       indiceIndex + 2 < endInd; )
00218                                    {
00219                                           VECTOR3 v0 = vertices[indices[indiceIndex++]]._v;
00220                                           VECTOR3 v1 = vertices[indices[indiceIndex++]]._v;
00221                                           VECTOR3 v2 = vertices[indices[indiceIndex++]]._v;
00222                                           float actDist;
00223                                           if (ray.IntersectsTri(v0, v1, v2, &actDist) && actDist < bestDist)
00224                                           {
00225                                                  found = true;
00226                                                  bestDist = actDist;
00227                                           }
00228                                    }
00229                                    break;
00230                             case GeometryTriangles::TRI_FAN:
00231                             case GeometryTriangles::POLYGON:
00232                                    {
00233                                           VECTOR3 last1, last2;
00234                                           if (indiceIndex + 1 < endInd)
00235                                           {
00236                                                  last1 = vertices[indices[indiceIndex++]]._v;
00237                                                  last2 = vertices[indices[indiceIndex++]]._v;
00238                                           }
00239                                           for ( ;       indiceIndex < endInd; )
00240                                           {
00241                                                  VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00242                                                  float actDist;
00243                                                  if (ray.IntersectsTri(last1, last2, next, &actDist) && actDist < bestDist)
00244                                                  {
00245                                                         found = true;
00246                                                         bestDist = actDist;
00247                                                  }
00248                                                  last2 = next;
00249                                           }
00250                                    }
00251                                    break;
00252                             case GeometryTriangles::TRI_STRIP:
00253                                    {
00254                                           VECTOR3 last1, last2;
00255                                           if (indiceIndex + 1 < endInd)
00256                                           {
00257                                                  last1 = vertices[indices[indiceIndex++]]._v;
00258                                                  last2 = vertices[indices[indiceIndex++]]._v;
00259                                           }
00260                                           bool sw = true;
00261                                           for ( ;       indiceIndex < endInd; sw = !sw)
00262                                           {
00263                                                  VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00264                                                  float actDist;
00265                                                  if (sw)
00266                                                  {
00267                                                         if (ray.IntersectsTri(last1, next, last2, &actDist) && actDist < bestDist)
00268                                                         {
00269                                                                found = true;
00270                                                                bestDist = actDist;
00271                                                         }
00272                                                  }
00273                                                  else
00274                                                  {
00275                                                         if (ray.IntersectsTri(last1, last2, next, &actDist) && actDist < bestDist)
00276                                                         {
00277                                                                found = true;
00278                                                                bestDist = actDist;
00279                                                         }
00280                                                  }
00281                                                  last1 = last2;
00282                                                  last2 = next;
00283                                           }
00284                                    }
00285                                    break;
00286                             case GeometryTriangles::QUADS:
00287                                    for ( ;       indiceIndex + 3 < endInd; )
00288                                    {
00289                                           VECTOR3 v0 = vertices[indices[indiceIndex++]]._v;
00290                                           VECTOR3 v1 = vertices[indices[indiceIndex++]]._v;
00291                                           VECTOR3 v2 = vertices[indices[indiceIndex++]]._v;
00292                                           VECTOR3 v3 = vertices[indices[indiceIndex++]]._v;
00293                                           float actDist;
00294                                           if (ray.IntersectsTri(v0, v1, v2, &actDist) && actDist < bestDist)
00295                                           {
00296                                                  found = true;
00297                                                  bestDist = actDist;
00298                                           }
00299                                           if (ray.IntersectsTri(v0, v2, v3, &actDist) && actDist < bestDist)
00300                                           {
00301                                                  found = true;
00302                                                  bestDist = actDist;
00303                                           }
00304                                    }
00305                                    break;
00306                             default:
00307                                    break;
00308                             }
00309                      }
00310 
00311                      if (found && dist)
00312                             *dist = bestDist;
00313 
00314                      return found;
00315               }

virtual bool VRUT::GeometryTriangles::CastRay ( const Ray ray,
RayIntersectionInfo info 
) const [inline, virtual]

Cast ray towards the geometry, get intersection info if it does NOTE: everything must be in one space (model space by default), intersection info will be in that space too!

Reimplemented from VRUT::Geometry.

Definition at line 317 of file geometrytriangles.h.

00317                                                                                 {
00318               float bestDist = 1e9f;
00319               size_t bestIndex = (size_t)~(size_t(0));
00320               size_t indiceIndex = 0;
00321               size_t maxInd = indices.size();
00322               
00323               for (GeometryTriangles::TriDescList::const_iterator indPrimType = triDescList.begin();
00324                       indPrimType != triDescList.end(); indPrimType++)
00325                 {
00326                      GeometryTriangles::TriDescList::const_iterator endIndPrimType = indPrimType + 1;
00327                      size_t endInd = ( endIndPrimType == triDescList.end() ? maxInd : endIndPrimType->first );
00328                      endInd = __min( endInd, maxInd );
00329                      
00330                      switch (indPrimType->second)
00331                        {
00332                        case GeometryTriangles::TRI_LIST:
00333                             for ( ;       indiceIndex + 2 < endInd; )
00334                               {
00335                                    VECTOR3 v0 = vertices[indices[indiceIndex++]]._v;
00336                                    VECTOR3 v1 = vertices[indices[indiceIndex++]]._v;
00337                                    VECTOR3 v2 = vertices[indices[indiceIndex++]]._v;
00338                                    float actDist;
00339                                    if (ray.IntersectsTri(v0, v1, v2, &actDist) && actDist < bestDist)
00340                                      {
00341                                           bestIndex = indiceIndex-1;
00342                                           info.normal = Normalize(CrossProd(v0-v1, v2-v1));
00343                                           bestDist = actDist;
00344                                                                                     }
00345                               }
00346                             break;
00347                        case GeometryTriangles::TRI_FAN:
00348                        case GeometryTriangles::POLYGON:
00349                             {
00350                               VECTOR3 last1, last2;
00351                               if (indiceIndex + 1 < endInd)
00352                                    {
00353                                      last1 = vertices[indices[indiceIndex++]]._v;
00354                                      last2 = vertices[indices[indiceIndex++]]._v;
00355                                    }
00356                               for ( ;     indiceIndex < endInd; )
00357                                    {
00358                                      VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00359                                      float actDist;
00360                                      if (ray.IntersectsTri(last1, last2, next, &actDist) && actDist < bestDist)
00361                                           {
00362                                             bestIndex = indiceIndex-1;
00363                                             info.normal = Normalize(CrossProd(last1-last2, next-last2));
00364                                             bestDist = actDist;
00365                                                                                       }
00366                                      last2 = next;
00367                                    }
00368                             }
00369                             break;
00370                        case GeometryTriangles::TRI_STRIP:
00371                             {
00372                               VECTOR3 last1, last2;
00373                               if (indiceIndex + 1 < endInd)
00374                                    {
00375                                      last1 = vertices[indices[indiceIndex++]]._v;
00376                                      last2 = vertices[indices[indiceIndex++]]._v;
00377                                    }
00378                               bool sw = true;
00379                               for ( ;     indiceIndex < endInd; sw = !sw)
00380                                    {
00381                                      VECTOR3 next = vertices[indices[indiceIndex++]]._v;
00382                                      float actDist;
00383                                      if (sw)
00384                                           {
00385                                             if (ray.IntersectsTri(last1, next, last2, &actDist) && actDist < bestDist)
00386                                                  {
00387                                                    bestIndex = indiceIndex-1;
00388                                                    info.normal = Normalize(CrossProd(last1-next, last2-next));
00389                                                    bestDist = actDist;
00390                                                                                              }
00391                                           }
00392                                      else
00393                                           {
00394                                             if (ray.IntersectsTri(last1, last2, next, &actDist) && actDist < bestDist)
00395                                                  {
00396                                                    bestIndex = indiceIndex-1;
00397                                                    info.normal = Normalize(CrossProd(last1-last2, next-last2));
00398                                                    bestDist = actDist;
00399                                                  }
00400                                           }
00401                                      last1 = last2;
00402                                      last2 = next;
00403                                    }
00404                             }
00405                             break;
00406                        case GeometryTriangles::QUADS:
00407                             for ( ;       indiceIndex + 3 < endInd; )
00408                               {
00409                                    VECTOR3 v0 = vertices[indices[indiceIndex++]]._v;
00410                                    VECTOR3 v1 = vertices[indices[indiceIndex++]]._v;
00411                                    VECTOR3 v2 = vertices[indices[indiceIndex++]]._v;
00412                                    VECTOR3 v3 = vertices[indices[indiceIndex++]]._v;
00413                                    float actDist;
00414                                    if (ray.IntersectsTri(v0, v1, v2, &actDist) && actDist < bestDist)
00415                                      {
00416                                           bestIndex = indiceIndex-2;
00417                                           info.normal = Normalize(CrossProd(v0-v1, v2-v1));
00418                                           bestDist = actDist;
00419                                      }
00420                                    if (ray.IntersectsTri(v0, v2, v3, &actDist) && actDist < bestDist)
00421                                      {
00422                                           bestIndex = indiceIndex-1;
00423                                           info.normal = Normalize(CrossProd(v0-v2, v3-v2));
00424                                           bestDist = actDist;
00425                                      }
00426                               }
00427                             break;
00428                        default:
00429                             break;
00430                        }
00431                 }
00432               
00433               if (bestIndex!=(size_t)~(size_t(0))) {
00434                 info.dist = bestDist;
00435                 info.geometryID = bestIndex;
00436                 return true;
00437               }
00438               
00439               return false;
00440          }

virtual void VRUT::GeometryTriangles::AddBox ( const vector3 position,
const vector3 size 
) [inline, virtual]

Add Box to geometry.

Implements VRUT::Geometry.

Definition at line 442 of file geometrytriangles.h.

00443          {
00444                      float box[6];
00445                      box[0] = position._v[0];
00446                      box[1] = position._v[1];
00447                      box[2] = position._v[2];
00448                      box[3] = position._v[0]+size._v[0];
00449                      box[4] = position._v[1]+size._v[1];
00450                      box[5] = position._v[2]+size._v[2];
00451                      GeometryTriangles::Indice startInd = GeometryTriangles::Indice(vertices.size());
00452 
00453                      std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType(startInd, GeometryTriangles::QUADS);
00454                      triDescList.push_back(indType);
00455 
00456                      float norms[]={0.0f,0.0f,1.0f, 0.0f,0.0f,-1.0f, -1.0f,0.0f,0.0f, 1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 0.0f,1.0f,0.0f};
00457                      float textC[]={0.0f,0.0f, 1.0f,0.0f, 1.0f,1.0f, 0.0f,1.0f};
00458                      int verI[]={0,1,5, 3,1,5, 3,4,5, 0,4,5,  3,1,2, 0,1,2, 0,4,2, 3,4,2,  0,1,2, 0,1,5, 0,4,5, 0,4,2,  3,1,5, 3,1,2, 3,4,2, 3,4,5,  0,4,5, 3,4,5, 3,4,2, 0,4,2,  0,1,5, 3,1,5, 3,1,2, 0,1,2};
00459                      size_t k=0;
00460                      for (size_t i=0; i<6; i++)
00461                      {
00462                             for (size_t j=0; j<4; j++)
00463                             {
00464                                    normals.push_back(VECTOR3(norms+i*3));
00465                                    texCoords.push_back(GeometryTriangles::TexCoord(textC+j*2));
00466                                    vertices.push_back(VECTOR3(box[verI[k]], box[verI[k+1]], box[verI[k+2]]));
00467                                    k+=3;
00468                                    indices.push_back(startInd++);
00469                             }
00470                      }
00471               }

virtual wxString VRUT::GeometryTriangles::ToString (  )  const [inline, virtual]

Get string with geometry properties - Geometry overload.

Reimplemented from VRUT::Geometry.

Definition at line 474 of file geometrytriangles.h.

00475               {
00476                      wxStringOutputStream strout;
00477                      wxTextOutputStream txtout(strout);
00478                      txtout << Geometry::ToString().c_str();
00479                      txtout << wxT("Vertices:");
00480                      for (std::vector<VECTOR3>::const_iterator vecIt = vertices.begin(); vecIt != vertices.end(); vecIt++)
00481                             txtout << wxT(" ") << vecIt->ToString();
00482 
00483                      txtout << wxT("\nNormals:");
00484                      for (std::vector<VECTOR3>::const_iterator normIt = normals.begin(); normIt != normals.end(); normIt++)
00485                             txtout << wxT(" ") << normIt->ToString();
00486 
00487                      txtout << wxT("\nIndices:");
00488                      size_t indiceIndex = 0;
00489                      size_t maxInd = indices.size();
00490                      for (GeometryTriangles::TriDescList::const_iterator indPrimType = triDescList.begin();
00491                             indPrimType != triDescList.end(); indPrimType++)
00492                      {
00493                             txtout << wxT("\n  Primitive type: ") << indPrimType->second << wxT("\n");
00494                             GeometryTriangles::TriDescList::const_iterator endIndPrimType = indPrimType + 1;
00495                             size_t endInd = ( endIndPrimType == triDescList.end() ? maxInd : endIndPrimType->first );
00496                             endInd = __min( endInd, maxInd );
00497 
00498                             for ( ;       indiceIndex < endInd; indiceIndex++)
00499                                    txtout << wxT(" ") << unsigned(indices[indiceIndex]);
00500                      }
00501                      txtout << wxT("\n");
00502                      return strout.GetString();
00503               }

virtual Geometry* VRUT::GeometryTriangles::Clone (  )  const [inline, virtual]

Get copy of instance - Geometry overload.

Implements VRUT::Geometry.

Definition at line 505 of file geometrytriangles.h.

00506               {
00507                      return new GeometryTriangles(*this);
00508               }


Member Data Documentation

Vertices.

Definition at line 43 of file geometrytriangles.h.

Indices.

Definition at line 45 of file geometrytriangles.h.

Normals.

Definition at line 47 of file geometrytriangles.h.

Texture coordinates.

Definition at line 49 of file geometrytriangles.h.

Each element defines primitive organization and index to Indices where it starts.

Definition at line 51 of file geometrytriangles.h.


The documentation for this class was generated from the following file:

Generated on Tue Mar 10 14:41:43 2009 for VRUT by  doxygen 1.5.5