Commit b745544ec121473fcd351a5a890d4d2ff1ffeb49
Merge branch 'JACK' into 'master'
Jack See merge request !10
Showing
1 changed file
with
144 additions
and
28 deletions
Show diff stats
main.cu
... | ... | @@ -67,16 +67,18 @@ std::vector<float> colormap; |
67 | 67 | // special key indicator |
68 | 68 | int mods; |
69 | 69 | |
70 | -// create display lists | |
71 | -GLuint dlist1; | |
72 | -GLuint dlist2; | |
73 | - | |
74 | 70 | //OpenGL objects |
75 | 71 | GLuint cmap_tex = 0; //texture name for the color map |
76 | 72 | |
77 | 73 | float delta; |
78 | 74 | float sigma = 3; //default sigma |
79 | 75 | float radius = 3; //equals to radius |
76 | +int adjoint_fac = 0; | |
77 | +int light_fac = 0; | |
78 | + | |
79 | +//light position | |
80 | +stim::vec3<float> l1(0.0, 0.0, 0.0); | |
81 | +stim::vec3<float> l2(0.0, 0.0, 0.0); | |
80 | 82 | |
81 | 83 | //sets an OpenGL viewport taking up the entire window |
82 | 84 | void glut_render_single_projection(){ |
... | ... | @@ -128,6 +130,50 @@ void glut_render_modelview(){ |
128 | 130 | //draws the network(s) |
129 | 131 | void glut_render(void) { |
130 | 132 | |
133 | + // light | |
134 | + stim::vec3<float> eye = cam.getPosition(); //get the camera position (eye point) | |
135 | + if (l1[0] + l1[1] + l1[2] + l2[0] + l2[1] + l2[2] == 0) { | |
136 | + stim::vec3<float> s = bb.size(); | |
137 | + | |
138 | + l1[0] = eye[0] + s[0] / 2; | |
139 | + l1[1] = eye[1] + s[1] / 2; | |
140 | + l1[2] = eye[2] + s[2] / 2; | |
141 | + l2[0] = eye[0] - s[0] / 2; | |
142 | + l2[1] = eye[1] - s[1] / 2; | |
143 | + l2[2] = eye[2] - s[2] / 2; | |
144 | + } | |
145 | + | |
146 | + GLfloat global_ambient[] = { 0.3, 0.3, 0.3, 1.0 }; | |
147 | + GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 }; | |
148 | + GLfloat diffuse1[] = { 0.6, 0.6, 0.6, 1.0 }; | |
149 | + GLfloat diffuse2[] = { 0.4, 0.4, 0.4, 1.0 }; | |
150 | + GLfloat specular[] = { 0.6, 0.6, 0.6, 1.0 }; | |
151 | + GLfloat position1[] = { l1[0], l1[1], 50, 0.0 }; // upper right light source | |
152 | + GLfloat position2[] = { l2[0], l2[1], 0, 0.0 }; // lower left light source | |
153 | + GLfloat position[] = { eye[0], eye[1], 50, 1.0 }; | |
154 | + | |
155 | + glClearColor(0.0, 0.0, 0.0, 1.0); | |
156 | + glShadeModel(GL_SMOOTH); | |
157 | + | |
158 | + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient); | |
159 | + | |
160 | + glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); | |
161 | + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse1); | |
162 | + glLightfv(GL_LIGHT0, GL_SPECULAR, specular); | |
163 | + glLightfv(GL_LIGHT0, GL_POSITION, position1); | |
164 | + | |
165 | + glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); | |
166 | + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse2); | |
167 | + glLightfv(GL_LIGHT1, GL_SPECULAR, specular); | |
168 | + glLightfv(GL_LIGHT1, GL_POSITION, position2); | |
169 | + | |
170 | + glLightfv(GL_LIGHT2, GL_AMBIENT, ambient); | |
171 | + glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuse1); | |
172 | + glLightfv(GL_LIGHT2, GL_SPECULAR, specular); | |
173 | + glLightfv(GL_LIGHT2, GL_POSITION, position); | |
174 | + | |
175 | + glEnable(GL_COLOR_MATERIAL); | |
176 | + | |
131 | 177 | //no mapping, just comparing |
132 | 178 | if (ind == 0) { |
133 | 179 | if (num_nets == 1) { //if a single network is loaded |
... | ... | @@ -136,23 +182,41 @@ void glut_render(void) { |
136 | 182 | glut_render_modelview(); //set up the modelview matrix with camera details |
137 | 183 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen |
138 | 184 | GT.glCenterline0(); //render the GT network (the only one loaded) |
185 | + glDisable(GL_DEPTH_TEST); | |
139 | 186 | } |
140 | 187 | |
141 | 188 | if (num_nets == 2) { //if two networks are loaded |
189 | + glEnable(GL_TEXTURE_1D); //enable texture mapping | |
190 | + if (light_fac == 0) | |
191 | + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | |
192 | + else | |
193 | + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | |
194 | + glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | |
195 | + | |
142 | 196 | glEnable(GL_DEPTH_TEST); //enable depth |
143 | 197 | glut_render_left_projection(); //set up a projection for the left half of the window |
144 | 198 | glut_render_modelview(); //set up the modelview matrix using camera details |
145 | 199 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen |
146 | 200 | |
147 | - glEnable(GL_TEXTURE_1D); //enable texture mapping | |
148 | - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | |
149 | - glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | |
150 | - | |
151 | 201 | GT.glCylinder(sigma, radius); //render the GT network |
202 | + if (adjoint_fac == 1) { | |
203 | + glDisable(GL_TEXTURE_1D); //disable texture in order to render in other color | |
204 | + glEnable(GL_BLEND); //enable color blend | |
205 | + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set blend function | |
206 | + glDisable(GL_DEPTH_TEST); //should disable depth to render transparancy | |
207 | + glColor4f(0.0f, 0.3f, 0.0f, 0.2f); | |
208 | + T.glAdjointCylinder(sigma, radius); | |
209 | + glDisable(GL_BLEND); | |
210 | + glEnable(GL_DEPTH_TEST); | |
211 | + glEnable(GL_TEXTURE_1D); | |
212 | + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |
213 | + } | |
152 | 214 | |
153 | 215 | glut_render_right_projection(); //set up a projection for the right half of the window |
154 | 216 | glut_render_modelview(); //set up the modelview matrix using camera details |
217 | + | |
155 | 218 | T.glCylinder(sigma, radius); //render the T network |
219 | + | |
156 | 220 | sigma = radius; // set sigma equal to radius |
157 | 221 | } |
158 | 222 | } |
... | ... | @@ -165,20 +229,37 @@ void glut_render(void) { |
165 | 229 | } |
166 | 230 | if (num_nets == 2) { //if two networks are loaded |
167 | 231 | if (compareMode) { |
232 | + glEnable(GL_TEXTURE_1D); //enable texture mapping | |
233 | + if (light_fac == 0) | |
234 | + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | |
235 | + else | |
236 | + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);//map light to texture | |
237 | + glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | |
238 | + | |
168 | 239 | glEnable(GL_DEPTH_TEST); //enable depth |
169 | 240 | glut_render_left_projection(); //set up a projection for the left half of the window |
170 | 241 | glut_render_modelview(); //set up the modelview matrix using camera details |
171 | 242 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen |
172 | 243 | |
173 | - glEnable(GL_TEXTURE_1D); //enable texture mapping | |
174 | - glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //texture map will be used as the network color | |
175 | - glBindTexture(GL_TEXTURE_1D, cmap_tex); //bind the Brewer texture map | |
176 | - | |
177 | 244 | _GT.glCylinder(sigma, radius); //render the GT network |
245 | + if (adjoint_fac == 1) { | |
246 | + glDisable(GL_TEXTURE_1D); //temporarily disable texture | |
247 | + glEnable(GL_BLEND); //enable color blend | |
248 | + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set blend function | |
249 | + glDisable(GL_DEPTH_TEST); //should disable depth | |
250 | + glColor4f(0.0f, 0.3f, 0.0f, 0.2f); | |
251 | + _T.glAdjointCylinder(sigma, radius); | |
252 | + glDisable(GL_BLEND); | |
253 | + glEnable(GL_DEPTH_TEST); | |
254 | + glEnable(GL_TEXTURE_1D); //re-enable texture | |
255 | + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |
256 | + } | |
178 | 257 | |
179 | 258 | glut_render_right_projection(); //set up a projection for the right half of the window |
180 | 259 | glut_render_modelview(); //set up the modelview matrix using camera details |
260 | + | |
181 | 261 | _T.glCylinder(sigma, radius); //render the T network |
262 | + | |
182 | 263 | sigma = radius; //set sigma equal to radius |
183 | 264 | } |
184 | 265 | else { |
... | ... | @@ -186,18 +267,20 @@ void glut_render(void) { |
186 | 267 | glut_render_left_projection(); //set up a projection for the left half of the window |
187 | 268 | glut_render_modelview(); //set up the modelview matrix using camera details |
188 | 269 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear the screen |
189 | - | |
190 | - //_GT.glRandColorCenterlineGT(dlist1, _gt_t, colormap); | |
191 | - _GT.glRandColorCylinder1(dlist1, _gt_t, colormap, sigma, radius); | |
270 | + | |
271 | + _GT.glRandColorCylinder(0, _gt_t, colormap, sigma, radius); | |
192 | 272 | |
193 | 273 | glut_render_right_projection(); //set up a projection for the right half of the window |
194 | 274 | glut_render_modelview(); //set up the modelview matrix using camera details |
195 | - //_T.glRandColorCenterlineT(dlist2, _t_gt, colormap); | |
196 | - _T.glRandColorCylinder2(dlist2, _t_gt, colormap, sigma, radius); | |
275 | + | |
276 | + _T.glRandColorCylinder(1, _t_gt, colormap, sigma, radius); | |
277 | + | |
197 | 278 | sigma = radius; //set sigma equal to radius |
198 | 279 | } |
199 | 280 | } |
200 | 281 | } |
282 | + glDisable(GL_DEPTH_TEST); | |
283 | + glDisable(GL_TEXTURE_1D); | |
201 | 284 | |
202 | 285 | if (num_nets == 2) { // works only with two networks |
203 | 286 | std::ostringstream ss; |
... | ... | @@ -206,27 +289,34 @@ void glut_render(void) { |
206 | 289 | else |
207 | 290 | ss << "Compare Mode"; // default mode is compare mode |
208 | 291 | |
209 | - glDisable(GL_TEXTURE_1D); | |
210 | - glMatrixMode(GL_PROJECTION); // set up the 2d viewport for mode text printing | |
292 | + if (light_fac == 1) | |
293 | + glDisable(GL_LIGHTING); | |
294 | + glMatrixMode(GL_PROJECTION); // set up the 2d viewport for mode text printing | |
211 | 295 | glPushMatrix(); |
212 | 296 | glLoadIdentity(); |
213 | - int X = glutGet(GLUT_WINDOW_WIDTH); // get the current window width | |
214 | - int Y = glutGet(GLUT_WINDOW_HEIGHT); // get the current window height | |
215 | - glViewport(0, 0, X / 2, Y); // locate to left bottom corner | |
216 | - gluOrtho2D(0, X, 0, Y); // define othogonal aspect | |
217 | - glColor3f(0.0, 1.0, 0.0); // using green to show mode | |
297 | + int X = glutGet(GLUT_WINDOW_WIDTH); // get the current window width | |
298 | + int Y = glutGet(GLUT_WINDOW_HEIGHT); // get the current window height | |
299 | + glViewport(0, 0, X / 2, Y); // locate to left bottom corner | |
300 | + gluOrtho2D(0, X, 0, Y); // define othogonal aspect | |
301 | + glColor3f(0.8, 0.0, 0.0); // using red to show mode | |
218 | 302 | |
219 | 303 | glMatrixMode(GL_MODELVIEW); |
220 | 304 | glPushMatrix(); |
221 | 305 | glLoadIdentity(); |
222 | 306 | |
223 | - glRasterPos2f(0, 5); //print text in the left bottom corner | |
307 | + glRasterPos2f(0, 5); //print text in the left bottom corner | |
224 | 308 | glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24, (const unsigned char*)(ss.str().c_str())); |
225 | 309 | |
226 | 310 | glPopMatrix(); |
227 | 311 | glMatrixMode(GL_PROJECTION); |
228 | 312 | glPopMatrix(); |
313 | + glColor3f(1.0, 1.0, 1.0); //clear red color | |
314 | + if (light_fac == 1) | |
315 | + glEnable(GL_LIGHTING); | |
229 | 316 | } |
317 | + | |
318 | + glDisable(GL_COLOR_MATERIAL); | |
319 | + | |
230 | 320 | glutSwapBuffers(); |
231 | 321 | } |
232 | 322 | |
... | ... | @@ -331,12 +421,12 @@ void glut_keyboard(unsigned char key, int x, int y){ |
331 | 421 | switch (key) { |
332 | 422 | |
333 | 423 | // 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 | |
424 | + case 'm': // if keyboard 'm' is pressed, then change render mode | |
425 | + if (compareMode && !mappingMode && ind && !adjoint_fac) { // if current mode is comparing mode | |
336 | 426 | compareMode = false; |
337 | 427 | mappingMode = true; |
338 | 428 | } |
339 | - else if (!compareMode && mappingMode && ind) { // if current mode is mapping mode | |
429 | + else if (!compareMode && mappingMode && ind && !adjoint_fac) { // if current mode is mapping mode | |
340 | 430 | compareMode = true; |
341 | 431 | mappingMode = false; |
342 | 432 | } |
... | ... | @@ -363,6 +453,32 @@ void glut_keyboard(unsigned char key, int x, int y){ |
363 | 453 | radius = 0.2; |
364 | 454 | break; |
365 | 455 | |
456 | + // turn on/off the light | |
457 | + case 'l': // if keyboard 'l' is pressed, then change the light | |
458 | + if (!light_fac && !adjoint_fac) { | |
459 | + light_fac = 1; | |
460 | + glEnable(GL_LIGHTING); | |
461 | + glEnable(GL_LIGHT0); | |
462 | + glEnable(GL_LIGHT1); | |
463 | + glEnable(GL_LIGHT2); | |
464 | + } | |
465 | + else if (light_fac && !adjoint_fac) { | |
466 | + light_fac = 0; | |
467 | + glDisable(GL_LIGHTING); | |
468 | + glDisable(GL_LIGHT0); | |
469 | + glDisable(GL_LIGHT1); | |
470 | + glDisable(GL_LIGHT2); | |
471 | + } | |
472 | + break; | |
473 | + | |
474 | + // render a transparant T very close to GT in compare mode | |
475 | + case 32: // if keyboard 'SPACE' is pressed, then change the adjoint_fac | |
476 | + if (!adjoint_fac && compareMode && !light_fac) | |
477 | + adjoint_fac = 1; | |
478 | + else if(adjoint_fac && compareMode && !light_fac) | |
479 | + adjoint_fac = 0; | |
480 | + break; | |
481 | + | |
366 | 482 | // close window and exit application |
367 | 483 | case 27: // if keyboard 'ESC' is pressed, then exit |
368 | 484 | exit(0); | ... | ... |