00001
00002
00003 #ifndef NV_TWEAKVAR_H
00004 #define NV_TWEAKVAR_H
00005
00006 #include <NvFoundation.h>
00007
00019 struct NvTweakVarBase {
00020 protected:
00021 const char* mName;
00022 const char* mDesc;
00023 uint32_t mActionCode;
00031 NvTweakVarBase(const char* name, const char *description=NULL)
00032 : mName(name)
00033 , mDesc(description)
00034 , mActionCode(0)
00035 {
00036
00037 }
00038
00039 public:
00043 virtual void increment() = 0;
00044 virtual void decrement() = 0;
00045 virtual void reset() = 0;
00049 const char *getName() { return mName; }
00051 const char *getDesc() { return mDesc; }
00052
00054 void setActionCode(uint32_t code) { mActionCode = code; }
00056 uint32_t getActionCode() { return mActionCode; }
00057 };
00058
00059
00061 template<class T>
00062 struct NvTweakVar : public NvTweakVarBase {
00063 private:
00064 NvTweakVar() {}
00065 NvTweakVar& operator=( const NvTweakVar& v) {}
00066 NvTweakVar( const NvTweakVar& v){}
00067
00068 protected:
00069 T& mValRef;
00070 T mValInitial;
00072 T mValSelf;
00074 T mValMin;
00075 T mValMax;
00076 T mValStep;
00078 bool mValClamped;
00079 bool mValLoop;
00081 public:
00083 operator T&() { return mValRef;}
00085 operator const T&() const { return mValRef;}
00087 const NvTweakVar& operator=( T val) { mValRef = val; return *this; }
00088
00090 NvTweakVar( T& refVal, const char* name, T minVal, T maxVal, T step, char *description=NULL)
00091 : NvTweakVarBase(name, description)
00092 , mValRef(refVal)
00093 , mValInitial(refVal)
00094 , mValMin(minVal)
00095 , mValMax(maxVal)
00096 , mValStep((step==0)?1:step)
00097 , mValClamped(true)
00098 , mValLoop(false)
00099 {
00100
00101 }
00102
00104 NvTweakVar(const char* name, T minVal, T maxVal, T step, char *description=NULL)
00105 : NvTweakVarBase(name, description)
00106 , mValRef(mValSelf)
00107 , mValInitial(0)
00108 , mValSelf(0)
00109 , mValMin(minVal)
00110 , mValMax(maxVal)
00111 , mValStep((step==0)?1:step)
00112 , mValClamped(true)
00113 , mValLoop(false)
00114 {
00115
00116 }
00117
00119 NvTweakVar( T& refVal, const char* name, const char *description=NULL)
00120 : NvTweakVarBase(name, description)
00121 , mValRef(refVal)
00122 , mValInitial(refVal)
00123 , mValMin((T)0)
00124 , mValMax((T)0)
00125 , mValStep((T)1)
00126 , mValClamped(false)
00127 , mValLoop(false)
00128 {
00129
00130 }
00131
00133 NvTweakVar(const char* name, const char *description=NULL)
00134 : NvTweakVarBase(name, description)
00135 , mValRef(mValSelf)
00136 , mValInitial(0)
00137 , mValSelf(0)
00138 , mValMin((T)0)
00139 , mValMax((T)0)
00140 , mValStep((T)1)
00141 , mValClamped(false)
00142 , mValLoop(false)
00143 {
00144
00145 }
00146
00148 void setValLoop(bool loop) { mValLoop = loop; }
00149
00151 virtual void increment();
00153 virtual void decrement();
00154
00156 virtual void reset() {
00157 mValRef = mValInitial;
00158 }
00159 };
00160
00162 struct NvTweakCmd {
00163 enum Enum {
00164 NONE = 0,
00165 RESET,
00166 INCREMENT,
00167 DECREMENT,
00168 };
00169 };
00170
00172 struct NvTweakBind {
00173 NvTweakCmd::Enum mCmd;
00174 NvTweakVarBase *mVar;
00175
00176 NvTweakBind()
00177 : mCmd(NvTweakCmd::NONE), mVar(NULL) { };
00178 NvTweakBind(NvTweakCmd::Enum cmd, NvTweakVarBase *var)
00179 : mCmd(cmd), mVar(var) { };
00180 };
00181
00182 #endif //NV_TWEAKVAR_H