BsManagedSerializableObjectRTTI.h 3.2 KB

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