BsProjectLibraryEntriesRTTI.h 6.8 KB

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