BsScriptSerializableArrayRTTI.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include "BsScriptEnginePrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "BsScriptSerializableArray.h"
  5. #include "BsRuntimeScriptObjects.h"
  6. #include "BsMonoManager.h"
  7. namespace BansheeEngine
  8. {
  9. class BS_SCR_BE_EXPORT ScriptSerializableArrayRTTI : public CM::RTTIType<ScriptSerializableArray, CM::IReflectable, ScriptSerializableArrayRTTI>
  10. {
  11. private:
  12. ScriptSerializableTypeInfoArrayPtr getTypeInfo(ScriptSerializableArray* obj)
  13. {
  14. return obj->mArrayTypeInfo;
  15. }
  16. void setTypeInfo(ScriptSerializableArray* obj, ScriptSerializableTypeInfoArrayPtr val)
  17. {
  18. obj->mArrayTypeInfo = val;
  19. }
  20. ScriptSerializableFieldDataPtr getArrayEntry(ScriptSerializableArray* obj, CM::UINT32 arrayIdx)
  21. {
  22. return obj->mArrayEntries[arrayIdx];
  23. }
  24. void setArrayEntry(ScriptSerializableArray* obj, CM::UINT32 arrayIdx, ScriptSerializableFieldDataPtr val)
  25. {
  26. obj->mArrayEntries[arrayIdx] = val;
  27. }
  28. CM::UINT32 getNumArrayEntries(ScriptSerializableArray* obj)
  29. {
  30. return (CM::UINT32)obj->mArrayEntries.size();
  31. }
  32. void setNumArrayEntries(ScriptSerializableArray* obj, CM::UINT32 numEntries)
  33. {
  34. obj->mArrayEntries.resize(numEntries);
  35. }
  36. public:
  37. ScriptSerializableArrayRTTI()
  38. {
  39. addReflectablePtrField("mArrayTypeInfo", 0, &ScriptSerializableArrayRTTI::getTypeInfo, &ScriptSerializableArrayRTTI::setTypeInfo);
  40. addReflectablePtrArrayField("mArrayEntries", 1, &ScriptSerializableArrayRTTI::getArrayEntry, &ScriptSerializableArrayRTTI::getNumArrayEntries,
  41. &ScriptSerializableArrayRTTI::setArrayEntry, &ScriptSerializableArrayRTTI::setNumArrayEntries);
  42. }
  43. virtual void onDeserializationEnded(CM::IReflectable* obj)
  44. {
  45. ScriptSerializableArray* serializableObject = static_cast<ScriptSerializableArray*>(obj);
  46. uint32_t lengths[1] = { serializableObject->mNumElements };
  47. MonoArray* newArray = mono_array_new_full(MonoManager::instance().getDomain(),
  48. nullptr, (uintptr_t*)lengths, nullptr); // TODO - Type is nullptr
  49. serializableObject->mManagedInstance = (MonoObject*)newArray;
  50. CM::UINT32 idx = 0;
  51. for(auto& arrayEntry : serializableObject->mArrayEntries)
  52. {
  53. serializableObject->setFieldData(idx, arrayEntry);
  54. }
  55. }
  56. virtual const CM::String& getRTTIName()
  57. {
  58. static CM::String name = "ScriptSerializableArray";
  59. return name;
  60. }
  61. virtual CM::UINT32 getRTTIId()
  62. {
  63. return TID_ScriptSerializableArray;
  64. }
  65. virtual std::shared_ptr<CM::IReflectable> newRTTIObject()
  66. {
  67. return ScriptSerializableArray::createEmpty();
  68. }
  69. };
  70. }