draw_mesh.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "draw_mesh.h"
  2. IGL_INLINE void igl::draw_mesh(
  3. const Eigen::MatrixXd & V,
  4. const Eigen::MatrixXi & F,
  5. const Eigen::MatrixXd & N)
  6. {
  7. glBegin(GL_TRIANGLES);
  8. // loop over faces
  9. for(int i = 0; i<F.rows();i++)
  10. {
  11. // loop over corners of triangle
  12. for(int j = 0;j<3;j++)
  13. {
  14. glNormal3d(N(F(i,j),0),N(F(i,j),1),N(F(i,j),2));
  15. glVertex3d(V(F(i,j),0),V(F(i,j),1),V(F(i,j),2));
  16. }
  17. }
  18. glEnd();
  19. }
  20. IGL_INLINE void igl::draw_mesh(
  21. const Eigen::MatrixXd & V,
  22. const Eigen::MatrixXi & F,
  23. const Eigen::MatrixXd & N,
  24. const Eigen::MatrixXd & C)
  25. {
  26. glBegin(GL_TRIANGLES);
  27. // loop over faces
  28. for(int i = 0; i<F.rows();i++)
  29. {
  30. // loop over corners of triangle
  31. for(int j = 0;j<3;j++)
  32. {
  33. glColor3d(C(F(i,j),0),C(F(i,j),1),C(F(i,j),2));
  34. glNormal3d(N(F(i,j),0),N(F(i,j),1),N(F(i,j),2));
  35. glVertex3d(V(F(i,j),0),V(F(i,j),1),V(F(i,j),2));
  36. }
  37. }
  38. glEnd();
  39. }
  40. IGL_INLINE void igl::draw_mesh(
  41. const Eigen::MatrixXd & V,
  42. const Eigen::MatrixXi & F,
  43. const Eigen::MatrixXd & N,
  44. const Eigen::MatrixXd & C,
  45. const Eigen::MatrixXd & TC,
  46. const Eigen::MatrixXd & W,
  47. const GLuint W_index,
  48. const Eigen::MatrixXi & WI,
  49. const GLuint WI_index)
  50. {
  51. using namespace std;
  52. if(F.size() > 0)
  53. {
  54. assert(F.maxCoeff() < V.rows());
  55. assert(V.cols() == 3);
  56. assert(C.rows() == V.rows() || C.rows() == F.rows()*3 || C.size() == 0);
  57. assert(TC.rows() == V.rows() || TC.rows() == F.rows()*3 || TC.size() == 0);
  58. assert(C.cols() == 3 || C.size() == 0);
  59. assert(
  60. N.rows() == V.rows() || N.rows() == F.rows()*3 || N.rows() ==F.rows());
  61. assert(N.cols() == 3);
  62. }
  63. if(W.size()>0)
  64. {
  65. assert(W.rows() == V.rows());
  66. assert(WI.rows() == V.rows());
  67. assert(W.cols() == WI.cols());
  68. }
  69. glBegin(GL_TRIANGLES);
  70. // loop over faces
  71. for(int i = 0; i<F.rows();i++)
  72. {
  73. // loop over corners of triangle
  74. for(int j = 0;j<3;j++)
  75. {
  76. if(W.size()>0 && W_index !=0 && WI_index != 0)
  77. {
  78. int weights_left = W.cols();
  79. while(weights_left != 0)
  80. {
  81. int pass_size = std::min(4,weights_left);
  82. int weights_already_passed = W.cols()-weights_left;
  83. // Get attribute location of next 4 weights
  84. int pass_W_index = W_index + weights_already_passed/4;
  85. int pass_WI_index = WI_index + weights_already_passed/4;
  86. switch(pass_size)
  87. {
  88. case 1:
  89. glVertexAttrib1d(
  90. pass_W_index,
  91. W(F(i,j),0+weights_already_passed));
  92. glVertexAttrib1d(
  93. pass_WI_index,
  94. WI(F(i,j),0+weights_already_passed));
  95. break;
  96. case 2:
  97. glVertexAttrib2d(
  98. pass_W_index,
  99. W(F(i,j),0+weights_already_passed),
  100. W(F(i,j),1+weights_already_passed));
  101. glVertexAttrib2d(
  102. pass_WI_index,
  103. WI(F(i,j),0+weights_already_passed),
  104. WI(F(i,j),1+weights_already_passed));
  105. break;
  106. case 3:
  107. glVertexAttrib3d(
  108. pass_W_index,
  109. W(F(i,j),0+weights_already_passed),
  110. W(F(i,j),1+weights_already_passed),
  111. W(F(i,j),2+weights_already_passed));
  112. glVertexAttrib3d(
  113. pass_WI_index,
  114. WI(F(i,j),0+weights_already_passed),
  115. WI(F(i,j),1+weights_already_passed),
  116. WI(F(i,j),2+weights_already_passed));
  117. break;
  118. default:
  119. glVertexAttrib4d(
  120. pass_W_index,
  121. W(F(i,j),0+weights_already_passed),
  122. W(F(i,j),1+weights_already_passed),
  123. W(F(i,j),2+weights_already_passed),
  124. W(F(i,j),3+weights_already_passed));
  125. glVertexAttrib4d(
  126. pass_WI_index,
  127. WI(F(i,j),0+weights_already_passed),
  128. WI(F(i,j),1+weights_already_passed),
  129. WI(F(i,j),2+weights_already_passed),
  130. WI(F(i,j),3+weights_already_passed));
  131. break;
  132. }
  133. weights_left -= pass_size;
  134. }
  135. }
  136. if(TC.rows() == V.rows())
  137. {
  138. glTexCoord2d(TC(F(i,j),0),TC(F(i,j),1));
  139. }else if(TC.rows() == F.rows()*3)
  140. {
  141. glTexCoord2d(TC(F(i,j),0),TC(F(i,j),1));
  142. }
  143. if(C.rows() == V.rows())
  144. {
  145. glColor3d(C(F(i,j),0),C(F(i,j),1),C(F(i,j),2));
  146. }else if(C.rows() == F.rows()*3)
  147. {
  148. glColor3d(C(i*3+j,0), C(i*3+j,1), C(i*3+j,2));
  149. }
  150. if(N.rows() == V.rows())
  151. {
  152. glNormal3d(N(F(i,j),0),N(F(i,j),1),N(F(i,j),2));
  153. }else if(N.rows() == F.rows()*3)
  154. {
  155. glNormal3d(N(i*3+j,0),N(i*3+j,1),N(i*3+j,2));
  156. }else if(N.rows() == F.rows())
  157. {
  158. glNormal3d(N(i,0),N(i,1),N(i,2));
  159. }
  160. glVertex3d(V(F(i,j),0),V(F(i,j),1),V(F(i,j),2));
  161. }
  162. }
  163. glEnd();
  164. }