BsScriptSerializableObjectInfo.h 6.8 KB

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