ray 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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