root/OpenSceneGraph/trunk/src/osgDB/ObjectWrapper.cpp @ 11018

Revision 11018, 20.2 kB (checked in by robert, 4 years ago)

From Wang Rui, "Changes:

1. Rewrite the reading/writing exception handlers to work like the ive
plugin exceptions.
2. Write a header writing/checking function in ReaderWriterOSG2.cpp,
which may help decide if the stream is ascii or binary. The
readInputIterator() function will return null pointer if the input
file is nither osgb nor osgt format, which indicates that the old .osg
format could be used here, in case we've merged the two plugins
together.
3. Add a new ForceReadingImage? option in the InputStream?, which will
allocate an empty image object with the filename if specifed external
image file is missed. It may be useful for format converting in some
cases.
4. Add new osgParticle wrappers, as well as some modification to the
osgParticle headers, for instance, change isEnabled() to getEnabled().
5. Some fixes to the osg serialization wrappers."

Line 
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#include <osg/Notify>
16#include <osg/BlendFunc>
17#include <osg/ClampColor>
18#include <osg/Fog>
19#include <osg/FragmentProgram>
20#include <osg/GL2Extensions>
21#include <osg/PointSprite>
22#include <osg/StateSet>
23#include <osg/StencilTwoSided>
24#include <osg/TexEnvCombine>
25#include <osg/Texture>
26#include <osg/TextureCubeMap>
27#include <osg/TextureRectangle>
28#include <osg/VertexProgram>
29
30#include <osgDB/Options>
31#include <osgDB/DataTypes>
32#include <osgDB/ObjectWrapper>
33#include <osgDB/Registry>
34
35// pull in OSG headers to just introduce their GL defines for GL3/GLES compatibility
36#include <osg/AlphaFunc>
37#include <osg/Material>
38#include <osg/LineStipple>
39#include <osg/PolygonStipple>
40#include <osg/Point>
41#include <osg/TexGen>
42#include <osg/ClipPlane>
43#include <osg/Fog>
44
45#include <sstream>
46
47using namespace osgDB;
48
49void osgDB::split( const std::string& src, StringList& list, char separator )
50{
51    std::string::size_type start = src.find_first_not_of(separator);
52    while ( start!=std::string::npos )
53    {
54        std::string::size_type end = src.find_first_of(separator, start);
55        if ( end!=std::string::npos )
56        {
57            list.push_back( std::string(src, start, end-start) );
58            start = src.find_first_not_of(separator, end);
59        }
60        else
61        {
62            list.push_back( std::string(src, start, src.size()-start) );
63            start = end;
64        }
65    }
66}
67
68////////////////////////////////////////////////////////////////////////////////////////////////////////
69//
70// ObjectWrapper
71//
72ObjectWrapper::ObjectWrapper( osg::Object* proto, const std::string& name,
73                              const std::string& associates )
74:   osg::Referenced(),
75    _proto(proto), _name(name)
76{
77    split( associates, _associates );
78}
79
80bool ObjectWrapper::read( InputStream& is, osg::Object& obj )
81{
82    bool readOK = true;
83    for ( SerializerList::iterator itr=_serializers.begin();
84          itr!=_serializers.end(); ++itr )
85    {
86        if ( (*itr)->read(is, obj) ) continue;
87        osg::notify(osg::WARN) << "ObjectWrapper::read(): Error reading property "
88                               << _name << "::" << (*itr)->getName() << std::endl;
89        readOK = false;
90    }
91    return readOK;
92}
93
94bool ObjectWrapper::write( OutputStream& os, const osg::Object& obj )
95{
96    bool writeOK = true;
97    for ( SerializerList::iterator itr=_serializers.begin();
98          itr!=_serializers.end(); ++itr )
99    {
100        if ( (*itr)->write(os, obj) ) continue;
101        osg::notify(osg::WARN) << "ObjectWrapper::write(): Error writing property "
102                               << _name << "::" << (*itr)->getName() << std::endl;
103        writeOK = false;
104    }
105    return writeOK;
106}
107
108bool ObjectWrapper::readSchema( const StringList& properties )
109{
110    if ( !_backupSerializers.size() )
111        _backupSerializers = _serializers;
112    _serializers.clear();
113   
114    unsigned int size = properties.size();
115    unsigned int serializersSize = _backupSerializers.size();
116    for ( unsigned int i=0; i<size; ++i )
117    {
118        if ( serializersSize<i )
119        {
120            osg::notify(osg::WARN) << "ObjectWrapper::readSchema(): Wrapper " << _name
121                                   << ": Incompatible serializers size" << std::endl;
122            break;
123        }
124       
125        const std::string& prop = properties[i];
126        if ( prop==_backupSerializers[i]->getName() )
127        {
128            _serializers.push_back( _backupSerializers[i] );
129        }
130        else
131        {
132            bool hasSerializer = false;
133            for ( SerializerList::iterator itr=_backupSerializers.begin();
134                  itr!=_backupSerializers.end(); ++itr )
135            {
136                if ( prop!=(*itr)->getName() ) continue;
137                _serializers.push_back( *itr );
138                hasSerializer = true;
139            }
140            if ( !hasSerializer )
141            {
142                osg::notify(osg::WARN) << "ObjectWrapper::readSchema(): Wrapper " << _name
143                                       << ": Unknown property " << prop << std::endl;
144            }
145        }
146    }
147    return size==_serializers.size();
148}
149
150void ObjectWrapper::writeSchema( StringList& properties )
151{
152    for ( SerializerList::iterator itr=_serializers.begin();
153          itr!=_serializers.end(); ++itr )
154    {
155        properties.push_back( (*itr)->getName() );
156    }
157}
158
159////////////////////////////////////////////////////////////////////////////////////////////////////////
160//
161// RegisterWrapperProxy
162//
163RegisterWrapperProxy::RegisterWrapperProxy( osg::Object* proto, const std::string& name,
164                        const std::string& associates, AddPropFunc func )
165{
166    _wrapper = new ObjectWrapper( proto, name, associates );
167    if ( func ) (*func)( _wrapper.get() );
168    Registry::instance()->getObjectWrapperManager()->addWrapper( _wrapper.get() );
169}
170
171RegisterWrapperProxy::~RegisterWrapperProxy()
172{
173    Registry::instance()->getObjectWrapperManager()->removeWrapper( _wrapper.get() );
174}
175
176////////////////////////////////////////////////////////////////////////////////////////////////////////
177//
178// ObjectWrapperManager
179//
180////////////////////////////////////////////////////////////////////////////////////////////////////////
181//
182// GlobalLookupTable
183//
184ObjectWrapperManager::ObjectWrapperManager()
185{
186    IntLookup& glTable = _globalMap["GL"];
187
188    // Modes
189    glTable.add( "GL_ALPHA_TEST", GL_ALPHA_TEST );
190    glTable.add( "GL_BLEND", GL_BLEND );
191    glTable.add( "GL_COLOR_LOGIC_OP", GL_COLOR_LOGIC_OP );
192    glTable.add( "GL_COLOR_MATERIAL", GL_COLOR_MATERIAL );
193    glTable.add( "GL_CULL_FACE", GL_CULL_FACE );
194    glTable.add( "GL_DEPTH_TEST", GL_DEPTH_TEST );
195    glTable.add( "GL_FOG", GL_FOG );
196    glTable.add( "GL_FRAGMENT_PROGRAM_ARB", GL_FRAGMENT_PROGRAM_ARB );
197    glTable.add( "GL_LINE_STIPPLE", GL_LINE_STIPPLE );
198    glTable.add( "GL_POINT_SMOOTH", GL_POINT_SMOOTH );
199    glTable.add( "GL_POINT_SPRITE_ARB", GL_POINT_SPRITE_ARB );
200    glTable.add( "GL_POLYGON_OFFSET_FILL", GL_POLYGON_OFFSET_FILL );
201    glTable.add( "GL_POLYGON_OFFSET_LINE", GL_POLYGON_OFFSET_LINE );
202    glTable.add( "GL_POLYGON_OFFSET_POINT", GL_POLYGON_OFFSET_POINT );
203    glTable.add( "GL_POLYGON_STIPPLE", GL_POLYGON_STIPPLE );
204    glTable.add( "GL_SCISSOR_TEST", GL_SCISSOR_TEST);
205    glTable.add( "GL_STENCIL_TEST", GL_STENCIL_TEST );
206    glTable.add( "GL_STENCIL_TEST_TWO_SIDE", GL_STENCIL_TEST_TWO_SIDE );
207    glTable.add( "GL_VERTEX_PROGRAM_ARB", GL_VERTEX_PROGRAM_ARB );
208
209    glTable.add( "GL_COLOR_SUM", GL_COLOR_SUM );
210    glTable.add( "GL_LIGHTING", GL_LIGHTING );
211    glTable.add( "GL_NORMALIZE", GL_NORMALIZE );
212    glTable.add( "GL_RESCALE_NORMAL", GL_RESCALE_NORMAL );
213
214    glTable.add( "GL_TEXTURE_1D", GL_TEXTURE_1D );
215    glTable.add( "GL_TEXTURE_2D", GL_TEXTURE_2D );
216    glTable.add( "GL_TEXTURE_3D", GL_TEXTURE_3D );
217    glTable.add( "GL_TEXTURE_CUBE_MAP", GL_TEXTURE_CUBE_MAP );
218    glTable.add( "GL_TEXTURE_RECTANGLE", GL_TEXTURE_RECTANGLE );
219    glTable.add( "GL_TEXTURE_GEN_Q", GL_TEXTURE_GEN_Q );
220    glTable.add( "GL_TEXTURE_GEN_R", GL_TEXTURE_GEN_R );
221    glTable.add( "GL_TEXTURE_GEN_S", GL_TEXTURE_GEN_S );
222    glTable.add( "GL_TEXTURE_GEN_T", GL_TEXTURE_GEN_T );
223
224    glTable.add( "GL_CLIP_PLANE0", GL_CLIP_PLANE0 );
225    glTable.add( "GL_CLIP_PLANE1", GL_CLIP_PLANE1 );
226    glTable.add( "GL_CLIP_PLANE2", GL_CLIP_PLANE2 );
227    glTable.add( "GL_CLIP_PLANE3", GL_CLIP_PLANE3 );
228    glTable.add( "GL_CLIP_PLANE4", GL_CLIP_PLANE4 );
229    glTable.add( "GL_CLIP_PLANE5", GL_CLIP_PLANE5 );
230
231    glTable.add( "GL_LIGHT0", GL_LIGHT0 );
232    glTable.add( "GL_LIGHT1", GL_LIGHT1 );
233    glTable.add( "GL_LIGHT2", GL_LIGHT2 );
234    glTable.add( "GL_LIGHT3", GL_LIGHT3 );
235    glTable.add( "GL_LIGHT4", GL_LIGHT4 );
236    glTable.add( "GL_LIGHT5", GL_LIGHT5 );
237    glTable.add( "GL_LIGHT6", GL_LIGHT6 );
238    glTable.add( "GL_LIGHT7", GL_LIGHT7 );
239
240    // Functions
241    glTable.add( "NEVER", GL_NEVER );
242    glTable.add( "LESS", GL_LESS );
243    glTable.add( "EQUAL", GL_EQUAL );
244    glTable.add( "LEQUAL", GL_LEQUAL );
245    glTable.add( "GREATER", GL_GREATER );
246    glTable.add( "NOTEQUAL", GL_NOTEQUAL );
247    glTable.add( "GEQUAL", GL_GEQUAL );
248    glTable.add( "ALWAYS", GL_ALWAYS );
249
250    // Texture environment states
251    glTable.add( "REPLACE", GL_REPLACE );
252    glTable.add( "MODULATE", GL_MODULATE );
253    glTable.add( "ADD", GL_ADD );
254    glTable.add( "ADD_SIGNED", GL_ADD_SIGNED_ARB );
255    glTable.add( "INTERPOLATE", GL_INTERPOLATE_ARB );
256    glTable.add( "SUBTRACT", GL_SUBTRACT_ARB );
257    glTable.add( "DOT3_RGB", GL_DOT3_RGB_ARB );
258    glTable.add( "DOT3_RGBA", GL_DOT3_RGBA_ARB );
259
260    glTable.add( "CONSTANT", GL_CONSTANT_ARB );
261    glTable.add( "PRIMARY_COLOR", GL_PRIMARY_COLOR_ARB );
262    glTable.add( "PREVIOUS", GL_PREVIOUS_ARB );
263    glTable.add( "TEXTURE", GL_TEXTURE );
264    glTable.add( "TEXTURE0", GL_TEXTURE0 );
265    glTable.add( "TEXTURE1", GL_TEXTURE0+1 );
266    glTable.add( "TEXTURE2", GL_TEXTURE0+2 );
267    glTable.add( "TEXTURE3", GL_TEXTURE0+3 );
268    glTable.add( "TEXTURE4", GL_TEXTURE0+4 );
269    glTable.add( "TEXTURE5", GL_TEXTURE0+5 );
270    glTable.add( "TEXTURE6", GL_TEXTURE0+6 );
271    glTable.add( "TEXTURE7", GL_TEXTURE0+7 );
272
273    // Texture clamp modes
274    glTable.add( "CLAMP", GL_CLAMP );
275    glTable.add( "CLAMP_TO_EDGE", GL_CLAMP_TO_EDGE );
276    glTable.add( "CLAMP_TO_BORDER", GL_CLAMP_TO_BORDER_ARB );
277    glTable.add( "REPEAT", GL_REPEAT );
278    glTable.add( "MIRROR", GL_MIRRORED_REPEAT_IBM );
279
280    // Texture filter modes
281    glTable.add( "LINEAR", GL_LINEAR );
282    glTable.add( "LINEAR_MIPMAP_LINEAR", GL_LINEAR_MIPMAP_LINEAR );
283    glTable.add( "LINEAR_MIPMAP_NEAREST", GL_LINEAR_MIPMAP_NEAREST );
284    glTable.add( "NEAREST", GL_NEAREST );
285    glTable.add( "NEAREST_MIPMAP_LINEAR", GL_NEAREST_MIPMAP_LINEAR );
286    glTable.add( "NEAREST_MIPMAP_NEAREST", GL_NEAREST_MIPMAP_NEAREST );
287
288    // Texture formats
289    glTable.add( "GL_INTENSITY", GL_INTENSITY );
290    glTable.add( "GL_LUMINANCE", GL_LUMINANCE );
291    glTable.add( "GL_ALPHA", GL_ALPHA );
292    glTable.add( "GL_LUMINANCE_ALPHA", GL_LUMINANCE_ALPHA );
293    glTable.add( "GL_RGB", GL_RGB );
294    glTable.add( "GL_RGBA", GL_RGBA );
295    glTable.add( "GL_COMPRESSED_ALPHA_ARB", GL_COMPRESSED_ALPHA_ARB );
296    glTable.add( "GL_COMPRESSED_LUMINANCE_ARB", GL_COMPRESSED_LUMINANCE_ARB );
297    glTable.add( "GL_COMPRESSED_INTENSITY_ARB", GL_COMPRESSED_INTENSITY_ARB );
298    glTable.add( "GL_COMPRESSED_LUMINANCE_ALPHA_ARB", GL_COMPRESSED_LUMINANCE_ALPHA_ARB );
299    glTable.add( "GL_COMPRESSED_RGB_ARB", GL_COMPRESSED_RGB_ARB );
300    glTable.add( "GL_COMPRESSED_RGBA_ARB", GL_COMPRESSED_RGBA_ARB );
301    glTable.add( "GL_COMPRESSED_RGB_S3TC_DXT1_EXT", GL_COMPRESSED_RGB_S3TC_DXT1_EXT );
302    glTable.add( "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT", GL_COMPRESSED_RGBA_S3TC_DXT1_EXT );
303    glTable.add( "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT", GL_COMPRESSED_RGBA_S3TC_DXT3_EXT );
304    glTable.add( "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT", GL_COMPRESSED_RGBA_S3TC_DXT5_EXT );
305
306    // Texture source types
307    glTable.add( "GL_BYTE", GL_BYTE );
308    glTable.add( "GL_SHORT", GL_SHORT );
309    glTable.add( "GL_INT", GL_INT );
310    glTable.add( "GL_FLOAT", GL_FLOAT );
311    glTable.add( "GL_DOUBLE", GL_DOUBLE );
312    glTable.add( "GL_UNSIGNED_BYTE", GL_UNSIGNED_BYTE );
313    glTable.add( "GL_UNSIGNED_SHORT", GL_UNSIGNED_SHORT );
314    glTable.add( "GL_UNSIGNED_INT", GL_UNSIGNED_INT );
315
316    // Blend values
317    glTable.add( "DST_ALPHA", GL_DST_ALPHA );
318    glTable.add( "DST_COLOR", GL_DST_COLOR );
319    glTable.add( "ONE", GL_ONE );
320    glTable.add( "ONE_MINUS_DST_ALPHA", GL_ONE_MINUS_DST_ALPHA );
321    glTable.add( "ONE_MINUS_DST_COLOR", GL_ONE_MINUS_DST_COLOR );
322    glTable.add( "ONE_MINUS_SRC_ALPHA", GL_ONE_MINUS_SRC_ALPHA );
323    glTable.add( "ONE_MINUS_SRC_COLOR", GL_ONE_MINUS_SRC_COLOR );
324    glTable.add( "SRC_ALPHA", GL_SRC_ALPHA );
325    glTable.add( "SRC_ALPHA_SATURATE", GL_SRC_ALPHA_SATURATE );
326    glTable.add( "SRC_COLOR", GL_SRC_COLOR );
327    glTable.add( "CONSTANT_COLOR", GL_CONSTANT_COLOR );
328    glTable.add( "ONE_MINUS_CONSTANT_COLOR", GL_ONE_MINUS_CONSTANT_COLOR );
329    glTable.add( "CONSTANT_ALPHA", GL_CONSTANT_ALPHA );
330    glTable.add( "ONE_MINUS_CONSTANT_ALPHA", GL_ONE_MINUS_CONSTANT_ALPHA );
331    glTable.add( "ZERO", GL_ZERO );
332
333    // Fog coordinate sources
334    glTable.add( "COORDINATE", GL_FOG_COORDINATE );
335    glTable.add( "DEPTH", GL_FRAGMENT_DEPTH );
336
337    // Hint targets
338    glTable.add( "FOG_HINT", GL_FOG_HINT );
339    glTable.add( "GENERATE_MIPMAP_HINT", GL_GENERATE_MIPMAP_HINT_SGIS );
340    glTable.add( "LINE_SMOOTH_HINT", GL_LINE_SMOOTH_HINT );
341    glTable.add( "PERSPECTIVE_CORRECTION_HINT", GL_PERSPECTIVE_CORRECTION_HINT );
342    glTable.add( "POINT_SMOOTH_HINT", GL_POINT_SMOOTH_HINT );
343    glTable.add( "POLYGON_SMOOTH_HINT", GL_POLYGON_SMOOTH_HINT );
344    glTable.add( "TEXTURE_COMPRESSION_HINT", GL_TEXTURE_COMPRESSION_HINT_ARB );
345    glTable.add( "FRAGMENT_SHADER_DERIVATIVE_HINT", GL_FRAGMENT_SHADER_DERIVATIVE_HINT );
346
347    // Polygon modes
348    glTable.add( "POINT", GL_POINT );
349    glTable.add( "LINE", GL_LINE );
350    glTable.add( "FILL", GL_FILL );
351
352    // Misc
353    glTable.add( "BACK", GL_BACK );
354    glTable.add( "FRONT", GL_FRONT );
355    glTable.add( "FRONT_AND_BACK", GL_FRONT_AND_BACK );
356    glTable.add( "FIXED_ONLY", GL_FIXED_ONLY );
357    glTable.add( "FASTEST", GL_FASTEST );
358    glTable.add( "NICEST", GL_NICEST );
359    glTable.add( "DONT_CARE", GL_DONT_CARE );
360
361    IntLookup& arrayTable = _globalMap["ArrayType"];
362
363    arrayTable.add( "ByteArray", ID_BYTE_ARRAY );
364    arrayTable.add( "UByteArray", ID_UBYTE_ARRAY );
365    arrayTable.add( "ShortArray", ID_SHORT_ARRAY );
366    arrayTable.add( "UShortArray", ID_USHORT_ARRAY );
367    arrayTable.add( "IntArray", ID_INT_ARRAY );
368    arrayTable.add( "UIntArray", ID_UINT_ARRAY );
369    arrayTable.add( "FloatArray", ID_FLOAT_ARRAY );
370    arrayTable.add( "DoubleArray", ID_DOUBLE_ARRAY );
371
372    arrayTable.add( "Vec2bArray", ID_VEC2B_ARRAY );
373    arrayTable.add( "Vec3bArray", ID_VEC3B_ARRAY );
374    arrayTable.add( "Vec4bArray", ID_VEC4B_ARRAY );
375    arrayTable.add( "Vec4ubArray", ID_VEC4UB_ARRAY );
376    arrayTable.add( "Vec2sArray", ID_VEC2S_ARRAY );
377    arrayTable.add( "Vec3sArray", ID_VEC3S_ARRAY );
378    arrayTable.add( "Vec4sArray", ID_VEC4S_ARRAY );
379    arrayTable.add( "Vec2fArray", ID_VEC2_ARRAY );
380    arrayTable.add( "Vec3fArray", ID_VEC3_ARRAY );
381    arrayTable.add( "Vec4fArray", ID_VEC4_ARRAY );
382    arrayTable.add( "Vec2dArray", ID_VEC2D_ARRAY );
383    arrayTable.add( "Vec3dArray", ID_VEC3D_ARRAY );
384    arrayTable.add( "Vec4dArray", ID_VEC4D_ARRAY );
385
386    IntLookup& primitiveTable = _globalMap["PrimitiveType"];
387
388    primitiveTable.add( "DrawArrays", ID_DRAWARRAYS );
389    primitiveTable.add( "DrawArraysLength", ID_DRAWARRAY_LENGTH );
390    primitiveTable.add( "DrawElementsUByte", ID_DRAWELEMENTS_UBYTE );
391    primitiveTable.add( "DrawElementsUShort", ID_DRAWELEMENTS_USHORT );
392    primitiveTable.add( "DrawElementsUInt", ID_DRAWELEMENTS_UINT );
393
394    primitiveTable.add( "GL_POINTS", GL_POINTS );
395    primitiveTable.add( "GL_LINES", GL_LINES );
396    primitiveTable.add( "GL_LINE_STRIP", GL_LINE_STRIP );
397    primitiveTable.add( "GL_LINE_LOOP", GL_LINE_LOOP );
398    primitiveTable.add( "GL_TRIANGLES", GL_TRIANGLES );
399    primitiveTable.add( "GL_TRIANGLE_STRIP", GL_TRIANGLE_STRIP );
400    primitiveTable.add( "GL_TRIANGLE_FAN", GL_TRIANGLE_FAN );
401    primitiveTable.add( "GL_QUADS", GL_QUADS );
402    primitiveTable.add( "GL_QUAD_STRIP", GL_QUAD_STRIP );
403    primitiveTable.add( "GL_POLYGON", GL_POLYGON );
404    primitiveTable.add( "GL_LINES_ADJACENCY_EXT", GL_LINES_ADJACENCY_EXT );
405    primitiveTable.add( "GL_LINE_STRIP_ADJACENCY_EXT", GL_LINE_STRIP_ADJACENCY_EXT );
406    primitiveTable.add( "GL_TRIANGLES_ADJACENCY_EXT", GL_TRIANGLES_ADJACENCY_EXT );
407    primitiveTable.add( "GL_TRIANGLE_STRIP_ADJACENCY_EXT", GL_TRIANGLE_STRIP_ADJACENCY_EXT );
408}
409
410ObjectWrapperManager::~ObjectWrapperManager()
411{
412}
413
414
415void ObjectWrapperManager::addWrapper( ObjectWrapper* wrapper )
416{
417    if ( !wrapper ) return;
418
419    WrapperMap::iterator itr = _wrappers.find( wrapper->getName() );
420    if ( itr!=_wrappers.end() )
421    {
422        osg::notify(osg::WARN) << "ObjectWrapperManager::addWrapper(): '" << wrapper->getName()
423                               << "' already exists." << std::endl;
424    }
425    _wrappers[wrapper->getName()] = wrapper;
426}
427
428void ObjectWrapperManager::removeWrapper( ObjectWrapper* wrapper )
429{
430    if ( !wrapper ) return;
431
432    WrapperMap::iterator itr = _wrappers.find( wrapper->getName() );
433    if ( itr!=_wrappers.end() ) _wrappers.erase( itr );
434}
435
436ObjectWrapper* ObjectWrapperManager::findWrapper( const std::string& name )
437{
438    WrapperMap::iterator itr = _wrappers.find( name );
439    if ( itr!=_wrappers.end() ) return itr->second.get();
440
441    // Load external libraries
442    std::string::size_type posDoubleColon = name.rfind("::");
443    if ( posDoubleColon!=std::string::npos )
444    {
445        std::string libName = std::string( name, 0, posDoubleColon );
446
447        std::string nodeKitLib = osgDB::Registry::instance()->createLibraryNameForNodeKit(libName);
448        if ( osgDB::Registry::instance()->loadLibrary(nodeKitLib)==osgDB::Registry::LOADED )
449            return findWrapper(name);
450
451        std::string pluginLib = osgDB::Registry::instance()->createLibraryNameForExtension(std::string("serializers_")+libName);
452        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
453            return findWrapper(name);
454
455        pluginLib = osgDB::Registry::instance()->createLibraryNameForExtension(libName);
456        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
457            return findWrapper(name);
458    }
459    return NULL;
460}
461
462void ObjectWrapperManager::addCompressor( BaseCompressor* compressor )
463{
464    if ( !compressor ) return;
465
466    CompressorMap::iterator itr = _compressors.find( compressor->getName() );
467    if ( itr!=_compressors.end() )
468    {
469        osg::notify(osg::WARN) << "ObjectWrapperManager::addCompressor(): '" << compressor->getName()
470                               << "' already exists." << std::endl;
471    }
472    _compressors[compressor->getName()] = compressor;
473}
474
475void ObjectWrapperManager::removeCompressor( BaseCompressor* compressor )
476{
477    if ( !compressor ) return;
478
479    CompressorMap::iterator itr = _compressors.find( compressor->getName() );
480    if ( itr!=_compressors.end() ) _compressors.erase( itr );
481}
482
483BaseCompressor* ObjectWrapperManager::findCompressor( const std::string& name )
484{
485    CompressorMap::iterator itr = _compressors.find( name );
486    if ( itr!=_compressors.end() ) return itr->second.get();
487
488    // Load external libraries
489    std::string::size_type posDoubleColon = name.rfind("::");
490    if ( posDoubleColon!=std::string::npos )
491    {
492        std::string libName = std::string( name, 0, posDoubleColon );
493
494        std::string nodeKitLib = osgDB::Registry::instance()->createLibraryNameForNodeKit(libName);
495        if ( osgDB::Registry::instance()->loadLibrary(nodeKitLib)==osgDB::Registry::LOADED )
496            return findCompressor(name);
497
498        std::string pluginLib = osgDB::Registry::instance()->createLibraryNameForExtension(std::string("compressor_")+libName);
499        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
500            return findCompressor(name);
501
502        pluginLib = osgDB::Registry::instance()->createLibraryNameForExtension(libName);
503        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
504            return findCompressor(name);
505    }
506    return NULL;
507}
508
509////////////////////////////////////////////////////////////////////////////////////////////////////////
510//
511// RegisytrCompressorProxy
512//
513RegisterCompressorProxy::RegisterCompressorProxy( const std::string& name, BaseCompressor* compressor ):
514    _compressor(compressor)
515{
516    _compressor->setName( name );
517    Registry::instance()->getObjectWrapperManager()->addCompressor( _compressor.get() );
518}
519
520RegisterCompressorProxy::~RegisterCompressorProxy()
521{
522    Registry::instance()->getObjectWrapperManager()->removeCompressor( _compressor.get() );
523}
Note: See TracBrowser for help on using the browser.