ReAntTweakBar.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  1. // This file is part of libigl, a simple c++ geometry processing library.
  2. //
  3. // Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>
  4. //
  5. // This Source Code Form is subject to the terms of the Mozilla Public License
  6. // v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. // obtain one at http://mozilla.org/MPL/2.0/.
  8. #include "ReAntTweakBar.h"
  9. #include <cstdio>
  10. #include <cstring>
  11. #include <sstream>
  12. #include <iostream>
  13. #include <iomanip>
  14. #include <map>
  15. // GLOBAL WRAPPERS
  16. namespace
  17. {
  18. std::map<
  19. TwType,std::pair<const char *,std::vector<TwEnumVal> >
  20. > ReTw_custom_types;
  21. }
  22. IGL_INLINE TwType igl::anttweakbar::ReTwDefineEnum(
  23. const char *name,
  24. const TwEnumVal *enumValues,
  25. unsigned int nbValues)
  26. {
  27. using namespace std;
  28. // copy enum valus into vector
  29. std::vector<TwEnumVal> enum_vals;
  30. enum_vals.resize(nbValues);
  31. for(unsigned int j = 0; j<nbValues;j++)
  32. {
  33. enum_vals[j] = enumValues[j];
  34. }
  35. TwType type = TwDefineEnum(name,enumValues,nbValues);
  36. ReTw_custom_types[type] =
  37. std::pair<const char *,std::vector<TwEnumVal> >(name,enum_vals);
  38. return type;
  39. }
  40. IGL_INLINE TwType igl::anttweakbar::ReTwDefineEnumFromString(
  41. const char * _Name,
  42. const char * _EnumString)
  43. {
  44. // Taken directly from TwMgr.cpp, just replace TwDefineEnum with
  45. // ReTwDefineEnum
  46. using namespace std;
  47. {
  48. if (_EnumString == NULL)
  49. return ReTwDefineEnum(_Name, NULL, 0);
  50. // split enumString
  51. stringstream EnumStream(_EnumString);
  52. string Label;
  53. vector<string> Labels;
  54. while( getline(EnumStream, Label, ',') ) {
  55. // trim Label
  56. size_t Start = Label.find_first_not_of(" \n\r\t");
  57. size_t End = Label.find_last_not_of(" \n\r\t");
  58. if( Start==string::npos || End==string::npos )
  59. Label = "";
  60. else
  61. Label = Label.substr(Start, (End-Start)+1);
  62. // store Label
  63. Labels.push_back(Label);
  64. }
  65. // create TwEnumVal array
  66. vector<TwEnumVal> Vals(Labels.size());
  67. for( int i=0; i<(int)Labels.size(); i++ )
  68. {
  69. Vals[i].Value = i;
  70. // Wrong:
  71. //Vals[i].Label = Labels[i].c_str();
  72. // Allocate char on heap
  73. // http://stackoverflow.com/a/10050258/148668
  74. char * c_label = new char[Labels[i].length()+1];
  75. std::strcpy(c_label, Labels[i].c_str());
  76. Vals[i].Label = c_label;
  77. }
  78. const TwType type =
  79. ReTwDefineEnum(_Name, Vals.empty() ?
  80. NULL :
  81. &(Vals[0]), (unsigned int)Vals.size());
  82. return type;
  83. }
  84. }
  85. namespace
  86. {
  87. struct ReTwTypeString
  88. {
  89. TwType type;
  90. const char * type_str;
  91. };
  92. #define RETW_NUM_DEFAULT_TYPE_STRINGS 23
  93. ReTwTypeString ReTwDefaultTypeStrings[RETW_NUM_DEFAULT_TYPE_STRINGS] =
  94. {
  95. {TW_TYPE_UNDEF,"TW_TYPE_UNDEF"},
  96. {TW_TYPE_BOOLCPP,"TW_TYPE_BOOLCPP"},
  97. {TW_TYPE_BOOL8,"TW_TYPE_BOOL8"},
  98. {TW_TYPE_BOOL16,"TW_TYPE_BOOL16"},
  99. {TW_TYPE_BOOL32,"TW_TYPE_BOOL32"},
  100. {TW_TYPE_CHAR,"TW_TYPE_CHAR"},
  101. {TW_TYPE_INT8,"TW_TYPE_INT8"},
  102. {TW_TYPE_UINT8,"TW_TYPE_UINT8"},
  103. {TW_TYPE_INT16,"TW_TYPE_INT16"},
  104. {TW_TYPE_UINT16,"TW_TYPE_UINT16"},
  105. {TW_TYPE_INT32,"TW_TYPE_INT32"},
  106. {TW_TYPE_UINT32,"TW_TYPE_UINT32"},
  107. {TW_TYPE_FLOAT,"TW_TYPE_FLOAT"},
  108. {TW_TYPE_DOUBLE,"TW_TYPE_DOUBLE"},
  109. {TW_TYPE_COLOR32,"TW_TYPE_COLOR32"},
  110. {TW_TYPE_COLOR3F,"TW_TYPE_COLOR3F"},
  111. {TW_TYPE_COLOR4F,"TW_TYPE_COLOR4F"},
  112. {TW_TYPE_CDSTRING,"TW_TYPE_CDSTRING"},
  113. {TW_TYPE_STDSTRING,"TW_TYPE_STDSTRING"},
  114. {TW_TYPE_QUAT4F,"TW_TYPE_QUAT4F"},
  115. {TW_TYPE_QUAT4D,"TW_TYPE_QUAT4D"},
  116. {TW_TYPE_DIR3F,"TW_TYPE_DIR3F"},
  117. {TW_TYPE_DIR3D,"TW_TYPE_DIR3D"}
  118. };
  119. }
  120. IGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar():
  121. bar(NULL),
  122. name(),
  123. rw_items(),cb_items()
  124. {
  125. }
  126. IGL_INLINE igl::anttweakbar::ReTwBar::ReTwBar(
  127. const igl::anttweakbar::ReTwBar & that):
  128. bar(that.bar),
  129. name(that.name),
  130. rw_items(that.rw_items),
  131. cb_items(that.cb_items)
  132. {
  133. }
  134. IGL_INLINE igl::anttweakbar::ReTwBar &
  135. igl::anttweakbar::ReTwBar::operator=(const igl::anttweakbar::ReTwBar & that)
  136. {
  137. // check for self assignment
  138. if(this != &that)
  139. {
  140. bar = that.bar;
  141. rw_items = that.rw_items;
  142. cb_items = that.cb_items;
  143. }
  144. return *this;
  145. }
  146. // BAR WRAPPERS
  147. IGL_INLINE void igl::anttweakbar::ReTwBar::TwNewBar(const char * _name)
  148. {
  149. this->bar = ::TwNewBar(_name);
  150. // Alec: This causes trouble (not sure why) in multiple applications
  151. // (medit, puppet) Probably there is some sort of memory corrpution.
  152. // this->name = _name;
  153. // Suspiciously this also fails:
  154. //this->name = "foobar";
  155. }
  156. IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRW(
  157. const char *name,
  158. TwType type,
  159. void *var,
  160. const char *def,
  161. const bool record)
  162. {
  163. int ret = ::TwAddVarRW(this->bar,name,type,var,def);
  164. if(ret && record)
  165. {
  166. rw_items.push_back(ReTwRWItem(name,type,var));
  167. }
  168. return ret;
  169. }
  170. IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarCB(
  171. const char *name,
  172. TwType type,
  173. TwSetVarCallback setCallback,
  174. TwGetVarCallback getCallback,
  175. void *clientData,
  176. const char *def,
  177. const bool record)
  178. {
  179. int ret =
  180. ::TwAddVarCB(this->bar,name,type,setCallback,getCallback,clientData,def);
  181. if(ret && record)
  182. {
  183. cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));
  184. }
  185. return ret;
  186. }
  187. IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddVarRO(
  188. const char *name,
  189. TwType type,
  190. void *var,
  191. const char *def)
  192. {
  193. int ret = ::TwAddVarRO(this->bar,name,type,var,def);
  194. // Read only variables are not recorded
  195. //if(ret)
  196. //{
  197. // rw_items.push_back(ReTwRWItem(name,type,var));
  198. //}
  199. return ret;
  200. }
  201. IGL_INLINE int igl::anttweakbar::ReTwBar::TwAddButton(
  202. const char *name,
  203. TwButtonCallback buttonCallback,
  204. void *clientData,
  205. const char *def)
  206. {
  207. int ret =
  208. ::TwAddButton(this->bar,name,buttonCallback,clientData,def);
  209. // buttons are not recorded
  210. //if(ret)
  211. //{
  212. // cb_items.push_back(ReTwCBItem(name,type,setCallback,getCallback,clientData));
  213. //}
  214. return ret;
  215. }
  216. IGL_INLINE int igl::anttweakbar::ReTwBar::TwSetParam(
  217. const char *varName,
  218. const char *paramName,
  219. TwParamValueType paramValueType,
  220. unsigned int inValueCount,
  221. const void *inValues)
  222. {
  223. // For now just pass these along
  224. return
  225. ::TwSetParam(
  226. this->bar,
  227. varName,
  228. paramName,
  229. paramValueType,
  230. inValueCount,
  231. inValues);
  232. }
  233. IGL_INLINE int igl::anttweakbar::ReTwBar::TwGetParam(
  234. const char *varName,
  235. const char *paramName,
  236. TwParamValueType paramValueType,
  237. unsigned int outValueMaxCount,
  238. void *outValues)
  239. {
  240. return
  241. ::TwGetParam(
  242. this->bar,
  243. varName,
  244. paramName,
  245. paramValueType,
  246. outValueMaxCount,
  247. outValues);
  248. }
  249. IGL_INLINE int igl::anttweakbar::ReTwBar::TwRefreshBar()
  250. {
  251. return ::TwRefreshBar(this->bar);
  252. }
  253. IGL_INLINE int igl::anttweakbar::ReTwBar::TwTerminate()
  254. {
  255. //std::cout<<"TwTerminate"<<std::endl;
  256. int r = ::TwTerminate();
  257. //std::cout<<" "<<r<<std::endl;
  258. return r;
  259. }
  260. IGL_INLINE bool igl::anttweakbar::ReTwBar::save(const char *file_name)
  261. {
  262. FILE * fp;
  263. if(file_name == NULL)
  264. {
  265. fp = stdout;
  266. }else
  267. {
  268. fp = fopen(file_name,"w");
  269. }
  270. if(fp == NULL)
  271. {
  272. printf("ERROR: not able to open %s for writing...\n",file_name);
  273. return false;
  274. }
  275. // Print all RW variables
  276. for(
  277. std::vector<ReTwRWItem>::iterator it = rw_items.begin();
  278. it != rw_items.end();
  279. it++)
  280. {
  281. std::string s = (*it).name;
  282. const char * name = s.c_str();
  283. TwType type = (*it).type;
  284. void * var = (*it).var;
  285. fprintf(fp,"%s: %s\n",
  286. name,
  287. get_value_as_string(var,type).c_str());
  288. }
  289. char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];
  290. // Print all CB variables
  291. for(
  292. std::vector<ReTwCBItem>::iterator it = cb_items.begin();
  293. it != cb_items.end();
  294. it++)
  295. {
  296. const char * name = it->name.c_str();
  297. TwType type = it->type;
  298. //TwSetVarCallback setCallback = it->setCallback;
  299. TwGetVarCallback getCallback = it->getCallback;
  300. void * clientData = it->clientData;
  301. // I'm not sure how to do what I want to do. getCallback needs to be sure
  302. // that it can write to var. So var needs to point to a valid and big
  303. // enough chunk of memory
  304. getCallback(var,clientData);
  305. fprintf(fp,"%s: %s\n",
  306. name,
  307. get_value_as_string(var,type).c_str());
  308. }
  309. fprintf(fp,"\n");
  310. if(file_name != NULL)
  311. {
  312. fclose(fp);
  313. }
  314. // everything succeeded
  315. return true;
  316. }
  317. IGL_INLINE std::string igl::anttweakbar::ReTwBar::get_value_as_string(
  318. void * var,
  319. TwType type)
  320. {
  321. std::stringstream sstr;
  322. switch(type)
  323. {
  324. case TW_TYPE_BOOLCPP:
  325. {
  326. sstr << "TW_TYPE_BOOLCPP" << " ";
  327. sstr << *(static_cast<bool*>(var));
  328. break;
  329. }
  330. case TW_TYPE_QUAT4D:
  331. {
  332. sstr << "TW_TYPE_QUAT4D" << " ";
  333. // Q: Why does casting to double* work? shouldn't I have to cast to
  334. // double**?
  335. double * q = static_cast<double*>(var);
  336. sstr << std::setprecision(15) << q[0] << " " << q[1] << " " << q[2] << " " << q[3];
  337. break;
  338. }
  339. case TW_TYPE_QUAT4F:
  340. {
  341. sstr << "TW_TYPE_QUAT4F" << " ";
  342. // Q: Why does casting to float* work? shouldn't I have to cast to
  343. // float**?
  344. float * q = static_cast<float*>(var);
  345. sstr << q[0] << " " << q[1] << " " << q[2] << " " << q[3];
  346. break;
  347. }
  348. case TW_TYPE_COLOR4F:
  349. {
  350. sstr << "TW_TYPE_COLOR4F" << " ";
  351. float * c = static_cast<float*>(var);
  352. sstr << c[0] << " " << c[1] << " " << c[2] << " " << c[3];
  353. break;
  354. }
  355. case TW_TYPE_COLOR3F:
  356. {
  357. sstr << "TW_TYPE_COLOR3F" << " ";
  358. float * c = static_cast<float*>(var);
  359. sstr << c[0] << " " << c[1] << " " << c[2];
  360. break;
  361. }
  362. case TW_TYPE_DIR3D:
  363. {
  364. sstr << "TW_TYPE_DIR3D" << " ";
  365. double * d = static_cast<double*>(var);
  366. sstr << std::setprecision(15) << d[0] << " " << d[1] << " " << d[2];
  367. break;
  368. }
  369. case TW_TYPE_DIR3F:
  370. {
  371. sstr << "TW_TYPE_DIR3F" << " ";
  372. float * d = static_cast<float*>(var);
  373. sstr << d[0] << " " << d[1] << " " << d[2];
  374. break;
  375. }
  376. case TW_TYPE_BOOL32:
  377. {
  378. sstr << "TW_TYPE_BOOL32" << " ";
  379. sstr << *(static_cast<int*>(var));
  380. break;
  381. }
  382. case TW_TYPE_UINT8:
  383. {
  384. sstr << "TW_TYPE_UINT8" << " ";
  385. // Cast to int so that it's human readable
  386. sstr << (int)*(static_cast<unsigned char*>(var));
  387. break;
  388. }
  389. case TW_TYPE_INT32:
  390. {
  391. sstr << "TW_TYPE_INT32" << " ";
  392. sstr << *(static_cast<int*>(var));
  393. break;
  394. }
  395. case TW_TYPE_UINT32:
  396. {
  397. sstr << "TW_TYPE_UINT32" << " ";
  398. sstr << *(static_cast<unsigned int*>(var));
  399. break;
  400. }
  401. case TW_TYPE_FLOAT:
  402. {
  403. sstr << "TW_TYPE_FLOAT" << " ";
  404. sstr << *(static_cast<float*>(var));
  405. break;
  406. }
  407. case TW_TYPE_DOUBLE:
  408. {
  409. sstr << "TW_TYPE_DOUBLE" << " ";
  410. sstr << std::setprecision(15) << *(static_cast<double*>(var));
  411. break;
  412. }
  413. case TW_TYPE_STDSTRING:
  414. {
  415. sstr << "TW_TYPE_STDSTRING" << " ";
  416. std::string *destPtr = static_cast<std::string *>(var);
  417. sstr << destPtr->c_str();
  418. break;
  419. }
  420. default:
  421. {
  422. using namespace std;
  423. std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter =
  424. ReTw_custom_types.find(type);
  425. if(iter != ReTw_custom_types.end())
  426. {
  427. sstr << (*iter).second.first << " ";
  428. int enum_val = *(static_cast<int*>(var));
  429. // try find display name for enum value
  430. std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();
  431. bool found = false;
  432. for(;eit<(*iter).second.second.end();eit++)
  433. {
  434. if(enum_val == eit->Value)
  435. {
  436. sstr << eit->Label;
  437. found = true;
  438. break;
  439. }
  440. }
  441. if(!found)
  442. {
  443. sstr << "ERROR_ENUM_VALUE_NOT_DEFINED";
  444. }
  445. }else
  446. {
  447. sstr << "ERROR_TYPE_NOT_SUPPORTED";
  448. }
  449. break;
  450. }
  451. }
  452. return sstr.str();
  453. }
  454. IGL_INLINE bool igl::anttweakbar::ReTwBar::load(const char *file_name)
  455. {
  456. FILE * fp;
  457. fp = fopen(file_name,"r");
  458. if(fp == NULL)
  459. {
  460. printf("ERROR: not able to open %s for reading...\n",file_name);
  461. return false;
  462. }
  463. // go through file line by line
  464. char line[REANTTWEAKBAR_MAX_LINE];
  465. bool still_comments;
  466. char name[REANTTWEAKBAR_MAX_WORD];
  467. char type_str[REANTTWEAKBAR_MAX_WORD];
  468. char value_str[REANTTWEAKBAR_MAX_WORD];
  469. // line number
  470. int j = 0;
  471. bool finished = false;
  472. while(true)
  473. {
  474. // Eat comments
  475. still_comments = true;
  476. while(still_comments)
  477. {
  478. if(fgets(line,REANTTWEAKBAR_MAX_LINE,fp) == NULL)
  479. {
  480. finished = true;
  481. break;
  482. }
  483. // Blank lines and lines that begin with # are comments
  484. still_comments = (line[0] == '#' || line[0] == '\n');
  485. j++;
  486. }
  487. if(finished)
  488. {
  489. break;
  490. }
  491. sscanf(line,"%[^:]: %s %[^\n]",name,type_str,value_str);
  492. //printf("%s: %s %s\n",name, type_str,value_str);
  493. TwType type;
  494. if(!type_from_string(type_str,type))
  495. {
  496. printf("ERROR: %s type not found... Skipping...\n",type_str);
  497. continue;
  498. }
  499. set_value_from_string(name,type,value_str);
  500. }
  501. fclose(fp);
  502. // everything succeeded
  503. return true;
  504. }
  505. IGL_INLINE bool igl::anttweakbar::ReTwBar::type_from_string(
  506. const char *type_str, TwType & type)
  507. {
  508. // first check default types
  509. for(int j = 0; j < RETW_NUM_DEFAULT_TYPE_STRINGS; j++)
  510. {
  511. if(strcmp(type_str,ReTwDefaultTypeStrings[j].type_str) == 0)
  512. {
  513. type = ReTwDefaultTypeStrings[j].type;
  514. return true;
  515. break;
  516. }
  517. }
  518. // then check custom types
  519. std::map<
  520. TwType,std::pair<const char *,std::vector<TwEnumVal> >
  521. >::const_iterator iter =
  522. ReTw_custom_types.begin();
  523. for(;iter != ReTw_custom_types.end(); iter++)
  524. {
  525. if(strcmp((*iter).second.first,type_str)==0)
  526. {
  527. type = (*iter).first;
  528. return true;
  529. }
  530. }
  531. return false;
  532. }
  533. bool igl::anttweakbar::ReTwBar::set_value_from_string(
  534. const char * name,
  535. TwType type,
  536. const char * value_str)
  537. {
  538. void * value = NULL;
  539. // possible value slots
  540. int i;
  541. float v;
  542. double dv;
  543. float f[4];
  544. double d[4];
  545. bool b;
  546. unsigned int u;
  547. unsigned char uc;
  548. std::string s;
  549. // First try to get value from default types
  550. switch(type)
  551. {
  552. case TW_TYPE_BOOLCPP:
  553. {
  554. int ib;
  555. if(sscanf(value_str," %d",&ib) == 1)
  556. {
  557. b = ib!=0;
  558. value = &b;
  559. }else
  560. {
  561. printf("ERROR: Bad value format...\n");
  562. return false;
  563. }
  564. break;
  565. }
  566. case TW_TYPE_QUAT4D:
  567. //case TW_TYPE_COLOR4D:
  568. {
  569. if(sscanf(value_str," %lf %lf %lf %lf",&d[0],&d[1],&d[2],&d[3]) == 4)
  570. {
  571. value = &d;
  572. }else
  573. {
  574. printf("ERROR: Bad value format...\n");
  575. return false;
  576. }
  577. break;
  578. }
  579. case TW_TYPE_QUAT4F:
  580. case TW_TYPE_COLOR4F:
  581. {
  582. if(sscanf(value_str," %f %f %f %f",&f[0],&f[1],&f[2],&f[3]) == 4)
  583. {
  584. value = &f;
  585. }else
  586. {
  587. printf("ERROR: Bad value format...\n");
  588. return false;
  589. }
  590. break;
  591. }
  592. //case TW_TYPE_COLOR3D:
  593. case TW_TYPE_DIR3D:
  594. {
  595. if(sscanf(value_str," %lf %lf %lf",&d[0],&d[1],&d[2]) == 3)
  596. {
  597. value = &d;
  598. }else
  599. {
  600. printf("ERROR: Bad value format...\n");
  601. return false;
  602. }
  603. break;
  604. }
  605. case TW_TYPE_COLOR3F:
  606. case TW_TYPE_DIR3F:
  607. {
  608. if(sscanf(value_str," %f %f %f",&f[0],&f[1],&f[2]) == 3)
  609. {
  610. value = &f;
  611. }else
  612. {
  613. printf("ERROR: Bad value format...\n");
  614. return false;
  615. }
  616. break;
  617. }
  618. case TW_TYPE_UINT8:
  619. {
  620. if(sscanf(value_str," %d",&i) == 1)
  621. {
  622. // Cast to unsigned char
  623. uc = (unsigned char) i;
  624. value = &uc;
  625. }else
  626. {
  627. printf("ERROR: Bad value format...\n");
  628. return false;
  629. }
  630. break;
  631. }
  632. case TW_TYPE_BOOL32:
  633. case TW_TYPE_INT32:
  634. {
  635. if(sscanf(value_str," %d",&i) == 1)
  636. {
  637. value = &i;
  638. }else
  639. {
  640. printf("ERROR: Bad value format...\n");
  641. return false;
  642. }
  643. break;
  644. }
  645. case TW_TYPE_UINT32:
  646. {
  647. if(sscanf(value_str," %u",&u) == 1)
  648. {
  649. value = &u;
  650. }else
  651. {
  652. printf("ERROR: Bad value format...\n");
  653. return false;
  654. }
  655. break;
  656. }
  657. case TW_TYPE_FLOAT:
  658. {
  659. if(sscanf(value_str," %f",&v) == 1)
  660. {
  661. value = &v;
  662. }else
  663. {
  664. printf("ERROR: Bad value format...\n");
  665. return false;
  666. }
  667. break;
  668. }
  669. case TW_TYPE_DOUBLE:
  670. {
  671. if(sscanf(value_str," %lf",&dv) == 1)
  672. {
  673. value = &dv;
  674. }else
  675. {
  676. printf("ERROR: Bad value format...\n");
  677. return false;
  678. }
  679. break;
  680. }
  681. case TW_TYPE_STDSTRING:
  682. {
  683. s = value_str;
  684. value = &s;
  685. break;
  686. }
  687. default:
  688. // Try to find type in custom enum types
  689. std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::const_iterator iter =
  690. ReTw_custom_types.find(type);
  691. if(iter != ReTw_custom_types.end())
  692. {
  693. std::vector<TwEnumVal>::const_iterator eit = (*iter).second.second.begin();
  694. bool found = false;
  695. for(;eit<(*iter).second.second.end();eit++)
  696. {
  697. if(strcmp(value_str,eit->Label) == 0)
  698. {
  699. i = eit->Value;
  700. value = &i;
  701. found = true;
  702. break;
  703. }
  704. }
  705. if(!found)
  706. {
  707. printf("ERROR_ENUM_VALUE_NOT_DEFINED");
  708. }
  709. }else
  710. {
  711. printf("ERROR_TYPE_NOT_SUPPORTED\n");
  712. }
  713. break;
  714. }
  715. // Find variable based on name
  716. // First look in RW items
  717. bool item_found = false;
  718. for(
  719. std::vector<ReTwRWItem>::iterator it = rw_items.begin();
  720. it != rw_items.end();
  721. it++)
  722. {
  723. if(it->name == name)
  724. {
  725. void * var = it->var;
  726. switch(type)
  727. {
  728. case TW_TYPE_BOOLCPP:
  729. {
  730. bool * bvar = static_cast<bool*>(var);
  731. bool * bvalue = static_cast<bool*>(value);
  732. *bvar = *bvalue;
  733. break;
  734. }
  735. case TW_TYPE_QUAT4D:
  736. //case TW_TYPE_COLOR4D:
  737. {
  738. double * dvar = static_cast<double*>(var);
  739. double * dvalue = static_cast<double*>(value);
  740. dvar[0] = dvalue[0];
  741. dvar[1] = dvalue[1];
  742. dvar[2] = dvalue[2];
  743. dvar[3] = dvalue[3];
  744. break;
  745. }
  746. case TW_TYPE_QUAT4F:
  747. case TW_TYPE_COLOR4F:
  748. {
  749. float * fvar = static_cast<float*>(var);
  750. float * fvalue = static_cast<float*>(value);
  751. fvar[0] = fvalue[0];
  752. fvar[1] = fvalue[1];
  753. fvar[2] = fvalue[2];
  754. fvar[3] = fvalue[3];
  755. break;
  756. }
  757. //case TW_TYPE_COLOR3D:
  758. case TW_TYPE_DIR3D:
  759. {
  760. double * dvar = static_cast<double*>(var);
  761. double * dvalue = static_cast<double*>(value);
  762. dvar[0] = dvalue[0];
  763. dvar[1] = dvalue[1];
  764. dvar[2] = dvalue[2];
  765. break;
  766. }
  767. case TW_TYPE_COLOR3F:
  768. case TW_TYPE_DIR3F:
  769. {
  770. float * fvar = static_cast<float*>(var);
  771. float * fvalue = static_cast<float*>(value);
  772. fvar[0] = fvalue[0];
  773. fvar[1] = fvalue[1];
  774. fvar[2] = fvalue[2];
  775. break;
  776. }
  777. case TW_TYPE_UINT8:
  778. {
  779. unsigned char * ucvar = static_cast<unsigned char*>(var);
  780. unsigned char * ucvalue = static_cast<unsigned char*>(value);
  781. *ucvar = *ucvalue;
  782. break;
  783. }
  784. case TW_TYPE_BOOL32:
  785. case TW_TYPE_INT32:
  786. {
  787. int * ivar = static_cast<int*>(var);
  788. int * ivalue = static_cast<int*>(value);
  789. *ivar = *ivalue;
  790. break;
  791. }
  792. case TW_TYPE_UINT32:
  793. {
  794. unsigned int * uvar = static_cast<unsigned int*>(var);
  795. unsigned int * uvalue = static_cast<unsigned int*>(value);
  796. *uvar = *uvalue;
  797. break;
  798. }
  799. case TW_TYPE_FLOAT:
  800. {
  801. float * fvar = static_cast<float*>(var);
  802. float * fvalue = static_cast<float*>(value);
  803. *fvar = *fvalue;
  804. break;
  805. }
  806. case TW_TYPE_DOUBLE:
  807. {
  808. double * dvar = static_cast<double*>(var);
  809. double * fvalue = static_cast<double*>(value);
  810. *dvar = *fvalue;
  811. break;
  812. }
  813. case TW_TYPE_STDSTRING:
  814. {
  815. std::string * svar = static_cast<std::string*>(var);
  816. std::string * svalue = static_cast<std::string*>(value);
  817. *svar = *svalue;
  818. break;
  819. }
  820. default:
  821. // Try to find type in custom enum types
  822. std::map<TwType,std::pair<const char *,std::vector<TwEnumVal> > >::iterator iter =
  823. ReTw_custom_types.find(type);
  824. if(iter != ReTw_custom_types.end())
  825. {
  826. int * ivar = static_cast<int*>(var);
  827. std::vector<TwEnumVal>::iterator eit = (*iter).second.second.begin();
  828. bool found = false;
  829. for(;eit<(*iter).second.second.end();eit++)
  830. {
  831. if(strcmp(value_str,eit->Label) == 0)
  832. {
  833. *ivar = eit->Value;
  834. found = true;
  835. break;
  836. }
  837. }
  838. if(!found)
  839. {
  840. printf("ERROR_ENUM_VALUE_NOT_DEFINED");
  841. }
  842. }else
  843. {
  844. printf("ERROR_TYPE_NOT_SUPPORTED\n");
  845. }
  846. break;
  847. }
  848. item_found = true;
  849. break;
  850. }
  851. }
  852. // Try looking in CB items
  853. if(!item_found)
  854. {
  855. for(
  856. std::vector<ReTwCBItem>::iterator it = cb_items.begin();
  857. it != cb_items.end();
  858. it++)
  859. {
  860. if(it->name==name)
  861. {
  862. it->setCallback(value,it->clientData);
  863. item_found = true;
  864. break;
  865. }
  866. }
  867. }
  868. if(!item_found)
  869. {
  870. printf("ERROR: item '%s' not found\n",name);
  871. }
  872. return true;
  873. }
  874. IGL_INLINE const std::vector<igl::anttweakbar::ReTwRWItem> &
  875. igl::anttweakbar::ReTwBar::get_rw_items()
  876. {
  877. return rw_items;
  878. }
  879. IGL_INLINE const std::vector<igl::anttweakbar::ReTwCBItem> &
  880. igl::anttweakbar::ReTwBar::get_cb_items()
  881. {
  882. return cb_items;
  883. }