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.

BoundingBox.cpp 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*!
  2. * \file src/BoundingBox.cpp
  3. * \brief 3D Axis Aligned Bounding Box
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "Camera.h"
  9. #include "World.h"
  10. #include "system/Shader.h"
  11. #include "BoundingBox.h"
  12. #include <glbinding/gl/gl.h>
  13. std::vector<glm::vec4> BoundingBox::vertices;
  14. std::vector<glm::vec3> BoundingBox::colorsLine, BoundingBox::colorsPoint;
  15. std::vector<unsigned short> BoundingBox::indicesLine;
  16. BoundingBox::BoundingBox(glm::vec3 min, glm::vec3 max) {
  17. corner[0] = min;
  18. corner[1] = glm::vec3(max.x, min.y, min.z);
  19. corner[2] = glm::vec3(min.x, max.y, min.z);
  20. corner[3] = glm::vec3(min.x, min.y, max.z);
  21. corner[4] = glm::vec3(max.x, max.y, min.z);
  22. corner[5] = glm::vec3(min.x, max.y, max.z);
  23. corner[6] = glm::vec3(max.x, min.y, max.z);
  24. corner[7] = max;
  25. }
  26. bool BoundingBox::inBox(glm::vec3 p) {
  27. return ((p.y >= corner[0].y) && (p.y <= corner[7].y) && inBoxPlane(p));
  28. }
  29. bool BoundingBox::inBoxPlane(glm::vec3 p) {
  30. return ((p.x >= corner[0].x) && (p.x <= corner[7].x) && (p.z >= corner[0].z)
  31. && (p.z <= corner[7].z));
  32. }
  33. void BoundingBox::display(glm::mat4 VP, glm::vec3 colorLine, glm::vec3 colorDot) {
  34. auto startSize = vertices.size();
  35. for (auto& c : corner) {
  36. vertices.emplace_back(VP * glm::vec4(c, 1.0f));
  37. colorsLine.emplace_back(colorLine);
  38. colorsPoint.emplace_back(colorDot);
  39. }
  40. indicesLine.emplace_back(startSize);
  41. indicesLine.emplace_back(startSize + 2);
  42. indicesLine.emplace_back(startSize + 2);
  43. indicesLine.emplace_back(startSize + 4);
  44. indicesLine.emplace_back(startSize + 4);
  45. indicesLine.emplace_back(startSize + 1);
  46. indicesLine.emplace_back(startSize + 1);
  47. indicesLine.emplace_back(startSize + 6);
  48. indicesLine.emplace_back(startSize + 6);
  49. indicesLine.emplace_back(startSize + 7);
  50. indicesLine.emplace_back(startSize + 7);
  51. indicesLine.emplace_back(startSize + 5);
  52. indicesLine.emplace_back(startSize + 5);
  53. indicesLine.emplace_back(startSize + 3);
  54. indicesLine.emplace_back(startSize + 3);
  55. indicesLine.emplace_back(startSize);
  56. indicesLine.emplace_back(startSize);
  57. indicesLine.emplace_back(startSize + 1);
  58. indicesLine.emplace_back(startSize + 4);
  59. indicesLine.emplace_back(startSize + 7);
  60. indicesLine.emplace_back(startSize + 6);
  61. indicesLine.emplace_back(startSize + 3);
  62. indicesLine.emplace_back(startSize + 5);
  63. indicesLine.emplace_back(startSize + 2);
  64. }
  65. void BoundingBox::display() {
  66. if (vertices.size() > 0) {
  67. Shader::drawGL(vertices, colorsLine, indicesLine, gl::GL_LINES);
  68. Shader::drawGL(vertices, colorsPoint, gl::GL_POINTS);
  69. }
  70. vertices.clear();
  71. colorsLine.clear();
  72. colorsPoint.clear();
  73. indicesLine.clear();
  74. }