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.

Mesh.cpp 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*!
  2. * \file src/Mesh.cpp
  3. * \brief OpenGL Mesh
  4. *
  5. * \author Mongoose
  6. */
  7. #include <map>
  8. #include <stdlib.h>
  9. #include "global.h"
  10. #include "TextureManager.h"
  11. #include "system/Window.h"
  12. #include "Mesh.h"
  13. Mesh::Mesh(const std::vector<RoomVertexTR2>& vert,
  14. const std::vector<RoomRectangleTR2>& rect,
  15. const std::vector<RoomTriangleTR2>& tri) {
  16. for (auto& t : rect) {
  17. indices.push_back(0);
  18. vertices.push_back(glm::vec3(vert.at(t.v1).x, vert.at(t.v1).y, vert.at(t.v1).z));
  19. vertices.push_back(glm::vec3(vert.at(t.v2).x, vert.at(t.v2).y, vert.at(t.v2).z));
  20. vertices.push_back(glm::vec3(vert.at(t.v3).x, vert.at(t.v3).y, vert.at(t.v3).z));
  21. vertices.push_back(glm::vec3(vert.at(t.v4).x, vert.at(t.v4).y, vert.at(t.v4).z));
  22. textures.push_back(t.texture);
  23. }
  24. for (auto& t : tri) {
  25. indices.push_back(1);
  26. vertices.push_back(glm::vec3(vert.at(t.v1).x, vert.at(t.v1).y, vert.at(t.v1).z));
  27. vertices.push_back(glm::vec3(vert.at(t.v2).x, vert.at(t.v2).y, vert.at(t.v2).z));
  28. vertices.push_back(glm::vec3(vert.at(t.v3).x, vert.at(t.v3).y, vert.at(t.v3).z));
  29. textures.push_back(t.texture);
  30. }
  31. }
  32. struct PackedVertex {
  33. glm::vec3 pos;
  34. glm::vec2 uv;
  35. unsigned int tex;
  36. PackedVertex(glm::vec3 p, glm::vec2 u, unsigned int t) : pos(p), uv(u), tex(t) { }
  37. bool operator<(const PackedVertex& v) const { return memcmp(this, &v, sizeof(PackedVertex)) > 0; }
  38. };
  39. static bool findSimilarVertex(PackedVertex& v,
  40. std::map<PackedVertex, unsigned short> m,
  41. unsigned short& s) {
  42. auto it = m.find(v);
  43. if (it == m.end())
  44. return false;
  45. else {
  46. s = it->second;
  47. return true;
  48. }
  49. }
  50. void Mesh::prepare() {
  51. std::vector<unsigned short> ind;
  52. std::vector<glm::vec3> vert;
  53. std::vector<unsigned int> tex;
  54. std::map<PackedVertex, unsigned short> vertexMap;
  55. int vertIndex = 0;
  56. for (int i = 0; i < indices.size(); i++) {
  57. unsigned int texture = getTextureManager().getTile(textures.at(i)).getTexture();
  58. for (int v = 0; v < ((indices.at(i) == 0) ? 4 : 3); v++) {
  59. glm::vec2 uv = getTextureManager().getTile(textures.at(i)).getUV(v);
  60. PackedVertex p(vertices.at(vertIndex + v), uv, texture);
  61. unsigned short s;
  62. if (findSimilarVertex(p, vertexMap, s)) {
  63. ind.push_back(s); // Vertex already cached
  64. } else {
  65. vertexMap[p] = vert.size();
  66. ind.push_back(vert.size());
  67. vert.push_back(p.pos);
  68. uvs.push_back(p.uv);
  69. tex.push_back(p.tex);
  70. }
  71. }
  72. if (indices.at(i) == 0) {
  73. ind.push_back(ind.at(ind.size() - 1));
  74. ind.push_back(ind.at(ind.size() - 3));
  75. }
  76. vertIndex += (indices.at(i) == 0) ? 4 : 3;
  77. }
  78. indices = ind;
  79. vertices = vert;
  80. textures = tex;
  81. }
  82. void Mesh::display(glm::mat4 model, glm::mat4 view, glm::mat4 projection) {
  83. glm::mat4 MVP = projection * view * model;
  84. // TODO handle different textures!
  85. Window::drawGL(vertices, uvs, indices, MVP, textures.at(0));
  86. }