5 #include "gl/partrenderer.h" |
5 #include "gl/partrenderer.h" |
6 #include "gl/gridprogram.h" |
6 #include "gl/gridprogram.h" |
7 #include "gl/axesprogram.h" |
7 #include "gl/axesprogram.h" |
8 #include "gl/vertexprogram.h" |
8 #include "gl/vertexprogram.h" |
9 |
9 |
|
10 enum EditingMode |
|
11 { |
|
12 SelectMode, |
|
13 DrawMode |
|
14 }; |
|
15 |
|
16 struct DrawState |
|
17 { |
|
18 std::vector<glm::vec3> polygon; |
|
19 std::vector<glm::vec3> previewPolygon; |
|
20 glm::vec3 previewPoint; |
|
21 bool isconcave = false; |
|
22 }; |
|
23 |
10 class Canvas : public PartRenderer |
24 class Canvas : public PartRenderer |
11 { |
25 { |
12 Q_OBJECT |
26 Q_OBJECT |
13 public: |
27 public: |
14 using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; |
28 using OverpaintCallback = std::function<void(Canvas*, QPainter*)>; |
15 Canvas( |
29 Canvas( |
16 Model* model, |
30 Model* model, |
|
31 Document* document, |
17 DocumentManager* documents, |
32 DocumentManager* documents, |
18 const ldraw::ColorTable& colorTable, |
33 const ldraw::ColorTable& colorTable, |
19 QWidget* parent = nullptr); |
34 QWidget* parent = nullptr); |
20 void clearSelection(); |
35 void clearSelection(); |
21 void addToSelection(ldraw::id_t id); |
36 void addToSelection(ldraw::id_t id); |
22 void setOverpaintCallback(OverpaintCallback fn); |
37 void setOverpaintCallback(OverpaintCallback fn); |
23 void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; |
38 void drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const; |
24 void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points); |
39 void drawWorldPolyline(QPainter* painter, const std::vector<glm::vec3>& points); |
25 void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); |
40 void drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3>& points); |
26 Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const; |
41 Winding worldPolygonWinding(const std::vector<glm::vec3>& points) const; |
27 const std::optional<glm::vec3>& getWorldPosition() const; |
42 const std::optional<glm::vec3>& getWorldPosition() const; |
28 void adjustGridToView(); |
|
29 const QSet<ldraw::id_t> selectedObjects() const; |
43 const QSet<ldraw::id_t> selectedObjects() const; |
30 const glm::mat4& getGridMatrix() const; |
44 const glm::mat4& getGridMatrix() const; |
|
45 void closeShape(); |
|
46 glm::vec3 cameraVector() const; |
|
47 DrawState drawState; |
|
48 EditingMode mode = SelectMode; |
31 public Q_SLOTS: |
49 public Q_SLOTS: |
32 void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds); |
50 void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds); |
33 void rebuildVertices(Document *document); |
51 void rebuildVertices(Document *document); |
34 void setGridMatrix(const glm::mat4 &newMatrix); |
52 void setGridMatrix(const glm::mat4 &newMatrix); |
35 protected: |
53 protected: |
36 void mouseMoveEvent(QMouseEvent* event) override; |
54 void mouseMoveEvent(QMouseEvent* event) override; |
37 void mousePressEvent(QMouseEvent* event) override; |
55 void mousePressEvent(QMouseEvent* event) override; |
38 void mouseReleaseEvent(QMouseEvent* event) override; |
56 void mouseReleaseEvent(QMouseEvent* event) override; |
39 void initializeGL() override; |
57 void initializeGL() override; |
42 void newStatusText(const QString& newStatusText); |
60 void newStatusText(const QString& newStatusText); |
43 void selectionChanged(const QSet<ldraw::id_t>& newSelection); |
61 void selectionChanged(const QSet<ldraw::id_t>& newSelection); |
44 void mouseClick(Canvas* canvas, QMouseEvent* event); |
62 void mouseClick(Canvas* canvas, QMouseEvent* event); |
45 void mouseMove(Canvas* canvas, QMouseEvent* event); |
63 void mouseMove(Canvas* canvas, QMouseEvent* event); |
46 private: |
64 private: |
47 glm::vec3 cameraVector() const; |
|
48 bool isGridPerpendicularToScreen(float threshold) const; |
65 bool isGridPerpendicularToScreen(float threshold) const; |
49 QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const; |
66 QVector<QPointF> convertWorldPointsToScreenPoints(const std::vector<glm::vec3>& worldPoints) const; |
50 Q_SLOT void updateCanvasRenderPreferences(); |
67 Q_SLOT void updateCanvasRenderPreferences(); |
51 void renderAxesLabels(QPainter& painter); |
68 void renderAxesLabels(QPainter& painter); |
52 std::optional<GridProgram> gridProgram; |
69 std::optional<GridProgram> gridProgram; |