Commit 9f3f0602e8e8103738a19ef0ad1562c150fad6ca

Authored by David Mayerich
2 parents 9bfae4d0 42d38546

Merge branch 'JACK' into 'master'

fixed light relevant

See merge request !28
Showing 1 changed file with 83 additions and 29 deletions   Show diff stats
stim/visualization/gl_network.h
... ... @@ -47,12 +47,30 @@ public:
47 47 ///@param C1 set of points from one of the hat
48 48 void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2) {
49 49 glBegin(GL_QUAD_STRIP);
50   - for (unsigned i = 0; i < C1.size(); i++) { // for every point on the circle
  50 + for (unsigned i = 0; i < C1.size() - 1; i++) { // for every point on the circle
  51 + stim::vec3<T> v1;
  52 + stim::vec3<T> v2;
  53 + stim::vec3<T> v3;
  54 + stim::vec3<T> v4;
  55 +
  56 + v1 = C2[i + 1] - C1[i + 1];
  57 + v2 = C1[i] - C1[i + 1];
  58 + v3 = C1[i] - C2[i];
  59 + v4 = C2[i + 1] - C2[i];
  60 +
  61 + stim::vec3<T> n1 = v1.cross(v2);
  62 + stim::vec3<T> n2 = v3.cross(v4);
  63 + stim::vec3<T> normal = n1 + n2;
  64 + normal = normal.norm();
51 65 glVertex3f(C1[i][0], C1[i][1], C1[i][2]);
52 66 glVertex3f(C2[i][0], C2[i][1], C2[i][2]);
  67 + glNormal3f(normal[0], normal[1], normal[2]); // set normal vector for lighting
  68 + //glNormal3f(n1[0], n1[1], n1[2]);
  69 + //glVertex3f(C1[i][0], C1[i][1], C1[i][2]);
  70 + //glNormal3f(n2[0], n2[1], n2[2]);
  71 + //glVertex3f(C2[i][0], C2[i][1], C2[i][2]);
53 72 }
54 73 glEnd();
55   - //glFlush();
56 74 }
57 75  
58 76 ///render the vertex as sphere based on glut build-in function
... ... @@ -80,12 +98,10 @@ public:
80 98 T angle_xy = 0.0;
81 99  
82 100 glBegin(GL_QUADS);
83   - for (unsigned i = 0; i < slice; i++) // around the z-axis
84   - {
  101 + for (unsigned i = 0; i < slice; i++) { // around the z-axis
85 102 angle_z = i * step_z; // step step_z each time
86 103  
87   - for (unsigned j = 0; j < stack; j++) // along the z-axis
88   - {
  104 + for (unsigned j = 0; j < stack; j++) { // along the z-axis
89 105 angle_xy = j * step_xy; // step step_xy each time, draw floor by floor
90 106  
91 107 xx[0] = radius * std::sin(angle_z) * std::cos(angle_xy); // four vertices
... ... @@ -104,8 +120,8 @@ public:
104 120 yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy);
105 121 zz[3] = radius * std::cos(angle_z);
106 122  
107   - for (unsigned k = 0; k < 4; k++)
108   - {
  123 +
  124 + for (unsigned k = 0; k < 4; k++) {
109 125 glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane
110 126 }
111 127 }
... ... @@ -162,30 +178,51 @@ public:
162 178 if (!glIsList(dlist)) { // if dlist isn't a display list, create it
163 179 dlist = glGenLists(1); // generate a display list
164 180 glNewList(dlist, GL_COMPILE); // start a new display list
165   - glEnable(GL_COLOR_MATERIAL);
166   - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
167 181 for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
168 182 for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
169 183 stim::circle<T> C1 = E[e].circ(p - 1);
170 184 stim::circle<T> C2 = E[e].circ(p);
171   - C1.set_R(2*radius); // scale the circle to the same
  185 + C1.set_R(2*radius); // re-scale the circle to the same
172 186 C2.set_R(2*radius);
173   - std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
174   - std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
  187 + std::vector< stim::vec3<T> > Cp1 = C1.glpoints(20);// get 20 points on the circle plane
  188 + std::vector< stim::vec3<T> > Cp2 = C2.glpoints(20);
175 189 glBegin(GL_QUAD_STRIP);
176   - for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle)
  190 + for (unsigned i = 0; i < Cp1.size() - 1; i++) {
  191 + stim::vec3<T> v1;
  192 + stim::vec3<T> v2;
  193 + stim::vec3<T> v3;
  194 + stim::vec3<T> v4;
  195 + v1 = Cp2[i + 1] - Cp1[i + 1];
  196 + v2 = Cp1[i] - Cp1[i + 1];
  197 + v3 = Cp1[i] - Cp2[i];
  198 + v4 = Cp2[i + 1] - Cp2[i];
  199 +
  200 + stim::vec3<T> n1 = v1.cross(v2);
  201 + stim::vec3<T> n2 = v3.cross(v4);
  202 + stim::vec3<T> normal = n1;
  203 + normal = normal.norm();
  204 +
177 205 glTexCoord1f(E[e].r(p - 1));
178 206 glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);
179 207 glTexCoord1f(E[e].r(p));
180 208 glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);
  209 + glNormal3f(normal[0], normal[1], normal[2]); // set normal vector for lighting
181 210 }
  211 + //for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle)
  212 + // glTexCoord1f(E[e].r(p - 1));
  213 + // glNormal3f(n1[0], n1[1], n1[2]); // set normal vector for lighting
  214 + // glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);
  215 + // glTexCoord1f(E[e].r(p));
  216 + // glNormal3f(n2[0], n2[1], n2[2]);
  217 + // glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);
  218 + //}
182 219 glEnd();
183 220 } // set the texture coordinate based on the specified magnitude index
184 221 }
185 222 for (unsigned n = 0; n < V.size(); n++) {
186 223 size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex
187 224 if (num != 0) { // if it has outgoing edge
188   - unsigned idx = V[n].e[0][0]; // find the index of first outgoing edge of that vertex
  225 + unsigned idx = V[n].e[0][0]; // find the index of first outgoing edge of that vertex
189 226 glTexCoord1f(E[idx].r(0)); // bind the texture as metric of first point on that edge
190 227 }
191 228 else {
... ... @@ -247,19 +284,19 @@ public:
247 284 glDeleteLists(dlist+2, 1);
248 285 if (!glIsList(dlist+2)) { // if dlist isn't a display list, create it
249 286 glNewList(dlist+2, GL_COMPILE); // start a new display list
250   - glEnable(GL_COLOR_MATERIAL);
251   - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
252 287 for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
253 288 if (map[e] != unsigned(-1)) {
254   - if(I == 0) // if it is to render GT
  289 + if (I == 0) { // if it is to render GT
255 290 glColor3f(colormap[e * 3 + 0], colormap[e * 3 + 1], colormap[e * 3 + 2]);
256   - else // if it is to render T
  291 + }
  292 + else { // if it is to render T
257 293 glColor3f(colormap[map[e] * 3 + 0], colormap[map[e] * 3 + 1], colormap[map[e] * 3 + 2]);
  294 + }
258 295  
259 296 for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
260 297 stim::circle<T> C1 = E[e].circ(p - 1);
261 298 stim::circle<T> C2 = E[e].circ(p);
262   - C1.set_R(2*radius); // scale the circle to the same
  299 + C1.set_R(2*radius); // re-scale the circle to the same
263 300 C2.set_R(2*radius);
264 301 std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
265 302 std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
... ... @@ -267,8 +304,8 @@ public:
267 304 }
268 305 }
269 306 else {
270   - glColor3f(1.0f, 1.0f, 1.0f); // white color for the un-mapping edges
271   - for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
  307 + glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges
  308 + for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
272 309 stim::circle<T> C1 = E[e].circ(p - 1);
273 310 stim::circle<T> C2 = E[e].circ(p);
274 311 C1.set_R(2*radius); // scale the circle to the same
... ... @@ -279,19 +316,36 @@ public:
279 316 }
280 317 }
281 318 }
282   - for (unsigned v = 0; v < V.size(); v++) {
283   - size_t num_edge = V[v].e[0].size() + V[v].e[1].size();
  319 + for (unsigned n = 0; n < V.size(); n++) {
  320 + size_t num_edge = V[n].e[0].size() + V[n].e[1].size();
284 321 if (num_edge > 1) { // if it is the joint vertex
285   - glColor3f(0.3, 0.3, 0.3); // gray color
286   - renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20, 20);
  322 + if (V[n].e[0].size() != 0) {
  323 + unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex
  324 + stim::circle<T> C = E[idx].circ(0);
  325 + stim::vec3<T> normal = C.n();
  326 + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector
  327 + }
  328 + else {
  329 + unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
  330 + stim::circle<T> C = E[idx].circ(E[idx].size() - 1);
  331 + stim::vec3<T> normal = C.n();
  332 + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector
  333 + }
  334 + glColor3f(0.3, 0.3, 0.3); // gray
  335 + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20);
287 336 }
288 337 else { // if it is the terminal vertex
  338 + if (V[n].e[0].size() != 0) {
  339 + unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex
  340 + }
  341 + else {
  342 + unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex
  343 + }
289 344 glColor3f(0.6, 0.6, 0.6); // more white gray
290   - renderBall(V[v][0], V[v][1], V[v][2], 3*radius, 20, 20);
  345 + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20);
291 346 }
292 347 }
293 348 glEndList();
294   - glDisable(GL_COLOR_MATERIAL);
295 349 }
296 350 glCallList(dlist+2);
297 351 }
... ... @@ -319,7 +373,7 @@ public:
319 373 glEnd();
320 374 }
321 375 else {
322   - glColor3f(1.0, 1.0, 1.0); // white color
  376 + glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges
323 377 glBegin(GL_LINE_STRIP);
324 378 for (unsigned p = 0; p < E[e].size(); p++) {
325 379 glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]);
... ...