BsManagedSerializableObjectInfo.h 6.8 KB

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