BsManagedSerializableObjectInfo.h 6.7 KB

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