+inline Ray operator *(const glm::dmat4 &m, const Ray &r) noexcept {
+ glm::dvec4 o(m * glm::dvec4(r.Origin(), 1.0));
+ glm::dvec4 d(m * glm::dvec4(r.Origin() + r.Direction(), 1.0));
+ return Ray(glm::dvec3(o) / o.w, glm::normalize((glm::dvec3(d) / d.w) - (glm::dvec3(o) / o.w)));
+}
+
+inline std::ostream &operator <<(std::ostream &out, const Ray &r) {
+ return out << "Ray(" << r.Origin() << ", " << r.Direction() << ")";
+}
+