/*============================================================================= Copyright (c) 2011-2013 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #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 inline 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 inline 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 inline 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 inline SPROUT_CONSTEXPR 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 rays } // namespace darkroom } // namespace sprout #endif // #ifndef SPROUT_DARKROOM_RAYS_RAY_HPP