rays 0.1.27 → 0.1.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.doc/ext/rays/exception.cpp +45 -0
- data/.doc/ext/rays/native.cpp +2 -0
- data/.doc/ext/rays/painter.cpp +7 -2
- data/.doc/ext/rays/shader.cpp +100 -6
- data/VERSION +1 -1
- data/ext/rays/defs.h +1 -0
- data/ext/rays/exception.cpp +45 -0
- data/ext/rays/native.cpp +2 -0
- data/ext/rays/painter.cpp +7 -2
- data/ext/rays/shader.cpp +101 -5
- data/include/rays/exception.h +11 -0
- data/include/rays/ruby/bitmap.h +0 -1
- data/include/rays/ruby/bounds.h +0 -2
- data/include/rays/ruby/camera.h +0 -1
- data/include/rays/ruby/color.h +0 -2
- data/include/rays/ruby/color_space.h +0 -1
- data/include/rays/ruby/defs.h +30 -0
- data/include/rays/ruby/exception.h +28 -0
- data/include/rays/ruby/font.h +0 -1
- data/include/rays/ruby/image.h +0 -1
- data/include/rays/ruby/matrix.h +0 -1
- data/include/rays/ruby/painter.h +0 -1
- data/include/rays/ruby/point.h +0 -2
- data/include/rays/ruby/polygon.h +0 -1
- data/include/rays/ruby/polyline.h +0 -1
- data/include/rays/ruby/rays.h +0 -1
- data/include/rays/ruby/shader.h +0 -1
- data/include/rays/ruby.h +2 -0
- data/include/rays/shader.h +48 -1
- data/lib/rays/painter.rb +6 -5
- data/lib/rays/point.rb +1 -0
- data/lib/rays/shader.rb +18 -5
- data/rays.gemspec +2 -2
- data/src/exception.cpp +13 -0
- data/src/image.cpp +6 -4
- data/src/ios/bitmap.mm +18 -1
- data/src/opengl.cpp +21 -7
- data/src/opengl.h +5 -3
- data/src/osx/bitmap.mm +18 -1
- data/src/osx/font.mm +0 -2
- data/src/osx/opengl.mm +17 -2
- data/src/painter.cpp +196 -125
- data/src/shader.cpp +333 -53
- data/src/shader.h +53 -14
- data/src/shader_program.cpp +53 -27
- data/src/shader_program.h +8 -1
- data/src/shader_source.cpp +2 -2
- data/src/texture.cpp +75 -63
- data/test/test_image.rb +45 -10
- data/test/test_painter.rb +26 -4
- data/test/test_point.rb +6 -5
- data/test/test_rays.rb +2 -2
- data/test/test_shader.rb +151 -14
- metadata +11 -6
data/src/shader_source.cpp
CHANGED
@@ -42,7 +42,7 @@ namespace Rays
|
|
42
42
|
GLint status = GL_FALSE;
|
43
43
|
glGetShaderiv(id, GL_COMPILE_STATUS, &status);
|
44
44
|
if (status == GL_FALSE)
|
45
|
-
|
45
|
+
shader_error(__FILE__, __LINE__, get_compile_log().c_str());
|
46
46
|
|
47
47
|
type = type_;
|
48
48
|
source = source_;
|
@@ -98,7 +98,7 @@ namespace Rays
|
|
98
98
|
const char*
|
99
99
|
ShaderSource::source () const
|
100
100
|
{
|
101
|
-
return self->source;
|
101
|
+
return self->is_valid() ? self->source.c_str() : NULL;
|
102
102
|
}
|
103
103
|
|
104
104
|
GLenum
|
data/src/texture.cpp
CHANGED
@@ -82,38 +82,6 @@ namespace Rays
|
|
82
82
|
return n;
|
83
83
|
}
|
84
84
|
|
85
|
-
static void
|
86
|
-
setup_texture (Texture::Data* self, const void* pixels = NULL)
|
87
|
-
{
|
88
|
-
assert(self && !self->has_id());
|
89
|
-
|
90
|
-
if (self->context)
|
91
|
-
invalid_state_error(__FILE__, __LINE__);
|
92
|
-
|
93
|
-
self->context = OpenGL_get_context();
|
94
|
-
if (!self->context)
|
95
|
-
opengl_error(__FILE__, __LINE__);
|
96
|
-
|
97
|
-
glGenTextures(1, &self->id);
|
98
|
-
glBindTexture(GL_TEXTURE_2D, self->id);
|
99
|
-
if (glIsTexture(self->id) == GL_FALSE)
|
100
|
-
opengl_error(__FILE__, __LINE__, "failed to create texture.");
|
101
|
-
|
102
|
-
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
103
|
-
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
104
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
105
|
-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//GL_LINEAR);
|
106
|
-
|
107
|
-
GLenum format, type;
|
108
|
-
ColorSpace_get_gl_format_and_type(&format, &type, self->color_space);
|
109
|
-
|
110
|
-
glTexImage2D(
|
111
|
-
GL_TEXTURE_2D, 0, format, self->width_pow2, self->height_pow2, 0,
|
112
|
-
format, type, pixels);
|
113
|
-
|
114
|
-
OpenGL_check_error(__FILE__, __LINE__);
|
115
|
-
}
|
116
|
-
|
117
85
|
template <int BytesPerPixel>
|
118
86
|
static inline void
|
119
87
|
copy_pixel (uchar* dest, const uchar* src)
|
@@ -179,7 +147,9 @@ namespace Rays
|
|
179
147
|
static void
|
180
148
|
copy_bitmap (Bitmap* dest, const Bitmap& src)
|
181
149
|
{
|
182
|
-
|
150
|
+
assert(dest);
|
151
|
+
|
152
|
+
if (!src)
|
183
153
|
argument_error(__FILE__, __LINE__);
|
184
154
|
|
185
155
|
int width = std::min(src.width(), dest->width());
|
@@ -196,51 +166,91 @@ namespace Rays
|
|
196
166
|
}
|
197
167
|
}
|
198
168
|
|
199
|
-
|
200
|
-
|
169
|
+
static std::shared_ptr<Bitmap>
|
170
|
+
resize_bitmap (const Bitmap& bitmap, int width, int height)
|
201
171
|
{
|
172
|
+
std::shared_ptr<Bitmap> bmp(
|
173
|
+
new Bitmap(width, height, bitmap.color_space()));
|
174
|
+
if (!*bmp)
|
175
|
+
rays_error(__FILE__, __LINE__);
|
176
|
+
|
177
|
+
copy_bitmap(bmp.get(), bitmap);
|
178
|
+
return bmp;
|
202
179
|
}
|
203
180
|
|
204
|
-
|
181
|
+
static void
|
182
|
+
setup_texture (
|
183
|
+
Texture::Data* self, int width, int height, const ColorSpace& cs,
|
184
|
+
const Bitmap* bitmap = NULL)
|
205
185
|
{
|
206
|
-
|
207
|
-
|
186
|
+
assert(self && !self->has_id());
|
187
|
+
|
188
|
+
if (self->context)
|
189
|
+
invalid_state_error(__FILE__, __LINE__);
|
190
|
+
|
191
|
+
self->context = OpenGL_get_context();
|
192
|
+
if (!self->context)
|
193
|
+
opengl_error(__FILE__, __LINE__);
|
194
|
+
|
195
|
+
glGenTextures(1, &self->id);
|
196
|
+
glBindTexture(GL_TEXTURE_2D, self->id);
|
197
|
+
if (glIsTexture(self->id) == GL_FALSE)
|
198
|
+
opengl_error(__FILE__, __LINE__, "failed to create texture.");
|
199
|
+
|
200
|
+
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
201
|
+
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
202
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
203
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//GL_LINEAR);
|
204
|
+
|
205
|
+
GLenum format, type;
|
206
|
+
ColorSpace_get_gl_format_and_type(&format, &type, cs);
|
207
|
+
|
208
|
+
// create non-power-of-two texture
|
209
|
+
glTexImage2D(
|
210
|
+
GL_TEXTURE_2D, 0, format, width, height, 0, format, type,
|
211
|
+
bitmap ? bitmap->pixels() : NULL);
|
212
|
+
if (OpenGL_has_error())
|
213
|
+
{
|
214
|
+
// create power-of-two texture
|
215
|
+
int width_pow2 = min_pow2(width);
|
216
|
+
int height_pow2 = min_pow2(height);
|
217
|
+
|
218
|
+
glTexImage2D(
|
219
|
+
GL_TEXTURE_2D, 0, format, width_pow2, height_pow2, 0, format, type,
|
220
|
+
bitmap ? resize_bitmap(*bitmap, width_pow2, height_pow2)->pixels() : NULL);
|
221
|
+
OpenGL_check_error(__FILE__, __LINE__);
|
222
|
+
|
223
|
+
self->width_pow2 = width_pow2;
|
224
|
+
self->height_pow2 = height_pow2;
|
225
|
+
}
|
208
226
|
|
209
227
|
self->width = width;
|
210
228
|
self->height = height;
|
211
|
-
self->width_pow2 = min_pow2(width);
|
212
|
-
self->height_pow2 = min_pow2(height);
|
213
229
|
self->color_space = cs;
|
214
230
|
self->modified = true;
|
231
|
+
}
|
215
232
|
|
216
|
-
|
233
|
+
|
234
|
+
Texture::Texture ()
|
235
|
+
{
|
217
236
|
}
|
218
237
|
|
219
|
-
Texture::Texture (const
|
238
|
+
Texture::Texture (int width, int height, const ColorSpace& cs)
|
220
239
|
{
|
221
|
-
if (!
|
240
|
+
if (width <= 0 || height <= 0 || !cs)
|
222
241
|
argument_error(__FILE__, __LINE__);
|
223
242
|
|
224
|
-
self
|
225
|
-
|
226
|
-
self->width_pow2 = min_pow2(self->width);
|
227
|
-
self->height_pow2 = min_pow2(self->height);
|
228
|
-
self->color_space = bitmap.color_space();
|
229
|
-
self->modified = true;
|
230
|
-
|
231
|
-
Bitmap bmp = bitmap;
|
232
|
-
if (
|
233
|
-
self->width_pow2 != self->width ||
|
234
|
-
self->height_pow2 != self->height)
|
235
|
-
{
|
236
|
-
bmp = Bitmap(self->width_pow2, self->height_pow2, self->color_space);
|
237
|
-
if (!bmp)
|
238
|
-
rays_error(__FILE__, __LINE__);
|
243
|
+
setup_texture(self.get(), width, height, cs);
|
244
|
+
}
|
239
245
|
|
240
|
-
|
241
|
-
|
246
|
+
Texture::Texture (const Bitmap& bitmap)
|
247
|
+
{
|
248
|
+
if (!bitmap)
|
249
|
+
argument_error(__FILE__, __LINE__);
|
242
250
|
|
243
|
-
setup_texture(
|
251
|
+
setup_texture(
|
252
|
+
self.get(), bitmap.width(), bitmap.height(), bitmap.color_space(),
|
253
|
+
&bitmap);
|
244
254
|
}
|
245
255
|
|
246
256
|
Texture::~Texture ()
|
@@ -256,7 +266,8 @@ namespace Rays
|
|
256
266
|
int
|
257
267
|
Texture::reserved_width () const
|
258
268
|
{
|
259
|
-
|
269
|
+
int w = self->width_pow2;
|
270
|
+
return w > 0 ? w : self->width;
|
260
271
|
}
|
261
272
|
|
262
273
|
int
|
@@ -268,7 +279,8 @@ namespace Rays
|
|
268
279
|
int
|
269
280
|
Texture::reserved_height () const
|
270
281
|
{
|
271
|
-
|
282
|
+
int h = self->height_pow2;
|
283
|
+
return h > 0 ? h : self->height;
|
272
284
|
}
|
273
285
|
|
274
286
|
const ColorSpace&
|
data/test/test_image.rb
CHANGED
@@ -6,11 +6,12 @@ require_relative 'helper'
|
|
6
6
|
|
7
7
|
class TestImage < Test::Unit::TestCase
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
def image(*args)
|
10
|
+
Rays::Image.new(*args)
|
11
|
+
end
|
11
12
|
|
12
|
-
def
|
13
|
-
Rays::Image.
|
13
|
+
def load(path)
|
14
|
+
Rays::Image.load path
|
14
15
|
end
|
15
16
|
|
16
17
|
def color(r = 0, g = 0, b = 0, a = 0)
|
@@ -22,12 +23,12 @@ class TestImage < Test::Unit::TestCase
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def test_initialize()
|
25
|
-
assert_equal
|
26
|
-
assert_equal
|
26
|
+
assert_equal 10, image(10, 20).width
|
27
|
+
assert_equal 10, image(20, 10).height
|
27
28
|
end
|
28
29
|
|
29
30
|
def test_dup()
|
30
|
-
o = image
|
31
|
+
o = image 10, 10
|
31
32
|
assert_equal color(0, 0, 0, 0), o[0, 0]
|
32
33
|
o[0, 0] = color(1, 0, 0, 0)
|
33
34
|
assert_equal color(1, 0, 0, 0), o[0, 0]
|
@@ -39,12 +40,12 @@ class TestImage < Test::Unit::TestCase
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def test_bitmap()
|
42
|
-
assert_equal
|
43
|
-
assert_equal
|
43
|
+
assert_equal 10, image(10, 20).bitmap.width
|
44
|
+
assert_equal 10, image(20, 10).bitmap.height
|
44
45
|
end
|
45
46
|
|
46
47
|
def test_painter()
|
47
|
-
pa = image.painter
|
48
|
+
pa = image(10, 10).painter
|
48
49
|
assert_equal color(0, 0, 0, 0), pa.background
|
49
50
|
assert_equal color(1, 1, 1, 1), pa.fill
|
50
51
|
assert_equal color(1, 1, 1, 0), pa.stroke
|
@@ -73,4 +74,38 @@ class TestImage < Test::Unit::TestCase
|
|
73
74
|
assert drawn {|p| p.text "a"}
|
74
75
|
end
|
75
76
|
|
77
|
+
def test_save_load()
|
78
|
+
def get_image_type(filename)
|
79
|
+
`file #{filename}`.match(/#{filename}: ([^,]+),/)[1]
|
80
|
+
end
|
81
|
+
|
82
|
+
img = image(10, 10).paint {fill 1, 0, 0; ellipse 0, 0, 10}
|
83
|
+
pixels = img.bitmap.to_a
|
84
|
+
paths = %w[png jpg jpeg gif bmp tif tiff].map {|ext| "#{__dir__}/testimage.#{ext}"}
|
85
|
+
|
86
|
+
png, jpg, jpeg, gif, bmp, tif, tiff = paths
|
87
|
+
|
88
|
+
paths.each {|path| img.save path}
|
89
|
+
|
90
|
+
assert_equal 'PNG image data', get_image_type(png)
|
91
|
+
assert_equal 'JPEG image data', get_image_type(jpg)
|
92
|
+
assert_equal 'JPEG image data', get_image_type(jpeg)
|
93
|
+
assert_equal 'GIF image data', get_image_type(gif)
|
94
|
+
assert_equal 'PC bitmap', get_image_type(bmp)
|
95
|
+
assert_equal 'TIFF image data', get_image_type(tif)
|
96
|
+
assert_equal 'TIFF image data', get_image_type(tiff)
|
97
|
+
|
98
|
+
assert_equal pixels, load(png) .then {|o| o.bitmap.to_a}
|
99
|
+
assert_equal [10, 10], load(jpg) .then {|o| [o.width, o.height]}
|
100
|
+
assert_equal [10, 10], load(jpeg).then {|o| [o.width, o.height]}
|
101
|
+
assert_equal pixels, load(gif) .then {|o| o.bitmap.to_a}
|
102
|
+
assert_equal [10, 10], load(bmp) .then {|o| [o.width, o.height]}
|
103
|
+
assert_equal pixels, load(tif) .then {|o| o.bitmap.to_a}
|
104
|
+
assert_equal pixels, load(tiff).then {|o| o.bitmap.to_a}
|
105
|
+
|
106
|
+
paths.each {|path| File.delete path}
|
107
|
+
|
108
|
+
assert_raise(ArgumentError) {img.save 'testimage.unknown'}
|
109
|
+
end
|
110
|
+
|
76
111
|
end# TestImage
|
data/test/test_painter.rb
CHANGED
@@ -19,18 +19,24 @@ class TestPainter < Test::Unit::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def image(w = 16, h = 16, bg: 0, &block)
|
22
|
-
Rays::Image.new(w, h)
|
22
|
+
Rays::Image.new(w, h)
|
23
|
+
.paint {background bg}
|
24
|
+
.tap {|img| img.paint(&block) if block}
|
25
|
+
end
|
26
|
+
|
27
|
+
def assert_gray(expected, actual)
|
28
|
+
assert_in_epsilon expected, actual, 0.02
|
23
29
|
end
|
24
30
|
|
25
31
|
def assert_rgb(expected, actual)
|
26
32
|
(0..2).each do |i|
|
27
|
-
|
33
|
+
assert_gray expected[i], actual[i]
|
28
34
|
end
|
29
35
|
end
|
30
36
|
|
31
37
|
def assert_rgba(expected, actual)
|
32
38
|
(0..3).each do |i|
|
33
|
-
|
39
|
+
assert_gray expected[i], actual[i]
|
34
40
|
end
|
35
41
|
end
|
36
42
|
|
@@ -369,7 +375,23 @@ class TestPainter < Test::Unit::TestCase
|
|
369
375
|
end
|
370
376
|
|
371
377
|
def test_shader()
|
372
|
-
|
378
|
+
image.paint do |pa|
|
379
|
+
assert_nil pa.shader
|
380
|
+
|
381
|
+
pa.shader = Rays::Shader.new "void main() {gl_FragColor = vec4(0.0);}"
|
382
|
+
assert_instance_of Rays::Shader, pa.shader
|
383
|
+
|
384
|
+
pa.shader = nil
|
385
|
+
assert_nil pa.shader
|
386
|
+
|
387
|
+
pa.shader = "void main() {gl_FragColor = vec4(0.0);}"
|
388
|
+
assert_instance_of Rays::Shader, pa.shader
|
389
|
+
|
390
|
+
pa.no_shader
|
391
|
+
assert_nil pa.shader
|
392
|
+
end
|
393
|
+
|
394
|
+
img = image.paint {
|
373
395
|
shader "void main() {gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);}"
|
374
396
|
fill 1, 0, 0
|
375
397
|
rect bounds
|
data/test/test_point.rb
CHANGED
@@ -112,13 +112,14 @@ class TestPoint < Test::Unit::TestCase
|
|
112
112
|
|
113
113
|
def test_to_a()
|
114
114
|
o = point 1, 2, 3
|
115
|
-
assert_equal [1, 2],
|
116
|
-
assert_equal [1],
|
117
|
-
assert_equal [1, 2],
|
118
|
-
assert_equal [1, 2, 3],
|
115
|
+
assert_equal [1, 2], o.to_a
|
116
|
+
assert_equal [1], o.to_a(1)
|
117
|
+
assert_equal [1, 2], o.to_a(2)
|
118
|
+
assert_equal [1, 2, 3], o.to_a(3)
|
119
|
+
assert_equal [1, 2, 3, 1], o.to_a(4)
|
119
120
|
assert_raise(ArgumentError) {o.to_a(-1)}
|
120
121
|
assert_raise(ArgumentError) {o.to_a(0)}
|
121
|
-
assert_raise(ArgumentError) {o.to_a(
|
122
|
+
assert_raise(ArgumentError) {o.to_a(5)}
|
122
123
|
end
|
123
124
|
|
124
125
|
def test_index()
|
data/test/test_rays.rb
CHANGED
@@ -9,9 +9,9 @@ require_relative 'helper'
|
|
9
9
|
class TestRays < Test::Unit::TestCase
|
10
10
|
|
11
11
|
def test_init!()
|
12
|
-
assert_raise(
|
12
|
+
assert_raise(Rays::RaysError) {Rays.fin!}
|
13
13
|
assert Rays.init!
|
14
|
-
assert_raise(
|
14
|
+
assert_raise(Rays::RaysError) {Rays.init!}
|
15
15
|
assert Rays.fin!
|
16
16
|
end
|
17
17
|
|
data/test/test_shader.rb
CHANGED
@@ -6,32 +6,169 @@ require_relative 'helper'
|
|
6
6
|
|
7
7
|
class TestShader < Test::Unit::TestCase
|
8
8
|
|
9
|
-
def shader(
|
10
|
-
Rays::Shader.new
|
9
|
+
def shader(*a, **k)
|
10
|
+
Rays::Shader.new(*a, **k)
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
Rays::Image.new
|
13
|
+
def image(w = 10, h = 10, &block)
|
14
|
+
Rays::Image.new(w, h).tap {|i| i.paint(&block) if block}
|
15
15
|
end
|
16
16
|
|
17
17
|
def color(*args)
|
18
18
|
Rays::Color.new(*args)
|
19
19
|
end
|
20
20
|
|
21
|
+
def vshader()
|
22
|
+
"void main() {gl_Position = vec4(0.0, 0.0, 0.0, 1.0);}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def fshader()
|
26
|
+
"void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def draw_shader(
|
30
|
+
fragment_shader_source, fill: 1, options: {}, uniforms: {}, &block)
|
31
|
+
|
32
|
+
image.tap do |img|
|
33
|
+
img.paint do |p|
|
34
|
+
p.shader shader(fragment_shader_source, **options.merge(uniforms))
|
35
|
+
block.call p.shader if block
|
36
|
+
p.fill(*fill)
|
37
|
+
p.stroke nil
|
38
|
+
p.rect img.bounds.move_to(0, 0)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
21
43
|
def test_initialize()
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
44
|
+
assert shader(fshader)
|
45
|
+
assert shader(fshader, vshader)
|
46
|
+
|
47
|
+
assert_raise(Rays::ShaderError) {shader "foo"}
|
48
|
+
assert_raise(Rays::ShaderError) {shader "foo", vshader}
|
49
|
+
assert_raise(Rays::ShaderError) {shader fshader, "foo"}
|
50
|
+
assert_raise(Rays::ShaderError) {shader vshader}
|
51
|
+
assert_raise(Rays::ShaderError) {shader fshader, fshader}
|
52
|
+
assert_raise(ArgumentError) {shader nil}
|
26
53
|
end
|
27
54
|
|
28
55
|
def test_shader()
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
56
|
+
assert_equal color(1, 0, 0, 1), draw_shader(<<~END, fill: [0, 1, 0, 1])[0, 0]
|
57
|
+
void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);}
|
58
|
+
END
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_uniform_int()
|
62
|
+
draw = -> (type, color_string, &b) {
|
63
|
+
draw_shader(<<~END) {|shader| b.call shader}[0, 0].to_a
|
64
|
+
uniform #{type} v;
|
65
|
+
float f(int value, int div) {
|
66
|
+
return float(value) / float(div);
|
67
|
+
}
|
68
|
+
void main() {
|
69
|
+
gl_FragColor = vec4(#{color_string});
|
70
|
+
}
|
71
|
+
END
|
72
|
+
}
|
73
|
+
assert_equal [1, 0, 0, 1], draw['int', 'f(v, 1), 0.0, 0.0, 1.0'] {|sh| sh.uniform :v, 1}
|
74
|
+
assert_equal [1, 0, 0, 1], draw['int', 'f(v, 1), 0.0, 0.0, 1.0'] {|sh| sh.uniform :v, [1]}
|
75
|
+
assert_equal [1, 1, 0, 1], draw['ivec2', 'f(v.x, 1), f(v.y, 2), 0.0, 1.0'] {|sh| sh.uniform :v, 1, 2}
|
76
|
+
assert_equal [1, 1, 0, 1], draw['ivec2', 'f(v.x, 1), f(v.y, 2), 0.0, 1.0'] {|sh| sh.uniform :v, [1, 2]}
|
77
|
+
assert_equal [1, 1, 1, 1], draw['ivec3', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), 1.0'] {|sh| sh.uniform :v, 1, 2, 3}
|
78
|
+
assert_equal [1, 1, 1, 1], draw['ivec3', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), 1.0'] {|sh| sh.uniform :v, [1, 2, 3]}
|
79
|
+
assert_equal [1, 1, 1, 1], draw['ivec4', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), f(v.w, 4)'] {|sh| sh.uniform :v, 1, 2, 3, 4}
|
80
|
+
assert_equal [1, 1, 1, 1], draw['ivec4', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), f(v.w, 4)'] {|sh| sh.uniform :v, [1, 2, 3, 4]}
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_uniform_float()
|
84
|
+
draw = -> (type, color_string, &b) {
|
85
|
+
draw_shader(<<~END) {|shader| b.call shader}[0, 0].to_a
|
86
|
+
uniform #{type} v;
|
87
|
+
float f(float value, int div) {
|
88
|
+
return value / float(div);
|
89
|
+
}
|
90
|
+
void main() {
|
91
|
+
gl_FragColor = vec4(#{color_string});
|
92
|
+
}
|
93
|
+
END
|
94
|
+
}
|
95
|
+
assert_equal [1, 0, 0, 1], draw['float', 'f(v, 1), 0.0, 0.0, 1.0'] {|sh| sh.uniform :v, 1.0}
|
96
|
+
assert_equal [1, 0, 0, 1], draw['float', 'f(v, 1), 0.0, 0.0, 1.0'] {|sh| sh.uniform :v, [1.0]}
|
97
|
+
assert_equal [1, 1, 0, 1], draw['vec2', 'f(v.x, 1), f(v.y, 2), 0.0, 1.0'] {|sh| sh.uniform :v, 1.0, 2.0}
|
98
|
+
assert_equal [1, 1, 0, 1], draw['vec2', 'f(v.x, 1), f(v.y, 2), 0.0, 1.0'] {|sh| sh.uniform :v, [1.0, 2.0]}
|
99
|
+
assert_equal [1, 1, 1, 1], draw['vec3', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), 1.0'] {|sh| sh.uniform :v, 1.0, 2.0, 3.0}
|
100
|
+
assert_equal [1, 1, 1, 1], draw['vec3', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), 1.0'] {|sh| sh.uniform :v, [1.0, 2.0, 3.0]}
|
101
|
+
assert_equal [1, 1, 1, 1], draw['vec4', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), f(v.w, 4)'] {|sh| sh.uniform :v, 1.0, 2.0, 3.0, 4.0}
|
102
|
+
assert_equal [1, 1, 1, 1], draw['vec4', 'f(v.x, 1), f(v.y, 2), f(v.z, 3), f(v.w, 4)'] {|sh| sh.uniform :v, [1.0, 2.0, 3.0, 4.0]}
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_uniform_texture()
|
106
|
+
r, g, b = [[1, 0, 0], [0, 1, 0], [0, 0, 1]].map {|c| image {fill c; rect 10}}
|
107
|
+
assert_equal color(1, 1, 1, 1), draw_shader(<<~END, uniforms: {tex0: r, tex1: g, tex2: b})[0, 0]
|
108
|
+
uniform sampler2D tex0, tex1, tex2;
|
109
|
+
varying vec4 v_TexCoord;
|
110
|
+
void main() {
|
111
|
+
gl_FragColor = vec4(
|
112
|
+
texture2D(tex0, v_TexCoord.xy).r,
|
113
|
+
texture2D(tex1, v_TexCoord.xy).g,
|
114
|
+
texture2D(tex2, v_TexCoord.xy).b,
|
115
|
+
1.0);
|
116
|
+
}
|
117
|
+
END
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_uniform_error()
|
121
|
+
ignore = -> bool {{ignore_no_uniform_location_error: bool}}
|
122
|
+
|
123
|
+
assert_raise(Rays::ShaderError) {draw_shader 'void main() {}', uniforms: {val: 1.0}}
|
124
|
+
assert_raise(Rays::ShaderError) {draw_shader 'void main() {}', options: ignore[false], uniforms: {val: 1.0}}
|
125
|
+
assert_nothing_raised {draw_shader 'void main() {}', options: ignore[true], uniforms: {val: 1.0}}
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_shader_source()
|
129
|
+
assert_equal vshader, shader(fshader, vshader).vertex_shader_source
|
130
|
+
assert_equal fshader, shader(fshader, vshader).fragment_shader_source
|
131
|
+
|
132
|
+
assert_true shader(fshader).vertex_shader_source.then {|source|
|
133
|
+
%w[
|
134
|
+
a_Position a_TexCoord a_Color
|
135
|
+
v_Position v_TexCoord v_Color
|
136
|
+
u_PositionMatrix u_TexCoordMatrix
|
137
|
+
].all? {|name| source.include? name}
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_shader_env()
|
142
|
+
env = {
|
143
|
+
attribute_position: 'aP',
|
144
|
+
attribute_texcoord: ['aTC', 'aTC2'],
|
145
|
+
attribute_color: [],
|
146
|
+
varying_position: 'vP',
|
147
|
+
varying_texcoord: nil,
|
148
|
+
#varying_color: define nothing
|
149
|
+
uniform_position_matrix: nil,
|
150
|
+
#uniform_texcoord_matrix: define nothing
|
151
|
+
}
|
152
|
+
assert_true shader(fshader, nil, env).vertex_shader_source.then {|source|
|
153
|
+
%w[
|
154
|
+
aP
|
155
|
+
aTC
|
156
|
+
a_Color
|
157
|
+
vP
|
158
|
+
v_TexCoord
|
159
|
+
v_Color
|
160
|
+
u_PositionMatrix
|
161
|
+
u_TexCoordMatrix
|
162
|
+
].all? {|name| source.include? name}
|
163
|
+
}
|
164
|
+
|
165
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {attribute_color: ''})}
|
166
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {attribute_color: ['']})}
|
167
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {attribute_color: [nil]})}
|
168
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {attribute_color: ['C', '']})}
|
169
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {attribute_color: ['C', nil]})}
|
170
|
+
|
171
|
+
assert_raise(ArgumentError) {shader(fshader, nil, {varying_color: ''})}
|
35
172
|
end
|
36
173
|
|
37
174
|
end# TestShader
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rays
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xot
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.
|
19
|
+
version: 0.1.29
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.
|
26
|
+
version: 0.1.29
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rucy
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1.
|
33
|
+
version: 0.1.29
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1.
|
40
|
+
version: 0.1.29
|
41
41
|
description: This library helps you to develop graphics application with OpenGL.
|
42
42
|
email: xordog@gmail.com
|
43
43
|
executables: []
|
@@ -50,6 +50,7 @@ extra_rdoc_files:
|
|
50
50
|
- ".doc/ext/rays/color.cpp"
|
51
51
|
- ".doc/ext/rays/color_space.cpp"
|
52
52
|
- ".doc/ext/rays/defs.cpp"
|
53
|
+
- ".doc/ext/rays/exception.cpp"
|
53
54
|
- ".doc/ext/rays/font.cpp"
|
54
55
|
- ".doc/ext/rays/image.cpp"
|
55
56
|
- ".doc/ext/rays/matrix.cpp"
|
@@ -69,6 +70,7 @@ files:
|
|
69
70
|
- ".doc/ext/rays/color.cpp"
|
70
71
|
- ".doc/ext/rays/color_space.cpp"
|
71
72
|
- ".doc/ext/rays/defs.cpp"
|
73
|
+
- ".doc/ext/rays/exception.cpp"
|
72
74
|
- ".doc/ext/rays/font.cpp"
|
73
75
|
- ".doc/ext/rays/image.cpp"
|
74
76
|
- ".doc/ext/rays/matrix.cpp"
|
@@ -92,6 +94,7 @@ files:
|
|
92
94
|
- ext/rays/color_space.cpp
|
93
95
|
- ext/rays/defs.cpp
|
94
96
|
- ext/rays/defs.h
|
97
|
+
- ext/rays/exception.cpp
|
95
98
|
- ext/rays/extconf.rb
|
96
99
|
- ext/rays/font.cpp
|
97
100
|
- ext/rays/image.cpp
|
@@ -131,6 +134,8 @@ files:
|
|
131
134
|
- include/rays/ruby/camera.h
|
132
135
|
- include/rays/ruby/color.h
|
133
136
|
- include/rays/ruby/color_space.h
|
137
|
+
- include/rays/ruby/defs.h
|
138
|
+
- include/rays/ruby/exception.h
|
134
139
|
- include/rays/ruby/font.h
|
135
140
|
- include/rays/ruby/image.h
|
136
141
|
- include/rays/ruby/matrix.h
|