HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SIM_OptionsUser.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  */
7 
8 #ifndef __SIM_OptionsUser_h__
9 #define __SIM_OptionsUser_h__
10 
11 #include "SIM_API.h"
12 #include "SIM_Options.h"
13 
14 #include <UT/UT_IStream.h>
15 #include <UT/UT_Ramp.h>
16 
17 class SIM_Data;
18 
19 /// This class can be included as a base class of any SIM_Data subclass.
20 /// Doing so provides an easy way to establish and store a set of simple
21 /// values that define that data type. The macros at the end of this file
22 /// make it easy to create get and set access functions for this data.
24 {
25 public:
26  SIM_OptionsUser(SIM_Data *owner);
27  virtual ~SIM_OptionsUser();
28 
29  /// This callback function that is run by SIM_Options::optionChanged().
30  /// It calls the virtual optionChangedSubclass().
31  void optionChanged(const char *name);
32 
33  const SIM_Options &getOptions() const;
34 
35 protected:
36  SIM_Options &getOptions();
37 
38  virtual void optionChangedSubclass(const char *name);
39 
40 private:
41  SIM_Data *myOwner;
42  SIM_Options myOptions;
43 };
44 
45 #if !defined(_MSC_VER) || _MSC_VER >= 1900
46 #define SIM_FUNCTION_LEVEL_STATIC static
47 #else
48 #define SIM_FUNCTION_LEVEL_STATIC
49 #endif
50 
51 #define GET_DATA_FUNC_I(DataName, FuncName) \
52  int64 get##FuncName() const \
53  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
54  return getOptions().getOptionI(cname); }
55 #define GET_DATA_FUNC_E(DataName, FuncName, EnumType) \
56  EnumType get##FuncName() const \
57  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
58  return static_cast<EnumType> \
59  (getOptions().getOptionI(cname)); }
60 #define GET_DATA_FUNC_B(DataName, FuncName) \
61  bool get##FuncName() const \
62  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
63  return getOptions().getOptionB(cname); }
64 #define GET_DATA_FUNC_F(DataName, FuncName) \
65  fpreal64 get##FuncName() const \
66  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
67  return getOptions().getOptionF(cname); }
68 
69 #define GET_DATA_FUNC_RAMP(DataName, FuncName) \
70  bool get##FuncName(UT_Ramp &ramp) const \
71  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
72  UT_StringHolder rs; \
73  rs = getOptions().getOptionS(cname); \
74  UT_IStream is((const char *) rs, rs.length(), UT_ISTREAM_ASCII); \
75  return ramp.load(is); \
76  }
77 
78 #define _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, BaseType, Accessor) \
79  const BaseType##D get##FuncName##D() const \
80  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
81  return getOptions().getOption##Accessor(cname); } \
82  const BaseType##F get##FuncName##F() const \
83  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
84  return getOptions().getOption##Accessor(cname); } \
85  const BaseType##F get##FuncName() const \
86  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
87  return getOptions().getOption##Accessor(cname); }
88 
89 #define GET_DATA_FUNC_V2(DataName, FuncName) \
90  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2, V2);
91 #define GET_DATA_FUNC_V2D(DataName, FuncName) \
92  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2D, V2);
93 #define GET_DATA_FUNC_UV(DataName, FuncName) \
94  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2, V2);
95 #define GET_DATA_FUNC_V3(DataName, FuncName) \
96  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3, V3);
97 #define GET_DATA_FUNC_V3D(DataName, FuncName) \
98  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3D, V3);
99 #define GET_DATA_FUNC_UVW(DataName, FuncName) \
100  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3, V3);
101 #define GET_DATA_FUNC_V4(DataName, FuncName) \
102  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector4, V4);
103 #define GET_DATA_FUNC_V4D(DataName, FuncName) \
104  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector4D, V4);
105 #define GET_DATA_FUNC_Q(DataName, FuncName) \
106  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Quaternion, Q);
107 #define GET_DATA_FUNC_QD(DataName, FuncName) \
108  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_QuaternionD, Q);
109 #define GET_DATA_FUNC_M3(DataName, FuncName) \
110  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Matrix3, M3);
111 #define GET_DATA_FUNC_M4(DataName, FuncName) \
112  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Matrix4, M4);
113 #define GET_DATA_FUNC_S(DataName, FuncName) \
114  const UT_StringHolder &get##FuncName() const \
115  { SIM_FUNCTION_LEVEL_STATIC UT_StringRef cname(DataName); \
116  return getOptions().getOptionS(cname); } \
117  void get##FuncName(UT_String &value) const \
118  { value = get##FuncName(); }
119 
120 #define _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, BaseType, Accessor) \
121  const BaseType##D get##FuncName##D(const SIM_Options &options) const \
122  { return options.hasOption(DataName) \
123  ? options.getOption##Accessor(DataName) \
124  : BaseType##D Default; \
125  } \
126  const BaseType##F get##FuncName##F(const SIM_Options &options) const \
127  { return options.hasOption(DataName) \
128  ? options.getOption##Accessor(DataName) \
129  : BaseType##D Default; \
130  } \
131  const BaseType##F get##FuncName(const SIM_Options &options) const \
132  { return options.hasOption(DataName) \
133  ? options.getOption##Accessor(DataName) \
134  : BaseType##D Default; \
135  }
136 
137 #define GET_GUIDE_FUNC_I(DataName, FuncName, Default) \
138  int64 get##FuncName(const SIM_Options &options) const \
139  { return options.hasOption(DataName) \
140  ? options.getOptionI(DataName) \
141  : Default; \
142  }
143 #define GET_GUIDE_FUNC_E(DataName, FuncName, EnumType, Default) \
144  EnumType get##FuncName(const SIM_Options &options) const \
145  { return static_cast<EnumType> (options.hasOption(DataName) \
146  ? options.getOptionI(DataName) \
147  : Default); \
148  }
149 #define GET_GUIDE_FUNC_B(DataName, FuncName, Default) \
150  bool get##FuncName(const SIM_Options &options) const \
151  { return options.hasOption(DataName) \
152  ? options.getOptionB(DataName) \
153  : Default; \
154  }
155 #define GET_GUIDE_FUNC_F(DataName, FuncName, Default) \
156  fpreal64 get##FuncName(const SIM_Options &options) const \
157  { return options.hasOption(DataName) \
158  ? options.getOptionF(DataName) \
159  : Default; \
160  }
161 #define GET_GUIDE_FUNC_V2(DataName, FuncName, Default) \
162  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector2, V2)
163 #define GET_GUIDE_FUNC_V3(DataName, FuncName, Default) \
164  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector3, V3)
165 #define GET_GUIDE_FUNC_V4(DataName, FuncName, Default) \
166  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector4, V4)
167 
168 #define GET_GUIDE_FUNC_S(DataName, FuncName, Default) \
169  void get##FuncName(UT_String &value, const SIM_Options &options) const \
170  { if (options.hasOption(DataName)) \
171  options.getOptionS(DataName, value); \
172  else \
173  value = Default; \
174  }
175 
176 #define GET_GUIDE_FUNC_RAMP(DataName, FuncName) \
177  bool get##FuncName(UT_Ramp &ramp, const SIM_Options &options) const \
178  { if (options.hasOption(DataName)) \
179  { UT_String rs; \
180  options.getOptionS(DataName, rs); \
181  UT_IStream is((const char *) rs, rs.length(), UT_ISTREAM_ASCII); \
182  return ramp.load(is); } \
183  return false; \
184  }
185 
186 #define SET_DATA_FUNC_I(DataName, FuncName) \
187  void set##FuncName(const int64 value) \
188  { getOptions().setOptionI(DataName, value); }
189 #define SET_DATA_FUNC_E(DataName, FuncName, EnumType) \
190  void set##FuncName(const EnumType value) \
191  { getOptions().setOptionI(DataName, \
192  static_cast<int>(value)); }
193 #define SET_DATA_FUNC_B(DataName, FuncName) \
194  void set##FuncName(const bool value) \
195  { getOptions().setOptionB(DataName, value); }
196 #define SET_DATA_FUNC_F(DataName, FuncName) \
197  void set##FuncName(const fpreal64 value) \
198  { getOptions().setOptionF(DataName, value); }
199 #define SET_DATA_FUNC_V2(DataName, FuncName) \
200  void set##FuncName(const UT_Vector2F &value) \
201  { getOptions().setOptionV2(DataName, value); } \
202  void set##FuncName(const UT_Vector2D &value) \
203  { getOptions().setOptionV2(DataName, value); }
204 #define SET_DATA_FUNC_UV(DataName, FuncName) \
205  void set##FuncName(const UT_Vector2F &value) \
206  { getOptions().setOptionUV(DataName, value); } \
207  void set##FuncName(const UT_Vector2D &value) \
208  { getOptions().setOptionUV(DataName, value); }
209 #define SET_DATA_FUNC_V3(DataName, FuncName) \
210  void set##FuncName(const UT_Vector3F &value) \
211  { getOptions().setOptionV3(DataName, value); } \
212  void set##FuncName(const UT_Vector3D &value) \
213  { getOptions().setOptionV3(DataName, value); }
214 #define SET_DATA_FUNC_UVW(DataName, FuncName) \
215  void set##FuncName(const UT_Vector3F &value) \
216  { getOptions().setOptionUVW(DataName, value); } \
217  void set##FuncName(const UT_Vector3D &value) \
218  { getOptions().setOptionUVW(DataName, value); }
219 #define SET_DATA_FUNC_V4(DataName, FuncName) \
220  void set##FuncName(const UT_Vector4F &value) \
221  { getOptions().setOptionV4(DataName, value); } \
222  void set##FuncName(const UT_Vector4D &value) \
223  { getOptions().setOptionV4(DataName, value); }
224 #define SET_DATA_FUNC_Q(DataName, FuncName) \
225  void set##FuncName(const UT_QuaternionF &value) \
226  { getOptions().setOptionQ(DataName, value); } \
227  void set##FuncName(const UT_QuaternionD &value) \
228  { getOptions().setOptionQ(DataName, value); }
229 #define SET_DATA_FUNC_M3(DataName, FuncName) \
230  void set##FuncName(const UT_Matrix3F &value) \
231  { getOptions().setOptionM3(DataName, value); } \
232  void set##FuncName(const UT_Matrix3D &value) \
233  { getOptions().setOptionM3(DataName, value); }
234 #define SET_DATA_FUNC_M4(DataName, FuncName) \
235  void set##FuncName(const UT_Matrix4F &value) \
236  { getOptions().setOptionM4(DataName, value); } \
237  void set##FuncName(const UT_Matrix4D &value) \
238  { getOptions().setOptionM4(DataName, value); }
239 #define SET_DATA_FUNC_S(DataName, FuncName) \
240  void set##FuncName(const UT_StringHolder &value) \
241  { getOptions().setOptionS(DataName, value); }
242 
243 #define SET_DATA_FUNC_RAMP(DataName, FuncName) \
244  void set##FuncName(const UT_Ramp &ramp) const \
245  { UT_OStringStream os; \
246  ramp.save(os); \
247  getOptions().setOptionS(DataName, os.str().buffer()); \
248  }
249 
250 #define GETSET_DATA_FUNCS_I(DataName, FuncName) \
251  GET_DATA_FUNC_I(DataName, FuncName) \
252  SET_DATA_FUNC_I(DataName, FuncName)
253 #define GETSET_DATA_FUNCS_E(DataName, FuncName, EnumType) \
254  GET_DATA_FUNC_E(DataName, FuncName, EnumType) \
255  SET_DATA_FUNC_E(DataName, FuncName, EnumType)
256 #define GETSET_DATA_FUNCS_B(DataName, FuncName) \
257  GET_DATA_FUNC_B(DataName, FuncName) \
258  SET_DATA_FUNC_B(DataName, FuncName)
259 #define GETSET_DATA_FUNCS_F(DataName, FuncName) \
260  GET_DATA_FUNC_F(DataName, FuncName) \
261  SET_DATA_FUNC_F(DataName, FuncName)
262 #define GETSET_DATA_FUNCS_V2(DataName, FuncName) \
263  GET_DATA_FUNC_V2(DataName, FuncName) \
264  SET_DATA_FUNC_V2(DataName, FuncName)
265 #define GETSET_DATA_FUNCS_UV(DataName, FuncName) \
266  GET_DATA_FUNC_UV(DataName, FuncName) \
267  SET_DATA_FUNC_UV(DataName, FuncName)
268 #define GETSET_DATA_FUNCS_V3(DataName, FuncName) \
269  GET_DATA_FUNC_V3(DataName, FuncName) \
270  SET_DATA_FUNC_V3(DataName, FuncName)
271 #define GETSET_DATA_FUNCS_UVW(DataName, FuncName) \
272  GET_DATA_FUNC_UVW(DataName, FuncName) \
273  SET_DATA_FUNC_UVW(DataName, FuncName)
274 #define GETSET_DATA_FUNCS_V4(DataName, FuncName) \
275  GET_DATA_FUNC_V4(DataName, FuncName) \
276  SET_DATA_FUNC_V4(DataName, FuncName)
277 #define GETSET_DATA_FUNCS_Q(DataName, FuncName) \
278  GET_DATA_FUNC_Q(DataName, FuncName) \
279  SET_DATA_FUNC_Q(DataName, FuncName)
280 #define GETSET_DATA_FUNCS_M3(DataName, FuncName) \
281  GET_DATA_FUNC_M3(DataName, FuncName) \
282  SET_DATA_FUNC_M3(DataName, FuncName)
283 #define GETSET_DATA_FUNCS_M4(DataName, FuncName) \
284  GET_DATA_FUNC_M4(DataName, FuncName) \
285  SET_DATA_FUNC_M4(DataName, FuncName)
286 #define GETSET_DATA_FUNCS_S(DataName, FuncName) \
287  GET_DATA_FUNC_S(DataName, FuncName) \
288  SET_DATA_FUNC_S(DataName, FuncName)
289 #define GETSET_DATA_FUNCS_RAMP(DataName, FuncName) \
290  GET_DATA_FUNC_RAMP(DataName, FuncName) \
291  SET_DATA_FUNC_RAMP(DataName, FuncName)
292 
293 #endif
294 
GLuint const GLchar * name
Definition: glcorearb.h:785
#define SIM_API
Definition: SIM_API.h:10