ReAntTweakBarXMLSerialization.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. #ifndef IGL_XML_REANTTWEAKBAR_XML_SERIALIZATION_H
  9. #define IGL_XML_REANTTWEAKBAR_XML_SERIALIZATION_H
  10. #include "../igl_inline.h"
  11. #include "serialize_xml.h"
  12. #undef IGL_HEADER_ONLY
  13. #include "../anttweakbar/ReAntTweakBar.h"
  14. // Forward declarations
  15. namespace igl
  16. {
  17. namespace anttweakbar
  18. {
  19. class ReTwBar;
  20. }
  21. };
  22. namespace tinyxml2
  23. {
  24. class XMLDocument;
  25. };
  26. namespace igl
  27. {
  28. namespace xml
  29. {
  30. // namespace
  31. // {
  32. // IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char* file_name);
  33. // IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc);
  34. // IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char *file_name);
  35. // IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc);
  36. IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char* file_name)
  37. {
  38. const char * name_chars = TwGetBarName(bar->bar);
  39. std::string name = std::string(name_chars) + "_AntTweakBar";
  40. const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();
  41. for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)
  42. {
  43. std::string val = bar->get_value_as_string(it->var,it->type);
  44. //::igl::XMLSerializer::SaveObject(val,it->name,name,file_name,false);
  45. ::igl::serialize_xml(val,it->name,file_name,false,false);
  46. }
  47. char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];
  48. // Print all CB variables
  49. const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();
  50. for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)
  51. {
  52. TwType type = it->type;
  53. //TwSetVarCallback setCallback = it->setCallback;
  54. TwGetVarCallback getCallback = it->getCallback;
  55. void * clientData = it->clientData;
  56. // I'm not sure how to do what I want to do. getCallback needs to be sure
  57. // that it can write to var. So var needs to point to a valid and big
  58. // enough chunk of memory
  59. getCallback(var,clientData);
  60. std::string val = bar->get_value_as_string(var,type);
  61. //::igl::XMLSerializer::SaveObject(val,it->name,name,file_name,false);
  62. ::igl::serialize_xml(val,it->name,file_name,false,false);
  63. }
  64. return true;
  65. }
  66. /*IGL_INLINE bool save_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc)
  67. {
  68. std::vector<char**> buffer;
  69. const char * name_chars = TwGetBarName(bar->bar);
  70. std::string name = std::string(name_chars) + "_AntTweakBar";
  71. ::igl::XMLSerializer* s = new ::igl::XMLSerializer(name);
  72. const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();
  73. for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)
  74. {
  75. std::string val = bar->get_value_as_string(it->var,it->type);
  76. char** cval = new char*; // create char* on heap
  77. *cval = new char[val.size()+1];
  78. buffer.push_back(cval);
  79. strcpy(*cval,val.c_str());
  80. s->Add(*cval,it->name);
  81. }
  82. char var[REANTTWEAKBAR_MAX_CB_VAR_SIZE];
  83. // Print all CB variables
  84. const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();
  85. for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)
  86. {
  87. TwType type = it->type;
  88. //TwSetVarCallback setCallback = it->setCallback;
  89. TwGetVarCallback getCallback = it->getCallback;
  90. void * clientData = it->clientData;
  91. // I'm not sure how to do what I want to do. getCallback needs to be sure
  92. // that it can write to var. So var needs to point to a valid and big
  93. // enough chunk of memory
  94. getCallback(var,clientData);
  95. std::string val = bar->get_value_as_string(var,type);
  96. char** cval = new char*; // create char* on heap
  97. *cval = new char[val.size()+1];
  98. buffer.push_back(cval);
  99. strcpy(*cval,val.c_str());
  100. s->Add(*cval,it->name);
  101. }
  102. s->SaveToXMLDoc(name,doc);
  103. // delete pointer buffers
  104. for(unsigned int i=0;i<buffer.size();i++)
  105. {
  106. delete[] *buffer[i];
  107. delete buffer[i];
  108. }
  109. delete s;
  110. return true;
  111. }*/
  112. IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, const char *file_name)
  113. {
  114. char type_str[REANTTWEAKBAR_MAX_WORD];
  115. char value_str[REANTTWEAKBAR_MAX_WORD];
  116. TwType type;
  117. const char * name_chars = TwGetBarName(bar->bar);
  118. std::string name = std::string(name_chars) + "_AntTweakBar";
  119. const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();
  120. for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)
  121. {
  122. char* val;
  123. //::igl::XMLSerializer::LoadObject(val,it->name,name,file_name);
  124. ::igl::deserialize_xml(val,it->name,file_name);
  125. sscanf(val,"%s %[^\n]",type_str,value_str);
  126. if(!bar->type_from_string(type_str,type))
  127. {
  128. printf("ERROR: %s type not found... Skipping...\n",type_str);
  129. continue;
  130. }
  131. bar->set_value_from_string(it->name.c_str(),type,value_str);
  132. delete[] val;
  133. }
  134. const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();
  135. for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)
  136. {
  137. char* val;
  138. //::igl::XMLSerializer::LoadObject(val,it->name,name,file_name);
  139. ::igl::deserialize_xml(val,it->name,file_name);
  140. sscanf(val,"%s %[^\n]",type_str,value_str);
  141. if(!bar->type_from_string(type_str,type))
  142. {
  143. printf("ERROR: %s type not found... Skipping...\n",type_str);
  144. continue;
  145. }
  146. bar->set_value_from_string(it->name.c_str(),type,value_str);
  147. delete[] val;
  148. }
  149. return true;
  150. }
  151. /*IGL_INLINE bool load_ReAntTweakBar(::igl::anttweakbar::ReTwBar* bar, tinyxml2::XMLDocument* doc)
  152. {
  153. std::map<std::string,char*> variables;
  154. std::map<std::string,char*> cbVariables;
  155. const char * name_chars = TwGetBarName(bar->bar);
  156. std::string name = std::string(name_chars) + "_AntTweakBar";
  157. ::igl::XMLSerializer* s = new ::igl::XMLSerializer(name);
  158. std::map<std::string,char*>::iterator iter;
  159. const std::vector< ::igl::anttweakbar::ReTwRWItem>& rw_items = bar->get_rw_items();
  160. for(std::vector< ::igl::anttweakbar::ReTwRWItem>::const_iterator it = rw_items.begin(); it != rw_items.end(); it++)
  161. {
  162. variables[it->name] = NULL;
  163. iter = variables.find(it->name);
  164. s->Add(iter->second,iter->first);
  165. }
  166. // Add all CB variables
  167. const std::vector< ::igl::anttweakbar::ReTwCBItem>& cb_items = bar->get_cb_items();
  168. for(std::vector< ::igl::anttweakbar::ReTwCBItem>::const_iterator it = cb_items.begin(); it != cb_items.end(); it++)
  169. {
  170. cbVariables[it->name] = NULL;
  171. iter = cbVariables.find(it->name);
  172. s->Add(iter->second,iter->first);
  173. }
  174. s->LoadFromXMLDoc(doc);
  175. // Set loaded values
  176. char type_str[REANTTWEAKBAR_MAX_WORD];
  177. char value_str[REANTTWEAKBAR_MAX_WORD];
  178. TwType type;
  179. for(iter = variables.begin(); iter != variables.end(); iter++)
  180. {
  181. if(iter->second == NULL)
  182. {
  183. printf("ERROR: '%s' entry not found... Skipping...\n",iter->first.c_str());
  184. continue;
  185. }
  186. sscanf(iter->second,"%s %[^\n]",type_str,value_str);
  187. if(!bar->type_from_string(type_str,type))
  188. {
  189. printf("ERROR: Type '%s' of '%s' not found... Skipping...\n",type_str,iter->first.c_str());
  190. continue;
  191. }
  192. bar->set_value_from_string(iter->first.c_str(),type,value_str);
  193. }
  194. for(iter = cbVariables.begin(); iter != cbVariables.end(); iter++)
  195. {
  196. if(iter->second == NULL)
  197. {
  198. printf("ERROR: '%s' entry not found... Skipping...\n",iter->first.c_str());
  199. continue;
  200. }
  201. sscanf(iter->second,"%s %[^\n]",type_str,value_str);
  202. if(!bar->type_from_string(type_str,type))
  203. {
  204. printf("ERROR: Type '%s' of '%s' not found... Skipping...\n",type_str,iter->first.c_str());
  205. continue;
  206. }
  207. bar->set_value_from_string(iter->first.c_str(),type,value_str);
  208. }
  209. // delete buffers
  210. for(iter = variables.begin(); iter != variables.end(); iter++)
  211. delete[] iter->second;
  212. for(iter = cbVariables.begin(); iter != cbVariables.end(); iter++)
  213. delete[] iter->second;
  214. delete s;
  215. return true;
  216. }*/
  217. // }
  218. }
  219. }
  220. #endif