diff -r b497f5e66749 -r 50f055543ff6 src/gl/vertexprogram.cpp --- a/src/gl/vertexprogram.cpp Sun Mar 06 10:32:54 2022 +0200 +++ b/src/gl/vertexprogram.cpp Wed Mar 09 12:42:45 2022 +0200 @@ -31,18 +31,38 @@ } )"; -static constexpr glm::vec3 o = {0, 0, 0}; -static constexpr glm::vec3 c1 = {1, -1, 1}; -static constexpr glm::vec3 c2 = {1, -1, -1}; -static constexpr glm::vec3 c3 = {-1, -1, -1}; -static constexpr glm::vec3 c4 = {-1, -1, 1}; - -static constexpr glm::vec3 markerGeometry[] = { - o, c1, c2, - o, c2, c3, - o, c3, c4, - o, c4, c1, -}; +std::vector sphere(const int d2) +{ + std::vector result; + result.reserve(12 * d2 * d2); + for (int i = 0; i < d2; ++i) + { + const float alpha = i * math::pi / d2; + const float alpha_2 = (i + 1) * math::pi / d2; + for (int j = -d2; j < d2; ++j) + { + const float beta = j * math::pi / d2; + const float beta_2 = (j + 1) * math::pi / d2; + const float x1 = cos(beta) * sin(alpha); + const float x2 = cos(beta) * sin(alpha_2); + const float x3 = cos(beta_2) * sin(alpha_2); + const float x4 = cos(beta_2) * sin(alpha); + const float z1 = sin(beta) * sin(alpha); + const float z2 = sin(beta) * sin(alpha_2); + const float z3 = sin(beta_2) * sin(alpha_2); + const float z4 = sin(beta_2) * sin(alpha); + const float y1 = cos(alpha); + const float y2 = cos(alpha_2); + result.push_back({x1, y1, z1}); + result.push_back({x2, y2, z2}); + result.push_back({x3, y2, z3}); + result.push_back({x1, y1, z1}); + result.push_back({x3, y2, z3}); + result.push_back({x4, y1, z4}); + } + } + return result; +} VertexProgram::VertexProgram(QObject *parent) : AbstractBasicShaderProgram{parent} @@ -104,12 +124,13 @@ { constexpr glm::vec3 color = {0.0, 1.0, 1.0}; this->data.clear(); + const std::vector sphere = ::sphere(8 / 2); document->applyToVertices([&](const glm::vec3&, const VertexMap::VertexInfo& info) { - reserveMore(this->data, ::countof(::markerGeometry)); - for (const glm::vec3& point : ::markerGeometry) + reserveMore(this->data, sphere.size()); + for (const glm::vec3& point : sphere) { - const glm::vec3 transformed = info.transform * glm::vec4{point, 1}; + const glm::vec3 transformed = glm::scale(info.transform, glm::vec3{0.5, 0.5, 0.5}) * glm::vec4{point, 1}; this->data.push_back({transformed, color}); } });