Refactored the UserDataContainer so that the osg::UserDataContainer is now a pure virtual base class,

with a osg::DefaultUserDataContainer subclassed from this.  The user object access methods have now all
been moved from osg::Object into the UserDataContainer class, except for the set/getUserData() methods
that are left in osg::Object for backwards compatibility, and the description list access methods have
been moved back into osg::Node.

main UserObject access methods are now all def
This commit is contained in:
Robert Osfield
2011-06-09 12:57:14 +00:00
parent 1016092720
commit 22bc0391c7
10 changed files with 317 additions and 234 deletions

View File

@@ -32,25 +32,25 @@ namespace MyNamespace
{
/** Provide an simple example of customizing the default UserDataContainer.*/
class MyUserDataContainer : public osg::UserDataContainer
class MyUserDataContainer : public osg::DefaultUserDataContainer
{
public:
MyUserDataContainer() {}
MyUserDataContainer(const MyUserDataContainer& udc, const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
UserDataContainer(udc, copyop) {}
DefaultUserDataContainer(udc, copyop) {}
META_Object(MyNamespace, MyUserDataContainer)
virtual Object* getUserObject(unsigned int i)
{
OSG_NOTICE<<"MyUserDataContainer::getUserObject("<<i<<")"<<std::endl;
return osg::UserDataContainer::getUserObject(i);
return osg::DefaultUserDataContainer::getUserObject(i);
}
virtual const Object* getUserObject(unsigned int i) const
{
OSG_NOTICE<<"MyUserDataContainer::getUserObject("<<i<<") const"<<std::endl;
return osg::UserDataContainer::getUserObject(i);
return osg::DefaultUserDataContainer::getUserObject(i);
}
@@ -64,7 +64,7 @@ class MyUserDataContainer : public osg::UserDataContainer
REGISTER_OBJECT_WRAPPER( MyUserDataContainer,
new MyNamespace::MyUserDataContainer,
MyNamespace::MyUserDataContainer,
"osg::Object osg::UserDataContainer MyNamespace::MyUserDataContainer" )
"osg::Object osg::UserDataContainer osg::DefaultUserDataContainer MyNamespace::MyUserDataContainer" )
{
}
@@ -160,17 +160,21 @@ void testResults(osg::Node* node)
OSG_NOTICE<<"Height not found"<<std::endl;
}
OSG_NOTICE<<"node->getNumUserObjects()="<<node->getNumUserObjects()<<std::endl;
for(unsigned int i=0; i<node->getNumUserObjects(); ++i)
osg::UserDataContainer* udc = node->getUserDataContainer();
if (udc)
{
MyGetValueVisitor mgvv;
osg::Object* userObject = node->getUserObject(i);
osg::ValueObject* valueObject = dynamic_cast<osg::ValueObject*>(userObject);
OSG_NOTICE<<"userObject="<<userObject<<", className="<<userObject->className()<<", getName()="<<userObject->getName()<<" valueObject="<<valueObject<<" getNumeric "<<getNumeric<float>(userObject)<<" ";
if (valueObject) valueObject->get(mgvv);
OSG_NOTICE<<std::endl;
OSG_NOTICE<<"udc->getNumUserObjects()="<<udc->getNumUserObjects()<<std::endl;
for(unsigned int i=0; i<udc->getNumUserObjects(); ++i)
{
MyGetValueVisitor mgvv;
osg::Object* userObject = udc->getUserObject(i);
osg::ValueObject* valueObject = dynamic_cast<osg::ValueObject*>(userObject);
OSG_NOTICE<<"userObject="<<userObject<<", className="<<userObject->className()<<", getName()="<<userObject->getName()<<" valueObject="<<valueObject<<" getNumeric "<<getNumeric<float>(userObject)<<" ";
if (valueObject) valueObject->get(mgvv);
OSG_NOTICE<<std::endl;
}
}
OSG_NOTICE<<std::endl<<std::endl;
}
@@ -196,7 +200,7 @@ int main(int argc, char** argv)
osg::ref_ptr<osg::Drawable> drawable = new osg::Geometry;
drawable->setName("myDrawable");
node->addUserObject(drawable.get());
node->getOrCreateUserDataContainer()->addUserObject(drawable.get());
node->setUserValue("fred",12);
node->setUserValue("john",1.1);