BsProjectLibraryEntriesRTTI.h 6.8 KB

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