Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

600 строки
19 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://sam.zoy.org/projects/COPYING.WTFPL for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cmath>
  14. #include <cstdio>
  15. #include "core.h"
  16. #include "lolgl.h"
  17. #include "loldebug.h"
  18. using namespace std;
  19. namespace lol
  20. {
  21. /*
  22. * DebugQuad implementation class
  23. */
  24. static int const NUM_ARRAYS = 2;
  25. static int const NUM_BUFFERS = 6;
  26. static int const NUM_ATTRS = 6;
  27. static int const NUM_SHADERS = 6;
  28. static int const NUM_TEXTURES = 1;
  29. static int const TEX_SIZE = 32;
  30. class DebugQuadData
  31. {
  32. friend class DebugQuad;
  33. private:
  34. vec2 orig, step, aa, bb;
  35. int initialised;
  36. float time;
  37. GLuint array[NUM_ARRAYS];
  38. GLuint buffer[NUM_BUFFERS];
  39. Shader *shader[NUM_SHADERS];
  40. GLuint attr[NUM_ATTRS];
  41. GLuint texture[NUM_TEXTURES];
  42. uint8_t image[1][TEX_SIZE * TEX_SIZE * 4];
  43. };
  44. /*
  45. * Public DebugQuad class
  46. */
  47. DebugQuad::DebugQuad()
  48. : data(new DebugQuadData())
  49. {
  50. data->initialised = 0;
  51. data->time = RandF(10000.0f);
  52. drawgroup = DRAWGROUP_HUD;
  53. }
  54. void DebugQuad::TickGame(float deltams)
  55. {
  56. Entity::TickGame(deltams);
  57. data->time += deltams;
  58. }
  59. void DebugQuad::TickDraw(float deltams)
  60. {
  61. Entity::TickDraw(deltams);
  62. if (!data->initialised && !IsDestroying())
  63. {
  64. glGenVertexArrays(NUM_ARRAYS, data->array);
  65. glGenBuffers(NUM_BUFFERS, data->buffer);
  66. glGenTextures(NUM_TEXTURES, data->texture);
  67. for (int i = 0; i < NUM_SHADERS; i++)
  68. data->shader[i] = NULL;
  69. /* Checkerboard texture */
  70. glEnable(GL_TEXTURE_2D);
  71. glBindTexture(GL_TEXTURE_2D, data->texture[0]);
  72. for (int j = 0; j < TEX_SIZE; j++)
  73. for (int i = 0; i < TEX_SIZE; i++)
  74. {
  75. uint8_t wb = (((i / 2) ^ (j / 2)) & 1) * 0xff;
  76. data->image[0][(j * TEX_SIZE + i) * 4 + 0] = wb;
  77. data->image[0][(j * TEX_SIZE + i) * 4 + 1] = wb;
  78. data->image[0][(j * TEX_SIZE + i) * 4 + 2] = wb;
  79. data->image[0][(j * TEX_SIZE + i) * 4 + 3] = 0xff;
  80. }
  81. /* Use GL_RGBA instead of 4 for the internal format (Android) */
  82. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 0,
  83. GL_RGBA, GL_UNSIGNED_BYTE, data->image[0]);
  84. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  85. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  86. data->initialised = 1;
  87. }
  88. else if (data->initialised && IsDestroying())
  89. {
  90. glDeleteVertexArrays(NUM_ARRAYS, data->array);
  91. glDeleteBuffers(NUM_BUFFERS, data->buffer);
  92. glDeleteTextures(NUM_TEXTURES, data->texture);
  93. for (int i = 0; i < NUM_SHADERS; i++)
  94. if (data->shader[i])
  95. Shader::Destroy(data->shader[i]);
  96. data->initialised = 0;
  97. }
  98. /* Reset GL states to something reasonably safe */
  99. glMatrixMode(GL_PROJECTION);
  100. glLoadIdentity();
  101. glMatrixMode(GL_MODELVIEW);
  102. glLoadIdentity();
  103. glDisable(GL_TEXTURE_2D);
  104. glClientActiveTexture(GL_TEXTURE0);
  105. glBindBuffer(GL_ARRAY_BUFFER, 0);
  106. glUseProgram(0);
  107. /* Prepare our quad coordinates */
  108. vec2i const layout(4, 3);
  109. data->step = vec2(2.0f, -2.0f) / (3 * layout + vec2i(1));
  110. data->orig = vec2(-1.0f, 1.0f) + data->step;
  111. data->aa = data->orig;
  112. data->bb = data->orig + 2.0f * data->step;
  113. /* Generate a few random numbers */
  114. float f1 = 0.5f + 0.5f * sinf(0.00034f * data->time);
  115. float f2 = 0.5f + 0.5f * sinf(0.00053f * data->time + 1.0f);
  116. float f3 = 0.5f + 0.5f * sinf(0.00072f * data->time + 4.0f);
  117. float f4 = 0.5f + 0.5f * sinf(0.00091f * data->time + 8.0f);
  118. GLfloat const colors[] = { f1, f2, f3, f4, f2, f1, f3, f1, f4,
  119. f3, f1, f4, f4, f3, f2, f1, f2, f3 };
  120. GLfloat const texcoords[] = { f1, f3, f3, f2, f2, f4,
  121. f2, f4, f4, f1, f1, f3 };
  122. #if defined HAVE_GLBEGIN || defined USE_GLEW
  123. /*
  124. * Test #1: simple glBegin code
  125. * Renders an orange square.
  126. */
  127. glColor3f(0.8f, 0.5f, 0.2f);
  128. glBegin(GL_TRIANGLES);
  129. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  130. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  131. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  132. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  133. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  134. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  135. glEnd();
  136. Advance();
  137. /*
  138. * Test #2: glBegin + per-vertex coloring
  139. * Renders a multicolored square with varying colors.
  140. */
  141. glBegin(GL_TRIANGLES);
  142. glColor3f(f1, f2, f3);
  143. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  144. glColor3f(f4, f2, f1);
  145. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  146. glColor3f(f3, f1, f4);
  147. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  148. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  149. glColor3f(f4, f3, f2);
  150. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  151. glColor3f(f1, f2, f3);
  152. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  153. glEnd();
  154. Advance();
  155. /*
  156. * Test #3: glBegin + texture
  157. * Renders an animated black-and-white distorted checkerboard.
  158. */
  159. glEnable(GL_TEXTURE_2D);
  160. glBindTexture(GL_TEXTURE_2D, data->texture[0]);
  161. glColor3f(1.0f, 1.0f, 1.0f);
  162. glBegin(GL_TRIANGLES);
  163. glTexCoord2f(f1, f3);
  164. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  165. glTexCoord2f(f3, f2);
  166. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  167. glTexCoord2f(f2, f4);
  168. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  169. glTexCoord2f(f2, f4);
  170. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  171. glTexCoord2f(f4, f1);
  172. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  173. glTexCoord2f(f1, f3);
  174. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  175. glEnd();
  176. glDisable(GL_TEXTURE_2D);
  177. Advance();
  178. /*
  179. * Test #4: glBegin + color in fragment shader
  180. * Renders a static, coloured and tiled pattern.
  181. */
  182. if (!data->shader[0])
  183. data->shader[0] = Shader::Create(
  184. "#version 110\n"
  185. "void main()"
  186. "{"
  187. " gl_Position = gl_Vertex;"
  188. "}",
  189. "#version 110\n"
  190. "void main()"
  191. "{"
  192. " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);"
  193. " float dy = mod(gl_FragCoord.x * 0.125, 1.0);"
  194. " float dz = mod(gl_FragCoord.y * 0.125, 1.0);"
  195. " gl_FragColor = vec4(dx, dy, dz, 1.0);"
  196. "}");
  197. data->shader[0]->Bind();
  198. glColor3f(0.0f, 1.0f, 1.0f);
  199. glBegin(GL_TRIANGLES);
  200. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  201. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  202. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  203. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  204. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  205. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  206. glEnd();
  207. glUseProgram(0);
  208. Advance();
  209. /*
  210. * Test #5: glBegin + pass color from vertex shader to fragment shader
  211. * Renders a multicolored square with varying colors.
  212. */
  213. if (!data->shader[1])
  214. data->shader[1] = Shader::Create(
  215. "#version 110\n"
  216. "varying vec4 pass_Color;"
  217. "void main()"
  218. "{"
  219. " float r = gl_MultiTexCoord0.x;"
  220. " float g = gl_MultiTexCoord0.y;"
  221. " pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);"
  222. " gl_Position = gl_Vertex;"
  223. "}",
  224. "#version 110\n"
  225. "varying vec4 pass_Color;"
  226. "void main()"
  227. "{"
  228. " gl_FragColor = pass_Color;"
  229. "}");
  230. data->shader[1]->Bind();
  231. glColor3f(0.0f, 1.0f, 1.0f);
  232. glBegin(GL_TRIANGLES);
  233. glTexCoord2f(f1, f3);
  234. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  235. glTexCoord2f(f3, f2);
  236. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  237. glTexCoord2f(f2, f4);
  238. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  239. glTexCoord2f(f2, f4);
  240. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  241. glTexCoord2f(f4, f1);
  242. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  243. glTexCoord2f(f1, f3);
  244. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  245. glEnd();
  246. glUseProgram(0);
  247. Advance();
  248. /*
  249. * Test #6: glBegin + apply texture in fragment shader
  250. * Renders an animated black-and-white distorted checkerboard with a
  251. * zoom ratio twice the one in test #3.
  252. */
  253. if (!data->shader[2])
  254. data->shader[2] = Shader::Create(
  255. "#version 110\n"
  256. "void main()"
  257. "{"
  258. " gl_TexCoord[0] = gl_MultiTexCoord0;"
  259. " gl_Position = gl_Vertex;"
  260. "}",
  261. "#version 110\n"
  262. "uniform sampler2D tex;"
  263. "void main()"
  264. "{"
  265. " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy * 0.25);"
  266. "}");
  267. data->shader[2]->Bind();
  268. glColor3f(0.0f, 1.0f, 1.0f);
  269. glEnable(GL_TEXTURE_2D);
  270. glBindTexture(GL_TEXTURE_2D, data->texture[0]);
  271. glBegin(GL_TRIANGLES);
  272. glTexCoord2f(f1, f3);
  273. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  274. glTexCoord2f(f3, f2);
  275. glVertex3f(data->bb.x, data->bb.y, 0.0f);
  276. glTexCoord2f(f2, f4);
  277. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  278. glTexCoord2f(f2, f4);
  279. glVertex3f(data->bb.x, data->aa.y, 0.0f);
  280. glTexCoord2f(f4, f1);
  281. glVertex3f(data->aa.x, data->aa.y, 0.0f);
  282. glTexCoord2f(f1, f3);
  283. glVertex3f(data->aa.x, data->bb.y, 0.0f);
  284. glEnd();
  285. glUseProgram(0);
  286. glDisable(GL_TEXTURE_2D);
  287. Advance();
  288. #endif
  289. /*
  290. * Test #7: vertex buffer + per-vertex coloring
  291. * Renders a multicolored square with varying colors.
  292. */
  293. GLfloat const vertices1[] = { data->aa.x, data->bb.y, 0.0f,
  294. data->bb.x, data->bb.y, 0.0f,
  295. data->bb.x, data->aa.y, 0.0f,
  296. data->bb.x, data->aa.y, 0.0f,
  297. data->aa.x, data->aa.y, 0.0f,
  298. data->aa.x, data->bb.y, 0.0f };
  299. glEnableClientState(GL_COLOR_ARRAY);
  300. glEnableClientState(GL_VERTEX_ARRAY);
  301. glColorPointer(3, GL_FLOAT, 0, colors);
  302. glVertexPointer(3, GL_FLOAT, 0, vertices1);
  303. glDrawArrays(GL_TRIANGLES, 0, 6);
  304. glDisableClientState(GL_VERTEX_ARRAY);
  305. glDisableClientState(GL_COLOR_ARRAY);
  306. Advance();
  307. /*
  308. * Test #8: vertex buffer + per-vertex coloring + texture
  309. * Renders a multicolored square with varying colors multiplied with an
  310. * animated distorted checkerboard.
  311. */
  312. GLfloat const vertices2[] = { data->aa.x, data->bb.y, 0.0f,
  313. data->bb.x, data->bb.y, 0.0f,
  314. data->bb.x, data->aa.y, 0.0f,
  315. data->bb.x, data->aa.y, 0.0f,
  316. data->aa.x, data->aa.y, 0.0f,
  317. data->aa.x, data->bb.y, 0.0f };
  318. glEnable(GL_TEXTURE_2D);
  319. glBindTexture(GL_TEXTURE_2D, data->texture[0]);
  320. glEnableClientState(GL_COLOR_ARRAY);
  321. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  322. glEnableClientState(GL_VERTEX_ARRAY);
  323. glColorPointer(3, GL_FLOAT, 0, colors);
  324. glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
  325. glVertexPointer(3, GL_FLOAT, 0, vertices2);
  326. glDrawArrays(GL_TRIANGLES, 0, 6);
  327. glDisableClientState(GL_VERTEX_ARRAY);
  328. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  329. glDisableClientState(GL_COLOR_ARRAY);
  330. glDisable(GL_TEXTURE_2D);
  331. Advance();
  332. /*
  333. * Test #9: vertex buffer + texture & color in 1.10 fragment shader
  334. * Renders a multicolored square with varying colors xored with an
  335. * animated distorted checkerboard.
  336. */
  337. if (!data->shader[3])
  338. data->shader[3] = Shader::Create(
  339. "#version 110\n"
  340. "varying vec4 pass_Color;"
  341. "void main()"
  342. "{"
  343. " gl_TexCoord[0] = gl_MultiTexCoord0;"
  344. " pass_Color = gl_Color;"
  345. " gl_Position = gl_Vertex;"
  346. "}",
  347. "#version 110\n"
  348. "varying vec4 pass_Color;"
  349. "uniform sampler2D tex;"
  350. "void main()"
  351. "{"
  352. " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);"
  353. " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);"
  354. "}");
  355. data->shader[3]->Bind();
  356. GLfloat const vertices3[] = { data->aa.x, data->bb.y, 0.0f,
  357. data->bb.x, data->bb.y, 0.0f,
  358. data->bb.x, data->aa.y, 0.0f,
  359. data->bb.x, data->aa.y, 0.0f,
  360. data->aa.x, data->aa.y, 0.0f,
  361. data->aa.x, data->bb.y, 0.0f };
  362. glEnableClientState(GL_VERTEX_ARRAY);
  363. glEnableClientState(GL_COLOR_ARRAY);
  364. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  365. glVertexPointer(3, GL_FLOAT, 0, vertices3);
  366. glColorPointer(3, GL_FLOAT, 0, colors);
  367. glTexCoordPointer(2, GL_FLOAT, 0, texcoords);
  368. glDrawArrays(GL_TRIANGLES, 0, 6);
  369. glDisableClientState(GL_VERTEX_ARRAY);
  370. glDisableClientState(GL_COLOR_ARRAY);
  371. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  372. glUseProgram(0);
  373. Advance();
  374. /*
  375. * Test #10: vertex buffer + texture & color in 1.20 fragment shader
  376. * Renders a multicolored square with varying colors xored with an
  377. * animated distorted checkerboard.
  378. */
  379. if (!data->shader[4])
  380. {
  381. data->shader[4] = Shader::Create(
  382. "#version 120\n"
  383. "attribute vec3 in_Vertex;"
  384. "attribute vec3 in_Color;"
  385. "attribute vec2 in_MultiTexCoord0;"
  386. "varying vec4 pass_Color;"
  387. "void main()"
  388. "{"
  389. " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);"
  390. " pass_Color = vec4(in_Color, 1.0);"
  391. " gl_Position = vec4(in_Vertex, 1.0);"
  392. "}",
  393. "#version 120\n"
  394. "varying vec4 pass_Color;"
  395. "uniform sampler2D tex;"
  396. "void main()"
  397. "{"
  398. " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);"
  399. " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);"
  400. "}");
  401. data->attr[0] = data->shader[4]->GetAttribLocation("in_Vertex");
  402. data->attr[1] = data->shader[4]->GetAttribLocation("in_Color");
  403. data->attr[2] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0");
  404. }
  405. data->shader[4]->Bind();
  406. GLfloat const vertices4[] = { data->aa.x, data->bb.y, 0.0f,
  407. data->bb.x, data->bb.y, 0.0f,
  408. data->bb.x, data->aa.y, 0.0f,
  409. data->bb.x, data->aa.y, 0.0f,
  410. data->aa.x, data->aa.y, 0.0f,
  411. data->aa.x, data->bb.y, 0.0f };
  412. glBindVertexArray(data->array[0]);
  413. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[0]);
  414. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices4), vertices4,
  415. GL_DYNAMIC_DRAW);
  416. glVertexAttribPointer(data->attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0);
  417. glEnableVertexAttribArray(data->attr[0]);
  418. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[1]);
  419. glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors,
  420. GL_DYNAMIC_DRAW);
  421. glVertexAttribPointer(data->attr[1], 3, GL_FLOAT, GL_FALSE, 0, 0);
  422. glEnableVertexAttribArray(data->attr[1]);
  423. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[2]);
  424. glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords,
  425. GL_DYNAMIC_DRAW);
  426. glVertexAttribPointer(data->attr[2], 2, GL_FLOAT, GL_FALSE, 0, 0);
  427. glEnableVertexAttribArray(data->attr[2]);
  428. glDrawArrays(GL_TRIANGLES, 0, 6);
  429. glBindVertexArray(0);
  430. glDisableVertexAttribArray(data->attr[0]);
  431. glDisableVertexAttribArray(data->attr[1]);
  432. glDisableVertexAttribArray(data->attr[2]);
  433. glUseProgram(0);
  434. Advance();
  435. /*
  436. * Test #11: vertex buffer + texture & color in 1.30 fragment shader
  437. * Renders a multicolored square with varying colors xored with an
  438. * animated distorted checkerboard.
  439. */
  440. if (!data->shader[5])
  441. {
  442. data->shader[5] = Shader::Create(
  443. "#version 130\n"
  444. "in vec3 in_Vertex;"
  445. "in vec3 in_Color;"
  446. "in vec2 in_MultiTexCoord0;"
  447. "out vec4 pass_Color;"
  448. "void main()"
  449. "{"
  450. " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);"
  451. " pass_Color = vec4(in_Color, 1.0);"
  452. " gl_Position = vec4(in_Vertex, 1.0);"
  453. "}",
  454. "#version 130\n"
  455. "in vec4 pass_Color;"
  456. "uniform sampler2D tex;"
  457. "void main()"
  458. "{"
  459. " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);"
  460. " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);"
  461. "}");
  462. data->attr[3] = data->shader[4]->GetAttribLocation("in_Vertex");
  463. data->attr[4] = data->shader[4]->GetAttribLocation("in_Color");
  464. data->attr[5] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0");
  465. }
  466. data->shader[5]->Bind();
  467. GLfloat const vertices5[] = { data->aa.x, data->bb.y, 0.0f,
  468. data->bb.x, data->bb.y, 0.0f,
  469. data->bb.x, data->aa.y, 0.0f,
  470. data->bb.x, data->aa.y, 0.0f,
  471. data->aa.x, data->aa.y, 0.0f,
  472. data->aa.x, data->bb.y, 0.0f };
  473. glBindVertexArray(data->array[1]);
  474. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[3]);
  475. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices5), vertices5,
  476. GL_DYNAMIC_DRAW);
  477. glVertexAttribPointer(data->attr[3], 3, GL_FLOAT, GL_FALSE, 0, 0);
  478. glEnableVertexAttribArray(data->attr[3]);
  479. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[4]);
  480. glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors,
  481. GL_DYNAMIC_DRAW);
  482. glVertexAttribPointer(data->attr[4], 3, GL_FLOAT, GL_FALSE, 0, 0);
  483. glEnableVertexAttribArray(data->attr[4]);
  484. glBindBuffer(GL_ARRAY_BUFFER, data->buffer[5]);
  485. glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords,
  486. GL_DYNAMIC_DRAW);
  487. glVertexAttribPointer(data->attr[5], 2, GL_FLOAT, GL_FALSE, 0, 0);
  488. glEnableVertexAttribArray(data->attr[5]);
  489. glDrawArrays(GL_TRIANGLES, 0, 6);
  490. glBindVertexArray(0);
  491. glDisableVertexAttribArray(data->attr[3]);
  492. glDisableVertexAttribArray(data->attr[4]);
  493. glDisableVertexAttribArray(data->attr[5]);
  494. glUseProgram(0);
  495. Advance();
  496. }
  497. void DebugQuad::Advance()
  498. {
  499. data->aa.x += 3.0f * data->step.x;
  500. data->bb.x += 3.0f * data->step.x;
  501. if (data->bb.x > 1.0f)
  502. {
  503. data->aa.x = data->orig.x;
  504. data->bb.x = data->orig.x + 2.0f * data->step.x;
  505. data->aa.y += 3.0f * data->step.y;
  506. data->bb.y += 3.0f * data->step.y;
  507. }
  508. }
  509. DebugQuad::~DebugQuad()
  510. {
  511. delete data;
  512. }
  513. } /* namespace lol */