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_target.h
CHANGED
@@ -10,6 +10,8 @@ typedef say_context *(*say_context_proc)(void *data);
|
|
10
10
|
typedef void (*say_bind_hook)(void *data);
|
11
11
|
|
12
12
|
typedef struct {
|
13
|
+
mo_array all_contexts;
|
14
|
+
|
13
15
|
say_thread_variable *context;
|
14
16
|
say_context_proc context_proc;
|
15
17
|
say_bind_hook bind_hook;
|
@@ -31,7 +33,7 @@ say_target *say_target_create();
|
|
31
33
|
void say_target_free(say_target *target);
|
32
34
|
|
33
35
|
void say_target_set_context_proc(say_target *target, say_context_proc proc);
|
34
|
-
void
|
36
|
+
void say_target_need_own_contet(say_target *target, uint8_t val);
|
35
37
|
say_context *say_target_get_context(say_target *target);
|
36
38
|
|
37
39
|
void say_target_set_bind_hook(say_target *target, say_bind_hook proc);
|
data/ext/say_text.c
CHANGED
@@ -69,6 +69,12 @@ static void say_text_update_rect(say_text *text) {
|
|
69
69
|
text->rect_size.y = height;
|
70
70
|
|
71
71
|
text->rect_updated = 1;
|
72
|
+
|
73
|
+
if (text->auto_center) {
|
74
|
+
say_vector2 center = say_make_vector2(text->rect_size.x * text->center.x,
|
75
|
+
text->rect_size.y * text->center.y);
|
76
|
+
say_drawable_set_origin(text->drawable, center);
|
77
|
+
}
|
72
78
|
}
|
73
79
|
|
74
80
|
static void say_text_compute_vertex_count(say_text *text) {
|
@@ -249,8 +255,7 @@ static void say_text_fill_vertices(void *data, void *vertices_ptr) {
|
|
249
255
|
}
|
250
256
|
}
|
251
257
|
|
252
|
-
static void say_text_draw(void *data, size_t first, size_t index
|
253
|
-
say_shader *shader) {
|
258
|
+
static void say_text_draw(void *data, size_t first, size_t index) {
|
254
259
|
say_text *text = (say_text*)data;
|
255
260
|
|
256
261
|
if (!text->font)
|
@@ -317,6 +322,7 @@ say_text *say_text_create() {
|
|
317
322
|
text->rect_size = say_make_vector2(0, 0);
|
318
323
|
text->rect_updated = 1;
|
319
324
|
text->underline_vertex = 0;
|
325
|
+
text->auto_center = false;
|
320
326
|
|
321
327
|
return text;
|
322
328
|
}
|
@@ -344,9 +350,15 @@ void say_text_copy(say_text *text, say_text *src) {
|
|
344
350
|
text->rect_size = src->rect_size;
|
345
351
|
text->rect_updated = src->rect_updated;
|
346
352
|
|
353
|
+
text->auto_center = src->auto_center;
|
354
|
+
text->center = src->center;
|
355
|
+
|
347
356
|
text->last_img_size = src->last_img_size;
|
348
357
|
|
349
358
|
text->underline_vertex = src->underline_vertex;
|
359
|
+
|
360
|
+
say_text_compute_vertex_count(text);
|
361
|
+
say_text_update_rect(text);
|
350
362
|
}
|
351
363
|
|
352
364
|
uint32_t *say_text_get_string(say_text *text) {
|
@@ -368,6 +380,9 @@ void say_text_set_string(say_text *text, uint32_t *string, size_t length) {
|
|
368
380
|
text->rect_updated = 0;
|
369
381
|
|
370
382
|
say_text_compute_vertex_count(text);
|
383
|
+
|
384
|
+
if (text->auto_center)
|
385
|
+
say_text_update_rect(text);
|
371
386
|
}
|
372
387
|
|
373
388
|
say_font *say_text_get_font(say_text *text) {
|
@@ -394,6 +409,9 @@ void say_text_set_size(say_text *text, size_t size) {
|
|
394
409
|
text->size = size;
|
395
410
|
say_drawable_set_changed(text->drawable);
|
396
411
|
text->rect_updated = 0;
|
412
|
+
|
413
|
+
if (text->auto_center)
|
414
|
+
say_text_update_rect(text);
|
397
415
|
}
|
398
416
|
|
399
417
|
uint8_t say_text_get_style(say_text *text) {
|
@@ -426,16 +444,36 @@ say_rect say_text_get_rect(say_text *text) {
|
|
426
444
|
if (!text->rect_updated)
|
427
445
|
say_text_update_rect(text);
|
428
446
|
|
429
|
-
say_vector2 pos
|
430
|
-
say_vector2
|
431
|
-
say_vector2
|
447
|
+
say_vector2 pos = say_drawable_get_pos(text->drawable);
|
448
|
+
say_vector2 origin = say_drawable_get_origin(text->drawable);
|
449
|
+
say_vector2 scale = say_drawable_get_scale(text->drawable);
|
450
|
+
say_vector2 size = text->rect_size;
|
432
451
|
|
433
452
|
say_rect rect = (say_rect){
|
434
|
-
pos.x,
|
435
|
-
pos.y,
|
453
|
+
-origin.x * scale.x + pos.x,
|
454
|
+
-origin.y * scale.y + pos.y,
|
436
455
|
size.x * scale.x,
|
437
456
|
size.y * scale.y
|
438
457
|
};
|
439
458
|
|
440
459
|
return rect;
|
441
460
|
}
|
461
|
+
|
462
|
+
bool say_text_auto_center(say_text *text) {
|
463
|
+
return text->auto_center;
|
464
|
+
}
|
465
|
+
|
466
|
+
say_vector2 say_text_get_auto_center_ratio(say_text *text) {
|
467
|
+
return text->center;
|
468
|
+
}
|
469
|
+
|
470
|
+
void say_text_enable_auto_center(say_text *text, say_vector2 center) {
|
471
|
+
text->auto_center = true;
|
472
|
+
text->center = center;
|
473
|
+
|
474
|
+
say_text_update_rect(text);
|
475
|
+
}
|
476
|
+
|
477
|
+
void say_text_disable_auto_center(say_text *text) {
|
478
|
+
text->auto_center = false;
|
479
|
+
}
|
data/ext/say_text.h
CHANGED
@@ -13,17 +13,20 @@ typedef struct {
|
|
13
13
|
say_drawable *drawable;
|
14
14
|
|
15
15
|
say_font *font;
|
16
|
-
size_t
|
16
|
+
size_t size;
|
17
17
|
|
18
18
|
uint32_t *string;
|
19
|
-
size_t
|
19
|
+
size_t str_length;
|
20
20
|
|
21
21
|
uint8_t style;
|
22
22
|
|
23
23
|
say_color color;
|
24
24
|
|
25
25
|
say_vector2 rect_size;
|
26
|
-
uint8_t
|
26
|
+
uint8_t rect_updated;
|
27
|
+
|
28
|
+
bool auto_center;
|
29
|
+
say_vector2 center;
|
27
30
|
|
28
31
|
say_vector2 last_img_size;
|
29
32
|
|
@@ -53,4 +56,10 @@ void say_text_set_color(say_text *text, say_color col);
|
|
53
56
|
|
54
57
|
say_rect say_text_get_rect(say_text *text);
|
55
58
|
|
59
|
+
bool say_text_auto_center(say_text *text);
|
60
|
+
say_vector2 say_text_get_auto_center_ratio(say_text *text);
|
61
|
+
void say_text_enable_auto_center(say_text *text, say_vector2 center);
|
62
|
+
void say_text_disable_auto_center(say_text *text);
|
63
|
+
|
64
|
+
|
56
65
|
#endif /* SAY_TEXT_H_ */
|
data/ext/say_thread.c
CHANGED
@@ -1,22 +1,24 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
3
|
#ifdef SAY_WIN
|
4
|
-
|
4
|
+
/* Windows threads */
|
5
|
+
|
6
|
+
static unsigned int say_thread_entry_point(void *data) {
|
5
7
|
say_thread *th = (say_thread*)data;
|
6
8
|
th->func(th->data);
|
7
9
|
_endthreadex(0);
|
8
|
-
|
10
|
+
|
9
11
|
return 0;
|
10
12
|
}
|
11
13
|
|
12
14
|
say_thread *say_thread_create(void *data, say_thread_func func) {
|
13
15
|
say_thread *th = malloc(sizeof(say_thread));
|
14
|
-
|
16
|
+
|
15
17
|
th->func = func;
|
16
18
|
th->data = data;
|
17
|
-
|
19
|
+
|
18
20
|
th->th = _beginthreadex(NULL, 0, say_thread_entry_point, th, 0, NULL);
|
19
|
-
|
21
|
+
|
20
22
|
return th;
|
21
23
|
}
|
22
24
|
|
@@ -28,7 +30,11 @@ void say_thread_free(say_thread *th) {
|
|
28
30
|
void say_thread_join(say_thread *th) {
|
29
31
|
WaitForSingleObject(th->th, INFINITE);
|
30
32
|
}
|
33
|
+
|
31
34
|
#else
|
35
|
+
|
36
|
+
/* POSIX threads */
|
37
|
+
|
32
38
|
say_thread *say_thread_create(void *data, say_thread_func func) {
|
33
39
|
say_thread *th = malloc(sizeof(say_thread));
|
34
40
|
pthread_create(&th->th, NULL, func, data);
|
@@ -43,4 +49,5 @@ void say_thread_free(say_thread *th) {
|
|
43
49
|
void say_thread_join(say_thread *th) {
|
44
50
|
pthread_join(th->th, NULL);
|
45
51
|
}
|
46
|
-
|
52
|
+
|
53
|
+
#endif
|
data/ext/say_thread.h
CHANGED
@@ -25,7 +25,7 @@ typedef struct {
|
|
25
25
|
} say_thread;
|
26
26
|
#endif
|
27
27
|
|
28
|
-
say_thread_variable *say_thread_variable_create(
|
28
|
+
say_thread_variable *say_thread_variable_create();
|
29
29
|
void say_thread_variable_free(say_thread_variable *var);
|
30
30
|
|
31
31
|
void say_thread_variable_set(say_thread_variable *var, void *val);
|
data/ext/say_thread_variable.c
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
3
|
#ifdef SAY_WIN
|
4
|
-
say_thread_variable *say_thread_variable_create(
|
4
|
+
say_thread_variable *say_thread_variable_create() {
|
5
5
|
say_thread_variable *var = malloc(sizeof(say_thread_variable));
|
6
6
|
var->key = TlsAlloc();
|
7
|
-
|
7
|
+
|
8
8
|
return var;
|
9
9
|
}
|
10
10
|
|
@@ -21,10 +21,10 @@ void *say_thread_variable_get(say_thread_variable *var) {
|
|
21
21
|
return TlsGetValue(var->key);
|
22
22
|
}
|
23
23
|
#else
|
24
|
-
say_thread_variable *say_thread_variable_create(
|
24
|
+
say_thread_variable *say_thread_variable_create() {
|
25
25
|
say_thread_variable *var = malloc(sizeof(say_thread_variable));
|
26
26
|
|
27
|
-
pthread_key_create(&(var->key),
|
27
|
+
pthread_key_create(&(var->key), NULL);
|
28
28
|
|
29
29
|
return var;
|
30
30
|
}
|
@@ -41,4 +41,4 @@ void say_thread_variable_set(say_thread_variable *var, void *val) {
|
|
41
41
|
void *say_thread_variable_get(say_thread_variable *var) {
|
42
42
|
return pthread_getspecific(var->key);
|
43
43
|
}
|
44
|
-
#endif
|
44
|
+
#endif
|
data/ext/say_vertex_type.c
CHANGED
@@ -1,27 +1,28 @@
|
|
1
1
|
#include "say.h"
|
2
2
|
|
3
|
-
static
|
3
|
+
static mo_array *say_vertex_types = NULL;
|
4
4
|
|
5
5
|
static void say_vertex_type_delete(say_vertex_type *type) {
|
6
|
-
|
6
|
+
mo_array_release(&type->elements);
|
7
7
|
}
|
8
8
|
|
9
9
|
static void say_vertex_elem_free(say_vertex_elem *elem) {
|
10
10
|
free(elem->name);
|
11
11
|
}
|
12
12
|
|
13
|
-
static
|
13
|
+
static mo_array *say_vertex_type_get_all() {
|
14
14
|
if (!say_vertex_types) {
|
15
|
-
say_vertex_types =
|
16
|
-
|
17
|
-
(say_destructor)say_vertex_type_delete);
|
15
|
+
say_vertex_types = mo_array_create(sizeof(say_vertex_type));
|
16
|
+
say_vertex_types->release = (say_destructor)say_vertex_type_delete;
|
18
17
|
|
19
18
|
say_vertex_type type;
|
20
|
-
type.elements
|
21
|
-
|
19
|
+
mo_array_init(&type.elements, sizeof(say_vertex_elem));
|
20
|
+
type.elements.release = (say_destructor)say_vertex_elem_free;
|
22
21
|
|
23
22
|
say_vertex_elem el;
|
24
23
|
|
24
|
+
el.per_instance = false;
|
25
|
+
|
25
26
|
el.type = SAY_VECTOR2;
|
26
27
|
el.name = say_strdup(SAY_POS_ATTR);
|
27
28
|
say_vertex_type_push(&type, el);
|
@@ -34,80 +35,117 @@ static say_array *say_vertex_type_get_all() {
|
|
34
35
|
el.name = say_strdup(SAY_TEX_COORD_ATTR);
|
35
36
|
say_vertex_type_push(&type, el);
|
36
37
|
|
37
|
-
|
38
|
+
mo_array_push(say_vertex_types, &type);
|
38
39
|
}
|
39
40
|
|
40
41
|
return say_vertex_types;
|
41
42
|
}
|
42
43
|
|
44
|
+
static size_t say_vertex_type_size_of(say_vertex_elem_type type) {
|
45
|
+
switch (type) {
|
46
|
+
case SAY_FLOAT: return sizeof(GLfloat);
|
47
|
+
case SAY_INT: return sizeof(GLint);
|
48
|
+
case SAY_UBYTE: return sizeof(GLubyte);
|
49
|
+
case SAY_BOOL: return sizeof(GLint);
|
50
|
+
|
51
|
+
case SAY_COLOR: return(sizeof(GLubyte) * 4);
|
52
|
+
case SAY_VECTOR2: return(sizeof(GLfloat) * 2);
|
53
|
+
case SAY_VECTOR3: return(sizeof(GLfloat) * 3);
|
54
|
+
}
|
55
|
+
|
56
|
+
return 0;
|
57
|
+
}
|
58
|
+
|
43
59
|
size_t say_vertex_type_make_new() {
|
44
60
|
say_vertex_type type;
|
45
|
-
type.elements
|
61
|
+
mo_array_init(&type.elements, sizeof(say_vertex_elem));
|
62
|
+
type.elements.release = (say_destructor)say_vertex_elem_free;
|
46
63
|
|
47
|
-
|
48
|
-
return
|
64
|
+
mo_array_push(say_vertex_type_get_all(), &type);
|
65
|
+
return say_vertex_types->size - 1;
|
49
66
|
}
|
50
67
|
|
51
68
|
say_vertex_type *say_get_vertex_type(size_t i) {
|
52
|
-
return
|
69
|
+
return mo_array_at(say_vertex_type_get_all(), i);
|
53
70
|
}
|
54
71
|
|
55
72
|
void say_vertex_type_push(say_vertex_type *type, say_vertex_elem elem) {
|
56
|
-
|
73
|
+
mo_array_push(&type->elements, &elem);
|
57
74
|
}
|
58
75
|
|
59
76
|
say_vertex_elem_type say_vertex_type_get_type(say_vertex_type *type, size_t i) {
|
60
|
-
return (
|
77
|
+
return mo_array_get_as(&type->elements, i, say_vertex_elem).type;
|
61
78
|
}
|
62
79
|
|
63
80
|
const char *say_vertex_type_get_name(say_vertex_type *type, size_t i) {
|
64
|
-
return (
|
81
|
+
return mo_array_get_as(&type->elements, i, say_vertex_elem).name;
|
82
|
+
}
|
83
|
+
|
84
|
+
bool say_vertex_type_is_per_instance(say_vertex_type *type, size_t i) {
|
85
|
+
return mo_array_get_as(&type->elements, i, say_vertex_elem).per_instance;
|
65
86
|
}
|
66
87
|
|
67
88
|
size_t say_vertex_type_get_elem_count(say_vertex_type *type) {
|
68
|
-
return
|
89
|
+
return type->elements.size;
|
69
90
|
}
|
70
91
|
|
71
92
|
size_t say_vertex_type_get_size(say_vertex_type *type) {
|
72
93
|
size_t sum = 0;
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
94
|
+
|
95
|
+
say_vertex_elem *end = mo_array_end(&type->elements);
|
96
|
+
for (say_vertex_elem *e = mo_array_at(&type->elements, 0);
|
97
|
+
e && e < end;
|
98
|
+
mo_array_next(&type->elements, (void**)&e)) {
|
99
|
+
if (e->per_instance)
|
100
|
+
continue;
|
101
|
+
sum += say_vertex_type_size_of(e->type);
|
102
|
+
}
|
103
|
+
|
104
|
+
return sum;
|
105
|
+
}
|
106
|
+
|
107
|
+
size_t say_vertex_type_get_instance_size(say_vertex_type *type) {
|
108
|
+
size_t sum = 0;
|
109
|
+
|
110
|
+
say_vertex_elem *end = mo_array_end(&type->elements);
|
111
|
+
for (say_vertex_elem *e = mo_array_at(&type->elements, 0);
|
112
|
+
e && e < end;
|
113
|
+
mo_array_next(&type->elements, (void**)&e)) {
|
114
|
+
if (!e->per_instance)
|
115
|
+
continue;
|
116
|
+
sum += say_vertex_type_size_of(e->type);
|
86
117
|
}
|
87
118
|
|
88
119
|
return sum;
|
89
120
|
}
|
90
121
|
|
91
122
|
size_t say_vertex_type_get_offset(say_vertex_type *type, size_t elem) {
|
123
|
+
bool per_instance = say_vertex_type_is_per_instance(type, elem);
|
124
|
+
|
92
125
|
size_t sum = 0;
|
93
126
|
for (size_t i = 0; i < elem; i++) {
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
case SAY_UBYTE: sum += sizeof(GLubyte); continue;
|
98
|
-
case SAY_BOOL: sum += sizeof(GLint); continue;
|
99
|
-
|
100
|
-
case SAY_COLOR: sum += sizeof(GLubyte) * 4; continue;
|
101
|
-
case SAY_VECTOR2: sum += sizeof(GLfloat) * 2; continue;
|
102
|
-
case SAY_VECTOR3: sum += sizeof(GLfloat) * 3; continue;
|
103
|
-
}
|
127
|
+
if (per_instance != say_vertex_type_is_per_instance(type, i))
|
128
|
+
continue;
|
129
|
+
sum += say_vertex_type_size_of(say_vertex_type_get_type(type, i));
|
104
130
|
}
|
105
131
|
|
106
132
|
return sum;
|
107
133
|
}
|
108
134
|
|
135
|
+
bool say_vertex_type_has_instance_data(say_vertex_type *type) {
|
136
|
+
say_vertex_elem *end = mo_array_end(&type->elements);
|
137
|
+
for (say_vertex_elem *e = mo_array_at(&type->elements, 0);
|
138
|
+
e && e < end;
|
139
|
+
mo_array_next(&type->elements, (void**)&e)) {
|
140
|
+
if (e->per_instance)
|
141
|
+
return true;
|
142
|
+
}
|
143
|
+
|
144
|
+
return false;
|
145
|
+
}
|
146
|
+
|
109
147
|
void say_vertex_type_clean_up() {
|
110
148
|
if (say_vertex_types)
|
111
|
-
|
149
|
+
mo_array_free(say_vertex_types);
|
112
150
|
say_vertex_types = NULL;
|
113
151
|
}
|
data/ext/say_vertex_type.h
CHANGED
@@ -17,10 +17,11 @@ typedef enum {
|
|
17
17
|
typedef struct {
|
18
18
|
say_vertex_elem_type type;
|
19
19
|
char *name;
|
20
|
+
bool per_instance;
|
20
21
|
} say_vertex_elem;
|
21
22
|
|
22
23
|
typedef struct {
|
23
|
-
|
24
|
+
mo_array elements;
|
24
25
|
} say_vertex_type;
|
25
26
|
|
26
27
|
size_t say_vertex_type_make_new();
|
@@ -31,9 +32,12 @@ void say_vertex_type_push(say_vertex_type *type, say_vertex_elem elem);
|
|
31
32
|
|
32
33
|
say_vertex_elem_type say_vertex_type_get_type(say_vertex_type *type, size_t i);
|
33
34
|
const char *say_vertex_type_get_name(say_vertex_type *type, size_t i);
|
35
|
+
bool say_vertex_type_is_per_instance(say_vertex_type *type, size_t i);
|
36
|
+
size_t say_vertex_type_get_offset(say_vertex_type *type, size_t elem);
|
34
37
|
size_t say_vertex_type_get_elem_count(say_vertex_type *type);
|
35
38
|
size_t say_vertex_type_get_size(say_vertex_type *type);
|
36
|
-
size_t
|
39
|
+
size_t say_vertex_type_get_instance_size(say_vertex_type *type);
|
40
|
+
bool say_vertex_type_has_instance_data(say_vertex_type *type);
|
37
41
|
|
38
42
|
void say_vertex_type_clean_up();
|
39
43
|
|