00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __GA_Types__
00019 #define __GA_Types__
00020
00021 #include "GA_API.h"
00022 #include <SYS/SYS_Types.h>
00023 #include <SYS/SYS_TypeTraits.h>
00024 #include <UT/UT_ValArray.h>
00025 #include <UT/UT_IntrusivePtr.h>
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 enum GA_AttributeOwner
00038 {
00039 GA_ATTRIB_VERTEX,
00040 GA_ATTRIB_POINT,
00041 GA_ATTRIB_PRIMITIVE,
00042 GA_ATTRIB_GLOBAL,
00043
00044 GA_ATTRIB_OWNER_N,
00045
00046 GA_ATTRIB_DETAIL = GA_ATTRIB_GLOBAL
00047 };
00048
00049
00050
00051 enum GA_Storage
00052 {
00053 GA_STORE_INVALID=-1,
00054 GA_STORE_BOOL,
00055 GA_STORE_UINT8,
00056 GA_STORE_INT8,
00057 GA_STORE_INT16,
00058 GA_STORE_INT32,
00059 GA_STORE_INT64,
00060 GA_STORE_REAL16,
00061 GA_STORE_REAL32,
00062 GA_STORE_REAL64,
00063 GA_STORE_STRING,
00064
00065
00066
00067 };
00068
00069
00070
00071 enum GA_StorageClass
00072 {
00073 GA_STORECLASS_INVALID = -1,
00074 GA_STORECLASS_INT,
00075 GA_STORECLASS_REAL,
00076 GA_STORECLASS_FLOAT = GA_STORECLASS_REAL,
00077 GA_STORECLASS_STRING,
00078 GA_STORECLASS_OTHER
00079 };
00080
00081
00082
00083 enum GA_TypeInfo
00084 {
00085
00086 GA_TYPE_VOID = -1,
00087
00088 GA_TYPE_POINT,
00089
00090
00091
00092 GA_TYPE_HPOINT,
00093
00094 GA_TYPE_VECTOR,
00095
00096 GA_TYPE_NORMAL,
00097
00098 GA_TYPE_COLOR,
00099
00100 GA_TYPE_TRANSFORM,
00101
00102 GA_TYPE_QUATERNION,
00103
00104 GA_TYPE_INDEXPAIR,
00105
00106
00107
00108
00109
00110
00111 GA_TYPE_NONARITHMETIC_INTEGER,
00112
00113
00114
00115 GA_TYPE_ARITHMETIC_INTEGER,
00116 };
00117
00118
00119
00120 enum GA_AttributeScope
00121 {
00122
00123 GA_SCOPE_INVALID = -1,
00124
00125
00126 GA_SCOPE_PUBLIC,
00127
00128
00129 GA_SCOPE_PRIVATE,
00130
00131
00132 GA_SCOPE_GROUP
00133 };
00134
00135
00136 enum GA_GroupType
00137 {
00138 GA_GROUP_INVALID = -1,
00139 GA_GROUP_POINT = 0,
00140 GA_GROUP_PRIMITIVE = 1,
00141 GA_GROUP_EDGE = 2,
00142 GA_GROUP_BREAKPOINT = 3,
00143 GA_GROUP_VERTEX = 4,
00144 GA_GROUP_N
00145 };
00146
00147
00148
00149 enum GA_GroupMaskType
00150 {
00151 GA_GMASK_NONE = 0,
00152 GA_GMASK_POINT = 1 << GA_GROUP_POINT,
00153 GA_GMASK_PRIMITIVE = 1 << GA_GROUP_PRIMITIVE,
00154 GA_GMASK_EDGE = 1 << GA_GROUP_EDGE,
00155 GA_GMASK_BREAKPOINT = 1 << GA_GROUP_BREAKPOINT,
00156 GA_GMASK_VERTEX = 1 << GA_GROUP_VERTEX,
00157 GA_GMASK_FULL_MASK = ((1 << GA_GROUP_N)-1)
00158 };
00159
00160
00161 #define GA_MAX_ORDER 11
00162
00163
00164 enum GA_KnotSpaceType
00165 {
00166 GA_KNOT_SPACE_UNIFORM,
00167 GA_KNOT_SPACE_AVERAGING
00168 };
00169
00170
00171 enum GA_ParameterizationType
00172 {
00173 GA_PARAMETERIZATION_UNIFORM,
00174 GA_PARAMETERIZATION_CHORD,
00175 GA_PARAMETERIZATION_CENTRIPETAL,
00176 GA_PARAMETERIZATION_APPROXARC
00177 };
00178
00179
00180 #define GA_PAGE_BITS 10
00181 #define GA_PAGE_SIZE (1 << GA_PAGE_BITS)
00182 #define GA_PAGE_MASK (GA_PAGE_SIZE - 1)
00183 #define GA_DEFRAGMENT_OCCUPANCY 1.00
00184
00185
00186
00187
00188
00189
00190
00191
00192 typedef exint GA_Size;
00193
00194
00195 #if !defined(GA_STRICT_TYPES) && UT_ASSERT_LEVEL > 2
00196 #define GA_STRICT_TYPES 0
00197 #endif
00198
00199 #if defined(GA_STRICT_TYPES)
00200
00201 #define GA_DEFINE_ORDINAL_BINARY_OPS(OP) \
00202 friend ThisType operator OP (const ThisType &v1, const ThisType &v2) \
00203 { return ThisType(v1.myVal OP v2.myVal); } \
00204 friend ThisType operator OP (const ThisType &v1, const exint &v2) \
00205 { return ThisType(v1.myVal OP v2); } \
00206 friend ThisType operator OP (const exint &v1, const ThisType &v2) \
00207 { return ThisType(v1 OP v2.myVal); } \
00208 friend ThisType operator OP (const ThisType &v1, const int &v2) \
00209 { return ThisType(v1.myVal OP v2); } \
00210 friend ThisType operator OP (const int &v1, const ThisType &v2) \
00211 { return ThisType(v1 OP v2.myVal); } \
00212 friend ThisType operator OP (const ThisType &v1, const uint &v2) \
00213 { return ThisType(v1.myVal OP v2); } \
00214 friend ThisType operator OP (const uint &v1, const ThisType &v2) \
00215 { return ThisType(v1 OP v2.myVal); } \
00216
00217
00218 #define GA_DEFINE_ORDINAL_METHODS \
00219 ThisType operator+=(exint v) { myVal += v; return *this; } \
00220 ThisType operator+=(int v) { myVal += v; return *this; } \
00221 ThisType operator+=(uint v) { myVal += v; return *this; } \
00222 ThisType operator-=(exint v) { myVal -= v; return *this; } \
00223 ThisType operator-=(int v) { myVal -= v; return *this; } \
00224 ThisType operator-=(uint v) { myVal -= v; return *this; } \
00225 ThisType & operator++() { ++myVal; return *this; } \
00226 ThisType operator++(int) { return ThisType(myVal++); } \
00227 ThisType & operator--() { --myVal; return *this; } \
00228 ThisType operator--(int) { return ThisType(myVal--); } \
00229 ThisType operator-() { return ThisType(-myVal); } \
00230 \
00231 GA_DEFINE_ORDINAL_BINARY_OPS(+) \
00232 GA_DEFINE_ORDINAL_BINARY_OPS(-) \
00233
00234
00235 template <typename TAG, typename BASE_TYPE>
00236 class GA_OrdinalType
00237 {
00238 private:
00239 typedef GA_OrdinalType<TAG, BASE_TYPE> ThisType;
00240
00241 public:
00242 GA_OrdinalType() { }
00243 explicit GA_OrdinalType(const BASE_TYPE &val) : myVal(val) { }
00244
00245 operator BASE_TYPE() const { return myVal; }
00246
00247 GA_DEFINE_ORDINAL_METHODS
00248
00249 private:
00250 BASE_TYPE myVal;
00251 };
00252
00253 class GA_Index;
00254
00255
00256
00257
00258
00259 class GA_Offset
00260 {
00261 typedef GA_Offset ThisType;
00262
00263 public:
00264 GA_Offset() { }
00265 explicit GA_Offset(const GA_Size &val) : myVal(val) { }
00266
00267 operator GA_Size() const { return myVal; }
00268
00269 GA_DEFINE_ORDINAL_METHODS
00270
00271 private:
00272 GA_Offset(const GA_Index &v);
00273
00274 GA_Size myVal;
00275 };
00276 SYS_DECLARE_IS_POD(GA_Offset)
00277
00278
00279
00280
00281
00282 class GA_Index
00283 {
00284 private:
00285 typedef GA_Index ThisType;
00286
00287 public:
00288 GA_Index() { }
00289 GA_Index(const GA_Size &val) : myVal(val) { }
00290
00291 operator GA_Size() const { return myVal; }
00292
00293 GA_DEFINE_ORDINAL_METHODS
00294
00295 private:
00296 GA_Index(const GA_Offset &v);
00297
00298 GA_Size myVal;
00299 };
00300 SYS_DECLARE_IS_POD(GA_Index)
00301
00302 #undef GA_DEFINE_ORDINAL_BINARY_OPS
00303 #undef GA_DEFINE_ORDINAL_METHODS
00304
00305
00306 class GA_PageNumTag {};
00307 typedef GA_OrdinalType<GA_PageNumTag, GA_Size> GA_PageNum;
00308 SYS_DECLARE_IS_POD(GA_PageNum)
00309
00310
00311 class GA_PageOffTag {};
00312 typedef GA_OrdinalType<GA_PageOffTag, GA_Size> GA_PageOff;
00313 SYS_DECLARE_IS_POD(GA_PageOff)
00314
00315 #else
00316
00317 typedef GA_Size GA_Index;
00318 typedef GA_Size GA_Offset;
00319 typedef GA_Size GA_PageNum;
00320 typedef GA_Size GA_PageOff;
00321
00322 #endif
00323
00324 inline bool GAisValid(GA_Size v) { return v >= 0; }
00325
00326 inline GA_PageNum GAgetPageNum(GA_Offset v)
00327 {
00328 return GA_PageNum(v >> GA_PAGE_BITS);
00329 }
00330 inline GA_PageOff GAgetPageOff(GA_Offset v)
00331 {
00332 return GA_PageOff(v & GA_PAGE_MASK);
00333 }
00334 inline bool GAisFullPage(GA_Offset start, GA_Offset end)
00335 {
00336 return (GAgetPageOff(start) == 0 &&
00337 GAgetPageOff(end) == 0 &&
00338 (GAgetPageNum(start) == GAgetPageNum(end)-1));
00339 }
00340
00341 inline GA_Offset GAgetPageBoundary(const GA_Offset &start,
00342 const GA_Offset &end)
00343 {
00344 return GA_Offset(SYSmin(end, start - GA_Size(GAgetPageOff(start)) + GA_PAGE_SIZE));
00345 }
00346
00347 #define GA_INVALID_INDEX GA_Index(-1)
00348 #define GA_INVALID_OFFSET GA_Offset(-1)
00349
00350 typedef UT_ValArray<GA_Index> GA_IndexArray;
00351 typedef UT_ValArray<GA_Offset> GA_OffsetArray;
00352
00353
00354
00355
00356 typedef int GA_LocalIntrinsic;
00357 typedef int GA_GlobalIntrinsic;
00358 #define GA_INVALID_INTRINSIC_HANDLE -1
00359 static inline bool GAisValidGlobalIntrinsic(GA_GlobalIntrinsic h)
00360 { return h >= 0; }
00361 static inline bool GAisValidLocalIntrinsic(GA_LocalIntrinsic h)
00362 { return h >= 0; }
00363
00364
00365
00366
00367
00368
00369 GA_API extern unsigned GAsizeof(GA_Storage store);
00370
00371
00372
00373
00374
00375
00376 GA_API extern int GAcomparePrecision(GA_Storage a, GA_Storage b);
00377
00378
00379 GA_API extern const char *GAowner(GA_AttributeOwner owner);
00380
00381 GA_API extern GA_AttributeOwner GAowner(const char *owner);
00382
00383
00384 GA_API extern const char *GAscope(GA_AttributeScope scope);
00385
00386 GA_API extern GA_AttributeScope GAscope(const char *scope);
00387
00388
00389 GA_API extern const char *GAstorage(GA_Storage store);
00390
00391 GA_API extern GA_Storage GAstorage(const char *store);
00392
00393
00394 GA_API extern const char *GAstorageLabel(GA_Storage store);
00395
00396 GA_API extern GA_Storage GAstorageLabel(const char *store);
00397
00398
00399
00400
00401 GA_API extern const char *GAstorageClass(GA_StorageClass store);
00402
00403 GA_API extern GA_StorageClass GAstorageClass(const char *store);
00404
00405
00406 GA_API extern const char *GAtypeinfo(GA_TypeInfo type);
00407
00408 GA_API extern GA_TypeInfo GAtypeinfo(const char *type);
00409
00410
00411 GA_API extern const char *GAtypeinfoLabel(GA_TypeInfo type);
00412
00413 GA_API extern GA_TypeInfo GAtypeinfoLabel(const char *type);
00414
00415
00416 GA_API extern const char *GAgroupType(GA_GroupType owner);
00417
00418 GA_API extern GA_GroupType GAgroupType(const char *owner);
00419
00420
00421
00422
00423 static inline bool GAisStorageType(int s)
00424 {
00425 return s >= GA_STORE_BOOL && s <= GA_STORE_STRING;
00426 }
00427
00428
00429 static inline bool GAisFloatStorage(GA_Storage s)
00430 {
00431 return s == GA_STORE_REAL16 ||
00432 s == GA_STORE_REAL32 ||
00433 s == GA_STORE_REAL64;
00434 }
00435
00436
00437 static inline bool GAisIntStorage(GA_Storage s)
00438 {
00439 return
00440 s == GA_STORE_UINT8 ||
00441 s == GA_STORE_INT8 ||
00442 s == GA_STORE_INT16 ||
00443 s == GA_STORE_INT32 ||
00444 s == GA_STORE_INT64;
00445 }
00446
00447
00448 static inline bool GAisNumericStorage(GA_Storage s)
00449 {
00450 return GAisFloatStorage(s) || GAisIntStorage(s);
00451 }
00452
00453
00454 static inline bool GAisTransformingType(GA_TypeInfo t)
00455 {
00456 return
00457 t == GA_TYPE_VECTOR ||
00458 t == GA_TYPE_NORMAL ||
00459 t == GA_TYPE_POINT ||
00460 t == GA_TYPE_HPOINT ||
00461 t == GA_TYPE_TRANSFORM ||
00462 t == GA_TYPE_QUATERNION;
00463 }
00464
00465 static inline GA_StorageClass GAstorageClass(GA_Storage s)
00466 {
00467 switch (s)
00468 {
00469 case GA_STORE_INVALID:
00470 return GA_STORECLASS_INVALID;
00471 case GA_STORE_BOOL:
00472 case GA_STORE_UINT8:
00473 case GA_STORE_INT8:
00474 case GA_STORE_INT16:
00475 case GA_STORE_INT32:
00476 case GA_STORE_INT64:
00477 return GA_STORECLASS_INT;
00478 case GA_STORE_REAL16:
00479 case GA_STORE_REAL32:
00480 case GA_STORE_REAL64:
00481 return GA_STORECLASS_REAL;
00482 case GA_STORE_STRING:
00483 return GA_STORECLASS_STRING;
00484 }
00485
00486 return GA_STORECLASS_OTHER;
00487 }
00488
00489 static inline GA_Storage GAgetDefaultStorage(GA_StorageClass s)
00490 {
00491 switch (s)
00492 {
00493 case GA_STORECLASS_INT:
00494 return GA_STORE_INT32;
00495 case GA_STORECLASS_REAL:
00496 return GA_STORE_REAL32;
00497 case GA_STORECLASS_STRING:
00498 return GA_STORE_STRING;
00499 default:
00500
00501 return GA_STORE_INVALID;
00502 }
00503 }
00504
00505
00506
00507 class GA_AttributeProxy;
00508 typedef UT_IntrusivePtr<GA_AttributeProxy> GA_AttributeProxyHandle;
00509 typedef UT_IntrusivePtr<const GA_AttributeProxy> GA_ConstAttributeProxyHandle;
00510
00511
00512 #endif