00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __GEO_AttributeHandle__
00020 #define __GEO_AttributeHandle__
00021
00022 #include "GEO_API.h"
00023 #include <GB/GB_AttributeHandle.h>
00024 #include "GEO_AttributeOwner.h"
00025 #include "GEO_Point.h"
00026 #include "GEO_Vertex.h"
00027 #include "GEO_Primitive.h"
00028
00029 class GEO_Detail;
00030 class GEO_Primitive;
00031 class GEO_Vertex;
00032
00033 class GEO_API GEO_AttributeHandle : public GB_AttributeHandle {
00034 public:
00035 GEO_AttributeHandle();
00036 GEO_AttributeHandle(const GEO_AttributeHandle &gah);
00037 GEO_AttributeHandle(const GEO_Detail *gdp, GEO_AttributeOwner owner,
00038 GB_Attribute *attrib, const GB_AttributeRef &offset,
00039 int size_in_bytes, GB_AttribType type);
00040
00041
00042
00043 GEO_AttributeHandle(const GEO_Detail *gdp);
00044
00045 virtual GB_AttributeHandle *clone() const;
00046 virtual const char *getName() const;
00047
00048 virtual ~GEO_AttributeHandle();
00049
00050 virtual GEO_AttributeHandle &operator=(const GEO_AttributeHandle &gah);
00051
00052 virtual void invalidate();
00053
00054 virtual bool isAttributeValid() const;
00055 virtual bool isSourceAttributeValid() const;
00056 void clearElement()
00057 { setRawElement((GB_AttributeElem *)0); }
00058
00059
00060
00061
00062
00063
00064
00065 void clearSourceMap()
00066 {
00067 GB_AttributeRef offset;
00068 setSourceMap(GEO_INVALID_DICT, offset);
00069 }
00070 void setSourceMap(GEO_AttributeOwner dict,
00071 const GB_AttributeRef &o);
00072 void setSourceMap(const GB_AttributeDict &dict,
00073 GEO_AttributeOwner owner);
00074 void setSourceMap(const GEO_AttributeHandle &h);
00075
00076
00077 virtual void setElement(GEO_Vertex *v);
00078 virtual void setElement(GEO_Point *pt);
00079 virtual void setElement(GEO_Primitive *prim);
00080 virtual void setElement(GEO_Detail *gdp);
00081
00082 virtual void setElement(const GEO_Vertex *v);
00083 virtual void setElement(const GEO_Point *pt);
00084 virtual void setElement(const GEO_Primitive *prim);
00085 virtual void setElement(const GEO_Detail *gdp);
00086
00087 virtual void setElement(GEO_Primitive *p, GEO_Vertex *v);
00088 virtual void setElement(const GEO_Primitive *p, const GEO_Vertex *v);
00089
00090 GEO_AttributeOwner getDictionary() const { return myDictType; }
00091 bool isP() const { return myIsPointP; }
00092 GEO_AttributeOwner getSourceDictionary() const
00093 { return mySourceDictType; }
00094
00095 int getFloatCount(bool includePw) const
00096 {
00097 if (myIsPointP)
00098 return includePw ? 4 : 3;
00099 return isFloatOrVectorAttribute() ? entries() : 0;
00100 }
00101
00102
00103 void multiply(fpreal w)
00104 { GB_AttributeHandle::multiply(w); }
00105 void homogenize(fpreal w);
00106 void dehomogenize(fpreal w) { homogenize(1.0/w); }
00107
00108
00109 void addScale(const GEO_Primitive *p, const GEO_Vertex *v, fpreal s);
00110 void lerp(const GEO_Primitive *p, const GEO_Vertex *v, fpreal w);
00111 void lerp(const GEO_Primitive *p0, const GEO_Vertex *v0,
00112 const GEO_Primitive *p1, const GEO_Vertex *v1,
00113 fpreal w);
00114 void multiply(const GEO_Primitive *p, const GEO_Vertex *v);
00115 void divide(const GEO_Primitive *p, const GEO_Vertex *v);
00116 void copyDataFrom(const GEO_Primitive *p, const GEO_Vertex *v);
00117 void copyDataTo(GEO_Primitive *p, GEO_Vertex *v) const;
00118 bool equalData(const GEO_Primitive *p,
00119 const GEO_Vertex *v, fpreal64 t) const;
00120
00121 void addScale(const GEO_Point *elem, fpreal w)
00122 { addScaleRaw(elem, w, GEO_POINT_DICT); }
00123 void lerp(const GEO_Point *elem, fpreal w)
00124 { lerpRaw(elem, w, GEO_POINT_DICT); }
00125 void lerp(const GEO_Point *p0, const GEO_Point *p1, fpreal w)
00126 { lerpRaw(p0, p1, w, GEO_POINT_DICT); }
00127 void multiply(const GEO_Point *elem)
00128 { multiplyRaw(elem, GEO_POINT_DICT); }
00129 void divide(const GEO_Point *elem)
00130 { divideRaw(elem, GEO_POINT_DICT); }
00131 void copyDataFrom(const GEO_Point *elem)
00132 { copyDataFromRaw(elem, GEO_POINT_DICT); }
00133 void copyDataTo(GEO_Point *elem) const
00134 { copyDataToRaw(elem, GEO_POINT_DICT); }
00135 bool equalData(const GEO_Point *elem, fpreal64 tol) const
00136 { return equalDataRaw(elem, tol, GEO_POINT_DICT); }
00137
00138 void addScale(const GEO_Vertex *elem, fpreal w)
00139 { addScaleRaw(elem, w, GEO_VERTEX_DICT); }
00140 void lerp(const GEO_Vertex *elem, fpreal w)
00141 { lerpRaw(elem, w, GEO_VERTEX_DICT); }
00142 void lerp(const GEO_Vertex *p0, const GEO_Vertex *p1, fpreal w)
00143 { lerpRaw(p0, p1, w, GEO_VERTEX_DICT); }
00144 void multiply(const GEO_Vertex *elem)
00145 { multiplyRaw(elem, GEO_VERTEX_DICT); }
00146 void divide(const GEO_Vertex *elem)
00147 { divideRaw(elem, GEO_VERTEX_DICT); }
00148 void copyDataFrom(const GEO_Vertex *elem)
00149 { copyDataFromRaw(elem, GEO_VERTEX_DICT); }
00150 void copyDataTo(GEO_Vertex *elem) const
00151 { copyDataToRaw(elem, GEO_VERTEX_DICT); }
00152 bool equalData(const GEO_Vertex *elem, fpreal64 tol) const
00153 { return equalDataRaw(elem, tol, GEO_VERTEX_DICT); }
00154
00155 void addScale(const GEO_Primitive *elem, fpreal w)
00156 { addScaleRaw(elem, w, GEO_PRIMITIVE_DICT); }
00157 void lerp(const GEO_Primitive *elem, fpreal w)
00158 { lerpRaw(elem, w, GEO_PRIMITIVE_DICT); }
00159 void lerp(const GEO_Primitive *p0, const GEO_Primitive *p1, fpreal w)
00160 { lerpRaw(p0, p1, w, GEO_PRIMITIVE_DICT); }
00161 void multiply(const GEO_Primitive *elem)
00162 { multiplyRaw(elem, GEO_PRIMITIVE_DICT); }
00163 void divide(const GEO_Primitive *elem)
00164 { divideRaw(elem, GEO_PRIMITIVE_DICT); }
00165 void copyDataFrom(const GEO_Primitive *elem)
00166 { copyDataFromRaw(elem, GEO_PRIMITIVE_DICT); }
00167 void copyDataTo(GEO_Primitive *elem) const
00168 { copyDataToRaw(elem, GEO_PRIMITIVE_DICT); }
00169 bool equalData(const GEO_Primitive *elem, fpreal64 tol) const
00170 { return equalDataRaw(elem, tol, GEO_PRIMITIVE_DICT); }
00171
00172
00173 void addScale(const GEO_Detail *elem, fpreal w);
00174 void lerp(const GEO_Detail *elem, fpreal w);
00175 void lerp(const GEO_Detail *gdp0, const GEO_Detail *gdp1, fpreal w);
00176 void multiply(const GEO_Detail *elem);
00177 void divide(const GEO_Detail *elem);
00178 void copyDataFrom(const GEO_Detail *elem);
00179 void copyDataTo(GEO_Detail *elem) const;
00180 bool equalData(const GEO_Detail *elem, fpreal64 tol) const;
00181
00182 void dump(const char *msg="") const;
00183
00184 protected:
00185 virtual void setRawElement(GB_AttributeElem *elem);
00186 virtual void setRawElement(const GB_AttributeElem *elem);
00187
00188
00189
00190
00191
00192
00193
00194 void addScaleRaw(const GB_AttributeElem *elem, fpreal w,
00195 GEO_AttributeOwner owner);
00196 void lerpRaw(const GB_AttributeElem *elem, fpreal w,
00197 GEO_AttributeOwner owner);
00198 void lerpRaw(const GB_AttributeElem *p0,
00199 const GB_AttributeElem *p1, fpreal w,
00200 GEO_AttributeOwner owner);
00201 void multiplyRaw(const GB_AttributeElem *elem,
00202 GEO_AttributeOwner owner);
00203 void divideRaw(const GB_AttributeElem *elem,
00204 GEO_AttributeOwner owner);
00205 void copyDataFromRaw(const GB_AttributeElem *elem,
00206 GEO_AttributeOwner owner);
00207 void copyDataToRaw(GB_AttributeElem *elem,
00208 GEO_AttributeOwner owner) const;
00209 bool equalDataRaw(const GB_AttributeElem *elem, fpreal64 tol,
00210 GEO_AttributeOwner owner) const;
00211
00212 GEO_Point *getPoint(GB_AttributeElem *elem)
00213 { return static_cast<GEO_Point *>(elem); }
00214 const GEO_Point *getPoint(const GB_AttributeElem *elem) const
00215 { return static_cast<const GEO_Point *>(elem); }
00216 UT_Vector4 &getPos(GB_AttributeElem *elem)
00217 { return getPoint(elem)->getPos(); }
00218 const UT_Vector4 &getPos(const GB_AttributeElem *elem) const
00219 { return getPoint(elem)->getPos(); }
00220
00221 bool myIsPointP;
00222 GB_AttributeRef myOffset, mySourceOffset;
00223 GEO_AttributeOwner myDictType;
00224 GEO_AttributeOwner mySourceDictType;
00225 };
00226
00227 #endif