/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSG_IO_UTILS #define OSG_IO_UTILS 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace osg { /** Convinience class for building std::string using stringstream. * Usage: * MakeString str; * std::string s = str<<"Mix strings with numbers "<<0" ; * std::string s2 = str.clear()<<"and other classes such as ("< MakeString& operator << (const T& t) { sstream << t; return *this; } MakeString& operator << (std::ostream& (*fun)(std::ostream&)) { sstream << fun; return *this; } inline MakeString& clear() { sstream.str("") ; return *this; } inline operator std::string () const { return sstream.str(); } inline std::string str() const { return sstream.str(); } inline const char* c_str() const { return sstream.str().c_str(); } }; inline std::ostream& operator << (std::ostream& output, const MakeString& str) { output << str.str(); return output; } ////////////////////////////////////////////////////////////////////////// // Vec2f streaming operators inline std::ostream& operator << (std::ostream& output, const Vec2f& vec) { output << vec._v[0] << " " << vec._v[1]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec2f& vec) { input >> vec._v[0] >> std::ws >> vec._v[1]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec2d steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec2d& vec) { output << vec._v[0] << " " << vec._v[1]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec2d& vec) { input >> vec._v[0] >> std::ws >> vec._v[1]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3f steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec3f& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec3f& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3d steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec3d& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec3d& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3f steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec4f& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2] << " " << vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec4f& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec4d steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec4d& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2] << " " << vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec4d& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec2b steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec2b& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec2b& vec) { input >> vec._v[0] >> std::ws >> vec._v[1]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3b steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec3b& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1] << " " << (int)vec._v[2]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec3b& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec4b steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec4b& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1] << " " << (int)vec._v[2] << " " << (int)vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec4b& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec2s steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec2s& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec2s& vec) { input >> vec._v[0] >> std::ws >> vec._v[1]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3s steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec3s& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1] << " " << (int)vec._v[2]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec3s& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec4s steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec4s& vec) { output << (int)vec._v[0] << " " << (int)vec._v[1] << " " << (int)vec._v[2] << " " << (int)vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec4s& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec2i steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec2i& vec) { output << vec._v[0] << " " << vec._v[1]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec2i& vec) { input >> vec._v[0] >> std::ws >> vec._v[1]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec3i steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec3i& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec3i& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2]; return input; } ////////////////////////////////////////////////////////////////////////// // Vec4i steaming operators. inline std::ostream& operator << (std::ostream& output, const Vec4i& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2] << " " << vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Vec4i& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Matrixf steaming operators. inline std::ostream& operator<< (std::ostream& os, const Matrixf& m ) { os << "{"<> (std::istream& input, Vec4ub& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Quat steaming operators. inline std::ostream& operator << (std::ostream& output, const Quat& vec) { output << vec._v[0] << " " << vec._v[1] << " " << vec._v[2] << " " << vec._v[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Quat& vec) { input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2] >> std::ws >> vec._v[3]; return input; } ////////////////////////////////////////////////////////////////////////// // Plane steaming operators. inline std::ostream& operator << (std::ostream& output, const Plane& pl) { output << pl[0] << " " << pl[1] << " " << pl[2] << " " << pl[3]; return output; // to enable cascading } inline std::istream& operator >> (std::istream& input, Plane& vec) { input >> vec[0] >> std::ws >> vec[1] >> std::ws >> vec[2] >> std::ws >> vec[3]; return input; } } // end of namespace osg #endif