// File: /workspace/github_cpp_makefile_star2_O3/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 $0xa8, %rsp
movq %r9, -0x48(%rbp)
movq %r8, -0x68(%rbp)
movq %rdx, -0x60(%rbp)
movsd 0xd0(%rsi), %xmm0
movsd 0xd8(%rsi), %xmm1
movsd 0xe0(%rsi), %xmm2
mulsd 0x8(%rcx), %xmm0
mulsd 0x10(%rcx), %xmm1
movq %rcx, -0x50(%rbp)
mulsd 0x18(%rcx), %xmm2
movq %rdi, -0x58(%rbp)
xorpd %xmm3, %xmm3
addsd %xmm3, %xmm0
movsd %xmm0, -0x40(%rbp)
addsd %xmm3, %xmm1
movsd %xmm1, -0x38(%rbp)
addsd %xmm3, %xmm2
movsd %xmm2, -0x30(%rbp)
movq 0xb8(%rsi), %rax
cmpq %rax, 0xc0(%rsi)
je 0x97d1
movq %rsi, %r15
xorl %r12d, %r12d
movq -0x48(%rbp), %r13
movq (%rax,%r12,8), %r14
leaq -0x98(%rbp), %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x9804
leaq -0xd0(%rbp), %rbx
movq %rbx, %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x98b2
movq %r15, %rdi
movq %rbx, %rsi
movq -0x50(%rbp), %rdx
callq 0x9980
testb %al, %al
jne 0x97b0
movsd 0x18(%r14), %xmm1
cmpb $0x1, 0x34(%r14)
jne 0x9552
movq -0x48(%rbp), %rax
subsd (%rax), %xmm1
movsd 0x20(%r14), %xmm2
movsd 0x28(%r14), %xmm9
subsd 0x8(%rax), %xmm2
subsd 0x10(%rax), %xmm9
jmp 0x9573
movapd 0xdb16(%rip), %xmm0     # 0x17070
xorpd %xmm0, %xmm1
movsd 0x20(%r14), %xmm2
movsd 0x28(%r14), %xmm9
xorpd %xmm0, %xmm2
xorpd %xmm0, %xmm9
movq -0x60(%rbp), %rax
movsd 0x18(%rax), %xmm11
movsd 0x20(%rax), %xmm6
movapd %xmm11, %xmm7
xorpd 0xdae1(%rip), %xmm7     # 0x17070
movsd 0x28(%rax), %xmm10
movq -0x68(%rbp), %rax
movsd (%rax), %xmm3
movsd 0x8(%rax), %xmm4
movapd %xmm2, %xmm0
mulsd %xmm4, %xmm0
movapd %xmm1, %xmm12
mulsd %xmm3, %xmm12
addsd %xmm0, %xmm12
movsd 0x10(%rax), %xmm5
movapd %xmm9, %xmm8
mulsd %xmm5, %xmm8
addsd %xmm12, %xmm8
addsd %xmm8, %xmm8
movapd %xmm3, %xmm0
mulsd %xmm8, %xmm0
movapd %xmm2, %xmm12
mulsd %xmm2, %xmm12
movapd %xmm1, %xmm13
mulsd %xmm1, %xmm13
addsd %xmm12, %xmm13
movapd %xmm9, %xmm12
mulsd %xmm9, %xmm12
addsd %xmm13, %xmm12
sqrtsd %xmm12, %xmm12
movsd 0xd9ff(%rip), %xmm13    # 0x17010
movapd %xmm13, %xmm14
divsd %xmm12, %xmm14
movapd %xmm4, %xmm12
mulsd %xmm8, %xmm12
mulsd %xmm5, %xmm8
subsd %xmm1, %xmm0
subsd %xmm2, %xmm12
subsd %xmm9, %xmm8
mulsd %xmm14, %xmm1
mulsd %xmm14, %xmm2
mulsd %xmm9, %xmm14
movapd %xmm6, %xmm9
mulsd %xmm6, %xmm9
mulsd %xmm11, %xmm11
addsd %xmm9, %xmm11
movapd %xmm10, %xmm9
mulsd %xmm10, %xmm9
addsd %xmm11, %xmm9
sqrtsd %xmm9, %xmm9
movapd %xmm13, %xmm11
divsd %xmm9, %xmm11
mulsd %xmm11, %xmm7
mulsd %xmm11, %xmm6
mulsd %xmm10, %xmm11
movapd %xmm12, %xmm9
mulsd %xmm12, %xmm9
movapd %xmm0, %xmm10
mulsd %xmm0, %xmm10
addsd %xmm9, %xmm10
movapd %xmm8, %xmm9
mulsd %xmm8, %xmm9
addsd %xmm10, %xmm9
xorps %xmm10, %xmm10
sqrtsd %xmm9, %xmm10
movapd %xmm13, %xmm9
divsd %xmm10, %xmm9
mulsd %xmm9, %xmm0
mulsd %xmm7, %xmm0
mulsd %xmm9, %xmm12
mulsd %xmm6, %xmm12
subsd %xmm12, %xmm0
mulsd %xmm8, %xmm9
mulsd %xmm11, %xmm9
mulsd %xmm4, %xmm2
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
mulsd %xmm5, %xmm14
addsd %xmm1, %xmm14
xorpd %xmm1, %xmm1
maxsd %xmm1, %xmm14
movq -0x50(%rbp), %rbx
movsd 0x20(%rbx), %xmm2
mulsd %xmm14, %xmm2
movsd %xmm2, -0x70(%rbp)
movsd 0x28(%rbx), %xmm2
mulsd %xmm14, %xmm2
movsd %xmm2, -0x78(%rbp)
mulsd 0x30(%rbx), %xmm14
movsd %xmm14, -0x80(%rbp)
subsd %xmm9, %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 -0x78(%rbp), %xmm2
addsd -0x80(%rbp), %xmm0
mulsd -0x98(%rbp), %xmm1
mulsd -0x90(%rbp), %xmm2
mulsd -0x88(%rbp), %xmm0
movsd -0x40(%rbp), %xmm3
addsd %xmm1, %xmm3
movsd %xmm3, -0x40(%rbp)
movsd -0x38(%rbp), %xmm1
addsd %xmm2, %xmm1
movsd %xmm1, -0x38(%rbp)
movsd -0x30(%rbp), %xmm1
addsd %xmm0, %xmm1
movsd %xmm1, -0x30(%rbp)
incq %r12
movq 0xb8(%r15), %rax
movq 0xc0(%r15), %rcx
subq %rax, %rcx
sarq $0x3, %rcx
cmpq %r12, %rcx
ja 0x94e2
movsd -0x40(%rbp), %xmm0
movq -0x58(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x38(%rbp), %xmm0
movsd %xmm0, 0x8(%rax)
movsd -0x30(%rbp), %xmm0
movsd %xmm0, 0x10(%rax)
addq $0xa8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq