ray 0.0.1 → 0.1.0.pre1

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 (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -0,0 +1,74 @@
1
+ #include "ray.hpp"
2
+
3
+ VALUE ray_mInput = Qnil;
4
+
5
+ const sf::Input &ray_input() {
6
+ return ray_screen.GetInput();
7
+ }
8
+
9
+ /*
10
+ @overload holding?(key)
11
+ @param [Integer] key Key code
12
+ @return [true, false] True if key is pressed
13
+ */
14
+ VALUE ray_input_holding(VALUE self, VALUE key) {
15
+ return ray_input().IsKeyDown((sf::Key::Code)NUM2INT(key)) ? Qtrue : Qfalse;
16
+ }
17
+
18
+ /*
19
+ @overload mouse_button_down?(button)
20
+ @param [Integer] button Mouse button code
21
+ @return [true, false] True if the button is pressed
22
+ */
23
+ VALUE ray_input_mouse_button_down(VALUE self, VALUE button) {
24
+ return ray_input().IsMouseButtonDown((sf::Mouse::Button)NUM2INT(button)) ?
25
+ Qtrue : Qfalse;
26
+ }
27
+
28
+ /*
29
+ @overload jostick_button_down?(joy_id, button)
30
+ @param [Integer] joy_id Id of the joytick
31
+ @param [Integer] button button id
32
+ @return [true, false] True if the button is pressed
33
+ */
34
+ VALUE ray_input_joystick_button_down(VALUE self, VALUE joy_id, VALUE button) {
35
+ return ray_input().IsJoystickButtonDown(NUM2INT(joy_id),
36
+ NUM2INT(button)) ?
37
+ Qtrue : Qfalse;
38
+ }
39
+
40
+ /* @return [Integer] mouse x position */
41
+ VALUE ray_input_mouse_x(VALUE self) {
42
+ return INT2FIX(ray_input().GetMouseX());
43
+ }
44
+
45
+ /* @return [Integer] mouse y position */
46
+ VALUE ray_input_mouse_y(VALUE self) {
47
+ return INT2FIX(ray_input().GetMouseY());
48
+ }
49
+
50
+ /*
51
+ @overload axis_position(joy_id, axis_id)
52
+ @param [Integer] joy_id Id of the joystick
53
+ @param [Integer] axis_id Id of the axis
54
+ @return [Float] current position of the axis, between -100 and 100.
55
+ */
56
+ VALUE ray_input_axis_position(VALUE self, VALUE joy_id, VALUE axis_id) {
57
+ return rb_float_new(ray_input().GetJoystickAxis(NUM2INT(joy_id),
58
+ (sf::Joy::Axis)NUM2INT(axis_id)));
59
+ }
60
+
61
+ void Init_ray_input() {
62
+ ray_mInput = rb_define_module_under(ray_mRay, "Input");
63
+
64
+ rb_define_module_function(ray_mInput, "holding?", ray_input_holding, 1);
65
+ rb_define_module_function(ray_mInput, "mouse_button_down?",
66
+ ray_input_mouse_button_down, 1);
67
+ rb_define_module_function(ray_mInput, "jostick_button_down?",
68
+ ray_input_joystick_button_down, 2);
69
+
70
+ rb_define_module_function(ray_mInput, "mouse_x", ray_input_mouse_x, 0);
71
+ rb_define_module_function(ray_mInput, "mouse_y", ray_input_mouse_y, 0);
72
+
73
+ rb_define_module_function(ray_mInput, "axis_position", ray_input_axis_position, 2);
74
+ }
@@ -0,0 +1,168 @@
1
+ #include "ray.hpp"
2
+
3
+ VALUE ray_mRay = Qnil;
4
+ sf::RenderWindow ray_screen;
5
+
6
+ ray_video_mode ray_parse_video_mode(VALUE hash) {
7
+ VALUE width = rb_hash_aref(hash, RAY_SYM("width"));
8
+ VALUE height = rb_hash_aref(hash, RAY_SYM("height"));
9
+
10
+ if (NIL_P(width)) width = rb_hash_aref(hash, RAY_SYM("w"));
11
+ if (NIL_P(height)) height = rb_hash_aref(hash, RAY_SYM("h"));
12
+
13
+ if (NIL_P(width) || NIL_P(height))
14
+ rb_raise(rb_eArgError, "Missing parameter: width or height");
15
+
16
+ VALUE bitsperpixel = rb_hash_aref(hash, RAY_SYM("bits_per_pixel"));
17
+ if (NIL_P(bitsperpixel)) bitsperpixel = rb_hash_aref(hash, RAY_SYM("bpp"));
18
+
19
+ if (NIL_P(bitsperpixel))
20
+ bitsperpixel = INT2FIX(32);
21
+
22
+ uint32_t flags = sf::Style::None;
23
+
24
+ if (RTEST(rb_hash_aref(hash, RAY_SYM("fullscreen"))))
25
+ flags |= sf::Style::Fullscreen;
26
+
27
+ if (!RTEST(rb_hash_aref(hash, RAY_SYM("no_frame")))) {
28
+ flags |= sf::Style::Titlebar;
29
+ flags |= sf::Style::Close;
30
+ }
31
+
32
+ if (RTEST(rb_hash_aref(hash, RAY_SYM("resizable"))))
33
+ flags |= sf::Style::Resize;
34
+
35
+ ray_video_mode mode = {
36
+ NUM2INT(width),
37
+ NUM2INT(height),
38
+
39
+ NUM2INT(bitsperpixel),
40
+
41
+ flags
42
+ };
43
+
44
+ return mode;
45
+ }
46
+
47
+ /*
48
+ @overload create_window(hash)
49
+ Creates a new window.
50
+
51
+ If both hw_surface and sws_urface are false, hw_surface
52
+ will be considered as true. :sw_surface should be true
53
+ if you want to acess
54
+
55
+ @return [Ray::Image] An image representing the window
56
+
57
+ @option hash [Integer] :width Width of the window
58
+ @option hash [Integer] :height Height of the window
59
+
60
+ @option hash [Integer] :w Alias for width
61
+ @option hash [Integer] :h Alias for height
62
+
63
+ @option hash [Integer] :bits_per_pixel Bits per pixel. Valid values are
64
+ 8, 15, 16, 24, and 32.
65
+ @option hash [Integer] :bpp Alias for bits_per_pixel
66
+
67
+ @option hash [true, false] :hw_surface Creates the surface in video memory
68
+ (default)
69
+ @option hash [true, false] :sw_surface Creates the surface in system memory
70
+ @option hash [true, false] :async_blit Enables asynchronous updates of the
71
+ the surface
72
+ @option hash [true, false] :double_buf Enables double buffering. Ignored
73
+ if sw_surface is set.
74
+ @option hash [true, false] :fullscreen Creates a full screen window.
75
+ @option hash [true, false] :resizable Creates a resizable window.
76
+ @option hash [true, false] :no_frame Disables window decoration if
77
+ possible.
78
+ */
79
+ VALUE ray_create_window(VALUE self, VALUE hash) {
80
+ ray_video_mode mode = ray_parse_video_mode(hash);
81
+
82
+ sf::VideoMode sfml_mode(mode.width, mode.height, mode.bpp);
83
+ if (mode.flags & sf::Style::Fullscreen) {
84
+ if (!sfml_mode.IsValid())
85
+ rb_raise(rb_eRuntimeError, "Invalid fullscreen mode");
86
+ }
87
+
88
+ ray_screen.Create(sfml_mode, "", mode.flags);
89
+
90
+ return ray_create_screen();
91
+ }
92
+
93
+ /*
94
+ @overload icon=(icon)
95
+ Sets the window icon
96
+ @param [Ray::Image] icon The icon to display
97
+ */
98
+ VALUE ray_set_icon(VALUE self, VALUE icon) {
99
+ ray_image *image = ray_rb2image(icon);
100
+ ray_screen.SetIcon(image->width(), image->height(),
101
+ image->pixels());
102
+ return Qnil;
103
+ }
104
+
105
+ /*
106
+ @overload window_title=(title)
107
+ Sets the window title
108
+ */
109
+ VALUE ray_set_window_title(VALUE self, VALUE title) {
110
+ if (!NIL_P(title)) {
111
+ title = rb_String(title);
112
+ ray_screen.SetTitle(StringValuePtr(title));
113
+ }
114
+ else
115
+ ray_screen.SetTitle("");
116
+
117
+ return title;
118
+ }
119
+
120
+ /* @return [Ray::Image, nil] The current screen, created by create_window */
121
+ VALUE ray_get_screen(VALUE self) {
122
+ if (!ray_screen.IsOpened())
123
+ return Qnil;
124
+ return ray_create_screen();
125
+ }
126
+
127
+ /* Starts outputing error to stderr */
128
+ VALUE ray_verbose(VALUE self) {
129
+ sf::Err().rdbuf(std::cerr.rdbuf());
130
+ return Qnil;
131
+ }
132
+
133
+ /* Stops outputing errors to stderr (default) */
134
+ VALUE ray_quiet(VALUE self) {
135
+ sf::Err().rdbuf(NULL);
136
+ return Qnil;
137
+ }
138
+
139
+ extern "C"
140
+ void Init_ray_ext() {
141
+ sf::Err().rdbuf(NULL); /* Don't put errors in stderr */
142
+
143
+ ray_mRay = rb_define_module("Ray");
144
+
145
+ rb_define_module_function(ray_mRay, "create_window", ray_create_window, 1);
146
+ rb_define_module_function(ray_mRay, "screen", ray_get_screen, 0);
147
+
148
+ rb_define_module_function(ray_mRay, "icon=", ray_set_icon, 1);
149
+ rb_define_module_function(ray_mRay, "window_title=", ray_set_window_title,
150
+ 1);
151
+
152
+ rb_define_module_function(ray_mRay, "verbose!", ray_verbose, 0);
153
+ rb_define_module_function(ray_mRay, "quiet!", ray_quiet, 0);
154
+
155
+ Init_ray_image();
156
+ Init_ray_sprite();
157
+ Init_ray_color();
158
+ Init_ray_rect();
159
+ Init_ray_vector();
160
+ Init_ray_event();
161
+ Init_ray_input();
162
+ Init_ray_shape();
163
+ Init_ray_font();
164
+ Init_ray_text();
165
+ Init_ray_audio();
166
+ Init_ray_drawable();
167
+ Init_ray_shader();
168
+ }
@@ -0,0 +1,356 @@
1
+ #ifndef RAY_H_
2
+ #define RAY_H_
3
+
4
+ #include "ruby.h"
5
+
6
+ #include <SFML/Graphics.hpp>
7
+ #include <SFML/OpenGL.hpp>
8
+ #include <SFML/Audio.hpp>
9
+
10
+ #include <iostream>
11
+
12
+ extern sf::RenderWindow ray_screen;
13
+
14
+ /* Classes and modules */
15
+ extern VALUE ray_mRay;
16
+
17
+ extern VALUE ray_cImage;
18
+ extern VALUE ray_cSprite;
19
+ extern VALUE ray_cShape;
20
+ extern VALUE ray_cColor;
21
+ extern VALUE ray_cRect;
22
+ extern VALUE ray_cVector2;
23
+ extern VALUE ray_cVector3;
24
+ extern VALUE ray_cEvent;
25
+ extern VALUE ray_mInput;
26
+ extern VALUE ray_cFont;
27
+ extern VALUE ray_cText;
28
+ extern VALUE ray_mAudio;
29
+ extern VALUE ray_cAudioSource;
30
+ extern VALUE ray_cSound;
31
+ extern VALUE ray_cMusic;
32
+ extern VALUE ray_cDrawable;
33
+ extern VALUE ray_cShader;
34
+
35
+ /* Macros for Ruby's C API */
36
+
37
+ #define RAY_IS_A(obj, klass) (RTEST(rb_obj_is_kind_of(obj, klass)))
38
+
39
+ #define RAY_OBJ_CLASSNAME(obj) (rb_class2name(rb_class_of(obj)))
40
+
41
+ #define RAY_SYM(string) (ID2SYM(rb_intern(string)))
42
+ #define RAY_METH(string) (rb_intern(string))
43
+
44
+ #define RAY_FLOAT_RECT(rect) \
45
+ (sf::FloatRect(rect.Left, rect.Top, rect.Width, rect.Height))
46
+ #define RAY_INT_RECT(rect) \
47
+ (sf::IntRect(rect.Left, rect.Top, rect.Width, rect.Height))
48
+ #define RAY_RECT(rect) \
49
+ (ray_rect(rect.Left, rect.Top, rect.Width, rect.Height))
50
+
51
+ /* Data types */
52
+
53
+ typedef struct {
54
+ int width;
55
+ int height;
56
+
57
+ int bpp;
58
+
59
+ uint32_t flags;
60
+ } ray_video_mode;
61
+
62
+ typedef sf::Color ray_color;
63
+
64
+ typedef sf::FloatRect ray_rect;
65
+ typedef sf::Vector2f ray_vector2;
66
+ typedef sf::Vector3f ray_vector3;
67
+
68
+ class ray_image {
69
+ public:
70
+ ray_image(bool should_be_screen = false);
71
+ ~ray_image();
72
+
73
+ bool create_with_size(int w, int h);
74
+ bool create_with_filename(const std::string &filename);
75
+ bool create_with_io(VALUE io);
76
+ bool create_with_image(ray_image &src);
77
+
78
+ bool save_as(const std::string &filename) const;
79
+
80
+ int width() const;
81
+ int height() const;
82
+
83
+ void update();
84
+
85
+ sf::Sprite &get_sprite() { return sprite; }
86
+
87
+ void fill(sf::Color color);
88
+ void draw(const sf::Drawable &drawable,
89
+ sf::Shader *shader = NULL);
90
+
91
+ void draw_image(ray_image &image,
92
+ const ray_rect &src_rect, const ray_vector2 &dest_pos,
93
+ float angle, const ray_vector2 &zoom,
94
+ sf::Shader *shader = NULL,
95
+ const ray_color &color = sf::Color::White);
96
+
97
+ ray_color at(int x, int y) const;
98
+ bool set_at(int x, int y, const ray_color &color);
99
+
100
+ const uint8_t *pixels() const;
101
+
102
+ bool operator==(const ray_image &other) const;
103
+
104
+ ray_rect clip() const;
105
+ void set_clip(const ray_rect &other);
106
+
107
+ bool lock();
108
+ void unlock();
109
+
110
+ void activate();
111
+ void bind();
112
+
113
+ bool is_image() const;
114
+ const sf::Image &image() const;
115
+
116
+ sf::RenderTarget &target();
117
+ const sf::RenderTarget &target() const;
118
+ private:
119
+ bool is_screen;
120
+
121
+ sf::RenderImage render_image;
122
+ sf::Sprite sprite;
123
+
124
+ sf::Image *pixel_modifier;
125
+ };
126
+
127
+ class ray_sprite {
128
+ public:
129
+ ray_sprite();
130
+ ~ray_sprite();
131
+
132
+ void copy(const ray_sprite &sprite);
133
+
134
+ void set_self(VALUE self);
135
+
136
+ ray_rect from_rect() const;
137
+ void set_from_rect(const ray_rect &rect);
138
+
139
+ ray_vector2 position() const;
140
+ void set_position(const ray_vector2 &pos);
141
+
142
+ float angle() const;
143
+ void set_angle(float angle);
144
+
145
+ ray_vector2 scale() const;
146
+ void set_scale(const ray_vector2 &scale);
147
+
148
+ ray_color color() const;
149
+ void set_color(const ray_color &color);
150
+
151
+ VALUE get_shader() const;
152
+ void set_shader(VALUE shader);
153
+
154
+ VALUE get_image() const;
155
+ void set_image(VALUE image);
156
+
157
+ void draw_on(ray_image &image);
158
+ private:
159
+ sf::Sprite sprite;
160
+ VALUE self;
161
+ };
162
+
163
+ typedef sf::Font ray_font;
164
+
165
+ class ray_audio_source {
166
+ public:
167
+ virtual ~ray_audio_source() {}
168
+
169
+ void set_pitch(float value);
170
+ float pitch() const;
171
+
172
+ void set_position(const ray_vector3 &vector);
173
+ ray_vector3 position() const;
174
+
175
+ void set_relative(bool value);
176
+ bool is_relative() const;
177
+
178
+ void set_min_distance(float value);
179
+ float min_distance() const;
180
+
181
+ void set_attenuation(float value);
182
+ float attenuation() const;
183
+
184
+ void set_volume(float value);
185
+ float volume() const;
186
+ protected:
187
+ virtual sf::SoundSource &source() = 0;
188
+ virtual const sf::SoundSource &source() const = 0;
189
+ };
190
+
191
+ class ray_sound : public ray_audio_source {
192
+ public:
193
+ bool load_from_io(VALUE io);
194
+ bool load_from_filename(const std::string &filename);
195
+ bool create_from_sound(const ray_sound &sound);
196
+
197
+ void play();
198
+ void pause();
199
+ void stop();
200
+
201
+ sf::SoundSource::Status status() const;
202
+
203
+ void set_loop(bool value);
204
+ bool is_looping() const;
205
+
206
+ void set_current_time(float value);
207
+ float current_time() const;
208
+ protected:
209
+ sf::SoundSource &source();
210
+ const sf::SoundSource &source() const;
211
+ private:
212
+ sf::SoundBuffer sound_buffer;
213
+ sf::Sound sound;
214
+ };
215
+
216
+ class ray_music : public ray_audio_source {
217
+ public:
218
+ bool load_from_io(VALUE self, VALUE io);
219
+ bool load_from_filename(const std::string &filename);
220
+
221
+ void play();
222
+ void pause();
223
+ void stop();
224
+
225
+ sf::SoundSource::Status status() const;
226
+
227
+ void set_loop(bool value);
228
+ bool is_looping() const;
229
+
230
+ void set_current_time(float value);
231
+ float current_time() const;
232
+
233
+ float duration() const;
234
+
235
+ int sample_rate() const;
236
+ int channel_count() const;
237
+ protected:
238
+ sf::SoundSource &source();
239
+ const sf::SoundSource &source() const;
240
+ private:
241
+ sf::Music music;
242
+ };
243
+
244
+ typedef sf::Event ray_event;
245
+
246
+ class ray_drawable {
247
+ public:
248
+ ray_drawable(): block(Qnil) {}
249
+ ~ray_drawable();
250
+
251
+ void render(VALUE image);
252
+
253
+ void set_block(VALUE val);
254
+ private:
255
+ VALUE block;
256
+ };
257
+
258
+ /* Convertion functions */
259
+
260
+ /** Converts a color into a ruby object */
261
+ VALUE ray_col2rb(const ray_color &color);
262
+
263
+ /** Converts a rect into a ruby object */
264
+ VALUE ray_rect2rb(const ray_rect &rect);
265
+
266
+ VALUE ray_vector2_to_rb(const ray_vector2 &vector);
267
+ VALUE ray_vector3_to_rb(const ray_vector3 &vector);
268
+
269
+ /** Converts a font into a ruby object */
270
+ VALUE ray_font2rb(const ray_font &font);
271
+
272
+ /** Converts a ruby object into a color */
273
+ ray_color ray_rb2col(VALUE object);
274
+
275
+ /** Parses a hash to create a video mode */
276
+ ray_video_mode ray_parse_video_mode(VALUE hash);
277
+
278
+ /** Converts a ruby object into an image*/
279
+ ray_image *ray_rb2image(VALUE object);
280
+
281
+ /** Returns a Ruby object representing the screen */
282
+ VALUE ray_create_screen();
283
+
284
+ /** Converts a ruby object into a rect */
285
+ ray_rect ray_rb2rect(VALUE object);
286
+
287
+ /** Converts a ruby object into a shape */
288
+ sf::Shape *ray_rb2shape(VALUE object);
289
+
290
+ /** Converts a ruby object into a shader */
291
+ sf::Shader *ray_rb2shader(VALUE object);
292
+
293
+ /**
294
+ Converts a ruby object into a rect even if it's not an instance
295
+ of Ray::Rect.
296
+ */
297
+ ray_rect ray_convert_to_rect(VALUE obj);
298
+
299
+ /** Converts a ruby object into a vector2 using #to_vector2 */
300
+ ray_vector2 ray_convert_to_vector2(VALUE obj);
301
+
302
+ /** Converts a ruby object into a vector3 using #to_vector3 */
303
+ ray_vector3 ray_convert_to_vector3(VALUE obj);
304
+
305
+ /** Converts a ruby object into an event */
306
+ ray_event *ray_rb2event(VALUE object);
307
+
308
+ /** Converts a ruby object into a font */
309
+ ray_font *ray_rb2font(VALUE object);
310
+
311
+ /** Converts a ruby object into an audio source */
312
+ ray_audio_source *ray_rb2source(VALUE object);
313
+
314
+ /** Converts a ruby object into a sound */
315
+ ray_sound *ray_rb2sound(VALUE object);
316
+
317
+ /** Converts a ruby object into a music */
318
+ ray_music *ray_rb2music(VALUE object);
319
+
320
+ /** Converts a ruby object into a drawable */
321
+ ray_drawable *ray_rb2drawable(VALUE obj);
322
+
323
+ /* Initializers */
324
+
325
+ extern "C" void Init_ray_ext();
326
+ void Init_ray_image();
327
+ void Init_ray_sprite();
328
+ void Init_ray_color();
329
+ void Init_ray_rect();
330
+ void Init_ray_vector();
331
+ void Init_ray_event();
332
+ void Init_ray_input();
333
+ void Init_ray_shape();
334
+ void Init_ray_font();
335
+ void Init_ray_text();
336
+ void Init_ray_audio();
337
+ void Init_ray_drawable();
338
+ void Init_ray_shader();
339
+
340
+ /* Hack to make it compile, and still let YARD parse the source code: */
341
+
342
+ #if !RUBINIUS /* Won't work on Rubinius, and unneeded */
343
+ # define rb_define_method(klass, name, func, argc) \
344
+ rb_define_method(klass, name, (VALUE (*)(...))(func), argc)
345
+
346
+ # define rb_define_singleton_method(klass, name, func, argc) \
347
+ rb_define_singleton_method(klass, name, (VALUE (*)(...))(func), argc)
348
+ #endif
349
+
350
+ #define rb_define_module_function(klass, name, func, argc) \
351
+ rb_define_module_function(klass, name, (VALUE (*)(...))(func), argc)
352
+
353
+ #define rb_ensure(func1, arg1, func2, arg2) \
354
+ rb_ensure((VALUE (*)(...))(func1), arg1, (VALUE (*)(...))func2, arg2)
355
+
356
+ #endif