BsManagedSerializableObjectInfo.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "BsIReflectable.h"
  4. #include <mono/jit/jit.h>
  5. namespace BansheeEngine
  6. {
  7. enum class ScriptPrimitiveType
  8. {
  9. Bool,
  10. Char,
  11. I8,
  12. U8,
  13. I16,
  14. U16,
  15. I32,
  16. U32,
  17. I64,
  18. U64,
  19. Float,
  20. Double,
  21. String,
  22. TextureRef,
  23. SpriteTextureRef,
  24. ManagedResourceRef,
  25. SceneObjectRef,
  26. ComponentRef
  27. };
  28. enum class ScriptFieldFlags
  29. {
  30. Serializable = 0x01,
  31. Inspectable = 0x02
  32. };
  33. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfo : public IReflectable
  34. {
  35. public:
  36. virtual ~ManagedSerializableTypeInfo() {}
  37. virtual bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const = 0;
  38. virtual bool isTypeLoaded() const = 0;
  39. virtual ::MonoClass* getMonoClass() const = 0;
  40. /************************************************************************/
  41. /* RTTI */
  42. /************************************************************************/
  43. public:
  44. friend class ManagedSerializableTypeInfoRTTI;
  45. static RTTITypeBase* getRTTIStatic();
  46. virtual RTTITypeBase* getRTTI() const;
  47. };
  48. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoPrimitive : public ManagedSerializableTypeInfo
  49. {
  50. public:
  51. ScriptPrimitiveType mType;
  52. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  53. bool isTypeLoaded() const;
  54. ::MonoClass* getMonoClass() const;
  55. /************************************************************************/
  56. /* RTTI */
  57. /************************************************************************/
  58. public:
  59. friend class ManagedSerializableTypeInfoPrimitiveRTTI;
  60. static RTTITypeBase* getRTTIStatic();
  61. virtual RTTITypeBase* getRTTI() const;
  62. };
  63. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoObject : public ManagedSerializableTypeInfo
  64. {
  65. public:
  66. String mTypeNamespace;
  67. String mTypeName;
  68. bool mValueType;
  69. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  70. bool isTypeLoaded() const;
  71. ::MonoClass* getMonoClass() const;
  72. /************************************************************************/
  73. /* RTTI */
  74. /************************************************************************/
  75. public:
  76. friend class ManagedSerializableTypeInfoObjectRTTI;
  77. static RTTITypeBase* getRTTIStatic();
  78. virtual RTTITypeBase* getRTTI() const;
  79. };
  80. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoArray : public ManagedSerializableTypeInfo
  81. {
  82. public:
  83. ManagedSerializableTypeInfoPtr mElementType;
  84. UINT32 mRank;
  85. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  86. bool isTypeLoaded() const;
  87. ::MonoClass* getMonoClass() const;
  88. /************************************************************************/
  89. /* RTTI */
  90. /************************************************************************/
  91. public:
  92. friend class ManagedSerializableTypeInfoArrayRTTI;
  93. static RTTITypeBase* getRTTIStatic();
  94. virtual RTTITypeBase* getRTTI() const;
  95. };
  96. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoList : public ManagedSerializableTypeInfo
  97. {
  98. public:
  99. ManagedSerializableTypeInfoPtr mElementType;
  100. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  101. bool isTypeLoaded() const;
  102. ::MonoClass* getMonoClass() const;
  103. /************************************************************************/
  104. /* RTTI */
  105. /************************************************************************/
  106. public:
  107. friend class ManagedSerializableTypeInfoListRTTI;
  108. static RTTITypeBase* getRTTIStatic();
  109. virtual RTTITypeBase* getRTTI() const;
  110. };
  111. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoDictionary : public ManagedSerializableTypeInfo
  112. {
  113. public:
  114. ManagedSerializableTypeInfoPtr mKeyType;
  115. ManagedSerializableTypeInfoPtr mValueType;
  116. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  117. bool isTypeLoaded() const;
  118. ::MonoClass* getMonoClass() const;
  119. /************************************************************************/
  120. /* RTTI */
  121. /************************************************************************/
  122. public:
  123. friend class ManagedSerializableTypeInfoDictionaryRTTI;
  124. static RTTITypeBase* getRTTIStatic();
  125. virtual RTTITypeBase* getRTTI() const;
  126. };
  127. class BS_SCR_BE_EXPORT ManagedSerializableFieldInfo : public IReflectable
  128. {
  129. public:
  130. ManagedSerializableFieldInfo();
  131. String mName;
  132. UINT32 mFieldId;
  133. ManagedSerializableTypeInfoPtr mTypeInfo;
  134. ScriptFieldFlags mFlags;
  135. MonoField* mMonoField;
  136. bool isSerializable() const { return ((UINT32)mFlags & (UINT32)ScriptFieldFlags::Serializable) != 0; }
  137. /************************************************************************/
  138. /* RTTI */
  139. /************************************************************************/
  140. public:
  141. friend class ManagedSerializableFieldInfoRTTI;
  142. static RTTITypeBase* getRTTIStatic();
  143. virtual RTTITypeBase* getRTTI() const;
  144. };
  145. class BS_SCR_BE_EXPORT ManagedSerializableObjectInfo : public IReflectable
  146. {
  147. public:
  148. struct CachedField
  149. {
  150. CachedField(const SPtr<ManagedSerializableFieldInfo>& info, UINT32 typeId)
  151. :info(info), parentTypeId(typeId)
  152. { }
  153. SPtr<ManagedSerializableFieldInfo> info;
  154. UINT32 parentTypeId;
  155. };
  156. ManagedSerializableObjectInfo();
  157. void initialize();
  158. String getFullTypeName() const { return mTypeInfo->mTypeNamespace + "." + mTypeInfo->mTypeName; }
  159. ManagedSerializableTypeInfoObjectPtr mTypeInfo;
  160. UINT32 mTypeId;
  161. MonoClass* mMonoClass;
  162. UnorderedMap<String, UINT32> mFieldNameToId;
  163. UnorderedMap<UINT32, std::shared_ptr<ManagedSerializableFieldInfo>> mFields;
  164. std::shared_ptr<ManagedSerializableObjectInfo> mBaseClass;
  165. Vector<std::weak_ptr<ManagedSerializableObjectInfo>> mDerivedClasses;
  166. Vector<CachedField> mCachedAllFields;
  167. /************************************************************************/
  168. /* RTTI */
  169. /************************************************************************/
  170. public:
  171. friend class ManagedSerializableObjectInfoRTTI;
  172. static RTTITypeBase* getRTTIStatic();
  173. virtual RTTITypeBase* getRTTI() const;
  174. };
  175. class BS_SCR_BE_EXPORT ManagedSerializableAssemblyInfo : public IReflectable
  176. {
  177. public:
  178. String mName;
  179. UnorderedMap<String, UINT32> mTypeNameToId;
  180. UnorderedMap<UINT32, std::shared_ptr<ManagedSerializableObjectInfo>> mObjectInfos;
  181. /************************************************************************/
  182. /* RTTI */
  183. /************************************************************************/
  184. public:
  185. friend class ManagedSerializableAssemblyInfoRTTI;
  186. static RTTITypeBase* getRTTIStatic();
  187. virtual RTTITypeBase* getRTTI() const;
  188. };
  189. }