CmMeshBase.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "CmMeshBase.h"
  2. #include "CmMeshBaseRTTI.h"
  3. #include "CmCoreThread.h"
  4. #include "CmDebug.h"
  5. namespace BansheeEngine
  6. {
  7. MeshBase::MeshBase(UINT32 numVertices, UINT32 numIndices, DrawOperationType drawOp)
  8. :mNumIndices(numIndices), mNumVertices(numVertices), mDefaultSubMesh(0, numIndices, drawOp)
  9. {
  10. mSubMeshes.reserve(10);
  11. }
  12. MeshBase::MeshBase()
  13. {
  14. mSubMeshes.reserve(10);
  15. }
  16. MeshBase::~MeshBase()
  17. {
  18. }
  19. void MeshBase::clearSubMeshes()
  20. {
  21. THROW_IF_CORE_THREAD;
  22. mSubMeshes.clear();
  23. }
  24. void MeshBase::addSubMesh(UINT32 indexOffset, UINT32 indexCount, DrawOperationType drawOp)
  25. {
  26. THROW_IF_CORE_THREAD;
  27. if((indexOffset + indexCount) > mNumIndices)
  28. {
  29. LOGWRN("Provided sub-mesh references indexes out of range. Sub-mesh range: "
  30. + toString(indexOffset) + " .. " + toString(indexOffset + indexCount) + "." \
  31. "Valid range is: 0 .. " + toString(mNumIndices) + ". Ignoring command.");
  32. return;
  33. }
  34. mSubMeshes.push_back(SubMesh(indexOffset, indexCount, drawOp));
  35. }
  36. void MeshBase::setSubMeshes(const Vector<SubMesh>& subMeshes)
  37. {
  38. THROW_IF_CORE_THREAD;
  39. for(auto& subMesh : subMeshes)
  40. {
  41. if((subMesh.indexOffset + subMesh.indexCount) > mNumIndices)
  42. {
  43. LOGWRN("Provided sub-mesh references indexes out of range. Sub-mesh range: "
  44. + toString(subMesh.indexOffset) + " .. " + toString(subMesh.indexOffset + subMesh.indexCount) + "." \
  45. "Valid range is: 0 .. " + toString(mNumIndices) + ". Ignoring command.");
  46. return;
  47. }
  48. }
  49. mSubMeshes = subMeshes;
  50. }
  51. const SubMesh& MeshBase::getSubMesh(UINT32 subMeshIdx) const
  52. {
  53. THROW_IF_CORE_THREAD;
  54. if(mSubMeshes.size() == 0 && subMeshIdx == 0)
  55. {
  56. return mDefaultSubMesh;
  57. }
  58. if(subMeshIdx < 0 || subMeshIdx >= mSubMeshes.size())
  59. {
  60. BS_EXCEPT(InvalidParametersException, "Invalid sub-mesh index ("
  61. + toString(subMeshIdx) + "). Number of sub-meshes available: " + toString((int)mSubMeshes.size()));
  62. }
  63. return mSubMeshes[subMeshIdx];
  64. }
  65. UINT32 MeshBase::getNumSubMeshes() const
  66. {
  67. THROW_IF_CORE_THREAD;
  68. if(mSubMeshes.size() > 0)
  69. return (UINT32)mSubMeshes.size();
  70. else
  71. {
  72. if(mDefaultSubMesh.indexCount > 0)
  73. return 1;
  74. else
  75. return 0;
  76. }
  77. }
  78. /************************************************************************/
  79. /* SERIALIZATION */
  80. /************************************************************************/
  81. RTTITypeBase* MeshBase::getRTTIStatic()
  82. {
  83. return MeshBaseRTTI::instance();
  84. }
  85. RTTITypeBase* MeshBase::getRTTI() const
  86. {
  87. return MeshBase::getRTTIStatic();
  88. }
  89. }