rgss 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 (64) hide show
  1. checksums.yaml +7 -0
  2. data/.clang-format +6 -0
  3. data/.gitignore +167 -0
  4. data/.yardopts +6 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/Rakefile +9 -0
  9. data/ext/rgss/cglm-v0.7.9.tar.gz +0 -0
  10. data/ext/rgss/color.c +599 -0
  11. data/ext/rgss/entity.c +373 -0
  12. data/ext/rgss/extconf.rb +53 -0
  13. data/ext/rgss/font.c +135 -0
  14. data/ext/rgss/game.c +469 -0
  15. data/ext/rgss/game.h +99 -0
  16. data/ext/rgss/gl.c +3217 -0
  17. data/ext/rgss/glad.c +1140 -0
  18. data/ext/rgss/glad.h +2129 -0
  19. data/ext/rgss/glfw.c +1453 -0
  20. data/ext/rgss/graphics.c +324 -0
  21. data/ext/rgss/image.c +274 -0
  22. data/ext/rgss/input.c +745 -0
  23. data/ext/rgss/khrplatform.h +290 -0
  24. data/ext/rgss/mat4.c +279 -0
  25. data/ext/rgss/pax_global_header +1 -0
  26. data/ext/rgss/point.c +253 -0
  27. data/ext/rgss/rect.c +449 -0
  28. data/ext/rgss/rgss.c +56 -0
  29. data/ext/rgss/rgss.h +241 -0
  30. data/ext/rgss/stb_image.h +7762 -0
  31. data/ext/rgss/stb_image_write.h +1690 -0
  32. data/ext/rgss/stb_rect_pack.h +628 -0
  33. data/ext/rgss/stb_truetype.h +5011 -0
  34. data/ext/rgss/utf8.h +1652 -0
  35. data/ext/rgss/uthash.h +1133 -0
  36. data/ext/rgss/vec.c +114 -0
  37. data/ext/rgss/vec.h +192 -0
  38. data/ext/rgss/vec2.c +489 -0
  39. data/ext/rgss/vec3.c +751 -0
  40. data/ext/rgss/vec4.c +681 -0
  41. data/lib/rgss.rb +140 -0
  42. data/lib/rgss/batch.rb +57 -0
  43. data/lib/rgss/blend.rb +47 -0
  44. data/lib/rgss/game_object.rb +28 -0
  45. data/lib/rgss/plane.rb +95 -0
  46. data/lib/rgss/renderable.rb +158 -0
  47. data/lib/rgss/rgss.so +0 -0
  48. data/lib/rgss/shader.rb +94 -0
  49. data/lib/rgss/shaders/sprite-frag.glsl +40 -0
  50. data/lib/rgss/shaders/sprite-vert.glsl +17 -0
  51. data/lib/rgss/sprite.rb +139 -0
  52. data/lib/rgss/stubs/color.rb +318 -0
  53. data/lib/rgss/stubs/gl.rb +1999 -0
  54. data/lib/rgss/stubs/glfw.rb +626 -0
  55. data/lib/rgss/stubs/rect.rb +324 -0
  56. data/lib/rgss/stubs/rpg.rb +267 -0
  57. data/lib/rgss/stubs/tone.rb +65 -0
  58. data/lib/rgss/texture.rb +132 -0
  59. data/lib/rgss/tilemap.rb +116 -0
  60. data/lib/rgss/version.rb +3 -0
  61. data/lib/rgss/viewport.rb +67 -0
  62. data/rgss.gemspec +44 -0
  63. data/test.png +0 -0
  64. metadata +178 -0
@@ -0,0 +1,745 @@
1
+ #include "game.h"
2
+ #include "utf8.h"
3
+
4
+ #define INPUT RGSS_GAME.input
5
+ #define INPUT_RELEASE -2
6
+ #define INPUT_NONE -1
7
+ #define INPUT_PRESS 0
8
+ #define INPUT_DOWN 1
9
+ #define INPUT_REPEAT_RATE 3
10
+
11
+ #define RGSS_TEXT_CALLBACK "@on_text"
12
+ #define RGSS_FOCUS_CALLBACK "@on_focus"
13
+
14
+ #define KEY(k) RGSS_GAME.input.state.key[k]
15
+ #define MBTN(btn) RGSS_GAME.input.state.mouse[btn]
16
+ #define GPBTN(btn) RGSS_GAME.input.state.gamepad[btn]
17
+
18
+ VALUE rb_mInput;
19
+
20
+
21
+ static inline void RGSS_Mapping_Init(vec_int_t *array, VALUE inputs, int max_value)
22
+ {
23
+ if (!RTEST(inputs))
24
+ return;
25
+
26
+ int value;
27
+ vec_init(array);
28
+ if (RB_TYPE_P(inputs, T_ARRAY))
29
+ {
30
+ long len = rb_array_len(inputs);
31
+ for (long i = 0; i < len; i++)
32
+ {
33
+ value = NUM2INT(rb_ary_entry(inputs, i));
34
+ if (value < 0 || value > max_value)
35
+ {
36
+ rb_warn("invalid input specified: %d (out of range)", value);
37
+ continue;
38
+ }
39
+ vec_push(array, value);
40
+ }
41
+ }
42
+ else
43
+ {
44
+ value = NUM2INT(inputs);
45
+ if (value < 0 || value > max_value)
46
+ {
47
+ rb_warn("invalid input specified: %d (out of range)", value);
48
+ return;
49
+ }
50
+ vec_push(array, value);
51
+ }
52
+ }
53
+
54
+
55
+ static VALUE RGSS_Input_Bind(int argc, VALUE *argv, VALUE input)
56
+ {
57
+
58
+ RGSS_ASSERT_GAME;
59
+
60
+ VALUE name, keys, mouse, gamepad;
61
+ rb_scan_args(argc, argv, "13", &name, &keys, &mouse, &gamepad);
62
+
63
+ RGSS_Mapping *mapping;
64
+ ID id = RB_TYPE_P(name, T_SYMBOL) ? SYM2ID(name) : rb_intern_str(name);;
65
+
66
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
67
+ if (mapping)
68
+ {
69
+ // Free any mapping that may exist at key
70
+ HASH_DEL(RGSS_GAME.input.bindings, mapping);
71
+ xfree(mapping);
72
+ }
73
+
74
+ mapping = ALLOC(RGSS_Mapping);
75
+ memset(mapping, 0, sizeof(RGSS_Mapping));
76
+
77
+ mapping->id = id;
78
+ RGSS_Mapping_Init(&mapping->keys, keys, GLFW_KEY_LAST);
79
+ RGSS_Mapping_Init(&mapping->mouse_buttons, mouse, GLFW_MOUSE_BUTTON_LAST);
80
+ RGSS_Mapping_Init(&mapping->gamepad_buttons, gamepad, GLFW_GAMEPAD_BUTTON_LAST);
81
+
82
+ HASH_ADD(hh, RGSS_GAME.input.bindings, id, sizeof(ID), mapping);
83
+ return Qtrue;
84
+ }
85
+
86
+ static VALUE RGSS_Input_Unbind(VALUE input, VALUE name)
87
+ {
88
+
89
+ RGSS_Mapping *mapping;
90
+ ID id = RB_TYPE_P(name, T_SYMBOL) ? SYM2ID(name) : rb_intern(StringValueCStr(name));
91
+
92
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
93
+
94
+ if (mapping)
95
+ {
96
+ HASH_DEL(RGSS_GAME.input.bindings, mapping);
97
+
98
+ vec_deinit(&mapping->keys);
99
+ vec_deinit(&mapping->mouse_buttons);
100
+ vec_deinit(&mapping->gamepad_buttons);
101
+ xfree(mapping);
102
+ return Qtrue;
103
+ }
104
+
105
+ return Qfalse;
106
+ }
107
+
108
+ static VALUE RGSS_Input_EachBinding(VALUE input)
109
+ {
110
+ RETURN_ENUMERATOR(input, 0, NULL);
111
+
112
+ RGSS_Mapping *mapping, *temp;
113
+ VALUE name, keys, mouse, gamepad;
114
+
115
+ int i, value;
116
+
117
+ HASH_ITER(hh, RGSS_GAME.input.bindings, mapping, temp)
118
+ {
119
+ name = ID2SYM(mapping->id);
120
+ keys = rb_ary_new_capa(mapping->keys.length);
121
+ mouse = rb_ary_new_capa(mapping->mouse_buttons.length);
122
+ gamepad = rb_ary_new_capa(mapping->gamepad_buttons.length);
123
+
124
+ vec_foreach(&mapping->keys, value, i)
125
+ rb_ary_push(keys, INT2NUM(value));
126
+
127
+ vec_foreach(&mapping->mouse_buttons, value, i)
128
+ rb_ary_push(mouse, INT2NUM(value));
129
+
130
+ vec_foreach(&mapping->gamepad_buttons, value, i)
131
+ rb_ary_push(gamepad, INT2NUM(value));
132
+
133
+ rb_yield_values(4, name, keys, mouse, gamepad);
134
+ }
135
+
136
+ return Qnil;
137
+ }
138
+
139
+ static void RGSS_Input_KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
140
+ {
141
+
142
+ if (key == GLFW_KEY_UNKNOWN)
143
+ return;
144
+
145
+ if (action == GLFW_PRESS)
146
+ RGSS_GAME.input.state.key[key] = INPUT_PRESS;
147
+ else if (action == GLFW_RELEASE)
148
+ RGSS_GAME.input.state.key[key] = INPUT_RELEASE;
149
+ }
150
+
151
+ static void RGSS_Input_MouseCallback(GLFWwindow *window, int key, int action, int mods)
152
+ {
153
+
154
+ if (key == GLFW_KEY_UNKNOWN)
155
+ return;
156
+
157
+ if (action == GLFW_PRESS)
158
+ RGSS_GAME.input.state.mouse[key] = INPUT_PRESS;
159
+ else if (action == GLFW_RELEASE)
160
+ RGSS_GAME.input.state.mouse[key] = INPUT_RELEASE;
161
+ }
162
+
163
+ void RGSS_Input_Update(void)
164
+ {
165
+
166
+ for (int i = 0; i < GLFW_KEY_LAST + 1; i++)
167
+ {
168
+ if (KEY(i) >= INPUT_PRESS)
169
+ {
170
+ if (++KEY(i) > INPUT_REPEAT_RATE)
171
+ KEY(i) = INPUT_DOWN;
172
+ }
173
+ else if (KEY(i) == INPUT_RELEASE)
174
+ KEY(i) = INPUT_NONE;
175
+ }
176
+
177
+ for (int i = 0; i < GLFW_MOUSE_BUTTON_LAST + 1; i++)
178
+ {
179
+ if (MBTN(i) >= INPUT_PRESS)
180
+ {
181
+ if (++MBTN(i) > INPUT_REPEAT_RATE)
182
+ MBTN(i) = INPUT_DOWN;
183
+ }
184
+ else if (MBTN(i) == INPUT_RELEASE)
185
+ MBTN(i) = INPUT_NONE;
186
+ }
187
+
188
+ RGSS_GAME.input.state.scroll_x = 0.0;
189
+ RGSS_GAME.input.state.scroll_y = 0.0;
190
+ }
191
+
192
+ static VALUE RGSS_Input_IsTriggered(VALUE input, VALUE sym)
193
+ {
194
+ ID id = SYM2ID(sym);
195
+
196
+ RGSS_Mapping *mapping;
197
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
198
+
199
+ if (mapping == NULL)
200
+ return Qfalse;
201
+
202
+ int state, value, i;
203
+
204
+ // Check keyboard keys
205
+ vec_foreach(&mapping->keys, value, i)
206
+ {
207
+ state = RGSS_GAME.input.state.key[value];
208
+ if (state == INPUT_PRESS)
209
+ return Qtrue;
210
+ }
211
+
212
+ // Check mouse input
213
+ vec_foreach(&mapping->mouse_buttons, value, i)
214
+ {
215
+ state = RGSS_GAME.input.state.mouse[value];
216
+ if (state == INPUT_PRESS)
217
+ return Qtrue;
218
+ }
219
+
220
+ // TODO: Check if gamepad connected, then query for input if so
221
+
222
+ return Qfalse;
223
+ }
224
+
225
+ static VALUE RGSS_Input_IsDown(VALUE input, VALUE sym)
226
+ {
227
+ ID id = SYM2ID(sym);
228
+
229
+ RGSS_Mapping *mapping;
230
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
231
+
232
+ if (mapping == NULL)
233
+ return Qfalse;
234
+
235
+ int state, value, i;
236
+
237
+ // Check keyboard keys
238
+ vec_foreach(&mapping->keys, value, i)
239
+ {
240
+ state = RGSS_GAME.input.state.key[value];
241
+ if (state >= INPUT_PRESS)
242
+ return Qtrue;
243
+ }
244
+
245
+ // Check mouse input
246
+ vec_foreach(&mapping->mouse_buttons, value, i)
247
+ {
248
+ state = RGSS_GAME.input.state.mouse[value];
249
+ if (state >= INPUT_PRESS)
250
+ return Qtrue;
251
+ }
252
+
253
+ // TODO: Check if gamepad connected, then query for input if so
254
+
255
+ return Qfalse;
256
+ }
257
+
258
+ static VALUE RGSS_Input_IsRepeated(VALUE input, VALUE sym)
259
+ {
260
+ ID id = SYM2ID(sym);
261
+
262
+ RGSS_Mapping *mapping;
263
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
264
+
265
+ if (mapping == NULL)
266
+ return Qfalse;
267
+
268
+ int state, value, i;
269
+
270
+ // Check keyboard keys
271
+ vec_foreach(&mapping->keys, value, i)
272
+ {
273
+ state = RGSS_GAME.input.state.key[value];
274
+ if (state == INPUT_REPEAT_RATE)
275
+ return Qtrue;
276
+ }
277
+
278
+ // Check mouse input
279
+ vec_foreach(&mapping->mouse_buttons, value, i)
280
+ {
281
+ state = RGSS_GAME.input.state.mouse[value];
282
+ if (state == INPUT_REPEAT_RATE)
283
+ return Qtrue;
284
+ }
285
+
286
+ // TODO: Check if gamepad connected, then query for input if so
287
+
288
+ return Qfalse;
289
+ }
290
+
291
+ static VALUE RGSS_Input_IsReleased(VALUE input, VALUE sym)
292
+ {
293
+ ID id = SYM2ID(sym);
294
+
295
+ RGSS_Mapping *mapping;
296
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
297
+
298
+ if (mapping == NULL)
299
+ return Qfalse;
300
+
301
+ int state, value, i;
302
+
303
+ // Check keyboard keys
304
+ vec_foreach(&mapping->keys, value, i)
305
+ {
306
+ state = RGSS_GAME.input.state.key[value];
307
+ if (state == INPUT_RELEASE)
308
+ return Qtrue;
309
+ }
310
+
311
+ // Check mouse input
312
+ vec_foreach(&mapping->mouse_buttons, value, i)
313
+ {
314
+ state = RGSS_GAME.input.state.mouse[value];
315
+ if (state == INPUT_RELEASE)
316
+ return Qtrue;
317
+ }
318
+
319
+ // TODO: Check if gamepad connected, then query for input if so
320
+
321
+ return Qfalse;
322
+ }
323
+
324
+ static VALUE RGSS_Input_IsUp(VALUE input, VALUE sym)
325
+ {
326
+ ID id = SYM2ID(sym);
327
+
328
+ RGSS_Mapping *mapping;
329
+ HASH_FIND(hh, RGSS_GAME.input.bindings, &id, sizeof(ID), mapping);
330
+
331
+ if (mapping == NULL)
332
+ return Qfalse;
333
+
334
+ int state, value, i;
335
+
336
+ // Check keyboard keys
337
+ vec_foreach(&mapping->keys, value, i)
338
+ {
339
+ state = RGSS_GAME.input.state.key[value];
340
+ if (state <= INPUT_NONE)
341
+ return Qtrue;
342
+ }
343
+
344
+ // Check mouse input
345
+ vec_foreach(&mapping->mouse_buttons, value, i)
346
+ {
347
+ state = RGSS_GAME.input.state.mouse[value];
348
+ if (state <= INPUT_NONE)
349
+ return Qtrue;
350
+ }
351
+
352
+ // TODO: Check if gamepad connected, then query for input if so
353
+
354
+ return Qfalse;
355
+ }
356
+
357
+ static VALUE RGSS_Input_GetCursorX(VALUE input)
358
+ {
359
+ // TODO: Translate to world space
360
+ double x;
361
+ glfwGetCursorPos(RGSS_GAME.window, &x, NULL);
362
+
363
+ return DBL2NUM(x);
364
+ }
365
+
366
+ static VALUE RGSS_Input_GetCursorY(VALUE input)
367
+ {
368
+ // TODO: Translate to world space
369
+ double y;
370
+ glfwGetCursorPos(RGSS_GAME.window, NULL, &y);
371
+
372
+ return DBL2NUM(y);
373
+ }
374
+
375
+ static VALUE RGSS_Input_GetScrollX(VALUE inpue)
376
+ {
377
+ return DBL2NUM(RGSS_GAME.input.state.scroll_x);
378
+ }
379
+
380
+ static VALUE RGSS_Input_GetScrollY(VALUE inpue)
381
+ {
382
+ return DBL2NUM(RGSS_GAME.input.state.scroll_y);
383
+ }
384
+
385
+ static void RGSS_Input_ScrollCallback(GLFWwindow *window, double x, double y)
386
+ {
387
+ RGSS_GAME.input.state.scroll_x += x;
388
+ RGSS_GAME.input.state.scroll_y += y;
389
+ }
390
+
391
+ static VALUE RGSS_Input_Clear(VALUE input)
392
+ {
393
+ memset(RGSS_GAME.input.state.key, INPUT_NONE, sizeof(RGSS_GAME.input.state.key));
394
+ memset(RGSS_GAME.input.state.mouse, INPUT_NONE, sizeof(RGSS_GAME.input.state.mouse));
395
+ memset(RGSS_GAME.input.state.gamepad, INPUT_NONE, sizeof(RGSS_GAME.input.state.gamepad));
396
+
397
+ RGSS_GAME.input.state.scroll_x = 0.0;
398
+ RGSS_GAME.input.state.scroll_y = 0.0;
399
+ }
400
+
401
+ static void RGSS_Input_FocusCallback(GLFWwindow *window, int focused)
402
+ {
403
+ if (!focused)
404
+ RGSS_Input_Clear(rb_mInput);
405
+
406
+ VALUE proc = rb_iv_get(rb_mInput, RGSS_FOCUS_CALLBACK);
407
+ if (RTEST(proc))
408
+ {
409
+ rb_proc_call(proc, rb_ary_new_from_args(1, RB_BOOL(focused)));
410
+ }
411
+ }
412
+
413
+ static VALUE RGSS_Input_OnFocus(VALUE input)
414
+ {
415
+ VALUE proc, current;
416
+
417
+ current = rb_iv_get(rb_mInput, RGSS_FOCUS_CALLBACK);
418
+ proc = rb_block_given_p() ? rb_block_proc() : Qnil;
419
+
420
+ rb_iv_set(rb_mInput, RGSS_FOCUS_CALLBACK, proc);
421
+ return current;
422
+ }
423
+
424
+ void RGSS_Input_Init(GLFWwindow *window)
425
+ {
426
+ glfwSetKeyCallback(window, RGSS_Input_KeyCallback);
427
+ glfwSetMouseButtonCallback(window, RGSS_Input_MouseCallback);
428
+ glfwSetScrollCallback(window, RGSS_Input_ScrollCallback);
429
+ glfwSetWindowFocusCallback(window, RGSS_Input_FocusCallback);
430
+
431
+ RGSS_GAME.input.bindings = NULL;
432
+ RGSS_GAME.input.cursor = NULL;
433
+ RGSS_Input_Clear(rb_mInput);
434
+ }
435
+
436
+ void RGSS_Input_Deinit(GLFWwindow *window)
437
+ {
438
+ if (window == NULL)
439
+ return;
440
+
441
+ glfwSetKeyCallback(window, NULL);
442
+ glfwSetMouseButtonCallback(window, NULL);
443
+ glfwSetScrollCallback(window, NULL);
444
+ glfwSetWindowFocusCallback(window, NULL);
445
+
446
+ RGSS_GAME.input.bindings = NULL;
447
+ RGSS_GAME.input.cursor = NULL;
448
+ RGSS_Input_Clear(rb_mInput);
449
+ }
450
+
451
+
452
+ static void RGSS_Input_TextCallback(GLFWwindow *window, unsigned int codepoint)
453
+ {
454
+ VALUE proc = rb_iv_get(rb_mInput, RGSS_TEXT_CALLBACK);
455
+ if (!RTEST(proc))
456
+ {
457
+ glfwSetCharCallback(RGSS_GAME.window, NULL);
458
+ return;
459
+ }
460
+
461
+ size_t size = utf8codepointcalcsize(&codepoint);
462
+
463
+ VALUE args = rb_utf8_str_new((char *)&codepoint, size);
464
+ rb_proc_call(proc, rb_ary_new_from_args(1, args));
465
+ }
466
+
467
+ static VALUE RGSS_Input_OnText(VALUE input)
468
+ {
469
+ GLFWcharfun callback;
470
+ VALUE proc, current;
471
+
472
+ current = rb_iv_get(input, RGSS_TEXT_CALLBACK);
473
+ if (rb_block_given_p())
474
+ {
475
+ proc = rb_block_proc();
476
+ callback = RGSS_Input_TextCallback;
477
+ }
478
+ else
479
+ {
480
+ proc = Qnil;
481
+ callback = NULL;
482
+ }
483
+
484
+ rb_iv_set(input, RGSS_TEXT_CALLBACK, proc);
485
+ glfwSetCharCallback(RGSS_GAME.window, callback);
486
+
487
+ return current;
488
+ }
489
+
490
+ static VALUE RGSS_Input_IsCursorEnabled(VALUE input)
491
+ {
492
+ RGSS_ASSERT_GAME;
493
+ int mode = glfwGetInputMode(RGSS_GAME.window, GLFW_CURSOR);
494
+ return RB_BOOL(mode != GLFW_CURSOR_DISABLED);
495
+ }
496
+
497
+ static VALUE RGSS_Input_IsCursorHidden(VALUE input)
498
+ {
499
+ RGSS_ASSERT_GAME;
500
+ int mode = glfwGetInputMode(RGSS_GAME.window, GLFW_CURSOR);
501
+ return RB_BOOL(mode != GLFW_CURSOR_HIDDEN);
502
+ }
503
+
504
+ static VALUE RGSS_Input_IsCursorVisible(VALUE input)
505
+ {
506
+ RGSS_ASSERT_GAME;
507
+ int mode = glfwGetInputMode(RGSS_GAME.window, GLFW_CURSOR);
508
+ return RB_BOOL(mode == GLFW_CURSOR_NORMAL);
509
+ }
510
+
511
+ static VALUE RGSS_Input_EnableCursor(VALUE input, VALUE value)
512
+ {
513
+ RGSS_ASSERT_GAME;
514
+ glfwSetInputMode(RGSS_GAME.window, GLFW_CURSOR, RTEST(value) ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL);
515
+ return Qnil;
516
+ }
517
+
518
+ static VALUE RGSS_Input_HideCursor(VALUE input, VALUE value)
519
+ {
520
+ RGSS_ASSERT_GAME;
521
+ glfwSetInputMode(RGSS_GAME.window, GLFW_CURSOR, RTEST(value) ? GLFW_CURSOR_HIDDEN : GLFW_CURSOR_NORMAL);
522
+ return Qnil;
523
+ }
524
+
525
+ static VALUE RGSS_Input_GetCursor(VALUE input)
526
+ {
527
+ RGSS_ASSERT_GAME;
528
+ double x, y;
529
+ glfwGetCursorPos(RGSS_GAME.window, &x, &y);
530
+ return RGSS_Point_New((int) round(x), (int) round(y));
531
+ }
532
+
533
+ static VALUE RGSS_Input_SetCursorImage(int argc, VALUE *argv, VALUE input)
534
+ {
535
+ RGSS_ASSERT_GAME;
536
+
537
+ VALUE source, x, y;
538
+ rb_scan_args(argc, argv, "12", &source, &x, &y);
539
+
540
+ GLFWimage image;
541
+ GLFWcursor *cursor = NULL;
542
+
543
+ if (RTEST(source))
544
+ {
545
+ int xhot = RTEST(x) ? NUM2INT(x) : 0;
546
+ int yhot = RTEST(y) ? NUM2INT(y) : 0;
547
+
548
+
549
+ if (RB_TYPE_P(source, T_DATA))
550
+ {
551
+ image = *((GLFWimage*) DATA_PTR(source));
552
+ cursor = glfwCreateCursor(&image, xhot, yhot);
553
+ }
554
+ else if (RB_TYPE_P(source, T_STRING))
555
+ {
556
+ RGSS_Image_Load(StringValueCStr(source), &image.width, &image.height, &image.pixels);
557
+ cursor = glfwCreateCursor(&image, xhot, yhot);
558
+ xfree(image.pixels);
559
+ }
560
+ else
561
+ {
562
+ int shape = NUM2INT(source);
563
+ cursor = glfwCreateStandardCursor(shape);
564
+ }
565
+ }
566
+
567
+ if (RGSS_GAME.input.cursor)
568
+ {
569
+ glfwDestroyCursor(RGSS_GAME.input.cursor);
570
+ }
571
+
572
+ RGSS_GAME.input.cursor = cursor;
573
+ glfwSetCursor(RGSS_GAME.window, cursor);
574
+
575
+ return source;
576
+ }
577
+
578
+ void RGSS_Init_Input(VALUE parent)
579
+ {
580
+ rb_mInput = rb_define_module_under(parent, "Input");
581
+
582
+ rb_define_singleton_methodm1(rb_mInput, "bind", RGSS_Input_Bind, -1);
583
+ rb_define_singleton_method1(rb_mInput, "unbind", RGSS_Input_Unbind, 1);
584
+ rb_define_singleton_method0(rb_mInput, "each_binding", RGSS_Input_EachBinding, 0);
585
+ rb_define_singleton_method1(rb_mInput, "trigger?", RGSS_Input_IsTriggered, 1);
586
+ rb_define_singleton_method1(rb_mInput, "down?", RGSS_Input_IsDown, 1);
587
+ rb_define_singleton_method1(rb_mInput, "repeat?", RGSS_Input_IsRepeated, 1);
588
+ rb_define_singleton_method1(rb_mInput, "release?", RGSS_Input_IsReleased, 1);
589
+ rb_define_singleton_method1(rb_mInput, "up?", RGSS_Input_IsUp, 1);
590
+ rb_define_singleton_method0(rb_mInput, "scroll_x", RGSS_Input_GetScrollX, 0);
591
+ rb_define_singleton_method0(rb_mInput, "scroll_y", RGSS_Input_GetScrollY, 0);
592
+
593
+ VALUE singleton = rb_singleton_class(rb_mInput);
594
+
595
+ rb_define_alias(singleton, "press?", "down?");
596
+ rb_define_alias(singleton, "none?", "up?");
597
+
598
+ rb_define_singleton_method0(rb_mInput, "on_text", RGSS_Input_OnText, 0);
599
+ rb_define_singleton_method0(rb_mInput, "on_focus", RGSS_Input_OnFocus, 0);
600
+
601
+ rb_define_singleton_method0(rb_mInput, "cursor", RGSS_Input_GetCursor, 0);
602
+ rb_define_singleton_method1(rb_mInput, "enable_cursor", RGSS_Input_EnableCursor, 1);
603
+ rb_define_singleton_method1(rb_mInput, "hide_cursor", RGSS_Input_HideCursor, 1);
604
+ rb_define_singleton_method0(rb_mInput, "cursor_enabled?", RGSS_Input_IsCursorEnabled, 0);
605
+ rb_define_singleton_method0(rb_mInput, "cursor_hidden?", RGSS_Input_IsCursorHidden, 0);
606
+ rb_define_singleton_method0(rb_mInput, "cursor_visible?", RGSS_Input_IsCursorVisible, 0);
607
+ rb_define_singleton_method0(rb_mInput, "cursor_x", RGSS_Input_GetCursorX, 0);
608
+ rb_define_singleton_method0(rb_mInput, "cursor_y", RGSS_Input_GetCursorY, 0);
609
+ rb_define_singleton_methodm1(rb_mInput, "cursor_image", RGSS_Input_SetCursorImage, -1);
610
+
611
+ rb_define_const(rb_mInput, "KEY_SPACE", INT2NUM(GLFW_KEY_SPACE));
612
+ rb_define_const(rb_mInput, "KEY_APOSTROPHE", INT2NUM(GLFW_KEY_APOSTROPHE));
613
+ rb_define_const(rb_mInput, "KEY_COMMA", INT2NUM(GLFW_KEY_COMMA));
614
+ rb_define_const(rb_mInput, "KEY_MINUS", INT2NUM(GLFW_KEY_MINUS));
615
+ rb_define_const(rb_mInput, "KEY_PERIOD", INT2NUM(GLFW_KEY_PERIOD));
616
+ rb_define_const(rb_mInput, "KEY_SLASH", INT2NUM(GLFW_KEY_SLASH));
617
+ rb_define_const(rb_mInput, "KEY_0", INT2NUM(GLFW_KEY_0));
618
+ rb_define_const(rb_mInput, "KEY_1", INT2NUM(GLFW_KEY_1));
619
+ rb_define_const(rb_mInput, "KEY_2", INT2NUM(GLFW_KEY_2));
620
+ rb_define_const(rb_mInput, "KEY_3", INT2NUM(GLFW_KEY_3));
621
+ rb_define_const(rb_mInput, "KEY_4", INT2NUM(GLFW_KEY_4));
622
+ rb_define_const(rb_mInput, "KEY_5", INT2NUM(GLFW_KEY_5));
623
+ rb_define_const(rb_mInput, "KEY_6", INT2NUM(GLFW_KEY_6));
624
+ rb_define_const(rb_mInput, "KEY_7", INT2NUM(GLFW_KEY_7));
625
+ rb_define_const(rb_mInput, "KEY_8", INT2NUM(GLFW_KEY_8));
626
+ rb_define_const(rb_mInput, "KEY_9", INT2NUM(GLFW_KEY_9));
627
+ rb_define_const(rb_mInput, "KEY_SEMICOLON", INT2NUM(GLFW_KEY_SEMICOLON));
628
+ rb_define_const(rb_mInput, "KEY_EQUAL", INT2NUM(GLFW_KEY_EQUAL));
629
+ rb_define_const(rb_mInput, "KEY_A", INT2NUM(GLFW_KEY_A));
630
+ rb_define_const(rb_mInput, "KEY_B", INT2NUM(GLFW_KEY_B));
631
+ rb_define_const(rb_mInput, "KEY_C", INT2NUM(GLFW_KEY_C));
632
+ rb_define_const(rb_mInput, "KEY_D", INT2NUM(GLFW_KEY_D));
633
+ rb_define_const(rb_mInput, "KEY_E", INT2NUM(GLFW_KEY_E));
634
+ rb_define_const(rb_mInput, "KEY_F", INT2NUM(GLFW_KEY_F));
635
+ rb_define_const(rb_mInput, "KEY_G", INT2NUM(GLFW_KEY_G));
636
+ rb_define_const(rb_mInput, "KEY_H", INT2NUM(GLFW_KEY_H));
637
+ rb_define_const(rb_mInput, "KEY_I", INT2NUM(GLFW_KEY_I));
638
+ rb_define_const(rb_mInput, "KEY_J", INT2NUM(GLFW_KEY_J));
639
+ rb_define_const(rb_mInput, "KEY_K", INT2NUM(GLFW_KEY_K));
640
+ rb_define_const(rb_mInput, "KEY_L", INT2NUM(GLFW_KEY_L));
641
+ rb_define_const(rb_mInput, "KEY_M", INT2NUM(GLFW_KEY_M));
642
+ rb_define_const(rb_mInput, "KEY_N", INT2NUM(GLFW_KEY_N));
643
+ rb_define_const(rb_mInput, "KEY_O", INT2NUM(GLFW_KEY_O));
644
+ rb_define_const(rb_mInput, "KEY_P", INT2NUM(GLFW_KEY_P));
645
+ rb_define_const(rb_mInput, "KEY_Q", INT2NUM(GLFW_KEY_Q));
646
+ rb_define_const(rb_mInput, "KEY_R", INT2NUM(GLFW_KEY_R));
647
+ rb_define_const(rb_mInput, "KEY_S", INT2NUM(GLFW_KEY_S));
648
+ rb_define_const(rb_mInput, "KEY_T", INT2NUM(GLFW_KEY_T));
649
+ rb_define_const(rb_mInput, "KEY_U", INT2NUM(GLFW_KEY_U));
650
+ rb_define_const(rb_mInput, "KEY_V", INT2NUM(GLFW_KEY_V));
651
+ rb_define_const(rb_mInput, "KEY_W", INT2NUM(GLFW_KEY_W));
652
+ rb_define_const(rb_mInput, "KEY_X", INT2NUM(GLFW_KEY_X));
653
+ rb_define_const(rb_mInput, "KEY_Y", INT2NUM(GLFW_KEY_Y));
654
+ rb_define_const(rb_mInput, "KEY_Z", INT2NUM(GLFW_KEY_Z));
655
+ rb_define_const(rb_mInput, "KEY_LEFT_BRACKET", INT2NUM(GLFW_KEY_LEFT_BRACKET));
656
+ rb_define_const(rb_mInput, "KEY_BACKSLASH", INT2NUM(GLFW_KEY_BACKSLASH));
657
+ rb_define_const(rb_mInput, "KEY_RIGHT_BRACKET", INT2NUM(GLFW_KEY_RIGHT_BRACKET));
658
+ rb_define_const(rb_mInput, "KEY_GRAVE_ACCENT", INT2NUM(GLFW_KEY_GRAVE_ACCENT));
659
+ rb_define_const(rb_mInput, "KEY_WORLD_1", INT2NUM(GLFW_KEY_WORLD_1));
660
+ rb_define_const(rb_mInput, "KEY_WORLD_2", INT2NUM(GLFW_KEY_WORLD_2));
661
+
662
+ /* Function keys */
663
+ rb_define_const(rb_mInput, "KEY_ESCAPE", INT2NUM(GLFW_KEY_ESCAPE));
664
+ rb_define_const(rb_mInput, "KEY_ENTER", INT2NUM(GLFW_KEY_ENTER));
665
+ rb_define_const(rb_mInput, "KEY_TAB", INT2NUM(GLFW_KEY_TAB));
666
+ rb_define_const(rb_mInput, "KEY_BACKSPACE", INT2NUM(GLFW_KEY_BACKSPACE));
667
+ rb_define_const(rb_mInput, "KEY_INSERT", INT2NUM(GLFW_KEY_INSERT));
668
+ rb_define_const(rb_mInput, "KEY_DELETE", INT2NUM(GLFW_KEY_DELETE));
669
+ rb_define_const(rb_mInput, "KEY_RIGHT", INT2NUM(GLFW_KEY_RIGHT));
670
+ rb_define_const(rb_mInput, "KEY_LEFT", INT2NUM(GLFW_KEY_LEFT));
671
+ rb_define_const(rb_mInput, "KEY_DOWN", INT2NUM(GLFW_KEY_DOWN));
672
+ rb_define_const(rb_mInput, "KEY_UP", INT2NUM(GLFW_KEY_UP));
673
+ rb_define_const(rb_mInput, "KEY_PAGE_UP", INT2NUM(GLFW_KEY_PAGE_UP));
674
+ rb_define_const(rb_mInput, "KEY_PAGE_DOWN", INT2NUM(GLFW_KEY_PAGE_DOWN));
675
+ rb_define_const(rb_mInput, "KEY_HOME", INT2NUM(GLFW_KEY_HOME));
676
+ rb_define_const(rb_mInput, "KEY_END", INT2NUM(GLFW_KEY_END));
677
+ rb_define_const(rb_mInput, "KEY_CAPS_LOCK", INT2NUM(GLFW_KEY_CAPS_LOCK));
678
+ rb_define_const(rb_mInput, "KEY_SCROLL_LOCK", INT2NUM(GLFW_KEY_SCROLL_LOCK));
679
+ rb_define_const(rb_mInput, "KEY_NUM_LOCK", INT2NUM(GLFW_KEY_NUM_LOCK));
680
+ rb_define_const(rb_mInput, "KEY_PRINT_SCREEN", INT2NUM(GLFW_KEY_PRINT_SCREEN));
681
+ rb_define_const(rb_mInput, "KEY_PAUSE", INT2NUM(GLFW_KEY_PAUSE));
682
+ rb_define_const(rb_mInput, "KEY_F1", INT2NUM(GLFW_KEY_F1));
683
+ rb_define_const(rb_mInput, "KEY_F2", INT2NUM(GLFW_KEY_F2));
684
+ rb_define_const(rb_mInput, "KEY_F3", INT2NUM(GLFW_KEY_F3));
685
+ rb_define_const(rb_mInput, "KEY_F4", INT2NUM(GLFW_KEY_F4));
686
+ rb_define_const(rb_mInput, "KEY_F5", INT2NUM(GLFW_KEY_F5));
687
+ rb_define_const(rb_mInput, "KEY_F6", INT2NUM(GLFW_KEY_F6));
688
+ rb_define_const(rb_mInput, "KEY_F7", INT2NUM(GLFW_KEY_F7));
689
+ rb_define_const(rb_mInput, "KEY_F8", INT2NUM(GLFW_KEY_F8));
690
+ rb_define_const(rb_mInput, "KEY_F9", INT2NUM(GLFW_KEY_F9));
691
+ rb_define_const(rb_mInput, "KEY_F10", INT2NUM(GLFW_KEY_F10));
692
+ rb_define_const(rb_mInput, "KEY_F11", INT2NUM(GLFW_KEY_F11));
693
+ rb_define_const(rb_mInput, "KEY_F12", INT2NUM(GLFW_KEY_F12));
694
+ rb_define_const(rb_mInput, "KEY_F13", INT2NUM(GLFW_KEY_F13));
695
+ rb_define_const(rb_mInput, "KEY_F14", INT2NUM(GLFW_KEY_F14));
696
+ rb_define_const(rb_mInput, "KEY_F15", INT2NUM(GLFW_KEY_F15));
697
+ rb_define_const(rb_mInput, "KEY_F16", INT2NUM(GLFW_KEY_F16));
698
+ rb_define_const(rb_mInput, "KEY_F17", INT2NUM(GLFW_KEY_F17));
699
+ rb_define_const(rb_mInput, "KEY_F18", INT2NUM(GLFW_KEY_F18));
700
+ rb_define_const(rb_mInput, "KEY_F19", INT2NUM(GLFW_KEY_F19));
701
+ rb_define_const(rb_mInput, "KEY_F20", INT2NUM(GLFW_KEY_F20));
702
+ rb_define_const(rb_mInput, "KEY_F21", INT2NUM(GLFW_KEY_F21));
703
+ rb_define_const(rb_mInput, "KEY_F22", INT2NUM(GLFW_KEY_F22));
704
+ rb_define_const(rb_mInput, "KEY_F23", INT2NUM(GLFW_KEY_F23));
705
+ rb_define_const(rb_mInput, "KEY_F24", INT2NUM(GLFW_KEY_F24));
706
+ rb_define_const(rb_mInput, "KEY_F25", INT2NUM(GLFW_KEY_F25));
707
+ rb_define_const(rb_mInput, "KEY_KP_0", INT2NUM(GLFW_KEY_KP_0));
708
+ rb_define_const(rb_mInput, "KEY_KP_1", INT2NUM(GLFW_KEY_KP_1));
709
+ rb_define_const(rb_mInput, "KEY_KP_2", INT2NUM(GLFW_KEY_KP_2));
710
+ rb_define_const(rb_mInput, "KEY_KP_3", INT2NUM(GLFW_KEY_KP_3));
711
+ rb_define_const(rb_mInput, "KEY_KP_4", INT2NUM(GLFW_KEY_KP_4));
712
+ rb_define_const(rb_mInput, "KEY_KP_5", INT2NUM(GLFW_KEY_KP_5));
713
+ rb_define_const(rb_mInput, "KEY_KP_6", INT2NUM(GLFW_KEY_KP_6));
714
+ rb_define_const(rb_mInput, "KEY_KP_7", INT2NUM(GLFW_KEY_KP_7));
715
+ rb_define_const(rb_mInput, "KEY_KP_8", INT2NUM(GLFW_KEY_KP_8));
716
+ rb_define_const(rb_mInput, "KEY_KP_9", INT2NUM(GLFW_KEY_KP_9));
717
+ rb_define_const(rb_mInput, "KEY_KP_DECIMAL", INT2NUM(GLFW_KEY_KP_DECIMAL));
718
+ rb_define_const(rb_mInput, "KEY_KP_DIVIDE", INT2NUM(GLFW_KEY_KP_DIVIDE));
719
+ rb_define_const(rb_mInput, "KEY_KP_MULTIPLY", INT2NUM(GLFW_KEY_KP_MULTIPLY));
720
+ rb_define_const(rb_mInput, "KEY_KP_SUBTRACT", INT2NUM(GLFW_KEY_KP_SUBTRACT));
721
+ rb_define_const(rb_mInput, "KEY_KP_ADD", INT2NUM(GLFW_KEY_KP_ADD));
722
+ rb_define_const(rb_mInput, "KEY_KP_ENTER", INT2NUM(GLFW_KEY_KP_ENTER));
723
+ rb_define_const(rb_mInput, "KEY_KP_EQUAL", INT2NUM(GLFW_KEY_KP_EQUAL));
724
+ rb_define_const(rb_mInput, "KEY_LEFT_SHIFT", INT2NUM(GLFW_KEY_LEFT_SHIFT));
725
+ rb_define_const(rb_mInput, "KEY_LEFT_CONTROL", INT2NUM(GLFW_KEY_LEFT_CONTROL));
726
+ rb_define_const(rb_mInput, "KEY_LEFT_ALT", INT2NUM(GLFW_KEY_LEFT_ALT));
727
+ rb_define_const(rb_mInput, "KEY_LEFT_SUPER", INT2NUM(GLFW_KEY_LEFT_SUPER));
728
+ rb_define_const(rb_mInput, "KEY_RIGHT_SHIFT", INT2NUM(GLFW_KEY_RIGHT_SHIFT));
729
+ rb_define_const(rb_mInput, "KEY_RIGHT_CONTROL", INT2NUM(GLFW_KEY_RIGHT_CONTROL));
730
+ rb_define_const(rb_mInput, "KEY_RIGHT_ALT", INT2NUM(GLFW_KEY_RIGHT_ALT));
731
+ rb_define_const(rb_mInput, "KEY_RIGHT_SUPER", INT2NUM(GLFW_KEY_RIGHT_SUPER));
732
+ rb_define_const(rb_mInput, "KEY_MENU", INT2NUM(GLFW_KEY_MENU));
733
+
734
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_1", INT2NUM(GLFW_MOUSE_BUTTON_1));
735
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_2", INT2NUM(GLFW_MOUSE_BUTTON_2));
736
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_3", INT2NUM(GLFW_MOUSE_BUTTON_3));
737
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_4", INT2NUM(GLFW_MOUSE_BUTTON_4));
738
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_5", INT2NUM(GLFW_MOUSE_BUTTON_5));
739
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_6", INT2NUM(GLFW_MOUSE_BUTTON_6));
740
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_7", INT2NUM(GLFW_MOUSE_BUTTON_7));
741
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_8", INT2NUM(GLFW_MOUSE_BUTTON_8));
742
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_LEFT", INT2NUM(GLFW_MOUSE_BUTTON_LEFT));
743
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_RIGHT", INT2NUM(GLFW_MOUSE_BUTTON_RIGHT));
744
+ rb_define_const(rb_mInput, "MOUSE_BUTTON_MIDDLE", INT2NUM(GLFW_MOUSE_BUTTON_MIDDLE));
745
+ }