2
0

BsManagedSerializableObjectInfo.h 6.7 KB

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