rays 0.3.11 → 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.
- checksums.yaml +4 -4
- data/.doc/ext/rays/image.cpp +10 -0
- data/.doc/ext/rays/painter.cpp +49 -1
- data/.doc/ext/rays/shader.cpp +8 -6
- data/.github/workflows/release-gem.yml +3 -0
- data/.github/workflows/utils.rb +88 -17
- data/ChangeLog.md +17 -0
- data/Rakefile +3 -3
- data/VERSION +1 -1
- data/ext/rays/extconf.rb +3 -4
- data/ext/rays/image.cpp +11 -0
- data/ext/rays/painter.cpp +53 -1
- data/ext/rays/shader.cpp +8 -6
- data/include/rays/coord.h +6 -6
- data/include/rays/defs.h +2 -0
- data/include/rays/image.h +11 -1
- data/include/rays/painter.h +19 -0
- data/include/rays/ruby.h +2 -2
- data/include/rays/shader.h +5 -3
- data/include/rays.h +2 -2
- data/lib/rays/extension.rb +8 -2
- data/lib/rays/image.rb +2 -1
- data/lib/rays/shader.rb +13 -4
- data/rays.gemspec +3 -4
- data/src/color_space.cpp +1 -1
- data/src/coord.h +10 -0
- data/src/font.cpp +1 -1
- data/src/image.cpp +85 -10
- data/src/opengl/painter.cpp +388 -124
- data/src/opengl/render_buffer.cpp +1 -1
- data/src/opengl/sdl/opengl.cpp +6 -0
- data/src/opengl/shader.cpp +68 -51
- data/src/opengl/shader.h +10 -6
- data/src/opengl/shader_program.cpp +21 -7
- data/src/opengl/shader_program.h +2 -1
- data/src/opengl/shader_source.cpp +2 -4
- data/src/opengl/texture.cpp +18 -6
- data/src/osx/bitmap.mm +1 -1
- data/src/painter.cpp +79 -24
- data/src/painter.h +15 -2
- data/src/sdl/font.cpp +358 -9
- data/src/sdl/rays.cpp +5 -0
- data/src/texture.h +6 -0
- data/test/test_painter.rb +36 -25
- data/test/test_painter_batch.rb +254 -0
- metadata +8 -6
data/src/opengl/sdl/opengl.cpp
CHANGED
|
@@ -60,6 +60,10 @@ namespace Rays
|
|
|
60
60
|
static OffscreenContext*
|
|
61
61
|
get_opengl_offscreen_context ()
|
|
62
62
|
{
|
|
63
|
+
#ifdef WASM
|
|
64
|
+
return NULL;
|
|
65
|
+
#endif
|
|
66
|
+
|
|
63
67
|
static OffscreenContext* context = NULL;
|
|
64
68
|
if (!context) context = new OffscreenContext();
|
|
65
69
|
return context;
|
|
@@ -96,6 +100,8 @@ namespace Rays
|
|
|
96
100
|
activate_offscreen_context ()
|
|
97
101
|
{
|
|
98
102
|
const auto* c = get_opengl_offscreen_context();
|
|
103
|
+
if (!c) return;
|
|
104
|
+
|
|
99
105
|
SDL_GL_MakeCurrent(c->window, c->context);
|
|
100
106
|
}
|
|
101
107
|
|
data/src/opengl/shader.cpp
CHANGED
|
@@ -14,15 +14,17 @@ namespace Rays
|
|
|
14
14
|
|
|
15
15
|
#define A_POSITION (names.attribute_position_names[0])
|
|
16
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])
|
|
17
19
|
#define A_COLOR (names.attribute_color_names[0])
|
|
18
20
|
#define V_POSITION (names.varying_position_name)
|
|
19
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)
|
|
20
24
|
#define V_COLOR (names.varying_color_name)
|
|
21
25
|
#define U_POSITION_MATRIX (names.uniform_position_matrix_names[0])
|
|
22
26
|
#define U_TEXCOORD_MATRIX (names.uniform_texcoord_matrix_names[0])
|
|
23
|
-
#define
|
|
24
|
-
#define U_TEXCOORD_MAX (names.uniform_texcoord_max_names[0])
|
|
25
|
-
#define U_TEXCOORD_OFFSET (names.uniform_texcoord_offset_names[0])
|
|
27
|
+
#define U_TEXCOORD_PIXEL (names.uniform_texcoord_pixel_names[0])
|
|
26
28
|
#define U_TEXTURE (names.uniform_texture_names[0])
|
|
27
29
|
|
|
28
30
|
|
|
@@ -34,22 +36,20 @@ namespace Rays
|
|
|
34
36
|
|
|
35
37
|
std::unique_ptr<ShaderProgram> program;
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
ShaderEnv env;
|
|
38
40
|
|
|
39
41
|
Data (
|
|
40
42
|
const char* fragment_shader_source,
|
|
41
43
|
const char* vertex_shader_source,
|
|
42
44
|
ShaderEnv* env_)
|
|
45
|
+
: env(env_ ? *env_ : DEFAULT_ENV)
|
|
43
46
|
{
|
|
44
47
|
if (!fragment_shader_source) return;
|
|
45
48
|
|
|
46
|
-
if (env_)
|
|
47
|
-
this->env.reset(new ShaderEnv(*env_));
|
|
48
|
-
|
|
49
49
|
program.reset(new ShaderProgram(
|
|
50
50
|
make_vertex_shader_source(vertex_shader_source),
|
|
51
51
|
ShaderSource(GL_FRAGMENT_SHADER, fragment_shader_source),
|
|
52
|
-
|
|
52
|
+
env));
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
ShaderSource make_vertex_shader_source (const char* source)
|
|
@@ -57,10 +57,7 @@ namespace Rays
|
|
|
57
57
|
if (source)
|
|
58
58
|
return ShaderSource(GL_VERTEX_SHADER, source);
|
|
59
59
|
else
|
|
60
|
-
|
|
61
|
-
return ShaderEnv_get_default_vertex_shader_source(
|
|
62
|
-
env ? env.get() : &DEFAULT_ENV);
|
|
63
|
-
}
|
|
60
|
+
return ShaderEnv_get_default_vertex_shader_source(&env);
|
|
64
61
|
}
|
|
65
62
|
|
|
66
63
|
};// Shader::Data
|
|
@@ -86,17 +83,17 @@ namespace Rays
|
|
|
86
83
|
ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
|
|
87
84
|
return Shader(
|
|
88
85
|
"varying vec4 " + V_TEXCOORD + ";\n"
|
|
86
|
+
"varying vec3 " + V_TEXCOORD_MIN + ";\n"
|
|
87
|
+
"varying vec3 " + V_TEXCOORD_MAX + ";\n"
|
|
89
88
|
"varying vec4 " + V_COLOR + ";\n"
|
|
90
|
-
"uniform vec3 " +
|
|
91
|
-
"uniform vec3 " + U_TEXCOORD_MAX + ";\n"
|
|
92
|
-
"uniform vec3 " + U_TEXCOORD_OFFSET + ";\n"
|
|
89
|
+
"uniform vec3 " + U_TEXCOORD_PIXEL + ";\n"
|
|
93
90
|
"uniform sampler2D " + U_TEXTURE + ";\n"
|
|
94
91
|
"void main ()\n"
|
|
95
92
|
"{\n"
|
|
96
93
|
" vec2 _rays_texcoord = clamp(" +
|
|
97
94
|
V_TEXCOORD + ".xy, " +
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
V_TEXCOORD_MIN + ".xy, " +
|
|
96
|
+
V_TEXCOORD_MAX + ".xy - " + U_TEXCOORD_PIXEL + ".xy);\n"
|
|
100
97
|
" vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
|
|
101
98
|
" gl_FragColor = " + V_COLOR + " * _rays_color;\n"
|
|
102
99
|
"}\n");
|
|
@@ -109,14 +106,14 @@ namespace Rays
|
|
|
109
106
|
ShaderEnv_get_builtin_variable_names(DEFAULT_ENV);
|
|
110
107
|
return Shader(
|
|
111
108
|
"varying vec4 " + V_TEXCOORD + ";\n"
|
|
109
|
+
"varying vec3 " + V_TEXCOORD_MIN + ";\n"
|
|
110
|
+
"varying vec3 " + V_TEXCOORD_MAX + ";\n"
|
|
112
111
|
"varying vec4 " + V_COLOR + ";\n"
|
|
113
|
-
"uniform vec3 " + U_TEXCOORD_MIN + ";\n"
|
|
114
|
-
"uniform vec3 " + U_TEXCOORD_MAX + ";\n"
|
|
115
112
|
"uniform sampler2D " + U_TEXTURE + ";\n"
|
|
116
113
|
"void main ()\n"
|
|
117
114
|
"{\n"
|
|
118
|
-
" vec2 _rays_min = " +
|
|
119
|
-
" vec2 _rays_len = " +
|
|
115
|
+
" vec2 _rays_min = " + V_TEXCOORD_MIN + ".xy;\n"
|
|
116
|
+
" vec2 _rays_len = " + V_TEXCOORD_MAX + ".xy - _rays_min;\n"
|
|
120
117
|
" vec2 _rays_texcoord = mod(" + V_TEXCOORD + ".xy - _rays_min, _rays_len) + _rays_min;\n"
|
|
121
118
|
" vec4 _rays_color = texture2D(" + U_TEXTURE + ", _rays_texcoord);\n"
|
|
122
119
|
" gl_FragColor = " + V_COLOR + " * _rays_color;\n"
|
|
@@ -135,7 +132,7 @@ namespace Rays
|
|
|
135
132
|
"void main ()\n"
|
|
136
133
|
"{\n"
|
|
137
134
|
" vec4 _rays_col = texture2D(" + U_TEXTURE + ", " + V_TEXCOORD + ".xy);\n"
|
|
138
|
-
#if defined(OSX) || defined(IOS)
|
|
135
|
+
#if defined(OSX) || defined(IOS) || defined(LINUX)
|
|
139
136
|
// restore premultiplied rgb values
|
|
140
137
|
" vec3 _rays_rgb = _rays_col.a != 0.0 ? _rays_col.rgb / _rays_col.a : _rays_col.rgb;\n"
|
|
141
138
|
" gl_FragColor = " + V_COLOR + " * vec4(_rays_rgb, _rays_col.a);\n"
|
|
@@ -157,8 +154,7 @@ namespace Rays
|
|
|
157
154
|
const ShaderBuiltinVariableNames&
|
|
158
155
|
Shader_get_builtin_variable_names (const Shader& shader)
|
|
159
156
|
{
|
|
160
|
-
return ShaderEnv_get_builtin_variable_names(
|
|
161
|
-
shader.self->env ? *shader.self->env : DEFAULT_ENV);
|
|
157
|
+
return ShaderEnv_get_builtin_variable_names(shader.self->env);
|
|
162
158
|
}
|
|
163
159
|
|
|
164
160
|
const Shader&
|
|
@@ -395,22 +391,26 @@ namespace Rays
|
|
|
395
391
|
String make_default_vertex_shader_source_code ()
|
|
396
392
|
{
|
|
397
393
|
return
|
|
398
|
-
"attribute
|
|
399
|
-
"attribute
|
|
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"
|
|
400
398
|
"attribute vec4 " + A_COLOR + ";\n"
|
|
401
399
|
"varying vec4 " + V_POSITION + ";\n"
|
|
402
400
|
"varying vec4 " + V_TEXCOORD + ";\n"
|
|
401
|
+
"varying vec3 " + V_TEXCOORD_MIN + ";\n"
|
|
402
|
+
"varying vec3 " + V_TEXCOORD_MAX + ";\n"
|
|
403
403
|
"varying vec4 " + V_COLOR + ";\n"
|
|
404
404
|
"uniform mat4 " + U_POSITION_MATRIX + ";\n"
|
|
405
405
|
"uniform mat4 " + U_TEXCOORD_MATRIX + ";\n"
|
|
406
406
|
"void main ()\n"
|
|
407
407
|
"{\n"
|
|
408
|
-
"
|
|
409
|
-
"
|
|
410
|
-
" " +
|
|
411
|
-
" " +
|
|
412
|
-
" " + V_COLOR
|
|
413
|
-
" gl_Position
|
|
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"
|
|
414
414
|
"}\n";
|
|
415
415
|
}
|
|
416
416
|
|
|
@@ -449,23 +449,34 @@ namespace Rays
|
|
|
449
449
|
ShaderEnv::ShaderEnv (
|
|
450
450
|
const NameList& a_position_names,
|
|
451
451
|
const NameList& a_texcoord_names,
|
|
452
|
+
const NameList& a_texcoord_min_names,
|
|
453
|
+
const NameList& a_texcoord_max_names,
|
|
452
454
|
const NameList& a_color_names,
|
|
453
455
|
const char* v_position_name,
|
|
454
456
|
const char* v_texcoord_name,
|
|
457
|
+
const char* v_texcoord_min_name,
|
|
458
|
+
const char* v_texcoord_max_name,
|
|
455
459
|
const char* v_color_name,
|
|
456
460
|
const NameList& u_position_matrix_names,
|
|
457
461
|
const NameList& u_texcoord_matrix_names,
|
|
458
|
-
const NameList&
|
|
459
|
-
const NameList& u_texcoord_max_names,
|
|
460
|
-
const NameList& u_texcoord_offset_names,
|
|
462
|
+
const NameList& u_texcoord_pixel_names,
|
|
461
463
|
const NameList& u_texture_names,
|
|
462
464
|
uint flags)
|
|
463
465
|
: self(new Data(
|
|
464
466
|
ShaderBuiltinVariableNames(
|
|
465
|
-
a_position_names,
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
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,
|
|
469
480
|
u_texture_names),
|
|
470
481
|
flags))
|
|
471
482
|
{
|
|
@@ -502,40 +513,46 @@ namespace Rays
|
|
|
502
513
|
ShaderBuiltinVariableNames::ShaderBuiltinVariableNames (
|
|
503
514
|
const ShaderEnv::NameList& a_position,
|
|
504
515
|
const ShaderEnv::NameList& a_texcoord,
|
|
516
|
+
const ShaderEnv::NameList& a_texcoord_min,
|
|
517
|
+
const ShaderEnv::NameList& a_texcoord_max,
|
|
505
518
|
const ShaderEnv::NameList& a_color,
|
|
506
519
|
const char* v_position,
|
|
507
520
|
const char* v_texcoord,
|
|
521
|
+
const char* v_texcoord_min,
|
|
522
|
+
const char* v_texcoord_max,
|
|
508
523
|
const char* v_color,
|
|
509
524
|
const ShaderEnv::NameList& u_position_matrix,
|
|
510
525
|
const ShaderEnv::NameList& u_texcoord_matrix,
|
|
511
|
-
const ShaderEnv::NameList&
|
|
512
|
-
const ShaderEnv::NameList& u_texcoord_max,
|
|
513
|
-
const ShaderEnv::NameList& u_texcoord_offset,
|
|
526
|
+
const ShaderEnv::NameList& u_texcoord_pixel,
|
|
514
527
|
const ShaderEnv::NameList& u_texture)
|
|
515
528
|
: attribute_position_names(a_position),
|
|
516
529
|
attribute_texcoord_names(a_texcoord),
|
|
530
|
+
attribute_texcoord_min_names(a_texcoord_min),
|
|
531
|
+
attribute_texcoord_max_names(a_texcoord_max),
|
|
517
532
|
attribute_color_names(a_color),
|
|
518
|
-
varying_position_name(v_position
|
|
519
|
-
varying_texcoord_name(v_texcoord
|
|
520
|
-
|
|
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"),
|
|
521
538
|
uniform_position_matrix_names(u_position_matrix),
|
|
522
539
|
uniform_texcoord_matrix_names(u_texcoord_matrix),
|
|
523
|
-
|
|
524
|
-
uniform_texcoord_max_names(u_texcoord_max),
|
|
525
|
-
uniform_texcoord_offset_names(u_texcoord_offset),
|
|
540
|
+
uniform_texcoord_pixel_names(u_texcoord_pixel),
|
|
526
541
|
uniform_texture_names(u_texture)
|
|
527
542
|
{
|
|
528
543
|
validate_names(&attribute_position_names, "attribute_position", "a_Position");
|
|
529
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");
|
|
530
547
|
validate_names(&attribute_color_names, "attribute_color", "a_Color");
|
|
531
548
|
validate_name(varying_position_name, "varying_position");
|
|
532
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");
|
|
533
552
|
validate_name(varying_color_name, "varying_color");
|
|
534
553
|
validate_names(&uniform_position_matrix_names, "uniform_position_matrix", "u_PositionMatrix");
|
|
535
554
|
validate_names(&uniform_texcoord_matrix_names, "uniform_texcoord_matrix", "u_TexCoordMatrix");
|
|
536
|
-
validate_names(&
|
|
537
|
-
validate_names(&uniform_texcoord_max_names, "uniform_texcoord_max", "u_TexCoordMax");
|
|
538
|
-
validate_names(&uniform_texcoord_offset_names, "uniform_texcoord_offset", "u_TexCoordOffset");
|
|
555
|
+
validate_names(&uniform_texcoord_pixel_names, "uniform_texcoord_pixel", "u_TexCoordPixel");
|
|
539
556
|
validate_names(&uniform_texture_names, "uniform_texture", "u_Texture");
|
|
540
557
|
}
|
|
541
558
|
|
data/src/opengl/shader.h
CHANGED
|
@@ -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
|
|
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&
|
|
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,10 +5,10 @@
|
|
|
5
5
|
#include <vector>
|
|
6
6
|
#include <memory>
|
|
7
7
|
#include <algorithm>
|
|
8
|
-
#include "rays/shader.h"
|
|
9
8
|
#include "rays/exception.h"
|
|
10
9
|
#include "../painter.h"
|
|
11
10
|
#include "texture.h"
|
|
11
|
+
#include "shader.h"
|
|
12
12
|
#include "shader_source.h"
|
|
13
13
|
|
|
14
14
|
|
|
@@ -253,12 +253,12 @@ namespace Rays
|
|
|
253
253
|
struct ShaderProgram::Data
|
|
254
254
|
{
|
|
255
255
|
|
|
256
|
-
GLuint id
|
|
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 =
|
|
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,
|
|
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->
|
|
427
|
+
self->env = env;
|
|
414
428
|
}
|
|
415
429
|
|
|
416
430
|
ShaderProgram::~ShaderProgram ()
|
data/src/opengl/shader_program.h
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
{
|
data/src/opengl/texture.cpp
CHANGED
|
@@ -228,6 +228,12 @@ namespace Rays
|
|
|
228
228
|
self->modified = true;
|
|
229
229
|
}
|
|
230
230
|
|
|
231
|
+
GLuint
|
|
232
|
+
Texture_get_id (const Texture& texture)
|
|
233
|
+
{
|
|
234
|
+
return texture.self->id;
|
|
235
|
+
}
|
|
236
|
+
|
|
231
237
|
|
|
232
238
|
Texture::Texture ()
|
|
233
239
|
{
|
|
@@ -318,12 +324,6 @@ namespace Rays
|
|
|
318
324
|
return self->smooth;
|
|
319
325
|
}
|
|
320
326
|
|
|
321
|
-
GLuint
|
|
322
|
-
Texture_get_id (const Texture& texture)
|
|
323
|
-
{
|
|
324
|
-
return texture.self->id;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
327
|
void
|
|
328
328
|
Texture::set_modified (bool modified)
|
|
329
329
|
{
|
|
@@ -351,5 +351,17 @@ namespace Rays
|
|
|
351
351
|
return !operator bool();
|
|
352
352
|
}
|
|
353
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
|
+
|
|
354
366
|
|
|
355
367
|
}// Rays
|
data/src/osx/bitmap.mm
CHANGED
|
@@ -263,7 +263,7 @@ namespace Rays
|
|
|
263
263
|
|
|
264
264
|
NSString* path = [NSString stringWithUTF8String: path_];
|
|
265
265
|
NSBitmapImageRep* imagerep =
|
|
266
|
-
[NSBitmapImageRep imageRepWithContentsOfFile: path];
|
|
266
|
+
(NSBitmapImageRep*) [NSBitmapImageRep imageRepWithContentsOfFile: path];
|
|
267
267
|
if (!imagerep)
|
|
268
268
|
rays_error(__FILE__, __LINE__, "[NSBitmapImageRep imageRepWithContentsOfFile] failed.");
|
|
269
269
|
|