Commit 9f3f0602e8e8103738a19ef0ad1562c150fad6ca
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]); | ... | ... |