BsDockManagerLayoutRTTI.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsDockManagerLayout.h"
  4. #include "BsRTTIType.h"
  5. namespace BansheeEngine
  6. {
  7. class DockManagerLayoutRTTI : public RTTIType<DockManagerLayout, IReflectable, DockManagerLayoutRTTI>
  8. {
  9. private:
  10. DockManagerLayout::Entry& getRootEntry(DockManagerLayout* obj) { return obj->mRootEntry; }
  11. void setRootEntry(DockManagerLayout* obj, DockManagerLayout::Entry& val) { obj->mRootEntry = val; }
  12. public:
  13. DockManagerLayoutRTTI()
  14. {
  15. addPlainField("mRootEntry", 0, &DockManagerLayoutRTTI::getRootEntry, &DockManagerLayoutRTTI::setRootEntry);
  16. }
  17. void onDeserializationEnded(IReflectable* obj) override
  18. {
  19. DockManagerLayout* layout = static_cast<DockManagerLayout*>(obj);
  20. Stack<DockManagerLayout::Entry*> todo;
  21. todo.push(&layout->mRootEntry);
  22. while (!todo.empty())
  23. {
  24. DockManagerLayout::Entry* current = todo.top();
  25. todo.pop();
  26. if (!current->isLeaf)
  27. {
  28. current->children[0]->parent = current;
  29. current->children[1]->parent = current;
  30. todo.push(current->children[0]);
  31. todo.push(current->children[1]);
  32. }
  33. }
  34. }
  35. virtual const String& getRTTIName() override
  36. {
  37. static String name = "DockManagerLayout";
  38. return name;
  39. }
  40. virtual UINT32 getRTTIId() override
  41. {
  42. return TID_DockManagerLayout;
  43. }
  44. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  45. {
  46. return bs_shared_ptr_new<DockManagerLayout>();
  47. }
  48. };
  49. }
  50. namespace BansheeEngine
  51. {
  52. template<> struct RTTIPlainType<BansheeEngine::DockManagerLayout::Entry>
  53. {
  54. enum { id = BansheeEngine::TID_DockManagerLayoutEntry }; enum { hasDynamicSize = 1 };
  55. static void toMemory(const BansheeEngine::DockManagerLayout::Entry& data, char* memory)
  56. {
  57. UINT32 size = 0;
  58. char* memoryStart = memory;
  59. memory += sizeof(UINT32);
  60. size += sizeof(UINT32);
  61. memory = rttiWriteElem(data.isLeaf, memory, size);
  62. memory = rttiWriteElem(data.horizontalSplit, memory, size);
  63. memory = rttiWriteElem(data.splitPosition, memory, size);
  64. memory = rttiWriteElem(data.widgetNames, memory, size);
  65. if(!data.isLeaf)
  66. {
  67. memory = rttiWriteElem(*data.children[0], memory, size);
  68. memory = rttiWriteElem(*data.children[1], memory, size);
  69. }
  70. memcpy(memoryStart, &size, sizeof(UINT32));
  71. }
  72. static UINT32 fromMemory(BansheeEngine::DockManagerLayout::Entry& data, char* memory)
  73. {
  74. UINT32 size = 0;
  75. memcpy(&size, memory, sizeof(UINT32));
  76. memory += sizeof(UINT32);
  77. memory = rttiReadElem(data.isLeaf, memory);
  78. memory = rttiReadElem(data.horizontalSplit, memory);
  79. memory = rttiReadElem(data.splitPosition, memory);
  80. memory = rttiReadElem(data.widgetNames, memory);
  81. if(!data.isLeaf)
  82. {
  83. data.children[0] = bs_new<BansheeEngine::DockManagerLayout::Entry>();
  84. data.children[1] = bs_new<BansheeEngine::DockManagerLayout::Entry>();
  85. memory = rttiReadElem(*data.children[0], memory);
  86. memory = rttiReadElem(*data.children[1], memory);
  87. data.children[0]->parent = &data;
  88. data.children[1]->parent = &data;
  89. }
  90. return size;
  91. }
  92. static UINT32 getDynamicSize(const BansheeEngine::DockManagerLayout::Entry& data)
  93. {
  94. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.isLeaf) + rttiGetElemSize(data.horizontalSplit) +
  95. rttiGetElemSize(data.splitPosition) + rttiGetElemSize(data.widgetNames);
  96. if(!data.isLeaf)
  97. {
  98. dataSize += rttiGetElemSize(*data.children[0]);
  99. dataSize += rttiGetElemSize(*data.children[1]);
  100. }
  101. #if BS_DEBUG_MODE
  102. if(dataSize > std::numeric_limits<UINT32>::max())
  103. {
  104. __string_throwDataOverflowException();
  105. }
  106. #endif
  107. return (UINT32)dataSize;
  108. }
  109. };
  110. }