Commit 30b20d4f70ec82f20ac2c39e70977cae823b453d

Authored by Jiaming Guo
1 parent ff4ee63d

make it render better for both swc and obj files

stim/biomodels/network.h
... ... @@ -144,7 +144,7 @@ protected:
144 144  
145 145 std::vector<edge> E; //list of edges
146 146 std::vector<vertex> V; //list of vertices.
147   - std::vector<int> NT; //stores a list of neuronal type for each point in the centerline (will set value only when centerline is built from swc file)
  147 + //std::vector<int> NT; //stores a list of neuronal type for each point in the centerline (will set value only when centerline is built from swc file)
148 148  
149 149 public:
150 150  
... ... @@ -396,11 +396,11 @@ public:
396 396 S.load(filename); // load the node information
397 397 S.create_tree(); // link those node according to their linking relationships as a tree
398 398  
399   - NT.push_back(S.node[0].type); // set the neuronal_type value to the first vertex in the network
  399 + //NT.push_back(S.node[0].type); // set the neuronal_type value to the first vertex in the network
400 400 std::vector<unsigned> id2vert; // this list stores the SWC vertex ID associated with each network vertex
401 401 unsigned i[2]; // temporary, IDs associated with the first and last points
402 402 for (unsigned int l = 1; l < S.numL(); l++) { // for every node starts from second one
403   - NT.push_back(S.node[l].type);
  403 + //NT.push_back(S.node[l].type);
404 404 stim::centerline<T> c3(2); // every fiber contains two vertices
405 405 int p_idx = S.node[l].parent_idx - 1; // get the parent node loop idx of current node
406 406 c3[0] = S.node[p_idx].point; // store the begin vertex
... ... @@ -479,7 +479,7 @@ public:
479 479 stim::network<T> resample(T spacing){
480 480 stim::network<T> n; //create a new network that will be an exact copy, with resampled fibers
481 481 n.V = V; //copy all vertices
482   - n.NT = NT; //copy all the neuronal type information
  482 + //n.NT = NT; //copy all the neuronal type information
483 483 n.E.resize(edges()); //allocate space for the edge list
484 484  
485 485 //copy all fibers, resampling them in the process
... ... @@ -820,7 +820,7 @@ public:
820 820 V[V.size() - 1].e[0].push_back((unsigned)E.size() - 1); // push second half edge to the outgoing of new vertex
821 821 for(unsigned i = 0; i < V[tmp.v[1]].e[1].size(); i++) // find the incoming edge of original ending vertex
822 822 if(V[tmp.v[1]].e[1][i] == e)
823   - V[tmp.v[1]].e[1][i] = (unsigned)V.size() - 1;
  823 + V[tmp.v[1]].e[1][i] = (unsigned)E.size() - 1; // set to new edge
824 824 }
825 825 }
826 826 }
... ...
stim/math/circle.h
... ... @@ -193,9 +193,20 @@ public:
193 193 result[i] = p(i * dt); //calculate a point on the edge of the circle
194 194 return result;
195 195 }
196   -
197   -
198 196  
  197 + ///returns a vector with the points on the initialized circle
  198 + ///connecting the points results in a circle
  199 + ///@param n: integer for the number of points representing the circle
  200 + ///the only difference between points and glpoints is that the first point appears twice in the returning lists
  201 + std::vector< stim::vec3<T> > glpoints(unsigned n) {
  202 + std::vector< stim::vec3<T> > result(n + 1);
  203 + float dt = stim::TAU / n;
  204 + for (unsigned i = 0; i < n; i++)
  205 + result[i] = p(i * dt);
  206 + result[n] = p(0); //close the circle!
  207 + return result;
  208 + }
  209 +
199 210 std::string str() const
200 211 {
201 212 std::stringstream ss;
... ...
stim/visualization/gl_network.h
... ... @@ -87,7 +87,7 @@ public:
87 87  
88 88 /// render the network centerline from swc file as a series of strips in different colors based on the neuronal type
89 89 /// glCenterline0_swc is for only one input
90   - void glCenterline0_swc() {
  90 + /*void glCenterline0_swc() {
91 91 if (!glIsList(dlist)) { // if dlist isn't a display list, create it
92 92 dlist = glGenLists(1); // generate a display list
93 93 glNewList(dlist, GL_COMPILE); // start a new display list
... ... @@ -163,7 +163,7 @@ public:
163 163 glEndList(); //end the display list
164 164 }
165 165 glCallList(dlist); // render the display list
166   - }
  166 + }*/
167 167  
168 168 ///render the network centerline as a series of line strips(when loading at least two networks, otherwise using glCenterline0())
169 169 ///colors are based on metric values
... ... @@ -188,7 +188,7 @@ public:
188 188  
189 189 ///render the network cylinder as a series of tubes
190 190 ///colors are based on metric values
191   - void glCylinder() {
  191 + void glCylinder(float sigma) {
192 192 if (!glIsList(dlist)) { //if dlist isn't a display list, create it
193 193 dlist = glGenLists(1); //generate a display list
194 194 glNewList(dlist, GL_COMPILE); //start a new display list
... ... @@ -196,12 +196,12 @@ public:
196 196 for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
197 197 stim::circle<T> C1 = E[e].circ(p - 1);
198 198 stim::circle<T> C2 = E[e].circ(p);
199   - C1.set_R(10); // scale the circle to the same
200   - C2.set_R(10);
201   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
202   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
  199 + C1.set_R(3*sigma); // scale the circle to the same
  200 + C2.set_R(3*sigma);
  201 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  202 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
203 203 glBegin(GL_QUAD_STRIP);
204   - for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle
  204 + for (unsigned i = 0; i < Cp1.size(); i++) { // for every point on the circle(+1 means closing the circle)
205 205 glVertex3f(Cp1[i][0], Cp1[i][1], Cp1[i][2]);
206 206 glVertex3f(Cp2[i][0], Cp2[i][1], Cp2[i][2]);
207 207 glTexCoord1f(E[e].r(p));
... ... @@ -209,6 +209,18 @@ public:
209 209 glEnd();
210 210 } //set the texture coordinate based on the specified magnitude index
211 211 }
  212 + for (unsigned n = 0; n < V.size(); n++) {
  213 + size_t num = V[n].e[0].size(); //store the number of outgoing edge of that vertex
  214 + if (num != 0) { //if it has outgoing edge
  215 + unsigned idx = V[n].e[0][0]; //find the index of first outgoing edge of that vertex
  216 + glTexCoord1f(E[idx].r(0)); //bind the texture as metric of first point on that edge
  217 + }
  218 + else {
  219 + unsigned idx = V[n].e[1][0]; //find the index of first incoming edge of that vertex
  220 + glTexCoord1f(E[idx].r(E[idx].size() - 1)); //bind the texture as metric of last point on that edge
  221 + }
  222 + renderBall(V[n][0], V[n][1], V[n][2], 3*sigma, 20);
  223 + }
212 224 glEndList(); //end the display list
213 225 }
214 226 glCallList(dlist); //render the display list
... ... @@ -218,53 +230,7 @@ public:
218 230 ///@param dlist1 is the display list
219 231 ///@param map is the mapping relationship between two networks
220 232 ///@param colormap is the random generated color set for render
221   - void glRandColorCylinder1(GLuint &dlist1, std::vector<unsigned> map, std::vector<T> colormap) {
222   - if (!glIsList(dlist1)) { // if dlist1 isn't a display list, create it
223   - dlist1 = glGenLists(1); // generate a display list
224   - glNewList(dlist1, GL_COMPILE); // start a new display list
225   - for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
226   - if (map[e] != unsigned(-1)) {
227   - glColor3f(colormap[e * 3 + 0], colormap[e * 3 + 1], colormap[e * 3 + 2]);
228   - for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
229   - stim::circle<T> C1 = E[e].circ(p - 1);
230   - stim::circle<T> C2 = E[e].circ(p);
231   - C1.set_R(10); // scale the circle to the same
232   - C2.set_R(10);
233   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
234   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
235   - renderCylinder(Cp1, Cp2);
236   - }
237   - }
238   - else {
239   - glColor3f(1.0f, 1.0f, 1.0f); // white color for the un-mapping edges
240   - for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
241   - stim::circle<T> C1 = E[e].circ(p - 1);
242   - stim::circle<T> C2 = E[e].circ(p);
243   - C1.set_R(10); // scale the circle to the same
244   - C2.set_R(10);
245   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
246   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
247   - renderCylinder(Cp1, Cp2);
248   - }
249   - }
250   - }
251   - for (unsigned v = 0; v < V.size(); v++) {
252   - size_t num_edge = V[v].e[0].size() + V[v].e[1].size();
253   - if (num_edge > 1) { // if it is the joint vertex
254   - glColor3f(0.3, 0.3, 0.3); // gray color
255   - renderBall(V[v][0], V[v][1], V[v][2], 20, 20);
256   - }
257   - else { // if it is the terminal vertex
258   - glColor3f(0.6, 0.6, 0.6); // more white gray
259   - renderBall(V[v][0], V[v][1], V[v][2], 20, 20);
260   - }
261   - }
262   - glEndList();
263   - }
264   - glCallList(dlist1);
265   - }
266   -
267   - void glRandColorCylinder1_swc(GLuint &dlist1, std::vector<unsigned> map, std::vector<T> colormap) {
  233 + void glRandColorCylinder1(GLuint &dlist1, std::vector<unsigned> map, std::vector<T> colormap, float sigma) {
268 234 if (!glIsList(dlist1)) { // if dlist1 isn't a display list, create it
269 235 dlist1 = glGenLists(1); // generate a display list
270 236 glNewList(dlist1, GL_COMPILE); // start a new display list
... ... @@ -274,10 +240,10 @@ public:
274 240 for (unsigned p = 1; p < E[e].size(); p++) {// for each point on that edge
275 241 stim::circle<T> C1 = E[e].circ(p - 1);
276 242 stim::circle<T> C2 = E[e].circ(p);
277   - C1.set_R(0.5); // scale the circle to the same
278   - C2.set_R(0.5);
279   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
280   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
  243 + C1.set_R(3*sigma); // scale the circle to the same
  244 + C2.set_R(3*sigma);
  245 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  246 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
281 247 renderCylinder(Cp1, Cp2);
282 248 }
283 249 }
... ... @@ -286,10 +252,10 @@ public:
286 252 for (unsigned p = 1; p < E[e].size(); p++) { // for each point on that edge
287 253 stim::circle<T> C1 = E[e].circ(p - 1);
288 254 stim::circle<T> C2 = E[e].circ(p);
289   - C1.set_R(0.5); // scale the circle to the same
290   - C2.set_R(0.5);
291   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
292   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
  255 + C1.set_R(3*sigma); // scale the circle to the same
  256 + C2.set_R(3*sigma);
  257 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  258 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
293 259 renderCylinder(Cp1, Cp2);
294 260 }
295 261 }
... ... @@ -298,11 +264,11 @@ public:
298 264 size_t num_edge = V[v].e[0].size() + V[v].e[1].size();
299 265 if (num_edge > 1) { // if it is the joint vertex
300 266 glColor3f(0.3, 0.3, 0.3); // gray color
301   - renderBall(V[v][0], V[v][1], V[v][2], 1, 20);
  267 + renderBall(V[v][0], V[v][1], V[v][2], 6*sigma, 20);
302 268 }
303 269 else { // if it is the terminal vertex
304 270 glColor3f(0.6, 0.6, 0.6); // more white gray
305   - renderBall(V[v][0], V[v][1], V[v][2], 1, 20);
  271 + renderBall(V[v][0], V[v][1], V[v][2], 6*sigma, 20);
306 272 }
307 273 }
308 274 glEndList();
... ... @@ -314,53 +280,7 @@ public:
314 280 ///@param dlist2 is the display list
315 281 ///@param map is the mapping relationship between two networks
316 282 ///@param colormap is the random generated color set for render
317   - void glRandColorCylinder2(GLuint &dlist2, std::vector<unsigned> map, std::vector<T> colormap) {
318   - if (!glIsList(dlist2)) {
319   - dlist2 = glGenLists(1);
320   - glNewList(dlist2, GL_COMPILE);
321   - for (unsigned e = 0; e < E.size(); e++) { // for each edge in the network
322   - if (map[e] != unsigned(-1)) {
323   - glColor3f(colormap[map[e] * 3 + 0], colormap[map[e] * 3 + 1], colormap[map[e] * 3 + 2]);
324   - for (unsigned p = 0; p < E[e].size() - 1; p++) {// for each point on that edge
325   - stim::circle<T> C1 = E[e].circ(p);
326   - stim::circle<T> C2 = E[e].circ(p + 1);
327   - C1.set_R(10); // scale the circle to the same
328   - C2.set_R(10);
329   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
330   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
331   - renderCylinder(Cp1, Cp2);
332   - }
333   - }
334   - else {
335   - glColor3f(1.0f, 1.0f, 1.0f); // white color for the un-mapping edges
336   - for (unsigned p = 0; p < E[e].size() - 1; p++) {// for each point on that edge
337   - stim::circle<T> C1 = E[e].circ(p);
338   - stim::circle<T> C2 = E[e].circ(p + 1);
339   - C1.set_R(10); // scale the circle to the same
340   - C2.set_R(10);
341   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
342   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
343   - renderCylinder(Cp1, Cp2);
344   - }
345   - }
346   - }
347   - for (unsigned v = 0; v < V.size(); v++) {
348   - size_t num_edge = V[v].e[0].size() + V[v].e[1].size();
349   - if (num_edge > 1) { // if it is the joint vertex
350   - glColor3f(0.3, 0.3, 0.3); // gray color
351   - renderBall(V[v][0], V[v][1], V[v][2], 20, 20);
352   - }
353   - else { // if it is the terminal vertex
354   - glColor3f(0.6, 0.6, 0.6); // more white gray
355   - renderBall(V[v][0], V[v][1], V[v][2], 20, 20);
356   - }
357   - }
358   - glEndList();
359   - }
360   - glCallList(dlist2);
361   - }
362   -
363   - void glRandColorCylinder2_swc(GLuint &dlist2, std::vector<unsigned> map, std::vector<T> colormap) {
  283 + void glRandColorCylinder2(GLuint &dlist2, std::vector<unsigned> map, std::vector<T> colormap, float sigma) {
364 284 if (!glIsList(dlist2)) {
365 285 dlist2 = glGenLists(1);
366 286 glNewList(dlist2, GL_COMPILE);
... ... @@ -370,10 +290,10 @@ public:
370 290 for (unsigned p = 0; p < E[e].size() - 1; p++) {// for each point on that edge
371 291 stim::circle<T> C1 = E[e].circ(p);
372 292 stim::circle<T> C2 = E[e].circ(p + 1);
373   - C1.set_R(0.5); // scale the circle to the same
374   - C2.set_R(0.5);
375   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
376   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
  293 + C1.set_R(3*sigma); // scale the circle to the same
  294 + C2.set_R(3*sigma);
  295 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  296 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
377 297 renderCylinder(Cp1, Cp2);
378 298 }
379 299 }
... ... @@ -382,10 +302,10 @@ public:
382 302 for (unsigned p = 0; p < E[e].size() - 1; p++) {// for each point on that edge
383 303 stim::circle<T> C1 = E[e].circ(p);
384 304 stim::circle<T> C2 = E[e].circ(p + 1);
385   - C1.set_R(0.5); // scale the circle to the same
386   - C2.set_R(0.5);
387   - std::vector< stim::vec3<T> >Cp1 = C1.points(20);
388   - std::vector< stim::vec3<T> >Cp2 = C2.points(20);
  305 + C1.set_R(3*sigma); // scale the circle to the same
  306 + C2.set_R(3*sigma);
  307 + std::vector< stim::vec3<T> >Cp1 = C1.glpoints(20);
  308 + std::vector< stim::vec3<T> >Cp2 = C2.glpoints(20);
389 309 renderCylinder(Cp1, Cp2);
390 310 }
391 311 }
... ... @@ -394,11 +314,11 @@ public:
394 314 size_t num_edge = V[v].e[0].size() + V[v].e[1].size();
395 315 if (num_edge > 1) { // if it is the joint vertex
396 316 glColor3f(0.3, 0.3, 0.3); // gray color
397   - renderBall(V[v][0], V[v][1], V[v][2], 1, 20);
  317 + renderBall(V[v][0], V[v][1], V[v][2], 6*sigma, 20);
398 318 }
399 319 else { // if it is the terminal vertex
400 320 glColor3f(0.6, 0.6, 0.6); // more white gray
401   - renderBall(V[v][0], V[v][1], V[v][2], 1, 20);
  321 + renderBall(V[v][0], V[v][1], V[v][2], 6*sigma, 20);
402 322 }
403 323 }
404 324 glEndList();
... ...