BsManagedSerializableField.cpp 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623
  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().getScriptSceneObject(value);
  729. if(scriptSceneObject == nullptr)
  730. scriptSceneObject = ScriptGameObjectManager::instance().createScriptSceneObject(value);
  731. return scriptSceneObject->getManagedInstance();
  732. }
  733. else
  734. return nullptr;
  735. }
  736. else if(primitiveTypeInfo->mType == ScriptPrimitiveType::ComponentRef)
  737. {
  738. if (value)
  739. {
  740. ScriptComponent* scriptComponent = ScriptGameObjectManager::instance().getScriptComponent(value);
  741. assert(scriptComponent != nullptr);
  742. return scriptComponent->getManagedInstance();
  743. }
  744. else
  745. return nullptr;
  746. }
  747. }
  748. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  749. }
  750. void* ManagedSerializableFieldDataObject::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  751. {
  752. if(typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  753. {
  754. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  755. if(value != nullptr)
  756. {
  757. if(objectTypeInfo->mValueType)
  758. {
  759. MonoObject* managedInstance = value->getManagedInstance();
  760. if(managedInstance != nullptr)
  761. return mono_object_unbox(managedInstance); // Structs are passed as raw types because mono expects them as such
  762. }
  763. else
  764. return value->getManagedInstance();
  765. }
  766. return nullptr;
  767. }
  768. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  769. }
  770. void* ManagedSerializableFieldDataArray::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  771. {
  772. if(typeInfo->getTypeId() == TID_SerializableTypeInfoArray)
  773. {
  774. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoArray>(typeInfo);
  775. if(value != nullptr)
  776. return value->getManagedInstance();
  777. return nullptr;
  778. }
  779. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  780. }
  781. void* ManagedSerializableFieldDataList::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  782. {
  783. if(typeInfo->getTypeId() == TID_SerializableTypeInfoList)
  784. {
  785. auto listTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoList>(typeInfo);
  786. if(value != nullptr)
  787. return value->getManagedInstance();
  788. return nullptr;
  789. }
  790. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  791. }
  792. void* ManagedSerializableFieldDataDictionary::getValue(const ManagedSerializableTypeInfoPtr& typeInfo)
  793. {
  794. if(typeInfo->getTypeId() == TID_SerializableTypeInfoDictionary)
  795. {
  796. auto dictionaryTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoDictionary>(typeInfo);
  797. if(value != nullptr)
  798. return value->getManagedInstance();
  799. return nullptr;
  800. }
  801. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  802. }
  803. MonoObject* ManagedSerializableFieldDataBool::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  804. {
  805. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  806. {
  807. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  808. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Bool)
  809. return mono_value_box(MonoManager::instance().getDomain(), mono_get_boolean_class(), &value);
  810. }
  811. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  812. }
  813. MonoObject* ManagedSerializableFieldDataChar::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  814. {
  815. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  816. {
  817. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  818. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Char)
  819. return mono_value_box(MonoManager::instance().getDomain(), mono_get_char_class(), &value);
  820. }
  821. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  822. }
  823. MonoObject* ManagedSerializableFieldDataI8::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  824. {
  825. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  826. {
  827. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  828. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I8)
  829. return mono_value_box(MonoManager::instance().getDomain(), mono_get_sbyte_class(), &value);
  830. }
  831. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  832. }
  833. MonoObject* ManagedSerializableFieldDataU8::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  834. {
  835. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  836. {
  837. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  838. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U8)
  839. return mono_value_box(MonoManager::instance().getDomain(), mono_get_byte_class(), &value);
  840. }
  841. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  842. }
  843. MonoObject* ManagedSerializableFieldDataI16::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  844. {
  845. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  846. {
  847. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  848. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I16)
  849. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int16_class(), &value);
  850. }
  851. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  852. }
  853. MonoObject* ManagedSerializableFieldDataU16::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  854. {
  855. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  856. {
  857. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  858. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U16)
  859. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint16_class(), &value);
  860. }
  861. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  862. }
  863. MonoObject* ManagedSerializableFieldDataI32::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  864. {
  865. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  866. {
  867. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  868. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I32)
  869. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int32_class(), &value);
  870. }
  871. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  872. }
  873. MonoObject* ManagedSerializableFieldDataU32::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  874. {
  875. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  876. {
  877. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  878. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U32)
  879. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint32_class(), &value);
  880. }
  881. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  882. }
  883. MonoObject* ManagedSerializableFieldDataI64::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  884. {
  885. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  886. {
  887. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  888. if (primitiveTypeInfo->mType == ScriptPrimitiveType::I64)
  889. return mono_value_box(MonoManager::instance().getDomain(), mono_get_int64_class(), &value);
  890. }
  891. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  892. }
  893. MonoObject* ManagedSerializableFieldDataU64::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  894. {
  895. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  896. {
  897. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  898. if (primitiveTypeInfo->mType == ScriptPrimitiveType::U64)
  899. return mono_value_box(MonoManager::instance().getDomain(), mono_get_uint64_class(), &value);
  900. }
  901. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  902. }
  903. MonoObject* ManagedSerializableFieldDataFloat::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  904. {
  905. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  906. {
  907. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  908. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Float)
  909. return mono_value_box(MonoManager::instance().getDomain(), mono_get_single_class(), &value);
  910. }
  911. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  912. }
  913. MonoObject* ManagedSerializableFieldDataDouble::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  914. {
  915. if (typeInfo->getTypeId() == TID_SerializableTypeInfoPrimitive)
  916. {
  917. auto primitiveTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoPrimitive>(typeInfo);
  918. if (primitiveTypeInfo->mType == ScriptPrimitiveType::Double)
  919. return mono_value_box(MonoManager::instance().getDomain(), mono_get_double_class(), &value);
  920. }
  921. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  922. }
  923. MonoObject* ManagedSerializableFieldDataString::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  924. {
  925. return (MonoObject*)getValue(typeInfo);
  926. }
  927. MonoObject* ManagedSerializableFieldDataResourceRef::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  928. {
  929. return (MonoObject*)getValue(typeInfo);
  930. }
  931. MonoObject* ManagedSerializableFieldDataGameObjectRef::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  932. {
  933. return (MonoObject*)getValue(typeInfo);
  934. }
  935. MonoObject* ManagedSerializableFieldDataObject::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  936. {
  937. if (typeInfo->getTypeId() == TID_SerializableTypeInfoObject)
  938. {
  939. auto objectTypeInfo = std::static_pointer_cast<ManagedSerializableTypeInfoObject>(typeInfo);
  940. if (value != nullptr)
  941. return value->getManagedInstance();
  942. return nullptr;
  943. }
  944. BS_EXCEPT(InvalidParametersException, "Requesting an invalid type in serializable field.");
  945. }
  946. MonoObject* ManagedSerializableFieldDataArray::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  947. {
  948. return (MonoObject*)getValue(typeInfo);
  949. }
  950. MonoObject* ManagedSerializableFieldDataList::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  951. {
  952. return (MonoObject*)getValue(typeInfo);
  953. }
  954. MonoObject* ManagedSerializableFieldDataDictionary::getValueBoxed(const ManagedSerializableTypeInfoPtr& typeInfo)
  955. {
  956. return (MonoObject*)getValue(typeInfo);
  957. }
  958. bool ManagedSerializableFieldDataBool::equals(const ManagedSerializableFieldDataPtr& other)
  959. {
  960. return compareFieldData(this, other);
  961. }
  962. bool ManagedSerializableFieldDataChar::equals(const ManagedSerializableFieldDataPtr& other)
  963. {
  964. return compareFieldData(this, other);
  965. }
  966. bool ManagedSerializableFieldDataI8::equals(const ManagedSerializableFieldDataPtr& other)
  967. {
  968. return compareFieldData(this, other);
  969. }
  970. bool ManagedSerializableFieldDataU8::equals(const ManagedSerializableFieldDataPtr& other)
  971. {
  972. return compareFieldData(this, other);
  973. }
  974. bool ManagedSerializableFieldDataI16::equals(const ManagedSerializableFieldDataPtr& other)
  975. {
  976. return compareFieldData(this, other);
  977. }
  978. bool ManagedSerializableFieldDataU16::equals(const ManagedSerializableFieldDataPtr& other)
  979. {
  980. return compareFieldData(this, other);
  981. }
  982. bool ManagedSerializableFieldDataI32::equals(const ManagedSerializableFieldDataPtr& other)
  983. {
  984. return compareFieldData(this, other);
  985. }
  986. bool ManagedSerializableFieldDataU32::equals(const ManagedSerializableFieldDataPtr& other)
  987. {
  988. return compareFieldData(this, other);
  989. }
  990. bool ManagedSerializableFieldDataI64::equals(const ManagedSerializableFieldDataPtr& other)
  991. {
  992. return compareFieldData(this, other);
  993. }
  994. bool ManagedSerializableFieldDataU64::equals(const ManagedSerializableFieldDataPtr& other)
  995. {
  996. return compareFieldData(this, other);
  997. }
  998. bool ManagedSerializableFieldDataFloat::equals(const ManagedSerializableFieldDataPtr& other)
  999. {
  1000. return compareFieldData(this, other);
  1001. }
  1002. bool ManagedSerializableFieldDataDouble::equals(const ManagedSerializableFieldDataPtr& other)
  1003. {
  1004. return compareFieldData(this, other);
  1005. }
  1006. bool ManagedSerializableFieldDataString::equals(const ManagedSerializableFieldDataPtr& other)
  1007. {
  1008. if (rtti_is_of_type<ManagedSerializableFieldDataString>(other))
  1009. {
  1010. auto castObj = std::static_pointer_cast<ManagedSerializableFieldDataString>(other);
  1011. return (isNull == true && isNull == castObj->isNull) || value == castObj->value;
  1012. }
  1013. return false;
  1014. }
  1015. bool ManagedSerializableFieldDataResourceRef::equals(const ManagedSerializableFieldDataPtr& other)
  1016. {
  1017. return compareFieldData(this, other);
  1018. }
  1019. bool ManagedSerializableFieldDataGameObjectRef::equals(const ManagedSerializableFieldDataPtr& other)
  1020. {
  1021. return compareFieldData(this, other);
  1022. }
  1023. bool ManagedSerializableFieldDataObject::equals(const ManagedSerializableFieldDataPtr& other)
  1024. {
  1025. return compareFieldData(this, other);
  1026. }
  1027. bool ManagedSerializableFieldDataArray::equals(const ManagedSerializableFieldDataPtr& other)
  1028. {
  1029. return compareFieldData(this, other);
  1030. }
  1031. bool ManagedSerializableFieldDataList::equals(const ManagedSerializableFieldDataPtr& other)
  1032. {
  1033. return compareFieldData(this, other);
  1034. }
  1035. bool ManagedSerializableFieldDataDictionary::equals(const ManagedSerializableFieldDataPtr& other)
  1036. {
  1037. return compareFieldData(this, other);
  1038. }
  1039. size_t ManagedSerializableFieldDataBool::getHash()
  1040. {
  1041. std::hash<bool> hasher;
  1042. return hasher(value);
  1043. }
  1044. size_t ManagedSerializableFieldDataChar::getHash()
  1045. {
  1046. std::hash<wchar_t> hasher;
  1047. return hasher(value);
  1048. }
  1049. size_t ManagedSerializableFieldDataI8::getHash()
  1050. {
  1051. std::hash<INT8> hasher;
  1052. return hasher(value);
  1053. }
  1054. size_t ManagedSerializableFieldDataU8::getHash()
  1055. {
  1056. std::hash<UINT8> hasher;
  1057. return hasher(value);
  1058. }
  1059. size_t ManagedSerializableFieldDataI16::getHash()
  1060. {
  1061. std::hash<INT16> hasher;
  1062. return hasher(value);
  1063. }
  1064. size_t ManagedSerializableFieldDataU16::getHash()
  1065. {
  1066. std::hash<UINT16> hasher;
  1067. return hasher(value);
  1068. }
  1069. size_t ManagedSerializableFieldDataI32::getHash()
  1070. {
  1071. std::hash<INT32> hasher;
  1072. return hasher(value);
  1073. }
  1074. size_t ManagedSerializableFieldDataU32::getHash()
  1075. {
  1076. std::hash<UINT32> hasher;
  1077. return hasher(value);
  1078. }
  1079. size_t ManagedSerializableFieldDataI64::getHash()
  1080. {
  1081. std::hash<INT64> hasher;
  1082. return hasher(value);
  1083. }
  1084. size_t ManagedSerializableFieldDataU64::getHash()
  1085. {
  1086. std::hash<UINT64> hasher;
  1087. return hasher(value);
  1088. }
  1089. size_t ManagedSerializableFieldDataFloat::getHash()
  1090. {
  1091. std::hash<float> hasher;
  1092. return hasher(value);
  1093. }
  1094. size_t ManagedSerializableFieldDataDouble::getHash()
  1095. {
  1096. std::hash<double> hasher;
  1097. return hasher(value);
  1098. }
  1099. size_t ManagedSerializableFieldDataString::getHash()
  1100. {
  1101. std::hash<WString> hasher;
  1102. return hasher(value);
  1103. }
  1104. size_t ManagedSerializableFieldDataResourceRef::getHash()
  1105. {
  1106. std::hash<String> hasher;
  1107. return hasher(value.getUUID());
  1108. }
  1109. size_t ManagedSerializableFieldDataGameObjectRef::getHash()
  1110. {
  1111. std::hash<UINT64> hasher;
  1112. return hasher(value.getInstanceId());
  1113. }
  1114. size_t ManagedSerializableFieldDataObject::getHash()
  1115. {
  1116. std::hash<std::shared_ptr<ManagedSerializableObject>> hasher;
  1117. return hasher(value);
  1118. }
  1119. size_t ManagedSerializableFieldDataArray::getHash()
  1120. {
  1121. std::hash<std::shared_ptr<ManagedSerializableArray>> hasher;
  1122. return hasher(value);
  1123. }
  1124. size_t ManagedSerializableFieldDataList::getHash()
  1125. {
  1126. std::hash<std::shared_ptr<ManagedSerializableList>> hasher;
  1127. return hasher(value);
  1128. }
  1129. size_t ManagedSerializableFieldDataDictionary::getHash()
  1130. {
  1131. std::hash<std::shared_ptr<ManagedSerializableDictionary>> hasher;
  1132. return hasher(value);
  1133. }
  1134. void ManagedSerializableFieldDataObject::serialize()
  1135. {
  1136. if (value != nullptr)
  1137. value->serialize();
  1138. }
  1139. void ManagedSerializableFieldDataObject::deserialize()
  1140. {
  1141. if (value != nullptr)
  1142. value->deserialize();
  1143. }
  1144. void ManagedSerializableFieldDataArray::serialize()
  1145. {
  1146. if (value != nullptr)
  1147. value->serialize();
  1148. }
  1149. void ManagedSerializableFieldDataArray::deserialize()
  1150. {
  1151. if (value != nullptr)
  1152. value->deserialize();
  1153. }
  1154. void ManagedSerializableFieldDataList::serialize()
  1155. {
  1156. if (value != nullptr)
  1157. value->serialize();
  1158. }
  1159. void ManagedSerializableFieldDataList::deserialize()
  1160. {
  1161. if (value != nullptr)
  1162. value->deserialize();
  1163. }
  1164. void ManagedSerializableFieldDataDictionary::serialize()
  1165. {
  1166. if (value != nullptr)
  1167. value->serialize();
  1168. }
  1169. void ManagedSerializableFieldDataDictionary::deserialize()
  1170. {
  1171. if (value != nullptr)
  1172. value->deserialize();
  1173. }
  1174. RTTITypeBase* ManagedSerializableFieldKey::getRTTIStatic()
  1175. {
  1176. return ManagedSerializableFieldKeyRTTI::instance();
  1177. }
  1178. RTTITypeBase* ManagedSerializableFieldKey::getRTTI() const
  1179. {
  1180. return ManagedSerializableFieldKey::getRTTIStatic();
  1181. }
  1182. RTTITypeBase* ManagedSerializableFieldData::getRTTIStatic()
  1183. {
  1184. return ManagedSerializableFieldDataRTTI::instance();
  1185. }
  1186. RTTITypeBase* ManagedSerializableFieldData::getRTTI() const
  1187. {
  1188. return ManagedSerializableFieldData::getRTTIStatic();
  1189. }
  1190. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTIStatic()
  1191. {
  1192. return ManagedSerializableFieldDataEntryRTTI::instance();
  1193. }
  1194. RTTITypeBase* ManagedSerializableFieldDataEntry::getRTTI() const
  1195. {
  1196. return ManagedSerializableFieldDataEntry::getRTTIStatic();
  1197. }
  1198. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTIStatic()
  1199. {
  1200. return ManagedSerializableFieldDataBoolRTTI::instance();
  1201. }
  1202. RTTITypeBase* ManagedSerializableFieldDataBool::getRTTI() const
  1203. {
  1204. return ManagedSerializableFieldDataBool::getRTTIStatic();
  1205. }
  1206. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTIStatic()
  1207. {
  1208. return ManagedSerializableFieldDataCharRTTI::instance();
  1209. }
  1210. RTTITypeBase* ManagedSerializableFieldDataChar::getRTTI() const
  1211. {
  1212. return ManagedSerializableFieldDataChar::getRTTIStatic();
  1213. }
  1214. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTIStatic()
  1215. {
  1216. return ManagedSerializableFieldDataI8RTTI::instance();
  1217. }
  1218. RTTITypeBase* ManagedSerializableFieldDataI8::getRTTI() const
  1219. {
  1220. return ManagedSerializableFieldDataI8::getRTTIStatic();
  1221. }
  1222. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTIStatic()
  1223. {
  1224. return ManagedSerializableFieldDataU8RTTI::instance();
  1225. }
  1226. RTTITypeBase* ManagedSerializableFieldDataU8::getRTTI() const
  1227. {
  1228. return ManagedSerializableFieldDataU8::getRTTIStatic();
  1229. }
  1230. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTIStatic()
  1231. {
  1232. return ManagedSerializableFieldDataI16RTTI::instance();
  1233. }
  1234. RTTITypeBase* ManagedSerializableFieldDataI16::getRTTI() const
  1235. {
  1236. return ManagedSerializableFieldDataI16::getRTTIStatic();
  1237. }
  1238. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTIStatic()
  1239. {
  1240. return ManagedSerializableFieldDataU16RTTI::instance();
  1241. }
  1242. RTTITypeBase* ManagedSerializableFieldDataU16::getRTTI() const
  1243. {
  1244. return ManagedSerializableFieldDataU16::getRTTIStatic();
  1245. }
  1246. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTIStatic()
  1247. {
  1248. return ManagedSerializableFieldDataI32RTTI::instance();
  1249. }
  1250. RTTITypeBase* ManagedSerializableFieldDataI32::getRTTI() const
  1251. {
  1252. return ManagedSerializableFieldDataI32::getRTTIStatic();
  1253. }
  1254. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTIStatic()
  1255. {
  1256. return ManagedSerializableFieldDataU32RTTI::instance();
  1257. }
  1258. RTTITypeBase* ManagedSerializableFieldDataU32::getRTTI() const
  1259. {
  1260. return ManagedSerializableFieldDataU32::getRTTIStatic();
  1261. }
  1262. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTIStatic()
  1263. {
  1264. return ManagedSerializableFieldDataI64RTTI::instance();
  1265. }
  1266. RTTITypeBase* ManagedSerializableFieldDataI64::getRTTI() const
  1267. {
  1268. return ManagedSerializableFieldDataI64::getRTTIStatic();
  1269. }
  1270. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTIStatic()
  1271. {
  1272. return ManagedSerializableFieldDataU64RTTI::instance();
  1273. }
  1274. RTTITypeBase* ManagedSerializableFieldDataU64::getRTTI() const
  1275. {
  1276. return ManagedSerializableFieldDataU64::getRTTIStatic();
  1277. }
  1278. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTIStatic()
  1279. {
  1280. return ManagedSerializableFieldDataFloatRTTI::instance();
  1281. }
  1282. RTTITypeBase* ManagedSerializableFieldDataFloat::getRTTI() const
  1283. {
  1284. return ManagedSerializableFieldDataFloat::getRTTIStatic();
  1285. }
  1286. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTIStatic()
  1287. {
  1288. return ManagedSerializableFieldDataDoubleRTTI::instance();
  1289. }
  1290. RTTITypeBase* ManagedSerializableFieldDataDouble::getRTTI() const
  1291. {
  1292. return ManagedSerializableFieldDataDouble::getRTTIStatic();
  1293. }
  1294. RTTITypeBase* ManagedSerializableFieldDataString::getRTTIStatic()
  1295. {
  1296. return ManagedSerializableFieldDataStringRTTI::instance();
  1297. }
  1298. RTTITypeBase* ManagedSerializableFieldDataString::getRTTI() const
  1299. {
  1300. return ManagedSerializableFieldDataString::getRTTIStatic();
  1301. }
  1302. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTIStatic()
  1303. {
  1304. return ManagedSerializableFieldDataResourceRefRTTI::instance();
  1305. }
  1306. RTTITypeBase* ManagedSerializableFieldDataResourceRef::getRTTI() const
  1307. {
  1308. return ManagedSerializableFieldDataResourceRef::getRTTIStatic();
  1309. }
  1310. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTIStatic()
  1311. {
  1312. return ManagedSerializableFieldDataGameObjectRefRTTI::instance();
  1313. }
  1314. RTTITypeBase* ManagedSerializableFieldDataGameObjectRef::getRTTI() const
  1315. {
  1316. return ManagedSerializableFieldDataGameObjectRef::getRTTIStatic();
  1317. }
  1318. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTIStatic()
  1319. {
  1320. return ManagedSerializableFieldDataObjectRTTI::instance();
  1321. }
  1322. RTTITypeBase* ManagedSerializableFieldDataObject::getRTTI() const
  1323. {
  1324. return ManagedSerializableFieldDataObject::getRTTIStatic();
  1325. }
  1326. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTIStatic()
  1327. {
  1328. return ManagedSerializableFieldDataArrayRTTI::instance();
  1329. }
  1330. RTTITypeBase* ManagedSerializableFieldDataArray::getRTTI() const
  1331. {
  1332. return ManagedSerializableFieldDataArray::getRTTIStatic();
  1333. }
  1334. RTTITypeBase* ManagedSerializableFieldDataList::getRTTIStatic()
  1335. {
  1336. return ManagedSerializableFieldDataListRTTI::instance();
  1337. }
  1338. RTTITypeBase* ManagedSerializableFieldDataList::getRTTI() const
  1339. {
  1340. return ManagedSerializableFieldDataList::getRTTIStatic();
  1341. }
  1342. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTIStatic()
  1343. {
  1344. return ManagedSerializableFieldDataDictionaryRTTI::instance();
  1345. }
  1346. RTTITypeBase* ManagedSerializableFieldDataDictionary::getRTTI() const
  1347. {
  1348. return ManagedSerializableFieldDataDictionary::getRTTIStatic();
  1349. }
  1350. }