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.
Files changed (167) hide show
  1. data/README.md +9 -6
  2. data/Rakefile +1 -5
  3. data/ext/audio.c +25 -19
  4. data/ext/audio_source.c +67 -39
  5. data/ext/color.c +19 -19
  6. data/ext/drawable.c +190 -31
  7. data/ext/extconf.rb +16 -14
  8. data/ext/gl.c +310 -30
  9. data/ext/gl_buffer.c +223 -2
  10. data/ext/gl_index_buffer.c +11 -0
  11. data/ext/gl_int_array.c +24 -22
  12. data/ext/gl_vertex.c +84 -49
  13. data/ext/image.c +115 -51
  14. data/ext/image_target.c +58 -10
  15. data/ext/input.c +73 -6
  16. data/ext/mo.c +583 -0
  17. data/ext/mo.h +189 -0
  18. data/ext/music.c +9 -8
  19. data/ext/pixel_bus.c +349 -0
  20. data/ext/polygon.c +68 -45
  21. data/ext/ray.c +1 -0
  22. data/ext/ray.h +19 -1
  23. data/ext/rect.c +9 -47
  24. data/ext/say.h +1 -2
  25. data/ext/say_all.h +6 -0
  26. data/ext/say_audio.h +3 -0
  27. data/ext/say_audio_context.c +1 -4
  28. data/ext/say_basic_type.c +24 -0
  29. data/ext/say_basic_type.h +4 -0
  30. data/ext/say_buffer.c +217 -88
  31. data/ext/say_buffer.h +20 -5
  32. data/ext/say_buffer_renderer.c +10 -7
  33. data/ext/say_buffer_renderer.h +1 -1
  34. data/ext/say_buffer_slice.c +70 -76
  35. data/ext/say_context.c +109 -22
  36. data/ext/say_context.h +14 -0
  37. data/ext/say_drawable.c +113 -25
  38. data/ext/say_drawable.h +23 -2
  39. data/ext/say_error.c +7 -2
  40. data/ext/say_font.c +30 -27
  41. data/ext/say_font.h +3 -6
  42. data/ext/say_get_proc.c +35 -0
  43. data/ext/say_image.c +102 -27
  44. data/ext/say_image.h +11 -4
  45. data/ext/say_image_target.c +88 -34
  46. data/ext/say_image_target.h +3 -2
  47. data/ext/say_index_buffer.c +31 -19
  48. data/ext/say_index_buffer.h +4 -2
  49. data/ext/say_index_buffer_slice.c +78 -70
  50. data/ext/say_music.c +4 -2
  51. data/ext/say_osx.h +3 -2
  52. data/ext/say_osx_context.h +37 -4
  53. data/ext/say_osx_window.h +32 -37
  54. data/ext/say_pixel_bus.c +163 -0
  55. data/ext/say_pixel_bus.h +44 -0
  56. data/ext/say_polygon.c +2 -2
  57. data/ext/say_shader.c +66 -62
  58. data/ext/say_shader.h +2 -0
  59. data/ext/say_sprite.c +1 -2
  60. data/ext/say_target.c +14 -23
  61. data/ext/say_target.h +3 -1
  62. data/ext/say_text.c +45 -7
  63. data/ext/say_text.h +12 -3
  64. data/ext/say_thread.c +13 -6
  65. data/ext/say_thread.h +1 -1
  66. data/ext/say_thread_variable.c +5 -5
  67. data/ext/say_vertex_type.c +79 -41
  68. data/ext/say_vertex_type.h +6 -2
  69. data/ext/say_view.c +10 -31
  70. data/ext/say_view.h +1 -5
  71. data/ext/say_win.h +2 -2
  72. data/ext/say_win_context.h +49 -11
  73. data/ext/say_win_window.h +30 -27
  74. data/ext/say_window.c +3 -3
  75. data/ext/say_x11.h +3 -1
  76. data/ext/say_x11_context.h +64 -10
  77. data/ext/say_x11_window.h +22 -17
  78. data/ext/shader.c +9 -0
  79. data/ext/sprite.c +7 -1
  80. data/ext/target.c +80 -28
  81. data/ext/text.c +43 -1
  82. data/ext/view.c +53 -1
  83. data/ext/window.c +4 -0
  84. data/lib/ray/animation_list.rb +17 -2
  85. data/lib/ray/audio_source.rb +11 -0
  86. data/lib/ray/color.rb +14 -0
  87. data/lib/ray/drawable.rb +23 -0
  88. data/lib/ray/dsl/event.rb +1 -9
  89. data/lib/ray/dsl/event_runner.rb +3 -4
  90. data/lib/ray/dsl/matcher.rb +20 -1
  91. data/lib/ray/effect.rb +116 -0
  92. data/lib/ray/effect/black_and_white.rb +38 -0
  93. data/lib/ray/effect/color_inversion.rb +16 -0
  94. data/lib/ray/effect/generator.rb +145 -0
  95. data/lib/ray/effect/grayscale.rb +32 -0
  96. data/lib/ray/game.rb +25 -5
  97. data/lib/ray/gl/vertex.rb +105 -26
  98. data/lib/ray/helper.rb +5 -0
  99. data/lib/ray/image.rb +54 -13
  100. data/lib/ray/image_target.rb +7 -0
  101. data/lib/ray/matrix.rb +26 -0
  102. data/lib/ray/music.rb +4 -0
  103. data/lib/ray/pixel_bus.rb +22 -0
  104. data/lib/ray/polygon.rb +17 -0
  105. data/lib/ray/pp.rb +28 -0
  106. data/lib/ray/ray.rb +7 -1
  107. data/lib/ray/rect.rb +7 -13
  108. data/lib/ray/scene.rb +24 -5
  109. data/lib/ray/scene_list.rb +9 -0
  110. data/lib/ray/shader.rb +11 -2
  111. data/lib/ray/sound.rb +4 -0
  112. data/lib/ray/sprite.rb +23 -62
  113. data/lib/ray/target.rb +25 -0
  114. data/lib/ray/text.rb +10 -0
  115. data/lib/ray/turtle.rb +9 -3
  116. data/lib/ray/vector.rb +18 -0
  117. data/lib/ray/vertex.rb +6 -0
  118. data/lib/ray/view.rb +22 -0
  119. data/samples/animation/sprite_motion.rb +0 -60
  120. data/samples/audio/{spacial.rb → spatial.rb} +1 -1
  121. data/samples/buffer/buffer.rb +1 -0
  122. data/samples/buffer/index_buffer.rb +2 -0
  123. data/samples/cptn_ruby/cptn_ruby.rb +6 -7
  124. data/samples/effects/effect.rb +39 -0
  125. data/samples/effects/grayscale.rb +27 -0
  126. data/samples/opengl/image.rb +7 -5
  127. data/samples/opengl/instancing.rb +159 -0
  128. data/samples/opengl/instancing.rbc +3231 -0
  129. data/samples/opengl/obj_loader.rb +9 -8
  130. data/samples/opengl/shader.rb +1 -3
  131. data/samples/shaders/geometry.rb +108 -38
  132. data/samples/shaders/geometry.rbc +2074 -0
  133. data/samples/shaders/shape.rb +2 -2
  134. data/samples/starfighter/starfighter.rb +5 -5
  135. data/samples/window/get_pixel.rb +1 -1
  136. data/test/animation_list_test.rb +18 -4
  137. data/test/drawable_test.rb +70 -1
  138. data/test/effect_generator_test.rb +63 -0
  139. data/test/effect_test.rb +61 -0
  140. data/test/game_test.rb +18 -0
  141. data/test/gl_buffer_test.rb +43 -1
  142. data/test/gl_index_buffer_test.rb +5 -0
  143. data/test/gl_vertex_test.rb +28 -1
  144. data/test/image_test.rb +5 -5
  145. data/test/input_test.rb +49 -0
  146. data/test/pixel_bus_test.rb +28 -0
  147. data/test/rect_test.rb +4 -0
  148. data/{samples/_media → test/res}/Beep.wav +0 -0
  149. data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
  150. data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
  151. data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
  152. data/{samples/_media → test/res}/CptnRuby.png +0 -0
  153. data/{samples/_media → test/res}/Space.png +0 -0
  154. data/{samples/_media → test/res}/Star.png +0 -0
  155. data/{samples/_media → test/res}/Starfighter.png +0 -0
  156. data/test/res/cube.obj +28 -0
  157. data/test/res/light3d.c +2 -2
  158. data/test/res/stone.png +0 -0
  159. data/test/scene_test.rb +3 -0
  160. data/test/sprite_test.rb +10 -0
  161. data/test/text_test.rb +31 -2
  162. data/test/view_test.rb +13 -1
  163. metadata +38 -17
  164. data/ext/say_array.c +0 -124
  165. data/ext/say_array.h +0 -34
  166. data/ext/say_table.c +0 -86
  167. data/ext/say_table.h +0 -24
@@ -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 say_target_need_own_contxt(say_target *target, uint8_t val);
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);
@@ -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 = say_drawable_get_pos(text->drawable);
430
- say_vector2 scale = say_drawable_get_scale(text->drawable);
431
- say_vector2 size = text->rect_size;
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
+ }
@@ -13,17 +13,20 @@ typedef struct {
13
13
  say_drawable *drawable;
14
14
 
15
15
  say_font *font;
16
- size_t size;
16
+ size_t size;
17
17
 
18
18
  uint32_t *string;
19
- size_t str_length;
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 rect_updated;
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_ */
@@ -1,22 +1,24 @@
1
1
  #include "say.h"
2
2
 
3
3
  #ifdef SAY_WIN
4
- static int say_thread_entry_point(void *data) {
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
- #endif
52
+
53
+ #endif
@@ -25,7 +25,7 @@ typedef struct {
25
25
  } say_thread;
26
26
  #endif
27
27
 
28
- say_thread_variable *say_thread_variable_create(say_destructor destructor);
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);
@@ -1,10 +1,10 @@
1
1
  #include "say.h"
2
2
 
3
3
  #ifdef SAY_WIN
4
- say_thread_variable *say_thread_variable_create(say_destructor destructor) {
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(say_destructor destructor) {
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), destructor);
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
@@ -1,27 +1,28 @@
1
1
  #include "say.h"
2
2
 
3
- static say_array *say_vertex_types = NULL;
3
+ static mo_array *say_vertex_types = NULL;
4
4
 
5
5
  static void say_vertex_type_delete(say_vertex_type *type) {
6
- say_array_free(type->elements);
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 say_array *say_vertex_type_get_all() {
13
+ static mo_array *say_vertex_type_get_all() {
14
14
  if (!say_vertex_types) {
15
- say_vertex_types = say_array_create(sizeof(say_vertex_type),
16
- NULL,
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 = say_array_create(sizeof(say_vertex_elem),
21
- (say_destructor)say_vertex_elem_free, NULL);
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
- say_array_push(say_vertex_types, &type);
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 = say_array_create(sizeof(say_vertex_elem), NULL, NULL);
61
+ mo_array_init(&type.elements, sizeof(say_vertex_elem));
62
+ type.elements.release = (say_destructor)say_vertex_elem_free;
46
63
 
47
- say_array_push(say_vertex_type_get_all(), &type);
48
- return say_array_get_size(say_vertex_types) - 1;
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 say_array_get(say_vertex_type_get_all(), i);
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
- say_array_push(type->elements, &elem);
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 ((say_vertex_elem*)say_array_get(type->elements, i))->type;
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 ((say_vertex_elem*)say_array_get(type->elements, i))->name;
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 say_array_get_size(type->elements);
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
- for (say_vertex_elem *e = say_array_get(type->elements, 0);
74
- e;
75
- say_array_next(type->elements, (void**)&e)) {
76
- switch (e->type) {
77
- case SAY_FLOAT: sum += sizeof(GLfloat); continue;
78
- case SAY_INT: sum += sizeof(GLint); continue;
79
- case SAY_UBYTE: sum += sizeof(GLubyte); continue;
80
- case SAY_BOOL: sum += sizeof(GLint); continue;
81
-
82
- case SAY_COLOR: sum += sizeof(GLubyte) * 4; continue;
83
- case SAY_VECTOR2: sum += sizeof(GLfloat) * 2; continue;
84
- case SAY_VECTOR3: sum += sizeof(GLfloat) * 3; continue;
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
- switch (say_vertex_type_get_type(type, i)) {
95
- case SAY_FLOAT: sum += sizeof(GLfloat); continue;
96
- case SAY_INT: sum += sizeof(GLint); continue;
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
- say_array_free(say_vertex_types);
149
+ mo_array_free(say_vertex_types);
112
150
  say_vertex_types = NULL;
113
151
  }
@@ -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
- say_array *elements;
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 say_vertex_type_get_offset(say_vertex_type *type, size_t elem);
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