DirectRenderer.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #include "DirectRenderer.h"
  2. #include "GameEngine.h"
  3. #include <cmath>
  4. Texture DirectRenderer::FONTS[FONTS_LENGTH];
  5. DirectRenderer::DirectRenderer()
  6. {
  7. }
  8. DirectRenderer::DirectRenderer(const DirectRenderer& orig)
  9. {
  10. }
  11. DirectRenderer::~DirectRenderer()
  12. {
  13. glDeleteVertexArrays(1, &vba);
  14. glDeleteBuffers(1, &vbo);
  15. }
  16. void DirectRenderer::init()
  17. {
  18. if(!FONTS[0].isLoaded())
  19. {
  20. FONTS[0].load("resources/font8x8.png");
  21. }
  22. if(!FONTS[1].isLoaded())
  23. {
  24. FONTS[1].load("resources/font16x16.png");
  25. }
  26. if(!FONTS[2].isLoaded())
  27. {
  28. FONTS[2].load("resources/font24x24.png");
  29. }
  30. glGenVertexArrays(1, &vba);
  31. glGenBuffers(1, &vbo);
  32. glBindVertexArray(vba);
  33. glBindBuffer(GL_ARRAY_BUFFER, vbo);
  34. glEnableVertexAttribArray(0);
  35. glVertexAttribPointer(0, 3, GL_FLOAT, false, 24, (GLvoid*) 0);
  36. glEnableVertexAttribArray(1);
  37. glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, true, 24, (GLvoid*) 12);
  38. glEnableVertexAttribArray(2);
  39. glVertexAttribPointer(2, 2, GL_FLOAT, false, 24, (GLvoid*) 16);
  40. }
  41. void DirectRenderer::prepare()
  42. {
  43. int scale = GameEngine::scale;
  44. view.set(0, 0, (2.0f * scale) / GameEngine::width);
  45. view.set(1, 1, (-2.0f * scale) / GameEngine::height);
  46. view.set(2, 2, (-1.0f * scale) / GameEngine::height);
  47. view.set(0, 3, -1.0f);
  48. view.set(1, 3, 1.0f);
  49. view.set(2, 3, 0.5f);
  50. view.set(3, 3, 1.0f);
  51. GameEngine::updateView(view);
  52. glUniformMatrix4fv(GameEngine::unifProjMatrix, 1, 0, proj.getValues());
  53. }
  54. void DirectRenderer::drawRectangle(float minX, float minY, float maxX, float maxY, float tMinX, float tMinY, float tMaxX, float tMaxY, IntColor c)
  55. {
  56. glBindBuffer(GL_ARRAY_BUFFER, vbo);
  57. if(offset + OBJECT_LENGTH >= BUFFER_LENGTH)
  58. {
  59. offset = 0;
  60. glBufferData(GL_ARRAY_BUFFER, BUFFER_LENGTH, NULL, GL_STREAM_DRAW);
  61. }
  62. float* buffer = (float*) glMapBufferRange(GL_ARRAY_BUFFER, offset, OBJECT_LENGTH, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
  63. if(buffer == NULL)
  64. {
  65. return;
  66. }
  67. buffer[0] = minX;
  68. buffer[1] = maxY;
  69. buffer[2] = 0.0f;
  70. buffer[3] = *((float*) (&c));
  71. buffer[4] = tMinX;
  72. buffer[5] = tMaxY;
  73. buffer[6] = maxX;
  74. buffer[7] = maxY;
  75. buffer[8] = 0.0f;
  76. buffer[9] = *((float*) (&c));
  77. buffer[10] = tMaxX;
  78. buffer[11] = tMaxY;
  79. buffer[12] = minX;
  80. buffer[13] = minY;
  81. buffer[14] = 0.0f;
  82. buffer[15] = *((float*) (&c));
  83. buffer[16] = tMinX;
  84. buffer[17] = tMinY;
  85. buffer[18] = maxX;
  86. buffer[19] = minY;
  87. buffer[20] = 0.0f;
  88. buffer[21] = *((float*) (&c));
  89. buffer[22] = tMaxX;
  90. buffer[23] = tMinY;
  91. glUnmapBuffer(GL_ARRAY_BUFFER);
  92. glBindVertexArray(vba);
  93. glDrawArrays(GL_TRIANGLE_STRIP, offset / (OBJECT_LENGTH / 4), 4);
  94. offset += OBJECT_LENGTH;
  95. }
  96. void DirectRenderer::drawRectangle(float minX, float minY, float maxX, float maxY, IntColor c)
  97. {
  98. drawRectangle(minX, minY, maxX, maxY, 0.0f, 0.0f, 0.0f, 0.0f, c);
  99. }
  100. void DirectRenderer::drawRectangle(float minX, float minY, float maxX, float maxY, float tMinX, float tMinY, float tMaxX, float tMaxY)
  101. {
  102. drawRectangle(minX, minY, maxX, maxY, tMinX, tMinY, tMaxX, tMaxY, 0);
  103. }
  104. float DirectRenderer::drawString(float x, float y, bool shadow, string& s)
  105. {
  106. int size = s.length() * OBJECT_LENGTH * (shadow + 1);
  107. glBindBuffer(GL_ARRAY_BUFFER, vbo);
  108. if(offset + size >= BUFFER_LENGTH)
  109. {
  110. offset = 0;
  111. glBufferData(GL_ARRAY_BUFFER, BUFFER_LENGTH, NULL, GL_STREAM_DRAW);
  112. }
  113. float* buffer = (float*) glMapBufferRange(GL_ARRAY_BUFFER, offset, size, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
  114. if(buffer == NULL)
  115. {
  116. return y;
  117. }
  118. int index = 0;
  119. if(shadow)
  120. {
  121. addString(x + SHADOW_STEP, y + SHADOW_STEP, index, buffer, Color::DARK_COLORS, s);
  122. }
  123. y = addString(x, y, index, buffer, Color::COLORS, s);
  124. glUnmapBuffer(GL_ARRAY_BUFFER);
  125. glBindVertexArray(vba);
  126. FONTS[min(GameEngine::scale - 1, FONTS_LENGTH - 1)].bind();
  127. glDrawArrays(GL_TRIANGLE_STRIP, offset / (OBJECT_LENGTH / 4), (index + 1) / 6);
  128. offset += size;
  129. return y;
  130. }
  131. float DirectRenderer::addString(float x, float y, int& index, float* data, const IntColor* color, string& s)
  132. {
  133. int l = min((int) s.length(), static_cast<int>(MAX_STRING_LENGTH));
  134. //x = roundf(x / GameEngine::scale) * GameEngine::scale;
  135. //y = roundf(y / GameEngine::scale) * GameEngine::scale;
  136. float oldX = x;
  137. float currentColor = *((float*) (&(color[Color::COLOR_AMOUNT - 1])));
  138. for(int pos = 0; pos < l; pos++)
  139. {
  140. char c = s[pos];
  141. if(c == COLOR_CHAR)
  142. {
  143. pos++;
  144. if(pos < l)
  145. {
  146. int index = s[pos] - 'a';
  147. if(index >= 0 && index < Color::COLOR_AMOUNT)
  148. {
  149. currentColor = *((float*) (&(color[index])));
  150. }
  151. }
  152. continue;
  153. }
  154. else if(c == '\n')
  155. {
  156. y += FONT_SIZE + LINE_STEP;
  157. x = oldX;
  158. continue;
  159. }
  160. float tMinX = (c & 0xF) * 0.0625f;
  161. float tMinY = (c >> 4) * 0.0625f;
  162. float tMaxX = tMinX + 0.0625f;
  163. float tMaxY = tMinY + 0.0625f;
  164. float maxX = x + FONT_SIZE;
  165. float maxY = y + FONT_SIZE;
  166. data[index++] = x;
  167. data[index++] = maxY;
  168. data[index++] = 0.0f;
  169. data[index++] = currentColor;
  170. data[index++] = tMinX;
  171. data[index++] = tMaxY;
  172. data[index++] = maxX;
  173. data[index++] = maxY;
  174. data[index++] = 0.0f;
  175. data[index++] = currentColor;
  176. data[index++] = tMaxX;
  177. data[index++] = tMaxY;
  178. data[index++] = x;
  179. data[index++] = y;
  180. data[index++] = 0.0f;
  181. data[index++] = currentColor;
  182. data[index++] = tMinX;
  183. data[index++] = tMinY;
  184. data[index++] = maxX;
  185. data[index++] = y;
  186. data[index++] = 0.0f;
  187. data[index++] = currentColor;
  188. data[index++] = tMaxX;
  189. data[index++] = tMinY;
  190. x += FONT_SIZE;
  191. }
  192. return y + FONT_SIZE + LINE_STEP;
  193. }
  194. /*
  195. public Rectangle getSize(String s)
  196. {
  197. int length = 0;
  198. int counter = 0;
  199. for(int i = 0; i < s.length(); i++)
  200. {
  201. switch(s.charAt(i))
  202. {
  203. case '\n':
  204. counter++;
  205. break;
  206. case COLOR_CHAR:
  207. i++;
  208. break;
  209. default:
  210. length++;
  211. }
  212. }
  213. return new Rectangle(FONT_SIZE * length, (FONT_SIZE + LINE_STEP) * counter);
  214. }
  215. public Rectangle getSize(int w, int h)
  216. {
  217. return new Rectangle(FONT_SIZE * w, (FONT_SIZE + LINE_STEP) * h);
  218. }
  219. public float getHeight()
  220. {
  221. return FONT_SIZE + LINE_STEP;
  222. }
  223. public float getWidth()
  224. {
  225. return FONT_SIZE;
  226. }
  227. */