BsManagedSerializableObjectRTTI.h 3.7 KB

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