BsManagedSerializableObjectInfo.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsManagedSerializableObjectInfo.h"
  4. #include "BsManagedSerializableObjectInfoRTTI.h"
  5. #include "BsMonoUtil.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsScriptTexture2D.h"
  9. #include "BsScriptSpriteTexture.h"
  10. #include "BsScriptAssemblyManager.h"
  11. #include "BsScriptTexture3D.h"
  12. #include "BsScriptTextureCube.h"
  13. #include "BsScriptMaterial.h"
  14. #include "BsScriptMesh.h"
  15. #include "BsScriptFont.h"
  16. #include "BsScriptShader.h"
  17. #include "BsScriptShaderInclude.h"
  18. #include "BsScriptPlainText.h"
  19. #include "BsScriptScriptCode.h"
  20. #include "BsScriptStringTable.h"
  21. #include "BsScriptGUISkin.h"
  22. #include "BsScriptPhysicsMaterial.h"
  23. #include "BsScriptPhysicsMesh.h"
  24. #include "BsScriptAudioClip.h"
  25. #include "BsScriptPrefab.h"
  26. #include "BsScriptManagedResource.h"
  27. namespace BansheeEngine
  28. {
  29. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTIStatic()
  30. {
  31. return ManagedSerializableAssemblyInfoRTTI::instance();
  32. }
  33. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTI() const
  34. {
  35. return ManagedSerializableAssemblyInfo::getRTTIStatic();
  36. }
  37. ManagedSerializableObjectInfo::ManagedSerializableObjectInfo()
  38. :mMonoClass(nullptr)
  39. {
  40. }
  41. SPtr<ManagedSerializableFieldInfo> ManagedSerializableObjectInfo::findMatchingField(const SPtr<ManagedSerializableFieldInfo>& fieldInfo,
  42. const SPtr<ManagedSerializableTypeInfo>& fieldTypeInfo) const
  43. {
  44. const ManagedSerializableObjectInfo* objInfo = this;
  45. while (objInfo != nullptr)
  46. {
  47. if (objInfo->mTypeInfo->matches(fieldTypeInfo))
  48. {
  49. auto iterFind = objInfo->mFieldNameToId.find(fieldInfo->mName);
  50. if (iterFind != objInfo->mFieldNameToId.end())
  51. {
  52. auto iterFind2 = objInfo->mFields.find(iterFind->second);
  53. if (iterFind2 != objInfo->mFields.end())
  54. {
  55. SPtr<ManagedSerializableFieldInfo> foundField = iterFind2->second;
  56. if (foundField->isSerializable())
  57. {
  58. if (fieldInfo->mTypeInfo->matches(foundField->mTypeInfo))
  59. return foundField;
  60. }
  61. }
  62. }
  63. return nullptr;
  64. }
  65. if (objInfo->mBaseClass != nullptr)
  66. objInfo = objInfo->mBaseClass.get();
  67. else
  68. objInfo = nullptr;
  69. }
  70. return nullptr;
  71. }
  72. RTTITypeBase* ManagedSerializableObjectInfo::getRTTIStatic()
  73. {
  74. return ManagedSerializableObjectInfoRTTI::instance();
  75. }
  76. RTTITypeBase* ManagedSerializableObjectInfo::getRTTI() const
  77. {
  78. return ManagedSerializableObjectInfo::getRTTIStatic();
  79. }
  80. ManagedSerializableFieldInfo::ManagedSerializableFieldInfo()
  81. :mFieldId(0), mFlags((ScriptFieldFlags)0), mMonoField(nullptr)
  82. {
  83. }
  84. RTTITypeBase* ManagedSerializableFieldInfo::getRTTIStatic()
  85. {
  86. return ManagedSerializableFieldInfoRTTI::instance();
  87. }
  88. RTTITypeBase* ManagedSerializableFieldInfo::getRTTI() const
  89. {
  90. return ManagedSerializableFieldInfo::getRTTIStatic();
  91. }
  92. RTTITypeBase* ManagedSerializableTypeInfo::getRTTIStatic()
  93. {
  94. return ManagedSerializableTypeInfoRTTI::instance();
  95. }
  96. RTTITypeBase* ManagedSerializableTypeInfo::getRTTI() const
  97. {
  98. return ManagedSerializableTypeInfo::getRTTIStatic();
  99. }
  100. bool ManagedSerializableTypeInfoPrimitive::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  101. {
  102. if(!rtti_is_of_type<ManagedSerializableTypeInfoPrimitive>(typeInfo))
  103. return false;
  104. auto primTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  105. return primTypeInfo->mType == mType;
  106. }
  107. bool ManagedSerializableTypeInfoPrimitive::isTypeLoaded() const
  108. {
  109. return mType < ScriptPrimitiveType::Count; // Ignoring some removed types
  110. }
  111. ::MonoClass* ManagedSerializableTypeInfoPrimitive::getMonoClass() const
  112. {
  113. switch(mType)
  114. {
  115. case ScriptPrimitiveType::Bool:
  116. return MonoUtil::getBoolClass();
  117. case ScriptPrimitiveType::Char:
  118. return MonoUtil::getCharClass();
  119. case ScriptPrimitiveType::I8:
  120. return MonoUtil::getSByteClass();
  121. case ScriptPrimitiveType::U8:
  122. return MonoUtil::getByteClass();
  123. case ScriptPrimitiveType::I16:
  124. return MonoUtil::getINT16Class();
  125. case ScriptPrimitiveType::U16:
  126. return MonoUtil::getUINT16Class();
  127. case ScriptPrimitiveType::I32:
  128. return MonoUtil::getINT32Class();
  129. case ScriptPrimitiveType::U32:
  130. return MonoUtil::getUINT32Class();
  131. case ScriptPrimitiveType::I64:
  132. return MonoUtil::getINT64Class();
  133. case ScriptPrimitiveType::U64:
  134. return MonoUtil::getUINT64Class();
  135. case ScriptPrimitiveType::Float:
  136. return MonoUtil::getFloatClass();
  137. case ScriptPrimitiveType::Double:
  138. return MonoUtil::getDoubleClass();
  139. case ScriptPrimitiveType::String:
  140. return MonoUtil::getStringClass();
  141. default:
  142. break;
  143. }
  144. return nullptr;
  145. }
  146. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTIStatic()
  147. {
  148. return ManagedSerializableTypeInfoPrimitiveRTTI::instance();
  149. }
  150. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTI() const
  151. {
  152. return ManagedSerializableTypeInfoPrimitive::getRTTIStatic();
  153. }
  154. bool ManagedSerializableTypeInfoRef::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  155. {
  156. if (!rtti_is_of_type<ManagedSerializableTypeInfoRef>(typeInfo))
  157. return false;
  158. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  159. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName;
  160. }
  161. bool ManagedSerializableTypeInfoRef::isTypeLoaded() const
  162. {
  163. switch (mType)
  164. {
  165. case ScriptReferenceType::Resource:
  166. case ScriptReferenceType::Texture2D:
  167. case ScriptReferenceType::Texture3D:
  168. case ScriptReferenceType::TextureCube:
  169. case ScriptReferenceType::SpriteTexture:
  170. case ScriptReferenceType::Shader:
  171. case ScriptReferenceType::ShaderInclude:
  172. case ScriptReferenceType::Material:
  173. case ScriptReferenceType::Mesh:
  174. case ScriptReferenceType::PlainText:
  175. case ScriptReferenceType::ScriptCode:
  176. case ScriptReferenceType::Prefab:
  177. case ScriptReferenceType::Font:
  178. case ScriptReferenceType::StringTable:
  179. case ScriptReferenceType::GUISkin:
  180. case ScriptReferenceType::PhysicsMaterial:
  181. case ScriptReferenceType::PhysicsMesh:
  182. case ScriptReferenceType::AudioClip:
  183. case ScriptReferenceType::SceneObject:
  184. case ScriptReferenceType::Component:
  185. return true;
  186. default:
  187. break;
  188. }
  189. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  190. }
  191. ::MonoClass* ManagedSerializableTypeInfoRef::getMonoClass() const
  192. {
  193. switch (mType)
  194. {
  195. case ScriptReferenceType::Resource:
  196. return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
  197. case ScriptReferenceType::Texture2D:
  198. return ScriptTexture2D::getMetaData()->scriptClass->_getInternalClass();
  199. case ScriptReferenceType::Texture3D:
  200. return ScriptTexture3D::getMetaData()->scriptClass->_getInternalClass();
  201. case ScriptReferenceType::TextureCube:
  202. return ScriptTextureCube::getMetaData()->scriptClass->_getInternalClass();
  203. case ScriptReferenceType::SpriteTexture:
  204. return ScriptSpriteTexture::getMetaData()->scriptClass->_getInternalClass();
  205. case ScriptReferenceType::Shader:
  206. return ScriptShader::getMetaData()->scriptClass->_getInternalClass();
  207. case ScriptReferenceType::ShaderInclude:
  208. return ScriptShaderInclude::getMetaData()->scriptClass->_getInternalClass();
  209. case ScriptReferenceType::Material:
  210. return ScriptMaterial::getMetaData()->scriptClass->_getInternalClass();
  211. case ScriptReferenceType::Mesh:
  212. return ScriptMesh::getMetaData()->scriptClass->_getInternalClass();
  213. case ScriptReferenceType::PlainText:
  214. return ScriptPlainText::getMetaData()->scriptClass->_getInternalClass();
  215. case ScriptReferenceType::ScriptCode:
  216. return ScriptScriptCode::getMetaData()->scriptClass->_getInternalClass();
  217. case ScriptReferenceType::Prefab:
  218. return ScriptPrefab::getMetaData()->scriptClass->_getInternalClass();
  219. case ScriptReferenceType::Font:
  220. return ScriptFont::getMetaData()->scriptClass->_getInternalClass();
  221. case ScriptReferenceType::StringTable:
  222. return ScriptStringTable::getMetaData()->scriptClass->_getInternalClass();
  223. case ScriptReferenceType::GUISkin:
  224. return ScriptGUISkin::getMetaData()->scriptClass->_getInternalClass();
  225. case ScriptReferenceType::PhysicsMaterial:
  226. return ScriptPhysicsMaterial::getMetaData()->scriptClass->_getInternalClass();
  227. case ScriptReferenceType::PhysicsMesh:
  228. return ScriptPhysicsMesh::getMetaData()->scriptClass->_getInternalClass();
  229. case ScriptReferenceType::AudioClip:
  230. return ScriptAudioClip::getMetaData()->scriptClass->_getInternalClass();
  231. case ScriptReferenceType::SceneObject:
  232. return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
  233. case ScriptReferenceType::Component:
  234. return ScriptAssemblyManager::instance().getComponentClass()->_getInternalClass();
  235. default:
  236. break;
  237. }
  238. // Custom component or resource
  239. SPtr<ManagedSerializableObjectInfo> objInfo;
  240. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  241. return nullptr;
  242. return objInfo->mMonoClass->_getInternalClass();
  243. }
  244. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTIStatic()
  245. {
  246. return ManagedSerializableTypeInfoRefRTTI::instance();
  247. }
  248. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTI() const
  249. {
  250. return ManagedSerializableTypeInfoRef::getRTTIStatic();
  251. }
  252. bool ManagedSerializableTypeInfoObject::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  253. {
  254. if(!rtti_is_of_type<ManagedSerializableTypeInfoObject>(typeInfo))
  255. return false;
  256. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  257. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName && objTypeInfo->mValueType == mValueType;
  258. }
  259. bool ManagedSerializableTypeInfoObject::isTypeLoaded() const
  260. {
  261. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  262. }
  263. ::MonoClass* ManagedSerializableTypeInfoObject::getMonoClass() const
  264. {
  265. SPtr<ManagedSerializableObjectInfo> objInfo;
  266. if(!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  267. return nullptr;
  268. return objInfo->mMonoClass->_getInternalClass();
  269. }
  270. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTIStatic()
  271. {
  272. return ManagedSerializableTypeInfoObjectRTTI::instance();
  273. }
  274. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTI() const
  275. {
  276. return ManagedSerializableTypeInfoObject::getRTTIStatic();
  277. }
  278. bool ManagedSerializableTypeInfoArray::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  279. {
  280. if(!rtti_is_of_type<ManagedSerializableTypeInfoArray>(typeInfo))
  281. return false;
  282. auto arrayTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  283. return arrayTypeInfo->mRank == mRank && arrayTypeInfo->mElementType->matches(mElementType);
  284. }
  285. bool ManagedSerializableTypeInfoArray::isTypeLoaded() const
  286. {
  287. return mElementType->isTypeLoaded();
  288. }
  289. ::MonoClass* ManagedSerializableTypeInfoArray::getMonoClass() const
  290. {
  291. ::MonoClass* elementClass = mElementType->getMonoClass();
  292. if(elementClass == nullptr)
  293. return nullptr;
  294. return ScriptArray::buildArrayClass(mElementType->getMonoClass(), mRank);
  295. }
  296. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTIStatic()
  297. {
  298. return ManagedSerializableTypeInfoArrayRTTI::instance();
  299. }
  300. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTI() const
  301. {
  302. return ManagedSerializableTypeInfoArray::getRTTIStatic();
  303. }
  304. bool ManagedSerializableTypeInfoList::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  305. {
  306. if(!rtti_is_of_type<ManagedSerializableTypeInfoList>(typeInfo))
  307. return false;
  308. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  309. return listTypeInfo->mElementType->matches(mElementType);
  310. }
  311. bool ManagedSerializableTypeInfoList::isTypeLoaded() const
  312. {
  313. return mElementType->isTypeLoaded();
  314. }
  315. ::MonoClass* ManagedSerializableTypeInfoList::getMonoClass() const
  316. {
  317. ::MonoClass* elementClass = mElementType->getMonoClass();
  318. if(elementClass == nullptr)
  319. return nullptr;
  320. MonoClass* genericListClass = ScriptAssemblyManager::instance().getSystemGenericListClass();
  321. ::MonoClass* genParams[1] = { elementClass };
  322. return MonoUtil::bindGenericParameters(genericListClass->_getInternalClass(), genParams, 1);
  323. }
  324. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTIStatic()
  325. {
  326. return ManagedSerializableTypeInfoListRTTI::instance();
  327. }
  328. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTI() const
  329. {
  330. return ManagedSerializableTypeInfoList::getRTTIStatic();
  331. }
  332. bool ManagedSerializableTypeInfoDictionary::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  333. {
  334. if(!rtti_is_of_type<ManagedSerializableTypeInfoDictionary>(typeInfo))
  335. return false;
  336. auto dictTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  337. return dictTypeInfo->mKeyType->matches(mKeyType) && dictTypeInfo->mValueType->matches(mValueType);
  338. }
  339. bool ManagedSerializableTypeInfoDictionary::isTypeLoaded() const
  340. {
  341. return mKeyType->isTypeLoaded() && mValueType->isTypeLoaded();
  342. }
  343. ::MonoClass* ManagedSerializableTypeInfoDictionary::getMonoClass() const
  344. {
  345. ::MonoClass* keyClass = mKeyType->getMonoClass();
  346. ::MonoClass* valueClass = mValueType->getMonoClass();
  347. if(keyClass == nullptr || valueClass == nullptr)
  348. return nullptr;
  349. MonoClass* genericDictionaryClass = ScriptAssemblyManager::instance().getSystemGenericDictionaryClass();
  350. ::MonoClass* params[2] = { keyClass, valueClass };
  351. return MonoUtil::bindGenericParameters(genericDictionaryClass->_getInternalClass(), params, 2);
  352. }
  353. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTIStatic()
  354. {
  355. return ManagedSerializableTypeInfoDictionaryRTTI::instance();
  356. }
  357. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTI() const
  358. {
  359. return ManagedSerializableTypeInfoDictionary::getRTTIStatic();
  360. }
  361. }