BsScriptSerializableDictionaryRTTI.h 3.4 KB

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