// File: /workspace/github_cpp_makefile_star2_O1/alan0201tw[P]RayTracer/include/camera.hpp
// Function: camera::camera(vec3 const&, vec3 const&, vec3 const&, float, float, float, float, float, float)
camera(const vec3& _lookfrom, const vec3& _lookat, const vec3& _up , float _vfov, float _aspect, float _aperture, float _focus_distance, float _t0, float _t1)
    {
        open_time = _t0;
        close_time = _t1;

        float theta = _vfov * M_PI / 180.0f;
        float half_height = tan(theta / 2.0f);
        float half_width = _aspect * half_height;

        origin = _lookfrom;
        camera_forward = unit_vector(_lookfrom - _lookat);
        camera_right = unit_vector( cross(_up, camera_forward) );
        camera_up = unit_vector( cross(camera_forward, camera_right) );

        lens_radius = _aperture / 2.0f;

        lower_left_corner = origin - half_width * _focus_distance * camera_right 
            - half_height * _focus_distance * camera_up - _focus_distance * camera_forward;
        
        horizontal = 2.0f * half_width * _focus_distance * camera_right;
        vertical = 2.0f * half_height * _focus_distance * camera_up;
    }

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x48, %rsp
movss %xmm3, 0xc(%rsp)
movss %xmm2, 0x8(%rsp)
movss %xmm1, (%rsp)
movq %rcx, %r14
movq %rdx, %r15
movq %rsi, %r12
movq %rdi, %rbx
movss %xmm4, 0x58(%rdi)
movss %xmm5, 0x5c(%rdi)
cvtss2sd %xmm0, %xmm0
mulsd 0x2e82(%rip), %xmm0     # 0x3c5f8
divsd 0x5cd2(%rip), %xmm0     # 0x3f450
cvtsd2ss %xmm0, %xmm0
mulss 0x2aa2(%rip), %xmm0     # 0x3c22c
callq 0x6540
movl 0x8(%r12), %eax
movl %eax, 0x2c(%rbx)
movq (%r12), %rax
movq %rax, 0x24(%rbx)
movss (%r12), %xmm2
movss 0x4(%r12), %xmm3
subss (%r15), %xmm2
subss 0x4(%r15), %xmm3
movss 0x8(%r12), %xmm5
subss 0x8(%r15), %xmm5
movss %xmm0, 0x4(%rsp)
movaps %xmm3, %xmm0
mulss %xmm3, %xmm0
movaps %xmm2, %xmm1
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movaps %xmm5, %xmm0
mulss %xmm5, %xmm0
addss %xmm1, %xmm0
xorps %xmm6, %xmm6
ucomiss %xmm6, %xmm0
jb 0x397f5
sqrtss %xmm0, %xmm0
jmp 0x3981b
movaps %xmm5, 0x30(%rsp)
movaps %xmm2, 0x20(%rsp)
movaps %xmm3, 0x10(%rsp)
callq 0x6710
movaps 0x10(%rsp), %xmm3
movaps 0x20(%rsp), %xmm2
xorps %xmm6, %xmm6
movaps 0x30(%rsp), %xmm5
divss %xmm0, %xmm2
divss %xmm0, %xmm3
unpcklps %xmm3, %xmm2            # xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
divss %xmm0, %xmm5
movlps %xmm2, 0x30(%rbx)
movss %xmm5, 0x38(%rbx)
movss (%r14), %xmm4
movss 0x4(%r14), %xmm0
movss 0x8(%r14), %xmm1
movss 0x30(%rbx), %xmm2
movss 0x34(%rbx), %xmm3
movaps %xmm0, %xmm7
mulss %xmm5, %xmm7
mulss %xmm4, %xmm5
mulss %xmm3, %xmm4
mulss %xmm1, %xmm3
subss %xmm3, %xmm7
mulss %xmm2, %xmm1
subss %xmm1, %xmm5
movaps 0x2a8c(%rip), %xmm3     # 0x3c300
xorps %xmm5, %xmm3
mulss %xmm0, %xmm2
subss %xmm2, %xmm4
mulss %xmm5, %xmm5
movaps %xmm7, %xmm1
mulss %xmm7, %xmm1
addss %xmm5, %xmm1
movaps %xmm4, %xmm0
mulss %xmm4, %xmm0
addss %xmm1, %xmm0
ucomiss %xmm6, %xmm0
jb 0x398a4
sqrtss %xmm0, %xmm0
jmp 0x398c7
movaps %xmm4, 0x30(%rsp)
movaps %xmm7, 0x20(%rsp)
movaps %xmm3, 0x10(%rsp)
callq 0x6710
movaps 0x10(%rsp), %xmm3
movaps 0x20(%rsp), %xmm7
movaps 0x30(%rsp), %xmm4
movss (%rsp), %xmm12
mulss 0x4(%rsp), %xmm12
divss %xmm0, %xmm7
divss %xmm0, %xmm3
unpcklps %xmm3, %xmm7            # xmm7 = xmm7[0],xmm3[0],xmm7[1],xmm3[1]
divss %xmm0, %xmm4
movlps %xmm7, 0x3c(%rbx)
movss %xmm4, 0x44(%rbx)
movss 0x30(%rbx), %xmm14
movss 0x34(%rbx), %xmm0
movss 0x38(%rbx), %xmm1
movss 0x3c(%rbx), %xmm2
movss 0x40(%rbx), %xmm3
movaps %xmm0, %xmm5
mulss %xmm4, %xmm5
mulss %xmm14, %xmm4
mulss %xmm3, %xmm14
mulss %xmm1, %xmm3
subss %xmm3, %xmm5
mulss %xmm2, %xmm1
subss %xmm1, %xmm4
movaps 0x29d2(%rip), %xmm3     # 0x3c300
xorps %xmm4, %xmm3
mulss %xmm0, %xmm2
subss %xmm2, %xmm14
mulss %xmm4, %xmm4
movaps %xmm5, %xmm1
mulss %xmm5, %xmm1
addss %xmm4, %xmm1
movaps %xmm14, %xmm0
mulss %xmm14, %xmm0
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x39964
sqrtss %xmm0, %xmm0
jmp 0x39997
movss %xmm12, (%rsp)
movss %xmm14, 0x30(%rsp)
movaps %xmm5, 0x20(%rsp)
movaps %xmm3, 0x10(%rsp)
callq 0x6710
movaps 0x10(%rsp), %xmm3
movaps 0x20(%rsp), %xmm5
movss 0x30(%rsp), %xmm14
movss (%rsp), %xmm12
divss %xmm0, %xmm5
divss %xmm0, %xmm3
unpcklps %xmm3, %xmm5            # xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
divss %xmm0, %xmm14
movlps %xmm5, 0x48(%rbx)
movss %xmm14, 0x50(%rbx)
movss 0x8(%rsp), %xmm0
mulss 0x286d(%rip), %xmm0     # 0x3c22c
movss %xmm0, 0x54(%rbx)
movaps %xmm12, %xmm2
movss 0xc(%rsp), %xmm11
mulss %xmm11, %xmm2
movss 0x3c(%rbx), %xmm0
movaps %xmm2, %xmm4
mulss %xmm0, %xmm4
movss 0x40(%rbx), %xmm1
movaps %xmm2, %xmm7
mulss %xmm1, %xmm7
movss 0x44(%rbx), %xmm3
mulss %xmm3, %xmm2
movss 0x24(%rbx), %xmm5
subss %xmm4, %xmm5
movss 0x28(%rbx), %xmm6
subss %xmm7, %xmm6
movss 0x2c(%rbx), %xmm7
subss %xmm2, %xmm7
movss 0x4(%rsp), %xmm13
movaps %xmm13, %xmm8
mulss %xmm11, %xmm8
movss 0x48(%rbx), %xmm2
movss 0x4c(%rbx), %xmm4
movaps %xmm8, %xmm9
mulss %xmm2, %xmm9
subss %xmm9, %xmm5
movaps %xmm8, %xmm9
mulss %xmm4, %xmm9
subss %xmm9, %xmm6
mulss %xmm14, %xmm8
subss %xmm8, %xmm7
movss 0x30(%rbx), %xmm8
mulss %xmm11, %xmm8
movss 0x34(%rbx), %xmm9
mulss %xmm11, %xmm9
movss 0x38(%rbx), %xmm10
mulss %xmm11, %xmm10
subss %xmm10, %xmm7
subss %xmm8, %xmm5
subss %xmm9, %xmm6
unpcklps %xmm6, %xmm5            # xmm5 = xmm5[0],xmm6[0],xmm5[1],xmm6[1]
movlps %xmm5, (%rbx)
movss %xmm7, 0x8(%rbx)
addss %xmm12, %xmm12
mulss %xmm11, %xmm12
mulss %xmm12, %xmm0
mulss %xmm12, %xmm1
unpcklps %xmm1, %xmm0            # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
mulss %xmm3, %xmm12
movlps %xmm0, 0xc(%rbx)
movss %xmm12, 0x14(%rbx)
addss %xmm13, %xmm13
mulss %xmm11, %xmm13
mulss %xmm13, %xmm2
mulss %xmm13, %xmm4
unpcklps %xmm4, %xmm2            # xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
mulss %xmm14, %xmm13
movlps %xmm2, 0x18(%rbx)
movss %xmm13, 0x20(%rbx)
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
nop