2
0

BsVertexDeclaration.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "BsVertexDeclaration.h"
  2. #include "BsVertexDeclarationRTTI.h"
  3. #include "BsHardwareBufferManager.h"
  4. #include "BsRenderSystem.h"
  5. #include "BsUtil.h"
  6. namespace BansheeEngine
  7. {
  8. VertexElement::VertexElement(UINT16 source, UINT32 offset,
  9. VertexElementType theType, VertexElementSemantic semantic, UINT16 index)
  10. : mSource(source), mOffset(offset), mType(theType), mSemantic(semantic), mIndex(index)
  11. {
  12. }
  13. UINT32 VertexElement::getSize(void) const
  14. {
  15. return getTypeSize(mType);
  16. }
  17. UINT32 VertexElement::getTypeSize(VertexElementType etype)
  18. {
  19. switch(etype)
  20. {
  21. case VET_COLOR:
  22. case VET_COLOR_ABGR:
  23. case VET_COLOR_ARGB:
  24. return sizeof(RGBA);
  25. case VET_FLOAT1:
  26. return sizeof(float);
  27. case VET_FLOAT2:
  28. return sizeof(float)*2;
  29. case VET_FLOAT3:
  30. return sizeof(float)*3;
  31. case VET_FLOAT4:
  32. return sizeof(float)*4;
  33. case VET_SHORT1:
  34. return sizeof(short);
  35. case VET_SHORT2:
  36. return sizeof(short)*2;
  37. case VET_SHORT3:
  38. return sizeof(short)*3;
  39. case VET_SHORT4:
  40. return sizeof(short)*4;
  41. case VET_UBYTE4:
  42. return sizeof(unsigned char)*4;
  43. }
  44. return 0;
  45. }
  46. unsigned short VertexElement::getTypeCount(VertexElementType etype)
  47. {
  48. switch (etype)
  49. {
  50. case VET_COLOR:
  51. case VET_COLOR_ABGR:
  52. case VET_COLOR_ARGB:
  53. return 4;
  54. case VET_FLOAT1:
  55. return 1;
  56. case VET_FLOAT2:
  57. return 2;
  58. case VET_FLOAT3:
  59. return 3;
  60. case VET_FLOAT4:
  61. return 4;
  62. case VET_SHORT1:
  63. return 1;
  64. case VET_SHORT2:
  65. return 2;
  66. case VET_SHORT3:
  67. return 3;
  68. case VET_SHORT4:
  69. return 4;
  70. case VET_UBYTE4:
  71. return 4;
  72. }
  73. BS_EXCEPT(InvalidParametersException, "Invalid type");
  74. }
  75. VertexElementType VertexElement::getBestColorVertexElementType()
  76. {
  77. // Use the current render system to determine if possible
  78. if (BansheeEngine::RenderSystem::instancePtr())
  79. {
  80. return BansheeEngine::RenderSystem::instancePtr()->getColorVertexElementType();
  81. }
  82. else
  83. {
  84. // We can't know the specific type right now, so pick a type
  85. // based on platform
  86. #if BS_PLATFORM == BS_PLATFORM_WIN32
  87. return VET_COLOR_ARGB; // prefer D3D format on windows
  88. #else
  89. return VET_COLOR_ABGR; // prefer GL format on everything else
  90. #endif
  91. }
  92. }
  93. bool VertexElement::operator== (const VertexElement& rhs) const
  94. {
  95. if (mType != rhs.mType || mIndex != rhs.mIndex || mOffset != rhs.mOffset ||
  96. mSemantic != rhs.mSemantic || mSource != rhs.mSource)
  97. {
  98. return false;
  99. }
  100. else
  101. return true;
  102. }
  103. bool VertexElement::operator!= (const VertexElement& rhs) const
  104. {
  105. return !(*this == rhs);
  106. }
  107. VertexDeclaration::VertexDeclaration(const VertexElementList& elements)
  108. {
  109. for (auto& elem : elements)
  110. {
  111. VertexElementType type = elem.getType();
  112. if (elem.getType() == VET_COLOR)
  113. type = VertexElement::getBestColorVertexElementType();
  114. mElementList.push_back(VertexElement(elem.getStreamIdx(), elem.getOffset(), type, elem.getSemantic(), elem.getSemanticIdx()));
  115. }
  116. }
  117. VertexDeclaration::~VertexDeclaration()
  118. {
  119. }
  120. bool VertexDeclaration::operator== (const VertexDeclaration& rhs) const
  121. {
  122. if (mElementList.size() != rhs.mElementList.size())
  123. return false;
  124. auto myIter = mElementList.begin();
  125. auto theirIter = rhs.mElementList.begin();
  126. for (; myIter != mElementList.end() && theirIter != rhs.mElementList.end(); ++myIter, ++theirIter)
  127. {
  128. if (!(*myIter == *theirIter))
  129. return false;
  130. }
  131. return true;
  132. }
  133. bool VertexDeclaration::operator!= (const VertexDeclaration& rhs) const
  134. {
  135. return !(*this == rhs);
  136. }
  137. const VertexElement* VertexDeclaration::getElement(UINT16 index)
  138. {
  139. assert(index < mElementList.size() && "Index out of bounds");
  140. auto iter = mElementList.begin();
  141. for (UINT16 i = 0; i < index; ++i)
  142. ++iter;
  143. return &(*iter);
  144. }
  145. const VertexElement* VertexDeclaration::findElementBySemantic(VertexElementSemantic sem, UINT16 index)
  146. {
  147. for (auto& elem : mElementList)
  148. {
  149. if (elem.getSemantic() == sem && elem.getSemanticIdx() == index)
  150. {
  151. return &elem;
  152. }
  153. }
  154. return nullptr;
  155. }
  156. VertexDeclaration::VertexElementList VertexDeclaration::findElementsBySource(UINT16 source)
  157. {
  158. VertexElementList retList;
  159. for (auto& elem : mElementList)
  160. {
  161. if (elem.getStreamIdx() == source)
  162. {
  163. retList.push_back(elem);
  164. }
  165. }
  166. return retList;
  167. }
  168. UINT32 VertexDeclaration::getVertexSize(UINT16 source)
  169. {
  170. UINT32 size = 0;
  171. for (auto& elem : mElementList)
  172. {
  173. if (elem.getStreamIdx() == source)
  174. {
  175. size += elem.getSize();
  176. }
  177. }
  178. return size;
  179. }
  180. /************************************************************************/
  181. /* SERIALIZATION */
  182. /************************************************************************/
  183. RTTITypeBase* VertexDeclaration::getRTTIStatic()
  184. {
  185. return VertexDeclarationRTTI::instance();
  186. }
  187. RTTITypeBase* VertexDeclaration::getRTTI() const
  188. {
  189. return getRTTIStatic();
  190. }
  191. }