BsVertexDataDesc.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "BsVertexDataDesc.h"
  2. #include "BsHardwareBufferManager.h"
  3. #include "BsVertexDataDescRTTI.h"
  4. namespace BansheeEngine
  5. {
  6. void VertexDataDesc::addVertElem(VertexElementType type, VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx)
  7. {
  8. clearIfItExists(type, semantic, semanticIdx, streamIdx);
  9. VertexElement newElement(streamIdx, 0, type, semantic, semanticIdx);
  10. // Insert it so it is sorted by stream
  11. UINT32 insertToIndex = (UINT32)mVertexElements.size();
  12. UINT32 idx = 0;
  13. for(auto& elem : mVertexElements)
  14. {
  15. if(elem.getStreamIdx() > streamIdx)
  16. {
  17. insertToIndex = idx;
  18. break;
  19. }
  20. idx++;
  21. }
  22. mVertexElements.insert(mVertexElements.begin() + insertToIndex, newElement);
  23. }
  24. List<VertexElement> VertexDataDesc::createElements() const
  25. {
  26. UINT32 maxStreamIdx = getMaxStreamIdx();
  27. UINT32 numStreams = maxStreamIdx + 1;
  28. UINT32* streamOffsets = bs_newN<UINT32>(numStreams);
  29. for (UINT32 i = 0; i < numStreams; i++)
  30. streamOffsets[i] = 0;
  31. List<VertexElement> declarationElements;
  32. for (auto& vertElem : mVertexElements)
  33. {
  34. UINT32 streamIdx = vertElem.getStreamIdx();
  35. declarationElements.push_back(VertexElement(streamIdx, streamOffsets[streamIdx], vertElem.getType(),
  36. vertElem.getSemantic(), vertElem.getSemanticIdx()));
  37. streamOffsets[streamIdx] += vertElem.getSize();
  38. }
  39. bs_deleteN(streamOffsets, numStreams);
  40. return declarationElements;
  41. }
  42. UINT32 VertexDataDesc::getMaxStreamIdx() const
  43. {
  44. UINT32 maxStreamIdx = 0;
  45. for(auto& vertElems : mVertexElements)
  46. {
  47. UINT32 offset = 0;
  48. for(auto& vertElem : mVertexElements)
  49. {
  50. maxStreamIdx = std::max((UINT32)maxStreamIdx, (UINT32)vertElem.getStreamIdx());
  51. }
  52. }
  53. return maxStreamIdx;
  54. }
  55. bool VertexDataDesc::hasStream(UINT32 streamIdx) const
  56. {
  57. for(auto& vertElem : mVertexElements)
  58. {
  59. if(vertElem.getStreamIdx() == streamIdx)
  60. return true;
  61. }
  62. return false;
  63. }
  64. bool VertexDataDesc::hasElement(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  65. {
  66. auto findIter = std::find_if(mVertexElements.begin(), mVertexElements.end(),
  67. [semantic, semanticIdx, streamIdx] (const VertexElement& x)
  68. {
  69. return x.getSemantic() == semantic && x.getSemanticIdx() == semanticIdx && x.getStreamIdx() == streamIdx;
  70. });
  71. if(findIter != mVertexElements.end())
  72. {
  73. return true;
  74. }
  75. return false;
  76. }
  77. UINT32 VertexDataDesc::getElementSize(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  78. {
  79. for(auto& element : mVertexElements)
  80. {
  81. if(element.getSemantic() == semantic && element.getSemanticIdx() == semanticIdx && element.getStreamIdx() == streamIdx)
  82. return element.getSize();
  83. }
  84. return -1;
  85. }
  86. UINT32 VertexDataDesc::getElementOffsetFromStream(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  87. {
  88. UINT32 vertexOffset = 0;
  89. for(auto& element : mVertexElements)
  90. {
  91. if(element.getStreamIdx() != streamIdx)
  92. continue;
  93. if(element.getSemantic() == semantic && element.getSemanticIdx() == semanticIdx)
  94. break;
  95. vertexOffset += element.getSize();
  96. }
  97. return vertexOffset;
  98. }
  99. UINT32 VertexDataDesc::getVertexStride(UINT32 streamIdx) const
  100. {
  101. UINT32 vertexStride = 0;
  102. for(auto& element : mVertexElements)
  103. {
  104. if(element.getStreamIdx() == streamIdx)
  105. vertexStride += element.getSize();
  106. }
  107. return vertexStride;
  108. }
  109. UINT32 VertexDataDesc::getVertexStride() const
  110. {
  111. UINT32 vertexStride = 0;
  112. for(auto& element : mVertexElements)
  113. {
  114. vertexStride += element.getSize();
  115. }
  116. return vertexStride;
  117. }
  118. UINT32 VertexDataDesc::getStreamOffset(UINT32 streamIdx) const
  119. {
  120. UINT32 streamOffset = 0;
  121. bool found = false;
  122. for(auto& element : mVertexElements)
  123. {
  124. if(element.getStreamIdx() == streamIdx)
  125. break;
  126. streamOffset += element.getSize();
  127. }
  128. return streamOffset;
  129. }
  130. void VertexDataDesc::clearIfItExists(VertexElementType type, VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx)
  131. {
  132. auto findIter = std::find_if(mVertexElements.begin(), mVertexElements.end(),
  133. [semantic, semanticIdx, streamIdx] (const VertexElement& x)
  134. {
  135. return x.getSemantic() == semantic && x.getSemanticIdx() == semanticIdx && x.getStreamIdx() == streamIdx;
  136. });
  137. if(findIter != mVertexElements.end())
  138. {
  139. mVertexElements.erase(findIter);
  140. }
  141. }
  142. VertexDataDescPtr VertexDataDesc::create()
  143. {
  144. return bs_shared_ptr_new<VertexDataDesc>();
  145. }
  146. /************************************************************************/
  147. /* SERIALIZATION */
  148. /************************************************************************/
  149. RTTITypeBase* VertexDataDesc::getRTTIStatic()
  150. {
  151. return VertexDataDescRTTI::instance();
  152. }
  153. RTTITypeBase* VertexDataDesc::getRTTI() const
  154. {
  155. return VertexDataDesc::getRTTIStatic();
  156. }
  157. }