ray 0.0.1 → 0.1.0.pre1

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