XmlScreenFile.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. #include "core/Logger.h"
  2. #include "core/ScriptManager.h"
  3. #include "core/UiManager.h"
  4. #include "core/UiSprite.h"
  5. #include "core/UiTextArea.h"
  6. #include "core/UiWidget.h"
  7. #include "core/XmlScreenFile.h"
  8. XmlScreenFile::XmlScreenFile(const Ogre::String& file):
  9. XmlFile(file)
  10. {
  11. }
  12. XmlScreenFile::~XmlScreenFile()
  13. {
  14. }
  15. void
  16. XmlScreenFile::LoadScreen()
  17. {
  18. TiXmlNode* node = m_File.RootElement();
  19. if(node == nullptr || node->ValueStr() != "screen")
  20. {
  21. LOG_ERROR(m_File.ValueStr() + " is not a valid screen file! No <screen> in root.");
  22. return;
  23. }
  24. Ogre::String base_name = GetString(node, "name");
  25. Ogre::String script = GetString(node, "script");
  26. if(script != "")
  27. {
  28. ScriptManager::getSingleton().RunFile(script);
  29. }
  30. UiWidget* widget = new UiWidget(base_name);
  31. widget->SetVisible(GetBool(node, "visible", false));
  32. node = node->FirstChild();
  33. if(node != nullptr)
  34. {
  35. LoadScreenRecursive(node, base_name, widget);
  36. }
  37. UiManager::getSingleton().AddWidget(widget);
  38. }
  39. void
  40. XmlScreenFile::LoadScreenRecursive(TiXmlNode* node, const Ogre::String& base_name, UiWidget* widget)
  41. {
  42. while(node != nullptr)
  43. {
  44. // parse widgets
  45. if(node->Type() == TiXmlNode::TINYXML_ELEMENT && (node->ValueStr() == "widget" || node->ValueStr() == "sprite" || node->ValueStr() == "text_area" || node->ValueStr() == "prototype"))
  46. {
  47. if(node->ValueStr() == "prototype")
  48. {
  49. Ogre::String name = GetString(node, "name");
  50. if(name != "")
  51. {
  52. TiXmlNode* node2 = UiManager::getSingleton().GetPrototype(name);
  53. if(node != nullptr)
  54. {
  55. node2 = node2->FirstChild();
  56. if(node2 != nullptr)
  57. {
  58. LoadScreenRecursive(node2, base_name, widget);
  59. }
  60. }
  61. }
  62. }
  63. else
  64. {
  65. Ogre::String name = GetString(node, "name");
  66. if(name != "")
  67. {
  68. UiWidget* widget2;
  69. if(node->ValueStr() == "sprite")
  70. {
  71. widget2 = new UiSprite(name, base_name + "." + name, widget);
  72. }
  73. else if(node->ValueStr() == "text_area")
  74. {
  75. widget2 = new UiTextArea(name, base_name + "." + name, widget);
  76. }
  77. else
  78. {
  79. widget2 = new UiWidget(name, base_name + "." + name, widget);
  80. }
  81. if(node->ValueStr() == "sprite")
  82. {
  83. Ogre::String image = GetString(node, "image");
  84. if(image != "")
  85. {
  86. ((UiSprite*)widget2)->SetImage(image);
  87. }
  88. Ogre::String vertex_shader = GetString(node, "vertex_shader");
  89. if(vertex_shader != "")
  90. {
  91. ((UiSprite*)widget2)->SetVertexShader(vertex_shader);
  92. }
  93. Ogre::String fragment_shader = GetString(node, "fragment_shader");
  94. if(fragment_shader != "")
  95. {
  96. ((UiSprite*)widget2)->SetFragmentShader(fragment_shader);
  97. }
  98. }
  99. if(node->ValueStr() == "text_area")
  100. {
  101. Ogre::String text = GetString(node, "text_name", "");
  102. if(text != "")
  103. {
  104. TiXmlNode* utf = UiManager::getSingleton().GetText(text);
  105. ((UiTextArea*)widget2)->SetText(utf);
  106. }
  107. Ogre::String font = GetString(node, "font", "");
  108. if(font != "")
  109. {
  110. ((UiTextArea*)widget2)->SetFont(font);
  111. }
  112. Ogre::String align = GetString(node, "text_align", "");
  113. if(align != "")
  114. {
  115. ((UiTextArea*)widget2)->SetTextAlign((align == "center") ? UiTextArea::CENTER : ((align == "right") ? UiTextArea::RIGHT : UiTextArea::LEFT));
  116. }
  117. }
  118. Ogre::String colours = GetString(node, "colours", "");
  119. if(colours != "")
  120. {
  121. Ogre::StringVector colour_string = Ogre::StringUtil::split(colours, ",");
  122. Ogre::Vector3 colour[4];
  123. for(unsigned int i = 0; i < 4; ++i)
  124. {
  125. Ogre::StringUtil::trim(colour_string[i]);
  126. colour[i] = (i < colour_string.size()) ? Ogre::StringConverter::parseVector3(colour_string[i]) : Ogre::Vector3(1, 1, 1);
  127. }
  128. widget2->SetColours(colour[0].x, colour[0].y, colour[0].z, colour[1].x, colour[1].y, colour[1].z, colour[2].x, colour[2].y, colour[2].z, colour[3].x, colour[3].y, colour[3].z);
  129. }
  130. else
  131. {
  132. Ogre::Vector3 colour = GetVector3(node, "colour", Ogre::Vector3(1, 1, 1));
  133. widget2->SetColour(colour.x, colour.y, colour.z);
  134. }
  135. float alpha = GetFloat(node, "alpha", 1);
  136. widget2->SetAlpha(alpha);
  137. Ogre::String align = GetString(node, "align");
  138. if(align != "")
  139. {
  140. widget2->SetAlign((align == "center") ? UiWidget::CENTER : ((align == "right") ? UiWidget::RIGHT : UiWidget::LEFT));
  141. }
  142. Ogre::String valign = GetString(node, "valign");
  143. if(valign != "")
  144. {
  145. widget2->SetVerticalAlign((valign == "middle") ? UiWidget::MIDDLE : ((valign == "bottom") ? UiWidget::BOTTOM : UiWidget::TOP));
  146. }
  147. Ogre::String origin_x_str = GetString(node, "origin_x");
  148. if(origin_x_str != "")
  149. {
  150. float x_percent = 0;
  151. float x = 0;
  152. ParsePersent(x_percent, x, origin_x_str);
  153. widget2->SetOriginX(x_percent, x);
  154. }
  155. Ogre::String origin_y_str = GetString(node, "origin_y");
  156. if(origin_y_str != "")
  157. {
  158. float y_percent = 0;
  159. float y = 0;
  160. ParsePersent(y_percent, y, origin_y_str);
  161. widget2->SetOriginY(y_percent, y);
  162. }
  163. Ogre::String x_str = GetString(node, "x");
  164. if(x_str != "")
  165. {
  166. float x_percent = 0;
  167. float x = 0;
  168. ParsePersent(x_percent, x, x_str);
  169. widget2->SetX(x_percent, x);
  170. }
  171. Ogre::String y_str = GetString(node, "y");
  172. if(y_str != "")
  173. {
  174. float y_percent = 0;
  175. float y = 0;
  176. ParsePersent(y_percent, y, y_str);
  177. widget2->SetY(y_percent, y);
  178. }
  179. Ogre::String width_str = GetString(node, "width");
  180. if(width_str != "")
  181. {
  182. float width_percent = 0;
  183. float width = 0;
  184. ParsePersent(width_percent, width, width_str);
  185. widget2->SetWidth(width_percent, width);
  186. }
  187. Ogre::String height_str = GetString(node, "height");
  188. if(height_str != "")
  189. {
  190. float height_percent = 0;
  191. float height = 0;
  192. ParsePersent(height_percent, height, height_str);
  193. widget2->SetHeight(height_percent, height);
  194. }
  195. Ogre::Vector2 scale = GetVector2(node, "scale", Ogre::Vector2(1.0f, 1.0f));
  196. widget2->SetScale(scale);
  197. widget2->SetRotation(GetFloat(node, "rotation", 0.0f));
  198. widget2->SetScissor(GetBool(node, "scissor", false));
  199. widget2->SetVisible(GetBool(node, "visible", false));
  200. if(node->ValueStr() == "sprite")
  201. {
  202. ((UiSprite*)widget2)->UpdateGeometry();
  203. }
  204. else if(node->ValueStr() == "text_area")
  205. {
  206. ((UiTextArea*)widget2)->UpdateGeometry();
  207. }
  208. widget->AddChild(widget2);
  209. TiXmlNode* node2 = node->FirstChild();
  210. if(node2 != nullptr)
  211. {
  212. LoadScreenRecursive(node2, base_name + "." + name, widget2);
  213. }
  214. }
  215. else
  216. {
  217. LOG_ERROR("There is no name in entity with base name " + base_name);
  218. }
  219. }
  220. }
  221. // parse animation data for widget
  222. else if(node->Type() == TiXmlNode::TINYXML_ELEMENT && node->ValueStr() == "animation")
  223. {
  224. Ogre::String name = GetString(node, "name", "");
  225. if(name != "")
  226. {
  227. UiAnimation* animation = new UiAnimation(name, widget);
  228. animation->SetLength(GetFloat(node, "length", 0));
  229. Ogre::String scale = GetString(node, "scale", "");
  230. if(scale != "")
  231. {
  232. Ogre::StringVector key_frame = Ogre::StringUtil::split(scale, ",");
  233. for(unsigned int i = 0; i < key_frame.size(); ++i)
  234. {
  235. Ogre::StringUtil::trim(key_frame[i]);
  236. Ogre::StringVector data = Ogre::StringUtil::split(key_frame[i], ":");
  237. if(data.size() > 1)
  238. {
  239. UiKeyFrameVector2 key;
  240. key.time = Ogre::StringConverter::parseReal(data[0]);
  241. key.value = Ogre::StringConverter::parseVector2(data[1]);
  242. animation->AddScaleKeyFrame(key);
  243. }
  244. }
  245. }
  246. Ogre::String x = GetString(node, "x", "");
  247. if(x != "")
  248. {
  249. Ogre::StringVector key_frame = Ogre::StringUtil::split(x, ",");
  250. for(unsigned int i = 0; i < key_frame.size(); ++i)
  251. {
  252. Ogre::StringUtil::trim(key_frame[i]);
  253. Ogre::StringVector data = Ogre::StringUtil::split(key_frame[i], ":");
  254. if(data.size() > 1)
  255. {
  256. UiKeyFrameVector2 key;
  257. key.time = Ogre::StringConverter::parseReal(data[0]);
  258. key.value = Ogre::StringConverter::parseVector2(data[1]);
  259. animation->AddXKeyFrame(key);
  260. }
  261. }
  262. }
  263. Ogre::String y = GetString(node, "y", "");
  264. if(y != "")
  265. {
  266. Ogre::StringVector key_frame = Ogre::StringUtil::split(y, ",");
  267. for(unsigned int i = 0; i < key_frame.size(); ++i)
  268. {
  269. Ogre::StringUtil::trim(key_frame[i]);
  270. Ogre::StringVector data = Ogre::StringUtil::split(key_frame[i], ":");
  271. if(data.size() > 1)
  272. {
  273. UiKeyFrameVector2 key;
  274. key.time = Ogre::StringConverter::parseReal(data[0]);
  275. key.value = Ogre::StringConverter::parseVector2(data[1]);
  276. animation->AddYKeyFrame(key);
  277. }
  278. }
  279. }
  280. Ogre::String rotation = GetString(node, "rotation", "");
  281. if(rotation != "")
  282. {
  283. Ogre::StringVector key_frame = Ogre::StringUtil::split(rotation, ",");
  284. for(unsigned int i = 0; i < key_frame.size(); ++i)
  285. {
  286. Ogre::StringUtil::trim(key_frame[i]);
  287. Ogre::StringVector data = Ogre::StringUtil::split(key_frame[i], ":");
  288. if(data.size() > 1)
  289. {
  290. UiKeyFrameFloat key;
  291. key.time = Ogre::StringConverter::parseReal(data[0]);
  292. key.value = Ogre::StringConverter::parseReal(data[1]);
  293. animation->AddRotationKeyFrame(key);
  294. }
  295. }
  296. }
  297. Ogre::String alpha = GetString(node, "alpha", "");
  298. if(alpha != "")
  299. {
  300. Ogre::StringVector key_frame = Ogre::StringUtil::split(alpha, ",");
  301. for(unsigned int i = 0; i < key_frame.size(); ++i)
  302. {
  303. Ogre::StringUtil::trim(key_frame[i]);
  304. Ogre::StringVector data = Ogre::StringUtil::split(key_frame[i], ":");
  305. if(data.size() > 1)
  306. {
  307. UiKeyFrameFloat key;
  308. key.time = Ogre::StringConverter::parseReal(data[0]);
  309. key.value = Ogre::StringConverter::parseReal(data[1]);
  310. animation->AddAlphaKeyFrame(key);
  311. }
  312. }
  313. }
  314. widget->AddAnimation(animation);
  315. }
  316. }
  317. node = node->NextSibling();
  318. }
  319. }
  320. void
  321. XmlScreenFile::ParsePersent(float& value_percent, float& value, const Ogre::String& string)
  322. {
  323. if(string.at(string.size() - 1) == '%')
  324. {
  325. value_percent = Ogre::StringConverter::parseReal(string.substr(0, string.size() - 1));
  326. value = 0;
  327. }
  328. else
  329. {
  330. Ogre::StringVector param = Ogre::StringUtil::split(string, "%");
  331. if(param.size() > 1)
  332. {
  333. value_percent = Ogre::StringConverter::parseReal(param[0]);
  334. value = Ogre::StringConverter::parseReal(param[1]);
  335. }
  336. else
  337. {
  338. value_percent = 0;
  339. value = Ogre::StringConverter::parseReal(string);
  340. }
  341. }
  342. }