True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

DescriptorItemNumeric.h

00001 //---------------------------------------------------------------------------------
00002 // File Name: DescriptorItemNumeric.h
00003 // Description:
00004 //
00005 // Copyright (C) 2004 True Axis Pty Ltd, Australia. 
00006 // All Rights Reserved.
00007 //
00008 // History:
00009 //      Created File.
00010 //---------------------------------------------------------------------------------
00011 
00012 #ifndef TA_DESCRIPTORITEMNUMERIC_H
00013 #define TA_DESCRIPTORITEMNUMERIC_H
00014 
00015 #ifndef TA_DESCRIPTORITEM_H
00016 #include "DescriptorItem.h"
00017 #endif // TA_DESCRIPTORITEM_H
00018 
00019 namespace TA
00020 {
00021 
00022 template <class Type>
00023 class DescriptorItemNumericOfType;
00024 
00025 #ifndef DOXYGEN
00026 typedef DescriptorItemNumericOfType<float> DescriptorItemNumericFloat;
00027 typedef DescriptorItemNumericOfType<int> DescriptorItemNumericInt;
00028 #endif // DOXYGEN
00029 
00030 class TACOMMON_CLASS DescriptorItemNumeric : public DescriptorItem
00031 {
00032 public:
00033     DescriptorItemNumeric() : DescriptorItem() { }
00034     virtual ~DescriptorItemNumeric() { Finalise(); }
00035 
00036     void Initialise(const char* szName, const char* szDescription)
00037     {
00038         DescriptorItem::Initialise(szName, szDescription);
00039     }
00040 
00041     void Finalise()
00042     {
00043         DescriptorItem::Finalise();
00044     }
00045 
00046     virtual u32 GetTypeID() const { return s_nClassID; }
00047     static u32 GetStaticTypeID() { return s_nClassID; }
00048 
00049 private:
00050     static u32 s_nClassID;
00051 };
00052 
00053 template <class Type>
00054 class DescriptorItemNumericOfType : public DescriptorItemNumeric
00055 {
00056 public:
00057     enum { INVALID_DATA_OFFSET = 0xFFFFFFFF };
00058     DescriptorItemNumericOfType() : DescriptorItemNumeric() 
00059     { 
00060         m_nDataOffset = INVALID_DATA_OFFSET;
00061         m_pSetValueCallBack = 0;
00062         m_pGetValueCallBack = 0;
00063         m_defaultValue = 0;
00064         m_minValue = 0;
00065         m_maxValue = 0;
00066     }
00067 
00068     virtual ~DescriptorItemNumericOfType() { Finalise(); }
00069 
00070     void Initialise(
00071         const Char* szName,
00072         Descriptor* pDescriptor,
00073         Type& var,
00074         Type defaultValue,
00075         Type min,
00076         Type max,
00077         const Char* szDescription)
00078     {
00079         Initialise(
00080             szName,
00081             0,
00082             0,
00083             defaultValue,
00084             min,
00085             max,
00086             szDescription);
00087         m_nDataOffset = (u32)&var - (u32)pDescriptor;
00088     }
00089 
00090     void Initialise(
00091         const Char* szName,
00092         void (*SetVar)(Type, void* pData),
00093         Type (*GetVar)(void* pData),
00094         Type defaultValue,
00095         Type min,
00096         Type max,
00097         const Char* szDescription)
00098     {
00099         DescriptorItemNumeric::Initialise(szName, szDescription);
00100         m_defaultValue = defaultValue;
00101         m_minValue = min;
00102         m_maxValue = max;
00103 
00104         m_pSetValueCallBack = SetVar;
00105         m_pGetValueCallBack = GetVar;
00106     }
00107 
00108     void Finalise()
00109     {
00110         DescriptorItemNumeric::Finalise();
00111         m_nDataOffset = INVALID_DATA_OFFSET;
00112         m_pSetValueCallBack = 0;
00113         m_pGetValueCallBack = 0;
00114         m_defaultValue = 0;
00115         m_minValue = 0;
00116         m_maxValue = 0;
00117     }
00118     
00119     virtual String GetValueAsString(Descriptor* pDescriptor) const
00120     { 
00121         return String(GetValue(pDescriptor)); 
00122     }
00123     virtual String GetDisplayString(Descriptor* pDescriptor) const 
00124     { 
00125         String strDisplayString = GetName();
00126         strDisplayString += ": ";       
00127         strDisplayString += GetValue(pDescriptor);
00128         return strDisplayString;
00129     }
00130     virtual void SetValueFromString(const char* szString, Descriptor* pDescriptor)
00131     {
00132         SetValue((Type)atof(szString), pDescriptor);
00133     }
00134     virtual void SetToDefaultValue(Descriptor* pDescriptor) { SetValue(m_defaultValue, pDescriptor); }  
00135 
00136 private:
00137     u32 m_nDataOffset;
00138     Type m_defaultValue;
00139     Type m_minValue;
00140     Type m_maxValue;
00141     void (*m_pSetValueCallBack)(Type, void* pData);
00142     Type (*m_pGetValueCallBack)(void* pData);
00143     
00144     Type& GetValueRef(Descriptor* pDescriptor) const
00145     { 
00146         return *(Type*)((u32)pDescriptor + m_nDataOffset);
00147     }
00148 
00149     void SetValue(Type value, Descriptor* pDescriptor)
00150     {
00151         if (m_nDataOffset != INVALID_DATA_OFFSET)
00152             GetValueRef(pDescriptor) = value;
00153         else if (m_pSetValueCallBack)
00154             m_pSetValueCallBack(value, pDescriptor);
00155     }
00156     Type GetValue(Descriptor* pDescriptor) const
00157     {
00158         if (m_nDataOffset != INVALID_DATA_OFFSET)
00159             return GetValueRef(pDescriptor);
00160         else if (m_pGetValueCallBack)
00161             return m_pGetValueCallBack(pDescriptor);
00162         else
00163             return Type(0);
00164     }
00165 };
00166 
00167 }
00168 
00169 #include "DescriptorItemNumeric.inl"
00170 
00171 
00172 #endif // TA_DESCRIPTORITEMNUMERIC_H


© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.