2
0

BsSerializedObject.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Serialization/BsSerializedObject.h"
  4. #include "RTTI/BsSerializedObjectRTTI.h"
  5. namespace bs
  6. {
  7. SPtr<SerializedInstance> SerializedField::clone(bool cloneData)
  8. {
  9. SPtr<SerializedField> copy = bs_shared_ptr_new<SerializedField>();
  10. copy->size = size;
  11. if (cloneData)
  12. {
  13. copy->value = (UINT8*)bs_alloc(size);
  14. memcpy(copy->value, value, size);
  15. copy->ownsMemory = true;
  16. }
  17. else
  18. {
  19. copy->value = value;
  20. copy->ownsMemory = false;
  21. }
  22. return copy;
  23. }
  24. SPtr<SerializedInstance> SerializedDataBlock::clone(bool cloneData)
  25. {
  26. SPtr<SerializedDataBlock> copy = bs_shared_ptr_new<SerializedDataBlock>();
  27. copy->size = size;
  28. if (cloneData)
  29. {
  30. if(stream->isFile())
  31. LOGWRN("Cloning a file stream. Streaming is disabled and stream data will be loaded into memory.");
  32. UINT8* data = (UINT8*)bs_alloc(size);
  33. stream->read(data, size);
  34. copy->stream = bs_shared_ptr_new<MemoryDataStream>(data, size);
  35. copy->offset = 0;
  36. }
  37. else
  38. {
  39. copy->stream = stream;
  40. copy->offset = offset;
  41. }
  42. return copy;
  43. }
  44. SPtr<SerializedInstance> SerializedObject::clone(bool cloneData)
  45. {
  46. SPtr<SerializedObject> copy = bs_shared_ptr_new<SerializedObject>();
  47. copy->subObjects = Vector<SerializedSubObject>(subObjects.size());
  48. UINT32 i = 0;
  49. for (auto& subObject : subObjects)
  50. {
  51. copy->subObjects[i].typeId = subObject.typeId;
  52. for (auto& entryPair : subObject.entries)
  53. {
  54. SerializedEntry entry = entryPair.second;
  55. if (entry.serialized != nullptr)
  56. entry.serialized = entry.serialized->clone(cloneData);
  57. copy->subObjects[i].entries[entryPair.first] = entry;
  58. }
  59. i++;
  60. }
  61. return copy;
  62. }
  63. SPtr<SerializedInstance> SerializedArray::clone(bool cloneData)
  64. {
  65. SPtr<SerializedArray> copy = bs_shared_ptr_new<SerializedArray>();
  66. copy->numElements = numElements;
  67. for (auto& entryPair : entries)
  68. {
  69. SerializedArrayEntry entry = entryPair.second;
  70. entry.serialized = entry.serialized->clone(cloneData);
  71. copy->entries[entryPair.first] = entry;
  72. }
  73. return copy;
  74. }
  75. RTTITypeBase* SerializedInstance::getRTTIStatic()
  76. {
  77. return SerializedInstanceRTTI::instance();
  78. }
  79. RTTITypeBase* SerializedInstance::getRTTI() const
  80. {
  81. return SerializedInstance::getRTTIStatic();
  82. }
  83. RTTITypeBase* SerializedDataBlock::getRTTIStatic()
  84. {
  85. return SerializedDataBlockRTTI::instance();
  86. }
  87. RTTITypeBase* SerializedDataBlock::getRTTI() const
  88. {
  89. return SerializedDataBlock::getRTTIStatic();
  90. }
  91. RTTITypeBase* SerializedField::getRTTIStatic()
  92. {
  93. return SerializedFieldRTTI::instance();
  94. }
  95. RTTITypeBase* SerializedField::getRTTI() const
  96. {
  97. return SerializedField::getRTTIStatic();
  98. }
  99. UINT32 SerializedObject::getRootTypeId() const
  100. {
  101. if(subObjects.size() > 0)
  102. return subObjects[0].typeId;
  103. return 0;
  104. }
  105. RTTITypeBase* SerializedObject::getRTTIStatic()
  106. {
  107. return SerializedObjectRTTI::instance();
  108. }
  109. RTTITypeBase* SerializedObject::getRTTI() const
  110. {
  111. return SerializedObject::getRTTIStatic();
  112. }
  113. RTTITypeBase* SerializedArray::getRTTIStatic()
  114. {
  115. return SerializedArrayRTTI::instance();
  116. }
  117. RTTITypeBase* SerializedArray::getRTTI() const
  118. {
  119. return SerializedArray::getRTTIStatic();
  120. }
  121. RTTITypeBase* SerializedSubObject::getRTTIStatic()
  122. {
  123. return SerializedSubObjectRTTI::instance();
  124. }
  125. RTTITypeBase* SerializedSubObject::getRTTI() const
  126. {
  127. return SerializedSubObject::getRTTIStatic();
  128. }
  129. RTTITypeBase* SerializedEntry::getRTTIStatic()
  130. {
  131. return SerializedEntryRTTI::instance();
  132. }
  133. RTTITypeBase* SerializedEntry::getRTTI() const
  134. {
  135. return SerializedEntry::getRTTIStatic();
  136. }
  137. RTTITypeBase* SerializedArrayEntry::getRTTIStatic()
  138. {
  139. return SerializedArrayEntryRTTI::instance();
  140. }
  141. RTTITypeBase* SerializedArrayEntry::getRTTI() const
  142. {
  143. return SerializedArrayEntry::getRTTIStatic();
  144. }
  145. }