Improved support for setting/getting properties via the osg::UserDataContainer.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user