BsScriptSerializableObject.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "BsScriptSerializableObject.h"
  2. #include "BsScriptSerializableField.h"
  3. #include "BsScriptMeta.h"
  4. #include "BsMonoField.h"
  5. #include "BsMonoClass.h"
  6. #include "BsMonoManager.h"
  7. #include "BsManagedSerializableObject.h"
  8. #include "BsManagedSerializableObjectInfo.h"
  9. namespace BansheeEngine
  10. {
  11. MonoField* ScriptSerializableObject::FieldsField = nullptr;
  12. ScriptSerializableObject::ScriptSerializableObject()
  13. {
  14. }
  15. void ScriptSerializableObject::initMetaData()
  16. {
  17. metaData = ScriptMeta(BansheeEngineAssemblyName, "BansheeEngine", "SerializableObject", &ScriptSerializableObject::initRuntimeData);
  18. MonoManager::registerScriptType(&metaData);
  19. }
  20. void ScriptSerializableObject::initRuntimeData()
  21. {
  22. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptSerializableObject::internal_createInstance);
  23. metaData.scriptClass->addInternalCall("Internal_DestroyInstance", &ScriptSerializableObject::internal_destroyInstance);
  24. FieldsField = metaData.scriptClass->getField("_fields");
  25. }
  26. void ScriptSerializableObject::internal_createInstance(MonoObject* instance, MonoObject* object)
  27. {
  28. ScriptSerializableObject* nativeInstance = new (cm_alloc<ScriptSerializableObject>()) ScriptSerializableObject();
  29. nativeInstance->createInstance(instance);
  30. metaData.thisPtrField->setValue(instance, &nativeInstance);
  31. ManagedSerializableObjectPtr serializableObject = ManagedSerializableObject::create(object);
  32. if(serializableObject == nullptr) // Object is not serializable
  33. return;
  34. ManagedSerializableObjectInfoPtr objInfo = serializableObject->getObjectInfo();
  35. ::MonoClass* serializableFieldClass = ScriptSerializableField::getMetaData()->scriptClass->_getInternalClass();
  36. MonoArray* serializableFieldArray = mono_array_new(MonoManager::instance().getDomain(),
  37. serializableFieldClass, (UINT32)objInfo->mFields.size());
  38. UINT32 i = 0;
  39. for(auto& field : objInfo->mFields)
  40. {
  41. ScriptSerializableField* serializableField = ScriptSerializableField::create(instance, field.second);
  42. MonoObject* fieldManagedInstance = serializableField->getManagedInstance();
  43. void* elemAddr = mono_array_addr_with_size(serializableFieldArray, sizeof(MonoObject*), i);
  44. memcpy(elemAddr, &fieldManagedInstance, sizeof(MonoObject*));
  45. i++;
  46. }
  47. FieldsField->setValue(instance, serializableFieldArray);
  48. }
  49. void ScriptSerializableObject::internal_destroyInstance(ScriptSerializableObject* nativeInstance)
  50. {
  51. nativeInstance->~ScriptSerializableObject();
  52. cm_free(nativeInstance);
  53. }
  54. }