20 #include <memory> |
20 #include <memory> |
21 #include <QWidget> |
21 #include <QWidget> |
22 #include <QToolBar> |
22 #include <QToolBar> |
23 #include "model.h" |
23 #include "model.h" |
24 #include "vertexmap.h" |
24 #include "vertexmap.h" |
|
25 #include "gl/common.h" |
25 |
26 |
26 enum EditingMode |
27 enum EditingMode |
27 { |
28 { |
28 SelectMode, |
29 SelectMode, |
29 DrawMode |
30 DrawMode |
30 }; |
31 }; |
31 |
32 |
32 Q_DECLARE_METATYPE(EditingMode); |
33 Q_DECLARE_METATYPE(EditingMode); |
33 |
|
34 struct DrawState |
|
35 { |
|
36 std::vector<glm::vec3> polygon; |
|
37 std::vector<glm::vec3> previewPolygon; |
|
38 glm::vec3 previewPoint; |
|
39 bool isconcave = false; |
|
40 EditingMode mode = SelectMode; |
|
41 }; |
|
42 |
34 |
43 struct AppendToModel |
35 struct AppendToModel |
44 { |
36 { |
45 ModelElement newElement; |
37 ModelElement newElement; |
46 }; |
38 }; |
52 |
44 |
53 using ModelAction = std::variant<AppendToModel, DeleteFromModel>; |
45 using ModelAction = std::variant<AppendToModel, DeleteFromModel>; |
54 |
46 |
55 Q_DECLARE_METATYPE(ModelAction) |
47 Q_DECLARE_METATYPE(ModelAction) |
56 |
48 |
57 class EditTools : public QObject |
49 class EditTools final : public QObject, public RenderLayer |
58 { |
50 { |
59 Q_OBJECT |
51 Q_OBJECT |
|
52 std::vector<glm::vec3> polygon; |
|
53 std::vector<glm::vec3> previewPolygon; |
|
54 glm::vec3 previewPoint; |
|
55 bool isconcave = false; |
|
56 EditingMode mode = SelectMode; |
|
57 glm::mat4 mvpMatrix; |
|
58 glm::mat4 gridMatrix{1}; |
|
59 Plane gridPlane; |
|
60 opt<glm::vec3> worldPosition; |
60 public: |
61 public: |
61 explicit EditTools( |
62 explicit EditTools(QObject *parent = nullptr); |
62 Model* model, |
|
63 const ColorTable& colorTable, |
|
64 QObject *parent = nullptr); |
|
65 ~EditTools() override; |
63 ~EditTools() override; |
66 void applyToVertices(VertexMap::ApplyFunction fn) const; |
64 void applyToVertices(VertexMap::ApplyFunction fn) const; |
67 const QSet<ModelId> selectedObjects() const; |
65 const QSet<ModelId> selectedObjects() const; |
68 const ColorTable& colorTable; |
|
69 Model* const model; |
|
70 EditingMode currentEditingMode() const; |
66 EditingMode currentEditingMode() const; |
71 Q_SLOT void setEditMode(EditingMode mode); |
67 Q_SLOT void setEditMode(EditingMode mode); |
72 Q_SLOT void canvasMouseClick(QMouseEvent* event); |
68 Q_SLOT void setGridMatrix(const glm::mat4& gridMatrix); |
73 Q_SLOT void canvasMouseMove(QMouseEvent* event); |
|
74 Q_SIGNALS: |
69 Q_SIGNALS: |
75 void newStatusText(const QString& newStatusText); |
70 void newStatusText(const QString& newStatusText); |
76 void splitterChanged(); |
|
77 void modelAction(const ModelAction& action); |
71 void modelAction(const ModelAction& action); |
78 void drawStateChanged(const DrawState& drawState); |
72 void select(const QSet<ModelId>& ids, bool retain); |
|
73 protected: |
|
74 void mvpMatrixChanged(const glm::mat4& matrix) override; |
|
75 void mouseMoved(const QMouseEvent* event) override; |
|
76 void mouseClick(const QMouseEvent* event) override; |
|
77 void overpaint(QPainter* painter) override; |
79 private: |
78 private: |
80 void closeShape(); |
79 void closeShape(); |
81 DrawState drawState; |
80 void updatePreviewPolygon(); |
82 VertexMap vertexMap; |
81 void removeLastPoint(); |
83 }; |
82 }; |