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_buffer.h
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
#define SAY_BUFFER_H_
|
3
3
|
|
4
4
|
#include "say_basic_type.h"
|
5
|
-
#include "say_array.h"
|
6
|
-
#include "say_table.h"
|
7
5
|
|
8
6
|
#define SAY_STATIC GL_STATIC_DRAW_ARB
|
9
7
|
#define SAY_STREAM GL_STREAM_DRAW_ARB
|
@@ -12,21 +10,28 @@
|
|
12
10
|
typedef struct {
|
13
11
|
size_t vtype;
|
14
12
|
|
15
|
-
GLuint vbo;
|
13
|
+
GLuint vbo, instance_vbo;
|
16
14
|
GLenum type;
|
17
15
|
|
18
|
-
|
16
|
+
mo_hash *vaos;
|
19
17
|
|
20
|
-
|
18
|
+
mo_array buffer, *instance_buffer;
|
21
19
|
} say_buffer;
|
22
20
|
|
23
21
|
say_buffer *say_buffer_create(size_t vtype, GLenum type, size_t size);
|
24
22
|
void say_buffer_free(say_buffer *buf);
|
25
23
|
|
24
|
+
bool say_buffer_has_instance(say_buffer *buf);
|
25
|
+
|
26
26
|
void *say_buffer_get_vertex(say_buffer *buf, size_t id);
|
27
|
+
void *say_buffer_get_instance(say_buffer *buf, size_t id);
|
27
28
|
|
28
29
|
void say_buffer_bind(say_buffer *buf);
|
30
|
+
void say_buffer_bind_vbo(say_buffer *buf);
|
31
|
+
void say_buffer_bind_instance_vbo(say_buffer *buf);
|
32
|
+
|
29
33
|
void say_buffer_unbind();
|
34
|
+
void say_buffer_unbind_vbo();
|
30
35
|
|
31
36
|
void say_buffer_update_part(say_buffer *buf, size_t index, size_t size);
|
32
37
|
void say_buffer_update(say_buffer *buf);
|
@@ -34,4 +39,14 @@ void say_buffer_update(say_buffer *buf);
|
|
34
39
|
size_t say_buffer_get_size(say_buffer *buf);
|
35
40
|
void say_buffer_resize(say_buffer *buf, size_t size);
|
36
41
|
|
42
|
+
void say_buffer_update_instance_part(say_buffer *buf, size_t index,
|
43
|
+
size_t size);
|
44
|
+
void say_buffer_update_instance(say_buffer *buf);
|
45
|
+
|
46
|
+
size_t say_buffer_get_instance_size(say_buffer *buf);
|
47
|
+
void say_buffer_resize_instance(say_buffer *buf, size_t size);
|
48
|
+
|
49
|
+
GLuint say_buffer_get_vbo(say_buffer *buf);
|
50
|
+
GLuint say_buffer_get_instance_vbo(say_buffer *buf);
|
51
|
+
|
37
52
|
#endif
|
data/ext/say_buffer_renderer.c
CHANGED
@@ -11,7 +11,8 @@ say_buffer_renderer *say_buffer_renderer_create(GLenum type,
|
|
11
11
|
|
12
12
|
renderer->buffer = say_buffer_create(vtype, type, 256);
|
13
13
|
renderer->index_buffer = say_index_buffer_create(type, 128);
|
14
|
-
|
14
|
+
|
15
|
+
mo_array_init(&renderer->drawables, sizeof(say_drawable*));
|
15
16
|
|
16
17
|
renderer->vtype = vtype;
|
17
18
|
|
@@ -23,14 +24,15 @@ say_buffer_renderer *say_buffer_renderer_create(GLenum type,
|
|
23
24
|
|
24
25
|
void say_buffer_renderer_free(say_buffer_renderer *renderer) {
|
25
26
|
say_buffer_free(renderer->buffer);
|
26
|
-
|
27
|
+
say_index_buffer_free(renderer->index_buffer);
|
28
|
+
mo_array_release(&renderer->drawables);
|
27
29
|
free(renderer);
|
28
30
|
}
|
29
31
|
|
30
32
|
void say_buffer_renderer_clear(say_buffer_renderer *renderer) {
|
31
33
|
renderer->current_vertex = 0;
|
32
34
|
renderer->current_index = 0;
|
33
|
-
|
35
|
+
mo_array_resize(&renderer->drawables, 0);
|
34
36
|
}
|
35
37
|
|
36
38
|
bool say_buffer_renderer_push(say_buffer_renderer *renderer,
|
@@ -58,7 +60,7 @@ bool say_buffer_renderer_push(say_buffer_renderer *renderer,
|
|
58
60
|
else if (current_size < index_new_size)
|
59
61
|
say_index_buffer_resize(renderer->index_buffer, current_size * 2);
|
60
62
|
|
61
|
-
|
63
|
+
mo_array_push(&renderer->drawables, &drawable);
|
62
64
|
|
63
65
|
say_drawable_fill_buffer(drawable,
|
64
66
|
say_buffer_get_vertex(renderer->buffer,
|
@@ -83,14 +85,15 @@ void say_buffer_renderer_update(say_buffer_renderer *renderer) {
|
|
83
85
|
void say_buffer_renderer_render(say_buffer_renderer *renderer,
|
84
86
|
say_shader *shader) {
|
85
87
|
say_buffer_bind(renderer->buffer);
|
88
|
+
say_index_buffer_bind(renderer->index_buffer);
|
86
89
|
|
87
90
|
int using_texture = 0;
|
88
91
|
say_shader_set_int_id(shader, SAY_TEXTURE_ENABLED_LOC_ID, 0);
|
89
92
|
|
90
93
|
size_t current_vertex = 0, current_index = 0;
|
91
|
-
for (size_t i = 0; i <
|
92
|
-
say_drawable
|
93
|
-
|
94
|
+
for (size_t i = 0; i < renderer->drawables.size; i++) {
|
95
|
+
say_drawable *drawable = mo_array_get_as(&renderer->drawables, i,
|
96
|
+
say_drawable*);
|
94
97
|
|
95
98
|
if (!drawable->shader &&
|
96
99
|
using_texture != say_drawable_is_textured(drawable)) {
|
data/ext/say_buffer_renderer.h
CHANGED
data/ext/say_buffer_slice.c
CHANGED
@@ -13,53 +13,51 @@ typedef struct {
|
|
13
13
|
|
14
14
|
typedef struct {
|
15
15
|
say_buffer *buf;
|
16
|
-
|
16
|
+
mo_list *ranges;
|
17
17
|
} say_global_buffer;
|
18
18
|
|
19
|
-
static
|
19
|
+
static mo_array *say_global_buffers = NULL;
|
20
20
|
|
21
21
|
static void say_global_buffer_free(say_global_buffer *buf) {
|
22
22
|
say_buffer_free(buf->buf);
|
23
|
-
|
23
|
+
if (buf->ranges) mo_list_free(buf->ranges);
|
24
24
|
}
|
25
25
|
|
26
|
-
static say_global_buffer *say_global_buffer_create(
|
26
|
+
static say_global_buffer *say_global_buffer_create(mo_array *bufs,
|
27
27
|
size_t vtype, size_t size) {
|
28
28
|
say_global_buffer buffer;
|
29
29
|
|
30
30
|
buffer.buf = say_buffer_create(vtype, SAY_STREAM, size);
|
31
|
-
buffer.ranges =
|
31
|
+
buffer.ranges = NULL;
|
32
32
|
|
33
|
-
|
33
|
+
mo_array_push(bufs, &buffer);
|
34
34
|
|
35
|
-
return
|
35
|
+
return mo_array_at(bufs, bufs->size - 1);
|
36
36
|
}
|
37
37
|
|
38
38
|
|
39
|
-
static void say_global_buffer_array_alloc(
|
40
|
-
|
41
|
-
|
42
|
-
NULL);
|
39
|
+
static void say_global_buffer_array_alloc(mo_array *ary) {
|
40
|
+
mo_array_init(ary, sizeof(say_global_buffer));
|
41
|
+
ary->release = (say_destructor)say_global_buffer_free;
|
43
42
|
}
|
44
43
|
|
45
|
-
static void say_global_buffer_array_free(
|
46
|
-
|
47
|
-
say_array_free(*ary);
|
44
|
+
static void say_global_buffer_array_free(mo_array *ary) {
|
45
|
+
mo_array_release(ary);
|
48
46
|
}
|
49
47
|
|
50
|
-
static size_t
|
51
|
-
|
52
|
-
|
53
|
-
|
48
|
+
static size_t say_global_buffer_prepend(say_global_buffer *buf, size_t n) {
|
49
|
+
say_range range = say_make_range(0, n);
|
50
|
+
buf->ranges = mo_list_prepend(buf->ranges, &range);
|
51
|
+
return 0;
|
52
|
+
}
|
54
53
|
|
55
|
-
|
54
|
+
static size_t say_global_buffer_insert(mo_list *list, size_t n) {
|
55
|
+
say_range *previous = mo_list_data_ptr(list, say_range);
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
range->loc = prev->loc + prev->size;
|
60
|
-
}
|
57
|
+
say_range range = say_make_range(previous->loc + previous->size, n);
|
58
|
+
mo_list_insert(list, &range);
|
61
59
|
|
62
|
-
return range
|
60
|
+
return range.loc;
|
63
61
|
}
|
64
62
|
|
65
63
|
static size_t say_global_buffer_find(say_global_buffer *buf, size_t n) {
|
@@ -67,95 +65,92 @@ static size_t say_global_buffer_find(say_global_buffer *buf, size_t n) {
|
|
67
65
|
if (n > say_buffer_get_size(buf->buf))
|
68
66
|
return SAY_MAX_SIZE;
|
69
67
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
if (ary_size == 0 || first->loc >= n) {
|
75
|
-
return say_global_buffer_add_range_before(buf, 0, n);
|
68
|
+
if (!buf->ranges) {
|
69
|
+
buf->ranges = mo_list_create(sizeof(say_range));
|
70
|
+
say_range *range = mo_list_data_ptr(buf->ranges, say_range);
|
71
|
+
*range = say_make_range(0, n);
|
76
72
|
}
|
77
73
|
|
78
|
-
say_range *
|
74
|
+
say_range *first = mo_list_data_ptr(buf->ranges, say_range);
|
79
75
|
|
80
|
-
|
81
|
-
|
76
|
+
/* There's room at the begin of the buffer */
|
77
|
+
if (first->loc >= n)
|
78
|
+
return say_global_buffer_prepend(buf, 0);
|
79
|
+
|
80
|
+
mo_list *it = buf->ranges;
|
81
|
+
for (; it->next; it = it->next) { /* stop before last element */
|
82
|
+
say_range *current = mo_list_data_ptr(it, say_range);
|
83
|
+
say_range *next = mo_list_data_ptr(it->next, say_range);
|
82
84
|
|
83
85
|
size_t begin = current->loc + current->size;
|
84
86
|
size_t end = next->loc;
|
85
87
|
|
86
88
|
/* There's enough room between those two elements */
|
87
|
-
if (end - begin >= n)
|
88
|
-
return
|
89
|
-
}
|
90
|
-
|
91
|
-
current = next;
|
89
|
+
if (end - begin >= n)
|
90
|
+
return say_global_buffer_insert(it, n);
|
92
91
|
}
|
93
92
|
|
94
|
-
say_range *last =
|
93
|
+
say_range *last = mo_list_data_ptr(it, say_range);
|
95
94
|
|
96
95
|
/* There's enough room at the end of the buffer */
|
97
96
|
if ((last->loc + last->size + n) < say_buffer_get_size(buf->buf)) {
|
98
|
-
return
|
97
|
+
return say_global_buffer_insert(it, n);
|
99
98
|
}
|
100
99
|
|
101
100
|
/* Not enough room here */
|
102
101
|
return SAY_MAX_SIZE;
|
103
102
|
}
|
104
103
|
|
105
|
-
static void say_global_buffer_delete_at(say_global_buffer *buf, size_t loc
|
104
|
+
static void say_global_buffer_delete_at(say_global_buffer *buf, size_t loc,
|
105
|
+
size_t range_size) {
|
106
106
|
if (!buf)
|
107
107
|
return;
|
108
108
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
}
|
109
|
+
for (mo_list *it = buf->ranges; it; it = it->next) {
|
110
|
+
say_range *range = mo_list_data_ptr(it, say_range);
|
111
|
+
if (range->loc == loc && range->size == range_size) {
|
112
|
+
mo_list *next = it->next;
|
113
|
+
mo_list_delete(it);
|
115
114
|
|
116
|
-
|
117
|
-
return; /* Element could not be found */
|
115
|
+
if (it == buf->ranges) buf->ranges = next;
|
118
116
|
|
119
|
-
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
}
|
120
120
|
}
|
121
121
|
|
122
122
|
static void say_global_buffer_reduce_size(say_global_buffer *buf, size_t loc,
|
123
|
-
size_t size) {
|
124
|
-
for (
|
125
|
-
|
126
|
-
if (range->loc == loc) {
|
123
|
+
size_t old_size, size_t size) {
|
124
|
+
for (mo_list *it = buf->ranges; it; it = it->next) {
|
125
|
+
say_range *range = mo_list_data_ptr(it, say_range);
|
126
|
+
if (range->loc == loc && range->size == size) {
|
127
127
|
range->size = size;
|
128
128
|
return;
|
129
129
|
}
|
130
130
|
}
|
131
131
|
}
|
132
132
|
|
133
|
-
static size_t say_global_buffer_reserve(size_t vtype, size_t size,
|
133
|
+
static size_t say_global_buffer_reserve(size_t vtype, size_t size,
|
134
|
+
size_t *ret_id) {
|
134
135
|
if (!say_global_buffers) {
|
135
|
-
say_global_buffers =
|
136
|
-
|
137
|
-
|
136
|
+
say_global_buffers = mo_array_create(sizeof(mo_array));
|
137
|
+
say_global_buffers->init = (mo_init)say_global_buffer_array_alloc;
|
138
|
+
say_global_buffers->release = (mo_release)say_global_buffer_array_free;
|
138
139
|
}
|
139
140
|
|
140
|
-
if (
|
141
|
-
|
141
|
+
if (say_global_buffers->size <= vtype) {
|
142
|
+
mo_array_resize(say_global_buffers, vtype + 1);
|
142
143
|
}
|
143
144
|
|
144
|
-
|
145
|
-
vtype);
|
145
|
+
mo_array *global_bufs = mo_array_get_ptr(say_global_buffers, vtype, mo_array);
|
146
146
|
|
147
|
-
size_t i = 0;
|
148
|
-
|
149
|
-
buf;
|
150
|
-
say_array_next(global_bufs, (void**)&buf)) {
|
151
|
-
size_t res = say_global_buffer_find(buf, size);
|
147
|
+
for (size_t i = 0; i < global_bufs->size; i++) {
|
148
|
+
size_t res = say_global_buffer_find(mo_array_at(global_bufs, i), size);
|
152
149
|
|
153
150
|
if (res != SAY_MAX_SIZE) {
|
154
151
|
*ret_id = i;
|
155
152
|
return res;
|
156
153
|
}
|
157
|
-
|
158
|
-
i++;
|
159
154
|
}
|
160
155
|
|
161
156
|
/* Existing buffers can't store this object, save it somewhere else */
|
@@ -169,7 +164,7 @@ static size_t say_global_buffer_reserve(size_t vtype, size_t size, size_t *ret_i
|
|
169
164
|
say_global_buffer *buf = say_global_buffer_create(global_bufs,
|
170
165
|
vtype,
|
171
166
|
buf_size);
|
172
|
-
*ret_id =
|
167
|
+
*ret_id = global_bufs->size - 1;
|
173
168
|
return say_global_buffer_find(buf, size);
|
174
169
|
}
|
175
170
|
|
@@ -177,8 +172,7 @@ static say_global_buffer *say_global_buffer_at(size_t vtype, size_t id) {
|
|
177
172
|
if (!say_global_buffers)
|
178
173
|
return NULL;
|
179
174
|
|
180
|
-
return
|
181
|
-
id);
|
175
|
+
return mo_array_at(mo_array_at(say_global_buffers, vtype), id);
|
182
176
|
}
|
183
177
|
|
184
178
|
say_buffer_slice *say_buffer_slice_create(size_t vtype, size_t size) {
|
@@ -191,7 +185,7 @@ say_buffer_slice *say_buffer_slice_create(size_t vtype, size_t size) {
|
|
191
185
|
|
192
186
|
void say_buffer_slice_free(say_buffer_slice *slice) {
|
193
187
|
say_global_buffer_delete_at(say_global_buffer_at(slice->vtype, slice->buf_id),
|
194
|
-
slice->loc);
|
188
|
+
slice->loc, slice->size);
|
195
189
|
free(slice);
|
196
190
|
}
|
197
191
|
|
@@ -203,14 +197,14 @@ void say_buffer_slice_recreate(say_buffer_slice *slice, size_t size) {
|
|
203
197
|
if (size > slice->size) {
|
204
198
|
say_global_buffer_delete_at(say_global_buffer_at(slice->vtype,
|
205
199
|
slice->buf_id),
|
206
|
-
slice->loc);
|
200
|
+
slice->loc, slice->size);
|
207
201
|
|
208
202
|
slice->loc = say_global_buffer_reserve(slice->vtype, size, &slice->buf_id);
|
209
203
|
}
|
210
204
|
else {
|
211
205
|
say_global_buffer_reduce_size(say_global_buffer_at(slice->vtype,
|
212
206
|
slice->buf_id),
|
213
|
-
slice->loc, size);
|
207
|
+
slice->loc, slice->size, size);
|
214
208
|
}
|
215
209
|
|
216
210
|
slice->size = size;
|
@@ -241,7 +235,7 @@ void say_buffer_slice_bind(say_buffer_slice *slice) {
|
|
241
235
|
|
242
236
|
void say_buffer_slice_clean_up() {
|
243
237
|
if (say_global_buffers) {
|
244
|
-
|
238
|
+
mo_array_free(say_global_buffers);
|
245
239
|
say_global_buffers = NULL;
|
246
240
|
}
|
247
241
|
}
|
data/ext/say_context.c
CHANGED
@@ -17,6 +17,8 @@ static say_context *say_shared_context = NULL;
|
|
17
17
|
static say_thread_variable *say_current_context = NULL;
|
18
18
|
static say_thread_variable *say_ensured_context = NULL;
|
19
19
|
|
20
|
+
static mo_array *say_all_ensured_contexts = NULL;
|
21
|
+
|
20
22
|
static void say_context_create_initial();
|
21
23
|
static void say_context_setup(say_context *context);
|
22
24
|
static void say_context_setup_states(say_context *context);
|
@@ -24,18 +26,36 @@ static void say_context_glew_init();
|
|
24
26
|
|
25
27
|
static uint32_t say_context_count = 0;
|
26
28
|
|
29
|
+
say_context_config *say_context_get_config() {
|
30
|
+
static say_context_config conf = {
|
31
|
+
24, 0, /* 24 bit depth buffer, no stencil buffer */
|
32
|
+
2, 1, /* Anything older than 3.x doesn't matter */
|
33
|
+
false, /* Let user call deprecated features */
|
34
|
+
false /* Disable debugging */
|
35
|
+
};
|
36
|
+
|
37
|
+
return &conf;
|
38
|
+
}
|
39
|
+
|
40
|
+
void say_context_free_el(void *context) {
|
41
|
+
say_context_free(*(say_context**)context);
|
42
|
+
}
|
43
|
+
|
27
44
|
say_context *say_context_current() {
|
28
45
|
if (!say_current_context) {
|
29
|
-
say_current_context = say_thread_variable_create(
|
46
|
+
say_current_context = say_thread_variable_create();
|
30
47
|
}
|
31
48
|
|
32
49
|
return (say_context*)say_thread_variable_get(say_current_context);
|
33
50
|
}
|
34
51
|
|
35
52
|
void say_context_ensure() {
|
36
|
-
if (!say_ensured_context)
|
37
|
-
say_ensured_context =
|
38
|
-
|
53
|
+
if (!say_ensured_context)
|
54
|
+
say_ensured_context = say_thread_variable_create();
|
55
|
+
|
56
|
+
if (!say_all_ensured_contexts) {
|
57
|
+
say_all_ensured_contexts = mo_array_create(sizeof(say_context*));
|
58
|
+
say_all_ensured_contexts->release = say_context_free_el;
|
39
59
|
}
|
40
60
|
|
41
61
|
if (!say_context_current()) {
|
@@ -44,6 +64,7 @@ void say_context_ensure() {
|
|
44
64
|
if (!context) {
|
45
65
|
context = say_context_create();
|
46
66
|
say_thread_variable_set(say_ensured_context, context);
|
67
|
+
mo_array_push(say_all_ensured_contexts, &context);
|
47
68
|
}
|
48
69
|
|
49
70
|
say_context_make_current(context);
|
@@ -103,19 +124,14 @@ static void say_context_create_initial() {
|
|
103
124
|
say_shared_context = (say_context*)malloc(sizeof(say_context));
|
104
125
|
|
105
126
|
say_context_setup(say_shared_context);
|
106
|
-
say_context_setup_states(say_shared_context);
|
107
|
-
|
108
127
|
say_context_make_current(say_shared_context);
|
109
128
|
say_context_glew_init();
|
110
129
|
|
111
130
|
/* Identify GLSL version to be used */
|
112
131
|
const GLubyte *str = glGetString(GL_SHADING_LANGUAGE_VERSION);
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
if (str && (str[0] > (GLubyte)'1' || str[2] >= (GLubyte)'4')) {
|
117
|
-
say_shader_enable_new_glsl();
|
118
|
-
}
|
132
|
+
if (str && (str[0] > (GLubyte)'1' || str[2] >= (GLubyte)'3') &&
|
133
|
+
glBindFragDataLocation) {
|
134
|
+
say_shader_enable_new_glsl();
|
119
135
|
}
|
120
136
|
}
|
121
137
|
|
@@ -141,23 +157,94 @@ static void say_context_setup_states(say_context *context) {
|
|
141
157
|
}
|
142
158
|
|
143
159
|
void say_context_clean_up() {
|
144
|
-
if (
|
145
|
-
|
160
|
+
if (say_all_ensured_contexts)
|
161
|
+
mo_array_free(say_all_ensured_contexts);
|
146
162
|
|
147
163
|
if (say_ensured_context)
|
148
164
|
say_thread_variable_free(say_ensured_context);
|
149
165
|
|
150
|
-
say_current_context
|
151
|
-
|
166
|
+
if (say_current_context)
|
167
|
+
say_thread_variable_free(say_current_context);
|
168
|
+
|
169
|
+
say_current_context = NULL;
|
170
|
+
say_ensured_context = NULL;
|
171
|
+
say_all_ensured_contexts = NULL;
|
152
172
|
}
|
153
173
|
|
154
174
|
static void say_context_glew_init() {
|
175
|
+
/*
|
176
|
+
* Fetch any proc we can.
|
177
|
+
*/
|
178
|
+
glewExperimental = true;
|
155
179
|
glewInit();
|
156
180
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
181
|
+
/**
|
182
|
+
* Load needed extensions.
|
183
|
+
*
|
184
|
+
* We need to replace pointers for code to work both using OpenGL core
|
185
|
+
* features and extensions.
|
186
|
+
*/
|
187
|
+
|
188
|
+
#define replace(old, new) \
|
189
|
+
if (!new && old) \
|
190
|
+
new = old;
|
191
|
+
|
192
|
+
/* Shaders */
|
193
|
+
replace(glCreateShaderObjectARB, glCreateShader);
|
194
|
+
replace(glShaderSourceARB, glShaderSource);
|
195
|
+
replace(glCompileShaderARB, glCompileShader);
|
196
|
+
replace(glGetObjectParameterivARB, glGetShaderiv);
|
197
|
+
replace(glGetObjectParameterivARB, glGetProgramiv);
|
198
|
+
replace(glGetInfoLogARB, glGetShaderInfoLog);
|
199
|
+
replace(glGetInfoLogARB, glGetProgramInfoLog);
|
200
|
+
replace(glGetUniformLocationARB, glGetUniformLocation);
|
201
|
+
replace(glCreateProgramObjectARB, glCreateProgram)
|
202
|
+
replace(glAttachObjectARB, glAttachShader);
|
203
|
+
replace(glDetachObjectARB, glDetachShader);
|
204
|
+
replace(glBindAttribLocationARB, glBindAttribLocation);
|
205
|
+
replace(glBindFragDataLocationEXT, glBindFragDataLocation);
|
206
|
+
replace(glLinkProgramARB, glLinkProgram);
|
207
|
+
replace(glUseProgramObjectARB, glUseProgram);
|
208
|
+
replace(glDeleteObjectARB, glDeleteShader);
|
209
|
+
replace(glDeleteObjectARB, glDeleteProgram);
|
210
|
+
replace(glUniform1iARB, glUniform1i);
|
211
|
+
replace(glUniform1fARB, glUniform1f);
|
212
|
+
replace(glUniform2fARB, glUniform2f);
|
213
|
+
replace(glUniform3fARB, glUniform3f);
|
214
|
+
replace(glUniform1fvARB, glUniform1fv);
|
215
|
+
replace(glUniform2fvARB, glUniform2fv);
|
216
|
+
replace(glUniform3fvARB, glUniform3fv);
|
217
|
+
replace(glUniform4fvARB, glUniform4fv);
|
218
|
+
replace(glUniformMatrix4fvARB, glUniformMatrix4fv);
|
219
|
+
|
220
|
+
/* Buffers */
|
221
|
+
replace(glGenBuffersARB, glGenBuffers);
|
222
|
+
replace(glDeleteBuffersARB, glDeleteBuffersARB);
|
223
|
+
replace(glBindBufferARB, glBindBuffer);
|
224
|
+
replace(glBufferDataARB, glBufferData);
|
225
|
+
replace(glBufferSubDataARB, glBufferSubData);
|
226
|
+
replace(glGetBufferSubDataARB, glGetBufferSubData);
|
227
|
+
|
228
|
+
/* Vertex attribs */
|
229
|
+
replace(glVertexAttribPointerARB, glVertexAttribPointer);
|
230
|
+
replace(glEnableVertexAttribArrayARB, glEnableVertexAttribArray);
|
231
|
+
replace(glVertexAttribDivisorARB, glVertexAttribDivisor);
|
232
|
+
replace(glGetVertexAttribivARB, glGetVertexAttribiv);
|
233
|
+
replace(glDisableVertexAttribArrayARB, glDisableVertexAttribArray);
|
234
|
+
|
235
|
+
/* Framebuffer objects */
|
236
|
+
replace(glGenFramebuffersEXT, glGenFramebuffers);
|
237
|
+
replace(glDeleteFramebuffersEXT, glDeleteFramebuffers);
|
238
|
+
replace(glBindFramebufferEXT, glBindFramebuffer);
|
239
|
+
replace(glFramebufferTexture2DEXT, glFramebufferTexture2D);
|
240
|
+
replace(glFramebufferRenderbufferEXT, glFramebufferRenderbuffer);
|
241
|
+
|
242
|
+
/* Renderbuffer objects */
|
243
|
+
replace(glGenRenderbuffersEXT, glGenRenderbuffers);
|
244
|
+
replace(glDeleteRenderbuffersEXT, glDeleteRenderbuffers);
|
245
|
+
replace(glBindRenderbufferEXT, glBindRenderbuffer);
|
246
|
+
replace(glRenderbufferStorageEXT, glRenderbufferStorage);
|
247
|
+
|
248
|
+
/* Mipmaps */
|
249
|
+
replace(glGenerateMipmapEXT, glGenerateMipmap);
|
163
250
|
}
|