collision sphere_collide_face(sphere s, vec3 v, ctri ct) { //if (unlikely(sphere_intersects_face(s, ct.a, ct.b, ct.c, ct.norm))) { error("Collision Sphere Inside Mesh Face!"); } float angle = vec3_dot(ct.norm, v); float dist = vec3_dot(ct.norm, vec3_sub(s.center, ct.a)); float t0 = ( s.radius - dist) / angle; float t1 = (-s.radius - dist) / angle; float t = FLT_MAX; if (between_or(t0, 0, 1) && between_or(t1, 0, 1)) { t = min(t0, t1); } else if (between_or(t0, 0, 1)) { t = t0; } else if (between_or(t1, 0, 1)) { t = t1; } else { return collision_none(); } vec3 cpoint = vec3_add(s.center, vec3_mul(v, t)); vec3 spoint = vec3_add(cpoint, vec3_mul(ct.norm, -s.radius)); if (!point_inside_triangle(spoint, ct.a, ct.b, ct.c)) { return collision_none(); } else { return collision_new(t, spoint, ct.norm); } }
TEST(test8, tests) { cg::point_2 p11(10, 10); cg::point_2 p12(0, 0); cg::point_2 p13(20, 5); cg::point_2 p2(6, 5); cg::triangle_2d tr(p11, p12, p13); ASSERT_EQ(point_inside_triangle(tr, p2), true); }
TEST(test5, tests) { cg::point_2 p11(0, 0); cg::point_2 p12(10, 0); cg::point_2 p13(10, 10); cg::point_2 p2(-10, -10); cg::triangle_2d tr(p11, p12, p13); ASSERT_EQ(point_inside_triangle(tr, p2), false); }
collision point_collide_face(vec3 p, vec3 v, ctri ct) { float angle = vec3_dot(ct.norm, v); float dist = vec3_dot(ct.norm, vec3_sub(p, ct.a)); float t0 = -dist / angle; float t1 = -dist / angle; float t = FLT_MAX; if (between_or(t0, 0, 1) && between_or(t1, 0, 1)) { t = min(t0, t1); } else if (between_or(t0, 0, 1)) { t = t0; } else if (between_or(t1, 0, 1)) { t = t1; } else { return collision_none(); } vec3 cpoint = vec3_add(p, vec3_mul(v, t)); if (!point_inside_triangle(cpoint, ct.a, ct.b, ct.c)) { return collision_none(); } else { return collision_new(t, cpoint, ct.norm); } }