Changeset 10941

Show
Ignore:
Timestamp:
01/11/10 17:09:18 (5 years ago)
Author:
robert
Message:

From Sukender, introduced usage of ref_ptr<> and local scoped_array to address more robust memory management.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/3ds/ReaderWriter3DS.cpp

    r10932 r10941  
    3636using namespace std; 
    3737using namespace osg; 
     38 
     39/// Implementation borrowed from boost and slightly modified 
     40template<class T> class scoped_array // noncopyable 
     41{ 
     42private: 
     43    T * px; 
     44    scoped_array(scoped_array const &); 
     45    scoped_array & operator=(scoped_array const &); 
     46    typedef scoped_array<T> this_type; 
     47 
     48    void operator==( scoped_array const& ) const; 
     49    void operator!=( scoped_array const& ) const; 
     50 
     51public: 
     52    typedef T element_type; 
     53    explicit scoped_array( T * p = 0 ) : px( p ) {} 
     54 
     55    ~scoped_array() { delete[] px; } 
     56 
     57    void reset(T * p = 0) { 
     58        assert( p == 0 || p != px ); // catch self-reset errors 
     59        this_type(p).swap(*this); 
     60    } 
     61 
     62    T & operator[](std::ptrdiff_t i) const // never throws 
     63    { 
     64        assert( px != 0 ); 
     65        assert( i >= 0 ); 
     66        return px[i]; 
     67    } 
     68 
     69    T * get() const // never throws 
     70    { 
     71        return px; 
     72    } 
     73 
     74    void swap(scoped_array & b) // never throws 
     75    { 
     76        T * tmp = b.px; 
     77        b.px = px; 
     78        px = tmp; 
     79    } 
     80}; 
     81 
    3882 
    3983 
     
    316360            FaceList& smoothFaceMap = sitr->second; 
    317361            osg::ref_ptr<osg::Drawable> drawable = createDrawable(mesh,smoothFaceMap,matrix); 
    318             if (drawable) 
     362            if (drawable.valid()) 
    319363            { 
    320364                if (stateSet) 
    321365                    drawable->setStateSet(stateSet); 
    322                 geode->addDrawable(drawable); 
     366                geode->addDrawable(drawable.get()); 
    323367            } 
    324368        } 
     
    327371    { 
    328372        osg::ref_ptr<osg::Drawable> drawable = createDrawable(mesh,faceList,matrix); 
    329         if (drawable) 
     373        if (drawable.valid()) 
    330374        { 
    331375            if (stateSet) 
    332376                drawable->setStateSet(stateSet); 
    333             geode->addDrawable(drawable); 
     377            geode->addDrawable(drawable.get()); 
    334378        } 
    335379    } 
     
    701745osg::Drawable* ReaderWriter3DS::ReaderObject::createDrawable(Lib3dsMesh *m,FaceList& faceList, const osg::Matrix * matrix) 
    702746{ 
    703  
    704     osg::Geometry* geom = new osg::Geometry; 
     747    osg::Geometry * geom = new osg::Geometry; 
    705748    unsigned int i; 
    706749 
     
    731774    // create vertices. 
    732775 
    733     osg::Vec3Array* osg_coords = new osg::Vec3Array(noVertex); 
    734     geom->setVertexArray(osg_coords); 
     776    osg::ref_ptr<osg::Vec3Array> osg_coords = new osg::Vec3Array(noVertex); 
     777    geom->setVertexArray(osg_coords.get()); 
    735778 
    736779    for (i=0; i<m->nvertices; ++i) 
     
    753796    if (m->texcos) 
    754797    { 
    755         osg::Vec2Array* osg_tcoords = new osg::Vec2Array(noVertex); 
    756         geom->setTexCoordArray(0,osg_tcoords); 
     798        osg::ref_ptr<osg::Vec2Array> osg_tcoords = new osg::Vec2Array(noVertex); 
     799        geom->setTexCoordArray(0, osg_tcoords.get()); 
    757800        for (i=0; i<m->nvertices; ++i) 
    758801        { 
     
    768811        //Lib3dsVector * normals = new Lib3dsVector[m->nfaces*3]; 
    769812        //lib3ds_mesh_calculate_vertex_normals(m, normals); 
    770         Lib3dsVector * normals = new Lib3dsVector[m->nfaces]; 
    771         lib3ds_mesh_calculate_face_normals(m, normals); 
    772         osg::Vec3Array* osg_normals = new osg::Vec3Array(noVertex); 
     813        scoped_array<Lib3dsVector> normals( new Lib3dsVector[m->nfaces] );        // Temporary array 
     814        lib3ds_mesh_calculate_face_normals(m, normals.get()); 
     815        osg::ref_ptr<osg::Vec3Array> osg_normals = new osg::Vec3Array(noVertex); 
    773816 
    774817        // initialize normal list to zero's. 
     
    791834        } 
    792835 
    793         geom->setNormalArray(osg_normals); 
     836        geom->setNormalArray(osg_normals.get()); 
    794837        geom->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); 
    795  
    796838    } 
    797839    else 
    798840    { 
    799         Lib3dsVector * normals = new Lib3dsVector[m->nfaces]; 
     841        scoped_array<Lib3dsVector> normals ( new Lib3dsVector[m->nfaces] ); 
    800842        lib3ds_mesh_calculate_face_normals(m, normals); 
    801         osg::Vec3Array* osg_normals = new osg::Vec3Array(faceList.size()); 
     843        osg::ref_ptr<osg::Vec3Array> osg_normals = new osg::Vec3Array(faceList.size()); 
    802844        osg::Vec3Array::iterator normal_itr = osg_normals->begin(); 
    803845        for (fitr=faceList.begin(); 
     
    810852            *(normal_itr++) = osgNormal; 
    811853        } 
    812         geom->setNormalArray(osg_normals); 
     854        geom->setNormalArray(osg_normals.get()); 
    813855        geom->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE); 
    814856    } 
    815857 
    816     osg::Vec4ubArray* osg_colors = new osg::Vec4ubArray(1); 
     858    osg::ref_ptr<osg::Vec4ubArray> osg_colors = new osg::Vec4ubArray(1); 
    817859    (*osg_colors)[0].set(255,255,255,255); 
    818     geom->setColorArray(osg_colors); 
     860    geom->setColorArray(osg_colors.get()); 
    819861    geom->setColorBinding(osg::Geometry::BIND_OVERALL); 
    820  
    821862 
    822863    // create primitives 
    823864    int numIndices = faceList.size()*3; 
    824     DrawElementsUShort* elements = new osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLES,numIndices); 
     865    osg::ref_ptr<DrawElementsUShort> elements = new osg::DrawElementsUShort(osg::PrimitiveSet::TRIANGLES,numIndices); 
    825866    DrawElementsUShort::iterator index_itr = elements->begin(); 
    826867 
     
    830871    { 
    831872        Lib3dsFace& face = m->faces[*fitr]; 
    832  
    833873        *(index_itr++) = orig2NewMapping[face.index[0]]; 
    834874        *(index_itr++) = orig2NewMapping[face.index[1]]; 
     
    836876    } 
    837877 
    838     geom->addPrimitiveSet(elements); 
     878    geom->addPrimitiveSet(elements.get()); 
    839879 
    840880#if 0 
     
    10351075        local_opt->getDatabasePathList().push_front(osgDB::getFilePath(fileName)); 
    10361076 
    1037         if (!createFileObject(node, file3ds, fileName, local_opt)) ok = false; 
     1077        if (!createFileObject(node, file3ds, fileName, local_opt.get())) ok = false; 
    10381078        if (ok && !lib3ds_file_save(file3ds, fileName.c_str())) ok = false; 
    10391079    } catch (...) { 
     
    10701110        local_opt->getDatabasePathList().push_front(osgDB::getFilePath(optFileName)); 
    10711111 
    1072         if (!createFileObject(node, file3ds, optFileName, local_opt)) ok = false; 
     1112        if (!createFileObject(node, file3ds, optFileName, local_opt.get())) ok = false; 
    10731113        if (ok && !lib3ds_file_write(file3ds, &io)) ok = false; 
    10741114