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

Revision 10982, 19.7 kB (checked in by robert, 5 years ago)

Renamed ObjectRegistry? to ObjectWrapperManager?, and replaced it's instance() method usage with assigning a ObjectWrapperManager?
to the osgDB::Registry. Added a osgDB::Registry::getObjectWrapperManager() for access of this object wrapper manager. This
change centralises the singleton management in osgDB.

Merged the osgDB::GlobalLookUpTable? functionality into ObjectWrapperManger? to keep down the number of singletons in use.

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(libName);
452        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
453            return findWrapper(name);
454    }
455    return NULL;
456}
457
458void ObjectWrapperManager::addCompressor( BaseCompressor* compressor )
459{
460    if ( !compressor ) return;
461
462    CompressorMap::iterator itr = _compressors.find( compressor->getName() );
463    if ( itr!=_compressors.end() )
464    {
465        osg::notify(osg::WARN) << "ObjectWrapperManager::addCompressor(): '" << compressor->getName()
466                               << "' already exists." << std::endl;
467    }
468    _compressors[compressor->getName()] = compressor;
469}
470
471void ObjectWrapperManager::removeCompressor( BaseCompressor* compressor )
472{
473    if ( !compressor ) return;
474
475    CompressorMap::iterator itr = _compressors.find( compressor->getName() );
476    if ( itr!=_compressors.end() ) _compressors.erase( itr );
477}
478
479BaseCompressor* ObjectWrapperManager::findCompressor( const std::string& name )
480{
481    CompressorMap::iterator itr = _compressors.find( name );
482    if ( itr!=_compressors.end() ) return itr->second.get();
483
484    // Load external libraries
485    std::string::size_type posDoubleColon = name.rfind("::");
486    if ( posDoubleColon!=std::string::npos )
487    {
488        std::string libName = std::string( name, 0, posDoubleColon );
489
490        std::string nodeKitLib = osgDB::Registry::instance()->createLibraryNameForNodeKit(libName);
491        if ( osgDB::Registry::instance()->loadLibrary(nodeKitLib)==osgDB::Registry::LOADED )
492            return findCompressor(name);
493
494        std::string pluginLib = osgDB::Registry::instance()->createLibraryNameForExtension(libName);
495        if ( osgDB::Registry::instance()->loadLibrary(pluginLib)==osgDB::Registry::LOADED )
496            return findCompressor(name);
497    }
498    return NULL;
499}
500
501////////////////////////////////////////////////////////////////////////////////////////////////////////
502//
503// RegisytrCompressorProxy
504//
505RegisterCompressorProxy::RegisterCompressorProxy( const std::string& name, BaseCompressor* compressor ):
506    _compressor(compressor)
507{
508    _compressor->setName( name );
509    Registry::instance()->getObjectWrapperManager()->addCompressor( _compressor.get() );
510}
511
512RegisterCompressorProxy::~RegisterCompressorProxy()
513{
514    Registry::instance()->getObjectWrapperManager()->removeCompressor( _compressor.get() );
515}
Note: See TracBrowser for help on using the browser.