BsManagedSerializableObjectRTTI.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsScriptAssemblyManager.h"
  5. #include "BsManagedSerializableObject.h"
  6. #include "BsManagedSerializableField.h"
  7. #include "BsManagedDiff.h"
  8. namespace BansheeEngine
  9. {
  10. class BS_SCR_BE_EXPORT ManagedSerializableObjectRTTI : public RTTIType<ManagedSerializableObject, IReflectable, ManagedSerializableObjectRTTI>
  11. {
  12. private:
  13. ManagedSerializableObjectInfoPtr getInfo(ManagedSerializableObject* obj)
  14. {
  15. return obj->mObjInfo;
  16. }
  17. void setInfo(ManagedSerializableObject* obj, ManagedSerializableObjectInfoPtr val)
  18. {
  19. obj->mObjInfo = val;
  20. }
  21. ManagedSerializableFieldDataEntryPtr getFieldEntry(ManagedSerializableObject* obj, UINT32 arrayIdx)
  22. {
  23. Vector<ManagedSerializableFieldInfoPtr>& sequentialFields =
  24. any_cast_ref<Vector<ManagedSerializableFieldInfoPtr>>(obj->mRTTIData);
  25. ManagedSerializableFieldInfoPtr field = sequentialFields[arrayIdx];
  26. ManagedSerializableFieldKeyPtr fieldKey = ManagedSerializableFieldKey::create(field->mParentTypeId, field->mFieldId);
  27. ManagedSerializableFieldDataPtr fieldData = obj->getFieldData(field);
  28. return ManagedSerializableFieldDataEntry::create(fieldKey, fieldData);
  29. }
  30. void setFieldsEntry(ManagedSerializableObject* obj, UINT32 arrayIdx, ManagedSerializableFieldDataEntryPtr val)
  31. {
  32. obj->mCachedData[*val->mKey] = val->mValue;
  33. }
  34. UINT32 getNumFieldEntries(ManagedSerializableObject* obj)
  35. {
  36. Vector<ManagedSerializableFieldInfoPtr>& sequentialFields =
  37. any_cast_ref<Vector<ManagedSerializableFieldInfoPtr>>(obj->mRTTIData);
  38. return (UINT32)sequentialFields.size();
  39. }
  40. void setNumFieldEntries(ManagedSerializableObject* obj, UINT32 numEntries)
  41. {
  42. // Do nothing
  43. }
  44. public:
  45. ManagedSerializableObjectRTTI()
  46. {
  47. addReflectablePtrField("mObjInfo", 0, &ManagedSerializableObjectRTTI::getInfo, &ManagedSerializableObjectRTTI::setInfo);
  48. addReflectablePtrArrayField("mFieldEntries", 1, &ManagedSerializableObjectRTTI::getFieldEntry, &ManagedSerializableObjectRTTI::getNumFieldEntries,
  49. &ManagedSerializableObjectRTTI::setFieldsEntry, &ManagedSerializableObjectRTTI::setNumFieldEntries);
  50. }
  51. virtual void onSerializationStarted(IReflectable* obj) override
  52. {
  53. ManagedSerializableObject* castObj = static_cast<ManagedSerializableObject*>(obj);
  54. Vector<ManagedSerializableFieldInfoPtr> sequentialFields;
  55. ManagedSerializableObjectInfoPtr curType = castObj->mObjInfo;
  56. while (curType != nullptr)
  57. {
  58. for (auto& field : curType->mFields)
  59. {
  60. if (field.second->isSerializable())
  61. sequentialFields.push_back(field.second);
  62. }
  63. curType = curType->mBaseClass;
  64. }
  65. castObj->mRTTIData = sequentialFields;
  66. }
  67. virtual void onSerializationEnded(IReflectable* obj) override
  68. {
  69. ManagedSerializableObject* castObj = static_cast<ManagedSerializableObject*>(obj);
  70. castObj->mRTTIData = nullptr;
  71. }
  72. virtual IDiff& getDiffHandler() const override
  73. {
  74. static ManagedDiff managedDiffHandler;
  75. return managedDiffHandler;
  76. }
  77. virtual const String& getRTTIName() override
  78. {
  79. static String name = "ScriptSerializableObject";
  80. return name;
  81. }
  82. virtual UINT32 getRTTIId() override
  83. {
  84. return TID_ScriptSerializableObject;
  85. }
  86. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  87. {
  88. return ManagedSerializableObject::createEmpty();
  89. }
  90. };
  91. }