PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/Externals/MayaDataModel/include/MayaDMSkinCluster.h

https://bitbucket.org/ZhangJingGuo/opencollada
C Header | 479 lines | 457 code | 13 blank | 9 comment | 47 complexity | a713230e23142ad331435e9356fc994b MD5 | raw file
  1. /*
  2. Copyright (c) 2008-2009 NetAllied Systems GmbH
  3. This file is part of MayaDataModel.
  4. Licensed under the MIT Open Source License,
  5. for details please see LICENSE file or the website
  6. http://www.opensource.org/licenses/mit-license.php
  7. */
  8. #ifndef __MayaDM_SKINCLUSTER_H__
  9. #define __MayaDM_SKINCLUSTER_H__
  10. #include "MayaDMTypes.h"
  11. #include "MayaDMConnectables.h"
  12. #include "MayaDMGeometryFilter.h"
  13. namespace MayaDM
  14. {
  15. class SkinCluster : public GeometryFilter
  16. {
  17. public:
  18. struct WeightList{
  19. double* weights;
  20. void write(FILE* file) const
  21. {
  22. size_t size = sizeof(weights)/sizeof(double);
  23. for(size_t i=0; i<size; ++i)
  24. {
  25. fprintf(file,"%f", weights[i]);
  26. if(i+1<size) fprintf(file," ");
  27. }
  28. }
  29. };
  30. public:
  31. SkinCluster():GeometryFilter(){}
  32. SkinCluster(FILE* file,const std::string& name,const std::string& parent="",bool shared=false,bool create=true)
  33. :GeometryFilter(file, name, parent, "skinCluster", shared, create){}
  34. virtual ~SkinCluster(){}
  35. void setWeightList(size_t wl_i,const WeightList& wl)
  36. {
  37. fprintf(mFile,"\tsetAttr \".wl[%i]\" ",wl_i);
  38. wl.write(mFile);
  39. fprintf(mFile,";\n");
  40. }
  41. void setWeightList(size_t wl_start,size_t wl_end,WeightList* wl)
  42. {
  43. fprintf(mFile,"\tsetAttr \".wl[%i:%i]\" ", wl_start,wl_end);
  44. size_t size = (wl_end-wl_start)*1+1;
  45. for(size_t i=0;i<size;++i)
  46. {
  47. wl[i].write(mFile);
  48. fprintf(mFile,"\n");
  49. }
  50. fprintf(mFile,";\n");
  51. }
  52. void startWeightList(size_t wl_start,size_t wl_end)const
  53. {
  54. fprintf(mFile,"\tsetAttr \".wl[%i:%i]\"",wl_start,wl_end);
  55. fprintf(mFile," -type \"WeightList\" ");
  56. }
  57. void appendWeightList(const WeightList& wl)const
  58. {
  59. fprintf(mFile," ");
  60. wl.write(mFile);
  61. }
  62. void endWeightList()const
  63. {
  64. fprintf(mFile,";\n");
  65. }
  66. void setWeights(size_t wl_i,size_t w_i,double w)
  67. {
  68. if(w == 0.0) return;
  69. fprintf(mFile,"\tsetAttr \".wl[%i].w[%i]\" %f;\n", wl_i,w_i,w);
  70. }
  71. void setWeights(size_t wl_i,size_t w_start,size_t w_end,double* w)
  72. {
  73. fprintf(mFile,"\tsetAttr \".wl[%i].w[%i:%i]\" ", wl_i,w_start,w_end);
  74. size_t size = (w_end-w_start)*1+1;
  75. for(size_t i=0;i<size;++i)
  76. {
  77. fprintf(mFile,"%f",w[i]);
  78. if(i+1<size) fprintf(mFile," ");
  79. }
  80. fprintf(mFile,";\n");
  81. }
  82. void startWeights(size_t wl_i,size_t w_start,size_t w_end)const
  83. {
  84. fprintf(mFile,"\tsetAttr \".wl[%i].w[%i:%i]\"",wl_i,w_start,w_end);
  85. }
  86. void appendWeights(double w)const
  87. {
  88. fprintf(mFile," %f",w);
  89. }
  90. void endWeights()const
  91. {
  92. fprintf(mFile,";\n");
  93. }
  94. void setBindPreMatrix(size_t pm_i,const matrix& pm)
  95. {
  96. if(pm == identity) return;
  97. fprintf(mFile,"\tsetAttr \".pm[%i]\" -type \"matrix\" ",pm_i);
  98. pm.write(mFile);
  99. fprintf(mFile,";\n");
  100. }
  101. void setBindPreMatrix(size_t pm_start,size_t pm_end,matrix* pm)
  102. {
  103. fprintf(mFile,"\tsetAttr \".pm[%i:%i]\" ", pm_start,pm_end);
  104. size_t size = (pm_end-pm_start)*1+1;
  105. for(size_t i=0;i<size;++i)
  106. {
  107. pm[i].write(mFile);
  108. fprintf(mFile,"\n");
  109. }
  110. fprintf(mFile,";\n");
  111. }
  112. void startBindPreMatrix(size_t pm_start,size_t pm_end)const
  113. {
  114. fprintf(mFile,"\tsetAttr \".pm[%i:%i]\"",pm_start,pm_end);
  115. fprintf(mFile," -type \"matrix\" ");
  116. }
  117. void appendBindPreMatrix(const matrix& pm)const
  118. {
  119. fprintf(mFile," ");
  120. pm.write(mFile);
  121. }
  122. void endBindPreMatrix()const
  123. {
  124. fprintf(mFile,";\n");
  125. }
  126. void setGeomMatrix(const matrix& gm)
  127. {
  128. if(gm == identity) return;
  129. fprintf(mFile,"\tsetAttr \".gm\" -type \"matrix\" ");
  130. gm.write(mFile);
  131. fprintf(mFile,";\n");
  132. }
  133. void setMatrix(size_t ma_i,const matrix& ma)
  134. {
  135. if(ma == identity) return;
  136. fprintf(mFile,"\tsetAttr \".ma[%i]\" -type \"matrix\" ",ma_i);
  137. ma.write(mFile);
  138. fprintf(mFile,";\n");
  139. }
  140. void setMatrix(size_t ma_start,size_t ma_end,matrix* ma)
  141. {
  142. fprintf(mFile,"\tsetAttr \".ma[%i:%i]\" ", ma_start,ma_end);
  143. size_t size = (ma_end-ma_start)*1+1;
  144. for(size_t i=0;i<size;++i)
  145. {
  146. ma[i].write(mFile);
  147. fprintf(mFile,"\n");
  148. }
  149. fprintf(mFile,";\n");
  150. }
  151. void startMatrix(size_t ma_start,size_t ma_end)const
  152. {
  153. fprintf(mFile,"\tsetAttr \".ma[%i:%i]\"",ma_start,ma_end);
  154. fprintf(mFile," -type \"matrix\" ");
  155. }
  156. void appendMatrix(const matrix& ma)const
  157. {
  158. fprintf(mFile," ");
  159. ma.write(mFile);
  160. }
  161. void endMatrix()const
  162. {
  163. fprintf(mFile,";\n");
  164. }
  165. void setDropoff(size_t dpf_i,double dpf)
  166. {
  167. if(dpf == 4.0) return;
  168. fprintf(mFile,"\tsetAttr \".dpf[%i]\" %f;\n", dpf_i,dpf);
  169. }
  170. void setDropoff(size_t dpf_start,size_t dpf_end,double* dpf)
  171. {
  172. fprintf(mFile,"\tsetAttr \".dpf[%i:%i]\" ", dpf_start,dpf_end);
  173. size_t size = (dpf_end-dpf_start)*1+1;
  174. for(size_t i=0;i<size;++i)
  175. {
  176. fprintf(mFile,"%f",dpf[i]);
  177. if(i+1<size) fprintf(mFile," ");
  178. }
  179. fprintf(mFile,";\n");
  180. }
  181. void startDropoff(size_t dpf_start,size_t dpf_end)const
  182. {
  183. fprintf(mFile,"\tsetAttr \".dpf[%i:%i]\"",dpf_start,dpf_end);
  184. }
  185. void appendDropoff(double dpf)const
  186. {
  187. fprintf(mFile," %f",dpf);
  188. }
  189. void endDropoff()const
  190. {
  191. fprintf(mFile,";\n");
  192. }
  193. void setSmoothness(size_t smt_i,double smt)
  194. {
  195. if(smt == 0.0) return;
  196. fprintf(mFile,"\tsetAttr \".smt[%i]\" %f;\n", smt_i,smt);
  197. }
  198. void setSmoothness(size_t smt_start,size_t smt_end,double* smt)
  199. {
  200. fprintf(mFile,"\tsetAttr \".smt[%i:%i]\" ", smt_start,smt_end);
  201. size_t size = (smt_end-smt_start)*1+1;
  202. for(size_t i=0;i<size;++i)
  203. {
  204. fprintf(mFile,"%f",smt[i]);
  205. if(i+1<size) fprintf(mFile," ");
  206. }
  207. fprintf(mFile,";\n");
  208. }
  209. void startSmoothness(size_t smt_start,size_t smt_end)const
  210. {
  211. fprintf(mFile,"\tsetAttr \".smt[%i:%i]\"",smt_start,smt_end);
  212. }
  213. void appendSmoothness(double smt)const
  214. {
  215. fprintf(mFile," %f",smt);
  216. }
  217. void endSmoothness()const
  218. {
  219. fprintf(mFile,";\n");
  220. }
  221. void setLockWeights(size_t lw_i,bool lw)
  222. {
  223. if(lw == false) return;
  224. fprintf(mFile,"\tsetAttr \".lw[%i]\" %i;\n", lw_i,lw);
  225. }
  226. void setLockWeights(size_t lw_start,size_t lw_end,bool* lw)
  227. {
  228. fprintf(mFile,"\tsetAttr \".lw[%i:%i]\" ", lw_start,lw_end);
  229. size_t size = (lw_end-lw_start)*1+1;
  230. for(size_t i=0;i<size;++i)
  231. {
  232. fprintf(mFile,"%i",lw[i]);
  233. if(i+1<size) fprintf(mFile," ");
  234. }
  235. fprintf(mFile,";\n");
  236. }
  237. void startLockWeights(size_t lw_start,size_t lw_end)const
  238. {
  239. fprintf(mFile,"\tsetAttr \".lw[%i:%i]\"",lw_start,lw_end);
  240. }
  241. void appendLockWeights(bool lw)const
  242. {
  243. fprintf(mFile," %i",lw);
  244. }
  245. void endLockWeights()const
  246. {
  247. fprintf(mFile,";\n");
  248. }
  249. void setMaintainMaxInfluences(bool mmi)
  250. {
  251. if(mmi == false) return;
  252. fprintf(mFile,"\tsetAttr \".mmi\" %i;\n", mmi);
  253. }
  254. void setMaxInfluences(int mi)
  255. {
  256. if(mi == 2) return;
  257. fprintf(mFile,"\tsetAttr \".mi\" %i;\n", mi);
  258. }
  259. void setBindMethod(int bm)
  260. {
  261. if(bm == 1) return;
  262. fprintf(mFile,"\tsetAttr \".bm\" %i;\n", bm);
  263. }
  264. void setPaintWeights(const doubleArray& ptw)
  265. {
  266. if(ptw.size == 0) return;
  267. fprintf(mFile,"\tsetAttr \".ptw\" -type \"doubleArray\" ");
  268. ptw.write(mFile);
  269. fprintf(mFile,";\n");
  270. }
  271. void setUseComponents(bool uc)
  272. {
  273. if(uc == 0) return;
  274. fprintf(mFile,"\tsetAttr \".uc\" %i;\n", uc);
  275. }
  276. void setNurbsSamples(size_t ns_i,int ns)
  277. {
  278. if(ns == 10) return;
  279. fprintf(mFile,"\tsetAttr \".ns[%i]\" %i;\n", ns_i,ns);
  280. }
  281. void setNurbsSamples(size_t ns_start,size_t ns_end,int* ns)
  282. {
  283. fprintf(mFile,"\tsetAttr \".ns[%i:%i]\" ", ns_start,ns_end);
  284. size_t size = (ns_end-ns_start)*1+1;
  285. for(size_t i=0;i<size;++i)
  286. {
  287. fprintf(mFile,"%i",ns[i]);
  288. if(i+1<size) fprintf(mFile," ");
  289. }
  290. fprintf(mFile,";\n");
  291. }
  292. void startNurbsSamples(size_t ns_start,size_t ns_end)const
  293. {
  294. fprintf(mFile,"\tsetAttr \".ns[%i:%i]\"",ns_start,ns_end);
  295. }
  296. void appendNurbsSamples(int ns)const
  297. {
  298. fprintf(mFile," %i",ns);
  299. }
  300. void endNurbsSamples()const
  301. {
  302. fprintf(mFile,";\n");
  303. }
  304. void setUseComponentsMatrix(bool ucm)
  305. {
  306. if(ucm == false) return;
  307. fprintf(mFile,"\tsetAttr \".ucm\" %i;\n", ucm);
  308. }
  309. void setNormalizeWeights(bool nw)
  310. {
  311. if(nw == true) return;
  312. fprintf(mFile,"\tsetAttr \".nw\" %i;\n", nw);
  313. }
  314. void setDeformUserNormals(bool dun)
  315. {
  316. if(dun == true) return;
  317. fprintf(mFile,"\tsetAttr \".dun\" %i;\n", dun);
  318. }
  319. void getWeightList(size_t wl_i)const
  320. {
  321. fprintf(mFile,"\"%s.wl[%i]\"",mName.c_str(),wl_i);
  322. }
  323. void getWeightList()const
  324. {
  325. fprintf(mFile,"\"%s.wl\"",mName.c_str());
  326. }
  327. void getWeights(size_t wl_i,size_t w_i)const
  328. {
  329. fprintf(mFile,"\"%s.wl[%i].w[%i]\"",mName.c_str(),wl_i,w_i);
  330. }
  331. void getWeights(size_t w_i)const
  332. {
  333. fprintf(mFile,"\"%s.wl.w[%i]\"",mName.c_str(),w_i);
  334. }
  335. void getBindPreMatrix(size_t pm_i)const
  336. {
  337. fprintf(mFile,"\"%s.pm[%i]\"",mName.c_str(),pm_i);
  338. }
  339. void getBindPreMatrix()const
  340. {
  341. fprintf(mFile,"\"%s.pm\"",mName.c_str());
  342. }
  343. void getGeomMatrix()const
  344. {
  345. fprintf(mFile,"\"%s.gm\"",mName.c_str());
  346. }
  347. void getMatrix(size_t ma_i)const
  348. {
  349. fprintf(mFile,"\"%s.ma[%i]\"",mName.c_str(),ma_i);
  350. }
  351. void getMatrix()const
  352. {
  353. fprintf(mFile,"\"%s.ma\"",mName.c_str());
  354. }
  355. void getDropoffRate()const
  356. {
  357. fprintf(mFile,"\"%s.dr\"",mName.c_str());
  358. }
  359. void getDropoff(size_t dpf_i)const
  360. {
  361. fprintf(mFile,"\"%s.dpf[%i]\"",mName.c_str(),dpf_i);
  362. }
  363. void getDropoff()const
  364. {
  365. fprintf(mFile,"\"%s.dpf\"",mName.c_str());
  366. }
  367. void getSmoothness(size_t smt_i)const
  368. {
  369. fprintf(mFile,"\"%s.smt[%i]\"",mName.c_str(),smt_i);
  370. }
  371. void getSmoothness()const
  372. {
  373. fprintf(mFile,"\"%s.smt\"",mName.c_str());
  374. }
  375. void getLockWeights(size_t lw_i)const
  376. {
  377. fprintf(mFile,"\"%s.lw[%i]\"",mName.c_str(),lw_i);
  378. }
  379. void getLockWeights()const
  380. {
  381. fprintf(mFile,"\"%s.lw\"",mName.c_str());
  382. }
  383. void getMaintainMaxInfluences()const
  384. {
  385. fprintf(mFile,"\"%s.mmi\"",mName.c_str());
  386. }
  387. void getMaxInfluences()const
  388. {
  389. fprintf(mFile,"\"%s.mi\"",mName.c_str());
  390. }
  391. void getBindMethod()const
  392. {
  393. fprintf(mFile,"\"%s.bm\"",mName.c_str());
  394. }
  395. void getDriverPoints(size_t drp_i)const
  396. {
  397. fprintf(mFile,"\"%s.drp[%i]\"",mName.c_str(),drp_i);
  398. }
  399. void getDriverPoints()const
  400. {
  401. fprintf(mFile,"\"%s.drp\"",mName.c_str());
  402. }
  403. void getBasePoints(size_t bsp_i)const
  404. {
  405. fprintf(mFile,"\"%s.bsp[%i]\"",mName.c_str(),bsp_i);
  406. }
  407. void getBasePoints()const
  408. {
  409. fprintf(mFile,"\"%s.bsp\"",mName.c_str());
  410. }
  411. void getBaseDirty()const
  412. {
  413. fprintf(mFile,"\"%s.bsd\"",mName.c_str());
  414. }
  415. void getPaintWeights()const
  416. {
  417. fprintf(mFile,"\"%s.ptw\"",mName.c_str());
  418. }
  419. void getPaintTrans()const
  420. {
  421. fprintf(mFile,"\"%s.ptt\"",mName.c_str());
  422. }
  423. void getPaintArrDirty()const
  424. {
  425. fprintf(mFile,"\"%s.pad\"",mName.c_str());
  426. }
  427. void getUseComponents()const
  428. {
  429. fprintf(mFile,"\"%s.uc\"",mName.c_str());
  430. }
  431. void getNurbsSamples(size_t ns_i)const
  432. {
  433. fprintf(mFile,"\"%s.ns[%i]\"",mName.c_str(),ns_i);
  434. }
  435. void getNurbsSamples()const
  436. {
  437. fprintf(mFile,"\"%s.ns\"",mName.c_str());
  438. }
  439. void getUseComponentsMatrix()const
  440. {
  441. fprintf(mFile,"\"%s.ucm\"",mName.c_str());
  442. }
  443. void getNormalizeWeights()const
  444. {
  445. fprintf(mFile,"\"%s.nw\"",mName.c_str());
  446. }
  447. void getDeformUserNormals()const
  448. {
  449. fprintf(mFile,"\"%s.dun\"",mName.c_str());
  450. }
  451. void getWtDrty()const
  452. {
  453. fprintf(mFile,"\"%s.wtd\"",mName.c_str());
  454. }
  455. void getBindPose()const
  456. {
  457. fprintf(mFile,"\"%s.bp\"",mName.c_str());
  458. }
  459. protected:
  460. SkinCluster(FILE* file,const std::string& name,const std::string& parent,const std::string& nodeType,bool shared=false,bool create=true)
  461. :GeometryFilter(file, name, parent, nodeType, shared, create) {}
  462. };
  463. }//namespace MayaDM
  464. #endif//__MayaDM_SKINCLUSTER_H__