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_FIELD_H__
11 #define __MayaDM_FIELD_H__
12 #include "MayaDMTypes.h"
13 #include "MayaDMConnectables.h"
14 #include "MayaDMDynBase.h"
15 namespace MayaDM
16 {
17 class Field : public DynBase
18 {
19 public:
20 	struct InputData{
21 		vectorArray inputPositions;
22 		vectorArray inputVelocities;
23 		doubleArray inputMass;
24 		double deltaTime;
writeInputData25 		void write(FILE* file) const
26 		{
27 			inputPositions.write(file);
28 			fprintf(file, " ");
29 			inputVelocities.write(file);
30 			fprintf(file, " ");
31 			inputMass.write(file);
32 			fprintf(file, " ");
33 			fprintf(file,"%f", deltaTime);
34 		}
35 	};
36 	struct FalloffCurve{
37 		float falloffCurve_Position;
38 		float falloffCurve_FloatValue;
39 		unsigned int falloffCurve_Interp;
writeFalloffCurve40 		void write(FILE* file) const
41 		{
42 			fprintf(file,"%f ", falloffCurve_Position);
43 			fprintf(file,"%f ", falloffCurve_FloatValue);
44 			fprintf(file,"%i", falloffCurve_Interp);
45 		}
46 	};
47 public:
48 
Field()49 	Field():DynBase(){}
50 	Field(FILE* file,const std::string& name,const std::string& parent="",bool shared=false,bool create=true)
51 		:DynBase(file, name, parent, "field", shared, create){}
~Field()52 	virtual ~Field(){}
53 
setMagnitude(double mag)54 	void setMagnitude(double mag)
55 	{
56 		if(mag == 1.0) return;
57 		fprintf(mFile,"\tsetAttr \".mag\" %f;\n", mag);
58 	}
setAttenuation(double att)59 	void setAttenuation(double att)
60 	{
61 		if(att == 0.0) return;
62 		fprintf(mFile,"\tsetAttr \".att\" %f;\n", att);
63 	}
setMaxDistance(double max)64 	void setMaxDistance(double max)
65 	{
66 		if(max == 1) return;
67 		fprintf(mFile,"\tsetAttr \".max\" %f;\n", max);
68 	}
setApplyPerVertex(bool apv)69 	void setApplyPerVertex(bool apv)
70 	{
71 		if(apv == false) return;
72 		fprintf(mFile,"\tsetAttr \".apv\" %i;\n", apv);
73 	}
setUseMaxDistance(bool umd)74 	void setUseMaxDistance(bool umd)
75 	{
76 		if(umd == false) return;
77 		fprintf(mFile,"\tsetAttr \".umd\" %i;\n", umd);
78 	}
setInputData(size_t ind_i,const InputData & ind)79 	void setInputData(size_t ind_i,const InputData& ind)
80 	{
81 		fprintf(mFile,"\tsetAttr \".ind[%i]\" ",ind_i);
82 		ind.write(mFile);
83 		fprintf(mFile,";\n");
84 	}
setInputData(size_t ind_start,size_t ind_end,InputData * ind)85 	void setInputData(size_t ind_start,size_t ind_end,InputData* ind)
86 	{
87 		fprintf(mFile,"\tsetAttr \".ind[%i:%i]\" ", ind_start,ind_end);
88 		size_t size = (ind_end-ind_start)*1+1;
89 		for(size_t i=0;i<size;++i)
90 		{
91 			ind[i].write(mFile);
92 			fprintf(mFile,"\n");
93 		}
94 		fprintf(mFile,";\n");
95 	}
startInputData(size_t ind_start,size_t ind_end)96 	void startInputData(size_t ind_start,size_t ind_end)const
97 	{
98 		fprintf(mFile,"\tsetAttr \".ind[%i:%i]\"",ind_start,ind_end);
99 		fprintf(mFile," -type \"InputData\" ");
100 	}
appendInputData(const InputData & ind)101 	void appendInputData(const InputData& ind)const
102 	{
103 		fprintf(mFile," ");
104 		ind.write(mFile);
105 	}
endInputData()106 	void endInputData()const
107 	{
108 		fprintf(mFile,";\n");
109 	}
setInputPositions(size_t ind_i,const vectorArray & inp)110 	void setInputPositions(size_t ind_i,const vectorArray& inp)
111 	{
112 		if(inp.size == 0) return;
113 		fprintf(mFile,"\tsetAttr \".ind[%i].inp\" -type \"vectorArray\" ",ind_i);
114 		inp.write(mFile);
115 		fprintf(mFile,";\n");
116 	}
setInputVelocities(size_t ind_i,const vectorArray & inv)117 	void setInputVelocities(size_t ind_i,const vectorArray& inv)
118 	{
119 		if(inv.size == 0) return;
120 		fprintf(mFile,"\tsetAttr \".ind[%i].inv\" -type \"vectorArray\" ",ind_i);
121 		inv.write(mFile);
122 		fprintf(mFile,";\n");
123 	}
setInputMass(size_t ind_i,const doubleArray & inm)124 	void setInputMass(size_t ind_i,const doubleArray& inm)
125 	{
126 		if(inm.size == 0) return;
127 		fprintf(mFile,"\tsetAttr \".ind[%i].inm\" -type \"doubleArray\" ",ind_i);
128 		inm.write(mFile);
129 		fprintf(mFile,";\n");
130 	}
setDeltaTime(size_t ind_i,double dt)131 	void setDeltaTime(size_t ind_i,double dt)
132 	{
133 		if(dt == 0) return;
134 		fprintf(mFile,"\tsetAttr \".ind[%i].dt\" %f;\n", ind_i,dt);
135 	}
setVolumeShape(unsigned int vol)136 	void setVolumeShape(unsigned int vol)
137 	{
138 		if(vol == 0) return;
139 		fprintf(mFile,"\tsetAttr \".vol\" %i;\n", vol);
140 	}
setVolumeExclusion(bool vex)141 	void setVolumeExclusion(bool vex)
142 	{
143 		if(vex == false) return;
144 		fprintf(mFile,"\tsetAttr \".vex\" %i;\n", vex);
145 	}
setVolumeOffset(const double3 & vfo)146 	void setVolumeOffset(const double3& vfo)
147 	{
148 		fprintf(mFile,"\tsetAttr \".vfo\" -type \"double3\" ");
149 		vfo.write(mFile);
150 		fprintf(mFile,";\n");
151 	}
setVolumeOffsetX(double vox)152 	void setVolumeOffsetX(double vox)
153 	{
154 		if(vox == 0) return;
155 		fprintf(mFile,"\tsetAttr \".vfo.vox\" %f;\n", vox);
156 	}
setVolumeOffsetY(double voy)157 	void setVolumeOffsetY(double voy)
158 	{
159 		if(voy == 0) return;
160 		fprintf(mFile,"\tsetAttr \".vfo.voy\" %f;\n", voy);
161 	}
setVolumeOffsetZ(double voz)162 	void setVolumeOffsetZ(double voz)
163 	{
164 		if(voz == 0) return;
165 		fprintf(mFile,"\tsetAttr \".vfo.voz\" %f;\n", voz);
166 	}
setSectionRadius(double tsr)167 	void setSectionRadius(double tsr)
168 	{
169 		if(tsr == 0) return;
170 		fprintf(mFile,"\tsetAttr \".tsr\" %f;\n", tsr);
171 	}
setVolumeSweep(double vsw)172 	void setVolumeSweep(double vsw)
173 	{
174 		if(vsw == 3) return;
175 		fprintf(mFile,"\tsetAttr \".vsw\" %f;\n", vsw);
176 	}
setFalloffCurve(size_t fc_i,const FalloffCurve & fc)177 	void setFalloffCurve(size_t fc_i,const FalloffCurve& fc)
178 	{
179 		fprintf(mFile,"\tsetAttr \".fc[%i]\" ",fc_i);
180 		fc.write(mFile);
181 		fprintf(mFile,";\n");
182 	}
setFalloffCurve(size_t fc_start,size_t fc_end,FalloffCurve * fc)183 	void setFalloffCurve(size_t fc_start,size_t fc_end,FalloffCurve* fc)
184 	{
185 		fprintf(mFile,"\tsetAttr \".fc[%i:%i]\" ", fc_start,fc_end);
186 		size_t size = (fc_end-fc_start)*1+1;
187 		for(size_t i=0;i<size;++i)
188 		{
189 			fc[i].write(mFile);
190 			fprintf(mFile,"\n");
191 		}
192 		fprintf(mFile,";\n");
193 	}
startFalloffCurve(size_t fc_start,size_t fc_end)194 	void startFalloffCurve(size_t fc_start,size_t fc_end)const
195 	{
196 		fprintf(mFile,"\tsetAttr \".fc[%i:%i]\"",fc_start,fc_end);
197 		fprintf(mFile," -type \"FalloffCurve\" ");
198 	}
appendFalloffCurve(const FalloffCurve & fc)199 	void appendFalloffCurve(const FalloffCurve& fc)const
200 	{
201 		fprintf(mFile," ");
202 		fc.write(mFile);
203 	}
endFalloffCurve()204 	void endFalloffCurve()const
205 	{
206 		fprintf(mFile,";\n");
207 	}
setFalloffCurve_Position(size_t fc_i,float fcp)208 	void setFalloffCurve_Position(size_t fc_i,float fcp)
209 	{
210 		if(fcp == 0.0) return;
211 		fprintf(mFile,"\tsetAttr \".fc[%i].fcp\" %f;\n", fc_i,fcp);
212 	}
setFalloffCurve_FloatValue(size_t fc_i,float fcfv)213 	void setFalloffCurve_FloatValue(size_t fc_i,float fcfv)
214 	{
215 		if(fcfv == 0.0) return;
216 		fprintf(mFile,"\tsetAttr \".fc[%i].fcfv\" %f;\n", fc_i,fcfv);
217 	}
setFalloffCurve_Interp(size_t fc_i,unsigned int fci)218 	void setFalloffCurve_Interp(size_t fc_i,unsigned int fci)
219 	{
220 		if(fci == 0) return;
221 		fprintf(mFile,"\tsetAttr \".fc[%i].fci\" %i;\n", fc_i,fci);
222 	}
getMagnitude()223 	void getMagnitude()const
224 	{
225 		fprintf(mFile,"\"%s.mag\"",mName.c_str());
226 	}
getAttenuation()227 	void getAttenuation()const
228 	{
229 		fprintf(mFile,"\"%s.att\"",mName.c_str());
230 	}
getMaxDistance()231 	void getMaxDistance()const
232 	{
233 		fprintf(mFile,"\"%s.max\"",mName.c_str());
234 	}
getApplyPerVertex()235 	void getApplyPerVertex()const
236 	{
237 		fprintf(mFile,"\"%s.apv\"",mName.c_str());
238 	}
getUseMaxDistance()239 	void getUseMaxDistance()const
240 	{
241 		fprintf(mFile,"\"%s.umd\"",mName.c_str());
242 	}
getInputData(size_t ind_i)243 	void getInputData(size_t ind_i)const
244 	{
245 		fprintf(mFile,"\"%s.ind[%i]\"",mName.c_str(),ind_i);
246 	}
getInputData()247 	void getInputData()const
248 	{
249 
250 		fprintf(mFile,"\"%s.ind\"",mName.c_str());
251 	}
getInputPositions(size_t ind_i)252 	void getInputPositions(size_t ind_i)const
253 	{
254 		fprintf(mFile,"\"%s.ind[%i].inp\"",mName.c_str(),ind_i);
255 	}
getInputPositions()256 	void getInputPositions()const
257 	{
258 
259 		fprintf(mFile,"\"%s.ind.inp\"",mName.c_str());
260 	}
getInputVelocities(size_t ind_i)261 	void getInputVelocities(size_t ind_i)const
262 	{
263 		fprintf(mFile,"\"%s.ind[%i].inv\"",mName.c_str(),ind_i);
264 	}
getInputVelocities()265 	void getInputVelocities()const
266 	{
267 
268 		fprintf(mFile,"\"%s.ind.inv\"",mName.c_str());
269 	}
getInputMass(size_t ind_i)270 	void getInputMass(size_t ind_i)const
271 	{
272 		fprintf(mFile,"\"%s.ind[%i].inm\"",mName.c_str(),ind_i);
273 	}
getInputMass()274 	void getInputMass()const
275 	{
276 
277 		fprintf(mFile,"\"%s.ind.inm\"",mName.c_str());
278 	}
getDeltaTime(size_t ind_i)279 	void getDeltaTime(size_t ind_i)const
280 	{
281 		fprintf(mFile,"\"%s.ind[%i].dt\"",mName.c_str(),ind_i);
282 	}
getDeltaTime()283 	void getDeltaTime()const
284 	{
285 
286 		fprintf(mFile,"\"%s.ind.dt\"",mName.c_str());
287 	}
getInputForce(size_t inf_i)288 	void getInputForce(size_t inf_i)const
289 	{
290 		fprintf(mFile,"\"%s.inf[%i]\"",mName.c_str(),inf_i);
291 	}
getInputForce()292 	void getInputForce()const
293 	{
294 
295 		fprintf(mFile,"\"%s.inf\"",mName.c_str());
296 	}
getOutputForce(size_t of_i)297 	void getOutputForce(size_t of_i)const
298 	{
299 		fprintf(mFile,"\"%s.of[%i]\"",mName.c_str(),of_i);
300 	}
getOutputForce()301 	void getOutputForce()const
302 	{
303 
304 		fprintf(mFile,"\"%s.of\"",mName.c_str());
305 	}
getVolumeShape()306 	void getVolumeShape()const
307 	{
308 		fprintf(mFile,"\"%s.vol\"",mName.c_str());
309 	}
getVolumeExclusion()310 	void getVolumeExclusion()const
311 	{
312 		fprintf(mFile,"\"%s.vex\"",mName.c_str());
313 	}
getVolumeOffset()314 	void getVolumeOffset()const
315 	{
316 		fprintf(mFile,"\"%s.vfo\"",mName.c_str());
317 	}
getVolumeOffsetX()318 	void getVolumeOffsetX()const
319 	{
320 		fprintf(mFile,"\"%s.vfo.vox\"",mName.c_str());
321 	}
getVolumeOffsetY()322 	void getVolumeOffsetY()const
323 	{
324 		fprintf(mFile,"\"%s.vfo.voy\"",mName.c_str());
325 	}
getVolumeOffsetZ()326 	void getVolumeOffsetZ()const
327 	{
328 		fprintf(mFile,"\"%s.vfo.voz\"",mName.c_str());
329 	}
getSectionRadius()330 	void getSectionRadius()const
331 	{
332 		fprintf(mFile,"\"%s.tsr\"",mName.c_str());
333 	}
getVolumeSweep()334 	void getVolumeSweep()const
335 	{
336 		fprintf(mFile,"\"%s.vsw\"",mName.c_str());
337 	}
getInputPPData(size_t ppda_i)338 	void getInputPPData(size_t ppda_i)const
339 	{
340 		fprintf(mFile,"\"%s.ppda[%i]\"",mName.c_str(),ppda_i);
341 	}
getInputPPData()342 	void getInputPPData()const
343 	{
344 
345 		fprintf(mFile,"\"%s.ppda\"",mName.c_str());
346 	}
getOwnerPPData()347 	void getOwnerPPData()const
348 	{
349 		fprintf(mFile,"\"%s.oppd\"",mName.c_str());
350 	}
getFalloffCurve(size_t fc_i)351 	void getFalloffCurve(size_t fc_i)const
352 	{
353 		fprintf(mFile,"\"%s.fc[%i]\"",mName.c_str(),fc_i);
354 	}
getFalloffCurve()355 	void getFalloffCurve()const
356 	{
357 
358 		fprintf(mFile,"\"%s.fc\"",mName.c_str());
359 	}
getFalloffCurve_Position(size_t fc_i)360 	void getFalloffCurve_Position(size_t fc_i)const
361 	{
362 		fprintf(mFile,"\"%s.fc[%i].fcp\"",mName.c_str(),fc_i);
363 	}
getFalloffCurve_Position()364 	void getFalloffCurve_Position()const
365 	{
366 
367 		fprintf(mFile,"\"%s.fc.fcp\"",mName.c_str());
368 	}
getFalloffCurve_FloatValue(size_t fc_i)369 	void getFalloffCurve_FloatValue(size_t fc_i)const
370 	{
371 		fprintf(mFile,"\"%s.fc[%i].fcfv\"",mName.c_str(),fc_i);
372 	}
getFalloffCurve_FloatValue()373 	void getFalloffCurve_FloatValue()const
374 	{
375 
376 		fprintf(mFile,"\"%s.fc.fcfv\"",mName.c_str());
377 	}
getFalloffCurve_Interp(size_t fc_i)378 	void getFalloffCurve_Interp(size_t fc_i)const
379 	{
380 		fprintf(mFile,"\"%s.fc[%i].fci\"",mName.c_str(),fc_i);
381 	}
getFalloffCurve_Interp()382 	void getFalloffCurve_Interp()const
383 	{
384 
385 		fprintf(mFile,"\"%s.fc.fci\"",mName.c_str());
386 	}
387 protected:
388 	Field(FILE* file,const std::string& name,const std::string& parent,const std::string& nodeType,bool shared=false,bool create=true)
DynBase(file,name,parent,nodeType,shared,create)389 		:DynBase(file, name, parent, nodeType, shared, create) {}
390 
391 };
392 }//namespace MayaDM
393 #endif//__MayaDM_FIELD_H__
394