Hi,

Simply you can't do it. They are completle different smart pointers. shared_ptr 
has outside reference counting and ref_ptr has inside reference counting in 
osg::Referenced class. Basically you would need to call ref() everytime you 
create or copy shared_ptr and call unref() (unref_nodelete()) every time 
shared_ptr is destroyed. And use custom deleter (void 
custom_del(osg::Referenced* referenced) { referenced->unref(); ??}. But I dont 
think it will work. Your main problem is that those pointer types have no idea 
about each other. If your osg::Referenced ref counter drop to zero, your object 
gets deleted, but you can still have some shared_ptr around with bad data and 
vice versa, if your shared_ptr gets deleted, you can still have some ref_ptrs 
in osg classes.

But what I can recommend is this:
subclass osg::Drawable (or Geometry) if you look into osg/Geometry.cpp all 
functions that accepts arrays (drawImplementation, acceptPrimitiveFunctor, 
computeBounds, ... ) can use float* values  ...basically glVertexPointer doesnt 
care about your array type. You can create your custom class without Array 
Pointers, but with your own shared_ptrs.


Code:

class MyDrawable : public osg::Drawable
{
MyDrawable(std::shared_ptr<MyCustomArrayType> arr) :
m_arr(arr)
{}
private:
std::shared_ptr<MyCustomArrayType> m_arr;
}




Then you would have to look at each virtual function of osg::Drawable and 
implement it (its not so hard, just take a look at osg::Geometry, how its done 
- but instead of osg::VecArrays you will use your Array). Of course you dont 
need to implement all of them.

Cheers,
Filip

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=66764#66764





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to