Commit b745544ec121473fcd351a5a890d4d2ff1ffeb49

Authored by David Mayerich
2 parents 86a4e373 c62540c7

Merge branch 'JACK' into 'master'

Jack

See merge request !10
Showing 1 changed file with 144 additions and 28 deletions   Show diff stats
... ... @@ -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);
... ...