Commit 9b69bb4c41231d8b8297de67a13a88c61c9bc92f

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