ray 0.1.1 → 0.2.0
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.
- data/README.md +9 -6
- data/Rakefile +1 -5
- data/ext/audio.c +25 -19
- data/ext/audio_source.c +67 -39
- data/ext/color.c +19 -19
- data/ext/drawable.c +190 -31
- data/ext/extconf.rb +16 -14
- data/ext/gl.c +310 -30
- data/ext/gl_buffer.c +223 -2
- data/ext/gl_index_buffer.c +11 -0
- data/ext/gl_int_array.c +24 -22
- data/ext/gl_vertex.c +84 -49
- data/ext/image.c +115 -51
- data/ext/image_target.c +58 -10
- data/ext/input.c +73 -6
- data/ext/mo.c +583 -0
- data/ext/mo.h +189 -0
- data/ext/music.c +9 -8
- data/ext/pixel_bus.c +349 -0
- data/ext/polygon.c +68 -45
- data/ext/ray.c +1 -0
- data/ext/ray.h +19 -1
- data/ext/rect.c +9 -47
- data/ext/say.h +1 -2
- data/ext/say_all.h +6 -0
- data/ext/say_audio.h +3 -0
- data/ext/say_audio_context.c +1 -4
- data/ext/say_basic_type.c +24 -0
- data/ext/say_basic_type.h +4 -0
- data/ext/say_buffer.c +217 -88
- data/ext/say_buffer.h +20 -5
- data/ext/say_buffer_renderer.c +10 -7
- data/ext/say_buffer_renderer.h +1 -1
- data/ext/say_buffer_slice.c +70 -76
- data/ext/say_context.c +109 -22
- data/ext/say_context.h +14 -0
- data/ext/say_drawable.c +113 -25
- data/ext/say_drawable.h +23 -2
- data/ext/say_error.c +7 -2
- data/ext/say_font.c +30 -27
- data/ext/say_font.h +3 -6
- data/ext/say_get_proc.c +35 -0
- data/ext/say_image.c +102 -27
- data/ext/say_image.h +11 -4
- data/ext/say_image_target.c +88 -34
- data/ext/say_image_target.h +3 -2
- data/ext/say_index_buffer.c +31 -19
- data/ext/say_index_buffer.h +4 -2
- data/ext/say_index_buffer_slice.c +78 -70
- data/ext/say_music.c +4 -2
- data/ext/say_osx.h +3 -2
- data/ext/say_osx_context.h +37 -4
- data/ext/say_osx_window.h +32 -37
- data/ext/say_pixel_bus.c +163 -0
- data/ext/say_pixel_bus.h +44 -0
- data/ext/say_polygon.c +2 -2
- data/ext/say_shader.c +66 -62
- data/ext/say_shader.h +2 -0
- data/ext/say_sprite.c +1 -2
- data/ext/say_target.c +14 -23
- data/ext/say_target.h +3 -1
- data/ext/say_text.c +45 -7
- data/ext/say_text.h +12 -3
- data/ext/say_thread.c +13 -6
- data/ext/say_thread.h +1 -1
- data/ext/say_thread_variable.c +5 -5
- data/ext/say_vertex_type.c +79 -41
- data/ext/say_vertex_type.h +6 -2
- data/ext/say_view.c +10 -31
- data/ext/say_view.h +1 -5
- data/ext/say_win.h +2 -2
- data/ext/say_win_context.h +49 -11
- data/ext/say_win_window.h +30 -27
- data/ext/say_window.c +3 -3
- data/ext/say_x11.h +3 -1
- data/ext/say_x11_context.h +64 -10
- data/ext/say_x11_window.h +22 -17
- data/ext/shader.c +9 -0
- data/ext/sprite.c +7 -1
- data/ext/target.c +80 -28
- data/ext/text.c +43 -1
- data/ext/view.c +53 -1
- data/ext/window.c +4 -0
- data/lib/ray/animation_list.rb +17 -2
- data/lib/ray/audio_source.rb +11 -0
- data/lib/ray/color.rb +14 -0
- data/lib/ray/drawable.rb +23 -0
- data/lib/ray/dsl/event.rb +1 -9
- data/lib/ray/dsl/event_runner.rb +3 -4
- data/lib/ray/dsl/matcher.rb +20 -1
- data/lib/ray/effect.rb +116 -0
- data/lib/ray/effect/black_and_white.rb +38 -0
- data/lib/ray/effect/color_inversion.rb +16 -0
- data/lib/ray/effect/generator.rb +145 -0
- data/lib/ray/effect/grayscale.rb +32 -0
- data/lib/ray/game.rb +25 -5
- data/lib/ray/gl/vertex.rb +105 -26
- data/lib/ray/helper.rb +5 -0
- data/lib/ray/image.rb +54 -13
- data/lib/ray/image_target.rb +7 -0
- data/lib/ray/matrix.rb +26 -0
- data/lib/ray/music.rb +4 -0
- data/lib/ray/pixel_bus.rb +22 -0
- data/lib/ray/polygon.rb +17 -0
- data/lib/ray/pp.rb +28 -0
- data/lib/ray/ray.rb +7 -1
- data/lib/ray/rect.rb +7 -13
- data/lib/ray/scene.rb +24 -5
- data/lib/ray/scene_list.rb +9 -0
- data/lib/ray/shader.rb +11 -2
- data/lib/ray/sound.rb +4 -0
- data/lib/ray/sprite.rb +23 -62
- data/lib/ray/target.rb +25 -0
- data/lib/ray/text.rb +10 -0
- data/lib/ray/turtle.rb +9 -3
- data/lib/ray/vector.rb +18 -0
- data/lib/ray/vertex.rb +6 -0
- data/lib/ray/view.rb +22 -0
- data/samples/animation/sprite_motion.rb +0 -60
- data/samples/audio/{spacial.rb → spatial.rb} +1 -1
- data/samples/buffer/buffer.rb +1 -0
- data/samples/buffer/index_buffer.rb +2 -0
- data/samples/cptn_ruby/cptn_ruby.rb +6 -7
- data/samples/effects/effect.rb +39 -0
- data/samples/effects/grayscale.rb +27 -0
- data/samples/opengl/image.rb +7 -5
- data/samples/opengl/instancing.rb +159 -0
- data/samples/opengl/instancing.rbc +3231 -0
- data/samples/opengl/obj_loader.rb +9 -8
- data/samples/opengl/shader.rb +1 -3
- data/samples/shaders/geometry.rb +108 -38
- data/samples/shaders/geometry.rbc +2074 -0
- data/samples/shaders/shape.rb +2 -2
- data/samples/starfighter/starfighter.rb +5 -5
- data/samples/window/get_pixel.rb +1 -1
- data/test/animation_list_test.rb +18 -4
- data/test/drawable_test.rb +70 -1
- data/test/effect_generator_test.rb +63 -0
- data/test/effect_test.rb +61 -0
- data/test/game_test.rb +18 -0
- data/test/gl_buffer_test.rb +43 -1
- data/test/gl_index_buffer_test.rb +5 -0
- data/test/gl_vertex_test.rb +28 -1
- data/test/image_test.rb +5 -5
- data/test/input_test.rb +49 -0
- data/test/pixel_bus_test.rb +28 -0
- data/test/rect_test.rb +4 -0
- data/{samples/_media → test/res}/Beep.wav +0 -0
- data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
- data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
- data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
- data/{samples/_media → test/res}/CptnRuby.png +0 -0
- data/{samples/_media → test/res}/Space.png +0 -0
- data/{samples/_media → test/res}/Star.png +0 -0
- data/{samples/_media → test/res}/Starfighter.png +0 -0
- data/test/res/cube.obj +28 -0
- data/test/res/light3d.c +2 -2
- data/test/res/stone.png +0 -0
- data/test/scene_test.rb +3 -0
- data/test/sprite_test.rb +10 -0
- data/test/text_test.rb +31 -2
- data/test/view_test.rb +13 -1
- metadata +38 -17
- data/ext/say_array.c +0 -124
- data/ext/say_array.h +0 -34
- data/ext/say_table.c +0 -86
- data/ext/say_table.h +0 -24
data/ext/say_polygon.c
CHANGED
@@ -113,8 +113,7 @@ static void say_polygon_fill_vertices(void *data, void *vertices_ptr) {
|
|
113
113
|
}
|
114
114
|
}
|
115
115
|
|
116
|
-
static void say_polygon_draw(void *data, size_t first, size_t index
|
117
|
-
say_shader *shader) {
|
116
|
+
static void say_polygon_draw(void *data, size_t first, size_t index) {
|
118
117
|
say_polygon *polygon = (say_polygon*)data;
|
119
118
|
|
120
119
|
if (polygon->point_count < 3)
|
@@ -249,6 +248,7 @@ say_polygon *say_polygon_ellipse(say_vector2 center, float rx, float ry,
|
|
249
248
|
|
250
249
|
say_drawable_set_scale(ellipse->drawable, say_make_vector2(1, ry / rx));
|
251
250
|
say_drawable_set_origin(ellipse->drawable, center);
|
251
|
+
say_drawable_set_pos(ellipse->drawable, center);
|
252
252
|
|
253
253
|
return ellipse;
|
254
254
|
}
|
data/ext/say_shader.c
CHANGED
@@ -11,28 +11,27 @@ static void say_shader_make_current(GLuint program) {
|
|
11
11
|
say_current_program = program;
|
12
12
|
say_shader_last_context = context;
|
13
13
|
|
14
|
-
|
14
|
+
glUseProgram(program);
|
15
15
|
}
|
16
16
|
}
|
17
17
|
|
18
18
|
static int say_shader_create_shader(GLuint shader, const char *src) {
|
19
19
|
GLint length = strlen(src);
|
20
|
-
|
20
|
+
glShaderSource(shader, 1, &src, &length);
|
21
21
|
|
22
|
-
|
22
|
+
glCompileShader(shader);
|
23
23
|
|
24
24
|
GLint worked = 0;
|
25
|
-
|
25
|
+
glGetShaderiv(shader, GL_COMPILE_STATUS, &worked);
|
26
26
|
|
27
27
|
if (worked != GL_TRUE) {
|
28
28
|
GLint error_length = 0;
|
29
|
-
|
30
|
-
&error_length);
|
29
|
+
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &error_length);
|
31
30
|
|
32
31
|
char *error = malloc((error_length + 1) * sizeof(char));
|
33
32
|
memset(error, '\0', (error_length + 1) * sizeof(char));
|
34
33
|
|
35
|
-
|
34
|
+
glGetShaderInfoLog(shader, error_length, &error_length, error);
|
36
35
|
say_error_set(error);
|
37
36
|
|
38
37
|
free(error);
|
@@ -43,14 +42,14 @@ static int say_shader_create_shader(GLuint shader, const char *src) {
|
|
43
42
|
|
44
43
|
static void say_shader_find_locations(say_shader *shader) {
|
45
44
|
shader->locations[SAY_PROJECTION_LOC_ID] =
|
46
|
-
|
45
|
+
glGetUniformLocation(shader->program, SAY_PROJECTION_ATTR);
|
47
46
|
shader->locations[SAY_MODEL_VIEW_LOC_ID] =
|
48
|
-
|
47
|
+
glGetUniformLocation(shader->program, SAY_MODEL_VIEW_ATTR);
|
49
48
|
|
50
49
|
shader->locations[SAY_TEXTURE_LOC_ID] =
|
51
|
-
|
50
|
+
glGetUniformLocation(shader->program, SAY_TEXTURE_ATTR);
|
52
51
|
shader->locations[SAY_TEXTURE_ENABLED_LOC_ID] =
|
53
|
-
|
52
|
+
glGetUniformLocation(shader->program, SAY_TEXTURE_ENABLED_ATTR);
|
54
53
|
}
|
55
54
|
|
56
55
|
static const char *say_default_frag_shader =
|
@@ -89,7 +88,7 @@ static const char *say_default_vertex_shader =
|
|
89
88
|
"}\n";
|
90
89
|
|
91
90
|
static const char *say_new_default_frag_shader =
|
92
|
-
"#version
|
91
|
+
"#version 130\n"
|
93
92
|
"\n"
|
94
93
|
"uniform sampler2D in_Texture;\n"
|
95
94
|
"uniform bool in_TextureEnabled;\n"
|
@@ -101,13 +100,13 @@ static const char *say_new_default_frag_shader =
|
|
101
100
|
"\n"
|
102
101
|
"void main() {\n"
|
103
102
|
" if (in_TextureEnabled)\n"
|
104
|
-
" out_FragColor =
|
103
|
+
" out_FragColor = texture(in_Texture, var_TexCoord) * var_Color;\n"
|
105
104
|
" else\n"
|
106
105
|
" out_FragColor = var_Color;\n"
|
107
106
|
"}\n";
|
108
107
|
|
109
108
|
static const char *say_new_default_vertex_shader =
|
110
|
-
"#version
|
109
|
+
"#version 130\n"
|
111
110
|
"\n"
|
112
111
|
"in vec2 in_Vertex;\n"
|
113
112
|
"in vec4 in_Color;\n"
|
@@ -139,7 +138,7 @@ void say_shader_force_old() {
|
|
139
138
|
|
140
139
|
bool say_shader_is_geometry_available() {
|
141
140
|
say_context_ensure();
|
142
|
-
return
|
141
|
+
return GLEW_ARB_geometry_shader4 || GLEW_VERSION_3_2;
|
143
142
|
}
|
144
143
|
|
145
144
|
say_shader *say_shader_create() {
|
@@ -147,11 +146,15 @@ say_shader *say_shader_create() {
|
|
147
146
|
|
148
147
|
say_shader *shader = (say_shader*)malloc(sizeof(say_shader));
|
149
148
|
|
150
|
-
shader->frag_shader =
|
151
|
-
shader->vertex_shader =
|
149
|
+
shader->frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
150
|
+
shader->vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
152
151
|
shader->geometry_shader = 0;
|
153
152
|
|
154
|
-
|
153
|
+
bool new_shader = say_shader_use_new &&
|
154
|
+
(!say_shader_use_old_force ||
|
155
|
+
say_context_get_config()->core_profile);
|
156
|
+
|
157
|
+
if (!new_shader) {
|
155
158
|
say_shader_compile_frag(shader, say_default_frag_shader);
|
156
159
|
say_shader_compile_vertex(shader, say_default_vertex_shader);
|
157
160
|
}
|
@@ -160,18 +163,17 @@ say_shader *say_shader_create() {
|
|
160
163
|
say_shader_compile_vertex(shader, say_new_default_vertex_shader);
|
161
164
|
}
|
162
165
|
|
163
|
-
shader->program =
|
166
|
+
shader->program = glCreateProgram();
|
164
167
|
|
165
|
-
|
166
|
-
|
168
|
+
glAttachShader(shader->program, shader->frag_shader);
|
169
|
+
glAttachShader(shader->program, shader->vertex_shader);
|
167
170
|
|
168
171
|
say_shader_apply_vertex_type(shader, 0);
|
169
172
|
|
170
|
-
if (
|
171
|
-
|
172
|
-
}
|
173
|
+
if (new_shader)
|
174
|
+
glBindFragDataLocation(shader->program, 0, "out_FragColor");
|
173
175
|
|
174
|
-
|
176
|
+
glLinkProgram(shader->program);
|
175
177
|
|
176
178
|
say_shader_find_locations(shader);
|
177
179
|
|
@@ -191,12 +193,12 @@ say_shader *say_shader_create() {
|
|
191
193
|
void say_shader_free(say_shader *shader) {
|
192
194
|
say_context_ensure();
|
193
195
|
|
194
|
-
|
195
|
-
|
196
|
+
glDeleteShader(shader->frag_shader);
|
197
|
+
glDeleteShader(shader->vertex_shader);
|
196
198
|
|
197
199
|
say_shader_detach_geometry(shader);
|
198
200
|
|
199
|
-
|
201
|
+
glDeleteProgram(shader->program);
|
200
202
|
|
201
203
|
free(shader);
|
202
204
|
}
|
@@ -213,21 +215,21 @@ bool say_shader_compile_vertex(say_shader *shader, const char *src) {
|
|
213
215
|
|
214
216
|
bool say_shader_compile_geometry(say_shader *shader, const char *src) {
|
215
217
|
say_context_ensure();
|
216
|
-
if (!
|
218
|
+
if (!(GLEW_ARB_geometry_shader4 || GLEW_VERSION_3_2)) {
|
217
219
|
say_error_set("geometry shaders aren't available");
|
218
220
|
return false;
|
219
221
|
}
|
220
222
|
|
221
|
-
shader->geometry_shader =
|
222
|
-
|
223
|
+
shader->geometry_shader = glCreateShader(GL_GEOMETRY_SHADER);
|
224
|
+
glAttachShader(shader->program, shader->geometry_shader);
|
223
225
|
return say_shader_create_shader(shader->geometry_shader, src);
|
224
226
|
}
|
225
227
|
|
226
228
|
void say_shader_detach_geometry(say_shader *shader) {
|
227
229
|
if (shader->geometry_shader) {
|
228
230
|
say_context_ensure();
|
229
|
-
|
230
|
-
|
231
|
+
glDetachShader(shader->program, shader->geometry_shader);
|
232
|
+
glDeleteShader(shader->geometry_shader);
|
231
233
|
shader->geometry_shader = 0;
|
232
234
|
}
|
233
235
|
}
|
@@ -236,10 +238,9 @@ void say_shader_apply_vertex_type(say_shader *shader, size_t vtype) {
|
|
236
238
|
say_context_ensure();
|
237
239
|
|
238
240
|
say_vertex_type *type = say_get_vertex_type(vtype);
|
239
|
-
|
240
241
|
for (size_t i = 0; i < say_vertex_type_get_elem_count(type); i++) {
|
241
|
-
|
242
|
-
|
242
|
+
glBindAttribLocation(shader->program, i + 1,
|
243
|
+
say_vertex_type_get_name(type, i));
|
243
244
|
}
|
244
245
|
}
|
245
246
|
|
@@ -248,17 +249,16 @@ int say_shader_link(say_shader *shader) {
|
|
248
249
|
glLinkProgram(shader->program);
|
249
250
|
|
250
251
|
GLint worked = 0;
|
251
|
-
|
252
|
+
glGetProgramiv(shader->program, GL_LINK_STATUS, &worked);
|
252
253
|
|
253
254
|
if (!worked) {
|
254
255
|
GLint error_length = 0;
|
255
|
-
|
256
|
-
&error_length);
|
256
|
+
glGetProgramiv(shader->program, GL_INFO_LOG_LENGTH, &error_length);
|
257
257
|
|
258
258
|
char *error = malloc((error_length + 1) * sizeof(char));
|
259
259
|
memset(error, '\0', (error_length + 1) * sizeof(char));
|
260
260
|
|
261
|
-
|
261
|
+
glGetProgramInfoLog(shader->program, error_length, &error_length, error);
|
262
262
|
say_error_set(error);
|
263
263
|
|
264
264
|
free(error);
|
@@ -272,36 +272,36 @@ int say_shader_link(say_shader *shader) {
|
|
272
272
|
void say_shader_set_matrix(say_shader *shader, const char *name,
|
273
273
|
say_matrix *matrix) {
|
274
274
|
say_shader_bind(shader);
|
275
|
-
GLint location =
|
276
|
-
|
275
|
+
GLint location = glGetUniformLocation(shader->program, name);
|
276
|
+
glUniformMatrix4fv(location, 1, GL_FALSE, matrix->content);
|
277
277
|
}
|
278
278
|
|
279
279
|
void say_shader_set_current_texture(say_shader *shader, const char *name) {
|
280
280
|
say_shader_bind(shader);
|
281
|
-
GLint location =
|
282
|
-
|
281
|
+
GLint location = glGetUniformLocation(shader->program, name);
|
282
|
+
glUniform1i(location, 0);
|
283
283
|
}
|
284
284
|
|
285
285
|
void say_shader_set_int(say_shader *shader, const char *name, int val) {
|
286
286
|
say_shader_bind(shader);
|
287
|
-
GLint location =
|
288
|
-
|
287
|
+
GLint location = glGetUniformLocation(shader->program, name);
|
288
|
+
glUniform1i(location, val);
|
289
289
|
}
|
290
290
|
|
291
291
|
void say_shader_set_matrix_id(say_shader *shader, say_attr_loc_id id,
|
292
292
|
say_matrix *matrix) {
|
293
293
|
say_shader_bind(shader);
|
294
|
-
|
294
|
+
glUniformMatrix4fv(shader->locations[id], 1, GL_FALSE, matrix->content);
|
295
295
|
}
|
296
296
|
|
297
297
|
void say_shader_set_current_texture_id(say_shader *shader, say_attr_loc_id id) {
|
298
298
|
say_shader_bind(shader);
|
299
|
-
|
299
|
+
glUniform1i(shader->locations[id], 0);
|
300
300
|
}
|
301
301
|
|
302
302
|
void say_shader_set_int_id(say_shader *shader, say_attr_loc_id id, int val) {
|
303
303
|
say_shader_bind(shader);
|
304
|
-
|
304
|
+
glUniform1i(shader->locations[id], val);
|
305
305
|
}
|
306
306
|
|
307
307
|
void say_shader_bind(say_shader *shader) {
|
@@ -310,33 +310,33 @@ void say_shader_bind(say_shader *shader) {
|
|
310
310
|
}
|
311
311
|
|
312
312
|
int say_shader_locate(say_shader *shader, const char *name) {
|
313
|
-
return
|
313
|
+
return glGetUniformLocation(shader->program, name);
|
314
314
|
}
|
315
315
|
|
316
316
|
void say_shader_set_vector2_loc(say_shader *shader, int loc, say_vector2 val) {
|
317
317
|
say_shader_bind(shader);
|
318
|
-
|
318
|
+
glUniform2f(loc, val.x, val.y);
|
319
319
|
}
|
320
320
|
|
321
321
|
void say_shader_set_vector3_loc(say_shader *shader, int loc, say_vector3 val) {
|
322
322
|
say_shader_bind(shader);
|
323
|
-
|
323
|
+
glUniform3f(loc, val.x, val.y, val.z);
|
324
324
|
}
|
325
325
|
|
326
326
|
void say_shader_set_color_loc(say_shader *shader, int loc, say_color val) {
|
327
327
|
say_shader_bind(shader);
|
328
328
|
float arg[4] = {val.r / 255.0, val.g / 255.0, val.b / 255.0, val.a / 255.0};
|
329
|
-
|
329
|
+
glUniform4fv(loc, 1, arg);
|
330
330
|
}
|
331
331
|
|
332
332
|
void say_shader_set_matrix_loc(say_shader *shader, int loc, say_matrix *val) {
|
333
333
|
say_shader_bind(shader);
|
334
|
-
|
334
|
+
glUniformMatrix4fv(loc, 1, GL_FALSE, val->content);
|
335
335
|
}
|
336
336
|
|
337
337
|
void say_shader_set_float_loc(say_shader *shader, int loc, float val) {
|
338
338
|
say_shader_bind(shader);
|
339
|
-
|
339
|
+
glUniform1f(loc, val);
|
340
340
|
}
|
341
341
|
|
342
342
|
void say_shader_set_floats_loc(say_shader *shader, int loc, size_t count,
|
@@ -345,31 +345,35 @@ void say_shader_set_floats_loc(say_shader *shader, int loc, size_t count,
|
|
345
345
|
|
346
346
|
switch (count) {
|
347
347
|
case 1:
|
348
|
-
|
348
|
+
glUniform1fv(loc, 1, val);
|
349
349
|
break;
|
350
350
|
case 2:
|
351
|
-
|
351
|
+
glUniform2fv(loc, 1, val);
|
352
352
|
break;
|
353
353
|
case 3:
|
354
|
-
|
354
|
+
glUniform3fv(loc, 1, val);
|
355
355
|
break;
|
356
356
|
case 4:
|
357
|
-
|
357
|
+
glUniform4fv(loc, 1, val);
|
358
358
|
break;
|
359
359
|
}
|
360
360
|
}
|
361
361
|
|
362
362
|
void say_shader_set_image_loc(say_shader *shader, int loc, say_image *val) {
|
363
363
|
say_shader_bind(shader);
|
364
|
-
|
364
|
+
glUniform1i(loc, val->texture);
|
365
365
|
}
|
366
366
|
|
367
367
|
void say_shader_set_current_texture_loc(say_shader *shader, int loc) {
|
368
368
|
say_shader_bind(shader);
|
369
|
-
|
369
|
+
glUniform1i(loc, 0);
|
370
370
|
}
|
371
371
|
|
372
372
|
void say_shader_set_bool_loc(say_shader *shader, int loc, uint8_t val) {
|
373
373
|
say_shader_bind(shader);
|
374
|
-
|
374
|
+
glUniform1i(loc, val);
|
375
|
+
}
|
376
|
+
|
377
|
+
GLuint say_shader_get_program(say_shader *shader) {
|
378
|
+
return shader->program;
|
375
379
|
}
|
data/ext/say_shader.h
CHANGED
data/ext/say_sprite.c
CHANGED
@@ -67,8 +67,7 @@ static void say_sprite_fill_vertices(void *data, void *vertices_ptr) {
|
|
67
67
|
}
|
68
68
|
}
|
69
69
|
|
70
|
-
static void say_sprite_draw(void *data, size_t first, size_t index
|
71
|
-
say_shader *shader) {
|
70
|
+
static void say_sprite_draw(void *data, size_t first, size_t index) {
|
72
71
|
say_sprite *sprite = (say_sprite*)data;
|
73
72
|
|
74
73
|
if (!sprite->image)
|
data/ext/say_target.c
CHANGED
@@ -20,7 +20,10 @@ static void say_target_update_states(say_target *target) {
|
|
20
20
|
say_target *say_target_create() {
|
21
21
|
say_target *target = (say_target*)malloc(sizeof(say_target));
|
22
22
|
|
23
|
-
target->
|
23
|
+
mo_array_init(&target->all_contexts, sizeof(say_context*));
|
24
|
+
target->all_contexts.release = say_context_free_el;
|
25
|
+
|
26
|
+
target->context = say_thread_variable_create();
|
24
27
|
target->renderer = say_renderer_create();
|
25
28
|
target->view = say_view_create();
|
26
29
|
|
@@ -40,19 +43,23 @@ void say_target_free(say_target *target) {
|
|
40
43
|
|
41
44
|
say_thread_variable_free(target->context);
|
42
45
|
|
46
|
+
mo_array_release(&target->all_contexts);
|
47
|
+
|
43
48
|
free(target);
|
44
49
|
}
|
45
50
|
|
46
51
|
void say_target_set_context_proc(say_target *target, say_context_proc proc) {
|
47
52
|
if (target->own_context_needed) {
|
48
53
|
say_thread_variable_free(target->context);
|
49
|
-
target->
|
54
|
+
mo_array_resize(&target->all_contexts, 0);
|
55
|
+
|
56
|
+
target->context = say_thread_variable_create();
|
50
57
|
}
|
51
58
|
|
52
59
|
target->context_proc = proc;
|
53
60
|
}
|
54
61
|
|
55
|
-
void
|
62
|
+
void say_target_need_own_context(say_target *target, uint8_t val) {
|
56
63
|
target->own_context_needed = val;
|
57
64
|
}
|
58
65
|
|
@@ -73,6 +80,7 @@ say_context *say_target_get_context(say_target *target) {
|
|
73
80
|
return NULL;
|
74
81
|
}
|
75
82
|
|
83
|
+
mo_array_push(&target->all_contexts, &context);
|
76
84
|
say_thread_variable_set(target->context, context);
|
77
85
|
|
78
86
|
return context;
|
@@ -142,7 +150,6 @@ say_view *say_target_get_default_view(say_target *target) {
|
|
142
150
|
say_view_set_size(ret, target->size);
|
143
151
|
say_view_set_center(ret, say_make_vector2(target->size.x / 2,
|
144
152
|
target->size.y / 2));
|
145
|
-
say_view_flip_y(ret, say_view_is_y_flipped(target->view));
|
146
153
|
return ret;
|
147
154
|
}
|
148
155
|
|
@@ -207,6 +214,8 @@ say_color say_target_get(say_target *target, size_t x, size_t y) {
|
|
207
214
|
if (!say_target_make_current(target))
|
208
215
|
return say_make_color(0, 0, 0, 0);
|
209
216
|
|
217
|
+
say_pixel_bus_unbind_pack();
|
218
|
+
|
210
219
|
say_color col;
|
211
220
|
glReadPixels(x, (GLint)target->size.y - (GLint)y - 1, 1, 1, GL_RGBA,
|
212
221
|
GL_UNSIGNED_BYTE, &col);
|
@@ -225,28 +234,10 @@ say_image *say_target_get_rect(say_target *target, size_t x, size_t y,
|
|
225
234
|
return NULL;
|
226
235
|
}
|
227
236
|
|
228
|
-
|
237
|
+
say_pixel_bus_unbind_pack();
|
229
238
|
glReadPixels(x, (GLint)target->size.y - (GLint)y - (GLint)h, w, h, GL_RGBA,
|
230
239
|
GL_UNSIGNED_BYTE, say_image_get_buffer(image));
|
231
240
|
|
232
|
-
/*
|
233
|
-
* Say keeps pixels from top to bottom, but GL reads from bottom to top. Flip
|
234
|
-
* pixels manually.
|
235
|
-
*/
|
236
|
-
|
237
|
-
size_t mem_size = sizeof(say_color) * w;
|
238
|
-
|
239
|
-
say_color *temp_line = malloc(mem_size);
|
240
|
-
say_color *buffer = say_image_get_buffer(image);
|
241
|
-
|
242
|
-
for (size_t i = 0; i <= h / 2; i++) {
|
243
|
-
memcpy(temp_line, &buffer[w * i], mem_size);
|
244
|
-
memcpy(&buffer[w * i], &buffer[w * (h - i - 1)], mem_size);
|
245
|
-
memcpy(&buffer[w * (h - i - 1)], temp_line, mem_size);
|
246
|
-
}
|
247
|
-
|
248
|
-
free(temp_line);
|
249
|
-
|
250
241
|
return image;
|
251
242
|
}
|
252
243
|
|