BsScriptSerializableObject.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "BsScriptSerializableObject.h"
  2. #include "BsScriptSerializableField.h"
  3. #include "BsRuntimeScriptObjects.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. namespace BansheeEngine
  9. {
  10. MonoField* ScriptSerializableObject::FieldsField = nullptr;
  11. ScriptSerializableObject::ScriptSerializableObject(const ManagedSerializableTypeInfoPtr& typeInfo)
  12. :mTypeInfo(typeInfo)
  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. ScriptSerializableObject* ScriptSerializableObject::create(const ManagedSerializableTypeInfoPtr& typeInfo, MonoObject* object)
  27. {
  28. ManagedSerializableTypeInfoObject* objTypeInfo = static_cast<ManagedSerializableTypeInfoObject*>(typeInfo.get());
  29. ManagedSerializableObjectInfoPtr objInfo;
  30. RuntimeScriptObjects::instance().getSerializableObjectInfo(objTypeInfo->mTypeNamespace, objTypeInfo->mTypeName, objInfo);
  31. MonoObject* managedInstance = metaData.scriptClass->createInstance();
  32. return createInternal(managedInstance, objInfo);
  33. }
  34. void ScriptSerializableObject::internal_createInstance(MonoObject* instance, MonoReflectionType* type, MonoObject* object)
  35. {
  36. MonoType* internalType = mono_reflection_type_get_type(type);
  37. ::MonoClass* monoClass = mono_type_get_class(internalType);
  38. String elementNs = mono_class_get_namespace(monoClass);
  39. String elementTypeName = mono_class_get_name(monoClass);
  40. ManagedSerializableObjectInfoPtr objInfo;
  41. RuntimeScriptObjects::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo);
  42. createInternal(instance, objInfo);
  43. }
  44. ScriptSerializableObject* ScriptSerializableObject::createInternal(MonoObject* instance, const ManagedSerializableObjectInfoPtr& objInfo)
  45. {
  46. ManagedSerializableTypeInfoPtr typeInfo;
  47. if(objInfo != nullptr)
  48. typeInfo = objInfo->mTypeInfo;
  49. ScriptSerializableObject* nativeInstance = new (cm_alloc<ScriptSerializableObject>()) ScriptSerializableObject(typeInfo);
  50. nativeInstance->createInstance(instance);
  51. metaData.thisPtrField->setValue(instance, &nativeInstance);
  52. if(objInfo != nullptr)
  53. {
  54. ::MonoClass* serializableFieldClass = ScriptSerializableField::getMetaData()->scriptClass->_getInternalClass();
  55. MonoArray* serializableFieldArray = mono_array_new(MonoManager::instance().getDomain(),
  56. serializableFieldClass, (UINT32)objInfo->mFields.size());
  57. UINT32 i = 0;
  58. for(auto& field : objInfo->mFields)
  59. {
  60. ScriptSerializableField* serializableField = ScriptSerializableField::create(instance, field.second);
  61. MonoObject* fieldManagedInstance = serializableField->getManagedInstance();
  62. void* elemAddr = mono_array_addr_with_size(serializableFieldArray, sizeof(MonoObject*), i);
  63. memcpy(elemAddr, &fieldManagedInstance, sizeof(MonoObject*));
  64. i++;
  65. }
  66. FieldsField->setValue(instance, serializableFieldArray);
  67. }
  68. return nativeInstance;
  69. }
  70. void ScriptSerializableObject::internal_destroyInstance(ScriptSerializableObject* nativeInstance)
  71. {
  72. nativeInstance->~ScriptSerializableObject();
  73. cm_free(nativeInstance);
  74. }
  75. }