// File: koraa[P]sbcrack/cube/geom.cpp
// Function: linecylinderintersect(vec const&, vec const&, vec const&, vec const&, float, float&)
bool linecylinderintersect(const vec &from, const vec &to, const vec &start, const vec &end, float radius, float &dist)
{
    vec d(end), m(from), n(to);
    d.sub(start);
    m.sub(start);
    n.sub(from);
    float md = m.dot(d),
          nd = n.dot(d),
          dd = d.squaredlen();
    if(md < 0 && md + nd < 0) return false;
    if(md > dd && md + nd > dd) return false;
    float nn = n.squaredlen(),
          mn = m.dot(n),
          a = dd*nn - nd*nd,
          k = m.squaredlen() - radius*radius,
          c = dd*k - md*md;
    if(fabs(a) < 0.005f)
    {
        if(c > 0) return false;
        if(md < 0) dist = -mn / nn;
        else if(md > dd) dist = (nd - mn) / nn;
        else dist = 0;
        return true;
    }
    else if(c > 0)
    {
        float b = dd*mn - nd*md,
              discrim = b*b - a*c;
        if(discrim < 0) return false;
        dist = (-b - sqrtf(discrim)) / a;
    }
    else dist = 0;
    float offset = md + dist*nd;
    if(offset < 0)
    {
        if(nd <= 0) return false;
        dist = -md / nd;
        if(k + dist*(2*mn + dist*nn) > 0) return false;
    }
    else if(offset > dd)
    {
        if(nd >= 0) return false;
        dist = (dd - md) / nd;
        if(k + dd - 2*md + dist*(2*(mn-nd) + dist*nn) > 0) return false;
    }
    return dist >= 0 && dist <= 1;
}

// Assembly:
subq $0x98, %rsp
movq %rdi, 0x88(%rsp)
movq %rsi, 0x80(%rsp)
movq %rdx, 0x78(%rsp)
movq %rcx, 0x70(%rsp)
movss %xmm0, 0x6c(%rsp)
movq %r8, 0x60(%rsp)
movq 0x70(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x54(%rsp)
movl 0x8(%rax), %eax
movl %eax, 0x5c(%rsp)
movq 0x88(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x48(%rsp)
movl 0x8(%rax), %eax
movl %eax, 0x50(%rsp)
movq 0x80(%rsp), %rax
movq (%rax), %rcx
movq %rcx, 0x3c(%rsp)
movl 0x8(%rax), %eax
movl %eax, 0x44(%rsp)
movq 0x78(%rsp), %rsi
leaq 0x54(%rsp), %rdi
callq 0xd890
movq 0x78(%rsp), %rsi
leaq 0x48(%rsp), %rdi
callq 0xd890
movq 0x88(%rsp), %rsi
leaq 0x3c(%rsp), %rdi
callq 0xd890
leaq 0x48(%rsp), %rdi
leaq 0x54(%rsp), %rsi
callq 0xd8f0
movss %xmm0, 0x38(%rsp)
leaq 0x3c(%rsp), %rdi
leaq 0x54(%rsp), %rsi
callq 0xd8f0
movss %xmm0, 0x34(%rsp)
leaq 0x54(%rsp), %rdi
callq 0xd940
movss %xmm0, 0x30(%rsp)
xorps %xmm0, %xmm0
ucomiss 0x38(%rsp), %xmm0
jbe 0xd463
movss 0x38(%rsp), %xmm1
addss 0x34(%rsp), %xmm1
xorps %xmm0, %xmm0
ucomiss %xmm1, %xmm0
jbe 0xd463
movb $0x0, 0x97(%rsp)
jmp 0xd81d
movss 0x38(%rsp), %xmm0
ucomiss 0x30(%rsp), %xmm0
jbe 0xd490
movss 0x38(%rsp), %xmm0
addss 0x34(%rsp), %xmm0
ucomiss 0x30(%rsp), %xmm0
jbe 0xd490
movb $0x0, 0x97(%rsp)
jmp 0xd81d
leaq 0x3c(%rsp), %rdi
callq 0xd940
movss %xmm0, 0x2c(%rsp)
leaq 0x48(%rsp), %rdi
leaq 0x3c(%rsp), %rsi
callq 0xd8f0
movss %xmm0, 0x28(%rsp)
movss 0x30(%rsp), %xmm0
mulss 0x2c(%rsp), %xmm0
movss 0x34(%rsp), %xmm1
mulss 0x34(%rsp), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 0x24(%rsp)
leaq 0x48(%rsp), %rdi
callq 0xd940
movss 0x6c(%rsp), %xmm1
mulss 0x6c(%rsp), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 0x20(%rsp)
movss 0x30(%rsp), %xmm0
mulss 0x20(%rsp), %xmm0
movss 0x38(%rsp), %xmm1
mulss 0x38(%rsp), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 0x1c(%rsp)
movss 0x24(%rsp), %xmm0
callq 0xd870
movaps %xmm0, %xmm1
movss 0xc71(%rip), %xmm0      # 0xe1a0
ucomiss %xmm1, %xmm0
jbe 0xd5c6
movss 0x1c(%rsp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0xd553
movb $0x0, 0x97(%rsp)
jmp 0xd81d
xorps %xmm0, %xmm0
ucomiss 0x38(%rsp), %xmm0
jbe 0xd581
movss 0x28(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
divss 0x2c(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss %xmm0, (%rax)
jmp 0xd5b9
movss 0x38(%rsp), %xmm0
ucomiss 0x30(%rsp), %xmm0
jbe 0xd5ab
movss 0x34(%rsp), %xmm0
subss 0x28(%rsp), %xmm0
divss 0x2c(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss %xmm0, (%rax)
jmp 0xd5b7
movq 0x60(%rsp), %rax
xorps %xmm0, %xmm0
movss %xmm0, (%rax)
jmp 0xd5b9
movb $0x1, 0x97(%rsp)
jmp 0xd81d
movss 0x1c(%rsp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0xd665
movss 0x30(%rsp), %xmm0
mulss 0x28(%rsp), %xmm0
movss 0x34(%rsp), %xmm1
mulss 0x38(%rsp), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 0x18(%rsp)
movss 0x18(%rsp), %xmm0
mulss 0x18(%rsp), %xmm0
movss 0x24(%rsp), %xmm1
mulss 0x1c(%rsp), %xmm1
subss %xmm1, %xmm0
movss %xmm0, 0x14(%rsp)
xorps %xmm0, %xmm0
ucomiss 0x14(%rsp), %xmm0
jbe 0xd633
movb $0x0, 0x97(%rsp)
jmp 0xd81d
movss 0x18(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss 0x14(%rsp), %xmm1
sqrtss %xmm1, %xmm1
subss %xmm1, %xmm0
divss 0x24(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss %xmm0, (%rax)
jmp 0xd671
movq 0x60(%rsp), %rax
xorps %xmm0, %xmm0
movss %xmm0, (%rax)
jmp 0xd673
movss 0x38(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss (%rax), %xmm1
mulss 0x34(%rsp), %xmm1
addss %xmm1, %xmm0
movss %xmm0, 0x10(%rsp)
xorps %xmm0, %xmm0
ucomiss 0x10(%rsp), %xmm0
jbe 0xd72b
xorps %xmm0, %xmm0
ucomiss 0x34(%rsp), %xmm0
jb 0xd6b7
movb $0x0, 0x97(%rsp)
jmp 0xd81d
movss 0x38(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
divss 0x34(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss %xmm0, (%rax)
movss 0x20(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss (%rax), %xmm1
movss 0xab4(%rip), %xmm2      # 0xe1a4
mulss 0x28(%rsp), %xmm2
movq 0x60(%rsp), %rax
movss (%rax), %xmm3
mulss 0x2c(%rsp), %xmm3
addss %xmm3, %xmm2
mulss %xmm2, %xmm1
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0xd726
movb $0x0, 0x97(%rsp)
jmp 0xd81d
jmp 0xd7e2
movss 0x10(%rsp), %xmm0
ucomiss 0x30(%rsp), %xmm0
jbe 0xd7e0
movss 0x34(%rsp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jb 0xd757
movb $0x0, 0x97(%rsp)
jmp 0xd81d
movss 0x30(%rsp), %xmm0
subss 0x38(%rsp), %xmm0
divss 0x34(%rsp), %xmm0
movq 0x60(%rsp), %rax
movss %xmm0, (%rax)
movss 0x20(%rsp), %xmm0
addss 0x30(%rsp), %xmm0
movss 0xa1e(%rip), %xmm1      # 0xe1a4
mulss 0x38(%rsp), %xmm1
subss %xmm1, %xmm0
movq 0x60(%rsp), %rax
movss (%rax), %xmm1
movss 0x28(%rsp), %xmm3
subss 0x34(%rsp), %xmm3
movss 0x9f7(%rip), %xmm2      # 0xe1a4
mulss %xmm3, %xmm2
movq 0x60(%rsp), %rax
movss (%rax), %xmm3
mulss 0x2c(%rsp), %xmm3
addss %xmm3, %xmm2
mulss %xmm2, %xmm1
addss %xmm1, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0xd7de
movb $0x0, 0x97(%rsp)
jmp 0xd81d
jmp 0xd7e0
jmp 0xd7e2
movq 0x60(%rsp), %rax
movss (%rax), %xmm0
xorl %eax, %eax
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
movb %al, 0xf(%rsp)
jb 0xd810
movq 0x60(%rsp), %rax
movss 0x996(%rip), %xmm0      # 0xe19c
ucomiss (%rax), %xmm0
setae %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %al
andb $0x1, %al
movb %al, 0x97(%rsp)
movb 0x97(%rsp), %al
andb $0x1, %al
addq $0x98, %rsp
retq
nop