1#ifndef GIM_BOX_COLLISION_H_INCLUDED
2#define GIM_BOX_COLLISION_H_INCLUDED
98#ifndef TEST_CROSS_EDGE_BOX_MCR
100#define TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, i_dir_0, i_dir_1, i_comp_0, i_comp_1) \
102 const btScalar dir0 = -edge[i_dir_0]; \
103 const btScalar dir1 = edge[i_dir_1]; \
104 btScalar pmin = pointa[i_comp_0] * dir0 + pointa[i_comp_1] * dir1; \
105 btScalar pmax = pointb[i_comp_0] * dir0 + pointb[i_comp_1] * dir1; \
108 GIM_SWAP_NUMBERS(pmin, pmax); \
110 const btScalar abs_dir0 = absolute_edge[i_dir_0]; \
111 const btScalar abs_dir1 = absolute_edge[i_dir_1]; \
112 const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1; \
113 if (pmin > rad || -rad > pmax) return false; \
118#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
120 TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 2, 1, 1, 2); \
123#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
125 TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 0, 2, 2, 0); \
128#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
130 TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 1, 0, 0, 1); \
143 static const btVector3 vepsi(1e-6f, 1e-6f, 1e-6f);
163 m_R1to0 = trans0.getBasis().transpose();
175 m_R1to0 = trans0.getBasis().inverse();
190#ifndef BOX_PLANE_EPSILON
191#define BOX_PLANE_EPSILON 0.000001f
284 template <
typename CLASS_POINT>
286 const CLASS_POINT &V1,
287 const CLASS_POINT &V2,
288 const CLASS_POINT &V3)
299 template <
typename CLASS_POINT>
301 const CLASS_POINT &V1,
302 const CLASS_POINT &V2,
303 const CLASS_POINT &V3,
btScalar margin)
327 center = trans(center);
329 btVector3 textends = extends.dot3(trans.getBasis().getRow(0).absolute(),
330 trans.getBasis().getRow(1).absolute(),
331 trans.getBasis().getRow(2).absolute());
333 m_min = center - textends;
334 m_max = center + textends;
350 template <
typename CLASS_POINT>
366 extend =
m_max - center;
406 btScalar Dx = vorigin[0] - center[0];
407 if (
GIM_GREATER(Dx, extents[0]) && Dx * vdir[0] >= 0.0f)
return false;
408 btScalar Dy = vorigin[1] - center[1];
409 if (
GIM_GREATER(Dy, extents[1]) && Dy * vdir[1] >= 0.0f)
return false;
410 btScalar Dz = vorigin[2] - center[2];
411 if (
GIM_GREATER(Dz, extents[2]) && Dz * vdir[2] >= 0.0f)
return false;
413 btScalar f = vdir[1] * Dz - vdir[2] * Dy;
414 if (
btFabs(f) > extents[1] *
btFabs(vdir[2]) + extents[2] *
btFabs(vdir[1]))
return false;
415 f = vdir[2] * Dx - vdir[0] * Dz;
416 if (
btFabs(f) > extents[0] *
btFabs(vdir[2]) + extents[2] *
btFabs(vdir[0]))
return false;
417 f = vdir[0] * Dy - vdir[1] * Dx;
418 if (
btFabs(f) > extents[0] *
btFabs(vdir[1]) + extents[1] *
btFabs(vdir[0]))
return false;
427 btScalar _fOrigin = direction.dot(center);
428 btScalar _fMaximumExtent = extend.dot(direction.absolute());
429 vmin = _fOrigin - _fMaximumExtent;
430 vmax = _fOrigin + _fMaximumExtent;
472 for (i = 0; i < 3; i++)
475 t = transcache.
m_AR[i].dot(eb) + ea[i];
479 for (i = 0; i < 3; i++)
488 int j, m, n, o, p, q, r;
489 for (i = 0; i < 3; i++)
495 for (j = 0; j < 3; j++)
500 t2 = ea[o] * transcache.
m_AR[p][j] + ea[p] * transcache.
m_AR[o][j] +
501 eb[r] * transcache.
m_AR[i][q] + eb[q] * transcache.
m_AR[i][r];
544 abs_diff =
diff.absolute();
553 abs_diff =
diff.absolute();
565#ifndef BT_BOX_COLLISION_H_INCLUDED
569 if (!(t1.getOrigin() == t2.getOrigin()))
return false;
571 if (!(t1.getBasis().getRow(0) == t2.getBasis().getRow(0)))
return false;
572 if (!(t1.getBasis().getRow(1) == t2.getBasis().getRow(1)))
return false;
573 if (!(t1.getBasis().getRow(2) == t2.getBasis().getRow(2)))
return false;
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
ATTR_WARN_UNUSED_RESULT const BMVert * v2
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
#define SIMD_FORCE_INLINE
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE void calc_from_triangle_margin(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3, btScalar margin)
SIMD_FORCE_INLINE bool collide_plane(const btVector4 &plane)
Simple test for planes.
SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir)
Finds the Ray intersection parameter.
SIMD_FORCE_INLINE void copy_with_margin(const GIM_AABB &other, btScalar margin)
GIM_AABB(const btVector3 &V1, const btVector3 &V2, const btVector3 &V3, GREAL margin)
SIMD_FORCE_INLINE bool collide_triangle_exact(const btVector3 &p1, const btVector3 &p2, const btVector3 &p3, const btVector4 &triangle_plane)
test for a triangle, with edges
SIMD_FORCE_INLINE bool has_collision(const GIM_AABB &other) const
SIMD_FORCE_INLINE void merge(const GIM_AABB &box)
Merges a Box.
SIMD_FORCE_INLINE void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const
SIMD_FORCE_INLINE void increment_margin(btScalar margin)
GIM_AABB(const btVector3 &V1, const btVector3 &V2, const btVector3 &V3)
SIMD_FORCE_INLINE void merge_point(const CLASS_POINT &point)
Merges a point.
SIMD_FORCE_INLINE bool overlapping_trans_conservative(const GIM_AABB &box, btTransform &trans1_to_0)
GIM_AABB(const GIM_AABB &other, btScalar margin)
GIM_AABB(const GIM_AABB &other)
SIMD_FORCE_INLINE void invalidate()
SIMD_FORCE_INLINE void calc_from_triangle(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3)
SIMD_FORCE_INLINE ePLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
SIMD_FORCE_INLINE void find_intersection(const GIM_AABB &other, GIM_AABB &intersection) const
Finds the intersecting box between this box and the other.
SIMD_FORCE_INLINE void appy_transform(const btTransform &trans)
Apply a transform to an AABB.
SIMD_FORCE_INLINE void get_center_extend(btVector3 ¢er, btVector3 &extend) const
Gets the extend and center.
SIMD_FORCE_INLINE bool overlapping_trans_cache(const GIM_AABB &box, const GIM_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest)
transcache is the transformation cache from box to this AABB
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt)
#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)
#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2)
Compairison of transformation objects.
#define BOX_PLANE_EPSILON
GREAL mat4f[4][4]
Matrix 4D, row ordered.
#define COPY_MATRIX_3X3(b, a)
#define MAT_GET_TRANSLATION(mat, vec3)
Get the triple(3) col of a transform matrix.
#define MAT_DOT_COL(mat, vec3, colindex)
Returns the dot product between a vec3f and the col of a matrix.
#define GIM_GREATER(x, y)
#define GIM_MIN3(a, b, c)
#define GIM_MAX3(a, b, c)