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_font.h
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
#ifndef SAY_FONT_H_
|
2
2
|
#define SAY_FONT_H_
|
3
3
|
|
4
|
-
#include "say_table.h"
|
5
|
-
#include "say_array.h"
|
6
|
-
|
7
4
|
#include "say_image.h"
|
8
5
|
|
9
6
|
typedef struct {
|
@@ -16,8 +13,8 @@ typedef struct {
|
|
16
13
|
} say_font_row;
|
17
14
|
|
18
15
|
typedef struct {
|
19
|
-
|
20
|
-
|
16
|
+
mo_hash *glyphs;
|
17
|
+
mo_array rows;
|
21
18
|
|
22
19
|
say_image *image;
|
23
20
|
|
@@ -28,7 +25,7 @@ typedef struct {
|
|
28
25
|
FT_Library library;
|
29
26
|
FT_Face face;
|
30
27
|
|
31
|
-
|
28
|
+
mo_hash *pages;
|
32
29
|
} say_font;
|
33
30
|
|
34
31
|
say_font *say_font_create();
|
data/ext/say_get_proc.c
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
/*
|
2
|
+
* Code stolen from GLEW, to do what GLEW should be doing.
|
3
|
+
*/
|
4
|
+
#include "say.h"
|
5
|
+
|
6
|
+
#ifdef SAY_WIN
|
7
|
+
void *say_get_proc(const char *name) {
|
8
|
+
return (void*)wglGetProcAddress((LPCSTR)name);
|
9
|
+
}
|
10
|
+
#else
|
11
|
+
# ifdef SAY_OSX
|
12
|
+
|
13
|
+
#include <dlfcn.h>
|
14
|
+
void *say_get_proc(const char *name) {
|
15
|
+
static void *handle = NULL;
|
16
|
+
if (!handle) {
|
17
|
+
handle = dlopen("/System/Library/Frameworks/OpenGL.framework/"
|
18
|
+
"Versions/Current/OpenGL", RTLD_LAZY);
|
19
|
+
}
|
20
|
+
|
21
|
+
/* prepend a '_' for the Unix C symbol mangling convention */
|
22
|
+
char *symbol_name = malloc(strlen(name) + 2);
|
23
|
+
strcpy(symbol_name + 1, name);
|
24
|
+
symbol_name[0] = '_';
|
25
|
+
|
26
|
+
void *ptr = dlsym(handle, symbol_name);
|
27
|
+
free(symbol_name);
|
28
|
+
return ptr;
|
29
|
+
}
|
30
|
+
# else
|
31
|
+
void *say_get_proc(const char *name) {
|
32
|
+
return (void*)glXGetProcAddress((GLubyte*)name);
|
33
|
+
}
|
34
|
+
# endif
|
35
|
+
#endif
|
data/ext/say_image.c
CHANGED
@@ -25,6 +25,19 @@ static void say_texture_will_delete(GLuint texture) {
|
|
25
25
|
say_current_texture = 0;
|
26
26
|
}
|
27
27
|
|
28
|
+
static void say_image_update_buffer(say_image *img) {
|
29
|
+
if (img->buffer_updated)
|
30
|
+
return;
|
31
|
+
|
32
|
+
say_texture_make_current(img->texture);
|
33
|
+
say_pixel_bus_unbind_pack();
|
34
|
+
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
35
|
+
img->pixels);
|
36
|
+
|
37
|
+
img->buffer_updated = true;
|
38
|
+
img->texture_updated = true;
|
39
|
+
}
|
40
|
+
|
28
41
|
say_image *say_image_create() {
|
29
42
|
say_context_ensure();
|
30
43
|
|
@@ -34,13 +47,14 @@ say_image *say_image_create() {
|
|
34
47
|
glGenTextures(1, &(img->texture));
|
35
48
|
|
36
49
|
img->pixels = NULL;
|
37
|
-
img->texture_updated =
|
50
|
+
img->texture_updated = true;
|
51
|
+
img->buffer_updated = true;
|
38
52
|
|
39
53
|
img->width = 0;
|
40
54
|
img->height = 0;
|
41
55
|
|
42
|
-
img->smooth =
|
43
|
-
say_image_set_smooth(img,
|
56
|
+
img->smooth = true;
|
57
|
+
say_image_set_smooth(img, false);
|
44
58
|
|
45
59
|
return img;
|
46
60
|
}
|
@@ -57,12 +71,29 @@ void say_image_free(say_image *img) {
|
|
57
71
|
free(img);
|
58
72
|
}
|
59
73
|
|
60
|
-
bool say_image_load_raw(say_image *img, size_t
|
61
|
-
|
62
|
-
if (!say_image_create_with_size(img, width, height))
|
74
|
+
bool say_image_load_raw(say_image *img, size_t w, size_t h, say_color *pixels) {
|
75
|
+
if (!say_image_create_with_size(img, w, h))
|
63
76
|
return false;
|
64
77
|
|
65
|
-
|
78
|
+
img->texture_updated = false;
|
79
|
+
|
80
|
+
memcpy(img->pixels, pixels, sizeof(say_color) * w * h);
|
81
|
+
|
82
|
+
/*
|
83
|
+
* Vertical flip to fit OpenGL convention.
|
84
|
+
*/
|
85
|
+
say_flip_color_buffer(img->pixels, w, h);
|
86
|
+
|
87
|
+
return true;
|
88
|
+
}
|
89
|
+
|
90
|
+
bool say_image_load_flipped_raw(say_image *img, size_t w, size_t h,
|
91
|
+
say_color *pixels) {
|
92
|
+
if (!say_image_create_with_size(img, w, h))
|
93
|
+
return false;
|
94
|
+
|
95
|
+
img->texture_updated = false;
|
96
|
+
memcpy(img->pixels, pixels, sizeof(say_color) * w * h);
|
66
97
|
return true;
|
67
98
|
}
|
68
99
|
|
@@ -104,9 +135,11 @@ bool say_image_create_with_size(say_image *img, size_t w, size_t h) {
|
|
104
135
|
|
105
136
|
if (img->width != w || img->height != h) {
|
106
137
|
if (img->pixels) free(img->pixels);
|
138
|
+
|
107
139
|
img->pixels = malloc(sizeof(say_color) * w * h);
|
108
140
|
|
109
141
|
say_texture_make_current(img->texture);
|
142
|
+
say_pixel_bus_unbind_unpack();
|
110
143
|
glGetError(); /* Ignore potential previous errors */
|
111
144
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0,
|
112
145
|
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
@@ -120,7 +153,8 @@ bool say_image_create_with_size(say_image *img, size_t w, size_t h) {
|
|
120
153
|
img->width = w;
|
121
154
|
img->height = h;
|
122
155
|
|
123
|
-
img->texture_updated =
|
156
|
+
img->texture_updated = true;
|
157
|
+
img->buffer_updated = true;
|
124
158
|
|
125
159
|
return true;
|
126
160
|
}
|
@@ -134,11 +168,19 @@ static bool say_image_assert_non_empty(say_image *img) {
|
|
134
168
|
return true;
|
135
169
|
}
|
136
170
|
|
171
|
+
static say_color *say_image_reversed_buffer(say_image *img) {
|
172
|
+
return say_flip_color_buffer_copy(img->pixels, img->width,
|
173
|
+
img->height);
|
174
|
+
}
|
175
|
+
|
137
176
|
bool say_image_write_bmp(say_image *img, const char *filename) {
|
138
177
|
if (!say_image_assert_non_empty(img))
|
139
178
|
return false;
|
140
179
|
|
141
|
-
|
180
|
+
say_image_update_buffer(img);
|
181
|
+
say_color *buf = say_image_reversed_buffer(img);
|
182
|
+
stbi_write_bmp(filename, img->width, img->height, 4, buf);
|
183
|
+
free(buf);
|
142
184
|
|
143
185
|
return true;
|
144
186
|
}
|
@@ -147,7 +189,15 @@ bool say_image_write_png(say_image *img, const char *filename) {
|
|
147
189
|
if (!say_image_assert_non_empty(img))
|
148
190
|
return false;
|
149
191
|
|
150
|
-
|
192
|
+
#ifdef SAY_WIN
|
193
|
+
say_error_set("can't save image as a PNG on windows");
|
194
|
+
return false;
|
195
|
+
#endif
|
196
|
+
|
197
|
+
say_image_update_buffer(img);
|
198
|
+
say_color *buf = say_image_reversed_buffer(img);
|
199
|
+
stbi_write_png(filename, img->width, img->height, 4, buf, 0);
|
200
|
+
free(buf);
|
151
201
|
|
152
202
|
return true;
|
153
203
|
}
|
@@ -156,7 +206,10 @@ bool say_image_write_tga(say_image *img, const char *filename) {
|
|
156
206
|
if (!say_image_assert_non_empty(img))
|
157
207
|
return false;
|
158
208
|
|
159
|
-
|
209
|
+
say_image_update_buffer(img);
|
210
|
+
say_color *buf = say_image_reversed_buffer(img);
|
211
|
+
stbi_write_tga(filename, img->width, img->height, 4, buf);
|
212
|
+
free(buf);
|
160
213
|
|
161
214
|
return true;
|
162
215
|
}
|
@@ -170,10 +223,10 @@ bool say_image_write(say_image *img, const char *filename) {
|
|
170
223
|
const char *ext = (filename + len - 4);
|
171
224
|
if (strcmp(ext, ".png") == 0 || strcmp(ext, ".PNG") == 0)
|
172
225
|
return say_image_write_png(img, filename);
|
173
|
-
else if (strcmp(ext, ".
|
174
|
-
return
|
226
|
+
else if (strcmp(ext, ".bmp") == 0 || strcmp(ext, ".BMP") == 0)
|
227
|
+
return say_image_write_bmp(img, filename);
|
175
228
|
else
|
176
|
-
|
229
|
+
say_image_write_tga(img, filename);
|
177
230
|
}
|
178
231
|
|
179
232
|
return true;
|
@@ -192,6 +245,8 @@ say_vector2 say_image_get_size(say_image *img) {
|
|
192
245
|
}
|
193
246
|
|
194
247
|
bool say_image_resize(say_image *img, size_t w, size_t h) {
|
248
|
+
say_image_update_buffer(img);
|
249
|
+
|
195
250
|
size_t old_w = img->width, old_h = img->height;
|
196
251
|
|
197
252
|
say_color *cpy = malloc(sizeof(say_color) * img->width * img->height);
|
@@ -200,17 +255,24 @@ bool say_image_resize(say_image *img, size_t w, size_t h) {
|
|
200
255
|
if (!say_image_create_with_size(img, w, h))
|
201
256
|
return false;
|
202
257
|
|
258
|
+
img->texture_updated = false;
|
259
|
+
|
203
260
|
size_t row_size = sizeof(say_color) * old_h;
|
204
261
|
|
205
262
|
for (size_t y = 0; y < old_h; y++) {
|
206
|
-
memcpy(&img->pixels[y * img->width],
|
207
|
-
|
208
|
-
|
263
|
+
memcpy(&img->pixels[(h - y - 1) * img->width],
|
264
|
+
&cpy[(old_h - y - 1) * old_h], row_size);
|
265
|
+
for (size_t x = old_w; x < img->width; x++) {
|
266
|
+
img->pixels[(h - y - 1) * img->height + x] =
|
267
|
+
say_make_color(255, 255, 255, 0);
|
268
|
+
}
|
209
269
|
}
|
210
270
|
|
211
271
|
for (size_t y = old_h; y < img->height; y++) {
|
212
|
-
for (size_t x = 0; x < img->width; x++)
|
213
|
-
img->pixels[y * img->height + x] =
|
272
|
+
for (size_t x = 0; x < img->width; x++) {
|
273
|
+
img->pixels[(h - y - 1) * img->height + x] =
|
274
|
+
say_make_color(255, 255, 255, 0);
|
275
|
+
}
|
214
276
|
}
|
215
277
|
|
216
278
|
free(cpy);
|
@@ -218,11 +280,11 @@ bool say_image_resize(say_image *img, size_t w, size_t h) {
|
|
218
280
|
return true;
|
219
281
|
}
|
220
282
|
|
221
|
-
|
283
|
+
bool say_image_is_smooth(say_image *img) {
|
222
284
|
return img->smooth;
|
223
285
|
}
|
224
286
|
|
225
|
-
void say_image_set_smooth(say_image *img,
|
287
|
+
void say_image_set_smooth(say_image *img, bool val) {
|
226
288
|
if (img->smooth != val) {
|
227
289
|
img->smooth = val;
|
228
290
|
|
@@ -240,21 +302,29 @@ say_rect say_image_get_tex_rect(say_image *img, say_rect rect) {
|
|
240
302
|
if (img->width == 0 || img->height == 0)
|
241
303
|
return say_make_rect(0, 0, 0, 0);
|
242
304
|
|
243
|
-
return say_make_rect(rect.x / img->width, rect.y / img->height,
|
244
|
-
rect.w / img->width, rect.h / img->height);
|
305
|
+
return say_make_rect(rect.x / img->width, 1 - (rect.y / img->height),
|
306
|
+
rect.w / img->width, -(rect.h / img->height));
|
245
307
|
}
|
246
308
|
|
247
309
|
say_color *say_image_get_buffer(say_image *img) {
|
310
|
+
say_image_update_buffer(img);
|
248
311
|
return img->pixels;
|
249
312
|
}
|
250
313
|
|
314
|
+
void say_image_mark_out_of_date(say_image *img) {
|
315
|
+
img->buffer_updated = false;
|
316
|
+
}
|
317
|
+
|
251
318
|
say_color say_image_get(say_image *img, size_t x, size_t y) {
|
252
|
-
|
319
|
+
say_image_update_buffer(img);
|
320
|
+
return img->pixels[(img->height - y - 1) * img->width + x];
|
253
321
|
}
|
254
322
|
|
255
323
|
void say_image_set(say_image *img, size_t x, size_t y, say_color color) {
|
256
|
-
img
|
257
|
-
|
324
|
+
say_image_update_buffer(img);
|
325
|
+
|
326
|
+
img->pixels[(img->height - y - 1) * img->width + x] = color;
|
327
|
+
img->texture_updated = false;
|
258
328
|
}
|
259
329
|
|
260
330
|
void say_image_bind(say_image *img) {
|
@@ -270,14 +340,19 @@ void say_image_update_texture(say_image *img) {
|
|
270
340
|
return;
|
271
341
|
|
272
342
|
say_texture_make_current(img->texture);
|
343
|
+
say_pixel_bus_unbind_unpack();
|
273
344
|
glTexSubImage2D(GL_TEXTURE_2D, 0,
|
274
345
|
0, 0,
|
275
346
|
img->width, img->height,
|
276
347
|
GL_RGBA, GL_UNSIGNED_BYTE, img->pixels);
|
277
348
|
|
278
|
-
img->texture_updated =
|
349
|
+
img->texture_updated = true;
|
279
350
|
}
|
280
351
|
|
281
352
|
void say_image_unbind() {
|
282
353
|
say_texture_make_current(0);
|
283
354
|
}
|
355
|
+
|
356
|
+
GLuint say_image_get_texture(say_image *img) {
|
357
|
+
return img->texture;
|
358
|
+
}
|
data/ext/say_image.h
CHANGED
@@ -7,11 +7,12 @@ typedef struct say_image {
|
|
7
7
|
GLuint texture;
|
8
8
|
|
9
9
|
say_color *pixels;
|
10
|
-
|
10
|
+
bool texture_updated;
|
11
|
+
bool buffer_updated;
|
11
12
|
|
12
13
|
size_t width, height;
|
13
14
|
|
14
|
-
|
15
|
+
bool smooth;
|
15
16
|
} say_image;
|
16
17
|
|
17
18
|
say_image *say_image_create();
|
@@ -25,6 +26,8 @@ bool say_image_resize(say_image *img, size_t w, size_t h);
|
|
25
26
|
|
26
27
|
bool say_image_load_raw(say_image *img, size_t width, size_t height,
|
27
28
|
say_color *pixels);
|
29
|
+
bool say_image_load_flipped_raw(say_image *img, size_t width, size_t height,
|
30
|
+
say_color *pixels);
|
28
31
|
bool say_image_load_file(say_image *img, const char *filename);
|
29
32
|
bool say_image_load_from_memory(say_image *img, size_t size, const char *buffer);
|
30
33
|
bool say_image_create_with_size(say_image *img, size_t w, size_t h);
|
@@ -34,8 +37,8 @@ bool say_image_write_png(say_image *img, const char *filename);
|
|
34
37
|
bool say_image_write_tga(say_image *img, const char *filename);
|
35
38
|
bool say_image_write(say_image *img, const char *filename);
|
36
39
|
|
37
|
-
|
38
|
-
void say_image_set_smooth(say_image *img,
|
40
|
+
bool say_image_is_smooth(say_image *img);
|
41
|
+
void say_image_set_smooth(say_image *img, bool val);
|
39
42
|
|
40
43
|
say_color say_image_get(say_image *img, size_t x, size_t y);
|
41
44
|
void say_image_set(say_image *img, size_t x, size_t y, say_color color);
|
@@ -44,9 +47,13 @@ say_rect say_image_get_tex_rect(say_image *img, say_rect rect);
|
|
44
47
|
|
45
48
|
say_color *say_image_get_buffer(say_image *img);
|
46
49
|
|
50
|
+
void say_image_mark_out_of_date(say_image *img);
|
51
|
+
|
47
52
|
void say_image_bind(say_image *img);
|
48
53
|
void say_image_unbind();
|
49
54
|
|
50
55
|
void say_image_update_texture(say_image *img);
|
51
56
|
|
57
|
+
GLuint say_image_get_texture(say_image *img);
|
58
|
+
|
52
59
|
#endif
|
data/ext/say_image_target.c
CHANGED
@@ -1,9 +1,49 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
+
typedef struct {
|
4
|
+
GLuint id;
|
5
|
+
say_image *img;
|
6
|
+
say_context *ctxt;
|
7
|
+
} say_fbo;
|
8
|
+
|
3
9
|
static say_context *say_image_target_make_context(void *data) {
|
4
10
|
return say_context_create();
|
5
11
|
}
|
6
12
|
|
13
|
+
static void say_fbo_delete_current(void *data) {
|
14
|
+
say_fbo *fbo = (say_fbo*)data;
|
15
|
+
|
16
|
+
if (fbo->ctxt == say_context_current() && fbo->id) {
|
17
|
+
glDeleteFramebuffers(1, &fbo->id);
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
void say_fbo_make_current(GLuint fbo);
|
22
|
+
void say_rbo_make_current(GLuint rbo);
|
23
|
+
|
24
|
+
static void say_fbo_build(say_image_target *target, say_fbo *fbo) {
|
25
|
+
if (!fbo->id)
|
26
|
+
glGenFramebuffers(1, &fbo->id);
|
27
|
+
|
28
|
+
say_fbo_make_current(fbo->id);
|
29
|
+
|
30
|
+
say_image_bind(target->img);
|
31
|
+
glGenerateMipmap(GL_TEXTURE_2D);
|
32
|
+
|
33
|
+
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
34
|
+
GL_TEXTURE_2D, target->img->texture, 0);
|
35
|
+
|
36
|
+
say_rbo_make_current(target->rbo);
|
37
|
+
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
|
38
|
+
say_image_get_width(target->img),
|
39
|
+
say_image_get_height(target->img));
|
40
|
+
|
41
|
+
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
|
42
|
+
GL_RENDERBUFFER, target->rbo);
|
43
|
+
|
44
|
+
fbo->img = target->img;
|
45
|
+
}
|
46
|
+
|
7
47
|
static GLuint say_current_fbo = 0;
|
8
48
|
static say_context *say_fbo_last_context = NULL;
|
9
49
|
|
@@ -15,7 +55,7 @@ void say_fbo_make_current(GLuint fbo) {
|
|
15
55
|
say_current_fbo = fbo;
|
16
56
|
say_fbo_last_context = context;
|
17
57
|
|
18
|
-
|
58
|
+
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
19
59
|
}
|
20
60
|
}
|
21
61
|
|
@@ -30,13 +70,19 @@ void say_rbo_make_current(GLuint rbo) {
|
|
30
70
|
say_current_rbo = rbo;
|
31
71
|
say_rbo_last_context = context;
|
32
72
|
|
33
|
-
|
73
|
+
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
|
34
74
|
}
|
35
75
|
}
|
36
76
|
|
37
|
-
void say_image_target_will_delete(
|
38
|
-
|
39
|
-
|
77
|
+
void say_image_target_will_delete(mo_hash *fbos, GLuint rbo) {
|
78
|
+
mo_hash_it it = mo_hash_begin(fbos);
|
79
|
+
for (; !mo_hash_it_is_end(&it); mo_hash_it_next(&it)) {
|
80
|
+
say_fbo *fbo = mo_hash_it_val_ptr(&it, say_fbo);
|
81
|
+
if (fbo->id == say_current_fbo) {
|
82
|
+
say_current_fbo = 0;
|
83
|
+
break;
|
84
|
+
}
|
85
|
+
}
|
40
86
|
|
41
87
|
if (say_current_rbo == rbo)
|
42
88
|
say_current_rbo = 0;
|
@@ -44,7 +90,7 @@ void say_image_target_will_delete(GLuint fbo, GLuint rbo) {
|
|
44
90
|
|
45
91
|
bool say_image_target_is_available() {
|
46
92
|
say_context_ensure();
|
47
|
-
return
|
93
|
+
return GLEW_EXT_framebuffer_object || GLEW_VERSION_3_0;
|
48
94
|
}
|
49
95
|
|
50
96
|
say_image_target *say_image_target_create() {
|
@@ -54,18 +100,22 @@ say_image_target *say_image_target_create() {
|
|
54
100
|
target->target = say_target_create();
|
55
101
|
target->img = NULL;
|
56
102
|
|
57
|
-
|
58
|
-
|
103
|
+
target->fbos = mo_hash_create(sizeof(say_context*), sizeof(say_fbo));
|
104
|
+
target->fbos->release = say_fbo_delete_current;
|
105
|
+
target->fbos->hash_of = mo_hash_of_pointer;
|
106
|
+
target->fbos->key_cmp = mo_hash_pointer_cmp;
|
107
|
+
|
108
|
+
glGenRenderbuffers(1, &target->rbo);
|
59
109
|
|
60
110
|
return target;
|
61
111
|
}
|
62
112
|
|
63
113
|
void say_image_target_free(say_image_target *target) {
|
64
114
|
say_context_ensure();
|
65
|
-
say_image_target_will_delete(target->
|
115
|
+
say_image_target_will_delete(target->fbos, target->rbo);
|
66
116
|
|
67
|
-
|
68
|
-
|
117
|
+
glDeleteRenderbuffers(1, &target->rbo);
|
118
|
+
mo_hash_free(target->fbos);
|
69
119
|
|
70
120
|
say_target_free(target->target);
|
71
121
|
free(target);
|
@@ -77,7 +127,6 @@ void say_image_target_set_image(say_image_target *target, say_image *image) {
|
|
77
127
|
|
78
128
|
if (target->img) {
|
79
129
|
say_target_set_custom_data(target->target, target);
|
80
|
-
//say_target_need_own_contxt(target->target, 0);
|
81
130
|
say_target_set_context_proc(target->target, say_image_target_make_context);
|
82
131
|
say_target_set_bind_hook(target->target, (say_bind_hook)say_image_target_bind);
|
83
132
|
|
@@ -87,24 +136,8 @@ void say_image_target_set_image(say_image_target *target, say_image *image) {
|
|
87
136
|
say_view_set_size(target->target->view, size);
|
88
137
|
say_view_set_center(target->target->view, say_make_vector2(size.x / 2.0,
|
89
138
|
size.y / 2.0));
|
90
|
-
say_view_flip_y(target->target->view, 0);
|
91
|
-
|
92
|
-
say_fbo_make_current(target->fbo);
|
93
|
-
|
94
|
-
say_image_bind(image);
|
95
|
-
glGenerateMipmapEXT(GL_TEXTURE_2D);
|
96
|
-
|
97
|
-
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
98
|
-
GL_TEXTURE_2D, image->texture, 0);
|
99
|
-
|
100
|
-
say_rbo_make_current(target->rbo);
|
101
|
-
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
102
|
-
say_image_get_width(image),
|
103
|
-
say_image_get_height(image));
|
104
|
-
|
105
|
-
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
106
|
-
GL_RENDERBUFFER_EXT, target->rbo);
|
107
139
|
|
140
|
+
say_target_make_current(target->target);
|
108
141
|
}
|
109
142
|
}
|
110
143
|
|
@@ -115,16 +148,37 @@ say_image *say_image_target_get_image(say_image_target *target) {
|
|
115
148
|
void say_image_target_update(say_image_target *target) {
|
116
149
|
if (target->img) {
|
117
150
|
say_target_update(target->target);
|
118
|
-
|
119
|
-
say_image_bind(target->img);
|
120
|
-
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE,
|
121
|
-
say_image_get_buffer(target->img));
|
151
|
+
say_image_mark_out_of_date(target->img);
|
122
152
|
}
|
123
153
|
}
|
124
154
|
|
125
155
|
void say_image_target_bind(say_image_target *target) {
|
126
156
|
say_context_ensure();
|
127
|
-
|
157
|
+
|
158
|
+
/*
|
159
|
+
* As FBOs aren't shared, we need to fetch the FBO for the current context. If
|
160
|
+
* we don't find one, we need to build it.
|
161
|
+
*/
|
162
|
+
say_context *ctxt = say_context_current();
|
163
|
+
|
164
|
+
if (!mo_hash_has_key(target->fbos, &ctxt)) {
|
165
|
+
say_fbo tmp = {0, NULL, NULL};
|
166
|
+
mo_hash_set(target->fbos, &ctxt, &tmp);
|
167
|
+
|
168
|
+
say_fbo_build(target, mo_hash_get(target->fbos, &ctxt));
|
169
|
+
}
|
170
|
+
else {
|
171
|
+
say_fbo *fbo = mo_hash_get(target->fbos, &ctxt);
|
172
|
+
|
173
|
+
if (fbo->img != target->img && target->img)
|
174
|
+
say_fbo_build(target, fbo);
|
175
|
+
else
|
176
|
+
say_fbo_make_current(fbo->id);
|
177
|
+
}
|
178
|
+
|
179
|
+
/*
|
180
|
+
* Needed to avoid having garbage data there.
|
181
|
+
*/
|
128
182
|
glClear(GL_DEPTH_BUFFER_BIT);
|
129
183
|
}
|
130
184
|
|