Wed, 08 Jun 2022 22:29:44 +0300
More refactor, merged main.h, basics.h and utility.h into one header file basics.h and removed plenty of unused code
#pragma once #include <QPainter> #include <QBrush> #include <QPen> #include "gl/partrenderer.h" #include "gl/gridprogram.h" #include "gl/axesprogram.h" #include "gl/vertexprogram.h" enum EditingMode { SelectMode, DrawMode }; Q_DECLARE_METATYPE(EditingMode); struct DrawState { std::vector<glm::vec3> polygon; std::vector<glm::vec3> previewPolygon; glm::vec3 previewPoint; bool isconcave = false; EditingMode mode = SelectMode; }; class Canvas : public PartRenderer { Q_OBJECT public: using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; Canvas( Model* model, EditorTabWidget* document, DocumentManager* documents, const ColorTable& colorTable, QWidget* parent = nullptr); void setOverpaintCallback(OverpaintCallback fn); void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points); void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const; const std::optional<glm::vec3>& getWorldPosition() const; const QSet<ModelId> selectedObjects() const; const glm::mat4& getGridMatrix() const; void closeShape(); glm::vec3 cameraVector() const; std::optional<glm::vec3> worldPosition; DrawState* drawState = nullptr; public Q_SLOTS: void handleSelectionChange(const QSet<ModelId>& selectedIds, const QSet<ModelId>& deselectedIds); void rebuildVertices(EditorTabWidget *document); void setGridMatrix(const glm::mat4 &newMatrix); protected: void mouseMoveEvent(QMouseEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; void initializeGL() override; void paintGL() override; Q_SIGNALS: void newStatusText(const QString& newStatusText); void mouseClick(QMouseEvent* event); void mouseMove(QMouseEvent* event); private: bool isGridPerpendicularToScreen(float threshold) const; QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const; Q_SLOT void updateCanvasRenderPreferences(); void renderAxesLabels(QPainter& painter); std::optional<GridProgram> gridProgram; std::optional<AxesProgram> axesProgram; std::optional<VertexProgram> vertexProgram; glm::mat4 gridMatrix; Plane gridPlane; int totalMouseMove = 0; bool isDark = true; QSet<ModelId> selection; OverpaintCallback overpaintCallback = nullptr; EditorTabWidget* document; }; void adjustGridToView(Canvas* canvas);