Wed, 22 Jun 2022 20:27:53 +0300
Move some widgets into a static library
#pragma once #include "basics.h" #include "model.h" namespace ldraw { /// Determines how quadrilaterals are split into triangles enum class Diagonal { Diagonal_13, Diagonal_24 }; std::pair<Triangle, Triangle> splitTriangles( const Quadrilateral& q, ldraw::Diagonal diagonal); /* void makeUnofficial(ModelEditor &editor); */ constexpr float circleAngle(unsigned int divisions, unsigned int i) { constexpr float ofs = 0.5 * pi<>; float factor = -2.0f * pi<> / static_cast<float>(divisions); return static_cast<float>(i) * factor + ofs; } constexpr glm::vec2 rimpoint(unsigned int divisions, unsigned int i) { const float angle = circleAngle(divisions, i); return glm::vec2{std::sin(angle), std::cos(angle)}; } template<typename Fn> void circleAngles(unsigned int segments, unsigned int divisions, Fn&& fn) { for (unsigned int i = 0; i < segments; i += 1) { const float a1 = circleAngle(divisions, i - 1); const float a2 = circleAngle(divisions, i); const float a3 = circleAngle(divisions, i + 1); fn(a1, a2, a3); } } template<typename Fn> void circle(unsigned int segments, unsigned int divisions, Fn&& fn) { circleAngles(segments, divisions, [&fn]( const float a1, const float a2, const float a3 ){ fn( glm::vec2{std::sin(a1), std::cos(a1)}, glm::vec2{std::sin(a2), std::cos(a2)}, glm::vec2{std::sin(a3), std::cos(a3)} ); }); } } ModelElement inverted(const ModelElement &element);