OGRE  2.0
Object-Oriented Graphics Rendering Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
OgreProperty.h File Reference

OGRE's property system allows you to associate values of arbitrary type with names, and have those values exposed via a self-describing interface. More...

#include "OgrePropertyPrerequisites.h"
#include "OgreAny.h"
#include "OgreIteratorWrappers.h"
#include "OgreString.h"
#include "OgreException.h"
#include "OgreQuaternion.h"
#include "OgreMatrix4.h"
#include <boost/bind.hpp>
#include <boost/function.hpp>
+ Include dependency graph for OgreProperty.h:

Go to the source code of this file.


class  Ogre::Property< T >
 Property instance with passthrough calls to a given object. More...
class  Ogre::PropertyBase
 Base interface for an instance of a property. More...
class  Ogre::PropertyDef
 Definition of a property of an object. More...
class  Ogre::PropertySet
 Defines a complete set of properties for a single object instance. More...
struct  Ogre::PropertyValue
 A simple structure designed just as a holder of property values between the instances of objects they might target. More...



This source file is part of OGRE (Object-oriented Graphics Rendering Engine) For the latest info, see http://www.ogre3d.org/



typedef map< String,
PropertyDef >::type 
 Map from property name to shared definition. More...
typedef map< String,
PropertyValue >::type 
 Defines a transferable map of properties using wrapped value types (Ogre::Any) More...


enum  Ogre::PropertyType {
  Ogre::PROP_LONG = 4, Ogre::PROP_UNSIGNED_LONG = 5, Ogre::PROP_REAL = 6, Ogre::PROP_STRING = 7,
  Ogre::PROP_VECTOR2 = 8, Ogre::PROP_VECTOR3 = 9, Ogre::PROP_VECTOR4 = 10, Ogre::PROP_COLOUR = 11,
  Ogre::PROP_BOOL = 12, Ogre::PROP_QUATERNION = 13, Ogre::PROP_MATRIX3 = 14, Ogre::PROP_MATRIX4 = 15,
  Ogre::PROP_UNKNOWN = 999
 The type of a property. More...

Detailed Description

OGRE's property system allows you to associate values of arbitrary type with names, and have those values exposed via a self-describing interface.

Unlike Ogre::StringInterface, the values are passed as their native types without needing conversion to or from strings; they are simply wrapped in an Ogre::Any and casts are performed to access them.

Property values are actually not stored in this system; instead the property definitions reference getter & setter methods which provide the 'backing' for the property. This means you can directly expose features of your classes as properties without any duplication.
There are two aspects to exposing a property on your class. One is exposing the definition of the property (PropertyDef), which should be shared between all instances and probably stored in a static PropertyDefMap somewhere. The second is the instance 'wiring' which ensures that a call to set a property calls a method on this particular instance of the class; this is formed by a number of Property instances, contained in a PropertySet. Each Property has an explicit binding to getter and setter instance methods.
So, here's an example of setting up properties on an instance:
// Make sure the property definition is created
// propertyDefs is a variable of type PropertyDefMap, shared between instances
PropertyDefMap::iterator defi = propertyDefs.find("name");
if (defi == propertyDefs.end())
defi = propertyDefs.insert(PropertyDefMap::value_type("name",
"The name of the object.", PROP_STRING))).first;
// This has established the property definition, and its description.
// Now, we need to 'wire' a property instance for this object instance
// We assume the class is called 'Foo' and the instance is pointed to by a variable called 'inst'
// 'props' is a PropertySet, specific to the instance
OGRE_NEW Property<String>(&(defi->second),
boost::bind(&Foo::getName, inst),
boost::bind(&Foo::setName, inst, _1)));

Definition in file OgreProperty.h.