DataUV.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "DataUV.h"
  2. #include "..\..\icommon\memfile.h"
  3. #include "..\..\..\common_h\core.h"
  4. #include "fieldlist.h"
  5. #include "..\..\TextFile.h"
  6. #ifndef _XBOX
  7. #include "..\..\..\common_h\tinyxml\tinyxml.h"
  8. #endif
  9. #include "..\..\..\Common_h\data_swizzle.h"
  10. //конструктор/деструктор
  11. DataUV::DataUV (FieldList* pMaster) : Frames (_FL_, 1)
  12. {
  13. szName = NULL;
  14. szEditorName = NULL;
  15. Master = pMaster;
  16. }
  17. DataUV::~DataUV ()
  18. {
  19. }
  20. //Получить значение [ x,y = UV1; z,w = UV2 ]
  21. const Vector4 &DataUV::GetValue (DWORD FrameNum)
  22. {
  23. DWORD TotalFrames = Frames.Size();
  24. FrameNum = FrameNum % TotalFrames;
  25. return Frames[FrameNum];
  26. }
  27. //Установить значения
  28. void DataUV::SetValues (const Vector4* _Frames, DWORD FramesCount)
  29. {
  30. Frames.DelAll();
  31. for (DWORD n = 0; n < FramesCount; n++)
  32. {
  33. Frames.Add(_Frames[n]);
  34. }
  35. if (Master) Master->UpdateCache();
  36. }
  37. //Получить кол-во кадров
  38. DWORD DataUV::GetFrameCount ()
  39. {
  40. return Frames.Size();
  41. }
  42. void DataUV::Load (MemFile* File)
  43. {
  44. dword ElementCount = 0;
  45. File->ReadType(ElementCount);
  46. XSwizzleDWord(ElementCount);
  47. for (DWORD n = 0; n < ElementCount; n++)
  48. {
  49. Vector4 rFrame;
  50. File->ReadType(rFrame.x);
  51. File->ReadType(rFrame.y);
  52. File->ReadType(rFrame.z);
  53. File->ReadType(rFrame.w);
  54. XSwizzleFloat(rFrame.x);
  55. XSwizzleFloat(rFrame.y);
  56. XSwizzleFloat(rFrame.z);
  57. XSwizzleFloat(rFrame.w);
  58. Vector4 newFrame;
  59. newFrame = rFrame;
  60. newFrame.z += newFrame.x;
  61. newFrame.w += newFrame.y;
  62. Frames.Add(newFrame);
  63. }
  64. //static char AttribueName[128];
  65. dword NameLength = 0;
  66. File->ReadType(NameLength);
  67. XSwizzleDWord(NameLength);
  68. Assert (NameLength < 128);
  69. //File->Read(AttribueName, NameLength);
  70. const char* AttribueName = File->GetPointerToString(NameLength);
  71. SetName (AttribueName, "a");
  72. if (Master) Master->UpdateCache();
  73. }
  74. void DataUV::SetName (const char* szName, const char* szEditorName)
  75. {
  76. //api->Trace("DataUV::SetName - '%s'", szName);
  77. this->szName = szName;
  78. this->szEditorName = szEditorName;
  79. }
  80. const char* DataUV::GetName ()
  81. {
  82. return szName;
  83. }
  84. void DataUV::Write (MemFile* File)
  85. {
  86. DWORD ElementCount = GetFrameCount();
  87. File->WriteType(ElementCount);
  88. for (DWORD n = 0; n < ElementCount; n++)
  89. {
  90. float w = Frames[n].z-Frames[n].x;
  91. float h = Frames[n].w-Frames[n].y;
  92. File->WriteType(Frames[n].x);
  93. File->WriteType(Frames[n].y);
  94. File->WriteType(w);
  95. File->WriteType(h);
  96. }
  97. //save name
  98. DWORD NameLength = crt_strlen(szName);
  99. DWORD NameLengthPlusZero = NameLength+1;
  100. File->WriteType(NameLengthPlusZero);
  101. Assert (NameLength < 128);
  102. File->Write(szName, NameLength);
  103. File->WriteZeroByte();
  104. }
  105. const char* DataUV::GetEditorName ()
  106. {
  107. return szEditorName;
  108. }
  109. #ifndef _XBOX
  110. void DataUV::WriteXML (TextFile* xmlFile, dword level)
  111. {
  112. xmlFile->Write((level+1), "<Name val = \"%s\" />\n", szName);
  113. xmlFile->Write((level+1), "<Frames>\n");
  114. DWORD ElementCount = GetFrameCount();
  115. for (dword n = 0; n < ElementCount; n++)
  116. {
  117. xmlFile->Write((level+1), "<Frame>\n");
  118. float w = Frames[n].z-Frames[n].x;
  119. float h = Frames[n].w-Frames[n].y;
  120. xmlFile->Write((level+2), "<x val = \"%f\" />\n", Frames[n].x);
  121. xmlFile->Write((level+2), "<y val = \"%f\" />\n", Frames[n].y);
  122. xmlFile->Write((level+2), "<w val = \"%f\" />\n", w);
  123. xmlFile->Write((level+2), "<h val = \"%f\" />\n", h);
  124. xmlFile->Write((level+1), "</Frame>\n");
  125. }
  126. xmlFile->Write((level+1), "</Frames>\n");
  127. }
  128. void DataUV::LoadXML (TiXmlElement* root)
  129. {
  130. TiXmlElement* name = root->FirstChildElement("Name");
  131. if (name)
  132. {
  133. SetName (name->Attribute("val"), "a");
  134. }
  135. TiXmlElement* framesNode = NULL;
  136. framesNode = root->FirstChildElement("Frames");
  137. if (framesNode)
  138. {
  139. for(TiXmlElement* child = framesNode->FirstChildElement(); child; child = child->NextSiblingElement())
  140. {
  141. string NodeName = child->Value();
  142. if (NodeName == "Frame")
  143. {
  144. Vector4 newFrame;
  145. TiXmlElement* val_x = child->FirstChildElement("x");
  146. TiXmlElement* val_y = child->FirstChildElement("y");
  147. TiXmlElement* val_w = child->FirstChildElement("w");
  148. TiXmlElement* val_h = child->FirstChildElement("h");
  149. if (val_x)
  150. {
  151. newFrame.x = (float)atof (val_x->Attribute("val"));
  152. }
  153. if (val_y)
  154. {
  155. newFrame.y = (float)atof (val_y->Attribute("val"));
  156. }
  157. if (val_w)
  158. {
  159. newFrame.z = (float)atof (val_w->Attribute("val"));
  160. }
  161. if (val_h)
  162. {
  163. newFrame.w = (float)atof (val_h->Attribute("val"));
  164. }
  165. newFrame.z += newFrame.x;
  166. newFrame.w += newFrame.y;
  167. Frames.Add(newFrame);
  168. }
  169. }
  170. }
  171. if (Master) Master->UpdateCache();
  172. }
  173. #endif