BsProjectLibraryEntriesRTTI.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsProjectLibraryEntries.h"
  5. namespace BansheeEngine
  6. {
  7. class ProjectLibraryEntriesRTTI : public RTTIType<ProjectLibraryEntries, IReflectable, ProjectLibraryEntriesRTTI>
  8. {
  9. private:
  10. ProjectLibrary::DirectoryEntry& getRootElement(ProjectLibraryEntries* obj) { return obj->mRootEntry; }
  11. void setRootElement(ProjectLibraryEntries* obj, ProjectLibrary::DirectoryEntry& val) { obj->mRootEntry = val; }
  12. public:
  13. ProjectLibraryEntriesRTTI()
  14. {
  15. addPlainField("mRootElement", 0, &ProjectLibraryEntriesRTTI::getRootElement, &ProjectLibraryEntriesRTTI::setRootElement);
  16. }
  17. virtual const String& getRTTIName()
  18. {
  19. static String name = "ProjectLibraryEntries";
  20. return name;
  21. }
  22. virtual UINT32 getRTTIId()
  23. {
  24. return TID_ProjectLibraryEntries;
  25. }
  26. virtual std::shared_ptr<IReflectable> newRTTIObject()
  27. {
  28. return ProjectLibraryEntries::createEmpty();
  29. }
  30. };
  31. }
  32. namespace BansheeEngine
  33. {
  34. template<> struct RTTIPlainType<BansheeEngine::ProjectLibrary::ResourceEntry>
  35. {
  36. enum { id = BansheeEngine::TID_ProjectLibraryResEntry }; enum { hasDynamicSize = 1 };
  37. static void toMemory(const BansheeEngine::ProjectLibrary::ResourceEntry& data, char* memory)
  38. {
  39. UINT32 size = 0;
  40. char* memoryStart = memory;
  41. memory += sizeof(UINT32);
  42. size += sizeof(UINT32);
  43. UINT32 type = (UINT32)data.type;
  44. memory = rttiWriteElem(type, memory, size);
  45. memory = rttiWriteElem(data.path, memory, size);
  46. memory = rttiWriteElem(data.elementName, memory, size);
  47. memory = rttiWriteElem(data.lastUpdateTime, memory, size);
  48. memcpy(memoryStart, &size, sizeof(UINT32));
  49. }
  50. static UINT32 fromMemory(BansheeEngine::ProjectLibrary::ResourceEntry& data, char* memory)
  51. {
  52. UINT32 size = 0;
  53. memcpy(&size, memory, sizeof(UINT32));
  54. memory += sizeof(UINT32);
  55. UINT32 type;
  56. memory = rttiReadElem(type, memory);
  57. data.type = (BansheeEngine::ProjectLibrary::LibraryEntryType)type;
  58. memory = rttiReadElem(data.path, memory);
  59. memory = rttiReadElem(data.elementName, memory);
  60. memory = rttiReadElem(data.lastUpdateTime, memory);
  61. return size;
  62. }
  63. static UINT32 getDynamicSize(const BansheeEngine::ProjectLibrary::ResourceEntry& data)
  64. {
  65. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) + rttiGetElemSize(data.elementName) +
  66. rttiGetElemSize(data.lastUpdateTime);
  67. #if BS_DEBUG_MODE
  68. if(dataSize > std::numeric_limits<UINT32>::max())
  69. {
  70. __string_throwDataOverflowException();
  71. }
  72. #endif
  73. return (UINT32)dataSize;
  74. }
  75. };
  76. template<> struct RTTIPlainType<BansheeEngine::ProjectLibrary::DirectoryEntry>
  77. {
  78. enum { id = BansheeEngine::TID_ProjectLibraryDirEntry }; enum { hasDynamicSize = 1 };
  79. static void toMemory(const BansheeEngine::ProjectLibrary::DirectoryEntry& data, char* memory)
  80. {
  81. UINT32 size = 0;
  82. char* memoryStart = memory;
  83. memory += sizeof(UINT32);
  84. size += sizeof(UINT32);
  85. memory = rttiWriteElem(data.type, memory, size);
  86. memory = rttiWriteElem(data.path, memory, size);
  87. memory = rttiWriteElem(data.elementName, memory, size);
  88. UINT32 numChildren = (UINT32)data.mChildren.size();
  89. memory = rttiWriteElem(numChildren, memory, size);
  90. for(auto& child : data.mChildren)
  91. {
  92. if(child->type == BansheeEngine::ProjectLibrary::LibraryEntryType::File)
  93. {
  94. BansheeEngine::ProjectLibrary::ResourceEntry* childResEntry = static_cast<BansheeEngine::ProjectLibrary::ResourceEntry*>(child);
  95. memory = rttiWriteElem(*childResEntry, memory, size);
  96. }
  97. else if(child->type == BansheeEngine::ProjectLibrary::LibraryEntryType::Directory)
  98. {
  99. BansheeEngine::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<BansheeEngine::ProjectLibrary::DirectoryEntry*>(child);
  100. memory = rttiWriteElem(*childDirEntry, memory, size);
  101. }
  102. }
  103. memcpy(memoryStart, &size, sizeof(UINT32));
  104. }
  105. static UINT32 fromMemory(BansheeEngine::ProjectLibrary::DirectoryEntry& data, char* memory)
  106. {
  107. UINT32 size = 0;
  108. memcpy(&size, memory, sizeof(UINT32));
  109. memory += sizeof(UINT32);
  110. memory = rttiReadElem(data.type, memory);
  111. memory = rttiReadElem(data.path, memory);
  112. memory = rttiReadElem(data.elementName, memory);
  113. UINT32 numChildren = 0;
  114. memory = rttiReadElem(numChildren, memory);
  115. for(UINT32 i = 0; i < numChildren; i++)
  116. {
  117. BansheeEngine::ProjectLibrary::LibraryEntryType childType = BansheeEngine::ProjectLibrary::LibraryEntryType::File;
  118. rttiReadElem(childType, memory + sizeof(UINT32)); // Skip ahead to get type
  119. if(childType == BansheeEngine::ProjectLibrary::LibraryEntryType::File)
  120. {
  121. BansheeEngine::ProjectLibrary::ResourceEntry* childResEntry = bs_new<BansheeEngine::ProjectLibrary::ResourceEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  122. memory = rttiReadElem(*childResEntry, memory);
  123. childResEntry->parent = &data;
  124. data.mChildren.push_back(childResEntry);
  125. }
  126. else if(childType == BansheeEngine::ProjectLibrary::LibraryEntryType::Directory)
  127. {
  128. BansheeEngine::ProjectLibrary::DirectoryEntry* childDirEntry = bs_new<BansheeEngine::ProjectLibrary::DirectoryEntry>(); // Note: Assumes that ProjectLibrary takes care of the cleanup
  129. memory = rttiReadElem(*childDirEntry, memory);
  130. childDirEntry->parent = &data;
  131. data.mChildren.push_back(childDirEntry);
  132. }
  133. }
  134. return size;
  135. }
  136. static UINT32 getDynamicSize(const BansheeEngine::ProjectLibrary::DirectoryEntry& data)
  137. {
  138. UINT64 dataSize = sizeof(UINT32) + rttiGetElemSize(data.type) + rttiGetElemSize(data.path) + rttiGetElemSize(data.elementName);
  139. dataSize += sizeof(UINT32);
  140. for(auto& child : data.mChildren)
  141. {
  142. if(child->type == BansheeEngine::ProjectLibrary::LibraryEntryType::File)
  143. {
  144. BansheeEngine::ProjectLibrary::ResourceEntry* childResEntry = static_cast<BansheeEngine::ProjectLibrary::ResourceEntry*>(child);
  145. dataSize += rttiGetElemSize(*childResEntry);
  146. }
  147. else if(child->type == BansheeEngine::ProjectLibrary::LibraryEntryType::Directory)
  148. {
  149. BansheeEngine::ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<BansheeEngine::ProjectLibrary::DirectoryEntry*>(child);
  150. dataSize += rttiGetElemSize(*childDirEntry);
  151. }
  152. }
  153. #if BS_DEBUG_MODE
  154. if(dataSize > std::numeric_limits<UINT32>::max())
  155. {
  156. __string_throwDataOverflowException();
  157. }
  158. #endif
  159. return (UINT32)dataSize;
  160. }
  161. };
  162. }