PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/imac2gl3/shapes/NeutralCube.cpp

https://bitbucket.org/Elfhir/iminecraft-1.0
C++ | 221 lines | 170 code | 31 blank | 20 comment | 0 complexity | 93c5de530ea495b74e1ed72b18cf39b4 MD5 | raw file
  1. #include <cmath>
  2. #include <vector>
  3. #include <iostream>
  4. #include "imac2gl3/shapes/common.hpp"
  5. #include "imac2gl3/shapes/NeutralCube.hpp"
  6. namespace imac2gl3 {
  7. void NeutralCube::build(int type) {
  8. std::vector<ShapeVertex> data;
  9. ShapeVertex vertex;
  10. type --;
  11. int nbTextureMax = 4; // nombre de type different max sur notre texture, a faire evoluer pour de la dynamique
  12. float division_1_sur_3 = 1/3.f;
  13. float portionParType = 1.f/(float)nbTextureMax;
  14. // FRONT BOTTOM
  15. // 1,0,0
  16. vertex.texCoords.x = 2*division_1_sur_3;
  17. vertex.texCoords.y = (type+1)*portionParType;
  18. vertex.position.x = 0.5f;
  19. vertex.position.y = 0.f;
  20. vertex.position.z = -0.5f;
  21. vertex.normal.x = 1.f;
  22. vertex.normal.y = -1.f;
  23. vertex.normal.z = 1.f;
  24. vertex.normal = glm::normalize(vertex.normal);
  25. data.push_back(vertex);
  26. // 0,0,0
  27. vertex.texCoords.x = division_1_sur_3;
  28. vertex.texCoords.y = (type+1)*portionParType;
  29. vertex.position.x = -0.5f;
  30. vertex.position.y = 0.f;
  31. vertex.position.z = -0.5f;
  32. vertex.normal.x = -1.f;
  33. vertex.normal.y = -1.f;
  34. vertex.normal.z = 1.f;
  35. vertex.normal = glm::normalize(vertex.normal);
  36. data.push_back(vertex);
  37. // FRONT UP
  38. // 0,1,0
  39. vertex.texCoords.x = division_1_sur_3;
  40. vertex.texCoords.y = type*portionParType;
  41. vertex.position.x = -0.5f;
  42. vertex.position.y = 1.f;
  43. vertex.position.z = -0.5f;
  44. vertex.normal.x = -1.f;
  45. vertex.normal.y = 1.f;
  46. vertex.normal.z = 1.f;
  47. vertex.normal = glm::normalize(vertex.normal);
  48. data.push_back(vertex);
  49. // 1,1,0
  50. vertex.texCoords.x = 2*division_1_sur_3;
  51. vertex.texCoords.y = type*portionParType;
  52. vertex.position.x = 0.5f;
  53. vertex.position.y = 1.f;
  54. vertex.position.z = -0.5f;
  55. vertex.normal.x = 1.f;
  56. vertex.normal.y = 1.f;
  57. vertex.normal.z = 1.f;
  58. vertex.normal = glm::normalize(vertex.normal);
  59. data.push_back(vertex);
  60. // BACK BOTTOM
  61. // 1,0,1
  62. vertex.texCoords.x = 1.f;
  63. vertex.texCoords.y = 1.f;
  64. vertex.position.x = 0.5f;
  65. vertex.position.y = 0.f;
  66. vertex.position.z = 0.5f;
  67. vertex.normal.x = 1.f;
  68. vertex.normal.y = -1.f;
  69. vertex.normal.z = -1.f;
  70. vertex.normal = glm::normalize(vertex.normal);
  71. data.push_back(vertex);
  72. // 0,0,1
  73. vertex.texCoords.x = 0.f;
  74. vertex.texCoords.y = 1.f;
  75. vertex.position.x = -0.5f;
  76. vertex.position.y = 0.f;
  77. vertex.position.z = 0.5f;
  78. vertex.normal.x = -1.f;
  79. vertex.normal.y = -1.f;
  80. vertex.normal.z = -1.f;
  81. vertex.normal = glm::normalize(vertex.normal);
  82. data.push_back(vertex);
  83. // BACK UP
  84. // 0,1,1
  85. vertex.texCoords.x = 0.f;
  86. vertex.texCoords.y = 0.f;
  87. vertex.position.x = -0.5f;
  88. vertex.position.y = 1.f;
  89. vertex.position.z = 0.5f;
  90. vertex.normal.x = -1.f;
  91. vertex.normal.y = 1.f;
  92. vertex.normal.z = -1.f;
  93. vertex.normal = glm::normalize(vertex.normal);
  94. data.push_back(vertex);
  95. // 1,1,1
  96. vertex.texCoords.x = 1.f;
  97. vertex.texCoords.y = 0.f;
  98. vertex.position.x = 0.5f;
  99. vertex.position.y = 1.f;
  100. vertex.position.z = 0.5f;
  101. vertex.normal.x = 1.f;
  102. vertex.normal.y = 1.f;
  103. vertex.normal.z = -1.f;
  104. vertex.normal = glm::normalize(vertex.normal);
  105. data.push_back(vertex);
  106. m_nVertexCount = 6 * 6; // 6 faces * 6 points (2 triangles)
  107. m_pDataPointer = new ShapeVertex[m_nVertexCount];
  108. GLsizei i = 0;
  109. // FRONT
  110. m_pDataPointer[i] = data[5];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  111. i++;
  112. m_pDataPointer[i] = data[4];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  113. i++;
  114. m_pDataPointer[i] = data[7];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  115. i++;
  116. m_pDataPointer[i] = data[7];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  117. i++;
  118. m_pDataPointer[i] = data[6];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  119. i++;
  120. m_pDataPointer[i] = data[5];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  121. i++;
  122. // BOTTOM
  123. m_pDataPointer[i] = data[4];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  124. i++;
  125. m_pDataPointer[i] = data[5];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  126. i++;
  127. m_pDataPointer[i] = data[1];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  128. i++;
  129. m_pDataPointer[i] = data[1];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  130. i++;
  131. m_pDataPointer[i] = data[0];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  132. i++;
  133. m_pDataPointer[i] = data[4];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  134. i++;
  135. // BACK
  136. m_pDataPointer[i] = data[0];m_pDataPointer[i].texCoords.x = 1;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  137. i++;
  138. m_pDataPointer[i] = data[1];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  139. i++;
  140. m_pDataPointer[i] = data[2];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  141. i++;
  142. m_pDataPointer[i] = data[2];m_pDataPointer[i].texCoords.x = 2*division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  143. i++;
  144. m_pDataPointer[i] = data[3];m_pDataPointer[i].texCoords.x = 1;m_pDataPointer[i].texCoords.y = type*portionParType;
  145. i++;
  146. m_pDataPointer[i] = data[0];m_pDataPointer[i].texCoords.x = 1;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  147. i++;
  148. // TOP
  149. m_pDataPointer[i] = data[3];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  150. i++;
  151. m_pDataPointer[i] = data[2];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  152. i++;
  153. m_pDataPointer[i] = data[6];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  154. i++;
  155. m_pDataPointer[i] = data[6];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  156. i++;
  157. m_pDataPointer[i] = data[7];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  158. i++;
  159. m_pDataPointer[i] = data[3];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  160. i++;
  161. // LEFT
  162. m_pDataPointer[i] = data[1];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  163. i++;
  164. m_pDataPointer[i] = data[5];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  165. i++;
  166. m_pDataPointer[i] = data[6];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  167. i++;
  168. m_pDataPointer[i] = data[6];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  169. i++;
  170. m_pDataPointer[i] = data[2];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  171. i++;
  172. m_pDataPointer[i] = data[1];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  173. i++;
  174. // RIGHT
  175. m_pDataPointer[i] = data[4];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  176. i++;
  177. m_pDataPointer[i] = data[0];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  178. i++;
  179. m_pDataPointer[i] = data[3];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  180. i++;
  181. m_pDataPointer[i] = data[3];m_pDataPointer[i].texCoords.x = 0;m_pDataPointer[i].texCoords.y = type*portionParType;
  182. i++;
  183. m_pDataPointer[i] = data[7];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = type*portionParType;
  184. i++;
  185. m_pDataPointer[i] = data[4];m_pDataPointer[i].texCoords.x = division_1_sur_3;m_pDataPointer[i].texCoords.y = (type+1)*portionParType;
  186. i++;
  187. // Attention ! dans cette implantation on duplique beaucoup de sommets. Une meilleur stratégie est de passer
  188. // par un Index Buffer Object, que nous verrons dans les prochains TDs
  189. }
  190. }