2
0

BsManagedSerializableArrayRTTI.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsGameObjectManager.h"
  5. #include "BsManagedSerializableArray.h"
  6. #include "BsScriptAssemblyManager.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoClass.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_SCR_BE_EXPORT ManagedSerializableArrayRTTI : public RTTIType<ManagedSerializableArray, IReflectable, ManagedSerializableArrayRTTI>
  12. {
  13. private:
  14. struct DeserializationInfo
  15. {
  16. Vector<ManagedSerializableFieldDataPtr> fields;
  17. bool isGameObjectDeserialization;
  18. };
  19. ManagedSerializableTypeInfoArrayPtr getTypeInfo(ManagedSerializableArray* obj)
  20. {
  21. return obj->mArrayTypeInfo;
  22. }
  23. void setTypeInfo(ManagedSerializableArray* obj, ManagedSerializableTypeInfoArrayPtr val)
  24. {
  25. obj->mArrayTypeInfo = val;
  26. }
  27. UINT32& getElementSize(ManagedSerializableArray* obj)
  28. {
  29. return (UINT32)obj->mElemSize;
  30. }
  31. void setElementSize(ManagedSerializableArray* obj, UINT32& numElements)
  32. {
  33. obj->mElemSize = numElements;
  34. }
  35. UINT32& getNumElements(ManagedSerializableArray* obj, UINT32 arrayIdx)
  36. {
  37. return (UINT32)obj->mNumElements[arrayIdx];
  38. }
  39. void setNumElements(ManagedSerializableArray* obj, UINT32 arrayIdx, UINT32& numElements)
  40. {
  41. obj->mNumElements[arrayIdx] = numElements;
  42. }
  43. UINT32 getNumElementsNumEntries(ManagedSerializableArray* obj)
  44. {
  45. return (UINT32)obj->mNumElements.size();
  46. }
  47. void setNumElementsNumEntries(ManagedSerializableArray* obj, UINT32 numEntries)
  48. {
  49. obj->mNumElements.resize(numEntries);
  50. }
  51. ManagedSerializableFieldDataPtr getArrayEntry(ManagedSerializableArray* obj, UINT32 arrayIdx)
  52. {
  53. return obj->getFieldData(arrayIdx);
  54. }
  55. void setArrayEntry(ManagedSerializableArray* obj, UINT32 arrayIdx, ManagedSerializableFieldDataPtr val)
  56. {
  57. SPtr<DeserializationInfo> info = any_cast<SPtr<DeserializationInfo>>(obj->mRTTIData);
  58. info->fields[arrayIdx] = val;
  59. }
  60. UINT32 getNumArrayEntries(ManagedSerializableArray* obj)
  61. {
  62. UINT32 totalNumElements = 1;
  63. for (auto& numElems : obj->mNumElements)
  64. totalNumElements *= numElems;
  65. return totalNumElements;
  66. }
  67. void setNumArrayEntries(ManagedSerializableArray* obj, UINT32 numEntries)
  68. {
  69. SPtr<DeserializationInfo> info = any_cast<SPtr<DeserializationInfo>>(obj->mRTTIData);
  70. info->fields = Vector<ManagedSerializableFieldDataPtr>(numEntries);
  71. }
  72. public:
  73. ManagedSerializableArrayRTTI()
  74. {
  75. addReflectablePtrField("mArrayTypeInfo", 0, &ManagedSerializableArrayRTTI::getTypeInfo, &ManagedSerializableArrayRTTI::setTypeInfo);
  76. addPlainField("mElementSize", 1, &ManagedSerializableArrayRTTI::getElementSize, &ManagedSerializableArrayRTTI::setElementSize);
  77. addPlainArrayField("mNumElements", 2, &ManagedSerializableArrayRTTI::getNumElements, &ManagedSerializableArrayRTTI::getNumElementsNumEntries,
  78. &ManagedSerializableArrayRTTI::setNumElements, &ManagedSerializableArrayRTTI::setNumElementsNumEntries);
  79. addReflectablePtrArrayField("mArrayEntries", 3, &ManagedSerializableArrayRTTI::getArrayEntry, &ManagedSerializableArrayRTTI::getNumArrayEntries,
  80. &ManagedSerializableArrayRTTI::setArrayEntry, &ManagedSerializableArrayRTTI::setNumArrayEntries);
  81. }
  82. virtual void onDeserializationStarted(IReflectable* obj)
  83. {
  84. ManagedSerializableArray* serializableObject = static_cast<ManagedSerializableArray*>(obj);
  85. serializableObject->mRTTIData = bs_shared_ptr<DeserializationInfo>();
  86. SPtr<DeserializationInfo> info = any_cast<SPtr<DeserializationInfo>>(serializableObject->mRTTIData);
  87. // If we are deserializing a GameObject we need to defer deserializing actual field values
  88. // to ensure GameObject handles instances have been fixed up (which only happens after deserialization is done)
  89. info->isGameObjectDeserialization = GameObjectManager::instance().isGameObjectDeserializationActive();
  90. if (info->isGameObjectDeserialization)
  91. GameObjectManager::instance().registerOnDeserializationEndCallback([=]() { serializableObject->deserializeManagedInstance(info->fields); });
  92. }
  93. virtual void onDeserializationEnded(IReflectable* obj)
  94. {
  95. ManagedSerializableArray* serializableObject = static_cast<ManagedSerializableArray*>(obj);
  96. SPtr<DeserializationInfo> info = any_cast<SPtr<DeserializationInfo>>(serializableObject->mRTTIData);
  97. if (!info->isGameObjectDeserialization)
  98. serializableObject->deserializeManagedInstance(info->fields);
  99. serializableObject->mRTTIData = nullptr;
  100. }
  101. virtual const String& getRTTIName()
  102. {
  103. static String name = "ScriptSerializableArray";
  104. return name;
  105. }
  106. virtual UINT32 getRTTIId()
  107. {
  108. return TID_ScriptSerializableArray;
  109. }
  110. virtual std::shared_ptr<IReflectable> newRTTIObject()
  111. {
  112. return ManagedSerializableArray::createFromNew();
  113. }
  114. };
  115. }