// File: /workspace/github_cpp_makefile_star2_O2/logicx24[P]RayTracer/raytracer.cpp
// Function: Triangle::intersection(Ray&, float)
float intersection(Ray &ray, float eps) {
        vec3 normal = (edge2 ^ edge1).normalize();
        vec3 w0 = ray.pos - vertex1;
        float a = -(normal * w0);
        float b = normal * ray.vec;
        float r = a/b;

        if (fabs(b) < eps) {
            if (a == 0.0f) {
                return r;
            } else {
            	return MAXFLOAT;
            }
        }

        if (r < 0.0f) {
            return MAXFLOAT;
        }

        vec3 intersect = ray.pointAt(r);
        float uu, uv, vv, wu, wv, D;

        uu = edge1 * edge1;
        uv = edge1 * edge2;
        vv = edge2 * edge2;
        vec3 w = intersect - vertex1;
        wu = w * edge1;
        wv = w * edge2;
        D = uv * uv - uu * vv;

        float s, t;

        s = (uv * wv - vv * wu) / D;
        if (s < 0.0f || s > 1.0f) {
            return MAXFLOAT;
        }
        t = (uv * wu - uu * wv) / D;
        if (t < 0.0f || (s + t) > 1.0f) {
            return MAXFLOAT;
        }

        if (r < eps) {
            return MAXFLOAT;
        }
        return r;
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x48, %rsp
movss %xmm0, -0x2c(%rbp)
movq %rsi, %r12
movq %rdi, %rbx
leaq 0x250(%rdi), %r14
leaq 0x238(%rdi), %r15
leaq -0x68(%rbp), %r13
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x722a
movq %r13, %rdi
callq 0x7286
movsd (%rax), %xmm1
movsd 0x8(%rax), %xmm2
movsd (%r12), %xmm0
movsd 0x8(%r12), %xmm3
subsd 0x1f0(%rbx), %xmm0
subsd 0x1f8(%rbx), %xmm3
movsd 0x10(%rax), %xmm4
movsd 0x10(%r12), %xmm5
subsd 0x200(%rbx), %xmm5
mulsd %xmm2, %xmm3
mulsd %xmm1, %xmm0
addsd %xmm3, %xmm0
mulsd %xmm4, %xmm5
addsd %xmm0, %xmm5
cvtsd2ss %xmm5, %xmm0
movaps 0xc681(%rip), %xmm3     # 0x13040
mulsd 0x20(%r12), %xmm2
mulsd 0x18(%r12), %xmm1
xorps %xmm0, %xmm3
addsd %xmm2, %xmm1
mulsd 0x28(%r12), %xmm4
addsd %xmm1, %xmm4
cvtsd2ss %xmm4, %xmm1
divss %xmm1, %xmm3
andps 0xc662(%rip), %xmm1     # 0x13050
movss -0x2c(%rbp), %xmm2
ucomiss %xmm1, %xmm2
jbe 0x6a13
xorps %xmm1, %xmm1
cmpeqss %xmm1, %xmm0
andps %xmm0, %xmm3
movss 0xc67d(%rip), %xmm1     # 0x13088
andnps %xmm1, %xmm0
orps %xmm3, %xmm0
jmp 0x6a23
xorps %xmm0, %xmm0
ucomiss %xmm3, %xmm0
jbe 0x6a32
movss 0xc665(%rip), %xmm0     # 0x13088
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %r13, %rdi
movq %r12, %rsi
movaps %xmm3, -0x40(%rbp)
movaps %xmm3, %xmm0
callq 0x72ee
movq %r15, %rdi
movq %r15, %rsi
callq 0x72c4
cvtsd2ss %xmm0, %xmm0
movaps %xmm0, -0x50(%rbp)
movq %r15, %rdi
movq %r14, %rsi
callq 0x72c4
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x30(%rbp)
movq %r14, %rdi
movq %r14, %rsi
callq 0x72c4
movaps -0x50(%rbp), %xmm6
cvtsd2ss %xmm0, %xmm0
movsd (%r13), %xmm2
subsd 0x1f0(%rbx), %xmm2
movsd 0x8(%r13), %xmm3
subsd 0x1f8(%rbx), %xmm3
movsd 0x10(%r13), %xmm4
subsd 0x200(%rbx), %xmm4
movsd 0x240(%rbx), %xmm1
mulsd %xmm3, %xmm1
movsd 0x238(%rbx), %xmm5
mulsd %xmm2, %xmm5
addsd %xmm1, %xmm5
movsd 0x248(%rbx), %xmm1
mulsd %xmm4, %xmm1
addsd %xmm5, %xmm1
movss -0x30(%rbp), %xmm5
cvtsd2ss %xmm1, %xmm1
mulsd 0x258(%rbx), %xmm3
mulsd 0x250(%rbx), %xmm2
addsd %xmm3, %xmm2
mulsd 0x260(%rbx), %xmm4
addsd %xmm2, %xmm4
cvtsd2ss %xmm4, %xmm4
movaps %xmm6, %xmm2
mulss %xmm0, %xmm2
movaps %xmm5, %xmm3
mulss %xmm5, %xmm3
subss %xmm2, %xmm3
mulss %xmm1, %xmm0
movaps %xmm5, %xmm2
mulss %xmm4, %xmm2
subss %xmm0, %xmm2
divss %xmm3, %xmm2
xorps %xmm0, %xmm0
ucomiss %xmm2, %xmm0
movss 0xc554(%rip), %xmm0     # 0x13088
ja 0x6a23
ucomiss 0xc54b(%rip), %xmm2     # 0x1308c
ja 0x6a23
xorps 0xc4f2(%rip), %xmm6     # 0x13040
mulss %xmm4, %xmm6
mulss %xmm1, %xmm5
addss %xmm6, %xmm5
divss %xmm3, %xmm5
xorps %xmm1, %xmm1
ucomiss %xmm5, %xmm1
ja 0x6a23
addss %xmm5, %xmm2
ucomiss 0xc517(%rip), %xmm2     # 0x1308c
ja 0x6a23
movaps -0x40(%rbp), %xmm2
movaps %xmm2, %xmm0
cmpltss -0x2c(%rbp), %xmm0
movss 0xc4f8(%rip), %xmm1     # 0x13088
andps %xmm0, %xmm1
andnps %xmm2, %xmm0
orps %xmm1, %xmm0
jmp 0x6a23