Commit c8864f86cdf0a6e1966eb1f6d1cc99eaf3a92dff
1 parent
761ebaa9
fixed light relevant
Showing
1 changed file
with
62 additions
and
28 deletions
Show diff stats
stim/visualization/gl_network.h
... | ... | @@ -45,10 +45,12 @@ public: |
45 | 45 | |
46 | 46 | ///render cylinder based on points from the top/bottom hat |
47 | 47 | ///@param C1 set of points from one of the hat |
48 | - void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2) { | |
48 | + void renderCylinder(std::vector< stim::vec3<T> > C1, std::vector< stim::vec3<T> > C2, stim::vec3<T> n1, stim::vec3<T> n2) { | |
49 | 49 | glBegin(GL_QUAD_STRIP); |
50 | 50 | for (unsigned i = 0; i < C1.size(); i++) { // for every point on the circle |
51 | + glNormal3f(n1[0], n1[1], n1[2]); | |
51 | 52 | glVertex3f(C1[i][0], C1[i][1], C1[i][2]); |
53 | + glNormal3f(n2[0], n2[1], n2[2]); | |
52 | 54 | glVertex3f(C2[i][0], C2[i][1], C2[i][2]); |
53 | 55 | } |
54 | 56 | glEnd(); |
... | ... | @@ -80,12 +82,10 @@ public: |
80 | 82 | T angle_xy = 0.0; |
81 | 83 | |
82 | 84 | glBegin(GL_QUADS); |
83 | - for (unsigned i = 0; i < slice; i++) // around the z-axis | |
84 | - { | |
85 | + for (unsigned i = 0; i < slice; i++) { // around the z-axis | |
85 | 86 | angle_z = i * step_z; // step step_z each time |
86 | 87 | |
87 | - for (unsigned j = 0; j < stack; j++) // along the z-axis | |
88 | - { | |
88 | + for (unsigned j = 0; j < stack; j++) { // along the z-axis | |
89 | 89 | angle_xy = j * step_xy; // step step_xy each time, draw floor by floor |
90 | 90 | |
91 | 91 | xx[0] = radius * std::sin(angle_z) * std::cos(angle_xy); // four vertices |
... | ... | @@ -104,8 +104,7 @@ public: |
104 | 104 | yy[3] = radius * std::sin(angle_z) * std::sin(angle_xy + step_xy); |
105 | 105 | zz[3] = radius * std::cos(angle_z); |
106 | 106 | |
107 | - for (unsigned k = 0; k < 4; k++) | |
108 | - { | |
107 | + for (unsigned k = 0; k < 4; k++) { | |
109 | 108 | glVertex3f(x + xx[k], y + yy[k], z + zz[k]); // draw the floor plane |
110 | 109 | } |
111 | 110 | } |
... | ... | @@ -162,21 +161,23 @@ public: |
162 | 161 | if (!glIsList(dlist)) { // if dlist isn't a display list, create it |
163 | 162 | dlist = glGenLists(1); // generate a display list |
164 | 163 | glNewList(dlist, GL_COMPILE); // start a new display list |
165 | - glEnable(GL_COLOR_MATERIAL); | |
166 | - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); | |
167 | 164 | for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network |
168 | 165 | for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge |
169 | 166 | stim::circle<T> C1 = E[e].circ(p - 1); |
170 | 167 | stim::circle<T> C2 = E[e].circ(p); |
171 | - C1.set_R(2*radius); // scale the circle to the same | |
168 | + C1.set_R(2*radius); // re-scale the circle to the same | |
172 | 169 | C2.set_R(2*radius); |
173 | - std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); | |
170 | + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);// get 20 points on the circle plane | |
174 | 171 | std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); |
172 | + stim::vec3<T> n1 = C1.n(); // get the normal vector | |
173 | + stim::vec3<T> n2 = C2.n(); | |
175 | 174 | glBegin(GL_QUAD_STRIP); |
176 | 175 | for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle) |
177 | 176 | glTexCoord1f(E[e].r(p - 1)); |
177 | + glNormal3f(n1[0], n1[1], n1[2]); // set normal vector for lighting | |
178 | 178 | glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]); |
179 | 179 | glTexCoord1f(E[e].r(p)); |
180 | + glNormal3f(n2[0], n2[1], n2[2]); | |
180 | 181 | glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]); |
181 | 182 | } |
182 | 183 | glEnd(); |
... | ... | @@ -185,11 +186,17 @@ public: |
185 | 186 | for (unsigned n = 0; n < V.size(); n++) { |
186 | 187 | size_t num = V[n].e[0].size(); // store the number of outgoing edge of that vertex |
187 | 188 | 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 | |
189 | + unsigned idx = V[n].e[0][0]; // find the index of first outgoing edge of that vertex | |
190 | + stim::circle<T> C = E[idx].circ(0); | |
191 | + stim::vec3<T> normal = C.n(); | |
192 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
189 | 193 | glTexCoord1f(E[idx].r(0)); // bind the texture as metric of first point on that edge |
190 | 194 | } |
191 | 195 | else { |
192 | 196 | unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex |
197 | + stim::circle<T> C = E[idx].circ(E[idx].size()-1); | |
198 | + stim::vec3<T> normal = C.n(); | |
199 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
193 | 200 | glTexCoord1f(E[idx].r(E[idx].size() - 1)); // bind the texture as metric of last point on that edge |
194 | 201 | } |
195 | 202 | renderBall(V[n][0], V[n][1], V[n][2], 2*radius, 20, 20); |
... | ... | @@ -247,51 +254,78 @@ public: |
247 | 254 | glDeleteLists(dlist+2, 1); |
248 | 255 | if (!glIsList(dlist+2)) { // if dlist isn't a display list, create it |
249 | 256 | glNewList(dlist+2, GL_COMPILE); // start a new display list |
250 | - glEnable(GL_COLOR_MATERIAL); | |
251 | - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); | |
252 | 257 | for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network |
253 | 258 | if (map[e] != unsigned(-1)) { |
254 | - if(I == 0) // if it is to render GT | |
259 | + if (I == 0) { // if it is to render GT | |
255 | 260 | glColor3f(colormap[e * 3 + 0], colormap[e * 3 + 1], colormap[e * 3 + 2]); |
256 | - else // if it is to render T | |
261 | + } | |
262 | + else { // if it is to render T | |
257 | 263 | glColor3f(colormap[map[e] * 3 + 0], colormap[map[e] * 3 + 1], colormap[map[e] * 3 + 2]); |
264 | + } | |
258 | 265 | |
259 | 266 | for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge |
260 | 267 | stim::circle<T> C1 = E[e].circ(p - 1); |
261 | 268 | stim::circle<T> C2 = E[e].circ(p); |
262 | - C1.set_R(2*radius); // scale the circle to the same | |
269 | + C1.set_R(2*radius); // re-scale the circle to the same | |
263 | 270 | C2.set_R(2*radius); |
264 | 271 | std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); |
265 | 272 | std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); |
266 | - renderCylinder(Cp1, Cp2); | |
273 | + stim::vec3<T> n1 = C1.n(); // get the normal vector | |
274 | + stim::vec3<T> n2 = C2.n(); | |
275 | + renderCylinder(Cp1, Cp2, n1, n2); | |
267 | 276 | } |
268 | 277 | } |
269 | 278 | 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 | |
279 | + glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges | |
280 | + for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge | |
272 | 281 | stim::circle<T> C1 = E[e].circ(p - 1); |
273 | 282 | stim::circle<T> C2 = E[e].circ(p); |
274 | 283 | C1.set_R(2*radius); // scale the circle to the same |
275 | 284 | C2.set_R(2*radius); |
276 | 285 | std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20); |
277 | 286 | std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20); |
278 | - renderCylinder(Cp1, Cp2); | |
287 | + stim::vec3<T> n1 = C1.n(); // get the normal vector | |
288 | + stim::vec3<T> n2 = C2.n(); | |
289 | + renderCylinder(Cp1, Cp2, n1, n2); | |
279 | 290 | } |
280 | 291 | } |
281 | 292 | } |
282 | - for (unsigned v = 0; v < V.size(); v++) { | |
283 | - size_t num_edge = V[v].e[0].size() + V[v].e[1].size(); | |
293 | + for (unsigned n = 0; n < V.size(); n++) { | |
294 | + size_t num_edge = V[n].e[0].size() + V[n].e[1].size(); | |
284 | 295 | 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); | |
296 | + if (V[n].e[0].size() != 0) { | |
297 | + unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex | |
298 | + stim::circle<T> C = E[idx].circ(0); | |
299 | + stim::vec3<T> normal = C.n(); | |
300 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
301 | + } | |
302 | + else { | |
303 | + unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex | |
304 | + stim::circle<T> C = E[idx].circ(E[idx].size() - 1); | |
305 | + stim::vec3<T> normal = C.n(); | |
306 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
307 | + } | |
308 | + glColor3f(0.3, 0.3, 0.3); // gray | |
309 | + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20); | |
287 | 310 | } |
288 | 311 | else { // if it is the terminal vertex |
312 | + if (V[n].e[0].size() != 0) { | |
313 | + unsigned idx = V[n].e[0][0]; // find the index of first incoming edge of that vertex | |
314 | + stim::circle<T> C = E[idx].circ(0); | |
315 | + stim::vec3<T> normal = C.n(); | |
316 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
317 | + } | |
318 | + else { | |
319 | + unsigned idx = V[n].e[1][0]; // find the index of first incoming edge of that vertex | |
320 | + stim::circle<T> C = E[idx].circ(E[idx].size() - 1); | |
321 | + stim::vec3<T> normal = C.n(); | |
322 | + glNormal3f(normal[0], normal[1], normal[2]);// for every ball, we only have one normal vector | |
323 | + } | |
289 | 324 | 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); | |
325 | + renderBall(V[n][0], V[n][1], V[n][2], 3*radius, 20, 20); | |
291 | 326 | } |
292 | 327 | } |
293 | 328 | glEndList(); |
294 | - glDisable(GL_COLOR_MATERIAL); | |
295 | 329 | } |
296 | 330 | glCallList(dlist+2); |
297 | 331 | } |
... | ... | @@ -319,7 +353,7 @@ public: |
319 | 353 | glEnd(); |
320 | 354 | } |
321 | 355 | else { |
322 | - glColor3f(1.0, 1.0, 1.0); // white color | |
356 | + glColor3f(0.2, 0.0, 0.0); // red color for the un-mapping edges | |
323 | 357 | glBegin(GL_LINE_STRIP); |
324 | 358 | for (unsigned p = 0; p < E[e].size(); p++) { |
325 | 359 | glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); | ... | ... |