--- a/src/gl/partrenderer.h Sun Jul 03 15:59:22 2022 +0300 +++ b/src/gl/partrenderer.h Sun Jul 03 20:18:34 2022 +0300 @@ -72,3 +72,48 @@ void renderVao(const gl::ArrayClass arrayClass); void checkForGLErrors(); }; + +inline QVector<QPointF> convertWorldPointsToScreenPoints( + const std::vector<glm::vec3> &worldPoints, + const PartRenderer* renderer) +{ + QVector<QPointF> points2d; + points2d.reserve(static_cast<int>(worldPoints.size())); + for (const glm::vec3& point : worldPoints) + { + points2d.push_back(renderer->modelToScreenCoordinates(point)); + } + return points2d; +} + +inline Winding worldPolygonWinding( + const std::vector<glm::vec3> &points, + const PartRenderer* renderer) +{ + return winding(QPolygonF{convertWorldPointsToScreenPoints(points, renderer)}); +} + +inline void drawWorldPoint( + QPainter* painter, + const glm::vec3& worldPoint, + const PartRenderer* renderer) +{ + const QPointF center = renderer->modelToScreenCoordinates(worldPoint); + painter->drawEllipse(inscribe(CircleF{center, 5})); +} + +inline void drawWorldPolyline( + QPainter *painter, + const std::vector<glm::vec3> &points, + const PartRenderer* renderer) +{ + painter->drawPolyline(QPolygonF{convertWorldPointsToScreenPoints(points, renderer)}); +} + +inline void drawWorldPolygon( + QPainter* painter, + const std::vector<glm::vec3> &points, + const PartRenderer* renderer) +{ + painter->drawPolygon(QPolygonF{convertWorldPointsToScreenPoints(points, renderer)}); +}