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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines


bullet
Author(s): Erwin Coumans, ROS package maintained by Tully Foote
autogenerated on Wed Oct 31 2012 07:54:30