BsManagedSerializableDictionaryRTTI.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsGameObjectManager.h"
  5. #include "BsManagedSerializableDictionary.h"
  6. #include "BsScriptAssemblyManager.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoClass.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_SCR_BE_EXPORT ManagedSerializableDictionaryRTTI : public RTTIType<ManagedSerializableDictionary, IReflectable, ManagedSerializableDictionaryRTTI>
  12. {
  13. private:
  14. struct SerializationData
  15. {
  16. Vector<ManagedSerializableFieldDataPtr> keyEntries;
  17. Vector<ManagedSerializableFieldDataPtr> valueEntries;
  18. bool isGameObjectDeserialization;
  19. };
  20. ManagedSerializableTypeInfoDictionaryPtr getTypeInfo(ManagedSerializableDictionary* obj) { return obj->mDictionaryTypeInfo; }
  21. void setTypeInfo(ManagedSerializableDictionary* obj, ManagedSerializableTypeInfoDictionaryPtr val) { obj->mDictionaryTypeInfo = val; }
  22. ManagedSerializableFieldDataPtr getKeyEntry(ManagedSerializableDictionary* obj, UINT32 arrayIdx)
  23. {
  24. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  25. return data->keyEntries[arrayIdx];
  26. }
  27. void setKeyEntry(ManagedSerializableDictionary* obj, UINT32 arrayIdx, ManagedSerializableFieldDataPtr val)
  28. {
  29. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  30. data->keyEntries[arrayIdx] = val;
  31. }
  32. UINT32 getNumKeyEntries(ManagedSerializableDictionary* obj)
  33. {
  34. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  35. return (UINT32)data->keyEntries.size();
  36. }
  37. void setNumKeyEntries(ManagedSerializableDictionary* obj, UINT32 numEntries)
  38. {
  39. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  40. data->keyEntries.resize(numEntries);
  41. }
  42. ManagedSerializableFieldDataPtr getValueEntry(ManagedSerializableDictionary* obj, UINT32 arrayIdx)
  43. {
  44. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  45. return data->valueEntries[arrayIdx];
  46. }
  47. void setValueEntry(ManagedSerializableDictionary* obj, UINT32 arrayIdx, ManagedSerializableFieldDataPtr val)
  48. {
  49. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  50. data->valueEntries[arrayIdx] = val;
  51. }
  52. UINT32 getNumValueEntries(ManagedSerializableDictionary* obj)
  53. {
  54. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  55. return (UINT32)data->valueEntries.size();
  56. }
  57. void setNumValueEntries(ManagedSerializableDictionary* obj, UINT32 numEntries)
  58. {
  59. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(obj->mRTTIData);
  60. data->valueEntries.resize(numEntries);
  61. }
  62. public:
  63. ManagedSerializableDictionaryRTTI()
  64. {
  65. addReflectablePtrField("mListTypeInfo", 0, &ManagedSerializableDictionaryRTTI::getTypeInfo, &ManagedSerializableDictionaryRTTI::setTypeInfo);
  66. addReflectablePtrArrayField("mKeyEntries", 1, &ManagedSerializableDictionaryRTTI::getKeyEntry, &ManagedSerializableDictionaryRTTI::getNumKeyEntries,
  67. &ManagedSerializableDictionaryRTTI::setKeyEntry, &ManagedSerializableDictionaryRTTI::setNumKeyEntries);
  68. addReflectablePtrArrayField("mValueEntries", 2, &ManagedSerializableDictionaryRTTI::getValueEntry, &ManagedSerializableDictionaryRTTI::getNumValueEntries,
  69. &ManagedSerializableDictionaryRTTI::setValueEntry, &ManagedSerializableDictionaryRTTI::setNumValueEntries);
  70. }
  71. virtual void onSerializationStarted(IReflectable* obj)
  72. {
  73. ManagedSerializableDictionary* serializableObject = static_cast<ManagedSerializableDictionary*>(obj);
  74. serializableObject->mRTTIData = bs_shared_ptr<SerializationData>();
  75. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(serializableObject->mRTTIData);
  76. serializableObject->serializeManagedInstance(data->keyEntries, data->valueEntries);
  77. }
  78. virtual void onSerializationEnded(IReflectable* obj)
  79. {
  80. ManagedSerializableDictionary* serializableObject = static_cast<ManagedSerializableDictionary*>(obj);
  81. serializableObject->mRTTIData = nullptr;
  82. }
  83. virtual void onDeserializationStarted(IReflectable* obj)
  84. {
  85. ManagedSerializableDictionary* serializableObject = static_cast<ManagedSerializableDictionary*>(obj);
  86. serializableObject->mRTTIData = bs_shared_ptr<SerializationData>();
  87. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(serializableObject->mRTTIData);
  88. // If we are deserializing a GameObject we need to defer deserializing actual field values
  89. // to ensure GameObject handles instances have been fixed up (which only happens after deserialization is done)
  90. data->isGameObjectDeserialization = GameObjectManager::instance().isGameObjectDeserializationActive();
  91. if (data->isGameObjectDeserialization)
  92. GameObjectManager::instance().registerOnDeserializationEndCallback([=]() { serializableObject->deserializeManagedInstance(data->keyEntries, data->valueEntries); });
  93. }
  94. virtual void onDeserializationEnded(IReflectable* obj)
  95. {
  96. ManagedSerializableDictionary* serializableObject = static_cast<ManagedSerializableDictionary*>(obj);
  97. SPtr<SerializationData> data = any_cast<SPtr<SerializationData>>(serializableObject->mRTTIData);
  98. if (data->isGameObjectDeserialization)
  99. serializableObject->deserializeManagedInstance(data->keyEntries, data->valueEntries);
  100. serializableObject->mRTTIData = nullptr;
  101. }
  102. virtual const String& getRTTIName()
  103. {
  104. static String name = "ScriptSerializableDictionary";
  105. return name;
  106. }
  107. virtual UINT32 getRTTIId()
  108. {
  109. return TID_ScriptSerializableDictionary;
  110. }
  111. virtual std::shared_ptr<IReflectable> newRTTIObject()
  112. {
  113. return ManagedSerializableDictionary::createEmpty();
  114. }
  115. };
  116. }