00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __GB_AttributeData_h__
00021 #define __GB_AttributeData_h__
00022
00023 #include "GB_API.h"
00024 #include <stdlib.h>
00025 #include <string.h>
00026 #include <SYS/SYS_Types.h>
00027 #include <SYS/SYS_Math.h>
00028
00029 class GB_Attribute;
00030 class GB_FloatOffsets;
00031 class UT_Matrix3;
00032
00033 class GB_API GB_AttributeData
00034 {
00035 public:
00036 GB_AttributeData();
00037 ~GB_AttributeData();
00038
00039
00040
00041
00042 void *getData(int n) const { return (char *)myData + n; }
00043 void *getData() const { return myData; }
00044
00045 template<typename T>
00046 T *castAttribData(int n)
00047 { return (T *)((char *)myData+n); }
00048 template<typename T>
00049 const T *castAttribData(int n) const
00050 { return (T *)((const char *)myData+n); }
00051
00052
00053 void changeSize(int s) { myData = realloc(myData, (unsigned)s); }
00054 void deleteData() { if (myData) free(myData); myData = 0; }
00055
00056 void *operator[](unsigned n) { return (void *)((char *)myData + n); }
00057 void *operator[](unsigned n) const
00058 {
00059 return (void *)((char *)myData + n);
00060 }
00061
00062
00063
00064
00065
00066
00067 void sumData(const GB_AttributeData &from,
00068 const GB_Attribute *table, fpreal scale);
00069 void sumData(const GB_AttributeData &from,
00070 const GB_Attribute *table);
00071 void scaleData(const GB_Attribute *table, fpreal s);
00072
00073 void setData(const GB_AttributeData &from, int s)
00074 {
00075 memcpy(myData, from.getData(), (unsigned)s);
00076 }
00077
00078
00079
00080
00081 void setData(void *data) { myData = data; }
00082
00083 void swapData(GB_AttributeData &d)
00084 {
00085 void *tmp = myData; myData = d.myData; d.myData = tmp;
00086 }
00087
00088
00089
00090
00091 bool compareData(const GB_AttributeData &cmp,
00092 const GB_Attribute *table,
00093 fpreal tol = FP32_TOLERANCE) const;
00094
00095
00096
00097 void setf(fpreal val, const GB_FloatOffsets &foffsets);
00098 void addf(fpreal val, const GB_FloatOffsets &foffsets);
00099 void subf(fpreal val, const GB_FloatOffsets &foffsets);
00100 void mulf(fpreal val, const GB_FloatOffsets &foffsets);
00101 void divf(fpreal val, const GB_FloatOffsets &foffsets);
00102
00103
00104
00105 void mulv(fpreal val, const GB_FloatOffsets &foffsets);
00106 void mulv(const UT_Matrix3 &val, const GB_FloatOffsets &foffsets,
00107 int keepLength = 1);
00108
00109 void addData(const GB_AttributeData &from,
00110 const GB_FloatOffsets &foffsets);
00111
00112
00113
00114 void addScaleData(const GB_AttributeData &from,
00115 const GB_FloatOffsets &foffsets, fpreal scale);
00116
00117
00118 void interpolateData(const GB_AttributeData &a,
00119 const GB_AttributeData &b,
00120 const GB_FloatOffsets &offsets,
00121 fpreal t);
00122
00123
00124
00125
00126 int operator==(const GB_AttributeData &d) const
00127 {
00128 return this->myData == d.myData;
00129 }
00130
00131 void steal(GB_AttributeData &v)
00132 {
00133 myData = v.myData;
00134 v.myData = 0;
00135 }
00136
00137 GB_AttributeData &operator=(const GB_AttributeData &) { return *this; }
00138
00139 private:
00140 void *myData;
00141 };
00142
00143 #endif