rays 0.3.10 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/image.cpp +10 -0
  3. data/.doc/ext/rays/painter.cpp +49 -1
  4. data/.doc/ext/rays/polygon.cpp +1 -1
  5. data/.doc/ext/rays/shader.cpp +8 -6
  6. data/.github/workflows/release-gem.yml +4 -1
  7. data/.github/workflows/test.yml +4 -4
  8. data/.github/workflows/utils.rb +88 -17
  9. data/ChangeLog.md +24 -0
  10. data/Gemfile.lock +6 -5
  11. data/Rakefile +3 -3
  12. data/VERSION +1 -1
  13. data/ext/rays/extconf.rb +3 -4
  14. data/ext/rays/image.cpp +11 -0
  15. data/ext/rays/painter.cpp +53 -1
  16. data/ext/rays/polygon.cpp +1 -1
  17. data/ext/rays/shader.cpp +8 -6
  18. data/include/rays/coord.h +6 -6
  19. data/include/rays/defs.h +2 -0
  20. data/include/rays/image.h +11 -1
  21. data/include/rays/painter.h +19 -0
  22. data/include/rays/ruby.h +2 -2
  23. data/include/rays/shader.h +5 -3
  24. data/include/rays.h +2 -2
  25. data/lib/rays/extension.rb +8 -2
  26. data/lib/rays/image.rb +2 -1
  27. data/lib/rays/shader.rb +13 -4
  28. data/rays.gemspec +3 -4
  29. data/src/bitmap.h +4 -0
  30. data/src/color_space.cpp +2 -42
  31. data/src/coord.h +10 -0
  32. data/src/font.cpp +1 -1
  33. data/src/image.cpp +85 -11
  34. data/src/ios/bitmap.mm +5 -32
  35. data/src/ios/rays.mm +3 -3
  36. data/src/opengl/bitmap.cpp +41 -0
  37. data/src/opengl/color_space.cpp +51 -0
  38. data/src/{color_space.h → opengl/color_space.h} +2 -2
  39. data/src/{frame_buffer.cpp → opengl/frame_buffer.cpp} +1 -1
  40. data/src/{frame_buffer.h → opengl/frame_buffer.h} +2 -2
  41. data/src/{ios → opengl/ios}/opengl.mm +3 -3
  42. data/src/{opengl.h → opengl/opengl.h} +2 -6
  43. data/src/{osx → opengl/osx}/opengl.mm +3 -3
  44. data/src/opengl/painter.cpp +1020 -0
  45. data/src/{render_buffer.cpp → opengl/render_buffer.cpp} +1 -1
  46. data/src/{render_buffer.h → opengl/render_buffer.h} +2 -2
  47. data/src/{sdl → opengl/sdl}/opengl.cpp +10 -3
  48. data/src/{shader.cpp → opengl/shader.cpp} +69 -53
  49. data/src/{shader.h → opengl/shader.h} +12 -8
  50. data/src/{shader_program.cpp → opengl/shader_program.cpp} +24 -10
  51. data/src/{shader_program.h → opengl/shader_program.h} +4 -3
  52. data/src/{shader_source.cpp → opengl/shader_source.cpp} +2 -4
  53. data/src/{shader_source.h → opengl/shader_source.h} +2 -2
  54. data/src/{texture.cpp → opengl/texture.cpp} +18 -7
  55. data/src/opengl/texture.h +21 -0
  56. data/src/{win32 → opengl/win32}/opengl.cpp +4 -3
  57. data/src/osx/bitmap.mm +6 -34
  58. data/src/osx/rays.mm +3 -3
  59. data/src/painter.cpp +96 -925
  60. data/src/painter.h +223 -11
  61. data/src/polygon.cpp +38 -13
  62. data/src/renderer.h +22 -0
  63. data/src/sdl/bitmap.cpp +5 -33
  64. data/src/sdl/font.cpp +358 -9
  65. data/src/sdl/rays.cpp +8 -3
  66. data/src/texture.h +6 -3
  67. data/src/win32/bitmap.cpp +6 -34
  68. data/src/win32/rays.cpp +3 -3
  69. data/test/test_painter.rb +36 -25
  70. data/test/test_painter_batch.rb +254 -0
  71. metadata +31 -24
  72. /data/src/{opengl.cpp → opengl/opengl.cpp} +0 -0
@@ -57,7 +57,7 @@ namespace Rays
57
57
 
58
58
  glRenderbufferStorage(
59
59
  GL_RENDERBUFFER,
60
- #ifdef IOS
60
+ #if defined(IOS) || defined(WASM)
61
61
  GL_DEPTH_COMPONENT16,
62
62
  #else
63
63
  GL_DEPTH_COMPONENT24,
@@ -1,7 +1,7 @@
1
1
  // -*- c++ -*-
2
2
  #pragma once
3
- #ifndef __RAYS_SRC_RENDER_BUFFER_H__
4
- #define __RAYS_SRC_RENDER_BUFFER_H__
3
+ #ifndef __RAYS_SRC_OPENGL_RENDER_BUFFER_H__
4
+ #define __RAYS_SRC_OPENGL_RENDER_BUFFER_H__
5
5
 
6
6
 
7
7
  #include <xot/pimpl.h>
@@ -1,7 +1,8 @@
1
- #include "../opengl.h"
1
+ #include "../../renderer.h"
2
2
 
3
3
 
4
4
  #include <SDL.h>
5
+ #include "../opengl.h"
5
6
  #include "rays/rays.h"
6
7
  #include "rays/exception.h"
7
8
 
@@ -59,6 +60,10 @@ namespace Rays
59
60
  static OffscreenContext*
60
61
  get_opengl_offscreen_context ()
61
62
  {
63
+ #ifdef WASM
64
+ return NULL;
65
+ #endif
66
+
62
67
  static OffscreenContext* context = NULL;
63
68
  if (!context) context = new OffscreenContext();
64
69
  return context;
@@ -66,7 +71,7 @@ namespace Rays
66
71
 
67
72
 
68
73
  void
69
- OpenGL_init ()
74
+ Renderer_init ()
70
75
  {
71
76
  activate_offscreen_context();
72
77
 
@@ -80,7 +85,7 @@ namespace Rays
80
85
  }
81
86
 
82
87
  void
83
- OpenGL_fin ()
88
+ Renderer_fin ()
84
89
  {
85
90
  }
86
91
 
@@ -95,6 +100,8 @@ namespace Rays
95
100
  activate_offscreen_context ()
96
101
  {
97
102
  const auto* c = get_opengl_offscreen_context();
103
+ if (!c) return;
104
+
98
105
  SDL_GL_MakeCurrent(c->window, c->context);
99
106
  }
100
107
 
@@ -3,8 +3,7 @@
3
3
 
4
4
  #include <assert.h>
5
5
  #include "rays/exception.h"
6
- #include "opengl.h"
7
- #include "image.h"
6
+ #include "../image.h"
8
7
  #include "shader_program.h"
9
8
  #include "shader_source.h"
10
9
 
@@ -15,15 +14,17 @@ namespace Rays
15
14
 
16
15
  #define A_POSITION (names.attribute_position_names[0])
17
16
  #define A_TEXCOORD (names.attribute_texcoord_names[0])
17
+ #define A_TEXCOORD_MIN (names.attribute_texcoord_min_names[0])
18
+ #define A_TEXCOORD_MAX (names.attribute_texcoord_max_names[0])
18
19
  #define A_COLOR (names.attribute_color_names[0])
19
20
  #define V_POSITION (names.varying_position_name)
20
21
  #define V_TEXCOORD (names.varying_texcoord_name)
22
+ #define V_TEXCOORD_MIN (names.varying_texcoord_min_name)
23
+ #define V_TEXCOORD_MAX (names.varying_texcoord_max_name)
21
24
  #define V_COLOR (names.varying_color_name)
22
25
  #define U_POSITION_MATRIX (names.uniform_position_matrix_names[0])
23
26
  #define U_TEXCOORD_MATRIX (names.uniform_texcoord_matrix_names[0])
24
- #define U_TEXCOORD_MIN (names.uniform_texcoord_min_names[0])
25
- #define U_TEXCOORD_MAX (names.uniform_texcoord_max_names[0])
26
- #define U_TEXCOORD_OFFSET (names.uniform_texcoord_offset_names[0])
27
+ #define U_TEXCOORD_PIXEL (names.uniform_texcoord_pixel_names[0])
27
28
  #define U_TEXTURE (names.uniform_texture_names[0])
28
29
 
29
30
 
@@ -35,22 +36,20 @@ namespace Rays
35
36
 
36
37
  std::unique_ptr<ShaderProgram> program;
37
38
 
38
- std::unique_ptr<ShaderEnv> env;
39
+ ShaderEnv env;
39
40
 
40
41
  Data (
41
42
  const char* fragment_shader_source,
42
43
  const char* vertex_shader_source,
43
44
  ShaderEnv* env_)
45
+ : env(env_ ? *env_ : DEFAULT_ENV)
44
46
  {
45
47
  if (!fragment_shader_source) return;
46
48
 
47
- if (env_)
48
- this->env.reset(new ShaderEnv(*env_));
49
-
50
49
  program.reset(new ShaderProgram(
51
50
  make_vertex_shader_source(vertex_shader_source),
52
51
  ShaderSource(GL_FRAGMENT_SHADER, fragment_shader_source),
53
- env_ ? ShaderEnv_get_flags(*env_) : 0));
52
+ env));
54
53
  }
55
54
 
56
55
  ShaderSource make_vertex_shader_source (const char* source)
@@ -58,10 +57,7 @@ namespace Rays
58
57
  if (source)
59
58
  return ShaderSource(GL_VERTEX_SHADER, source);
60
59
  else
61
- {
62
- return ShaderEnv_get_default_vertex_shader_source(
63
- env ? env.get() : &DEFAULT_ENV);
64
- }
60
+ return ShaderEnv_get_default_vertex_shader_source(&env);
65
61
  }
66
62
 
67
63
  };// Shader::Data
@@ -87,17 +83,17 @@ namespace Rays
87
83
  ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
88
84
  return Shader(
89
85
  "varying vec4 " + V_TEXCOORD + ";\n"
86
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
87
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
90
88
  "varying vec4 " + V_COLOR + ";\n"
91
- "uniform vec3 " + U_TEXCOORD_MIN + ";\n"
92
- "uniform vec3 " + U_TEXCOORD_MAX + ";\n"
93
- "uniform vec3 " + U_TEXCOORD_OFFSET + ";\n"
89
+ "uniform vec3 " + U_TEXCOORD_PIXEL + ";\n"
94
90
  "uniform sampler2D " + U_TEXTURE + ";\n"
95
91
  "void main ()\n"
96
92
  "{\n"
97
93
  " vec2 _rays_texcoord = clamp(" +
98
94
  V_TEXCOORD + ".xy, " +
99
- U_TEXCOORD_MIN + ".xy, " +
100
- U_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_OFFSET + ".xy);\n"
95
+ V_TEXCOORD_MIN + ".xy, " +
96
+ V_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_PIXEL + ".xy);\n"
101
97
  " vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
102
98
  " gl_FragColor = " + V_COLOR + " * _rays_color;\n"
103
99
  "}\n");
@@ -110,14 +106,14 @@ namespace Rays
110
106
  ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
111
107
  return Shader(
112
108
  "varying vec4 " + V_TEXCOORD + ";\n"
109
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
110
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
113
111
  "varying vec4 " + V_COLOR + ";\n"
114
- "uniform vec3 " + U_TEXCOORD_MIN + ";\n"
115
- "uniform vec3 " + U_TEXCOORD_MAX + ";\n"
116
112
  "uniform sampler2D " + U_TEXTURE + ";\n"
117
113
  "void main ()\n"
118
114
  "{\n"
119
- " vec2 _rays_min = " + U_TEXCOORD_MIN + ".xy;\n"
120
- " vec2 _rays_len = " + U_TEXCOORD_MAX + ".xy - _rays_min;\n"
115
+ " vec2 _rays_min = " + V_TEXCOORD_MIN + ".xy;\n"
116
+ " vec2 _rays_len = " + V_TEXCOORD_MAX + ".xy - _rays_min;\n"
121
117
  " vec2 _rays_texcoord = mod(" + V_TEXCOORD + ".xy - _rays_min, _rays_len) + _rays_min;\n"
122
118
  " vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
123
119
  " gl_FragColor = " + V_COLOR + " * _rays_color;\n"
@@ -136,7 +132,7 @@ namespace Rays
136
132
  "void main ()\n"
137
133
  "{\n"
138
134
  " vec4 _rays_col = texture2D(" + U_TEXTURE + ", " + V_TEXCOORD + ".xy);\n"
139
- #if defined(OSX) || defined(IOS)
135
+ #if defined(OSX) || defined(IOS) || defined(LINUX)
140
136
  // restore premultiplied rgb values
141
137
  " vec3 _rays_rgb = _rays_col.a != 0.0 ? _rays_col.rgb / _rays_col.a : _rays_col.rgb;\n"
142
138
  " gl_FragColor = " + V_COLOR + " * vec4(_rays_rgb, _rays_col.a);\n"
@@ -158,8 +154,7 @@ namespace Rays
158
154
  const ShaderBuiltinVariableNames&
159
155
  Shader_get_builtin_variable_names (const Shader& shader)
160
156
  {
161
- return ShaderEnv_get_builtin_variable_names(
162
- shader.self->env ? *shader.self->env : DEFAULT_ENV);
157
+ return ShaderEnv_get_builtin_variable_names(shader.self->env);
163
158
  }
164
159
 
165
160
  const Shader&
@@ -396,22 +391,26 @@ namespace Rays
396
391
  String make_default_vertex_shader_source_code ()
397
392
  {
398
393
  return
399
- "attribute vec3 " + A_POSITION + ";\n"
400
- "attribute vec3 " + A_TEXCOORD + ";\n"
394
+ "attribute vec4 " + A_POSITION + ";\n"
395
+ "attribute vec4 " + A_TEXCOORD + ";\n"
396
+ "attribute vec3 " + A_TEXCOORD_MIN + ";\n"
397
+ "attribute vec3 " + A_TEXCOORD_MAX + ";\n"
401
398
  "attribute vec4 " + A_COLOR + ";\n"
402
399
  "varying vec4 " + V_POSITION + ";\n"
403
400
  "varying vec4 " + V_TEXCOORD + ";\n"
401
+ "varying vec3 " + V_TEXCOORD_MIN + ";\n"
402
+ "varying vec3 " + V_TEXCOORD_MAX + ";\n"
404
403
  "varying vec4 " + V_COLOR + ";\n"
405
404
  "uniform mat4 " + U_POSITION_MATRIX + ";\n"
406
405
  "uniform mat4 " + U_TEXCOORD_MATRIX + ";\n"
407
406
  "void main ()\n"
408
407
  "{\n"
409
- " vec4 _rays_pos = vec4(" + A_POSITION + ", 1.0);\n"
410
- " vec4 _rays_texcoord = vec4(" + A_TEXCOORD + ", 1.0);\n"
411
- " " + V_POSITION + " = _rays_pos;\n"
412
- " " + V_TEXCOORD + " = " + U_TEXCOORD_MATRIX + " * _rays_texcoord;\n"
413
- " " + V_COLOR + " = " + A_COLOR + ";\n"
414
- " gl_Position = " + U_POSITION_MATRIX + " * _rays_pos;\n"
408
+ " " + V_POSITION + " = " + A_POSITION + ";\n"
409
+ " " + V_TEXCOORD + " = " + U_TEXCOORD_MATRIX + " * " + A_TEXCOORD + ";\n"
410
+ " " + V_TEXCOORD_MIN + " = " + A_TEXCOORD_MIN + ";\n"
411
+ " " + V_TEXCOORD_MAX + " = " + A_TEXCOORD_MAX + ";\n"
412
+ " " + V_COLOR + " = " + A_COLOR + ";\n"
413
+ " gl_Position = " + U_POSITION_MATRIX + " * " + A_POSITION + ";\n"
415
414
  "}\n";
416
415
  }
417
416
 
@@ -450,23 +449,34 @@ namespace Rays
450
449
  ShaderEnv::ShaderEnv (
451
450
  const NameList& a_position_names,
452
451
  const NameList& a_texcoord_names,
452
+ const NameList& a_texcoord_min_names,
453
+ const NameList& a_texcoord_max_names,
453
454
  const NameList& a_color_names,
454
455
  const char* v_position_name,
455
456
  const char* v_texcoord_name,
457
+ const char* v_texcoord_min_name,
458
+ const char* v_texcoord_max_name,
456
459
  const char* v_color_name,
457
460
  const NameList& u_position_matrix_names,
458
461
  const NameList& u_texcoord_matrix_names,
459
- const NameList& u_texcoord_min_names,
460
- const NameList& u_texcoord_max_names,
461
- const NameList& u_texcoord_offset_names,
462
+ const NameList& u_texcoord_pixel_names,
462
463
  const NameList& u_texture_names,
463
464
  uint flags)
464
465
  : self(new Data(
465
466
  ShaderBuiltinVariableNames(
466
- a_position_names, a_texcoord_names, a_color_names,
467
- v_position_name, v_texcoord_name, v_color_name,
468
- u_position_matrix_names, u_texcoord_matrix_names,
469
- u_texcoord_min_names, u_texcoord_max_names, u_texcoord_offset_names,
467
+ a_position_names,
468
+ a_texcoord_names,
469
+ a_texcoord_min_names,
470
+ a_texcoord_max_names,
471
+ a_color_names,
472
+ v_position_name,
473
+ v_texcoord_name,
474
+ v_texcoord_min_name,
475
+ v_texcoord_max_name,
476
+ v_color_name,
477
+ u_position_matrix_names,
478
+ u_texcoord_matrix_names,
479
+ u_texcoord_pixel_names,
470
480
  u_texture_names),
471
481
  flags))
472
482
  {
@@ -503,40 +513,46 @@ namespace Rays
503
513
  ShaderBuiltinVariableNames::ShaderBuiltinVariableNames (
504
514
  const ShaderEnv::NameList& a_position,
505
515
  const ShaderEnv::NameList& a_texcoord,
516
+ const ShaderEnv::NameList& a_texcoord_min,
517
+ const ShaderEnv::NameList& a_texcoord_max,
506
518
  const ShaderEnv::NameList& a_color,
507
519
  const char* v_position,
508
520
  const char* v_texcoord,
521
+ const char* v_texcoord_min,
522
+ const char* v_texcoord_max,
509
523
  const char* v_color,
510
524
  const ShaderEnv::NameList& u_position_matrix,
511
525
  const ShaderEnv::NameList& u_texcoord_matrix,
512
- const ShaderEnv::NameList& u_texcoord_min,
513
- const ShaderEnv::NameList& u_texcoord_max,
514
- const ShaderEnv::NameList& u_texcoord_offset,
526
+ const ShaderEnv::NameList& u_texcoord_pixel,
515
527
  const ShaderEnv::NameList& u_texture)
516
528
  : attribute_position_names(a_position),
517
529
  attribute_texcoord_names(a_texcoord),
530
+ attribute_texcoord_min_names(a_texcoord_min),
531
+ attribute_texcoord_max_names(a_texcoord_max),
518
532
  attribute_color_names(a_color),
519
- varying_position_name(v_position ? v_position : "v_Position"),
520
- varying_texcoord_name(v_texcoord ? v_texcoord : "v_TexCoord"),
521
- varying_color_name( v_color ? v_color : "v_Color"),
533
+ varying_position_name( v_position ? v_position : "v_Position"),
534
+ varying_texcoord_name( v_texcoord ? v_texcoord : "v_TexCoord"),
535
+ varying_texcoord_min_name(v_texcoord_min ? v_texcoord_min : "v_TexCoordMin"),
536
+ varying_texcoord_max_name(v_texcoord_max ? v_texcoord_max : "v_TexCoordMax"),
537
+ varying_color_name( v_color ? v_color : "v_Color"),
522
538
  uniform_position_matrix_names(u_position_matrix),
523
539
  uniform_texcoord_matrix_names(u_texcoord_matrix),
524
- uniform_texcoord_min_names(u_texcoord_min),
525
- uniform_texcoord_max_names(u_texcoord_max),
526
- uniform_texcoord_offset_names(u_texcoord_offset),
540
+ uniform_texcoord_pixel_names(u_texcoord_pixel),
527
541
  uniform_texture_names(u_texture)
528
542
  {
529
543
  validate_names(&attribute_position_names, "attribute_position", "a_Position");
530
544
  validate_names(&attribute_texcoord_names, "attribute_texcoord", "a_TexCoord");
545
+ validate_names(&attribute_texcoord_min_names, "attribute_texcoord_min", "a_TexCoordMin");
546
+ validate_names(&attribute_texcoord_max_names, "attribute_texcoord_max", "a_TexCoordMax");
531
547
  validate_names(&attribute_color_names, "attribute_color", "a_Color");
532
548
  validate_name(varying_position_name, "varying_position");
533
549
  validate_name(varying_texcoord_name, "varying_texcoord");
550
+ validate_name(varying_texcoord_min_name, "varying_texcoord_min");
551
+ validate_name(varying_texcoord_max_name, "varying_texcoord_max");
534
552
  validate_name(varying_color_name, "varying_color");
535
553
  validate_names(&uniform_position_matrix_names, "uniform_position_matrix", "u_PositionMatrix");
536
554
  validate_names(&uniform_texcoord_matrix_names, "uniform_texcoord_matrix", "u_TexCoordMatrix");
537
- validate_names(&uniform_texcoord_min_names, "uniform_texcoord_min", "u_TexCoordMin");
538
- validate_names(&uniform_texcoord_max_names, "uniform_texcoord_max", "u_TexCoordMax");
539
- validate_names(&uniform_texcoord_offset_names, "uniform_texcoord_offset", "u_TexCoordOffset");
555
+ validate_names(&uniform_texcoord_pixel_names, "uniform_texcoord_pixel", "u_TexCoordPixel");
540
556
  validate_names(&uniform_texture_names, "uniform_texture", "u_Texture");
541
557
  }
542
558
 
@@ -1,7 +1,7 @@
1
1
  // -*- c++ -*-
2
2
  #pragma once
3
- #ifndef __RAYS_SRC_SHADER_H__
4
- #define __RAYS_SRC_SHADER_H__
3
+ #ifndef __RAYS_SRC_OPENGL_SHADER_H__
4
+ #define __RAYS_SRC_OPENGL_SHADER_H__
5
5
 
6
6
 
7
7
  #include "rays/shader.h"
@@ -20,31 +20,35 @@ namespace Rays
20
20
 
21
21
  ShaderEnv::NameList attribute_position_names;
22
22
  ShaderEnv::NameList attribute_texcoord_names;
23
+ ShaderEnv::NameList attribute_texcoord_min_names;
24
+ ShaderEnv::NameList attribute_texcoord_max_names;
23
25
  ShaderEnv::NameList attribute_color_names;
24
26
 
25
27
  String varying_position_name;
26
28
  String varying_texcoord_name;
29
+ String varying_texcoord_min_name;
30
+ String varying_texcoord_max_name;
27
31
  String varying_color_name;
28
32
 
29
33
  ShaderEnv::NameList uniform_position_matrix_names;
30
34
  ShaderEnv::NameList uniform_texcoord_matrix_names;
31
- ShaderEnv::NameList uniform_texcoord_min_names;
32
- ShaderEnv::NameList uniform_texcoord_max_names;
33
- ShaderEnv::NameList uniform_texcoord_offset_names;
35
+ ShaderEnv::NameList uniform_texcoord_pixel_names;
34
36
  ShaderEnv::NameList uniform_texture_names;
35
37
 
36
38
  ShaderBuiltinVariableNames (
37
39
  const ShaderEnv::NameList& attribute_position_names,
38
40
  const ShaderEnv::NameList& attribute_texcoord_names,
41
+ const ShaderEnv::NameList& attribute_texcoord_min_names,
42
+ const ShaderEnv::NameList& attribute_texcoord_max_names,
39
43
  const ShaderEnv::NameList& attribute_color_names,
40
44
  const char* varying_position_name,
41
45
  const char* varying_texcoord_name,
46
+ const char* varying_texcoord_min_name,
47
+ const char* varying_texcoord_max_name,
42
48
  const char* varying_color_name,
43
49
  const ShaderEnv::NameList& uniform_position_matrix_names,
44
50
  const ShaderEnv::NameList& uniform_texcoord_matrix_names,
45
- const ShaderEnv::NameList& uniform_texcoord_min_names,
46
- const ShaderEnv::NameList& uniform_texcoord_max_names,
47
- const ShaderEnv::NameList& uniform_texcoord_offset_names,
51
+ const ShaderEnv::NameList& uniform_texcoord_pixel_names,
48
52
  const ShaderEnv::NameList& uniform_texture_names);
49
53
 
50
54
  };// ShaderBuiltinVariableNames
@@ -5,11 +5,11 @@
5
5
  #include <vector>
6
6
  #include <memory>
7
7
  #include <algorithm>
8
- #include "rays/shader.h"
9
8
  #include "rays/exception.h"
10
- #include "shader_source.h"
9
+ #include "../painter.h"
11
10
  #include "texture.h"
12
- #include "painter.h"
11
+ #include "shader.h"
12
+ #include "shader_source.h"
13
13
 
14
14
 
15
15
  namespace Rays
@@ -169,7 +169,7 @@ namespace Rays
169
169
  shader_error(__FILE__, __LINE__, "texture unit must be less than %d", max);
170
170
 
171
171
  glActiveTexture(GL_TEXTURE0 + unit);
172
- glBindTexture(GL_TEXTURE_2D, texture.id());
172
+ glBindTexture(GL_TEXTURE_2D, Texture_get_id(texture));
173
173
  glUniform1i(location, unit);
174
174
  return !OpenGL_has_error();
175
175
  }
@@ -253,12 +253,12 @@ namespace Rays
253
253
  struct ShaderProgram::Data
254
254
  {
255
255
 
256
- GLuint id = 0;
257
-
258
- uint flags = 0;
256
+ GLuint id = 0;
259
257
 
260
258
  ShaderSource vertex, fragment;
261
259
 
260
+ ShaderEnv env;
261
+
262
262
  UniformList uniform_values, uniform_textures;
263
263
 
264
264
  mutable bool linked = false, applied = false;
@@ -322,6 +322,18 @@ namespace Rays
322
322
  attach_shader(vertex);
323
323
  attach_shader(fragment);
324
324
 
325
+ #ifdef OSX
326
+ // OpenGL compatibility profile historically aliases attribute
327
+ // location 0 with gl_Vertex; some drivers refuse to draw when
328
+ // location 0 is not enabled. Pin position there as a safeguard.
329
+ for (const auto& name :
330
+ ShaderEnv_get_builtin_variable_names(env).attribute_position_names)
331
+ {
332
+ glBindAttribLocation(id, 0, name.c_str());
333
+ OpenGL_check_error(__FILE__, __LINE__);
334
+ }
335
+ #endif
336
+
325
337
  glLinkProgram(id);
326
338
  OpenGL_check_error(__FILE__, __LINE__);
327
339
 
@@ -370,7 +382,8 @@ namespace Rays
370
382
  if (applied) return;
371
383
  applied = true;
372
384
 
373
- bool ignore_no_loc = flags & ShaderEnv::IGNORE_NO_UNIFORM_LOCATION_ERROR;
385
+ bool ignore_no_loc =
386
+ ShaderEnv_get_flags(env) & ShaderEnv::IGNORE_NO_UNIFORM_LOCATION_ERROR;
374
387
 
375
388
  for (size_t i = 0; i < uniform_values.size(); ++i)
376
389
  uniform_values[i].apply(i, program, ignore_no_loc);
@@ -406,11 +419,12 @@ namespace Rays
406
419
 
407
420
 
408
421
  ShaderProgram::ShaderProgram (
409
- const ShaderSource& vertex, const ShaderSource& fragment, uint flags)
422
+ const ShaderSource& vertex, const ShaderSource& fragment,
423
+ const ShaderEnv& env)
410
424
  {
411
425
  self->vertex = vertex;
412
426
  self->fragment = fragment;
413
- self->flags = flags;
427
+ self->env = env;
414
428
  }
415
429
 
416
430
  ShaderProgram::~ShaderProgram ()
@@ -1,12 +1,13 @@
1
1
  // -*- c++ -*-
2
2
  #pragma once
3
- #ifndef __RAYS_SRC_SHADER_PROGRAM_H__
4
- #define __RAYS_SRC_SHADER_PROGRAM_H__
3
+ #ifndef __RAYS_SRC_OPENGL_SHADER_PROGRAM_H__
4
+ #define __RAYS_SRC_OPENGL_SHADER_PROGRAM_H__
5
5
 
6
6
 
7
7
  #include <xot/pimpl.h>
8
8
  #include "rays/defs.h"
9
9
  #include "rays/coord.h"
10
+ #include "rays/shader.h"
10
11
  #include "opengl.h"
11
12
 
12
13
 
@@ -28,7 +29,7 @@ namespace Rays
28
29
  ShaderProgram (
29
30
  const ShaderSource& vertex,
30
31
  const ShaderSource& fragment,
31
- uint flags);
32
+ const ShaderEnv& env);
32
33
 
33
34
  ~ShaderProgram ();
34
35
 
@@ -58,7 +58,7 @@ namespace Rays
58
58
 
59
59
  const char* add_headers (GLenum type, const char* source, String* buffer)
60
60
  {
61
- #ifdef IOS
61
+ #if defined(IOS) || defined(WASM)
62
62
  if (type == GL_FRAGMENT_SHADER)
63
63
  {
64
64
  static const std::regex PRECISION(R"(^\s*precision\s+\w+p\s+float\s*;)");
@@ -69,9 +69,7 @@ namespace Rays
69
69
  source = buffer->c_str();
70
70
  }
71
71
  }
72
- #endif
73
-
74
- #ifndef IOS
72
+ #else
75
73
  static const std::regex VERSION(R"(^\s*#\s*version\s+\d+)");
76
74
  if (!std::regex_search(source, VERSION))
77
75
  {
@@ -1,7 +1,7 @@
1
1
  // -*- c++ -*-
2
2
  #pragma once
3
- #ifndef __RAYS_SRC_SHADER_SOURCE_H__
4
- #define __RAYS_SRC_SHADER_SOURCE_H__
3
+ #ifndef __RAYS_SRC_OPENGL_SHADER_SOURCE_H__
4
+ #define __RAYS_SRC_OPENGL_SHADER_SOURCE_H__
5
5
 
6
6
 
7
7
  #include <xot/pimpl.h>
@@ -5,7 +5,6 @@
5
5
  #include "rays/exception.h"
6
6
  #include "rays/bitmap.h"
7
7
  #include "rays/debug.h"
8
- #include "opengl.h"
9
8
  #include "color_space.h"
10
9
  #include "frame_buffer.h"
11
10
 
@@ -229,6 +228,12 @@ namespace Rays
229
228
  self->modified = true;
230
229
  }
231
230
 
231
+ GLuint
232
+ Texture_get_id (const Texture& texture)
233
+ {
234
+ return texture.self->id;
235
+ }
236
+
232
237
 
233
238
  Texture::Texture ()
234
239
  {
@@ -319,12 +324,6 @@ namespace Rays
319
324
  return self->smooth;
320
325
  }
321
326
 
322
- GLuint
323
- Texture::id () const
324
- {
325
- return self->id;
326
- }
327
-
328
327
  void
329
328
  Texture::set_modified (bool modified)
330
329
  {
@@ -352,5 +351,17 @@ namespace Rays
352
351
  return !operator bool();
353
352
  }
354
353
 
354
+ bool
355
+ operator == (const Texture& lhs, const Texture& rhs)
356
+ {
357
+ return lhs.self->id == rhs.self->id;
358
+ }
359
+
360
+ bool
361
+ operator != (const Texture& lhs, const Texture& rhs)
362
+ {
363
+ return !operator==(lhs, rhs);
364
+ }
365
+
355
366
 
356
367
  }// Rays
@@ -0,0 +1,21 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RAYS_SRC_OPENGL_TEXTURE_H__
4
+ #define __RAYS_SRC_OPENGL_TEXTURE_H__
5
+
6
+
7
+ #include "../texture.h"
8
+ #include "opengl.h"
9
+
10
+
11
+ namespace Rays
12
+ {
13
+
14
+
15
+ GLuint Texture_get_id (const Texture& texture);
16
+
17
+
18
+ }// Rays
19
+
20
+
21
+ #endif//EOH
@@ -1,7 +1,8 @@
1
- #include "../opengl.h"
1
+ #include "../../renderer.h"
2
2
 
3
3
 
4
4
  #include <xot/windows.h>
5
+ #include "../opengl.h"
5
6
  #include "rays/rays.h"
6
7
  #include "rays/exception.h"
7
8
 
@@ -90,7 +91,7 @@ namespace Rays
90
91
  }
91
92
 
92
93
  void
93
- OpenGL_init ()
94
+ Renderer_init ()
94
95
  {
95
96
  activate_offscreen_context();
96
97
 
@@ -104,7 +105,7 @@ namespace Rays
104
105
  }
105
106
 
106
107
  void
107
- OpenGL_fin ()
108
+ Renderer_fin ()
108
109
  {
109
110
  }
110
111