From 2797e8cb7c02ca114598c3718b2362f31ac13053 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 11 Feb 2014 18:07:37 +0000 Subject: [PATCH] Improved support for setting/getting properties via the osg::UserDataContainer. --- include/osg/UserDataContainer | 9 ++++++++ include/osgDB/PropertyInterface | 29 ++++++++++++++++++++++++-- src/osgDB/PropertyInterface.cpp | 17 ++++++++++++--- src/osgPlugins/lua/LuaScriptEngine.cpp | 13 +++++++++--- 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/include/osg/UserDataContainer b/include/osg/UserDataContainer index 6b1bc01fd..7f30f75fb 100644 --- a/include/osg/UserDataContainer +++ b/include/osg/UserDataContainer @@ -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 diff --git a/include/osgDB/PropertyInterface b/include/osgDB/PropertyInterface index e927aabef..3d5548dac 100644 --- a/include/osgDB/PropertyInterface +++ b/include/osgDB/PropertyInterface @@ -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()); + if (copyPropertyObjectFromObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum())) return true; + else + { + OSG_NOTICE<<"PropertyInterface::getProperty("<className()<<") Checking UserDataContainer for object ptr"<getUserDataContainer(); + if (udc) + { + OSG_NOTICE<<" Checking UserDataContainer for object ptr"<getUserObject(propertyName); + if (ptr) + { + value = const_cast(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()); + if (copyPropertyObjectToObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum())) return true; + else + { + OSG_NOTICE<<"PropertyInterface::setProperty("<className()<<") Adding object to UserDataContainer"<getOrCreateUserDataContainer(); + value->setName(propertyName); + udc->addUserObject(value); + return true; + } } } diff --git a/src/osgDB/PropertyInterface.cpp b/src/osgDB/PropertyInterface.cpp index c6d4bff61..3484126fb 100644 --- a/src/osgDB/PropertyInterface.cpp +++ b/src/osgDB/PropertyInterface.cpp @@ -292,7 +292,18 @@ osgDB::BaseSerializer* PropertyInterface::getSerializer(const osg::Object* objec osg::Object* PropertyInterface::createObject(const std::string& compoundClassName) const { osgDB::ObjectWrapper* ow = osgDB::Registry::instance()->getObjectWrapperManager()->findWrapper(compoundClassName); - return (ow!=0) ? ow->createInstance() : 0; + if (ow) + { + osg::Object* object = ow->createInstance(); + OSG_NOTICE<<"PropertyInterface::createObject("<createInstance() : 0; } bool PropertyInterface::copyPropertyDataFromObject(const osg::Object* object, const std::string& propertyName, void* valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType) @@ -366,7 +377,7 @@ bool PropertyInterface::copyPropertyDataToObject(osg::Object* object, const std: } else { - OSG_INFO<<"PropertyInterface::copyPropertyDataFromObject() no serializer available."<(co); + osg::Object* uo = osg::getUserObject(object, propertyName); + LuaCallbackObject* lco = dynamic_cast(uo); if (lco) { lua_rawgeti(_lua, LUA_REGISTRYINDEX, lco->getRef()); return 1; } + else if (uo) + { + pushObject(uo); + return 1; + } - OSG_INFO<<"LuaScriptEngine::pushPropertyToStack("<