// File: /workspace/github_cpp_makefile_star2_O3/srajangarg[P]raytracer/src/Primitives.cpp
// Function: Sphere::intersect(Ray&) const
bool
Sphere::intersect(Ray & ray) const
{
  Vec3 s, d;
  double dis, t;

  Ray new_ray = ray;
  new_ray.transform(worldToModel_);
  s = new_ray.start();
  d = new_ray.direction();

  dis = ((d*s)*(d*s)) - (d.length2() * (s.length2() - r_*r_));

  if (dis < 0)
    return false;

  dis = std::sqrt(dis);
  t = ((-d*s) - dis)/d.length2();

  if (t < -EPS)
    t = ((-d*s) + dis)/d.length2();

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

  return false;
}

// Assembly:
pushq %rbx
subq $0x40, %rsp
movq %rsi, %rbx
movsd (%rsi), %xmm12
movsd 0x8(%rsi), %xmm0
movsd 0x10(%rsi), %xmm1
movsd 0x88(%rdi), %xmm2
movsd 0x90(%rdi), %xmm4
movapd %xmm0, %xmm3
movsd %xmm4, 0x10(%rsp)
mulsd %xmm4, %xmm3
movapd %xmm2, %xmm5
mulsd %xmm12, %xmm5
addsd %xmm3, %xmm5
movsd 0x98(%rdi), %xmm4
movapd %xmm4, %xmm11
mulsd %xmm1, %xmm11
addsd %xmm5, %xmm11
movsd 0xa0(%rdi), %xmm3
movapd %xmm3, 0x20(%rsp)
addsd %xmm3, %xmm11
movsd 0xa8(%rdi), %xmm3
movsd 0xb0(%rdi), %xmm6
movapd %xmm0, %xmm5
movsd %xmm6, 0x8(%rsp)
mulsd %xmm6, %xmm5
movapd %xmm3, %xmm6
mulsd %xmm12, %xmm6
addsd %xmm5, %xmm6
movsd 0xb8(%rdi), %xmm7
movapd %xmm7, %xmm13
mulsd %xmm1, %xmm13
addsd %xmm6, %xmm13
movsd 0xc8(%rdi), %xmm5
movsd 0xd0(%rdi), %xmm9
unpcklpd %xmm0, %xmm0            # xmm0 = xmm0[0,0]
movapd %xmm9, %xmm6
movhpd 0xf0(%rdi), %xmm6       # xmm6 = xmm6[0],mem[0]
mulpd %xmm0, %xmm6
movapd %xmm5, %xmm8
movhpd 0xe8(%rdi), %xmm8       # xmm8 = xmm8[0],mem[0]
movsd 0xc0(%rdi), %xmm0
unpcklpd %xmm12, %xmm12          # xmm12 = xmm12[0,0]
mulpd %xmm8, %xmm12
movsd 0xd8(%rdi), %xmm10
addpd %xmm6, %xmm12
movapd %xmm10, %xmm6
movhpd 0xf8(%rdi), %xmm6       # xmm6 = xmm6[0],mem[0]
addsd %xmm0, %xmm13
unpcklpd %xmm1, %xmm1            # xmm1 = xmm1[0,0]
mulpd %xmm6, %xmm1
movsd 0xe0(%rdi), %xmm8
addpd %xmm12, %xmm1
movapd %xmm8, 0x30(%rsp)
movhpd 0x100(%rdi), %xmm8      # xmm8 = xmm8[0],mem[0]
addpd %xmm1, %xmm8
movapd %xmm8, %xmm6
unpckhpd %xmm8, %xmm6            # xmm6 = xmm6[1],xmm8[1]
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm6
movapd %xmm11, %xmm12
divsd %xmm6, %xmm12
jne 0x26d0a
jp 0x26d0a
movapd %xmm11, %xmm12
movsd %xmm12, 0x18(%rsp)
movapd %xmm13, %xmm12
divsd %xmm6, %xmm12
jne 0x26d24
jp 0x26d24
movapd %xmm13, %xmm12
movsd 0x18(%rbx), %xmm14
movsd 0x20(%rbx), %xmm15
movsd 0x28(%rbx), %xmm13
movapd %xmm8, %xmm11
divsd %xmm6, %xmm11
jne 0x26d51
movapd 0x20(%rsp), %xmm6
jp 0x26d57
movapd %xmm8, %xmm11
jmp 0x26d57
movapd 0x20(%rsp), %xmm6
movsd 0x10(%rsp), %xmm8
mulsd %xmm15, %xmm8
mulsd %xmm14, %xmm2
addsd %xmm8, %xmm2
mulsd %xmm13, %xmm4
addsd %xmm2, %xmm4
mulsd %xmm1, %xmm6
addsd %xmm4, %xmm6
movsd 0x8(%rsp), %xmm2
mulsd %xmm15, %xmm2
mulsd %xmm14, %xmm3
addsd %xmm2, %xmm3
mulsd %xmm13, %xmm7
addsd %xmm3, %xmm7
mulsd %xmm1, %xmm0
addsd %xmm7, %xmm0
mulsd %xmm15, %xmm9
mulsd %xmm14, %xmm5
addsd %xmm9, %xmm5
mulsd %xmm13, %xmm10
addsd %xmm5, %xmm10
movapd 0x30(%rsp), %xmm3
mulsd %xmm1, %xmm3
addsd %xmm10, %xmm3
movapd %xmm0, %xmm4
mulsd %xmm12, %xmm4
mulsd %xmm0, %xmm0
movapd %xmm6, %xmm2
mulsd %xmm6, %xmm2
addsd %xmm0, %xmm2
movapd %xmm3, %xmm5
mulsd %xmm3, %xmm3
addsd %xmm2, %xmm3
mulsd %xmm12, %xmm12
movsd 0x18(%rsp), %xmm2
movapd %xmm2, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm12, %xmm0
mulsd %xmm11, %xmm5
mulsd %xmm11, %xmm11
addsd %xmm0, %xmm11
movsd 0x140(%rdi), %xmm0
mulsd %xmm0, %xmm0
subsd %xmm0, %xmm11
movapd %xmm6, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm4, %xmm0
addsd %xmm5, %xmm0
mulsd %xmm3, %xmm11
mulsd %xmm0, %xmm0
subsd %xmm11, %xmm0
ucomisd %xmm0, %xmm1
jbe 0x26e53
xorl %eax, %eax
jmp 0x26ef9
ucomisd %xmm1, %xmm0
jb 0x26e5f
sqrtsd %xmm0, %xmm0
jmp 0x26e9a
movapd %xmm6, 0x20(%rsp)
movapd %xmm3, 0x30(%rsp)
movsd %xmm4, 0x10(%rsp)
movsd %xmm5, 0x8(%rsp)
callq 0x4270
movsd 0x8(%rsp), %xmm5
movsd 0x10(%rsp), %xmm4
movsd 0x18(%rsp), %xmm2
movapd 0x30(%rsp), %xmm3
movapd 0x20(%rsp), %xmm6
xorpd 0x42be(%rip), %xmm6     # 0x2b160
mulsd %xmm2, %xmm6
subsd %xmm4, %xmm6
subsd %xmm5, %xmm6
movapd %xmm6, %xmm1
subsd %xmm0, %xmm1
divsd %xmm3, %xmm1
addsd %xmm0, %xmm6
movapd %xmm1, %xmm0
cmpltsd 0x6585(%rip), %xmm0     # 0x2d450
divsd %xmm3, %xmm6
andpd %xmm0, %xmm6
andnpd %xmm1, %xmm0
orpd %xmm6, %xmm0
xorl %eax, %eax
ucomisd 0x6573(%rip), %xmm0     # 0x2d458
jbe 0x26ef9
movsd 0x30(%rbx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x26ef9
movsd %xmm0, 0x30(%rbx)
movb $0x1, %al
addq $0x40, %rsp
popq %rbx
retq
nop