36 #define TRI_LOCAL_EPSILON 0.000001f 37 #define MIN_EDGE_EDGE_DIS 0.00001f 77 scale_edge0 = -D2 / (D0 - D2);
78 scale_edge1 = -D1 / (D2 - D1);
85 scale_edge0 = -D0 / (D1 - D0);
86 scale_edge1 = -D1 / (D2 - D1);
90 else if (D1 * D2 > 0.0f || D0 != 0.0f)
93 scale_edge0 = -D0 / (D1 - D0);
94 scale_edge1 = -D2 / (D0 - D2);
118 EDGE_PLANE(tripoints[0], tripoints[1], tri_plane, edgeplane);
121 edgeplane, srcpoints[0], srcpoints[1], srcpoints[2], temp_points);
123 if (clipped_count == 0)
return 0;
127 EDGE_PLANE(tripoints[1], tripoints[2], tri_plane, edgeplane);
130 edgeplane, temp_points, clipped_count, temp_points1);
132 if (clipped_count == 0)
return 0;
136 EDGE_PLANE(tripoints[2], tripoints[0], tri_plane, edgeplane);
139 edgeplane, temp_points1, clipped_count, clip_points);
141 return clipped_count;
200 edge_edge_dir = tu_plane.
cross(tv_plane);
209 edge_edge_dir *= 1 / Dlen;
213 GREAL tu_scale_e0, tu_scale_e1;
215 du0du1, du0du2, tu_scale_e0, tu_scale_e1, tu_e0, tu_e1))
return 0;
219 GREAL tv_scale_e0, tv_scale_e1;
222 dv0dv1, dv0dv2, tv_scale_e0, tv_scale_e1, tv_e0, tv_e1))
return 0;
225 btVector3 up_e0 = tu_vertices[tu_e0].
lerp(tu_vertices[(tu_e0 + 1) % 3], tu_scale_e0);
226 btVector3 up_e1 = tu_vertices[tu_e1].
lerp(tu_vertices[(tu_e1 + 1) % 3], tu_scale_e1);
228 btVector3 vp_e0 = tv_vertices[tv_e0].
lerp(tv_vertices[(tv_e0 + 1) % 3], tv_scale_e0);
229 btVector3 vp_e1 = tv_vertices[tv_e1].
lerp(tv_vertices[(tv_e1 + 1) % 3], tv_scale_e1);
232 GREAL isect_u[] = {up_e0.
dot(edge_edge_dir), up_e1.
dot(edge_edge_dir)};
233 GREAL isect_v[] = {vp_e0.
dot(edge_edge_dir), vp_e1.
dot(edge_edge_dir)};
235 sort_isect(isect_u[0], isect_u[1], tu_e0, tu_e1, up_e0, up_e1);
236 sort_isect(isect_v[0], isect_v[1], tv_e0, tv_e1, vp_e0, vp_e1);
238 const GREAL midpoint_u = 0.5f * (isect_u[0] + isect_u[1]);
239 const GREAL midpoint_v = 0.5f * (isect_v[0] + isect_v[1]);
241 if (midpoint_u < midpoint_v)
243 if (isect_u[1] >= isect_v[1])
247 else if (isect_v[0] <= isect_u[0])
252 closest_point_u = up_e1;
253 closest_point_v = vp_e0;
259 tu_vertices[tu_e1], tu_vertices[(tu_e1 + 1) % 3],
260 tv_vertices[tv_e0], tv_vertices[(tv_e0 + 1) % 3],
266 edge_edge_dir *= 1.0f / distances[2];
270 distances[2] = isect_v[0] - isect_u[1];
276 if (isect_v[1] >= isect_u[1])
280 else if (isect_u[0] <= isect_v[0])
285 closest_point_u = up_e0;
286 closest_point_v = vp_e1;
292 tu_vertices[tu_e0], tu_vertices[(tu_e0 + 1) % 3],
293 tv_vertices[tv_e1], tv_vertices[(tv_e1 + 1) % 3],
299 edge_edge_dir *= 1.0f / distances[2];
303 distances[2] = isect_u[0] - isect_v[1];
322 margin = margin_u + margin_v;
335 TRIANGLE_PLANE(tv_vertices[0], tv_vertices[1], tv_vertices[2], tv_plane);
341 du0du1 = du[0] * du[1];
342 du0du2 = du[0] * du[2];
344 if (du0du1 > 0.0f && du0du2 > 0.0f)
348 distances[0] =
GIM_MAX3(du[0], du[1], du[2]);
349 distances[0] = -distances[0];
350 if (distances[0] > margin)
return false;
353 VEC_SWAP(tv_vertices[0], tv_vertices[1]);
358 distances[0] =
GIM_MIN3(du[0], du[1], du[2]);
359 if (distances[0] > margin)
return false;
365 distances[0] = (du[0] + du[1] + du[2]) / 3.0f;
367 if (distances[0] < 0.0f)
370 VEC_SWAP(tv_vertices[0], tv_vertices[1]);
373 distances[0] =
GIM_MAX3(du[0], du[1], du[2]);
374 distances[0] = -distances[0];
378 distances[0] =
GIM_MIN3(du[0], du[1], du[2]);
384 TRIANGLE_PLANE(tu_vertices[0], tu_vertices[1], tu_vertices[2], tu_plane);
390 dv0dv1 = dv[0] * dv[1];
391 dv0dv2 = dv[0] * dv[2];
393 if (dv0dv1 > 0.0f && dv0dv2 > 0.0f)
397 distances[1] =
GIM_MAX3(dv[0], dv[1], dv[2]);
398 distances[1] = -distances[1];
399 if (distances[1] > margin)
return false;
402 VEC_SWAP(tu_vertices[0], tu_vertices[1]);
407 distances[1] =
GIM_MIN3(dv[0], dv[1], dv[2]);
408 if (distances[1] > margin)
return false;
414 distances[1] = (dv[0] + dv[1] + dv[2]) / 3.0f;
416 if (distances[1] < 0.0f)
419 VEC_SWAP(tu_vertices[0], tu_vertices[1]);
422 distances[1] =
GIM_MAX3(dv[0], dv[1], dv[2]);
423 distances[1] = -distances[1];
427 distances[1] =
GIM_MIN3(dv[0], dv[1], dv[2]);
441 if (distances[0] < distances[1]) bl = 1;
446 if (distances[2] > margin)
return false;
462 point_count =
clip_triangle(tv_plane, tv_vertices, tu_vertices, contact_points);
463 if (point_count == 0)
return false;
464 contacts.
merge_points(tv_plane, margin, contact_points, point_count);
468 point_count =
clip_triangle(tu_plane, tu_vertices, tv_vertices, contact_points);
469 if (point_count == 0)
return false;
470 contacts.
merge_points(tu_plane, margin, contact_points, point_count);
616 m_vertices[0], m_vertices[1], m_vertices[2], m_margin,
#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)
#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.
#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)
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
Class for colliding triangles.
btVector3 closest_point_u
#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]
bool collide_triangle_hard_test(const GIM_TRIANGLE &other, GIM_TRIANGLE_CONTACT_DATA &contact_data) const
Test triangles by finding separating axis.
#define GIM_MAX3(a, b, c)
btVector3 closest_point_v
btVector3 lerp(const btVector3 &v, const btScalar &t) const
Return the linear interpolation between this and another vector.