Commit 86a4e3734c36d9411c5d2fad2488e7e1a81d2d4a
Merge branch 'JACK' into 'master'
need some data to test on See merge request !9
Showing
5 changed files
with
130 additions
and
102 deletions
Show diff stats
CMakeLists.txt
@@ -85,3 +85,5 @@ configure_file(data/04_Tb.obj ${CMAKE_CURRENT_BINARY_DIR}/04_Tb.obj @ONLY) | @@ -85,3 +85,5 @@ configure_file(data/04_Tb.obj ${CMAKE_CURRENT_BINARY_DIR}/04_Tb.obj @ONLY) | ||
85 | configure_file(data/1.swc ${CMAKE_CURRENT_BINARY_DIR}/1.swc @ONLY) | 85 | configure_file(data/1.swc ${CMAKE_CURRENT_BINARY_DIR}/1.swc @ONLY) |
86 | configure_file(data/2.swc ${CMAKE_CURRENT_BINARY_DIR}/2.swc @ONLY) | 86 | configure_file(data/2.swc ${CMAKE_CURRENT_BINARY_DIR}/2.swc @ONLY) |
87 | configure_file(data/00_GT.swc ${CMAKE_CURRENT_BINARY_DIR}/00_GT.swc @ONLY) | 87 | configure_file(data/00_GT.swc ${CMAKE_CURRENT_BINARY_DIR}/00_GT.swc @ONLY) |
88 | +configure_file(data/01_GT.swc ${CMAKE_CURRENT_BINARY_DIR}/01_GT.swc @ONLY) | ||
89 | +configure_file(data/01_T.swc ${CMAKE_CURRENT_BINARY_DIR}/01_T.swc @ONLY) |
data/00_GT.swc
1 | +# converted from 00_GT.obj | ||
2 | +1 1 99 677 0 0.5 -1 | ||
3 | +2 1 88 563 0 0.5 1 | ||
4 | +3 1 229 510 0 0.5 2 | ||
5 | +4 1 181 372 0 0.5 3 | ||
6 | +5 1 57 347 0 0.5 4 | ||
7 | +6 1 316 596 0 0.5 3 | ||
8 | +7 1 344 724 0 0.5 6 | ||
9 | +8 1 385 425 0 0.5 3 | ||
10 | +9 1 581 361 0 0.5 8 | ||
11 | +10 1 574 223 0 0.5 9 | ||
12 | +11 1 481 165 0 0.5 10 | ||
13 | +12 1 341 199 0 0.5 11 | ||
14 | +13 1 757 377 0 0.5 9 | ||
15 | +14 1 818 229 0 0.5 13 | ||
16 | +15 1 981 152 0 0.5 14 | ||
17 | +16 1 793 508 0 0.5 13 | ||
18 | +17 1 941 600 0 0.5 16 | ||
19 | +18 1 679 601 0 0.5 16 | ||
20 | +19 1 647 738 0 0.5 18 |
1 | +1 1 0.0 0.0 0.0 0.5 -1 | ||
2 | +2 3 10 -12 11 0.5 1 | ||
3 | +3 3 30 -40 10 0.5 2 | ||
4 | +4 3 4 9 0 0.5 1 | ||
5 | +5 3 46 55 -15 0.5 4 | ||
6 | +6 2 -20 11 30 0.5 1 | ||
7 | +7 4 -6 60 -4 0.5 6 | ||
8 | +8 4 -44 99 -8 0.5 7 | ||
9 | +9 4 -55 -10 8 0.5 7 | ||
10 | +10 4 -66 -10 8 0.5 9 | ||
11 | +11 3 40 -80 20 0.5 3 | ||
12 | +12 3 50 -90 30 0.5 11 | ||
13 | +13 1 20 20 20 0.5 1 |
main.cu
@@ -37,7 +37,6 @@ stim::gl_network<float> _T; //splitted T | @@ -37,7 +37,6 @@ stim::gl_network<float> _T; //splitted T | ||
37 | 37 | ||
38 | // indicator | 38 | // indicator |
39 | unsigned ind = 0; //indicator of mapping | 39 | unsigned ind = 0; //indicator of mapping |
40 | -unsigned swc_ind = 0; //indicator of rendering swc file as networks | ||
41 | 40 | ||
42 | // relationships | 41 | // relationships |
43 | std::vector<unsigned> _gt_t; // store indices of nearest edge points in _T for _GT | 42 | std::vector<unsigned> _gt_t; // store indices of nearest edge points in _T for _GT |
@@ -47,7 +46,8 @@ std::vector<unsigned> _t_gt; // store indices of nearest edge points in _ | @@ -47,7 +46,8 @@ std::vector<unsigned> _t_gt; // store indices of nearest edge points in _ | ||
47 | float resample_rate = 0.5f; //sample rate for the network (fraction of sigma used as the maximum sample rate) | 46 | float resample_rate = 0.5f; //sample rate for the network (fraction of sigma used as the maximum sample rate) |
48 | float camera_factor = 1.2f; //start point of the camera as a function of X and Y size | 47 | float camera_factor = 1.2f; //start point of the camera as a function of X and Y size |
49 | float orbit_factor = 0.01f; //degrees per pixel used to orbit the camera | 48 | float orbit_factor = 0.01f; //degrees per pixel used to orbit the camera |
50 | -float zoom_factor = 10.0; | 49 | +float zoom_factor = 10.0f; |
50 | +float radius_factor = 0.5f; | ||
51 | 51 | ||
52 | //mouse click | 52 | //mouse click |
53 | bool LButtonDown = false; // true when left button down | 53 | bool LButtonDown = false; // true when left button down |
@@ -74,7 +74,9 @@ GLuint dlist2; | @@ -74,7 +74,9 @@ GLuint dlist2; | ||
74 | //OpenGL objects | 74 | //OpenGL objects |
75 | GLuint cmap_tex = 0; //texture name for the color map | 75 | GLuint cmap_tex = 0; //texture name for the color map |
76 | 76 | ||
77 | +float delta; | ||
77 | float sigma = 3; //default sigma | 78 | float sigma = 3; //default sigma |
79 | +float radius = 3; //equals to radius | ||
78 | 80 | ||
79 | //sets an OpenGL viewport taking up the entire window | 81 | //sets an OpenGL viewport taking up the entire window |
80 | void glut_render_single_projection(){ | 82 | void glut_render_single_projection(){ |
@@ -146,11 +148,12 @@ void glut_render(void) { | @@ -146,11 +148,12 @@ void glut_render(void) { | ||
146 | glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | 148 | glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color |
147 | glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | 149 | glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map |
148 | 150 | ||
149 | - GT.glCylinder(sigma); //render the GT network | 151 | + GT.glCylinder(sigma, radius); //render the GT network |
150 | 152 | ||
151 | glut_render_right_projection(); //set up a projection for the right half of the window | 153 | glut_render_right_projection(); //set up a projection for the right half of the window |
152 | glut_render_modelview(); //set up the modelview matrix using camera details | 154 | glut_render_modelview(); //set up the modelview matrix using camera details |
153 | - T.glCylinder(sigma); //render the T network | 155 | + T.glCylinder(sigma, radius); //render the T network |
156 | + sigma = radius; // set sigma equal to radius | ||
154 | } | 157 | } |
155 | } | 158 | } |
156 | 159 | ||
@@ -171,12 +174,12 @@ void glut_render(void) { | @@ -171,12 +174,12 @@ void glut_render(void) { | ||
171 | glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | 174 | glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color |
172 | glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | 175 | glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map |
173 | 176 | ||
174 | - _GT.glCylinder(sigma); //render the GT network | 177 | + _GT.glCylinder(sigma, radius); //render the GT network |
175 | 178 | ||
176 | glut_render_right_projection(); //set up a projection for the right half of the window | 179 | glut_render_right_projection(); //set up a projection for the right half of the window |
177 | glut_render_modelview(); //set up the modelview matrix using camera details | 180 | glut_render_modelview(); //set up the modelview matrix using camera details |
178 | - _T.glCylinder(sigma); //render the T network | ||
179 | - | 181 | + _T.glCylinder(sigma, radius); //render the T network |
182 | + sigma = radius; //set sigma equal to radius | ||
180 | } | 183 | } |
181 | else { | 184 | else { |
182 | glEnable(GL_DEPTH_TEST); //enable depth | 185 | glEnable(GL_DEPTH_TEST); //enable depth |
@@ -185,12 +188,13 @@ void glut_render(void) { | @@ -185,12 +188,13 @@ void glut_render(void) { | ||
185 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen | 188 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen |
186 | 189 | ||
187 | //_GT.glRandColorCenterlineGT(dlist1, _gt_t, colormap); | 190 | //_GT.glRandColorCenterlineGT(dlist1, _gt_t, colormap); |
188 | - _GT.glRandColorCylinder1(dlist1, _gt_t, colormap, sigma); | 191 | + _GT.glRandColorCylinder1(dlist1, _gt_t, colormap, sigma, radius); |
189 | 192 | ||
190 | glut_render_right_projection(); //set up a projection for the right half of the window | 193 | glut_render_right_projection(); //set up a projection for the right half of the window |
191 | glut_render_modelview(); //set up the modelview matrix using camera details | 194 | glut_render_modelview(); //set up the modelview matrix using camera details |
192 | //_T.glRandColorCenterlineT(dlist2, _t_gt, colormap); | 195 | //_T.glRandColorCenterlineT(dlist2, _t_gt, colormap); |
193 | - _T.glRandColorCylinder2(dlist2, _t_gt, colormap, sigma); | 196 | + _T.glRandColorCylinder2(dlist2, _t_gt, colormap, sigma, radius); |
197 | + sigma = radius; //set sigma equal to radius | ||
194 | } | 198 | } |
195 | } | 199 | } |
196 | } | 200 | } |
@@ -310,20 +314,10 @@ void glut_mouse(int button, int state, int x, int y){ | @@ -310,20 +314,10 @@ void glut_mouse(int button, int state, int x, int y){ | ||
310 | 314 | ||
311 | // define camera move based on mouse wheel move(actually we can combine this with glut_mouse) | 315 | // define camera move based on mouse wheel move(actually we can combine this with glut_mouse) |
312 | void glut_wheel(int wheel, int direction, int x, int y) { | 316 | void glut_wheel(int wheel, int direction, int x, int y) { |
313 | - /*float cam_move_fac; // camera move unit length | ||
314 | - stim::vec3<float> eye = cam.getPosition(); // get the camera position (eye point) | ||
315 | - stim::vec3<float> focus = cam.getLookAt(); // get the camera focal point | ||
316 | - cam_move_fac = fabs(focus[2] - eye[2]) / 50; // divided by 50 | ||
317 | - | ||
318 | - if (direction > 0) // if it is button 3(up) | ||
319 | - des -= cam_move_fac; | ||
320 | - else // if it is button 4(down) | ||
321 | - des += cam_move_fac;*/ | ||
322 | - float delta; | ||
323 | 317 | ||
324 | - if (direction > 0) // if it is button 3(up) | 318 | + if (direction > 0) // if it is button 3(up), move closer |
325 | delta = zoom_factor; | 319 | delta = zoom_factor; |
326 | - else // if it is button 4(down) | 320 | + else // if it is button 4(down), leave farther |
327 | delta = -zoom_factor; | 321 | delta = -zoom_factor; |
328 | 322 | ||
329 | cam.Push(delta); | 323 | cam.Push(delta); |
@@ -332,19 +326,46 @@ void glut_wheel(int wheel, int direction, int x, int y) { | @@ -332,19 +326,46 @@ void glut_wheel(int wheel, int direction, int x, int y) { | ||
332 | 326 | ||
333 | // define keyboard inputs | 327 | // define keyboard inputs |
334 | void glut_keyboard(unsigned char key, int x, int y){ | 328 | void glut_keyboard(unsigned char key, int x, int y){ |
335 | - if(key == 'm') // if keyboard 'm' is pressed | ||
336 | - { | ||
337 | - if(compareMode && !mappingMode){ // if it is in compare mode | ||
338 | - compareMode = false; | ||
339 | - mappingMode = true; | ||
340 | - } | ||
341 | - else{ // if it is in mapping mode | ||
342 | - compareMode = true; | ||
343 | - mappingMode = false; | ||
344 | - } | ||
345 | - } | ||
346 | - if (key == 27) { // if keyboard "ESC" is pressed | ||
347 | - exit(0); // exit | 329 | + |
330 | + // register different keyboard operation | ||
331 | + switch (key) { | ||
332 | + | ||
333 | + // change render mode | ||
334 | + case 'm': // if keyboard 'm' is pressed, then change render mode | ||
335 | + if (compareMode && !mappingMode && ind) { // if current mode is comparing mode | ||
336 | + compareMode = false; | ||
337 | + mappingMode = true; | ||
338 | + } | ||
339 | + else if (!compareMode && mappingMode && ind) { // if current mode is mapping mode | ||
340 | + compareMode = true; | ||
341 | + mappingMode = false; | ||
342 | + } | ||
343 | + break; | ||
344 | + | ||
345 | + // zooming | ||
346 | + case 'w': // if keyboard 'w' is pressed, then move closer | ||
347 | + delta = zoom_factor; | ||
348 | + cam.Push(delta); | ||
349 | + break; | ||
350 | + case 's': // if keyboard 's' is pressed, then leave farther | ||
351 | + delta = -zoom_factor; | ||
352 | + cam.Push(delta); | ||
353 | + break; | ||
354 | + | ||
355 | + // resample and re-render the cylinder in different radius | ||
356 | + case 'd': // if keyboard 'd' is pressed, then increase radius by radius_factor | ||
357 | + radius += radius_factor; | ||
358 | + break; | ||
359 | + case 'a': // if keyboard 'a' is pressed, then decrease radius by radius_factor | ||
360 | + radius -= radius_factor; | ||
361 | + // get rid of the degenerated case when radius decrease below 0 | ||
362 | + if (radius < 0.001f) | ||
363 | + radius = 0.2; | ||
364 | + break; | ||
365 | + | ||
366 | + // close window and exit application | ||
367 | + case 27: // if keyboard 'ESC' is pressed, then exit | ||
368 | + exit(0); | ||
348 | } | 369 | } |
349 | glutPostRedisplay(); | 370 | glutPostRedisplay(); |
350 | } | 371 | } |
@@ -396,13 +417,13 @@ void glut_initialize(){ | @@ -396,13 +417,13 @@ void glut_initialize(){ | ||
396 | glutMouseFunc(glut_mouse); //executed on a mouse click - sets starting mouse positions for rotations | 417 | glutMouseFunc(glut_mouse); //executed on a mouse click - sets starting mouse positions for rotations |
397 | glutMotionFunc(glut_motion); //executed when the mouse is moved while a button is pressed | 418 | glutMotionFunc(glut_motion); //executed when the mouse is moved while a button is pressed |
398 | if (ind == 1) { //only in mapping mode, keyboard will be used | 419 | if (ind == 1) { //only in mapping mode, keyboard will be used |
399 | - glutKeyboardFunc(glut_keyboard); //register keyboard callback | ||
400 | glutCreateMenu(glut_menu); //register menu option callback | 420 | glutCreateMenu(glut_menu); //register menu option callback |
401 | - glutAddMenuEntry("Comparing Mode", 1);//register menu 1 as comparing mode | ||
402 | - glutAddMenuEntry("Mapping Mode", 2); //register menu 2 as mapping mode | ||
403 | - glutAddMenuEntry("Exit", 3); //register menu 3 as exiting | ||
404 | - glutAttachMenu(GLUT_RIGHT_BUTTON); //register right mouse to open menu option | ||
405 | - } | 421 | + glutAddMenuEntry("Comparing Mode", 1); //register menu 1 as comparing mode |
422 | + glutAddMenuEntry("Mapping Mode", 2); //register menu 2 as mapping mode | ||
423 | + glutAddMenuEntry("Exit", 3); //register menu 3 as exiting | ||
424 | + glutAttachMenu(GLUT_RIGHT_BUTTON); //register right mouse to open menu option | ||
425 | + } | ||
426 | + glutKeyboardFunc(glut_keyboard); //register keyboard callback | ||
406 | glutMouseWheelFunc(glut_wheel); | 427 | glutMouseWheelFunc(glut_wheel); |
407 | 428 | ||
408 | texture_initialize(); //set up texture mapping (create texture maps, enable features) | 429 | texture_initialize(); //set up texture mapping (create texture maps, enable features) |
@@ -469,30 +490,6 @@ void map(float sigma, int device, float threshold){ | @@ -469,30 +490,6 @@ void map(float sigma, int device, float threshold){ | ||
469 | std::cout << "FPR: " << FNR << std::endl; | 490 | std::cout << "FPR: " << FNR << std::endl; |
470 | } | 491 | } |
471 | 492 | ||
472 | -void map_swc(float sigma, int device, float threshold) { | ||
473 | - | ||
474 | - // compare two networks | ||
475 | - _GT = GT.compare(T, sigma, device); //compare the ground truth to the test case - store errors in _GT | ||
476 | - _T = T.compare(_GT, sigma, device); //compare the test case to the ground truth - store errors in _T | ||
477 | - | ||
478 | - // mapping two networks and get their edge relation | ||
479 | - _GT.mapping(_T, _gt_t, device, threshold); | ||
480 | - _T.mapping(_GT, _t_gt, device, threshold); | ||
481 | - | ||
482 | - // generate random color set based on the number of edges in GT | ||
483 | - size_t num = _gt_t.size(); // also create random color for unmapping edge, but won't be used though | ||
484 | - colormap.resize(3 * num); // 3 portions compound RGB | ||
485 | - for (int i = 0; i < 3 * num; i++) | ||
486 | - colormap[i] = rand() / (float)RAND_MAX; // set to [0, 1] | ||
487 | - | ||
488 | - //calculate the metrics | ||
489 | - float FPR = _GT.average(0); //calculate the metrics | ||
490 | - float FNR = _T.average(0); | ||
491 | - | ||
492 | - std::cout << "FNR: " << FPR << std::endl; //print false alarms and misses | ||
493 | - std::cout << "FPR: " << FNR << std::endl; | ||
494 | -} | ||
495 | - | ||
496 | // writes features of the networks i.e average segment length, tortuosity, branching index, contraction, fractal dimension, number of end and branch points to a csv file | 493 | // writes features of the networks i.e average segment length, tortuosity, branching index, contraction, fractal dimension, number of end and branch points to a csv file |
497 | // Pranathi wrote this - saves network features to a CSV file | 494 | // Pranathi wrote this - saves network features to a CSV file |
498 | void features(std::string filename){ | 495 | void features(std::string filename){ |
@@ -563,10 +560,8 @@ int main(int argc, char* argv[]) | @@ -563,10 +560,8 @@ int main(int argc, char* argv[]) | ||
563 | if (args.nargs() >= 1) { // if at least one network file is specified | 560 | if (args.nargs() >= 1) { // if at least one network file is specified |
564 | num_nets = 1; // set the number of networks to one | 561 | num_nets = 1; // set the number of networks to one |
565 | std::vector<std::string> tmp = stim::parser::split(args.arg(0), '.'); // split the filename at '.' | 562 | std::vector<std::string> tmp = stim::parser::split(args.arg(0), '.'); // split the filename at '.' |
566 | - if ("swc" == tmp[1]) { // loading swc file | 563 | + if ("swc" == tmp[1]) // loading swc file |
567 | GT.load_swc(args.arg(0)); // load the specified file as the ground truth | 564 | GT.load_swc(args.arg(0)); // load the specified file as the ground truth |
568 | - swc_ind = 1; // set the indicator of swc file to 1 | ||
569 | - } | ||
570 | else if ("obj" == tmp[1]) // loading obj file | 565 | else if ("obj" == tmp[1]) // loading obj file |
571 | GT.load_obj(args.arg(0)); // load the specified file as the ground truth | 566 | GT.load_obj(args.arg(0)); // load the specified file as the ground truth |
572 | else { | 567 | else { |
@@ -575,43 +570,32 @@ int main(int argc, char* argv[]) | @@ -575,43 +570,32 @@ int main(int argc, char* argv[]) | ||
575 | } | 570 | } |
576 | } | 571 | } |
577 | 572 | ||
578 | - if (args.nargs() == 2) { //if two files are specified, they will be displayed in neighboring viewports and compared | ||
579 | - if (1 == swc_ind) { //loading swc files | ||
580 | - int device = args["device"].as_int(); //get the device value from the user | ||
581 | - num_nets = 2; //set the number of networks to two | ||
582 | - //does it need to be resampled?? | ||
583 | - sigma = args["sigma"].as_float(); //get the sigma value from the user | ||
584 | - T.load_swc(args.arg(1)); //load the second (test) network | ||
585 | - if (args["features"].is_set()) //if the user wants to save features | ||
586 | - features(args["features"].as_string()); | ||
587 | - GT = GT.resample(resample_rate * sigma); //resample both networks based on the sigma value | ||
588 | - T = T.resample(resample_rate * sigma); | ||
589 | - if (args["mapping"].is_set()) { | ||
590 | - float threshold = args["mapping"].as_float(); | ||
591 | - map_swc(sigma, device, threshold); | ||
592 | - //std::cout << "right now networks that are loaded from swc files do not need to be mapped with each other!" << std::endl; | ||
593 | - //exit(1); | ||
594 | - } | ||
595 | - else | ||
596 | - compare(sigma, device); //run the comparison algorithm | ||
597 | - } | 573 | + if (args.nargs() == 2) { //if two files are specified, they will be displayed in neighboring viewports and compared |
574 | + int device = args["device"].as_int(); //get the device value from the user | ||
575 | + num_nets = 2; //set the number of networks to two | ||
576 | + sigma = args["sigma"].as_float(); //get the sigma value from the user | ||
577 | + radius = sigma; | ||
578 | + std::vector<std::string> tmp = stim::parser::split(args.arg(1), '.'); // split the filename at '.' | ||
579 | + if ("swc" == tmp[1]) //loading swc files | ||
580 | + T.load_swc(args.arg(1)); //load the second (test) network | ||
581 | + else if ("obj" == tmp[1]) //loading obj files | ||
582 | + T.load_obj(args.arg(1)); | ||
598 | else { | 583 | else { |
599 | - int device = args["device"].as_int(); //get the device value from the user | ||
600 | - num_nets = 2; //set the number of networks to two | ||
601 | - sigma = args["sigma"].as_float(); //get the sigma value from the user | ||
602 | - T.load_obj(args.arg(1)); //load the second (test) network | ||
603 | - if (args["features"].is_set()) //if the user wants to save features | ||
604 | - features(args["features"].as_string()); | ||
605 | - GT = GT.resample(resample_rate * sigma); //resample both networks based on the sigma value | ||
606 | - T = T.resample(resample_rate * sigma); | ||
607 | - if (args["mapping"].is_set()) { | ||
608 | - float threshold = args["mapping"].as_float(); | ||
609 | - map(sigma, device, threshold); | ||
610 | - } | ||
611 | - else | ||
612 | - compare(sigma, device); //run the comparison algorithm | 584 | + std::cout << "Invalid loading file" << std::endl; |
585 | + exit(1); | ||
586 | + } | ||
587 | + if (args["features"].is_set()) //if the user wants to save features | ||
588 | + features(args["features"].as_string()); | ||
589 | + //does it need to be resampled?? | ||
590 | + GT = GT.resample(resample_rate * sigma); //resample both networks based on the sigma value | ||
591 | + T = T.resample(resample_rate * sigma); | ||
592 | + if (args["mapping"].is_set()) { | ||
593 | + float threshold = args["mapping"].as_float(); | ||
594 | + map(sigma, device, threshold); | ||
595 | + } | ||
596 | + else | ||
597 | + compare(sigma, device); //run the comparison algorithm | ||
613 | } | 598 | } |
614 | - } | ||
615 | 599 | ||
616 | //if a GUI is requested, display the network using OpenGL | 600 | //if a GUI is requested, display the network using OpenGL |
617 | if(args["gui"].is_set()){ | 601 | if(args["gui"].is_set()){ |