HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GU_PackedFactory.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  * NAME: GU_PackedFactory.h (GU Library, C++)
7  *
8  * COMMENTS:
9  */
10 
11 #ifndef __GU_PackedFactory__
12 #define __GU_PackedFactory__
13 
14 #include "GU_API.h"
15 #include <UT/UT_Options.h>
16 #include <UT/UT_String.h>
17 #include <UT/UT_StringHolder.h>
19 #include <GA/GA_IntrinsicDef.h>
20 #include "GU_PackedImpl.h"
21 
22 class UT_JSONParser;
23 
24 namespace GU_PackedFactoryPrivate
25 {
26  class IntrinsicDef;
27 }
28 
30 {
31 public:
32  /// @{
33  /// Typedefs
35  typedef GU_PackedFactoryPrivate::IntrinsicDef IntrinsicDef;
36  /// @}
37 
38  /// <b> Intrinsics in Packed Primitives </b>
39  ///
40  /// Convenience methods for casting a subclass of GU_PackedImpl accessor
41  /// methods to the methods used by registerIntrinsic or
42  /// registerTupleIntrinsic. for example, the factory constructor might
43  /// look like: @code
44  /// class MyImpl : public GU_PackedImpl {
45  /// const std::string &filename() const { return myFilename; }
46  /// void setFilename(const std::string &f) { myFilename = f; }
47  /// fpreal frame() const { return myFrame; }
48  /// void setFrame(fpreal f) { myFrame = f; }
49  /// bool isAnimated() const { return myAnimated; }
50  /// };
51  /// class MyFactory : public GU_PackedFactory {
52  /// MyFactory()
53  /// {
54  /// registerIntrinsic("filename"_sh,
55  /// StdStringGetterCast(&MyImpl::filename),
56  /// StdStringSetterCast(&MyImpl::setFilename));
57  /// registerIntrinsic("frame"_sh,
58  /// FloatGetterCast(&MyImpl::frame),
59  /// FloatSetterCast(&MyImpl::setFrame));
60  /// registerIntrinsic("animated"_sh,
61  /// BoolGetterCast(&MyImpl::isAnimated));
62  /// }
63  /// };
64  /// @endcode
65 
66 #define DECL_GET_CAST(TYPE, METHOD, METHODCAST) \
67  template <typename CLASS> inline GU_PackedImpl::METHOD \
68  METHODCAST(TYPE (CLASS::*method)(const GU_PrimPacked *)const) \
69  { return (GU_PackedImpl::METHOD)(method); }
70 #define DECL_SET_CAST(TYPE, METHOD, METHODCAST) \
71  template <typename CLASS> inline GU_PackedImpl::METHOD \
72  METHODCAST(void (CLASS::*method)(GU_PrimPacked *, TYPE)) \
73  { return (GU_PackedImpl::METHOD)(method); }
74 
75 #define DECL_TGET_CAST(TYPE, METHOD, METHODCAST) \
76  template <typename CLASS> inline GU_PackedImpl::METHOD \
77  METHODCAST(TYPE (CLASS::*method)(const GU_PrimPacked *,exint)const) \
78  { return (GU_PackedImpl::METHOD)(method); }
79 #define DECL_TSET_CAST(TYPE, METHOD, METHODCAST) \
80  template <typename CLASS> inline GU_PackedImpl::METHOD \
81  METHODCAST(void (CLASS::*method)(GU_PrimPacked *, exint, TYPE)) \
82  { return (GU_PackedImpl::METHOD)(method); }
83 
84 #define DECL_VGET_CAST(TYPE, METHOD, METHODCAST) \
85  template <typename CLASS> inline GU_PackedImpl::METHOD \
86  METHODCAST(void (CLASS::*method)(const GU_PrimPacked *, TYPE *, exint) const) \
87  { return (GU_PackedImpl::METHOD)(method); }
88 #define DECL_VSET_CAST(TYPE, METHOD, METHODCAST) \
89  template <typename CLASS> inline GU_PackedImpl::METHOD \
90  METHODCAST(void (CLASS::*method)(GU_PrimPacked *, const TYPE *, exint)) \
91  { return (GU_PackedImpl::METHOD)(method); }
92 
93 
94  DECL_GET_CAST(fpreal, FloatGetter, FloatGetterCast)
95  DECL_SET_CAST(fpreal, FloatSetter, FloatSetterCast)
96  DECL_GET_CAST(exint, IntGetter, IntGetterCast)
97  DECL_SET_CAST(exint, IntSetter, IntSetterCast)
98  DECL_GET_CAST(bool, BoolGetter, BoolGetterCast)
99  DECL_SET_CAST(bool, BoolSetter, BoolSetterCast)
100  DECL_GET_CAST(const char *, StringGetter, StringGetterCast)
101  DECL_SET_CAST(const char *, StringSetter, StringSetterCast)
102  DECL_GET_CAST(std::string, StdStringGetter, StdStringGetterCast)
103  DECL_SET_CAST(const std::string &, StdStringSetter, StdStringSetterCast)
104  DECL_GET_CAST(UT_StringHolder, StringHolderGetter, StringHolderGetterCast)
105  DECL_SET_CAST(const UT_StringHolder &, StringHolderSetter, StringHolderSetterCast)
106  DECL_GET_CAST(UT_OptionsHolder, DictGetter, DictGetterCast)
107  DECL_SET_CAST(const UT_OptionsHolder &, DictSetter, DictSetterCast)
108 
109  DECL_TGET_CAST(fpreal, FloatTupleGetter, FloatTupleGetterCast)
110  DECL_TSET_CAST(fpreal, FloatTupleSetter, FloatTupleSetterCast)
111  DECL_TGET_CAST(exint, IntTupleGetter, IntTupleGetterCast)
112  DECL_TSET_CAST(exint, IntTupleSetter, IntTupleSetterCast)
113  DECL_TGET_CAST(bool, BoolTupleGetter, BoolTupleGetterCast)
114  DECL_TSET_CAST(bool, BoolTupleSetter, BoolTupleSetterCast)
115  DECL_TGET_CAST(const char *, StringTupleGetter, StringTupleGetterCast)
116  DECL_TSET_CAST(const char *, StringTupleSetter, StringTupleSetterCast)
117  DECL_TGET_CAST(const std::string &, StdStringTupleGetter, StdStringTupleGetterCast)
118  DECL_TSET_CAST(const std::string &, StdStringTupleSetter, StdStringTupleSetterCast)
119  DECL_TGET_CAST(const UT_StringHolder &, StringHolderTupleGetter, StringHolderTupleGetterCast)
120  DECL_TSET_CAST(const UT_StringHolder &, StringHolderTupleSetter, StringHolderTupleSetterCast)
121  DECL_TGET_CAST(const UT_OptionsHolder &, DictTupleGetter, DictTupleGetterCast)
122  DECL_TSET_CAST(const UT_OptionsHolder &, DictTupleSetter, DictTupleSetterCast)
123 
124  DECL_VGET_CAST(fpreal32, F32VectorGetter, F32VectorGetterCast)
125  DECL_VSET_CAST(fpreal32, F32VectorSetter, F32VectorSetterCast)
126  DECL_VGET_CAST(fpreal64, F64VectorGetter, F64VectorGetterCast)
127  DECL_VSET_CAST(fpreal64, F64VectorSetter, F64VectorSetterCast)
128  DECL_VGET_CAST(int32, I32VectorGetter, I32VectorGetterCast)
129  DECL_VSET_CAST(int32, I32VectorSetter, I32VectorSetterCast)
130  DECL_VGET_CAST(int64, I64VectorGetter, I64VectorGetterCast)
131  DECL_VSET_CAST(int64, I64VectorSetter, I64VectorSetterCast)
132  DECL_VGET_CAST(bool, BVectorGetter, BVectorGetterCast)
133  DECL_VSET_CAST(bool, BVectorSetter, BVectorSetterCast)
134 
135  template <typename CLASS>
136  inline GU_PackedImpl::StringArrayGetter
137  StringArrayGetterCast(void (CLASS::*method)(const GU_PrimPacked *,UT_StringArray &) const)
138  {
139  return (GU_PackedImpl::StringArrayGetter)(method);
140  }
141 
142  DECL_SET_CAST(const UT_StringArray &, StringArraySetter,
143  StringArraySetterCast)
144 
145  template <typename CLASS>
146  inline GU_PackedImpl::DictArrayGetter
147  DictArrayGetterCast(void (CLASS::*method)(const GU_PrimPacked *,UT_Array<UT_OptionsHolder> &) const)
148  {
149  return (GU_PackedImpl::DictArrayGetter)(method);
150  }
151 
152  DECL_SET_CAST(const UT_Array<UT_OptionsHolder> &, DictArraySetter,
153  DictArraySetterCast)
154 
155 #undef DECL_GET_METHOD_CAST
156 #undef DECL_SET_METHOD_CAST
157 #undef DECL_TGET_METHOD_CAST
158 #undef DECL_TSET_METHOD_CAST
159 #undef DECL_VGET_METHOD_CAST
160 #undef DECL_VSET_METHOD_CAST
161 
162  /// Factory constructor
166  /// Factory destructor
167  virtual ~GU_PackedFactory();
168 
169  bool isRegistered() const { return myTypeDef != 0; }
170 
171  /// @{
172  /// Member data accessors
173  const UT_StringHolder &name() const { return myName; }
174  const UT_StringHolder &label() const { return myLabel; }
175  const UT_StringHolder &icon() const { return myIcon; }
176  const GA_PrimitiveDefinition &typeDef() const { return *myTypeDef; }
177  /// @}
178 
179  /// Return an intrusive pointer to a default-constructed packed primitive
180  /// implementation of the correct type. Use this instead of create(), to avoid
181  /// redundantly allocating a new GU_PackedImpl that may just be replaced.
182  virtual const UT_IntrusivePtr<GU_PackedImpl> &defaultImpl() const = 0;
183 
184  /// Create new instance of a packed primitive implementation.
185  virtual GU_PackedImpl *create() const = 0;
186 
187  /// Load shared data for the specific implementation. Shared data must be
188  /// saved in an array containing: @code
189  /// [ "string type", "string key", object ]
190  /// @endcode
191  /// The @c type is used to differentiate between different types of shared
192  /// primitive data, while the @c key is used to uniquely identify blocks of
193  /// shared data.
194  ///
195  /// When loading a geometry file, the type and key will be loaded and
196  /// passed to this method to resolve the shared data. The code should look
197  /// something like: @code
198  /// if (!strcmp(type, "typename1"))
199  /// {
200  /// Typename1Container data;
201  /// if (!Typename1Container::load(p, data.myObject))
202  /// return false;
203  /// loadmap.resolveSharedData(key, data);
204  /// }
205  /// @endcode
206  /// This assumes that Typename1Container is a sub-class of
207  /// GA_SharedLoadData and where Typename1Container::myObject is the object
208  /// which is shared between multiple primitives.
209  ///
210  /// Note that the base class should be called if the type can't be handled
211  /// by the subclass.
212  virtual GA_SharedLoadData* loadSharedData(UT_JSONParser &p,
213  const char *type,
214  const char *key,
215  bool isDelayedLoad) const;
216 
217  virtual GA_SharedLoadDataStat* statSharedData(UT_JSONParser& parser) const;
218 
219  /// Query how many intrinsic attributes are supported by this primitive type
220  /// Default: return 0
221  int getIntrinsicCount() const
222  { return myIntrinsics.entries(); }
224  /// Get information about the definition of the Nth intrinsic
225  /// Default: assert
227  void getIntrinsicDefinition(int idx,
228  UT_String &name,
230  bool &read_only,
231  CollapseSingletons &collapse_singletons) const;
232  void getIntrinsicDefinition(int idx,
233  UT_StringHolder &name,
234  GA_StorageClass &storage,
235  bool &read_only,
236  CollapseSingletons &collapse_singletons) const;
237  /// Get the intrinsic tuple size (which might be varying)
238  /// Default: return 0
239  GA_Size getIntrinsicTupleSize(const GU_PrimPacked *proc,
240  int idx) const;
241  /// @{
242  /// Get/Set intrinsic attribute values for a primitive
243  /// Default: return 0
244  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
245  int idx, fpreal64 *val, GA_Size vsize) const;
246  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
247  int idx, int64 *val, GA_Size vsize) const;
248  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
249  int idx, UT_String &str) const;
250  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
251  int idx, UT_StringHolder &str) const;
252  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
253  int idx, UT_StringArray &strings) const;
254  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
255  int idx, UT_OptionsHolder &str) const;
256  GA_Size getIntrinsicValue(const GU_PrimPacked *proc,
257  int idx, UT_Array<UT_OptionsHolder> &str) const;
258  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
259  int idx, const fpreal64 *val, GA_Size vsize) const;
260  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
261  int idx, const int64 *val, GA_Size vsize) const;
262  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
263  int idx, const UT_StringArray &values) const;
264  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
265  int idx, const char **values, GA_Size size) const;
266  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
267  int idx, const UT_Array<UT_OptionsHolder> &values) const;
268  GA_Size setIntrinsicValue(GU_PrimPacked *proc,
269  int idx, const UT_OptionsHolder *values, GA_Size size) const;
270  /// @}
271 
272  /// Register a scalar floating point intrinsic
273  void registerIntrinsic(const UT_StringHolder &name,
274  GU_PackedImpl::FloatGetter getter,
275  GU_PackedImpl::FloatSetter setter=NULL);
276  /// Register a scalar integer intrinsic
277  void registerIntrinsic(const UT_StringHolder &name,
278  GU_PackedImpl::IntGetter getter,
279  GU_PackedImpl::IntSetter setter=NULL);
280  /// Register a scalar boolean intrinsic
281  void registerIntrinsic(const UT_StringHolder &name,
282  GU_PackedImpl::BoolGetter getter,
283  GU_PackedImpl::BoolSetter setter=NULL);
284  /// Register a scalar string (const UT_StringHolder &) intrinsic
285  void registerIntrinsic(const UT_StringHolder &name,
286  GU_PackedImpl::StringGetter getter,
287  GU_PackedImpl::StringSetter setter=NULL);
288  /// Register a scalar string (const std::string &) intrinsic
289  void registerIntrinsic(const UT_StringHolder &name,
290  GU_PackedImpl::StdStringGetter getter,
291  GU_PackedImpl::StdStringSetter setter=NULL);
292  /// Register a scalar string (const UT_StringHolder &) intrinsic
293  void registerIntrinsic(const UT_StringHolder &name,
294  GU_PackedImpl::StringHolderGetter getter,
295  GU_PackedImpl::StringHolderSetter setter=NULL);
296  /// Register a scalar dictionary (const UT_OptionsHolder &) intrinsic
297  void registerIntrinsic(const UT_StringHolder &name,
298  GU_PackedImpl::DictGetter getter,
299  GU_PackedImpl::DictSetter setter=NULL);
300 
301  /// Register an intrinsic for a floating point array
302  void registerTupleIntrinsic(const UT_StringHolder &name,
303  GU_PackedImpl::IntGetter get_tuple_size,
304  GU_PackedImpl::FloatTupleGetter getter,
305  GU_PackedImpl::FloatTupleSetter setter=NULL,
306  GU_PackedImpl::IntSetter set_tuple_size=NULL,
307  CollapseSingletons collapse = CollapseSingletons::YES);
308  /// Register an intrinsic for an integer array
309  void registerTupleIntrinsic(const UT_StringHolder &name,
310  GU_PackedImpl::IntGetter get_tuple_size,
311  GU_PackedImpl::IntTupleGetter getter,
312  GU_PackedImpl::IntTupleSetter setter=NULL,
313  GU_PackedImpl::IntSetter set_tuple_size=NULL,
314  CollapseSingletons collapse = CollapseSingletons::YES);
315  /// Register an intrinsic for a boolean array
316  void registerTupleIntrinsic(const UT_StringHolder &name,
317  GU_PackedImpl::IntGetter get_tuple_size,
318  GU_PackedImpl::BoolTupleGetter getter,
319  GU_PackedImpl::BoolTupleSetter setter=NULL,
320  GU_PackedImpl::IntSetter set_tuple_size=NULL,
321  CollapseSingletons collapse = CollapseSingletons::YES);
322  /// Register an intrinsic for a string (const char *) array
323  void registerTupleIntrinsic(const UT_StringHolder &name,
324  GU_PackedImpl::IntGetter get_tuple_size,
325  GU_PackedImpl::StringTupleGetter getter,
326  GU_PackedImpl::StringTupleSetter setter=NULL,
327  GU_PackedImpl::IntSetter set_tuple_size=NULL,
328  CollapseSingletons collapse = CollapseSingletons::YES);
329  /// Register an intrinsic for a string (const std::string &) array
330  void registerTupleIntrinsic(const UT_StringHolder &name,
331  GU_PackedImpl::IntGetter get_tuple_size,
332  GU_PackedImpl::StdStringTupleGetter getter,
333  GU_PackedImpl::StdStringTupleSetter setter=NULL,
334  GU_PackedImpl::IntSetter set_tuple_size=NULL,
335  CollapseSingletons collapse = CollapseSingletons::YES);
336  /// Register an intrinsic for a string (const StringHolder &) array
337  void registerTupleIntrinsic(const UT_StringHolder &name,
338  GU_PackedImpl::IntGetter get_tuple_size,
339  GU_PackedImpl::StringHolderTupleGetter getter,
340  GU_PackedImpl::StringHolderTupleSetter setter=NULL,
341  GU_PackedImpl::IntSetter set_tuple_size=NULL,
342  CollapseSingletons collapse = CollapseSingletons::YES);
343  /// Register an intrinsic for a dict (const UT_OptionsHolder &) array
344  void registerTupleIntrinsic(const UT_StringHolder &name,
345  GU_PackedImpl::IntGetter get_tuple_size,
346  GU_PackedImpl::DictTupleGetter getter,
347  GU_PackedImpl::DictTupleSetter setter=NULL,
348  GU_PackedImpl::IntSetter set_tuple_size=NULL,
349  CollapseSingletons collapse = CollapseSingletons::YES);
350 
351  /// Register an intrinsic for a floating point array
352  void registerTupleIntrinsic(const UT_StringHolder &name,
353  GU_PackedImpl::IntGetter get_tuple_size,
354  GU_PackedImpl::F32VectorGetter getter,
355  GU_PackedImpl::F32VectorSetter setter=NULL,
356  GU_PackedImpl::IntSetter set_tuple_size=NULL,
357  CollapseSingletons collapse = CollapseSingletons::YES);
358  /// Register an intrinsic for a floating point array
359  void registerTupleIntrinsic(const UT_StringHolder &name,
360  GU_PackedImpl::IntGetter get_tuple_size,
361  GU_PackedImpl::F64VectorGetter getter,
362  GU_PackedImpl::F64VectorSetter setter=NULL,
363  GU_PackedImpl::IntSetter set_tuple_size=NULL,
364  CollapseSingletons collapse = CollapseSingletons::YES);
365  /// Register an intrinsic for an integer array
366  void registerTupleIntrinsic(const UT_StringHolder &name,
367  GU_PackedImpl::IntGetter get_tuple_size,
368  GU_PackedImpl::I32VectorGetter getter,
369  GU_PackedImpl::I32VectorSetter setter=NULL,
370  GU_PackedImpl::IntSetter set_tuple_size=NULL,
371  CollapseSingletons collapse = CollapseSingletons::YES);
372  /// Register an intrinsic for an integer array
373  void registerTupleIntrinsic(const UT_StringHolder &name,
374  GU_PackedImpl::IntGetter get_tuple_size,
375  GU_PackedImpl::I64VectorGetter getter,
376  GU_PackedImpl::I64VectorSetter setter=NULL,
377  GU_PackedImpl::IntSetter set_tuple_size=NULL,
378  CollapseSingletons collapse = CollapseSingletons::YES);
379  /// Register an intrinsic for a boolean array
380  void registerTupleIntrinsic(const UT_StringHolder &name,
381  GU_PackedImpl::IntGetter get_tuple_size,
382  GU_PackedImpl::BVectorGetter getter,
383  GU_PackedImpl::BVectorSetter setter=NULL,
384  GU_PackedImpl::IntSetter set_tuple_size=NULL,
385  CollapseSingletons collapse = CollapseSingletons::YES);
386  /// Register a string array intrinsic.
387  void registerTupleIntrinsic(const UT_StringHolder &name,
388  GU_PackedImpl::IntGetter get_tuple_size,
389  GU_PackedImpl::StringArrayGetter getter,
390  GU_PackedImpl::StringArraySetter setter = nullptr,
391  GU_PackedImpl::IntSetter set_tuple_size = nullptr,
392  CollapseSingletons collapse = CollapseSingletons::YES);
393  /// Register a dict array intrinsic.
394  void registerTupleIntrinsic(const UT_StringHolder &name,
395  GU_PackedImpl::IntGetter get_tuple_size,
396  GU_PackedImpl::DictArrayGetter getter,
397  GU_PackedImpl::DictArraySetter setter = nullptr,
398  GU_PackedImpl::IntSetter set_tuple_size = nullptr,
399  CollapseSingletons collapse = CollapseSingletons::YES);
400 
401  /// Clear any cached geometry. The method should return the number of
402  /// items cleared, and the default method just returns 0.
403  virtual exint clearCachedGeometry();
404 
405 private:
406  UT_StringHolder myName;
407  UT_StringHolder myLabel;
408  UT_StringHolder myIcon;
409  const GA_PrimitiveDefinition *myTypeDef;
410  UT_Array<IntrinsicDef *> myIntrinsics;
411  GA_IntrinsicDef myGAIntrinsics;
412 
413  friend class GU_PrimPacked; // To set the type definition.
414 };
415 
416 #endif
int int32
Definition: SYS_Types.h:39
GLuint GLsizei const GLchar * label
Definition: glcorearb.h:2545
*get result *(waiting if necessary)*A common idiom is to fire a bunch of sub tasks at the and then *wait for them to all complete We provide a helper class
Definition: thread.h:632
void
Definition: png.h:1083
GA_StorageClass
Definition: GA_Types.h:75
getFileOption("OpenEXR:storage") storage
Definition: HDK_Image.dox:276
#define DECL_SET_CAST(TYPE, METHOD, METHODCAST)
void(GU_PackedImpl::* DictArrayGetter)(const GU_PrimPacked *, UT_Array< UT_OptionsHolder > &) const
const UT_StringHolder & icon() const
int64 exint
Definition: SYS_Types.h:125
JSON reader class which handles parsing of JSON or bJSON files.
Definition: UT_JSONParser.h:87
Stores information about intrinsic attributes for classes.
float fpreal32
Definition: SYS_Types.h:200
exint GA_Size
Defines the bit width for index and offset types in GA.
Definition: GA_Types.h:243
#define DECL_VSET_CAST(TYPE, METHOD, METHODCAST)
double fpreal64
Definition: SYS_Types.h:201
#define SYS_DEPRECATED_REPLACE(__V__, __R__)
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
#define DECL_TGET_CAST(TYPE, METHOD, METHODCAST)
DECL_SET_CAST(const UT_StringArray &, StringArraySetter, StringArraySetterCast) template< typename CLASS > inline GU_PackedImpl
Wrapper around hboost::intrusive_ptr.
long long int64
Definition: SYS_Types.h:116
#define GU_API
Definition: GU_API.h:14
GLuint const GLchar * name
Definition: glcorearb.h:786
GLsizei const GLchar *const * strings
Definition: glcorearb.h:1933
void(GU_PackedImpl::* StringArrayGetter)(const GU_PrimPacked *, UT_StringArray &) const
GLsizeiptr size
Definition: glcorearb.h:664
const UT_StringHolder & label() const
GLenum GLsizei GLsizei GLint * values
Definition: glcorearb.h:1602
fpreal64 fpreal
Definition: SYS_Types.h:283
bool isRegistered() const
#define DECL_TSET_CAST(TYPE, METHOD, METHODCAST)
#define DECL_VGET_CAST(TYPE, METHOD, METHODCAST)
int getIntrinsicCount() const
GLuint GLfloat * val
Definition: glcorearb.h:1608
GU_PackedFactoryPrivate::IntrinsicDef IntrinsicDef
Processor proc(inIter, Adapter::tree(outGrid), op, merge)
GA_PrimitiveDefinition::SharedDataLoader SharedDataLoader
Definition of a geometric primitive.
const GA_PrimitiveDefinition & typeDef() const
#define DECL_GET_CAST(TYPE, METHOD, METHODCAST)
const UT_StringHolder & name() const