Commit 8412027b75fcc9af8d583c934265fc39e1f5b078
Merge branch 'JACK' into 'master'
make it render better for both swc and obj files add a new function in circle class in order to get a close circle See merge request !25
Showing
3 changed files
with
60 additions
and
129 deletions
Show diff stats
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(); | ... | ... |