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
@@ -21,19 +21,24 @@ VALUE ray_image_alloc(VALUE self) {
21
21
  }
22
22
 
23
23
  /*
24
- @overload initialize(io)
25
- @param [IO, #read] io An object containing the image.
26
- @example
27
- open("test.png") { |io| Ray::Image.new(io) }
28
- @overload initialize(filename)
29
- @param [String] filename Name of a file to load the image from.
30
- @example
31
- Ray::Image.new "test.png"
32
- @overload initialize(size)
33
- @param [Vector2, #to_vector2] size Size of the image to create
34
- @example
35
- Ray::Image.new [64, 128]
36
- */
24
+ * @overload initialize(io)
25
+ * Creates an image from an IO object
26
+ * @param [IO, #read] io An object containing the image.
27
+ * @example
28
+ * open("test.png") { |io| Ray::Image.new(io) }
29
+ *
30
+ * @overload initialize(filename)
31
+ * Loads an image from a file
32
+ * @param [String] filename Name of a file to load the image from.
33
+ * @example
34
+ * Ray::Image.new "test.png"
35
+ *
36
+ * @overload initialize(size)
37
+ * Creates an image from a size
38
+ * @param [Vector2, #to_vector2] size Size of the image to create
39
+ * @example
40
+ * Ray::Image.new [64, 128]
41
+ */
37
42
  static
38
43
  VALUE ray_image_init(VALUE self, VALUE arg) {
39
44
  say_image *img = ray_rb2image(self);
@@ -63,16 +68,20 @@ static
63
68
  VALUE ray_image_init_copy(VALUE self, VALUE other) {
64
69
  say_image *orig = ray_rb2image(other);
65
70
 
66
- say_image_load_raw(ray_rb2image(self),
67
- say_image_get_width(orig), say_image_get_height(orig),
68
- say_image_get_buffer(orig));
71
+ say_image_load_flipped_raw(ray_rb2image(self),
72
+ say_image_get_width(orig),
73
+ say_image_get_height(orig),
74
+ say_image_get_buffer(orig));
69
75
 
70
76
  return self;
71
77
  }
72
78
 
73
79
  /*
74
80
  * @overload write_bmp(filename)
75
- * Saves the image as a BMP.
81
+ * Saves the image as a BMP
82
+ *
83
+ * Notice BMP output ignores alpha channel. Use PNG or TGA output when
84
+ * possible.
76
85
  */
77
86
  static
78
87
  VALUE ray_image_write_bmp(VALUE self, VALUE filename) {
@@ -85,7 +94,8 @@ VALUE ray_image_write_bmp(VALUE self, VALUE filename) {
85
94
 
86
95
  /*
87
96
  * @overload write_png(filename)
88
- * Saves the image as a PNG.
97
+ * Saves the image as a PNG
98
+ * @raise [RuntimeError] This method will not work on Windows.
89
99
  */
90
100
  static
91
101
  VALUE ray_image_write_png(VALUE self, VALUE filename) {
@@ -98,7 +108,7 @@ VALUE ray_image_write_png(VALUE self, VALUE filename) {
98
108
 
99
109
  /*
100
110
  * @overload write_tga(filename)
101
- * Saves the image as a TGA.
111
+ * Saves the image as a TGA
102
112
  */
103
113
  static
104
114
  VALUE ray_image_write_tga(VALUE self, VALUE filename) {
@@ -111,8 +121,11 @@ VALUE ray_image_write_tga(VALUE self, VALUE filename) {
111
121
 
112
122
  /*
113
123
  * @overload write(filename)
114
- * Saves the image, tyring to guess the format. If it cannot be guessed, BMP
115
- * will be used.
124
+ * Saves the image in any format supported by Ray
125
+ *
126
+ * This will try to guess the format based on the filename extension
127
+ * (regardless of the case). If Ray can't guess the filename, the image will
128
+ * be saved anyway using TGA.
116
129
  */
117
130
  static
118
131
  VALUE ray_image_write(VALUE self, VALUE filename) {
@@ -154,12 +167,14 @@ void ray_image_assert_pos(say_image *img, size_t x, size_t y) {
154
167
  }
155
168
 
156
169
  /*
157
- @overload [](x, y)
158
- @param [Integer] x X position of the pixel
159
- @param [Integer] y Y position of the pixel
160
-
161
- @return [Color] Color of the pixel
162
- */
170
+ * @overload [](x, y)
171
+ * Reads the color of a pixel
172
+ *
173
+ * @param [Integer] x X position of the pixel
174
+ * @param [Integer] y Y position of the pixel
175
+ *
176
+ * @return [Color] Color of the pixel
177
+ */
163
178
  static
164
179
  VALUE ray_image_get(VALUE self, VALUE rb_x, VALUE rb_y) {
165
180
  say_image *img = ray_rb2image(self);
@@ -173,12 +188,14 @@ VALUE ray_image_get(VALUE self, VALUE rb_x, VALUE rb_y) {
173
188
  }
174
189
 
175
190
  /*
176
- @overload []=(x, y, color)
177
- @param [Integer] x X position of the pixel
178
- @param [Integer] y Y position of the pixel
179
-
180
- @param [Color] color New color of the pixel
181
- */
191
+ * @overload []=(x, y, color)
192
+ * Changes the color of a pixel
193
+ *
194
+ * @param [Integer] x X position of the pixel
195
+ * @param [Integer] y Y position of the pixel
196
+ *
197
+ * @param [Color] color New color of the pixel
198
+ */
182
199
  static
183
200
  VALUE ray_image_set(VALUE self, VALUE rb_x, VALUE rb_y, VALUE color) {
184
201
  rb_check_frozen(self);
@@ -193,36 +210,59 @@ VALUE ray_image_set(VALUE self, VALUE rb_x, VALUE rb_y, VALUE color) {
193
210
  }
194
211
 
195
212
  /*
196
- @overload tex_rect(rect)
197
- Converts a rect of pixel coordinates to a rect of texture coordinates,
198
- which may be needed to generate vertices using this image.
199
-
200
- @param [Rect] rect Rect in pixel coordinates
201
- @return [Rect] Rect in texture coordinates
202
- */
213
+ * @overload tex_rect(rect)
214
+ * Converts a rect of pixel coordinates to a rect of texture coordinates
215
+ *
216
+ * Texture coordinates can be useful when manually generating vertices that
217
+ * need to be textured.
218
+ *
219
+ * The returned rect is setup so that (x,y) is the top left corner of the
220
+ * image. The height of the rect may thus be negative.
221
+ *
222
+ * @param [Rect] rect Rect in pixel coordinates
223
+ * @return [Rect] Rect in texture coordinates
224
+ */
203
225
  VALUE ray_image_tex_rect(VALUE self, VALUE rect) {
204
226
  return ray_rect2rb(say_image_get_tex_rect(ray_rb2image(self),
205
227
  ray_convert_to_rect(rect)));
206
228
  }
207
229
 
208
230
  /*
209
- Binds the texture, which will be used as GL_TEXTURE_2D when drawing with
210
- OpenGL
211
- */
231
+ * Binds the texture, which will be used as GL_TEXTURE_2D when drawing with
232
+ * OpenGL
233
+ */
212
234
  VALUE ray_image_bind(VALUE self) {
213
235
  say_image_bind(ray_rb2image(self));
214
236
  return self;
215
237
  }
216
238
 
217
239
  /*
218
- @return [true, false] True if the image uses linear interplation when it's
219
- drawn with a different size than the normal one. Uses the color of the
220
- nearest pixel otherwise.
240
+ * @return [Integer] Identifer of the image's texture
241
+ */
242
+ VALUE ray_image_texture(VALUE self) {
243
+ return ULONG2NUM(say_image_get_texture(ray_rb2image(self)));
244
+ }
245
+
246
+ /*
247
+ * @see smooth=
221
248
  */
222
249
  VALUE ray_image_is_smooth(VALUE self) {
223
250
  return say_image_is_smooth(ray_rb2image(self)) ? Qtrue : Qfalse;
224
251
  }
225
252
 
253
+ /*
254
+ * @overload smooth=(val)
255
+ * Enables or disables smoothing
256
+ *
257
+ * When smoothing is enabled, the color of interpolated pixels is chosen by
258
+ * taking the average of the four colors that are the nearest to each of
259
+ * them (linear interpolation). When it is not enabled, the color of the
260
+ * nearest point is simply used.
261
+ *
262
+ * Smoothing is disabled by default.
263
+ *
264
+ * @param [Boolean] val True to enable smoothing
265
+ */
226
266
  VALUE ray_image_set_smooth(VALUE self, VALUE val) {
227
267
  rb_check_frozen(self);
228
268
  say_image_set_smooth(ray_rb2image(self), RTEST(val));
@@ -230,34 +270,58 @@ VALUE ray_image_set_smooth(VALUE self, VALUE val) {
230
270
  }
231
271
 
232
272
  /*
233
- Document-class: Ray::Image
234
-
235
- An image is only the resource used when drawing. It is not the object you can
236
- directly draw on the screen.
237
- */
273
+ * Document-class: Ray::Image
274
+ *
275
+ * An image is a bidimensonial array of pixels used to texture rendering. It is
276
+ * not an object you can draw per se. See {Ray::Sprite} or more generically
277
+ * {Ray::Drawable} for this.
278
+ *
279
+ * You can directly access pixels of an image, but an image target
280
+ * ({Ray::ImageTarget}) must be used to be able to draw more complex objects
281
+ * on it.
282
+ *
283
+ * @see Ray::ImageTarget
284
+ * @see Ray::Sprite
285
+ * @see Ray::Drawable
286
+ */
238
287
  void Init_ray_image() {
239
288
  ray_cImage = rb_define_class_under(ray_mRay, "Image", rb_cObject);
240
289
 
290
+ /* @group Creating an image */
241
291
  rb_define_alloc_func(ray_cImage, ray_image_alloc);
242
292
  rb_define_method(ray_cImage, "initialize", ray_image_init, 1);
243
293
  rb_define_method(ray_cImage, "initialize_copy", ray_image_init_copy, 1);
294
+ /* @endgroup */
244
295
 
296
+ /* @group Saving an image */
245
297
  rb_define_method(ray_cImage, "write_bmp", ray_image_write_bmp, 1);
246
298
  rb_define_method(ray_cImage, "write_png", ray_image_write_png, 1);
247
299
  rb_define_method(ray_cImage, "write_tga", ray_image_write_tga, 1);
248
300
  rb_define_method(ray_cImage, "write", ray_image_write, 1);
301
+ /* @endgroup */
249
302
 
303
+ /* @group Getting image size */
250
304
  rb_define_method(ray_cImage, "width", ray_image_width, 0);
251
305
  rb_define_method(ray_cImage, "height", ray_image_height, 0);
252
306
  rb_define_method(ray_cImage, "size", ray_image_size, 0);
307
+ /* @endgroup */
253
308
 
309
+ /* @group Pixel-level access */
254
310
  rb_define_method(ray_cImage, "[]", ray_image_get, 2);
255
311
  rb_define_method(ray_cImage, "[]=", ray_image_set, 3);
312
+ /* @endgroup */
256
313
 
314
+ /* @group Texture parameters */
257
315
  rb_define_method(ray_cImage, "smooth?", ray_image_is_smooth, 0);
258
316
  rb_define_method(ray_cImage, "smooth=", ray_image_set_smooth, 1);
317
+ /* @endgroup */
259
318
 
319
+ /* @group Coordinate conversions */
260
320
  rb_define_method(ray_cImage, "tex_rect", ray_image_tex_rect, 1);
321
+ /* @endgroup */
261
322
 
323
+ /* @group OpenGL access */
262
324
  rb_define_method(ray_cImage, "bind", ray_image_bind, 0);
325
+ rb_define_method(ray_cImage, "texture", ray_image_texture, 0);
326
+ /* @endgroup */
263
327
  }
@@ -17,13 +17,17 @@ say_image_target *ray_rb2image_target(VALUE obj) {
17
17
  VALUE ray_image_target_alloc(VALUE self) {
18
18
  if (!say_image_target_is_available())
19
19
  rb_raise(rb_eRuntimeError, "Ray::RenderImage is not supported here");
20
-
20
+
21
21
  say_image_target *target = say_image_target_create();
22
22
  return Data_Wrap_Struct(ray_cImageTarget, NULL, say_image_target_free,
23
23
  target);
24
24
  }
25
25
 
26
- /* @overload image=(img) */
26
+ /*
27
+ * @overload image=(img)
28
+ * Sets the image this object will draw on
29
+ * @param [Ray::Image] img New image to draw on
30
+ */
27
31
  VALUE ray_image_target_set_image(VALUE self, VALUE img) {
28
32
  rb_check_frozen(self);
29
33
  say_image_target_set_image(ray_rb2image_target(self), ray_rb2image(img));
@@ -31,26 +35,50 @@ VALUE ray_image_target_set_image(VALUE self, VALUE img) {
31
35
  return img;
32
36
  }
33
37
 
34
- /* @return [Ray::Image] image the target draws on */
38
+ /* @see image= */
35
39
  VALUE ray_image_target_image(VALUE self) {
36
40
  return rb_iv_get(self, "@image");
37
41
  }
38
42
 
39
- /* Updates the content of the image target */
43
+ /*
44
+ * Updates the content of the image target
45
+ *
46
+ * The pixels of the image will also be updated:
47
+ * Ray::ImageTarget.new image do |target|
48
+ * target.clear Ray::Color.red
49
+ * target.update
50
+ * end
51
+ *
52
+ * image[0, 0] # => RGBA(255, 0, 0, 255)
53
+ */
40
54
  VALUE ray_image_target_update(VALUE self) {
41
55
  say_image_target_update(ray_rb2image_target(self));
42
56
  return self;
43
57
  }
44
58
 
45
- /* Binds an image target to draw directly on it */
59
+ /*
60
+ * Binds an image target to draw directly on it
61
+ *
62
+ * This method is only useful when performing low-level OpenGL rendering. It
63
+ * is different from {#make_current} because it doesn't use the target's own
64
+ * OpenGL context. Instead, it will use the current context (ensuring there is
65
+ * one).
66
+ *
67
+ * Notice binding the image target (and, therefore, making it the current
68
+ * target) clears the depth buffer of the image, so that everything will be
69
+ * rendered over what was already on the image.
70
+ */
46
71
  VALUE ray_image_target_bind(VALUE self) {
47
72
  say_image_target_bind(ray_rb2image_target(self));
48
73
  return self;
49
74
  }
50
75
 
51
76
  /*
52
- * Unbinds any image target. This is mostly not needed, as making a window the
53
- * current target will call this automatically.
77
+ * Unbinds any image target
78
+ *
79
+ * This is rarely needed, as this method gets called automatically when a window
80
+ * is bound, and because windows and image targets do not share the same OpenGL
81
+ * context.
54
82
  */
55
83
  VALUE ray_image_target_unbind(VALUE self) {
56
84
  /*
@@ -63,18 +91,38 @@ VALUE ray_image_target_unbind(VALUE self) {
63
91
  }
64
92
 
65
93
  /*
94
+ * Checks availability of image targets
95
+ *
96
+ * Image targets are only part of OpenGL core since OpenGL 3 (although they may
97
+ * be supported as an extension in older versions).
98
+ *
66
99
  * @return [true, false] True when ImageTargets are available
67
100
  */
68
101
  VALUE ray_image_target_available(VALUE self) {
69
102
  return say_image_target_is_available() ? Qtrue : Qfalse;
70
103
  }
71
104
 
105
+ /*
106
+ * Document-class: Ray::ImageTarget
107
+ *
108
+ * Image targets are objects that allow to draw any drawable object on an image
109
+ * instead of doing on-screen rendering. Off-screen rendering can be useful to
110
+ * pre-render some objects.
111
+ *
112
+ * Notice image targets modify the image they are drawing on directly. You may
113
+ * therefore not want to draw on a cached image, but rather on a copy thereof.
114
+ *
115
+ * @see Ray::Image
116
+ */
72
117
  void Init_ray_image_target() {
73
- ray_cImageTarget = rb_define_class_under(ray_mRay, "ImageTarget", ray_cTarget);
118
+ ray_cImageTarget = rb_define_class_under(ray_mRay, "ImageTarget",
119
+ ray_cTarget);
74
120
  rb_define_alloc_func(ray_cImageTarget, ray_image_target_alloc);
75
121
 
76
- rb_define_singleton_method(ray_cImageTarget, "unbind", ray_image_target_unbind, 0);
77
- rb_define_singleton_method(ray_cImageTarget, "available?", ray_image_target_available, 0);
122
+ rb_define_singleton_method(ray_cImageTarget, "unbind",
123
+ ray_image_target_unbind, 0);
124
+ rb_define_singleton_method(ray_cImageTarget, "available?",
125
+ ray_image_target_available, 0);
78
126
 
79
127
  rb_define_method(ray_cImageTarget, "image=", ray_image_target_set_image, 1);
80
128
  rb_define_method(ray_cImageTarget, "image", ray_image_target_image, 0);
@@ -17,21 +17,72 @@ say_input *ray_rb2input(VALUE obj) {
17
17
  VALUE ray_input2rb(say_input *input, VALUE owner) {
18
18
  VALUE obj = Data_Wrap_Struct(rb_path2class("Ray::Input"), NULL, NULL, input);
19
19
  rb_iv_set(obj, "@owner", owner);
20
-
21
20
  return obj;
22
21
  }
23
22
 
24
23
  static
25
24
  VALUE ray_input_alloc(VALUE self) {
26
- rb_raise(rb_eRuntimeError, "can't allocate Ray::Input");
25
+ say_input *obj = malloc(sizeof(say_input));
26
+ say_input_reset(obj);
27
+ return Data_Wrap_Struct(self, NULL, free, obj);
28
+ }
29
+
30
+ /*
31
+ * Resets the input
32
+ *
33
+ * After a reset, all the keys are marked released and the mouse position is set
34
+ * to (0, 0).
35
+ */
36
+ static
37
+ VALUE ray_input_reset(VALUE self) {
38
+ say_input_reset(ray_rb2input(self));
39
+ return self;
40
+ }
41
+
42
+ /*
43
+ * @overload press(key)
44
+ * Marks a key as pressed
45
+ * @param [Integer] key A key
46
+ */
47
+ static
48
+ VALUE ray_input_press(VALUE self, VALUE key) {
49
+ say_input_press(ray_rb2input(self), NUM2INT(key));
50
+ return Qnil;
51
+ }
52
+
53
+ /*
54
+ * @overload release(key)
55
+ * Marks a key as released
56
+ * @param [Integer] key A key
57
+ */
58
+ static
59
+ VALUE ray_input_release(VALUE self, VALUE key) {
60
+ say_input_release(ray_rb2input(self), NUM2INT(key));
27
61
  return Qnil;
28
62
  }
29
63
 
30
64
  /*
31
- @overload holding?(key)
32
- @param [Integer] key A key
33
- @return [true, false] True if the given key is being held
34
- */
65
+ * @overload mouse_pos=(pos)
66
+ * Changes the known position of the mouse
67
+ *
68
+ * Notice this only affects the input object's state, it won't actually move
69
+ * the mouse.
70
+ *
71
+ * @param [Ray::Vector2] pos New position
72
+ */
73
+ static
74
+ VALUE ray_input_set_mouse_pos(VALUE self, VALUE pos) {
75
+ say_input_set_mouse_pos(ray_rb2input(self), ray_convert_to_vector2(pos));
76
+ return pos;
77
+ }
78
+
79
+ /*
80
+ * @overload holding?(key)
81
+ * Checks if a key is being held
82
+ *
83
+ * @param [Integer] key A key
84
+ * @return [true, false] True if the given key is being held
85
+ */
35
86
  static
36
87
  VALUE ray_input_holding(VALUE self, VALUE key) {
37
88
  return say_input_is_holding(ray_rb2input(self), NUM2INT(key)) ?
@@ -44,10 +95,26 @@ VALUE ray_input_mouse_pos(VALUE self) {
44
95
  return ray_vector2_to_rb(say_input_get_mouse_pos(ray_rb2input(self)));
45
96
  }
46
97
 
98
+ /*
99
+ * Document-class: Ray::Input
100
+ *
101
+ * An input object is used to keep track of pressed keys and the position of the
102
+ * mouse. Methods are also provided to affect the state of the input, possibly
103
+ * useful in tests.
104
+ */
47
105
  void Init_ray_input() {
48
106
  ray_cInput = rb_define_class_under(ray_mRay, "Input", rb_cObject);
49
107
  rb_define_alloc_func(ray_cInput, ray_input_alloc);
50
108
 
109
+ /* @group Change input */
110
+ rb_define_method(ray_cInput, "reset", ray_input_reset, 0);
111
+ rb_define_method(ray_cInput, "press", ray_input_press, 1);
112
+ rb_define_method(ray_cInput, "release", ray_input_release, 1);
113
+ rb_define_method(ray_cInput, "mouse_pos=", ray_input_set_mouse_pos, 1);
114
+ /* @engroup */
115
+
116
+ /* @group Read input */
51
117
  rb_define_method(ray_cInput, "holding?", ray_input_holding, 1);
52
118
  rb_define_method(ray_cInput, "mouse_pos", ray_input_mouse_pos, 0);
119
+ /* @endgroup */
53
120
  }