00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CAELUM__TYPE_DESCRIPTOR_H
00022 #define CAELUM__TYPE_DESCRIPTOR_H
00023
00024 #include "CaelumPrerequisites.h"
00025
00026 #if CAELUM_TYPE_DESCRIPTORS
00027
00028 #include <typeinfo>
00029
00030 namespace Caelum
00031 {
00032 class ValuePropertyDescriptor;
00033
00048 class CAELUM_EXPORT TypeDescriptor
00049 {
00050 public:
00051 virtual ~TypeDescriptor() {};
00052
00053 typedef std::map<String, const ValuePropertyDescriptor*> PropertyMap;
00054
00059 virtual const ValuePropertyDescriptor* getPropertyDescriptor (const Ogre::String& name) const = 0;
00060
00064 virtual const std::vector<String> getPropertyNames () const = 0;
00065
00069 virtual const PropertyMap getFullPropertyMap () const = 0;
00070 };
00071
00083 class CAELUM_EXPORT ValuePropertyDescriptor
00084 {
00085 public:
00086 virtual ~ValuePropertyDescriptor() {};
00087
00094 virtual bool canGetValue () const = 0;
00095
00097 virtual bool canSetValue () const = 0;
00098
00104 virtual const Ogre::Any getValue (const void* target) const = 0;
00105
00111 virtual void setValue (void* target, const Ogre::Any& value) const = 0;
00112
00114 virtual const std::type_info& getValueTypeId () const = 0;
00115
00122 virtual bool implementsTypedValuePropertyDescriptor () const {
00123 return false;
00124 }
00125 };
00126
00129 template<typename ValueT>
00130 class CAELUM_EXPORT TypedValuePropertyDescriptor: public ValuePropertyDescriptor
00131 {
00132 public:
00134 virtual const ValueT getValueTyped (const void* target) const = 0;
00136 virtual void setValueTyped (void* target, const ValueT& value) const = 0;
00137
00138 private:
00139 virtual const Ogre::Any getValue (const void* target) const {
00140 return Ogre::Any(this->getValueTyped (target));
00141 }
00142
00143 virtual void setValue (void* target, const Ogre::Any& value) const {
00144 this->setValueTyped (target, Ogre::any_cast<ValueT>(value));
00145 }
00146
00147 virtual const std::type_info& getValueTypeId () const {
00148 return typeid(ValueT);
00149 }
00150
00151 virtual bool implementsTypedValuePropertyDescriptor () const {
00152 return true;
00153 }
00154 };
00155
00158 template <class TargetT, typename ParamT, typename InParamT = const ParamT&, typename OutParamT = const ParamT>
00159 class AccesorPropertyDescriptor: public TypedValuePropertyDescriptor<ParamT>
00160 {
00161 public:
00162 typedef void(TargetT::*SetFunc)(InParamT);
00163 typedef OutParamT(TargetT::*GetFunc)(void) const;
00164
00165 private:
00166 GetFunc mGetFunc;
00167 SetFunc mSetFunc;
00168
00169 public:
00170 AccesorPropertyDescriptor (GetFunc getFunc, SetFunc setFunc)
00171 {
00172 mGetFunc = getFunc;
00173 mSetFunc = setFunc;
00174 }
00175
00176 virtual bool canGetValue () const {
00177 return mGetFunc != 0;
00178 }
00179
00180 virtual bool canSetValue () const {
00181 return mSetFunc != 0;
00182 }
00183
00184 virtual const ParamT getValueTyped(const void* target) const
00185 {
00186 const TargetT* typedTarget = reinterpret_cast<const TargetT*>(target);
00187 return (typedTarget->*mGetFunc)();
00188 }
00189
00190 virtual void setValueTyped(void* target, const ParamT& value) const
00191 {
00192 TargetT* typedTarget = reinterpret_cast<TargetT*>(target);
00193 (typedTarget->*mSetFunc)(value);
00194 }
00195 };
00196
00204 class DefaultTypeDescriptor: public TypeDescriptor
00205 {
00206 public:
00207 DefaultTypeDescriptor ();
00208 virtual ~DefaultTypeDescriptor ();
00209
00215 inline PropertyMap& getPropertyMap () { return mPropertyMap; }
00216
00218 void add (const Ogre::String& name, const ValuePropertyDescriptor* descriptor);
00219
00221 void clear ();
00222
00224 virtual const ValuePropertyDescriptor* getPropertyDescriptor (const Ogre::String& name) const;
00225
00227 virtual const std::vector<String> getPropertyNames () const;
00228
00230 virtual const PropertyMap getFullPropertyMap () const;
00231
00232 private:
00233 void deleteAllPropertyDescriptors ();
00234
00235 PropertyMap mPropertyMap;
00236 };
00237
00248 class CAELUM_EXPORT CaelumDefaultTypeDescriptorData
00249 {
00250 private:
00251 void load();
00252 void unload();
00253
00254 public:
00255 CaelumDefaultTypeDescriptorData();
00256 ~CaelumDefaultTypeDescriptorData();
00257
00258 DefaultTypeDescriptor* CaelumSystemTypeDescriptor;
00259 DefaultTypeDescriptor* PointStarfieldTypeDescriptor;
00260 DefaultTypeDescriptor* BaseSkyLightTypeDescriptor;
00261 DefaultTypeDescriptor* GroundFogTypeDescriptor;
00262 DefaultTypeDescriptor* PrecipitationTypeDescriptor;
00263 DefaultTypeDescriptor* DepthComposerTypeDescriptor;
00264 DefaultTypeDescriptor* FlatCloudLayerTypeDescriptor;
00265 DefaultTypeDescriptor* SkyDomeTypeDescriptor;
00266 };
00267 }
00268
00269 #endif // CAELUM_TYPE_DESCRIPTORS
00270
00271 #endif // CAELUM__TYPE_DESCRIPTOR_H