BsManagedSerializableField.cpp 45 KB

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