BsManagedSerializableField.cpp 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsManagedSerializableField.h"
  4. #include "BsManagedSerializableObjectInfo.h"
  5. #include "BsManagedSerializableFieldRTTI.h"
  6. #include "BsMonoUtil.h"
  7. #include "BsMonoManager.h"
  8. #include "BsScriptResourceManager.h"
  9. #include "BsScriptGameObjectManager.h"
  10. #include "BsScriptTexture2D.h"
  11. #include "BsScriptTexture3D.h"
  12. #include "BsScriptTextureCube.h"
  13. #include "BsScriptSpriteTexture.h"
  14. #include "BsScriptManagedResource.h"
  15. #include "BsScriptPlainText.h"
  16. #include "BsScriptScriptCode.h"
  17. #include "BsScriptShader.h"
  18. #include "BsScriptShaderInclude.h"
  19. #include "BsScriptMaterial.h"
  20. #include "BsScriptMesh.h"
  21. #include "BsScriptPrefab.h"
  22. #include "BsScriptFont.h"
  23. #include "BsScriptStringTable.h"
  24. #include "BsScriptGUISkin.h"
  25. #include "BsScriptPhysicsMaterial.h"
  26. #include "BsScriptPhysicsMesh.h"
  27. #include "BsScriptSceneObject.h"
  28. #include "BsScriptComponent.h"
  29. #include "BsManagedSerializableObject.h"
  30. #include "BsManagedSerializableArray.h"
  31. #include "BsManagedSerializableList.h"
  32. #include "BsManagedSerializableDictionary.h"
  33. namespace BansheeEngine
  34. {
  35. template<class T>
  36. bool compareFieldData(const T* a, const SPtr<ManagedSerializableFieldData>& b)
  37. {
  38. if (rtti_is_of_type<T>(b))
  39. {
  40. auto castObj = std::static_pointer_cast<T>(b);
  41. return a->value == castObj->value;
  42. }
  43. return false;
  44. }
  45. ManagedSerializableFieldKey::ManagedSerializableFieldKey()
  46. :mTypeId(0), mFieldId(0)
  47. { }
  48. ManagedSerializableFieldKey::ManagedSerializableFieldKey(UINT16 typeId, UINT16 fieldId)
  49. :mTypeId(typeId), mFieldId(fieldId)
  50. { }
  51. SPtr<ManagedSerializableFieldKey> ManagedSerializableFieldKey::create(UINT16 typeId, UINT16 fieldId)
  52. {
  53. SPtr<ManagedSerializableFieldKey> fieldKey = bs_shared_ptr_new<ManagedSerializableFieldKey>(typeId, fieldId);
  54. return fieldKey;
  55. }
  56. SPtr<ManagedSerializableFieldDataEntry> ManagedSerializableFieldDataEntry::create(const SPtr<ManagedSerializableFieldKey>& key, const SPtr<ManagedSerializableFieldData>& value)
  57. {
  58. SPtr<ManagedSerializableFieldDataEntry> fieldDataEntry = bs_shared_ptr_new<ManagedSerializableFieldDataEntry>();
  59. fieldDataEntry->mKey = key;
  60. fieldDataEntry->mValue = value;
  61. return fieldDataEntry;
  62. }
  63. SPtr<ManagedSerializableFieldData> ManagedSerializableFieldData::create(const SPtr<ManagedSerializableTypeInfo>& typeInfo, MonoObject* value)
  64. {
  65. return create(typeInfo, value, true);
  66. }
  67. SPtr<ManagedSerializableFieldData> ManagedSerializableFieldData::createDefault(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  68. {
  69. return create(typeInfo, nullptr, false);
  70. }
  71. template<class ResType, class ScriptType>
  72. MonoObject* getScriptResource(const HResource& value)
  73. {
  74. ResourceHandle<ResType> castValue = static_resource_cast<ResType>(value);
  75. if (castValue.isLoaded())
  76. {
  77. ScriptType* scriptResource;
  78. ScriptResourceManager::instance().getScriptResource(castValue, &scriptResource, true);
  79. return scriptResource->getManagedInstance();
  80. }
  81. else
  82. return nullptr;
  83. }
  84. template<class ScriptType>
  85. SPtr<ManagedSerializableFieldData> setScriptResource(MonoObject* value)
  86. {
  87. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  88. if (value != nullptr)
  89. {
  90. ScriptType* scriptResource = ScriptType::toNative(value);
  91. fieldData->value = scriptResource->getHandle();
  92. }
  93. return fieldData;
  94. }
  95. template<>
  96. SPtr<ManagedSerializableFieldData> setScriptResource<ScriptResourceBase>(MonoObject* value)
  97. {
  98. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  99. if (value != nullptr)
  100. {
  101. ScriptResourceBase* scriptResource = ScriptResource::toNative(value);
  102. fieldData->value = scriptResource->getGenericHandle();
  103. }
  104. return fieldData;
  105. }
  106. struct ResourceFieldDataAccessors
  107. {
  108. std::function<MonoObject*(const HResource&)> getter;
  109. std::function<SPtr<ManagedSerializableFieldData>(MonoObject*)> setter;
  110. };
  111. ResourceFieldDataAccessors* getResourceFieldLookup()
  112. {
  113. static ResourceFieldDataAccessors lookup[(int)ScriptReferenceType::Count];
  114. static bool initialized = false;
  115. if(!initialized)
  116. {
  117. lookup[(int)ScriptReferenceType::Resource] =
  118. { &getScriptResource<Resource, ScriptResourceBase>, &setScriptResource<ScriptResourceBase> };
  119. lookup[(int)ScriptReferenceType::Texture2D] =
  120. { &getScriptResource<Texture, ScriptTexture2D>, &setScriptResource<ScriptTexture2D> };
  121. lookup[(int)ScriptReferenceType::Texture3D] =
  122. { &getScriptResource<Texture, ScriptTexture3D>, &setScriptResource<ScriptTexture3D> };
  123. lookup[(int)ScriptReferenceType::TextureCube] =
  124. { &getScriptResource<Texture, ScriptTextureCube>, &setScriptResource<ScriptTextureCube> };
  125. lookup[(int)ScriptReferenceType::SpriteTexture] =
  126. { &getScriptResource<SpriteTexture, ScriptSpriteTexture>, &setScriptResource<ScriptSpriteTexture> };
  127. lookup[(int)ScriptReferenceType::Shader] =
  128. { &getScriptResource<Shader, ScriptShader>, &setScriptResource<ScriptShader> };
  129. lookup[(int)ScriptReferenceType::ShaderInclude] =
  130. { &getScriptResource<ShaderInclude, ScriptShaderInclude>, &setScriptResource<ScriptShaderInclude> };
  131. lookup[(int)ScriptReferenceType::Material] =
  132. { &getScriptResource<Material, ScriptMaterial>, &setScriptResource<ScriptMaterial> };
  133. lookup[(int)ScriptReferenceType::Mesh] =
  134. { &getScriptResource<Mesh, ScriptMesh>, &setScriptResource<ScriptMesh> };
  135. lookup[(int)ScriptReferenceType::Prefab] =
  136. { &getScriptResource<Prefab, ScriptPrefab>, &setScriptResource<ScriptPrefab> };
  137. lookup[(int)ScriptReferenceType::Font] =
  138. { &getScriptResource<Font, ScriptFont>, &setScriptResource<ScriptFont> };
  139. lookup[(int)ScriptReferenceType::StringTable] =
  140. { &getScriptResource<StringTable, ScriptStringTable>, &setScriptResource<ScriptStringTable> };
  141. lookup[(int)ScriptReferenceType::GUISkin] =
  142. { &getScriptResource<GUISkin, ScriptGUISkin>, &setScriptResource<ScriptGUISkin> };
  143. lookup[(int)ScriptReferenceType::PhysicsMaterial] =
  144. { &getScriptResource<PhysicsMaterial, ScriptPhysicsMaterial>, &setScriptResource<ScriptPhysicsMaterial> };
  145. lookup[(int)ScriptReferenceType::PhysicsMesh] =
  146. { &getScriptResource<PhysicsMesh, ScriptPhysicsMesh>, &setScriptResource<ScriptPhysicsMesh> };
  147. lookup[(int)ScriptReferenceType::ManagedResource] =
  148. { &getScriptResource<ManagedResource, ScriptManagedResource>, &setScriptResource<ScriptManagedResource> };
  149. lookup[(int)ScriptReferenceType::PlainText] =
  150. { &getScriptResource<PlainText, ScriptPlainText>, &setScriptResource<ScriptPlainText> };
  151. lookup[(int)ScriptReferenceType::ScriptCode] =
  152. { &getScriptResource<ScriptCode, ScriptScriptCode>, &setScriptResource<ScriptScriptCode> };
  153. }
  154. return lookup;
  155. }
  156. SPtr<ManagedSerializableFieldData> ManagedSerializableFieldData::create(const SPtr<ManagedSerializableTypeInfo>& typeInfo, MonoObject* value, bool allowNull)
  157. {
  158. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  159. {
  160. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  161. switch (primitiveTypeInfo->mType)
  162. {
  163. case ScriptPrimitiveType::Bool:
  164. {
  165. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
  166. if(value != nullptr)
  167. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  168. return fieldData;
  169. }
  170. case ScriptPrimitiveType::Char:
  171. {
  172. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataChar>();
  173. if(value != nullptr)
  174. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  175. return fieldData;
  176. }
  177. case ScriptPrimitiveType::I8:
  178. {
  179. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI8>();
  180. if(value != nullptr)
  181. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  182. return fieldData;
  183. }
  184. case ScriptPrimitiveType::U8:
  185. {
  186. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU8>();
  187. if(value != nullptr)
  188. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  189. return fieldData;
  190. }
  191. case ScriptPrimitiveType::I16:
  192. {
  193. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI16>();
  194. if(value != nullptr)
  195. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  196. return fieldData;
  197. }
  198. case ScriptPrimitiveType::U16:
  199. {
  200. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU16>();
  201. if(value != nullptr)
  202. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  203. return fieldData;
  204. }
  205. case ScriptPrimitiveType::I32:
  206. {
  207. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI32>();
  208. if(value != nullptr)
  209. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  210. return fieldData;
  211. }
  212. case ScriptPrimitiveType::U32:
  213. {
  214. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU32>();
  215. if(value != nullptr)
  216. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  217. return fieldData;
  218. }
  219. case ScriptPrimitiveType::I64:
  220. {
  221. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI64>();
  222. if(value != nullptr)
  223. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  224. return fieldData;
  225. }
  226. case ScriptPrimitiveType::U64:
  227. {
  228. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU64>();
  229. if(value != nullptr)
  230. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  231. return fieldData;
  232. }
  233. case ScriptPrimitiveType::Float:
  234. {
  235. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataFloat>();
  236. if(value != nullptr)
  237. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  238. return fieldData;
  239. }
  240. case ScriptPrimitiveType::Double:
  241. {
  242. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataDouble>();
  243. if(value != nullptr)
  244. memcpy(&fieldData->value, MonoUtil::unbox(value), sizeof(fieldData->value));
  245. return fieldData;
  246. }
  247. case ScriptPrimitiveType::String:
  248. {
  249. MonoString* strVal = (MonoString*)(value);
  250. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataString>();
  251. if (strVal != nullptr)
  252. fieldData->value = MonoUtil::monoToWString(strVal);
  253. else
  254. fieldData->isNull = allowNull;
  255. return fieldData;
  256. }
  257. default:
  258. break;
  259. }
  260. }
  261. else if (typeInfo->getTypeId() == TID_SerializableTypeInfoRef)
  262. {
  263. auto refTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  264. switch (refTypeInfo->mType)
  265. {
  266. case ScriptReferenceType::SceneObject:
  267. {
  268. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
  269. if (value != nullptr)
  270. {
  271. ScriptSceneObject* scriptSceneObject = ScriptSceneObject::toNative(value);
  272. fieldData->value = static_object_cast<SceneObject>(scriptSceneObject->getNativeHandle());
  273. }
  274. return fieldData;
  275. }
  276. case ScriptReferenceType::ManagedComponent:
  277. case ScriptReferenceType::Component:
  278. {
  279. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
  280. if (value != nullptr)
  281. {
  282. ScriptComponent* scriptComponent = ScriptComponent::toNative(value);
  283. fieldData->value = static_object_cast<Component>(scriptComponent->getNativeHandle());
  284. }
  285. return fieldData;
  286. }
  287. default:
  288. // Must be a resource
  289. return getResourceFieldLookup()[(int)refTypeInfo->mType].setter(value);
  290. }
  291. }
  292. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  293. {
  294. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataObject>();
  295. if (value != nullptr)
  296. fieldData->value = ManagedSerializableObject::createFromExisting(value);
  297. else if (!allowNull)
  298. fieldData->value = ManagedSerializableObject::createNew(std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo));
  299. return fieldData;
  300. }
  301. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
  302. {
  303. SPtr<ManagedSerializableTypeInfoArray> arrayTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  304. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataArray>();
  305. if(value != nullptr)
  306. fieldData->value = ManagedSerializableArray::createFromExisting(value, arrayTypeInfo);
  307. else if (!allowNull)
  308. {
  309. Vector<UINT32> sizes(arrayTypeInfo->mRank, 0);
  310. fieldData->value = ManagedSerializableArray::createNew(arrayTypeInfo, sizes);
  311. }
  312. return fieldData;
  313. }
  314. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
  315. {
  316. SPtr<ManagedSerializableTypeInfoList> listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  317. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataList>();
  318. if(value != nullptr)
  319. fieldData->value = ManagedSerializableList::createFromExisting(value, listTypeInfo);
  320. else if (!allowNull)
  321. fieldData->value = ManagedSerializableList::createNew(listTypeInfo, 0);
  322. return fieldData;
  323. }
  324. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
  325. {
  326. SPtr<ManagedSerializableTypeInfoDictionary> dictTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  327. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataDictionary>();
  328. if(value != nullptr)
  329. fieldData->value = ManagedSerializableDictionary::createFromExisting(value, dictTypeInfo);
  330. else if (!allowNull)
  331. fieldData->value = ManagedSerializableDictionary::createNew(dictTypeInfo);
  332. return fieldData;
  333. }
  334. return nullptr;
  335. }
  336. void* ManagedSerializableFieldDataBool::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  337. {
  338. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  339. {
  340. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  341. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Bool)
  342. return &value;
  343. }
  344. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  345. return nullptr;
  346. }
  347. void* ManagedSerializableFieldDataChar::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  348. {
  349. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  350. {
  351. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  352. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Char)
  353. return &value;
  354. }
  355. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  356. return nullptr;
  357. }
  358. void* ManagedSerializableFieldDataI8::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  359. {
  360. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  361. {
  362. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  363. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I8)
  364. return &value;
  365. }
  366. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  367. return nullptr;
  368. }
  369. void* ManagedSerializableFieldDataU8::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  370. {
  371. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  372. {
  373. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  374. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U8)
  375. return &value;
  376. }
  377. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  378. return nullptr;
  379. }
  380. void* ManagedSerializableFieldDataI16::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  381. {
  382. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  383. {
  384. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  385. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I16)
  386. return &value;
  387. }
  388. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  389. return nullptr;
  390. }
  391. void* ManagedSerializableFieldDataU16::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  392. {
  393. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  394. {
  395. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  396. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U16)
  397. return &value;
  398. }
  399. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  400. return nullptr;
  401. }
  402. void* ManagedSerializableFieldDataI32::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  403. {
  404. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  405. {
  406. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  407. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I32)
  408. return &value;
  409. }
  410. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  411. return nullptr;
  412. }
  413. void* ManagedSerializableFieldDataU32::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  414. {
  415. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  416. {
  417. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  418. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U32)
  419. return &value;
  420. }
  421. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  422. return nullptr;
  423. }
  424. void* ManagedSerializableFieldDataI64::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  425. {
  426. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  427. {
  428. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  429. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I64)
  430. return &value;
  431. }
  432. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  433. return nullptr;
  434. }
  435. void* ManagedSerializableFieldDataU64::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  436. {
  437. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  438. {
  439. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  440. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U64)
  441. return &value;
  442. }
  443. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  444. return nullptr;
  445. }
  446. void* ManagedSerializableFieldDataFloat::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  447. {
  448. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  449. {
  450. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  451. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Float)
  452. return &value;
  453. }
  454. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  455. return nullptr;
  456. }
  457. void* ManagedSerializableFieldDataDouble::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  458. {
  459. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  460. {
  461. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  462. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Double)
  463. return &value;
  464. }
  465. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  466. return nullptr;
  467. }
  468. void* ManagedSerializableFieldDataString::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  469. {
  470. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  471. {
  472. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  473. if(primitiveTypeInfo->mType == ScriptPrimitiveType::String)
  474. {
  475. if (!isNull)
  476. return MonoUtil::wstringToMono(value);
  477. else
  478. return nullptr;
  479. }
  480. }
  481. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  482. return nullptr;
  483. }
  484. void* ManagedSerializableFieldDataResourceRef::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  485. {
  486. if(typeInfo->getTypeId() == TID_SerializableTypeInfoRef)
  487. {
  488. auto refTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  489. return getResourceFieldLookup()[(int)refTypeInfo->mType].getter(value);
  490. }
  491. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  492. return nullptr;
  493. }
  494. void* ManagedSerializableFieldDataGameObjectRef::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  495. {
  496. if(typeInfo->getTypeId() == TID_SerializableTypeInfoRef)
  497. {
  498. auto refTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoRef>(typeInfo);
  499. if(refTypeInfo->mType == ScriptReferenceType::SceneObject)
  500. {
  501. if(value)
  502. {
  503. ScriptSceneObject* scriptSceneObject = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(value);
  504. return scriptSceneObject->getManagedInstance();
  505. }
  506. else
  507. return nullptr;
  508. }
  509. else if(refTypeInfo->mType == ScriptReferenceType::Component || refTypeInfo->mType == ScriptReferenceType::ManagedComponent)
  510. {
  511. if (value)
  512. {
  513. ScriptComponent* scriptComponent = ScriptGameObjectManager::instance().getScriptComponent(value);
  514. assert(scriptComponent != nullptr);
  515. return scriptComponent->getManagedInstance();
  516. }
  517. else
  518. return nullptr;
  519. }
  520. }
  521. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  522. return nullptr;
  523. }
  524. void* ManagedSerializableFieldDataObject::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  525. {
  526. if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  527. {
  528. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  529. if(value != nullptr)
  530. {
  531. if(objectTypeInfo->mValueType)
  532. {
  533. MonoObject* managedInstance = value->getManagedInstance();
  534. if(managedInstance != nullptr)
  535. return MonoUtil::unbox(managedInstance); // Structs are passed as raw types because mono expects them as such
  536. }
  537. else
  538. return value->getManagedInstance();
  539. }
  540. return nullptr;
  541. }
  542. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  543. return nullptr;
  544. }
  545. void* ManagedSerializableFieldDataArray::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  546. {
  547. if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
  548. {
  549. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  550. if(value != nullptr)
  551. return value->getManagedInstance();
  552. return nullptr;
  553. }
  554. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  555. return nullptr;
  556. }
  557. void* ManagedSerializableFieldDataList::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  558. {
  559. if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
  560. {
  561. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  562. if(value != nullptr)
  563. return value->getManagedInstance();
  564. return nullptr;
  565. }
  566. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  567. return nullptr;
  568. }
  569. void* ManagedSerializableFieldDataDictionary::getValue(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  570. {
  571. if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
  572. {
  573. auto dictionaryTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  574. if(value != nullptr)
  575. return value->getManagedInstance();
  576. return nullptr;
  577. }
  578. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  579. return nullptr;
  580. }
  581. MonoObject* ManagedSerializableFieldDataBool::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  582. {
  583. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  584. {
  585. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  586. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Bool)
  587. return MonoUtil::box(MonoUtil::getBoolClass(), &value);
  588. }
  589. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  590. return nullptr;
  591. }
  592. MonoObject* ManagedSerializableFieldDataChar::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  593. {
  594. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  595. {
  596. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  597. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Char)
  598. return MonoUtil::box(MonoUtil::getCharClass(), &value);
  599. }
  600. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  601. return nullptr;
  602. }
  603. MonoObject* ManagedSerializableFieldDataI8::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  604. {
  605. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  606. {
  607. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  608. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I8)
  609. return MonoUtil::box(MonoUtil::getSByteClass(), &value);
  610. }
  611. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  612. return nullptr;
  613. }
  614. MonoObject* ManagedSerializableFieldDataU8::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  615. {
  616. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  617. {
  618. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  619. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U8)
  620. return MonoUtil::box(MonoUtil::getByteClass(), &value);
  621. }
  622. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  623. return nullptr;
  624. }
  625. MonoObject* ManagedSerializableFieldDataI16::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  626. {
  627. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  628. {
  629. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  630. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I16)
  631. return MonoUtil::box(MonoUtil::getINT16Class(), &value);
  632. }
  633. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  634. return nullptr;
  635. }
  636. MonoObject* ManagedSerializableFieldDataU16::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  637. {
  638. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  639. {
  640. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  641. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U16)
  642. return MonoUtil::box(MonoUtil::getUINT16Class(), &value);
  643. }
  644. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  645. return nullptr;
  646. }
  647. MonoObject* ManagedSerializableFieldDataI32::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  648. {
  649. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  650. {
  651. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  652. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I32)
  653. return MonoUtil::box(MonoUtil::getINT32Class(), &value);
  654. }
  655. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  656. return nullptr;
  657. }
  658. MonoObject* ManagedSerializableFieldDataU32::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  659. {
  660. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  661. {
  662. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  663. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U32)
  664. return MonoUtil::box(MonoUtil::getUINT32Class(), &value);
  665. }
  666. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  667. return nullptr;
  668. }
  669. MonoObject* ManagedSerializableFieldDataI64::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  670. {
  671. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  672. {
  673. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  674. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I64)
  675. return MonoUtil::box(MonoUtil::getINT64Class(), &value);
  676. }
  677. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  678. return nullptr;
  679. }
  680. MonoObject* ManagedSerializableFieldDataU64::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  681. {
  682. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  683. {
  684. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  685. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U64)
  686. return MonoUtil::box(MonoUtil::getUINT64Class(), &value);
  687. }
  688. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  689. return nullptr;
  690. }
  691. MonoObject* ManagedSerializableFieldDataFloat::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  692. {
  693. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  694. {
  695. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  696. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Float)
  697. return MonoUtil::box(MonoUtil::getFloatClass(), &value);
  698. }
  699. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  700. return nullptr;
  701. }
  702. MonoObject* ManagedSerializableFieldDataDouble::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  703. {
  704. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  705. {
  706. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  707. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Double)
  708. return MonoUtil::box(MonoUtil::getDoubleClass(), &value);
  709. }
  710. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  711. return nullptr;
  712. }
  713. MonoObject* ManagedSerializableFieldDataString::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  714. {
  715. return (MonoObject*)getValue(typeInfo);
  716. }
  717. MonoObject* ManagedSerializableFieldDataResourceRef::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  718. {
  719. return (MonoObject*)getValue(typeInfo);
  720. }
  721. MonoObject* ManagedSerializableFieldDataGameObjectRef::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  722. {
  723. return (MonoObject*)getValue(typeInfo);
  724. }
  725. MonoObject* ManagedSerializableFieldDataObject::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  726. {
  727. if (typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  728. {
  729. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  730. if (value != nullptr)
  731. return value->getManagedInstance();
  732. return nullptr;
  733. }
  734. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  735. return nullptr;
  736. }
  737. MonoObject* ManagedSerializableFieldDataArray::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  738. {
  739. return (MonoObject*)getValue(typeInfo);
  740. }
  741. MonoObject* ManagedSerializableFieldDataList::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  742. {
  743. return (MonoObject*)getValue(typeInfo);
  744. }
  745. MonoObject* ManagedSerializableFieldDataDictionary::getValueBoxed(const SPtr<ManagedSerializableTypeInfo>& typeInfo)
  746. {
  747. return (MonoObject*)getValue(typeInfo);
  748. }
  749. bool ManagedSerializableFieldDataBool::equals(const SPtr<ManagedSerializableFieldData>& other)
  750. {
  751. return compareFieldData(this, other);
  752. }
  753. bool ManagedSerializableFieldDataChar::equals(const SPtr<ManagedSerializableFieldData>& other)
  754. {
  755. return compareFieldData(this, other);
  756. }
  757. bool ManagedSerializableFieldDataI8::equals(const SPtr<ManagedSerializableFieldData>& other)
  758. {
  759. return compareFieldData(this, other);
  760. }
  761. bool ManagedSerializableFieldDataU8::equals(const SPtr<ManagedSerializableFieldData>& other)
  762. {
  763. return compareFieldData(this, other);
  764. }
  765. bool ManagedSerializableFieldDataI16::equals(const SPtr<ManagedSerializableFieldData>& other)
  766. {
  767. return compareFieldData(this, other);
  768. }
  769. bool ManagedSerializableFieldDataU16::equals(const SPtr<ManagedSerializableFieldData>& other)
  770. {
  771. return compareFieldData(this, other);
  772. }
  773. bool ManagedSerializableFieldDataI32::equals(const SPtr<ManagedSerializableFieldData>& other)
  774. {
  775. return compareFieldData(this, other);
  776. }
  777. bool ManagedSerializableFieldDataU32::equals(const SPtr<ManagedSerializableFieldData>& other)
  778. {
  779. return compareFieldData(this, other);
  780. }
  781. bool ManagedSerializableFieldDataI64::equals(const SPtr<ManagedSerializableFieldData>& other)
  782. {
  783. return compareFieldData(this, other);
  784. }
  785. bool ManagedSerializableFieldDataU64::equals(const SPtr<ManagedSerializableFieldData>& other)
  786. {
  787. return compareFieldData(this, other);
  788. }
  789. bool ManagedSerializableFieldDataFloat::equals(const SPtr<ManagedSerializableFieldData>& other)
  790. {
  791. return compareFieldData(this, other);
  792. }
  793. bool ManagedSerializableFieldDataDouble::equals(const SPtr<ManagedSerializableFieldData>& other)
  794. {
  795. return compareFieldData(this, other);
  796. }
  797. bool ManagedSerializableFieldDataString::equals(const SPtr<ManagedSerializableFieldData>& other)
  798. {
  799. if (rtti_is_of_type<ManagedSerializableFieldDataString>(other))
  800. {
  801. auto castObj = std::static_pointer_cast<ManagedSerializableFieldDataString>(other);
  802. return (isNull == true && isNull == castObj->isNull) || value == castObj->value;
  803. }
  804. return false;
  805. }
  806. bool ManagedSerializableFieldDataResourceRef::equals(const SPtr<ManagedSerializableFieldData>& other)
  807. {
  808. return compareFieldData(this, other);
  809. }
  810. bool ManagedSerializableFieldDataGameObjectRef::equals(const SPtr<ManagedSerializableFieldData>& other)
  811. {
  812. return compareFieldData(this, other);
  813. }
  814. bool ManagedSerializableFieldDataObject::equals(const SPtr<ManagedSerializableFieldData>& other)
  815. {
  816. return compareFieldData(this, other);
  817. }
  818. bool ManagedSerializableFieldDataArray::equals(const SPtr<ManagedSerializableFieldData>& other)
  819. {
  820. return compareFieldData(this, other);
  821. }
  822. bool ManagedSerializableFieldDataList::equals(const SPtr<ManagedSerializableFieldData>& other)
  823. {
  824. return compareFieldData(this, other);
  825. }
  826. bool ManagedSerializableFieldDataDictionary::equals(const SPtr<ManagedSerializableFieldData>& other)
  827. {
  828. return compareFieldData(this, other);
  829. }
  830. size_t ManagedSerializableFieldDataBool::getHash()
  831. {
  832. std::hash<bool> hasher;
  833. return hasher(value);
  834. }
  835. size_t ManagedSerializableFieldDataChar::getHash()
  836. {
  837. std::hash<wchar_t> hasher;
  838. return hasher(value);
  839. }
  840. size_t ManagedSerializableFieldDataI8::getHash()
  841. {
  842. std::hash<INT8> hasher;
  843. return hasher(value);
  844. }
  845. size_t ManagedSerializableFieldDataU8::getHash()
  846. {
  847. std::hash<UINT8> hasher;
  848. return hasher(value);
  849. }
  850. size_t ManagedSerializableFieldDataI16::getHash()
  851. {
  852. std::hash<INT16> hasher;
  853. return hasher(value);
  854. }
  855. size_t ManagedSerializableFieldDataU16::getHash()
  856. {
  857. std::hash<UINT16> hasher;
  858. return hasher(value);
  859. }
  860. size_t ManagedSerializableFieldDataI32::getHash()
  861. {
  862. std::hash<INT32> hasher;
  863. return hasher(value);
  864. }
  865. size_t ManagedSerializableFieldDataU32::getHash()
  866. {
  867. std::hash<UINT32> hasher;
  868. return hasher(value);
  869. }
  870. size_t ManagedSerializableFieldDataI64::getHash()
  871. {
  872. std::hash<INT64> hasher;
  873. return hasher(value);
  874. }
  875. size_t ManagedSerializableFieldDataU64::getHash()
  876. {
  877. std::hash<UINT64> hasher;
  878. return hasher(value);
  879. }
  880. size_t ManagedSerializableFieldDataFloat::getHash()
  881. {
  882. std::hash<float> hasher;
  883. return hasher(value);
  884. }
  885. size_t ManagedSerializableFieldDataDouble::getHash()
  886. {
  887. std::hash<double> hasher;
  888. return hasher(value);
  889. }
  890. size_t ManagedSerializableFieldDataString::getHash()
  891. {
  892. std::hash<WString> hasher;
  893. return hasher(value);
  894. }
  895. size_t ManagedSerializableFieldDataResourceRef::getHash()
  896. {
  897. std::hash<String> hasher;
  898. return hasher(value.getUUID());
  899. }
  900. size_t ManagedSerializableFieldDataGameObjectRef::getHash()
  901. {
  902. std::hash<UINT64> hasher;
  903. return hasher(value.getInstanceId());
  904. }
  905. size_t ManagedSerializableFieldDataObject::getHash()
  906. {
  907. std::hash<SPtr<ManagedSerializableObject>> hasher;
  908. return hasher(value);
  909. }
  910. size_t ManagedSerializableFieldDataArray::getHash()
  911. {
  912. std::hash<SPtr<ManagedSerializableArray>> hasher;
  913. return hasher(value);
  914. }
  915. size_t ManagedSerializableFieldDataList::getHash()
  916. {
  917. std::hash<SPtr<ManagedSerializableList>> hasher;
  918. return hasher(value);
  919. }
  920. size_t ManagedSerializableFieldDataDictionary::getHash()
  921. {
  922. std::hash<SPtr<ManagedSerializableDictionary>> hasher;
  923. return hasher(value);
  924. }
  925. void ManagedSerializableFieldDataObject::serialize()
  926. {
  927. if (value != nullptr)
  928. value->serialize();
  929. }
  930. void ManagedSerializableFieldDataObject::deserialize()
  931. {
  932. if (value != nullptr)
  933. value->deserialize();
  934. }
  935. void ManagedSerializableFieldDataArray::serialize()
  936. {
  937. if (value != nullptr)
  938. value->serialize();
  939. }
  940. void ManagedSerializableFieldDataArray::deserialize()
  941. {
  942. if (value != nullptr)
  943. value->deserialize();
  944. }
  945. void ManagedSerializableFieldDataList::serialize()
  946. {
  947. if (value != nullptr)
  948. value->serialize();
  949. }
  950. void ManagedSerializableFieldDataList::deserialize()
  951. {
  952. if (value != nullptr)
  953. value->deserialize();
  954. }
  955. void ManagedSerializableFieldDataDictionary::serialize()
  956. {
  957. if (value != nullptr)
  958. value->serialize();
  959. }
  960. void ManagedSerializableFieldDataDictionary::deserialize()
  961. {
  962. if (value != nullptr)
  963. value->deserialize();
  964. }
  965. RTTITypeBase* ManagedSerializableFieldKey::getRTTIStatic()
  966. {
  967. return ManagedSerializableFieldKeyRTTI::instance();
  968. }
  969. RTTITypeBase* ManagedSerializableFieldKey::getRTTI() const
  970. {
  971. return ManagedSerializableFieldKey::getRTTIStatic();
  972. }
  973. RTTITypeBase* ManagedSerializableFieldData::getRTTIStatic()
  974. {
  975. return ManagedSerializableFieldDataRTTI::instance();
  976. }
  977. RTTITypeBase* ManagedSerializableFieldData::getRTTI() const
  978. {
  979. return ManagedSerializableFieldData::getRTTIStatic();
  980. }
  981. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTIStatic()
  982. {
  983. return ManagedSerializableFieldDataEntryRTTI::instance();
  984. }
  985. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTI() const
  986. {
  987. return ManagedSerializableFieldDataEntry::getRTTIStatic();
  988. }
  989. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTIStatic()
  990. {
  991. return ManagedSerializableFieldDataBoolRTTI::instance();
  992. }
  993. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTI() const
  994. {
  995. return ManagedSerializableFieldDataBool::getRTTIStatic();
  996. }
  997. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTIStatic()
  998. {
  999. return ManagedSerializableFieldDataCharRTTI::instance();
  1000. }
  1001. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTI() const
  1002. {
  1003. return ManagedSerializableFieldDataChar::getRTTIStatic();
  1004. }
  1005. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTIStatic()
  1006. {
  1007. return ManagedSerializableFieldDataI8RTTI::instance();
  1008. }
  1009. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTI() const
  1010. {
  1011. return ManagedSerializableFieldDataI8::getRTTIStatic();
  1012. }
  1013. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTIStatic()
  1014. {
  1015. return ManagedSerializableFieldDataU8RTTI::instance();
  1016. }
  1017. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTI() const
  1018. {
  1019. return ManagedSerializableFieldDataU8::getRTTIStatic();
  1020. }
  1021. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTIStatic()
  1022. {
  1023. return ManagedSerializableFieldDataI16RTTI::instance();
  1024. }
  1025. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTI() const
  1026. {
  1027. return ManagedSerializableFieldDataI16::getRTTIStatic();
  1028. }
  1029. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTIStatic()
  1030. {
  1031. return ManagedSerializableFieldDataU16RTTI::instance();
  1032. }
  1033. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTI() const
  1034. {
  1035. return ManagedSerializableFieldDataU16::getRTTIStatic();
  1036. }
  1037. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTIStatic()
  1038. {
  1039. return ManagedSerializableFieldDataI32RTTI::instance();
  1040. }
  1041. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTI() const
  1042. {
  1043. return ManagedSerializableFieldDataI32::getRTTIStatic();
  1044. }
  1045. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTIStatic()
  1046. {
  1047. return ManagedSerializableFieldDataU32RTTI::instance();
  1048. }
  1049. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTI() const
  1050. {
  1051. return ManagedSerializableFieldDataU32::getRTTIStatic();
  1052. }
  1053. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTIStatic()
  1054. {
  1055. return ManagedSerializableFieldDataI64RTTI::instance();
  1056. }
  1057. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTI() const
  1058. {
  1059. return ManagedSerializableFieldDataI64::getRTTIStatic();
  1060. }
  1061. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTIStatic()
  1062. {
  1063. return ManagedSerializableFieldDataU64RTTI::instance();
  1064. }
  1065. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTI() const
  1066. {
  1067. return ManagedSerializableFieldDataU64::getRTTIStatic();
  1068. }
  1069. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTIStatic()
  1070. {
  1071. return ManagedSerializableFieldDataFloatRTTI::instance();
  1072. }
  1073. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTI() const
  1074. {
  1075. return ManagedSerializableFieldDataFloat::getRTTIStatic();
  1076. }
  1077. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTIStatic()
  1078. {
  1079. return ManagedSerializableFieldDataDoubleRTTI::instance();
  1080. }
  1081. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTI() const
  1082. {
  1083. return ManagedSerializableFieldDataDouble::getRTTIStatic();
  1084. }
  1085. RTTITypeBase* ManagedSerializableFieldDataString::getRTTIStatic()
  1086. {
  1087. return ManagedSerializableFieldDataStringRTTI::instance();
  1088. }
  1089. RTTITypeBase* ManagedSerializableFieldDataString::getRTTI() const
  1090. {
  1091. return ManagedSerializableFieldDataString::getRTTIStatic();
  1092. }
  1093. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTIStatic()
  1094. {
  1095. return ManagedSerializableFieldDataResourceRefRTTI::instance();
  1096. }
  1097. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTI() const
  1098. {
  1099. return ManagedSerializableFieldDataResourceRef::getRTTIStatic();
  1100. }
  1101. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTIStatic()
  1102. {
  1103. return ManagedSerializableFieldDataGameObjectRefRTTI::instance();
  1104. }
  1105. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTI() const
  1106. {
  1107. return ManagedSerializableFieldDataGameObjectRef::getRTTIStatic();
  1108. }
  1109. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTIStatic()
  1110. {
  1111. return ManagedSerializableFieldDataObjectRTTI::instance();
  1112. }
  1113. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTI() const
  1114. {
  1115. return ManagedSerializableFieldDataObject::getRTTIStatic();
  1116. }
  1117. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTIStatic()
  1118. {
  1119. return ManagedSerializableFieldDataArrayRTTI::instance();
  1120. }
  1121. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTI() const
  1122. {
  1123. return ManagedSerializableFieldDataArray::getRTTIStatic();
  1124. }
  1125. RTTITypeBase* ManagedSerializableFieldDataList::getRTTIStatic()
  1126. {
  1127. return ManagedSerializableFieldDataListRTTI::instance();
  1128. }
  1129. RTTITypeBase* ManagedSerializableFieldDataList::getRTTI() const
  1130. {
  1131. return ManagedSerializableFieldDataList::getRTTIStatic();
  1132. }
  1133. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTIStatic()
  1134. {
  1135. return ManagedSerializableFieldDataDictionaryRTTI::instance();
  1136. }
  1137. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTI() const
  1138. {
  1139. return ManagedSerializableFieldDataDictionary::getRTTIStatic();
  1140. }
  1141. }