// File: /workspace/github_cpp_makefile_star2_O1/srajangarg[P]raytracer/src/Primitives.cpp
// Function: Triangle::calculateNormal(Vec3 const&) const
Vec3
Triangle::calculateNormal(Vec3 const & position) const
{ 
  Vec3 pos = worldToModel_ * position;
  Vec3 norm(0, 0, 0);

  if (smooth_normals) {

    // get the areas of each of the subtriangles, as divided by pos
    double a[3];
    for (int i = 0; i < 3; ++i)
      a[i] = ((verts[(i+1)%3] - pos) ^ (verts[(i+2)%3] - pos)).length();

    // weigh the normals according to these areas
    for (int i = 0; i < 3; ++i)
      norm += a[i] * norms[i];

  } else {

    // simple normal to the triangle
    norm = (verts[1] - verts[0]) ^ (verts[2] - verts[0]);
  }

  return Vec3(worldToModel_.transpose() * Vec4(norm, 0), 3).normalize();
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rsi, %r14
movsd (%rdx), %xmm3
movsd 0x8(%rdx), %xmm5
movsd 0x10(%rdx), %xmm0
movsd 0x90(%rsi), %xmm1
mulsd %xmm5, %xmm1
movsd 0x88(%rsi), %xmm2
mulsd %xmm3, %xmm2
addsd %xmm1, %xmm2
movsd 0x98(%rsi), %xmm1
mulsd %xmm0, %xmm1
addsd %xmm2, %xmm1
addsd 0xa0(%rsi), %xmm1
movsd 0xb0(%rsi), %xmm2
mulsd %xmm5, %xmm2
movsd 0xa8(%rsi), %xmm4
mulsd %xmm3, %xmm4
addsd %xmm2, %xmm4
movsd 0xb8(%rsi), %xmm2
mulsd %xmm0, %xmm2
addsd %xmm4, %xmm2
addsd 0xc0(%rsi), %xmm2
movq %rdi, %rbx
movsd 0xd0(%rsi), %xmm4
mulsd %xmm5, %xmm4
movsd 0xc8(%rsi), %xmm6
mulsd %xmm3, %xmm6
addsd %xmm4, %xmm6
movsd 0xd8(%rsi), %xmm4
mulsd %xmm0, %xmm4
mulsd 0xf0(%rsi), %xmm5
mulsd 0xe8(%rsi), %xmm3
addsd %xmm6, %xmm4
addsd %xmm5, %xmm3
mulsd 0xf8(%rsi), %xmm0
addsd %xmm3, %xmm0
addsd 0x100(%rsi), %xmm0
xorpd %xmm3, %xmm3
ucomisd %xmm3, %xmm0
movapd %xmm1, %xmm7
divsd %xmm0, %xmm7
jne 0x27520
jp 0x27520
movapd %xmm1, %xmm7
addsd 0xe0(%r14), %xmm4
movapd %xmm2, %xmm8
divsd %xmm0, %xmm8
jne 0x2753c
jp 0x2753c
movapd %xmm2, %xmm8
movapd %xmm4, %xmm9
divsd %xmm0, %xmm9
jne 0x2754f
jp 0x2754f
movapd %xmm4, %xmm9
cmpb $0x1, 0x188(%r14)
jne 0x276da
movq %rbx, 0x18(%rsp)
leaq 0x190(%r14), %r12
leaq 0x1c0(%r14), %r13
movl $0x1, %ebp
movl $0x2, %r15d
movabsq $-0x5555555555555555, %rbx # imm = 0xAAAAAAAAAAAAAAAB
xorl %edi, %edi
xorpd %xmm10, %xmm10
movsd %xmm7, 0x10(%rsp)
movsd %xmm8, 0x8(%rsp)
movsd %xmm9, (%rsp)
movq %r15, %rax
mulq %rbx
shlq $0x2, %rdx
andq $-0x8, %rdx
leaq (%rdx,%rdx,8), %rax
movq %r13, %rcx
subq %rax, %rcx
cmpq $0x3, %rbp
movq %rbp, %rax
cmoveq %rdi, %rax
leaq (%rax,%rax,2), %rax
movsd (%r12,%rax,8), %xmm2
movsd 0x8(%r12,%rax,8), %xmm3
subsd %xmm7, %xmm2
subsd %xmm8, %xmm3
movsd 0x10(%r12,%rax,8), %xmm1
subsd %xmm9, %xmm1
movsd (%rcx), %xmm4
movsd 0x8(%rcx), %xmm0
subsd %xmm7, %xmm4
subsd %xmm8, %xmm0
movsd 0x10(%rcx), %xmm5
subsd %xmm9, %xmm5
movapd %xmm0, %xmm6
mulsd %xmm1, %xmm6
mulsd %xmm4, %xmm1
mulsd %xmm3, %xmm4
mulsd %xmm5, %xmm3
subsd %xmm6, %xmm3
mulsd %xmm2, %xmm5
subsd %xmm5, %xmm1
mulsd %xmm2, %xmm0
subsd %xmm4, %xmm0
mulsd %xmm1, %xmm1
mulsd %xmm3, %xmm3
addsd %xmm1, %xmm3
mulsd %xmm0, %xmm0
addsd %xmm3, %xmm0
ucomisd %xmm10, %xmm0
jb 0x2764d
sqrtsd %xmm0, %xmm0
jmp 0x2766c
callq 0x4280
xorpd %xmm10, %xmm10
xorl %edi, %edi
movsd (%rsp), %xmm9
movsd 0x8(%rsp), %xmm8
movsd 0x10(%rsp), %xmm7
movsd %xmm0, 0x18(%rsp,%rbp,8)
incq %rbp
addq $0x18, %r13
incq %r15
cmpq $0x4, %rbp
jne 0x2759f
leaq 0x150(%r14), %rax
xorpd %xmm0, %xmm0
xorl %ecx, %ecx
xorpd %xmm1, %xmm1
xorpd %xmm2, %xmm2
movq 0x18(%rsp), %rbx
movsd 0x20(%rsp,%rcx,8), %xmm3
movsd -0x10(%rax), %xmm4
mulsd %xmm3, %xmm4
addsd %xmm4, %xmm2
movsd -0x8(%rax), %xmm4
mulsd %xmm3, %xmm4
addsd %xmm4, %xmm1
mulsd (%rax), %xmm3
addsd %xmm3, %xmm0
incq %rcx
addq $0x18, %rax
cmpq $0x3, %rcx
jne 0x276a0
jmp 0x2776f
movsd 0x1a8(%r14), %xmm3
movsd 0x190(%r14), %xmm0
movsd 0x198(%r14), %xmm2
subsd %xmm0, %xmm3
movsd 0x1b0(%r14), %xmm4
subsd %xmm2, %xmm4
movsd 0x1b8(%r14), %xmm1
movsd 0x1a0(%r14), %xmm5
subsd %xmm5, %xmm1
movsd 0x1c0(%r14), %xmm6
subsd %xmm0, %xmm6
movsd 0x1c8(%r14), %xmm0
subsd %xmm2, %xmm0
movsd 0x1d0(%r14), %xmm7
subsd %xmm5, %xmm7
movapd %xmm0, %xmm5
mulsd %xmm1, %xmm5
mulsd %xmm6, %xmm1
mulsd %xmm4, %xmm6
movapd %xmm4, %xmm2
mulsd %xmm7, %xmm2
subsd %xmm5, %xmm2
mulsd %xmm3, %xmm7
subsd %xmm7, %xmm1
mulsd %xmm3, %xmm0
subsd %xmm6, %xmm0
movsd 0xa8(%r14), %xmm3
mulsd %xmm1, %xmm3
movsd 0x88(%r14), %xmm4
mulsd %xmm2, %xmm4
addsd %xmm3, %xmm4
movsd 0xc8(%r14), %xmm5
mulsd %xmm0, %xmm5
addsd %xmm4, %xmm5
xorpd %xmm3, %xmm3
movsd 0xe8(%r14), %xmm6
mulsd %xmm3, %xmm6
addsd %xmm5, %xmm6
movsd 0xb0(%r14), %xmm4
mulsd %xmm1, %xmm4
movsd 0x90(%r14), %xmm5
mulsd %xmm2, %xmm5
addsd %xmm4, %xmm5
movsd 0xd0(%r14), %xmm4
mulsd %xmm0, %xmm4
addsd %xmm5, %xmm4
movsd 0xf0(%r14), %xmm5
mulsd %xmm3, %xmm5
mulsd 0xb8(%r14), %xmm1
addsd %xmm4, %xmm5
mulsd 0x98(%r14), %xmm2
addsd %xmm1, %xmm2
mulsd 0xd8(%r14), %xmm0
addsd %xmm2, %xmm0
movsd 0xf8(%r14), %xmm2
mulsd %xmm3, %xmm2
addsd %xmm0, %xmm2
movapd %xmm5, %xmm0
mulsd %xmm5, %xmm0
movapd %xmm6, %xmm1
mulsd %xmm6, %xmm1
addsd %xmm0, %xmm1
movapd %xmm2, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
ucomisd %xmm3, %xmm0
jb 0x27853
sqrtsd %xmm0, %xmm0
jmp 0x2787a
movsd %xmm6, 0x10(%rsp)
movsd %xmm5, 0x8(%rsp)
movsd %xmm2, (%rsp)
callq 0x4280
movsd (%rsp), %xmm2
movsd 0x8(%rsp), %xmm5
movsd 0x10(%rsp), %xmm6
movsd 0x48be(%rip), %xmm1     # 0x2c140
divsd %xmm0, %xmm1
mulsd %xmm1, %xmm6
mulsd %xmm1, %xmm5
mulsd %xmm2, %xmm1
movsd %xmm6, (%rbx)
movsd %xmm5, 0x8(%rbx)
movsd %xmm1, 0x10(%rbx)
movq %rbx, %rax
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq