// File: 2TallTim[P]modern-raytracing/sphere.cpp
// Function: sphere::hit(ray const&, double, double, hit_record&) const
bool sphere::hit(const ray& r, double t_min, double t_max, hit_record& rec) const {
    vec3 oc = r.origin() - center;
    double a = dot(r.direction(), r.direction());
    double b = dot(oc,r.direction());
    double c = dot(oc,oc) - radius*radius;
    double discriminant = b*b - a*c;
    if (discriminant > 0){
        double temp = (-b - sqrt(b*b - a*c))/a;
        if (temp < t_max && temp > t_min){
            rec.t = temp;
            rec.p = r.point_at_parameter(rec.t);
            rec.normal = (rec.p - center) / radius;
            rec.mat_ptr = mat;
            return true;
        }
        temp = (-b + sqrt(b*b - a*c))/a;
        if(temp < t_max && temp > t_min){
            rec.t = temp;
            rec.p = r.point_at_parameter(rec.t);
            rec.normal = (rec.p - center) / radius;
            rec.mat_ptr = mat;
            return true;
        }
    }
    return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x180, %rsp            # imm = 0x180
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movsd %xmm0, -0x20(%rbp)
movsd %xmm1, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x168(%rbp)
movq -0x18(%rbp), %rsi
leaq -0x60(%rbp), %rdi
callq 0x3b70
movq -0x168(%rbp), %rdx
addq $0x8, %rdx
leaq -0x48(%rbp), %rdi
leaq -0x60(%rbp), %rsi
callq 0x3ba0
movq -0x18(%rbp), %rsi
leaq -0x80(%rbp), %rdi
callq 0x3cf0
movq -0x18(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0x3cf0
leaq -0x80(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3c50
movsd %xmm0, -0x68(%rbp)
movq -0x18(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
callq 0x3cf0
leaq -0x48(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
callq 0x3c50
movsd %xmm0, -0xa0(%rbp)
leaq -0x48(%rbp), %rsi
movq %rsi, %rdi
callq 0x3c50
movq -0x168(%rbp), %rax
movaps %xmm0, %xmm1
movsd 0x20(%rax), %xmm0
movsd 0x20(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xc0(%rbp)
movsd -0xa0(%rbp), %xmm0
movsd -0xa0(%rbp), %xmm2
movsd -0x68(%rbp), %xmm1
mulsd -0xc0(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0xc8(%rbp)
movsd -0xc8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x3a78
movsd -0xa0(%rbp), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movsd %xmm0, -0x170(%rbp)
movsd -0xa0(%rbp), %xmm0
movsd -0xa0(%rbp), %xmm2
movsd -0x68(%rbp), %xmm1
mulsd -0xc0(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x3170
movaps %xmm0, %xmm1
movsd -0x170(%rbp), %xmm0
subsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xd0(%rbp), %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x38fa
movsd -0xd0(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
jbe 0x38fa
movsd -0xd0(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, (%rax)
movq -0x18(%rbp), %rsi
movq -0x30(%rbp), %rax
movsd (%rax), %xmm0
leaq -0xe8(%rbp), %rdi
callq 0x3d20
movq -0x168(%rbp), %rdx
movq -0x30(%rbp), %rax
movq -0xe8(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0xe0(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0xd8(%rbp), %rcx
movq %rcx, 0x18(%rax)
movq -0x30(%rbp), %rsi
addq $0x8, %rsi
addq $0x8, %rdx
leaq -0x118(%rbp), %rdi
callq 0x3ba0
movq -0x168(%rbp), %rax
movsd 0x20(%rax), %xmm0
leaq -0x100(%rbp), %rdi
leaq -0x118(%rbp), %rsi
callq 0x3d70
movq -0x168(%rbp), %rsi
movq -0x30(%rbp), %rax
movq -0x100(%rbp), %rcx
movq %rcx, 0x20(%rax)
movq -0xf8(%rbp), %rcx
movq %rcx, 0x28(%rax)
movq -0xf0(%rbp), %rcx
movq %rcx, 0x30(%rax)
addq $0x28, %rsi
movq -0x30(%rbp), %rdi
addq $0x38, %rdi
callq 0x3de0
movb $0x1, -0x1(%rbp)
jmp 0x3a7c
movsd -0xa0(%rbp), %xmm0
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
movsd %xmm0, -0x178(%rbp)
movsd -0xa0(%rbp), %xmm0
movsd -0xa0(%rbp), %xmm2
movsd -0x68(%rbp), %xmm1
mulsd -0xc0(%rbp), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x3170
movaps %xmm0, %xmm1
movsd -0x178(%rbp), %xmm0
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, -0xd0(%rbp)
movsd -0xd0(%rbp), %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x3a76
movsd -0xd0(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
jbe 0x3a76
movsd -0xd0(%rbp), %xmm0
movq -0x30(%rbp), %rax
movsd %xmm0, (%rax)
movq -0x18(%rbp), %rsi
movq -0x30(%rbp), %rax
movsd (%rax), %xmm0
leaq -0x130(%rbp), %rdi
callq 0x3d20
movq -0x168(%rbp), %rdx
movq -0x30(%rbp), %rax
movq -0x130(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x128(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x120(%rbp), %rcx
movq %rcx, 0x18(%rax)
movq -0x30(%rbp), %rsi
addq $0x8, %rsi
addq $0x8, %rdx
leaq -0x160(%rbp), %rdi
callq 0x3ba0
movq -0x168(%rbp), %rax
movsd 0x20(%rax), %xmm0
leaq -0x148(%rbp), %rdi
leaq -0x160(%rbp), %rsi
callq 0x3d70
movq -0x168(%rbp), %rsi
movq -0x30(%rbp), %rax
movq -0x148(%rbp), %rcx
movq %rcx, 0x20(%rax)
movq -0x140(%rbp), %rcx
movq %rcx, 0x28(%rax)
movq -0x138(%rbp), %rcx
movq %rcx, 0x30(%rax)
addq $0x28, %rsi
movq -0x30(%rbp), %rdi
addq $0x38, %rdi
callq 0x3de0
movb $0x1, -0x1(%rbp)
jmp 0x3a7c
jmp 0x3a78
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x180, %rsp            # imm = 0x180
popq %rbp
retq
nopw (%rax,%rax)