| 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; |