00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2012 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef __OGRE_PROPERTY_H__ 00029 #define __OGRE_PROPERTY_H__ 00030 00031 #include "OgrePropertyPrerequisites.h" 00032 #include "OgreAny.h" 00033 #include "OgreIteratorWrappers.h" 00034 #include "OgreString.h" 00035 #include "OgreException.h" 00036 #include "OgreVector2.h" 00037 #include "OgreVector3.h" 00038 #include "OgreVector4.h" 00039 #include "OgreColourValue.h" 00040 #include "OgreQuaternion.h" 00041 #include "OgreMatrix3.h" 00042 #include "OgreMatrix4.h" 00043 00044 #include <boost/bind.hpp> 00045 #include <boost/function.hpp> 00100 namespace Ogre 00101 { 00109 00110 enum PropertyType 00111 { 00112 PROP_SHORT = 0, 00113 PROP_UNSIGNED_SHORT = 1, 00114 PROP_INT = 2, 00115 PROP_UNSIGNED_INT = 3, 00116 PROP_LONG = 4, 00117 PROP_UNSIGNED_LONG = 5, 00118 PROP_REAL = 6, 00119 PROP_STRING = 7, 00120 PROP_VECTOR2 = 8, 00121 PROP_VECTOR3 = 9, 00122 PROP_VECTOR4 = 10, 00123 PROP_COLOUR = 11, 00124 PROP_BOOL = 12, 00125 PROP_QUATERNION = 13, 00126 PROP_MATRIX3 = 14, 00127 PROP_MATRIX4 = 15, 00128 00129 PROP_UNKNOWN = 999 00130 }; 00131 00137 class _OgrePropertyExport PropertyDef : public PropertyAlloc 00138 { 00139 public: 00140 00141 /* Construct a property. 00142 @param name The name of the property 00143 @param desc A (potentially) long description of the property 00144 @param pType The type of the property 00145 */ 00146 PropertyDef(const String& name, const String& desc, PropertyType pType) 00147 : mName(name), mDesc(desc), mType(pType) {} 00148 00150 const String& getName() const { return mName; } 00151 00153 const String& getDescription() const { return mDesc; } 00154 00156 PropertyType getType() const { return mType; } 00157 00159 static const String& getTypeName(PropertyType theType); 00160 00161 static PropertyType getTypeForValue(const short& val) { return PROP_SHORT; } 00162 static PropertyType getTypeForValue(const unsigned short& val) { return PROP_UNSIGNED_SHORT; } 00163 static PropertyType getTypeForValue(const int& val) { return PROP_INT; } 00164 static PropertyType getTypeForValue(const unsigned int& val) { return PROP_UNSIGNED_INT; } 00165 static PropertyType getTypeForValue(const long& val) { return PROP_LONG; } 00166 static PropertyType getTypeForValue(const unsigned long& val) { return PROP_UNSIGNED_LONG; } 00167 static PropertyType getTypeForValue(const Real& val) { return PROP_REAL; } 00168 static PropertyType getTypeForValue(const String& val) { return PROP_STRING; } 00169 static PropertyType getTypeForValue(const Vector2& val) { return PROP_VECTOR2; } 00170 static PropertyType getTypeForValue(const Vector3& val) { return PROP_VECTOR3; } 00171 static PropertyType getTypeForValue(const Vector4& val) { return PROP_VECTOR4; } 00172 static PropertyType getTypeForValue(const ColourValue& val) { return PROP_COLOUR; } 00173 static PropertyType getTypeForValue(const bool& val) { return PROP_BOOL; } 00174 static PropertyType getTypeForValue(const Quaternion& val) { return PROP_QUATERNION; } 00175 static PropertyType getTypeForValue(const Matrix3& val) { return PROP_MATRIX3; } 00176 static PropertyType getTypeForValue(const Matrix4& val) { return PROP_MATRIX4; } 00177 00178 protected: 00179 // no default construction 00180 PropertyDef() {} 00181 00182 String mName; 00183 String mDesc; 00184 PropertyType mType; 00185 00186 }; 00187 00189 typedef map<String, PropertyDef>::type PropertyDefMap; 00190 00193 class _OgrePropertyExport PropertyBase : public PropertyAlloc 00194 { 00195 public: 00197 PropertyBase(PropertyDef* def) : mDef(def) {} 00198 virtual ~PropertyBase() {} 00199 00201 const String& getName() const { return mDef->getName(); } 00202 00204 const String& getDescription() const { return mDef->getDescription(); } 00205 00207 PropertyType getType() const { return mDef->getType(); } 00208 00210 virtual Ogre::Any getValue() const = 0; 00211 00212 protected: 00213 // disallow default construction 00214 PropertyBase() {} 00215 PropertyDef* mDef; 00216 00217 }; 00218 00220 template <typename T> 00221 class Property : public PropertyBase 00222 { 00223 public: 00224 typedef T value_type; 00225 typedef boost::function< T (void) > getter_func; 00226 typedef boost::function< void (T) > setter_func; 00227 00231 Property(PropertyDef* def, getter_func getter, setter_func setter) 00232 : PropertyBase(def) 00233 , mGetter(getter) 00234 , mSetter(setter) 00235 { 00236 } 00237 00240 virtual void set(T val) 00241 { 00242 mSetter(val); 00243 } 00244 00245 virtual T get() const 00246 { 00247 return mGetter(); 00248 } 00249 00250 Ogre::Any getValue() const 00251 { 00252 return Ogre::Any(get()); 00253 } 00254 00255 protected: 00256 // disallow default construction 00257 Property() {} 00258 ~Property() {} 00259 00260 getter_func mGetter; 00261 setter_func mSetter; 00262 }; 00263 00268 struct PropertyValue 00269 { 00270 PropertyType propType; 00271 Ogre::Any val; 00272 }; 00274 typedef map<String, PropertyValue>::type PropertyValueMap; 00275 00276 00279 class _OgrePropertyExport PropertySet : public PropertyAlloc 00280 { 00281 public: 00282 PropertySet(); 00283 ~PropertySet(); 00284 00289 void addProperty(PropertyBase* prop); 00290 00298 PropertyBase* getProperty(const String& name) const; 00299 00301 bool hasProperty(const String& name) const; 00302 00304 void removeProperty(const String& name); 00305 00306 typedef map<String, PropertyBase*>::type PropertyMap; 00307 typedef Ogre::MapIterator<PropertyMap> PropertyIterator; 00309 PropertyIterator getPropertyIterator(); 00310 00314 PropertyValueMap getValueMap() const; 00315 00318 void setValueMap(const PropertyValueMap& values); 00319 00322 template<typename T> 00323 void getValue(const String& name, T& value) const 00324 { 00325 getPropertyImpl(name, value, PropertyDef::getTypeForValue(value)); 00326 } 00327 00330 template<typename T> 00331 void setValue(const String& name, const T* value) 00332 { 00333 setPropertyImpl(name, *value, PropertyDef::getTypeForValue(*value)); 00334 } 00337 template<typename T> 00338 void setValue(const String& name, T value) 00339 { 00340 setPropertyImpl(name, value, PropertyDef::getTypeForValue(value)); 00341 } 00344 void setValue(const String& name, const char* pChar) 00345 { 00346 String v(pChar); 00347 setPropertyImpl(name, v, PROP_STRING); 00348 } 00349 00350 00351 protected: 00352 PropertyMap mPropertyMap; 00353 00355 template <typename T> 00356 void setPropertyImpl(const String& name, const T& val, PropertyType typeCheck) 00357 { 00358 PropertyBase* baseProp = getProperty(name); 00359 if (baseProp->getType() != typeCheck) 00360 { 00361 StringUtil::StrStreamType msg; 00362 msg << "Property error: type passed in: '" << PropertyDef::getTypeName(typeCheck) 00363 << "', type of property: '" << PropertyDef::getTypeName(baseProp->getType()) << "'"; 00364 OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, msg.str(), "PropertySet::setPropertyImpl"); 00365 } 00366 static_cast<Property<T>*>(baseProp)->set(val); 00367 } 00368 00370 template <typename T> 00371 void getPropertyImpl(const String& name, T& refVal, PropertyType typeCheck) const 00372 { 00373 PropertyBase* baseProp = getProperty(name); 00374 if (baseProp->getType() != typeCheck) 00375 { 00376 StringUtil::StrStreamType msg; 00377 msg << "Property error: type requested: '" << PropertyDef::getTypeName(typeCheck) 00378 << "', type of property: '" << PropertyDef::getTypeName(baseProp->getType()) << "'"; 00379 OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, msg.str(), "PropertySet::getPropertyImpl"); 00380 } 00381 refVal = static_cast<Property<T>*>(baseProp)->get(); 00382 } 00383 00384 }; 00385 00389 } 00390 00391 #endif
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:25 2012