public static bool IntersectRayTriangle(Ray ray, LVector3 t1, LVector3 t2, LVector3 t3, out LVector3 intersection)
        {
            intersection = LVector3.zero;
            LVector3 edge1 = t2.sub(t1);
            LVector3 edge2 = t3.sub(t1);

            LVector3 pvec = ray.direction.cross(edge2);
            LFloat   det  = edge1.dot(pvec);

            if (IsZero(det))
            {
                var p = new Plane(t1, t2, t3);
                if (p.testPoint(ray.origin) == PlaneSide.OnPlane && IsPointInTriangle(ray.origin, t1, t2, t3))
                {
                    intersection.set(ray.origin);
                    return(true);
                }

                return(false);
            }

            det = 1 / det;

            LVector3 tvec = ray.origin.sub(t1);
            LFloat   u    = tvec.dot(pvec) * det;

            if (u < 0 || u > 1)
            {
                return(false);
            }

            LVector3 qvec = tvec.cross(edge1);
            LFloat   v    = ray.direction.dot(qvec) * det;

            if (v < 0 || u + v > 1)
            {
                return(false);
            }

            LFloat t = edge2.dot(qvec) * det;

            if (t < 0)
            {
                return(false);
            }

            if (t <= FLOAT_ROUNDING_ERROR)
            {
                intersection.set(ray.origin);
            }
            else
            {
                ray.getEndPoint(intersection, t);
            }

            return(true);
        }