OpenSceneGraph 3.6.5
ClassInterface
Go to the documentation of this file.
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version. The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14
15#ifndef OSGDB_CLASSINTERFACE
16#define OSGDB_CLASSINTERFACE 1
17
18#include <osgDB/ObjectWrapper>
19#include <osgDB/Registry>
20#include <osg/ValueObject>
21
22namespace osgDB
23{
24
25template<typename T>
26static osgDB::BaseSerializer::Type getTypeEnum()
27{
29}
30
31template<typename T>
32static osgDB::BaseSerializer::Type getTypeEnumFrom(T)
33{
34 return getTypeEnum<T>();
35}
36
37template<typename T>
38static const char* getTypeString()
39{
40 return "UNDEFINED";
41}
42
43template<typename T>
44static const char* getTypeStringFrom(T)
45{
46 return getTypeString<T>();
47}
48
51
53extern OSGDB_EXPORT const char* getTypeStringFromPtr(const osg::Image*);
54
55
56#define DECLARE_TYPE(A,B) \
57 template<> inline osgDB::BaseSerializer::Type getTypeEnum<A>() { return osgDB::BaseSerializer::RW_##B; } \
58 template<> inline const char* getTypeString<A>() { return #B; }
59
62
63DECLARE_TYPE(bool, BOOL)
64DECLARE_TYPE(char, CHAR)
65DECLARE_TYPE(unsigned char, UCHAR)
66DECLARE_TYPE(short, SHORT)
67DECLARE_TYPE(unsigned short, USHORT)
68DECLARE_TYPE(int, INT)
69DECLARE_TYPE(unsigned int, UINT)
70DECLARE_TYPE(float, FLOAT)
71DECLARE_TYPE(double, DOUBLE)
72
81
84DECLARE_TYPE(std::string, STRING)
85
92
99
106
107DECLARE_TYPE(osg::BoundingBoxf, BOUNDINGBOXF)
108DECLARE_TYPE(osg::BoundingBoxd, BOUNDINGBOXD)
109
110DECLARE_TYPE(osg::BoundingSpheref, BOUNDINGSPHEREF)
111DECLARE_TYPE(osg::BoundingSphered, BOUNDINGSPHERED)
112
113// forward declare
114class PropertyOutputIterator;
115class PropertyInputIterator;
116
117
122{
123public:
125
126
128 bool getPropertyType(const osg::Object* object, const std::string& propertyName, osgDB::BaseSerializer::Type& type) const;
129
132
133
135 osg::Object* createObject(const std::string& compoundClassdName) const;
136
138 template<typename T>
139 bool getProperty(const osg::Object* object, const std::string& propertyName, T& value);
140
142 template<typename T>
143 bool setProperty(osg::Object* object, const std::string& propertyName, const T& value);
144
145
148
150 osgDB::BaseSerializer::Type getType(const std::string& typeName) const;
151
152
154 typedef std::map<std::string, osgDB::BaseSerializer::Type> PropertyMap;
155
157 bool getSupportedProperties(const osg::Object* object, PropertyMap& properties, bool searchAssociates=true) const;
158
160 bool isObjectOfType(const osg::Object* object, const std::string& compoundClassName) const;
161
162
164 bool run(void* objectPtr, const std::string& compoundClassName, const std::string& methodName, osg::Parameters& inputParameters, osg::Parameters& outputParameters) const;
165
167 bool run(osg::Object* object, const std::string& methodName, osg::Parameters& inputParameters, osg::Parameters& outputParameters) const;
168
170 bool hasMethod(const std::string& compoundClassName, const std::string& methodName) const;
171
173 bool hasMethod(const osg::Object* object, const std::string& methodName) const;
174
175
177 typedef std::map<std::string, PropertyMap> ObjectPropertyMap;
178
181
183 const ObjectPropertyMap& getWhiteList() const { return _whiteList; }
184
187
189 const ObjectPropertyMap& getBlackList() const { return _blackList; }
190
192
193 osgDB::BaseSerializer* getSerializer(const osg::Object* object, const std::string& propertyName, osgDB::BaseSerializer::Type& type) const;
194
195protected:
196
197 bool copyPropertyDataFromObject(const osg::Object* object, const std::string& propertyName, void* valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType);
198
199 bool copyPropertyDataToObject(osg::Object* object, const std::string& propertyName, const void* valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType);
200
201 bool copyPropertyObjectFromObject(const osg::Object* object, const std::string& propertyName, void* valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType);
202
203 bool copyPropertyObjectToObject(osg::Object* object, const std::string& propertyName, const void* valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType);
204
205
206
208 PropertyOutputIterator* _poi;
209
211 PropertyInputIterator* _pii;
212
213 typedef std::map<std::string, osgDB::BaseSerializer::Type> TypeNameToTypeMap;
214 typedef std::map<osgDB::BaseSerializer::Type, std::string> TypeToTypeNameMap;
215
218
221};
222
223
224template<typename T>
225bool ClassInterface::getProperty(const osg::Object* object, const std::string& propertyName, T& value)
226{
227 if (copyPropertyDataFromObject(object, propertyName, &value, sizeof(T), getTypeEnum<T>())) return true;
228 else return object->getUserValue(propertyName, value); // fallback to check user data for property
229}
230
231template<typename T>
232bool ClassInterface::setProperty(osg::Object* object, const std::string& propertyName, const T& value)
233{
234 if (copyPropertyDataToObject(object, propertyName, &value, sizeof(T), getTypeEnum<T>())) return true;
235 else
236 {
237 // fallback to using user data to store property data
238 object->setUserValue(propertyName, value);
239 return false;
240 }
241}
242
244
245template<>
246inline bool ClassInterface::getProperty(const osg::Object* object, const std::string& propertyName, ObjectPtr& value)
247{
248 if (copyPropertyObjectFromObject(object, propertyName, &value, sizeof(ObjectPtr), getTypeEnum<ObjectPtr>())) return true;
249 else
250 {
251 OSG_INFO<<"ClassInterface::getProperty("<<propertyName<<", Checking UserDataContainer for object ptr"<<std::endl;
252 const osg::UserDataContainer* udc = object->getUserDataContainer();
253 if (udc)
254 {
255 OSG_INFO<<" Checking UserDataContainer for object ptr"<<std::endl;
256 const osg::Object* ptr = udc->getUserObject(propertyName);
257 if (ptr)
258 {
259 value = const_cast<ObjectPtr>(ptr);
260 return true;
261 }
262 }
263 return false;
264 }
265}
266
267template<>
268inline bool ClassInterface::setProperty(osg::Object* object, const std::string& propertyName, const ObjectPtr& value)
269{
270 osgDB::BaseSerializer::Type type = dynamic_cast<osg::Image*>(value) ? osgDB::BaseSerializer::RW_IMAGE : getTypeEnum<ObjectPtr>();
271 // osgDB::BaseSerializer::Type type = getTypeEnum<ObjectPtr>();
272 if (copyPropertyObjectToObject(object, propertyName, &value, sizeof(ObjectPtr), type)) return true;
273 else
274 {
275 // fallback to using user data to store property data
277 unsigned int objectIndex = udc->getUserObjectIndex(propertyName);
278 if (objectIndex < udc->getNumUserObjects())
279 {
280 const osg::Object* outgoingObject = udc->getUserObject(objectIndex);
281 if (outgoingObject==value) return true;
282
283 OSG_INFO<<"ClassInterface::setProperty("<<propertyName<<", "<<value->className()<<") replace object on UserDataContainer"<<std::endl;
284 value->setName(propertyName);
285 udc->setUserObject(objectIndex, value);
286 }
287 else
288 {
289 OSG_INFO<<"ClassInterface::setProperty("<<propertyName<<", "<<value->className()<<") Adding object to UserDataContainer"<<std::endl;
290 value->setName(propertyName);
291 udc->addUserObject(value);
292 }
293 return true;
294 }
295}
296
297
298}
299
300#endif
#define OSG_INFO
Definition Notify:87
#define DECLARE_TYPE(A, B)
Definition ClassInterface:56
BoundingBoxImpl< Vec3d > BoundingBoxd
Definition BoundingBox:252
BoundingBoxImpl< Vec3f > BoundingBoxf
Definition BoundingBox:251
BoundingSphereImpl< Vec3f > BoundingSpheref
Definition BoundingSphere:302
std::vector< osg::ref_ptr< osg::Object > > Parameters
Definition Callback:130
BoundingSphereImpl< Vec3d > BoundingSphered
Definition BoundingSphere:303
The osgDB library provides support for reading and writing scene graphs, providing a plugin framework...
Definition Archive:24
OSGDB_EXPORT const char * getTypeStringFromPtr(const osg::Object *)
osg::Object * ObjectPtr
Definition ClassInterface:243
OSGDB_EXPORT osgDB::BaseSerializer::Type getTypeEnumFromPtr(const osg::Object *)
Image class for encapsulating the storage texture image data.
Definition Image:179
Definition Matrixd:27
Definition Matrixf:27
Base class/standard interface for objects which require IO support, cloning and reference counting.
Definition Object:61
virtual void setName(const std::string &name)
Set the name of object using C++ style string.
Definition Object:203
virtual const char * className() const =0
return the name of the object's class type.
osg::UserDataContainer * getUserDataContainer()
get the UserDataContainer attached to this object.
Definition Object:243
osg::UserDataContainer * getOrCreateUserDataContainer()
Convenience method that returns the UserDataContainer, and if one doesn't already exist creates and a...
A plane class.
Definition Plane:34
A quaternion class.
Definition Quat:30
Internal structure for storing all user data.
Definition UserDataContainer:26
virtual unsigned int addUserObject(Object *obj)=0
Add user data object.
virtual unsigned int getUserObjectIndex(const osg::Object *obj, unsigned int startPos=0) const =0
Get the index position of specified user data object.
virtual void setUserObject(unsigned int i, Object *obj)=0
Add element to list of user data objects.
virtual Object * getUserObject(unsigned int i)=0
Get user data object as specified index position.
General purpose float triple.
Definition Vec2b:26
General purpose double pair, uses include representation of texture coordinates.
Definition Vec2d:29
General purpose float pair.
Definition Vec2f:29
General purpose integer pair.
Definition Vec2i:22
Definition Vec2s:20
General purpose unsigned byte pair.
Definition Vec2ub:22
General purpose integer pair.
Definition Vec2ui:22
Definition Vec2us:20
General purpose float triple.
Definition Vec3b:26
General purpose double triple for use as vertices, vectors and normals.
Definition Vec3d:30
General purpose float triple for use as vertices, vectors and normals.
Definition Vec3f:29
General purpose integer triple.
Definition Vec3i:22
Definition Vec3s:20
General purpose float triple.
Definition Vec3ub:26
General purpose integer triple.
Definition Vec3ui:22
Definition Vec3us:20
General purpose float triple.
Definition Vec4b:26
General purpose double quad.
Definition Vec4d:29
General purpose float quad.
Definition Vec4f:28
General purpose integer quad.
Definition Vec4i:22
General purpose float quad.
Definition Vec4s:26
General purpose float quad.
Definition Vec4ub:28
General purpose integer quad.
Definition Vec4ui:22
General purpose float quad.
Definition Vec4us:26
osgDB::BaseSerializer::Type getType(const std::string &typeName) const
get the enum value of type given the human readable name.
ObjectPropertyMap _blackList
Definition ClassInterface:220
bool copyPropertyDataFromObject(const osg::Object *object, const std::string &propertyName, void *valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType)
const ObjectPropertyMap & getBlackList() const
Get the const list of properties that are explicitly defined as not supported.
Definition ClassInterface:189
std::map< std::string, osgDB::BaseSerializer::Type > PropertyMap
Properties supported for a single class.
Definition ClassInterface:154
osgDB::InputStream _inputStream
Definition ClassInterface:210
bool getSupportedProperties(const osg::Object *object, PropertyMap &properties, bool searchAssociates=true) const
Get the list of of properties supported by object.
std::map< std::string, osgDB::BaseSerializer::Type > TypeNameToTypeMap
Definition ClassInterface:213
PropertyInputIterator * _pii
Definition ClassInterface:211
bool copyPropertyObjectFromObject(const osg::Object *object, const std::string &propertyName, void *valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType)
bool getPropertyType(const osg::Object *object, const std::string &propertyName, osgDB::BaseSerializer::Type &type) const
get the Type of the specified property, return true if property is supported, otherwise false.
bool copyPropertyDataToObject(osg::Object *object, const std::string &propertyName, const void *valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType)
PropertyOutputIterator * _poi
Definition ClassInterface:208
osgDB::OutputStream _outputStream
Definition ClassInterface:207
osgDB::ObjectWrapper * getObjectWrapper(const osg::Object *object) const
bool run(osg::Object *object, const std::string &methodName, osg::Parameters &inputParameters, osg::Parameters &outputParameters) const
run method of object
osgDB::BaseSerializer * getSerializer(const osg::Object *object, const std::string &propertyName, osgDB::BaseSerializer::Type &type) const
ObjectPropertyMap _whiteList
Definition ClassInterface:219
bool isObjectOfType(const osg::Object *object, const std::string &compoundClassName) const
return true if the object can be cast to the specified class specified by compoundClassName
std::map< osgDB::BaseSerializer::Type, std::string > TypeToTypeNameMap
Definition ClassInterface:214
bool run(void *objectPtr, const std::string &compoundClassName, const std::string &methodName, osg::Parameters &inputParameters, osg::Parameters &outputParameters) const
run method of object
bool hasMethod(const std::string &compoundClassName, const std::string &methodName) const
checked for support of specified method
ObjectPropertyMap & getBlackList()
Get the list of properties that are explicitly defined as not supported.
Definition ClassInterface:186
TypeToTypeNameMap _typeToTypeNameMap
Definition ClassInterface:217
TypeNameToTypeMap _typeNameToTypeMap
Definition ClassInterface:216
const ObjectPropertyMap & getWhiteList() const
Get the const list of properties that are explicitly defined as supported.
Definition ClassInterface:183
std::map< std::string, PropertyMap > ObjectPropertyMap
Properties supported for a range of classes, used for white and black lists.
Definition ClassInterface:177
std::string getTypeName(osgDB::BaseSerializer::Type type) const
get the human readable name of type.
bool areTypesCompatible(osgDB::BaseSerializer::Type lhs, osgDB::BaseSerializer::Type rhs) const
return type of two types are compatible
osg::Object * createObject(const std::string &compoundClassdName) const
create an object of specified type for provided compound class name in the form libraryName::classNam...
bool copyPropertyObjectToObject(osg::Object *object, const std::string &propertyName, const void *valuePtr, unsigned int valueSize, osgDB::BaseSerializer::Type valueType)
ObjectPropertyMap & getWhiteList()
Get the list of properties that are explicitly defined as supported.
Definition ClassInterface:180
bool hasMethod(const osg::Object *object, const std::string &methodName) const
checked for support of specified method
bool getProperty(const osg::Object *object, const std::string &propertyName, T &value)
template method for getting property data, return true if property available and the type is compatib...
Definition ClassInterface:225
bool setProperty(osg::Object *object, const std::string &propertyName, const T &value)
template method for setting property data, return true if property available and the type is compatib...
Definition ClassInterface:232
Definition InputStream:64
Definition ObjectWrapper:62
Definition OutputStream:57
Definition Serializer:141
Type
Definition Serializer:145
@ RW_IMAGE
Definition Serializer:146
@ RW_UNDEFINED
Definition Serializer:146
#define OSGDB_EXPORT
Definition Export:39

osg logo
Generated at Sun Jul 20 2025 00:00:00 for the OpenSceneGraph by doxygen 1.14.0.