ObjectStreamBinaryIn.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/ObjectStream/ObjectStreamBinaryIn.h>
  5. JPH_NAMESPACE_BEGIN
  6. ObjectStreamBinaryIn::ObjectStreamBinaryIn(istream &inStream) :
  7. ObjectStreamIn(inStream)
  8. {
  9. }
  10. bool ObjectStreamBinaryIn::ReadDataType(EOSDataType &outType)
  11. {
  12. uint32 type;
  13. mStream.read((char *)&type, sizeof(type));
  14. if (mStream.fail()) return false;
  15. outType = (EOSDataType)type;
  16. return true;
  17. }
  18. bool ObjectStreamBinaryIn::ReadName(String &outName)
  19. {
  20. return ReadPrimitiveData(outName);
  21. }
  22. bool ObjectStreamBinaryIn::ReadIdentifier(Identifier &outIdentifier)
  23. {
  24. Identifier id;
  25. mStream.read((char *)&id, sizeof(id));
  26. if (mStream.fail()) return false;
  27. outIdentifier = id;
  28. return true;
  29. }
  30. bool ObjectStreamBinaryIn::ReadCount(uint32 &outCount)
  31. {
  32. uint32 count;
  33. mStream.read((char *)&count, sizeof(count));
  34. if (mStream.fail()) return false;
  35. outCount = count;
  36. return true;
  37. }
  38. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint8 &outPrimitive)
  39. {
  40. uint8 primitive;
  41. mStream.read((char *)&primitive, sizeof(primitive));
  42. if (mStream.fail()) return false;
  43. outPrimitive = primitive;
  44. return true;
  45. }
  46. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint16 &outPrimitive)
  47. {
  48. uint16 primitive;
  49. mStream.read((char *)&primitive, sizeof(primitive));
  50. if (mStream.fail()) return false;
  51. outPrimitive = primitive;
  52. return true;
  53. }
  54. bool ObjectStreamBinaryIn::ReadPrimitiveData(int &outPrimitive)
  55. {
  56. int primitive;
  57. mStream.read((char *)&primitive, sizeof(primitive));
  58. if (mStream.fail()) return false;
  59. outPrimitive = primitive;
  60. return true;
  61. }
  62. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint32 &outPrimitive)
  63. {
  64. uint32 primitive;
  65. mStream.read((char *)&primitive, sizeof(primitive));
  66. if (mStream.fail()) return false;
  67. outPrimitive = primitive;
  68. return true;
  69. }
  70. bool ObjectStreamBinaryIn::ReadPrimitiveData(uint64 &outPrimitive)
  71. {
  72. uint64 primitive;
  73. mStream.read((char *)&primitive, sizeof(primitive));
  74. if (mStream.fail()) return false;
  75. outPrimitive = primitive;
  76. return true;
  77. }
  78. bool ObjectStreamBinaryIn::ReadPrimitiveData(float &outPrimitive)
  79. {
  80. float primitive;
  81. mStream.read((char *)&primitive, sizeof(primitive));
  82. if (mStream.fail()) return false;
  83. outPrimitive = primitive;
  84. return true;
  85. }
  86. bool ObjectStreamBinaryIn::ReadPrimitiveData(bool &outPrimitive)
  87. {
  88. bool primitive;
  89. mStream.read((char *)&primitive, sizeof(primitive));
  90. if (mStream.fail()) return false;
  91. outPrimitive = primitive;
  92. return true;
  93. }
  94. bool ObjectStreamBinaryIn::ReadPrimitiveData(String &outPrimitive)
  95. {
  96. // Read length or ID of string
  97. uint32 len;
  98. if (!ReadPrimitiveData(len))
  99. return false;
  100. // Check empty string
  101. if (len == 0)
  102. {
  103. outPrimitive.clear();
  104. return true;
  105. }
  106. // Check if it is an ID in the string table
  107. if (len & 0x80000000)
  108. {
  109. StringTable::iterator i = mStringTable.find(len);
  110. if (i == mStringTable.end())
  111. return false;
  112. outPrimitive = i->second;
  113. return true;
  114. }
  115. // Read the string
  116. char *data = (char *)JPH_STACK_ALLOC(len + 1);
  117. mStream.read(data, len);
  118. if (mStream.fail()) return false;
  119. data[len] = 0;
  120. outPrimitive = data;
  121. // Insert string in table
  122. mStringTable.try_emplace(mNextStringID, outPrimitive);
  123. mNextStringID++;
  124. return true;
  125. }
  126. bool ObjectStreamBinaryIn::ReadPrimitiveData(Float3 &outPrimitive)
  127. {
  128. Float3 primitive;
  129. mStream.read((char *)&primitive, sizeof(Float3));
  130. if (mStream.fail()) return false;
  131. outPrimitive = primitive;
  132. return true;
  133. }
  134. bool ObjectStreamBinaryIn::ReadPrimitiveData(Vec3 &outPrimitive)
  135. {
  136. Float3 primitive;
  137. mStream.read((char *)&primitive, sizeof(Float3));
  138. if (mStream.fail()) return false;
  139. outPrimitive = Vec3(primitive); // Use Float3 constructor so that we initialize W too
  140. return true;
  141. }
  142. bool ObjectStreamBinaryIn::ReadPrimitiveData(Vec4 &outPrimitive)
  143. {
  144. Vec4 primitive;
  145. mStream.read((char *)&primitive, sizeof(primitive));
  146. if (mStream.fail()) return false;
  147. outPrimitive = primitive;
  148. return true;
  149. }
  150. bool ObjectStreamBinaryIn::ReadPrimitiveData(Quat &outPrimitive)
  151. {
  152. Quat primitive;
  153. mStream.read((char *)&primitive, sizeof(primitive));
  154. if (mStream.fail()) return false;
  155. outPrimitive = primitive;
  156. return true;
  157. }
  158. bool ObjectStreamBinaryIn::ReadPrimitiveData(Mat44 &outPrimitive)
  159. {
  160. Mat44 primitive;
  161. mStream.read((char *)&primitive, sizeof(primitive));
  162. if (mStream.fail()) return false;
  163. outPrimitive = primitive;
  164. return true;
  165. }
  166. JPH_NAMESPACE_END