BsProjectLibraryEntriesRTTI.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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 "Reflection/BsRTTIType.h"
  6. #include "Reflection/BsRTTIPlain.h"
  7. #include "RTTI/BsPathRTTI.h"
  8. #include "Library/BsProjectLibraryEntries.h"
  9. #include "String/BsUnicode.h"
  10. namespace bs
  11. {
  12. /** @cond RTTI */
  13. /** @addtogroup RTTI-Impl-Editor
  14. * @{
  15. */
  16. class ProjectLibraryEntriesRTTI : public RTTIType<ProjectLibraryEntries, IReflectable, ProjectLibraryEntriesRTTI>
  17. {
  18. private:
  19. ProjectLibrary::DirectoryEntry& getRootElement(ProjectLibraryEntries* obj) { return *obj->mRootEntry; }
  20. void setRootElement(ProjectLibraryEntries* obj, ProjectLibrary::DirectoryEntry& val)
  21. {
  22. obj->mRootEntry = bs_ushared_ptr_new<ProjectLibrary::DirectoryEntry>(val);
  23. for(auto& child : obj->mRootEntry->mChildren)
  24. child->parent = obj->mRootEntry.get();
  25. }
  26. public:
  27. ProjectLibraryEntriesRTTI()
  28. {
  29. addPlainField("mRootElement", 0, &ProjectLibraryEntriesRTTI::getRootElement, &ProjectLibraryEntriesRTTI::setRootElement);
  30. }
  31. virtual const String& getRTTIName()
  32. {
  33. static String name = "ProjectLibraryEntries";
  34. return name;
  35. }
  36. virtual UINT32 getRTTIId()
  37. {
  38. return TID_ProjectLibraryEntries;
  39. }
  40. virtual SPtr<IReflectable> newRTTIObject()
  41. {
  42. return ProjectLibraryEntries::createEmpty();
  43. }
  44. };
  45. template<> struct RTTIPlainType<ProjectLibrary::FileEntry>
  46. {
  47. enum { id = TID_ProjectLibraryResEntry }; enum { hasDynamicSize = 1 };
  48. static BitLength toMemory(const ProjectLibrary::FileEntry& data, Bitstream& stream, const RTTIFieldInfo& fieldInfo, bool compress)
  49. {
  50. return rtti_write_with_size_header(stream, data, compress, [&data, &stream]()
  51. {
  52. BitLength size = 0;
  53. // For compatibility, encoding the name as a wide string
  54. WString elemName = UTF8::toWide(data.elementName);
  55. auto type = (uint32_t)data.type;
  56. size += rtti_write(type, stream);
  57. size += rtti_write(data.path, stream);
  58. size += rtti_write(elemName, stream);
  59. size += rtti_write(data.lastUpdateTime, stream);
  60. return size;
  61. });
  62. }
  63. static BitLength fromMemory(ProjectLibrary::FileEntry& data, Bitstream& stream, const RTTIFieldInfo& fieldInfo, bool compress)
  64. {
  65. BitLength size;
  66. rtti_read_size_header(stream, compress, size);
  67. uint32_t type;
  68. rtti_read(type, stream);
  69. data.type = (ProjectLibrary::LibraryEntryType)type;
  70. rtti_read(data.path, stream);
  71. WString elemName;
  72. rtti_read(elemName, stream);
  73. data.elementName = UTF8::fromWide(elemName);
  74. data.elementNameHash = bs_hash(UTF8::toLower(data.elementName));
  75. rtti_read(data.lastUpdateTime, stream);
  76. return size;
  77. }
  78. static BitLength getSize(const ProjectLibrary::FileEntry& data, const RTTIFieldInfo& fieldInfo, bool compress)
  79. {
  80. WString elemName = UTF8::toWide(data.elementName);
  81. BitLength dataSize = rtti_size(data.type) + rtti_size(data.path) +
  82. rtti_size(elemName) + rtti_size(data.lastUpdateTime);
  83. rtti_add_header_size(dataSize, compress);
  84. return dataSize;
  85. }
  86. };
  87. template<> struct RTTIPlainType<ProjectLibrary::DirectoryEntry>
  88. {
  89. enum { id = TID_ProjectLibraryDirEntry }; enum { hasDynamicSize = 1 };
  90. static BitLength toMemory(const ProjectLibrary::DirectoryEntry& data, Bitstream& stream, const RTTIFieldInfo& fieldInfo, bool compress)
  91. {
  92. return rtti_write_with_size_header(stream, data, compress, [&data, &stream]()
  93. {
  94. BitLength size = 0;
  95. // For compatibility, encoding the name as a wide string
  96. WString elemName = UTF8::toWide(data.elementName);
  97. size += rtti_write(data.type, stream);
  98. size += rtti_write(data.path, stream);
  99. size += rtti_write(elemName, stream);
  100. uint32_t numChildren = (UINT32)data.mChildren.size();
  101. size += rtti_write(numChildren, stream);
  102. for(auto& child : data.mChildren)
  103. {
  104. if(child->type == ProjectLibrary::LibraryEntryType::File)
  105. {
  106. auto* childResEntry = static_cast<ProjectLibrary::FileEntry*>(child.get());
  107. size += rtti_write(*childResEntry, stream);
  108. }
  109. else if(child->type == ProjectLibrary::LibraryEntryType::Directory)
  110. {
  111. auto* childDirEntry = static_cast<ProjectLibrary::DirectoryEntry*>(child.get());
  112. size += rtti_write(*childDirEntry, stream);
  113. }
  114. }
  115. return size;
  116. });
  117. }
  118. static BitLength fromMemory(ProjectLibrary::DirectoryEntry& data, Bitstream& stream, const RTTIFieldInfo& fieldInfo, bool compress)
  119. {
  120. BitLength size;
  121. rtti_read_size_header(stream, compress, size);
  122. rtti_read(data.type, stream);
  123. rtti_read(data.path, stream);
  124. WString elemName;
  125. rtti_read(elemName, stream);
  126. data.elementName = UTF8::fromWide(elemName);
  127. data.elementNameHash = bs_hash(UTF8::toLower(data.elementName));
  128. UINT32 numChildren = 0;
  129. rtti_read(numChildren, stream);
  130. for (UINT32 i = 0; i < numChildren; i++)
  131. {
  132. ProjectLibrary::LibraryEntryType childType = ProjectLibrary::LibraryEntryType::File;
  133. uint64_t prevLoc = stream.tell();
  134. stream.skipBytes(sizeof(uint32_t)); // Skip ahead to get the type
  135. rtti_read(childType, stream);
  136. stream.seek(prevLoc);
  137. if (childType == ProjectLibrary::LibraryEntryType::File)
  138. {
  139. USPtr<ProjectLibrary::FileEntry> childResEntry = bs_ushared_ptr_new<ProjectLibrary::FileEntry>();
  140. // Note: Assumes that ProjectLibrary takes care of the cleanup
  141. rtti_read(*childResEntry, stream);
  142. childResEntry->parent = &data;
  143. data.mChildren.push_back(childResEntry);
  144. }
  145. else if (childType == ProjectLibrary::LibraryEntryType::Directory)
  146. {
  147. USPtr<ProjectLibrary::DirectoryEntry> childDirEntry = bs_ushared_ptr_new<ProjectLibrary::DirectoryEntry>();
  148. // Note: Assumes that ProjectLibrary takes care of the cleanup
  149. rtti_read(*childDirEntry, stream);
  150. childDirEntry->parent = &data;
  151. data.mChildren.push_back(childDirEntry);
  152. }
  153. }
  154. return size;
  155. }
  156. static BitLength getSize(const ProjectLibrary::DirectoryEntry& data, const RTTIFieldInfo& fieldInfo, bool compress)
  157. {
  158. WString elemName = UTF8::toWide(data.elementName);
  159. BitLength dataSize = rtti_size(data.type) + rtti_size(data.path) + rtti_size(elemName) + sizeof(uint32_t);
  160. for(auto& child : data.mChildren)
  161. {
  162. if(child->type == ProjectLibrary::LibraryEntryType::File)
  163. {
  164. ProjectLibrary::FileEntry* childResEntry = static_cast<ProjectLibrary::FileEntry*>(child.get());
  165. dataSize += rtti_size(*childResEntry);
  166. }
  167. else if(child->type == ProjectLibrary::LibraryEntryType::Directory)
  168. {
  169. ProjectLibrary::DirectoryEntry* childDirEntry = static_cast<ProjectLibrary::DirectoryEntry*>(child.get());
  170. dataSize += rtti_size(*childDirEntry);
  171. }
  172. }
  173. rtti_add_header_size(dataSize, compress);
  174. return dataSize;
  175. }
  176. };
  177. /** @} */
  178. /** @endcond */
  179. }