openscenegraph
OutputStream
Go to the documentation of this file.
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2010 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
12*/
13// Written by Wang Rui, (C) 2010
14
15#ifndef OSGDB_OUTPUTSTREAM
16#define OSGDB_OUTPUTSTREAM
17
18#include <osg/Version>
19#include <osg/Vec2>
20#include <osg/Vec3>
21#include <osg/Vec4>
22#include <osg/Quat>
23#include <osg/Matrix>
24#include <osg/BoundingBox>
25#include <osg/BoundingSphere>
26#include <osg/Array>
27#include <osg/PrimitiveSet>
28#include <osgDB/ReaderWriter>
29#include <osgDB/StreamOperator>
30#include <iostream>
31#include <sstream>
32
33namespace osgDB
34{
35
37{
38public:
39 OutputException( const std::vector<std::string>& fields, const std::string& err ) : _error(err)
40 {
41 for ( unsigned int i=0; i<fields.size(); ++i )
42 {
43 _field += fields[i];
44 _field += " ";
45 }
46 }
47
48 const std::string& getField() const { return _field; }
49 const std::string& getError() const { return _error; }
50
51protected:
52 std::string _field;
53 std::string _error;
54};
55
57{
58public:
59 typedef std::map<const osg::Array*, unsigned int> ArrayMap;
60 typedef std::map<const osg::Object*, unsigned int> ObjectMap;
61
63 {
64 WRITE_UNKNOWN = 0,
67 WRITE_OBJECT
68 };
69
71 {
72 WRITE_USE_IMAGE_HINT = 0,
76 WRITE_EXTERNAL_FILE
77 };
78
79 OutputStream( const osgDB::Options* options );
80 virtual ~OutputStream();
81
82 void setFileVersion( const std::string& d, int v );
83 int getFileVersion( const std::string& d=std::string() ) const;
84
85 bool isBinary() const { return _out->isBinary(); }
86 const std::string& getSchemaName() const { return _schemaName; }
87 const osgDB::Options* getOptions() const { return _options.get(); }
88
89 void setWriteImageHint( WriteImageHint hint ) { _writeImageHint = hint; }
90 WriteImageHint getWriteImageHint() const { return _writeImageHint; }
91
92 // Serialization related functions
93 OutputStream& operator<<( bool b ) { _out->writeBool(b); return *this; }
94 OutputStream& operator<<( char c ) { _out->writeChar(c); return *this; }
95 OutputStream& operator<<( signed char c) { _out->writeChar(c); return *this; }
96 OutputStream& operator<<( unsigned char c ) { _out->writeUChar(c); return *this; }
97 OutputStream& operator<<( short s ) { _out->writeShort(s); return *this; }
98 OutputStream& operator<<( unsigned short s ) { _out->writeUShort(s); return *this; }
99 OutputStream& operator<<( int i ) { _out->writeInt(i); return *this; }
100 OutputStream& operator<<( unsigned int i ) { _out->writeUInt(i); return *this; }
101 OutputStream& operator<<( long l ) { _out->writeLong(l); return *this; }
102 OutputStream& operator<<( unsigned long l ) { _out->writeULong(l); return *this; }
103 OutputStream& operator<<( float f ) { _out->writeFloat(f); return *this; }
104 OutputStream& operator<<( double d ) { _out->writeDouble(d); return *this; }
105 OutputStream& operator<<( long long ll ) { _out->writeInt64(ll); return *this; }
106 OutputStream& operator<<( unsigned long long ull ) { _out->writeUInt64(ull); return *this; }
107 OutputStream& operator<<( const std::string& s ) { _out->writeString(s); return *this; }
108 OutputStream& operator<<( const char* s ) { _out->writeString(s); return *this; }
109 OutputStream& operator<<( std::ostream& (*fn)(std::ostream&) ) { _out->writeStream(fn); return *this; }
110 OutputStream& operator<<( std::ios_base& (*fn)(std::ios_base&) ) { _out->writeBase(fn); return *this; }
111
112 OutputStream& operator<<( const ObjectGLenum& value ) { _out->writeGLenum(value); return *this; }
113 OutputStream& operator<<( const ObjectProperty& prop ) { _out->writeProperty(prop); return *this; }
114 OutputStream& operator<<( const ObjectMark& mark ) { _out->writeMark(mark); return *this; }
115
148
149 OutputStream& operator<<( const osg::Image* img ) { writeImage(img); return *this; }
150 OutputStream& operator<<( const osg::Array* a ) { if (_targetFileVersion >= 112) writeObject(a); else writeArray(a); return *this; }
151 OutputStream& operator<<( const osg::PrimitiveSet* p ) { if (_targetFileVersion >= 112) writeObject(p); else writePrimitiveSet(p); return *this; }
152 OutputStream& operator<<( const osg::Object* obj ) { writeObject(obj); return *this; }
153
154 OutputStream& operator<<( const osg::ref_ptr<osg::Image>& ptr ) { writeImage(ptr.get()); return *this; }
155 OutputStream& operator<<( const osg::ref_ptr<osg::Array>& ptr ) { if (_targetFileVersion >= 112) writeObject(ptr.get()); else writeArray(ptr.get()); return *this; }
156 OutputStream& operator<<( const osg::ref_ptr<osg::PrimitiveSet>& ptr ) { if (_targetFileVersion >= 112) writeObject(ptr.get()); else writePrimitiveSet(ptr.get()); return *this; }
157
158 template<typename T> OutputStream& operator<<( const osg::ref_ptr<T>& ptr ) { writeObject(ptr.get()); return *this; }
159
160 // Convenient methods for writing
161 void writeWrappedString( const std::string& str ) { _out->writeWrappedString(str); }
162 void writeCharArray( const char* s, unsigned int size ) { _out->writeCharArray(s, size); }
163
164 // method for converting all data structure sizes to unsigned int to ensure architecture portability.
165 template<typename T>
166 void writeSize(T size) { *this<<static_cast<unsigned int>(size); }
167
168 // Global writing functions
169 void writeArray( const osg::Array* a );
171 void writeImage( const osg::Image* img );
172 void writeObject( const osg::Object* obj );
173 void writeObjectFields( const osg::Object* obj );
174 void writeObjectFields( const osg::Object* obj, const std::string& compoundName );
175
177 void setOutputIterator( OutputIterator* oi ) { _out = oi; }
178
180 void start( OutputIterator* outIterator, WriteType type );
181
182 void compress( std::ostream* ostream );
183
184 // Schema handlers
185 void writeSchema( std::ostream& fout );
186
187 // Exception handlers
188 inline void throwException( const std::string& msg );
189 const OutputException* getException() const { return _exception.get(); }
190
191 // Property & mask variables
195
196protected:
197 template<typename T>
198 void writeArrayImplementation( const T*, int write_size, unsigned int numInRow=1 );
199
200 unsigned int findOrCreateArrayID( const osg::Array* array, bool& newID );
201 unsigned int findOrCreateObjectID( const osg::Object* obj, bool& newID );
202
205
206 typedef std::map<std::string, int> VersionMap;
211
212 typedef std::map<std::string, std::string> SchemaMap;
214 std::vector<std::string> _fields;
215 std::string _schemaName;
216 std::string _compressorName;
217 std::stringstream _compressSource;
221
223};
224
225void OutputStream::throwException( const std::string& msg )
226{
228}
229
230}
231
232#endif
Definition DataTypes:129
Definition DataTypes:105
Definition Options:30
Definition OutputStream:37
std::string _error
Definition OutputStream:53
const std::string & getError() const
Definition OutputStream:49
std::string _field
Definition OutputStream:52
OutputException(const std::vector< std::string > &fields, const std::string &err)
Definition OutputStream:39
const std::string & getField() const
Definition OutputStream:48
Definition StreamOperator:18
Definition OutputStream:57
OutputStream & operator<<(const osg::Vec3ui &v)
void setOutputIterator(OutputIterator *oi)
set an output iterator, used directly when not using OutputStream with a traditional file related str...
Definition OutputStream:177
OutputStream & operator<<(double d)
Definition OutputStream:104
OutputStream & operator<<(const osg::Vec3f &v)
OutputStream & operator<<(long l)
Definition OutputStream:101
void writePrimitiveSet(const osg::PrimitiveSet *p)
OutputStream & operator<<(const osg::Quat &q)
OutputStream & operator<<(const osg::PrimitiveSet *p)
Definition OutputStream:151
OutputStream & operator<<(const ObjectProperty &prop)
Definition OutputStream:113
OutputStream & operator<<(const osg::Image *img)
Definition OutputStream:149
OutputStream & operator<<(const osg::Vec4ub &v)
OutputStream & operator<<(const osg::Vec2s &v)
void setWriteImageHint(WriteImageHint hint)
Definition OutputStream:89
OutputStream & operator<<(const osg::Vec3ub &v)
WriteType
Definition OutputStream:63
@ WRITE_IMAGE
Definition OutputStream:66
@ WRITE_SCENE
Definition OutputStream:65
void writeCharArray(const char *s, unsigned int size)
Definition OutputStream:162
void compress(std::ostream *ostream)
std::map< std::string, std::string > SchemaMap
Definition OutputStream:212
OutputStream & operator<<(float f)
Definition OutputStream:103
OutputStream & operator<<(const osg::Matrixd &mat)
void writeImage(const osg::Image *img)
OutputStream & operator<<(const osg::Vec2us &v)
void writeObject(const osg::Object *obj)
OutputStream & operator<<(const osg::Vec4us &v)
OutputStream & operator<<(const osg::Vec4d &v)
int _targetFileVersion
Definition OutputStream:222
OutputStream & operator<<(const osg::Vec2b &v)
const std::string & getSchemaName() const
Definition OutputStream:86
WriteImageHint
Definition OutputStream:71
@ WRITE_INLINE_DATA
Definition OutputStream:74
@ WRITE_INLINE_FILE
Definition OutputStream:75
@ WRITE_USE_EXTERNAL
Definition OutputStream:73
OutputStream & operator<<(long long ll)
Definition OutputStream:105
OutputStream & operator<<(unsigned int i)
Definition OutputStream:100
std::vector< std::string > _fields
Definition OutputStream:214
OutputStream & operator<<(const osg::ref_ptr< osg::PrimitiveSet > &ptr)
Definition OutputStream:156
OutputStream & operator<<(const osg::Matrixf &mat)
unsigned int findOrCreateArrayID(const osg::Array *array, bool &newID)
OutputStream & operator<<(std::ios_base &(*fn)(std::ios_base &))
Definition OutputStream:110
OutputStream & operator<<(const osg::BoundingBoxd &bb)
void start(OutputIterator *outIterator, WriteType type)
start writing to OutputStream treating it as a traditional file related stream, handles headers and v...
ObjectMark BEGIN_BRACKET
Definition OutputStream:193
OutputStream & operator<<(const osg::Plane &p)
ObjectMark END_BRACKET
Definition OutputStream:194
OutputStream & operator<<(const osg::Vec2ui &v)
void writeObjectFields(const osg::Object *obj, const std::string &compoundName)
void writeArray(const osg::Array *a)
OutputStream & operator<<(const osg::Vec4i &v)
OutputStream & operator<<(unsigned long long ull)
Definition OutputStream:106
ObjectMap _objectMap
Definition OutputStream:204
osg::ref_ptr< OutputException > _exception
Definition OutputStream:219
int getFileVersion(const std::string &d=std::string()) const
OutputStream & operator<<(const osg::Vec3i &v)
void throwException(const std::string &msg)
Definition OutputStream:225
OutputStream & operator<<(const ObjectGLenum &value)
Definition OutputStream:112
void writeObjectFields(const osg::Object *obj)
WriteImageHint _writeImageHint
Definition OutputStream:208
OutputStream & operator<<(unsigned long l)
Definition OutputStream:102
OutputStream & operator<<(const osg::BoundingBoxf &bb)
OutputStream & operator<<(signed char c)
Definition OutputStream:95
OutputStream & operator<<(const osg::ref_ptr< osg::Array > &ptr)
Definition OutputStream:155
WriteImageHint getWriteImageHint() const
Definition OutputStream:90
SchemaMap _inbuiltSchemaMap
Definition OutputStream:213
bool isBinary() const
Definition OutputStream:85
const osgDB::Options * getOptions() const
Definition OutputStream:87
osg::ref_ptr< OutputIterator > _out
Definition OutputStream:218
OutputStream & operator<<(short s)
Definition OutputStream:97
const OutputException * getException() const
Definition OutputStream:189
OutputStream & operator<<(bool b)
Definition OutputStream:93
OutputStream & operator<<(const osg::Vec4f &v)
OutputStream & operator<<(const char *s)
Definition OutputStream:108
VersionMap _domainVersionMap
Definition OutputStream:207
OutputStream & operator<<(const osg::ref_ptr< T > &ptr)
Definition OutputStream:158
OutputStream(const osgDB::Options *options)
OutputStream & operator<<(const osg::ref_ptr< osg::Image > &ptr)
Definition OutputStream:154
void writeSize(T size)
Definition OutputStream:166
OutputStream & operator<<(const osg::Vec4ui &v)
std::stringstream _compressSource
Definition OutputStream:217
std::map< const osg::Object *, unsigned int > ObjectMap
Definition OutputStream:60
ObjectProperty PROPERTY
Definition OutputStream:192
void writeWrappedString(const std::string &str)
Definition OutputStream:161
OutputStream & operator<<(const osg::Array *a)
Definition OutputStream:150
std::map< const osg::Array *, unsigned int > ArrayMap
Definition OutputStream:59
OutputStream & operator<<(const osg::Vec3us &v)
OutputStream & operator<<(const osg::Vec2f &v)
OutputStream & operator<<(const std::string &s)
Definition OutputStream:107
OutputStream & operator<<(const osg::Vec2ub &v)
OutputStream & operator<<(const osg::Object *obj)
Definition OutputStream:152
OutputStream & operator<<(std::ostream &(*fn)(std::ostream &))
Definition OutputStream:109
std::map< std::string, int > VersionMap
Definition OutputStream:206
OutputStream & operator<<(const osg::Vec2i &v)
void setFileVersion(const std::string &d, int v)
void writeArrayImplementation(const T *, int write_size, unsigned int numInRow=1)
bool _useSchemaData
Definition OutputStream:209
std::string _schemaName
Definition OutputStream:215
std::string _compressorName
Definition OutputStream:216
OutputStream & operator<<(const osg::Vec4b &v)
OutputStream & operator<<(unsigned char c)
Definition OutputStream:96
osg::ref_ptr< const osgDB::Options > _options
Definition OutputStream:220
ArrayMap _arrayMap
Definition OutputStream:203
OutputStream & operator<<(char c)
Definition OutputStream:94
bool _useRobustBinaryFormat
Definition OutputStream:210
virtual ~OutputStream()
OutputStream & operator<<(const osg::Vec3d &v)
void writeSchema(std::ostream &fout)
OutputStream & operator<<(const ObjectMark &mark)
Definition OutputStream:114
OutputStream & operator<<(const osg::Vec3b &v)
OutputStream & operator<<(int i)
Definition OutputStream:99
OutputStream & operator<<(const osg::Vec2d &v)
OutputStream & operator<<(const osg::BoundingSpheref &bb)
OutputStream & operator<<(unsigned short s)
Definition OutputStream:98
OutputStream & operator<<(const osg::Vec3s &v)
unsigned int findOrCreateObjectID(const osg::Object *obj, bool &newID)
OutputStream & operator<<(const osg::BoundingSphered &bb)
OutputStream & operator<<(const osg::Vec4s &v)
Definition Array:61
Definition BoundingBox:34
Definition BoundingSphere:35
Definition Image:179
Definition Matrixd:27
Definition Matrixf:27
Definition Object:61
A plane class. It can be used to represent an infinite plane.
Definition Plane:34
Definition PrimitiveSet:125
Definition Quat:30
Definition Referenced:44
Definition Vec2b:26
Definition Vec2d:29
Definition Vec2f:29
Definition Vec2i:22
Definition Vec2s:20
Definition Vec2ub:22
Definition Vec2ui:22
Definition Vec2us:20
Definition Vec3b:26
Definition Vec3d:30
Definition Vec3f:29
Definition Vec3i:22
Definition Vec3s:20
Definition Vec3ub:26
Definition Vec3ui:22
Definition Vec3us:20
Definition Vec4b:26
Definition Vec4d:29
Definition Vec4f:28
Definition Vec4i:22
Definition Vec4s:26
Definition Vec4ub:28
Definition Vec4ui:22
Definition Vec4us:26
Definition ref_ptr:32
T * get() const
Definition ref_ptr:117
Definition Archive:24
void writeArray(Output &fw, Iterator first, Iterator last, int noItemsPerLine=0)
Definition ParameterOutput:111
#define OSGDB_EXPORT
Definition osgDB/Export:39
Definition DataTypes:94