1 /*
2     Copyright (c) 2008-2009 NetAllied Systems GmbH
3 
4     This file is part of MayaDataModel.
5 
6     Licensed under the MIT Open Source License,
7     for details please see LICENSE file or the website
8     http://www.opensource.org/licenses/mit-license.php
9 */
10 #ifndef __MayaDM_TWEAK_H__
11 #define __MayaDM_TWEAK_H__
12 #include "MayaDMTypes.h"
13 #include "MayaDMConnectables.h"
14 #include "MayaDMGeometryFilter.h"
15 namespace MayaDM
16 {
17 class Tweak : public GeometryFilter
18 {
19 public:
20 	struct Plist{
21 		double3* controlPoints;
22 		size_t nbControlPoints;
writePlist23 		void write(FILE* file) const
24 		{
25 			for (size_t i = 0; i<nbControlPoints; ++i)
26 			{
27 				controlPoints[i].write(file);
28 				if (i + 1<nbControlPoints) fprintf(file, " ");
29 			}
30 		}
31 	};
32 	struct Vlist{
33 		float3* vertex;
34 		size_t nbVertex;
writeVlist35 		void write(FILE* file) const
36 		{
37 			for (size_t i = 0; i<nbVertex; ++i)
38 			{
39 				vertex[i].write(file);
40 				if (i + 1<nbVertex) fprintf(file, " ");
41 			}
42 		}
43 	};
44 public:
45 
Tweak()46 	Tweak():GeometryFilter(){}
47 	Tweak(FILE* file,const std::string& name,const std::string& parent="",bool shared=false,bool create=true)
48 		:GeometryFilter(file, name, parent, "tweak", shared, create){}
~Tweak()49 	virtual ~Tweak(){}
50 
setRelativeTweak(bool rtw)51 	void setRelativeTweak(bool rtw)
52 	{
53 		if(rtw == true) return;
54 		fprintf(mFile,"\tsetAttr \".rtw\" %i;\n", rtw);
55 	}
setPlist(size_t pl_i,const Plist & pl)56 	void setPlist(size_t pl_i,const Plist& pl)
57 	{
58 		fprintf(mFile,"\tsetAttr \".pl[%i]\" ",pl_i);
59 		pl.write(mFile);
60 		fprintf(mFile,";\n");
61 	}
setPlist(size_t pl_start,size_t pl_end,Plist * pl)62 	void setPlist(size_t pl_start,size_t pl_end,Plist* pl)
63 	{
64 		fprintf(mFile,"\tsetAttr \".pl[%i:%i]\" ", pl_start,pl_end);
65 		size_t size = (pl_end-pl_start)*1+1;
66 		for(size_t i=0;i<size;++i)
67 		{
68 			pl[i].write(mFile);
69 			fprintf(mFile,"\n");
70 		}
71 		fprintf(mFile,";\n");
72 	}
startPlist(size_t pl_start,size_t pl_end)73 	void startPlist(size_t pl_start,size_t pl_end)const
74 	{
75 		fprintf(mFile,"\tsetAttr \".pl[%i:%i]\"",pl_start,pl_end);
76 		fprintf(mFile," -type \"Plist\" ");
77 	}
appendPlist(const Plist & pl)78 	void appendPlist(const Plist& pl)const
79 	{
80 		fprintf(mFile," ");
81 		pl.write(mFile);
82 	}
endPlist()83 	void endPlist()const
84 	{
85 		fprintf(mFile,";\n");
86 	}
setControlPoints(size_t pl_i,size_t cp_i,const double3 & cp)87 	void setControlPoints(size_t pl_i,size_t cp_i,const double3& cp)
88 	{
89 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i]\" -type \"double3\" ",pl_i,cp_i);
90 		cp.write(mFile);
91 		fprintf(mFile,";\n");
92 	}
setControlPoints(size_t pl_i,size_t cp_start,size_t cp_end,double * cp)93 	void setControlPoints(size_t pl_i,size_t cp_start,size_t cp_end,double* cp)
94 	{
95 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i:%i]\" ", pl_i,cp_start,cp_end);
96 		size_t size = (cp_end-cp_start)*3+3;
97 		for(size_t i=0;i<size;++i)
98 		{
99 			fprintf(mFile,"%f",cp[i]);
100 			if(i+1<size) fprintf(mFile," ");
101 		}
102 		fprintf(mFile,";\n");
103 	}
startControlPoints(size_t pl_i,size_t cp_start,size_t cp_end)104 	void startControlPoints(size_t pl_i,size_t cp_start,size_t cp_end)const
105 	{
106 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i:%i]\"",pl_i,cp_start,cp_end);
107 	}
appendControlPoints(double cp)108 	void appendControlPoints(double cp)const
109 	{
110 		fprintf(mFile," %f",cp);
111 	}
endControlPoints()112 	void endControlPoints()const
113 	{
114 		fprintf(mFile,";\n");
115 	}
setXValue(size_t pl_i,size_t cp_i,double xv)116 	void setXValue(size_t pl_i,size_t cp_i,double xv)
117 	{
118 		if(xv == 0) return;
119 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i].xv\" %f;\n", pl_i,cp_i,xv);
120 	}
setYValue(size_t pl_i,size_t cp_i,double yv)121 	void setYValue(size_t pl_i,size_t cp_i,double yv)
122 	{
123 		if(yv == 0) return;
124 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i].yv\" %f;\n", pl_i,cp_i,yv);
125 	}
setZValue(size_t pl_i,size_t cp_i,double zv)126 	void setZValue(size_t pl_i,size_t cp_i,double zv)
127 	{
128 		if(zv == 0) return;
129 		fprintf(mFile,"\tsetAttr \".pl[%i].cp[%i].zv\" %f;\n", pl_i,cp_i,zv);
130 	}
setVlist(size_t vl_i,const Vlist & vl)131 	void setVlist(size_t vl_i,const Vlist& vl)
132 	{
133 		fprintf(mFile,"\tsetAttr \".vl[%i]\" ",vl_i);
134 		vl.write(mFile);
135 		fprintf(mFile,";\n");
136 	}
setVlist(size_t vl_start,size_t vl_end,Vlist * vl)137 	void setVlist(size_t vl_start,size_t vl_end,Vlist* vl)
138 	{
139 		fprintf(mFile,"\tsetAttr \".vl[%i:%i]\" ", vl_start,vl_end);
140 		size_t size = (vl_end-vl_start)*1+1;
141 		for(size_t i=0;i<size;++i)
142 		{
143 			vl[i].write(mFile);
144 			fprintf(mFile,"\n");
145 		}
146 		fprintf(mFile,";\n");
147 	}
startVlist(size_t vl_start,size_t vl_end)148 	void startVlist(size_t vl_start,size_t vl_end)const
149 	{
150 		fprintf(mFile,"\tsetAttr \".vl[%i:%i]\"",vl_start,vl_end);
151 		fprintf(mFile," -type \"Vlist\" ");
152 	}
appendVlist(const Vlist & vl)153 	void appendVlist(const Vlist& vl)const
154 	{
155 		fprintf(mFile," ");
156 		vl.write(mFile);
157 	}
endVlist()158 	void endVlist()const
159 	{
160 		fprintf(mFile,";\n");
161 	}
setVertex(size_t vl_i,size_t vt_i,const float3 & vt)162 	void setVertex(size_t vl_i,size_t vt_i,const float3& vt)
163 	{
164 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i]\" -type \"float3\" ",vl_i,vt_i);
165 		vt.write(mFile);
166 		fprintf(mFile,";\n");
167 	}
setVertex(size_t vl_i,size_t vt_start,size_t vt_end,float * vt)168 	void setVertex(size_t vl_i,size_t vt_start,size_t vt_end,float* vt)
169 	{
170 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i:%i]\" ", vl_i,vt_start,vt_end);
171 		size_t size = (vt_end-vt_start)*3+3;
172 		for(size_t i=0;i<size;++i)
173 		{
174 			fprintf(mFile,"%f",vt[i]);
175 			if(i+1<size) fprintf(mFile," ");
176 		}
177 		fprintf(mFile,";\n");
178 	}
startVertex(size_t vl_i,size_t vt_start,size_t vt_end)179 	void startVertex(size_t vl_i,size_t vt_start,size_t vt_end)const
180 	{
181 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i:%i]\"",vl_i,vt_start,vt_end);
182 	}
appendVertex(float vt)183 	void appendVertex(float vt)const
184 	{
185 		fprintf(mFile," %f",vt);
186 	}
endVertex()187 	void endVertex()const
188 	{
189 		fprintf(mFile,";\n");
190 	}
setXVertex(size_t vl_i,size_t vt_i,float vx)191 	void setXVertex(size_t vl_i,size_t vt_i,float vx)
192 	{
193 		if(vx == 0) return;
194 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i].vx\" %f;\n", vl_i,vt_i,vx);
195 	}
setYVertex(size_t vl_i,size_t vt_i,float vy)196 	void setYVertex(size_t vl_i,size_t vt_i,float vy)
197 	{
198 		if(vy == 0) return;
199 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i].vy\" %f;\n", vl_i,vt_i,vy);
200 	}
setZVertex(size_t vl_i,size_t vt_i,float vz)201 	void setZVertex(size_t vl_i,size_t vt_i,float vz)
202 	{
203 		if(vz == 0) return;
204 		fprintf(mFile,"\tsetAttr \".vl[%i].vt[%i].vz\" %f;\n", vl_i,vt_i,vz);
205 	}
getRelativeTweak()206 	void getRelativeTweak()const
207 	{
208 		fprintf(mFile,"\"%s.rtw\"",mName.c_str());
209 	}
getPlist(size_t pl_i)210 	void getPlist(size_t pl_i)const
211 	{
212 		fprintf(mFile,"\"%s.pl[%i]\"",mName.c_str(),pl_i);
213 	}
getPlist()214 	void getPlist()const
215 	{
216 
217 		fprintf(mFile,"\"%s.pl\"",mName.c_str());
218 	}
getControlPoints(size_t pl_i,size_t cp_i)219 	void getControlPoints(size_t pl_i,size_t cp_i)const
220 	{
221 		fprintf(mFile,"\"%s.pl[%i].cp[%i]\"",mName.c_str(),pl_i,cp_i);
222 	}
getControlPoints(size_t cp_i)223 	void getControlPoints(size_t cp_i)const
224 	{
225 
226 		fprintf(mFile,"\"%s.pl.cp[%i]\"",mName.c_str(),cp_i);
227 	}
getXValue(size_t pl_i,size_t cp_i)228 	void getXValue(size_t pl_i,size_t cp_i)const
229 	{
230 		fprintf(mFile,"\"%s.pl[%i].cp[%i].xv\"",mName.c_str(),pl_i,cp_i);
231 	}
getXValue(size_t cp_i)232 	void getXValue(size_t cp_i)const
233 	{
234 
235 		fprintf(mFile,"\"%s.pl.cp[%i].xv\"",mName.c_str(),cp_i);
236 	}
getYValue(size_t pl_i,size_t cp_i)237 	void getYValue(size_t pl_i,size_t cp_i)const
238 	{
239 		fprintf(mFile,"\"%s.pl[%i].cp[%i].yv\"",mName.c_str(),pl_i,cp_i);
240 	}
getYValue(size_t cp_i)241 	void getYValue(size_t cp_i)const
242 	{
243 
244 		fprintf(mFile,"\"%s.pl.cp[%i].yv\"",mName.c_str(),cp_i);
245 	}
getZValue(size_t pl_i,size_t cp_i)246 	void getZValue(size_t pl_i,size_t cp_i)const
247 	{
248 		fprintf(mFile,"\"%s.pl[%i].cp[%i].zv\"",mName.c_str(),pl_i,cp_i);
249 	}
getZValue(size_t cp_i)250 	void getZValue(size_t cp_i)const
251 	{
252 
253 		fprintf(mFile,"\"%s.pl.cp[%i].zv\"",mName.c_str(),cp_i);
254 	}
getVlist(size_t vl_i)255 	void getVlist(size_t vl_i)const
256 	{
257 		fprintf(mFile,"\"%s.vl[%i]\"",mName.c_str(),vl_i);
258 	}
getVlist()259 	void getVlist()const
260 	{
261 
262 		fprintf(mFile,"\"%s.vl\"",mName.c_str());
263 	}
getVertex(size_t vl_i,size_t vt_i)264 	void getVertex(size_t vl_i,size_t vt_i)const
265 	{
266 		fprintf(mFile,"\"%s.vl[%i].vt[%i]\"",mName.c_str(),vl_i,vt_i);
267 	}
getVertex(size_t vt_i)268 	void getVertex(size_t vt_i)const
269 	{
270 
271 		fprintf(mFile,"\"%s.vl.vt[%i]\"",mName.c_str(),vt_i);
272 	}
getXVertex(size_t vl_i,size_t vt_i)273 	void getXVertex(size_t vl_i,size_t vt_i)const
274 	{
275 		fprintf(mFile,"\"%s.vl[%i].vt[%i].vx\"",mName.c_str(),vl_i,vt_i);
276 	}
getXVertex(size_t vt_i)277 	void getXVertex(size_t vt_i)const
278 	{
279 
280 		fprintf(mFile,"\"%s.vl.vt[%i].vx\"",mName.c_str(),vt_i);
281 	}
getYVertex(size_t vl_i,size_t vt_i)282 	void getYVertex(size_t vl_i,size_t vt_i)const
283 	{
284 		fprintf(mFile,"\"%s.vl[%i].vt[%i].vy\"",mName.c_str(),vl_i,vt_i);
285 	}
getYVertex(size_t vt_i)286 	void getYVertex(size_t vt_i)const
287 	{
288 
289 		fprintf(mFile,"\"%s.vl.vt[%i].vy\"",mName.c_str(),vt_i);
290 	}
getZVertex(size_t vl_i,size_t vt_i)291 	void getZVertex(size_t vl_i,size_t vt_i)const
292 	{
293 		fprintf(mFile,"\"%s.vl[%i].vt[%i].vz\"",mName.c_str(),vl_i,vt_i);
294 	}
getZVertex(size_t vt_i)295 	void getZVertex(size_t vt_i)const
296 	{
297 
298 		fprintf(mFile,"\"%s.vl.vt[%i].vz\"",mName.c_str(),vt_i);
299 	}
300 protected:
301 	Tweak(FILE* file,const std::string& name,const std::string& parent,const std::string& nodeType,bool shared=false,bool create=true)
GeometryFilter(file,name,parent,nodeType,shared,create)302 		:GeometryFilter(file, name, parent, nodeType, shared, create) {}
303 
304 };
305 }//namespace MayaDM
306 #endif//__MayaDM_TWEAK_H__
307