BsManagedSerializableObjectInfo.h 6.8 KB

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