Commit c8864f86cdf0a6e1966eb1f6d1cc99eaf3a92dff

Authored by Jiaming Guo
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]);
... ...