// File: /workspace/github_cpp_makefile_star2_O1/logicx24[P]RayTracer/raytracer.cpp
// Function: Scene::phongShade(Ray&, Polygon*, vec3&, vec3&)
vec3 phongShade(Ray &ray, Polygon *polygon, vec3 &normal, vec3 &point) {
        vec3 total_intensity = vec3(0, 0, 0);
        total_intensity += multiplyComponents(ambientLight.color, polygon->mat.ka);
        for (int i = 0; i < lights.size(); i++) {
        	Light *light = lights[i];
        	vec3 intensity = light->intensityAt(point);
        	Ray shadowRay = light->lightRay(point);
            if (traceShadowRay(shadowRay, polygon)) {
                continue;
            }
        	vec3 l = light->lightVec(point);
            vec3 v = -ray.vec;
            vec3 r = -l + ((2*(l * normal)) * normal);
            l.normalize();
        	v.normalize();
        	r.normalize();
            vec3 coeffs = polygon->mat.kd * MAX(l * normal, 0.0f)
                        + polygon->mat.ks * pow(MAX(r * v, 0.0f), polygon->mat.sp);
            total_intensity += multiplyComponents(intensity, coeffs);
        }
        return total_intensity;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x128, %rsp            # imm = 0x128
movq %r9, -0xa0(%rbp)
movq %r8, -0x98(%rbp)
movq %rdx, -0xf8(%rbp)
xorps %xmm0, %xmm0
movups %xmm0, (%rdi)
movq $0x0, 0x10(%rdi)
movsd 0xd0(%rsi), %xmm0
movsd 0xd8(%rsi), %xmm1
movsd 0xe0(%rsi), %xmm2
mulsd 0x8(%rcx), %xmm0
mulsd 0x10(%rcx), %xmm1
movq %rcx, -0xa8(%rbp)
mulsd 0x18(%rcx), %xmm2
xorpd %xmm3, %xmm3
addsd %xmm3, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd %xmm0, (%rdi)
addsd %xmm3, %xmm1
movsd %xmm1, -0x50(%rbp)
movsd %xmm1, 0x8(%rdi)
addsd %xmm3, %xmm2
movq %rdi, -0xe8(%rbp)
movsd %xmm2, -0x48(%rbp)
movsd %xmm2, 0x10(%rdi)
movq 0xb8(%rsi), %rax
cmpq %rax, 0xc0(%rsi)
je 0x9b94
movq %rsi, %r12
xorl %r14d, %r14d
movq -0xa0(%rbp), %r15
movq (%rax,%r14,8), %r13
leaq -0x110(%rbp), %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x9bca
leaq -0x148(%rbp), %rbx
movq %rbx, %rdi
movq %r13, %rsi
movq %r15, %rdx
callq 0x9c94
movq %r12, %rdi
movq %rbx, %rsi
movq -0xa8(%rbp), %rdx
callq 0x9d9e
testb %al, %al
jne 0x9b71
movsd 0x18(%r13), %xmm2
cmpb $0x1, 0x34(%r13)
jne 0x97c3
movq -0xa0(%rbp), %rax
subsd (%rax), %xmm2
movsd 0x20(%r13), %xmm3
movsd 0x28(%r13), %xmm7
subsd 0x8(%rax), %xmm3
subsd 0x10(%rax), %xmm7
jmp 0x97e3
movapd 0xd8a5(%rip), %xmm0     # 0x17070
xorpd %xmm0, %xmm2
movsd 0x20(%r13), %xmm3
movsd 0x28(%r13), %xmm7
xorpd %xmm0, %xmm3
xorpd %xmm0, %xmm7
movq -0xf8(%rbp), %rax
movsd 0x18(%rax), %xmm8
movsd 0x20(%rax), %xmm5
movsd 0x28(%rax), %xmm10
movq -0x98(%rbp), %rax
movsd (%rax), %xmm4
movsd 0x8(%rax), %xmm6
movsd 0x10(%rax), %xmm0
movsd %xmm0, -0x40(%rbp)
movapd %xmm3, %xmm0
mulsd %xmm3, %xmm0
movapd %xmm2, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movapd %xmm7, %xmm0
mulsd %xmm7, %xmm0
addsd %xmm1, %xmm0
ucomisd 0xd7db(%rip), %xmm0     # 0x17018
movapd %xmm2, -0x80(%rbp)
movapd %xmm3, -0x70(%rbp)
movapd %xmm5, -0xe0(%rbp)
movsd %xmm4, -0x38(%rbp)
movsd %xmm6, -0x30(%rbp)
movapd %xmm8, -0xd0(%rbp)
movapd %xmm7, -0x90(%rbp)
movapd %xmm10, -0xc0(%rbp)
jb 0x987c
sqrtsd %xmm0, %xmm12
jmp 0x98a0
callq 0x31a0
movapd -0xc0(%rbp), %xmm10
movapd -0xd0(%rbp), %xmm8
movapd -0xe0(%rbp), %xmm5
movapd %xmm0, %xmm12
movapd %xmm5, %xmm0
mulsd %xmm5, %xmm0
movapd %xmm8, %xmm1
mulsd %xmm8, %xmm1
addsd %xmm0, %xmm1
movapd %xmm10, %xmm0
mulsd %xmm10, %xmm0
addsd %xmm1, %xmm0
ucomisd 0xd74c(%rip), %xmm0     # 0x17018
jb 0x98d4
sqrtsd %xmm0, %xmm0
jmp 0x9905
movsd %xmm12, -0xf0(%rbp)
callq 0x31a0
movsd -0xf0(%rbp), %xmm12
movapd -0xc0(%rbp), %xmm10
movapd -0xd0(%rbp), %xmm8
movapd -0xe0(%rbp), %xmm5
movapd -0x80(%rbp), %xmm3
movapd -0x70(%rbp), %xmm4
movsd -0x38(%rbp), %xmm6
movsd -0x30(%rbp), %xmm7
movapd 0xd74f(%rip), %xmm1     # 0x17070
xorpd %xmm1, %xmm8
xorpd %xmm1, %xmm5
xorpd %xmm1, %xmm10
movapd %xmm4, %xmm1
mulsd %xmm7, %xmm1
movapd %xmm3, %xmm2
mulsd %xmm6, %xmm2
addsd %xmm1, %xmm2
movapd -0x90(%rbp), %xmm9
movapd %xmm9, %xmm11
movsd -0x40(%rbp), %xmm1
mulsd %xmm1, %xmm11
addsd %xmm2, %xmm11
addsd %xmm11, %xmm11
mulsd %xmm11, %xmm6
mulsd %xmm11, %xmm7
mulsd %xmm1, %xmm11
subsd %xmm3, %xmm6
subsd %xmm4, %xmm7
subsd %xmm9, %xmm11
movsd 0xd687(%rip), %xmm1     # 0x17010
movapd %xmm1, %xmm2
divsd %xmm12, %xmm2
mulsd %xmm2, %xmm3
mulsd %xmm2, %xmm4
mulsd %xmm9, %xmm2
movapd %xmm1, %xmm9
divsd %xmm0, %xmm9
mulsd %xmm9, %xmm8
mulsd %xmm9, %xmm5
mulsd %xmm10, %xmm9
movapd %xmm7, %xmm0
mulsd %xmm7, %xmm0
movapd %xmm6, %xmm1
mulsd %xmm6, %xmm1
addsd %xmm0, %xmm1
movapd %xmm11, %xmm0
mulsd %xmm11, %xmm0
addsd %xmm1, %xmm0
ucomisd 0xd636(%rip), %xmm0     # 0x17018
jb 0x99f0
xorps %xmm1, %xmm1
sqrtsd %xmm0, %xmm1
jmp 0x9a71
movapd %xmm3, -0x80(%rbp)
movapd %xmm4, -0x70(%rbp)
movapd %xmm5, -0xe0(%rbp)
movsd %xmm6, -0x38(%rbp)
movsd %xmm7, -0x30(%rbp)
movapd %xmm8, -0xd0(%rbp)
movsd %xmm2, -0x90(%rbp)
movsd %xmm11, -0xc0(%rbp)
movsd %xmm9, -0x40(%rbp)
callq 0x31a0
movsd -0x40(%rbp), %xmm9
movsd -0xc0(%rbp), %xmm11
movsd -0x90(%rbp), %xmm2
movapd -0xd0(%rbp), %xmm8
movsd -0x30(%rbp), %xmm7
movsd -0x38(%rbp), %xmm6
movapd -0xe0(%rbp), %xmm5
movapd -0x70(%rbp), %xmm4
movapd -0x80(%rbp), %xmm3
movapd %xmm0, %xmm1
movsd 0xd597(%rip), %xmm0     # 0x17010
divsd %xmm1, %xmm0
mulsd %xmm0, %xmm6
mulsd %xmm8, %xmm6
mulsd %xmm0, %xmm7
mulsd %xmm7, %xmm5
addsd %xmm6, %xmm5
mulsd %xmm11, %xmm0
movq -0x98(%rbp), %rax
mulsd 0x8(%rax), %xmm4
mulsd (%rax), %xmm3
mulsd %xmm9, %xmm0
addsd %xmm4, %xmm3
mulsd 0x10(%rax), %xmm2
addsd %xmm3, %xmm2
xorpd %xmm1, %xmm1
maxsd %xmm1, %xmm2
movq -0xa8(%rbp), %rbx
movsd 0x20(%rbx), %xmm3
mulsd %xmm2, %xmm3
movsd %xmm3, -0x70(%rbp)
movsd 0x28(%rbx), %xmm3
mulsd %xmm2, %xmm3
movsd %xmm3, -0x80(%rbp)
mulsd 0x30(%rbx), %xmm2
movsd %xmm2, -0x90(%rbp)
addsd %xmm5, %xmm0
maxsd %xmm1, %xmm0
xorps %xmm1, %xmm1
cvtss2sd 0x68(%rbx), %xmm1
callq 0x3440
movsd 0x38(%rbx), %xmm1
mulsd %xmm0, %xmm1
addsd -0x70(%rbp), %xmm1
movsd 0x40(%rbx), %xmm2
mulsd %xmm0, %xmm2
mulsd 0x48(%rbx), %xmm0
addsd -0x80(%rbp), %xmm2
addsd -0x90(%rbp), %xmm0
mulsd -0x110(%rbp), %xmm1
mulsd -0x108(%rbp), %xmm2
mulsd -0x100(%rbp), %xmm0
movsd -0x58(%rbp), %xmm3
addsd %xmm1, %xmm3
movsd %xmm3, -0x58(%rbp)
movsd -0x50(%rbp), %xmm1
addsd %xmm2, %xmm1
movsd %xmm1, -0x50(%rbp)
movsd -0x48(%rbp), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, -0x48(%rbp)
incq %r14
movq 0xb8(%r12), %rax
movq 0xc0(%r12), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r14, %rcx
ja 0x974e
movq -0xe8(%rbp), %rax
movsd -0x58(%rbp), %xmm0
movsd %xmm0, (%rax)
movsd -0x50(%rbp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd -0x48(%rbp), %xmm0
movsd %xmm0, 0x10(%rax)
addq $0x128, %rsp            # imm = 0x128
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq