selection_ring.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "selection_ring.h"
  2. #include "gl/mesh.h"
  3. #include <QVector3D>
  4. #include <cmath>
  5. #include <cstddef>
  6. #include <memory>
  7. #include <qvectornd.h>
  8. #include <vector>
  9. namespace Render::Geom {
  10. std::unique_ptr<Render::GL::Mesh> SelectionRing::s_mesh;
  11. static auto createRingMesh() -> std::unique_ptr<Render::GL::Mesh> {
  12. using namespace Render::GL;
  13. std::vector<Vertex> verts;
  14. std::vector<unsigned int> idx;
  15. constexpr int k_ring_segments = 48;
  16. const float inner = 0.94F;
  17. const float outer = 1.0F;
  18. for (int i = 0; i < k_ring_segments; ++i) {
  19. float const a0 = (i / float(k_ring_segments)) * 6.2831853F;
  20. float const a1 = ((i + 1) / float(k_ring_segments)) * 6.2831853F;
  21. QVector3D const n(0, 1, 0);
  22. QVector3D const v0i(inner * std::cos(a0), 0.0F, inner * std::sin(a0));
  23. QVector3D const v0o(outer * std::cos(a0), 0.0F, outer * std::sin(a0));
  24. QVector3D const v1o(outer * std::cos(a1), 0.0F, outer * std::sin(a1));
  25. QVector3D const v1i(inner * std::cos(a1), 0.0F, inner * std::sin(a1));
  26. size_t const base = verts.size();
  27. verts.push_back({{v0i.x(), 0.0F, v0i.z()}, {n.x(), n.y(), n.z()}, {0, 0}});
  28. verts.push_back({{v0o.x(), 0.0F, v0o.z()}, {n.x(), n.y(), n.z()}, {1, 0}});
  29. verts.push_back({{v1o.x(), 0.0F, v1o.z()}, {n.x(), n.y(), n.z()}, {1, 1}});
  30. verts.push_back({{v1i.x(), 0.0F, v1i.z()}, {n.x(), n.y(), n.z()}, {0, 1}});
  31. idx.push_back(base + 0);
  32. idx.push_back(base + 1);
  33. idx.push_back(base + 2);
  34. idx.push_back(base + 2);
  35. idx.push_back(base + 3);
  36. idx.push_back(base + 0);
  37. }
  38. return std::make_unique<Mesh>(verts, idx);
  39. }
  40. auto SelectionRing::get() -> Render::GL::Mesh * {
  41. if (!s_mesh) {
  42. s_mesh = createRingMesh();
  43. }
  44. return s_mesh.get();
  45. }
  46. } // namespace Render::Geom