Sun, 25 Jul 2021 13:49:37 +0300
work on editing tools
47 | 1 | #pragma once |
108 | 2 | #include <QBrush> |
3 | #include <QPen> | |
47 | 4 | #include "gl/partrenderer.h" |
61
4585d8d7a7ec
moved GridProgram to Canvas
Teemu Piippo <teemu@hecknology.net>
parents:
57
diff
changeset
|
5 | #include "gl/gridprogram.h" |
70 | 6 | #include "gl/axesprogram.h" |
47 | 7 | |
8 | class Canvas : public PartRenderer | |
9 | { | |
10 | Q_OBJECT | |
11 | public: | |
104 | 12 | struct MouseClickInfo; |
108 | 13 | struct MouseMoveInfo; |
105
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
14 | enum PreviewLayerName : std::int8_t |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
15 | { |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
16 | DrawToolPreview |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
17 | }; |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
18 | struct PreviewLayer |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
19 | { |
108 | 20 | struct Point |
21 | { | |
22 | glm::vec3 location; | |
23 | QBrush brush = {}; | |
24 | QPen pen = {}; | |
25 | }; | |
26 | struct Polygon | |
27 | { | |
28 | geom::NPolygon geometry; | |
29 | QBrush brush = {}; | |
30 | QPen pen = {}; | |
31 | }; | |
32 | QVector<Point> points; | |
33 | QVector<Polygon> polygons; | |
105
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
34 | }; |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
35 | static constexpr int NUM_PREVIEW_LAYERS = 1; |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
36 | |
47 | 37 | Canvas( |
38 | Model* model, | |
39 | DocumentManager* documents, | |
40 | const ldraw::ColorTable& colorTable, | |
41 | QWidget* parent = nullptr); | |
105
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
42 | const PreviewLayer& getPreviewLayer(PreviewLayerName name) const; |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
43 | PreviewLayer& modifyPreviewLayer(PreviewLayerName name); |
107
02f142b399b1
Move selection logic into select tool
Teemu Piippo <teemu@hecknology.net>
parents:
106
diff
changeset
|
44 | void clearSelection(); |
02f142b399b1
Move selection logic into select tool
Teemu Piippo <teemu@hecknology.net>
parents:
106
diff
changeset
|
45 | void addToSelection(ldraw::id_t id); |
51 | 46 | public slots: |
73
97df974b5ed5
ldraw::Id is now templated for extra type safety
Teemu Piippo <teemu@hecknology.net>
parents:
70
diff
changeset
|
47 | void handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds); |
47 | 48 | protected: |
49 | void mouseMoveEvent(QMouseEvent* event) override; | |
51 | 50 | void mousePressEvent(QMouseEvent* event) override; |
51 | void mouseReleaseEvent(QMouseEvent* event) override; | |
61
4585d8d7a7ec
moved GridProgram to Canvas
Teemu Piippo <teemu@hecknology.net>
parents:
57
diff
changeset
|
52 | void initializeGL() override; |
57
5c0005f63319
use glm::unProject to implement screenToModelCoordinates
Teemu Piippo <teemu@hecknology.net>
parents:
51
diff
changeset
|
53 | void paintGL() override; |
47 | 54 | signals: |
55 | void newStatusText(const QString& newStatusText); | |
73
97df974b5ed5
ldraw::Id is now templated for extra type safety
Teemu Piippo <teemu@hecknology.net>
parents:
70
diff
changeset
|
56 | void selectionChanged(const QSet<ldraw::id_t>& newSelection); |
104 | 57 | void mouseClick(const MouseClickInfo& info); |
108 | 58 | void mouseMove(const MouseMoveInfo& info); |
51 | 59 | private: |
64
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
61
diff
changeset
|
60 | void updateGridMatrix(); |
67 | 61 | glm::vec3 cameraVector() const; |
66
77c819262b7a
added a method to find out if the view is perpendicular to grid
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
62 | bool isGridPerpendicularToScreen(float threshold) const; |
61
4585d8d7a7ec
moved GridProgram to Canvas
Teemu Piippo <teemu@hecknology.net>
parents:
57
diff
changeset
|
63 | std::optional<GridProgram> gridProgram; |
70 | 64 | std::optional<AxesProgram> axesProgram; |
57
5c0005f63319
use glm::unProject to implement screenToModelCoordinates
Teemu Piippo <teemu@hecknology.net>
parents:
51
diff
changeset
|
65 | std::optional<glm::vec3> worldPosition; |
64
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
61
diff
changeset
|
66 | glm::mat4 gridMatrix; |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
61
diff
changeset
|
67 | geom::Plane gridPlane; |
51 | 68 | int totalMouseMove = 0; |
73
97df974b5ed5
ldraw::Id is now templated for extra type safety
Teemu Piippo <teemu@hecknology.net>
parents:
70
diff
changeset
|
69 | QSet<ldraw::id_t> selection; |
105
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
104
diff
changeset
|
70 | PreviewLayer previewLayers[NUM_PREVIEW_LAYERS]; |
47 | 71 | }; |
104 | 72 | |
73 | struct Canvas::MouseClickInfo | |
74 | { | |
106 | 75 | std::optional<glm::vec3> worldPosition; |
76 | Canvas* invoker; | |
104 | 77 | }; |
108 | 78 | |
79 | struct Canvas::MouseMoveInfo | |
80 | { | |
81 | std::optional<glm::vec3> worldPosition; | |
82 | Canvas* invoker; | |
83 | }; |