// File: /workspace/github_cpp_makefile_star2_O1/srajangarg[P]raytracer/src/Primitives.cpp
// Function: Triangle::intersect(Ray&) const
bool
Triangle::intersect(Ray & ray) const
{
  Vec3 e1, e2;  //Edge1, Edge2
  Vec3 P, Q, T;
  double det, inv_det, u, v, t;
  Ray new_ray = ray;
  new_ray.transform(worldToModel_);

  // dind vectors for two edges sharing V1
  e1 = verts[1] - verts[0];
  e2 = verts[2] - verts[0];

  // begin calculating determinant - also used to calculate u parameter
  P = new_ray.direction() ^ e2;
  // if determinant is near zero, ray lies in plane of triangle or ray is parallel to plane of triangle
  det = e1 * P;

  if(det > -EPS and det < EPS) return false;
  inv_det = 1.0 / det;

  // calculate distance from V1 to ray origin
  T = new_ray.start() - verts[0];

  // calculate u parameter and test bound
  u = T * P * inv_det;
  // the intersection lies outside of the triangle
  if(u < 0 or u > 1) return false;

  // prepare to test v parameter
  Q = T ^ e1;

  // Ccalculate V parameter and test bound
  v = new_ray.direction() * Q * inv_det;
  // the intersection lies outside of the triangle
  if(v < 0 or u + v  > 1) return false;

  t = e2 * Q * inv_det;

  if (t > EPS and ray.minT() > t)
  {
    ray.setMinT(t);
    return true;
  }

  return false;
}

// Assembly:
subq $0x20, %rsp
movsd 0x18(%rsi), %xmm2
movsd 0x20(%rsi), %xmm4
movsd 0x28(%rsi), %xmm1
movsd 0x88(%rdi), %xmm3
movsd 0x90(%rdi), %xmm7
movsd 0x98(%rdi), %xmm5
movsd 0xa0(%rdi), %xmm6
movsd 0xa8(%rdi), %xmm8
movsd 0xb0(%rdi), %xmm10
movsd 0xb8(%rdi), %xmm9
movsd 0xc0(%rdi), %xmm12
movsd 0xc8(%rdi), %xmm15
movapd %xmm4, %xmm0
movsd %xmm7, 0x8(%rsp)
mulsd %xmm7, %xmm0
movsd %xmm3, 0x18(%rsp)
mulsd %xmm2, %xmm3
addsd %xmm0, %xmm3
movsd %xmm5, 0x10(%rsp)
mulsd %xmm1, %xmm5
addsd %xmm3, %xmm5
xorpd %xmm7, %xmm7
movsd %xmm6, -0x60(%rsp)
movapd %xmm6, %xmm0
mulsd %xmm7, %xmm0
addsd %xmm5, %xmm0
movapd %xmm4, %xmm3
movsd %xmm10, -0x10(%rsp)
mulsd %xmm10, %xmm3
movsd %xmm8, (%rsp)
movapd %xmm8, %xmm5
mulsd %xmm2, %xmm5
addsd %xmm3, %xmm5
movsd %xmm9, -0x8(%rsp)
movapd %xmm9, %xmm3
mulsd %xmm1, %xmm3
addsd %xmm5, %xmm3
movsd %xmm12, -0x68(%rsp)
mulsd %xmm7, %xmm12
addsd %xmm3, %xmm12
movsd 0xd0(%rdi), %xmm3
movsd %xmm3, -0x80(%rsp)
mulsd %xmm3, %xmm4
mulsd %xmm15, %xmm2
addsd %xmm4, %xmm2
movsd 0xd8(%rdi), %xmm13
mulsd %xmm13, %xmm1
addsd %xmm2, %xmm1
movsd 0xe0(%rdi), %xmm9
movapd %xmm9, %xmm8
mulsd %xmm7, %xmm8
addsd %xmm1, %xmm8
movsd 0x198(%rdi), %xmm7
movsd 0x1c8(%rdi), %xmm5
subsd %xmm7, %xmm5
movsd 0x1a0(%rdi), %xmm10
movsd 0x1d0(%rdi), %xmm14
subsd %xmm10, %xmm14
movapd %xmm5, %xmm2
mulsd %xmm8, %xmm2
movapd %xmm12, %xmm1
mulsd %xmm14, %xmm1
subsd %xmm2, %xmm1
movsd 0x190(%rdi), %xmm3
movsd 0x1c0(%rdi), %xmm6
subsd %xmm3, %xmm6
movapd %xmm14, %xmm4
mulsd %xmm0, %xmm4
movapd %xmm8, %xmm2
mulsd %xmm6, %xmm2
subsd %xmm4, %xmm2
movsd %xmm6, -0x40(%rsp)
movapd %xmm6, %xmm4
mulsd %xmm12, %xmm4
movapd %xmm0, %xmm11
movsd %xmm5, -0x38(%rsp)
mulsd %xmm5, %xmm11
subsd %xmm4, %xmm11
movsd 0x1a8(%rdi), %xmm5
movsd %xmm3, -0x28(%rsp)
subsd %xmm3, %xmm5
movsd 0x1b0(%rdi), %xmm4
movsd %xmm7, -0x18(%rsp)
subsd %xmm7, %xmm4
movsd %xmm4, -0x30(%rsp)
mulsd %xmm2, %xmm4
movapd %xmm5, %xmm6
mulsd %xmm1, %xmm6
addsd %xmm4, %xmm6
movsd 0x1b8(%rdi), %xmm4
movsd %xmm10, -0x20(%rsp)
subsd %xmm10, %xmm4
movapd %xmm4, %xmm7
mulsd %xmm11, %xmm7
addsd %xmm6, %xmm7
movapd 0x58de(%rip), %xmm6     # 0x2ca40
andpd %xmm7, %xmm6
movsd 0x71f9(%rip), %xmm10    # 0x2e368
ucomisd %xmm6, %xmm10
jbe 0x2717d
xorl %eax, %eax
addq $0x20, %rsp
retq
movsd %xmm5, -0x48(%rsp)
movsd %xmm14, -0x78(%rsp)
movsd 0x10(%rsi), %xmm5
movsd (%rsi), %xmm14
movsd %xmm9, -0x58(%rsp)
movsd 0x8(%rsi), %xmm9
movsd 0xf0(%rdi), %xmm10
mulsd %xmm9, %xmm10
movsd 0xe8(%rdi), %xmm6
mulsd %xmm14, %xmm6
addsd %xmm10, %xmm6
movsd 0xf8(%rdi), %xmm10
mulsd %xmm5, %xmm10
addsd %xmm6, %xmm10
addsd 0x100(%rdi), %xmm10
ucomisd 0x4f72(%rip), %xmm10    # 0x2c158
movsd -0x80(%rsp), %xmm3
movsd %xmm9, -0x50(%rsp)
mulsd %xmm9, %xmm3
movsd -0x58(%rsp), %xmm9
movsd %xmm14, -0x70(%rsp)
mulsd %xmm14, %xmm15
addsd %xmm3, %xmm15
movsd %xmm5, -0x80(%rsp)
mulsd %xmm5, %xmm13
addsd %xmm15, %xmm13
addsd %xmm13, %xmm9
movapd %xmm9, %xmm15
divsd %xmm10, %xmm15
jne 0x27246
movsd -0x60(%rsp), %xmm3
movsd -0x68(%rsp), %xmm6
jp 0x27252
movapd %xmm9, %xmm15
jmp 0x27252
movsd -0x60(%rsp), %xmm3
movsd -0x68(%rsp), %xmm6
movsd -0x10(%rsp), %xmm13
movsd -0x50(%rsp), %xmm14
mulsd %xmm14, %xmm13
movsd (%rsp), %xmm9
mulsd -0x70(%rsp), %xmm9
addsd %xmm13, %xmm9
movsd -0x8(%rsp), %xmm13
mulsd -0x80(%rsp), %xmm13
addsd %xmm9, %xmm13
addsd %xmm13, %xmm6
movapd %xmm6, %xmm13
divsd %xmm10, %xmm13
movsd -0x48(%rsp), %xmm5
jne 0x272a8
jp 0x272a8
movapd %xmm6, %xmm13
movsd 0x8(%rsp), %xmm9
mulsd %xmm14, %xmm9
movsd 0x18(%rsp), %xmm6
mulsd -0x70(%rsp), %xmm6
addsd %xmm9, %xmm6
movsd 0x10(%rsp), %xmm9
mulsd -0x80(%rsp), %xmm9
addsd %xmm6, %xmm9
addsd %xmm9, %xmm3
movapd %xmm3, %xmm9
divsd %xmm10, %xmm9
jne 0x272f8
movsd -0x78(%rsp), %xmm6
jp 0x272fe
movapd %xmm3, %xmm9
jmp 0x272fe
movsd -0x78(%rsp), %xmm6
movsd 0x4e3a(%rip), %xmm3     # 0x2c140
divsd %xmm7, %xmm3
subsd -0x28(%rsp), %xmm9
subsd -0x18(%rsp), %xmm13
subsd -0x20(%rsp), %xmm15
mulsd %xmm13, %xmm2
mulsd %xmm9, %xmm1
addsd %xmm2, %xmm1
mulsd %xmm15, %xmm11
addsd %xmm1, %xmm11
mulsd %xmm3, %xmm11
xorl %eax, %eax
xorpd %xmm1, %xmm1
ucomisd %xmm11, %xmm1
ja 0x27178
ucomisd 0x4dea(%rip), %xmm11    # 0x2c140
ja 0x27178
movsd -0x30(%rsp), %xmm7
movapd %xmm7, %xmm2
mulsd %xmm15, %xmm2
movapd %xmm13, %xmm1
mulsd %xmm4, %xmm1
subsd %xmm2, %xmm1
mulsd %xmm9, %xmm4
mulsd %xmm5, %xmm15
subsd %xmm4, %xmm15
mulsd %xmm13, %xmm5
mulsd %xmm7, %xmm9
subsd %xmm5, %xmm9
mulsd %xmm15, %xmm12
mulsd %xmm1, %xmm0
addsd %xmm12, %xmm0
mulsd %xmm9, %xmm8
addsd %xmm0, %xmm8
mulsd %xmm3, %xmm8
xorl %eax, %eax
xorpd %xmm0, %xmm0
ucomisd %xmm8, %xmm0
ja 0x27178
addsd %xmm8, %xmm11
ucomisd 0x4d6e(%rip), %xmm11    # 0x2c140
ja 0x27178
movsd -0x38(%rsp), %xmm0
mulsd %xmm15, %xmm0
movsd -0x40(%rsp), %xmm2
mulsd %xmm1, %xmm2
addsd %xmm0, %xmm2
mulsd %xmm9, %xmm6
addsd %xmm2, %xmm6
mulsd %xmm6, %xmm3
xorl %eax, %eax
ucomisd 0x6f60(%rip), %xmm3     # 0x2e368
jbe 0x27178
movsd 0x30(%rsi), %xmm0
ucomisd %xmm3, %xmm0
jbe 0x27178
movsd %xmm3, 0x30(%rsi)
movb $0x1, %al
jmp 0x27178
nop