BsScriptSerializableObjectInfo.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "CmIReflectable.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. TextureRef,
  23. SpriteTextureRef,
  24. SceneObjectRef,
  25. ComponentRef
  26. };
  27. enum class ScriptFieldFlags
  28. {
  29. Serializable = 0x01,
  30. Inspectable = 0x02
  31. };
  32. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfo : public CM::IReflectable
  33. {
  34. public:
  35. virtual ~ScriptSerializableTypeInfo() {}
  36. virtual bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const = 0;
  37. virtual bool isTypeLoaded() const = 0;
  38. virtual bool isRawType() const = 0;
  39. virtual ::MonoClass* getMonoClass() const = 0;
  40. /************************************************************************/
  41. /* RTTI */
  42. /************************************************************************/
  43. public:
  44. friend class ScriptSerializableTypeInfoRTTI;
  45. static CM::RTTITypeBase* getRTTIStatic();
  46. virtual CM::RTTITypeBase* getRTTI() const;
  47. };
  48. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfoPrimitive : public ScriptSerializableTypeInfo
  49. {
  50. public:
  51. ScriptPrimitiveType mType;
  52. bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
  53. bool isTypeLoaded() const;
  54. bool isRawType() const;
  55. ::MonoClass* getMonoClass() const;
  56. /************************************************************************/
  57. /* RTTI */
  58. /************************************************************************/
  59. public:
  60. friend class ScriptSerializableTypeInfoPrimitiveRTTI;
  61. static CM::RTTITypeBase* getRTTIStatic();
  62. virtual CM::RTTITypeBase* getRTTI() const;
  63. };
  64. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfoObject : public ScriptSerializableTypeInfo
  65. {
  66. public:
  67. CM::String mTypeNamespace;
  68. CM::String mTypeName;
  69. bool mValueType;
  70. bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
  71. bool isTypeLoaded() const;
  72. bool isRawType() const { return false; }
  73. ::MonoClass* getMonoClass() const;
  74. /************************************************************************/
  75. /* RTTI */
  76. /************************************************************************/
  77. public:
  78. friend class ScriptSerializableTypeInfoObjectRTTI;
  79. static CM::RTTITypeBase* getRTTIStatic();
  80. virtual CM::RTTITypeBase* getRTTI() const;
  81. };
  82. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfoArray : public ScriptSerializableTypeInfo
  83. {
  84. public:
  85. ScriptSerializableTypeInfoPtr mElementType;
  86. CM::UINT32 mRank;
  87. bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
  88. bool isTypeLoaded() const;
  89. bool isRawType() const { return false; }
  90. ::MonoClass* getMonoClass() const;
  91. /************************************************************************/
  92. /* RTTI */
  93. /************************************************************************/
  94. public:
  95. friend class ScriptSerializableTypeInfoArrayRTTI;
  96. static CM::RTTITypeBase* getRTTIStatic();
  97. virtual CM::RTTITypeBase* getRTTI() const;
  98. };
  99. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfoList : public ScriptSerializableTypeInfo
  100. {
  101. public:
  102. ScriptSerializableTypeInfoPtr mElementType;
  103. bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
  104. bool isTypeLoaded() const;
  105. bool isRawType() const { return false; }
  106. ::MonoClass* getMonoClass() const;
  107. /************************************************************************/
  108. /* RTTI */
  109. /************************************************************************/
  110. public:
  111. friend class ScriptSerializableTypeInfoListRTTI;
  112. static CM::RTTITypeBase* getRTTIStatic();
  113. virtual CM::RTTITypeBase* getRTTI() const;
  114. };
  115. class BS_SCR_BE_EXPORT ScriptSerializableTypeInfoDictionary : public ScriptSerializableTypeInfo
  116. {
  117. public:
  118. ScriptSerializableTypeInfoPtr mKeyType;
  119. ScriptSerializableTypeInfoPtr mValueType;
  120. bool matches(const ScriptSerializableTypeInfoPtr& typeInfo) const;
  121. bool isTypeLoaded() const;
  122. bool isRawType() const { return false; }
  123. ::MonoClass* getMonoClass() const;
  124. /************************************************************************/
  125. /* RTTI */
  126. /************************************************************************/
  127. public:
  128. friend class ScriptSerializableTypeInfoDictionaryRTTI;
  129. static CM::RTTITypeBase* getRTTIStatic();
  130. virtual CM::RTTITypeBase* getRTTI() const;
  131. };
  132. class BS_SCR_BE_EXPORT ScriptSerializableFieldInfo : public CM::IReflectable
  133. {
  134. public:
  135. ScriptSerializableFieldInfo();
  136. CM::String mName;
  137. CM::UINT32 mFieldId;
  138. ScriptSerializableTypeInfoPtr mTypeInfo;
  139. ScriptFieldFlags mFlags;
  140. MonoField* mMonoField;
  141. bool isSerializable() const { return ((CM::UINT32)mFlags & (CM::UINT32)ScriptFieldFlags::Serializable) != 0; }
  142. /************************************************************************/
  143. /* RTTI */
  144. /************************************************************************/
  145. public:
  146. friend class ScriptSerializableFieldInfoRTTI;
  147. static CM::RTTITypeBase* getRTTIStatic();
  148. virtual CM::RTTITypeBase* getRTTI() const;
  149. };
  150. class BS_SCR_BE_EXPORT ScriptSerializableObjectInfo : public CM::IReflectable
  151. {
  152. public:
  153. ScriptSerializableObjectInfo();
  154. ScriptSerializableTypeInfoObjectPtr mTypeInfo;
  155. CM::UINT32 mTypeId;
  156. MonoClass* mMonoClass;
  157. CM::UnorderedMap<CM::String, CM::UINT32>::type mFieldNameToId;
  158. CM::UnorderedMap<CM::UINT32, std::shared_ptr<ScriptSerializableFieldInfo>>::type mFields;
  159. std::shared_ptr<ScriptSerializableObjectInfo> mBaseClass;
  160. CM::Vector<std::weak_ptr<ScriptSerializableObjectInfo>>::type mDerivedClasses;
  161. CM::String getFullTypeName() const { return mTypeInfo->mTypeNamespace + "." + mTypeInfo->mTypeName; }
  162. /************************************************************************/
  163. /* RTTI */
  164. /************************************************************************/
  165. public:
  166. friend class ScriptSerializableObjectInfoRTTI;
  167. static CM::RTTITypeBase* getRTTIStatic();
  168. virtual CM::RTTITypeBase* getRTTI() const;
  169. };
  170. class BS_SCR_BE_EXPORT ScriptSerializableAssemblyInfo : public CM::IReflectable
  171. {
  172. public:
  173. CM::String mName;
  174. CM::UnorderedMap<CM::String, CM::UINT32>::type mTypeNameToId;
  175. CM::UnorderedMap<CM::UINT32, std::shared_ptr<ScriptSerializableObjectInfo>>::type mObjectInfos;
  176. /************************************************************************/
  177. /* RTTI */
  178. /************************************************************************/
  179. public:
  180. friend class ScriptSerializableAssemblyInfoRTTI;
  181. static CM::RTTITypeBase* getRTTIStatic();
  182. virtual CM::RTTITypeBase* getRTTI() const;
  183. };
  184. }