BsSerializedObjectRTTI.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #pragma once
  2. #include "BsPrerequisitesUtil.h"
  3. #include "BsRTTIType.h"
  4. #include "BsSerializedObject.h"
  5. namespace BansheeEngine
  6. {
  7. /** @cond RTTI */
  8. /** @addtogroup RTTI-Impl-Utility
  9. * @{
  10. */
  11. class BS_UTILITY_EXPORT SerializedInstanceRTTI : public RTTIType <SerializedInstance, IReflectable, SerializedInstanceRTTI>
  12. {
  13. public:
  14. SerializedInstanceRTTI()
  15. { }
  16. virtual const String& getRTTIName() override
  17. {
  18. static String name = "SerializedInstance";
  19. return name;
  20. }
  21. virtual UINT32 getRTTIId() override
  22. {
  23. return TID_SerializedInstance;
  24. }
  25. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  26. {
  27. return nullptr;
  28. }
  29. };
  30. class BS_UTILITY_EXPORT SerializedFieldRTTI : public RTTIType <SerializedField, SerializedInstance, SerializedFieldRTTI>
  31. {
  32. private:
  33. ManagedDataBlock getData(SerializedField* obj)
  34. {
  35. ManagedDataBlock dataBlock((UINT8*)obj->value, obj->size);
  36. return dataBlock;
  37. }
  38. void setData(SerializedField* obj, ManagedDataBlock val)
  39. {
  40. // Nothing to do here, the pointer we provided already belongs to SerializedField
  41. // so the data is already written
  42. }
  43. static UINT8* allocateData(SerializedField* obj, UINT32 numBytes)
  44. {
  45. obj->value = (UINT8*)bs_alloc(numBytes);
  46. obj->size = numBytes;
  47. obj->ownsMemory = true;
  48. return obj->value;
  49. }
  50. public:
  51. SerializedFieldRTTI()
  52. {
  53. addDataBlockField("data", 0, &SerializedFieldRTTI::getData, &SerializedFieldRTTI::setData, 0, &SerializedFieldRTTI::allocateData);
  54. }
  55. virtual const String& getRTTIName() override
  56. {
  57. static String name = "SerializedField";
  58. return name;
  59. }
  60. virtual UINT32 getRTTIId() override
  61. {
  62. return TID_SerializedField;
  63. }
  64. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  65. {
  66. return bs_shared_ptr_new<SerializedField>();
  67. }
  68. };
  69. class BS_UTILITY_EXPORT SerializedObjectRTTI : public RTTIType <SerializedObject, SerializedInstance, SerializedObjectRTTI>
  70. {
  71. private:
  72. SerializedSubObject& getEntry(SerializedObject* obj, UINT32 arrayIdx)
  73. {
  74. return obj->subObjects[arrayIdx];
  75. }
  76. void setEntry(SerializedObject* obj, UINT32 arrayIdx, SerializedSubObject& val)
  77. {
  78. obj->subObjects[arrayIdx] = val;
  79. }
  80. UINT32 getNumEntries(SerializedObject* obj)
  81. {
  82. return (UINT32)obj->subObjects.size();
  83. }
  84. void setNumEntries(SerializedObject* obj, UINT32 numEntries)
  85. {
  86. obj->subObjects = Vector<SerializedSubObject>(numEntries);
  87. }
  88. public:
  89. SerializedObjectRTTI()
  90. {
  91. addReflectableArrayField("entries", 1, &SerializedObjectRTTI::getEntry, &SerializedObjectRTTI::getNumEntries,
  92. &SerializedObjectRTTI::setEntry, &SerializedObjectRTTI::setNumEntries);
  93. }
  94. virtual const String& getRTTIName() override
  95. {
  96. static String name = "SerializedObject";
  97. return name;
  98. }
  99. virtual UINT32 getRTTIId() override
  100. {
  101. return TID_SerializedObject;
  102. }
  103. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  104. {
  105. return bs_shared_ptr_new<SerializedObject>();
  106. }
  107. };
  108. class BS_UTILITY_EXPORT SerializedArrayRTTI : public RTTIType <SerializedArray, SerializedInstance, SerializedArrayRTTI>
  109. {
  110. private:
  111. UINT32& getNumElements(SerializedArray* obj)
  112. {
  113. return obj->numElements;
  114. }
  115. void setNumElements(SerializedArray* obj, UINT32& val)
  116. {
  117. obj->numElements = val;
  118. }
  119. SerializedArrayEntry& getEntry(SerializedArray* obj, UINT32 arrayIdx)
  120. {
  121. Vector<SerializedArrayEntry>& sequentialEntries = any_cast_ref<Vector<SerializedArrayEntry>>(obj->mRTTIData);
  122. return sequentialEntries[arrayIdx];
  123. }
  124. void setEntry(SerializedArray* obj, UINT32 arrayIdx, SerializedArrayEntry& val)
  125. {
  126. obj->entries[val.index] = val;
  127. }
  128. UINT32 getNumEntries(SerializedArray* obj)
  129. {
  130. Vector<SerializedArrayEntry>& sequentialEntries = any_cast_ref<Vector<SerializedArrayEntry>>(obj->mRTTIData);
  131. return (UINT32)sequentialEntries.size();
  132. }
  133. void setNumEntries(SerializedArray* obj, UINT32 numEntries)
  134. {
  135. obj->entries = UnorderedMap<UINT32, SerializedArrayEntry>();
  136. }
  137. public:
  138. SerializedArrayRTTI()
  139. {
  140. addPlainField("numElements", 0, &SerializedArrayRTTI::getNumElements, &SerializedArrayRTTI::setNumElements);
  141. addReflectableArrayField("entries", 1, &SerializedArrayRTTI::getEntry, &SerializedArrayRTTI::getNumEntries,
  142. &SerializedArrayRTTI::setEntry, &SerializedArrayRTTI::setNumEntries);
  143. }
  144. void onSerializationStarted(IReflectable* obj) override
  145. {
  146. SerializedArray* serializedArray = static_cast<SerializedArray*>(obj);
  147. Vector<SerializedArrayEntry> sequentialData;
  148. for (auto& entry : serializedArray->entries)
  149. sequentialData.push_back(entry.second);
  150. serializedArray->mRTTIData = sequentialData;
  151. }
  152. void onSerializationEnded(IReflectable* obj) override
  153. {
  154. SerializedArray* serializedArray = static_cast<SerializedArray*>(obj);
  155. serializedArray->mRTTIData = nullptr;
  156. }
  157. const String& getRTTIName() override
  158. {
  159. static String name = "SerializedArray";
  160. return name;
  161. }
  162. UINT32 getRTTIId() override
  163. {
  164. return TID_SerializedArray;
  165. }
  166. std::shared_ptr<IReflectable> newRTTIObject() override
  167. {
  168. return bs_shared_ptr_new<SerializedArray>();
  169. }
  170. };
  171. class BS_UTILITY_EXPORT SerializedSubObjectRTTI : public RTTIType <SerializedSubObject, IReflectable, SerializedSubObjectRTTI>
  172. {
  173. private:
  174. UINT32& getTypeId(SerializedSubObject* obj)
  175. {
  176. return obj->typeId;
  177. }
  178. void setTypeId(SerializedSubObject* obj, UINT32& val)
  179. {
  180. obj->typeId = val;
  181. }
  182. SerializedEntry& getEntry(SerializedSubObject* obj, UINT32 arrayIdx)
  183. {
  184. Vector<SerializedEntry>& sequentialEntries = any_cast_ref<Vector<SerializedEntry>>(obj->mRTTIData);
  185. return sequentialEntries[arrayIdx];
  186. }
  187. void setEntry(SerializedSubObject* obj, UINT32 arrayIdx, SerializedEntry& val)
  188. {
  189. obj->entries[val.fieldId] = val;
  190. }
  191. UINT32 getNumEntries(SerializedSubObject* obj)
  192. {
  193. Vector<SerializedEntry>& sequentialEntries = any_cast_ref<Vector<SerializedEntry>>(obj->mRTTIData);
  194. return (UINT32)sequentialEntries.size();
  195. }
  196. void setNumEntries(SerializedSubObject* obj, UINT32 numEntries)
  197. {
  198. obj->entries = UnorderedMap<UINT32, SerializedEntry>();
  199. }
  200. public:
  201. SerializedSubObjectRTTI()
  202. {
  203. addPlainField("typeId", 0, &SerializedSubObjectRTTI::getTypeId, &SerializedSubObjectRTTI::setTypeId);
  204. addReflectableArrayField("entries", 1, &SerializedSubObjectRTTI::getEntry, &SerializedSubObjectRTTI::getNumEntries,
  205. &SerializedSubObjectRTTI::setEntry, &SerializedSubObjectRTTI::setNumEntries);
  206. }
  207. void onSerializationStarted(IReflectable* obj) override
  208. {
  209. SerializedSubObject* serializableObject = static_cast<SerializedSubObject*>(obj);
  210. Vector<SerializedEntry> sequentialData;
  211. for (auto& entry : serializableObject->entries)
  212. sequentialData.push_back(entry.second);
  213. serializableObject->mRTTIData = sequentialData;
  214. }
  215. void onSerializationEnded(IReflectable* obj) override
  216. {
  217. SerializedSubObject* serializableObject = static_cast<SerializedSubObject*>(obj);
  218. serializableObject->mRTTIData = nullptr;
  219. }
  220. const String& getRTTIName() override
  221. {
  222. static String name = "SerializedSubObject";
  223. return name;
  224. }
  225. UINT32 getRTTIId() override
  226. {
  227. return TID_SerializedSubObject;
  228. }
  229. std::shared_ptr<IReflectable> newRTTIObject() override
  230. {
  231. return bs_shared_ptr_new<SerializedSubObject>();
  232. }
  233. };
  234. class BS_UTILITY_EXPORT SerializedEntryRTTI : public RTTIType <SerializedEntry, IReflectable, SerializedEntryRTTI>
  235. {
  236. private:
  237. UINT32& getFieldId(SerializedEntry* obj)
  238. {
  239. return obj->fieldId;
  240. }
  241. void setFieldId(SerializedEntry* obj, UINT32& val)
  242. {
  243. obj->fieldId = val;
  244. }
  245. SPtr<SerializedInstance> getSerialized(SerializedEntry* obj)
  246. {
  247. return obj->serialized;
  248. }
  249. void setSerialized(SerializedEntry* obj, SPtr<SerializedInstance> val)
  250. {
  251. obj->serialized = val;
  252. }
  253. public:
  254. SerializedEntryRTTI()
  255. {
  256. addPlainField("fieldId", 0, &SerializedEntryRTTI::getFieldId, &SerializedEntryRTTI::setFieldId);
  257. addReflectablePtrField("serialized", 1, &SerializedEntryRTTI::getSerialized, &SerializedEntryRTTI::setSerialized);
  258. }
  259. const String& getRTTIName() override
  260. {
  261. static String name = "SerializedEntry";
  262. return name;
  263. }
  264. UINT32 getRTTIId() override
  265. {
  266. return TID_SerializedEntry;
  267. }
  268. std::shared_ptr<IReflectable> newRTTIObject() override
  269. {
  270. return bs_shared_ptr_new<SerializedEntry>();
  271. }
  272. };
  273. class BS_UTILITY_EXPORT SerializedArrayEntryRTTI : public RTTIType <SerializedArrayEntry, IReflectable, SerializedArrayEntryRTTI>
  274. {
  275. private:
  276. UINT32& getArrayIdx(SerializedArrayEntry* obj)
  277. {
  278. return obj->index;
  279. }
  280. void setArrayIdx(SerializedArrayEntry* obj, UINT32& val)
  281. {
  282. obj->index = val;
  283. }
  284. SPtr<SerializedInstance> getSerialized(SerializedArrayEntry* obj)
  285. {
  286. return obj->serialized;
  287. }
  288. void setSerialized(SerializedArrayEntry* obj, SPtr<SerializedInstance> val)
  289. {
  290. obj->serialized = val;
  291. }
  292. public:
  293. SerializedArrayEntryRTTI()
  294. {
  295. addPlainField("index", 0, &SerializedArrayEntryRTTI::getArrayIdx, &SerializedArrayEntryRTTI::setArrayIdx);
  296. addReflectablePtrField("serialized", 1, &SerializedArrayEntryRTTI::getSerialized, &SerializedArrayEntryRTTI::setSerialized);
  297. }
  298. const String& getRTTIName() override
  299. {
  300. static String name = "SerializedArrayEntry";
  301. return name;
  302. }
  303. UINT32 getRTTIId() override
  304. {
  305. return TID_SerializedArrayEntry;
  306. }
  307. std::shared_ptr<IReflectable> newRTTIObject() override
  308. {
  309. return bs_shared_ptr_new<SerializedArrayEntry>();
  310. }
  311. };
  312. /** @} */
  313. /** @endcond */
  314. }