ray 0.2.0 → 0.2.1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +0 -1
- data/ext/drawable.c +21 -0
- data/ext/extconf.rb +1 -1
- data/ext/image.c +18 -0
- data/ext/matrix.c +29 -0
- data/ext/mo.c +194 -139
- data/ext/mo.h +57 -12
- data/ext/polygon.c +5 -0
- data/ext/say_buffer.c +24 -34
- data/ext/say_buffer_slice.c +24 -30
- data/ext/say_context.c +38 -0
- data/ext/say_context.h +24 -0
- data/ext/say_drawable.c +45 -38
- data/ext/say_drawable.h +1 -0
- data/ext/say_image.c +33 -16
- data/ext/say_image.h +4 -0
- data/ext/say_image_target.c +15 -26
- data/ext/say_index_buffer.c +8 -12
- data/ext/say_index_buffer_slice.c +22 -28
- data/ext/say_matrix.c +32 -0
- data/ext/say_matrix.h +6 -0
- data/ext/say_music.c +5 -3
- data/ext/say_pixel_bus.c +14 -17
- data/ext/say_shader.c +36 -32
- data/ext/say_target.c +3 -8
- data/ext/say_x11_window.h +9 -7
- data/ext/sprite.c +1 -0
- data/ext/text.c +2 -0
- data/lib/ray/matrix.rb +8 -2
- data/lib/ray/ray.rb +1 -1
- data/lib/ray/scene.rb +1 -2
- data/samples/turtle/byzantium.rb +1 -1
- data/samples/turtle/mandala.rb +1 -1
- data/test/drawable_test.rb +12 -0
- data/test/helpers.rb +7 -4
- data/test/image_test.rb +4 -0
- data/test/matrix_test.rb +14 -0
- metadata +327 -327
- data/samples/opengl/instancing.rbc +0 -3231
- data/samples/shaders/geometry.rbc +0 -2074
data/ext/say_matrix.c
CHANGED
@@ -312,3 +312,35 @@ void say_matrix_look_at(say_matrix *matrix,
|
|
312
312
|
|
313
313
|
say_matrix_free(other);
|
314
314
|
}
|
315
|
+
|
316
|
+
void say_matrix_set_transformation(say_matrix *matrix,
|
317
|
+
say_vector2 origin,
|
318
|
+
say_vector2 pos, float z,
|
319
|
+
say_vector2 scale,
|
320
|
+
float angle) {
|
321
|
+
angle = -angle * SAY_PI / 180;
|
322
|
+
|
323
|
+
float c = cosf(angle);
|
324
|
+
float s = sinf(angle);
|
325
|
+
|
326
|
+
float sx_cos = scale.x * c;
|
327
|
+
float sy_cos = scale.y * c;
|
328
|
+
float sx_sin = scale.x * s;
|
329
|
+
float sy_sin = scale.y * s;
|
330
|
+
|
331
|
+
float o_x = -origin.x * sx_cos - origin.y * sy_sin;
|
332
|
+
float o_y = +origin.x * sx_sin - origin.y * sy_cos;
|
333
|
+
|
334
|
+
float t_x = o_x + pos.x;
|
335
|
+
float t_y = o_y + pos.y;
|
336
|
+
float t_z = z;
|
337
|
+
|
338
|
+
float content[16] = {
|
339
|
+
+sx_cos, +sy_sin, 0, t_x,
|
340
|
+
-sx_sin, +sy_cos, 0, t_y,
|
341
|
+
0, 0, 1, t_z,
|
342
|
+
0, 0, 0, 1
|
343
|
+
};
|
344
|
+
|
345
|
+
say_matrix_set_content(matrix, content);
|
346
|
+
}
|
data/ext/say_matrix.h
CHANGED
@@ -52,4 +52,10 @@ void say_matrix_look_at(say_matrix *matrix,
|
|
52
52
|
float center_x, float center_y, float center_z,
|
53
53
|
float up_x, float up_y, float up_z);
|
54
54
|
|
55
|
+
void say_matrix_set_transformation(say_matrix *matrix,
|
56
|
+
say_vector2 origin,
|
57
|
+
say_vector2 pos, float z,
|
58
|
+
say_vector2 scale,
|
59
|
+
float angle);
|
60
|
+
|
55
61
|
#endif
|
data/ext/say_music.c
CHANGED
@@ -79,11 +79,13 @@ static void *say_music_playback_thread(say_music *music) {
|
|
79
79
|
}
|
80
80
|
}
|
81
81
|
|
82
|
-
/* sleep for 0.
|
82
|
+
/* sleep for 0.1s */
|
83
|
+
static const int sleep_time = 100;
|
84
|
+
|
83
85
|
#ifdef SAY_WIN
|
84
|
-
Sleep(
|
86
|
+
Sleep(sleep_time);
|
85
87
|
#else
|
86
|
-
usleep(
|
88
|
+
usleep(sleep_time * 1000);
|
87
89
|
#endif
|
88
90
|
}
|
89
91
|
|
data/ext/say_pixel_bus.c
CHANGED
@@ -1,36 +1,31 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
-
static say_context *say_pack_pbo_last_context = NULL;
|
4
|
-
static GLuint say_pack_pbo = 0;
|
5
|
-
|
6
3
|
static void say_pack_pbo_make_current(GLuint pbo) {
|
7
4
|
say_context *context = say_context_current();
|
8
|
-
if (say_pack_pbo_last_context != context ||
|
9
|
-
pbo != say_pack_pbo) {
|
10
|
-
say_pack_pbo = pbo;
|
11
|
-
say_pack_pbo_last_context = context;
|
12
5
|
|
6
|
+
if (context->pack_pbo != pbo) {
|
13
7
|
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
|
8
|
+
context->pack_pbo = pbo;
|
14
9
|
}
|
15
10
|
}
|
16
11
|
|
17
|
-
static say_context *say_unpack_pbo_last_context = NULL;
|
18
|
-
static GLuint say_unpack_pbo = 0;
|
19
|
-
|
20
12
|
static void say_unpack_pbo_make_current(GLuint pbo) {
|
21
13
|
say_context *context = say_context_current();
|
22
|
-
if (say_unpack_pbo_last_context != context ||
|
23
|
-
pbo != say_unpack_pbo) {
|
24
|
-
say_unpack_pbo = pbo;
|
25
|
-
say_unpack_pbo_last_context = context;
|
26
14
|
|
15
|
+
if (context->unpack_pbo != pbo) {
|
27
16
|
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
|
17
|
+
context->unpack_pbo = pbo;
|
28
18
|
}
|
29
19
|
}
|
30
20
|
|
31
21
|
static void say_pbo_will_delete(GLuint pbo) {
|
32
|
-
|
33
|
-
|
22
|
+
mo_array *contexts = say_context_get_all();
|
23
|
+
for (size_t i = 0; i < contexts->size; i++) {
|
24
|
+
say_context *context = mo_array_get_as(contexts, i, say_context*);
|
25
|
+
|
26
|
+
if (context->pack_pbo == pbo) context->pack_pbo = 0;
|
27
|
+
if (context->unpack_pbo == pbo) context->unpack_pbo = 0;
|
28
|
+
}
|
34
29
|
}
|
35
30
|
|
36
31
|
bool say_pixel_bus_is_available() {
|
@@ -134,7 +129,9 @@ void say_pixel_bus_resize(say_pixel_bus *bus, size_t new_size) {
|
|
134
129
|
say_pixel_bus_bind_pack(bus);
|
135
130
|
|
136
131
|
void *buffer = malloc(sizeof(say_color) * new_size);
|
137
|
-
|
132
|
+
size_t copied_size = new_size > bus->size ? bus->size : new_size;
|
133
|
+
glGetBufferSubData(GL_PIXEL_PACK_BUFFER, 0, copied_size * sizeof(say_color),
|
134
|
+
buffer);
|
138
135
|
|
139
136
|
glBufferData(GL_PIXEL_PACK_BUFFER, new_size * sizeof(say_color),
|
140
137
|
buffer, bus->mode);
|
data/ext/say_shader.c
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
-
static GLuint say_current_program = 0;
|
4
|
-
static say_context *say_shader_last_context = NULL;
|
5
|
-
|
6
3
|
static void say_shader_make_current(GLuint program) {
|
7
4
|
say_context *context = say_context_current();
|
8
5
|
|
9
|
-
if (context !=
|
10
|
-
program != say_current_program) {
|
11
|
-
say_current_program = program;
|
12
|
-
say_shader_last_context = context;
|
13
|
-
|
6
|
+
if (context->program != program) {
|
14
7
|
glUseProgram(program);
|
8
|
+
context->program = program;
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
static void say_shader_will_delete(GLuint program) {
|
13
|
+
mo_array *contexts = say_context_get_all();
|
14
|
+
for (size_t i = 0; i < contexts->size; i++) {
|
15
|
+
say_context *context = mo_array_get_as(contexts, i, say_context*);
|
16
|
+
if (context->program == program)
|
17
|
+
context->program = 0;
|
15
18
|
}
|
16
19
|
}
|
17
20
|
|
@@ -52,22 +55,6 @@ static void say_shader_find_locations(say_shader *shader) {
|
|
52
55
|
glGetUniformLocation(shader->program, SAY_TEXTURE_ENABLED_ATTR);
|
53
56
|
}
|
54
57
|
|
55
|
-
static const char *say_default_frag_shader =
|
56
|
-
"#version 110\n"
|
57
|
-
"\n"
|
58
|
-
"uniform sampler2D in_Texture;\n"
|
59
|
-
"uniform bool in_TextureEnabled;\n"
|
60
|
-
"\n"
|
61
|
-
"varying vec4 var_Color;\n"
|
62
|
-
"varying vec2 var_TexCoord;\n"
|
63
|
-
"\n"
|
64
|
-
"void main() {\n"
|
65
|
-
" if (in_TextureEnabled)\n"
|
66
|
-
" gl_FragColor = texture2D(in_Texture, var_TexCoord) * var_Color;\n"
|
67
|
-
" else\n"
|
68
|
-
" gl_FragColor = var_Color;\n"
|
69
|
-
"}\n";
|
70
|
-
|
71
58
|
static const char *say_default_vertex_shader =
|
72
59
|
"#version 110\n"
|
73
60
|
"\n"
|
@@ -87,22 +74,20 @@ static const char *say_default_vertex_shader =
|
|
87
74
|
" var_TexCoord = in_TexCoord;\n"
|
88
75
|
"}\n";
|
89
76
|
|
90
|
-
static const char *
|
91
|
-
"#version
|
77
|
+
static const char *say_default_frag_shader =
|
78
|
+
"#version 110\n"
|
92
79
|
"\n"
|
93
80
|
"uniform sampler2D in_Texture;\n"
|
94
81
|
"uniform bool in_TextureEnabled;\n"
|
95
82
|
"\n"
|
96
|
-
"
|
97
|
-
"
|
98
|
-
"\n"
|
99
|
-
"out vec4 out_FragColor;\n"
|
83
|
+
"varying vec4 var_Color;\n"
|
84
|
+
"varying vec2 var_TexCoord;\n"
|
100
85
|
"\n"
|
101
86
|
"void main() {\n"
|
102
87
|
" if (in_TextureEnabled)\n"
|
103
|
-
"
|
88
|
+
" gl_FragColor = texture2D(in_Texture, var_TexCoord) * var_Color;\n"
|
104
89
|
" else\n"
|
105
|
-
"
|
90
|
+
" gl_FragColor = var_Color;\n"
|
106
91
|
"}\n";
|
107
92
|
|
108
93
|
static const char *say_new_default_vertex_shader =
|
@@ -124,6 +109,24 @@ static const char *say_new_default_vertex_shader =
|
|
124
109
|
" var_TexCoord = in_TexCoord;\n"
|
125
110
|
"}\n";
|
126
111
|
|
112
|
+
static const char *say_new_default_frag_shader =
|
113
|
+
"#version 130\n"
|
114
|
+
"\n"
|
115
|
+
"uniform sampler2D in_Texture;\n"
|
116
|
+
"uniform bool in_TextureEnabled;\n"
|
117
|
+
"\n"
|
118
|
+
"in vec4 var_Color;\n"
|
119
|
+
"in vec2 var_TexCoord;\n"
|
120
|
+
"\n"
|
121
|
+
"out vec4 out_FragColor;\n"
|
122
|
+
"\n"
|
123
|
+
"void main() {\n"
|
124
|
+
" if (in_TextureEnabled)\n"
|
125
|
+
" out_FragColor = texture(in_Texture, var_TexCoord) * var_Color;\n"
|
126
|
+
" else\n"
|
127
|
+
" out_FragColor = var_Color;\n"
|
128
|
+
"}\n";
|
129
|
+
|
127
130
|
static uint8_t say_shader_use_new = 0;
|
128
131
|
static uint8_t say_shader_use_old_force = 0;
|
129
132
|
|
@@ -198,6 +201,7 @@ void say_shader_free(say_shader *shader) {
|
|
198
201
|
|
199
202
|
say_shader_detach_geometry(shader);
|
200
203
|
|
204
|
+
say_shader_will_delete(shader->program);
|
201
205
|
glDeleteProgram(shader->program);
|
202
206
|
|
203
207
|
free(shader);
|
data/ext/say_target.c
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
-
static say_target *say_current_target = NULL;
|
4
|
-
static say_context *say_target_last_context = NULL;
|
5
|
-
|
6
3
|
static void say_target_update_states(say_target *target) {
|
7
4
|
if (target->up_to_date) {
|
8
5
|
target->up_to_date = 0;
|
@@ -106,9 +103,8 @@ int say_target_make_current(say_target *target) {
|
|
106
103
|
if (context) {
|
107
104
|
say_context *current = say_context_current();
|
108
105
|
|
109
|
-
if (current ==
|
110
|
-
target
|
111
|
-
current == context) {
|
106
|
+
if (current == context &&
|
107
|
+
current->target == target) {
|
112
108
|
return 1;
|
113
109
|
}
|
114
110
|
|
@@ -118,8 +114,7 @@ int say_target_make_current(say_target *target) {
|
|
118
114
|
if (target->bind_hook)
|
119
115
|
target->bind_hook(target->data);
|
120
116
|
|
121
|
-
|
122
|
-
say_target_last_context = context;
|
117
|
+
current->target = target;
|
123
118
|
|
124
119
|
return 1;
|
125
120
|
}
|
data/ext/say_x11_window.h
CHANGED
@@ -7,13 +7,15 @@ unsigned long say_x11_event_mask =
|
|
7
7
|
LeaveWindowMask;
|
8
8
|
|
9
9
|
static void say_x11_window_find_config(say_x11_window *win) {
|
10
|
-
|
11
|
-
|
12
|
-
GLX_RED_SIZE,
|
13
|
-
GLX_GREEN_SIZE,
|
14
|
-
GLX_BLUE_SIZE,
|
15
|
-
GLX_ALPHA_SIZE,
|
16
|
-
GLX_DEPTH_SIZE,
|
10
|
+
say_context_config *say_conf = say_context_get_config();
|
11
|
+
int visual_attribs[] = {
|
12
|
+
GLX_RED_SIZE, 8,
|
13
|
+
GLX_GREEN_SIZE, 8,
|
14
|
+
GLX_BLUE_SIZE, 8,
|
15
|
+
GLX_ALPHA_SIZE, 8,
|
16
|
+
GLX_DEPTH_SIZE, say_conf->depth_size,
|
17
|
+
GLX_STENCIL_SIZE, say_conf->stencil_size,
|
18
|
+
GLX_DOUBLEBUFFER, True,
|
17
19
|
None
|
18
20
|
};
|
19
21
|
|
data/ext/sprite.c
CHANGED
data/ext/text.c
CHANGED
@@ -21,6 +21,8 @@ VALUE ray_text_alloc(VALUE self) {
|
|
21
21
|
|
22
22
|
say_drawable_set_shader_proc(text->drawable, ray_drawable_shader_proc);
|
23
23
|
say_drawable_set_other_data(text->drawable, (void*)rb);
|
24
|
+
rb_iv_set(rb, "@shader_attributes", Qnil);
|
25
|
+
rb_iv_set(rb, "@font", Qnil);
|
24
26
|
|
25
27
|
return rb;
|
26
28
|
}
|
data/lib/ray/matrix.rb
CHANGED
@@ -37,17 +37,23 @@ module Ray
|
|
37
37
|
new.look_at(eye, center, up)
|
38
38
|
end
|
39
39
|
|
40
|
-
# @param
|
40
|
+
# @param (see #orthogonal)
|
41
41
|
# @return [Ray::Matrix] An orthogonal projection matrix
|
42
42
|
def orthogonal(*args)
|
43
43
|
new.orthogonal(*args)
|
44
44
|
end
|
45
45
|
|
46
|
-
# @param
|
46
|
+
# @param (see #perspective)
|
47
47
|
# @return [Ray::Matrix] A perspective projection matrix
|
48
48
|
def perspective(*args)
|
49
49
|
new.perspective(*args)
|
50
50
|
end
|
51
|
+
|
52
|
+
# @param (see #set_transformation)
|
53
|
+
# @return [Ray::Matrix] A 2D transformation matrix
|
54
|
+
def transformation(*args)
|
55
|
+
new.set_transformation(*args)
|
56
|
+
end
|
51
57
|
end
|
52
58
|
|
53
59
|
# @param [Array<Float>, nil] content Either nothing or the content of each
|
data/lib/ray/ray.rb
CHANGED
data/lib/ray/scene.rb
CHANGED
@@ -103,10 +103,9 @@ module Ray
|
|
103
103
|
@scene_always_block = nil
|
104
104
|
@scene_render_block = nil
|
105
105
|
@scene_clean_block = nil
|
106
|
-
|
107
106
|
@scene_loops_per_second = 60
|
108
|
-
|
109
107
|
@scene_animations = Ray::AnimationList.new
|
108
|
+
@scene_arguments = []
|
110
109
|
end
|
111
110
|
|
112
111
|
def register_events
|
data/samples/turtle/byzantium.rb
CHANGED
data/samples/turtle/mandala.rb
CHANGED
data/test/drawable_test.rb
CHANGED
@@ -71,6 +71,12 @@ context "a drawable" do
|
|
71
71
|
context "with several transformations" do
|
72
72
|
attr = {:foo => 3}
|
73
73
|
|
74
|
+
transformation_matrix = Ray::Matrix.transformation([30, 40],
|
75
|
+
[10, 20],
|
76
|
+
9,
|
77
|
+
[2, 0.5],
|
78
|
+
90)
|
79
|
+
|
74
80
|
hookup do
|
75
81
|
topic.origin = [30, 40]
|
76
82
|
topic.pos = [10, 20]
|
@@ -81,6 +87,9 @@ context "a drawable" do
|
|
81
87
|
topic.shader_attributes = attr
|
82
88
|
end
|
83
89
|
|
90
|
+
asserts(:default_matrix).equals transformation_matrix
|
91
|
+
asserts(:matrix).equals transformation_matrix
|
92
|
+
|
84
93
|
# (10, 30) => (-20, -10) (origin)
|
85
94
|
# (-20, -10) => (-40, -5) (scale)
|
86
95
|
# (-40, -5) => (5, -40) (rotate)
|
@@ -113,6 +122,8 @@ context "a drawable" do
|
|
113
122
|
end
|
114
123
|
|
115
124
|
asserts(:matrix).equals Ray::Matrix.new
|
125
|
+
asserts(:default_matrix).equals transformation_matrix
|
126
|
+
|
116
127
|
asserts(:transform, [10, 30]).equals Ray::Vector3[10, 30, 0]
|
117
128
|
|
118
129
|
context "that has been disabled" do
|
@@ -136,6 +147,7 @@ context "a drawable" do
|
|
136
147
|
end
|
137
148
|
|
138
149
|
asserts(:matrix).equals Ray::Matrix.new
|
150
|
+
asserts(:default_matrix).equals transformation_matrix
|
139
151
|
asserts(:matrix_proc).equals matrix_proc
|
140
152
|
asserts(:matrix_proc).received(:call) { topic }
|
141
153
|
|
data/test/helpers.rb
CHANGED
@@ -27,12 +27,15 @@ class AlmostEqualMacro < Riot::AssertionMacro
|
|
27
27
|
register :almost_equals
|
28
28
|
|
29
29
|
def test(actual, expected, epsilon)
|
30
|
-
|
31
|
-
case diff
|
30
|
+
case actual
|
32
31
|
when Numeric
|
33
|
-
|
32
|
+
(actual - expected).abs <= epsilon
|
34
33
|
when Ray::Vector2, Ray::Vector3
|
35
|
-
|
34
|
+
(actual - expected).to_a.all? { |n| n.abs <= epsilon }
|
35
|
+
when Ray::Matrix
|
36
|
+
actual.content.zip(expected.content).all? do |a, b|
|
37
|
+
(a - b).abs <= epsilon
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
data/test/image_test.rb
CHANGED
@@ -25,6 +25,10 @@ context "an image loaded from a file" do
|
|
25
25
|
asserts(:[]=, 128, 100, Ray::Color.green).raises_kind_of RangeError
|
26
26
|
asserts(:[]=, 100, 192, Ray::Color.green).raises_kind_of RangeError
|
27
27
|
|
28
|
+
asserts(:bind_to, -1).raises_kind_of RangeError
|
29
|
+
asserts(:bind_to, 32).raises_kind_of RangeError
|
30
|
+
denies(:bind_to, 31).raises_kind_of RangeError
|
31
|
+
|
28
32
|
context "after changing a pixel" do
|
29
33
|
hookup { topic[0, 10] = Ray::Color.green }
|
30
34
|
asserts(:[], 0, 10).equals Ray::Color.green
|