1111#include < QKeyEvent>
1212#include < QDebug>
1313#include < QWidget>
14+ #include < QSurfaceFormat>
1415
1516#include " canonMotion.hpp"
1617
@@ -74,6 +75,13 @@ void View::keyPressEvent(QKeyEvent *e) {
7475View::View (QWidget *parent) : QGLViewer(parent) {
7576 setAttribute (Qt::WA_DeleteOnClose);
7677
78+ QSurfaceFormat format = QSurfaceFormat::defaultFormat ();
79+ format.setDepthBufferSize (24 );
80+ format.setStencilBufferSize (0 );
81+ format.setAlphaBufferSize (0 );
82+ format.setSwapBehavior (QSurfaceFormat::DoubleBuffer);
83+ setFormat (format);
84+
7785 lines.reserve (20000 );
7886}
7987
@@ -126,7 +134,7 @@ void View::init() {
126134 // glDisable(GL_CULL_FACE);
127135 // glLineStipple(2, 0xFFFF);
128136 glDisable (GL_LIGHTING);
129- glClearColor (0.0 , 0.0 , 0.25 , 0 );
137+ glClearColor (0 .0f , 0 . 0f , 0 . 0f , 1 . 0f );
130138 // glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
131139 // glLineWidth(3);
132140
@@ -148,9 +156,8 @@ void View::initializeGL() {
148156}
149157
150158void View::appendCanonLine (canonLine *l) {
151- // QMutexLocker locker(&mutex);
152159 lines.push_back (l);
153- dirty = true ; // for updateGLViewer()
160+ dirty = true ;
154161
155162 if (l->isMotion ()) {
156163 Point pos1 = l->point (0 );
@@ -170,146 +177,122 @@ void View::appendCanonLine(canonLine *l) {
170177 aabb[ i] = qMin (aabb[ i], oaabbmin[i]);
171178 aabb[3 +i] = qMax (aabb[3 +i], oaabbmax[i]);
172179 }
173-
174- // qDebug() << "getAABB()" << aabb[0] << aabb[1] << aabb[2] << aabb[3] << aabb[4] << aabb[5];
175180 }
176181}
177182
178- void View::drawObjects (bool simplified = false ) {
179- Q_UNUSED (simplified);
180-
181- if (lines.size () == 0 )
183+ void View::drawObjects (bool simplified) {
184+ if (lines.empty ())
182185 return ;
183-
184- // int nbSteps = 600;
185- // int nbSub = 50;
186-
187- // QMutexLocker locker(&mutex);
188-
189- /*
190- if (simplified) {
191- nbSteps = 60;
192- nbSub = 2;
193- }*/
194186
195- // qDebug() << "lines.size: " << lines.size();
196-
197- double step_size = 0.1 ;
198-
199- if (simplified)
200- step_size = 0.75 ;
201-
187+ double step_size = simplified ? 0.75 : 0.1 ;
202188 double inv_ds = 1.0 / step_size;
203189
204190 int skip_dyn = 1 ;
205191 double line_width = 3.0 ;
206192
207- if (lines.size () > 10000 ) { // skip some segments in big gcode files
208- skip_dyn = 2 ;
209- line_width = 2.0 ; // thinner lines
210- }
211-
212193 if (lines.size () > 100000 ) {
213194 skip_dyn = 4 ;
214195 line_width = 1.0 ;
196+ } else if (lines.size () > 10000 ) {
197+ skip_dyn = 2 ;
198+ line_width = 2.0 ;
215199 }
216200
217- int skip = ( simplified) ? skip_dyn * 2 : skip_dyn;
201+ int skip = simplified ? skip_dyn * 2 : skip_dyn;
218202
219- // glEnable(GL_MULTISAMPLE) ;
220- // glEnable(GL_LINE_SMOOTH) ;
221- // glHint(GL_LINE_SMOOTH_HINT, GL_NICEST );
222- // glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST );
203+ std::vector< float > traverseVertices ;
204+ std::vector< float > feedVertices ;
205+ traverseVertices. reserve (lines. size () * 6 );
206+ feedVertices. reserve (lines. size () * 6 );
223207
224- /*
225- glEnable(GL_BLEND);
226- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
227- glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
228- */
229-
230- for (unsigned long i = 0 ; i < lines.size (); i+=skip) {
208+ for (size_t i = 0 ; i < lines.size (); i += skip) {
231209 g2m::canonLine *l = lines[i];
232- if (l->isMotion ()) {
233- double move_length = l->length ();
234- int n_samples = std::max ((int )(move_length * inv_ds ), 2 );
235- double interval_size = move_length /(double )(n_samples-1 );
236-
210+ if (!l->isMotion ())
211+ continue ;
212+
213+ double move_length = l->length ();
214+ int n_samples = std::max (static_cast <int >(move_length * inv_ds), 2 );
215+ double interval_size = move_length / (n_samples - 1 );
216+
217+ for (int j = 0 ; j < n_samples - 1 ; ++j) {
218+ double t1 = j * interval_size;
219+ double t2 = (j + 1 ) * interval_size;
220+ Point pos1 = l->point (t1);
221+ Point pos2 = l->point (t2);
222+
223+ float vertices[] = {
224+ static_cast <float >(pos1.x ), static_cast <float >(pos1.y ), static_cast <float >(pos1.z ),
225+ static_cast <float >(pos2.x ), static_cast <float >(pos2.y ), static_cast <float >(pos2.z )
226+ };
227+
237228 if (l->getMotionType () == TRAVERSE) {
238- glColor3f (0.0 , 128.0 /255.0 , 0.0 /255.0 );
239- glLineWidth (2 );
229+ traverseVertices.insert (traverseVertices.end (), vertices, vertices + 6 );
240230 } else {
241- glColor3f (255.0 /255.0 , 215.0 /255.0 , 94.0 /255.0 );
242- glLineWidth (line_width);
243- }
244-
245- glBegin (GL_LINES);
246- for (double m = 0 ; m <= n_samples-1 ; m+=0.5 ) {
247- Point pos1 = l->point ( (double )(m) * interval_size);
248- glVertex3f (pos1.x , pos1.y , pos1.z );
249- Point pos2 = l->point ( std::min (1.0 , (double )(m+0.5 ) * interval_size));
250- glVertex3f (pos2.x , pos2.y , pos2.z );
231+ feedVertices.insert (feedVertices.end (), vertices, vertices + 6 );
251232 }
252- glEnd ();
253233 }
254-
255- // glDisable(GL_BLEND);
256234 }
257-
235+
236+ glEnableClientState (GL_VERTEX_ARRAY);
237+ glVertexPointer (3 , GL_FLOAT, 0 , traverseVertices.data ());
238+
239+ glColor3f (0.0 , 128 .0f /255 .0f , 0 .0f );
258240 glLineWidth (2 );
259- glColor3f (255.0 , 0.0 /255.0 , 0.0 /255.0 );
260- glBegin (GL_LINES);
261-
262- // Top
263- glVertex3f (aabb[0 ], aabb[1 ], aabb[2 ]);
264- glVertex3f (aabb[3 ], aabb[1 ], aabb[2 ]);
265- glVertex3f (aabb[3 ], aabb[1 ], aabb[2 ]);
266- glVertex3f (aabb[3 ], aabb[1 ], aabb[5 ]);
267- glVertex3f (aabb[3 ], aabb[1 ], aabb[5 ]);
268- glVertex3f (aabb[0 ], aabb[1 ], aabb[5 ]);
269- glVertex3f (aabb[0 ], aabb[1 ], aabb[5 ]);
270- glVertex3f (aabb[0 ], aabb[1 ], aabb[2 ]);
271-
272- // Bottom
273- glVertex3f (aabb[0 ], aabb[4 ], aabb[2 ]);
274- glVertex3f (aabb[3 ], aabb[4 ], aabb[2 ]);
275- glVertex3f (aabb[3 ], aabb[4 ], aabb[2 ]);
276- glVertex3f (aabb[3 ], aabb[4 ], aabb[5 ]);
277- glVertex3f (aabb[3 ], aabb[4 ], aabb[5 ]);
278- glVertex3f (aabb[0 ], aabb[4 ], aabb[5 ]);
279- glVertex3f (aabb[0 ], aabb[4 ], aabb[5 ]);
280- glVertex3f (aabb[0 ], aabb[4 ], aabb[2 ]);
281-
282- // Sides
283- glVertex3f (aabb[0 ], aabb[1 ], aabb[2 ]);
284- glVertex3f (aabb[0 ], aabb[4 ], aabb[2 ]);
285- glVertex3f (aabb[3 ], aabb[1 ], aabb[2 ]);
286- glVertex3f (aabb[3 ], aabb[4 ], aabb[2 ]);
287- glVertex3f (aabb[3 ], aabb[1 ], aabb[5 ]);
288- glVertex3f (aabb[3 ], aabb[4 ], aabb[5 ]);
289- glVertex3f (aabb[0 ], aabb[1 ], aabb[5 ]);
290- glVertex3f (aabb[0 ], aabb[4 ], aabb[5 ]);
291-
292- glEnd ();
241+ glDrawArrays (GL_LINES, 0 , traverseVertices.size () / 3 );
293242
294- Vec qmin, qmax ;
295- qmin. x = aabb[ 0 ] ;
296- qmin. y = aabb[ 1 ] ;
297- qmin. z = aabb[ 2 ] ;
243+ glVertexPointer ( 3 , GL_FLOAT, 0 , feedVertices. data ()) ;
244+ glColor3f ( 255 . 0f / 255 . 0f , 215 . 0f / 255 . 0f , 94 . 0f / 255 . 0f ) ;
245+ glLineWidth ( static_cast < float >(line_width)) ;
246+ glDrawArrays (GL_LINES, 0 , feedVertices. size () / 3 ) ;
298247
299- qmax.x = aabb[3 ];
300- qmax.y = aabb[4 ];
301- qmax.z = aabb[5 ];
302- setSceneBoundingBox (qmin, qmax);
248+ glDisableClientState (GL_VERTEX_ARRAY);
303249
304- Vec c ((aabb[0 ] + aabb[3 ])/2 , (aabb[1 ] + aabb[4 ])/2 , (aabb[2 ] + aabb[5 ])/2 );
305- setSceneCenter (c);
250+ glLineWidth (2 );
251+ glColor3f (1 .0f , 0 .0f , 0 .0f );
252+
253+ float aabbVerts[] = {
254+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
255+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
256+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
257+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
258+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
259+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
260+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
261+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
262+
263+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
264+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
265+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
266+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ]),
267+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ]),
268+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ]),
269+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ]),
270+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
271+
272+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
273+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
274+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[2 ]),
275+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[2 ]),
276+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
277+ static_cast <float >(aabb[3 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ]),
278+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[1 ]), static_cast <float >(aabb[5 ]),
279+ static_cast <float >(aabb[0 ]), static_cast <float >(aabb[4 ]), static_cast <float >(aabb[5 ])
280+ };
281+
282+ glVertexPointer (3 , GL_FLOAT, 0 , aabbVerts);
283+ glDrawArrays (GL_LINES, 0 , 24 );
284+ glDisableClientState (GL_VERTEX_ARRAY);
306285}
307286
308287void View::draw () {
309- drawObjects ();
288+ glClearColor (0 .0f , 0 .0f , 0 .0f , 1 .0f );
289+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
290+ drawObjects (false );
310291}
311292
312293void View::fastDraw () {
294+ glClearColor (0 .0f , 0 .0f , 0 .0f , 1 .0f );
295+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
313296 drawObjects (true );
314297}
315298
0 commit comments