// File: /workspace/github_c_makefile_star2_O0/archer1357[P]Offline-Raytracer/math.c
// Function: intersectRayTriangle
bool intersectRayTriangle(const float *P,const float *V,
                          const float *Q0,const float *Q1,
                          const float *Q2,
                          const float *plane,
                          float *t,float *colPt,
                          float *bcOut) {
  //ax+by+cz+d=0
  float d, NPd, NV;
  const float *N;
  float u0,u1,u2,v0,v1,v2;

  //
  d=plane[3];
  N=plane;

  //
  NPd=vec3_dot(N,P)+d;

  //origin below plane
  if(NPd <= 0.0f) {
    return false;
  }

  //
  NV=vec3_dot(N,V);

  //vector parallel or pointing away from plane
  if(NV >= 0.0f) {
    return false;
  }


  //
  (*t)=-NPd/NV;

  //
  vec3_mulScalar(colPt,V,(*t));
  vec3_add(colPt,colPt,P);

  //rest from '3D Math Primer For Graphics And Game Development'

  //
  if(fabs((double)N[0]) > fabs((double)N[1])) {
    if(fabs((double)N[0]) > fabs((double)N[2])) {
      u0 = colPt[1]-Q0[1];
      u1 = Q1[1]-Q0[1];
      u2 = Q2[1]-Q0[1];
      v0 = colPt[2]-Q0[2];
      v1 = Q1[2]-Q0[2];
      v2 = Q2[2]-Q0[2];
    } else {
      u0 = colPt[0]-Q0[0];
      u1 = Q1[0]-Q0[0];
      u2 = Q2[0]-Q0[0];
      v0 = colPt[1]-Q0[1];
      v1 = Q1[1]-Q0[1];
      v2 = Q2[1]-Q0[1];
    }
  } else {
    if(fabs((double)N[1]) > fabs((double)N[2])) {
      u0 = colPt[0]-Q0[0];
      u1 = Q1[0]-Q0[0];
      u2 = Q2[0]-Q0[0];
      v0 = colPt[2]-Q0[2];
      v1 = Q1[2]-Q0[2];
      v2 = Q2[2]-Q0[2];
    } else {
      u0 = colPt[0]-Q0[0];
      u1 = Q1[0]-Q0[0];
      u2 = Q2[0]-Q0[0];
      v0 = colPt[1]-Q0[1];
      v1 = Q1[1]-Q0[1];
      v2 = Q2[1]-Q0[1];
    }
  }

  //

  // Compute denominator, check for invalid
  float temp = u1*v2-v1*u2;

  if(!(temp != 0.0f)) {
    return false;
  }

  temp = 1.0f / temp;

  // Compute barycentric coords, checking for out-of-range
  // at each step
  float alpha = (u0 * v2-v0 * u2) * temp;

  if (!(alpha >= 0.0f)) {
    return false;
  }

  float beta = (u1 * v0-v1 * u0) * temp;

  if (!(beta >= 0.0f)) {
    return false;
  }

  float gamma = 1.0f-alpha-beta;

  if (!(gamma >= 0.0f)) {
    return false;
  }

  bcOut[0]=alpha;
  bcOut[1]=beta;
  bcOut[2]=gamma;
  //
  return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movq -0x38(%rbp), %rax
movss 0xc(%rax), %xmm0
movss %xmm0, -0x3c(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x40c970
addss -0x3c(%rbp), %xmm0
movss %xmm0, -0x40(%rbp)
xorps %xmm0, %xmm0
ucomiss -0x40(%rbp), %xmm0
jb 0x40e28e
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movq -0x50(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x40c970
movss %xmm0, -0x44(%rbp)
movss -0x44(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0x40e2b6
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movss -0x40(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
divss -0x44(%rbp), %xmm0
movq 0x10(%rbp), %rax
movss %xmm0, (%rax)
movq 0x18(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq 0x10(%rbp), %rax
movss (%rax), %xmm0
callq 0x40cb40
movq 0x18(%rbp), %rdi
movq 0x18(%rbp), %rsi
movq -0x10(%rbp), %rdx
callq 0x40ca80
movq -0x50(%rbp), %rax
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movaps 0xd6902(%rip), %xmm1    # 0x4e4c10
pand %xmm1, %xmm0
movq -0x50(%rbp), %rax
movss 0x4(%rax), %xmm1
cvtss2sd %xmm1, %xmm1
movaps 0xd68ea(%rip), %xmm2    # 0x4e4c10
pand %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x40e485
movq -0x50(%rbp), %rax
movss (%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movaps 0xd68c9(%rip), %xmm1    # 0x4e4c10
pand %xmm1, %xmm0
movq -0x50(%rbp), %rax
movss 0x8(%rax), %xmm1
cvtss2sd %xmm1, %xmm1
movaps 0xd68b1(%rip), %xmm2    # 0x4e4c10
pand %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x40e3fc
movq 0x18(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x54(%rbp)
movq -0x28(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x58(%rbp)
movq -0x30(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
movq 0x18(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x64(%rbp)
movq -0x30(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x68(%rbp)
jmp 0x40e480
movq 0x18(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x54(%rbp)
movq -0x28(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x58(%rbp)
movq -0x30(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
movq 0x18(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x64(%rbp)
movq -0x30(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x68(%rbp)
jmp 0x40e5ce
movq -0x50(%rbp), %rax
movss 0x4(%rax), %xmm0
cvtss2sd %xmm0, %xmm0
movaps 0xd6777(%rip), %xmm1    # 0x4e4c10
pand %xmm1, %xmm0
movq -0x50(%rbp), %rax
movss 0x8(%rax), %xmm1
cvtss2sd %xmm1, %xmm1
movaps 0xd675f(%rip), %xmm2    # 0x4e4c10
pand %xmm2, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x40e548
movq 0x18(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x54(%rbp)
movq -0x28(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x58(%rbp)
movq -0x30(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
movq 0x18(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x64(%rbp)
movq -0x30(%rbp), %rax
movss 0x8(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x68(%rbp)
jmp 0x40e5cc
movq 0x18(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x54(%rbp)
movq -0x28(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x58(%rbp)
movq -0x30(%rbp), %rax
movss (%rax), %xmm0
movq -0x20(%rbp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
movq 0x18(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x60(%rbp)
movq -0x28(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x64(%rbp)
movq -0x30(%rbp), %rax
movss 0x4(%rax), %xmm0
movq -0x20(%rbp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x68(%rbp)
jmp 0x40e5ce
movss -0x58(%rbp), %xmm0
movss -0x68(%rbp), %xmm2
movss -0x64(%rbp), %xmm1
mulss -0x5c(%rbp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x6c(%rbp)
movss -0x6c(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x40e614
jp 0x40e614
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movss 0xd4e68(%rip), %xmm0    # 0x4e3484
divss -0x6c(%rbp), %xmm0
movss %xmm0, -0x6c(%rbp)
movss -0x54(%rbp), %xmm0
movss -0x68(%rbp), %xmm2
movss -0x60(%rbp), %xmm1
mulss -0x5c(%rbp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
mulss -0x6c(%rbp), %xmm0
movss %xmm0, -0x70(%rbp)
movss -0x70(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jae 0x40e66f
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movss -0x58(%rbp), %xmm0
movss -0x60(%rbp), %xmm2
movss -0x64(%rbp), %xmm1
mulss -0x54(%rbp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
mulss -0x6c(%rbp), %xmm0
movss %xmm0, -0x74(%rbp)
movss -0x74(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jae 0x40e6b5
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movss 0xd4dc7(%rip), %xmm0    # 0x4e3484
subss -0x70(%rbp), %xmm0
subss -0x74(%rbp), %xmm0
movss %xmm0, -0x78(%rbp)
movss -0x78(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jae 0x40e6df
movb $0x0, -0x1(%rbp)
jmp 0x40e70c
movss -0x70(%rbp), %xmm0
movq 0x20(%rbp), %rax
movss %xmm0, (%rax)
movss -0x74(%rbp), %xmm0
movq 0x20(%rbp), %rax
movss %xmm0, 0x4(%rax)
movss -0x78(%rbp), %xmm0
movq 0x20(%rbp), %rax
movss %xmm0, 0x8(%rax)
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x80, %rsp
popq %rbp
retq
nopw (%rax,%rax)