BsManagedSerializableObjectInfo.h 6.7 KB

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