2
0

BsScriptSerializableObject.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "BsScriptSerializableObject.h"
  2. #include "BsScriptSerializableObjectRTTI.h"
  3. #include "BsScriptSerializableObjectInfo.h"
  4. #include "BsScriptSerializableField.h"
  5. #include "BsRuntimeScriptObjects.h"
  6. #include "BsMonoField.h"
  7. using namespace CamelotFramework;
  8. namespace BansheeEngine
  9. {
  10. ScriptSerializableObject::ScriptSerializableObject(const ConstructPrivately& dummy)
  11. :mManagedInstance(nullptr)
  12. {
  13. }
  14. ScriptSerializableObject::ScriptSerializableObject(const ConstructPrivately& dummy, ScriptSerializableObjectInfoPtr objInfo, MonoObject* managedInstance)
  15. :mObjInfo(objInfo), mManagedInstance(managedInstance)
  16. {
  17. ScriptSerializableObjectInfoPtr curType = mObjInfo;
  18. UINT32 numFields = 0;
  19. while(curType != nullptr)
  20. {
  21. for(auto& field : mObjInfo->mFields)
  22. {
  23. if(field.second->isSerializable())
  24. numFields++;
  25. }
  26. curType = curType->mBaseClass;
  27. }
  28. mFieldEntries.resize(numFields);
  29. curType = mObjInfo;
  30. UINT32 curIdx = 0;
  31. while(curType != nullptr)
  32. {
  33. for(auto& field : mObjInfo->mFields)
  34. {
  35. if(!field.second->isSerializable())
  36. continue;
  37. ScriptSerializableFieldKeyPtr fieldKey = ScriptSerializableFieldKey::create(curType->mTypeId, field.second->mFieldId);
  38. ScriptSerializableFieldDataPtr fieldData = getFieldData(field.second);
  39. mFieldEntries[curIdx] = ScriptSerializableFieldDataEntry::create(fieldKey, fieldData);
  40. curIdx++;
  41. }
  42. curType = curType->mBaseClass;
  43. }
  44. }
  45. ScriptSerializableObjectPtr ScriptSerializableObject::create(MonoObject* managedInstance)
  46. {
  47. ::MonoClass* monoClass = mono_object_get_class(managedInstance);
  48. String elementNs = mono_class_get_namespace(monoClass);
  49. String elementTypeName = mono_class_get_name(monoClass);
  50. ScriptSerializableObjectInfoPtr objInfo;
  51. if(!RuntimeScriptObjects::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo))
  52. return nullptr;
  53. return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately(), objInfo, managedInstance);
  54. }
  55. ScriptSerializableObjectPtr ScriptSerializableObject::createEmpty()
  56. {
  57. return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately());
  58. }
  59. void ScriptSerializableObject::setFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo, const ScriptSerializableFieldDataPtr& val)
  60. {
  61. setValue(fieldInfo, val->getValue(fieldInfo->mTypeInfo));
  62. }
  63. ScriptSerializableFieldDataPtr ScriptSerializableObject::getFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo)
  64. {
  65. return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, getValue(fieldInfo));
  66. }
  67. void ScriptSerializableObject::setValue(const ScriptSerializableFieldInfoPtr& fieldInfo, void* val)
  68. {
  69. fieldInfo->mMonoField->setValue(mManagedInstance, val);
  70. }
  71. void* ScriptSerializableObject::getValue(const ScriptSerializableFieldInfoPtr& fieldInfo)
  72. {
  73. return fieldInfo->mMonoField->getValue(mManagedInstance);
  74. }
  75. RTTITypeBase* ScriptSerializableObject::getRTTIStatic()
  76. {
  77. return ScriptSerializableObjectRTTI::instance();
  78. }
  79. RTTITypeBase* ScriptSerializableObject::getRTTI() const
  80. {
  81. return ScriptSerializableObject::getRTTIStatic();
  82. }
  83. }