BsManagedSerializableListRTTI.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsGameObjectManager.h"
  5. #include "BsManagedSerializableList.h"
  6. #include "BsRuntimeScriptObjects.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoClass.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_SCR_BE_EXPORT ManagedSerializableListRTTI : public RTTIType<ManagedSerializableList, IReflectable, ManagedSerializableListRTTI>
  12. {
  13. private:
  14. ManagedSerializableTypeInfoListPtr getTypeInfo(ManagedSerializableList* obj)
  15. {
  16. return obj->mListTypeInfo;
  17. }
  18. void setTypeInfo(ManagedSerializableList* obj, ManagedSerializableTypeInfoListPtr val)
  19. {
  20. obj->mListTypeInfo = val;
  21. }
  22. UINT32& getNumElements(ManagedSerializableList* obj)
  23. {
  24. return (UINT32)obj->mNumElements;
  25. }
  26. void setNumElements(ManagedSerializableList* obj, UINT32& numElements)
  27. {
  28. obj->mNumElements = numElements;
  29. }
  30. ManagedSerializableFieldDataPtr getListEntry(ManagedSerializableList* obj, UINT32 arrayIdx)
  31. {
  32. return obj->mListEntries[arrayIdx];
  33. }
  34. void setListEntry(ManagedSerializableList* obj, UINT32 arrayIdx, ManagedSerializableFieldDataPtr val)
  35. {
  36. obj->mListEntries[arrayIdx] = val;
  37. }
  38. UINT32 getNumListEntries(ManagedSerializableList* obj)
  39. {
  40. return (UINT32)obj->mListEntries.size();
  41. }
  42. void setNumListEntries(ManagedSerializableList* obj, UINT32 numEntries)
  43. {
  44. obj->mListEntries.resize(numEntries);
  45. }
  46. public:
  47. ManagedSerializableListRTTI()
  48. {
  49. addReflectablePtrField("mListTypeInfo", 0, &ManagedSerializableListRTTI::getTypeInfo, &ManagedSerializableListRTTI::setTypeInfo);
  50. addPlainField("mNumElements", 1, &ManagedSerializableListRTTI::getNumElements, &ManagedSerializableListRTTI::setNumElements);
  51. addReflectablePtrArrayField("mListEntries", 2, &ManagedSerializableListRTTI::getListEntry, &ManagedSerializableListRTTI::getNumListEntries,
  52. &ManagedSerializableListRTTI::setListEntry, &ManagedSerializableListRTTI::setNumListEntries);
  53. }
  54. virtual void onSerializationStarted(IReflectable* obj)
  55. {
  56. ManagedSerializableList* serializableObject = static_cast<ManagedSerializableList*>(obj);
  57. serializableObject->serializeManagedInstance();
  58. }
  59. virtual void onDeserializationStarted(IReflectable* obj)
  60. {
  61. ManagedSerializableList* serializableObject = static_cast<ManagedSerializableList*>(obj);
  62. // If we are deserializing a GameObject we need to defer deserializing actual field values
  63. // to ensure GameObject handles instances have been fixed up (which only happens after deserialization is done)
  64. if(GameObjectManager::instance().isGameObjectDeserializationActive())
  65. GameObjectManager::instance().registerOnDeserializationEndCallback([=] () { serializableObject->deserializeManagedInstance(); });
  66. else
  67. serializableObject->deserializeManagedInstance();
  68. }
  69. virtual const String& getRTTIName()
  70. {
  71. static String name = "ScriptSerializableList";
  72. return name;
  73. }
  74. virtual UINT32 getRTTIId()
  75. {
  76. return TID_ScriptSerializableList;
  77. }
  78. virtual std::shared_ptr<IReflectable> newRTTIObject()
  79. {
  80. return ManagedSerializableList::createEmpty();
  81. }
  82. };
  83. }