Improved support for setting/getting properties via the osg::UserDataContainer.

This commit is contained in:
Robert Osfield
2014-02-11 18:07:37 +00:00
parent e3a003a08f
commit 2797e8cb7c
4 changed files with 60 additions and 8 deletions

View File

@@ -187,6 +187,15 @@ protected:
ObjectList _objectList;
};
/** Convinience function for getting the User Object associated with specificed name from an Object's UserDataContainer.*/
inline Object* getUserObject(osg::Object* object, const std::string& name)
{
osg::UserDataContainer* udc = object->getUserDataContainer();
return udc ? udc->getUserObject(name) : 0;
}
}
#endif

View File

@@ -247,13 +247,38 @@ typedef osg::Object* ObjectPtr;
template<>
inline bool PropertyInterface::getProperty(const osg::Object* object, const std::string& propertyName, ObjectPtr& value)
{
return copyPropertyObjectFromObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>());
if (copyPropertyObjectFromObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>())) return true;
else
{
OSG_NOTICE<<"PropertyInterface::getProperty("<<propertyName<<", "<<value->className()<<") Checking UserDataContainer for object ptr"<<std::endl;
const osg::UserDataContainer* udc = object->getUserDataContainer();
if (udc)
{
OSG_NOTICE<<" Checking UserDataContainer for object ptr"<<std::endl;
const osg::Object* ptr = udc->getUserObject(propertyName);
if (ptr)
{
value = const_cast<ObjectPtr>(ptr);
return true;
}
}
return false;
}
}
template<>
inline bool PropertyInterface::setProperty(osg::Object* object, const std::string& propertyName, const ObjectPtr& value)
{
return copyPropertyObjectToObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>());
if (copyPropertyObjectToObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>())) return true;
else
{
OSG_NOTICE<<"PropertyInterface::setProperty("<<propertyName<<", "<<value->className()<<") Adding object to UserDataContainer"<<std::endl;
// fallback to using user data to store property data
osg::UserDataContainer* udc = object->getOrCreateUserDataContainer();
value->setName(propertyName);
udc->addUserObject(value);
return true;
}
}
}