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.
- checksums.yaml +4 -4
- data/.doc/ext/rays/image.cpp +10 -0
- data/.doc/ext/rays/painter.cpp +49 -1
- data/.doc/ext/rays/polygon.cpp +1 -1
- data/.doc/ext/rays/shader.cpp +8 -6
- data/.github/workflows/release-gem.yml +4 -1
- data/.github/workflows/test.yml +4 -4
- data/.github/workflows/utils.rb +88 -17
- data/ChangeLog.md +24 -0
- data/Gemfile.lock +6 -5
- 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/polygon.cpp +1 -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/bitmap.h +4 -0
- data/src/color_space.cpp +2 -42
- data/src/coord.h +10 -0
- data/src/font.cpp +1 -1
- data/src/image.cpp +85 -11
- data/src/ios/bitmap.mm +5 -32
- data/src/ios/rays.mm +3 -3
- data/src/opengl/bitmap.cpp +41 -0
- data/src/opengl/color_space.cpp +51 -0
- data/src/{color_space.h → opengl/color_space.h} +2 -2
- data/src/{frame_buffer.cpp → opengl/frame_buffer.cpp} +1 -1
- data/src/{frame_buffer.h → opengl/frame_buffer.h} +2 -2
- data/src/{ios → opengl/ios}/opengl.mm +3 -3
- data/src/{opengl.h → opengl/opengl.h} +2 -6
- data/src/{osx → opengl/osx}/opengl.mm +3 -3
- data/src/opengl/painter.cpp +1020 -0
- data/src/{render_buffer.cpp → opengl/render_buffer.cpp} +1 -1
- data/src/{render_buffer.h → opengl/render_buffer.h} +2 -2
- data/src/{sdl → opengl/sdl}/opengl.cpp +10 -3
- data/src/{shader.cpp → opengl/shader.cpp} +69 -53
- data/src/{shader.h → opengl/shader.h} +12 -8
- data/src/{shader_program.cpp → opengl/shader_program.cpp} +24 -10
- data/src/{shader_program.h → opengl/shader_program.h} +4 -3
- data/src/{shader_source.cpp → opengl/shader_source.cpp} +2 -4
- data/src/{shader_source.h → opengl/shader_source.h} +2 -2
- data/src/{texture.cpp → opengl/texture.cpp} +18 -7
- data/src/opengl/texture.h +21 -0
- data/src/{win32 → opengl/win32}/opengl.cpp +4 -3
- data/src/osx/bitmap.mm +6 -34
- data/src/osx/rays.mm +3 -3
- data/src/painter.cpp +96 -925
- data/src/painter.h +223 -11
- data/src/polygon.cpp +38 -13
- data/src/renderer.h +22 -0
- data/src/sdl/bitmap.cpp +5 -33
- data/src/sdl/font.cpp +358 -9
- data/src/sdl/rays.cpp +8 -3
- data/src/texture.h +6 -3
- data/src/win32/bitmap.cpp +6 -34
- data/src/win32/rays.cpp +3 -3
- data/test/test_painter.rb +36 -25
- data/test/test_painter_batch.rb +254 -0
- metadata +31 -24
- /data/src/{opengl.cpp → opengl/opengl.cpp} +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
#include "
|
|
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
|
-
|
|
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
|
-
|
|
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 "
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 " +
|
|
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
|
-
|
|
100
|
-
|
|
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 = " +
|
|
120
|
-
" vec2 _rays_len = " +
|
|
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
|
|
400
|
-
"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"
|
|
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
|
-
"
|
|
410
|
-
"
|
|
411
|
-
" " +
|
|
412
|
-
" " +
|
|
413
|
-
" " + V_COLOR
|
|
414
|
-
" 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"
|
|
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&
|
|
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,
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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&
|
|
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
|
|
520
|
-
varying_texcoord_name(v_texcoord
|
|
521
|
-
|
|
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
|
-
|
|
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(&
|
|
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
|
|
4
|
-
#define
|
|
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
|
|
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,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 "
|
|
9
|
+
#include "../painter.h"
|
|
11
10
|
#include "texture.h"
|
|
12
|
-
#include "
|
|
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
|
|
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
|
|
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 ()
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// -*- c++ -*-
|
|
2
2
|
#pragma once
|
|
3
|
-
#ifndef
|
|
4
|
-
#define
|
|
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
|
-
|
|
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
|
{
|
|
@@ -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 "
|
|
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
|
-
|
|
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
|
-
|
|
108
|
+
Renderer_fin ()
|
|
108
109
|
{
|
|
109
110
|
}
|
|
110
111
|
|