1 #pragma once |
|
2 #include <QPainter> |
|
3 #include <QBrush> |
|
4 #include <QPen> |
|
5 #include "gl/partrenderer.h" |
|
6 #include "gl/gridprogram.h" |
|
7 #include "gl/axesprogram.h" |
|
8 #include "gl/vertexprogram.h" |
|
9 |
|
10 class EditTools; |
|
11 |
|
12 class Canvas : public PartRenderer |
|
13 { |
|
14 Q_OBJECT |
|
15 public: |
|
16 using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; |
|
17 Canvas( |
|
18 Model* model, |
|
19 EditTools* document, |
|
20 DocumentManager* documents, |
|
21 const ColorTable& colorTable, |
|
22 QWidget* parent = nullptr); |
|
23 void setOverpaintCallback(OverpaintCallback fn); |
|
24 void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; |
|
25 void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points); |
|
26 void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); |
|
27 Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const; |
|
28 const std::optional<glm::vec3>& getWorldPosition() const; |
|
29 const QSet<ModelId> selectedObjects() const; |
|
30 const glm::mat4& getGridMatrix() const; |
|
31 void closeShape(); |
|
32 glm::vec3 cameraVector() const; |
|
33 std::optional<glm::vec3> worldPosition; |
|
34 DrawState* drawState = nullptr; |
|
35 public Q_SLOTS: |
|
36 void handleSelectionChange(const QSet<ModelId>& selectedIds, const QSet<ModelId>& deselectedIds); |
|
37 void rebuildVertices(VertexMap* vertexMap); |
|
38 void setGridMatrix(const glm::mat4 &newMatrix); |
|
39 protected: |
|
40 void mouseMoveEvent(QMouseEvent* event) override; |
|
41 void mousePressEvent(QMouseEvent* event) override; |
|
42 void mouseReleaseEvent(QMouseEvent* event) override; |
|
43 void initializeGL() override; |
|
44 void paintGL() override; |
|
45 Q_SIGNALS: |
|
46 void newStatusText(const QString& newStatusText); |
|
47 void mouseClick(QMouseEvent* event); |
|
48 void mouseMove(QMouseEvent* event); |
|
49 private: |
|
50 bool isGridPerpendicularToScreen(float threshold) const; |
|
51 QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const; |
|
52 Q_SLOT void updateCanvasRenderPreferences(); |
|
53 void renderAxesLabels(QPainter& painter); |
|
54 std::optional<GridProgram> gridProgram; |
|
55 std::optional<AxesProgram> axesProgram; |
|
56 std::optional<VertexProgram> vertexProgram; |
|
57 glm::mat4 gridMatrix; |
|
58 Plane gridPlane; |
|
59 int totalMouseMove = 0; |
|
60 bool isDark = true; |
|
61 QSet<ModelId> selection; |
|
62 OverpaintCallback overpaintCallback = nullptr; |
|
63 EditTools* document; |
|
64 }; |
|
65 |
|
66 void adjustGridToView(Canvas* canvas); |
|