rays 0.1.28 → 0.1.30

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/bitmap.cpp +1 -1
  3. data/.doc/ext/rays/bounds.cpp +1 -1
  4. data/.doc/ext/rays/camera.cpp +1 -1
  5. data/.doc/ext/rays/color.cpp +1 -1
  6. data/.doc/ext/rays/color_space.cpp +1 -1
  7. data/.doc/ext/rays/exception.cpp +45 -0
  8. data/.doc/ext/rays/font.cpp +1 -1
  9. data/.doc/ext/rays/image.cpp +1 -1
  10. data/.doc/ext/rays/matrix.cpp +1 -1
  11. data/.doc/ext/rays/native.cpp +35 -33
  12. data/.doc/ext/rays/noise.cpp +1 -1
  13. data/.doc/ext/rays/painter.cpp +1 -1
  14. data/.doc/ext/rays/point.cpp +1 -1
  15. data/.doc/ext/rays/polygon.cpp +1 -1
  16. data/.doc/ext/rays/polygon_line.cpp +1 -1
  17. data/.doc/ext/rays/polyline.cpp +1 -1
  18. data/.doc/ext/rays/shader.cpp +101 -7
  19. data/VERSION +1 -1
  20. data/ext/rays/bitmap.cpp +1 -1
  21. data/ext/rays/bounds.cpp +1 -1
  22. data/ext/rays/camera.cpp +1 -1
  23. data/ext/rays/color.cpp +1 -1
  24. data/ext/rays/color_space.cpp +1 -1
  25. data/ext/rays/defs.h +1 -0
  26. data/ext/rays/exception.cpp +45 -0
  27. data/ext/rays/extconf.rb +1 -1
  28. data/ext/rays/font.cpp +1 -1
  29. data/ext/rays/image.cpp +1 -1
  30. data/ext/rays/matrix.cpp +1 -1
  31. data/ext/rays/native.cpp +35 -33
  32. data/ext/rays/noise.cpp +1 -1
  33. data/ext/rays/painter.cpp +1 -1
  34. data/ext/rays/point.cpp +1 -1
  35. data/ext/rays/polygon.cpp +1 -1
  36. data/ext/rays/polygon_line.cpp +1 -1
  37. data/ext/rays/polyline.cpp +1 -1
  38. data/ext/rays/shader.cpp +102 -6
  39. data/include/rays/exception.h +11 -0
  40. data/include/rays/ruby/bitmap.h +0 -1
  41. data/include/rays/ruby/bounds.h +0 -2
  42. data/include/rays/ruby/camera.h +0 -1
  43. data/include/rays/ruby/color.h +0 -2
  44. data/include/rays/ruby/color_space.h +0 -1
  45. data/include/rays/ruby/defs.h +30 -0
  46. data/include/rays/ruby/exception.h +28 -0
  47. data/include/rays/ruby/font.h +0 -1
  48. data/include/rays/ruby/image.h +0 -1
  49. data/include/rays/ruby/matrix.h +0 -1
  50. data/include/rays/ruby/painter.h +0 -1
  51. data/include/rays/ruby/point.h +0 -2
  52. data/include/rays/ruby/polygon.h +0 -1
  53. data/include/rays/ruby/polyline.h +0 -1
  54. data/include/rays/ruby/rays.h +0 -1
  55. data/include/rays/ruby/shader.h +0 -1
  56. data/include/rays/ruby.h +2 -0
  57. data/include/rays/shader.h +48 -1
  58. data/lib/rays/painter.rb +6 -5
  59. data/lib/rays/point.rb +1 -0
  60. data/lib/rays/shader.rb +18 -5
  61. data/rays.gemspec +3 -3
  62. data/src/exception.cpp +13 -0
  63. data/src/image.cpp +6 -4
  64. data/src/opengl.cpp +20 -7
  65. data/src/opengl.h +5 -3
  66. data/src/osx/font.mm +0 -2
  67. data/src/osx/opengl.mm +17 -2
  68. data/src/painter.cpp +181 -148
  69. data/src/shader.cpp +333 -53
  70. data/src/shader.h +53 -14
  71. data/src/shader_program.cpp +53 -27
  72. data/src/shader_program.h +8 -1
  73. data/src/shader_source.cpp +2 -2
  74. data/src/texture.cpp +80 -63
  75. data/test/helper.rb +1 -1
  76. data/test/test_point.rb +6 -5
  77. data/test/test_rays.rb +2 -2
  78. data/test/test_shader.rb +151 -14
  79. metadata +12 -7
data/src/opengl.cpp CHANGED
@@ -8,10 +8,10 @@ namespace Rays
8
8
  {
9
9
 
10
10
 
11
- GLenum
12
- OpenGL_get_error ()
11
+ bool
12
+ OpenGL_has_error ()
13
13
  {
14
- return glGetError();
14
+ return glGetError() != GL_NO_ERROR;
15
15
  }
16
16
 
17
17
  static String
@@ -24,12 +24,12 @@ namespace Rays
24
24
  case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
25
25
  case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
26
26
  case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
27
- #ifndef IOS
27
+ #if !defined(GL_VERSION_3_0) && !defined(GL_ES_VERSION_2_0)
28
28
  case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW";
29
29
  case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW";
30
+ case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION";
31
+ case GL_TABLE_TOO_LARGE: return "GL_TABLE_TOO_LARGE";
30
32
  #endif
31
- case 0x506: return "GL_INVALID_FRAMEBUFFER_OPERATION";
32
- case 0x8031: return "GL_TABLE_TOO_LARGE";
33
33
  default: return "UNKNOWN ERROR";
34
34
  }
35
35
  }
@@ -37,10 +37,23 @@ namespace Rays
37
37
  void
38
38
  OpenGL_check_error (const char* file, int line)
39
39
  {
40
- GLenum e = OpenGL_get_error();
40
+ GLenum e = glGetError();
41
41
  if (e != GL_NO_ERROR)
42
42
  opengl_error(file, line, "OpenGL error %s", get_error_name(e).c_str());
43
43
  }
44
44
 
45
+ void
46
+ OpenGL_check_error (const char* file, int line, const char* format, ...)
47
+ {
48
+ GLenum e = glGetError();
49
+ if (e != GL_NO_ERROR)
50
+ {
51
+ XOT_STRINGF(format, s);
52
+ opengl_error(
53
+ file, line,
54
+ "OpenGL error %s: %s", get_error_name(e).c_str(), s.c_str());
55
+ }
56
+ }
57
+
45
58
 
46
59
  }// Rays
data/src/opengl.h CHANGED
@@ -22,13 +22,15 @@ namespace Rays
22
22
  {
23
23
 
24
24
 
25
- void OpenGL_set_context (Context context);
25
+ void OpenGL_set_context (Context context);
26
26
 
27
27
  Context OpenGL_get_context ();
28
28
 
29
- GLenum OpenGL_get_error ();
29
+ bool OpenGL_has_error ();
30
30
 
31
- void OpenGL_check_error (const char* file, int line);
31
+ void OpenGL_check_error (const char* file, int line);
32
+
33
+ void OpenGL_check_error (const char* file, int line, const char* format, ...);
32
34
 
33
35
 
34
36
  }// Rays
data/src/osx/font.mm CHANGED
@@ -104,8 +104,6 @@ namespace Rays
104
104
 
105
105
  CGRect rect = CGRectMake(x, context_height - height - y, width, height);
106
106
  CGContextClearRect(context, rect);
107
- //CGContextSetRGBFillColor(context, 0, 0, 0, 1);
108
- //CGContextFillRect(context, rect);
109
107
  CGContextSetRGBFillColor(context, 1, 1, 1, 1);
110
108
 
111
109
  CGContextSaveGState(context);
data/src/osx/opengl.mm CHANGED
@@ -29,8 +29,23 @@ namespace Rays
29
29
  static Context context = NULL;
30
30
  if (!context)
31
31
  {
32
- NSOpenGLPixelFormat* pf = [NSOpenGLView defaultPixelFormat];
33
- context = [[NSOpenGLContext alloc] initWithFormat: pf shareContext: nil];
32
+ NSOpenGLPixelFormatAttribute attribs[] =
33
+ {
34
+ //NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
35
+ //NSOpenGLPFAAccelerated, NSOpenGLPFANoRecovery,
36
+ //NSOpenGLPFADoubleBuffer,
37
+ NSOpenGLPFAAllowOfflineRenderers,
38
+ NSOpenGLPFAColorSize, 32,
39
+ NSOpenGLPFADepthSize, 32,
40
+ //NSOpenGLPFAMultisample,
41
+ //NSOpenGLPFASampleBuffers, 1,
42
+ //NSOpenGLPFASamples, 4,
43
+ 0
44
+ };
45
+ NSOpenGLPixelFormat* pf = [[[NSOpenGLPixelFormat alloc]
46
+ initWithAttributes: attribs] autorelease];
47
+ context = [[[NSOpenGLContext alloc]
48
+ initWithFormat: pf shareContext: nil] autorelease];
34
49
  }
35
50
  return context;
36
51
  }
data/src/painter.cpp CHANGED
@@ -6,6 +6,7 @@
6
6
  #include <memory>
7
7
  #include <vector>
8
8
  #include <algorithm>
9
+ #include <functional>
9
10
  #include <glm/gtc/matrix_transform.hpp>
10
11
  #include "rays/exception.h"
11
12
  #include "rays/point.h"
@@ -93,7 +94,7 @@ namespace Rays
93
94
 
94
95
  const Texture& texture;
95
96
 
96
- Coord2 texcoord_min, texcoord_max;
97
+ Point texcoord_min, texcoord_max;
97
98
 
98
99
  TextureInfo (
99
100
  const Texture& texture,
@@ -236,33 +237,6 @@ namespace Rays
236
237
  return GL_FLOAT;
237
238
  }
238
239
 
239
- static const Shader&
240
- get_default_shader_for_shape ()
241
- {
242
- static const Shader SHADER(
243
- "varying vec4 " VARYING_COLOR ";"
244
- "void main ()"
245
- "{"
246
- " gl_FragColor = v_Color;"
247
- "}");
248
- return SHADER;
249
- }
250
-
251
- static const Shader&
252
- get_default_shader_for_texture ()
253
- {
254
- static const Shader SHADER(
255
- "varying vec4 " VARYING_TEXCOORD ";"
256
- "varying vec4 " VARYING_COLOR ";"
257
- "vec4 sampleTexture(vec2);"
258
- "void main ()"
259
- "{"
260
- " vec4 color = sampleTexture(" VARYING_TEXCOORD ".xy);"
261
- " gl_FragColor = v_Color * color;"
262
- "}");
263
- return SHADER;
264
- }
265
-
266
240
 
267
241
  struct Painter::Data
268
242
  {
@@ -338,7 +312,7 @@ namespace Rays
338
312
  const Coord3* points, size_t npoints,
339
313
  const uint* indices = NULL, size_t nindices = 0,
340
314
  const Coord3* texcoords = NULL,
341
- const Shader& default_shader = get_default_shader_for_shape(),
315
+ const Shader& default_shader = Shader_get_default_shader_for_shape(),
342
316
  const TextureInfo* texinfo = NULL)
343
317
  {
344
318
  if (!points || npoints <= 0)
@@ -347,175 +321,234 @@ namespace Rays
347
321
  if (!painting)
348
322
  invalid_state_error(__FILE__, __LINE__, "'painting' should be true.");
349
323
 
350
- if (!indices || nindices <= 0)
351
- {
352
- default_indices.resize(npoints);
353
- indices = default_indices.get();
354
- nindices = npoints;
355
- }
356
-
357
- if (!texcoords)
358
- texcoords = points;
359
-
360
- const ShaderProgram* program = Shader_get_program(state.shader);
361
- if (!program || !*program)
362
- {
363
- program = Shader_get_program(default_shader);
364
- if (!program || !*program) return;
365
- }
324
+ const Shader& shader = state.shader ? state.shader : default_shader;
325
+ const ShaderProgram* program = Shader_get_program(shader);
326
+ if (!program || !*program) return;
366
327
 
367
328
  ShaderProgram_activate(*program);
368
- apply_builtin_uniforms(*program, texinfo);
369
-
370
- GLint a_position = glGetAttribLocation(program->id(), ATTRIB_POSITION);
371
- GLint a_texcoord = glGetAttribLocation(program->id(), ATTRIB_TEXCOORD);
372
- GLint a_color = glGetAttribLocation(program->id(), ATTRIB_COLOR);
373
- if (a_position < 0 || a_texcoord < 0 || a_color < 0)
374
- opengl_error(__FILE__, __LINE__);
375
-
376
- setup_vertices(
377
- points, npoints, texcoords, color, a_position, a_texcoord, a_color);
378
- //activate_texture(texture);
379
-
380
- glDrawElements(mode, (GLsizei) nindices, GL_UNSIGNED_INT, indices);
381
- OpenGL_check_error(__FILE__, __LINE__);
382
329
 
383
- //deactivate_texture(texture);
384
- cleanup_vertices(a_position, a_texcoord);
330
+ const auto& names = Shader_get_builtin_variable_names(shader);
331
+ apply_builtin_uniforms(*program, names, texinfo);
332
+ apply_attributes(*program, names, points, npoints, texcoords, color);
333
+ draw_indices(mode, indices, nindices, npoints);
334
+ cleanup();
385
335
 
386
336
  ShaderProgram_deactivate();
387
337
  }
388
338
 
389
339
  private:
390
340
 
341
+ std::vector<GLint> locations;
342
+
343
+ std::vector<GLuint> buffers;
344
+
391
345
  void apply_builtin_uniforms (
392
- const ShaderProgram& program, const TextureInfo* texinfo)
346
+ const ShaderProgram& program, const ShaderBuiltinVariableNames& names,
347
+ const TextureInfo* texinfo)
393
348
  {
394
- GLint pos_matrix_loc =
395
- glGetUniformLocation(program.id(), UNIFORM_POSITION_MATRIX);
396
- if (pos_matrix_loc >= 0)
349
+ const Texture* texture = texinfo ? &texinfo->texture : NULL;
350
+
351
+ Matrix texcoord_matrix(1);
352
+ if (texture && *texture)
397
353
  {
398
- glUniformMatrix4fv(
399
- pos_matrix_loc, 1, GL_FALSE, position_matrix.array);
400
- OpenGL_check_error(__FILE__, __LINE__);
354
+ texcoord_matrix.scale(
355
+ 1.0 / texture->reserved_width(),
356
+ 1.0 / texture->reserved_height());
401
357
  }
402
358
 
403
- GLint texcoord_matrix_loc =
404
- glGetUniformLocation(program.id(), UNIFORM_TEXCOORD_MATRIX);
405
- if (texcoord_matrix_loc >= 0)
359
+ for (const auto& name : names.uniform_position_matrix_names)
406
360
  {
407
- static const Matrix TEXCOORD_MATRIX(1);
408
- glUniformMatrix4fv(
409
- texcoord_matrix_loc, 1, GL_FALSE, TEXCOORD_MATRIX.array);
410
- OpenGL_check_error(__FILE__, __LINE__);
361
+ apply_uniform(program, name, [&](GLint loc) {
362
+ glUniformMatrix4fv(loc, 1, GL_FALSE, position_matrix.array);
363
+ });
364
+ }
365
+ for (const auto& name : names.uniform_texcoord_matrix_names)
366
+ {
367
+ apply_uniform(program, name, [&](GLint loc) {
368
+ glUniformMatrix4fv(loc, 1, GL_FALSE, texcoord_matrix.array);
369
+ });
411
370
  }
412
371
 
413
- apply_texture_uniforms(program, texinfo);
414
- }
415
-
416
- void apply_texture_uniforms (
417
- const ShaderProgram& program, const TextureInfo* texinfo)
418
- {
419
- if (!texinfo || !*texinfo) return;
420
-
421
- const Texture& texture = texinfo->texture;
372
+ if (!texinfo || !texture || !*texture) return;
422
373
 
423
- GLint texture_loc =
424
- glGetUniformLocation(program.id(), UNIFORM_TEXTURE);
425
- if (texture_loc >= 0)
374
+ for (const auto& name : names.uniform_texcoord_min_names)
426
375
  {
427
- glActiveTexture(GL_TEXTURE0);
428
- glBindTexture(GL_TEXTURE_2D, texture.id());
429
-
430
- glUniform1i(texture_loc, 0);
431
- OpenGL_check_error(__FILE__, __LINE__);
376
+ apply_uniform(program, name, [&](GLint loc) {
377
+ Point min = texcoord_matrix * texinfo->texcoord_min;
378
+ glUniform3fv(loc, 1, min.array);
379
+ });
432
380
  }
433
-
434
- GLint size_loc =
435
- glGetUniformLocation(program.id(), UNIFORM_TEXTURE_SIZE);
436
- if (size_loc >= 0)
381
+ for (const auto& name : names.uniform_texcoord_max_names)
437
382
  {
438
- glUniform2f(
439
- size_loc, texture.reserved_width(), texture.reserved_height());
440
- OpenGL_check_error(__FILE__, __LINE__);
383
+ apply_uniform(program, name, [&](GLint loc) {
384
+ Point max = texcoord_matrix * texinfo->texcoord_max;
385
+ glUniform3fv(loc, 1, max.array);
386
+ });
441
387
  }
442
-
443
- GLint min_loc =
444
- glGetUniformLocation(program.id(), UNIFORM_TEXCOORD_MIN);
445
- if (min_loc >= 0)
388
+ for (const auto& name : names.uniform_texcoord_offset_names)
446
389
  {
447
- glUniform2fv(min_loc, 1, texinfo->texcoord_min.array);
448
- OpenGL_check_error(__FILE__, __LINE__);
390
+ apply_uniform(program, name, [&](GLint loc) {
391
+ Point offset(1.0 / texture->width(), 1.0 / texture->height());
392
+ glUniform3fv(loc, 1, offset.array);
393
+ });
394
+ }
395
+ for (const auto& name : names.uniform_texture_names)
396
+ {
397
+ apply_uniform(program, name, [&](GLint loc) {
398
+ glActiveTexture(GL_TEXTURE0);
399
+ OpenGL_check_error(__FILE__, __LINE__);
400
+
401
+ glBindTexture(GL_TEXTURE_2D, texture->id());
402
+ OpenGL_check_error(__FILE__, __LINE__);
403
+
404
+ glUniform1i(loc, 0);
405
+ });
449
406
  }
407
+ }
450
408
 
451
- GLint max_loc =
452
- glGetUniformLocation(program.id(), UNIFORM_TEXCOORD_MAX);
453
- if (max_loc >= 0)
409
+ void apply_attributes (
410
+ const ShaderProgram& program, const ShaderBuiltinVariableNames& names,
411
+ const Coord3* points, size_t npoints, const Coord3* texcoords,
412
+ const Color& color)
413
+ {
414
+ assert(points && npoints > 0);
415
+
416
+ apply_attribute(
417
+ program, names.attribute_position_names,
418
+ points, npoints);
419
+
420
+ apply_attribute(
421
+ program, names.attribute_texcoord_names,
422
+ texcoords ? texcoords : points, npoints);
423
+
424
+ #if defined(GL_VERSION_2_1) && !defined(GL_VERSION_3_0)
425
+ // to fix that GL 2.1 with glVertexAttrib4fv() draws nothing
426
+ // with specific glsl 'attribute' name.
427
+ std::vector<Color> colors(npoints, color);
428
+ apply_attribute(
429
+ program, names.attribute_color_names,
430
+ (const Coord4*) &colors[0], npoints);
431
+ #else
432
+ for (const auto& name : names.attribute_color_names)
454
433
  {
455
- glUniform2fv(max_loc, 1, texinfo->texcoord_max.array);
456
- OpenGL_check_error(__FILE__, __LINE__);
434
+ apply_attribute(program, name, [&](GLint loc) {
435
+ glVertexAttrib4fv(loc, color.array);
436
+ });
457
437
  }
438
+ #endif
458
439
  }
459
440
 
460
- void setup_vertices (
461
- const Coord3* points, size_t npoints,
462
- const Coord3* texcoords, const Color& color,
463
- GLuint a_position, GLuint a_texcoord, GLuint a_color)
441
+ template <typename CoordN>
442
+ void apply_attribute(
443
+ const ShaderProgram& program, const auto& names,
444
+ const CoordN* values, size_t nvalues)
464
445
  {
465
- assert(points && npoints >= 0 && texcoords);
446
+ GLuint buffer = 0;
447
+ for (const auto& name : names)
448
+ {
449
+ #ifndef IOS
450
+ if (buffer == 0)
451
+ {
452
+ buffer = create_and_bind_buffer(
453
+ GL_ARRAY_BUFFER, values, sizeof(CoordN) * nvalues);
454
+ values = 0;
455
+ }
456
+ #endif
457
+
458
+ apply_attribute(program, name, [&](GLint loc) {
459
+ glEnableVertexAttribArray(loc);
460
+ OpenGL_check_error(
461
+ __FILE__, __LINE__, "loc: %d %s\n", loc, name.c_str());
462
+
463
+ glVertexAttribPointer(
464
+ loc, CoordN::SIZE, get_gl_type<coord>(), GL_FALSE, 0, values);
465
+
466
+ locations.push_back(loc);
467
+ });
468
+ }
466
469
 
467
- glEnableVertexAttribArray(a_position);
468
- glVertexAttribPointer(
469
- a_position, Coord3::SIZE, get_gl_type<coord>(),
470
- GL_FALSE, sizeof(Coord3), points);
470
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
471
471
  OpenGL_check_error(__FILE__, __LINE__);
472
+ }
472
473
 
473
- glEnableVertexAttribArray(a_texcoord);
474
- glVertexAttribPointer(
475
- a_texcoord, Coord3::SIZE, get_gl_type<coord>(),
476
- GL_FALSE, sizeof(Coord3), texcoords);
477
- OpenGL_check_error(__FILE__, __LINE__);
474
+ void apply_attribute (
475
+ const ShaderProgram& program, const char* name,
476
+ std::function<void(GLint)> apply_fun)
477
+ {
478
+ GLint loc = glGetAttribLocation(program.id(), name);
479
+ if (loc < 0) return;
478
480
 
479
- glVertexAttrib4fv(a_color, color.array);
481
+ apply_fun(loc);
482
+ OpenGL_check_error(__FILE__, __LINE__);
480
483
  }
481
484
 
482
- void cleanup_vertices (GLint a_position, GLint a_texcoord)
485
+ void apply_uniform (
486
+ const ShaderProgram& program, const char* name,
487
+ std::function<void(GLint)> apply_fun)
483
488
  {
484
- glDisableVertexAttribArray(a_position);
485
- glDisableVertexAttribArray(a_texcoord);
489
+ GLint loc = glGetUniformLocation(program.id(), name);
490
+ if (loc < 0) return;
491
+
492
+ apply_fun(loc);
486
493
  OpenGL_check_error(__FILE__, __LINE__);
487
494
  }
488
495
 
489
- void activate_texture (const Texture* texture)
496
+ void draw_indices (
497
+ GLenum mode, const uint* indices, size_t nindices, size_t npoints)
490
498
  {
491
- if (!texture)
499
+ if (!indices || nindices <= 0)
492
500
  {
493
- glDisable(GL_TEXTURE_2D);
494
- return;
501
+ default_indices.resize(npoints);
502
+ indices = default_indices.get();
503
+ nindices = npoints;
495
504
  }
496
505
 
497
- if (!*texture)
498
- argument_error(__FILE__, __LINE__, "invalid texture.");
506
+ #ifdef IOS
507
+ glDrawElements(mode, (GLsizei) nindices, GL_UNSIGNED_INT, indices);
508
+ OpenGL_check_error(__FILE__, __LINE__);
509
+ #else
510
+ create_and_bind_buffer(
511
+ GL_ELEMENT_ARRAY_BUFFER, indices, sizeof(uint) * nindices);
499
512
 
500
- GLuint id = texture->id();
501
- if (id != get_current_texture_id())
502
- glBindTexture(GL_TEXTURE_2D, id);
513
+ glDrawElements(mode, (GLsizei) nindices, GL_UNSIGNED_INT, 0);
514
+ OpenGL_check_error(__FILE__, __LINE__);
503
515
 
504
- glEnable(GL_TEXTURE_2D);
516
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
517
+ OpenGL_check_error(__FILE__, __LINE__);
518
+ #endif
505
519
  }
506
520
 
507
- GLuint get_current_texture_id ()
521
+ GLuint create_and_bind_buffer (
522
+ GLenum target, const void* data, GLsizeiptr size)
508
523
  {
509
- GLint id = 0;
510
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &id);
511
- return (GLuint) id;
524
+ GLuint id = 0;
525
+ glGenBuffers(1, &id);
526
+ OpenGL_check_error(__FILE__, __LINE__);
527
+
528
+ buffers.push_back(id);
529
+
530
+ glBindBuffer(target, id);
531
+ OpenGL_check_error(__FILE__, __LINE__);
532
+
533
+ glBufferData(target, size, data, GL_STREAM_DRAW);
534
+ OpenGL_check_error(__FILE__, __LINE__);
535
+
536
+ return id;
512
537
  }
513
538
 
514
- void deactivate_texture (const Texture* texture)
539
+ void cleanup ()
515
540
  {
516
- if (!texture) return;
541
+ for (auto loc : locations)
542
+ {
543
+ glDisableVertexAttribArray(loc);
544
+ OpenGL_check_error(__FILE__, __LINE__);
545
+ }
546
+
547
+ glDeleteBuffers((GLsizei) buffers.size(), &buffers[0]);
548
+ OpenGL_check_error(__FILE__, __LINE__);
517
549
 
518
- glDisable(GL_TEXTURE_2D);
550
+ locations.clear();
551
+ buffers.clear();
519
552
  }
520
553
 
521
554
  };// Painter::Data
@@ -530,7 +563,7 @@ namespace Rays
530
563
  const Coord3* points, size_t npoints,
531
564
  const uint* indices = NULL, size_t nindices = 0,
532
565
  const Coord3* texcoords = NULL,
533
- const Shader& default_shader = get_default_shader_for_shape(),
566
+ const Shader& default_shader = Shader_get_default_shader_for_shape(),
534
567
  const TextureInfo* texinfo = NULL)
535
568
  {
536
569
  assert(painter);
@@ -958,7 +991,7 @@ namespace Rays
958
991
  TextureInfo texinfo(texture, src_x, src_y, src_x + src_w, src_y + src_h);
959
992
 
960
993
  if (!shader)
961
- shader = &get_default_shader_for_texture();
994
+ shader = &Shader_get_default_shader_for_texture();
962
995
 
963
996
  draw_polygon(
964
997
  painter, MODES, 0, 0, false, nostroke, points, 4, NULL, 0, texcoords,
@@ -1135,7 +1168,7 @@ namespace Rays
1135
1168
  painter, self->text_image,
1136
1169
  0, 0, str_w, str_h,
1137
1170
  x, y, str_w, str_h,
1138
- true, &get_default_shader_for_texture());
1171
+ true, &Shader_get_shader_for_text());
1139
1172
 
1140
1173
  debug_draw_text(painter, font, x, y, str_w / density, str_h / density);
1141
1174
  }