// File: /workspace/github_cpp_makefile_star2_O1/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), %xmm1
movsd 0x8(%rsi), %xmm9
movsd 0x10(%rsi), %xmm11
movsd 0x88(%rdi), %xmm0
movsd 0x90(%rdi), %xmm3
movapd %xmm9, %xmm2
movsd %xmm3, 0x8(%rsp)
mulsd %xmm3, %xmm2
movapd %xmm0, %xmm4
mulsd %xmm1, %xmm4
addsd %xmm2, %xmm4
movsd 0x98(%rdi), %xmm3
movapd %xmm3, %xmm12
mulsd %xmm11, %xmm12
addsd %xmm4, %xmm12
movsd 0xa0(%rdi), %xmm2
movapd %xmm2, 0x20(%rsp)
addsd %xmm2, %xmm12
movsd 0xa8(%rdi), %xmm2
movsd 0xb0(%rdi), %xmm7
movapd %xmm9, %xmm4
mulsd %xmm7, %xmm4
movapd %xmm2, %xmm5
mulsd %xmm1, %xmm5
addsd %xmm4, %xmm5
movsd 0xb8(%rdi), %xmm6
movapd %xmm6, %xmm14
mulsd %xmm11, %xmm14
addsd %xmm5, %xmm14
movsd 0xc8(%rdi), %xmm4
movsd 0xd0(%rdi), %xmm8
movapd %xmm9, %xmm5
mulsd %xmm8, %xmm5
movapd %xmm4, %xmm13
mulsd %xmm1, %xmm13
addsd %xmm5, %xmm13
mulsd 0xf0(%rdi), %xmm9
movsd 0xd8(%rdi), %xmm10
mulsd 0xe8(%rdi), %xmm1
addsd %xmm9, %xmm1
movapd %xmm10, %xmm15
mulsd %xmm11, %xmm15
mulsd 0xf8(%rdi), %xmm11
addsd %xmm1, %xmm11
movsd 0xc0(%rdi), %xmm9
addsd 0x100(%rdi), %xmm11
addsd %xmm13, %xmm15
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm11
addsd %xmm9, %xmm14
movapd %xmm12, %xmm5
divsd %xmm11, %xmm5
movsd 0xe0(%rdi), %xmm1
jne 0x269f2
jp 0x269f2
movapd %xmm12, %xmm5
movsd %xmm5, 0x18(%rsp)
addsd %xmm1, %xmm15
movapd %xmm14, %xmm13
divsd %xmm11, %xmm13
movsd %xmm1, 0x10(%rsp)
jne 0x26a16
jp 0x26a16
movapd %xmm14, %xmm13
movsd 0x18(%rbx), %xmm1
movsd 0x20(%rbx), %xmm5
movsd 0x28(%rbx), %xmm14
movapd %xmm15, %xmm12
divsd %xmm11, %xmm12
jne 0x26a42
movapd 0x20(%rsp), %xmm11
jp 0x26a49
movapd %xmm15, %xmm12
jmp 0x26a49
movapd 0x20(%rsp), %xmm11
movsd 0x8(%rsp), %xmm15
mulsd %xmm5, %xmm15
mulsd %xmm1, %xmm0
addsd %xmm15, %xmm0
mulsd %xmm14, %xmm3
addsd %xmm0, %xmm3
xorpd %xmm15, %xmm15
mulsd %xmm15, %xmm11
addsd %xmm3, %xmm11
mulsd %xmm5, %xmm7
mulsd %xmm1, %xmm2
addsd %xmm7, %xmm2
mulsd %xmm14, %xmm6
addsd %xmm2, %xmm6
mulsd %xmm15, %xmm9
addsd %xmm6, %xmm9
mulsd %xmm5, %xmm8
mulsd %xmm1, %xmm4
addsd %xmm8, %xmm4
mulsd %xmm14, %xmm10
addsd %xmm4, %xmm10
movsd 0x10(%rsp), %xmm2
mulsd %xmm15, %xmm2
addsd %xmm10, %xmm2
movapd %xmm9, %xmm4
mulsd %xmm13, %xmm4
mulsd %xmm9, %xmm9
movapd %xmm11, %xmm0
mulsd %xmm11, %xmm0
addsd %xmm9, %xmm0
movapd %xmm2, %xmm5
mulsd %xmm2, %xmm2
addsd %xmm0, %xmm2
mulsd %xmm13, %xmm13
movsd 0x18(%rsp), %xmm3
movapd %xmm3, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm13, %xmm0
mulsd %xmm12, %xmm5
mulsd %xmm12, %xmm12
addsd %xmm0, %xmm12
movsd 0x140(%rdi), %xmm0
mulsd %xmm0, %xmm0
subsd %xmm0, %xmm12
movapd %xmm11, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm4, %xmm0
addsd %xmm5, %xmm0
mulsd %xmm2, %xmm12
mulsd %xmm0, %xmm0
subsd %xmm12, %xmm0
ucomisd %xmm0, %xmm15
jbe 0x26b4c
xorl %eax, %eax
jmp 0x26c01
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x26b5c
sqrtsd %xmm0, %xmm0
jmp 0x26b99
movapd %xmm11, 0x20(%rsp)
movsd %xmm2, 0x10(%rsp)
movsd %xmm4, 0x8(%rsp)
movsd %xmm5, 0x38(%rsp)
callq 0x4280
movsd 0x38(%rsp), %xmm5
movsd 0x8(%rsp), %xmm4
movsd 0x18(%rsp), %xmm3
movsd 0x10(%rsp), %xmm2
movapd 0x20(%rsp), %xmm11
xorpd 0x5e8e(%rip), %xmm11    # 0x2ca30
mulsd %xmm3, %xmm11
subsd %xmm4, %xmm11
subsd %xmm5, %xmm11
movapd %xmm11, %xmm1
subsd %xmm0, %xmm1
divsd %xmm2, %xmm1
addsd %xmm0, %xmm11
movapd %xmm1, %xmm0
cmpltsd 0x7790(%rip), %xmm0     # 0x2e360
divsd %xmm2, %xmm11
andpd %xmm0, %xmm11
andnpd %xmm1, %xmm0
orpd %xmm11, %xmm0
xorl %eax, %eax
ucomisd 0x777b(%rip), %xmm0     # 0x2e368
jbe 0x26c01
movsd 0x30(%rbx), %xmm1
ucomisd %xmm0, %xmm1
jbe 0x26c01
movsd %xmm0, 0x30(%rbx)
movb $0x1, %al
addq $0x40, %rsp
popq %rbx
retq
nop