BsScriptSerializableListRTTI.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmGameObjectManager.h"
  5. #include "BsScriptSerializableList.h"
  6. #include "BsRuntimeScriptObjects.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoClass.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_SCR_BE_EXPORT ScriptSerializableListRTTI : public CM::RTTIType<ScriptSerializableList, CM::IReflectable, ScriptSerializableListRTTI>
  12. {
  13. private:
  14. ScriptSerializableTypeInfoListPtr getTypeInfo(ScriptSerializableList* obj)
  15. {
  16. return obj->mListTypeInfo;
  17. }
  18. void setTypeInfo(ScriptSerializableList* obj, ScriptSerializableTypeInfoListPtr val)
  19. {
  20. obj->mListTypeInfo = val;
  21. }
  22. CM::UINT32& getNumElements(ScriptSerializableList* obj)
  23. {
  24. return (CM::UINT32)obj->mNumElements;
  25. }
  26. void setNumElements(ScriptSerializableList* obj, CM::UINT32& numElements)
  27. {
  28. obj->mNumElements = numElements;
  29. }
  30. ScriptSerializableFieldDataPtr getListEntry(ScriptSerializableList* obj, CM::UINT32 arrayIdx)
  31. {
  32. return obj->mListEntries[arrayIdx];
  33. }
  34. void setListEntry(ScriptSerializableList* obj, CM::UINT32 arrayIdx, ScriptSerializableFieldDataPtr val)
  35. {
  36. obj->mListEntries[arrayIdx] = val;
  37. }
  38. CM::UINT32 getNumListEntries(ScriptSerializableList* obj)
  39. {
  40. return (CM::UINT32)obj->mListEntries.size();
  41. }
  42. void setNumListEntries(ScriptSerializableList* obj, CM::UINT32 numEntries)
  43. {
  44. obj->mListEntries.resize(numEntries);
  45. }
  46. public:
  47. ScriptSerializableListRTTI()
  48. {
  49. addReflectablePtrField("mListTypeInfo", 0, &ScriptSerializableListRTTI::getTypeInfo, &ScriptSerializableListRTTI::setTypeInfo);
  50. addPlainField("mNumElements", 1, &ScriptSerializableListRTTI::getNumElements, &ScriptSerializableListRTTI::setNumElements);
  51. addReflectablePtrArrayField("mListEntries", 2, &ScriptSerializableListRTTI::getListEntry, &ScriptSerializableListRTTI::getNumListEntries,
  52. &ScriptSerializableListRTTI::setListEntry, &ScriptSerializableListRTTI::setNumListEntries);
  53. }
  54. virtual void onSerializationStarted(CM::IReflectable* obj)
  55. {
  56. ScriptSerializableList* serializableObject = static_cast<ScriptSerializableList*>(obj);
  57. serializableObject->serializeManagedInstance();
  58. }
  59. virtual void onDeserializationStarted(CM::IReflectable* obj)
  60. {
  61. ScriptSerializableList* serializableObject = static_cast<ScriptSerializableList*>(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(CM::GameObjectManager::instance().isGameObjectDeserializationActive())
  65. CM::GameObjectManager::instance().registerOnDeserializationEndCallback([=] () { serializableObject->deserializeManagedInstance(); });
  66. else
  67. serializableObject->deserializeManagedInstance();
  68. }
  69. virtual const CM::String& getRTTIName()
  70. {
  71. static CM::String name = "ScriptSerializableList";
  72. return name;
  73. }
  74. virtual CM::UINT32 getRTTIId()
  75. {
  76. return TID_ScriptSerializableList;
  77. }
  78. virtual std::shared_ptr<CM::IReflectable> newRTTIObject()
  79. {
  80. return ScriptSerializableList::createEmpty();
  81. }
  82. };
  83. }