// File: Luthaf[P]zeopp/ray.cc
// Function: Plane::hitPlane(ray, hitdata&)
void Plane::hitPlane(ray r,hitdata& hitplane)
{
  if (normal*r.vector >= 0){ //ray is either parallel or infront of the plane
    return;
  }	
  
  double dist=((normal*point)-(normal*r.base))/(normal*r.vector);
  if (dist < 0){ //There is no reason that the distance should be negative
    cerr << "Error: Distance = " << dist << " This means ray got outside of unitcell" << endl;
    cerr << "Point: " << r.base << " Vector: " << r.vector << endl;
    abort();
  }
  
  hitplane.hit=true;
  hitplane.dist=dist;
  hitplane.hitpoint=r.base + r.vector.scale(dist); 
  
  return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
leaq 0x10(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0xb0(%rbp)
addq $0x18, %rdi
movq 0x18(%rax), %rcx
movq %rcx, -0x28(%rbp)
movq 0x20(%rax), %rcx
movq %rcx, -0x20(%rbp)
movq 0x28(%rax), %rax
movq %rax, -0x18(%rbp)
leaq -0x28(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xea4e0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x8c315
jmp 0x8c550
movq -0xb0(%rbp), %rax
movq %rax, %rdi
addq $0x18, %rdi
movq (%rax), %rcx
movq %rcx, -0x48(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x40(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x38(%rbp)
leaq -0x48(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xea4e0
movq -0xb0(%rbp), %rdi
movq -0xb8(%rbp), %rax
movsd %xmm0, -0xc8(%rbp)
addq $0x18, %rdi
movq (%rax), %rcx
movq %rcx, -0x60(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x58(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
leaq -0x60(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xea4e0
movq -0xb0(%rbp), %rdi
movq -0xb8(%rbp), %rax
movaps %xmm0, %xmm1
movsd -0xc8(%rbp), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, -0xc0(%rbp)
addq $0x18, %rdi
movq 0x18(%rax), %rcx
movq %rcx, -0x78(%rbp)
movq 0x20(%rax), %rcx
movq %rcx, -0x70(%rbp)
movq 0x28(%rax), %rax
movq %rax, -0x68(%rbp)
leaq -0x78(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xea4e0
movaps %xmm0, %xmm1
movsd -0xc0(%rbp), %xmm0
divsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
xorps %xmm0, %xmm0
ucomisd -0x30(%rbp), %xmm0
jbe 0x8c4ca
movq 0x1e6bb5(%rip), %rdi    # 0x272ff0
leaq 0x16af8e(%rip), %rsi    # 0x1f73d0
callq 0x5540
movq %rax, %rdi
movsd -0x30(%rbp), %xmm0
callq 0x5980
movq %rax, %rdi
leaq 0x16af85(%rip), %rsi    # 0x1f73e3
callq 0x5540
movq %rax, %rdi
movq 0x1e6b2b(%rip), %rsi    # 0x272f98
callq 0x55b0
movq 0x1e6b77(%rip), %rdi    # 0x272ff0
leaq 0x16a6d7(%rip), %rsi    # 0x1f6b57
callq 0x5540
movq -0xb8(%rbp), %rsi
movq %rax, %rdi
callq 0xea610
movq %rax, %rdi
leaq 0x16af6d(%rip), %rsi    # 0x1f740b
callq 0x5540
movq -0xb8(%rbp), %rsi
movq %rax, %rdi
addq $0x18, %rsi
callq 0xea610
movq %rax, %rdi
movq 0x1e6ad8(%rip), %rsi    # 0x272f98
callq 0x55b0
callq 0x52b0
movq -0xb8(%rbp), %rsi
movq -0x10(%rbp), %rax
movb $0x1, (%rax)
movsd -0x30(%rbp), %xmm0
movq -0x10(%rbp), %rax
movsd %xmm0, 0x20(%rax)
addq $0x18, %rsi
movsd -0x30(%rbp), %xmm0
leaq -0xa8(%rbp), %rdi
callq 0xea000
movq -0xb8(%rbp), %rsi
leaq -0x90(%rbp), %rdi
leaq -0xa8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xea420
movq -0x10(%rbp), %rax
movq -0x90(%rbp), %rcx
movq %rcx, 0x8(%rax)
movq -0x88(%rbp), %rcx
movq %rcx, 0x10(%rax)
movq -0x80(%rbp), %rcx
movq %rcx, 0x18(%rax)
addq $0xe0, %rsp
popq %rbp
retq
nopl (%rax)