| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| // Created : 2013-11-22 |
| // Updated : 2013-11-22 |
| // Licence : This source is under MIT License |
| // File : glm/gtx/inl.inl |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| #include "../matrix.hpp" |
| // #include <boost/io/ios_state.hpp> // boost::io::ios_all_saver |
| #include <iomanip> // std::setfill<>, std::fixed, std::setprecision, std::right, |
| // std::setw |
| #include <ostream> // std::basic_ostream<> |
| |
| namespace glm{ |
| namespace io |
| { |
| |
| /* explicit */ GLM_FUNC_QUALIFIER |
| precision_guard::precision_guard() |
| : precision_ (precision()), |
| value_width_(value_width()) |
| {} |
| |
| GLM_FUNC_QUALIFIER |
| precision_guard::~precision_guard() |
| { |
| value_width() = value_width_; |
| precision() = precision_; |
| } |
| |
| /* explicit */ GLM_FUNC_QUALIFIER |
| format_guard::format_guard() |
| : order_(order()), |
| cr_ (cr()) |
| {} |
| |
| GLM_FUNC_QUALIFIER |
| format_guard::~format_guard() |
| { |
| cr() = cr_; |
| order() = order_; |
| } |
| |
| GLM_FUNC_QUALIFIER unsigned& precision() |
| { |
| static unsigned p(3); |
| |
| return p; |
| } |
| |
| GLM_FUNC_QUALIFIER unsigned& value_width() |
| { |
| static unsigned p(9); |
| |
| return p; |
| } |
| |
| GLM_FUNC_QUALIFIER format_guard::order_t& order() |
| { |
| static format_guard::order_t p(format_guard::row_major); |
| |
| return p; |
| } |
| |
| GLM_FUNC_QUALIFIER char& |
| cr() |
| { |
| static char p('\n'); return p; |
| } |
| |
| GLM_FUNC_QUALIFIER std::ios_base& column_major(std::ios_base& os) |
| { |
| order() = format_guard::column_major; |
| |
| return os; |
| } |
| |
| GLM_FUNC_QUALIFIER std::ios_base& row_major(std::ios_base& os) |
| { |
| order() = format_guard::row_major; |
| |
| return os; |
| } |
| |
| GLM_FUNC_QUALIFIER std::ios_base& formatted(std::ios_base& os) |
| { |
| cr() = '\n'; |
| |
| return os; |
| } |
| |
| GLM_FUNC_QUALIFIER std::ios_base& unformatted(std::ios_base& os) |
| { |
| cr() = ' '; |
| |
| return os; |
| } |
| |
| } // namespace io |
| namespace detail |
| { |
| // functions, inlined (inline) |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tquat<T,P> const& a) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| // boost::io::ios_all_saver const ias(os); |
| |
| os << std::fixed << std::setprecision(io::precision()) |
| << '[' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.w << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.y << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.z |
| << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec2<T,P> const& a) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| // boost::io::ios_all_saver const ias(os); |
| |
| os << std::fixed << std::setprecision(io::precision()) |
| << '[' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.y |
| << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec3<T,P> const& a) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| // boost::io::ios_all_saver const ias(os); |
| |
| os << std::fixed << std::setprecision(io::precision()) |
| << '[' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.y << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.z |
| << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tvec4<T,P> const& a) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| // boost::io::ios_all_saver const ias(os); |
| |
| os << std::fixed << std::setprecision(io::precision()) |
| << '[' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.x << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.y << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.z << ',' |
| << std::right << std::setfill<CTy>(' ') << std::setw(io::value_width()) << a.w |
| << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x2<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x3<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat2x4<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x2<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x3<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat3x4<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x2<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << io::cr() |
| << ' ' << m[3] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x3<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << io::cr() |
| << ' ' << m[3] << ']'; |
| } |
| |
| return os; |
| } |
| |
| template <typename CTy, typename CTr, typename T, precision P> |
| GLM_FUNC_QUALIFIER std::basic_ostream<CTy,CTr>& operator<<(std::basic_ostream<CTy,CTr>& os, tmat4x4<T,P> const& m) |
| { |
| typename std::basic_ostream<CTy,CTr>::sentry const cerberus(os); |
| |
| if (cerberus) { |
| |
| os << io::cr() |
| << '[' << m[0] << io::cr() |
| << ' ' << m[1] << io::cr() |
| << ' ' << m[2] << io::cr() |
| << ' ' << m[3] << ']'; |
| } |
| |
| return os; |
| } |
| |
| }//namespace detail |
| }//namespace glm |