src/model.h

changeset 232
8efa3a33172e
parent 218
63125c36de73
child 233
5509bec02c81
--- 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};
+}

mercurial