BsScriptSerializableObjectRTTI.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "BsRuntimeScriptObjects.h"
  5. #include "BsScriptSerializableObject.h"
  6. #include "BsScriptSerializableField.h"
  7. #include "CmGameObjectManager.h"
  8. #include "BsMonoClass.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_SCR_BE_EXPORT ScriptSerializableObjectRTTI : public CM::RTTIType<ScriptSerializableObject, CM::IReflectable, ScriptSerializableObjectRTTI>
  12. {
  13. private:
  14. ScriptSerializableObjectInfoPtr getInfo(ScriptSerializableObject* obj)
  15. {
  16. return obj->mObjInfo;
  17. }
  18. void setInfo(ScriptSerializableObject* obj, ScriptSerializableObjectInfoPtr val)
  19. {
  20. obj->mObjInfo = val;
  21. }
  22. ScriptSerializableFieldDataEntryPtr getFieldEntry(ScriptSerializableObject* obj, CM::UINT32 arrayIdx)
  23. {
  24. return obj->mFieldEntries[arrayIdx];
  25. }
  26. void setFieldsEntry(ScriptSerializableObject* obj, CM::UINT32 arrayIdx, ScriptSerializableFieldDataEntryPtr val)
  27. {
  28. obj->mFieldEntries[arrayIdx] = val;
  29. }
  30. CM::UINT32 getNumFieldEntries(ScriptSerializableObject* obj)
  31. {
  32. return (CM::UINT32)obj->mFieldEntries.size();
  33. }
  34. void setNumFieldEntries(ScriptSerializableObject* obj, CM::UINT32 numEntries)
  35. {
  36. obj->mFieldEntries.resize(numEntries);
  37. }
  38. public:
  39. ScriptSerializableObjectRTTI()
  40. {
  41. addReflectablePtrField("mObjInfo", 0, &ScriptSerializableObjectRTTI::getInfo, &ScriptSerializableObjectRTTI::setInfo);
  42. addReflectablePtrArrayField("mFieldEntries", 1, &ScriptSerializableObjectRTTI::getFieldEntry, &ScriptSerializableObjectRTTI::getNumFieldEntries,
  43. &ScriptSerializableObjectRTTI::setFieldsEntry, &ScriptSerializableObjectRTTI::setNumFieldEntries);
  44. }
  45. virtual void onSerializationStarted(CM::IReflectable* obj)
  46. {
  47. ScriptSerializableObject* serializableObject = static_cast<ScriptSerializableObject*>(obj);
  48. serializableObject->serializeManagedInstance();
  49. }
  50. virtual void onDeserializationStarted(CM::IReflectable* obj)
  51. {
  52. ScriptSerializableObject* serializableObject = static_cast<ScriptSerializableObject*>(obj);
  53. // If we are deserializing a GameObject we need to defer deserializing actual field values
  54. // to ensure GameObject handles instances have been fixed up (which only happens after deserialization is done)
  55. if(CM::GameObjectManager::instance().isGameObjectDeserializationActive())
  56. CM::GameObjectManager::instance().registerOnDeserializationEndCallback([=] () { serializableObject->deserializeManagedInstance(); });
  57. else
  58. serializableObject->deserializeManagedInstance();
  59. }
  60. virtual const CM::String& getRTTIName()
  61. {
  62. static CM::String name = "ScriptSerializableObject";
  63. return name;
  64. }
  65. virtual CM::UINT32 getRTTIId()
  66. {
  67. return TID_ScriptSerializableObject;
  68. }
  69. virtual std::shared_ptr<CM::IReflectable> newRTTIObject()
  70. {
  71. return ScriptSerializableObject::createEmpty();
  72. }
  73. };
  74. }