sfml3-rb 0.0.1

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 (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +14 -0
  3. data/README.md +110 -0
  4. data/ext/circle.c +198 -0
  5. data/ext/clock.c +65 -0
  6. data/ext/color.c +43 -0
  7. data/ext/drawable.c +39 -0
  8. data/ext/event.c +148 -0
  9. data/ext/event_name.c +45 -0
  10. data/ext/exceptions.c +44 -0
  11. data/ext/ext/exceptions.h +16 -0
  12. data/ext/ext/klass/clock.h +12 -0
  13. data/ext/ext/klass/color.h +26 -0
  14. data/ext/ext/klass/drawable/circle.h +12 -0
  15. data/ext/ext/klass/drawable/image.h +4 -0
  16. data/ext/ext/klass/drawable/polygon.h +4 -0
  17. data/ext/ext/klass/drawable/rectangle.h +4 -0
  18. data/ext/ext/klass/drawable/sprite.h +4 -0
  19. data/ext/ext/klass/drawable/texture.h +4 -0
  20. data/ext/ext/klass/event/event_name.h +8 -0
  21. data/ext/ext/klass/event.h +12 -0
  22. data/ext/ext/klass/keyboard.h +8 -0
  23. data/ext/ext/klass/render_state.h +16 -0
  24. data/ext/ext/klass/target.h +18 -0
  25. data/ext/ext/klass/transform.h +17 -0
  26. data/ext/ext/klass/transformable.h +13 -0
  27. data/ext/ext/klass/video_mode.h +12 -0
  28. data/ext/ext/klass/view.h +14 -0
  29. data/ext/ext/klass/window.h +12 -0
  30. data/ext/ext/module/drawable/drawable.h +10 -0
  31. data/ext/ext/module/transform.h +18 -0
  32. data/ext/ext/module.h +10 -0
  33. data/ext/ext/rect.h +16 -0
  34. data/ext/ext/sfml.h +16 -0
  35. data/ext/ext/style_name.h +11 -0
  36. data/ext/ext/vec2.h +38 -0
  37. data/ext/ext.c +47 -0
  38. data/ext/extconf.rb +84 -0
  39. data/ext/image.c +5 -0
  40. data/ext/keyboard.c +135 -0
  41. data/ext/polygon.c +5 -0
  42. data/ext/ports.rb +368 -0
  43. data/ext/rect.c +26 -0
  44. data/ext/rectangle.c +5 -0
  45. data/ext/render_state.c +109 -0
  46. data/ext/sprite.c +5 -0
  47. data/ext/style_name.c +15 -0
  48. data/ext/target.c +106 -0
  49. data/ext/texture.c +5 -0
  50. data/ext/transform.c +107 -0
  51. data/ext/transformable.c +145 -0
  52. data/ext/vec2.c +42 -0
  53. data/ext/video_mode.c +78 -0
  54. data/ext/view.c +170 -0
  55. data/ext/window.c +274 -0
  56. data/lib/sfml/version.rb +3 -0
  57. data/lib/sfml.rb +9 -0
  58. metadata +104 -0
data/ext/window.c ADDED
@@ -0,0 +1,274 @@
1
+ #include "ext/klass/window.h"
2
+
3
+ #include <stdio.h>
4
+
5
+ #include "ext/klass/render_state.h"
6
+ #include "ext/module/drawable/drawable.h"
7
+ #include "ext/klass/drawable/circle.h"
8
+ #include "ext/klass/target.h"
9
+ #include "ext/klass/view.h"
10
+ #include "ext/klass/video_mode.h"
11
+ #include "ext/klass/event.h"
12
+ #include "ext/klass/color.h"
13
+ #include "ext/exceptions.h"
14
+ #include "ext/style_name.h"
15
+ #include "ext/vec2.h"
16
+ #include "ext/module.h"
17
+ #include "ext/sfml.h"
18
+
19
+ static VALUE rb_cWindow;
20
+
21
+ static sfRenderWindow *Window_create(sfVideoMode *mode, const char *title) {
22
+ return sfRenderWindow_create(*mode, title, sfDefaultStyle, sfWindowed, NULL);
23
+ }
24
+
25
+ static void Window_free(void *ptr) {
26
+ sfRenderWindow_destroy((sfRenderWindow *) ptr);
27
+ }
28
+
29
+ static VALUE Window_new(int argc, VALUE *argv, VALUE klass) {
30
+ VALUE self, rb_video_mode, rb_title;
31
+ sfRenderWindow *window;
32
+
33
+ if (argc > 2) {
34
+ raise_invalid_arguments_excepted(2, argc);
35
+ }
36
+
37
+ rb_video_mode = argv[0];
38
+ rb_title = argv[1];
39
+
40
+ if (!rb_obj_is_kind_of(rb_video_mode, Get_Klass_Mode())) {
41
+ raise_invalid_argument_class(Get_Klass_Mode());
42
+ rb_raise(rb_eArgError, "wrong object, expected a VideoMode");
43
+ }
44
+
45
+ window = Window_create(Get_Mode_Struct(rb_video_mode), RSTRING_PTR(rb_title));
46
+ self = Data_Wrap_Struct(klass, 0, Window_free, window);
47
+
48
+ rb_obj_call_init(self, argc, argv);
49
+
50
+ return self;
51
+ }
52
+
53
+ static VALUE Window_init(int argc, VALUE *argv, VALUE self) {
54
+ return self;
55
+ }
56
+
57
+ static VALUE Window_is_open(VALUE self) {
58
+ return BOOL2RB(sfRenderWindow_isOpen(Get_Window_Struct(self)));
59
+ }
60
+
61
+ static VALUE Window_close(VALUE self) {
62
+ sfRenderWindow_close(Get_Window_Struct(self));
63
+ return self;
64
+ }
65
+
66
+ static VALUE Window_clear(int argc, VALUE *argv, VALUE self) {
67
+ sfColor color = sfBlack;
68
+
69
+ if (argc > 1) {
70
+ raise_invalid_arguments_excepted(1, argc);
71
+ }
72
+
73
+ if (argc == 1) {
74
+ color_check(argv[0]);
75
+ color = color_new_from_rb(argv[0]);
76
+ }
77
+
78
+ sfRenderWindow_clear(Get_Window_Struct(self), color);
79
+
80
+ return self;
81
+ }
82
+
83
+ static VALUE Window_display(VALUE self) {
84
+ sfRenderWindow_display(Get_Window_Struct(self));
85
+ return self;
86
+ }
87
+
88
+ static VALUE Window_poll_event(VALUE self, VALUE rb_event) {
89
+ if (!rb_obj_is_kind_of(rb_event, Get_Klass_Event())) {
90
+ raise_invalid_argument_class(Get_Klass_Event());
91
+ }
92
+
93
+ return BOOL2RB(sfRenderWindow_pollEvent(Get_Window_Struct(self), Get_Event_Struct(rb_event)));
94
+ }
95
+
96
+ static VALUE Window_wait_event(VALUE self, VALUE rb_event) {
97
+ if (!rb_obj_is_kind_of(rb_event, Get_Klass_Event())) {
98
+ raise_invalid_argument_class(Get_Klass_Event());
99
+ }
100
+
101
+ return BOOL2RB(sfRenderWindow_waitEvent(Get_Window_Struct(self), sfTime_Zero, Get_Event_Struct(rb_event)));
102
+ }
103
+
104
+ static VALUE Window_get_position(VALUE self) {
105
+ return VEC2_C2RB(sfRenderWindow_getPosition(Get_Window_Struct(self)));
106
+ }
107
+
108
+ static VALUE Window_set_position(VALUE self, VALUE rb_arr) {
109
+ sfRenderWindow_setPosition(Get_Window_Struct(self), vec2i_new_from_ruby(rb_arr));
110
+ return self;
111
+ }
112
+
113
+ static VALUE Window_set_frame_rate(VALUE self, VALUE rb_limit) {
114
+ sfRenderWindow_setFramerateLimit(Get_Window_Struct(self), NUM2INT(rb_limit));
115
+ return self;
116
+ }
117
+
118
+ static VALUE Window_set_size(VALUE self, VALUE rb_size) {
119
+ sfRenderWindow_setSize(Get_Window_Struct(self), vec2u_new_from_ruby(rb_size));
120
+ return self;
121
+ }
122
+
123
+ static VALUE Window_set_title(VALUE self, VALUE rb_title) {
124
+ sfRenderWindow_setTitle(Get_Window_Struct(self), RSTRING_PTR(rb_title));
125
+ return self;
126
+ }
127
+
128
+ static VALUE Window_set_icon(VALUE self, VALUE rb_icon) {
129
+ return self;
130
+ }
131
+
132
+ static VALUE Window_set_visible(VALUE self, VALUE rb_visible) {
133
+ sfRenderWindow_setVisible(Get_Window_Struct(self), RTEST(rb_visible));
134
+ return self;
135
+
136
+ }
137
+
138
+ static VALUE Window_set_vertical_sync_enabled(VALUE self, VALUE rb_enable) {
139
+ sfRenderWindow_setVerticalSyncEnabled(Get_Window_Struct(self), RTEST(rb_enable));
140
+ return self;
141
+ }
142
+
143
+ static VALUE Window_set_mouse_cursor_visible(VALUE self, VALUE rb_visible) {
144
+ sfRenderWindow_setMouseCursorVisible(Get_Window_Struct(self), RTEST(rb_visible));
145
+ return self;
146
+ }
147
+
148
+ static VALUE Window_set_mouse_cursor_grabbed(VALUE self, VALUE rb_grabbed) {
149
+ sfRenderWindow_setMouseCursorGrabbed(Get_Window_Struct(self), RTEST(rb_grabbed));
150
+ return self;
151
+ }
152
+
153
+ static VALUE Window_set_mouse_cursor(VALUE self, VALUE rb_cursor) {
154
+ raise_method_no_implemented(NULL);
155
+ return self;
156
+ }
157
+
158
+ static VALUE Window_set_key_repeat_enabled(VALUE self, VALUE rb_enabled) {
159
+ sfRenderWindow_setKeyRepeatEnabled(Get_Window_Struct(self), RTEST(rb_enabled));
160
+ return self;
161
+ }
162
+
163
+ static VALUE Window_set_joystick_threshold(VALUE self, VALUE rb_threshold) {
164
+ sfRenderWindow_setJoystickThreshold(Get_Window_Struct(self), RTEST(rb_threshold));
165
+ return self;
166
+ }
167
+
168
+ static VALUE Window_request_focus(VALUE self) {
169
+ sfRenderWindow_requestFocus(Get_Window_Struct(self));
170
+ return self;
171
+ }
172
+
173
+
174
+ static VALUE Window_has_focus(VALUE self) {
175
+ return BOOL2RB(sfRenderWindow_hasFocus(Get_Window_Struct(self)));
176
+ }
177
+
178
+ static VALUE Window_draw(int argc, VALUE *argv, VALUE self) {
179
+ VALUE rb_drawable;
180
+ sfRenderStates *states;
181
+ sfRenderWindow *window;
182
+
183
+ if (argc == 0 || argc > 2) {
184
+ raise_invalid_arguments_excepted(-1, argc);
185
+ }
186
+
187
+ rb_drawable = argv[0];
188
+ window = Get_Window_Struct(self);
189
+ states = NULL;
190
+
191
+ if (argc == 2) {
192
+ VALUE rb_state = argv[1];
193
+
194
+ if (rb_obj_is_kind_of(rb_state, Get_Klass_RenderState())) {
195
+ states = Get_RenderState_Struct(rb_state);
196
+ } else {
197
+ raise_invalid_argument_class(Get_Klass_RenderState());
198
+ }
199
+ }
200
+
201
+ if (rb_obj_is_kind_of(rb_drawable, Get_Klass_Circle())) {
202
+ sfRenderWindow_drawCircleShape(window, Get_Circle_Struct(rb_drawable), states);
203
+ } else {
204
+ rb_funcall(rb_drawable, rb_intern("draw"), 2, Get_New_Target(self), Get_New_RenderState());
205
+ }
206
+
207
+ return self;
208
+ }
209
+
210
+ static VALUE Window_set_view(VALUE self, VALUE rb_view) {
211
+ if (!rb_obj_is_kind_of(rb_view, Get_Klass_View())) {
212
+ rb_raise(rb_eArgError, "invalid object, expected a View object");
213
+ }
214
+
215
+ sfRenderWindow_setView(Get_Window_Struct(self), Get_View_Struct(rb_view));
216
+
217
+ return self;
218
+ }
219
+
220
+ static VALUE Window_get_view(VALUE self) {
221
+ return Get_Casting_View(sfView_copy(sfRenderWindow_getView(Get_Window_Struct(self))));
222
+ }
223
+
224
+ static VALUE Window_get_default_view(VALUE self) {
225
+ return Get_Casting_View(sfView_copy((sfRenderWindow_getDefaultView(Get_Window_Struct(self)))));
226
+ }
227
+
228
+ void Init_Window(VALUE rb_module) {
229
+ rb_cWindow = rb_define_class_under(rb_module, "Window", rb_cObject);
230
+
231
+ rb_define_singleton_method(rb_cWindow, "new", Window_new, -1);
232
+
233
+ // methods
234
+ rb_define_method(rb_cWindow, "initialize", Window_init, -1);
235
+ rb_define_method(rb_cWindow, "is_open?", Window_is_open, 0);
236
+ rb_define_method(rb_cWindow, "close!", Window_close, 0);
237
+ rb_define_method(rb_cWindow, "clear", Window_clear, -1);
238
+ rb_define_method(rb_cWindow, "display", Window_display, 0);
239
+ rb_define_method(rb_cWindow, "poll_event!", Window_poll_event, 1);
240
+ rb_define_method(rb_cWindow, "wait_event!", Window_wait_event, 1);
241
+
242
+ // setters
243
+ rb_define_method(rb_cWindow, "frame_rate=", Window_set_frame_rate, 1);
244
+ rb_define_method(rb_cWindow, "size=", Window_set_size, 1);
245
+ rb_define_method(rb_cWindow, "title=", Window_set_title, 1);
246
+ rb_define_method(rb_cWindow, "icon=", Window_set_icon, 1);
247
+ rb_define_method(rb_cWindow, "visible=", Window_set_visible, 1);
248
+ rb_define_method(rb_cWindow, "vertical_sync_enabled=", Window_set_vertical_sync_enabled, 1);
249
+ rb_define_method(rb_cWindow, "cursor_visible=", Window_set_mouse_cursor_visible, 1);
250
+ rb_define_method(rb_cWindow, "cursor_grabbed=", Window_set_mouse_cursor_grabbed, 1);
251
+ rb_define_method(rb_cWindow, "mouse_cursor=", Window_set_mouse_cursor, 1);
252
+ rb_define_method(rb_cWindow, "key_repeat_enabled=", Window_set_key_repeat_enabled, 1);
253
+ rb_define_method(rb_cWindow, "joystick_threshold=", Window_set_joystick_threshold, 1);
254
+ rb_define_method(rb_cWindow, "position=", Window_set_position, 1);
255
+ rb_define_method(rb_cWindow, "view=", Window_set_view, 1);
256
+
257
+ // getters
258
+ rb_define_method(rb_cWindow, "request_focus", Window_request_focus, 0);
259
+ rb_define_method(rb_cWindow, "focus?", Window_has_focus, 0);
260
+ rb_define_method(rb_cWindow, "draw", Window_draw, -1);
261
+ rb_define_method(rb_cWindow, "position", Window_get_position, 0);
262
+ rb_define_method(rb_cWindow, "view", Window_get_view, 0);
263
+ rb_define_method(rb_cWindow, "default_view", Window_get_default_view, 0);
264
+ }
265
+
266
+ void *Get_Window_Struct(VALUE self) {
267
+ sfRenderWindow *ptr;
268
+ Data_Get_Struct(self, sfRenderWindow, ptr);
269
+ return ptr;
270
+ }
271
+
272
+ VALUE Get_Klass_Window() {
273
+ return rb_cWindow;
274
+ }
@@ -0,0 +1,3 @@
1
+ module SFML
2
+ VERSION = '0.0.1'.freeze
3
+ end
data/lib/sfml.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'sfml/version'
2
+
3
+ begin
4
+ # Binary gems ship one extension per Ruby ABI under lib/sfml/<major.minor>/.
5
+ # A gem built from source installs a single lib/sfml/sfml_ext.so instead.
6
+ require "sfml/#{RUBY_VERSION[/\d+\.\d+/]}/sfml_ext"
7
+ rescue LoadError
8
+ require 'sfml/sfml_ext'
9
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sfml3-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sealtiel Valderrama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-09-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Ruby bindings for SFML 3 via CSFML. Precompiled binaries are published
14
+ for common platforms; elsewhere SFML and CSFML are downloaded and built from source
15
+ at install time, so neither needs to be installed system-wide.
16
+ email: SealtielFreak@yandex.com
17
+ executables: []
18
+ extensions:
19
+ - ext/extconf.rb
20
+ extra_rdoc_files: []
21
+ files:
22
+ - LICENSE.md
23
+ - README.md
24
+ - ext/circle.c
25
+ - ext/clock.c
26
+ - ext/color.c
27
+ - ext/drawable.c
28
+ - ext/event.c
29
+ - ext/event_name.c
30
+ - ext/exceptions.c
31
+ - ext/ext.c
32
+ - ext/ext/exceptions.h
33
+ - ext/ext/klass/clock.h
34
+ - ext/ext/klass/color.h
35
+ - ext/ext/klass/drawable/circle.h
36
+ - ext/ext/klass/drawable/image.h
37
+ - ext/ext/klass/drawable/polygon.h
38
+ - ext/ext/klass/drawable/rectangle.h
39
+ - ext/ext/klass/drawable/sprite.h
40
+ - ext/ext/klass/drawable/texture.h
41
+ - ext/ext/klass/event.h
42
+ - ext/ext/klass/event/event_name.h
43
+ - ext/ext/klass/keyboard.h
44
+ - ext/ext/klass/render_state.h
45
+ - ext/ext/klass/target.h
46
+ - ext/ext/klass/transform.h
47
+ - ext/ext/klass/transformable.h
48
+ - ext/ext/klass/video_mode.h
49
+ - ext/ext/klass/view.h
50
+ - ext/ext/klass/window.h
51
+ - ext/ext/module.h
52
+ - ext/ext/module/drawable/drawable.h
53
+ - ext/ext/module/transform.h
54
+ - ext/ext/rect.h
55
+ - ext/ext/sfml.h
56
+ - ext/ext/style_name.h
57
+ - ext/ext/vec2.h
58
+ - ext/extconf.rb
59
+ - ext/image.c
60
+ - ext/keyboard.c
61
+ - ext/polygon.c
62
+ - ext/ports.rb
63
+ - ext/rect.c
64
+ - ext/rectangle.c
65
+ - ext/render_state.c
66
+ - ext/sprite.c
67
+ - ext/style_name.c
68
+ - ext/target.c
69
+ - ext/texture.c
70
+ - ext/transform.c
71
+ - ext/transformable.c
72
+ - ext/vec2.c
73
+ - ext/video_mode.c
74
+ - ext/view.c
75
+ - ext/window.c
76
+ - lib/sfml.rb
77
+ - lib/sfml/version.rb
78
+ homepage: https://github.com/algaves/sfml3.rb
79
+ licenses:
80
+ - 0BSD
81
+ metadata:
82
+ source_code_uri: https://github.com/algaves/sfml3.rb
83
+ bug_tracker_uri: https://github.com/algaves/sfml3.rb/issues
84
+ changelog_uri: https://github.com/algaves/sfml3.rb/blob/main/CHANGELOG.md
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: 2.5.0
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubygems_version: 3.5.22
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: SFML wrapper for Ruby
104
+ test_files: []