Fri, 03 Feb 2017 10:44:23 +0200
Reworked and cleaned up the circle mode
829
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
1 | /* |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
2 | * LDForge: LDraw parts authoring CAD |
1072 | 3 | * Copyright (C) 2013 - 2017 Teemu Piippo |
829
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
4 | * |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
5 | * This program is free software: you can redistribute it and/or modify |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
6 | * it under the terms of the GNU General Public License as published by |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
7 | * the Free Software Foundation, either version 3 of the License, or |
1006
a6b462051ae0
Copyright header fix, some minor stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents:
986
diff
changeset
|
8 | * (at your option) any later version. |
829
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
9 | * |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
10 | * This program is distributed in the hope that it will be useful, |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
13 | * GNU General Public License for more details. |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
14 | * |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
15 | * You should have received a copy of the GNU General Public License |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
17 | */ |
bb903e89e23c
- now with license headers
Santeri Piippo <crimsondusk64@gmail.com>
parents:
827
diff
changeset
|
18 | |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
19 | #include <QPainter> |
830
a741a0b9df49
- updated filenames
Santeri Piippo <crimsondusk64@gmail.com>
parents:
829
diff
changeset
|
20 | #include "circleMode.h" |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
21 | #include "../miscallenous.h" |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
22 | #include "../ldObject.h" |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
23 | #include "../ldDocument.h" |
842
e1c9010eb9e8
- moved ringFinder into root source directory, clearing the src/misc/ directory
Teemu Piippo <crimsondusk64@gmail.com>
parents:
840
diff
changeset
|
24 | #include "../ringFinder.h" |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
25 | #include "../primitives.h" |
827 | 26 | #include "../glRenderer.h" |
962
a4b463a7ee82
Rename MainWindow files
Teemu Piippo <crimsondusk64@gmail.com>
parents:
958
diff
changeset
|
27 | #include "../mainwindow.h" |
1025
4949da3fb4b3
Renamed ldObjectMath.cpp/.h to mathfunctions.cpp/.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1024
diff
changeset
|
28 | #include "../mathfunctions.h" |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
29 | #include "../miscallenous.h" |
1023
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
30 | #include "../grid.h" |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
31 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
32 | CircleMode::CircleMode(GLRenderer* renderer) : |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
33 | Super {renderer} {} |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
34 | |
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
35 | |
827 | 36 | EditModeType CircleMode::type() const |
37 | { | |
38 | return EditModeType::Circle; | |
39 | } | |
40 | ||
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
41 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
42 | double CircleMode::getCircleDrawDist(int position) const |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
43 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
44 | if (countof(m_drawedVerts) >= position + 1) |
958
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
45 | { |
1023
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
46 | Vertex v1; |
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
47 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
48 | if (countof(m_drawedVerts) >= position + 2) |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
49 | v1 = m_drawedVerts[position + 1]; |
1023
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
50 | else |
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
51 | v1 = renderer()->convert2dTo3d (renderer()->mousePosition(), false); |
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
52 | |
958
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
53 | Axis localx, localy; |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
54 | renderer()->getRelativeAxes(localx, localy); |
958
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
55 | double dx = m_drawedVerts[0][localx] - v1[localx]; |
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
56 | double dy = m_drawedVerts[0][localy] - v1[localy]; |
1023
9450ac3cd930
Split grid stuff into a new class Grid in grid.cpp/grid.h
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1019
diff
changeset
|
57 | return grid()->snap(hypot(dx, dy), Grid::Coordinate); |
958
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
58 | } |
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
59 | |
1dc890c73e01
Removed all asserts from the code. Removed assert handling and the bomb box dialog.
Teemu Piippo <crimsondusk64@gmail.com>
parents:
952
diff
changeset
|
60 | return 0.0; |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
61 | } |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
62 | |
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
63 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
64 | Matrix CircleMode::getCircleDrawMatrix(double scale) |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
65 | { |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
66 | // Matrix templates. 2 is substituted with the scale value, 1 is inverted to -1 if needed. |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
67 | static const Matrix templates[3] = |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
68 | { |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
69 | { 2, 0, 0, 0, 1, 0, 0, 0, 2 }, |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
70 | { 2, 0, 0, 0, 0, 2, 0, 1, 0 }, |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
71 | { 0, 1, 0, 2, 0, 0, 0, 0, 2 }, |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
72 | }; |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
73 | |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
74 | Matrix transform = templates[renderer()->camera() % 3]; |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
75 | |
1068
283de3bd8b0e
Reworked the Matrix interface so that less index math is involved
Teemu Piippo <teemu@hecknology.net>
parents:
1065
diff
changeset
|
76 | for (double& value : transform) |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
77 | { |
1068
283de3bd8b0e
Reworked the Matrix interface so that less index math is involved
Teemu Piippo <teemu@hecknology.net>
parents:
1065
diff
changeset
|
78 | if (value == 2) |
283de3bd8b0e
Reworked the Matrix interface so that less index math is involved
Teemu Piippo <teemu@hecknology.net>
parents:
1065
diff
changeset
|
79 | value = scale; |
283de3bd8b0e
Reworked the Matrix interface so that less index math is involved
Teemu Piippo <teemu@hecknology.net>
parents:
1065
diff
changeset
|
80 | else if (value == 1 and renderer()->camera() >= 3) |
283de3bd8b0e
Reworked the Matrix interface so that less index math is involved
Teemu Piippo <teemu@hecknology.net>
parents:
1065
diff
changeset
|
81 | value = -1; |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
82 | } |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
83 | |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
84 | return transform; |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
85 | } |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
86 | |
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
87 | |
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
88 | void CircleMode::endDraw() |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
89 | { |
1079
67c6e5d32e68
More rework on model stuff, removals of LDSpawn calls. Most importantly, the LDraw code parsing function was moved to Model.
Teemu Piippo <teemu@hecknology.net>
parents:
1077
diff
changeset
|
90 | Model model {m_documents}; |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
91 | PrimitiveModel primitiveModel; |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
92 | primitiveModel.segments = m_window->ringToolSegments(); |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
93 | primitiveModel.divisions = m_window->ringToolHiRes() ? HighResolution : LowResolution; |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
94 | primitiveModel.ringNumber = 0; |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
95 | double dist0 (getCircleDrawDist (0)); |
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
96 | double dist1 (getCircleDrawDist (1)); |
1053 | 97 | LDDocument* primitiveFile; |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
98 | Matrix transform; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
99 | bool circleOrDisc = false; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
100 | |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
101 | if (dist1 < dist0) |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
102 | qSwap(dist0, dist1); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
103 | |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
104 | if (dist0 == dist1) |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
105 | { |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
106 | // If the radii are the same, there's no ring space to fill. Use a circle. |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
107 | primitiveModel.type = PrimitiveModel::Circle; |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
108 | primitiveFile = primitives()->getPrimitive(primitiveModel); |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
109 | transform = getCircleDrawMatrix(dist0); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
110 | circleOrDisc = true; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
111 | } |
967 | 112 | else if (dist0 == 0 or dist1 == 0) |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
113 | { |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
114 | // If either radii is 0, use a disc. |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
115 | primitiveModel.type = PrimitiveModel::Disc; |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
116 | primitiveFile = primitives()->getPrimitive(primitiveModel); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
117 | transform = getCircleDrawMatrix ((dist0 != 0) ? dist0 : dist1); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
118 | circleOrDisc = true; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
119 | } |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
120 | else if (g_RingFinder.findRings(dist0, dist1)) |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
121 | { |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
122 | // The ring finder found a solution, use that. Add the component rings to the file. |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
123 | primitiveModel.type = PrimitiveModel::Ring; |
1019
a2e4286adb0d
Split PrimitivePrompt into its new source files, renamed it to GeneratePrimitivePrompt
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1018
diff
changeset
|
124 | |
1053 | 125 | for (const RingFinder::Component& component : g_RingFinder.bestSolution()->getComponents()) |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
126 | { |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
127 | primitiveModel.ringNumber = component.num; |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
128 | primitiveFile = primitives()->getPrimitive(primitiveModel); |
1082
1738bdaf36d6
The "all objects have valid models" invariant seems to be holding up now. At least basic drawing works again.
Teemu Piippo <teemu@hecknology.net>
parents:
1079
diff
changeset
|
129 | model.emplace<LDSubfileReference>(primitiveFile, getCircleDrawMatrix(component.scale), m_drawedVerts.first()); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
130 | } |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
131 | } |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
132 | else |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
133 | { |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
134 | // Ring finder failed, last resort: draw the ring with quads |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
135 | Axis localx, localy, localz; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
136 | renderer()->getRelativeAxes (localx, localy); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
137 | localz = (Axis) (3 - localx - localy); |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
138 | double x0 = m_drawedVerts[0][localx]; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
139 | double y0 = m_drawedVerts[0][localy]; |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
140 | |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
141 | Vertex templ; |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
142 | templ.setCoordinate(localx, x0); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
143 | templ.setCoordinate(localy, y0); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
144 | templ.setCoordinate(localz, renderer()->getDepthValue()); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
145 | |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
146 | // Calculate circle coords |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
147 | QVector<QLineF> c0 = makeCircle(primitiveModel.segments, primitiveModel.divisions, dist0); |
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
148 | QVector<QLineF> c1 = makeCircle(primitiveModel.segments, primitiveModel.divisions, dist1); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
149 | |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
150 | for (int i = 0; i < primitiveModel.segments; ++i) |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
151 | { |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
152 | Vertex v0, v1, v2, v3; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
153 | v0 = v1 = v2 = v3 = templ; |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
154 | v0.setCoordinate (localx, v0[localx] + c0[i].x1()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
155 | v0.setCoordinate (localy, v0[localy] + c0[i].y1()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
156 | v1.setCoordinate (localx, v1[localx] + c0[i].x2()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
157 | v1.setCoordinate (localy, v1[localy] + c0[i].y2()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
158 | v2.setCoordinate (localx, v2[localx] + c1[i].x2()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
159 | v2.setCoordinate (localy, v2[localy] + c1[i].y2()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
160 | v3.setCoordinate (localx, v3[localx] + c1[i].x1()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
161 | v3.setCoordinate (localy, v3[localy] + c1[i].y1()); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
162 | |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
163 | LDQuad* quad = model.emplace<LDQuad>(v0, v1, v2, v3); |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
164 | quad->setColor(MainColor); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
165 | |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
166 | // Ensure the quads always are BFC-front towards the camera |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
167 | if (renderer()->camera() % 3 <= 0) |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
168 | quad->invert(); |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
169 | } |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
170 | } |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
171 | |
1053 | 172 | if (circleOrDisc and primitiveFile) |
1082
1738bdaf36d6
The "all objects have valid models" invariant seems to be holding up now. At least basic drawing works again.
Teemu Piippo <teemu@hecknology.net>
parents:
1079
diff
changeset
|
173 | model.emplace<LDSubfileReference>(primitiveFile, transform, m_drawedVerts.first()); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
174 | |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
175 | if (not model.isEmpty()) |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
176 | { |
873
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
177 | Axis relZ = renderer()->getRelativeZ();; |
1024
67ba0ee049eb
Moved rotation point handling to ldObjectMath.cpp and encapsulated it into new class MathFunctions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1023
diff
changeset
|
178 | int l = (relZ == X ? 1 : 0); |
67ba0ee049eb
Moved rotation point handling to ldObjectMath.cpp and encapsulated it into new class MathFunctions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1023
diff
changeset
|
179 | int m = (relZ == Y ? 1 : 0); |
67ba0ee049eb
Moved rotation point handling to ldObjectMath.cpp and encapsulated it into new class MathFunctions
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1023
diff
changeset
|
180 | int n = (relZ == Z ? 1 : 0); |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
181 | math()->rotateObjects(l, m, n, -m_angleOffset, model.objects()); |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
182 | } |
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
183 | |
1077
952d6b3e7d11
Replaced uses of LDSpawn with the Model class in edit modes
Teemu Piippo <teemu@hecknology.net>
parents:
1073
diff
changeset
|
184 | finishDraw (model); |
825
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
185 | } |
f7649c9bfd9a
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
824
diff
changeset
|
186 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
187 | /* |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
188 | * Which way around will we place our circle primitive? This only makes a difference if we're not drawing a full circle. |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
189 | * Result is an angle offset in radians. |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
190 | */ |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
191 | double CircleMode::orientation() const |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
192 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
193 | if (not m_drawedVerts.isEmpty()) |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
194 | { |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
195 | int divisions = m_window->ringToolHiRes() ? HighResolution : LowResolution; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
196 | QPointF originSpot = renderer()->convert3dTo2d(m_drawedVerts.first()); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
197 | // Line from the origin of the circle to current mouse position |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
198 | QLineF hand1 = {originSpot, renderer()->mousePositionF()}; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
199 | // Line from the origin spot to |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
200 | QLineF hand2 = {{0, 0}, {1, 0}}; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
201 | // Calculate the angle between these hands and round it to whole divisions. |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
202 | double angleoffset = roundToInterval(-hand1.angleTo(hand2), 360.0 / divisions); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
203 | // Take the camera's depth coefficient into account here. This way, the preview is flipped if the |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
204 | // primitive also would be. |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
205 | return angleoffset * pi / 180.0 * renderer()->depthNegateFactor(); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
206 | } |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
207 | else |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
208 | { |
873
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
209 | return 0.0; |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
210 | } |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
211 | } |
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
212 | |
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
213 | |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
214 | void CircleMode::render (QPainter& painter) const |
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
215 | { |
827 | 216 | QFontMetrics metrics = QFontMetrics (QFont()); |
824
6add2126e7ff
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
823
diff
changeset
|
217 | |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
218 | // If we have not specified the center point of the circle yet, preview it on the screen. |
861
83426c5fa732
- major identifier renaming
Teemu Piippo <crimsondusk64@gmail.com>
parents:
848
diff
changeset
|
219 | if (m_drawedVerts.isEmpty()) |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
220 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
221 | QPoint position2d = renderer()->convert3dTo2d(renderer()->position3D()); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
222 | renderer()->drawPoint(painter, position2d); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
223 | renderer()->drawBlipCoordinates(painter, renderer()->position3D(), position2d); |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
224 | return; |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
225 | } |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
226 | |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
227 | QVector<Vertex> innerverts, outerverts; |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
228 | QVector<QPointF> innerverts2d, outerverts2d; |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
229 | double innerdistance = getCircleDrawDist(0); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
230 | double outerdistance = countof(m_drawedVerts) >= 2 ? getCircleDrawDist (1) : -1; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
231 | int divisions = m_window->ringToolHiRes() ? HighResolution : LowResolution; |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
232 | int segments = m_window->ringToolSegments(); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
233 | double angleUnit = 2 * pi / divisions; |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
234 | Axis relX, relY; |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
235 | renderer()->getRelativeAxes(relX, relY); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
236 | double angleoffset = (countof(m_drawedVerts) < 3 ? orientation() : m_angleOffset); |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
237 | |
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
238 | // Calculate the preview positions of vertices |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
239 | for (int i = 0; i < segments + 1; ++i) |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
240 | { |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
241 | const double sinangle (sin (angleoffset + i * angleUnit)); |
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
242 | const double cosangle (cos (angleoffset + i * angleUnit)); |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
243 | Vertex v (Origin); |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
244 | v.setCoordinate (relX, m_drawedVerts[0][relX] + (cosangle * innerdistance)); |
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
245 | v.setCoordinate (relY, m_drawedVerts[0][relY] + (sinangle * innerdistance)); |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
246 | innerverts << v; |
986
525921eae58c
Refactor GLRenderer and GLCompiler
Teemu Piippo <crimsondusk64@gmail.com>
parents:
985
diff
changeset
|
247 | innerverts2d << renderer()->convert3dTo2d (v); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
248 | |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
249 | if (outerdistance != -1) |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
250 | { |
869
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
251 | v.setCoordinate (relX, m_drawedVerts[0][relX] + (cosangle * outerdistance)); |
7184f3bae695
- circle tool is now able to rotate the partial circular primitives spawned
Teemu Piippo <crimsondusk64@gmail.com>
parents:
866
diff
changeset
|
252 | v.setCoordinate (relY, m_drawedVerts[0][relY] + (sinangle * outerdistance)); |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
253 | outerverts << v; |
986
525921eae58c
Refactor GLRenderer and GLCompiler
Teemu Piippo <crimsondusk64@gmail.com>
parents:
985
diff
changeset
|
254 | outerverts2d << renderer()->convert3dTo2d (v); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
255 | } |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
256 | } |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
257 | |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
258 | QVector<QLineF> lines {segments}; |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
259 | |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
260 | if (outerdistance != -1 and outerdistance != innerdistance) |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
261 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
262 | painter.setBrush(m_polybrush); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
263 | painter.setPen(Qt::NoPen); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
264 | |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
265 | // Compile polygons |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
266 | for (int i = 0; i < segments; ++i) |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
267 | { |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
268 | QVector<QPointF> points; |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
269 | points << innerverts2d[i] |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
270 | << innerverts2d[i + 1] |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
271 | << outerverts2d[i + 1] |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
272 | << outerverts2d[i]; |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
273 | painter.drawPolygon (QPolygonF (points)); |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
274 | lines.append({innerverts2d[i], innerverts2d[i + 1]}); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
275 | lines.append({outerverts2d[i], outerverts2d[i + 1]}); |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
276 | } |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
277 | |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
278 | // Add bordering edges for unclosed rings/discs |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
279 | if (segments != divisions) |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
280 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
281 | lines.append({innerverts2d.first(), outerverts2d.first()}); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
282 | lines.append({innerverts2d.last(), outerverts2d.last()}); |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
283 | } |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
284 | } |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
285 | else |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
286 | { |
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
287 | for (int i = 0; i < segments; ++i) |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
288 | lines.append({innerverts2d[i], innerverts2d[i + 1]}); |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
289 | } |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
290 | |
1008
74cb432812d3
Fixed circle, rectangle and line path modes not working anymore. Add blip coordinates to curve and line path modes. Circle mode for now only can show the coordinates of the initial blip
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1006
diff
changeset
|
291 | // Draw green blips at where the points are |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
292 | for (const QPointF& point : innerverts2d + outerverts2d) |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
293 | renderer()->drawPoint(painter, point); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
294 | |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
295 | // Draw edge lines |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
296 | painter.setPen(renderer()->linePen()); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
297 | painter.drawLines(lines); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
298 | |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
299 | // Draw the current radius in the middle of the circle. |
986
525921eae58c
Refactor GLRenderer and GLCompiler
Teemu Piippo <crimsondusk64@gmail.com>
parents:
985
diff
changeset
|
300 | QPoint origin = renderer()->convert3dTo2d (m_drawedVerts[0]); |
866
4951b737f8cb
- now able to spawn partial circular primitives
Teemu Piippo <crimsondusk64@gmail.com>
parents:
865
diff
changeset
|
301 | QString label = QString::number (innerdistance); |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
302 | painter.setPen(renderer()->textPen()); |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
303 | painter.drawText(origin.x() - (metrics.width(label) / 2), origin.y(), label); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
304 | |
1065
c8ecddbd99e9
Actually, let's call it countof(). Makes more sense.
Teemu Piippo <teemu@hecknology.net>
parents:
1063
diff
changeset
|
305 | if (countof(m_drawedVerts) >= 2) |
865
6d68840fcb26
- circle mode can now do hi-res
Teemu Piippo <crimsondusk64@gmail.com>
parents:
861
diff
changeset
|
306 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
307 | painter.drawText(origin.x() - (metrics.width(label) / 2), |
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
308 | origin.y() + metrics.height(), QString::number(outerdistance)); |
823
1a2f593f0c02
- saving work done on edit mode revamp
Santeri Piippo <crimsondusk64@gmail.com>
parents:
diff
changeset
|
309 | } |
824
6add2126e7ff
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
823
diff
changeset
|
310 | } |
6add2126e7ff
- more work on edit modes
Santeri Piippo <crimsondusk64@gmail.com>
parents:
823
diff
changeset
|
311 | |
873
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
312 | |
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
313 | bool CircleMode::preAddVertex (const Vertex&) |
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
314 | { |
1088
c6d242d2b619
Reworked and cleaned up the circle mode
Teemu Piippo <teemu@compsta2.com>
parents:
1082
diff
changeset
|
315 | m_angleOffset = orientation(); |
873
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
316 | return false; |
201083693300
- circle mode now locks the angle offset on final confirmation stage
Teemu Piippo <crimsondusk64@gmail.com>
parents:
870
diff
changeset
|
317 | } |
1030
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
318 | |
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
319 | |
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
320 | int CircleMode::maxVertices() const |
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
321 | { |
d931a7547578
Fixed circle mode not building the circle anymore
Teemu Piippo <crimsondusk64@gmail.com>
parents:
1026
diff
changeset
|
322 | return 3; |
1045
f726f8f49c7e
Unabbreviate "transform" to "transformationMatrix"
Teemu Piippo <teemu@hecknology.net>
parents:
1030
diff
changeset
|
323 | } |