// File: alan0201tw[P]RayTracer/src/aarect.cpp
// Function: xy_rect::hit(ray const&, float, float, hit_record&) const
bool xy_rect::hit(const ray& _ray, float t_min, float t_max, hit_record& rec) const 
{
    float t = (k - _ray.origin().z()) / _ray.direction().z();
    if(t < t_min || t > t_max)
    {
        return false;
    }
    float x = _ray.origin().x() + t * _ray.direction().x();
    float y = _ray.origin().y() + t * _ray.direction().y();
    if(x < x0 || x > x1 || y < y0 || y > y1)
    {
        return false;
    }
    rec.u = (x - x0) / (x1 - x0);
    rec.v = (y - y0) / (y1 - y0);
    rec.t = t;
    rec.material_ref = rect_material;
    rec.hit_point = _ray.point_at_parameter(t);
    rec.normal = vec3(0.0f, 0.0f, 1.0f);
    return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x140, %rsp            # imm = 0x140
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movss %xmm0, -0x1c(%rbp)
movss %xmm1, -0x20(%rbp)
movq %rdx, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x128(%rbp)
movss 0x18(%rax), %xmm0
movss %xmm0, -0x11c(%rbp)
movq -0x18(%rbp), %rdi
callq 0xf870
movss %xmm1, -0x40(%rbp)
movlpd %xmm0, -0x48(%rbp)
movl -0x40(%rbp), %eax
movl %eax, -0x30(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x38(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x8db0
movaps %xmm0, %xmm1
movss -0x11c(%rbp), %xmm0
subss %xmm1, %xmm0
movss %xmm0, -0x118(%rbp)
movq -0x18(%rbp), %rdi
callq 0xf8b0
movss %xmm1, -0x60(%rbp)
movlpd %xmm0, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x54(%rbp)
movl -0x60(%rbp), %eax
movl %eax, -0x4c(%rbp)
leaq -0x54(%rbp), %rdi
callq 0x8db0
movaps %xmm0, %xmm1
movss -0x118(%rbp), %xmm0
divss %xmm1, %xmm0
movss %xmm0, -0x2c(%rbp)
movss -0x2c(%rbp), %xmm1
movss -0x1c(%rbp), %xmm0
ucomiss %xmm1, %xmm0
ja 0xec82
movss -0x2c(%rbp), %xmm0
ucomiss -0x20(%rbp), %xmm0
jbe 0xec8b
movb $0x0, -0x1(%rbp)
jmp 0xef3a
movq -0x18(%rbp), %rdi
callq 0xf870
movss %xmm1, -0x80(%rbp)
movlpd %xmm0, -0x88(%rbp)
movl -0x80(%rbp), %eax
movl %eax, -0x70(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x78(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x8d70
movss %xmm0, -0x138(%rbp)
movss -0x2c(%rbp), %xmm0
movss %xmm0, -0x134(%rbp)
movq -0x18(%rbp), %rdi
callq 0xf8b0
movss %xmm1, -0xa0(%rbp)
movlpd %xmm0, -0xa8(%rbp)
movl -0xa0(%rbp), %eax
movl %eax, -0x90(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x98(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x8d70
movss -0x138(%rbp), %xmm1
movaps %xmm0, %xmm2
movss -0x134(%rbp), %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x6c(%rbp)
movq -0x18(%rbp), %rdi
callq 0xf870
movss %xmm1, -0xc0(%rbp)
movlpd %xmm0, -0xc8(%rbp)
movl -0xc0(%rbp), %eax
movl %eax, -0xb0(%rbp)
movq -0xc8(%rbp), %rax
movq %rax, -0xb8(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x8d90
movss %xmm0, -0x130(%rbp)
movss -0x2c(%rbp), %xmm0
movss %xmm0, -0x12c(%rbp)
movq -0x18(%rbp), %rdi
callq 0xf8b0
movss %xmm1, -0xe0(%rbp)
movlpd %xmm0, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0xd4(%rbp)
movl -0xe0(%rbp), %eax
movl %eax, -0xcc(%rbp)
leaq -0xd4(%rbp), %rdi
callq 0x8d90
movss -0x130(%rbp), %xmm1
movq -0x128(%rbp), %rax
movaps %xmm0, %xmm2
movss -0x12c(%rbp), %xmm0
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0xac(%rbp)
movss -0x6c(%rbp), %xmm1
movss 0x8(%rax), %xmm0
ucomiss %xmm1, %xmm0
ja 0xee3b
movq -0x128(%rbp), %rax
movss -0x6c(%rbp), %xmm0
ucomiss 0xc(%rax), %xmm0
ja 0xee3b
movq -0x128(%rbp), %rax
movss -0xac(%rbp), %xmm1
movss 0x10(%rax), %xmm0
ucomiss %xmm1, %xmm0
ja 0xee3b
movq -0x128(%rbp), %rax
movss -0xac(%rbp), %xmm0
ucomiss 0x14(%rax), %xmm0
jbe 0xee44
movb $0x0, -0x1(%rbp)
jmp 0xef3a
movq -0x128(%rbp), %rsi
movss -0x6c(%rbp), %xmm0
movss 0x8(%rsi), %xmm2
movss 0xc(%rsi), %xmm1
subss %xmm2, %xmm0
subss %xmm2, %xmm1
divss %xmm1, %xmm0
movq -0x28(%rbp), %rax
movss %xmm0, 0x4(%rax)
movss -0xac(%rbp), %xmm0
movss 0x10(%rsi), %xmm2
movss 0x14(%rsi), %xmm1
subss %xmm2, %xmm0
subss %xmm2, %xmm1
divss %xmm1, %xmm0
movq -0x28(%rbp), %rax
movss %xmm0, 0x8(%rax)
movss -0x2c(%rbp), %xmm0
movq -0x28(%rbp), %rax
movss %xmm0, (%rax)
addq $0x20, %rsi
movq -0x28(%rbp), %rdi
addq $0x28, %rdi
callq 0xf8f0
movq -0x18(%rbp), %rdi
movss -0x2c(%rbp), %xmm0
callq 0xf920
movss %xmm1, -0x100(%rbp)
movlpd %xmm0, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0xf4(%rbp)
movl -0x100(%rbp), %eax
movl %eax, -0xec(%rbp)
movq -0x28(%rbp), %rax
movq -0xf4(%rbp), %rcx
movq %rcx, 0xc(%rax)
movl -0xec(%rbp), %ecx
movl %ecx, 0x14(%rax)
leaq -0x114(%rbp), %rdi
xorps %xmm1, %xmm1
movss 0x6f2e6(%rip), %xmm2    # 0x7e1fc
movaps %xmm1, %xmm0
callq 0xf9b0
movq -0x28(%rbp), %rax
movq -0x114(%rbp), %rcx
movq %rcx, 0x18(%rax)
movl -0x10c(%rbp), %ecx
movl %ecx, 0x20(%rax)
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x140, %rsp            # imm = 0x140
popq %rbp
retq
nopl (%rax,%rax)