CmMeshBase.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "CmMeshBase.h"
  2. #include "CmMeshBaseRTTI.h"
  3. #include "CmCoreThread.h"
  4. #include "CmDebug.h"
  5. namespace CamelotFramework
  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. if((indexOffset + indexCount) > mNumIndices)
  27. {
  28. LOGWRN("Provided sub-mesh references indexes out of range. Sub-mesh range: "
  29. + toString(indexOffset) + " .. " + toString(indexOffset + indexCount) + "." \
  30. "Valid range is: 0 .. " + toString(mNumIndices) + ". Ignoring command.");
  31. return;
  32. }
  33. mSubMeshes.push_back(SubMesh(indexOffset, indexCount, drawOp));
  34. }
  35. void MeshBase::setSubMeshes(const Vector<SubMesh>::type& subMeshes)
  36. {
  37. THROW_IF_CORE_THREAD;
  38. for(auto& subMesh : subMeshes)
  39. {
  40. if((subMesh.indexOffset + subMesh.indexCount) > mNumIndices)
  41. {
  42. LOGWRN("Provided sub-mesh references indexes out of range. Sub-mesh range: "
  43. + toString(subMesh.indexOffset) + " .. " + toString(subMesh.indexOffset + subMesh.indexCount) + "." \
  44. "Valid range is: 0 .. " + toString(mNumIndices) + ". Ignoring command.");
  45. return;
  46. }
  47. }
  48. mSubMeshes = subMeshes;
  49. }
  50. const SubMesh& MeshBase::getSubMesh(UINT32 subMeshIdx) const
  51. {
  52. THROW_IF_CORE_THREAD;
  53. if(mSubMeshes.size() == 0 && subMeshIdx == 0)
  54. {
  55. return mDefaultSubMesh;
  56. }
  57. if(subMeshIdx < 0 || subMeshIdx >= mSubMeshes.size())
  58. {
  59. CM_EXCEPT(InvalidParametersException, "Invalid sub-mesh index ("
  60. + toString(subMeshIdx) + "). Number of sub-meshes available: " + toString((int)mSubMeshes.size()));
  61. }
  62. return mSubMeshes[subMeshIdx];
  63. }
  64. UINT32 MeshBase::getNumSubMeshes() const
  65. {
  66. THROW_IF_CORE_THREAD;
  67. if(mSubMeshes.size() > 0)
  68. return (UINT32)mSubMeshes.size();
  69. else
  70. {
  71. if(mDefaultSubMesh.indexCount > 0)
  72. return 1;
  73. else
  74. return 0;
  75. }
  76. }
  77. /************************************************************************/
  78. /* SERIALIZATION */
  79. /************************************************************************/
  80. RTTITypeBase* MeshBase::getRTTIStatic()
  81. {
  82. return MeshBaseRTTI::instance();
  83. }
  84. RTTITypeBase* MeshBase::getRTTI() const
  85. {
  86. return MeshBase::getRTTIStatic();
  87. }
  88. }