CmVertexDataDesc.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "CmVertexDataDesc.h"
  2. #include "CmHardwareBufferManager.h"
  3. #include "CmVertexDataDescRTTI.h"
  4. namespace CamelotFramework
  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. VertexDeclarationPtr VertexDataDesc::createDeclaration() const
  25. {
  26. VertexDeclarationPtr declaration = HardwareBufferManager::instance().createVertexDeclaration();
  27. UINT32 maxStreamIdx = getMaxStreamIdx();
  28. UINT32 numStreams = maxStreamIdx + 1;
  29. UINT32* streamOffsets = cm_newN<UINT32, ScratchAlloc>(numStreams);
  30. for(UINT32 i = 0; i < numStreams; i++)
  31. streamOffsets[i] = 0;
  32. for(auto& vertElem : mVertexElements)
  33. {
  34. UINT32 streamIdx = vertElem.getStreamIdx();
  35. declaration->addElement(streamIdx, streamOffsets[streamIdx], vertElem.getType(), vertElem.getSemantic(), vertElem.getSemanticIdx());
  36. streamOffsets[streamIdx] += vertElem.getSize();
  37. }
  38. cm_deleteN<ScratchAlloc>(streamOffsets, numStreams);
  39. return declaration;
  40. }
  41. UINT32 VertexDataDesc::getMaxStreamIdx() const
  42. {
  43. UINT32 maxStreamIdx = 0;
  44. for(auto& vertElems : mVertexElements)
  45. {
  46. UINT32 offset = 0;
  47. for(auto& vertElem : mVertexElements)
  48. {
  49. maxStreamIdx = std::max((UINT32)maxStreamIdx, (UINT32)vertElem.getStreamIdx());
  50. }
  51. }
  52. return maxStreamIdx;
  53. }
  54. bool VertexDataDesc::hasStream(UINT32 streamIdx) const
  55. {
  56. for(auto& vertElem : mVertexElements)
  57. {
  58. if(vertElem.getStreamIdx() == streamIdx)
  59. return true;
  60. }
  61. return false;
  62. }
  63. bool VertexDataDesc::hasElement(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  64. {
  65. auto findIter = std::find_if(mVertexElements.begin(), mVertexElements.end(),
  66. [semantic, semanticIdx, streamIdx] (const VertexElement& x)
  67. {
  68. return x.getSemantic() == semantic && x.getSemanticIdx() == semanticIdx && x.getStreamIdx() == streamIdx;
  69. });
  70. if(findIter != mVertexElements.end())
  71. {
  72. return true;
  73. }
  74. return false;
  75. }
  76. UINT32 VertexDataDesc::getElementSize(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  77. {
  78. for(auto& element : mVertexElements)
  79. {
  80. if(element.getSemantic() == semantic && element.getSemanticIdx() == semanticIdx && element.getStreamIdx() == streamIdx)
  81. return element.getSize();
  82. }
  83. return -1;
  84. }
  85. UINT32 VertexDataDesc::getElementOffsetFromStream(VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx) const
  86. {
  87. UINT32 vertexOffset = 0;
  88. for(auto& element : mVertexElements)
  89. {
  90. if(element.getStreamIdx() != streamIdx)
  91. continue;
  92. if(element.getSemantic() == semantic && element.getSemanticIdx() == semanticIdx)
  93. break;
  94. vertexOffset += element.getSize();
  95. }
  96. return vertexOffset;
  97. }
  98. UINT32 VertexDataDesc::getVertexStride(UINT32 streamIdx) const
  99. {
  100. UINT32 vertexStride = 0;
  101. for(auto& element : mVertexElements)
  102. {
  103. if(element.getStreamIdx() == streamIdx)
  104. vertexStride += element.getSize();
  105. }
  106. return vertexStride;
  107. }
  108. UINT32 VertexDataDesc::getVertexStride() const
  109. {
  110. UINT32 vertexStride = 0;
  111. for(auto& element : mVertexElements)
  112. {
  113. vertexStride += element.getSize();
  114. }
  115. return vertexStride;
  116. }
  117. UINT32 VertexDataDesc::getStreamOffset(UINT32 streamIdx) const
  118. {
  119. UINT32 streamOffset = 0;
  120. bool found = false;
  121. for(auto& element : mVertexElements)
  122. {
  123. if(element.getStreamIdx() == streamIdx)
  124. break;
  125. streamOffset += element.getSize();
  126. }
  127. return streamOffset;
  128. }
  129. void VertexDataDesc::clearIfItExists(VertexElementType type, VertexElementSemantic semantic, UINT32 semanticIdx, UINT32 streamIdx)
  130. {
  131. auto findIter = std::find_if(mVertexElements.begin(), mVertexElements.end(),
  132. [semantic, semanticIdx, streamIdx] (const VertexElement& x)
  133. {
  134. return x.getSemantic() == semantic && x.getSemanticIdx() == semanticIdx && x.getStreamIdx() == streamIdx;
  135. });
  136. if(findIter != mVertexElements.end())
  137. {
  138. mVertexElements.erase(findIter);
  139. }
  140. }
  141. /************************************************************************/
  142. /* SERIALIZATION */
  143. /************************************************************************/
  144. RTTITypeBase* VertexDataDesc::getRTTIStatic()
  145. {
  146. return VertexDataDescRTTI::instance();
  147. }
  148. RTTITypeBase* VertexDataDesc::getRTTI() const
  149. {
  150. return VertexDataDesc::getRTTIStatic();
  151. }
  152. }