Blender V2.61 - r43446

btBoxCollision.h

Go to the documentation of this file.
00001 #ifndef BT_BOX_COLLISION_H_INCLUDED
00002 #define BT_BOX_COLLISION_H_INCLUDED
00003 
00007 /*
00008 This source file is part of GIMPACT Library.
00009 
00010 For the latest info, see http://gimpact.sourceforge.net/
00011 
00012 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
00013 email: projectileman@yahoo.com
00014 
00015 
00016 This software is provided 'as-is', without any express or implied warranty.
00017 In no event will the authors be held liable for any damages arising from the use of this software.
00018 Permission is granted to anyone to use this software for any purpose,
00019 including commercial applications, and to alter it and redistribute it freely,
00020 subject to the following restrictions:
00021 
00022 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
00023 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
00024 3. This notice may not be removed or altered from any source distribution.
00025 */
00026 
00027 #include "LinearMath/btTransform.h"
00028 
00029 
00031 #define BT_SWAP_NUMBERS(a,b){ \
00032     a = a+b; \
00033     b = a-b; \
00034     a = a-b; \
00035 }\
00036 
00037 
00038 #define BT_MAX(a,b) (a<b?b:a)
00039 #define BT_MIN(a,b) (a>b?b:a)
00040 
00041 #define BT_GREATER(x, y)    btFabs(x) > (y)
00042 
00043 #define BT_MAX3(a,b,c) BT_MAX(a,BT_MAX(b,c))
00044 #define BT_MIN3(a,b,c) BT_MIN(a,BT_MIN(b,c))
00045 
00046 
00047 
00048 
00049 
00050 
00051 enum eBT_PLANE_INTERSECTION_TYPE
00052 {
00053     BT_CONST_BACK_PLANE = 0,
00054     BT_CONST_COLLIDE_PLANE,
00055     BT_CONST_FRONT_PLANE
00056 };
00057 
00058 //SIMD_FORCE_INLINE bool test_cross_edge_box(
00059 //  const btVector3 & edge,
00060 //  const btVector3 & absolute_edge,
00061 //  const btVector3 & pointa,
00062 //  const btVector3 & pointb, const btVector3 & extend,
00063 //  int dir_index0,
00064 //  int dir_index1
00065 //  int component_index0,
00066 //  int component_index1)
00067 //{
00068 //  // dir coords are -z and y
00069 //
00070 //  const btScalar dir0 = -edge[dir_index0];
00071 //  const btScalar dir1 = edge[dir_index1];
00072 //  btScalar pmin = pointa[component_index0]*dir0 + pointa[component_index1]*dir1;
00073 //  btScalar pmax = pointb[component_index0]*dir0 + pointb[component_index1]*dir1;
00074 //  //find minmax
00075 //  if(pmin>pmax)
00076 //  {
00077 //      BT_SWAP_NUMBERS(pmin,pmax);
00078 //  }
00079 //  //find extends
00080 //  const btScalar rad = extend[component_index0] * absolute_edge[dir_index0] +
00081 //                  extend[component_index1] * absolute_edge[dir_index1];
00082 //
00083 //  if(pmin>rad || -rad>pmax) return false;
00084 //  return true;
00085 //}
00086 //
00087 //SIMD_FORCE_INLINE bool test_cross_edge_box_X_axis(
00088 //  const btVector3 & edge,
00089 //  const btVector3 & absolute_edge,
00090 //  const btVector3 & pointa,
00091 //  const btVector3 & pointb, btVector3 & extend)
00092 //{
00093 //
00094 //  return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,2,1,1,2);
00095 //}
00096 //
00097 //
00098 //SIMD_FORCE_INLINE bool test_cross_edge_box_Y_axis(
00099 //  const btVector3 & edge,
00100 //  const btVector3 & absolute_edge,
00101 //  const btVector3 & pointa,
00102 //  const btVector3 & pointb, btVector3 & extend)
00103 //{
00104 //
00105 //  return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,0,2,2,0);
00106 //}
00107 //
00108 //SIMD_FORCE_INLINE bool test_cross_edge_box_Z_axis(
00109 //  const btVector3 & edge,
00110 //  const btVector3 & absolute_edge,
00111 //  const btVector3 & pointa,
00112 //  const btVector3 & pointb, btVector3 & extend)
00113 //{
00114 //
00115 //  return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,1,0,0,1);
00116 //}
00117 
00118 
00119 #define TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,i_dir_0,i_dir_1,i_comp_0,i_comp_1)\
00120 {\
00121     const btScalar dir0 = -edge[i_dir_0];\
00122     const btScalar dir1 = edge[i_dir_1];\
00123     btScalar pmin = pointa[i_comp_0]*dir0 + pointa[i_comp_1]*dir1;\
00124     btScalar pmax = pointb[i_comp_0]*dir0 + pointb[i_comp_1]*dir1;\
00125     if(pmin>pmax)\
00126     {\
00127         BT_SWAP_NUMBERS(pmin,pmax); \
00128     }\
00129     const btScalar abs_dir0 = absolute_edge[i_dir_0];\
00130     const btScalar abs_dir1 = absolute_edge[i_dir_1];\
00131     const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1;\
00132     if(pmin>rad || -rad>pmax) return false;\
00133 }\
00134 
00135 
00136 #define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
00137 {\
00138     TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,2,1,1,2);\
00139 }\
00140 
00141 #define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
00142 {\
00143     TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,0,2,2,0);\
00144 }\
00145 
00146 #define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
00147 {\
00148     TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,1,0,0,1);\
00149 }\
00150 
00151 
00153 SIMD_FORCE_INLINE btScalar bt_mat3_dot_col(
00154 const btMatrix3x3 & mat, const btVector3 & vec3, int colindex)
00155 {
00156     return vec3[0]*mat[0][colindex] + vec3[1]*mat[1][colindex] + vec3[2]*mat[2][colindex];
00157 }
00158 
00159 
00161 ATTRIBUTE_ALIGNED16 (class) BT_BOX_BOX_TRANSFORM_CACHE
00162 {
00163 public:
00164     btVector3  m_T1to0;
00165     btMatrix3x3 m_R1to0;
00166     btMatrix3x3 m_AR;
00167 
00168     SIMD_FORCE_INLINE void calc_absolute_matrix()
00169     {
00170 //      static const btVector3 vepsi(1e-6f,1e-6f,1e-6f);
00171 //      m_AR[0] = vepsi + m_R1to0[0].absolute();
00172 //      m_AR[1] = vepsi + m_R1to0[1].absolute();
00173 //      m_AR[2] = vepsi + m_R1to0[2].absolute();
00174 
00175         int i,j;
00176 
00177         for(i=0;i<3;i++)
00178         {
00179             for(j=0;j<3;j++ )
00180             {
00181                 m_AR[i][j] = 1e-6f + btFabs(m_R1to0[i][j]);
00182             }
00183         }
00184 
00185     }
00186 
00187     BT_BOX_BOX_TRANSFORM_CACHE()
00188     {
00189     }
00190 
00191 
00192 
00194     SIMD_FORCE_INLINE void calc_from_homogenic(const btTransform & trans0,const btTransform & trans1)
00195     {
00196 
00197         btTransform temp_trans = trans0.inverse();
00198         temp_trans = temp_trans * trans1;
00199 
00200         m_T1to0 = temp_trans.getOrigin();
00201         m_R1to0 = temp_trans.getBasis();
00202 
00203 
00204         calc_absolute_matrix();
00205     }
00206 
00208     SIMD_FORCE_INLINE void calc_from_full_invert(const btTransform & trans0,const btTransform & trans1)
00209     {
00210         m_R1to0 = trans0.getBasis().inverse();
00211         m_T1to0 = m_R1to0 * (-trans0.getOrigin());
00212 
00213         m_T1to0 += m_R1to0*trans1.getOrigin();
00214         m_R1to0 *= trans1.getBasis();
00215 
00216         calc_absolute_matrix();
00217     }
00218 
00219     SIMD_FORCE_INLINE btVector3 transform(const btVector3 & point) const
00220     {
00221         return btVector3(m_R1to0[0].dot(point) + m_T1to0.x(),
00222             m_R1to0[1].dot(point) + m_T1to0.y(),
00223             m_R1to0[2].dot(point) + m_T1to0.z());
00224     }
00225 };
00226 
00227 
00228 #define BOX_PLANE_EPSILON 0.000001f
00229 
00231 ATTRIBUTE_ALIGNED16 (class) btAABB
00232 {
00233 public:
00234     btVector3 m_min;
00235     btVector3 m_max;
00236 
00237     btAABB()
00238     {}
00239 
00240 
00241     btAABB(const btVector3 & V1,
00242              const btVector3 & V2,
00243              const btVector3 & V3)
00244     {
00245         m_min[0] = BT_MIN3(V1[0],V2[0],V3[0]);
00246         m_min[1] = BT_MIN3(V1[1],V2[1],V3[1]);
00247         m_min[2] = BT_MIN3(V1[2],V2[2],V3[2]);
00248 
00249         m_max[0] = BT_MAX3(V1[0],V2[0],V3[0]);
00250         m_max[1] = BT_MAX3(V1[1],V2[1],V3[1]);
00251         m_max[2] = BT_MAX3(V1[2],V2[2],V3[2]);
00252     }
00253 
00254     btAABB(const btVector3 & V1,
00255              const btVector3 & V2,
00256              const btVector3 & V3,
00257              btScalar margin)
00258     {
00259         m_min[0] = BT_MIN3(V1[0],V2[0],V3[0]);
00260         m_min[1] = BT_MIN3(V1[1],V2[1],V3[1]);
00261         m_min[2] = BT_MIN3(V1[2],V2[2],V3[2]);
00262 
00263         m_max[0] = BT_MAX3(V1[0],V2[0],V3[0]);
00264         m_max[1] = BT_MAX3(V1[1],V2[1],V3[1]);
00265         m_max[2] = BT_MAX3(V1[2],V2[2],V3[2]);
00266 
00267         m_min[0] -= margin;
00268         m_min[1] -= margin;
00269         m_min[2] -= margin;
00270         m_max[0] += margin;
00271         m_max[1] += margin;
00272         m_max[2] += margin;
00273     }
00274 
00275     btAABB(const btAABB &other):
00276         m_min(other.m_min),m_max(other.m_max)
00277     {
00278     }
00279 
00280     btAABB(const btAABB &other,btScalar margin ):
00281         m_min(other.m_min),m_max(other.m_max)
00282     {
00283         m_min[0] -= margin;
00284         m_min[1] -= margin;
00285         m_min[2] -= margin;
00286         m_max[0] += margin;
00287         m_max[1] += margin;
00288         m_max[2] += margin;
00289     }
00290 
00291     SIMD_FORCE_INLINE void invalidate()
00292     {
00293         m_min[0] = SIMD_INFINITY;
00294         m_min[1] = SIMD_INFINITY;
00295         m_min[2] = SIMD_INFINITY;
00296         m_max[0] = -SIMD_INFINITY;
00297         m_max[1] = -SIMD_INFINITY;
00298         m_max[2] = -SIMD_INFINITY;
00299     }
00300 
00301     SIMD_FORCE_INLINE void increment_margin(btScalar margin)
00302     {
00303         m_min[0] -= margin;
00304         m_min[1] -= margin;
00305         m_min[2] -= margin;
00306         m_max[0] += margin;
00307         m_max[1] += margin;
00308         m_max[2] += margin;
00309     }
00310 
00311     SIMD_FORCE_INLINE void copy_with_margin(const btAABB &other, btScalar margin)
00312     {
00313         m_min[0] = other.m_min[0] - margin;
00314         m_min[1] = other.m_min[1] - margin;
00315         m_min[2] = other.m_min[2] - margin;
00316 
00317         m_max[0] = other.m_max[0] + margin;
00318         m_max[1] = other.m_max[1] + margin;
00319         m_max[2] = other.m_max[2] + margin;
00320     }
00321 
00322     template<typename CLASS_POINT>
00323     SIMD_FORCE_INLINE void calc_from_triangle(
00324                             const CLASS_POINT & V1,
00325                             const CLASS_POINT & V2,
00326                             const CLASS_POINT & V3)
00327     {
00328         m_min[0] = BT_MIN3(V1[0],V2[0],V3[0]);
00329         m_min[1] = BT_MIN3(V1[1],V2[1],V3[1]);
00330         m_min[2] = BT_MIN3(V1[2],V2[2],V3[2]);
00331 
00332         m_max[0] = BT_MAX3(V1[0],V2[0],V3[0]);
00333         m_max[1] = BT_MAX3(V1[1],V2[1],V3[1]);
00334         m_max[2] = BT_MAX3(V1[2],V2[2],V3[2]);
00335     }
00336 
00337     template<typename CLASS_POINT>
00338     SIMD_FORCE_INLINE void calc_from_triangle_margin(
00339                             const CLASS_POINT & V1,
00340                             const CLASS_POINT & V2,
00341                             const CLASS_POINT & V3, btScalar margin)
00342     {
00343         m_min[0] = BT_MIN3(V1[0],V2[0],V3[0]);
00344         m_min[1] = BT_MIN3(V1[1],V2[1],V3[1]);
00345         m_min[2] = BT_MIN3(V1[2],V2[2],V3[2]);
00346 
00347         m_max[0] = BT_MAX3(V1[0],V2[0],V3[0]);
00348         m_max[1] = BT_MAX3(V1[1],V2[1],V3[1]);
00349         m_max[2] = BT_MAX3(V1[2],V2[2],V3[2]);
00350 
00351         m_min[0] -= margin;
00352         m_min[1] -= margin;
00353         m_min[2] -= margin;
00354         m_max[0] += margin;
00355         m_max[1] += margin;
00356         m_max[2] += margin;
00357     }
00358 
00360     SIMD_FORCE_INLINE void appy_transform(const btTransform & trans)
00361     {
00362         btVector3 center = (m_max+m_min)*0.5f;
00363         btVector3 extends = m_max - center;
00364         // Compute new center
00365         center = trans(center);
00366 
00367         btVector3 textends(extends.dot(trans.getBasis().getRow(0).absolute()),
00368                  extends.dot(trans.getBasis().getRow(1).absolute()),
00369                  extends.dot(trans.getBasis().getRow(2).absolute()));
00370 
00371         m_min = center - textends;
00372         m_max = center + textends;
00373     }
00374 
00375 
00377     SIMD_FORCE_INLINE void appy_transform_trans_cache(const BT_BOX_BOX_TRANSFORM_CACHE & trans)
00378     {
00379         btVector3 center = (m_max+m_min)*0.5f;
00380         btVector3 extends = m_max - center;
00381         // Compute new center
00382         center = trans.transform(center);
00383 
00384         btVector3 textends(extends.dot(trans.m_R1to0.getRow(0).absolute()),
00385                  extends.dot(trans.m_R1to0.getRow(1).absolute()),
00386                  extends.dot(trans.m_R1to0.getRow(2).absolute()));
00387 
00388         m_min = center - textends;
00389         m_max = center + textends;
00390     }
00391 
00393     SIMD_FORCE_INLINE void merge(const btAABB & box)
00394     {
00395         m_min[0] = BT_MIN(m_min[0],box.m_min[0]);
00396         m_min[1] = BT_MIN(m_min[1],box.m_min[1]);
00397         m_min[2] = BT_MIN(m_min[2],box.m_min[2]);
00398 
00399         m_max[0] = BT_MAX(m_max[0],box.m_max[0]);
00400         m_max[1] = BT_MAX(m_max[1],box.m_max[1]);
00401         m_max[2] = BT_MAX(m_max[2],box.m_max[2]);
00402     }
00403 
00405     template<typename CLASS_POINT>
00406     SIMD_FORCE_INLINE void merge_point(const CLASS_POINT & point)
00407     {
00408         m_min[0] = BT_MIN(m_min[0],point[0]);
00409         m_min[1] = BT_MIN(m_min[1],point[1]);
00410         m_min[2] = BT_MIN(m_min[2],point[2]);
00411 
00412         m_max[0] = BT_MAX(m_max[0],point[0]);
00413         m_max[1] = BT_MAX(m_max[1],point[1]);
00414         m_max[2] = BT_MAX(m_max[2],point[2]);
00415     }
00416 
00418     SIMD_FORCE_INLINE void get_center_extend(btVector3 & center,btVector3 & extend)  const
00419     {
00420         center = (m_max+m_min)*0.5f;
00421         extend = m_max - center;
00422     }
00423 
00425     SIMD_FORCE_INLINE void find_intersection(const btAABB & other, btAABB & intersection)  const
00426     {
00427         intersection.m_min[0] = BT_MAX(other.m_min[0],m_min[0]);
00428         intersection.m_min[1] = BT_MAX(other.m_min[1],m_min[1]);
00429         intersection.m_min[2] = BT_MAX(other.m_min[2],m_min[2]);
00430 
00431         intersection.m_max[0] = BT_MIN(other.m_max[0],m_max[0]);
00432         intersection.m_max[1] = BT_MIN(other.m_max[1],m_max[1]);
00433         intersection.m_max[2] = BT_MIN(other.m_max[2],m_max[2]);
00434     }
00435 
00436 
00437     SIMD_FORCE_INLINE bool has_collision(const btAABB & other) const
00438     {
00439         if(m_min[0] > other.m_max[0] ||
00440            m_max[0] < other.m_min[0] ||
00441            m_min[1] > other.m_max[1] ||
00442            m_max[1] < other.m_min[1] ||
00443            m_min[2] > other.m_max[2] ||
00444            m_max[2] < other.m_min[2])
00445         {
00446             return false;
00447         }
00448         return true;
00449     }
00450 
00456     SIMD_FORCE_INLINE bool collide_ray(const btVector3 & vorigin,const btVector3 & vdir)  const
00457     {
00458         btVector3 extents,center;
00459         this->get_center_extend(center,extents);;
00460 
00461         btScalar Dx = vorigin[0] - center[0];
00462         if(BT_GREATER(Dx, extents[0]) && Dx*vdir[0]>=0.0f)  return false;
00463         btScalar Dy = vorigin[1] - center[1];
00464         if(BT_GREATER(Dy, extents[1]) && Dy*vdir[1]>=0.0f)  return false;
00465         btScalar Dz = vorigin[2] - center[2];
00466         if(BT_GREATER(Dz, extents[2]) && Dz*vdir[2]>=0.0f)  return false;
00467 
00468 
00469         btScalar f = vdir[1] * Dz - vdir[2] * Dy;
00470         if(btFabs(f) > extents[1]*btFabs(vdir[2]) + extents[2]*btFabs(vdir[1])) return false;
00471         f = vdir[2] * Dx - vdir[0] * Dz;
00472         if(btFabs(f) > extents[0]*btFabs(vdir[2]) + extents[2]*btFabs(vdir[0]))return false;
00473         f = vdir[0] * Dy - vdir[1] * Dx;
00474         if(btFabs(f) > extents[0]*btFabs(vdir[1]) + extents[1]*btFabs(vdir[0]))return false;
00475         return true;
00476     }
00477 
00478 
00479     SIMD_FORCE_INLINE void projection_interval(const btVector3 & direction, btScalar &vmin, btScalar &vmax) const
00480     {
00481         btVector3 center = (m_max+m_min)*0.5f;
00482         btVector3 extend = m_max-center;
00483 
00484         btScalar _fOrigin =  direction.dot(center);
00485         btScalar _fMaximumExtent = extend.dot(direction.absolute());
00486         vmin = _fOrigin - _fMaximumExtent;
00487         vmax = _fOrigin + _fMaximumExtent;
00488     }
00489 
00490     SIMD_FORCE_INLINE eBT_PLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
00491     {
00492         btScalar _fmin,_fmax;
00493         this->projection_interval(plane,_fmin,_fmax);
00494 
00495         if(plane[3] > _fmax + BOX_PLANE_EPSILON)
00496         {
00497             return BT_CONST_BACK_PLANE; // 0
00498         }
00499 
00500         if(plane[3]+BOX_PLANE_EPSILON >=_fmin)
00501         {
00502             return BT_CONST_COLLIDE_PLANE; //1
00503         }
00504         return BT_CONST_FRONT_PLANE;//2
00505     }
00506 
00507     SIMD_FORCE_INLINE bool overlapping_trans_conservative(const btAABB & box, btTransform & trans1_to_0) const
00508     {
00509         btAABB tbox = box;
00510         tbox.appy_transform(trans1_to_0);
00511         return has_collision(tbox);
00512     }
00513 
00514     SIMD_FORCE_INLINE bool overlapping_trans_conservative2(const btAABB & box,
00515         const BT_BOX_BOX_TRANSFORM_CACHE & trans1_to_0) const
00516     {
00517         btAABB tbox = box;
00518         tbox.appy_transform_trans_cache(trans1_to_0);
00519         return has_collision(tbox);
00520     }
00521 
00523     SIMD_FORCE_INLINE bool overlapping_trans_cache(
00524         const btAABB & box,const BT_BOX_BOX_TRANSFORM_CACHE & transcache, bool fulltest) const
00525     {
00526 
00527         //Taken from OPCODE
00528         btVector3 ea,eb;//extends
00529         btVector3 ca,cb;//extends
00530         get_center_extend(ca,ea);
00531         box.get_center_extend(cb,eb);
00532 
00533 
00534         btVector3 T;
00535         btScalar t,t2;
00536         int i;
00537 
00538         // Class I : A's basis vectors
00539         for(i=0;i<3;i++)
00540         {
00541             T[i] =  transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[i];
00542             t = transcache.m_AR[i].dot(eb) + ea[i];
00543             if(BT_GREATER(T[i], t)) return false;
00544         }
00545         // Class II : B's basis vectors
00546         for(i=0;i<3;i++)
00547         {
00548             t = bt_mat3_dot_col(transcache.m_R1to0,T,i);
00549             t2 = bt_mat3_dot_col(transcache.m_AR,ea,i) + eb[i];
00550             if(BT_GREATER(t,t2))    return false;
00551         }
00552         // Class III : 9 cross products
00553         if(fulltest)
00554         {
00555             int j,m,n,o,p,q,r;
00556             for(i=0;i<3;i++)
00557             {
00558                 m = (i+1)%3;
00559                 n = (i+2)%3;
00560                 o = i==0?1:0;
00561                 p = i==2?1:2;
00562                 for(j=0;j<3;j++)
00563                 {
00564                     q = j==2?1:2;
00565                     r = j==0?1:0;
00566                     t = T[n]*transcache.m_R1to0[m][j] - T[m]*transcache.m_R1to0[n][j];
00567                     t2 = ea[o]*transcache.m_AR[p][j] + ea[p]*transcache.m_AR[o][j] +
00568                         eb[r]*transcache.m_AR[i][q] + eb[q]*transcache.m_AR[i][r];
00569                     if(BT_GREATER(t,t2))    return false;
00570                 }
00571             }
00572         }
00573         return true;
00574     }
00575 
00577     SIMD_FORCE_INLINE bool collide_plane(
00578         const btVector4 & plane) const
00579     {
00580         eBT_PLANE_INTERSECTION_TYPE classify = plane_classify(plane);
00581         return (classify == BT_CONST_COLLIDE_PLANE);
00582     }
00583 
00585     SIMD_FORCE_INLINE bool collide_triangle_exact(
00586         const btVector3 & p1,
00587         const btVector3 & p2,
00588         const btVector3 & p3,
00589         const btVector4 & triangle_plane) const
00590     {
00591         if(!collide_plane(triangle_plane)) return false;
00592 
00593         btVector3 center,extends;
00594         this->get_center_extend(center,extends);
00595 
00596         const btVector3 v1(p1 - center);
00597         const btVector3 v2(p2 - center);
00598         const btVector3 v3(p3 - center);
00599 
00600         //First axis
00601         btVector3 diff(v2 - v1);
00602         btVector3 abs_diff = diff.absolute();
00603         //Test With X axis
00604         TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff,abs_diff,v1,v3,extends);
00605         //Test With Y axis
00606         TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff,abs_diff,v1,v3,extends);
00607         //Test With Z axis
00608         TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff,abs_diff,v1,v3,extends);
00609 
00610 
00611         diff = v3 - v2;
00612         abs_diff = diff.absolute();
00613         //Test With X axis
00614         TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff,abs_diff,v2,v1,extends);
00615         //Test With Y axis
00616         TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff,abs_diff,v2,v1,extends);
00617         //Test With Z axis
00618         TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff,abs_diff,v2,v1,extends);
00619 
00620         diff = v1 - v3;
00621         abs_diff = diff.absolute();
00622         //Test With X axis
00623         TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff,abs_diff,v3,v2,extends);
00624         //Test With Y axis
00625         TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff,abs_diff,v3,v2,extends);
00626         //Test With Z axis
00627         TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff,abs_diff,v3,v2,extends);
00628 
00629         return true;
00630     }
00631 };
00632 
00633 
00635 SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform & t1,const btTransform & t2)
00636 {
00637     if(!(t1.getOrigin() == t2.getOrigin()) ) return false;
00638 
00639     if(!(t1.getBasis().getRow(0) == t2.getBasis().getRow(0)) ) return false;
00640     if(!(t1.getBasis().getRow(1) == t2.getBasis().getRow(1)) ) return false;
00641     if(!(t1.getBasis().getRow(2) == t2.getBasis().getRow(2)) ) return false;
00642     return true;
00643 }
00644 
00645 
00646 
00647 #endif // GIM_BOX_COLLISION_H_INCLUDED