ray 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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_context.h
CHANGED
@@ -3,6 +3,16 @@
|
|
3
3
|
|
4
4
|
#include "say_basic_type.h"
|
5
5
|
|
6
|
+
typedef struct {
|
7
|
+
size_t depth_size;
|
8
|
+
size_t stencil_size;
|
9
|
+
|
10
|
+
size_t major_version, minor_version;
|
11
|
+
|
12
|
+
bool core_profile;
|
13
|
+
bool debug;
|
14
|
+
} say_context_config;
|
15
|
+
|
6
16
|
struct say_window;
|
7
17
|
|
8
18
|
typedef struct {
|
@@ -10,6 +20,10 @@ typedef struct {
|
|
10
20
|
say_imp_context context;
|
11
21
|
} say_context;
|
12
22
|
|
23
|
+
say_context_config *say_context_get_config();
|
24
|
+
|
25
|
+
void say_context_free_el(void *context);
|
26
|
+
|
13
27
|
void say_context_ensure();
|
14
28
|
|
15
29
|
say_context *say_context_current();
|
data/ext/say_drawable.c
CHANGED
@@ -4,21 +4,60 @@ static void say_drawable_update_matrix(say_drawable *drawable) {
|
|
4
4
|
if (drawable->custom_matrix)
|
5
5
|
return;
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
if (drawable->matrix_proc) {
|
8
|
+
drawable->matrix_proc(drawable->data, drawable->matrix);
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
say_matrix_reset(drawable->matrix);
|
12
|
+
|
13
|
+
say_matrix_translate_by(drawable->matrix,
|
14
|
+
drawable->pos.x,
|
15
|
+
drawable->pos.y,
|
16
|
+
drawable->z_order);
|
17
|
+
say_matrix_rotate(drawable->matrix, drawable->angle, 0, 0, 1);
|
18
|
+
say_matrix_scale_by(drawable->matrix, drawable->scale.x, drawable->scale.y,
|
15
19
|
1);
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
+
say_matrix_translate_by(drawable->matrix,
|
21
|
+
-drawable->origin.x,
|
22
|
+
-drawable->origin.y,
|
23
|
+
0);
|
24
|
+
}
|
20
25
|
|
21
|
-
drawable->matrix_updated =
|
26
|
+
drawable->matrix_updated = true;
|
27
|
+
}
|
28
|
+
|
29
|
+
static say_context *say_blend_last_context = NULL;
|
30
|
+
static say_blend_mode say_last_blend = SAY_BLEND_NO;
|
31
|
+
|
32
|
+
static void say_drawable_enable_blend_mode(say_blend_mode mode) {
|
33
|
+
say_context *context = say_context_current();
|
34
|
+
|
35
|
+
if (mode != say_last_blend || context != say_blend_last_context) {
|
36
|
+
if (context != say_blend_last_context)
|
37
|
+
say_last_blend = SAY_BLEND_NO;
|
38
|
+
|
39
|
+
if (mode == SAY_BLEND_NO)
|
40
|
+
glDisable(GL_BLEND);
|
41
|
+
else if (say_last_blend == SAY_BLEND_NO)
|
42
|
+
glEnable(GL_BLEND);
|
43
|
+
|
44
|
+
switch (mode) {
|
45
|
+
case SAY_BLEND_NO:
|
46
|
+
break;
|
47
|
+
case SAY_BLEND_ALPHA:
|
48
|
+
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
49
|
+
break;
|
50
|
+
case SAY_BLEND_ADD:
|
51
|
+
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
52
|
+
break;
|
53
|
+
case SAY_BLEND_MULTIPLY:
|
54
|
+
glBlendFunc(GL_DST_COLOR, GL_ZERO);
|
55
|
+
break;
|
56
|
+
}
|
57
|
+
|
58
|
+
say_last_blend = mode;
|
59
|
+
say_blend_last_context = context;
|
60
|
+
}
|
22
61
|
}
|
23
62
|
|
24
63
|
say_drawable *say_drawable_create(size_t vtype) {
|
@@ -33,8 +72,11 @@ say_drawable *say_drawable_create(size_t vtype) {
|
|
33
72
|
|
34
73
|
drawable->data = NULL;
|
35
74
|
|
36
|
-
drawable->
|
37
|
-
drawable->
|
75
|
+
drawable->matrix_proc = NULL;
|
76
|
+
drawable->index_fill_proc = NULL;
|
77
|
+
drawable->fill_proc = NULL;
|
78
|
+
drawable->render_proc = NULL;
|
79
|
+
drawable->shader_proc = NULL;
|
38
80
|
|
39
81
|
drawable->shader = NULL;
|
40
82
|
drawable->matrix = say_matrix_identity();
|
@@ -50,6 +92,8 @@ say_drawable *say_drawable_create(size_t vtype) {
|
|
50
92
|
drawable->angle = 0;
|
51
93
|
drawable->z_order = 0;
|
52
94
|
|
95
|
+
drawable->blend_mode = SAY_BLEND_ALPHA;
|
96
|
+
|
53
97
|
return drawable;
|
54
98
|
}
|
55
99
|
|
@@ -59,9 +103,9 @@ void say_drawable_copy(say_drawable *drawable, say_drawable *other) {
|
|
59
103
|
|
60
104
|
drawable->index_count = other->index_count;
|
61
105
|
|
62
|
-
drawable->
|
63
|
-
|
106
|
+
drawable->matrix_proc = other->matrix_proc;
|
64
107
|
drawable->fill_proc = other->fill_proc;
|
108
|
+
drawable->shader_proc = other->shader_proc;
|
65
109
|
drawable->render_proc = other->render_proc;
|
66
110
|
drawable->index_fill_proc = other->index_fill_proc;
|
67
111
|
|
@@ -73,6 +117,8 @@ void say_drawable_copy(say_drawable *drawable, say_drawable *other) {
|
|
73
117
|
drawable->z_order = other->z_order;
|
74
118
|
drawable->angle = other->angle;
|
75
119
|
|
120
|
+
drawable->blend_mode = other->blend_mode;
|
121
|
+
|
76
122
|
drawable->use_texture = other->use_texture;
|
77
123
|
|
78
124
|
drawable->matrix_updated = false;
|
@@ -94,6 +140,14 @@ void say_drawable_set_custom_data(say_drawable *drawable, void *data) {
|
|
94
140
|
drawable->has_changed = 1;
|
95
141
|
}
|
96
142
|
|
143
|
+
void say_drawable_set_other_data(say_drawable *drawable, void *data) {
|
144
|
+
drawable->other_data = data;
|
145
|
+
}
|
146
|
+
|
147
|
+
void *say_drawable_get_other_data(say_drawable *drawable) {
|
148
|
+
return drawable->other_data;
|
149
|
+
}
|
150
|
+
|
97
151
|
void say_drawable_set_vertex_count(say_drawable *drawable, size_t size) {
|
98
152
|
if (size == drawable->vertex_count)
|
99
153
|
return;
|
@@ -122,6 +176,11 @@ size_t say_drawable_get_index_count(say_drawable *drawable) {
|
|
122
176
|
return drawable->index_count;
|
123
177
|
}
|
124
178
|
|
179
|
+
void say_drawable_set_matrix_proc(say_drawable *drawable, say_matrix_proc proc) {
|
180
|
+
drawable->matrix_proc = proc;
|
181
|
+
drawable->matrix_updated = false;
|
182
|
+
}
|
183
|
+
|
125
184
|
void say_drawable_set_fill_proc(say_drawable *drawable, say_fill_proc proc) {
|
126
185
|
drawable->fill_proc = proc;
|
127
186
|
drawable->has_changed = 1;
|
@@ -135,7 +194,10 @@ void say_drawable_set_index_fill_proc(say_drawable *drawable,
|
|
135
194
|
|
136
195
|
void say_drawable_set_render_proc(say_drawable *drawable, say_render_proc proc) {
|
137
196
|
drawable->render_proc = proc;
|
138
|
-
|
197
|
+
}
|
198
|
+
|
199
|
+
void say_drawable_set_shader_proc(say_drawable *drawable, say_shader_proc proc) {
|
200
|
+
drawable->shader_proc = proc;
|
139
201
|
}
|
140
202
|
|
141
203
|
void say_drawable_fill_buffer(say_drawable *drawable, void *vertices) {
|
@@ -203,6 +265,8 @@ void say_drawable_fill_own_index_buffer(say_drawable *drawable) {
|
|
203
265
|
void say_drawable_draw_at(say_drawable *drawable,
|
204
266
|
size_t vertex_id, size_t id,
|
205
267
|
say_shader *shader) {
|
268
|
+
say_drawable_enable_blend_mode(drawable->blend_mode);
|
269
|
+
|
206
270
|
if (!drawable->matrix_updated)
|
207
271
|
say_drawable_update_matrix(drawable);
|
208
272
|
|
@@ -216,11 +280,16 @@ void say_drawable_draw_at(say_drawable *drawable,
|
|
216
280
|
drawable->use_texture);
|
217
281
|
}
|
218
282
|
|
219
|
-
|
283
|
+
if (drawable->shader_proc)
|
284
|
+
drawable->shader_proc(drawable->data, shader);
|
285
|
+
|
286
|
+
drawable->render_proc(drawable->data, vertex_id, id);
|
220
287
|
}
|
221
288
|
}
|
222
289
|
|
223
290
|
void say_drawable_draw(say_drawable *drawable, say_shader *shader) {
|
291
|
+
say_drawable_enable_blend_mode(drawable->blend_mode);
|
292
|
+
|
224
293
|
if (drawable->has_changed) {
|
225
294
|
say_drawable_fill_own_buffer(drawable);
|
226
295
|
say_drawable_fill_own_index_buffer(drawable);
|
@@ -242,16 +311,22 @@ void say_drawable_draw(say_drawable *drawable, say_shader *shader) {
|
|
242
311
|
drawable->use_texture);
|
243
312
|
}
|
244
313
|
|
245
|
-
|
314
|
+
size_t loc = 0, index_loc = 0;
|
315
|
+
|
316
|
+
if (drawable->vertex_count != 0) {
|
246
317
|
say_buffer_slice_bind(drawable->slice);
|
318
|
+
loc = say_buffer_slice_get_loc(drawable->slice);
|
319
|
+
}
|
247
320
|
|
248
|
-
if (drawable->index_count != 0)
|
321
|
+
if (drawable->index_count != 0) {
|
249
322
|
say_index_buffer_slice_bind(drawable->index_slice);
|
323
|
+
index_loc = say_index_buffer_slice_get_loc(drawable->index_slice);
|
324
|
+
}
|
325
|
+
|
326
|
+
if (drawable->shader_proc)
|
327
|
+
drawable->shader_proc(drawable->data, shader);
|
250
328
|
|
251
|
-
drawable->render_proc(drawable->data,
|
252
|
-
say_buffer_slice_get_loc(drawable->slice),
|
253
|
-
say_index_buffer_slice_get_loc(drawable->index_slice),
|
254
|
-
used_shader);
|
329
|
+
drawable->render_proc(drawable->data, loc, index_loc);
|
255
330
|
}
|
256
331
|
}
|
257
332
|
|
@@ -263,6 +338,10 @@ uint8_t say_drawable_has_changed(say_drawable *drawable) {
|
|
263
338
|
return drawable->has_changed;
|
264
339
|
}
|
265
340
|
|
341
|
+
void say_drawable_set_matrix_changed(say_drawable *drawable) {
|
342
|
+
drawable->matrix_updated = false;
|
343
|
+
}
|
344
|
+
|
266
345
|
void say_drawable_set_textured(say_drawable *drawable, uint8_t val) {
|
267
346
|
drawable->use_texture = val;
|
268
347
|
}
|
@@ -348,3 +427,12 @@ say_vector3 say_drawable_transform(say_drawable *drawable, say_vector3 point) {
|
|
348
427
|
|
349
428
|
return say_matrix_transform(drawable->matrix, point);
|
350
429
|
}
|
430
|
+
|
431
|
+
|
432
|
+
say_blend_mode say_drawable_get_blend_mode(say_drawable *drawable) {
|
433
|
+
return drawable->blend_mode;
|
434
|
+
}
|
435
|
+
|
436
|
+
void say_drawable_set_blend_mode(say_drawable *drawable, say_blend_mode mode) {
|
437
|
+
drawable->blend_mode = mode;
|
438
|
+
}
|
data/ext/say_drawable.h
CHANGED
@@ -7,10 +7,18 @@
|
|
7
7
|
#include "say_matrix.h"
|
8
8
|
#include "say_shader.h"
|
9
9
|
|
10
|
+
typedef void (*say_matrix_proc)(void *data, say_matrix *matrix);
|
10
11
|
typedef void (*say_fill_proc)(void *data, void *vertices);
|
11
12
|
typedef void (*say_index_fill_proc)(void *data, GLuint *indices, size_t from);
|
12
|
-
typedef void (*say_render_proc)(void *data, size_t first, size_t index
|
13
|
-
|
13
|
+
typedef void (*say_render_proc)(void *data, size_t first, size_t index);
|
14
|
+
typedef void (*say_shader_proc)(void *data, say_shader *shader);
|
15
|
+
|
16
|
+
typedef enum {
|
17
|
+
SAY_BLEND_NO,
|
18
|
+
SAY_BLEND_ALPHA,
|
19
|
+
SAY_BLEND_ADD,
|
20
|
+
SAY_BLEND_MULTIPLY
|
21
|
+
} say_blend_mode;
|
14
22
|
|
15
23
|
typedef struct {
|
16
24
|
size_t vertex_count;
|
@@ -21,10 +29,13 @@ typedef struct {
|
|
21
29
|
say_index_buffer_slice *index_slice;
|
22
30
|
|
23
31
|
void *data;
|
32
|
+
void *other_data;
|
24
33
|
|
34
|
+
say_matrix_proc matrix_proc;
|
25
35
|
say_fill_proc fill_proc;
|
26
36
|
say_index_fill_proc index_fill_proc;
|
27
37
|
say_render_proc render_proc;
|
38
|
+
say_shader_proc shader_proc;
|
28
39
|
|
29
40
|
say_shader *shader;
|
30
41
|
say_matrix *matrix;
|
@@ -39,6 +50,8 @@ typedef struct {
|
|
39
50
|
bool matrix_updated;
|
40
51
|
bool custom_matrix;
|
41
52
|
bool has_changed;
|
53
|
+
|
54
|
+
say_blend_mode blend_mode;
|
42
55
|
} say_drawable;
|
43
56
|
|
44
57
|
say_drawable *say_drawable_create(size_t vtype);
|
@@ -47,6 +60,8 @@ void say_drawable_free(say_drawable *drawable);
|
|
47
60
|
void say_drawable_copy(say_drawable *drawable, say_drawable *other);
|
48
61
|
|
49
62
|
void say_drawable_set_custom_data(say_drawable *drawable, void *data);
|
63
|
+
void say_drawable_set_other_data(say_drawable *drawable, void *data);
|
64
|
+
void *say_drawable_get_other_data(say_drawable *drawable);
|
50
65
|
|
51
66
|
void say_drawable_set_vertex_count(say_drawable *drawable, size_t size);
|
52
67
|
size_t say_drawable_get_vertex_count(say_drawable *drawable);
|
@@ -56,8 +71,10 @@ size_t say_drawable_get_vertex_type(say_drawable *drawable);
|
|
56
71
|
void say_drawable_set_index_count(say_drawable *drawable, size_t size);
|
57
72
|
size_t say_drawable_get_index_count(say_drawable *drawable);
|
58
73
|
|
74
|
+
void say_drawable_set_matrix_proc(say_drawable *drawable, say_matrix_proc proc);
|
59
75
|
void say_drawable_set_fill_proc(say_drawable *drawable, say_fill_proc proc);
|
60
76
|
void say_drawable_set_render_proc(say_drawable *drawable, say_render_proc proc);
|
77
|
+
void say_drawable_set_shader_proc(say_drawable *drawable, say_shader_proc proc);
|
61
78
|
void say_drawable_set_index_fill_proc(say_drawable *drawable,
|
62
79
|
say_index_fill_proc proc);
|
63
80
|
|
@@ -74,6 +91,7 @@ void say_drawable_draw(say_drawable *drawable, say_shader *shader);
|
|
74
91
|
|
75
92
|
void say_drawable_set_changed(say_drawable *drawable);
|
76
93
|
uint8_t say_drawable_has_changed(say_drawable *drawable);
|
94
|
+
void say_drawable_set_matrix_changed(say_drawable *drawable);
|
77
95
|
|
78
96
|
void say_drawable_set_textured(say_drawable *drawable, uint8_t val);
|
79
97
|
uint8_t say_drawable_is_textured(say_drawable *drawable);
|
@@ -97,4 +115,7 @@ say_matrix *say_drawable_get_matrix(say_drawable *drawable);
|
|
97
115
|
void say_drawable_set_matrix(say_drawable *drawable, say_matrix *matrix);
|
98
116
|
say_vector3 say_drawable_transform(say_drawable *drawable, say_vector3 point);
|
99
117
|
|
118
|
+
say_blend_mode say_drawable_get_blend_mode(say_drawable *drawable);
|
119
|
+
void say_drawable_set_blend_mode(say_drawable *drawable, say_blend_mode mode);
|
120
|
+
|
100
121
|
#endif
|
data/ext/say_error.c
CHANGED
@@ -11,7 +11,7 @@ const char *say_error_get_last() {
|
|
11
11
|
|
12
12
|
void say_error_set(const char *message) {
|
13
13
|
if (!say_last_error)
|
14
|
-
say_last_error = say_thread_variable_create(
|
14
|
+
say_last_error = say_thread_variable_create();
|
15
15
|
|
16
16
|
void *old = say_thread_variable_get(say_last_error);
|
17
17
|
if (old)
|
@@ -21,7 +21,12 @@ void say_error_set(const char *message) {
|
|
21
21
|
}
|
22
22
|
|
23
23
|
void say_error_clean_up() {
|
24
|
-
if (say_last_error)
|
24
|
+
if (say_last_error) {
|
25
|
+
void *error = say_thread_variable_get(say_last_error);
|
26
|
+
if (error) free(error);
|
27
|
+
|
25
28
|
say_thread_variable_free(say_last_error);
|
29
|
+
}
|
30
|
+
|
26
31
|
say_last_error = NULL;
|
27
32
|
}
|
data/ext/say_font.c
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
-
static say_font_page *
|
4
|
-
|
3
|
+
static void say_page_init(say_font_page *page) {
|
4
|
+
page->glyphs = mo_hash_create(sizeof(uint32_t), sizeof(say_glyph));
|
5
|
+
page->glyphs->hash_of = mo_hash_of_u32;
|
6
|
+
page->glyphs->key_cmp = mo_hash_u32_cmp;
|
5
7
|
|
6
|
-
page->
|
7
|
-
page->rows = say_array_create(sizeof(say_font_row),
|
8
|
-
NULL,
|
9
|
-
NULL);
|
8
|
+
mo_array_init(&page->rows, sizeof(say_font_row));
|
10
9
|
|
11
10
|
page->current_height = 2;
|
12
11
|
|
@@ -25,17 +24,13 @@ static say_font_page *say_page_create() {
|
|
25
24
|
say_image_set(page->image, x, y, say_make_color(255, 255, 255, 255));
|
26
25
|
}
|
27
26
|
}
|
28
|
-
|
29
|
-
return page;
|
30
27
|
}
|
31
28
|
|
32
29
|
static void say_page_free(say_font_page *page) {
|
33
30
|
say_image_free(page->image);
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
free(page);
|
32
|
+
mo_array_release(&page->rows);
|
33
|
+
mo_hash_free(page->glyphs);
|
39
34
|
}
|
40
35
|
|
41
36
|
static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t height) {
|
@@ -43,9 +38,10 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
|
|
43
38
|
|
44
39
|
float best_ratio = 0;
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
say_font_row *end = mo_array_end(&page->rows);
|
42
|
+
for (say_font_row *row = mo_array_at(&page->rows, 0);
|
43
|
+
row && row < end;
|
44
|
+
mo_array_next(&page->rows, (void**)&row)) {
|
49
45
|
float ratio = height / (float)row->height;
|
50
46
|
|
51
47
|
if (ratio < 0.7 || ratio > 1.0 || ratio < best_ratio)
|
@@ -61,7 +57,7 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
|
|
61
57
|
if (!found_row) {
|
62
58
|
int row_height = height + height / 10;
|
63
59
|
|
64
|
-
|
60
|
+
while (page->current_height + row_height >= say_image_get_height(page->image)) {
|
65
61
|
say_vector2 size = say_image_get_size(page->image);
|
66
62
|
say_image_resize(page->image, size.x * 2, size.y * 2);
|
67
63
|
}
|
@@ -72,8 +68,8 @@ static say_rect say_page_find_rect(say_font_page *page, size_t width, size_t hei
|
|
72
68
|
row.y = page->current_height;
|
73
69
|
row.height = row_height;
|
74
70
|
|
75
|
-
|
76
|
-
found_row =
|
71
|
+
mo_array_push(&page->rows, &row);
|
72
|
+
found_row = mo_array_at(&page->rows, page->rows.size - 1);
|
77
73
|
|
78
74
|
page->current_height += row_height;
|
79
75
|
}
|
@@ -112,8 +108,10 @@ static say_glyph *say_font_load_glyph(say_font *font, say_font_page *page,
|
|
112
108
|
size_t size) {
|
113
109
|
uint32_t bold_codepoint = ((bold ? 1 : 0) << 31) | codepoint;
|
114
110
|
|
115
|
-
say_glyph
|
116
|
-
|
111
|
+
say_glyph tmp;
|
112
|
+
mo_hash_set(page->glyphs, &bold_codepoint, &tmp);
|
113
|
+
|
114
|
+
say_glyph *glyph = mo_hash_get(page->glyphs, &bold_codepoint);
|
117
115
|
|
118
116
|
glyph->offset = 0;
|
119
117
|
glyph->bounds = say_make_rect(2, 0, 2, 2);
|
@@ -217,7 +215,10 @@ say_font *say_font_create() {
|
|
217
215
|
|
218
216
|
font->face = NULL;
|
219
217
|
|
220
|
-
font->pages =
|
218
|
+
font->pages = mo_hash_create(sizeof(size_t), sizeof(say_font_page));
|
219
|
+
font->pages->release = (say_destructor)say_page_free;
|
220
|
+
font->pages->hash_of = mo_hash_of_size;
|
221
|
+
font->pages->key_cmp = mo_hash_size_cmp;
|
221
222
|
|
222
223
|
return font;
|
223
224
|
}
|
@@ -242,7 +243,7 @@ void say_font_free(say_font *font) {
|
|
242
243
|
if (font->library)
|
243
244
|
FT_Done_FreeType(font->library);
|
244
245
|
|
245
|
-
|
246
|
+
mo_hash_free(font->pages);
|
246
247
|
free(font);
|
247
248
|
}
|
248
249
|
|
@@ -274,13 +275,15 @@ int say_font_load_from_memory(say_font *font, void *buf, size_t size) {
|
|
274
275
|
|
275
276
|
say_font_page *say_font_get_page(say_font *font, size_t size) {
|
276
277
|
say_font_page *page = NULL;
|
277
|
-
if ((page =
|
278
|
+
if ((page = mo_hash_get(font->pages, &size)))
|
278
279
|
return page;
|
279
280
|
else {
|
280
|
-
page
|
281
|
-
|
281
|
+
say_font_page page;
|
282
|
+
say_page_init(&page);
|
282
283
|
|
283
|
-
|
284
|
+
mo_hash_set(font->pages, &size, &page);
|
285
|
+
|
286
|
+
return mo_hash_get(font->pages, &size);
|
284
287
|
}
|
285
288
|
}
|
286
289
|
|
@@ -289,7 +292,7 @@ say_glyph *say_font_get_glyph(say_font *font, uint32_t codepoint, size_t size, u
|
|
289
292
|
uint32_t bold_codepoint = ((bold ? 1 : 0) << 31) | codepoint;
|
290
293
|
|
291
294
|
say_glyph *glyph = NULL;
|
292
|
-
if ((glyph =
|
295
|
+
if ((glyph = mo_hash_get(page->glyphs, &bold_codepoint)))
|
293
296
|
return glyph;
|
294
297
|
else {
|
295
298
|
return say_font_load_glyph(font, page, codepoint, bold, size);
|