HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups 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 #define GET_DATA_FUNC_I_sh(DataName, FuncName) \
46  int64 get##FuncName() const \
47  { return getOptions().getOptionI(DataName); }
48 #define GET_DATA_FUNC_I(DataName, FuncName) \
49  int64 get##FuncName() const \
50  { static constexpr UT_StringLit dname(DataName); \
51  return getOptions().getOptionI(dname.asRef()); }
52 #define GET_DATA_FUNC_E_sh(DataName, FuncName, EnumType) \
53  EnumType get##FuncName() const \
54  { return static_cast<EnumType> \
55  (getOptions().getOptionI(DataName)); }
56 #define GET_DATA_FUNC_E(DataName, FuncName, EnumType) \
57  EnumType get##FuncName() const \
58  { static constexpr UT_StringLit dname(DataName); \
59  return static_cast<EnumType> \
60  (getOptions().getOptionI(dname.asRef())); }
61 #define GET_DATA_FUNC_B_sh(DataName, FuncName) \
62  bool get##FuncName() const \
63  { return getOptions().getOptionB(DataName); }
64 #define GET_DATA_FUNC_B(DataName, FuncName) \
65  bool get##FuncName() const \
66  { static constexpr UT_StringLit dname(DataName); \
67  return getOptions().getOptionB(dname.asRef()); }
68 #define GET_DATA_FUNC_F_sh(DataName, FuncName) \
69  fpreal64 get##FuncName() const \
70  { return getOptions().getOptionF(DataName); }
71 #define GET_DATA_FUNC_F(DataName, FuncName) \
72  fpreal64 get##FuncName() const \
73  { static constexpr UT_StringLit dname(DataName); \
74  return getOptions().getOptionF(dname.asRef()); }
75 
76 #define GET_DATA_FUNC_RAMP_sh(DataName, FuncName) \
77  bool get##FuncName(UT_Ramp &ramp) const \
78  { UT_StringHolder rs; \
79  rs = getOptions().getOptionS(DataName); \
80  UT_IStream is((const char *) rs, rs.length(), UT_ISTREAM_ASCII); \
81  return ramp.load(is); \
82  }
83 #define GET_DATA_FUNC_RAMP(DataName, FuncName) \
84  bool get##FuncName(UT_Ramp &ramp) const \
85  { static constexpr UT_StringLit dname(DataName); \
86  UT_StringHolder rs; \
87  rs = getOptions().getOptionS(dname.asRef()); \
88  UT_IStream is((const char *) rs, rs.length(), UT_ISTREAM_ASCII); \
89  return ramp.load(is); \
90  }
91 
92 #define _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, BaseType, Accessor) \
93  const BaseType##D get##FuncName##D() const \
94  { static constexpr UT_StringLit dname(DataName); \
95  return getOptions().getOption##Accessor(dname.asRef()); } \
96  const BaseType##F get##FuncName##F() const \
97  { static constexpr UT_StringLit dname(DataName); \
98  return getOptions().getOption##Accessor(dname.asRef()); } \
99  const BaseType##F get##FuncName() const \
100  { static constexpr UT_StringLit dname(DataName); \
101  return getOptions().getOption##Accessor(dname.asRef()); }
102 
103 #define _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, BaseType, Accessor) \
104  const BaseType##D get##FuncName##D() const \
105  { return getOptions().getOption##Accessor(DataName); } \
106  const BaseType##F get##FuncName##F() const \
107  { return getOptions().getOption##Accessor(DataName); } \
108  const BaseType##F get##FuncName() const \
109  { return getOptions().getOption##Accessor(DataName); }
110 
111 #define GET_DATA_FUNC_V2(DataName, FuncName) \
112  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2, V2);
113 #define GET_DATA_FUNC_V2D(DataName, FuncName) \
114  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2D, V2);
115 #define GET_DATA_FUNC_UV(DataName, FuncName) \
116  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector2, V2);
117 #define GET_DATA_FUNC_V3(DataName, FuncName) \
118  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3, V3);
119 #define GET_DATA_FUNC_V3D(DataName, FuncName) \
120  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3D, V3);
121 #define GET_DATA_FUNC_UVW(DataName, FuncName) \
122  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector3, V3);
123 #define GET_DATA_FUNC_V4(DataName, FuncName) \
124  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector4, V4);
125 #define GET_DATA_FUNC_V4D(DataName, FuncName) \
126  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Vector4D, V4);
127 #define GET_DATA_FUNC_Q(DataName, FuncName) \
128  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Quaternion, Q);
129 #define GET_DATA_FUNC_QD(DataName, FuncName) \
130  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_QuaternionD, Q);
131 #define GET_DATA_FUNC_M3(DataName, FuncName) \
132  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Matrix3, M3);
133 #define GET_DATA_FUNC_M4(DataName, FuncName) \
134  _BUILD_SIM_OPTION_GETTERS(DataName, FuncName, UT_Matrix4, M4);
135 
136 #define GET_DATA_FUNC_V2_sh(DataName, FuncName) \
137  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector2, V2);
138 #define GET_DATA_FUNC_V2D_sh(DataName, FuncName) \
139  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector2D, V2);
140 #define GET_DATA_FUNC_UV_sh(DataName, FuncName) \
141  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector2, V2);
142 #define GET_DATA_FUNC_V3_sh(DataName, FuncName) \
143  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector3, V3);
144 #define GET_DATA_FUNC_V3D_sh(DataName, FuncName) \
145  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector3D, V3);
146 #define GET_DATA_FUNC_UVW_sh(DataName, FuncName) \
147  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector3, V3);
148 #define GET_DATA_FUNC_V4_sh(DataName, FuncName) \
149  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector4, V4);
150 #define GET_DATA_FUNC_V4D_sh(DataName, FuncName) \
151  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Vector4D, V4);
152 #define GET_DATA_FUNC_Q_sh(DataName, FuncName) \
153  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Quaternion, Q);
154 #define GET_DATA_FUNC_QD_sh(DataName, FuncName) \
155  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_QuaternionD, Q);
156 #define GET_DATA_FUNC_M3_sh(DataName, FuncName) \
157  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Matrix3, M3);
158 #define GET_DATA_FUNC_M4_sh(DataName, FuncName) \
159  _BUILD_SIM_OPTION_GETTERS_sh(DataName, FuncName, UT_Matrix4, M4);
160 
161 #define GET_DATA_FUNC_S_sh(DataName, FuncName) \
162  const UT_StringHolder &get##FuncName() const \
163  { return getOptions().getOptionS(DataName); } \
164  void get##FuncName(UT_String &value) const \
165  { value = get##FuncName(); }
166 #define GET_DATA_FUNC_S(DataName, FuncName) \
167  const UT_StringHolder &get##FuncName() const \
168  { static constexpr UT_StringLit dname(DataName); \
169  return getOptions().getOptionS(dname.asRef()); } \
170  void get##FuncName(UT_String &value) const \
171  { value = get##FuncName(); }
172 
173 #define _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, BaseType, Accessor) \
174  const BaseType##D get##FuncName##D(const SIM_Options &options) const \
175  { return options.hasOption(DataName) \
176  ? options.getOption##Accessor(DataName) \
177  : BaseType##D Default; \
178  } \
179  const BaseType##F get##FuncName##F(const SIM_Options &options) const \
180  { return options.hasOption(DataName) \
181  ? options.getOption##Accessor(DataName) \
182  : BaseType##D Default; \
183  } \
184  const BaseType##F get##FuncName(const SIM_Options &options) const \
185  { return options.hasOption(DataName) \
186  ? options.getOption##Accessor(DataName) \
187  : BaseType##D Default; \
188  }
189 
190 #define GET_GUIDE_FUNC_I(DataName, FuncName, Default) \
191  int64 get##FuncName(const SIM_Options &options) const \
192  { return options.hasOption(DataName) \
193  ? options.getOptionI(DataName) \
194  : Default; \
195  }
196 #define GET_GUIDE_FUNC_E(DataName, FuncName, EnumType, Default) \
197  EnumType get##FuncName(const SIM_Options &options) const \
198  { return static_cast<EnumType> (options.hasOption(DataName) \
199  ? options.getOptionI(DataName) \
200  : Default); \
201  }
202 #define GET_GUIDE_FUNC_B(DataName, FuncName, Default) \
203  bool get##FuncName(const SIM_Options &options) const \
204  { return options.hasOption(DataName) \
205  ? options.getOptionB(DataName) \
206  : Default; \
207  }
208 #define GET_GUIDE_FUNC_F(DataName, FuncName, Default) \
209  fpreal64 get##FuncName(const SIM_Options &options) const \
210  { return options.hasOption(DataName) \
211  ? options.getOptionF(DataName) \
212  : Default; \
213  }
214 #define GET_GUIDE_FUNC_V2(DataName, FuncName, Default) \
215  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector2, V2)
216 #define GET_GUIDE_FUNC_V3(DataName, FuncName, Default) \
217  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector3, V3)
218 #define GET_GUIDE_FUNC_V4(DataName, FuncName, Default) \
219  _BUILD_SIM_OPTION_GUIDE_GETTERS(DataName, FuncName, Default, UT_Vector4, V4)
220 
221 #define GET_GUIDE_FUNC_S(DataName, FuncName, Default) \
222  void get##FuncName(UT_String &value, const SIM_Options &options) const \
223  { if (options.hasOption(DataName)) \
224  options.getOptionS(DataName, value); \
225  else \
226  value = Default; \
227  }
228 
229 #define GET_GUIDE_FUNC_RAMP(DataName, FuncName) \
230  bool get##FuncName(UT_Ramp &ramp, const SIM_Options &options) const \
231  { if (options.hasOption(DataName)) \
232  { UT_String rs; \
233  options.getOptionS(DataName, rs); \
234  UT_IStream is((const char *) rs, rs.length(), UT_ISTREAM_ASCII); \
235  return ramp.load(is); } \
236  return false; \
237  }
238 
239 #define SET_DATA_FUNC_I(DataName, FuncName) \
240  void set##FuncName(const int64 value) \
241  { getOptions().setOptionI(DataName, value); }
242 #define SET_DATA_FUNC_E(DataName, FuncName, EnumType) \
243  void set##FuncName(const EnumType value) \
244  { getOptions().setOptionI(DataName, \
245  static_cast<int>(value)); }
246 #define SET_DATA_FUNC_B(DataName, FuncName) \
247  void set##FuncName(const bool value) \
248  { getOptions().setOptionB(DataName, value); }
249 #define SET_DATA_FUNC_F(DataName, FuncName) \
250  void set##FuncName(const fpreal64 value) \
251  { getOptions().setOptionF(DataName, value); }
252 #define SET_DATA_FUNC_V2(DataName, FuncName) \
253  void set##FuncName(const UT_Vector2F &value) \
254  { getOptions().setOptionV2(DataName, value); } \
255  void set##FuncName(const UT_Vector2D &value) \
256  { getOptions().setOptionV2(DataName, value); }
257 #define SET_DATA_FUNC_UV(DataName, FuncName) \
258  void set##FuncName(const UT_Vector2F &value) \
259  { getOptions().setOptionUV(DataName, value); } \
260  void set##FuncName(const UT_Vector2D &value) \
261  { getOptions().setOptionUV(DataName, value); }
262 #define SET_DATA_FUNC_V3(DataName, FuncName) \
263  void set##FuncName(const UT_Vector3F &value) \
264  { getOptions().setOptionV3(DataName, value); } \
265  void set##FuncName(const UT_Vector3D &value) \
266  { getOptions().setOptionV3(DataName, value); }
267 #define SET_DATA_FUNC_UVW(DataName, FuncName) \
268  void set##FuncName(const UT_Vector3F &value) \
269  { getOptions().setOptionUVW(DataName, value); } \
270  void set##FuncName(const UT_Vector3D &value) \
271  { getOptions().setOptionUVW(DataName, value); }
272 #define SET_DATA_FUNC_V4(DataName, FuncName) \
273  void set##FuncName(const UT_Vector4F &value) \
274  { getOptions().setOptionV4(DataName, value); } \
275  void set##FuncName(const UT_Vector4D &value) \
276  { getOptions().setOptionV4(DataName, value); }
277 #define SET_DATA_FUNC_Q(DataName, FuncName) \
278  void set##FuncName(const UT_QuaternionF &value) \
279  { getOptions().setOptionQ(DataName, value); } \
280  void set##FuncName(const UT_QuaternionD &value) \
281  { getOptions().setOptionQ(DataName, value); }
282 #define SET_DATA_FUNC_M3(DataName, FuncName) \
283  void set##FuncName(const UT_Matrix3F &value) \
284  { getOptions().setOptionM3(DataName, value); } \
285  void set##FuncName(const UT_Matrix3D &value) \
286  { getOptions().setOptionM3(DataName, value); }
287 #define SET_DATA_FUNC_M4(DataName, FuncName) \
288  void set##FuncName(const UT_Matrix4F &value) \
289  { getOptions().setOptionM4(DataName, value); } \
290  void set##FuncName(const UT_Matrix4D &value) \
291  { getOptions().setOptionM4(DataName, value); }
292 #define SET_DATA_FUNC_S(DataName, FuncName) \
293  void set##FuncName(const UT_StringHolder &value) \
294  { getOptions().setOptionS(DataName, value); }
295 
296 #define SET_DATA_FUNC_RAMP(DataName, FuncName) \
297  void set##FuncName(const UT_Ramp &ramp) const \
298  { UT_OStringStream os; \
299  ramp.save(os); \
300  getOptions().setOptionS(DataName, os.str().buffer()); \
301  }
302 
303 #define GETSET_DATA_FUNCS_I(DataName, FuncName) \
304  GET_DATA_FUNC_I(DataName, FuncName) \
305  SET_DATA_FUNC_I(DataName, FuncName)
306 #define GETSET_DATA_FUNCS_E(DataName, FuncName, EnumType) \
307  GET_DATA_FUNC_E(DataName, FuncName, EnumType) \
308  SET_DATA_FUNC_E(DataName, FuncName, EnumType)
309 #define GETSET_DATA_FUNCS_B(DataName, FuncName) \
310  GET_DATA_FUNC_B(DataName, FuncName) \
311  SET_DATA_FUNC_B(DataName, FuncName)
312 #define GETSET_DATA_FUNCS_F(DataName, FuncName) \
313  GET_DATA_FUNC_F(DataName, FuncName) \
314  SET_DATA_FUNC_F(DataName, FuncName)
315 #define GETSET_DATA_FUNCS_V2(DataName, FuncName) \
316  GET_DATA_FUNC_V2(DataName, FuncName) \
317  SET_DATA_FUNC_V2(DataName, FuncName)
318 #define GETSET_DATA_FUNCS_UV(DataName, FuncName) \
319  GET_DATA_FUNC_UV(DataName, FuncName) \
320  SET_DATA_FUNC_UV(DataName, FuncName)
321 #define GETSET_DATA_FUNCS_V3(DataName, FuncName) \
322  GET_DATA_FUNC_V3(DataName, FuncName) \
323  SET_DATA_FUNC_V3(DataName, FuncName)
324 #define GETSET_DATA_FUNCS_UVW(DataName, FuncName) \
325  GET_DATA_FUNC_UVW(DataName, FuncName) \
326  SET_DATA_FUNC_UVW(DataName, FuncName)
327 #define GETSET_DATA_FUNCS_V4(DataName, FuncName) \
328  GET_DATA_FUNC_V4(DataName, FuncName) \
329  SET_DATA_FUNC_V4(DataName, FuncName)
330 #define GETSET_DATA_FUNCS_Q(DataName, FuncName) \
331  GET_DATA_FUNC_Q(DataName, FuncName) \
332  SET_DATA_FUNC_Q(DataName, FuncName)
333 #define GETSET_DATA_FUNCS_M3(DataName, FuncName) \
334  GET_DATA_FUNC_M3(DataName, FuncName) \
335  SET_DATA_FUNC_M3(DataName, FuncName)
336 #define GETSET_DATA_FUNCS_M4(DataName, FuncName) \
337  GET_DATA_FUNC_M4(DataName, FuncName) \
338  SET_DATA_FUNC_M4(DataName, FuncName)
339 #define GETSET_DATA_FUNCS_S(DataName, FuncName) \
340  GET_DATA_FUNC_S(DataName, FuncName) \
341  SET_DATA_FUNC_S(DataName, FuncName)
342 #define GETSET_DATA_FUNCS_RAMP(DataName, FuncName) \
343  GET_DATA_FUNC_RAMP(DataName, FuncName) \
344  SET_DATA_FUNC_RAMP(DataName, FuncName)
345 
346 #define GETSET_DATA_FUNCS_I_sh(DataName, FuncName) \
347  GET_DATA_FUNC_I_sh(DataName, FuncName) \
348  SET_DATA_FUNC_I(DataName, FuncName)
349 #define GETSET_DATA_FUNCS_E_sh(DataName, FuncName, EnumType) \
350  GET_DATA_FUNC_E_sh(DataName, FuncName, EnumType) \
351  SET_DATA_FUNC_E(DataName, FuncName, EnumType)
352 #define GETSET_DATA_FUNCS_B_sh(DataName, FuncName) \
353  GET_DATA_FUNC_B_sh(DataName, FuncName) \
354  SET_DATA_FUNC_B(DataName, FuncName)
355 #define GETSET_DATA_FUNCS_F_sh(DataName, FuncName) \
356  GET_DATA_FUNC_F_sh(DataName, FuncName) \
357  SET_DATA_FUNC_F(DataName, FuncName)
358 #define GETSET_DATA_FUNCS_V2_sh(DataName, FuncName) \
359  GET_DATA_FUNC_V2_sh(DataName, FuncName) \
360  SET_DATA_FUNC_V2(DataName, FuncName)
361 #define GETSET_DATA_FUNCS_UV_sh(DataName, FuncName) \
362  GET_DATA_FUNC_UV_sh(DataName, FuncName) \
363  SET_DATA_FUNC_UV(DataName, FuncName)
364 #define GETSET_DATA_FUNCS_V3_sh(DataName, FuncName) \
365  GET_DATA_FUNC_V3_sh(DataName, FuncName) \
366  SET_DATA_FUNC_V3(DataName, FuncName)
367 #define GETSET_DATA_FUNCS_UVW_sh(DataName, FuncName) \
368  GET_DATA_FUNC_UVW_sh(DataName, FuncName) \
369  SET_DATA_FUNC_UVW(DataName, FuncName)
370 #define GETSET_DATA_FUNCS_V4_sh(DataName, FuncName) \
371  GET_DATA_FUNC_V4_sh(DataName, FuncName) \
372  SET_DATA_FUNC_V4(DataName, FuncName)
373 #define GETSET_DATA_FUNCS_Q_sh(DataName, FuncName) \
374  GET_DATA_FUNC_Q_sh(DataName, FuncName) \
375  SET_DATA_FUNC_Q(DataName, FuncName)
376 #define GETSET_DATA_FUNCS_M3_sh(DataName, FuncName) \
377  GET_DATA_FUNC_M3_sh(DataName, FuncName) \
378  SET_DATA_FUNC_M3(DataName, FuncName)
379 #define GETSET_DATA_FUNCS_M4_sh(DataName, FuncName) \
380  GET_DATA_FUNC_M4_sh(DataName, FuncName) \
381  SET_DATA_FUNC_M4(DataName, FuncName)
382 #define GETSET_DATA_FUNCS_S_sh(DataName, FuncName) \
383  GET_DATA_FUNC_S_sh(DataName, FuncName) \
384  SET_DATA_FUNC_S(DataName, FuncName)
385 #define GETSET_DATA_FUNCS_RAMP_sh(DataName, FuncName) \
386  GET_DATA_FUNC_RAMP_sh(DataName, FuncName) \
387  SET_DATA_FUNC_RAMP(DataName, FuncName)
388 
389 #endif
390 
GLuint const GLchar * name
Definition: glcorearb.h:785
#define SIM_API
Definition: SIM_API.h:10