rgss 0.0.1

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