BsManagedSerializableField.cpp 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678
  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 ManagedSerializableFieldDataPtr& 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. ManagedSerializableFieldKeyPtr ManagedSerializableFieldKey::create(UINT16 typeId, UINT16 fieldId)
  52. {
  53. ManagedSerializableFieldKeyPtr fieldKey = bs_shared_ptr_new<ManagedSerializableFieldKey>(typeId, fieldId);
  54. return fieldKey;
  55. }
  56. ManagedSerializableFieldDataEntryPtr ManagedSerializableFieldDataEntry::create(const ManagedSerializableFieldKeyPtr& key, const ManagedSerializableFieldDataPtr& value)
  57. {
  58. ManagedSerializableFieldDataEntryPtr fieldDataEntry = bs_shared_ptr_new<ManagedSerializableFieldDataEntry>();
  59. fieldDataEntry->mKey = key;
  60. fieldDataEntry->mValue = value;
  61. return fieldDataEntry;
  62. }
  63. ManagedSerializableFieldDataPtr ManagedSerializableFieldData::create(const ManagedSerializableTypeInfoPtr& typeInfo, MonoObject* value)
  64. {
  65. return create(typeInfo, value, true);
  66. }
  67. ManagedSerializableFieldDataPtr ManagedSerializableFieldData::createDefault(const ManagedSerializableTypeInfoPtr& typeInfo)
  68. {
  69. return create(typeInfo, nullptr, false);
  70. }
  71. ManagedSerializableFieldDataPtr ManagedSerializableFieldData::create(const ManagedSerializableTypeInfoPtr& typeInfo, MonoObject* value, bool allowNull)
  72. {
  73. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  74. {
  75. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  76. switch (primitiveTypeInfo->mType)
  77. {
  78. case ScriptPrimitiveType::Bool:
  79. {
  80. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
  81. if(value != nullptr)
  82. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  83. return fieldData;
  84. }
  85. case ScriptPrimitiveType::Char:
  86. {
  87. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataChar>();
  88. if(value != nullptr)
  89. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  90. return fieldData;
  91. }
  92. case ScriptPrimitiveType::I8:
  93. {
  94. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI8>();
  95. if(value != nullptr)
  96. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  97. return fieldData;
  98. }
  99. case ScriptPrimitiveType::U8:
  100. {
  101. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU8>();
  102. if(value != nullptr)
  103. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  104. return fieldData;
  105. }
  106. case ScriptPrimitiveType::I16:
  107. {
  108. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI16>();
  109. if(value != nullptr)
  110. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  111. return fieldData;
  112. }
  113. case ScriptPrimitiveType::U16:
  114. {
  115. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU16>();
  116. if(value != nullptr)
  117. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  118. return fieldData;
  119. }
  120. case ScriptPrimitiveType::I32:
  121. {
  122. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI32>();
  123. if(value != nullptr)
  124. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  125. return fieldData;
  126. }
  127. case ScriptPrimitiveType::U32:
  128. {
  129. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU32>();
  130. if(value != nullptr)
  131. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  132. return fieldData;
  133. }
  134. case ScriptPrimitiveType::I64:
  135. {
  136. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataI64>();
  137. if(value != nullptr)
  138. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  139. return fieldData;
  140. }
  141. case ScriptPrimitiveType::U64:
  142. {
  143. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataU64>();
  144. if(value != nullptr)
  145. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  146. return fieldData;
  147. }
  148. case ScriptPrimitiveType::Float:
  149. {
  150. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataFloat>();
  151. if(value != nullptr)
  152. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  153. return fieldData;
  154. }
  155. case ScriptPrimitiveType::Double:
  156. {
  157. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataDouble>();
  158. if(value != nullptr)
  159. memcpy(&fieldData->value, mono_object_unbox(value), sizeof(fieldData->value));
  160. return fieldData;
  161. }
  162. case ScriptPrimitiveType::String:
  163. {
  164. MonoString* strVal = (MonoString*)(value);
  165. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataString>();
  166. if (strVal != nullptr)
  167. fieldData->value = MonoUtil::monoToWString(strVal);
  168. else
  169. fieldData->isNull = allowNull;
  170. return fieldData;
  171. }
  172. case ScriptPrimitiveType::Texture2DRef:
  173. {
  174. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  175. if(value != nullptr)
  176. {
  177. ScriptTexture2D* scriptTexture2D = ScriptTexture2D::toNative(value);
  178. fieldData->value = scriptTexture2D->getHandle();
  179. }
  180. return fieldData;
  181. }
  182. case ScriptPrimitiveType::Texture3DRef:
  183. {
  184. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  185. if (value != nullptr)
  186. {
  187. ScriptTexture3D* scriptTexture3D = ScriptTexture3D::toNative(value);
  188. fieldData->value = scriptTexture3D->getHandle();
  189. }
  190. return fieldData;
  191. }
  192. case ScriptPrimitiveType::TextureCubeRef:
  193. {
  194. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  195. if (value != nullptr)
  196. {
  197. ScriptTextureCube* scriptTextureCube = ScriptTextureCube::toNative(value);
  198. fieldData->value = scriptTextureCube->getHandle();
  199. }
  200. return fieldData;
  201. }
  202. case ScriptPrimitiveType::SpriteTextureRef:
  203. {
  204. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  205. if(value != nullptr)
  206. {
  207. ScriptSpriteTexture* scriptSpriteTexture = ScriptSpriteTexture::toNative(value);
  208. fieldData->value = scriptSpriteTexture->getHandle();
  209. }
  210. return fieldData;
  211. }
  212. case ScriptPrimitiveType::ShaderRef:
  213. {
  214. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  215. if (value != nullptr)
  216. {
  217. ScriptShader* scriptShader = ScriptShader::toNative(value);
  218. fieldData->value = scriptShader->getHandle();
  219. }
  220. return fieldData;
  221. }
  222. case ScriptPrimitiveType::ShaderIncludeRef:
  223. {
  224. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  225. if (value != nullptr)
  226. {
  227. ScriptShaderInclude* scriptShaderInclude = ScriptShaderInclude::toNative(value);
  228. fieldData->value = scriptShaderInclude->getHandle();
  229. }
  230. return fieldData;
  231. }
  232. case ScriptPrimitiveType::MaterialRef:
  233. {
  234. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  235. if (value != nullptr)
  236. {
  237. ScriptMaterial* scriptMaterial = ScriptMaterial::toNative(value);
  238. fieldData->value = scriptMaterial->getHandle();
  239. }
  240. return fieldData;
  241. }
  242. case ScriptPrimitiveType::MeshRef:
  243. {
  244. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  245. if (value != nullptr)
  246. {
  247. ScriptMesh* scriptMesh = ScriptMesh::toNative(value);
  248. fieldData->value = scriptMesh->getHandle();
  249. }
  250. return fieldData;
  251. }
  252. case ScriptPrimitiveType::PrefabRef:
  253. {
  254. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  255. if (value != nullptr)
  256. {
  257. ScriptPrefab* scriptPrefab = ScriptPrefab::toNative(value);
  258. fieldData->value = scriptPrefab->getHandle();
  259. }
  260. return fieldData;
  261. }
  262. case ScriptPrimitiveType::FontRef:
  263. {
  264. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  265. if (value != nullptr)
  266. {
  267. ScriptFont* scriptFont = ScriptFont::toNative(value);
  268. fieldData->value = scriptFont->getHandle();
  269. }
  270. return fieldData;
  271. }
  272. case ScriptPrimitiveType::StringTableRef:
  273. {
  274. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  275. if (value != nullptr)
  276. {
  277. ScriptStringTable* scriptStringTable = ScriptStringTable::toNative(value);
  278. fieldData->value = scriptStringTable->getHandle();
  279. }
  280. return fieldData;
  281. }
  282. case ScriptPrimitiveType::GUISkinRef:
  283. {
  284. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  285. if (value != nullptr)
  286. {
  287. ScriptGUISkin* scriptGUISkin = ScriptGUISkin::toNative(value);
  288. fieldData->value = scriptGUISkin->getHandle();
  289. }
  290. return fieldData;
  291. }
  292. case ScriptPrimitiveType::PhysicsMaterialRef:
  293. {
  294. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  295. if (value != nullptr)
  296. {
  297. ScriptPhysicsMaterial* scriptPhysicsMaterial = ScriptPhysicsMaterial::toNative(value);
  298. fieldData->value = scriptPhysicsMaterial->getHandle();
  299. }
  300. return fieldData;
  301. }
  302. case ScriptPrimitiveType::PhysicsMeshRef:
  303. {
  304. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  305. if (value != nullptr)
  306. {
  307. ScriptPhysicsMesh* scriptPhysicsMesh = ScriptPhysicsMesh::toNative(value);
  308. fieldData->value = scriptPhysicsMesh->getHandle();
  309. }
  310. return fieldData;
  311. }
  312. case ScriptPrimitiveType::ManagedResourceRef:
  313. {
  314. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  315. if(value != nullptr)
  316. {
  317. ScriptManagedResource* scriptManagedResource = ScriptManagedResource::toNative(value);
  318. fieldData->value = scriptManagedResource->getHandle();
  319. }
  320. return fieldData;
  321. }
  322. case ScriptPrimitiveType::PlainTextRef:
  323. {
  324. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  325. if (value != nullptr)
  326. {
  327. ScriptPlainText* scriptPlainResource = ScriptPlainText::toNative(value);
  328. fieldData->value = scriptPlainResource->getHandle();
  329. }
  330. return fieldData;
  331. }
  332. case ScriptPrimitiveType::ScriptCodeRef:
  333. {
  334. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
  335. if (value != nullptr)
  336. {
  337. ScriptScriptCode* scriptScriptCode = ScriptScriptCode::toNative(value);
  338. fieldData->value = scriptScriptCode->getHandle();
  339. }
  340. return fieldData;
  341. }
  342. case ScriptPrimitiveType::SceneObjectRef:
  343. {
  344. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
  345. if(value != nullptr)
  346. {
  347. ScriptSceneObject* scriptSceneObject = ScriptSceneObject::toNative(value);
  348. fieldData->value = static_object_cast<SceneObject>(scriptSceneObject->getNativeHandle());
  349. }
  350. return fieldData;
  351. }
  352. case ScriptPrimitiveType::ComponentRef:
  353. {
  354. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
  355. if(value != nullptr)
  356. {
  357. ScriptComponent* scriptComponent = ScriptComponent::toNative(value);
  358. fieldData->value = static_object_cast<Component>(scriptComponent->getNativeHandle());
  359. }
  360. return fieldData;
  361. }
  362. }
  363. }
  364. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  365. {
  366. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataObject>();
  367. if (value != nullptr)
  368. fieldData->value = ManagedSerializableObject::createFromExisting(value);
  369. else if (!allowNull)
  370. fieldData->value = ManagedSerializableObject::createNew(std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo));
  371. return fieldData;
  372. }
  373. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
  374. {
  375. ManagedSerializableTypeInfoArrayPtr arrayTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  376. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataArray>();
  377. if(value != nullptr)
  378. fieldData->value = ManagedSerializableArray::createFromExisting(value, arrayTypeInfo);
  379. else if (!allowNull)
  380. {
  381. Vector<UINT32> sizes(arrayTypeInfo->mRank, 0);
  382. fieldData->value = ManagedSerializableArray::createNew(arrayTypeInfo, sizes);
  383. }
  384. return fieldData;
  385. }
  386. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
  387. {
  388. ManagedSerializableTypeInfoListPtr listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  389. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataList>();
  390. if(value != nullptr)
  391. fieldData->value = ManagedSerializableList::createFromExisting(value, listTypeInfo);
  392. else if (!allowNull)
  393. fieldData->value = ManagedSerializableList::createNew(listTypeInfo, 0);
  394. return fieldData;
  395. }
  396. else if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
  397. {
  398. ManagedSerializableTypeInfoDictionaryPtr dictTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  399. auto fieldData = bs_shared_ptr_new<ManagedSerializableFieldDataDictionary>();
  400. if(value != nullptr)
  401. fieldData->value = ManagedSerializableDictionary::createFromExisting(value, dictTypeInfo);
  402. else if (!allowNull)
  403. fieldData->value = ManagedSerializableDictionary::createNew(dictTypeInfo);
  404. return fieldData;
  405. }
  406. return nullptr;
  407. }
  408. void* ManagedSerializableFieldDataBool::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  409. {
  410. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  411. {
  412. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  413. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Bool)
  414. return &value;
  415. }
  416. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  417. }
  418. void* ManagedSerializableFieldDataChar::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  419. {
  420. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  421. {
  422. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  423. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Char)
  424. return &value;
  425. }
  426. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  427. }
  428. void* ManagedSerializableFieldDataI8::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  429. {
  430. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  431. {
  432. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  433. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I8)
  434. return &value;
  435. }
  436. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  437. }
  438. void* ManagedSerializableFieldDataU8::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  439. {
  440. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  441. {
  442. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  443. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U8)
  444. return &value;
  445. }
  446. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  447. }
  448. void* ManagedSerializableFieldDataI16::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  449. {
  450. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  451. {
  452. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  453. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I16)
  454. return &value;
  455. }
  456. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  457. }
  458. void* ManagedSerializableFieldDataU16::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  459. {
  460. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  461. {
  462. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  463. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U16)
  464. return &value;
  465. }
  466. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  467. }
  468. void* ManagedSerializableFieldDataI32::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  469. {
  470. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  471. {
  472. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  473. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I32)
  474. return &value;
  475. }
  476. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  477. }
  478. void* ManagedSerializableFieldDataU32::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  479. {
  480. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  481. {
  482. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  483. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U32)
  484. return &value;
  485. }
  486. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  487. }
  488. void* ManagedSerializableFieldDataI64::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  489. {
  490. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  491. {
  492. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  493. if(primitiveTypeInfo->mType == ScriptPrimitiveType::I64)
  494. return &value;
  495. }
  496. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  497. }
  498. void* ManagedSerializableFieldDataU64::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  499. {
  500. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  501. {
  502. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  503. if(primitiveTypeInfo->mType == ScriptPrimitiveType::U64)
  504. return &value;
  505. }
  506. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  507. }
  508. void* ManagedSerializableFieldDataFloat::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  509. {
  510. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  511. {
  512. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  513. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Float)
  514. return &value;
  515. }
  516. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  517. }
  518. void* ManagedSerializableFieldDataDouble::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  519. {
  520. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  521. {
  522. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  523. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Double)
  524. return &value;
  525. }
  526. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  527. }
  528. void* ManagedSerializableFieldDataString::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  529. {
  530. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  531. {
  532. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  533. if(primitiveTypeInfo->mType == ScriptPrimitiveType::String)
  534. {
  535. if (!isNull)
  536. return MonoUtil::wstringToMono(value);
  537. else
  538. return nullptr;
  539. }
  540. }
  541. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  542. }
  543. void* ManagedSerializableFieldDataResourceRef::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  544. {
  545. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  546. {
  547. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  548. if(primitiveTypeInfo->mType == ScriptPrimitiveType::Texture2DRef)
  549. {
  550. if(!value.getUUID().empty())
  551. {
  552. HTexture texture = static_resource_cast<Texture>(value);
  553. ScriptTexture2D* scriptResource;
  554. ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
  555. return scriptResource->getManagedInstance();
  556. }
  557. else
  558. return nullptr;
  559. }
  560. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::Texture3DRef)
  561. {
  562. if (!value.getUUID().empty())
  563. {
  564. HTexture texture = static_resource_cast<Texture>(value);
  565. ScriptTexture3D* scriptResource;
  566. ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
  567. return scriptResource->getManagedInstance();
  568. }
  569. else
  570. return nullptr;
  571. }
  572. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::TextureCubeRef)
  573. {
  574. if (!value.getUUID().empty())
  575. {
  576. HTexture texture = static_resource_cast<Texture>(value);
  577. ScriptTextureCube* scriptResource;
  578. ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
  579. return scriptResource->getManagedInstance();
  580. }
  581. else
  582. return nullptr;
  583. }
  584. else if(primitiveTypeInfo->mType == ScriptPrimitiveType::SpriteTextureRef)
  585. {
  586. if (!value.getUUID().empty())
  587. {
  588. HSpriteTexture spriteTexture = static_resource_cast<SpriteTexture>(value);
  589. ScriptSpriteTexture* scriptResource;
  590. ScriptResourceManager::instance().getScriptResource(spriteTexture, &scriptResource, true);
  591. if(scriptResource != nullptr)
  592. return scriptResource->getManagedInstance();
  593. }
  594. else
  595. return nullptr;
  596. }
  597. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderRef)
  598. {
  599. if (!value.getUUID().empty())
  600. {
  601. HShader shader = static_resource_cast<Shader>(value);
  602. ScriptShader* scriptResource;
  603. ScriptResourceManager::instance().getScriptResource(shader, &scriptResource, true);
  604. if (scriptResource != nullptr)
  605. return scriptResource->getManagedInstance();
  606. }
  607. else
  608. return nullptr;
  609. }
  610. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderIncludeRef)
  611. {
  612. if (!value.getUUID().empty())
  613. {
  614. HShaderInclude shader = static_resource_cast<ShaderInclude>(value);
  615. ScriptShaderInclude* scriptResource;
  616. ScriptResourceManager::instance().getScriptResource(shader, &scriptResource, true);
  617. if (scriptResource != nullptr)
  618. return scriptResource->getManagedInstance();
  619. }
  620. else
  621. return nullptr;
  622. }
  623. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MaterialRef)
  624. {
  625. if (!value.getUUID().empty())
  626. {
  627. HMaterial material = static_resource_cast<Material>(value);
  628. ScriptMaterial* scriptResource;
  629. ScriptResourceManager::instance().getScriptResource(material, &scriptResource, true);
  630. if (scriptResource != nullptr)
  631. return scriptResource->getManagedInstance();
  632. }
  633. else
  634. return nullptr;
  635. }
  636. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MeshRef)
  637. {
  638. if (!value.getUUID().empty())
  639. {
  640. HMesh mesh = static_resource_cast<Mesh>(value);
  641. ScriptMesh* scriptResource;
  642. ScriptResourceManager::instance().getScriptResource(mesh, &scriptResource, true);
  643. if (scriptResource != nullptr)
  644. return scriptResource->getManagedInstance();
  645. }
  646. else
  647. return nullptr;
  648. }
  649. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PlainTextRef)
  650. {
  651. if (!value.getUUID().empty())
  652. {
  653. HPlainText plainText = static_resource_cast<PlainText>(value);
  654. ScriptPlainText* scriptResource;
  655. ScriptResourceManager::instance().getScriptResource(plainText, &scriptResource, true);
  656. if (scriptResource != nullptr)
  657. return scriptResource->getManagedInstance();
  658. }
  659. else
  660. return nullptr;
  661. }
  662. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ScriptCodeRef)
  663. {
  664. if (!value.getUUID().empty())
  665. {
  666. HScriptCode scriptCode = static_resource_cast<ScriptCode>(value);
  667. ScriptScriptCode* scriptResource;
  668. ScriptResourceManager::instance().getScriptResource(scriptCode, &scriptResource, true);
  669. if (scriptResource != nullptr)
  670. return scriptResource->getManagedInstance();
  671. }
  672. else
  673. return nullptr;
  674. }
  675. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PrefabRef)
  676. {
  677. if (!value.getUUID().empty())
  678. {
  679. HPrefab prefab = static_resource_cast<Prefab>(value);
  680. ScriptPrefab* scriptResource;
  681. ScriptResourceManager::instance().getScriptResource(prefab, &scriptResource, true);
  682. if (scriptResource != nullptr)
  683. return scriptResource->getManagedInstance();
  684. }
  685. else
  686. return nullptr;
  687. }
  688. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::FontRef)
  689. {
  690. if (!value.getUUID().empty())
  691. {
  692. HFont font = static_resource_cast<Font>(value);
  693. ScriptFont* scriptResource;
  694. ScriptResourceManager::instance().getScriptResource(font, &scriptResource, true);
  695. if (scriptResource != nullptr)
  696. return scriptResource->getManagedInstance();
  697. }
  698. else
  699. return nullptr;
  700. }
  701. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::StringTableRef)
  702. {
  703. if (!value.getUUID().empty())
  704. {
  705. HStringTable stringTable = static_resource_cast<StringTable>(value);
  706. ScriptStringTable* scriptResource;
  707. ScriptResourceManager::instance().getScriptResource(stringTable, &scriptResource, true);
  708. if (scriptResource != nullptr)
  709. return scriptResource->getManagedInstance();
  710. }
  711. else
  712. return nullptr;
  713. }
  714. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::GUISkinRef)
  715. {
  716. if (!value.getUUID().empty())
  717. {
  718. HGUISkin guiSkin = static_resource_cast<GUISkin>(value);
  719. ScriptGUISkin* scriptResource;
  720. ScriptResourceManager::instance().getScriptResource(guiSkin, &scriptResource, true);
  721. if (scriptResource != nullptr)
  722. return scriptResource->getManagedInstance();
  723. }
  724. else
  725. return nullptr;
  726. }
  727. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PhysicsMaterialRef)
  728. {
  729. if (!value.getUUID().empty())
  730. {
  731. HPhysicsMaterial material = static_resource_cast<PhysicsMaterial>(value);
  732. ScriptPhysicsMaterial* scriptResource;
  733. ScriptResourceManager::instance().getScriptResource(material, &scriptResource, true);
  734. if (scriptResource != nullptr)
  735. return scriptResource->getManagedInstance();
  736. }
  737. else
  738. return nullptr;
  739. }
  740. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PhysicsMeshRef)
  741. {
  742. if (!value.getUUID().empty())
  743. {
  744. HPhysicsMesh mesh = static_resource_cast<PhysicsMesh>(value);
  745. ScriptPhysicsMesh* scriptResource;
  746. ScriptResourceManager::instance().getScriptResource(mesh, &scriptResource, true);
  747. if (scriptResource != nullptr)
  748. return scriptResource->getManagedInstance();
  749. }
  750. else
  751. return nullptr;
  752. }
  753. else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ManagedResourceRef)
  754. {
  755. if (!value.getUUID().empty())
  756. {
  757. HManagedResource managedResource = static_resource_cast<ManagedResource>(value);
  758. ScriptManagedResource* scriptResource;
  759. ScriptResourceManager::instance().getScriptResource(managedResource, &scriptResource, false);
  760. assert(scriptResource != nullptr); // Managed resource managed instance is created upon creation so it may never be null
  761. return scriptResource->getManagedInstance();
  762. }
  763. else
  764. return nullptr;
  765. }
  766. }
  767. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  768. }
  769. void* ManagedSerializableFieldDataGameObjectRef::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  770. {
  771. if(typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  772. {
  773. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  774. if(primitiveTypeInfo->mType == ScriptPrimitiveType::SceneObjectRef)
  775. {
  776. if(value)
  777. {
  778. ScriptSceneObject* scriptSceneObject = ScriptGameObjectManager::instance().getOrCreateScriptSceneObject(value);
  779. return scriptSceneObject->getManagedInstance();
  780. }
  781. else
  782. return nullptr;
  783. }
  784. else if(primitiveTypeInfo->mType == ScriptPrimitiveType::ComponentRef)
  785. {
  786. if (value)
  787. {
  788. ScriptComponent* scriptComponent = ScriptGameObjectManager::instance().getScriptComponent(value);
  789. assert(scriptComponent != nullptr);
  790. return scriptComponent->getManagedInstance();
  791. }
  792. else
  793. return nullptr;
  794. }
  795. }
  796. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  797. }
  798. void* ManagedSerializableFieldDataObject::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  799. {
  800. if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  801. {
  802. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  803. if(value != nullptr)
  804. {
  805. if(objectTypeInfo->mValueType)
  806. {
  807. MonoObject* managedInstance = value->getManagedInstance();
  808. if(managedInstance != nullptr)
  809. return mono_object_unbox(managedInstance); // Structs are passed as raw types because mono expects them as such
  810. }
  811. else
  812. return value->getManagedInstance();
  813. }
  814. return nullptr;
  815. }
  816. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  817. }
  818. void* ManagedSerializableFieldDataArray::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  819. {
  820. if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
  821. {
  822. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  823. if(value != nullptr)
  824. return value->getManagedInstance();
  825. return nullptr;
  826. }
  827. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  828. }
  829. void* ManagedSerializableFieldDataList::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  830. {
  831. if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
  832. {
  833. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  834. if(value != nullptr)
  835. return value->getManagedInstance();
  836. return nullptr;
  837. }
  838. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  839. }
  840. void* ManagedSerializableFieldDataDictionary::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  841. {
  842. if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
  843. {
  844. auto dictionaryTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  845. if(value != nullptr)
  846. return value->getManagedInstance();
  847. return nullptr;
  848. }
  849. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  850. }
  851. MonoObject* ManagedSerializableFieldDataBool::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  852. {
  853. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  854. {
  855. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  856. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Bool)
  857. return mono_value_box(MonoManager::instance().getDomain(), mono_get_boolean_class(), &value);
  858. }
  859. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  860. }
  861. MonoObject* ManagedSerializableFieldDataChar::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  862. {
  863. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  864. {
  865. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  866. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Char)
  867. return mono_value_box(MonoManager::instance().getDomain(), mono_get_char_class(), &value);
  868. }
  869. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  870. }
  871. MonoObject* ManagedSerializableFieldDataI8::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  872. {
  873. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  874. {
  875. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  876. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I8)
  877. return mono_value_box(MonoManager::instance().getDomain(), mono_get_sbyte_class(), &value);
  878. }
  879. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  880. }
  881. MonoObject* ManagedSerializableFieldDataU8::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  882. {
  883. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  884. {
  885. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  886. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U8)
  887. return mono_value_box(MonoManager::instance().getDomain(), mono_get_byte_class(), &value);
  888. }
  889. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  890. }
  891. MonoObject* ManagedSerializableFieldDataI16::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  892. {
  893. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  894. {
  895. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  896. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I16)
  897. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int16_class(), &value);
  898. }
  899. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  900. }
  901. MonoObject* ManagedSerializableFieldDataU16::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  902. {
  903. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  904. {
  905. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  906. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U16)
  907. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint16_class(), &value);
  908. }
  909. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  910. }
  911. MonoObject* ManagedSerializableFieldDataI32::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  912. {
  913. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  914. {
  915. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  916. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I32)
  917. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int32_class(), &value);
  918. }
  919. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  920. }
  921. MonoObject* ManagedSerializableFieldDataU32::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  922. {
  923. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  924. {
  925. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  926. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U32)
  927. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint32_class(), &value);
  928. }
  929. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  930. }
  931. MonoObject* ManagedSerializableFieldDataI64::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  932. {
  933. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  934. {
  935. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  936. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I64)
  937. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int64_class(), &value);
  938. }
  939. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  940. }
  941. MonoObject* ManagedSerializableFieldDataU64::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  942. {
  943. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  944. {
  945. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  946. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U64)
  947. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint64_class(), &value);
  948. }
  949. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  950. }
  951. MonoObject* ManagedSerializableFieldDataFloat::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  952. {
  953. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  954. {
  955. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  956. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Float)
  957. return mono_value_box(MonoManager::instance().getDomain(), mono_get_single_class(), &value);
  958. }
  959. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  960. }
  961. MonoObject* ManagedSerializableFieldDataDouble::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  962. {
  963. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  964. {
  965. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  966. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Double)
  967. return mono_value_box(MonoManager::instance().getDomain(), mono_get_double_class(), &value);
  968. }
  969. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  970. }
  971. MonoObject* ManagedSerializableFieldDataString::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  972. {
  973. return (MonoObject*)getValue(typeInfo);
  974. }
  975. MonoObject* ManagedSerializableFieldDataResourceRef::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  976. {
  977. return (MonoObject*)getValue(typeInfo);
  978. }
  979. MonoObject* ManagedSerializableFieldDataGameObjectRef::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  980. {
  981. return (MonoObject*)getValue(typeInfo);
  982. }
  983. MonoObject* ManagedSerializableFieldDataObject::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  984. {
  985. if (typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  986. {
  987. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  988. if (value != nullptr)
  989. return value->getManagedInstance();
  990. return nullptr;
  991. }
  992. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  993. }
  994. MonoObject* ManagedSerializableFieldDataArray::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  995. {
  996. return (MonoObject*)getValue(typeInfo);
  997. }
  998. MonoObject* ManagedSerializableFieldDataList::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  999. {
  1000. return (MonoObject*)getValue(typeInfo);
  1001. }
  1002. MonoObject* ManagedSerializableFieldDataDictionary::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  1003. {
  1004. return (MonoObject*)getValue(typeInfo);
  1005. }
  1006. bool ManagedSerializableFieldDataBool::equals(const ManagedSerializableFieldDataPtr& other)
  1007. {
  1008. return compareFieldData(this, other);
  1009. }
  1010. bool ManagedSerializableFieldDataChar::equals(const ManagedSerializableFieldDataPtr& other)
  1011. {
  1012. return compareFieldData(this, other);
  1013. }
  1014. bool ManagedSerializableFieldDataI8::equals(const ManagedSerializableFieldDataPtr& other)
  1015. {
  1016. return compareFieldData(this, other);
  1017. }
  1018. bool ManagedSerializableFieldDataU8::equals(const ManagedSerializableFieldDataPtr& other)
  1019. {
  1020. return compareFieldData(this, other);
  1021. }
  1022. bool ManagedSerializableFieldDataI16::equals(const ManagedSerializableFieldDataPtr& other)
  1023. {
  1024. return compareFieldData(this, other);
  1025. }
  1026. bool ManagedSerializableFieldDataU16::equals(const ManagedSerializableFieldDataPtr& other)
  1027. {
  1028. return compareFieldData(this, other);
  1029. }
  1030. bool ManagedSerializableFieldDataI32::equals(const ManagedSerializableFieldDataPtr& other)
  1031. {
  1032. return compareFieldData(this, other);
  1033. }
  1034. bool ManagedSerializableFieldDataU32::equals(const ManagedSerializableFieldDataPtr& other)
  1035. {
  1036. return compareFieldData(this, other);
  1037. }
  1038. bool ManagedSerializableFieldDataI64::equals(const ManagedSerializableFieldDataPtr& other)
  1039. {
  1040. return compareFieldData(this, other);
  1041. }
  1042. bool ManagedSerializableFieldDataU64::equals(const ManagedSerializableFieldDataPtr& other)
  1043. {
  1044. return compareFieldData(this, other);
  1045. }
  1046. bool ManagedSerializableFieldDataFloat::equals(const ManagedSerializableFieldDataPtr& other)
  1047. {
  1048. return compareFieldData(this, other);
  1049. }
  1050. bool ManagedSerializableFieldDataDouble::equals(const ManagedSerializableFieldDataPtr& other)
  1051. {
  1052. return compareFieldData(this, other);
  1053. }
  1054. bool ManagedSerializableFieldDataString::equals(const ManagedSerializableFieldDataPtr& other)
  1055. {
  1056. if (rtti_is_of_type<ManagedSerializableFieldDataString>(other))
  1057. {
  1058. auto castObj = std::static_pointer_cast<ManagedSerializableFieldDataString>(other);
  1059. return (isNull == true && isNull == castObj->isNull) || value == castObj->value;
  1060. }
  1061. return false;
  1062. }
  1063. bool ManagedSerializableFieldDataResourceRef::equals(const ManagedSerializableFieldDataPtr& other)
  1064. {
  1065. return compareFieldData(this, other);
  1066. }
  1067. bool ManagedSerializableFieldDataGameObjectRef::equals(const ManagedSerializableFieldDataPtr& other)
  1068. {
  1069. return compareFieldData(this, other);
  1070. }
  1071. bool ManagedSerializableFieldDataObject::equals(const ManagedSerializableFieldDataPtr& other)
  1072. {
  1073. return compareFieldData(this, other);
  1074. }
  1075. bool ManagedSerializableFieldDataArray::equals(const ManagedSerializableFieldDataPtr& other)
  1076. {
  1077. return compareFieldData(this, other);
  1078. }
  1079. bool ManagedSerializableFieldDataList::equals(const ManagedSerializableFieldDataPtr& other)
  1080. {
  1081. return compareFieldData(this, other);
  1082. }
  1083. bool ManagedSerializableFieldDataDictionary::equals(const ManagedSerializableFieldDataPtr& other)
  1084. {
  1085. return compareFieldData(this, other);
  1086. }
  1087. size_t ManagedSerializableFieldDataBool::getHash()
  1088. {
  1089. std::hash<bool> hasher;
  1090. return hasher(value);
  1091. }
  1092. size_t ManagedSerializableFieldDataChar::getHash()
  1093. {
  1094. std::hash<wchar_t> hasher;
  1095. return hasher(value);
  1096. }
  1097. size_t ManagedSerializableFieldDataI8::getHash()
  1098. {
  1099. std::hash<INT8> hasher;
  1100. return hasher(value);
  1101. }
  1102. size_t ManagedSerializableFieldDataU8::getHash()
  1103. {
  1104. std::hash<UINT8> hasher;
  1105. return hasher(value);
  1106. }
  1107. size_t ManagedSerializableFieldDataI16::getHash()
  1108. {
  1109. std::hash<INT16> hasher;
  1110. return hasher(value);
  1111. }
  1112. size_t ManagedSerializableFieldDataU16::getHash()
  1113. {
  1114. std::hash<UINT16> hasher;
  1115. return hasher(value);
  1116. }
  1117. size_t ManagedSerializableFieldDataI32::getHash()
  1118. {
  1119. std::hash<INT32> hasher;
  1120. return hasher(value);
  1121. }
  1122. size_t ManagedSerializableFieldDataU32::getHash()
  1123. {
  1124. std::hash<UINT32> hasher;
  1125. return hasher(value);
  1126. }
  1127. size_t ManagedSerializableFieldDataI64::getHash()
  1128. {
  1129. std::hash<INT64> hasher;
  1130. return hasher(value);
  1131. }
  1132. size_t ManagedSerializableFieldDataU64::getHash()
  1133. {
  1134. std::hash<UINT64> hasher;
  1135. return hasher(value);
  1136. }
  1137. size_t ManagedSerializableFieldDataFloat::getHash()
  1138. {
  1139. std::hash<float> hasher;
  1140. return hasher(value);
  1141. }
  1142. size_t ManagedSerializableFieldDataDouble::getHash()
  1143. {
  1144. std::hash<double> hasher;
  1145. return hasher(value);
  1146. }
  1147. size_t ManagedSerializableFieldDataString::getHash()
  1148. {
  1149. std::hash<WString> hasher;
  1150. return hasher(value);
  1151. }
  1152. size_t ManagedSerializableFieldDataResourceRef::getHash()
  1153. {
  1154. std::hash<String> hasher;
  1155. return hasher(value.getUUID());
  1156. }
  1157. size_t ManagedSerializableFieldDataGameObjectRef::getHash()
  1158. {
  1159. std::hash<UINT64> hasher;
  1160. return hasher(value.getInstanceId());
  1161. }
  1162. size_t ManagedSerializableFieldDataObject::getHash()
  1163. {
  1164. std::hash<std::shared_ptr<ManagedSerializableObject>> hasher;
  1165. return hasher(value);
  1166. }
  1167. size_t ManagedSerializableFieldDataArray::getHash()
  1168. {
  1169. std::hash<std::shared_ptr<ManagedSerializableArray>> hasher;
  1170. return hasher(value);
  1171. }
  1172. size_t ManagedSerializableFieldDataList::getHash()
  1173. {
  1174. std::hash<std::shared_ptr<ManagedSerializableList>> hasher;
  1175. return hasher(value);
  1176. }
  1177. size_t ManagedSerializableFieldDataDictionary::getHash()
  1178. {
  1179. std::hash<std::shared_ptr<ManagedSerializableDictionary>> hasher;
  1180. return hasher(value);
  1181. }
  1182. void ManagedSerializableFieldDataObject::serialize()
  1183. {
  1184. if (value != nullptr)
  1185. value->serialize();
  1186. }
  1187. void ManagedSerializableFieldDataObject::deserialize()
  1188. {
  1189. if (value != nullptr)
  1190. value->deserialize();
  1191. }
  1192. void ManagedSerializableFieldDataArray::serialize()
  1193. {
  1194. if (value != nullptr)
  1195. value->serialize();
  1196. }
  1197. void ManagedSerializableFieldDataArray::deserialize()
  1198. {
  1199. if (value != nullptr)
  1200. value->deserialize();
  1201. }
  1202. void ManagedSerializableFieldDataList::serialize()
  1203. {
  1204. if (value != nullptr)
  1205. value->serialize();
  1206. }
  1207. void ManagedSerializableFieldDataList::deserialize()
  1208. {
  1209. if (value != nullptr)
  1210. value->deserialize();
  1211. }
  1212. void ManagedSerializableFieldDataDictionary::serialize()
  1213. {
  1214. if (value != nullptr)
  1215. value->serialize();
  1216. }
  1217. void ManagedSerializableFieldDataDictionary::deserialize()
  1218. {
  1219. if (value != nullptr)
  1220. value->deserialize();
  1221. }
  1222. RTTITypeBase* ManagedSerializableFieldKey::getRTTIStatic()
  1223. {
  1224. return ManagedSerializableFieldKeyRTTI::instance();
  1225. }
  1226. RTTITypeBase* ManagedSerializableFieldKey::getRTTI() const
  1227. {
  1228. return ManagedSerializableFieldKey::getRTTIStatic();
  1229. }
  1230. RTTITypeBase* ManagedSerializableFieldData::getRTTIStatic()
  1231. {
  1232. return ManagedSerializableFieldDataRTTI::instance();
  1233. }
  1234. RTTITypeBase* ManagedSerializableFieldData::getRTTI() const
  1235. {
  1236. return ManagedSerializableFieldData::getRTTIStatic();
  1237. }
  1238. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTIStatic()
  1239. {
  1240. return ManagedSerializableFieldDataEntryRTTI::instance();
  1241. }
  1242. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTI() const
  1243. {
  1244. return ManagedSerializableFieldDataEntry::getRTTIStatic();
  1245. }
  1246. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTIStatic()
  1247. {
  1248. return ManagedSerializableFieldDataBoolRTTI::instance();
  1249. }
  1250. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTI() const
  1251. {
  1252. return ManagedSerializableFieldDataBool::getRTTIStatic();
  1253. }
  1254. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTIStatic()
  1255. {
  1256. return ManagedSerializableFieldDataCharRTTI::instance();
  1257. }
  1258. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTI() const
  1259. {
  1260. return ManagedSerializableFieldDataChar::getRTTIStatic();
  1261. }
  1262. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTIStatic()
  1263. {
  1264. return ManagedSerializableFieldDataI8RTTI::instance();
  1265. }
  1266. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTI() const
  1267. {
  1268. return ManagedSerializableFieldDataI8::getRTTIStatic();
  1269. }
  1270. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTIStatic()
  1271. {
  1272. return ManagedSerializableFieldDataU8RTTI::instance();
  1273. }
  1274. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTI() const
  1275. {
  1276. return ManagedSerializableFieldDataU8::getRTTIStatic();
  1277. }
  1278. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTIStatic()
  1279. {
  1280. return ManagedSerializableFieldDataI16RTTI::instance();
  1281. }
  1282. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTI() const
  1283. {
  1284. return ManagedSerializableFieldDataI16::getRTTIStatic();
  1285. }
  1286. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTIStatic()
  1287. {
  1288. return ManagedSerializableFieldDataU16RTTI::instance();
  1289. }
  1290. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTI() const
  1291. {
  1292. return ManagedSerializableFieldDataU16::getRTTIStatic();
  1293. }
  1294. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTIStatic()
  1295. {
  1296. return ManagedSerializableFieldDataI32RTTI::instance();
  1297. }
  1298. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTI() const
  1299. {
  1300. return ManagedSerializableFieldDataI32::getRTTIStatic();
  1301. }
  1302. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTIStatic()
  1303. {
  1304. return ManagedSerializableFieldDataU32RTTI::instance();
  1305. }
  1306. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTI() const
  1307. {
  1308. return ManagedSerializableFieldDataU32::getRTTIStatic();
  1309. }
  1310. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTIStatic()
  1311. {
  1312. return ManagedSerializableFieldDataI64RTTI::instance();
  1313. }
  1314. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTI() const
  1315. {
  1316. return ManagedSerializableFieldDataI64::getRTTIStatic();
  1317. }
  1318. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTIStatic()
  1319. {
  1320. return ManagedSerializableFieldDataU64RTTI::instance();
  1321. }
  1322. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTI() const
  1323. {
  1324. return ManagedSerializableFieldDataU64::getRTTIStatic();
  1325. }
  1326. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTIStatic()
  1327. {
  1328. return ManagedSerializableFieldDataFloatRTTI::instance();
  1329. }
  1330. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTI() const
  1331. {
  1332. return ManagedSerializableFieldDataFloat::getRTTIStatic();
  1333. }
  1334. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTIStatic()
  1335. {
  1336. return ManagedSerializableFieldDataDoubleRTTI::instance();
  1337. }
  1338. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTI() const
  1339. {
  1340. return ManagedSerializableFieldDataDouble::getRTTIStatic();
  1341. }
  1342. RTTITypeBase* ManagedSerializableFieldDataString::getRTTIStatic()
  1343. {
  1344. return ManagedSerializableFieldDataStringRTTI::instance();
  1345. }
  1346. RTTITypeBase* ManagedSerializableFieldDataString::getRTTI() const
  1347. {
  1348. return ManagedSerializableFieldDataString::getRTTIStatic();
  1349. }
  1350. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTIStatic()
  1351. {
  1352. return ManagedSerializableFieldDataResourceRefRTTI::instance();
  1353. }
  1354. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTI() const
  1355. {
  1356. return ManagedSerializableFieldDataResourceRef::getRTTIStatic();
  1357. }
  1358. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTIStatic()
  1359. {
  1360. return ManagedSerializableFieldDataGameObjectRefRTTI::instance();
  1361. }
  1362. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTI() const
  1363. {
  1364. return ManagedSerializableFieldDataGameObjectRef::getRTTIStatic();
  1365. }
  1366. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTIStatic()
  1367. {
  1368. return ManagedSerializableFieldDataObjectRTTI::instance();
  1369. }
  1370. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTI() const
  1371. {
  1372. return ManagedSerializableFieldDataObject::getRTTIStatic();
  1373. }
  1374. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTIStatic()
  1375. {
  1376. return ManagedSerializableFieldDataArrayRTTI::instance();
  1377. }
  1378. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTI() const
  1379. {
  1380. return ManagedSerializableFieldDataArray::getRTTIStatic();
  1381. }
  1382. RTTITypeBase* ManagedSerializableFieldDataList::getRTTIStatic()
  1383. {
  1384. return ManagedSerializableFieldDataListRTTI::instance();
  1385. }
  1386. RTTITypeBase* ManagedSerializableFieldDataList::getRTTI() const
  1387. {
  1388. return ManagedSerializableFieldDataList::getRTTIStatic();
  1389. }
  1390. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTIStatic()
  1391. {
  1392. return ManagedSerializableFieldDataDictionaryRTTI::instance();
  1393. }
  1394. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTI() const
  1395. {
  1396. return ManagedSerializableFieldDataDictionary::getRTTIStatic();
  1397. }
  1398. }