37 #define TRI_LOCAL_EPSILON 0.000001f
38 #define MIN_EDGE_EDGE_DIS 0.00001f
81 scale_edge0 = -D2/(D0-D2);
82 scale_edge1 = -D1/(D2-D1);
83 edge_index0 = 2;edge_index1 = 1;
88 scale_edge0 = -D0/(D1-D0);
89 scale_edge1 = -D1/(D2-D1);
90 edge_index0 = 0;edge_index1 = 1;
92 else if(D1*D2>0.0f || D0!=0.0f)
95 scale_edge0 = -D0/(D1-D0);
96 scale_edge1 = -D2/(D0-D2);
97 edge_index0 = 0 ;edge_index1 = 2;
120 EDGE_PLANE(tripoints[0],tripoints[1],tri_plane,edgeplane);
123 edgeplane,srcpoints[0],srcpoints[1],srcpoints[2],
temp_points);
125 if(clipped_count == 0)
return 0;
129 EDGE_PLANE(tripoints[1],tripoints[2],tri_plane,edgeplane);
134 if(clipped_count == 0)
return 0;
138 EDGE_PLANE(tripoints[2],tripoints[0],tri_plane,edgeplane);
143 return clipped_count;
217 GREAL tu_scale_e0,tu_scale_e1;
219 du0du1,
du0du2,tu_scale_e0,tu_scale_e1,tu_e0,tu_e1))
return 0;
223 GREAL tv_scale_e0,tv_scale_e1;
226 dv0dv1,
dv0dv2,tv_scale_e0,tv_scale_e1,tv_e0,tv_e1))
return 0;
239 sort_isect(isect_u[0],isect_u[1],tu_e0,tu_e1,up_e0,up_e1);
240 sort_isect(isect_v[0],isect_v[1],tv_e0,tv_e1,vp_e0,vp_e1);
242 const GREAL midpoint_u = 0.5f*(isect_u[0]+isect_u[1]);
243 const GREAL midpoint_v = 0.5f*(isect_v[0]+isect_v[1]);
245 if(midpoint_u<midpoint_v)
247 if(isect_u[1]>=isect_v[1])
251 else if(isect_v[0]<=isect_u[0])
281 if(isect_v[1]>=isect_u[1])
285 else if(isect_u[0]<=isect_v[0])
329 margin = margin_u + margin_v;
475 if(point_count == 0)
return false;
481 if(point_count == 0)
return false;
#define TRIANGLE_PLANE(v1, v2, v3, plane)
plane is a vec4f
#define VEC_SCALE_4(c, a, b)
scalar times vector
btVector3 temp_points[MAX_TRI_CLIPPING]
#define EDGE_PLANE(e1, e2, n, plane)
Calc a plane from an edge an a normal. plane is a vec4f.
bool compute_intervals(const GREAL &D0, const GREAL &D1, const GREAL &D2, const GREAL &D0D1, const GREAL &D0D2, GREAL &scale_edge0, GREAL &scale_edge1, GUINT &edge_index0, GUINT &edge_index1)
if returns false, the faces are paralele
void sort_isect(GREAL &isect0, GREAL &isect1, GUINT &e0, GUINT &e1, btVector3 &vec0, btVector3 &vec1)
btVector3 temp_points1[MAX_TRI_CLIPPING]
GUINT PLANE_CLIP_POLYGON3D(const CLASS_PLANE &plane, const CLASS_POINT *polygon_points, GUINT polygon_point_count, CLASS_POINT *clipped)
bool collide_triangle_hard_test(const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
Test triangles by finding separating axis.
#define SIMD_FORCE_INLINE
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.
GUINT cross_line_intersection_test()
Test verifying interval intersection with the direction between planes.
#define GIM_SWAP_NUMBERS(a, b)
Swap numbers.
#define VEC_COPY(b, a)
Copy 3D vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
btVector3 lerp(const btVector3 &v, const btScalar &t) const
Return the linear interpolation between this and another vector.
#define VEC_SWAP(b, a)
VECTOR SWAP.
#define MIN_EDGE_EDGE_DIS
GUINT PLANE_CLIP_TRIANGLE3D(const CLASS_PLANE &plane, const CLASS_POINT &point0, const CLASS_POINT &point1, const CLASS_POINT &point2, CLASS_POINT *clipped)
Class for colliding triangles.
btVector3 closest_point_u
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
#define VEC_LENGTH(a, l)
Vector length.
#define GIM_MIN3(a, b, c)
bool triangle_collision(const btVector3 &u0, const btVector3 &u1, const btVector3 &u2, GREAL margin_u, const btVector3 &v0, const btVector3 &v1, const btVector3 &v2, GREAL margin_v, GIM_TRIANGLE_CONTACT_DATA &contacts)
collides by two sides
btVector3 can be used to represent 3D points and vectors.
#define DISTANCE_PLANE_POINT(plane, point)
GUINT clip_triangle(const btVector4 &tri_plane, const btVector3 *tripoints, const btVector3 *srcpoints, btVector3 *clip_points)
clip triangle
btVector3 contact_points[MAX_TRI_CLIPPING]
#define GIM_MAX3(a, b, c)
btVector3 closest_point_v