diff -r a9bf6bab5ea2 -r 8efa3a33172e src/model.h --- a/src/model.h Wed Jun 15 19:47:02 2022 +0300 +++ b/src/model.h Mon Jun 20 02:04:51 2022 +0300 @@ -47,12 +47,50 @@ struct Empty {}; +struct CircularFraction +{ + unsigned int segments; + unsigned int divisions; +}; + +constexpr bool operator<(const CircularFraction& p, const CircularFraction& q) +{ + // a/b < c/d + // a < c * b / d + // a * d < c * b + return p.segments * q.divisions < q.segments / p.divisions; +} + +struct CircularPrimitive +{ + enum Type + { + Circle, + Disc, + Cylinder, + CylinderOpen, + CylinderClosed, + DiscNegative, + Chord, + } type; + static constexpr int NUM_TYPES = Chord + 1; + CircularFraction fraction; + glm::mat4 transformation; +}; + +struct CircleToolOptions +{ + CircularFraction fraction; + CircularPrimitive::Type type; +}; + using ModelElement = std::variant< Colored, Colored, Colored, Colored, Colored, + Colored, Comment, Empty, ParseError>; @@ -206,3 +244,22 @@ } } } + +constexpr Colored edge(const glm::vec3& p1, const glm::vec3& p2) +{ + return Colored{{.p1 = p1, .p2 = p2}, EDGE_COLOR}; +} + +constexpr Colored triangle(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& p3) +{ + return Colored{{.p1 = p1, .p2 = p2, .p3 = p3}, MAIN_COLOR}; +} + +constexpr Colored quadrilateral( + const glm::vec3& p1, + const glm::vec3& p2, + const glm::vec3& p3, + const glm::vec3& p4) +{ + return Colored{{.p1 = p1, .p2 = p2, .p3 = p3, .p4 = p4}, MAIN_COLOR}; +}