selection_disc.cpp 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #include "selection_disc.h"
  2. #include "gl/mesh.h"
  3. #include <QVector3D>
  4. #include <cmath>
  5. #include <memory>
  6. #include <vector>
  7. namespace Render::Geom {
  8. std::unique_ptr<Render::GL::Mesh> SelectionDisc::s_mesh;
  9. static auto createDiscMesh() -> std::unique_ptr<Render::GL::Mesh> {
  10. using namespace Render::GL;
  11. std::vector<Vertex> verts;
  12. std::vector<unsigned int> idx;
  13. constexpr int k_disc_segments = 72;
  14. verts.push_back({{0.0F, 0.0F, 0.0F}, {0.0F, 1.0F, 0.0F}, {0.5F, 0.5F}});
  15. for (int i = 0; i <= k_disc_segments; ++i) {
  16. float const a = (i / float(k_disc_segments)) * 6.2831853F;
  17. float x = std::cos(a);
  18. float z = std::sin(a);
  19. verts.push_back(
  20. {{x, 0.0F, z}, {0.0F, 1.0F, 0.0F}, {0.5F + 0.5F * x, 0.5F + 0.5F * z}});
  21. }
  22. for (int i = 1; i <= k_disc_segments; ++i) {
  23. idx.push_back(0);
  24. idx.push_back(i);
  25. idx.push_back(i + 1);
  26. }
  27. return std::make_unique<Mesh>(verts, idx);
  28. }
  29. auto SelectionDisc::get() -> Render::GL::Mesh * {
  30. if (!s_mesh) {
  31. s_mesh = createDiscMesh();
  32. }
  33. return s_mesh.get();
  34. }
  35. } // namespace Render::Geom