#ifndef SPROUT_DARKROOM_RAYS_RAY_HPP #define SPROUT_DARKROOM_RAYS_RAY_HPP #include #include #include #include #include namespace sprout { namespace darkroom { namespace rays { // // position // direction // template SPROUT_CONSTEXPR auto position( T&& t ) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::darkroom::access::get<0>(sprout::forward(t)))) -> decltype(sprout::darkroom::access::get<0>(sprout::forward(t))) { return sprout::darkroom::access::get<0>(sprout::forward(t)); } template SPROUT_CONSTEXPR auto direction( T&& t ) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::darkroom::access::get<1>(sprout::forward(t)))) -> decltype(sprout::darkroom::access::get<1>(sprout::forward(t))) { return sprout::darkroom::access::get<1>(sprout::forward(t)); } // // make_ray // template SPROUT_CONSTEXPR sprout::tuples::tuple make_ray(Position const& pos, Direction const& dir) { return sprout::tuples::make_tuple(pos, dir); } // // ray // typedef sprout::tuples::tuple ray; // // point_of_intersection // template SPROUT_CONSTEXPR inline typename sprout::darkroom::access::unit::type point_of_intersection(Ray const& ray, Distance const& dist) { return sprout::darkroom::coords::add( sprout::darkroom::rays::position(ray), sprout::darkroom::coords::scale(sprout::darkroom::rays::direction(ray), dist) ); } } // namespace ray } // namespace darkroom } // namespace sprout #endif // #ifndef SPROUT_DARKROOM_RAYS_RAY_HPP