BsManagedSerializableObjectRTTI.h 3.7 KB

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