src/editmodes/drawMode.cc

changeset 909
f025ab5e57ac
parent 897
ef9e4469975a
child 927
409b82a4765e
child 944
1a6f1997fcbe
equal deleted inserted replaced
904:f8e1852b91bc 909:f025ab5e57ac
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)
72 { 73 {
73 endDraw(); 74 endDraw();
74 return true; 75 return true;
75 } 76 }
76 77
77 addDrawnVertex (renderer()->position3D()); 78 addDrawnVertex (getCursorVertex());
78 return true; 79 return true;
79 } 80 }
80 81
81 return false; 82 return false;
82 } 83 }
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 }

mercurial