src/ui/canvas.cpp

changeset 71
198d25fe4e21
parent 70
f21b800b02a4
child 73
97df974b5ed5
--- a/src/ui/canvas.cpp	Fri Mar 06 20:13:10 2020 +0200
+++ b/src/ui/canvas.cpp	Fri Mar 06 21:53:30 2020 +0200
@@ -180,6 +180,61 @@
 		painter.setPen(Qt::white);
 		painter.drawText(pos + QPointF{5, 5}, vectorToString(*this->worldPosition));
 	}
+	{
+		QPainter painter{this};
+		QFont font;
+		//font.setStyle(QFont::StyleItalic);
+		painter.setFont(font);
+		QFontMetrics fontMetrics{font};
+		const auto renderText = [&](const QString& text, const geom::PointOnRectagle& intersection)
+		{
+			QPointF position = toQPointF(intersection.position);
+			const geom::RectangleSide side = intersection.side;
+			switch (side)
+			{
+			case geom::RectangleSide::Top:
+				position += QPointF{0, static_cast<qreal>(fontMetrics.ascent())};
+				break;
+			case geom::RectangleSide::Left:
+				break;
+			case geom::RectangleSide::Bottom:
+				position += QPointF{0, static_cast<qreal>(-fontMetrics.descent())};
+				break;
+			case geom::RectangleSide::Right:
+				position += QPointF{static_cast<qreal>(-fontMetrics.width(text)), 0};
+				break;
+			}
+			painter.drawText(position, text);
+		};
+		const QRectF box {
+			QPointF{0, 0},
+			QPointF{static_cast<qreal>(this->width()), static_cast<qreal>(this->height())}
+		};
+		const QPointF p1 = this->modelToScreenCoordinates(glm::vec3{0, 0, 0});
+
+		static const struct
+		{
+			QString text;
+			glm::vec3 direction;
+		} directions[] =
+		{
+			{"+𝑥", {1, 0, 0}},
+			{"-𝑥", {-1, 0, 0}},
+			{"+𝑦", {0, 1, 0}},
+			{"-𝑦", {0, -1, 0}},
+			{"+𝑧", {0, 0, 1}},
+			{"-𝑧", {0, 0, -1}},
+		};
+		for (const auto& axis : directions)
+		{
+			const QPointF x_p = this->modelToScreenCoordinates(axis.direction);
+			const auto intersection = geom::rayRectangleIntersection(geom::rayFromPoints(toVec2(p1), toVec2(x_p)), box);
+			if (intersection.has_value())
+			{
+				renderText(axis.text, *intersection);
+			}
+		}
+	}
 }
 
 void Canvas::updateGridMatrix()

mercurial