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_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);
|