7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
1
|
#include <stdlib.h>
|
db598823
David Mayerich
fixed GCC errors ...
|
2
3
|
#include <string>
#include <fstream>
|
f001495e
Jiaming Guo
fix minor errors ...
|
4
|
#include <algorithm>
|
db598823
David Mayerich
fixed GCC errors ...
|
5
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
6
7
8
9
|
// STIM includes
#include <stim/parser/arguments.h>
#include <stim/visualization/camera.h>
#include <stim/gl/gl_texture.h>
|
db598823
David Mayerich
fixed GCC errors ...
|
10
11
12
|
#include <stim/visualization/gl_network.h>
#include <stim/biomodels/network.h>
#include <stim/visualization/gl_aaboundingbox.h>
|
8f96cac6
Jiaming Guo
pushed old changes
|
13
14
15
16
|
// OpenGL includes
#include <GL/glut.h>
#include <GL/freeglut.h>
|
db598823
David Mayerich
fixed GCC errors ...
|
17
|
|
f86a38d3
Jiaming Guo
add device choice...
|
18
19
20
21
22
|
#ifdef __CUDACC__
//CUDA includes
#include <cuda.h>
#endif
|
8f96cac6
Jiaming Guo
pushed old changes
|
23
|
// BOOST includes
|
db598823
David Mayerich
fixed GCC errors ...
|
24
25
|
#include <boost/tuple/tuple.hpp>
|
8f96cac6
Jiaming Guo
pushed old changes
|
26
27
28
|
// visualization objects
stim::gl_aaboundingbox<float> bb; // axis-aligned bounding box object
stim::camera cam; // camera object
|
db598823
David Mayerich
fixed GCC errors ...
|
29
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
30
31
32
33
34
|
// overall parameters
unsigned num_nets = 0; // number of networks that've been loaded
float sigma = 3.0; // default sigma(resample rate) equals to 3.0
float radius = 0.7; // equals to radius
float delta; // camera moving parameter
|
f001495e
Jiaming Guo
fix minor errors ...
|
35
36
|
// networks
|
8f96cac6
Jiaming Guo
pushed old changes
|
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
stim::gl_network<float> GT; // ground truth network
stim::gl_network<float> T; // test network
stim::gl_network<float> _GT; // splitted GT
stim::gl_network<float> _T; // splitted T
// flags
bool flag_mapping = false; // flag indicates mapping
bool flag_stack = false; // flag indicates loading image stacks
bool flag_adjoint_network = false; // flag indicates render a T overlaid on GT
bool flag_light = false; // flag indicates light on/off
bool flag_highlight_difference; // flag indicates highlight the difference between two networks
// relationships
std::vector<unsigned> _gt_t; // store indices of nearest edge points in _T for _GT
std::vector<unsigned> _t_gt; // store indices of nearest edge points in _GT for _T
// hard-coded parameters
float resample_rate = 0.5f; // sample rate for the network (fraction of sigma used as the maximum sample rate)
float camera_factor = 1.2f; // start point of the camera as a function of X and Y size
float orbit_factor = 0.01f; // degrees per pixel used to orbit the camera
float zoom_factor = 10.0f; // zooming factor
float radius_factor = 0.5f; // radius changing factor
// mouse click
bool LButtonDown = false; // true when left button down
|
9627c6e6
Jiaming Guo
add splitting and...
|
62
63
|
bool RButtonDown = false;
|
8f96cac6
Jiaming Guo
pushed old changes
|
64
|
// mouse position tracking
|
db598823
David Mayerich
fixed GCC errors ...
|
65
66
67
|
int mouse_x;
int mouse_y;
|
f001495e
Jiaming Guo
fix minor errors ...
|
68
|
// render modes
|
f4940d2b
Jiaming Guo
fixed syntax errors
|
69
|
bool compareMode = true; // default mode is compare mode
|
9627c6e6
Jiaming Guo
add splitting and...
|
70
|
bool mappingMode = false;
|
8f96cac6
Jiaming Guo
pushed old changes
|
71
|
bool volumeMode = false;
|
9627c6e6
Jiaming Guo
add splitting and...
|
72
|
|
5ac53c9e
Jiaming Guo
add keyboardfunc
|
73
|
// random color set
|
9627c6e6
Jiaming Guo
add splitting and...
|
74
75
|
std::vector<float> colormap;
|
5ac53c9e
Jiaming Guo
add keyboardfunc
|
76
77
78
|
// special key indicator
int mods;
|
8f96cac6
Jiaming Guo
pushed old changes
|
79
80
81
82
83
84
|
// OpenGL objects
GLuint cmap_tex = 0; // texture name for the color map
// Stack view parameter
stim::gl_texture<unsigned char> S; // texture storing the image stack
float planes[3] = { 0.0f, 0.0f, 0.0f }; // plane position in world space
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
85
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
86
|
// sets an OpenGL viewport taking up the entire window
|
db598823
David Mayerich
fixed GCC errors ...
|
87
88
|
void glut_render_single_projection(){
|
8f96cac6
Jiaming Guo
pushed old changes
|
89
90
91
|
glMatrixMode(GL_PROJECTION); // load the projection matrix for editing
glLoadIdentity(); // start with the identity matrix
int X = glutGet(GLUT_WINDOW_WIDTH); // use the whole screen for rendering
|
db598823
David Mayerich
fixed GCC errors ...
|
92
|
int Y = glutGet(GLUT_WINDOW_HEIGHT);
|
8f96cac6
Jiaming Guo
pushed old changes
|
93
94
95
|
glViewport(0, 0, X, Y); // specify a viewport for the entire window
float aspect = (float)X / (float)Y; // calculate the aspect ratio
gluPerspective(60, aspect, 0.1, 1000000); // set up a perspective projection
|
db598823
David Mayerich
fixed GCC errors ...
|
96
97
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
98
|
// sets an OpenGL viewport taking up the left half of the window
|
db598823
David Mayerich
fixed GCC errors ...
|
99
100
|
void glut_render_left_projection(){
|
8f96cac6
Jiaming Guo
pushed old changes
|
101
102
103
|
glMatrixMode(GL_PROJECTION); // load the projection matrix for editing
glLoadIdentity(); // start with the identity matrix
int X = glutGet(GLUT_WINDOW_WIDTH) / 2; // only use half of the screen for the viewport
|
db598823
David Mayerich
fixed GCC errors ...
|
104
|
int Y = glutGet(GLUT_WINDOW_HEIGHT);
|
8f96cac6
Jiaming Guo
pushed old changes
|
105
106
107
|
glViewport(0, 0, X, Y); // specify the viewport on the left
float aspect = (float)X / (float)Y; // calculate the aspect ratio
gluPerspective(60, aspect, 0.1, 1000000); // set up a perspective projection
|
db598823
David Mayerich
fixed GCC errors ...
|
108
109
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
110
|
// sets an OpenGL viewport taking up the right half of the window
|
db598823
David Mayerich
fixed GCC errors ...
|
111
112
|
void glut_render_right_projection(){
|
8f96cac6
Jiaming Guo
pushed old changes
|
113
114
115
|
glMatrixMode(GL_PROJECTION); // load the projection matrix for editing
glLoadIdentity(); // start with the identity matrix
int X = glutGet(GLUT_WINDOW_WIDTH) / 2; // only use half of the screen for the viewport
|
db598823
David Mayerich
fixed GCC errors ...
|
116
|
int Y = glutGet(GLUT_WINDOW_HEIGHT);
|
8f96cac6
Jiaming Guo
pushed old changes
|
117
118
119
|
glViewport(X, 0, X, Y); // specify the viewport on the right
float aspect = (float)X / (float)Y; // calculate the aspect ratio
gluPerspective(60, aspect, 0.1, 1000000); // set up a perspective projection
|
db598823
David Mayerich
fixed GCC errors ...
|
120
121
122
123
|
}
void glut_render_modelview(){
|
8f96cac6
Jiaming Guo
pushed old changes
|
124
125
126
127
128
|
glMatrixMode(GL_MODELVIEW); // load the modelview matrix for editing
glLoadIdentity(); // start with the identity matrix
stim::vec3<float> eye = cam.getPosition(); // get the camera position (eye point)
stim::vec3<float> focus = cam.getLookAt(); // get the camera focal point
stim::vec3<float> up = cam.getUp(); // get the camera "up" orientation
|
db598823
David Mayerich
fixed GCC errors ...
|
129
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
130
|
gluLookAt(eye[0], eye[1], eye[2], focus[0], focus[1], focus[2], up[0], up[1], up[2]); // set up the OpenGL camera
|
db598823
David Mayerich
fixed GCC errors ...
|
131
132
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
// draw x slice
void draw_x_slice(float p) {
float x = p;
float y = S.size(1);
float z = S.size(2);
float tx = p / S.size(0);
glBegin(GL_QUADS);
glTexCoord3f(tx, 0, 0);
glVertex3f(x, 0, 0);
glTexCoord3f(tx, 0, 1);
glVertex3f(x, 0, z);
glTexCoord3f(tx, 1, 1);
glVertex3f(x, y, z);
glTexCoord3f(tx, 1, 0);
glVertex3f(x, y, 0);
glEnd();
}
// draw y slice
void draw_y_slice(float p) {
float x = S.size(0);
float y = p;
float z = S.size(2);
float ty = p / S.size(1);
glBegin(GL_QUADS);
glTexCoord3f(0, ty, 0);
glVertex3f(0, y, 0);
glTexCoord3f(0, ty, 1);
glVertex3f(0, y, z);
glTexCoord3f(1, ty, 1);
glVertex3f(x, y, z);
glTexCoord3f(1, ty, 0);
glVertex3f(x, y, 0);
glEnd();
}
// draw z slice
void draw_z_slice(float p) {
float x = S.size(0);
float y = S.size(1);
float z = p;
float tz = p / S.size(2);
glBegin(GL_QUADS);
glTexCoord3f(0, 0, tz);
glVertex3f(0, 0, z);
glTexCoord3f(0, 1, tz);
glVertex3f(0, y, z);
glTexCoord3f(1, 1, tz);
glVertex3f(x, y, z);
glTexCoord3f(1, 0, tz);
glVertex3f(x, 0, z);
glEnd();
}
/// draw a bounding box around the data set
void draw_box() {
float c[3] = { S.size(0), S.size(1), S.size(2) };
glLineWidth(1.0);
glBegin(GL_LINE_LOOP);
glColor3f(0, 0, 0);
glVertex3f(0, 0, 0);
glColor3f(0, 1, 0);
glVertex3f(0, c[1], 0);
glColor3f(0, 1, 1);
glVertex3f(0, c[1], c[2]);
glColor3f(0, 0, 1);
glVertex3f(0, 0, c[2]);
glEnd();
glBegin(GL_LINE_LOOP);
glColor3f(1, 0, 0);
glVertex3f(c[0], 0, 0);
glColor3f(1, 1, 0);
glVertex3f(c[0], c[1], 0);
glColor3f(1, 1, 1);
glVertex3f(c[0], c[1], c[2]);
glColor3f(1, 0, 1);
glVertex3f(c[0], 0, c[2]);
glEnd();
glBegin(GL_LINES);
glColor3f(0, 0, 0);
glVertex3f(0, 0, 0);
glColor3f(1, 0, 0);
glVertex3f(c[0], 0, 0);
glColor3f(0, 1, 0);
glVertex3f(0, c[1], 0);
glColor3f(1, 1, 0);
glVertex3f(c[0], c[1], 0);
glColor3f(0, 1, 1);
glVertex3f(0, c[1], c[2]);
glColor3f(1, 1, 1);
glVertex3f(c[0], c[1], c[2]);
glColor3f(0, 0, 1);
glVertex3f(0, 0, c[2]);
glColor3f(1, 0, 1);
glVertex3f(c[0], 0, c[2]);
glEnd();
}
void draw_frames() {
float c[3] = { S.size(0), S.size(1), S.size(2) }; // store the size of the data set for all three dimensions
glLineWidth(1.0);
glColor3f(1, 0, 0); // draw the X plane
glBegin(GL_LINE_LOOP);
glVertex3f(planes[0], 0, 0);
glVertex3f(planes[0], c[1], 0);
glVertex3f(planes[0], c[1], c[2]);
glVertex3f(planes[0], 0, c[2]);
glEnd();
glColor3f(0, 1, 0); // draw the Y plane
glBegin(GL_LINE_LOOP);
glVertex3f(0, planes[1], 0);
glVertex3f(c[0], planes[1], 0);
glVertex3f(c[0], planes[1], c[2]);
glVertex3f(0, planes[1], c[2]);
glEnd();
glColor3f(0, 0, 1); // draw the Z plane
glBegin(GL_LINE_LOOP);
glVertex3f(0, 0, planes[2]);
glVertex3f(c[0], 0, planes[2]);
glVertex3f(c[0], c[1], planes[2]);
glVertex3f(0, c[1], planes[2]);
glEnd();
}
// enforce bound
void enforce_bounds() {
for (int d = 0; d < 3; d++) {
if (planes[d] < 0) planes[d] = 0;
if (planes[d] > S.size(d)) planes[d] = S.size(d);
}
}
// draw the network(s)
|
db598823
David Mayerich
fixed GCC errors ...
|
293
294
|
void glut_render(void) {
|
3a4a7f69
Jiaming Guo
add new way to se...
|
295
|
stim::vec3<float> p1 = cam.getLookAt() + cam.getUp() * 100000;
|
a1ce3752
David Mayerich
fixed minor light...
|
296
|
stim::vec3<float> p2 = cam.getPosition();
|
dea61e7f
Jiaming Guo
some tests
|
297
298
299
|
// light
GLfloat global_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
|
f85b1b3a
Jiaming Guo
add proper light
|
300
|
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
|
dea61e7f
Jiaming Guo
some tests
|
301
|
GLfloat diffuse1[] = { 1.0, 1.0, 1.0, 1.0 };
|
f85b1b3a
Jiaming Guo
add proper light
|
302
|
GLfloat diffuse2[] = { 0.4, 0.4, 0.4, 1.0 };
|
dea61e7f
Jiaming Guo
some tests
|
303
304
305
|
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position1[] = { p1[0], p1[1], p1[2], 1.0 }; // upper right light source
GLfloat position2[] = { p2[0], p2[1], p2[2], 1.0 }; // lower left light source
|
f85b1b3a
Jiaming Guo
add proper light
|
306
307
308
309
310
311
|
glClearColor(0.0, 0.0, 0.0, 1.0);
glShadeModel(GL_SMOOTH);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
|
8f96cac6
Jiaming Guo
pushed old changes
|
312
313
314
315
|
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); // set ambient for light 0
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse1); // set diffuse for light 0
glLightfv(GL_LIGHT0, GL_SPECULAR, specular); // set specular for light 0
glLightfv(GL_LIGHT0, GL_POSITION, position1); // set position for light 0
|
f85b1b3a
Jiaming Guo
add proper light
|
316
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
317
318
319
320
|
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); // set ambient for light 1
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2); // set diffuse for light 1
glLightfv(GL_LIGHT1, GL_SPECULAR, specular); // set specular for light 1
glLightfv(GL_LIGHT1, GL_POSITION, position2); // set position for light 1
|
f85b1b3a
Jiaming Guo
add proper light
|
321
|
|
21f03d55
Jiaming Guo
add functions for...
|
322
|
//no mapping, just comparing
|
8f96cac6
Jiaming Guo
pushed old changes
|
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
|
if (!flag_mapping) {
if (num_nets == 1) { // if a single network is loaded
glEnable(GL_DEPTH_TEST); // enable depth
glut_render_single_projection(); // fill the entire viewport
glut_render_modelview(); // set up the modelview matrix with camera details
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
if (volumeMode) {
draw_box();
draw_frames();
glEnable(GL_TEXTURE_3D); // enable 3D texture mapping
S.bind(); // bind the texture
draw_x_slice(planes[0]); // draw the X plane
draw_y_slice(planes[1]); // draw the Y plane
draw_z_slice(planes[2]); // draw the Z plane
glDisable(GL_TEXTURE_3D); // disable 3D texture mapping
}
glColor3f(1.0f, 1.0f, 1.0f);
GT.glCenterline0(); // render the GT network (the only one loaded)
glDisable(GL_DEPTH_TEST);
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
342
|
}
|
3a4a7f69
Jiaming Guo
add new way to se...
|
343
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
344
345
346
347
|
if (num_nets == 2) { // if two networks are loaded
glEnable(GL_TEXTURE_1D); // enable texture mapping
if (flag_light == 0)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // texture map will be used as the network color
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
348
|
else
|
19ec4731
Jiaming Guo
add light
|
349
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
8f96cac6
Jiaming Guo
pushed old changes
|
350
|
glBindTexture(GL_TEXTURE_1D, cmap_tex); // bind the Brewer texture map
|
c62540c7
Jiaming Guo
normalization
|
351
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
352
353
354
355
356
357
358
359
360
361
362
|
glEnable(GL_DEPTH_TEST); // enable depth
glut_render_left_projection(); // set up a projection for the left half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
GT.glCylinder(sigma, radius); // render the GT network
if (flag_adjoint_network == 1) {
glDisable(GL_TEXTURE_1D); // disable texture in order to render in other color
glEnable(GL_BLEND); // enable color blend
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // set blend function
glDisable(GL_DEPTH_TEST); // should disable depth to render transparancy
|
19ec4731
Jiaming Guo
add light
|
363
364
|
glColor4f(0.0f, 0.3f, 0.0f, 0.2f);
T.glAdjointCylinder(sigma, radius);
|
8b30eb84
Jiaming Guo
add SPACE keyboar...
|
365
366
|
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
|
19ec4731
Jiaming Guo
add light
|
367
368
|
glEnable(GL_TEXTURE_1D);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
8b30eb84
Jiaming Guo
add SPACE keyboar...
|
369
|
}
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
370
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
371
372
373
374
375
376
377
378
379
|
glut_render_right_projection(); // set up a projection for the right half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
T.glCylinder(sigma, radius); // render the T network
if (flag_adjoint_network == 1) {
glDisable(GL_TEXTURE_1D); // temporarily disable texture
glEnable(GL_BLEND); // enable color blend
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // set blend function
glDisable(GL_DEPTH_TEST); // should disable depth
|
3a4a7f69
Jiaming Guo
add new way to se...
|
380
381
|
glColor4f(0.0f, 0.3f, 0.0f, 0.2f);
GT.glAdjointCylinder(sigma, radius);
|
3a4a7f69
Jiaming Guo
add new way to se...
|
382
383
|
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
|
8f96cac6
Jiaming Guo
pushed old changes
|
384
|
glEnable(GL_TEXTURE_1D); // re-enable texture
|
3a4a7f69
Jiaming Guo
add new way to se...
|
385
386
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
|
19ec4731
Jiaming Guo
add light
|
387
|
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
388
|
sigma = radius; // set sigma equal to radius
|
3a4a7f69
Jiaming Guo
add new way to se...
|
389
|
glDisable(GL_TEXTURE_1D);
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
390
391
|
}
}
|
f7d360df
Jiaming Guo
resoloved conflicts
|
392
|
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
393
394
|
//do comparing and mapping
else {
|
8f96cac6
Jiaming Guo
pushed old changes
|
395
396
|
if (num_nets == 1) { // if a single network is loaded
std::cout << "You should have at least two networks to do mapping." << std::endl; // exit program because there isn't enough network
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
397
398
|
exit(1);
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
399
|
if (num_nets == 2) { // if two networks are loaded
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
400
|
if (compareMode) {
|
8f96cac6
Jiaming Guo
pushed old changes
|
401
402
403
|
glEnable(GL_TEXTURE_1D); // enable texture mapping
if (flag_light == 0)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // texture map will be used as the network color
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
404
|
else
|
8f96cac6
Jiaming Guo
pushed old changes
|
405
406
|
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);// map light to texture
glBindTexture(GL_TEXTURE_1D, cmap_tex); // bind the Brewer texture map
|
c62540c7
Jiaming Guo
normalization
|
407
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
408
409
410
|
glEnable(GL_DEPTH_TEST); // enable depth
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
glut_render_left_projection(); // set up a projection for the left half of the window
|
c62540c7
Jiaming Guo
normalization
|
411
|
glut_render_modelview(); //set up the modelview matrix using camera details
|
dea61e7f
Jiaming Guo
some tests
|
412
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
413
414
415
416
417
418
|
_GT.glCylinder(sigma, radius); // render the GT network
if (flag_adjoint_network == 1) {
glDisable(GL_TEXTURE_1D); // temporarily disable texture
glEnable(GL_BLEND); // enable color blend
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // set blend function
glDisable(GL_DEPTH_TEST); // should disable depth
|
19ec4731
Jiaming Guo
add light
|
419
420
|
glColor4f(0.0f, 0.3f, 0.0f, 0.2f);
_T.glAdjointCylinder(sigma, radius);
|
8b30eb84
Jiaming Guo
add SPACE keyboar...
|
421
422
|
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
|
8f96cac6
Jiaming Guo
pushed old changes
|
423
|
glEnable(GL_TEXTURE_1D); // re-enable texture
|
19ec4731
Jiaming Guo
add light
|
424
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
8b30eb84
Jiaming Guo
add SPACE keyboar...
|
425
|
}
|
9627c6e6
Jiaming Guo
add splitting and...
|
426
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
427
428
|
glut_render_right_projection(); // set up a projection for the right half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
|
19ec4731
Jiaming Guo
add light
|
429
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
430
431
432
433
434
|
_T.glCylinder(sigma, radius); // render the T network
if (flag_adjoint_network == 1) {
glDisable(GL_TEXTURE_1D); // temporarily disable texture
glEnable(GL_BLEND); // enable color blend
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // set blend function
|
3a4a7f69
Jiaming Guo
add new way to se...
|
435
436
437
|
glDisable(GL_DEPTH_TEST); //should disable depth
glColor4f(0.0f, 0.3f, 0.0f, 0.2f);
_GT.glAdjointCylinder(sigma, radius);
|
3a4a7f69
Jiaming Guo
add new way to se...
|
438
439
|
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
|
8f96cac6
Jiaming Guo
pushed old changes
|
440
|
glEnable(GL_TEXTURE_1D); // re-enable texture
|
3a4a7f69
Jiaming Guo
add new way to se...
|
441
442
|
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
|
19ec4731
Jiaming Guo
add light
|
443
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
444
|
sigma = radius; // set sigma equal to radius
|
3a4a7f69
Jiaming Guo
add new way to se...
|
445
|
glDisable(GL_TEXTURE_1D);
|
7c1b82bc
Jiaming Guo
test for 00_GT.swc
|
446
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
447
|
else if (mappingMode) {
|
dea61e7f
Jiaming Guo
some tests
|
448
|
glEnable(GL_COLOR_MATERIAL);
|
8f96cac6
Jiaming Guo
pushed old changes
|
449
450
451
452
|
glEnable(GL_DEPTH_TEST); // enable depth
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
glut_render_left_projection(); // set up a projection for the left half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
|
3a4a7f69
Jiaming Guo
add new way to se...
|
453
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
454
|
if (flag_highlight_difference == 0)
|
3a4a7f69
Jiaming Guo
add new way to se...
|
455
|
_GT.glRandColorCylinder(0, _gt_t, colormap, sigma, radius);
|
3a4a7f69
Jiaming Guo
add new way to se...
|
456
457
458
|
else
_GT.glDifferenceCylinder(0, _gt_t, colormap, sigma, radius);
|
9627c6e6
Jiaming Guo
add splitting and...
|
459
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
460
461
|
glut_render_right_projection(); // set up a projection for the right half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
|
3a4a7f69
Jiaming Guo
add new way to se...
|
462
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
463
|
if (flag_highlight_difference == 0)
|
3a4a7f69
Jiaming Guo
add new way to se...
|
464
|
_T.glRandColorCylinder(1, _t_gt, colormap, sigma, radius);
|
3a4a7f69
Jiaming Guo
add new way to se...
|
465
466
|
else
_T.glDifferenceCylinder(1, _t_gt, colormap, sigma, radius);
|
19ec4731
Jiaming Guo
add light
|
467
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
|
sigma = radius; // set sigma equal to radius
}
else if (volumeMode) {
glEnable(GL_DEPTH_TEST); // enable depth
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
glut_render_left_projection(); // set up a projection for the left half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
draw_box();
draw_frames();
glDisable(GL_TEXTURE_1D); // disable 1D texture
glEnable(GL_TEXTURE_3D); // enable 3D texture mapping
S.bind(); // bind the texture
draw_x_slice(planes[0]); // draw the X plane
draw_y_slice(planes[1]); // draw the Y plane
draw_z_slice(planes[2]); // draw the Z plane
glDisable(GL_TEXTURE_3D); // disable 3D texture mapping
GT.glCylinder(sigma, radius);
glut_render_right_projection(); // set up a projection for the right half of the window
glut_render_modelview(); // set up the modelview matrix using camera details
draw_box();
draw_frames();
glDisable(GL_TEXTURE_1D); // disable 1D texture
glEnable(GL_TEXTURE_3D); // enable 3D texture mapping
S.bind(); // bind the texture
draw_x_slice(planes[0]); // draw the X plane
draw_y_slice(planes[1]); // draw the Y plane
draw_z_slice(planes[2]); // draw the Z plane
glDisable(GL_TEXTURE_3D); // disable 3D texture mapping
T.glCylinder(sigma, radius);
glColor3f(1.0f, 1.0f, 1.0f);
sigma = radius;
|
9627c6e6
Jiaming Guo
add splitting and...
|
504
505
|
}
}
|
db598823
David Mayerich
fixed GCC errors ...
|
506
|
}
|
c62540c7
Jiaming Guo
normalization
|
507
|
glDisable(GL_DEPTH_TEST);
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
508
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
509
|
if (num_nets == 2) { // works only with two networks
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
510
|
std::ostringstream ss;
|
8f96cac6
Jiaming Guo
pushed old changes
|
511
|
if (mappingMode) // if it is in mapping mode
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
512
|
ss << "Mapping Mode";
|
8f96cac6
Jiaming Guo
pushed old changes
|
513
514
|
else if (compareMode)
ss << "Compare Mode"; // default mode is compare mode
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
515
|
else
|
8f96cac6
Jiaming Guo
pushed old changes
|
516
|
ss << "volumeDisplay";
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
517
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
518
|
if (flag_light == 1)
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
519
|
glDisable(GL_LIGHTING);
|
8f96cac6
Jiaming Guo
pushed old changes
|
520
|
glMatrixMode(GL_PROJECTION); // set up the 2d viewport for mode text printing
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
521
522
|
glPushMatrix();
glLoadIdentity();
|
8f96cac6
Jiaming Guo
pushed old changes
|
523
524
525
526
527
|
int X = glutGet(GLUT_WINDOW_WIDTH); // get the current window width
int Y = glutGet(GLUT_WINDOW_HEIGHT); // get the current window height
glViewport(0, 0, X / 2, Y); // locate to left bottom corner
gluOrtho2D(0, X, 0, Y); // define othogonal aspect
glColor3f(0.8, 0.0, 0.0); // using red to show mode
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
528
529
530
531
532
|
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
|
8f96cac6
Jiaming Guo
pushed old changes
|
533
|
glRasterPos2f(0, 5); //print text in the left bottom corner
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
534
535
536
537
538
|
glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24, (const unsigned char*)(ss.str().c_str()));
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
|
8f96cac6
Jiaming Guo
pushed old changes
|
539
540
|
glColor3f(1.0, 1.0, 1.0); //clear red color
if (flag_light == 1)
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
541
542
543
|
glEnable(GL_LIGHTING);
}
|
f85b1b3a
Jiaming Guo
add proper light
|
544
545
|
glDisable(GL_COLOR_MATERIAL);
|
db598823
David Mayerich
fixed GCC errors ...
|
546
547
548
549
550
551
|
glutSwapBuffers();
}
// defines camera motion based on mouse dragging
void glut_motion(int x, int y){
|
8f96cac6
Jiaming Guo
pushed old changes
|
552
553
|
int mods = glutGetModifiers();
if(LButtonDown == true && RButtonDown == false && mods == 0){
|
db598823
David Mayerich
fixed GCC errors ...
|
554
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
555
556
|
float theta = orbit_factor * (mouse_x - x); // determine the number of degrees along the x-axis to rotate
float phi = orbit_factor * (y - mouse_y); // number of degrees along the y-axis to rotate
|
db598823
David Mayerich
fixed GCC errors ...
|
557
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
|
cam.OrbitFocus(theta, phi); // rotate the camera around the focal point
}
else if (mods != 0) {
float dx = (float)(x - mouse_x);
float dist = dx; // calculate the distance that the mouse moved in pixel coordinates
float sdist = dist; // scale the distance by the sensitivity
if (mods == GLUT_ACTIVE_SHIFT) { // if the SHIFT key is pressed
planes[0] += (sdist)* S.spacing(0); // move the X plane based on the mouse wheel direction
}
else if (mods == GLUT_ACTIVE_CTRL) { // if the CTRL key is pressed
planes[1] += (sdist)* S.spacing(1); // move the Y plane based on the mouse wheel direction
}
else if (mods == GLUT_ACTIVE_ALT) { // if hte ALT key is pressed
planes[2] += (sdist)* S.spacing(2); // move the Z plane based on the mouse wheel direction
}
enforce_bounds();
}
|
db598823
David Mayerich
fixed GCC errors ...
|
575
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
576
|
mouse_x = x; // update the mouse position
|
db598823
David Mayerich
fixed GCC errors ...
|
577
|
mouse_y = y;
|
8f96cac6
Jiaming Guo
pushed old changes
|
578
579
|
glutPostRedisplay(); // re-draw the visualization
|
db598823
David Mayerich
fixed GCC errors ...
|
580
581
|
}
|
f001495e
Jiaming Guo
fix minor errors ...
|
582
583
|
// sets the menu options
void glut_menu(int value) {
|
8f96cac6
Jiaming Guo
pushed old changes
|
584
|
|
f001495e
Jiaming Guo
fix minor errors ...
|
585
586
587
|
if (value == 1) { // menu 1 represents comparing mode
compareMode = true;
mappingMode = false;
|
8f96cac6
Jiaming Guo
pushed old changes
|
588
|
volumeMode = false;
|
f001495e
Jiaming Guo
fix minor errors ...
|
589
590
591
592
|
}
if (value == 2) { // menu 2 represents mapping mode
compareMode = false;
mappingMode = true;
|
8f96cac6
Jiaming Guo
pushed old changes
|
593
594
595
596
597
598
|
volumeMode = false;
}
if (value == 3) { // menu 3 represents volume mode
compareMode = false;
mappingMode = false;
volumeMode = true;
|
f001495e
Jiaming Guo
fix minor errors ...
|
599
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
600
|
if (value == 4) {
|
f001495e
Jiaming Guo
fix minor errors ...
|
601
602
603
604
605
|
exit(0);
}
glutPostRedisplay();
}
|
db598823
David Mayerich
fixed GCC errors ...
|
606
607
|
// sets the mouse position when clicked
void glut_mouse(int button, int state, int x, int y){
|
9627c6e6
Jiaming Guo
add splitting and...
|
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
|
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
mouse_x = x;
mouse_y = y;
LButtonDown = true;
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN){
mouse_x = x;
mouse_y = y;
RButtonDown = true;
}
else if(button == GLUT_LEFT_BUTTON && state == GLUT_UP){
mouse_x = x;
mouse_y = y;
LButtonDown = false;
}
else if(button == GLUT_RIGHT_BUTTON && state == GLUT_UP){
mouse_x = x;
mouse_y = y;
RButtonDown = false;
}
|
9627c6e6
Jiaming Guo
add splitting and...
|
629
630
|
}
|
f001495e
Jiaming Guo
fix minor errors ...
|
631
632
|
// define camera move based on mouse wheel move(actually we can combine this with glut_mouse)
void glut_wheel(int wheel, int direction, int x, int y) {
|
8f96cac6
Jiaming Guo
pushed old changes
|
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
|
int mods = glutGetModifiers();
if (mods == GLUT_ACTIVE_SHIFT) { // if the SHIFT key is pressed
planes[0] += (direction)* S.spacing(0); // move the X plane based on the mouse wheel direction
}
else if (mods == GLUT_ACTIVE_CTRL) { // if the CTRL key is pressed
planes[1] += (direction)* S.spacing(1); // move the Y plane based on the mouse wheel direction
}
else if (mods == GLUT_ACTIVE_ALT) { // if hte ALT key is pressed
planes[2] += (direction)* S.spacing(2); // move the Z plane based on the mouse wheel direction
}
else {
if (direction > 0) // if it is button 3(up), move closer
delta = zoom_factor;
else // if it is button 4(down), leave farther
delta = -zoom_factor;
}
enforce_bounds();
|
b31bfd7d
David Mayerich
added SWC files a...
|
651
652
|
cam.Push(delta);
|
f001495e
Jiaming Guo
fix minor errors ...
|
653
654
655
656
|
glutPostRedisplay();
}
// define keyboard inputs
|
9627c6e6
Jiaming Guo
add splitting and...
|
657
|
void glut_keyboard(unsigned char key, int x, int y){
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
658
659
660
661
662
|
// register different keyboard operation
switch (key) {
// change render mode
|
8f96cac6
Jiaming Guo
pushed old changes
|
663
664
|
case 'm': // if keyboard 'm' is pressed, then change render mode
if (compareMode && !mappingMode && flag_mapping && !flag_adjoint_network) { // if current mode is comparing mode
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
665
666
667
|
compareMode = false;
mappingMode = true;
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
668
|
else if (!compareMode && mappingMode && flag_mapping && !flag_adjoint_network) {// if current mode is mapping mode
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
669
670
671
672
673
|
compareMode = true;
mappingMode = false;
}
break;
|
8f96cac6
Jiaming Guo
pushed old changes
|
674
675
676
677
678
679
680
681
|
// render the image stack
case 'v':
if (!volumeMode && !flag_mapping)
volumeMode = true;
else if (volumeMode && !flag_mapping)
volumeMode = false;
break;
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
|
// zooming
case 'w': // if keyboard 'w' is pressed, then move closer
delta = zoom_factor;
cam.Push(delta);
break;
case 's': // if keyboard 's' is pressed, then leave farther
delta = -zoom_factor;
cam.Push(delta);
break;
// resample and re-render the cylinder in different radius
case 'd': // if keyboard 'd' is pressed, then increase radius by radius_factor
radius += radius_factor;
break;
case 'a': // if keyboard 'a' is pressed, then decrease radius by radius_factor
radius -= radius_factor;
// get rid of the degenerated case when radius decrease below 0
if (radius < 0.001f)
radius = 0.2;
break;
|
19ec4731
Jiaming Guo
add light
|
702
|
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
703
704
|
// turn on/off the light
case 'l': // if keyboard 'l' is pressed, then change the light
|
8f96cac6
Jiaming Guo
pushed old changes
|
705
706
|
if (!flag_light && !flag_adjoint_network) {
flag_light = 1;
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
707
708
709
|
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
710
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
711
712
|
else if (flag_light && !flag_adjoint_network) {
flag_light = 0;
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
713
714
715
|
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHT1);
|
e1700dd0
Jiaming Guo
fixed bugs when i...
|
716
717
718
|
}
break;
|
19ec4731
Jiaming Guo
add light
|
719
|
// render a transparant T very close to GT in compare mode
|
8f96cac6
Jiaming Guo
pushed old changes
|
720
721
722
723
724
|
case 32: // if keyboard 'SPACE' is pressed, then change the flag_adjoint_network
if (!flag_adjoint_network && compareMode && !flag_light)
flag_adjoint_network = 1;
else if (flag_adjoint_network && compareMode && !flag_light)
flag_adjoint_network = 0;
|
8b30eb84
Jiaming Guo
add SPACE keyboar...
|
725
|
break;
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
726
|
|
3a4a7f69
Jiaming Guo
add new way to se...
|
727
728
|
// render only the difference
case 'h':
|
8f96cac6
Jiaming Guo
pushed old changes
|
729
730
731
732
|
if (!flag_highlight_difference && mappingMode && !flag_light)
flag_highlight_difference = 1;
else if (flag_highlight_difference && mappingMode && !flag_light)
flag_highlight_difference = 0;
|
3a4a7f69
Jiaming Guo
add new way to se...
|
733
734
|
break;
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
735
736
737
|
// close window and exit application
case 27: // if keyboard 'ESC' is pressed, then exit
exit(0);
|
f001495e
Jiaming Guo
fix minor errors ...
|
738
|
}
|
9627c6e6
Jiaming Guo
add splitting and...
|
739
|
glutPostRedisplay();
|
db598823
David Mayerich
fixed GCC errors ...
|
740
741
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
742
|
#define BREWER_CTRL_PTS 11 // number of control points in the Brewer map
|
db598823
David Mayerich
fixed GCC errors ...
|
743
744
745
|
void texture_initialize(){
//define the colormap
|
8f96cac6
Jiaming Guo
pushed old changes
|
746
|
static float brewer_map[BREWER_CTRL_PTS][3] = { // generate a Brewer color map (blue to red)
|
db598823
David Mayerich
fixed GCC errors ...
|
747
748
749
750
751
752
753
754
755
756
757
758
759
|
{0.192157f, 0.211765f, 0.584314f},
{0.270588f, 0.458824f, 0.705882f},
{0.454902f, 0.678431f, 0.819608f},
{0.670588f, 0.85098f, 0.913725f},
{0.878431f, 0.952941f, 0.972549f},
{1.0f, 1.0f, 0.74902f},
{0.996078f, 0.878431f, 0.564706f},
{0.992157f, 0.682353f, 0.380392f},
{0.956863f, 0.427451f, 0.262745f},
{0.843137f, 0.188235f, 0.152941f},
{0.647059f, 0.0f, 0.14902f}
};
|
8f96cac6
Jiaming Guo
pushed old changes
|
760
761
|
glGenTextures(1, &cmap_tex); // generate a texture map name
glBindTexture(GL_TEXTURE_1D, cmap_tex); // bind the texture map
|
db598823
David Mayerich
fixed GCC errors ...
|
762
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
763
|
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // enable linear interpolation
|
db598823
David Mayerich
fixed GCC errors ...
|
764
|
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
8f96cac6
Jiaming Guo
pushed old changes
|
765
766
|
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP); // clamp the values at the minimum and maximum
glTexImage1D(GL_TEXTURE_1D, 0, 3, BREWER_CTRL_PTS, 0, GL_RGB, GL_FLOAT, // upload the texture map to the GPU
|
db598823
David Mayerich
fixed GCC errors ...
|
767
|
brewer_map);
|
8f96cac6
Jiaming Guo
pushed old changes
|
768
769
770
|
if (flag_stack == 1) {
S.attach(); // attach 3D texture
}
|
db598823
David Mayerich
fixed GCC errors ...
|
771
772
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
773
|
// Initialize the OpenGL (GLUT) window, including starting resolution, callbacks, texture maps, and camera
|
db598823
David Mayerich
fixed GCC errors ...
|
774
775
|
void glut_initialize(){
|
8f96cac6
Jiaming Guo
pushed old changes
|
776
|
int myargc = 1; // GLUT requires arguments, so create some bogus ones
|
db598823
David Mayerich
fixed GCC errors ...
|
777
778
779
|
char* myargv[1];
myargv [0]=strdup ("netmets");
|
8f96cac6
Jiaming Guo
pushed old changes
|
780
|
glutInit(&myargc, myargv); // pass bogus arguments to glutInit()
|
f001495e
Jiaming Guo
fix minor errors ...
|
781
|
glutSetOption(GLUT_MULTISAMPLE, 8);
|
8f96cac6
Jiaming Guo
pushed old changes
|
782
783
784
785
786
787
788
789
790
791
792
793
|
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); // generate a color buffer, depth buffer, and enable double buffering
glutInitWindowPosition(100,100); // set the initial window position
glutInitWindowSize(320, 320); // set the initial window size
glutCreateWindow("NetMets - STIM Lab, UH"); // set the dialog box title
#ifdef _WIN32
GLenum err = glewInit(); // initialize GLEW (necessary for Windows)
if (GLEW_OK != err) { // eror with GLEW
std::cout << "Error with GLEW: " << glewGetErrorString(err) << std::endl;
exit(1);
}
#endif
|
db598823
David Mayerich
fixed GCC errors ...
|
794
|
|
db598823
David Mayerich
fixed GCC errors ...
|
795
|
// register callback functions
|
8f96cac6
Jiaming Guo
pushed old changes
|
796
797
798
799
800
801
802
803
804
805
|
glutDisplayFunc(glut_render); // function executed for rendering - renders networks
glutMouseFunc(glut_mouse); // executed on a mouse click - sets starting mouse positions for rotations
glutMotionFunc(glut_motion); // executed when the mouse is moved while a button is pressed
if (flag_mapping == 1) { // only in mapping mode, keyboard will be used
glutCreateMenu(glut_menu); // register menu option callback
glutAddMenuEntry("Comparing Mode", 1); // register menu 1 as comparing mode
glutAddMenuEntry("Mapping Mode", 2); // register menu 2 as mapping mode
glutAddMenuEntry("Volume Display", 3); // register menu 3 as volume metric mode
glutAddMenuEntry("Exit", 4); // register menu 4 as exiting
glutAttachMenu(GLUT_RIGHT_BUTTON); // register right mouse to open menu option
|
4d23da9c
Jiaming Guo
add 00_GT.swc,now...
|
806
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
807
|
glutKeyboardFunc(glut_keyboard); // register keyboard callback
|
b31bfd7d
David Mayerich
added SWC files a...
|
808
|
glutMouseWheelFunc(glut_wheel);
|
db598823
David Mayerich
fixed GCC errors ...
|
809
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
810
|
texture_initialize(); // set up texture mapping (create texture maps, enable features)
|
db598823
David Mayerich
fixed GCC errors ...
|
811
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
812
|
stim::vec3<float> c = bb.center(); // get the center of the network bounding box
|
db598823
David Mayerich
fixed GCC errors ...
|
813
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
814
|
// place the camera along the z-axis at a distance determined by the network size along x and y
|
db598823
David Mayerich
fixed GCC errors ...
|
815
|
cam.setPosition(c + stim::vec<float>(0, 0, camera_factor * std::max(bb.size()[0], bb.size()[1])));
|
8f96cac6
Jiaming Guo
pushed old changes
|
816
|
cam.LookAt(c[0], c[1], c[2]); // look at the center of the network
|
db598823
David Mayerich
fixed GCC errors ...
|
817
818
|
}
|
f86a38d3
Jiaming Guo
add device choice...
|
819
|
#ifdef __CUDACC__
|
f001495e
Jiaming Guo
fix minor errors ...
|
820
|
// set specific device to work on
|
f86a38d3
Jiaming Guo
add device choice...
|
821
822
|
void setdevice(int &device){
int count;
|
8f96cac6
Jiaming Guo
pushed old changes
|
823
|
cudaGetDeviceCount(&count); // numbers of device that are available
|
f86a38d3
Jiaming Guo
add device choice...
|
824
825
826
827
828
829
830
|
if(count < device + 1){
std::cout<<"No such device available, please set another device"<<std::endl;
exit(1);
}
}
#else
void setdevice(int &device){
|
8f96cac6
Jiaming Guo
pushed old changes
|
831
|
device = -1; // set to default -1
|
f86a38d3
Jiaming Guo
add device choice...
|
832
833
834
|
}
#endif
|
8f96cac6
Jiaming Guo
pushed old changes
|
835
|
// compare both networks and fill the networks with error information
|
f86a38d3
Jiaming Guo
add device choice...
|
836
|
void compare(float sigma, int device){
|
db598823
David Mayerich
fixed GCC errors ...
|
837
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
838
839
|
GT = GT.compare(T, sigma, device); // compare the ground truth to the test case - store errors in GT
T = T.compare(GT, sigma, device); // compare the test case to the ground truth - store errors in T
|
db598823
David Mayerich
fixed GCC errors ...
|
840
841
|
//calculate the metrics
|
8f96cac6
Jiaming Guo
pushed old changes
|
842
|
float FPR = GT.average(); // calculate the metrics
|
691fa079
David Mayerich
initial pass adap...
|
843
|
float FNR = T.average();
|
db598823
David Mayerich
fixed GCC errors ...
|
844
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
845
|
std::cout << "FNR: " << FPR << std::endl; // print false alarms and misses
|
db598823
David Mayerich
fixed GCC errors ...
|
846
847
848
|
std::cout << "FPR: " << FNR << std::endl;
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
849
850
|
// split and map two networks and fill the networks' R with metric information
void mapping(float sigma, int device, float threshold){
|
9627c6e6
Jiaming Guo
add splitting and...
|
851
|
|
f001495e
Jiaming Guo
fix minor errors ...
|
852
|
// compare and split two networks
|
21f03d55
Jiaming Guo
add functions for...
|
853
854
|
_GT.split(GT, T, sigma, device, threshold);
_T.split(T, GT, sigma, device, threshold);
|
9627c6e6
Jiaming Guo
add splitting and...
|
855
|
|
f001495e
Jiaming Guo
fix minor errors ...
|
856
|
// mapping two new splitted networks and get their edge relation
|
21f03d55
Jiaming Guo
add functions for...
|
857
858
|
_GT.mapping(_T, _gt_t, device, threshold);
_T.mapping(_GT, _t_gt, device, threshold);
|
9627c6e6
Jiaming Guo
add splitting and...
|
859
|
|
f001495e
Jiaming Guo
fix minor errors ...
|
860
|
// generate random color set based on the number of edges in GT
|
8f96cac6
Jiaming Guo
pushed old changes
|
861
862
|
size_t num = _gt_t.size(); // also create random color for unmapping edge, but won't be used though
colormap.resize(3 * num); // 3 portions compound RGB
|
5ac53c9e
Jiaming Guo
add keyboardfunc
|
863
|
for(int i = 0; i < 3 * num; i++)
|
8f96cac6
Jiaming Guo
pushed old changes
|
864
|
colormap[i] = rand()/(float)RAND_MAX; // set to [0, 1]
|
9627c6e6
Jiaming Guo
add splitting and...
|
865
866
|
//calculate the metrics
|
8f96cac6
Jiaming Guo
pushed old changes
|
867
|
float FPR = _GT.average(0); // calculate the metrics
|
9627c6e6
Jiaming Guo
add splitting and...
|
868
869
|
float FNR = _T.average(0);
|
8f96cac6
Jiaming Guo
pushed old changes
|
870
|
std::cout << "FNR: " << FPR << std::endl; // print false alarms and misses
|
9627c6e6
Jiaming Guo
add splitting and...
|
871
872
873
|
std::cout << "FPR: " << FNR << std::endl;
}
|
db598823
David Mayerich
fixed GCC errors ...
|
874
875
876
|
// 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
// Pranathi wrote this - saves network features to a CSV file
void features(std::string filename){
|
f86a38d3
Jiaming Guo
add device choice...
|
877
|
double avgL_t, avgL_gt, avgT_t, avgT_gt, avgB_t, avgB_gt, avgC_t, avgC_gt, avgFD_t, avgFD_gt;
|
db598823
David Mayerich
fixed GCC errors ...
|
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
|
unsigned int e_t, e_gt, b_gt, b_t;
avgL_gt = GT.Lengths();
avgT_gt = GT.Tortuosities();
avgL_t = T.Lengths();
avgT_t = T.Tortuosities();
avgB_gt = GT.BranchingIndex();
avgB_t = T.BranchingIndex();
avgC_gt = GT.Contractions();
avgFD_gt = GT.FractalDimensions();
avgC_t = T.Contractions();
avgFD_t = T.FractalDimensions();
e_gt = GT.EndP();
e_t = T.EndP();
b_gt = GT.BranchP();
b_t = T.BranchP();
std::ofstream myfile;
myfile.open (filename.c_str());
myfile << "Length, Tortuosity, Contraction, Fractal Dimension, Branch Points, End points, Branching Index, \n";
myfile << avgL_gt << "," << avgT_gt << "," << avgC_gt << "," << avgFD_gt << "," << b_gt << "," << e_gt << "," << avgB_gt <<std::endl;
myfile << avgL_t << "," << avgT_t << "," << avgC_t << "," << avgFD_t << "," << b_t << "," << e_t << "," << avgB_t <<std::endl;
myfile.close();
}
// Output an advertisement for the lab, authors, and usage information
void advertise(){
std::cout<<std::endl<<std::endl;
std::cout<<"========================================================================="<<std::endl;
std::cout<<"Thank you for using the NetMets network comparison tool!"<<std::endl;
std::cout<<"Scalable Tissue Imaging and Modeling (STIM) Lab, University of Houston"<<std::endl;
|
21f03d55
Jiaming Guo
add functions for...
|
907
|
std::cout<<"Developers: Pranathi Vemuri, David Mayerich, Jiaming Guo"<<std::endl;
|
9627c6e6
Jiaming Guo
add splitting and...
|
908
|
std::cout<<"Source: https://git.stim.ee.uh.edu/segmentation/netmets" <<std::endl;
|
db598823
David Mayerich
fixed GCC errors ...
|
909
910
|
std::cout<<"========================================================================="<<std::endl<<std::endl;
|
f86a38d3
Jiaming Guo
add device choice...
|
911
|
std::cout<<"usage: netmets file1 file2 --sigma 3"<<std::endl;
|
f001495e
Jiaming Guo
fix minor errors ...
|
912
|
std::cout<<" compare two .obj files with a tolerance of 3 (units defined by the network)"<<std::endl<<std::endl;
|
f86a38d3
Jiaming Guo
add device choice...
|
913
914
915
916
|
std::cout<<" netmets file1 --gui"<<std::endl;
std::cout<<" load a file and display it using OpenGL"<<std::endl<<std::endl;
std::cout<<" netmets file1 file2 --device 0"<<std::endl;
std::cout<<" compare two files using device 0 (if there isn't a gpu, use cpu)"<<std::endl<<std::endl;
|
21f03d55
Jiaming Guo
add functions for...
|
917
918
|
std::cout<<" netmets file1 file2 --mapping value"<<std::endl;
std::cout<<" mapping two files in random colors with a threshold of value"<<std::endl<<std::endl;
|
db598823
David Mayerich
fixed GCC errors ...
|
919
920
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
921
922
923
|
int main(int argc, char* argv[])
{
stim::arglist args; // create an instance of arglist
|
db598823
David Mayerich
fixed GCC errors ...
|
924
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
925
|
// add arguments
|
db598823
David Mayerich
fixed GCC errors ...
|
926
|
args.add("help", "prints this help");
|
f86a38d3
Jiaming Guo
add device choice...
|
927
|
args.add("sigma", "force a sigma value to specify the tolerance of the network comparison", "3");
|
db598823
David Mayerich
fixed GCC errors ...
|
928
|
args.add("gui", "display the network or network comparison using OpenGL");
|
f86a38d3
Jiaming Guo
add device choice...
|
929
|
args.add("device", "choose specific device to run", "0");
|
db598823
David Mayerich
fixed GCC errors ...
|
930
|
args.add("features", "save features to a CSV file, specify file name");
|
9627c6e6
Jiaming Guo
add splitting and...
|
931
|
args.add("mapping", "mapping input according to similarity");
|
8f96cac6
Jiaming Guo
pushed old changes
|
932
933
|
args.add("stack", "load the image stacks");
args.add("spacing", "spacing between pixel samples in each dimension", "1.0 1.0 1.0", "any real positive value");
|
db598823
David Mayerich
fixed GCC errors ...
|
934
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
935
|
args.parse(argc, argv); // parse the user arguments
|
db598823
David Mayerich
fixed GCC errors ...
|
936
|
|
8f96cac6
Jiaming Guo
pushed old changes
|
937
938
939
940
|
if(args["help"].is_set()){ // test for help
advertise(); // output the advertisement
std::cout<<args.str(); // output arguments
exit(1); // exit
|
db598823
David Mayerich
fixed GCC errors ...
|
941
942
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
943
944
|
if (args.nargs() >= 1) { // if at least one network file is specified
num_nets = 1; // set the number of networks to one
|
f001495e
Jiaming Guo
fix minor errors ...
|
945
|
std::vector<std::string> tmp = stim::parser::split(args.arg(0), '.'); // split the filename at '.'
|
8f96cac6
Jiaming Guo
pushed old changes
|
946
947
948
949
|
if ("swc" == tmp[1]) // loading swc file
GT.load_swc(args.arg(0)); // load the specified file as the ground truth
else if ("obj" == tmp[1]) // loading obj file
GT.load_obj(args.arg(0)); // load the specified file as the ground truth
|
f001495e
Jiaming Guo
fix minor errors ...
|
950
951
952
953
954
955
|
else {
std::cout << "Invalid loading file" << std::endl;
exit(1);
}
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
956
957
958
959
|
if (args.nargs() == 2) { // if two files are specified, they will be displayed in neighboring viewports and compared
int device = args["device"].as_int(); // get the device value from the user
num_nets = 2; // set the number of networks to two
sigma = args["sigma"].as_float(); // get the sigma value from the user
|
95850378
Jiaming Guo
add two good test...
|
960
|
std::vector<std::string> tmp = stim::parser::split(args.arg(1), '.'); // split the filename at '.'
|
8f96cac6
Jiaming Guo
pushed old changes
|
961
962
963
|
if ("swc" == tmp[1]) // loading swc files
T.load_swc(args.arg(1)); // load the second (test) network
else if ("obj" == tmp[1]) // loading obj files
|
95850378
Jiaming Guo
add two good test...
|
964
965
966
967
968
|
T.load_obj(args.arg(1));
else {
std::cout << "Invalid loading file" << std::endl;
exit(1);
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
969
|
if (args["features"].is_set()) // if the user wants to save features
|
540379da
Jiaming Guo
rewrite loading f...
|
970
|
features(args["features"].as_string());
|
8f96cac6
Jiaming Guo
pushed old changes
|
971
972
|
GT = GT.resample(resample_rate * sigma); // resample both networks based on the sigma value
|
540379da
Jiaming Guo
rewrite loading f...
|
973
974
975
|
T = T.resample(resample_rate * sigma);
if (args["mapping"].is_set()) {
float threshold = args["mapping"].as_float();
|
8f96cac6
Jiaming Guo
pushed old changes
|
976
977
|
mapping(sigma, device, threshold);
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
978
979
|
else
compare(sigma, device); // run the comparison algorithm
|
21f03d55
Jiaming Guo
add functions for...
|
980
|
}
|
8f96cac6
Jiaming Guo
pushed old changes
|
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
|
if (args["stack"].is_set()) {
S.load_images(args["stack"].as_string());
flag_stack = true;
}
float sp[3] = { 1.0f, 1.0f, 1.0f }; // allocate variables for grid spacing
if (args["spacing"].nargs() == 1) // if only one argument is given
sp[2] = (float)args["spacing"].as_float(0); // assume that it's the z coordinate (most often anisotropic)
else if (args["spacing"].nargs() == 3) { // if three arguments are given
sp[0] = (float)args["spacing"].as_float(0); // set the arguments as expected
sp[1] = (float)args["spacing"].as_float(1);
sp[2] = (float)args["spacing"].as_float(2);
}
S.spacing(sp[0], sp[1], sp[2]); // set the spacing between samples
planes[0] = S.size(0) / 4.0f; // initialize the start positions for the orthogonal display planes
planes[1] = S.size(1) / 4.0f;
planes[2] = S.size(2) / 4.0f;
|
db598823
David Mayerich
fixed GCC errors ...
|
1001
1002
|
//if a GUI is requested, display the network using OpenGL
|
9627c6e6
Jiaming Guo
add splitting and...
|
1003
|
if(args["gui"].is_set()){
|
21f03d55
Jiaming Guo
add functions for...
|
1004
|
if (args["mapping"].is_set()) {
|
8f96cac6
Jiaming Guo
pushed old changes
|
1005
1006
1007
1008
|
flag_mapping = true; // set flag of mapping to true
bb = _GT.boundingbox(); // generate a bounding volume
glut_initialize(); // create the GLUT window and set callback functions
glutMainLoop(); // enter GLUT event processing cycle
|
9627c6e6
Jiaming Guo
add splitting and...
|
1009
|
}
|
21f03d55
Jiaming Guo
add functions for...
|
1010
|
else {
|
8f96cac6
Jiaming Guo
pushed old changes
|
1011
1012
1013
|
bb = GT.boundingbox(); // generate a bounding volume
glut_initialize(); // create the GLUT window and set callback functions
glutMainLoop(); // enter GLUT event processing cycle
|
9627c6e6
Jiaming Guo
add splitting and...
|
1014
1015
|
}
}
|
db598823
David Mayerich
fixed GCC errors ...
|
1016
|
}
|