// File: /workspace/github_cpp_makefile_star2_O3/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 $0x38, %rsp
movsd 0x18(%rsi), %xmm2
movsd 0x20(%rsi), %xmm3
movsd 0x28(%rsi), %xmm1
movsd 0x88(%rdi), %xmm4
movsd 0x90(%rdi), %xmm7
movsd 0x98(%rdi), %xmm5
movsd 0xa0(%rdi), %xmm6
movsd 0xa8(%rdi), %xmm8
movsd 0xb0(%rdi), %xmm11
movsd 0xb8(%rdi), %xmm10
movsd 0xc0(%rdi), %xmm12
movsd 0xc8(%rdi), %xmm13
movapd %xmm3, %xmm0
movsd %xmm7, -0x18(%rsp)
mulsd %xmm7, %xmm0
movsd %xmm4, -0x8(%rsp)
mulsd %xmm2, %xmm4
addsd %xmm0, %xmm4
movsd %xmm5, -0x10(%rsp)
mulsd %xmm1, %xmm5
addsd %xmm4, %xmm5
xorpd %xmm7, %xmm7
movsd %xmm6, -0x70(%rsp)
movapd %xmm6, %xmm0
mulsd %xmm7, %xmm0
addsd %xmm5, %xmm0
movapd %xmm3, %xmm4
movsd %xmm11, -0x30(%rsp)
mulsd %xmm11, %xmm4
movsd %xmm8, -0x20(%rsp)
movapd %xmm8, %xmm5
mulsd %xmm2, %xmm5
addsd %xmm4, %xmm5
movsd %xmm10, -0x28(%rsp)
movapd %xmm10, %xmm4
mulsd %xmm1, %xmm4
addsd %xmm5, %xmm4
movsd %xmm12, -0x78(%rsp)
mulsd %xmm7, %xmm12
addsd %xmm4, %xmm12
movsd 0xd0(%rdi), %xmm9
mulsd %xmm9, %xmm3
mulsd %xmm13, %xmm2
addsd %xmm3, %xmm2
movsd 0xd8(%rdi), %xmm3
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
movsd 0xe0(%rdi), %xmm15
movapd %xmm15, %xmm8
mulsd %xmm7, %xmm8
addsd %xmm1, %xmm8
movsd 0x198(%rdi), %xmm7
movsd 0x1c8(%rdi), %xmm5
subsd %xmm7, %xmm5
movsd 0x1a0(%rdi), %xmm14
movsd 0x1d0(%rdi), %xmm4
subsd %xmm14, %xmm4
movapd %xmm5, %xmm2
mulsd %xmm8, %xmm2
movapd %xmm12, %xmm1
mulsd %xmm4, %xmm1
subsd %xmm2, %xmm1
movsd 0x190(%rdi), %xmm10
movsd 0x1c0(%rdi), %xmm6
subsd %xmm10, %xmm6
movsd %xmm4, -0x50(%rsp)
mulsd %xmm0, %xmm4
movapd %xmm8, %xmm2
mulsd %xmm6, %xmm2
subsd %xmm4, %xmm2
movsd %xmm6, -0x60(%rsp)
movapd %xmm6, %xmm4
mulsd %xmm12, %xmm4
movapd %xmm0, %xmm11
movsd %xmm5, -0x58(%rsp)
mulsd %xmm5, %xmm11
subsd %xmm4, %xmm11
movsd 0x1a8(%rdi), %xmm6
movsd %xmm10, -0x48(%rsp)
subsd %xmm10, %xmm6
movsd 0x1b0(%rdi), %xmm10
movsd %xmm7, -0x38(%rsp)
subsd %xmm7, %xmm10
movapd %xmm10, %xmm4
mulsd %xmm2, %xmm4
movapd %xmm6, %xmm5
mulsd %xmm1, %xmm5
addsd %xmm4, %xmm5
movsd 0x1b8(%rdi), %xmm4
movsd %xmm14, -0x40(%rsp)
subsd %xmm14, %xmm4
movapd %xmm4, %xmm7
mulsd %xmm11, %xmm7
addsd %xmm5, %xmm7
movapd 0x460f(%rip), %xmm5     # 0x2ba00
andpd %xmm7, %xmm5
movsd 0x605a(%rip), %xmm14    # 0x2d458
ucomisd %xmm5, %xmm14
jbe 0x2740c
xorl %eax, %eax
addq $0x38, %rsp
retq
movsd %xmm10, -0x68(%rsp)
movsd 0x10(%rsi), %xmm14
movapd %xmm13, %xmm10
movsd (%rsi), %xmm13
movsd 0x8(%rsi), %xmm5
movhpd 0xf0(%rdi), %xmm9       # xmm9 = xmm9[0],mem[0]
movapd %xmm5, (%rsp)
unpcklpd %xmm5, %xmm5            # xmm5 = xmm5[0,0]
movhpd 0xe8(%rdi), %xmm10      # xmm10 = xmm10[0],mem[0]
mulpd %xmm9, %xmm5
movapd %xmm13, 0x10(%rsp)
unpcklpd %xmm13, %xmm13          # xmm13 = xmm13[0,0]
mulpd %xmm10, %xmm13
addpd %xmm5, %xmm13
movhpd 0xf8(%rdi), %xmm3       # xmm3 = xmm3[0],mem[0]
movapd %xmm14, 0x20(%rsp)
movapd %xmm14, %xmm5
unpcklpd %xmm14, %xmm5           # xmm5 = xmm5[0],xmm14[0]
mulpd %xmm3, %xmm5
movhpd 0x100(%rdi), %xmm15     # xmm15 = xmm15[0],mem[0]
addpd %xmm13, %xmm5
addpd %xmm5, %xmm15
movapd %xmm15, %xmm3
unpckhpd %xmm15, %xmm3           # xmm3 = xmm3[1],xmm15[1]
ucomisd 0x43f0(%rip), %xmm3     # 0x2b890
movapd %xmm15, %xmm9
divsd %xmm3, %xmm9
jne 0x274bb
movsd -0x78(%rsp), %xmm5
jp 0x274c1
movapd %xmm15, %xmm9
jmp 0x274c1
movsd -0x78(%rsp), %xmm5
movsd -0x30(%rsp), %xmm14
mulsd (%rsp), %xmm14
movsd -0x20(%rsp), %xmm13
mulsd 0x10(%rsp), %xmm13
addsd %xmm14, %xmm13
movsd -0x28(%rsp), %xmm14
mulsd 0x20(%rsp), %xmm14
addsd %xmm13, %xmm14
addsd %xmm14, %xmm5
movapd %xmm5, %xmm14
divsd %xmm3, %xmm14
movsd -0x68(%rsp), %xmm10
jne 0x2751c
movsd -0x70(%rsp), %xmm15
jp 0x27523
movapd %xmm5, %xmm14
jmp 0x27523
movsd -0x70(%rsp), %xmm15
movsd -0x18(%rsp), %xmm5
mulsd (%rsp), %xmm5
movsd -0x8(%rsp), %xmm13
mulsd 0x10(%rsp), %xmm13
addsd %xmm5, %xmm13
movsd -0x10(%rsp), %xmm5
mulsd 0x20(%rsp), %xmm5
addsd %xmm13, %xmm5
addsd %xmm5, %xmm15
movapd %xmm15, %xmm13
divsd %xmm3, %xmm13
jne 0x2756a
jp 0x2756a
movapd %xmm15, %xmm13
movsd 0x3bd6(%rip), %xmm3     # 0x2b148
divsd %xmm7, %xmm3
subsd -0x48(%rsp), %xmm13
subsd -0x38(%rsp), %xmm14
subsd -0x40(%rsp), %xmm9
mulsd %xmm14, %xmm2
mulsd %xmm13, %xmm1
addsd %xmm2, %xmm1
mulsd %xmm9, %xmm11
addsd %xmm1, %xmm11
mulsd %xmm3, %xmm11
xorl %eax, %eax
xorpd %xmm1, %xmm1
ucomisd %xmm11, %xmm1
ja 0x27407
ucomisd 0x3b86(%rip), %xmm11    # 0x2b148
ja 0x27407
movapd %xmm10, %xmm2
mulsd %xmm9, %xmm2
movapd %xmm14, %xmm1
mulsd %xmm4, %xmm1
subsd %xmm2, %xmm1
mulsd %xmm13, %xmm4
mulsd %xmm6, %xmm9
subsd %xmm4, %xmm9
mulsd %xmm14, %xmm6
mulsd %xmm10, %xmm13
subsd %xmm6, %xmm13
mulsd %xmm9, %xmm12
mulsd %xmm1, %xmm0
addsd %xmm12, %xmm0
mulsd %xmm13, %xmm8
addsd %xmm0, %xmm8
mulsd %xmm3, %xmm8
xorl %eax, %eax
xorpd %xmm0, %xmm0
ucomisd %xmm8, %xmm0
ja 0x27407
addsd %xmm8, %xmm11
ucomisd 0x3b0f(%rip), %xmm11    # 0x2b148
ja 0x27407
movsd -0x58(%rsp), %xmm0
mulsd %xmm9, %xmm0
movsd -0x60(%rsp), %xmm2
mulsd %xmm1, %xmm2
addsd %xmm0, %xmm2
movsd -0x50(%rsp), %xmm0
mulsd %xmm13, %xmm0
addsd %xmm2, %xmm0
mulsd %xmm0, %xmm3
xorl %eax, %eax
ucomisd 0x5de3(%rip), %xmm3     # 0x2d458
jbe 0x27407
movsd 0x30(%rsi), %xmm0
ucomisd %xmm3, %xmm0
jbe 0x27407
movsd %xmm3, 0x30(%rsi)
movb $0x1, %al
jmp 0x27407