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
@@ -113,8 +113,7 @@ static void say_polygon_fill_vertices(void *data, void *vertices_ptr) {
113
113
  }
114
114
  }
115
115
 
116
- static void say_polygon_draw(void *data, size_t first, size_t index,
117
- say_shader *shader) {
116
+ static void say_polygon_draw(void *data, size_t first, size_t index) {
118
117
  say_polygon *polygon = (say_polygon*)data;
119
118
 
120
119
  if (polygon->point_count < 3)
@@ -249,6 +248,7 @@ say_polygon *say_polygon_ellipse(say_vector2 center, float rx, float ry,
249
248
 
250
249
  say_drawable_set_scale(ellipse->drawable, say_make_vector2(1, ry / rx));
251
250
  say_drawable_set_origin(ellipse->drawable, center);
251
+ say_drawable_set_pos(ellipse->drawable, center);
252
252
 
253
253
  return ellipse;
254
254
  }
@@ -11,28 +11,27 @@ static void say_shader_make_current(GLuint program) {
11
11
  say_current_program = program;
12
12
  say_shader_last_context = context;
13
13
 
14
- glUseProgramObjectARB(program);
14
+ glUseProgram(program);
15
15
  }
16
16
  }
17
17
 
18
18
  static int say_shader_create_shader(GLuint shader, const char *src) {
19
19
  GLint length = strlen(src);
20
- glShaderSourceARB(shader, 1, &src, &length);
20
+ glShaderSource(shader, 1, &src, &length);
21
21
 
22
- glCompileShaderARB(shader);
22
+ glCompileShader(shader);
23
23
 
24
24
  GLint worked = 0;
25
- glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &worked);
25
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &worked);
26
26
 
27
27
  if (worked != GL_TRUE) {
28
28
  GLint error_length = 0;
29
- glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB,
30
- &error_length);
29
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &error_length);
31
30
 
32
31
  char *error = malloc((error_length + 1) * sizeof(char));
33
32
  memset(error, '\0', (error_length + 1) * sizeof(char));
34
33
 
35
- glGetInfoLogARB(shader, error_length, &error_length, error);
34
+ glGetShaderInfoLog(shader, error_length, &error_length, error);
36
35
  say_error_set(error);
37
36
 
38
37
  free(error);
@@ -43,14 +42,14 @@ static int say_shader_create_shader(GLuint shader, const char *src) {
43
42
 
44
43
  static void say_shader_find_locations(say_shader *shader) {
45
44
  shader->locations[SAY_PROJECTION_LOC_ID] =
46
- glGetUniformLocationARB(shader->program, SAY_PROJECTION_ATTR);
45
+ glGetUniformLocation(shader->program, SAY_PROJECTION_ATTR);
47
46
  shader->locations[SAY_MODEL_VIEW_LOC_ID] =
48
- glGetUniformLocationARB(shader->program, SAY_MODEL_VIEW_ATTR);
47
+ glGetUniformLocation(shader->program, SAY_MODEL_VIEW_ATTR);
49
48
 
50
49
  shader->locations[SAY_TEXTURE_LOC_ID] =
51
- glGetUniformLocationARB(shader->program, SAY_TEXTURE_ATTR);
50
+ glGetUniformLocation(shader->program, SAY_TEXTURE_ATTR);
52
51
  shader->locations[SAY_TEXTURE_ENABLED_LOC_ID] =
53
- glGetUniformLocationARB(shader->program, SAY_TEXTURE_ENABLED_ATTR);
52
+ glGetUniformLocation(shader->program, SAY_TEXTURE_ENABLED_ATTR);
54
53
  }
55
54
 
56
55
  static const char *say_default_frag_shader =
@@ -89,7 +88,7 @@ static const char *say_default_vertex_shader =
89
88
  "}\n";
90
89
 
91
90
  static const char *say_new_default_frag_shader =
92
- "#version 140\n"
91
+ "#version 130\n"
93
92
  "\n"
94
93
  "uniform sampler2D in_Texture;\n"
95
94
  "uniform bool in_TextureEnabled;\n"
@@ -101,13 +100,13 @@ static const char *say_new_default_frag_shader =
101
100
  "\n"
102
101
  "void main() {\n"
103
102
  " if (in_TextureEnabled)\n"
104
- " out_FragColor = texture2D(in_Texture, var_TexCoord) * var_Color;\n"
103
+ " out_FragColor = texture(in_Texture, var_TexCoord) * var_Color;\n"
105
104
  " else\n"
106
105
  " out_FragColor = var_Color;\n"
107
106
  "}\n";
108
107
 
109
108
  static const char *say_new_default_vertex_shader =
110
- "#version 140\n"
109
+ "#version 130\n"
111
110
  "\n"
112
111
  "in vec2 in_Vertex;\n"
113
112
  "in vec4 in_Color;\n"
@@ -139,7 +138,7 @@ void say_shader_force_old() {
139
138
 
140
139
  bool say_shader_is_geometry_available() {
141
140
  say_context_ensure();
142
- return __GLEW_ARB_geometry_shader4 != 0;
141
+ return GLEW_ARB_geometry_shader4 || GLEW_VERSION_3_2;
143
142
  }
144
143
 
145
144
  say_shader *say_shader_create() {
@@ -147,11 +146,15 @@ say_shader *say_shader_create() {
147
146
 
148
147
  say_shader *shader = (say_shader*)malloc(sizeof(say_shader));
149
148
 
150
- shader->frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
151
- shader->vertex_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
149
+ shader->frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
150
+ shader->vertex_shader = glCreateShader(GL_VERTEX_SHADER);
152
151
  shader->geometry_shader = 0;
153
152
 
154
- if (!say_shader_use_new) {
153
+ bool new_shader = say_shader_use_new &&
154
+ (!say_shader_use_old_force ||
155
+ say_context_get_config()->core_profile);
156
+
157
+ if (!new_shader) {
155
158
  say_shader_compile_frag(shader, say_default_frag_shader);
156
159
  say_shader_compile_vertex(shader, say_default_vertex_shader);
157
160
  }
@@ -160,18 +163,17 @@ say_shader *say_shader_create() {
160
163
  say_shader_compile_vertex(shader, say_new_default_vertex_shader);
161
164
  }
162
165
 
163
- shader->program = glCreateProgramObjectARB();
166
+ shader->program = glCreateProgram();
164
167
 
165
- glAttachObjectARB(shader->program, shader->frag_shader);
166
- glAttachObjectARB(shader->program, shader->vertex_shader);
168
+ glAttachShader(shader->program, shader->frag_shader);
169
+ glAttachShader(shader->program, shader->vertex_shader);
167
170
 
168
171
  say_shader_apply_vertex_type(shader, 0);
169
172
 
170
- if (say_shader_use_new) {
171
- glBindFragDataLocationEXT(shader->program, 0, SAY_FRAG_COLOR);
172
- }
173
+ if (new_shader)
174
+ glBindFragDataLocation(shader->program, 0, "out_FragColor");
173
175
 
174
- glLinkProgramARB(shader->program);
176
+ glLinkProgram(shader->program);
175
177
 
176
178
  say_shader_find_locations(shader);
177
179
 
@@ -191,12 +193,12 @@ say_shader *say_shader_create() {
191
193
  void say_shader_free(say_shader *shader) {
192
194
  say_context_ensure();
193
195
 
194
- glDeleteObjectARB(shader->frag_shader);
195
- glDeleteObjectARB(shader->vertex_shader);
196
+ glDeleteShader(shader->frag_shader);
197
+ glDeleteShader(shader->vertex_shader);
196
198
 
197
199
  say_shader_detach_geometry(shader);
198
200
 
199
- glDeleteObjectARB(shader->program);
201
+ glDeleteProgram(shader->program);
200
202
 
201
203
  free(shader);
202
204
  }
@@ -213,21 +215,21 @@ bool say_shader_compile_vertex(say_shader *shader, const char *src) {
213
215
 
214
216
  bool say_shader_compile_geometry(say_shader *shader, const char *src) {
215
217
  say_context_ensure();
216
- if (!__GLEW_ARB_geometry_shader4) {
218
+ if (!(GLEW_ARB_geometry_shader4 || GLEW_VERSION_3_2)) {
217
219
  say_error_set("geometry shaders aren't available");
218
220
  return false;
219
221
  }
220
222
 
221
- shader->geometry_shader = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_ARB);
222
- glAttachObjectARB(shader->program, shader->geometry_shader);
223
+ shader->geometry_shader = glCreateShader(GL_GEOMETRY_SHADER);
224
+ glAttachShader(shader->program, shader->geometry_shader);
223
225
  return say_shader_create_shader(shader->geometry_shader, src);
224
226
  }
225
227
 
226
228
  void say_shader_detach_geometry(say_shader *shader) {
227
229
  if (shader->geometry_shader) {
228
230
  say_context_ensure();
229
- glDetachObjectARB(shader->program, shader->geometry_shader);
230
- glDeleteObjectARB(shader->geometry_shader);
231
+ glDetachShader(shader->program, shader->geometry_shader);
232
+ glDeleteShader(shader->geometry_shader);
231
233
  shader->geometry_shader = 0;
232
234
  }
233
235
  }
@@ -236,10 +238,9 @@ void say_shader_apply_vertex_type(say_shader *shader, size_t vtype) {
236
238
  say_context_ensure();
237
239
 
238
240
  say_vertex_type *type = say_get_vertex_type(vtype);
239
-
240
241
  for (size_t i = 0; i < say_vertex_type_get_elem_count(type); i++) {
241
- glBindAttribLocationARB(shader->program, i,
242
- say_vertex_type_get_name(type, i));
242
+ glBindAttribLocation(shader->program, i + 1,
243
+ say_vertex_type_get_name(type, i));
243
244
  }
244
245
  }
245
246
 
@@ -248,17 +249,16 @@ int say_shader_link(say_shader *shader) {
248
249
  glLinkProgram(shader->program);
249
250
 
250
251
  GLint worked = 0;
251
- glGetObjectParameterivARB(shader->program, GL_OBJECT_LINK_STATUS_ARB, &worked);
252
+ glGetProgramiv(shader->program, GL_LINK_STATUS, &worked);
252
253
 
253
254
  if (!worked) {
254
255
  GLint error_length = 0;
255
- glGetObjectParameterivARB(shader->program, GL_OBJECT_INFO_LOG_LENGTH_ARB,
256
- &error_length);
256
+ glGetProgramiv(shader->program, GL_INFO_LOG_LENGTH, &error_length);
257
257
 
258
258
  char *error = malloc((error_length + 1) * sizeof(char));
259
259
  memset(error, '\0', (error_length + 1) * sizeof(char));
260
260
 
261
- glGetInfoLogARB(shader->program, error_length, &error_length, error);
261
+ glGetProgramInfoLog(shader->program, error_length, &error_length, error);
262
262
  say_error_set(error);
263
263
 
264
264
  free(error);
@@ -272,36 +272,36 @@ int say_shader_link(say_shader *shader) {
272
272
  void say_shader_set_matrix(say_shader *shader, const char *name,
273
273
  say_matrix *matrix) {
274
274
  say_shader_bind(shader);
275
- GLint location = glGetUniformLocationARB(shader->program, name);
276
- glUniformMatrix4fvARB(location, 1, GL_FALSE, matrix->content);
275
+ GLint location = glGetUniformLocation(shader->program, name);
276
+ glUniformMatrix4fv(location, 1, GL_FALSE, matrix->content);
277
277
  }
278
278
 
279
279
  void say_shader_set_current_texture(say_shader *shader, const char *name) {
280
280
  say_shader_bind(shader);
281
- GLint location = glGetUniformLocationARB(shader->program, name);
282
- glUniform1iARB(location, 0);
281
+ GLint location = glGetUniformLocation(shader->program, name);
282
+ glUniform1i(location, 0);
283
283
  }
284
284
 
285
285
  void say_shader_set_int(say_shader *shader, const char *name, int val) {
286
286
  say_shader_bind(shader);
287
- GLint location = glGetUniformLocationARB(shader->program, name);
288
- glUniform1iARB(location, val);
287
+ GLint location = glGetUniformLocation(shader->program, name);
288
+ glUniform1i(location, val);
289
289
  }
290
290
 
291
291
  void say_shader_set_matrix_id(say_shader *shader, say_attr_loc_id id,
292
292
  say_matrix *matrix) {
293
293
  say_shader_bind(shader);
294
- glUniformMatrix4fvARB(shader->locations[id], 1, GL_FALSE, matrix->content);
294
+ glUniformMatrix4fv(shader->locations[id], 1, GL_FALSE, matrix->content);
295
295
  }
296
296
 
297
297
  void say_shader_set_current_texture_id(say_shader *shader, say_attr_loc_id id) {
298
298
  say_shader_bind(shader);
299
- glUniform1iARB(shader->locations[id], 0);
299
+ glUniform1i(shader->locations[id], 0);
300
300
  }
301
301
 
302
302
  void say_shader_set_int_id(say_shader *shader, say_attr_loc_id id, int val) {
303
303
  say_shader_bind(shader);
304
- glUniform1iARB(shader->locations[id], val);
304
+ glUniform1i(shader->locations[id], val);
305
305
  }
306
306
 
307
307
  void say_shader_bind(say_shader *shader) {
@@ -310,33 +310,33 @@ void say_shader_bind(say_shader *shader) {
310
310
  }
311
311
 
312
312
  int say_shader_locate(say_shader *shader, const char *name) {
313
- return glGetUniformLocationARB(shader->program, name);
313
+ return glGetUniformLocation(shader->program, name);
314
314
  }
315
315
 
316
316
  void say_shader_set_vector2_loc(say_shader *shader, int loc, say_vector2 val) {
317
317
  say_shader_bind(shader);
318
- glUniform2fARB(loc, val.x, val.y);
318
+ glUniform2f(loc, val.x, val.y);
319
319
  }
320
320
 
321
321
  void say_shader_set_vector3_loc(say_shader *shader, int loc, say_vector3 val) {
322
322
  say_shader_bind(shader);
323
- glUniform3fARB(loc, val.x, val.y, val.z);
323
+ glUniform3f(loc, val.x, val.y, val.z);
324
324
  }
325
325
 
326
326
  void say_shader_set_color_loc(say_shader *shader, int loc, say_color val) {
327
327
  say_shader_bind(shader);
328
328
  float arg[4] = {val.r / 255.0, val.g / 255.0, val.b / 255.0, val.a / 255.0};
329
- glUniform4fvARB(loc, 1, arg);
329
+ glUniform4fv(loc, 1, arg);
330
330
  }
331
331
 
332
332
  void say_shader_set_matrix_loc(say_shader *shader, int loc, say_matrix *val) {
333
333
  say_shader_bind(shader);
334
- glUniformMatrix4fvARB(loc, 1, GL_FALSE, val->content);
334
+ glUniformMatrix4fv(loc, 1, GL_FALSE, val->content);
335
335
  }
336
336
 
337
337
  void say_shader_set_float_loc(say_shader *shader, int loc, float val) {
338
338
  say_shader_bind(shader);
339
- glUniform1fARB(loc, val);
339
+ glUniform1f(loc, val);
340
340
  }
341
341
 
342
342
  void say_shader_set_floats_loc(say_shader *shader, int loc, size_t count,
@@ -345,31 +345,35 @@ void say_shader_set_floats_loc(say_shader *shader, int loc, size_t count,
345
345
 
346
346
  switch (count) {
347
347
  case 1:
348
- glUniform1fvARB(loc, 1, val);
348
+ glUniform1fv(loc, 1, val);
349
349
  break;
350
350
  case 2:
351
- glUniform2fvARB(loc, 1, val);
351
+ glUniform2fv(loc, 1, val);
352
352
  break;
353
353
  case 3:
354
- glUniform3fvARB(loc, 1, val);
354
+ glUniform3fv(loc, 1, val);
355
355
  break;
356
356
  case 4:
357
- glUniform4fvARB(loc, 1, val);
357
+ glUniform4fv(loc, 1, val);
358
358
  break;
359
359
  }
360
360
  }
361
361
 
362
362
  void say_shader_set_image_loc(say_shader *shader, int loc, say_image *val) {
363
363
  say_shader_bind(shader);
364
- glUniform1iARB(loc, val->texture);
364
+ glUniform1i(loc, val->texture);
365
365
  }
366
366
 
367
367
  void say_shader_set_current_texture_loc(say_shader *shader, int loc) {
368
368
  say_shader_bind(shader);
369
- glUniform1iARB(loc, 0);
369
+ glUniform1i(loc, 0);
370
370
  }
371
371
 
372
372
  void say_shader_set_bool_loc(say_shader *shader, int loc, uint8_t val) {
373
373
  say_shader_bind(shader);
374
- glUniform1iARB(loc, val);
374
+ glUniform1i(loc, val);
375
+ }
376
+
377
+ GLuint say_shader_get_program(say_shader *shader) {
378
+ return shader->program;
375
379
  }
@@ -88,4 +88,6 @@ void say_shader_set_bool_loc(say_shader *shader, int loc, uint8_t val);
88
88
 
89
89
  void say_shader_bind(say_shader *shader);
90
90
 
91
+ GLuint say_shader_get_program(say_shader *shader);
92
+
91
93
  #endif
@@ -67,8 +67,7 @@ static void say_sprite_fill_vertices(void *data, void *vertices_ptr) {
67
67
  }
68
68
  }
69
69
 
70
- static void say_sprite_draw(void *data, size_t first, size_t index,
71
- say_shader *shader) {
70
+ static void say_sprite_draw(void *data, size_t first, size_t index) {
72
71
  say_sprite *sprite = (say_sprite*)data;
73
72
 
74
73
  if (!sprite->image)
@@ -20,7 +20,10 @@ static void say_target_update_states(say_target *target) {
20
20
  say_target *say_target_create() {
21
21
  say_target *target = (say_target*)malloc(sizeof(say_target));
22
22
 
23
- target->context = say_thread_variable_create((say_destructor)say_context_free);
23
+ mo_array_init(&target->all_contexts, sizeof(say_context*));
24
+ target->all_contexts.release = say_context_free_el;
25
+
26
+ target->context = say_thread_variable_create();
24
27
  target->renderer = say_renderer_create();
25
28
  target->view = say_view_create();
26
29
 
@@ -40,19 +43,23 @@ void say_target_free(say_target *target) {
40
43
 
41
44
  say_thread_variable_free(target->context);
42
45
 
46
+ mo_array_release(&target->all_contexts);
47
+
43
48
  free(target);
44
49
  }
45
50
 
46
51
  void say_target_set_context_proc(say_target *target, say_context_proc proc) {
47
52
  if (target->own_context_needed) {
48
53
  say_thread_variable_free(target->context);
49
- target->context = say_thread_variable_create((say_destructor)say_context_free);
54
+ mo_array_resize(&target->all_contexts, 0);
55
+
56
+ target->context = say_thread_variable_create();
50
57
  }
51
58
 
52
59
  target->context_proc = proc;
53
60
  }
54
61
 
55
- void say_target_need_own_contxt(say_target *target, uint8_t val) {
62
+ void say_target_need_own_context(say_target *target, uint8_t val) {
56
63
  target->own_context_needed = val;
57
64
  }
58
65
 
@@ -73,6 +80,7 @@ say_context *say_target_get_context(say_target *target) {
73
80
  return NULL;
74
81
  }
75
82
 
83
+ mo_array_push(&target->all_contexts, &context);
76
84
  say_thread_variable_set(target->context, context);
77
85
 
78
86
  return context;
@@ -142,7 +150,6 @@ say_view *say_target_get_default_view(say_target *target) {
142
150
  say_view_set_size(ret, target->size);
143
151
  say_view_set_center(ret, say_make_vector2(target->size.x / 2,
144
152
  target->size.y / 2));
145
- say_view_flip_y(ret, say_view_is_y_flipped(target->view));
146
153
  return ret;
147
154
  }
148
155
 
@@ -207,6 +214,8 @@ say_color say_target_get(say_target *target, size_t x, size_t y) {
207
214
  if (!say_target_make_current(target))
208
215
  return say_make_color(0, 0, 0, 0);
209
216
 
217
+ say_pixel_bus_unbind_pack();
218
+
210
219
  say_color col;
211
220
  glReadPixels(x, (GLint)target->size.y - (GLint)y - 1, 1, 1, GL_RGBA,
212
221
  GL_UNSIGNED_BYTE, &col);
@@ -225,28 +234,10 @@ say_image *say_target_get_rect(say_target *target, size_t x, size_t y,
225
234
  return NULL;
226
235
  }
227
236
 
228
- /* TODO: use PBOs for this? */
237
+ say_pixel_bus_unbind_pack();
229
238
  glReadPixels(x, (GLint)target->size.y - (GLint)y - (GLint)h, w, h, GL_RGBA,
230
239
  GL_UNSIGNED_BYTE, say_image_get_buffer(image));
231
240
 
232
- /*
233
- * Say keeps pixels from top to bottom, but GL reads from bottom to top. Flip
234
- * pixels manually.
235
- */
236
-
237
- size_t mem_size = sizeof(say_color) * w;
238
-
239
- say_color *temp_line = malloc(mem_size);
240
- say_color *buffer = say_image_get_buffer(image);
241
-
242
- for (size_t i = 0; i <= h / 2; i++) {
243
- memcpy(temp_line, &buffer[w * i], mem_size);
244
- memcpy(&buffer[w * i], &buffer[w * (h - i - 1)], mem_size);
245
- memcpy(&buffer[w * (h - i - 1)], temp_line, mem_size);
246
- }
247
-
248
- free(temp_line);
249
-
250
241
  return image;
251
242
  }
252
243