2012-03-22 01:36:20 +08:00
|
|
|
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
|
2005-04-08 17:01:23 +08:00
|
|
|
*
|
2012-03-22 01:36:20 +08:00
|
|
|
* 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
|
2005-04-08 17:01:23 +08:00
|
|
|
* (at your option) any later version. The full license is in LICENSE file
|
|
|
|
* included with this distribution, and on the openscenegraph.org website.
|
2012-03-22 01:36:20 +08:00
|
|
|
*
|
2005-04-08 17:01:23 +08:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2012-03-22 01:36:20 +08:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2005-04-08 17:01:23 +08:00
|
|
|
* OpenSceneGraph Public License for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef OSG_IO_UTILS
|
|
|
|
#define OSG_IO_UTILS 1
|
|
|
|
|
|
|
|
#include <ostream>
|
|
|
|
#include <istream>
|
2016-11-18 22:56:05 +08:00
|
|
|
#include <sstream>
|
2005-04-08 17:01:23 +08:00
|
|
|
|
|
|
|
#include <osg/Vec4d>
|
2005-07-15 22:41:19 +08:00
|
|
|
#include <osg/Vec4ub>
|
|
|
|
#include <osg/Vec2b>
|
|
|
|
#include <osg/Vec3b>
|
|
|
|
#include <osg/Vec4b>
|
|
|
|
#include <osg/Vec2s>
|
|
|
|
#include <osg/Vec3s>
|
|
|
|
#include <osg/Vec4s>
|
2013-11-06 17:23:21 +08:00
|
|
|
#include <osg/Vec2i>
|
|
|
|
#include <osg/Vec3i>
|
|
|
|
#include <osg/Vec4i>
|
2005-04-08 17:01:23 +08:00
|
|
|
#include <osg/Matrixf>
|
|
|
|
#include <osg/Matrixd>
|
2005-04-16 04:59:24 +08:00
|
|
|
#include <osg/Plane>
|
2005-04-08 17:01:23 +08:00
|
|
|
|
|
|
|
namespace osg {
|
|
|
|
|
|
|
|
|
2016-11-18 22:56:05 +08:00
|
|
|
/** 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 ("<<osg::Vec3(0.0,1.0,3.0)<<)" ; */
|
|
|
|
class MakeString
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MakeString() {}
|
|
|
|
|
|
|
|
std::stringstream sstream;
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
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 std::ostream& operator << (std::ostream& output, const MakeString& str) { output << str.str(); return output; }
|
|
|
|
|
2005-04-08 17:01:23 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// 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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1];
|
2005-04-08 17:01:23 +08:00
|
|
|
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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1];
|
2005-04-08 17:01:23 +08:00
|
|
|
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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2];
|
2005-04-08 17:01:23 +08:00
|
|
|
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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2];
|
2005-04-08 17:01:23 +08:00
|
|
|
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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
|
|
|
>> vec._v[2] >> std::ws
|
|
|
|
>> vec._v[3];
|
2005-04-08 17:01:23 +08:00
|
|
|
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)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
|
|
|
>> vec._v[2] >> std::ws
|
|
|
|
>> vec._v[3];
|
2005-04-08 17:01:23 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-07-05 23:57:53 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec2b steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec2b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec2b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec3b steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec3b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1] << " "
|
|
|
|
<< (int)vec._v[2];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec3b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec4b steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec4b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1] << " "
|
|
|
|
<< (int)vec._v[2] << " "
|
|
|
|
<< (int)vec._v[3];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec4b& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
2012-03-22 01:36:20 +08:00
|
|
|
>> vec._v[2] >> std::ws
|
2010-09-24 22:38:01 +08:00
|
|
|
>> vec._v[3];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec2s steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec2s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec2s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec3s steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec3s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1] << " "
|
|
|
|
<< (int)vec._v[2];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec3s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws >> vec._v[1] >> std::ws >> vec._v[2];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec4s steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec4s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1] << " "
|
|
|
|
<< (int)vec._v[2] << " "
|
|
|
|
<< (int)vec._v[3];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-07-05 23:57:53 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec4s& vec)
|
2005-07-05 23:57:53 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
|
|
|
>> vec._v[2] >> std::ws
|
|
|
|
>> vec._v[3];
|
2005-07-05 23:57:53 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-11-06 17:23:21 +08:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-04-08 17:01:23 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2007-12-11 01:30:18 +08:00
|
|
|
// Matrixf steaming operators.
|
2005-04-08 17:01:23 +08:00
|
|
|
inline std::ostream& operator<< (std::ostream& os, const Matrixf& m )
|
|
|
|
{
|
|
|
|
os << "{"<<std::endl;
|
|
|
|
for(int row=0; row<4; ++row) {
|
|
|
|
os << "\t";
|
|
|
|
for(int col=0; col<4; ++col)
|
|
|
|
os << m(row,col) << " ";
|
|
|
|
os << std::endl;
|
|
|
|
}
|
|
|
|
os << "}" << std::endl;
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2007-12-11 01:30:18 +08:00
|
|
|
// Matrixd steaming operators.
|
2005-04-08 17:01:23 +08:00
|
|
|
inline std::ostream& operator<< (std::ostream& os, const Matrixd& m )
|
|
|
|
{
|
|
|
|
os << "{"<<std::endl;
|
|
|
|
for(int row=0; row<4; ++row) {
|
|
|
|
os << "\t";
|
|
|
|
for(int col=0; col<4; ++col)
|
|
|
|
os << m(row,col) << " ";
|
|
|
|
os << std::endl;
|
|
|
|
}
|
|
|
|
os << "}" << std::endl;
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
2005-04-08 22:10:22 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
2005-07-15 22:41:19 +08:00
|
|
|
// Vec4ub steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Vec4ub& vec)
|
2005-04-08 22:10:22 +08:00
|
|
|
{
|
|
|
|
output << (int)vec._v[0] << " "
|
|
|
|
<< (int)vec._v[1] << " "
|
|
|
|
<< (int)vec._v[2] << " "
|
|
|
|
<< (int)vec._v[3];
|
2005-11-18 01:44:48 +08:00
|
|
|
return output; // to enable cascading
|
2005-04-08 22:10:22 +08:00
|
|
|
}
|
|
|
|
|
2005-07-15 22:41:19 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Vec4ub& vec)
|
2005-04-17 01:44:11 +08:00
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
|
|
|
>> vec._v[2] >> std::ws
|
|
|
|
>> vec._v[3];
|
2005-04-17 01:44:11 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
2005-04-08 17:01:23 +08:00
|
|
|
|
2005-04-16 04:59:24 +08:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2005-04-17 01:44:11 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Quat& vec)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec._v[0] >> std::ws
|
|
|
|
>> vec._v[1] >> std::ws
|
|
|
|
>> vec._v[2] >> std::ws
|
|
|
|
>> vec._v[3];
|
2005-04-17 01:44:11 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-04-16 04:59:24 +08:00
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Plane steaming operators.
|
|
|
|
inline std::ostream& operator << (std::ostream& output, const Plane& pl)
|
|
|
|
{
|
|
|
|
output << pl[0] << " "
|
2005-11-18 01:44:48 +08:00
|
|
|
<< pl[1] << " "
|
|
|
|
<< pl[2] << " "
|
|
|
|
<< pl[3];
|
|
|
|
return output; // to enable cascading
|
2005-04-16 04:59:24 +08:00
|
|
|
}
|
|
|
|
|
2005-04-17 01:44:11 +08:00
|
|
|
inline std::istream& operator >> (std::istream& input, Plane& vec)
|
|
|
|
{
|
2010-09-24 22:38:01 +08:00
|
|
|
input >> vec[0] >> std::ws
|
|
|
|
>> vec[1] >> std::ws
|
|
|
|
>> vec[2] >> std::ws
|
|
|
|
>> vec[3];
|
2005-04-17 01:44:11 +08:00
|
|
|
return input;
|
|
|
|
}
|
|
|
|
|
2005-04-08 17:01:23 +08:00
|
|
|
} // end of namespace osg
|
|
|
|
#endif
|