root/OpenSceneGraph/trunk/src/osgWrappers/serializers/osg/StateSet.cpp @ 13041

Revision 13041, 9.9 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
Line 
1#include <osg/StateSet>
2#include <osgDB/ObjectWrapper>
3#include <osgDB/InputStream>
4#include <osgDB/OutputStream>
5
6static int readValue( osgDB::InputStream& is )
7{
8    int value = osg::StateAttribute::INHERIT;
9    if ( is.isBinary() )
10        is >> value;
11    else
12    {
13        std::string enumValue;
14        is >> enumValue;
15        if ( enumValue=="OFF" ) value = osg::StateAttribute::OFF;
16        else if ( enumValue=="ON" ) value = osg::StateAttribute::ON;
17        else if ( enumValue=="INHERIT" ) value = osg::StateAttribute::INHERIT;
18        else if ( enumValue=="OFF|OVERRIDE" )
19            value = osg::StateAttribute::OFF|osg::StateAttribute::OVERRIDE;
20        else if ( enumValue=="OFF|PROTECTED" )
21            value = osg::StateAttribute::OFF|osg::StateAttribute::PROTECTED;
22        else if ( enumValue=="ON|OVERRIDE" )
23            value = osg::StateAttribute::ON|osg::StateAttribute::OVERRIDE;
24        else if ( enumValue=="ON|PROTECTED" )
25            value = osg::StateAttribute::ON|osg::StateAttribute::PROTECTED;
26    }
27    return value;
28}
29
30static void readModes( osgDB::InputStream& is, osg::StateSet::ModeList& modes )
31{
32    unsigned int size = is.readSize();
33    if ( size>0 )
34    {
35        is >> osgDB::BEGIN_BRACKET;
36        for ( unsigned int i=0; i<size; ++i )
37        {
38            DEF_GLENUM(mode); is >> mode;
39            int value = readValue( is );
40            modes[mode.get()] = (osg::StateAttribute::Values)value;
41        }
42        is >> osgDB::END_BRACKET;
43    }
44}
45
46static void readAttributes( osgDB::InputStream& is, osg::StateSet::AttributeList& attrs )
47{
48    unsigned int size = is.readSize();
49    if ( size>0 )
50    {
51        is >> osgDB::BEGIN_BRACKET;
52        for ( unsigned int i=0; i<size; ++i )
53        {
54            osg::StateAttribute* sa = dynamic_cast<osg::StateAttribute*>( is.readObject() );
55            is >> osgDB::PROPERTY("Value");
56            int value = readValue( is );
57            if ( sa )
58                attrs[sa->getTypeMemberPair()] = osg::StateSet::RefAttributePair(sa,value);
59        }
60            is >> osgDB::END_BRACKET;
61        }
62}
63
64static void writeValue( osgDB::OutputStream& os, int value )
65{
66    if ( os.isBinary() )
67        os << value;
68    else
69    {
70        if ( value==osg::StateAttribute::OFF ) os << std::string("OFF");
71        else if ( value==osg::StateAttribute::ON ) os << std::string("ON");
72        else if ( value==osg::StateAttribute::INHERIT ) os << std::string("INHERIT");
73        else if ( value==osg::StateAttribute::OFF+osg::StateAttribute::OVERRIDE )
74            os << std::string("OFF|OVERRIDE");
75        else if ( value==osg::StateAttribute::OFF+osg::StateAttribute::PROTECTED )
76            os << std::string("OFF|PROTECTED");
77        else if ( value==osg::StateAttribute::ON+osg::StateAttribute::OVERRIDE )
78            os << std::string("ON|OVERRIDE");
79        else if ( value==osg::StateAttribute::ON+osg::StateAttribute::PROTECTED )
80            os << std::string("ON|PROTECTED");
81        else os << std::string("INHERIT");
82    }
83}
84
85static void writeModes( osgDB::OutputStream& os, const osg::StateSet::ModeList& modes )
86{
87    os.writeSize(modes.size());
88    if ( modes.size()>0 )
89    {
90        os << osgDB::BEGIN_BRACKET << std::endl;
91        for ( osg::StateSet::ModeList::const_iterator itr=modes.begin();
92              itr!=modes.end(); ++itr )
93        {
94            os << GLENUM(itr->first);
95            writeValue(os, itr->second);
96            os << std::endl;
97        }
98        os << osgDB::END_BRACKET;
99    }
100    os << std::endl;
101}
102
103static void writeAttributes( osgDB::OutputStream& os, const osg::StateSet::AttributeList& attrs )
104{
105    os.writeSize(attrs.size());
106    if ( attrs.size()>0 )
107    {
108        os << osgDB::BEGIN_BRACKET << std::endl;
109        for ( osg::StateSet::AttributeList::const_iterator itr=attrs.begin();
110              itr!=attrs.end(); ++itr )
111        {
112            os << itr->second.first.get();
113            os << osgDB::PROPERTY("Value");
114            writeValue(os, itr->second.second);
115            os << std::endl;
116        }
117        os << osgDB::END_BRACKET;
118    }
119    os << std::endl;
120}
121
122// _modeList
123static bool checkModeList( const osg::StateSet& ss )
124{
125    return ss.getModeList().size()>0;
126}
127
128static bool readModeList( osgDB::InputStream& is, osg::StateSet& ss )
129{
130    osg::StateSet::ModeList modes; readModes( is, modes );
131    for ( osg::StateSet::ModeList::iterator itr=modes.begin();
132          itr!=modes.end(); ++itr )
133    {
134        ss.setMode( itr->first, itr->second );
135    }
136    return true;
137}
138
139static bool writeModeList( osgDB::OutputStream& os, const osg::StateSet& ss )
140{
141    writeModes( os, ss.getModeList() );
142    return true;
143}
144
145// _attributeList
146static bool checkAttributeList( const osg::StateSet& ss )
147{
148    return ss.getAttributeList().size()>0;
149}
150
151static bool readAttributeList( osgDB::InputStream& is, osg::StateSet& ss )
152{
153    osg::StateSet::AttributeList attrs; readAttributes( is, attrs );
154    for ( osg::StateSet::AttributeList::iterator itr=attrs.begin();
155          itr!=attrs.end(); ++itr )
156    {
157        ss.setAttribute( itr->second.first.get(), itr->second.second );
158    }
159    return true;
160}
161
162static bool writeAttributeList( osgDB::OutputStream& os, const osg::StateSet& ss )
163{
164    writeAttributes( os, ss.getAttributeList() );
165    return true;
166}
167
168// _textureModeList
169static bool checkTextureModeList( const osg::StateSet& ss )
170{
171    return ss.getTextureModeList().size()>0;
172}
173
174static bool readTextureModeList( osgDB::InputStream& is, osg::StateSet& ss )
175{
176    unsigned int size = is.readSize(); is >> osgDB::BEGIN_BRACKET;
177    osg::StateSet::ModeList modes;
178    for ( unsigned int i=0; i<size; ++i )
179    {
180        is >> osgDB::PROPERTY("Data");
181        readModes( is, modes );
182        for ( osg::StateSet::ModeList::iterator itr=modes.begin();
183              itr!=modes.end(); ++itr )
184        {
185            ss.setTextureMode( i, itr->first, itr->second );
186        }
187        modes.clear();
188    }
189    is >> osgDB::END_BRACKET;
190    return true;
191}
192
193static bool writeTextureModeList( osgDB::OutputStream& os, const osg::StateSet& ss )
194{
195    const osg::StateSet::TextureModeList& tml = ss.getTextureModeList();
196    os.writeSize(tml.size()); os << osgDB::BEGIN_BRACKET << std::endl;
197    for ( osg::StateSet::TextureModeList::const_iterator itr=tml.begin();
198          itr!=tml.end(); ++itr )
199    {
200        os << osgDB::PROPERTY("Data");
201        writeModes( os, *itr );
202    }
203    os << osgDB::END_BRACKET << std::endl;
204    return true;
205}
206
207// _textureAttributeList
208static bool checkTextureAttributeList( const osg::StateSet& ss )
209{
210    return ss.getTextureAttributeList().size()>0;
211}
212
213static bool readTextureAttributeList( osgDB::InputStream& is, osg::StateSet& ss )
214{
215    unsigned int size = is.readSize(); is >> osgDB::BEGIN_BRACKET;
216    osg::StateSet::AttributeList attrs;
217    for ( unsigned int i=0; i<size; ++i )
218    {
219        is >> osgDB::PROPERTY("Data");
220        readAttributes( is, attrs );
221        for ( osg::StateSet::AttributeList::iterator itr=attrs.begin();
222              itr!=attrs.end(); ++itr )
223        {
224            ss.setTextureAttribute( i, itr->second.first.get(), itr->second.second );
225        }
226        attrs.clear();
227    }
228    is >> osgDB::END_BRACKET;
229    return true;
230}
231
232static bool writeTextureAttributeList( osgDB::OutputStream& os, const osg::StateSet& ss )
233{
234    const osg::StateSet::TextureAttributeList& tal = ss.getTextureAttributeList();
235    os.writeSize(tal.size()); os << osgDB::BEGIN_BRACKET << std::endl;
236    for ( osg::StateSet::TextureAttributeList::const_iterator itr=tal.begin();
237          itr!=tal.end(); ++itr )
238    {
239        os << osgDB::PROPERTY("Data");
240        writeAttributes( os, *itr );
241    }
242    os << osgDB::END_BRACKET << std::endl;
243    return true;
244}
245
246// _uniformList
247static bool checkUniformList( const osg::StateSet& ss )
248{
249    return ss.getUniformList().size()>0;
250}
251
252static bool readUniformList( osgDB::InputStream& is, osg::StateSet& ss )
253{
254    unsigned int size = is.readSize(); is >> osgDB::BEGIN_BRACKET;
255    for ( unsigned int i=0; i<size; ++i )
256    {
257        osg::Uniform* uniform = dynamic_cast<osg::Uniform*>( is.readObject() );
258        is >> osgDB::PROPERTY("Value");
259        int value = readValue( is );
260        if ( uniform )
261            ss.addUniform( uniform, (osg::StateAttribute::Values)value );
262    }
263    is >> osgDB::END_BRACKET;
264    return true;
265}
266
267static bool writeUniformList( osgDB::OutputStream& os, const osg::StateSet& ss )
268{
269    const osg::StateSet::UniformList& ul = ss.getUniformList();
270    os.writeSize(ul.size()); os << osgDB::BEGIN_BRACKET << std::endl;
271    for ( osg::StateSet::UniformList::const_iterator itr=ul.begin();
272          itr!=ul.end(); ++itr )
273    {
274        os << itr->second.first.get();
275        os << osgDB::PROPERTY("Value");
276        writeValue(os, itr->second.second);
277        os << std::endl;
278    }
279    os << osgDB::END_BRACKET << std::endl;
280    return true;
281}
282
283REGISTER_OBJECT_WRAPPER( StateSet,
284                         new osg::StateSet,
285                         osg::StateSet,
286                         "osg::Object osg::StateSet" )
287{
288    ADD_USER_SERIALIZER( ModeList );  // _modeList
289    ADD_USER_SERIALIZER( AttributeList );  // _attributeList
290    ADD_USER_SERIALIZER( TextureModeList );  // _textureModeList
291    ADD_USER_SERIALIZER( TextureAttributeList );  // _textureAttributeList
292    ADD_USER_SERIALIZER( UniformList );  // _uniformList
293    ADD_INT_SERIALIZER( RenderingHint, osg::StateSet::DEFAULT_BIN );  // _renderingHint
294
295    BEGIN_ENUM_SERIALIZER( RenderBinMode, INHERIT_RENDERBIN_DETAILS );
296        ADD_ENUM_VALUE( INHERIT_RENDERBIN_DETAILS );
297        ADD_ENUM_VALUE( USE_RENDERBIN_DETAILS );
298        ADD_ENUM_VALUE( OVERRIDE_RENDERBIN_DETAILS );
299    END_ENUM_SERIALIZER();  // _binMode
300
301    ADD_INT_SERIALIZER( BinNumber, 0 );  // _binNum
302    ADD_STRING_SERIALIZER( BinName, "" );  // _binName
303    ADD_BOOL_SERIALIZER( NestRenderBins, true );  // _nestRenderBins
304    ADD_OBJECT_SERIALIZER( UpdateCallback, osg::StateSet::Callback, NULL );  // _updateCallback
305    ADD_OBJECT_SERIALIZER( EventCallback, osg::StateSet::Callback, NULL );  // _eventCallback
306}
Note: See TracBrowser for help on using the browser.