--- 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<SubfileReference>, Colored<LineSegment>, Colored<Triangle>, Colored<Quadrilateral>, Colored<ConditionalEdge>, + Colored<CircularPrimitive>, Comment, Empty, ParseError>; @@ -206,3 +244,22 @@ } } } + +constexpr Colored<LineSegment> edge(const glm::vec3& p1, const glm::vec3& p2) +{ + return Colored<LineSegment>{{.p1 = p1, .p2 = p2}, EDGE_COLOR}; +} + +constexpr Colored<Triangle> triangle(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& p3) +{ + return Colored<Triangle>{{.p1 = p1, .p2 = p2, .p3 = p3}, MAIN_COLOR}; +} + +constexpr Colored<Quadrilateral> quadrilateral( + const glm::vec3& p1, + const glm::vec3& p2, + const glm::vec3& p3, + const glm::vec3& p4) +{ + return Colored<Quadrilateral>{{.p1 = p1, .p2 = p2, .p3 = p3, .p4 = p4}, MAIN_COLOR}; +}