Commit 9b69bb4c41231d8b8297de67a13a88c61c9bc92f
1 parent
def55315
add diplay list to avoid waste
Showing
1 changed file
with
110 additions
and
89 deletions
Show diff stats
... | ... | @@ -160,14 +160,15 @@ namespace stim { |
160 | 160 | #endif |
161 | 161 | |
162 | 162 | template <typename T> |
163 | - class flow : public stim::gl_network<T>{ | |
163 | + class flow : public stim::gl_network<T> { | |
164 | 164 | |
165 | 165 | private: |
166 | - | |
166 | + | |
167 | 167 | unsigned num_edge; |
168 | 168 | unsigned num_vertex; |
169 | - | |
170 | - enum direction {UP, LEFT, DOWN, RIGHT}; | |
169 | + GLuint dlist; // display list for inlets/outlets connections | |
170 | + | |
171 | + enum direction { UP, LEFT, DOWN, RIGHT }; | |
171 | 172 | |
172 | 173 | // calculate the cofactor of elemen[row][col] |
173 | 174 | void get_minor(T** src, T** dest, int row, int col, int order) { |
... | ... | @@ -232,7 +233,7 @@ namespace stim { |
232 | 233 | using stim::network<T>::get_r; |
233 | 234 | using stim::network<T>::get_average_r; |
234 | 235 | using stim::network<T>::get_l; |
235 | - | |
236 | + | |
236 | 237 | T** C; // Conductance |
237 | 238 | std::vector<typename stim::triple<unsigned, unsigned, float> > Q; // volume flow rate |
238 | 239 | std::vector<T> QQ; // Q' vector |
... | ... | @@ -292,11 +293,16 @@ namespace stim { |
292 | 293 | output.clear(); |
293 | 294 | inlet.clear(); |
294 | 295 | outlet.clear(); |
296 | + | |
297 | + if (glIsList(dlist)) { | |
298 | + glDeleteLists(dlist, 1); // delete display list for modify | |
299 | + glDeleteLists(dlist + 1, 1); | |
300 | + } | |
295 | 301 | } |
296 | 302 | |
297 | 303 | // copy radius from cylinder to flow |
298 | 304 | void set_radius(unsigned i, T radius) { |
299 | - | |
305 | + | |
300 | 306 | for (unsigned j = 0; j < num_edge; j++) { |
301 | 307 | if (E[j].v[0] == i) |
302 | 308 | E[j].cylinder<T>::set_r(0, radius); |
... | ... | @@ -307,7 +313,7 @@ namespace stim { |
307 | 313 | |
308 | 314 | // get the radii of vertex i |
309 | 315 | T get_radius(unsigned i) { |
310 | - | |
316 | + | |
311 | 317 | unsigned tmp_e; // edge index |
312 | 318 | unsigned tmp_v; // vertex index in that edge |
313 | 319 | for (unsigned j = 0; j < num_edge; j++) { |
... | ... | @@ -326,7 +332,7 @@ namespace stim { |
326 | 332 | |
327 | 333 | // get the velocity of pendant vertex i |
328 | 334 | T get_velocity(unsigned i) { |
329 | - | |
335 | + | |
330 | 336 | unsigned tmp_e; // edge index |
331 | 337 | for (unsigned j = 0; j < num_edge; j++) { |
332 | 338 | if (E[j].v[0] == i) { |
... | ... | @@ -400,7 +406,7 @@ namespace stim { |
400 | 406 | // get the inverse of conductance matrix |
401 | 407 | stim::matrix<float> _C(num_vertex, num_vertex); |
402 | 408 | inversion(C, num_vertex, _C.data()); |
403 | - | |
409 | + | |
404 | 410 | // get the pressure in the network |
405 | 411 | for (unsigned i = 0; i < num_vertex; i++) { |
406 | 412 | for (unsigned j = 0; j < num_vertex; j++) { |
... | ... | @@ -421,7 +427,7 @@ namespace stim { |
421 | 427 | |
422 | 428 | Q[i].first = start_vertex; |
423 | 429 | Q[i].second = end_vertex; |
424 | - | |
430 | + | |
425 | 431 | Q[i].third = ((float)stim::PI * std::pow(get_average_r(i), 4) * deltaP) / (8 * u * get_l(i)); |
426 | 432 | v[i] = Q[i].third / ((float)stim::PI * std::pow(get_average_r(i), 2)); |
427 | 433 | } |
... | ... | @@ -429,7 +435,7 @@ namespace stim { |
429 | 435 | |
430 | 436 | // get the brewer color map based on velocity |
431 | 437 | void get_color_map(T& max_v, T& min_v, std::vector<unsigned char>& color, std::vector<unsigned> pendant_vertex) { |
432 | - | |
438 | + | |
433 | 439 | unsigned num_edge = Q.size(); |
434 | 440 | unsigned num_vertex = QQ.size(); |
435 | 441 | |
... | ... | @@ -441,7 +447,7 @@ namespace stim { |
441 | 447 | |
442 | 448 | max_v = *std::max_element(abs_V.begin(), abs_V.end()); |
443 | 449 | min_v = *std::min_element(abs_V.begin(), abs_V.end()); |
444 | - | |
450 | + | |
445 | 451 | // get the color map based on velocity range along the network |
446 | 452 | color.clear(); |
447 | 453 | if (pendant_vertex.size() == 2 && num_edge - num_vertex + 1 <= 0) // only one inlet and one outlet |
... | ... | @@ -472,7 +478,7 @@ namespace stim { |
472 | 478 | // @param: current direct length between two vertices |
473 | 479 | // @param: desire length |
474 | 480 | void find_hilbert_order(T l, T d, int &order) { |
475 | - | |
481 | + | |
476 | 482 | bool flag = false; |
477 | 483 | int o = 1; |
478 | 484 | T tmp; // temp of length |
... | ... | @@ -489,7 +495,7 @@ namespace stim { |
489 | 495 | } |
490 | 496 | |
491 | 497 | void move(unsigned i, T *c, direction dir, T dl, int feeder, bool invert) { |
492 | - | |
498 | + | |
493 | 499 | int cof = (invert) ? -1 : 1; |
494 | 500 | |
495 | 501 | switch (dir) { |
... | ... | @@ -510,7 +516,7 @@ namespace stim { |
510 | 516 | stim::vec3<T> tmp; |
511 | 517 | for (unsigned i = 0; i < 3; i++) |
512 | 518 | tmp[i] = c[i]; |
513 | - | |
519 | + | |
514 | 520 | if (feeder == 1) // inlet main feeder |
515 | 521 | inlet[i].V.push_back(tmp); |
516 | 522 | else if (feeder == 0) // outlet main feeder |
... | ... | @@ -518,8 +524,8 @@ namespace stim { |
518 | 524 | } |
519 | 525 | |
520 | 526 | void hilbert_curve(unsigned i, T *c, int order, T dl, int feeder, bool invert, direction dir = DOWN) { |
521 | - | |
522 | - if (order == 1) { | |
527 | + | |
528 | + if (order == 1) { | |
523 | 529 | switch (dir) { |
524 | 530 | case UP: |
525 | 531 | move(i, c, DOWN, dl, feeder, invert); |
... | ... | @@ -542,7 +548,7 @@ namespace stim { |
542 | 548 | move(i, c, RIGHT, dl, feeder, invert); |
543 | 549 | break; |
544 | 550 | } |
545 | - | |
551 | + | |
546 | 552 | } |
547 | 553 | else if (order > 1) { |
548 | 554 | switch (dir) { |
... | ... | @@ -717,7 +723,7 @@ namespace stim { |
717 | 723 | |
718 | 724 | // draw solid sphere at every vertex |
719 | 725 | void glSolidSphere(T max_pressure, GLint subdivision) { |
720 | - | |
726 | + | |
721 | 727 | // waste? |
722 | 728 | for (unsigned i = 0; i < num_edge; i++) { |
723 | 729 | for (unsigned j = 0; j < E[i].size(); j++) { |
... | ... | @@ -771,7 +777,7 @@ namespace stim { |
771 | 777 | |
772 | 778 | r1 = get_r(i, j); |
773 | 779 | r2 = get_r(i, j + 1); |
774 | - | |
780 | + | |
775 | 781 | // calculate the envelope caps |
776 | 782 | find_envelope(cp1, cp2, center1, center2, r1, r2, subdivision); |
777 | 783 | |
... | ... | @@ -789,7 +795,7 @@ namespace stim { |
789 | 795 | |
790 | 796 | // draw the flow direction as cone |
791 | 797 | void glSolidCone(GLint subdivision) { |
792 | - | |
798 | + | |
793 | 799 | stim::vec3<T> tmp_d; // direction |
794 | 800 | stim::vec3<T> center; // cone hat center |
795 | 801 | stim::vec3<T> head; // cone hat top |
... | ... | @@ -825,7 +831,7 @@ namespace stim { |
825 | 831 | |
826 | 832 | // draw main feeder as solid cube |
827 | 833 | void glSolidCuboid(T length = 210.0f, T height = 10.0f) { |
828 | - | |
834 | + | |
829 | 835 | T width; |
830 | 836 | stim::vec3<T> L = bb.A; // get the bottom left corner |
831 | 837 | stim::vec3<T> U = bb.B; // get the top right corner |
... | ... | @@ -886,84 +892,96 @@ namespace stim { |
886 | 892 | |
887 | 893 | // draw the bridge as lines |
888 | 894 | void line_bridge() { |
889 | - | |
890 | - for (unsigned i = 0; i < inlet.size(); i++) { | |
891 | - glBegin(GL_LINE_STRIP); | |
892 | - for (unsigned j = 0; j < inlet[i].V.size(); j++) | |
893 | - glVertex3f(inlet[i].V[j][0], inlet[i].V[j][1], inlet[i].V[j][2]); | |
894 | - glEnd(); | |
895 | - } | |
896 | - for (unsigned i = 0; i < outlet.size(); i++) { | |
897 | - glBegin(GL_LINE_STRIP); | |
898 | - for (unsigned j = 0; j < outlet[i].V.size(); j++) | |
899 | - glVertex3f(outlet[i].V[j][0], outlet[i].V[j][1], outlet[i].V[j][2]); | |
900 | - glEnd(); | |
895 | + | |
896 | + if (!glIsList(dlist)) { | |
897 | + dlist = glGenLists(1); | |
898 | + glNewList(dlist, GL_COMPILE); | |
899 | + for (unsigned i = 0; i < inlet.size(); i++) { | |
900 | + glBegin(GL_LINE_STRIP); | |
901 | + for (unsigned j = 0; j < inlet[i].V.size(); j++) | |
902 | + glVertex3f(inlet[i].V[j][0], inlet[i].V[j][1], inlet[i].V[j][2]); | |
903 | + glEnd(); | |
904 | + } | |
905 | + for (unsigned i = 0; i < outlet.size(); i++) { | |
906 | + glBegin(GL_LINE_STRIP); | |
907 | + for (unsigned j = 0; j < outlet[i].V.size(); j++) | |
908 | + glVertex3f(outlet[i].V[j][0], outlet[i].V[j][1], outlet[i].V[j][2]); | |
909 | + glEnd(); | |
910 | + } | |
911 | + glFlush(); | |
912 | + glEndList(); | |
901 | 913 | } |
902 | - glFlush(); | |
914 | + glCallList(dlist); | |
903 | 915 | } |
904 | 916 | |
905 | 917 | // draw the bridge as tubes |
906 | 918 | void tube_bridge(T subdivision, T radii = 5.0f) { |
907 | 919 | |
908 | - stim::vec3<T> dir; // direction vector | |
909 | - stim::circle<T> unit_c; // unit circle for finding the rotation start direction | |
910 | - std::vector<typename stim::vec3<T> > cp1; | |
911 | - std::vector<typename stim::vec3<T> > cp2; | |
912 | - | |
913 | - for (unsigned i = 0; i < inlet.size(); i++) { | |
914 | - // render vertex as sphere | |
915 | - for (unsigned j = 1; j < inlet[i].V.size() - 1; j++) { | |
916 | - glPushMatrix(); | |
917 | - glTranslatef(inlet[i].V[j][0], inlet[i].V[j][1], inlet[i].V[j][2]); | |
918 | - glutSolidSphere(radii, subdivision, subdivision); | |
919 | - glPopMatrix(); | |
920 | - } | |
921 | - // render edge as cylinder | |
922 | - for (unsigned j = 0; j < inlet[i].V.size() - 1; j++) { | |
923 | - dir = inlet[i].V[j] - inlet[i].V[j + 1]; | |
924 | - dir = dir.norm(); | |
925 | - unit_c.rotate(dir); | |
926 | - stim::circle<T> c1(inlet[i].V[j], inlet[i].r, dir, unit_c.U); | |
927 | - stim::circle<T> c2(inlet[i].V[j + 1], inlet[i].r, dir, unit_c.U); | |
928 | - cp1 = c1.glpoints(subdivision); | |
929 | - cp2 = c2.glpoints(subdivision); | |
930 | - | |
931 | - glBegin(GL_QUAD_STRIP); | |
932 | - for (unsigned k = 0; k < cp1.size(); k++) { | |
933 | - glVertex3f(cp1[k][0], cp1[k][1], cp1[k][2]); | |
934 | - glVertex3f(cp2[k][0], cp2[k][1], cp2[k][2]); | |
920 | + if (!glIsList(dlist + 1)) { | |
921 | + glNewList(dlist + 1, GL_COMPILE); | |
922 | + | |
923 | + stim::vec3<T> dir; // direction vector | |
924 | + stim::circle<T> unit_c; // unit circle for finding the rotation start direction | |
925 | + std::vector<typename stim::vec3<T> > cp1; | |
926 | + std::vector<typename stim::vec3<T> > cp2; | |
927 | + | |
928 | + for (unsigned i = 0; i < inlet.size(); i++) { | |
929 | + // render vertex as sphere | |
930 | + for (unsigned j = 1; j < inlet[i].V.size() - 1; j++) { | |
931 | + glPushMatrix(); | |
932 | + glTranslatef(inlet[i].V[j][0], inlet[i].V[j][1], inlet[i].V[j][2]); | |
933 | + glutSolidSphere(radii, subdivision, subdivision); | |
934 | + glPopMatrix(); | |
935 | + } | |
936 | + // render edge as cylinder | |
937 | + for (unsigned j = 0; j < inlet[i].V.size() - 1; j++) { | |
938 | + dir = inlet[i].V[j] - inlet[i].V[j + 1]; | |
939 | + dir = dir.norm(); | |
940 | + unit_c.rotate(dir); | |
941 | + stim::circle<T> c1(inlet[i].V[j], inlet[i].r, dir, unit_c.U); | |
942 | + stim::circle<T> c2(inlet[i].V[j + 1], inlet[i].r, dir, unit_c.U); | |
943 | + cp1 = c1.glpoints(subdivision); | |
944 | + cp2 = c2.glpoints(subdivision); | |
945 | + | |
946 | + glBegin(GL_QUAD_STRIP); | |
947 | + for (unsigned k = 0; k < cp1.size(); k++) { | |
948 | + glVertex3f(cp1[k][0], cp1[k][1], cp1[k][2]); | |
949 | + glVertex3f(cp2[k][0], cp2[k][1], cp2[k][2]); | |
950 | + } | |
951 | + glEnd(); | |
935 | 952 | } |
936 | - glEnd(); | |
937 | 953 | } |
938 | - } | |
939 | 954 | |
940 | - for (unsigned i = 0; i < outlet.size(); i++) { | |
941 | - // render vertex as sphere | |
942 | - for (unsigned j = 1; j < outlet[i].V.size() - 1; j++) { | |
943 | - glPushMatrix(); | |
944 | - glTranslatef(outlet[i].V[j][0], outlet[i].V[j][1], outlet[i].V[j][2]); | |
945 | - glutSolidSphere(radii, subdivision, subdivision); | |
946 | - glPopMatrix(); | |
947 | - } | |
948 | - // render edge as cylinder | |
949 | - for (unsigned j = 0; j < outlet[i].V.size() - 1; j++) { | |
950 | - dir = outlet[i].V[j] - outlet[i].V[j + 1]; | |
951 | - dir = dir.norm(); | |
952 | - unit_c.rotate(dir); | |
953 | - stim::circle<T> c1(outlet[i].V[j], outlet[i].r, dir, unit_c.U); | |
954 | - stim::circle<T> c2(outlet[i].V[j + 1], outlet[i].r, dir, unit_c.U); | |
955 | - cp1 = c1.glpoints(subdivision); | |
956 | - cp2 = c2.glpoints(subdivision); | |
957 | - | |
958 | - glBegin(GL_QUAD_STRIP); | |
959 | - for (unsigned k = 0; k < cp1.size(); k++) { | |
960 | - glVertex3f(cp1[k][0], cp1[k][1], cp1[k][2]); | |
961 | - glVertex3f(cp2[k][0], cp2[k][1], cp2[k][2]); | |
955 | + for (unsigned i = 0; i < outlet.size(); i++) { | |
956 | + // render vertex as sphere | |
957 | + for (unsigned j = 1; j < outlet[i].V.size() - 1; j++) { | |
958 | + glPushMatrix(); | |
959 | + glTranslatef(outlet[i].V[j][0], outlet[i].V[j][1], outlet[i].V[j][2]); | |
960 | + glutSolidSphere(radii, subdivision, subdivision); | |
961 | + glPopMatrix(); | |
962 | + } | |
963 | + // render edge as cylinder | |
964 | + for (unsigned j = 0; j < outlet[i].V.size() - 1; j++) { | |
965 | + dir = outlet[i].V[j] - outlet[i].V[j + 1]; | |
966 | + dir = dir.norm(); | |
967 | + unit_c.rotate(dir); | |
968 | + stim::circle<T> c1(outlet[i].V[j], outlet[i].r, dir, unit_c.U); | |
969 | + stim::circle<T> c2(outlet[i].V[j + 1], outlet[i].r, dir, unit_c.U); | |
970 | + cp1 = c1.glpoints(subdivision); | |
971 | + cp2 = c2.glpoints(subdivision); | |
972 | + | |
973 | + glBegin(GL_QUAD_STRIP); | |
974 | + for (unsigned k = 0; k < cp1.size(); k++) { | |
975 | + glVertex3f(cp1[k][0], cp1[k][1], cp1[k][2]); | |
976 | + glVertex3f(cp2[k][0], cp2[k][1], cp2[k][2]); | |
977 | + } | |
978 | + glEnd(); | |
962 | 979 | } |
963 | - glEnd(); | |
964 | 980 | } |
981 | + glEndList(); | |
965 | 982 | } |
966 | - } | |
983 | + glCallList(dlist + 1); | |
984 | + } | |
967 | 985 | |
968 | 986 | // draw gradient color bounding box outside the object |
969 | 987 | void bounding_box() { |
... | ... | @@ -1172,7 +1190,10 @@ namespace stim { |
1172 | 1190 | |
1173 | 1191 | // automatically modify bridge to make it feasible |
1174 | 1192 | void modify_synthetic_connection(T viscosity, T rou, T radii = 5.0f) { |
1175 | - | |
1193 | + | |
1194 | + glDeleteLists(dlist, 1); // delete display list for modify | |
1195 | + glDeleteLists(dlist + 1, 1); | |
1196 | + | |
1176 | 1197 | // because of radii change at the port vertex, there will be a pressure drop at that port |
1177 | 1198 | // it follows the bernoulli equation |
1178 | 1199 | // p1 + 1/2*rou*v1^2 + rou*g*h1 = p2 + 1/2*rou*v2^2 + rou*g*h2 | ... | ... |