1#ifndef GIM_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED 
    2#define GIM_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED 
   40#ifndef PLANEDIREPSILON 
   41#define PLANEDIREPSILON 0.0000001f 
   44#ifndef PARALELENORMALS 
   45#define PARALELENORMALS 0.000001f 
   48#define TRIANGLE_NORMAL(v1, v2, v3, n) \ 
   51                VEC_DIFF(_dif1, v2, v1);       \ 
   52                VEC_DIFF(_dif2, v3, v1);       \ 
   53                VEC_CROSS(n, _dif1, _dif2);    \ 
   57#define TRIANGLE_NORMAL_FAST(v1, v2, v3, n) \ 
   60                VEC_DIFF(_dif1, v2, v1);            \ 
   61                VEC_DIFF(_dif2, v3, v1);            \ 
   62                VEC_CROSS(n, _dif1, _dif2);         \ 
   66#define TRIANGLE_PLANE(v1, v2, v3, plane)   \ 
   68                TRIANGLE_NORMAL(v1, v2, v3, plane); \ 
   69                plane[3] = VEC_DOT(v1, plane);      \ 
   73#define TRIANGLE_PLANE_FAST(v1, v2, v3, plane)   \ 
   75                TRIANGLE_NORMAL_FAST(v1, v2, v3, plane); \ 
   76                plane[3] = VEC_DOT(v1, plane);           \ 
   80#define EDGE_PLANE(e1, e2, n, plane)   \ 
   83                VEC_DIFF(_dif, e2, e1);        \ 
   84                VEC_CROSS(plane, _dif, n);     \ 
   85                VEC_NORMALIZE(plane);          \ 
   86                plane[3] = VEC_DOT(e1, plane); \ 
   89#define DISTANCE_PLANE_POINT(plane, point) (VEC_DOT(plane, point) - plane[3]) 
   91#define PROJECT_POINT_PLANE(point, plane, projected) \ 
   94                _dis = DISTANCE_PLANE_POINT(plane, point);   \ 
   95                VEC_SCALE(projected, -_dis, plane);          \ 
   96                VEC_SUM(projected, projected, point);        \ 
  100template <
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  108                if (
_dis > 0.0f) 
return false;
 
  113template <
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  156template <
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  198template <
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  235#define PLANE_MINOR_AXES(plane, i0, i1) VEC_MINOR_AXES(plane, i0, i1) 
  242template <
typename T, 
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  269template <
typename T, 
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  315template <
typename CLASS_POINT, 
typename CLASS_PLANE>
 
  340template <
typename CLASS_POINT>
 
  376template <
typename T, 
typename CLASS_POINT>
 
  400template <
typename CLASS_POINT>
 
  429                n[0] = (
_M[0] + 
_M[1]) * 0.5f;
 
  430                n[1] = (
_M[2] + 
_M[3]) * 0.5f;
 
  439                        else if (
_M[1] < 
_M[3])
 
  457                        else if (
_M[3] < 
_M[1])
 
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...
 
btScalar btFabs(btScalar x)
 
#define SIMD_FORCE_INLINE
 
#define DISTANCE_PLANE_POINT(plane, point)
 
eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT_CLOSEST(const CLASS_POINT &s1, const CLASS_POINT &s2, const CLASS_PLANE &plane, CLASS_POINT &clipped1, CLASS_POINT &clipped2)
Confirms if the plane intersect the edge or not.
 
void SORT_3_INDICES(const T *values, GUINT *order_indices)
Sorts 3 componets.
 
eLINE_PLANE_INTERSECTION_TYPE PLANE_CLIP_SEGMENT2(const CLASS_POINT &s1, const CLASS_POINT &s2, const CLASS_PLANE &plane, CLASS_POINT &clipped)
Confirms if the plane intersect the edge or nor.
 
bool RAY_PLANE_COLLISION(const CLASS_PLANE &plane, const CLASS_POINT &vDir, const CLASS_POINT &vPoint, CLASS_POINT &pout, T &tparam)
Ray plane collision in one way.
 
bool LINE_INTERSECTION_PARAMS(const CLASS_POINT &dir1, CLASS_POINT &point1, const CLASS_POINT &dir2, CLASS_POINT &point2, T &t1, T &t2)
Finds the line params where these lines intersect.
 
eLINE_PLANE_INTERSECTION_TYPE
 
bool BOX_AXIS_INTERSECT(T pos, T dir, T bmin, T bmax, T &tfirst, T &tlast)
Line box intersection in one dimension.
 
bool INTERSECT_PLANES(const CLASS_PLANE &p1, const CLASS_PLANE &p2, CLASS_POINT &p, CLASS_POINT &d)
Returns the Ray on which 2 planes intersect if they do. Written by Rodrigo Hernandez on ODE convex co...
 
GUINT LINE_PLANE_COLLISION(const CLASS_PLANE &plane, const CLASS_POINT &vDir, const CLASS_POINT &vPoint, CLASS_POINT &pout, T &tparam, T tmin, T tmax)
line collision
 
bool POINT_IN_HULL(const CLASS_POINT &point, const CLASS_PLANE *planes, GUINT plane_count)
Verifies if a point is in the plane hull.
 
void SEGMENT_COLLISION(const CLASS_POINT &vA1, const CLASS_POINT &vA2, const CLASS_POINT &vB1, const CLASS_POINT &vB2, CLASS_POINT &vPointA, CLASS_POINT &vPointB)
Find closest points on segments.
 
void CLOSEST_POINT_ON_SEGMENT(CLASS_POINT &cp, const CLASS_POINT &v, const CLASS_POINT &e1, const CLASS_POINT &e2)
 
void PLANE_CLIP_SEGMENT(const CLASS_POINT &s1, const CLASS_POINT &s2, const CLASS_PLANE &plane, CLASS_POINT &clipped)
 
GREAL vec4f[4]
Float vector 4D.
 
GREAL vec3f[3]
Float vector 3D.
 
#define VEC_CROSS(c, a, b)
Vector cross.
 
#define VEC_DOT(a, b)
Vector dot product.
 
#define VEC_SCALE(c, a, b)
scalar times vector
 
#define VEC_SUM(v21, v2, v1)
Vector sum.
 
#define VEC_COPY(b, a)
Copy 3D vector.
 
#define VEC_DIFF(v21, v2, v1)
Vector difference.
 
#define GIM_IS_ZERO(value)
 
#define GIM_SWAP_NUMBERS(a, b)
Swap numbers.
 
#define GIM_CLAMP(number, minval, maxval)
returns a clamped number