BsManagedSerializableObjectInfo.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Serialization/BsManagedSerializableObjectInfo.h"
  4. #include "RTTI/BsManagedSerializableObjectInfoRTTI.h"
  5. #include "Wrappers/GUI/BsScriptRange.h"
  6. #include "Wrappers/GUI/BsScriptStep.h"
  7. #include "BsMonoUtil.h"
  8. #include "BsMonoClass.h"
  9. #include "BsMonoManager.h"
  10. #include "BsMonoField.h"
  11. #include "BsMonoProperty.h"
  12. #include "Serialization/BsScriptAssemblyManager.h"
  13. #include "Wrappers/BsScriptManagedResource.h"
  14. namespace bs
  15. {
  16. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTIStatic()
  17. {
  18. return ManagedSerializableAssemblyInfoRTTI::instance();
  19. }
  20. RTTITypeBase* ManagedSerializableAssemblyInfo::getRTTI() const
  21. {
  22. return ManagedSerializableAssemblyInfo::getRTTIStatic();
  23. }
  24. ManagedSerializableObjectInfo::ManagedSerializableObjectInfo()
  25. :mMonoClass(nullptr)
  26. {
  27. }
  28. SPtr<ManagedSerializableMemberInfo> ManagedSerializableObjectInfo::findMatchingField(const SPtr<ManagedSerializableMemberInfo>& fieldInfo,
  29. const SPtr<ManagedSerializableTypeInfo>& fieldTypeInfo) const
  30. {
  31. const ManagedSerializableObjectInfo* objInfo = this;
  32. while (objInfo != nullptr)
  33. {
  34. if (objInfo->mTypeInfo->matches(fieldTypeInfo))
  35. {
  36. auto iterFind = objInfo->mFieldNameToId.find(fieldInfo->mName);
  37. if (iterFind != objInfo->mFieldNameToId.end())
  38. {
  39. auto iterFind2 = objInfo->mFields.find(iterFind->second);
  40. if (iterFind2 != objInfo->mFields.end())
  41. {
  42. SPtr<ManagedSerializableMemberInfo> foundField = iterFind2->second;
  43. if (foundField->isSerializable())
  44. {
  45. if (fieldInfo->mTypeInfo->matches(foundField->mTypeInfo))
  46. return foundField;
  47. }
  48. }
  49. }
  50. return nullptr;
  51. }
  52. if (objInfo->mBaseClass != nullptr)
  53. objInfo = objInfo->mBaseClass.get();
  54. else
  55. objInfo = nullptr;
  56. }
  57. return nullptr;
  58. }
  59. RTTITypeBase* ManagedSerializableObjectInfo::getRTTIStatic()
  60. {
  61. return ManagedSerializableObjectInfoRTTI::instance();
  62. }
  63. RTTITypeBase* ManagedSerializableObjectInfo::getRTTI() const
  64. {
  65. return ManagedSerializableObjectInfo::getRTTIStatic();
  66. }
  67. ManagedSerializableMemberInfo::ManagedSerializableMemberInfo()
  68. :mFieldId(0), mFlags(0)
  69. {
  70. }
  71. RTTITypeBase* ManagedSerializableMemberInfo::getRTTIStatic()
  72. {
  73. return ManagedSerializableMemberInfoRTTI::instance();
  74. }
  75. RTTITypeBase* ManagedSerializableMemberInfo::getRTTI() const
  76. {
  77. return ManagedSerializableMemberInfo::getRTTIStatic();
  78. }
  79. ManagedSerializableFieldInfo::ManagedSerializableFieldInfo()
  80. :mMonoField(nullptr)
  81. {
  82. }
  83. float ManagedSerializableFieldInfo::getRangeMinimum() const
  84. {
  85. if (mFlags.isSet(ScriptFieldFlag::Range))
  86. {
  87. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  88. if (range != nullptr)
  89. {
  90. float min = 0;
  91. ScriptRange::getMinRangeField()->get(mMonoField->getAttribute(range), &min);
  92. return min;
  93. }
  94. }
  95. return 0;
  96. }
  97. float ManagedSerializableFieldInfo::getRangeMaximum() const
  98. {
  99. if (mFlags.isSet(ScriptFieldFlag::Range))
  100. {
  101. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  102. if (range != nullptr)
  103. {
  104. float max = 0;
  105. ScriptRange::getMaxRangeField()->get(mMonoField->getAttribute(range), &max);
  106. return max;
  107. }
  108. }
  109. return 0;
  110. }
  111. bool ManagedSerializableFieldInfo::renderAsSlider() const
  112. {
  113. if (mFlags.isSet(ScriptFieldFlag::Range))
  114. {
  115. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  116. if (range != nullptr)
  117. {
  118. bool slider = false;
  119. ScriptRange::getSliderField()->get(mMonoField->getAttribute(range), &slider);
  120. return slider;
  121. }
  122. }
  123. return false;
  124. }
  125. float ManagedSerializableFieldInfo::getStep() const
  126. {
  127. if (mFlags.isSet(ScriptFieldFlag::Step))
  128. {
  129. MonoClass* step = ScriptAssemblyManager::instance().getStepAttribute();
  130. if (step != nullptr)
  131. {
  132. float value = 0;
  133. ScriptStep::getStepField()->get(mMonoField->getAttribute(step), &value);
  134. return value;
  135. }
  136. }
  137. return 0;
  138. }
  139. MonoObject* ManagedSerializableFieldInfo::getValue(MonoObject* instance) const
  140. {
  141. return mMonoField->getBoxed(instance);
  142. }
  143. void ManagedSerializableFieldInfo::setValue(MonoObject* instance, void* value) const
  144. {
  145. mMonoField->set(instance, value);
  146. }
  147. RTTITypeBase* ManagedSerializableFieldInfo::getRTTIStatic()
  148. {
  149. return ManagedSerializableFieldInfoRTTI::instance();
  150. }
  151. RTTITypeBase* ManagedSerializableFieldInfo::getRTTI() const
  152. {
  153. return ManagedSerializableFieldInfo::getRTTIStatic();
  154. }
  155. ManagedSerializablePropertyInfo::ManagedSerializablePropertyInfo()
  156. :mMonoProperty(nullptr)
  157. {
  158. }
  159. float ManagedSerializablePropertyInfo::getRangeMinimum() const
  160. {
  161. if (mFlags.isSet(ScriptFieldFlag::Range))
  162. {
  163. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  164. if (range != nullptr)
  165. {
  166. float min = 0;
  167. ScriptRange::getMinRangeField()->get(mMonoProperty->getAttribute(range), &min);
  168. return min;
  169. }
  170. }
  171. return 0;
  172. }
  173. float ManagedSerializablePropertyInfo::getRangeMaximum() const
  174. {
  175. if (mFlags.isSet(ScriptFieldFlag::Range))
  176. {
  177. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  178. if (range != nullptr)
  179. {
  180. float max = 0;
  181. ScriptRange::getMaxRangeField()->get(mMonoProperty->getAttribute(range), &max);
  182. return max;
  183. }
  184. }
  185. return 0;
  186. }
  187. bool ManagedSerializablePropertyInfo::renderAsSlider() const
  188. {
  189. if (mFlags.isSet(ScriptFieldFlag::Range))
  190. {
  191. MonoClass* range = ScriptAssemblyManager::instance().getRangeAttribute();
  192. if (range != nullptr)
  193. {
  194. bool slider = false;
  195. ScriptRange::getSliderField()->get(mMonoProperty->getAttribute(range), &slider);
  196. return slider;
  197. }
  198. }
  199. return false;
  200. }
  201. float ManagedSerializablePropertyInfo::getStep() const
  202. {
  203. if (mFlags.isSet(ScriptFieldFlag::Step))
  204. {
  205. MonoClass* step = ScriptAssemblyManager::instance().getStepAttribute();
  206. if (step != nullptr)
  207. {
  208. float value = 0;
  209. ScriptStep::getStepField()->get(mMonoProperty->getAttribute(step), &value);
  210. return value;
  211. }
  212. }
  213. return 0;
  214. }
  215. MonoObject* ManagedSerializablePropertyInfo::getValue(MonoObject* instance) const
  216. {
  217. return mMonoProperty->get(instance);
  218. }
  219. void ManagedSerializablePropertyInfo::setValue(MonoObject* instance, void* value) const
  220. {
  221. mMonoProperty->set(instance, value);
  222. }
  223. RTTITypeBase* ManagedSerializablePropertyInfo::getRTTIStatic()
  224. {
  225. return ManagedSerializablePropertyInfoRTTI::instance();
  226. }
  227. RTTITypeBase* ManagedSerializablePropertyInfo::getRTTI() const
  228. {
  229. return ManagedSerializablePropertyInfo::getRTTIStatic();
  230. }
  231. RTTITypeBase* ManagedSerializableTypeInfo::getRTTIStatic()
  232. {
  233. return ManagedSerializableTypeInfoRTTI::instance();
  234. }
  235. RTTITypeBase* ManagedSerializableTypeInfo::getRTTI() const
  236. {
  237. return ManagedSerializableTypeInfo::getRTTIStatic();
  238. }
  239. bool ManagedSerializableTypeInfoPrimitive::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  240. {
  241. if(!rtti_is_of_type<ManagedSerializableTypeInfoPrimitive>(typeInfo))
  242. return false;
  243. auto primTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  244. return primTypeInfo->mType == mType;
  245. }
  246. bool ManagedSerializableTypeInfoPrimitive::isTypeLoaded() const
  247. {
  248. return mType < ScriptPrimitiveType::Count; // Ignoring some removed types
  249. }
  250. ::MonoClass* ManagedSerializableTypeInfoPrimitive::getMonoClass() const
  251. {
  252. switch(mType)
  253. {
  254. case ScriptPrimitiveType::Bool:
  255. return MonoUtil::getBoolClass();
  256. case ScriptPrimitiveType::Char:
  257. return MonoUtil::getCharClass();
  258. case ScriptPrimitiveType::I8:
  259. return MonoUtil::getSByteClass();
  260. case ScriptPrimitiveType::U8:
  261. return MonoUtil::getByteClass();
  262. case ScriptPrimitiveType::I16:
  263. return MonoUtil::getINT16Class();
  264. case ScriptPrimitiveType::U16:
  265. return MonoUtil::getUINT16Class();
  266. case ScriptPrimitiveType::I32:
  267. return MonoUtil::getINT32Class();
  268. case ScriptPrimitiveType::U32:
  269. return MonoUtil::getUINT32Class();
  270. case ScriptPrimitiveType::I64:
  271. return MonoUtil::getINT64Class();
  272. case ScriptPrimitiveType::U64:
  273. return MonoUtil::getUINT64Class();
  274. case ScriptPrimitiveType::Float:
  275. return MonoUtil::getFloatClass();
  276. case ScriptPrimitiveType::Double:
  277. return MonoUtil::getDoubleClass();
  278. case ScriptPrimitiveType::String:
  279. return MonoUtil::getStringClass();
  280. default:
  281. break;
  282. }
  283. return nullptr;
  284. }
  285. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTIStatic()
  286. {
  287. return ManagedSerializableTypeInfoPrimitiveRTTI::instance();
  288. }
  289. RTTITypeBase* ManagedSerializableTypeInfoPrimitive::getRTTI() const
  290. {
  291. return ManagedSerializableTypeInfoPrimitive::getRTTIStatic();
  292. }
  293. bool ManagedSerializableTypeInfoRef::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  294. {
  295. if (!rtti_is_of_type<ManagedSerializableTypeInfoRef>(typeInfo))
  296. return false;
  297. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  298. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName;
  299. }
  300. bool ManagedSerializableTypeInfoRef::isTypeLoaded() const
  301. {
  302. switch (mType)
  303. {
  304. case ScriptReferenceType::BuiltinResourceBase:
  305. case ScriptReferenceType::ManagedResourceBase:
  306. case ScriptReferenceType::BuiltinResource:
  307. case ScriptReferenceType::BuiltinComponentBase:
  308. case ScriptReferenceType::ManagedComponentBase:
  309. case ScriptReferenceType::BuiltinComponent:
  310. case ScriptReferenceType::SceneObject:
  311. return true;
  312. default:
  313. break;
  314. }
  315. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  316. }
  317. ::MonoClass* ManagedSerializableTypeInfoRef::getMonoClass() const
  318. {
  319. switch (mType)
  320. {
  321. case ScriptReferenceType::BuiltinResourceBase:
  322. return ScriptResource::getMetaData()->scriptClass->_getInternalClass();
  323. case ScriptReferenceType::ManagedResourceBase:
  324. return ScriptManagedResource::getMetaData()->scriptClass->_getInternalClass();
  325. case ScriptReferenceType::SceneObject:
  326. return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
  327. case ScriptReferenceType::BuiltinComponentBase:
  328. return ScriptAssemblyManager::instance().getComponentClass()->_getInternalClass();
  329. case ScriptReferenceType::ManagedComponentBase:
  330. return ScriptAssemblyManager::instance().getManagedComponentClass()->_getInternalClass();
  331. default:
  332. break;
  333. }
  334. // Specific component or resource (either builtin or custom)
  335. SPtr<ManagedSerializableObjectInfo> objInfo;
  336. if (!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  337. return nullptr;
  338. return objInfo->mMonoClass->_getInternalClass();
  339. }
  340. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTIStatic()
  341. {
  342. return ManagedSerializableTypeInfoRefRTTI::instance();
  343. }
  344. RTTITypeBase* ManagedSerializableTypeInfoRef::getRTTI() const
  345. {
  346. return ManagedSerializableTypeInfoRef::getRTTIStatic();
  347. }
  348. bool ManagedSerializableTypeInfoObject::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  349. {
  350. if(!rtti_is_of_type<ManagedSerializableTypeInfoObject>(typeInfo))
  351. return false;
  352. auto objTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  353. return objTypeInfo->mTypeNamespace == mTypeNamespace && objTypeInfo->mTypeName == mTypeName && objTypeInfo->mValueType == mValueType;
  354. }
  355. bool ManagedSerializableTypeInfoObject::isTypeLoaded() const
  356. {
  357. return ScriptAssemblyManager::instance().hasSerializableObjectInfo(mTypeNamespace, mTypeName);
  358. }
  359. ::MonoClass* ManagedSerializableTypeInfoObject::getMonoClass() const
  360. {
  361. SPtr<ManagedSerializableObjectInfo> objInfo;
  362. if(!ScriptAssemblyManager::instance().getSerializableObjectInfo(mTypeNamespace, mTypeName, objInfo))
  363. return nullptr;
  364. return objInfo->mMonoClass->_getInternalClass();
  365. }
  366. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTIStatic()
  367. {
  368. return ManagedSerializableTypeInfoObjectRTTI::instance();
  369. }
  370. RTTITypeBase* ManagedSerializableTypeInfoObject::getRTTI() const
  371. {
  372. return ManagedSerializableTypeInfoObject::getRTTIStatic();
  373. }
  374. bool ManagedSerializableTypeInfoArray::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  375. {
  376. if(!rtti_is_of_type<ManagedSerializableTypeInfoArray>(typeInfo))
  377. return false;
  378. auto arrayTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  379. return arrayTypeInfo->mRank == mRank && arrayTypeInfo->mElementType->matches(mElementType);
  380. }
  381. bool ManagedSerializableTypeInfoArray::isTypeLoaded() const
  382. {
  383. return mElementType->isTypeLoaded();
  384. }
  385. ::MonoClass* ManagedSerializableTypeInfoArray::getMonoClass() const
  386. {
  387. ::MonoClass* elementClass = mElementType->getMonoClass();
  388. if(elementClass == nullptr)
  389. return nullptr;
  390. return ScriptArray::buildArrayClass(mElementType->getMonoClass(), mRank);
  391. }
  392. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTIStatic()
  393. {
  394. return ManagedSerializableTypeInfoArrayRTTI::instance();
  395. }
  396. RTTITypeBase* ManagedSerializableTypeInfoArray::getRTTI() const
  397. {
  398. return ManagedSerializableTypeInfoArray::getRTTIStatic();
  399. }
  400. bool ManagedSerializableTypeInfoList::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  401. {
  402. if(!rtti_is_of_type<ManagedSerializableTypeInfoList>(typeInfo))
  403. return false;
  404. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  405. return listTypeInfo->mElementType->matches(mElementType);
  406. }
  407. bool ManagedSerializableTypeInfoList::isTypeLoaded() const
  408. {
  409. return mElementType->isTypeLoaded();
  410. }
  411. ::MonoClass* ManagedSerializableTypeInfoList::getMonoClass() const
  412. {
  413. ::MonoClass* elementClass = mElementType->getMonoClass();
  414. if(elementClass == nullptr)
  415. return nullptr;
  416. MonoClass* genericListClass = ScriptAssemblyManager::instance().getSystemGenericListClass();
  417. ::MonoClass* genParams[1] = { elementClass };
  418. return MonoUtil::bindGenericParameters(genericListClass->_getInternalClass(), genParams, 1);
  419. }
  420. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTIStatic()
  421. {
  422. return ManagedSerializableTypeInfoListRTTI::instance();
  423. }
  424. RTTITypeBase* ManagedSerializableTypeInfoList::getRTTI() const
  425. {
  426. return ManagedSerializableTypeInfoList::getRTTIStatic();
  427. }
  428. bool ManagedSerializableTypeInfoDictionary::matches(const SPtr<ManagedSerializableTypeInfo>& typeInfo) const
  429. {
  430. if(!rtti_is_of_type<ManagedSerializableTypeInfoDictionary>(typeInfo))
  431. return false;
  432. auto dictTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  433. return dictTypeInfo->mKeyType->matches(mKeyType) && dictTypeInfo->mValueType->matches(mValueType);
  434. }
  435. bool ManagedSerializableTypeInfoDictionary::isTypeLoaded() const
  436. {
  437. return mKeyType->isTypeLoaded() && mValueType->isTypeLoaded();
  438. }
  439. ::MonoClass* ManagedSerializableTypeInfoDictionary::getMonoClass() const
  440. {
  441. ::MonoClass* keyClass = mKeyType->getMonoClass();
  442. ::MonoClass* valueClass = mValueType->getMonoClass();
  443. if(keyClass == nullptr || valueClass == nullptr)
  444. return nullptr;
  445. MonoClass* genericDictionaryClass = ScriptAssemblyManager::instance().getSystemGenericDictionaryClass();
  446. ::MonoClass* params[2] = { keyClass, valueClass };
  447. return MonoUtil::bindGenericParameters(genericDictionaryClass->_getInternalClass(), params, 2);
  448. }
  449. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTIStatic()
  450. {
  451. return ManagedSerializableTypeInfoDictionaryRTTI::instance();
  452. }
  453. RTTITypeBase* ManagedSerializableTypeInfoDictionary::getRTTI() const
  454. {
  455. return ManagedSerializableTypeInfoDictionary::getRTTIStatic();
  456. }
  457. }