diff --git a/sprout/darkroom/coords/vector.hpp b/sprout/darkroom/coords/vector.hpp index 0b5c24fb..a6952b19 100644 --- a/sprout/darkroom/coords/vector.hpp +++ b/sprout/darkroom/coords/vector.hpp @@ -171,18 +171,6 @@ namespace sprout { sprout::darkroom::coords::scale(nor, sprout::darkroom::coords::dot(incid, nor) * 2) ); } - - // - // normal_to_color - // - template - inline SPROUT_CONSTEXPR Color normal_to_color(Normal const& nor) { - return sprout::tuples::make( - 0.5 + sprout::darkroom::coords::x(nor) * 0.5, - 0.5 + sprout::darkroom::coords::y(nor) * 0.5, - 0.5 + sprout::darkroom::coords::z(nor) * 0.5 - ); - } } // namespace coords } // namespace darkroom } // namespace sprout diff --git a/sprout/darkroom/materials/interpolation.hpp b/sprout/darkroom/materials/interpolation.hpp index 386b8eaa..81715bcf 100644 --- a/sprout/darkroom/materials/interpolation.hpp +++ b/sprout/darkroom/materials/interpolation.hpp @@ -32,17 +32,17 @@ namespace sprout { return sprout::darkroom::colors::add( sprout::darkroom::colors::mul( sprout::darkroom::colors::add( - sprout::darkroom::colors::mul(c00, u), - sprout::darkroom::colors::mul(c01, 1 - u) + sprout::darkroom::colors::mul(c00, 1 - u), + sprout::darkroom::colors::mul(c01, u) ), - v + 1 - v ), sprout::darkroom::colors::mul( sprout::darkroom::colors::add( - sprout::darkroom::colors::mul(c10, u), - sprout::darkroom::colors::mul(c11, 1 - u) + sprout::darkroom::colors::mul(c10, 1 - u), + sprout::darkroom::colors::mul(c11, u) ), - 1 - v + v ) ); } diff --git a/sprout/darkroom/materials/texture_map.hpp b/sprout/darkroom/materials/texture_map.hpp index d1ffcb72..342e27c4 100644 --- a/sprout/darkroom/materials/texture_map.hpp +++ b/sprout/darkroom/materials/texture_map.hpp @@ -90,7 +90,7 @@ namespace sprout { return sprout::darkroom::materials::bilinear_interpolate( get_color(x0, y0), get_color(x0 + 1, y0), get_color(x0, y0 + 1), get_color(x0 + 1, y0 + 1), - 1 - (x - x0), 1 - (y - y0) + x - x0, y - y0 ); } template diff --git a/sprout/darkroom/renderers.hpp b/sprout/darkroom/renderers.hpp index 9871c828..00e5825e 100644 --- a/sprout/darkroom/renderers.hpp +++ b/sprout/darkroom/renderers.hpp @@ -2,6 +2,7 @@ #define SPROUT_DARKROOM_RENDERERS_HPP #include +#include #include #endif // #ifndef SPROUT_DARKROOM_RENDERERS_HPP diff --git a/sprout/darkroom/renderers/infinity.hpp b/sprout/darkroom/renderers/infinity.hpp new file mode 100644 index 00000000..fc6ce33e --- /dev/null +++ b/sprout/darkroom/renderers/infinity.hpp @@ -0,0 +1,80 @@ +#ifndef SPROUT_DARKROOM_RENDERERS_INFINITY_HPP +#define SPROUT_DARKROOM_RENDERERS_INFINITY_HPP + +#include +#include +#include +#include + +namespace sprout { + namespace darkroom { + namespace renderers { + // + // normal_to_color + // + template + inline SPROUT_CONSTEXPR Color normal_to_color(Normal const& nor) { + return sprout::tuples::make( + 0.5 + sprout::darkroom::coords::x(nor) * 0.5, + 0.5 + sprout::darkroom::coords::y(nor) * 0.5, + 0.5 + sprout::darkroom::coords::z(nor) * 0.5 + ); + } + + // + // direction_gradation + // + class direction_gradation { + public: + template + SPROUT_CONSTEXPR TargetColor operator()(Vector const& dir) const { + return sprout::darkroom::renderers::normal_to_color(dir); + } + }; + // + // make_direction_gradation + // + inline SPROUT_CONSTEXPR sprout::darkroom::renderers::direction_gradation + make_direction_gradation() { + return sprout::darkroom::renderers::direction_gradation(); + } + + // + // uniform_color + // + template + class uniform_color { + public: + typedef Color color_type; + private: + color_type color_; + public: + SPROUT_CONSTEXPR uniform_color() + : color_() + {} + SPROUT_CONSTEXPR uniform_color(uniform_color const&) = default; + explicit SPROUT_CONSTEXPR uniform_color(color_type const& color) + : color_(color) + {} + template + SPROUT_CONSTEXPR TargetColor operator()(Vector const&) const { + return color_; + } + }; + // + // make_uniform_color + // + inline SPROUT_CONSTEXPR sprout::darkroom::renderers::uniform_color<> + make_uniform_color() { + return sprout::darkroom::renderers::uniform_color<>(); + } + template + inline SPROUT_CONSTEXPR sprout::darkroom::renderers::uniform_color + make_uniform_color(Color const& color) { + return sprout::darkroom::renderers::uniform_color(color); + } + } // namespace renderers + } // namespace darkroom +} // namespace sprout + +#endif // #ifndef SPROUT_DARKROOM_RENDERERS_INFINITY_HPP diff --git a/sprout/darkroom/renderers/whitted_style.hpp b/sprout/darkroom/renderers/whitted_style.hpp index 0e4991db..407843b4 100644 --- a/sprout/darkroom/renderers/whitted_style.hpp +++ b/sprout/darkroom/renderers/whitted_style.hpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace sprout { namespace darkroom { @@ -113,7 +114,12 @@ namespace sprout { // // whitted_style // + template class whitted_style { + public: + typedef InfinityColor infinity_color_type; + private: + infinity_color_type infinity_color_; private: template< typename Color, @@ -141,7 +147,7 @@ namespace sprout { sprout::darkroom::materials::reflection(sprout::darkroom::intersects::material(inter)) ) ) - : sprout::darkroom::coords::normal_to_color(sprout::darkroom::rays::direction(ray)) + : infinity_color_.template operator()(sprout::darkroom::rays::direction(ray)) ; } template< @@ -205,6 +211,13 @@ namespace sprout { ); } public: + SPROUT_CONSTEXPR whitted_style() + : infinity_color_() + {} + SPROUT_CONSTEXPR whitted_style(whitted_style const&) = default; + explicit SPROUT_CONSTEXPR whitted_style(infinity_color_type const& infinity_color) + : infinity_color_(infinity_color) + {} template< typename Color, typename Camera, @@ -230,6 +243,18 @@ namespace sprout { ); } }; + // + // make_whitted_style + // + inline SPROUT_CONSTEXPR sprout::darkroom::renderers::whitted_style<> + make_whitted_style() { + return sprout::darkroom::renderers::whitted_style<>(); + } + template + inline SPROUT_CONSTEXPR sprout::darkroom::renderers::whitted_style + make_whitted_style(InfinityColor const& infinity_color) { + return sprout::darkroom::renderers::whitted_style(infinity_color); + } } // namespace renderers } // namespace darkroom } // namespace sprout diff --git a/sprout/darkroom/tracers/raytracer.hpp b/sprout/darkroom/tracers/raytracer.hpp index 7b92036d..c41a6cfd 100644 --- a/sprout/darkroom/tracers/raytracer.hpp +++ b/sprout/darkroom/tracers/raytracer.hpp @@ -44,6 +44,18 @@ namespace sprout { ); } }; + // + // make_raytracer + // + inline SPROUT_CONSTEXPR sprout::darkroom::tracers::raytracer<> + make_raytracer() { + return sprout::darkroom::tracers::raytracer<>(); + } + template + inline SPROUT_CONSTEXPR sprout::darkroom::tracers::raytracer + make_raytracer() { + return sprout::darkroom::tracers::raytracer(); + } } // namespace tracers } // namespace darkroom } // namespace sprout diff --git a/sprout/functional/bind/bind.hpp b/sprout/functional/bind/bind.hpp index 44b9d888..e5e126fc 100644 --- a/sprout/functional/bind/bind.hpp +++ b/sprout/functional/bind/bind.hpp @@ -560,12 +560,12 @@ namespace sprout { template inline SPROUT_CONSTEXPR typename sprout::detail::bind_helper::type const cbind(F&& f, BoundArgs&&... args) { - sprout::bind(sprout::forward(f), sprout::forward(args)...); + return sprout::bind(sprout::forward(f), sprout::forward(args)...); } template inline SPROUT_CONSTEXPR typename sprout::detail::bindres_helper::type const cbind(F&& f, BoundArgs&&... args) { - sprout::bind(sprout::forward(f), sprout::forward(args)...); + return sprout::bind(sprout::forward(f), sprout::forward(args)...); } } // namespace sprout