BsManagedSerializableField.cpp 49 KB

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