1#ifndef BT_BOX_COLLISION_H_INCLUDED
2#define BT_BOX_COLLISION_H_INCLUDED
31#define BT_SWAP_NUMBERS(a,b){ \
38#define BT_MAX(a,b) (a<b?b:a)
39#define BT_MIN(a,b) (a>b?b:a)
41#define BT_GREATER(x, y) btFabs(x) > (y)
43#define BT_MAX3(a,b,c) BT_MAX(a,BT_MAX(b,c))
44#define BT_MIN3(a,b,c) BT_MIN(a,BT_MIN(b,c))
119#define TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,i_dir_0,i_dir_1,i_comp_0,i_comp_1)\
121 const btScalar dir0 = -edge[i_dir_0];\
122 const btScalar dir1 = edge[i_dir_1];\
123 btScalar pmin = pointa[i_comp_0]*dir0 + pointa[i_comp_1]*dir1;\
124 btScalar pmax = pointb[i_comp_0]*dir0 + pointb[i_comp_1]*dir1;\
127 BT_SWAP_NUMBERS(pmin,pmax); \
129 const btScalar abs_dir0 = absolute_edge[i_dir_0];\
130 const btScalar abs_dir1 = absolute_edge[i_dir_1];\
131 const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1;\
132 if(pmin>rad || -rad>pmax) return false;\
136#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
138 TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,2,1,1,2);\
141#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
143 TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,0,2,2,0);\
146#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge,absolute_edge,pointa,pointb,_extend)\
148 TEST_CROSS_EDGE_BOX_MCR(edge,absolute_edge,pointa,pointb,_extend,1,0,0,1);\
181 m_AR[i][
j] = 1e-6f +
btFabs(m_R1to0[i][
j]);
204 calc_absolute_matrix();
211 m_T1to0 = m_R1to0 * (-
trans0.getOrigin());
213 m_T1to0 += m_R1to0*
trans1.getOrigin();
214 m_R1to0 *=
trans1.getBasis();
216 calc_absolute_matrix();
221 return point.
dot3( m_R1to0[0], m_R1to0[1], m_R1to0[2] ) + m_T1to0;
226#define BOX_PLANE_EPSILON 0.000001f
274 m_min(other.m_min),m_max(other.m_max)
279 m_min(other.m_min),m_max(other.m_max)
311 m_min[0] = other.
m_min[0] - margin;
312 m_min[1] = other.
m_min[1] - margin;
313 m_min[2] = other.
m_min[2] - margin;
315 m_max[0] = other.
m_max[0] + margin;
316 m_max[1] = other.
m_max[1] + margin;
317 m_max[2] = other.
m_max[2] + margin;
320 template<
typename CLASS_POINT>
335 template<
typename CLASS_POINT>
363 center =
trans(center);
366 trans.getBasis().getRow(1).absolute(),
367 trans.getBasis().getRow(2).absolute());
380 center =
trans.transform(center);
383 trans.m_R1to0.getRow(1).absolute(),
384 trans.m_R1to0.getRow(2).absolute());
393 m_min[0] =
BT_MIN(m_min[0],
box.m_min[0]);
394 m_min[1] =
BT_MIN(m_min[1],
box.m_min[1]);
395 m_min[2] =
BT_MIN(m_min[2],
box.m_min[2]);
397 m_max[0] =
BT_MAX(m_max[0],
box.m_max[0]);
398 m_max[1] =
BT_MAX(m_max[1],
box.m_max[1]);
399 m_max[2] =
BT_MAX(m_max[2],
box.m_max[2]);
403 template<
typename CLASS_POINT>
406 m_min[0] =
BT_MIN(m_min[0],point[0]);
407 m_min[1] =
BT_MIN(m_min[1],point[1]);
408 m_min[2] =
BT_MIN(m_min[2],point[2]);
410 m_max[0] =
BT_MAX(m_max[0],point[0]);
411 m_max[1] =
BT_MAX(m_max[1],point[1]);
412 m_max[2] =
BT_MAX(m_max[2],point[2]);
418 center = (m_max+m_min)*0.5f;
437 if(m_min[0] > other.
m_max[0] ||
438 m_max[0] < other.
m_min[0] ||
439 m_min[1] > other.
m_max[1] ||
440 m_max[1] < other.
m_min[1] ||
441 m_min[2] > other.
m_max[2] ||
442 m_max[2] < other.
m_min[2])
457 this->get_center_extend(center,
extents);;
509 return has_collision(
tbox);
517 return has_collision(
tbox);
528 get_center_extend(
ca,ea);
592 this->get_center_extend(center,
extends);
635 if(!(
t1.getOrigin() ==
t2.getOrigin()) )
return false;
637 if(!(
t1.getBasis().getRow(0) ==
t2.getBasis().getRow(0)) )
return false;
638 if(!(
t1.getBasis().getRow(1) ==
t2.getBasis().getRow(1)) )
return false;
639 if(!(
t1.getBasis().getRow(2) ==
t2.getBasis().getRow(2)) )
return false;
#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
eBT_PLANE_INTERSECTION_TYPE
#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
btScalar bt_mat3_dot_col(const btMatrix3x3 &mat, const btVector3 &vec3, int colindex)
Returns the dot product between a vec3f and the col of a matrix.
bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2)
Compairison of transformation objects.
#define BOX_PLANE_EPSILON
const T & btMax(const T &a, const T &b)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define ATTRIBUTE_ALIGNED16(a)
btScalar btFabs(btScalar x)
#define SIMD_FORCE_INLINE
bool overlapping_trans_cache(const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) const
transcache is the transformation cache from box to this AABB
bool overlapping_trans_conservative(const btAABB &box, btTransform &trans1_to_0) const
void find_intersection(const btAABB &other, btAABB &intersection) const
Finds the intersecting box between this box and the other.
void copy_with_margin(const btAABB &other, btScalar margin)
eBT_PLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
void increment_margin(btScalar margin)
bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const
Finds the Ray intersection parameter.
void merge(const btAABB &box)
Merges a Box.
bool overlapping_trans_conservative2(const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &trans1_to_0) const
void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const
void merge_point(const CLASS_POINT &point)
Merges a point.
void appy_transform_trans_cache(const BT_BOX_BOX_TRANSFORM_CACHE &trans)
Apply a transform to an AABB.
bool collide_triangle_exact(const btVector3 &p1, const btVector3 &p2, const btVector3 &p3, const btVector4 &triangle_plane) const
test for a triangle, with edges
void calc_from_triangle(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3)
btAABB(const btAABB &other)
bool has_collision(const btAABB &other) const
void calc_from_triangle_margin(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3, btScalar margin)
void get_center_extend(btVector3 ¢er, btVector3 &extend) const
Gets the extend and center.
btAABB(const btAABB &other, btScalar margin)
void appy_transform(const btTransform &trans)
Apply a transform to an AABB.
btAABB(const btVector3 &V1, const btVector3 &V2, const btVector3 &V3)
btAABB(const btVector3 &V1, const btVector3 &V2, const btVector3 &V3, btScalar margin)
bool collide_plane(const btVector4 &plane) const
Simple test for planes.
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
btMatrix3x3 inverse() const
Return the inverse of the matrix.
btVector3 can be used to represent 3D points and vectors.
btScalar dot(const btVector3 &v) const
Return the dot product.
btVector3 dot3(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2) const
btVector3 absolute() const
Return a vector will the absolute values of each element.