Open Source Tomb Raider Engine
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

BoundingBox.cpp 2.7KB

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