ObjectStreamTextOut.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #include <Jolt/ObjectStream/ObjectStreamTextOut.h>
  6. #include <Jolt/Core/StringTools.h>
  7. JPH_NAMESPACE_BEGIN
  8. ObjectStreamTextOut::ObjectStreamTextOut(ostream &inStream) :
  9. ObjectStreamOut(inStream)
  10. {
  11. WriteWord(StringFormat("TOS%2d.%02d", ObjectStream::sVersion, ObjectStream::sRevision));
  12. }
  13. void ObjectStreamTextOut::WriteDataType(EOSDataType inType)
  14. {
  15. switch (inType)
  16. {
  17. case EOSDataType::Declare: WriteWord("declare "); break;
  18. case EOSDataType::Object: WriteWord("object "); break;
  19. case EOSDataType::Instance: WriteWord("instance "); break;
  20. case EOSDataType::Pointer: WriteWord("pointer "); break;
  21. case EOSDataType::Array: WriteWord("array "); break;
  22. case EOSDataType::T_uint8: WriteWord("uint8"); break;
  23. case EOSDataType::T_uint16: WriteWord("uint16"); break;
  24. case EOSDataType::T_int: WriteWord("int"); break;
  25. case EOSDataType::T_uint32: WriteWord("uint32"); break;
  26. case EOSDataType::T_uint64: WriteWord("uint64"); break;
  27. case EOSDataType::T_float: WriteWord("float"); break;
  28. case EOSDataType::T_double: WriteWord("double"); break;
  29. case EOSDataType::T_bool: WriteWord("bool"); break;
  30. case EOSDataType::T_String: WriteWord("string"); break;
  31. case EOSDataType::T_Float3: WriteWord("float3"); break;
  32. case EOSDataType::T_Double3: WriteWord("double3"); break;
  33. case EOSDataType::T_Vec3: WriteWord("vec3"); break;
  34. case EOSDataType::T_DVec3: WriteWord("dvec3"); break;
  35. case EOSDataType::T_Vec4: WriteWord("vec4"); break;
  36. case EOSDataType::T_Quat: WriteWord("quat"); break;
  37. case EOSDataType::T_Mat44: WriteWord("mat44"); break;
  38. case EOSDataType::T_DMat44: WriteWord("dmat44"); break;
  39. case EOSDataType::Invalid:
  40. default: JPH_ASSERT(false); break;
  41. }
  42. }
  43. void ObjectStreamTextOut::WriteName(const char *inName)
  44. {
  45. WriteWord(String(inName) + " ");
  46. }
  47. void ObjectStreamTextOut::WriteIdentifier(Identifier inIdentifier)
  48. {
  49. WriteWord(StringFormat("%08X", inIdentifier));
  50. }
  51. void ObjectStreamTextOut::WriteCount(uint32 inCount)
  52. {
  53. WriteWord(std::to_string(inCount));
  54. }
  55. void ObjectStreamTextOut::WritePrimitiveData(const uint8 &inPrimitive)
  56. {
  57. WriteWord(std::to_string(inPrimitive));
  58. }
  59. void ObjectStreamTextOut::WritePrimitiveData(const uint16 &inPrimitive)
  60. {
  61. WriteWord(std::to_string(inPrimitive));
  62. }
  63. void ObjectStreamTextOut::WritePrimitiveData(const int &inPrimitive)
  64. {
  65. WriteWord(std::to_string(inPrimitive));
  66. }
  67. void ObjectStreamTextOut::WritePrimitiveData(const uint32 &inPrimitive)
  68. {
  69. WriteWord(std::to_string(inPrimitive));
  70. }
  71. void ObjectStreamTextOut::WritePrimitiveData(const uint64 &inPrimitive)
  72. {
  73. WriteWord(std::to_string(inPrimitive));
  74. }
  75. void ObjectStreamTextOut::WritePrimitiveData(const float &inPrimitive)
  76. {
  77. std::ostringstream stream;
  78. stream.precision(9);
  79. stream << inPrimitive;
  80. WriteWord(stream.str());
  81. }
  82. void ObjectStreamTextOut::WritePrimitiveData(const double &inPrimitive)
  83. {
  84. std::ostringstream stream;
  85. stream.precision(17);
  86. stream << inPrimitive;
  87. WriteWord(stream.str());
  88. }
  89. void ObjectStreamTextOut::WritePrimitiveData(const bool &inPrimitive)
  90. {
  91. WriteWord(inPrimitive? "true" : "false");
  92. }
  93. void ObjectStreamTextOut::WritePrimitiveData(const Float3 &inPrimitive)
  94. {
  95. WritePrimitiveData(inPrimitive.x);
  96. WriteChar(' ');
  97. WritePrimitiveData(inPrimitive.y);
  98. WriteChar(' ');
  99. WritePrimitiveData(inPrimitive.z);
  100. }
  101. void ObjectStreamTextOut::WritePrimitiveData(const Double3 &inPrimitive)
  102. {
  103. WritePrimitiveData(inPrimitive.x);
  104. WriteChar(' ');
  105. WritePrimitiveData(inPrimitive.y);
  106. WriteChar(' ');
  107. WritePrimitiveData(inPrimitive.z);
  108. }
  109. void ObjectStreamTextOut::WritePrimitiveData(const Vec3 &inPrimitive)
  110. {
  111. WritePrimitiveData(inPrimitive.GetX());
  112. WriteChar(' ');
  113. WritePrimitiveData(inPrimitive.GetY());
  114. WriteChar(' ');
  115. WritePrimitiveData(inPrimitive.GetZ());
  116. }
  117. void ObjectStreamTextOut::WritePrimitiveData(const DVec3 &inPrimitive)
  118. {
  119. WritePrimitiveData(inPrimitive.GetX());
  120. WriteChar(' ');
  121. WritePrimitiveData(inPrimitive.GetY());
  122. WriteChar(' ');
  123. WritePrimitiveData(inPrimitive.GetZ());
  124. }
  125. void ObjectStreamTextOut::WritePrimitiveData(const Vec4 &inPrimitive)
  126. {
  127. WritePrimitiveData(inPrimitive.GetX());
  128. WriteChar(' ');
  129. WritePrimitiveData(inPrimitive.GetY());
  130. WriteChar(' ');
  131. WritePrimitiveData(inPrimitive.GetZ());
  132. WriteChar(' ');
  133. WritePrimitiveData(inPrimitive.GetW());
  134. }
  135. void ObjectStreamTextOut::WritePrimitiveData(const Quat &inPrimitive)
  136. {
  137. WritePrimitiveData(inPrimitive.GetX());
  138. WriteChar(' ');
  139. WritePrimitiveData(inPrimitive.GetY());
  140. WriteChar(' ');
  141. WritePrimitiveData(inPrimitive.GetZ());
  142. WriteChar(' ');
  143. WritePrimitiveData(inPrimitive.GetW());
  144. }
  145. void ObjectStreamTextOut::WritePrimitiveData(const Mat44 &inPrimitive)
  146. {
  147. WritePrimitiveData(inPrimitive.GetColumn4(0));
  148. WriteChar(' ');
  149. WritePrimitiveData(inPrimitive.GetColumn4(1));
  150. WriteChar(' ');
  151. WritePrimitiveData(inPrimitive.GetColumn4(2));
  152. WriteChar(' ');
  153. WritePrimitiveData(inPrimitive.GetColumn4(3));
  154. }
  155. void ObjectStreamTextOut::WritePrimitiveData(const DMat44 &inPrimitive)
  156. {
  157. WritePrimitiveData(inPrimitive.GetColumn4(0));
  158. WriteChar(' ');
  159. WritePrimitiveData(inPrimitive.GetColumn4(1));
  160. WriteChar(' ');
  161. WritePrimitiveData(inPrimitive.GetColumn4(2));
  162. WriteChar(' ');
  163. WritePrimitiveData(inPrimitive.GetTranslation());
  164. }
  165. void ObjectStreamTextOut::WritePrimitiveData(const String &inPrimitive)
  166. {
  167. String temporary(inPrimitive);
  168. StringReplace(temporary, "\\", "\\\\");
  169. StringReplace(temporary, "\n", "\\n");
  170. StringReplace(temporary, "\t", "\\t");
  171. StringReplace(temporary, "\"", "\\\"");
  172. WriteWord(String("\"") + temporary + String("\""));
  173. }
  174. void ObjectStreamTextOut::HintNextItem()
  175. {
  176. WriteWord("\r\n");
  177. for (int i = 0; i < mIndentation; ++i)
  178. WriteWord(" ");
  179. }
  180. void ObjectStreamTextOut::HintIndentUp()
  181. {
  182. ++mIndentation;
  183. }
  184. void ObjectStreamTextOut::HintIndentDown()
  185. {
  186. --mIndentation;
  187. }
  188. void ObjectStreamTextOut::WriteChar(char inChar)
  189. {
  190. mStream.put(inChar);
  191. }
  192. void ObjectStreamTextOut::WriteWord(const string_view &inWord)
  193. {
  194. mStream << inWord;
  195. }
  196. JPH_NAMESPACE_END