root/OpenSceneGraph/trunk/src/osgPlugins/ive/DataOutputStream.h @ 10819

Revision 10819, 8.2 kB (checked in by robert, 5 years ago)

From Chris Hanson, " Add support for "OutputTextureFiles?" option to IVE plugin to permit creation of external
.dds texture files from internally-embedded textures during IVE writes."

From Robert Osfield, fixed a bug in the above submission, and changed the way that the filename of the file is passed into DataOutputStream? to avoid issues with the .ive's plugins ability to read from istreams.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#ifndef IVE_DATAOUTPUTSTREAM
2#define IVE_DATAOUTPUTSTREAM 1
3
4
5
6#include <iostream>        // for ofstream
7#include <string>
8#include <sstream>
9
10#include <osg/Vec2>
11#include <osg/Vec3>
12#include <osg/Vec4>
13#include <osg/Quat>
14#include <osg/Array>
15#include <osg/Matrix>
16#include <osg/Geometry>
17#include <osg/Shape>
18#include <osg/Uniform>
19#include <osgDB/ReaderWriter>
20
21#include <osgTerrain/TerrainTile>
22#include <osgVolume/VolumeTile>
23
24#include "IveVersion.h"
25#include "DataTypeSize.h"
26#include "Exception.h"
27
28#include <osg/StateSet>
29#include <osg/ref_ptr>
30
31namespace ive {                       
32
33class DataOutputStream{
34
35public:
36    DataOutputStream(std::ostream* ostream, const osgDB::ReaderWriter::Options* options);
37    ~DataOutputStream();
38
39    const osgDB::ReaderWriter::Options* getOptions() const { return _options.get(); }
40
41    unsigned int getVersion() { return VERSION; }
42       
43    void writeBool(bool b);
44    void writeChar(char c);
45    void writeUChar(unsigned char c);
46    void writeUShort(unsigned short s);
47    void writeShort(short s);   
48    void writeUInt(unsigned int s);
49    void writeInt(int i);
50    void writeFloat(float f);
51    void writeLong(long l);
52    void writeULong(unsigned long l);
53    void writeDouble(double d);
54    void writeString(const std::string& s);
55    void writeCharArray(const char* data, int size);
56    void writeVec2(const osg::Vec2& v);
57    void writeVec3(const osg::Vec3& v);
58    void writeVec4(const osg::Vec4& v);
59    void writeVec2d(const osg::Vec2d& v);
60    void writeVec3d(const osg::Vec3d& v);
61    void writeVec4d(const osg::Vec4d& v);
62    void writePlane(const osg::Plane& v);
63    void writeVec4ub(const osg::Vec4ub& v);
64    void writeQuat(const osg::Quat& q);
65    void writeBinding(osg::Geometry::AttributeBinding b);
66    void writeArray(const osg::Array* a);
67    void writeIntArray(const osg::IntArray* a);
68    void writeUByteArray(const osg::UByteArray* a);
69    void writeUShortArray(const osg::UShortArray* a);
70    void writeUIntArray(const osg::UIntArray* a);
71    void writeVec4ubArray(const osg::Vec4ubArray* a);
72    void writeVec2b(const osg::Vec2b& v);   
73    void writeVec3b(const osg::Vec3b& v);   
74    void writeVec4b(const osg::Vec4b& v);   
75   
76    void writePackedFloatArray(const osg::FloatArray* a, float maxError);
77   
78    void writeFloatArray(const osg::FloatArray* a);
79    void writeVec2Array(const osg::Vec2Array* a);
80    void writeVec3Array(const osg::Vec3Array* a);
81    void writeVec4Array(const osg::Vec4Array* a);
82    void writeVec2sArray(const osg::Vec2sArray* a);
83    void writeVec3sArray(const osg::Vec3sArray* a);
84    void writeVec4sArray(const osg::Vec4sArray* a);   
85    void writeVec2bArray(const osg::Vec2bArray* a);
86    void writeVec3bArray(const osg::Vec3bArray* a);
87    void writeVec4bArray(const osg::Vec4bArray* a);
88    void writeVec2dArray(const osg::Vec2dArray* a);
89    void writeVec3dArray(const osg::Vec3dArray* a);
90    void writeVec4dArray(const osg::Vec4dArray* a); 
91    void writeMatrixf(const osg::Matrixf& mat);
92    void writeMatrixd(const osg::Matrixd& mat);
93
94    void writeStateSet(const osg::StateSet* stateset);
95    void writeStateAttribute(const osg::StateAttribute* sa);
96    void writeUniform(const osg::Uniform* uniform);
97    void writeShader(const osg::Shader* shader);
98    void writeDrawable(const osg::Drawable* sa);
99    void writeShape(const osg::Shape* sa);
100    void writeNode(const osg::Node* sa);
101    void writeImage(IncludeImageMode mode, osg::Image *image);
102    void writeImage(osg::Image *image);
103
104    void writeLayer(const osgTerrain::Layer* layer);
105    void writeLocator(const osgTerrain::Locator* locator);
106
107    void writeVolumeLayer(const osgVolume::Layer* layer);
108    void writeVolumeLocator(const osgVolume::Locator* locator);
109    void writeVolumeProperty(const osgVolume::Property* propety);
110
111    void writeObject(const osg::Object* object);
112
113    void setWriteDirectory(const std::string& directoryName) { _writeDirectory = directoryName; }
114    const std::string& getWriteDirectory() const { return _writeDirectory; }
115
116    // Set and get include image data in stream
117    void setIncludeImageMode(IncludeImageMode mode) {_includeImageMode=mode;};
118    IncludeImageMode getIncludeImageMode() const {return _includeImageMode;};
119    IncludeImageMode getIncludeImageMode(const osg::Image* image) const;
120
121    // Set and get include external references in stream
122    void setIncludeExternalReferences(bool b) {_includeExternalReferences=b;};
123    bool getIncludeExternalReferences() const {return _includeExternalReferences;};
124
125    // Set and get if must be generated external reference ive files
126    void setWriteExternalReferenceFiles(bool b) {_writeExternalReferenceFiles=b;};
127    bool getWriteExternalReferenceFiles() const {return _writeExternalReferenceFiles;};
128
129    // Set and get if must be used original external reference files
130    void setUseOriginalExternalReferences(bool b) {_useOriginalExternalReferences=b;};
131    bool getUseOriginalExternalReferences() const {return _useOriginalExternalReferences;};
132
133    // Set and get if export texture files during write
134    void setOutputTextureFiles(bool flag) { _outputTextureFiles = flag; }
135    bool getOutputTextureFiles() const { return _outputTextureFiles; }
136
137    // support code for OutputTextureFiles
138    virtual std::string getTextureFileNameForOutput();
139    void setFileName(std::string newFileName) {_filename = newFileName;}
140    std::string getFileName(void) const {return(_filename);}
141
142    void setTerrainMaximumErrorToSizeRatio(double ratio) { _maximumErrorToSizeRatio = ratio; }
143    double getTerrainMaximumErrorToSizeRatio() const { return _maximumErrorToSizeRatio; }
144
145
146    bool                _verboseOutput;
147
148    bool compress(std::ostream& fout, const std::string& source) const;
149
150
151    void setExternalFileWritten(const std::string& filename, bool hasBeenWritten=true);
152    bool getExternalFileWritten(const std::string& filename) const;
153
154    void throwException(const std::string& message) { _exception = new Exception(message); }
155    void throwException(Exception* exception) { _exception = exception; }
156    const Exception* getException() const { return _exception.get(); }
157
158    private:
159
160    std::ostream* _ostream;
161    std::ostream* _output_ostream;
162    std::string _filename; // not necessary, but optional for use in texture export
163   
164    std::stringstream _compressionStream;
165    int _compressionLevel;
166
167     // Container to map stateset uniques to their respective stateset.
168    typedef std::map<const osg::StateSet*,int>          StateSetMap;
169    typedef std::map<const osg::StateAttribute*,int>    StateAttributeMap;
170    typedef std::map<const osg::Uniform*,int>           UniformMap;
171    typedef std::map<const osg::Shader*,int>            ShaderMap;
172    typedef std::map<const osg::Drawable*,int>          DrawableMap;
173    typedef std::map<const osg::Shape*,int>             ShapeMap;
174    typedef std::map<const osg::Node*,int>              NodeMap;
175    typedef std::map<const osgTerrain::Layer*,int>      LayerMap;
176    typedef std::map<const osgTerrain::Locator*,int>    LocatorMap;
177    typedef std::map<const osgVolume::Layer*,int>       VolumeLayerMap;
178    typedef std::map<const osgVolume::Locator*,int>     VolumeLocatorMap;
179    typedef std::map<const osgVolume::Property*,int>    VolumePropertyMap;
180
181    StateSetMap         _stateSetMap;
182    StateAttributeMap   _stateAttributeMap;
183    UniformMap          _uniformMap;
184    ShaderMap           _shaderMap;
185    DrawableMap         _drawableMap;
186    ShapeMap            _shapeMap;
187    NodeMap             _nodeMap;
188    LayerMap            _layerMap;
189    LocatorMap          _locatorMap;
190    VolumeLayerMap      _volumeLayerMap;
191    VolumeLocatorMap    _volumeLocatorMap;
192    VolumePropertyMap   _volumePropertyMap;
193
194    std::string         _writeDirectory;
195    bool                _includeExternalReferences;
196    bool                _writeExternalReferenceFiles;
197    bool                _useOriginalExternalReferences;
198    double              _maximumErrorToSizeRatio;
199
200    IncludeImageMode    _includeImageMode;
201
202    bool _outputTextureFiles;
203    unsigned int _textureFileNameNumber;
204
205    osg::ref_ptr<const osgDB::ReaderWriter::Options> _options;
206
207    typedef std::map<std::string, bool> ExternalFileWrittenMap;
208    ExternalFileWrittenMap _externalFileWritten;
209
210    osg::ref_ptr<Exception> _exception;
211};
212
213}
214#endif // IVE_DATAOUTPUTSTREAM
Note: See TracBrowser for help on using the browser.