Exemplo n.º 1
0
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);
  }
  
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
  }

}