45 QString code; |
45 QString code; |
46 }; |
46 }; |
47 |
47 |
48 struct Empty {}; |
48 struct Empty {}; |
49 |
49 |
|
50 struct CircularFraction |
|
51 { |
|
52 unsigned int segments; |
|
53 unsigned int divisions; |
|
54 }; |
|
55 |
|
56 constexpr bool operator<(const CircularFraction& p, const CircularFraction& q) |
|
57 { |
|
58 // a/b < c/d |
|
59 // a < c * b / d |
|
60 // a * d < c * b |
|
61 return p.segments * q.divisions < q.segments / p.divisions; |
|
62 } |
|
63 |
|
64 struct CircularPrimitive |
|
65 { |
|
66 enum Type |
|
67 { |
|
68 Circle, |
|
69 Disc, |
|
70 Cylinder, |
|
71 CylinderOpen, |
|
72 CylinderClosed, |
|
73 DiscNegative, |
|
74 Chord, |
|
75 } type; |
|
76 static constexpr int NUM_TYPES = Chord + 1; |
|
77 CircularFraction fraction; |
|
78 glm::mat4 transformation; |
|
79 }; |
|
80 |
|
81 struct CircleToolOptions |
|
82 { |
|
83 CircularFraction fraction; |
|
84 CircularPrimitive::Type type; |
|
85 }; |
|
86 |
50 using ModelElement = std::variant< |
87 using ModelElement = std::variant< |
51 Colored<SubfileReference>, |
88 Colored<SubfileReference>, |
52 Colored<LineSegment>, |
89 Colored<LineSegment>, |
53 Colored<Triangle>, |
90 Colored<Triangle>, |
54 Colored<Quadrilateral>, |
91 Colored<Quadrilateral>, |
55 Colored<ConditionalEdge>, |
92 Colored<ConditionalEdge>, |
|
93 Colored<CircularPrimitive>, |
56 Comment, |
94 Comment, |
57 Empty, |
95 Empty, |
58 ParseError>; |
96 ParseError>; |
59 |
97 |
60 using PolygonElement = Colored<std::variant< |
98 using PolygonElement = Colored<std::variant< |
204 if (std::holds_alternative<T>(model[i])) { |
242 if (std::holds_alternative<T>(model[i])) { |
205 fn(std::get<T>(model[i])); |
243 fn(std::get<T>(model[i])); |
206 } |
244 } |
207 } |
245 } |
208 } |
246 } |
|
247 |
|
248 constexpr Colored<LineSegment> edge(const glm::vec3& p1, const glm::vec3& p2) |
|
249 { |
|
250 return Colored<LineSegment>{{.p1 = p1, .p2 = p2}, EDGE_COLOR}; |
|
251 } |
|
252 |
|
253 constexpr Colored<Triangle> triangle(const glm::vec3& p1, const glm::vec3& p2, const glm::vec3& p3) |
|
254 { |
|
255 return Colored<Triangle>{{.p1 = p1, .p2 = p2, .p3 = p3}, MAIN_COLOR}; |
|
256 } |
|
257 |
|
258 constexpr Colored<Quadrilateral> quadrilateral( |
|
259 const glm::vec3& p1, |
|
260 const glm::vec3& p2, |
|
261 const glm::vec3& p3, |
|
262 const glm::vec3& p4) |
|
263 { |
|
264 return Colored<Quadrilateral>{{.p1 = p1, .p2 = p2, .p3 = p3, .p4 = p4}, MAIN_COLOR}; |
|
265 } |