BsScriptSerializableDictionaryRTTI.h 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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) { return obj->mDictionaryTypeInfo; }
  15. void setTypeInfo(ScriptSerializableDictionary* obj, ScriptSerializableTypeInfoDictionaryPtr val) { obj->mDictionaryTypeInfo = val; }
  16. ScriptSerializableFieldDataPtr getKeyEntry(ScriptSerializableDictionary* obj, CM::UINT32 arrayIdx) { return obj->mKeyEntries[arrayIdx]; }
  17. void setKeyEntry(ScriptSerializableDictionary* obj, CM::UINT32 arrayIdx, ScriptSerializableFieldDataPtr val) { obj->mKeyEntries[arrayIdx] = val; }
  18. CM::UINT32 getNumKeyEntries(ScriptSerializableDictionary* obj) { return (CM::UINT32)obj->mKeyEntries.size(); }
  19. void setNumKeyEntries(ScriptSerializableDictionary* obj, CM::UINT32 numEntries) { obj->mKeyEntries.resize(numEntries); }
  20. ScriptSerializableFieldDataPtr getValueEntry(ScriptSerializableDictionary* obj, CM::UINT32 arrayIdx) { return obj->mValueEntries[arrayIdx]; }
  21. void setValueEntry(ScriptSerializableDictionary* obj, CM::UINT32 arrayIdx, ScriptSerializableFieldDataPtr val) { obj->mValueEntries[arrayIdx] = val; }
  22. CM::UINT32 getNumValueEntries(ScriptSerializableDictionary* obj) { return (CM::UINT32)obj->mValueEntries.size(); }
  23. void setNumValueEntries(ScriptSerializableDictionary* obj, CM::UINT32 numEntries) { obj->mValueEntries.resize(numEntries); }
  24. public:
  25. ScriptSerializableDictionaryRTTI()
  26. {
  27. addReflectablePtrField("mListTypeInfo", 0, &ScriptSerializableDictionaryRTTI::getTypeInfo, &ScriptSerializableDictionaryRTTI::setTypeInfo);
  28. addReflectablePtrArrayField("mKeyEntries", 1, &ScriptSerializableDictionaryRTTI::getKeyEntry, &ScriptSerializableDictionaryRTTI::getNumKeyEntries,
  29. &ScriptSerializableDictionaryRTTI::setKeyEntry, &ScriptSerializableDictionaryRTTI::setNumKeyEntries);
  30. addReflectablePtrArrayField("mValueEntries", 2, &ScriptSerializableDictionaryRTTI::getValueEntry, &ScriptSerializableDictionaryRTTI::getNumValueEntries,
  31. &ScriptSerializableDictionaryRTTI::setValueEntry, &ScriptSerializableDictionaryRTTI::setNumValueEntries);
  32. }
  33. virtual void onSerializationStarted(CM::IReflectable* obj)
  34. {
  35. ScriptSerializableDictionary* serializableObject = static_cast<ScriptSerializableDictionary*>(obj);
  36. serializableObject->serializeManagedInstance();
  37. }
  38. virtual void onDeserializationStarted(CM::IReflectable* obj)
  39. {
  40. ScriptSerializableDictionary* serializableObject = static_cast<ScriptSerializableDictionary*>(obj);
  41. // If we are deserializing a GameObject we need to defer deserializing actual field values
  42. // to ensure GameObject handles instances have been fixed up (which only happens after deserialization is done)
  43. if(CM::GameObjectManager::instance().isGameObjectDeserializationActive())
  44. CM::GameObjectManager::instance().registerOnDeserializationEndCallback([=] () { serializableObject->deserializeManagedInstance(); });
  45. else
  46. serializableObject->deserializeManagedInstance();
  47. }
  48. virtual const CM::String& getRTTIName()
  49. {
  50. static CM::String name = "ScriptSerializableDictionary";
  51. return name;
  52. }
  53. virtual CM::UINT32 getRTTIId()
  54. {
  55. return TID_ScriptSerializableDictionary;
  56. }
  57. virtual std::shared_ptr<CM::IReflectable> newRTTIObject()
  58. {
  59. return ScriptSerializableDictionary::createEmpty();
  60. }
  61. };
  62. }