2
0

BsScriptSerializableObject.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. numFields += (UINT32)mObjInfo->mFields.size();
  22. curType = curType->mBaseClass.lock();
  23. }
  24. mFieldEntries.resize(numFields);
  25. curType = mObjInfo;
  26. UINT32 curIdx = 0;
  27. while(curType != nullptr)
  28. {
  29. numFields += (UINT32)mObjInfo->mFields.size();
  30. for(auto& field : mObjInfo->mFields)
  31. {
  32. ScriptSerializableFieldKeyPtr fieldKey = ScriptSerializableFieldKey::create(curType->mTypeId, field.second->mFieldId);
  33. ScriptSerializableFieldDataPtr fieldData = getFieldData(field.second);
  34. mFieldEntries[curIdx] = ScriptSerializableFieldDataEntry::create(fieldKey, fieldData);
  35. curIdx++;
  36. }
  37. curType = curType->mBaseClass.lock();
  38. }
  39. }
  40. ScriptSerializableObjectPtr ScriptSerializableObject::create(MonoObject* managedInstance)
  41. {
  42. ::MonoClass* monoClass = mono_object_get_class(managedInstance);
  43. String elementNs = mono_class_get_namespace(monoClass);
  44. String elementTypeName = mono_class_get_name(monoClass);
  45. ScriptSerializableObjectInfoPtr objInfo;
  46. if(!RuntimeScriptObjects::instance().getSerializableObjectInfo(elementNs, elementTypeName, objInfo))
  47. return nullptr;
  48. return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately(), objInfo, managedInstance);
  49. }
  50. ScriptSerializableObjectPtr ScriptSerializableObject::createEmpty()
  51. {
  52. return cm_shared_ptr<ScriptSerializableObject>(ConstructPrivately());
  53. }
  54. void ScriptSerializableObject::setFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo, const ScriptSerializableFieldDataPtr& val)
  55. {
  56. setValue(fieldInfo, val->getValue(fieldInfo->mTypeInfo));
  57. }
  58. ScriptSerializableFieldDataPtr ScriptSerializableObject::getFieldData(const ScriptSerializableFieldInfoPtr& fieldInfo)
  59. {
  60. return ScriptSerializableFieldData::create(fieldInfo->mTypeInfo, getValue(fieldInfo));
  61. }
  62. void ScriptSerializableObject::setValue(const ScriptSerializableFieldInfoPtr& fieldInfo, void* val)
  63. {
  64. fieldInfo->mMonoField->setValue(mManagedInstance, val);
  65. }
  66. void* ScriptSerializableObject::getValue(const ScriptSerializableFieldInfoPtr& fieldInfo)
  67. {
  68. return fieldInfo->mMonoField->getValue(mManagedInstance);
  69. }
  70. RTTITypeBase* ScriptSerializableObject::getRTTIStatic()
  71. {
  72. return ScriptSerializableObjectRTTI::instance();
  73. }
  74. RTTITypeBase* ScriptSerializableObject::getRTTI() const
  75. {
  76. return ScriptSerializableObject::getRTTIStatic();
  77. }
  78. }