triangleIntersect method

Vector3? triangleIntersect(
  1. Vector3 origin,
  2. Vector3 direction,
  3. Face face,
  4. bool backfaceCulling,
)

Find where triangle intersect

Implementation

Vector3? triangleIntersect(Vector3 origin, Vector3 direction, Face face, bool backfaceCulling){
  Vector3 diff = Vector3.zero();
  Vector3 edge1 = Vector3.zero();
  Vector3 edge2 = Vector3.zero();
  Vector3 normal = Vector3.zero();

  Vector3 a = face.a, b = face.b, c = face.c;
  int sign;
  double dnd;

  edge1.sub2(b, a);
  edge2.sub2(c, a);
  normal.cross2(edge1, edge2);

  dnd = direction.dot(normal);
  if(dnd > 0){
    if(backfaceCulling)return null;
    sign = 1;
  }
  else if(dnd < 0){
    sign = -1;
    dnd = -dnd;
  }
  else {
    return null;
  }

  diff.sub2(origin, a);
  double ddqxe2 = sign * direction.dot(edge2.cross2(diff, edge2));

  // b1 < 0, no intersection
  if ( ddqxe2 < 0 ) {
    return null;
  }

  double ddex1xq = sign * direction.dot(edge1.cross(diff));

  // b2 < 0, no intersection
  if(ddex1xq < 0){
    return null;
  }

  // b1+b2 > 1, no intersection
  if(ddqxe2 + ddex1xq > dnd){
    return null;
  }

  // Line intersects triangle, check if ray does.
  double qdn = -sign * diff.dot(normal);

  // t < 0, no intersection
  if(qdn < 0){
    return null;
  }

  // Ray intersects triangle.
  return Vector3.copy( direction )..scale(qdn / dnd)..add( origin );
}