BsManagedSerializableObjectInfo.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. UINT32 mTypeId;
  77. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  78. bool isTypeLoaded() const;
  79. ::MonoClass* getMonoClass() const;
  80. /************************************************************************/
  81. /* RTTI */
  82. /************************************************************************/
  83. public:
  84. friend class ManagedSerializableTypeInfoObjectRTTI;
  85. static RTTITypeBase* getRTTIStatic();
  86. virtual RTTITypeBase* getRTTI() const;
  87. };
  88. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoArray : public ManagedSerializableTypeInfo
  89. {
  90. public:
  91. ManagedSerializableTypeInfoPtr mElementType;
  92. UINT32 mRank;
  93. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  94. bool isTypeLoaded() const;
  95. ::MonoClass* getMonoClass() const;
  96. /************************************************************************/
  97. /* RTTI */
  98. /************************************************************************/
  99. public:
  100. friend class ManagedSerializableTypeInfoArrayRTTI;
  101. static RTTITypeBase* getRTTIStatic();
  102. virtual RTTITypeBase* getRTTI() const;
  103. };
  104. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoList : public ManagedSerializableTypeInfo
  105. {
  106. public:
  107. ManagedSerializableTypeInfoPtr mElementType;
  108. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  109. bool isTypeLoaded() const;
  110. ::MonoClass* getMonoClass() const;
  111. /************************************************************************/
  112. /* RTTI */
  113. /************************************************************************/
  114. public:
  115. friend class ManagedSerializableTypeInfoListRTTI;
  116. static RTTITypeBase* getRTTIStatic();
  117. virtual RTTITypeBase* getRTTI() const;
  118. };
  119. class BS_SCR_BE_EXPORT ManagedSerializableTypeInfoDictionary : public ManagedSerializableTypeInfo
  120. {
  121. public:
  122. ManagedSerializableTypeInfoPtr mKeyType;
  123. ManagedSerializableTypeInfoPtr mValueType;
  124. bool matches(const ManagedSerializableTypeInfoPtr& typeInfo) const;
  125. bool isTypeLoaded() const;
  126. ::MonoClass* getMonoClass() const;
  127. /************************************************************************/
  128. /* RTTI */
  129. /************************************************************************/
  130. public:
  131. friend class ManagedSerializableTypeInfoDictionaryRTTI;
  132. static RTTITypeBase* getRTTIStatic();
  133. virtual RTTITypeBase* getRTTI() const;
  134. };
  135. class BS_SCR_BE_EXPORT ManagedSerializableFieldInfo : public IReflectable
  136. {
  137. public:
  138. ManagedSerializableFieldInfo();
  139. String mName;
  140. UINT32 mFieldId;
  141. UINT32 mParentTypeId;
  142. ManagedSerializableTypeInfoPtr mTypeInfo;
  143. ScriptFieldFlags mFlags;
  144. MonoField* mMonoField;
  145. bool isSerializable() const { return ((UINT32)mFlags & (UINT32)ScriptFieldFlags::Serializable) != 0; }
  146. /************************************************************************/
  147. /* RTTI */
  148. /************************************************************************/
  149. public:
  150. friend class ManagedSerializableFieldInfoRTTI;
  151. static RTTITypeBase* getRTTIStatic();
  152. virtual RTTITypeBase* getRTTI() const;
  153. };
  154. class BS_SCR_BE_EXPORT ManagedSerializableObjectInfo : public IReflectable
  155. {
  156. public:
  157. ManagedSerializableObjectInfo();
  158. String getFullTypeName() const { return mTypeInfo->mTypeNamespace + "." + mTypeInfo->mTypeName; }
  159. ManagedSerializableFieldInfoPtr findMatchingField(const ManagedSerializableFieldInfoPtr& fieldInfo,
  160. const ManagedSerializableTypeInfoPtr& fieldTypeInfo) const;
  161. ManagedSerializableTypeInfoObjectPtr mTypeInfo;
  162. MonoClass* mMonoClass;
  163. UnorderedMap<String, UINT32> mFieldNameToId;
  164. UnorderedMap<UINT32, std::shared_ptr<ManagedSerializableFieldInfo>> mFields;
  165. std::shared_ptr<ManagedSerializableObjectInfo> mBaseClass;
  166. Vector<std::weak_ptr<ManagedSerializableObjectInfo>> mDerivedClasses;
  167. /************************************************************************/
  168. /* RTTI */
  169. /************************************************************************/
  170. public:
  171. friend class ManagedSerializableObjectInfoRTTI;
  172. static RTTITypeBase* getRTTIStatic();
  173. virtual RTTITypeBase* getRTTI() const;
  174. };
  175. class BS_SCR_BE_EXPORT ManagedSerializableAssemblyInfo : public IReflectable
  176. {
  177. public:
  178. String mName;
  179. UnorderedMap<String, UINT32> mTypeNameToId;
  180. UnorderedMap<UINT32, std::shared_ptr<ManagedSerializableObjectInfo>> mObjectInfos;
  181. /************************************************************************/
  182. /* RTTI */
  183. /************************************************************************/
  184. public:
  185. friend class ManagedSerializableAssemblyInfoRTTI;
  186. static RTTITypeBase* getRTTIStatic();
  187. virtual RTTITypeBase* getRTTI() const;
  188. };
  189. }