Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

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