00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __GA_ElementWrangler__
00020 #define __GA_ElementWrangler__
00021
00022 #include <UT/UT_NonCopyable.h>
00023 #include "GA_API.h"
00024 #include "GA_AttributeRefMap.h"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 class GA_API GA_ElementWrangler
00036 {
00037 public:
00038 void copyAttributeValues(GA_Offset dest, GA_Offset src)
00039 {
00040 myMap.copyValue(myOwner, dest, myOwner, src);
00041 }
00042 void scaleAttributeValues(GA_Offset dest, fpreal scale)
00043 {
00044 myMap.multiply(myOwner, dest, scale);
00045 }
00046 void addAttributeValues(GA_Offset dest, GA_Offset src,
00047 fpreal scale=1)
00048 {
00049 myMap.addValue(myOwner, dest, myOwner, src, scale);
00050 }
00051 void lerpAttributeValues(GA_Offset dest, GA_Offset src0,
00052 GA_Offset src1, fpreal bias)
00053 {
00054 myMap.lerpValue(myOwner, dest, myOwner, src0, src1, bias);
00055 }
00056
00057 bool isValid(GA_Detail &dest) const
00058 {
00059 return myMap.getDestDetail() == &dest &&
00060 myMap.getSourceDetail() == &dest;
00061 }
00062 bool isValid(GA_Detail &dest, const GA_Detail &src) const
00063 {
00064 return myMap.getDestDetail() == &dest &&
00065 myMap.getSourceDetail() == &src;
00066 }
00067 protected:
00068 GA_ElementWrangler(GA_AttributeOwner owner, GA_Detail &dest,
00069 const GA_Attribute *exclude = 0);
00070 GA_ElementWrangler(GA_AttributeOwner owner, GA_Detail &dest,
00071 const GA_Detail &src, const GA_Attribute *exclude = 0);
00072
00073 ~GA_ElementWrangler() {}
00074
00075 GA_AttributeRefMap &getMap() { return myMap; }
00076 private:
00077 GA_AttributeOwner myOwner;
00078 GA_AttributeRefMap myMap;
00079 };
00080
00081
00082
00083
00084 class GA_API GA_PointWrangler : public GA_ElementWrangler
00085 {
00086 public:
00087 enum IncludeP { EXCLUDE_P, INCLUDE_P };
00088
00089
00090
00091 GA_PointWrangler(GA_Detail &dest, IncludeP p);
00092 GA_PointWrangler(GA_Detail &dest, const GA_Detail &src, IncludeP p);
00093
00094 ~GA_PointWrangler()
00095 {
00096 delete myAlternateMap;
00097 }
00098
00099 bool includesP() const { return myBaseIncludeP == INCLUDE_P; }
00100
00101 using GA_ElementWrangler::copyAttributeValues;
00102 using GA_ElementWrangler::scaleAttributeValues;
00103 using GA_ElementWrangler::addAttributeValues;
00104 using GA_ElementWrangler::lerpAttributeValues;
00105
00106 void copyAttributeValues(GA_Offset dest, GA_Offset src,
00107 IncludeP copy_p)
00108 {
00109 if (copy_p == myBaseIncludeP)
00110 copyAttributeValues(dest, src);
00111 else
00112 {
00113 initAlternateHandle();
00114 myAlternateMap->copyValue(
00115 GA_ATTRIB_POINT, dest,
00116 GA_ATTRIB_POINT, src);
00117 }
00118 }
00119 void scaleAttributeValues(GA_Offset dest, fpreal scale,
00120 IncludeP scale_p)
00121 {
00122 if (scale_p == myBaseIncludeP)
00123 scaleAttributeValues(dest, scale);
00124 else
00125 {
00126 initAlternateHandle();
00127 myAlternateMap->multiply(
00128 GA_ATTRIB_POINT, dest, scale);
00129 }
00130 }
00131 void addAttributeValues(GA_Offset dest, GA_Offset src,
00132 fpreal scale, IncludeP add_p)
00133 {
00134 if (add_p == myBaseIncludeP)
00135 addAttributeValues(dest, src, scale);
00136 else
00137 {
00138 initAlternateHandle();
00139 myAlternateMap->addValue(
00140 GA_ATTRIB_POINT, dest,
00141 GA_ATTRIB_POINT, src, scale);
00142 }
00143 }
00144 void lerpAttributeValues(GA_Offset dest, GA_Offset src0,
00145 GA_Offset src1, fpreal bias,
00146 IncludeP lerp_p)
00147 {
00148 if (lerp_p == myBaseIncludeP)
00149 lerpAttributeValues(dest, src0, src1, bias);
00150 else
00151 {
00152 initAlternateHandle();
00153 myAlternateMap->lerpValue(
00154 GA_ATTRIB_POINT, dest,
00155 GA_ATTRIB_POINT, src0, src1, bias);
00156 }
00157 }
00158 private:
00159 void initAlternateHandle()
00160 {
00161 if (!myAlternateMap)
00162 allocAlternateHandle();
00163 }
00164 void allocAlternateHandle();
00165
00166
00167
00168
00169 IncludeP myBaseIncludeP;
00170 GA_AttributeRefMap *myAlternateMap;
00171 };
00172
00173 class GA_API GA_VertexWrangler : public GA_ElementWrangler
00174 {
00175 public:
00176 GA_VertexWrangler(GA_Detail &dest)
00177 : GA_ElementWrangler(GA_ATTRIB_VERTEX, dest) {}
00178 GA_VertexWrangler(GA_Detail &dest, const GA_Detail &src)
00179 : GA_ElementWrangler(GA_ATTRIB_VERTEX, dest, src) {}
00180 private:
00181 };
00182
00183 class GA_API GA_PrimitiveWrangler : public GA_ElementWrangler
00184 {
00185 public:
00186 GA_PrimitiveWrangler(GA_Detail &dest)
00187 : GA_ElementWrangler(GA_ATTRIB_PRIMITIVE, dest) {}
00188 GA_PrimitiveWrangler(GA_Detail &dest, const GA_Detail &src)
00189 : GA_ElementWrangler(GA_ATTRIB_PRIMITIVE, dest, src) {}
00190 private:
00191 };
00192
00193 class GA_API GA_ElementWranglerCache : private UT_NonCopyable
00194 {
00195 public:
00196 GA_ElementWranglerCache(GA_Detail &dest,
00197 GA_PointWrangler::IncludeP include_p)
00198 : myDestGdp(&dest), mySrcGdp(&dest), myPrimitiveWrangler(0),
00199 myVertexWrangler(0), myPointWrangler(0), myIncludeP(include_p) {}
00200 GA_ElementWranglerCache(GA_Detail &dest, const GA_Detail &src,
00201 GA_PointWrangler::IncludeP include_p)
00202 : myDestGdp(&dest), mySrcGdp(&src), myPrimitiveWrangler(0),
00203 myVertexWrangler(0), myPointWrangler(0), myIncludeP(include_p) {}
00204 ~GA_ElementWranglerCache()
00205 {
00206 if (myPrimitiveWrangler)
00207 delete myPrimitiveWrangler;
00208 if (myVertexWrangler)
00209 delete myVertexWrangler;
00210 if (myPointWrangler)
00211 delete myPointWrangler;
00212 }
00213
00214 void clear()
00215 {
00216 if (myPrimitiveWrangler)
00217 {
00218 delete myPrimitiveWrangler;
00219 myPrimitiveWrangler = 0;
00220 }
00221 if (myVertexWrangler)
00222 {
00223 delete myVertexWrangler;
00224 myVertexWrangler = 0;
00225 }
00226 if (myPointWrangler)
00227 {
00228 delete myPointWrangler;
00229 myPointWrangler = 0;
00230 }
00231 }
00232
00233 void reset(GA_Detail &dest)
00234 {
00235 myDestGdp = &dest;
00236 mySrcGdp = &dest;
00237 clear();
00238 }
00239 void reset(GA_Detail &dest, const GA_Detail &src)
00240 {
00241 myDestGdp = &dest;
00242 mySrcGdp = &src;
00243 clear();
00244 }
00245 bool isValid(const GA_Detail &dest) const
00246 {
00247 return myDestGdp == &dest &&
00248 mySrcGdp == &dest;
00249 }
00250 bool isValid(const GA_Detail &dest,
00251 const GA_Detail &src) const
00252 {
00253 return myDestGdp == &dest &&
00254 mySrcGdp == &src;
00255 }
00256
00257 GA_PrimitiveWrangler &getPrimitive()
00258 {
00259 if (!myPrimitiveWrangler)
00260 myPrimitiveWrangler = new GA_PrimitiveWrangler(*myDestGdp,
00261 *mySrcGdp);
00262 return *myPrimitiveWrangler;
00263 }
00264 GA_VertexWrangler &getVertex()
00265 {
00266 if (!myVertexWrangler)
00267 myVertexWrangler = new GA_VertexWrangler(*myDestGdp,
00268 *mySrcGdp);
00269 return *myVertexWrangler;
00270 }
00271 GA_PointWrangler &getPoint()
00272 {
00273 if (!myPointWrangler)
00274 myPointWrangler = new GA_PointWrangler(*myDestGdp, *mySrcGdp,
00275 myIncludeP);
00276 return *myPointWrangler;
00277 }
00278
00279 private:
00280 GA_Detail *myDestGdp;
00281 const GA_Detail *mySrcGdp;
00282 GA_PrimitiveWrangler *myPrimitiveWrangler;
00283 GA_VertexWrangler *myVertexWrangler;
00284 GA_PointWrangler *myPointWrangler;
00285 GA_PointWrangler::IncludeP myIncludeP;
00286 };
00287
00288 #endif