CmMesh.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "CmMesh.h"
  2. #include "CmMeshRTTI.h"
  3. #include "CmHardwareBufferManager.h"
  4. namespace CamelotEngine
  5. {
  6. Mesh::Mesh()
  7. :mVertexData(nullptr), mIndexData(nullptr)
  8. {
  9. }
  10. Mesh::~Mesh()
  11. {
  12. if(mVertexData)
  13. delete mVertexData;
  14. if(mIndexData)
  15. delete mIndexData;
  16. }
  17. void Mesh::prepare(MeshDataPtr meshData)
  18. {
  19. mMeshData = meshData;
  20. }
  21. void Mesh::loadImpl()
  22. {
  23. if(mMeshData == nullptr)
  24. {
  25. CM_EXCEPT(InternalErrorException, "Cannot load mesh. Mesh data hasn't been set.");
  26. }
  27. // Submeshes
  28. for(int i = 0; i < mMeshData->subMeshes.size(); i++)
  29. mSubMeshes.push_back(SubMesh(mMeshData->subMeshes[i].indexOffset, mMeshData->subMeshes[i].indexCount));
  30. // Indices
  31. mIndexData = new IndexData();
  32. mIndexData->indexCount = mMeshData->indexCount;
  33. mIndexData->indexBuffer = HardwareBufferManager::instance().createIndexBuffer(
  34. HardwareIndexBuffer::IT_16BIT,
  35. mIndexData->indexCount,
  36. HardwareBuffer::HBU_STATIC_WRITE_ONLY);
  37. UINT16* idxData = static_cast<UINT16*>(mIndexData->indexBuffer->lock(HardwareBuffer::HBL_NORMAL));
  38. for(int i = 0; i < mIndexData->indexCount; i++)
  39. {
  40. idxData[i] = (UINT16)mMeshData->index[i];
  41. }
  42. mIndexData->indexBuffer->unlock();
  43. // Vertices
  44. mVertexData = new VertexData();
  45. mVertexData->vertexStart = 0;
  46. mVertexData->vertexCount = mMeshData->vertexCount;
  47. //mVertexData->vertexDeclaration = mMeshData->declaration.clone();
  48. //VertexDeclaration* decl = mVertexData->vertexDeclaration;
  49. //decl->removeAllElements();
  50. //size_t offset = 0;
  51. //decl->addElement(0, offset, VET_FLOAT3, VES_POSITION);
  52. //offset += VertexElement::getTypeSize(VET_FLOAT3);
  53. //decl->addElement(0, offset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
  54. //offset += VertexElement::getTypeSize(VET_FLOAT2);
  55. //decl->addElement(0, offset, VET_COLOUR, VES_DIFFUSE);
  56. //offset += VertexElement::getTypeSize(VET_COLOUR);
  57. //HardwareVertexBufferPtr vertexBuffer = HardwareBufferManager::instance().createVertexBuffer(
  58. // mVertexData->vertexDeclaration->getVertexSize(0),
  59. // mVertexData->vertexCount,
  60. // HardwareBuffer::HBU_STATIC_WRITE_ONLY);
  61. //mVertexData->vertexBufferBinding->setBinding(0, vertexBuffer);
  62. //size_t vertexSize = vertexBuffer->getVertexSize();
  63. //char* vertBufferData = static_cast<char*>(vertexBuffer->lock(HardwareBuffer::HBL_NORMAL));
  64. //size_t posSize = VertexElement::getTypeSize(VET_FLOAT3);
  65. //size_t uvSize = VertexElement::getTypeSize(VET_FLOAT2);
  66. //Vector3 position(-5.0f, -5.0f, -5.0f);
  67. //memcpy(vertBufferData, &position, posSize);
  68. //vertBufferData += posSize;
  69. //Vector2 uv(0.0f, 0.0f);
  70. //memcpy(vertBufferData, &uv, uvSize);
  71. //vertBufferData += uvSize;
  72. //position = Vector3(-5.0f, 5.0f, -5.0f);
  73. //memcpy(vertBufferData, &position, posSize);
  74. //vertBufferData += posSize;
  75. //uv = Vector2(0.0f, 1.0f);
  76. //memcpy(vertBufferData, &uv, uvSize);
  77. //vertBufferData += uvSize;
  78. //position = Vector3(5.0f, 5.0f, -5.0f);
  79. //memcpy(vertBufferData, &position, posSize);
  80. //vertBufferData += posSize;
  81. //uv = Vector2(1.0f, 1.0f);
  82. //memcpy(vertBufferData, &uv, uvSize);
  83. //vertBufferData += uvSize;
  84. //position = Vector3(5.0f, -5.0f, -5.0f);
  85. //memcpy(vertBufferData, &position, posSize);
  86. //vertBufferData += posSize;
  87. //uv = Vector2(1.0f, 0.0f);
  88. //memcpy(vertBufferData, &uv, uvSize);
  89. //vertBufferData += uvSize;
  90. //position = Vector3(-5.0f, -5.0f, 5.0f);
  91. //memcpy(vertBufferData, &position, posSize);
  92. //vertBufferData += posSize;
  93. //uv = Vector2(0.0f, 0.0f);
  94. //memcpy(vertBufferData, &uv, uvSize);
  95. //vertBufferData += uvSize;
  96. //position = Vector3(5.0f, -5.0f, 5.0f);
  97. //memcpy(vertBufferData, &position, posSize);
  98. //vertBufferData += posSize;
  99. //uv = Vector2(1.0f, 0.0f);
  100. //memcpy(vertBufferData, &uv, uvSize);
  101. //vertBufferData += uvSize;
  102. //position = Vector3(5.0f, 5.0f, 5.0f);
  103. //memcpy(vertBufferData, &position, posSize);
  104. //vertBufferData += posSize;
  105. //uv = Vector2(1.0f, 1.0f);
  106. //memcpy(vertBufferData, &uv, uvSize);
  107. //vertBufferData += uvSize;
  108. //position = Vector3(-5.0f, 5.0f, 5.0f);
  109. //memcpy(vertBufferData, &position, posSize);
  110. //vertBufferData += posSize;
  111. //uv = Vector2(0.0f, 1.0f);
  112. //memcpy(vertBufferData, &uv, uvSize);
  113. //vertBufferData += uvSize;
  114. //vertexBuffer->unlock();
  115. mMeshData = nullptr;
  116. }
  117. /************************************************************************/
  118. /* SERIALIZATION */
  119. /************************************************************************/
  120. RTTITypeBase* Mesh::getRTTIStatic()
  121. {
  122. return MeshRTTI::instance();
  123. }
  124. RTTITypeBase* Mesh::getRTTI() const
  125. {
  126. return Mesh::getRTTIStatic();
  127. }
  128. }