// File: /workspace/github_cpp_makefile_star2_O3/wrighteagle2d[P]wrighteaglebase/Debug/../src/Geometry.cpp
// Function: Rectangular::Intersection(Ray const&, Vector&) const
bool Rectangular::Intersection(const Ray &r, Vector &point) const {
  if (!IsWithin(r.Origin())) {
    return false; // do not deal with this condition
  }

  int n = 0;
  Array<Vector, 4> points; // there may be 4 intersections

  if (TopEdge().Intersection(r, points[n])) {
    if (IsWithin(points[n])) {
      n++;
    }
  }

  if (BottomEdge().Intersection(r, points[n])) {
    if (IsWithin(points[n])) {
      n++;
    }
  }

  if (LeftEdge().Intersection(r, points[n])) {
    if (IsWithin(points[n])) {
      n++;
    }
  }

  if (RightEdge().Intersection(r, points[n])) {
    if (IsWithin(points[n])) {
      n++;
    }
  }

  if (n == 0) {
    return false;
  } else if (n == 1) {
    point = points[0];
    return true;
  } else if (n >= 2) {
    int max_idx = 0;
    double max_dist2 = points[0].Dist2(r.Origin());

    for (int j = 1; j < n; ++j) {
      double dist2 = points[j].Dist2(r.Origin());
      if (dist2 > max_dist2) {
        max_idx = j;
        max_dist2 = dist2;
      }
    }

    point = points[max_idx];
    return true;
  }

  return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movsd (%rsi), %xmm2
movsd (%rdi), %xmm0
movsd 0x3f8eb(%rip), %xmm1    # 0x69078
addsd %xmm0, %xmm1
ucomisd %xmm1, %xmm2
jb 0x29c7d
movq %rdi, %r15
movsd 0x8(%rdi), %xmm1
movsd 0x3f895(%rip), %xmm3    # 0x69040
addsd %xmm1, %xmm3
ucomisd %xmm2, %xmm3
jb 0x29c7d
movq %rsi, %r14
movsd 0x8(%rsi), %xmm3
movsd 0x10(%r15), %xmm2
movsd 0x3f8a9(%rip), %xmm4    # 0x69078
addsd %xmm2, %xmm4
ucomisd %xmm4, %xmm3
jb 0x29c7d
movsd 0x18(%r15), %xmm4
addsd 0x3f855(%rip), %xmm4    # 0x69040
ucomisd %xmm3, %xmm4
jb 0x29c7d
movq %rdx, %rbx
xorpd %xmm3, %xmm3
movapd %xmm3, -0x40(%rbp)
movapd %xmm3, -0x50(%rbp)
movapd %xmm3, -0x60(%rbp)
movapd %xmm0, %xmm4
subsd %xmm1, %xmm4
andpd 0x3f7f5(%rip), %xmm4    # 0x69010
movapd %xmm3, -0x70(%rbp)
movsd 0x3f818(%rip), %xmm3    # 0x69040
ucomisd %xmm4, %xmm3
jbe 0x29844
xorpd 0x3f7ea(%rip), %xmm0    # 0x69020
xorpd %xmm1, %xmm1
movsd 0x3f816(%rip), %xmm3    # 0x69058
jmp 0x29868
movapd %xmm2, %xmm3
subsd %xmm2, %xmm3
subsd %xmm0, %xmm1
divsd %xmm1, %xmm3
mulsd %xmm3, %xmm0
subsd %xmm0, %xmm2
movsd 0x3f834(%rip), %xmm1    # 0x69098
movapd %xmm2, %xmm0
leaq -0x88(%rbp), %rdi
movsd %xmm3, (%rdi)
movsd %xmm1, 0x8(%rdi)
movsd %xmm0, 0x10(%rdi)
leaq -0x70(%rbp), %rdx
movq %r14, %rsi
callq 0x29634
movsd (%r15), %xmm0
testb %al, %al
je 0x298f8
movsd -0x70(%rbp), %xmm2
movsd 0x3f7d9(%rip), %xmm1    # 0x69078
addsd %xmm0, %xmm1
xorl %r12d, %r12d
ucomisd %xmm1, %xmm2
movsd 0x8(%r15), %xmm1
jb 0x29901
movsd 0x3f786(%rip), %xmm3    # 0x69040
addsd %xmm1, %xmm3
ucomisd %xmm2, %xmm3
jb 0x29901
movsd -0x68(%rbp), %xmm2
movsd 0x10(%r15), %xmm3
addsd 0x3f7a1(%rip), %xmm3    # 0x69078
ucomisd %xmm3, %xmm2
jb 0x29901
movsd 0x18(%r15), %xmm3
addsd 0x3f755(%rip), %xmm3    # 0x69040
xorl %r12d, %r12d
ucomisd %xmm2, %xmm3
setae %r12b
jmp 0x29901
movsd 0x8(%r15), %xmm1
xorl %r12d, %r12d
movapd %xmm0, %xmm2
subsd %xmm1, %xmm2
andpd 0x3f6ff(%rip), %xmm2    # 0x69010
movsd 0x3f727(%rip), %xmm3    # 0x69040
ucomisd %xmm2, %xmm3
jbe 0x29935
xorpd 0x3f6f9(%rip), %xmm0    # 0x69020
xorpd %xmm1, %xmm1
movsd 0x3f725(%rip), %xmm2    # 0x69058
jmp 0x2995f
movsd 0x18(%r15), %xmm3
movapd %xmm3, %xmm2
subsd %xmm3, %xmm2
subsd %xmm0, %xmm1
divsd %xmm1, %xmm2
mulsd %xmm2, %xmm0
subsd %xmm0, %xmm3
movsd 0x3f73d(%rip), %xmm1    # 0x69098
movapd %xmm3, %xmm0
leaq -0x88(%rbp), %rdi
movsd %xmm2, (%rdi)
movsd %xmm1, 0x8(%rdi)
movsd %xmm0, 0x10(%rdi)
movl %r12d, %eax
shll $0x4, %eax
leaq (%rax,%rbp), %r13
addq $-0x70, %r13
movq %r14, %rsi
movq %r13, %rdx
callq 0x29634
movsd (%r15), %xmm0
testb %al, %al
je 0x299f2
movsd (%r13), %xmm1
movsd 0x3f6d4(%rip), %xmm2    # 0x69078
addsd %xmm0, %xmm2
ucomisd %xmm2, %xmm1
jb 0x299f2
movsd 0x8(%r15), %xmm2
addsd 0x3f684(%rip), %xmm2    # 0x69040
ucomisd %xmm1, %xmm2
jb 0x299f2
movsd 0x8(%r13), %xmm1
movsd 0x10(%r15), %xmm2
addsd 0x3f6a2(%rip), %xmm2    # 0x69078
ucomisd %xmm2, %xmm1
jb 0x299f2
movsd 0x18(%r15), %xmm2
addsd 0x3f656(%rip), %xmm2    # 0x69040
ucomisd %xmm1, %xmm2
sbbl $-0x1, %r12d
movapd %xmm0, %xmm2
subsd %xmm0, %xmm2
movapd 0x3f60e(%rip), %xmm1    # 0x69010
andpd %xmm2, %xmm1
movsd 0x3f632(%rip), %xmm3    # 0x69040
ucomisd %xmm1, %xmm3
jbe 0x29a2a
xorpd 0x3f604(%rip), %xmm0    # 0x69020
xorpd %xmm2, %xmm2
movsd 0x3f630(%rip), %xmm1    # 0x69058
jmp 0x29a52
movsd 0x10(%r15), %xmm3
movsd 0x18(%r15), %xmm1
subsd %xmm3, %xmm1
divsd %xmm2, %xmm1
mulsd %xmm1, %xmm0
subsd %xmm0, %xmm3
movsd 0x3f64a(%rip), %xmm2    # 0x69098
movapd %xmm3, %xmm0
leaq -0x88(%rbp), %rdi
movsd %xmm1, (%rdi)
movsd %xmm2, 0x8(%rdi)
movsd %xmm0, 0x10(%rdi)
movl %r12d, %eax
shlq $0x4, %rax
leaq (%rax,%rbp), %r13
addq $-0x70, %r13
movq %r14, %rsi
movq %r13, %rdx
callq 0x29634
testb %al, %al
je 0x29ae8
movsd (%r13), %xmm1
movsd (%r15), %xmm2
movsd 0x8(%r15), %xmm0
addsd 0x3f5da(%rip), %xmm2    # 0x69078
ucomisd %xmm2, %xmm1
jb 0x29aee
movsd 0x3f594(%rip), %xmm2    # 0x69040
addsd %xmm0, %xmm2
ucomisd %xmm1, %xmm2
jb 0x29aee
movsd 0x8(%r13), %xmm1
movsd 0x10(%r15), %xmm2
addsd 0x3f5ae(%rip), %xmm2    # 0x69078
ucomisd %xmm2, %xmm1
jb 0x29aee
movsd 0x18(%r15), %xmm2
addsd 0x3f562(%rip), %xmm2    # 0x69040
ucomisd %xmm1, %xmm2
sbbl $-0x1, %r12d
jmp 0x29aee
movsd 0x8(%r15), %xmm0
movapd %xmm0, %xmm2
subsd %xmm0, %xmm2
movapd 0x3f512(%rip), %xmm1    # 0x69010
andpd %xmm2, %xmm1
movsd 0x3f536(%rip), %xmm3    # 0x69040
ucomisd %xmm1, %xmm3
jbe 0x29b26
xorpd 0x3f508(%rip), %xmm0    # 0x69020
xorpd %xmm2, %xmm2
movsd 0x3f534(%rip), %xmm1    # 0x69058
jmp 0x29b4e
movsd 0x10(%r15), %xmm3
movsd 0x18(%r15), %xmm1
subsd %xmm3, %xmm1
divsd %xmm2, %xmm1
mulsd %xmm1, %xmm0
subsd %xmm0, %xmm3
movsd 0x3f54e(%rip), %xmm2    # 0x69098
movapd %xmm3, %xmm0
leaq -0x88(%rbp), %rdi
movsd %xmm1, (%rdi)
movsd %xmm2, 0x8(%rdi)
movsd %xmm0, 0x10(%rdi)
movl %r12d, %eax
shlq $0x4, %rax
leaq (%rax,%rbp), %r13
addq $-0x70, %r13
movq %r14, %rsi
movq %r13, %rdx
callq 0x29634
testb %al, %al
je 0x29be1
movsd (%r13), %xmm0
movsd (%r15), %xmm1
addsd 0x3f4e4(%rip), %xmm1    # 0x69078
ucomisd %xmm1, %xmm0
jb 0x29be1
movsd 0x8(%r15), %xmm1
addsd 0x3f498(%rip), %xmm1    # 0x69040
ucomisd %xmm0, %xmm1
jb 0x29be1
movsd 0x8(%r13), %xmm0
movsd 0x10(%r15), %xmm1
addsd 0x3f4b6(%rip), %xmm1    # 0x69078
ucomisd %xmm1, %xmm0
jb 0x29be1
movsd 0x18(%r15), %xmm1
addsd 0x3f46a(%rip), %xmm1    # 0x69040
ucomisd %xmm0, %xmm1
jb 0x29be1
incl %r12d
jmp 0x29bea
testl %r12d, %r12d
je 0x29c7d
cmpl $0x1, %r12d
leaq -0x70(%rbp), %rax
je 0x29c71
movsd (%r14), %xmm0
movsd 0x8(%r14), %xmm1
leaq -0x58(%rbp), %rax
movsd -0x18(%rax), %xmm2
movsd -0x10(%rax), %xmm3
subsd %xmm0, %xmm2
subsd %xmm1, %xmm3
mulsd %xmm3, %xmm3
mulsd %xmm2, %xmm2
addsd %xmm3, %xmm2
movl %r12d, %ecx
xorl %edx, %edx
movl $0x1, %esi
movsd -0x8(%rax), %xmm3
movsd (%rax), %xmm4
subsd %xmm0, %xmm3
subsd %xmm1, %xmm4
mulsd %xmm4, %xmm4
mulsd %xmm3, %xmm3
addsd %xmm4, %xmm3
ucomisd %xmm2, %xmm3
cmoval %esi, %edx
maxsd %xmm2, %xmm3
incq %rsi
addq $0x10, %rax
movapd %xmm3, %xmm2
cmpq %rsi, %rcx
jne 0x29c2b
movslq %edx, %rax
shlq $0x4, %rax
addq %rbp, %rax
addq $-0x70, %rax
movupd (%rax), %xmm0
movupd %xmm0, (%rbx)
movb $0x1, %al
jmp 0x29c7f
xorl %eax, %eax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq