Guest User

Untitled

a guest
Jan 5th, 2014
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. for (int i = 0 ;i < polygons.size(); ++i){
  2. polygons[i] *= resultRotate;
  3.  
  4.  
  5. }
  6.  
  7. /* std::cout << "________________\n";
  8. for (int i = 0; i < polygons.size(); ++i)
  9. std::cout << polygons[i].leastDistant() << '\n';
  10. */
  11. QBrush q;
  12. QPen wp;
  13. std::sort(polygons.begin(), polygons.end());
  14. for (int i = 0; i < polygons.size(); ++i){
  15. if (polygons[i].Normal().data[2] > 0)
  16. continue;
  17. polygons[i].color.data[0] = 255;
  18. polygons[i].color.data[1] = 0;
  19. polygons[i].color.data[1] = 0;
  20.  
  21. if (lightning == Phong || lightning == Cook){
  22. Vector center = polygons[i].points[0] +polygons[i].points[1] +polygons[i].points[2];
  23. for (int r = 0; r < 3; ++r)
  24. center.data[r] /= 3;
  25. Vector L = light_source - center;
  26. Vector N = polygons[i].Normal();
  27. Vector V = POV - center;
  28. Vector H = V + L;
  29. if (L.length() != 0){
  30. double sz = L.length();
  31. L.data[0] /= sz;
  32. L.data[1] /= sz;
  33. L.data[2] /= sz;
  34.  
  35. }
  36. if (V.length() != 0){
  37. double sz = V.length();
  38. V.data[0] /= sz;
  39. V.data[1] /= sz;
  40. V.data[2] /= sz;
  41.  
  42. }
  43. if (N.length() != 0){
  44. double sz = N.length();
  45.  
  46. N.data[0] /= sz;
  47. N.data[1] /= sz;
  48. N.data[2] /= sz;
  49. }
  50. if (H.length() != 0){
  51. double sz = H.length();
  52. H.data[0] /= sz;
  53. H.data[1] /= sz;
  54. H.data[2] /= sz;
  55. }
  56.  
  57.  
  58. double dot_prodLN = (L.data[0] * N.data[0] + L.data[1] * N.data[1] + L.data[2] * N.data[2]);
  59. double dot_prodHN = (H.data[0] * N.data[0] + H.data[1] * N.data[1] + H.data[2] * N.data[2]);
  60.  
  61. if (L.length() == 0 || N.length() == 0)
  62. polygons[i].color = Vector();
  63. else{
  64. polygons[i].color.data[0] = Diffuse[0] * dot_prodLN * 255.0 ;
  65. polygons[i].color.data[1] = Diffuse[1] * dot_prodLN * 255.0;
  66. polygons[i].color.data[2] = Diffuse[2] * dot_prodLN * 255.0;
  67. }
  68. if (H.length() == 0)
  69. polygons[i].color = Vector();
  70. else {
  71. if (lightning == Phong){
  72.  
  73. dot_prodHN *= dot_prodHN;
  74. polygons[i].color.data[0] += Specular[0] * dot_prodHN * 255;
  75. polygons[i].color.data[1] += Specular[1] * dot_prodHN * 255;
  76. polygons[i].color.data[2] += Specular[2] * dot_prodHN * 255;
  77. }
  78.  
  79. if (lightning == Cook){
  80. double dot_prodVN = V.data[0] * N.data[0] +V.data[1] * N.data[1] +V.data[2] * N.data[2];
  81. double dot_prodVH = V.data[0] * H.data[0] +V.data[1] * H.data[1] +V.data[2] * H.data[2];
  82.  
  83. double G = 1.0;
  84. double temp = 2.0 * dot_prodHN * dot_prodVN / dot_prodVH;
  85. if (temp < G)
  86. G = temp;
  87. temp = 2.0 * dot_prodHN * dot_prodLN / dot_prodVH;
  88.  
  89. if (temp < G)
  90. G = temp;
  91. double D = 1.0/(m*m * dot_prodHN* dot_prodHN* dot_prodHN* dot_prodHN);
  92. D *= exp(dot_prodHN * dot_prodHN - 1.0 / (m*m * dot_prodHN * dot_prodHN));
  93. double F = 1.0 / (1 + dot_prodVN);
  94. double K = F*G*D/(dot_prodVN * dot_prodLN);
  95.  
  96. polygons[i].color.data[0] += Specular[0] * K * 255;
  97.  
  98. polygons[i].color.data[1] += Specular[1] * K * 255;
  99.  
  100. polygons[i].color.data[2] += Specular[2] * K * 255;
  101.  
  102. }
  103. }
  104.  
  105. polygons[i].color.data[0] = min(255, polygons[i].color.data[0] + Ambient[0] * 255);
  106. if (polygons[i].color.data[0] < 0)
  107. polygons[i].color.data[0] = 0;
  108.  
  109. polygons[i].color.data[1] = min(255, polygons[i].color.data[1] + Ambient[1] * 255);
  110. if (polygons[i].color.data[1] < 0)
  111. polygons[i].color.data[1] = 0;
  112.  
  113. polygons[i].color.data[2] = min(255, polygons[i].color.data[2] + Ambient[2] * 255);
  114. if (polygons[i].color.data[2] < 0)
  115. polygons[i].color.data[2] = 0;
  116. }
  117.  
  118.  
  119. if (projection)
  120. polygons[i] *= ScaleShift * projectionMat;
  121. else
  122. polygons[i] *= ScaleShift;
  123.  
  124. QPoint tri[3];
  125. tri[0].setX(polygons[i].points[0].data[0]);
  126. tri[0].setY(polygons[i].points[0].data[1]);
  127.  
  128. tri[1].setX(polygons[i].points[1].data[0]);
  129. tri[1].setY(polygons[i].points[1].data[1]);
  130.  
  131. tri[2].setX(polygons[i].points[2].data[0]);
  132. tri[2].setY(polygons[i].points[2].data[1]);
  133.  
  134.  
  135.  
  136.  
  137.  
  138. if (lightning == None){
  139. wp.setColor(Qt::black);
  140. q.setStyle(Qt::NoBrush);
  141. }
  142.  
  143. if (lightning == Solid){
  144. wp.setColor(Qt::black);
  145. q.setColor(Qt::red);
  146. q.setStyle(Qt::SolidPattern);
  147. }
  148.  
  149. if (lightning == Phong || lightning == Cook){
  150. QColor ss;
  151. ss.setRed(polygons[i].color.data[0]);
  152. ss.setGreen(polygons[i].color.data[1]);
  153. ss.setBlue(polygons[i].color.data[2]);
  154. wp.setColor(ss);
  155. q.setColor(ss);
  156. q.setStyle(Qt::SolidPattern);
  157.  
  158.  
  159. }
  160. p.setBrush(q);
  161. p.setPen(wp);
  162.  
  163. p.drawPolygon(tri, 3);
  164. }
  165.  
  166.  
  167. /* wp.setColor(Qt::black);
  168. p.setPen(wp);
  169. Vector t = ScaleShift * resultRotate * light_source;
  170. p.drawLine(0,0, t.data[0], t.data[1]);
  171. */
  172. }
Advertisement
Add Comment
Please, Sign In to add comment