bool Ray3DRect3DIntersection(const Rect3D & rect, const Ray3D & ray, float & t)
{
    return Ray3DRect3DIntersection(
        rect.origin(),
        rect.right(),
        rect.up(),
        ray.origin(),
        ray.direction(),
        t);
}
glm::vec2 Rect3DRay3DIntersectionPoint(
    const Rect3D & rect, const Ray3D & ray, bool & valid)
{
    return Rect3DRay3DIntersectionPoint(
        rect.origin(),
        rect.right(),
        rect.up(),
        ray.origin(),
        ray.direction(),
        valid);
}