19 #include <QPainter> |
19 #include <QPainter> |
20 #include <QMouseEvent> |
20 #include <QMouseEvent> |
21 #include "drawMode.h" |
21 #include "drawMode.h" |
22 #include "../ldObject.h" |
22 #include "../ldObject.h" |
23 #include "../glRenderer.h" |
23 #include "../glRenderer.h" |
|
24 #include "../miscallenous.h" |
24 |
25 |
25 DrawMode::DrawMode (GLRenderer* renderer) : |
26 DrawMode::DrawMode (GLRenderer* renderer) : |
26 Super (renderer) {} |
27 Super (renderer) {} |
27 |
28 |
28 EditModeType DrawMode::type() const |
29 EditModeType DrawMode::type() const |
38 for (Vertex const& vert : m_drawedVerts) |
39 for (Vertex const& vert : m_drawedVerts) |
39 poly << vert; |
40 poly << vert; |
40 |
41 |
41 // Draw the cursor vertex as the last one in the list. |
42 // Draw the cursor vertex as the last one in the list. |
42 if (poly.size() < 4) |
43 if (poly.size() < 4) |
43 poly << renderer()->position3D(); |
44 poly << getCursorVertex(); |
44 |
45 |
45 renderPolygon (painter, poly, true, true); |
46 renderPolygon (painter, poly, true, true); |
46 } |
47 } |
47 |
48 |
48 bool DrawMode::preAddVertex (Vertex const& pos) |
49 bool DrawMode::preAddVertex (Vertex const& pos) |
125 } |
126 } |
126 } |
127 } |
127 |
128 |
128 finishDraw (objs); |
129 finishDraw (objs); |
129 } |
130 } |
|
131 |
|
132 template<typename _Type> |
|
133 _Type IntervalClamp (_Type a, _Type interval) |
|
134 { |
|
135 _Type remainder = a % interval; |
|
136 |
|
137 if (remainder >= float (interval / 2)) |
|
138 a += interval; |
|
139 |
|
140 a -= remainder; |
|
141 return a; |
|
142 } |
|
143 |
|
144 Vertex DrawMode::getCursorVertex() const |
|
145 { |
|
146 Vertex result = renderer()->position3D(); |
|
147 |
|
148 if (renderer()->keyboardModifiers() & Qt::ControlModifier |
|
149 and not m_drawedVerts.isEmpty()) |
|
150 { |
|
151 Vertex const& v0 = m_drawedVerts.last(); |
|
152 Vertex const& v1 = result; |
|
153 Axis relX, relY; |
|
154 |
|
155 renderer()->getRelativeAxes (relX, relY); |
|
156 QLineF ln (v0[relX], v0[relY], v1[relX], v1[relY]); |
|
157 ln.setAngle (IntervalClamp<int> (ln.angle(), 45)); |
|
158 result.setCoordinate (relX, Grid::Snap (ln.x2(), Grid::Coordinate)); |
|
159 result.setCoordinate (relY, Grid::Snap (ln.y2(), Grid::Coordinate)); |
|
160 } |
|
161 |
|
162 return result; |
|
163 } |