BsSerializedObjectRTTI.h 9.3 KB

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