Back to index

supertuxkart  0.5+dfsg1
Functions
btAabbUtil2.h File Reference
#include "btVector3.h"
#include "btMinMax.h"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

SIMD_FORCE_INLINE void AabbExpand (btVector3 &aabbMin, btVector3 &aabbMax, const btVector3 &expansionMin, const btVector3 &expansionMax)
SIMD_FORCE_INLINE bool TestAabbAgainstAabb2 (const btVector3 &aabbMin1, const btVector3 &aabbMax1, const btVector3 &aabbMin2, const btVector3 &aabbMax2)
 conservative test for overlap between two aabbs
SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2 (const btVector3 *vertices, const btVector3 &aabbMin, const btVector3 &aabbMax)
 conservative test for overlap between triangle and aabb
SIMD_FORCE_INLINE int btOutcode (const btVector3 &p, const btVector3 &halfExtent)
SIMD_FORCE_INLINE bool btRayAabb2 (const btVector3 &rayFrom, const btVector3 &rayInvDirection, const unsigned int raySign[3], const btVector3 bounds[2], btScalar &tmin, btScalar lambda_min, btScalar lambda_max)
SIMD_FORCE_INLINE bool btRayAabb (const btVector3 &rayFrom, const btVector3 &rayTo, const btVector3 &aabbMin, const btVector3 &aabbMax, btScalar &param, btVector3 &normal)

Function Documentation

SIMD_FORCE_INLINE void AabbExpand ( btVector3 aabbMin,
btVector3 aabbMax,
const btVector3 expansionMin,
const btVector3 expansionMax 
)

Definition at line 23 of file btAabbUtil2.h.

{
       aabbMin = aabbMin + expansionMin;
       aabbMax = aabbMax + expansionMax;
}

Here is the caller graph for this function:

SIMD_FORCE_INLINE int btOutcode ( const btVector3 p,
const btVector3 halfExtent 
)

Definition at line 64 of file btAabbUtil2.h.

{
       return (p.getX()  < -halfExtent.getX() ? 0x01 : 0x0) |    
                 (p.getX() >  halfExtent.getX() ? 0x08 : 0x0) |
                 (p.getY() < -halfExtent.getY() ? 0x02 : 0x0) |    
                 (p.getY() >  halfExtent.getY() ? 0x10 : 0x0) |
                 (p.getZ() < -halfExtent.getZ() ? 0x4 : 0x0) |    
                 (p.getZ() >  halfExtent.getZ() ? 0x20 : 0x0);
}

Here is the call graph for this function:

Here is the caller graph for this function:

SIMD_FORCE_INLINE bool btRayAabb ( const btVector3 rayFrom,
const btVector3 rayTo,
const btVector3 aabbMin,
const btVector3 aabbMax,
btScalar param,
btVector3 normal 
)

Definition at line 110 of file btAabbUtil2.h.

{
       btVector3 aabbHalfExtent = (aabbMax-aabbMin)* btScalar(0.5);
       btVector3 aabbCenter = (aabbMax+aabbMin)* btScalar(0.5);
       btVector3     source = rayFrom - aabbCenter;
       btVector3     target = rayTo - aabbCenter;
       int    sourceOutcode = btOutcode(source,aabbHalfExtent);
       int targetOutcode = btOutcode(target,aabbHalfExtent);
       if ((sourceOutcode & targetOutcode) == 0x0)
       {
              btScalar lambda_enter = btScalar(0.0);
              btScalar lambda_exit  = param;
              btVector3 r = target - source;
              int i;
              btScalar      normSign = 1;
              btVector3     hitNormal(0,0,0);
              int bit=1;

              for (int j=0;j<2;j++)
              {
                     for (i = 0; i != 3; ++i)
                     {
                            if (sourceOutcode & bit)
                            {
                                   btScalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i];
                                   if (lambda_enter <= lambda)
                                   {
                                          lambda_enter = lambda;
                                          hitNormal.setValue(0,0,0);
                                          hitNormal[i] = normSign;
                                   }
                            }
                            else if (targetOutcode & bit) 
                            {
                                   btScalar lambda = (-source[i] - aabbHalfExtent[i]*normSign) / r[i];
                                   btSetMin(lambda_exit, lambda);
                            }
                            bit<<=1;
                     }
                     normSign = btScalar(-1.);
              }
              if (lambda_enter <= lambda_exit)
              {
                     param = lambda_enter;
                     normal = hitNormal;
                     return true;
              }
       }
       return false;
}

Here is the call graph for this function:

Here is the caller graph for this function:

SIMD_FORCE_INLINE bool btRayAabb2 ( const btVector3 rayFrom,
const btVector3 rayInvDirection,
const unsigned int  raySign[3],
const btVector3  bounds[2],
btScalar tmin,
btScalar  lambda_min,
btScalar  lambda_max 
)

Definition at line 75 of file btAabbUtil2.h.

{
       btScalar tmax, tymin, tymax, tzmin, tzmax;
       tmin = (bounds[raySign[0]][0] - rayFrom[0]) * rayInvDirection[0];
       tmax = (bounds[1-raySign[0]][0] - rayFrom[0]) * rayInvDirection[0];
       tymin = (bounds[raySign[1]][1] - rayFrom[1]) * rayInvDirection[1];
       tymax = (bounds[1-raySign[1]][1] - rayFrom[1]) * rayInvDirection[1];

       if ( (tmin > tymax) || (tymin > tmax) )
              return false;

       if (tymin > tmin)
              tmin = tymin;

       if (tymax < tmax)
              tmax = tymax;

       tzmin = (bounds[raySign[2]][2] - rayFrom[2]) * rayInvDirection[2];
       tzmax = (bounds[1-raySign[2]][2] - rayFrom[2]) * rayInvDirection[2];

       if ( (tmin > tzmax) || (tzmin > tmax) )
              return false;
       if (tzmin > tmin)
              tmin = tzmin;
       if (tzmax < tmax)
              tmax = tzmax;
       return ( (tmin < lambda_max) && (tmax > lambda_min) );
}
SIMD_FORCE_INLINE bool TestAabbAgainstAabb2 ( const btVector3 aabbMin1,
const btVector3 aabbMax1,
const btVector3 aabbMin2,
const btVector3 aabbMax2 
)

conservative test for overlap between two aabbs

Definition at line 34 of file btAabbUtil2.h.

{
       bool overlap = true;
       overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap;
       overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap;
       overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap;
       return overlap;
}

Here is the caller graph for this function:

SIMD_FORCE_INLINE bool TestTriangleAgainstAabb2 ( const btVector3 vertices,
const btVector3 aabbMin,
const btVector3 aabbMax 
)

conservative test for overlap between triangle and aabb

Definition at line 45 of file btAabbUtil2.h.

{
       const btVector3 &p1 = vertices[0];
       const btVector3 &p2 = vertices[1];
       const btVector3 &p3 = vertices[2];

       if (btMin(btMin(p1[0], p2[0]), p3[0]) > aabbMax[0]) return false;
       if (btMax(btMax(p1[0], p2[0]), p3[0]) < aabbMin[0]) return false;

       if (btMin(btMin(p1[2], p2[2]), p3[2]) > aabbMax[2]) return false;
       if (btMax(btMax(p1[2], p2[2]), p3[2]) < aabbMin[2]) return false;
  
       if (btMin(btMin(p1[1], p2[1]), p3[1]) > aabbMax[1]) return false;
       if (btMax(btMax(p1[1], p2[1]), p3[1]) < aabbMin[1]) return false;
       return true;
}

Here is the call graph for this function:

Here is the caller graph for this function: