BsManagedSerializableObjectRTTI.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 "Reflection/BsRTTIType.h"
  6. #include "Serialization/BsScriptAssemblyManager.h"
  7. #include "Serialization/BsManagedSerializableObject.h"
  8. #include "Serialization/BsManagedSerializableField.h"
  9. #include "Serialization/BsManagedDiff.h"
  10. namespace bs
  11. {
  12. /** @cond RTTI */
  13. /** @addtogroup RTTI-Impl-SEngine
  14. * @{
  15. */
  16. class BS_SCR_BE_EXPORT ManagedSerializableObjectRTTI : public RTTIType<ManagedSerializableObject, IReflectable, ManagedSerializableObjectRTTI>
  17. {
  18. private:
  19. SPtr<ManagedSerializableObjectInfo> getInfo(ManagedSerializableObject* obj)
  20. {
  21. return obj->mObjInfo;
  22. }
  23. void setInfo(ManagedSerializableObject* obj, SPtr<ManagedSerializableObjectInfo> val)
  24. {
  25. obj->mObjInfo = val;
  26. }
  27. SPtr<ManagedSerializableFieldDataEntry> getFieldEntry(ManagedSerializableObject* obj, UINT32 arrayIdx)
  28. {
  29. SPtr<ManagedSerializableMemberInfo> field = mSequentialFields[arrayIdx];
  30. SPtr<ManagedSerializableFieldKey> fieldKey = ManagedSerializableFieldKey::create(field->mParentTypeId, field->mFieldId);
  31. SPtr<ManagedSerializableFieldData> fieldData = obj->getFieldData(field);
  32. return ManagedSerializableFieldDataEntry::create(fieldKey, fieldData);
  33. }
  34. void setFieldsEntry(ManagedSerializableObject* obj, UINT32 arrayIdx, SPtr<ManagedSerializableFieldDataEntry> val)
  35. {
  36. obj->mCachedData[*val->mKey] = val->mValue;
  37. }
  38. UINT32 getNumFieldEntries(ManagedSerializableObject* obj)
  39. {
  40. return (UINT32)mSequentialFields.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. void onSerializationStarted(IReflectable* obj, SerializationContext* context) override
  54. {
  55. ManagedSerializableObject* castObj = static_cast<ManagedSerializableObject*>(obj);
  56. SPtr<ManagedSerializableObjectInfo> curType = castObj->mObjInfo;
  57. while (curType != nullptr)
  58. {
  59. for (auto& field : curType->mFields)
  60. {
  61. if (field.second->isSerializable())
  62. mSequentialFields.push_back(field.second);
  63. }
  64. curType = curType->mBaseClass;
  65. }
  66. }
  67. IDiff& getDiffHandler() const override
  68. {
  69. static ManagedDiff managedDiffHandler;
  70. return managedDiffHandler;
  71. }
  72. const String& getRTTIName() override
  73. {
  74. static String name = "ScriptSerializableObject";
  75. return name;
  76. }
  77. UINT32 getRTTIId() override
  78. {
  79. return TID_ScriptSerializableObject;
  80. }
  81. SPtr<IReflectable> newRTTIObject() override
  82. {
  83. return ManagedSerializableObject::createEmpty();
  84. }
  85. private:
  86. Vector<SPtr<ManagedSerializableMemberInfo>> mSequentialFields;
  87. };
  88. /** @} */
  89. /** @endcond */
  90. }