Hi Tamer, The old .osg format has been officially deprecated but we'll be maintaining the format for the next OSG version and likely beyond. Even when we eventually retire the .osg format support for the core OSG it will still be possible to provide support via an external plugin.
The replacement for .osg is via general purpose serializers that enable ascii, binary and XML OSG file formats and is extensible so you'll be able to add your own serializers for your own custom data structures and be able to use any of the .osgt, .osgb or .osgx formats. Have a look at the src/osgWrappers/serializers for examples for how to provide the serializers. Robert. On 17 July 2012 11:15, Tamer El Nashar <[email protected]> wrote: > Hi, > > I am using an API that depends on osg 2.8.1, and have been asked to finally > attempt to upgrade to the latest development release (3.1.1). > > The SDK currently makes a few customization to osg, mainly adding user data > to osgPlugins::osg::Node. The following 2 functions are changed in the file: > $OSG/src/osgPlugins/osg/Node.cpp > > > Code: > > #include "osg/AcousticPropertyData.h" > > bool Node_readLocalData(Object& obj, Input& fr) > { > ... > > // change user data to read in acoustic properties > if (fr.matchSequence("user_data {")) > { > int entry = fr[0].getNoNestedBrackets(); > fr += 2; > > while (!fr.eof() && fr[0].getNoNestedBrackets() > entry) > { > std::string str = fr[0].getStr(); > if (str.length()>0) > { > std::string type = str.substr(0, > str.find_first_of(' ')); > > const char *cStr = str.c_str(); > > if (type == "RoomData") > { > RoomData* roomData = new RoomData(); > > char type[256]; > int isActive; > > sscanf(cStr, "%s %lf %lf %lf %lf %d > %ld %ld %lf %s", > &(type), > &(roomData->m_WetMix), > &(roomData->m_Diffusion), > &(roomData->m_T60Low), > &(roomData->m_T60High), > &(isActive), > > &(roomData->m_DefaultPartitionId), > > &(roomData->m_DefaultReflectorId), > > &(roomData->m_DefaultFlankingBoost), > &(roomData->m_RoomID)); > > roomData->m_IsActive = (isActive != > 0); > node.setUserData(roomData); > } > else if (type == "SurfaceData") > { > SurfaceData* surfaceData = new > SurfaceData(); > > char type[256]; > int isActive; > > sscanf(cStr, "%s %lf %lf %lf %lf %d", > &(type), > &(surfaceData->m_ReflectorId), > &(surfaceData->m_PartitionId), > > &(surfaceData->m_FlankingBoost), > &(isActive)); > > surfaceData->m_IsActive = (isActive > != 0); > node.setUserData(surfaceData); > } > > ++fr; > } > } > iteratorAdvanced = true; > } > ... > } > > bool Node_writeLocalData(const Object& obj, Output& fw) > { > ... > // change user data to become acoustic property > if (!strcmp(node.className(), "Geode") || !strcmp(node.className(), > "Group")) > { > const Referenced* _userData = NULL; > _userData = node.getUserData(); > if (_userData) > { > AcousticPropertyData* object = NULL; > object = > dynamic_cast<AcousticPropertyData*>(const_cast< Referenced* >(_userData)); > > if (object) > { > fw.indent() << "user_data {"<< std::endl; > fw.moveIn(); > > char tempCStr[2048]; > > if (object->m_AcousticDataType == kRoomData) > { > RoomData* roomData = > dynamic_cast<RoomData*>(object); > > strncpy(roomData->m_RoomID, > node.getName().c_str(), sizeof(roomData->m_RoomID)); > > sprintf(tempCStr, "%s %lf %lf %lf %lf > %d %d %d %lf %s", > "RoomData", > roomData->m_WetMix, > roomData->m_Diffusion, > roomData->m_T60Low, > roomData->m_T60High, > (roomData->m_IsActive ? 1 : > 0), > > roomData->m_DefaultPartitionId, > > roomData->m_DefaultReflectorId, > > roomData->m_DefaultFlankingBoost, > roomData->m_RoomID); > } > else if (object->m_AcousticDataType == > kSurfaceData) > { > SurfaceData* surfaceData = > dynamic_cast<SurfaceData*>(object); > > sprintf(tempCStr, "%s %ld %ld %lf %d", > "SurfaceData", > surfaceData->m_PartitionId, > surfaceData->m_ReflectorId, > surfaceData->m_FlankingBoost, > (surfaceData->m_IsActive ? 1 > : 0)); > } > > std::string str; > str.assign(tempCStr); > fw.indent() << fw.wrapString(str) << > std::endl; > fw.moveOut(); > fw.indent() << "}"<< std::endl; > } > } > } > ... > } > > > > > > "AccousticPropertyData.h" basically contains definitions of the classes > "RoomData" and "SurfaceData". > > > Code: > > class AcousticPropertyData : public Referenced > { > public: > > AcousticPropertyData(AcousticDataType type): m_AcousticDataType(type), > Referenced() > { > m_Version = 3; > m_IsActive = true; > } > virtual ~AcousticPropertyData() {} > > int m_Version; > bool m_IsActive; > AcousticDataType m_AcousticDataType; > }; > > class SurfaceData : public AcousticPropertyData > { > public: > > SurfaceData(): AcousticPropertyData(kSurfaceData) > { > m_ReflectorId = 0; > m_PartitionId = 0; > m_FlankingBoost = 0; > } > > const SurfaceData& operator=(const SurfaceData& src) > { > m_ReflectorId = src.m_ReflectorId; > m_PartitionId = src.m_PartitionId; > m_FlankingBoost = src.m_FlankingBoost; > m_IsActive = src.m_IsActive; > return *this; > } > > long m_ReflectorId; > long m_PartitionId; > double m_FlankingBoost; > }; > > > > > The problem is that in 3.1.1 osgPlugins osg has been deprecated. So using the > above code wouldn't be possible without using deprecated code, which I would > rather not do. > > My question is, how can I add user data to osg node? Preferably without > making any changes to osg, but rather through my app/sdk. Any sample that > does that? > > Thank you! > > Cheers, > Tamer > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=48887#48887 > > > > > > _______________________________________________ > osg-users mailing list > [email protected] > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org _______________________________________________ osg-users mailing list [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

