Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RoomMesh.cpp 3.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*!
  2. * \file src/RoomMesh.cpp
  3. * \brief Room Mesh Geometry
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "TextureManager.h"
  9. #include "RoomMesh.h"
  10. RoomMesh::RoomMesh(const std::vector<RoomVertexTR2>& vert,
  11. const std::vector<IndexedRectangle>& rect,
  12. const std::vector<IndexedRectangle>& tri) {
  13. for (auto& t : rect) {
  14. indicesBuff.push_back(0);
  15. verticesBuff.push_back(glm::vec3(vert.at(t.v1).x, vert.at(t.v1).y, vert.at(t.v1).z));
  16. verticesBuff.push_back(glm::vec3(vert.at(t.v2).x, vert.at(t.v2).y, vert.at(t.v2).z));
  17. verticesBuff.push_back(glm::vec3(vert.at(t.v3).x, vert.at(t.v3).y, vert.at(t.v3).z));
  18. verticesBuff.push_back(glm::vec3(vert.at(t.v4).x, vert.at(t.v4).y, vert.at(t.v4).z));
  19. texturesBuff.push_back(t.texture);
  20. }
  21. for (auto& t : tri) {
  22. indicesBuff.push_back(1);
  23. verticesBuff.push_back(glm::vec3(vert.at(t.v1).x, vert.at(t.v1).y, vert.at(t.v1).z));
  24. verticesBuff.push_back(glm::vec3(vert.at(t.v2).x, vert.at(t.v2).y, vert.at(t.v2).z));
  25. verticesBuff.push_back(glm::vec3(vert.at(t.v3).x, vert.at(t.v3).y, vert.at(t.v3).z));
  26. texturesBuff.push_back(t.texture);
  27. }
  28. }
  29. void RoomMesh::prepare() {
  30. std::vector<unsigned short> ind;
  31. std::vector<glm::vec3> vert;
  32. std::vector<glm::vec2> uvBuff;
  33. std::vector<unsigned int> tex;
  34. int vertIndex = 0;
  35. for (int i = 0; i < indicesBuff.size(); i++) {
  36. unsigned int texture = TextureManager::getTile(texturesBuff.at(i)).getTexture();
  37. for (int x = 0; x < ((indicesBuff.at(i) == 0) ? 4 : 3); x++) {
  38. int v = x;
  39. if (v == 0)
  40. v = 2;
  41. else if (v == 2)
  42. v = 0;
  43. ind.push_back(vert.size());
  44. vert.push_back(verticesBuff.at(vertIndex + v));
  45. uvBuff.push_back(TextureManager::getTile(texturesBuff.at(i)).getUV(v));
  46. tex.push_back(texture);
  47. }
  48. if (indicesBuff.at(i) == 0) {
  49. ind.push_back(ind.at(ind.size() - 4));
  50. ind.push_back(ind.at(ind.size() - 3));
  51. }
  52. vertIndex += (indicesBuff.at(i) == 0) ? 4 : 3;
  53. }
  54. orAssertEqual(ind.size() % 3, 0);
  55. orAssertEqual(vert.size(), tex.size());
  56. orAssertEqual(vert.size(), uvBuff.size());
  57. indicesBuff = std::move(ind);
  58. vertices.bufferData(vert);
  59. uvs.bufferData(uvBuff);
  60. texturesBuff = std::move(tex);
  61. }
  62. void RoomMesh::display(glm::mat4 MVP) {
  63. if (indicesBuff.size() > 0) {
  64. unsigned int indexStart = 0;
  65. unsigned int indexPos = 1;
  66. unsigned int texture = texturesBuff.at(indicesBuff.at(0));
  67. while ((indexStart != indexPos) && (indexPos < indicesBuff.size())) {
  68. while ((indexPos < indicesBuff.size())
  69. && (texturesBuff.at(indicesBuff.at(indexPos)) == texture)) {
  70. indexPos++;
  71. }
  72. std::vector<unsigned short> ind(indicesBuff.begin() + indexStart,
  73. indicesBuff.begin() + indexPos);
  74. indices.bufferData(ind);
  75. Shader::drawGL(vertices, uvs, indices, texture, MVP);
  76. if (indexPos < indicesBuff.size()) {
  77. indexStart = indexPos;
  78. indexPos += 1;
  79. texture = texturesBuff.at(indicesBuff.at(indexStart));
  80. }
  81. }
  82. }
  83. }