ruby2d-rpeck-windows 0.11.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 (289) hide show
  1. checksums.yaml +7 -0
  2. data/assets/README.md +22 -0
  3. data/assets/Rakefile +85 -0
  4. data/assets/app.icns +0 -0
  5. data/assets/include/SDL2/SDL.h +138 -0
  6. data/assets/include/SDL2/SDL_assert.h +293 -0
  7. data/assets/include/SDL2/SDL_atomic.h +295 -0
  8. data/assets/include/SDL2/SDL_audio.h +859 -0
  9. data/assets/include/SDL2/SDL_bits.h +121 -0
  10. data/assets/include/SDL2/SDL_blendmode.h +123 -0
  11. data/assets/include/SDL2/SDL_clipboard.h +71 -0
  12. data/assets/include/SDL2/SDL_config.h +55 -0
  13. data/assets/include/SDL2/SDL_config_android.h +182 -0
  14. data/assets/include/SDL2/SDL_config_iphoneos.h +207 -0
  15. data/assets/include/SDL2/SDL_config_macosx.h +266 -0
  16. data/assets/include/SDL2/SDL_config_minimal.h +85 -0
  17. data/assets/include/SDL2/SDL_config_os2.h +188 -0
  18. data/assets/include/SDL2/SDL_config_pandora.h +135 -0
  19. data/assets/include/SDL2/SDL_config_psp.h +165 -0
  20. data/assets/include/SDL2/SDL_config_windows.h +288 -0
  21. data/assets/include/SDL2/SDL_config_winrt.h +243 -0
  22. data/assets/include/SDL2/SDL_config_wiz.h +149 -0
  23. data/assets/include/SDL2/SDL_copying.h +20 -0
  24. data/assets/include/SDL2/SDL_cpuinfo.h +299 -0
  25. data/assets/include/SDL2/SDL_egl.h +1676 -0
  26. data/assets/include/SDL2/SDL_endian.h +263 -0
  27. data/assets/include/SDL2/SDL_error.h +112 -0
  28. data/assets/include/SDL2/SDL_events.h +827 -0
  29. data/assets/include/SDL2/SDL_filesystem.h +136 -0
  30. data/assets/include/SDL2/SDL_gamecontroller.h +541 -0
  31. data/assets/include/SDL2/SDL_gesture.h +87 -0
  32. data/assets/include/SDL2/SDL_haptic.h +1247 -0
  33. data/assets/include/SDL2/SDL_hints.h +1578 -0
  34. data/assets/include/SDL2/SDL_image.h +161 -0
  35. data/assets/include/SDL2/SDL_joystick.h +499 -0
  36. data/assets/include/SDL2/SDL_keyboard.h +217 -0
  37. data/assets/include/SDL2/SDL_keycode.h +351 -0
  38. data/assets/include/SDL2/SDL_loadso.h +81 -0
  39. data/assets/include/SDL2/SDL_locale.h +101 -0
  40. data/assets/include/SDL2/SDL_log.h +211 -0
  41. data/assets/include/SDL2/SDL_main.h +180 -0
  42. data/assets/include/SDL2/SDL_messagebox.h +146 -0
  43. data/assets/include/SDL2/SDL_metal.h +117 -0
  44. data/assets/include/SDL2/SDL_misc.h +75 -0
  45. data/assets/include/SDL2/SDL_mixer.h +651 -0
  46. data/assets/include/SDL2/SDL_mouse.h +302 -0
  47. data/assets/include/SDL2/SDL_mutex.h +251 -0
  48. data/assets/include/SDL2/SDL_name.h +33 -0
  49. data/assets/include/SDL2/SDL_opengl.h +2183 -0
  50. data/assets/include/SDL2/SDL_opengl_glext.h +11180 -0
  51. data/assets/include/SDL2/SDL_opengles.h +39 -0
  52. data/assets/include/SDL2/SDL_opengles2.h +52 -0
  53. data/assets/include/SDL2/SDL_opengles2_gl2.h +621 -0
  54. data/assets/include/SDL2/SDL_opengles2_gl2ext.h +2050 -0
  55. data/assets/include/SDL2/SDL_opengles2_gl2platform.h +30 -0
  56. data/assets/include/SDL2/SDL_opengles2_khrplatform.h +282 -0
  57. data/assets/include/SDL2/SDL_pixels.h +479 -0
  58. data/assets/include/SDL2/SDL_platform.h +198 -0
  59. data/assets/include/SDL2/SDL_power.h +75 -0
  60. data/assets/include/SDL2/SDL_quit.h +58 -0
  61. data/assets/include/SDL2/SDL_rect.h +174 -0
  62. data/assets/include/SDL2/SDL_render.h +1158 -0
  63. data/assets/include/SDL2/SDL_revision.h +2 -0
  64. data/assets/include/SDL2/SDL_rwops.h +283 -0
  65. data/assets/include/SDL2/SDL_scancode.h +413 -0
  66. data/assets/include/SDL2/SDL_sensor.h +267 -0
  67. data/assets/include/SDL2/SDL_shape.h +144 -0
  68. data/assets/include/SDL2/SDL_stdinc.h +647 -0
  69. data/assets/include/SDL2/SDL_surface.h +563 -0
  70. data/assets/include/SDL2/SDL_system.h +325 -0
  71. data/assets/include/SDL2/SDL_syswm.h +354 -0
  72. data/assets/include/SDL2/SDL_test.h +69 -0
  73. data/assets/include/SDL2/SDL_test_assert.h +105 -0
  74. data/assets/include/SDL2/SDL_test_common.h +218 -0
  75. data/assets/include/SDL2/SDL_test_compare.h +69 -0
  76. data/assets/include/SDL2/SDL_test_crc32.h +124 -0
  77. data/assets/include/SDL2/SDL_test_font.h +81 -0
  78. data/assets/include/SDL2/SDL_test_fuzzer.h +384 -0
  79. data/assets/include/SDL2/SDL_test_harness.h +134 -0
  80. data/assets/include/SDL2/SDL_test_images.h +78 -0
  81. data/assets/include/SDL2/SDL_test_log.h +67 -0
  82. data/assets/include/SDL2/SDL_test_md5.h +129 -0
  83. data/assets/include/SDL2/SDL_test_memory.h +63 -0
  84. data/assets/include/SDL2/SDL_test_random.h +115 -0
  85. data/assets/include/SDL2/SDL_thread.h +366 -0
  86. data/assets/include/SDL2/SDL_timer.h +115 -0
  87. data/assets/include/SDL2/SDL_touch.h +102 -0
  88. data/assets/include/SDL2/SDL_ttf.h +294 -0
  89. data/assets/include/SDL2/SDL_types.h +29 -0
  90. data/assets/include/SDL2/SDL_version.h +162 -0
  91. data/assets/include/SDL2/SDL_video.h +1282 -0
  92. data/assets/include/SDL2/SDL_vulkan.h +276 -0
  93. data/assets/include/SDL2/begin_code.h +166 -0
  94. data/assets/include/SDL2/close_code.h +40 -0
  95. data/assets/include/glew.h +23686 -0
  96. data/assets/ios/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  97. data/assets/ios/Assets.xcassets/Contents.json +6 -0
  98. data/assets/ios/Base.lproj/LaunchScreen.storyboard +27 -0
  99. data/assets/ios/Info.plist +43 -0
  100. data/assets/ios/MRuby.framework/Headers/mrbconf.h +143 -0
  101. data/assets/ios/MRuby.framework/Headers/mruby/array.h +280 -0
  102. data/assets/ios/MRuby.framework/Headers/mruby/boxing_nan.h +102 -0
  103. data/assets/ios/MRuby.framework/Headers/mruby/boxing_no.h +56 -0
  104. data/assets/ios/MRuby.framework/Headers/mruby/boxing_word.h +144 -0
  105. data/assets/ios/MRuby.framework/Headers/mruby/class.h +97 -0
  106. data/assets/ios/MRuby.framework/Headers/mruby/common.h +77 -0
  107. data/assets/ios/MRuby.framework/Headers/mruby/compile.h +195 -0
  108. data/assets/ios/MRuby.framework/Headers/mruby/data.h +75 -0
  109. data/assets/ios/MRuby.framework/Headers/mruby/debug.h +67 -0
  110. data/assets/ios/MRuby.framework/Headers/mruby/dump.h +196 -0
  111. data/assets/ios/MRuby.framework/Headers/mruby/error.h +75 -0
  112. data/assets/ios/MRuby.framework/Headers/mruby/gc.h +91 -0
  113. data/assets/ios/MRuby.framework/Headers/mruby/hash.h +215 -0
  114. data/assets/ios/MRuby.framework/Headers/mruby/irep.h +75 -0
  115. data/assets/ios/MRuby.framework/Headers/mruby/istruct.h +47 -0
  116. data/assets/ios/MRuby.framework/Headers/mruby/khash.h +274 -0
  117. data/assets/ios/MRuby.framework/Headers/mruby/numeric.h +161 -0
  118. data/assets/ios/MRuby.framework/Headers/mruby/object.h +44 -0
  119. data/assets/ios/MRuby.framework/Headers/mruby/opcode.h +69 -0
  120. data/assets/ios/MRuby.framework/Headers/mruby/ops.h +117 -0
  121. data/assets/ios/MRuby.framework/Headers/mruby/proc.h +131 -0
  122. data/assets/ios/MRuby.framework/Headers/mruby/range.h +49 -0
  123. data/assets/ios/MRuby.framework/Headers/mruby/re.h +16 -0
  124. data/assets/ios/MRuby.framework/Headers/mruby/string.h +444 -0
  125. data/assets/ios/MRuby.framework/Headers/mruby/throw.h +55 -0
  126. data/assets/ios/MRuby.framework/Headers/mruby/value.h +309 -0
  127. data/assets/ios/MRuby.framework/Headers/mruby/variable.h +136 -0
  128. data/assets/ios/MRuby.framework/Headers/mruby/version.h +110 -0
  129. data/assets/ios/MRuby.framework/Headers/mruby.h +1282 -0
  130. data/assets/ios/MRuby.framework/Info.plist +20 -0
  131. data/assets/ios/MRuby.framework/MRuby +0 -0
  132. data/assets/ios/MyApp.xcodeproj/project.pbxproj +368 -0
  133. data/assets/ios/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  134. data/assets/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  135. data/assets/ios/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +30 -0
  136. data/assets/ios/main.c +1 -0
  137. data/assets/macos/lib/libFLAC.a +0 -0
  138. data/assets/macos/lib/libSDL2.a +0 -0
  139. data/assets/macos/lib/libSDL2_image.a +0 -0
  140. data/assets/macos/lib/libSDL2_mixer.a +0 -0
  141. data/assets/macos/lib/libSDL2_ttf.a +0 -0
  142. data/assets/macos/lib/libfreetype.a +0 -0
  143. data/assets/macos/lib/libjpeg.a +0 -0
  144. data/assets/macos/lib/libmodplug.a +0 -0
  145. data/assets/macos/lib/libmpg123.a +0 -0
  146. data/assets/macos/lib/libogg.a +0 -0
  147. data/assets/macos/lib/libpng16.a +0 -0
  148. data/assets/macos/lib/libtiff.a +0 -0
  149. data/assets/macos/lib/libvorbis.a +0 -0
  150. data/assets/macos/lib/libvorbisfile.a +0 -0
  151. data/assets/macos/lib/libwebp.a +0 -0
  152. data/assets/mingw/bin/SDL2.dll +0 -0
  153. data/assets/mingw/bin/SDL2_image.dll +0 -0
  154. data/assets/mingw/bin/SDL2_mixer.dll +0 -0
  155. data/assets/mingw/bin/SDL2_ttf.dll +0 -0
  156. data/assets/mingw/bin/glew32.dll +0 -0
  157. data/assets/mingw/bin/libFLAC-8.dll +0 -0
  158. data/assets/mingw/bin/libfreetype-6.dll +0 -0
  159. data/assets/mingw/bin/libjpeg-9.dll +0 -0
  160. data/assets/mingw/bin/libmodplug-1.dll +0 -0
  161. data/assets/mingw/bin/libmpg123-0.dll +0 -0
  162. data/assets/mingw/bin/libogg-0.dll +0 -0
  163. data/assets/mingw/bin/libopus-0.dll +0 -0
  164. data/assets/mingw/bin/libopusfile-0.dll +0 -0
  165. data/assets/mingw/bin/libpng16-16.dll +0 -0
  166. data/assets/mingw/bin/libtiff-5.dll +0 -0
  167. data/assets/mingw/bin/libvorbis-0.dll +0 -0
  168. data/assets/mingw/bin/libvorbisfile-3.dll +0 -0
  169. data/assets/mingw/bin/libwebp-7.dll +0 -0
  170. data/assets/mingw/bin/libwinpthread-1.dll +0 -0
  171. data/assets/mingw/bin/zlib1.dll +0 -0
  172. data/assets/mingw/lib/libSDL2.a +0 -0
  173. data/assets/mingw/lib/libSDL2.dll.a +0 -0
  174. data/assets/mingw/lib/libSDL2_image.a +0 -0
  175. data/assets/mingw/lib/libSDL2_image.dll.a +0 -0
  176. data/assets/mingw/lib/libSDL2_mixer.a +0 -0
  177. data/assets/mingw/lib/libSDL2_mixer.dll.a +0 -0
  178. data/assets/mingw/lib/libSDL2_test.a +0 -0
  179. data/assets/mingw/lib/libSDL2_ttf.a +0 -0
  180. data/assets/mingw/lib/libSDL2_ttf.dll.a +0 -0
  181. data/assets/mingw/lib/libSDL2main.a +0 -0
  182. data/assets/mingw/lib/libglew32.a +0 -0
  183. data/assets/mingw/lib/libglew32.dll.a +0 -0
  184. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +16 -0
  185. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json +6 -0
  186. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json +17 -0
  187. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +16 -0
  188. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json +6 -0
  189. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +16 -0
  190. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json +6 -0
  191. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json +16 -0
  192. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json +6 -0
  193. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json +17 -0
  194. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json +16 -0
  195. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json +6 -0
  196. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json +16 -0
  197. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json +6 -0
  198. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json +32 -0
  199. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json +16 -0
  200. data/assets/tvos/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json +16 -0
  201. data/assets/tvos/Assets.xcassets/Contents.json +6 -0
  202. data/assets/tvos/Assets.xcassets/LaunchImage.launchimage/Contents.json +22 -0
  203. data/assets/tvos/Info.plist +30 -0
  204. data/assets/tvos/MRuby.framework/Headers/mrbconf.h +143 -0
  205. data/assets/tvos/MRuby.framework/Headers/mruby/array.h +280 -0
  206. data/assets/tvos/MRuby.framework/Headers/mruby/boxing_nan.h +102 -0
  207. data/assets/tvos/MRuby.framework/Headers/mruby/boxing_no.h +56 -0
  208. data/assets/tvos/MRuby.framework/Headers/mruby/boxing_word.h +144 -0
  209. data/assets/tvos/MRuby.framework/Headers/mruby/class.h +97 -0
  210. data/assets/tvos/MRuby.framework/Headers/mruby/common.h +77 -0
  211. data/assets/tvos/MRuby.framework/Headers/mruby/compile.h +195 -0
  212. data/assets/tvos/MRuby.framework/Headers/mruby/data.h +75 -0
  213. data/assets/tvos/MRuby.framework/Headers/mruby/debug.h +67 -0
  214. data/assets/tvos/MRuby.framework/Headers/mruby/dump.h +196 -0
  215. data/assets/tvos/MRuby.framework/Headers/mruby/error.h +75 -0
  216. data/assets/tvos/MRuby.framework/Headers/mruby/gc.h +91 -0
  217. data/assets/tvos/MRuby.framework/Headers/mruby/hash.h +215 -0
  218. data/assets/tvos/MRuby.framework/Headers/mruby/irep.h +75 -0
  219. data/assets/tvos/MRuby.framework/Headers/mruby/istruct.h +47 -0
  220. data/assets/tvos/MRuby.framework/Headers/mruby/khash.h +274 -0
  221. data/assets/tvos/MRuby.framework/Headers/mruby/numeric.h +161 -0
  222. data/assets/tvos/MRuby.framework/Headers/mruby/object.h +44 -0
  223. data/assets/tvos/MRuby.framework/Headers/mruby/opcode.h +69 -0
  224. data/assets/tvos/MRuby.framework/Headers/mruby/ops.h +117 -0
  225. data/assets/tvos/MRuby.framework/Headers/mruby/proc.h +131 -0
  226. data/assets/tvos/MRuby.framework/Headers/mruby/range.h +49 -0
  227. data/assets/tvos/MRuby.framework/Headers/mruby/re.h +16 -0
  228. data/assets/tvos/MRuby.framework/Headers/mruby/string.h +444 -0
  229. data/assets/tvos/MRuby.framework/Headers/mruby/throw.h +55 -0
  230. data/assets/tvos/MRuby.framework/Headers/mruby/value.h +309 -0
  231. data/assets/tvos/MRuby.framework/Headers/mruby/variable.h +136 -0
  232. data/assets/tvos/MRuby.framework/Headers/mruby/version.h +110 -0
  233. data/assets/tvos/MRuby.framework/Headers/mruby.h +1282 -0
  234. data/assets/tvos/MRuby.framework/Info.plist +20 -0
  235. data/assets/tvos/MRuby.framework/MRuby +0 -0
  236. data/assets/tvos/MyApp.xcodeproj/project.pbxproj +350 -0
  237. data/assets/tvos/MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  238. data/assets/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  239. data/assets/tvos/MyApp.xcodeproj/project.xcworkspace/xcshareddata/MyApp.xcscmblueprint +30 -0
  240. data/assets/tvos/main.c +1 -0
  241. data/bin/ruby2d +142 -0
  242. data/ext/ruby2d/common.c +185 -0
  243. data/ext/ruby2d/controllers.c +110 -0
  244. data/ext/ruby2d/extconf.rb +147 -0
  245. data/ext/ruby2d/font.c +35 -0
  246. data/ext/ruby2d/gl.c +398 -0
  247. data/ext/ruby2d/gl2.c +86 -0
  248. data/ext/ruby2d/gl3.c +305 -0
  249. data/ext/ruby2d/gles.c +249 -0
  250. data/ext/ruby2d/image.c +58 -0
  251. data/ext/ruby2d/input.c +48 -0
  252. data/ext/ruby2d/music.c +127 -0
  253. data/ext/ruby2d/ruby2d.c +1374 -0
  254. data/ext/ruby2d/ruby2d.h +656 -0
  255. data/ext/ruby2d/shapes.c +154 -0
  256. data/ext/ruby2d/sound.c +118 -0
  257. data/ext/ruby2d/text.c +22 -0
  258. data/ext/ruby2d/window.c +414 -0
  259. data/lib/ruby2d/circle.rb +43 -0
  260. data/lib/ruby2d/cli/build.rb +237 -0
  261. data/lib/ruby2d/cli/colorize.rb +10 -0
  262. data/lib/ruby2d/cli/console.rb +65 -0
  263. data/lib/ruby2d/cli/enable_console.rb +5 -0
  264. data/lib/ruby2d/cli/launch.rb +50 -0
  265. data/lib/ruby2d/color.rb +136 -0
  266. data/lib/ruby2d/dsl.rb +46 -0
  267. data/lib/ruby2d/entity.rb +17 -0
  268. data/lib/ruby2d/exceptions.rb +6 -0
  269. data/lib/ruby2d/font.rb +96 -0
  270. data/lib/ruby2d/image.rb +58 -0
  271. data/lib/ruby2d/line.rb +89 -0
  272. data/lib/ruby2d/music.rb +67 -0
  273. data/lib/ruby2d/pixel.rb +17 -0
  274. data/lib/ruby2d/quad.rb +96 -0
  275. data/lib/ruby2d/rectangle.rb +65 -0
  276. data/lib/ruby2d/renderable.rb +40 -0
  277. data/lib/ruby2d/ruby2d.so +0 -0
  278. data/lib/ruby2d/sound.rb +55 -0
  279. data/lib/ruby2d/sprite.rb +232 -0
  280. data/lib/ruby2d/square.rb +37 -0
  281. data/lib/ruby2d/text.rb +76 -0
  282. data/lib/ruby2d/texture.rb +28 -0
  283. data/lib/ruby2d/tileset.rb +87 -0
  284. data/lib/ruby2d/triangle.rb +82 -0
  285. data/lib/ruby2d/version.rb +5 -0
  286. data/lib/ruby2d/vertices.rb +84 -0
  287. data/lib/ruby2d/window.rb +673 -0
  288. data/lib/ruby2d.rb +69 -0
  289. metadata +346 -0
@@ -0,0 +1,1374 @@
1
+ // Native C extension for Ruby and MRuby
2
+
3
+ // Ruby 2D includes
4
+ #if RUBY2D_IOS_TVOS
5
+ #else
6
+ #include <ruby2d.h>
7
+ #endif
8
+
9
+ // Ruby includes
10
+ #if MRUBY
11
+ #include <mruby.h>
12
+ #include <mruby/array.h>
13
+ #include <mruby/string.h>
14
+ #include <mruby/variable.h>
15
+ #include <mruby/numeric.h>
16
+ #include <mruby/data.h>
17
+ #include <mruby/irep.h>
18
+ #else
19
+ #include <ruby.h>
20
+ #endif
21
+
22
+ // Define Ruby type conversions in MRuby
23
+ #if MRUBY
24
+ // C to MRuby types
25
+ #define INT2FIX(val) (mrb_fixnum_value(val))
26
+ #define INT2NUM(val) (mrb_fixnum_value((mrb_int)(val)))
27
+ #define UINT2NUM(val) (INT2NUM((unsigned mrb_int)(val)))
28
+ #define LL2NUM(val) (INT2NUM(val))
29
+ #define ULL2NUM(val) (INT2NUM((unsigned __int64)(val)))
30
+ #define DBL2NUM(val) (mrb_float_value(mrb, (mrb_float)(val)))
31
+ // MRuby to C types
32
+ #define TO_PDT(val) ((mrb_type(val) == MRB_TT_FLOAT) ? mrb_float(val) : mrb_int(mrb, (val)))
33
+ #define FIX2INT(val) (mrb_fixnum(val))
34
+ #define NUM2INT(val) ((mrb_int)TO_PDT(val))
35
+ #define NUM2UINT(val) ((unsigned mrb_int)TO_PDT(val))
36
+ #define NUM2LONG(val) (mrb_int(mrb, (val)))
37
+ #define NUM2LL(val) ((__int64)(TO_PDT(val)))
38
+ #define NUM2ULL(val) ((unsigned __int64)(TO_PDT(val)))
39
+ #define NUM2DBL(val) (mrb_to_flo(mrb, (val)))
40
+ #define NUM2CHR(val) ((mrb_string_p(val) && (RSTRING_LEN(val)>=1)) ? RSTRING_PTR(val)[0] : (char)(NUM2INT(val) & 0xff))
41
+ // Memory management
42
+ #define ALLOC(type) ((type *)mrb_malloc(mrb, sizeof(type)))
43
+ #define ALLOC_N(type, n) ((type *)mrb_malloc(mrb, sizeof(type) * (n)))
44
+ #define ALLOCA_N(type, n) ((type *)alloca(sizeof(type) * (n)))
45
+ #define MEMCMP(p1, p2, type, n) (memcmp((p1), (p2), sizeof(type)*(n)))
46
+ #endif
47
+
48
+ // Define common types and API calls, mapping to both Ruby and MRuby APIs
49
+ #if MRUBY
50
+ // MRuby
51
+ #define R_VAL mrb_value
52
+ #define R_NIL (mrb_nil_value())
53
+ #define R_TRUE (mrb_true_value())
54
+ #define R_FALSE (mrb_false_value())
55
+ #define R_CLASS struct RClass *
56
+ #define r_iv_get(self, var) mrb_iv_get(mrb, self, mrb_intern_lit(mrb, var))
57
+ #define r_iv_set(self, var, val) mrb_iv_set(mrb, self, mrb_intern_lit(mrb, var), val)
58
+ #define r_funcall(self, method, num_args, ...) mrb_funcall(mrb, self, method, num_args, ##__VA_ARGS__)
59
+ #define r_str_new(str) mrb_str_new(mrb, str, strlen(str))
60
+ #define r_test(val) (mrb_test(val) == true)
61
+ #define r_ary_entry(ary, pos) mrb_ary_entry(ary, pos)
62
+ #define r_data_wrap_struct(name, data) mrb_obj_value(Data_Wrap_Struct(mrb, mrb->object_class, &name##_data_type, data))
63
+ #define r_data_get_struct(self, var, mrb_type, rb_type, data) Data_Get_Struct(mrb, r_iv_get(self, var), mrb_type, data)
64
+ #define r_define_module(name) mrb_define_module(mrb, name)
65
+ #define r_define_class(module, name) mrb_define_class_under(mrb, module, name, mrb->object_class)
66
+ #define r_define_method(class, name, function, args) mrb_define_method(mrb, class, name, function, args)
67
+ #define r_define_class_method(class, name, function, args) mrb_define_class_method(mrb, class, name, function, args)
68
+ #define r_args_none (MRB_ARGS_NONE())
69
+ #define r_args_req(n) MRB_ARGS_REQ(n)
70
+ // Helpers
71
+ #define r_char_to_sym(str) mrb_symbol_value(mrb_intern_cstr(mrb, str))
72
+ #else
73
+ // Ruby
74
+ #define R_VAL VALUE
75
+ #define R_NIL Qnil
76
+ #define R_TRUE Qtrue
77
+ #define R_FALSE Qfalse
78
+ #define R_CLASS R_VAL
79
+ #define r_iv_get(self, var) rb_iv_get(self, var)
80
+ #define r_iv_set(self, var, val) rb_iv_set(self, var, val)
81
+ #define r_funcall(self, method, num_args, ...) rb_funcall(self, rb_intern(method), num_args, ##__VA_ARGS__)
82
+ #define r_str_new(str) rb_str_new2(str)
83
+ #define r_test(val) (val != Qfalse && val != Qnil)
84
+ #define r_ary_entry(ary, pos) rb_ary_entry(ary, pos)
85
+ #define r_data_wrap_struct(name, data) Data_Wrap_Struct(rb_cObject, NULL, (free_##name), data)
86
+ #define r_data_get_struct(self, var, mrb_type, rb_type, data) Data_Get_Struct(r_iv_get(self, var), rb_type, data)
87
+ #define r_define_module(name) rb_define_module(name)
88
+ #define r_define_class(module, name) rb_define_class_under(module, name, rb_cObject)
89
+ #define r_define_method(class, name, function, args) rb_define_method(class, name, function, args)
90
+ #define r_define_class_method(class, name, function, args) rb_define_singleton_method(class, name, function, args)
91
+ #define r_args_none 0
92
+ #define r_args_req(n) n
93
+ // Helpers
94
+ #define r_char_to_sym(str) ID2SYM(rb_intern(str))
95
+ #endif
96
+
97
+ // Create the MRuby context
98
+ #if MRUBY
99
+ static mrb_state *mrb;
100
+ #endif
101
+
102
+ // Ruby 2D interpreter window
103
+ static R_VAL ruby2d_window;
104
+
105
+ // Ruby 2D native window
106
+ static R2D_Window *window;
107
+
108
+ // Method signatures and structures for Ruby 2D classes
109
+ #if MRUBY
110
+ static void free_sound(mrb_state *mrb, void *p_);
111
+ static const struct mrb_data_type sound_data_type = {
112
+ "sound", free_sound
113
+ };
114
+ static void free_music(mrb_state *mrb, void *p_);
115
+ static const struct mrb_data_type music_data_type = {
116
+ "music", free_music
117
+ };
118
+ static void free_surface(mrb_state *mrb, void *p_);
119
+ static const struct mrb_data_type surface_data_type = {
120
+ "surface", free_surface
121
+ };
122
+ static void free_font(mrb_state *mrb, void *p_);
123
+ static const struct mrb_data_type font_data_type = {
124
+ "font", free_font
125
+ };
126
+ #else
127
+ static void free_sound(R2D_Sound *snd);
128
+ static void free_music(R2D_Music *mus);
129
+ static void free_font(TTF_Font *font);
130
+ static void free_surface(SDL_Surface *font);
131
+ #endif
132
+
133
+ /*
134
+ * Function pointer to free the Ruby 2D native window
135
+ */
136
+ static void free_window() {
137
+ R2D_FreeWindow(window);
138
+ }
139
+
140
+
141
+ /*
142
+ * Normalize controller axis values to 0.0...1.0
143
+ */
144
+ double normalize_controller_axis(int val) {
145
+ return val > 0 ? val / 32767.0 : val / 32768.0;
146
+ }
147
+
148
+
149
+ /*
150
+ * Ruby2D#self.ext_base_path
151
+ */
152
+ #if MRUBY
153
+ static R_VAL ruby2d_ext_base_path(mrb_state* mrb, R_VAL self) {
154
+ #else
155
+ static R_VAL ruby2d_ext_base_path(R_VAL self) {
156
+ #endif
157
+ return r_str_new(SDL_GetBasePath());
158
+ }
159
+
160
+
161
+ /*
162
+ * Ruby2D::Pixel#self.ext_draw
163
+ */
164
+ #if MRUBY
165
+ static R_VAL ruby2d_pixel_ext_draw(mrb_state* mrb, R_VAL self) {
166
+ mrb_value a;
167
+ mrb_get_args(mrb, "o", &a);
168
+ #else
169
+ static R_VAL ruby2d_pixel_ext_draw(R_VAL self, R_VAL a) {
170
+ #endif
171
+ // `a` is the array representing the pixel
172
+
173
+ R2D_DrawQuad(
174
+ NUM2DBL(r_ary_entry(a, 0)), // x1
175
+ NUM2DBL(r_ary_entry(a, 1)), // y1
176
+ NUM2DBL(r_ary_entry(a, 8)), // color
177
+ NUM2DBL(r_ary_entry(a, 9)), // color
178
+ NUM2DBL(r_ary_entry(a, 10)), // color
179
+ NUM2DBL(r_ary_entry(a, 11)), // color
180
+
181
+ NUM2DBL(r_ary_entry(a, 2)), // x2
182
+ NUM2DBL(r_ary_entry(a, 3)), // y2
183
+ NUM2DBL(r_ary_entry(a, 8)), // color
184
+ NUM2DBL(r_ary_entry(a, 9)), // color
185
+ NUM2DBL(r_ary_entry(a, 10)), // color
186
+ NUM2DBL(r_ary_entry(a, 11)), // color
187
+
188
+ NUM2DBL(r_ary_entry(a, 4)), // x3
189
+ NUM2DBL(r_ary_entry(a, 5)), // y3
190
+ NUM2DBL(r_ary_entry(a, 8)), // color
191
+ NUM2DBL(r_ary_entry(a, 9)), // color
192
+ NUM2DBL(r_ary_entry(a, 10)), // color
193
+ NUM2DBL(r_ary_entry(a, 11)), // color
194
+
195
+ NUM2DBL(r_ary_entry(a, 6)), // x4
196
+ NUM2DBL(r_ary_entry(a, 7)), // y4
197
+ NUM2DBL(r_ary_entry(a, 8)), // color
198
+ NUM2DBL(r_ary_entry(a, 9)), // color
199
+ NUM2DBL(r_ary_entry(a, 10)), // color
200
+ NUM2DBL(r_ary_entry(a, 11)) // color
201
+ );
202
+
203
+ return R_NIL;
204
+ }
205
+
206
+
207
+ /*
208
+ * Ruby2D::Triangle#self.ext_draw
209
+ */
210
+ #if MRUBY
211
+ static R_VAL ruby2d_triangle_ext_draw(mrb_state* mrb, R_VAL self) {
212
+ mrb_value a;
213
+ mrb_get_args(mrb, "o", &a);
214
+ #else
215
+ static R_VAL ruby2d_triangle_ext_draw(R_VAL self, R_VAL a) {
216
+ #endif
217
+ // `a` is the array representing the triangle
218
+
219
+ R2D_DrawTriangle(
220
+ NUM2DBL(r_ary_entry(a, 0)), // x1
221
+ NUM2DBL(r_ary_entry(a, 1)), // y1
222
+ NUM2DBL(r_ary_entry(a, 2)), // c1 red
223
+ NUM2DBL(r_ary_entry(a, 3)), // c1 green
224
+ NUM2DBL(r_ary_entry(a, 4)), // c1 blue
225
+ NUM2DBL(r_ary_entry(a, 5)), // c1 alpha
226
+
227
+ NUM2DBL(r_ary_entry(a, 6)), // x2
228
+ NUM2DBL(r_ary_entry(a, 7)), // y2
229
+ NUM2DBL(r_ary_entry(a, 8)), // c2 red
230
+ NUM2DBL(r_ary_entry(a, 9)), // c2 green
231
+ NUM2DBL(r_ary_entry(a, 10)), // c2 blue
232
+ NUM2DBL(r_ary_entry(a, 11)), // c2 alpha
233
+
234
+ NUM2DBL(r_ary_entry(a, 12)), // x3
235
+ NUM2DBL(r_ary_entry(a, 13)), // y3
236
+ NUM2DBL(r_ary_entry(a, 14)), // c3 red
237
+ NUM2DBL(r_ary_entry(a, 15)), // c3 green
238
+ NUM2DBL(r_ary_entry(a, 16)), // c3 blue
239
+ NUM2DBL(r_ary_entry(a, 17)) // c3 alpha
240
+ );
241
+
242
+ return R_NIL;
243
+ }
244
+
245
+
246
+ /*
247
+ * Ruby2D::Quad#self.ext_draw
248
+ */
249
+ #if MRUBY
250
+ static R_VAL ruby2d_quad_ext_draw(mrb_state* mrb, R_VAL self) {
251
+ mrb_value a;
252
+ mrb_get_args(mrb, "o", &a);
253
+ #else
254
+ static R_VAL ruby2d_quad_ext_draw(R_VAL self, R_VAL a) {
255
+ #endif
256
+ // `a` is the array representing the quad
257
+
258
+ R2D_DrawQuad(
259
+ NUM2DBL(r_ary_entry(a, 0)), // x1
260
+ NUM2DBL(r_ary_entry(a, 1)), // y1
261
+ NUM2DBL(r_ary_entry(a, 2)), // c1 red
262
+ NUM2DBL(r_ary_entry(a, 3)), // c1 green
263
+ NUM2DBL(r_ary_entry(a, 4)), // c1 blue
264
+ NUM2DBL(r_ary_entry(a, 5)), // c1 alpha
265
+
266
+ NUM2DBL(r_ary_entry(a, 6)), // x2
267
+ NUM2DBL(r_ary_entry(a, 7)), // y2
268
+ NUM2DBL(r_ary_entry(a, 8)), // c2 red
269
+ NUM2DBL(r_ary_entry(a, 9)), // c2 green
270
+ NUM2DBL(r_ary_entry(a, 10)), // c2 blue
271
+ NUM2DBL(r_ary_entry(a, 11)), // c2 alpha
272
+
273
+ NUM2DBL(r_ary_entry(a, 12)), // x3
274
+ NUM2DBL(r_ary_entry(a, 13)), // y3
275
+ NUM2DBL(r_ary_entry(a, 14)), // c3 red
276
+ NUM2DBL(r_ary_entry(a, 15)), // c3 green
277
+ NUM2DBL(r_ary_entry(a, 16)), // c3 blue
278
+ NUM2DBL(r_ary_entry(a, 17)), // c3 alpha
279
+
280
+ NUM2DBL(r_ary_entry(a, 18)), // x4
281
+ NUM2DBL(r_ary_entry(a, 19)), // y4
282
+ NUM2DBL(r_ary_entry(a, 20)), // c4 red
283
+ NUM2DBL(r_ary_entry(a, 21)), // c4 green
284
+ NUM2DBL(r_ary_entry(a, 22)), // c4 blue
285
+ NUM2DBL(r_ary_entry(a, 23)) // c4 alpha
286
+ );
287
+
288
+ return R_NIL;
289
+ }
290
+
291
+
292
+ /*
293
+ * Ruby2D::Line#self.ext_draw
294
+ */
295
+ #if MRUBY
296
+ static R_VAL ruby2d_line_ext_draw(mrb_state* mrb, R_VAL self) {
297
+ mrb_value a;
298
+ mrb_get_args(mrb, "o", &a);
299
+ #else
300
+ static R_VAL ruby2d_line_ext_draw(R_VAL self, R_VAL a) {
301
+ #endif
302
+ // `a` is the array representing the line
303
+
304
+ R2D_DrawLine(
305
+ NUM2DBL(r_ary_entry(a, 0)), // x1
306
+ NUM2DBL(r_ary_entry(a, 1)), // y1
307
+ NUM2DBL(r_ary_entry(a, 2)), // x2
308
+ NUM2DBL(r_ary_entry(a, 3)), // y2
309
+ NUM2DBL(r_ary_entry(a, 4)), // width
310
+
311
+ NUM2DBL(r_ary_entry(a, 5)), // c1 red
312
+ NUM2DBL(r_ary_entry(a, 6)), // c1 green
313
+ NUM2DBL(r_ary_entry(a, 7)), // c1 blue
314
+ NUM2DBL(r_ary_entry(a, 8)), // c1 alpha
315
+
316
+ NUM2DBL(r_ary_entry(a, 9)), // c2 red
317
+ NUM2DBL(r_ary_entry(a, 10)), // c2 green
318
+ NUM2DBL(r_ary_entry(a, 11)), // c2 blue
319
+ NUM2DBL(r_ary_entry(a, 12)), // c2 alpha
320
+
321
+ NUM2DBL(r_ary_entry(a, 13)), // c3 red
322
+ NUM2DBL(r_ary_entry(a, 14)), // c3 green
323
+ NUM2DBL(r_ary_entry(a, 15)), // c3 blue
324
+ NUM2DBL(r_ary_entry(a, 16)), // c3 alpha
325
+
326
+ NUM2DBL(r_ary_entry(a, 17)), // c4 red
327
+ NUM2DBL(r_ary_entry(a, 18)), // c4 green
328
+ NUM2DBL(r_ary_entry(a, 19)), // c4 blue
329
+ NUM2DBL(r_ary_entry(a, 20)) // c4 alpha
330
+ );
331
+
332
+ return R_NIL;
333
+ }
334
+
335
+
336
+ /*
337
+ * Ruby2D::Circle#self.ext_draw
338
+ */
339
+ #if MRUBY
340
+ static R_VAL ruby2d_circle_ext_draw(mrb_state* mrb, R_VAL self) {
341
+ mrb_value a;
342
+ mrb_get_args(mrb, "o", &a);
343
+ #else
344
+ static R_VAL ruby2d_circle_ext_draw(R_VAL self, R_VAL a) {
345
+ #endif
346
+ // `a` is the array representing the circle
347
+
348
+ R2D_DrawCircle(
349
+ NUM2DBL(r_ary_entry(a, 0)), // x
350
+ NUM2DBL(r_ary_entry(a, 1)), // y
351
+ NUM2DBL(r_ary_entry(a, 2)), // radius
352
+ NUM2DBL(r_ary_entry(a, 3)), // sectors
353
+ NUM2DBL(r_ary_entry(a, 4)), // red
354
+ NUM2DBL(r_ary_entry(a, 5)), // green
355
+ NUM2DBL(r_ary_entry(a, 6)), // blue
356
+ NUM2DBL(r_ary_entry(a, 7)) // alpha
357
+ );
358
+
359
+ return R_NIL;
360
+ }
361
+
362
+
363
+ /*
364
+ * Ruby2D::Image#ext_load_image
365
+ * Create an SDL surface from an image path, return the surface, width, and height
366
+ */
367
+ #if MRUBY
368
+ static R_VAL ruby2d_image_ext_load_image(mrb_state* mrb, R_VAL self) {
369
+ R2D_Init();
370
+
371
+ mrb_value result = mrb_ary_new(mrb);
372
+
373
+ mrb_value path;
374
+ mrb_get_args(mrb, "s", &path);
375
+
376
+ SDL_Surface *surface = R2D_CreateImageSurface(RSTRING_PTR(path));
377
+ R2D_ImageConvertToRGB(surface);
378
+
379
+ mrb_ary_push(mrb, result, r_data_wrap_struct(surface, surface));
380
+ mrb_ary_push(mrb, result, INT2NUM(surface->w));
381
+ mrb_ary_push(mrb, result, INT2NUM(surface->h));
382
+
383
+ return result;
384
+ }
385
+ #else
386
+ static R_VAL ruby2d_image_ext_load_image(R_VAL self, R_VAL path) {
387
+ R2D_Init();
388
+
389
+ VALUE result = rb_ary_new2(3);
390
+
391
+ SDL_Surface *surface = R2D_CreateImageSurface(RSTRING_PTR(path));
392
+ R2D_ImageConvertToRGB(surface);
393
+
394
+ rb_ary_push(result, r_data_wrap_struct(surface, surface));
395
+ rb_ary_push(result, INT2NUM(surface->w));
396
+ rb_ary_push(result, INT2NUM(surface->h));
397
+
398
+ return result;
399
+ }
400
+ #endif
401
+
402
+ /*
403
+ * Ruby2D::Text#ext_load_text
404
+ */
405
+ #if MRUBY
406
+ static R_VAL ruby2d_text_ext_load_text(mrb_state* mrb, R_VAL self) {
407
+ R2D_Init();
408
+
409
+ mrb_value result = mrb_ary_new(mrb);
410
+
411
+ mrb_value font, message;
412
+ mrb_get_args(mrb, "oo", &font, &message);
413
+
414
+ TTF_Font *ttf_font;
415
+ Data_Get_Struct(mrb, font, &font_data_type, ttf_font);
416
+ //r_data_get_struct(self, font, &font_data_type, TTF_Font, ttf_font);
417
+
418
+ // #define r_data_get_struct(self, var, mrb_type, rb_type, data) Data_Get_Struct(mrb, r_iv_get(self, var), mrb_type, data)
419
+
420
+ SDL_Surface *surface = R2D_TextCreateSurface(ttf_font, RSTRING_PTR(message));
421
+ if (!surface) {
422
+ return result;
423
+ }
424
+
425
+ mrb_ary_push(mrb, result, r_data_wrap_struct(surface, surface));
426
+ mrb_ary_push(mrb, result, INT2NUM(surface->w));
427
+ mrb_ary_push(mrb, result, INT2NUM(surface->h));
428
+
429
+ return result;
430
+ }
431
+ #else
432
+ static R_VAL ruby2d_text_ext_load_text(R_VAL self, R_VAL font, R_VAL message) {
433
+ R2D_Init();
434
+
435
+ VALUE result = rb_ary_new2(3);
436
+
437
+ TTF_Font *ttf_font;
438
+ Data_Get_Struct(font, TTF_Font, ttf_font);
439
+
440
+ SDL_Surface *surface = R2D_TextCreateSurface(ttf_font, RSTRING_PTR(message));
441
+ if (!surface) {
442
+ return result;
443
+ }
444
+
445
+ rb_ary_push(result, r_data_wrap_struct(surface, surface));
446
+ rb_ary_push(result, INT2NUM(surface->w));
447
+ rb_ary_push(result, INT2NUM(surface->h));
448
+
449
+ return result;
450
+ }
451
+ #endif
452
+
453
+ /*
454
+ * Ruby2D::Texture#ext_create
455
+ */
456
+ #if MRUBY
457
+ static R_VAL ruby2d_texture_ext_create(mrb_state* mrb, R_VAL self) {
458
+ GLuint texture_id = 0;
459
+ SDL_Surface *surface;
460
+
461
+ mrb_value rubySurface, width, height;
462
+ mrb_get_args(mrb, "ooo", &rubySurface, &width, &height);
463
+
464
+ //Data_Get_Struct(mrb, rubySurface, SDL_Surface, surface);
465
+ Data_Get_Struct(mrb, rubySurface, &surface_data_type, surface);
466
+ //r_data_get_struct(self, "@data", &surface_data_type, SDL_Surface, surface);
467
+
468
+ // Detect image mode
469
+ GLint format = GL_RGB;
470
+ if (surface->format->BytesPerPixel == 4) {
471
+ format = GL_RGBA;
472
+ }
473
+
474
+ R2D_GL_CreateTexture(&texture_id, format,
475
+ NUM2INT(width), NUM2INT(height),
476
+ surface->pixels, GL_NEAREST);
477
+
478
+ return INT2NUM(texture_id);
479
+ }
480
+ #else
481
+ static R_VAL ruby2d_texture_ext_create(R_VAL self, R_VAL rubySurface, R_VAL width, R_VAL height) {
482
+ GLuint texture_id = 0;
483
+ SDL_Surface *surface;
484
+ Data_Get_Struct(rubySurface, SDL_Surface, surface);
485
+
486
+ // Detect image mode
487
+ GLint format = GL_RGB;
488
+ if (surface->format->BytesPerPixel == 4) {
489
+ format = GL_RGBA;
490
+ }
491
+
492
+ R2D_GL_CreateTexture(&texture_id, format,
493
+ NUM2INT(width), NUM2INT(height),
494
+ surface->pixels, GL_NEAREST);
495
+
496
+ return INT2NUM(texture_id);
497
+ }
498
+ #endif
499
+
500
+ /*
501
+ * Ruby2D::Texture#ext_delete
502
+ */
503
+ #if MRUBY
504
+ static R_VAL ruby2d_texture_ext_delete(mrb_state* mrb, R_VAL self) {
505
+ mrb_value rubyTexture_id;
506
+ mrb_get_args(mrb, "o", &rubyTexture_id);
507
+ #else
508
+ static R_VAL ruby2d_texture_ext_delete(R_VAL self, R_VAL rubyTexture_id) {
509
+ #endif
510
+ GLuint texture_id = NUM2INT(rubyTexture_id);
511
+
512
+ R2D_GL_FreeTexture(&texture_id);
513
+
514
+ return R_NIL;
515
+ }
516
+
517
+
518
+ /*
519
+ * Ruby2D::Sound#ext_init
520
+ * Initialize sound structure data
521
+ */
522
+ #if MRUBY
523
+ static R_VAL ruby2d_sound_ext_init(mrb_state* mrb, R_VAL self) {
524
+ mrb_value path;
525
+ mrb_get_args(mrb, "o", &path);
526
+ #else
527
+ static R_VAL ruby2d_sound_ext_init(R_VAL self, R_VAL path) {
528
+ #endif
529
+ R2D_Sound *snd = R2D_CreateSound(RSTRING_PTR(path));
530
+ if (!snd) return R_FALSE;
531
+ r_iv_set(self, "@data", r_data_wrap_struct(sound, snd));
532
+ return R_TRUE;
533
+ }
534
+
535
+
536
+ /*
537
+ * Ruby2D::Sound#ext_play
538
+ */
539
+ #if MRUBY
540
+ static R_VAL ruby2d_sound_ext_play(mrb_state* mrb, R_VAL self) {
541
+ #else
542
+ static R_VAL ruby2d_sound_ext_play(R_VAL self) {
543
+ #endif
544
+ R2D_Sound *snd;
545
+ r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
546
+ R2D_PlaySound(snd);
547
+ return R_NIL;
548
+ }
549
+
550
+
551
+ /*
552
+ * Ruby2D::Sound#ext_length
553
+ */
554
+ #if MRUBY
555
+ static R_VAL ruby2d_sound_ext_length(mrb_state* mrb, R_VAL self) {
556
+ #else
557
+ static R_VAL ruby2d_sound_ext_length(R_VAL self) {
558
+ #endif
559
+ R2D_Sound *snd;
560
+ r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
561
+ return INT2NUM(R2D_GetSoundLength(snd));
562
+ }
563
+
564
+
565
+ /*
566
+ * Free sound structure attached to Ruby 2D `Sound` class
567
+ */
568
+ #if MRUBY
569
+ static void free_sound(mrb_state *mrb, void *p_) {
570
+ R2D_Sound *snd = (R2D_Sound *)p_;
571
+ #else
572
+ static void free_sound(R2D_Sound *snd) {
573
+ #endif
574
+ R2D_FreeSound(snd);
575
+ }
576
+
577
+ /*
578
+ * Ruby2D::Sound#ext_get_volume
579
+ */
580
+ #if MRUBY
581
+ static R_VAL ruby2d_sound_ext_get_volume(mrb_state* mrb, R_VAL self) {
582
+ #else
583
+ static R_VAL ruby2d_sound_ext_get_volume(R_VAL self) {
584
+ #endif
585
+ R2D_Sound *snd;
586
+ r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
587
+ return INT2NUM(ceil(Mix_VolumeChunk(snd->data, -1) * (100.0 / MIX_MAX_VOLUME)));
588
+ }
589
+
590
+ /*
591
+ * Ruby2D::Music#ext_set_volume
592
+ */
593
+ #if MRUBY
594
+ static R_VAL ruby2d_sound_ext_set_volume(mrb_state* mrb, R_VAL self) {
595
+ mrb_value volume;
596
+ mrb_get_args(mrb, "o", &volume);
597
+ #else
598
+ static R_VAL ruby2d_sound_ext_set_volume(R_VAL self, R_VAL volume) {
599
+ #endif
600
+ R2D_Sound *snd;
601
+ r_data_get_struct(self, "@data", &sound_data_type, R2D_Sound, snd);
602
+ Mix_VolumeChunk(snd->data, (NUM2INT(volume) / 100.0) * MIX_MAX_VOLUME);
603
+ return R_NIL;
604
+ }
605
+
606
+ /*
607
+ * Ruby2D::Sound#ext_get_mix_volume
608
+ */
609
+ #if MRUBY
610
+ static R_VAL ruby2d_sound_ext_get_mix_volume(mrb_state* mrb, R_VAL self) {
611
+ #else
612
+ static R_VAL ruby2d_sound_ext_get_mix_volume(R_VAL self) {
613
+ #endif
614
+ return INT2NUM(ceil(Mix_Volume(-1, -1) * (100.0 / MIX_MAX_VOLUME)));
615
+ }
616
+
617
+ /*
618
+ * Ruby2D::Music#ext_set_mix_volume
619
+ */
620
+ #if MRUBY
621
+ static R_VAL ruby2d_sound_ext_set_mix_volume(mrb_state* mrb, R_VAL self) {
622
+ mrb_value volume;
623
+ mrb_get_args(mrb, "o", &volume);
624
+ #else
625
+ static R_VAL ruby2d_sound_ext_set_mix_volume(R_VAL self, R_VAL volume) {
626
+ #endif
627
+ Mix_Volume(-1, (NUM2INT(volume) / 100.0) * MIX_MAX_VOLUME);
628
+ return R_NIL;
629
+ }
630
+
631
+ /*
632
+ * Ruby2D::Music#ext_init
633
+ * Initialize music structure data
634
+ */
635
+ #if MRUBY
636
+ static R_VAL ruby2d_music_ext_init(mrb_state* mrb, R_VAL self) {
637
+ mrb_value path;
638
+ mrb_get_args(mrb, "o", &path);
639
+ #else
640
+ static R_VAL ruby2d_music_ext_init(R_VAL self, R_VAL path) {
641
+ #endif
642
+ R2D_Music *mus = R2D_CreateMusic(RSTRING_PTR(path));
643
+ if (!mus) return R_FALSE;
644
+ r_iv_set(self, "@data", r_data_wrap_struct(music, mus));
645
+ return R_TRUE;
646
+ }
647
+
648
+
649
+ /*
650
+ * Ruby2D::Music#ext_play
651
+ */
652
+ #if MRUBY
653
+ static R_VAL ruby2d_music_ext_play(mrb_state* mrb, R_VAL self) {
654
+ #else
655
+ static R_VAL ruby2d_music_ext_play(R_VAL self) {
656
+ #endif
657
+ R2D_Music *mus;
658
+ r_data_get_struct(self, "@data", &music_data_type, R2D_Music, mus);
659
+ R2D_PlayMusic(mus, r_test(r_iv_get(self, "@loop")));
660
+ return R_NIL;
661
+ }
662
+
663
+
664
+ /*
665
+ * Ruby2D::Music#ext_pause
666
+ */
667
+ #if MRUBY
668
+ static R_VAL ruby2d_music_ext_pause(mrb_state* mrb, R_VAL self) {
669
+ #else
670
+ static R_VAL ruby2d_music_ext_pause(R_VAL self) {
671
+ #endif
672
+ R2D_PauseMusic();
673
+ return R_NIL;
674
+ }
675
+
676
+
677
+ /*
678
+ * Ruby2D::Music#ext_resume
679
+ */
680
+ #if MRUBY
681
+ static R_VAL ruby2d_music_ext_resume(mrb_state* mrb, R_VAL self) {
682
+ #else
683
+ static R_VAL ruby2d_music_ext_resume(R_VAL self) {
684
+ #endif
685
+ R2D_ResumeMusic();
686
+ return R_NIL;
687
+ }
688
+
689
+
690
+ /*
691
+ * Ruby2D::Music#ext_stop
692
+ */
693
+ #if MRUBY
694
+ static R_VAL ruby2d_music_ext_stop(mrb_state* mrb, R_VAL self) {
695
+ #else
696
+ static R_VAL ruby2d_music_ext_stop(R_VAL self) {
697
+ #endif
698
+ R2D_StopMusic();
699
+ return R_NIL;
700
+ }
701
+
702
+
703
+ /*
704
+ * Ruby2D::Music#ext_get_volume
705
+ */
706
+ #if MRUBY
707
+ static R_VAL ruby2d_music_ext_get_volume(mrb_state* mrb, R_VAL self) {
708
+ #else
709
+ static R_VAL ruby2d_music_ext_get_volume(R_VAL self) {
710
+ #endif
711
+ return INT2NUM(R2D_GetMusicVolume());
712
+ }
713
+
714
+
715
+ /*
716
+ * Ruby2D::Music#ext_set_volume
717
+ */
718
+ #if MRUBY
719
+ static R_VAL ruby2d_music_ext_set_volume(mrb_state* mrb, R_VAL self) {
720
+ mrb_value volume;
721
+ mrb_get_args(mrb, "o", &volume);
722
+ #else
723
+ static R_VAL ruby2d_music_ext_set_volume(R_VAL self, R_VAL volume) {
724
+ #endif
725
+ R2D_SetMusicVolume(NUM2INT(volume));
726
+ return R_NIL;
727
+ }
728
+
729
+
730
+ /*
731
+ * Ruby2D::Music#ext_fadeout
732
+ */
733
+ #if MRUBY
734
+ static R_VAL ruby2d_music_ext_fadeout(mrb_state* mrb, R_VAL self) {
735
+ mrb_value ms;
736
+ mrb_get_args(mrb, "o", &ms);
737
+ #else
738
+ static R_VAL ruby2d_music_ext_fadeout(R_VAL self, R_VAL ms) {
739
+ #endif
740
+ R2D_FadeOutMusic(NUM2INT(ms));
741
+ return R_NIL;
742
+ }
743
+
744
+
745
+ /*
746
+ * Ruby2D::Music#ext_length
747
+ */
748
+ #if MRUBY
749
+ static R_VAL ruby2d_music_ext_length(mrb_state* mrb, R_VAL self) {
750
+ #else
751
+ static R_VAL ruby2d_music_ext_length(R_VAL self) {
752
+ #endif
753
+ R2D_Music *ms;
754
+ r_data_get_struct(self, "@data", &music_data_type, R2D_Music, ms);
755
+ return INT2NUM(R2D_GetMusicLength(ms));
756
+ }
757
+
758
+ /*
759
+ * Ruby2D::Font#ext_load
760
+ */
761
+ #if MRUBY
762
+ static R_VAL ruby2d_font_ext_load(mrb_state* mrb, R_VAL self) {
763
+ mrb_value path, size, style;
764
+ mrb_get_args(mrb, "ooo", &path, &size, &style);
765
+ #else
766
+ static R_VAL ruby2d_font_ext_load(R_VAL self, R_VAL path, R_VAL size, R_VAL style) {
767
+ #endif
768
+ R2D_Init();
769
+
770
+ TTF_Font *font = R2D_FontCreateTTFFont(RSTRING_PTR(path), NUM2INT(size), RSTRING_PTR(style));
771
+ if (!font) {
772
+ return R_NIL;
773
+ }
774
+
775
+ return r_data_wrap_struct(font, font);
776
+ }
777
+
778
+
779
+ /*
780
+ * Ruby2D::Texture#ext_draw
781
+ */
782
+ #if MRUBY
783
+ static R_VAL ruby2d_texture_ext_draw(mrb_state* mrb, R_VAL self) {
784
+ mrb_value ruby_coordinates, ruby_texture_coordinates, ruby_color, texture_id;
785
+ mrb_get_args(mrb, "oooo", &ruby_coordinates, &ruby_texture_coordinates, &ruby_color, &texture_id);
786
+ #else
787
+ static R_VAL ruby2d_texture_ext_draw(R_VAL self, R_VAL ruby_coordinates, R_VAL ruby_texture_coordinates, R_VAL ruby_color, R_VAL texture_id) {
788
+ #endif
789
+ GLfloat coordinates[8];
790
+ GLfloat texture_coordinates[8];
791
+ GLfloat color[4];
792
+
793
+ for(int i = 0; i < 8; i++) { coordinates[i] = NUM2DBL(r_ary_entry(ruby_coordinates, i)); }
794
+ for(int i = 0; i < 8; i++) { texture_coordinates[i] = NUM2DBL(r_ary_entry(ruby_texture_coordinates, i)); }
795
+ for(int i = 0; i < 4; i++) { color[i] = NUM2DBL(r_ary_entry(ruby_color, i)); }
796
+
797
+ R2D_GL_DrawTexture(coordinates, texture_coordinates, color, NUM2INT(texture_id));
798
+
799
+ return R_NIL;
800
+ }
801
+
802
+ /*
803
+ * Free surface structure used within the Ruby 2D `Texture` class
804
+ */
805
+ #if MRUBY
806
+ static void free_surface(mrb_state *mrb, void *p_) {
807
+ SDL_Surface *surface = (SDL_Surface *)p_;
808
+ #else
809
+ static void free_surface(SDL_Surface *surface) {
810
+ #endif
811
+ SDL_FreeSurface(surface);
812
+ }
813
+
814
+ /*
815
+ * Free font structure stored in the Ruby 2D `Font` class
816
+ */
817
+ #if MRUBY
818
+ static void free_font(mrb_state *mrb, void *p_) {
819
+ TTF_Font *font = (TTF_Font *)p_;
820
+ #else
821
+ static void free_font(TTF_Font *font) {
822
+ #endif
823
+ TTF_CloseFont(font);
824
+ }
825
+
826
+ /*
827
+ * Free music structure attached to Ruby 2D `Music` class
828
+ */
829
+ #if MRUBY
830
+ static void free_music(mrb_state *mrb, void *p_) {
831
+ R2D_Music *mus = (R2D_Music *)p_;
832
+ #else
833
+ static void free_music(R2D_Music *mus) {
834
+ #endif
835
+ R2D_FreeMusic(mus);
836
+ }
837
+
838
+ /*
839
+ * Ruby 2D native `on_key` input callback function
840
+ */
841
+ static void on_key(R2D_Event e) {
842
+
843
+ R_VAL type;
844
+
845
+ switch (e.type) {
846
+ case R2D_KEY_DOWN:
847
+ type = r_char_to_sym("down");
848
+ break;
849
+ case R2D_KEY_HELD:
850
+ type = r_char_to_sym("held");
851
+ break;
852
+ case R2D_KEY_UP:
853
+ type = r_char_to_sym("up");
854
+ break;
855
+ }
856
+
857
+ r_funcall(ruby2d_window, "key_callback", 2, type, r_str_new(e.key));
858
+ }
859
+
860
+
861
+ /*
862
+ * Ruby 2D native `on_mouse` input callback function
863
+ */
864
+ void on_mouse(R2D_Event e) {
865
+
866
+ R_VAL type = R_NIL; R_VAL button = R_NIL; R_VAL direction = R_NIL;
867
+
868
+ switch (e.type) {
869
+ case R2D_MOUSE_DOWN:
870
+ // type, button, x, y
871
+ type = r_char_to_sym("down");
872
+ break;
873
+ case R2D_MOUSE_UP:
874
+ // type, button, x, y
875
+ type = r_char_to_sym("up");
876
+ break;
877
+ case R2D_MOUSE_SCROLL:
878
+ // type, direction, delta_x, delta_y
879
+ type = r_char_to_sym("scroll");
880
+ direction = e.direction == R2D_MOUSE_SCROLL_NORMAL ?
881
+ r_char_to_sym("normal") : r_char_to_sym("inverted");
882
+ break;
883
+ case R2D_MOUSE_MOVE:
884
+ // type, x, y, delta_x, delta_y
885
+ type = r_char_to_sym("move");
886
+ break;
887
+ }
888
+
889
+ if (e.type == R2D_MOUSE_DOWN || e.type == R2D_MOUSE_UP) {
890
+ switch (e.button) {
891
+ case R2D_MOUSE_LEFT:
892
+ button = r_char_to_sym("left");
893
+ break;
894
+ case R2D_MOUSE_MIDDLE:
895
+ button = r_char_to_sym("middle");
896
+ break;
897
+ case R2D_MOUSE_RIGHT:
898
+ button = r_char_to_sym("right");
899
+ break;
900
+ case R2D_MOUSE_X1:
901
+ button = r_char_to_sym("x1");
902
+ break;
903
+ case R2D_MOUSE_X2:
904
+ button = r_char_to_sym("x2");
905
+ break;
906
+ }
907
+ }
908
+
909
+ r_funcall(
910
+ ruby2d_window, "mouse_callback", 7, type, button, direction,
911
+ INT2NUM(e.x), INT2NUM(e.y), INT2NUM(e.delta_x), INT2NUM(e.delta_y)
912
+ );
913
+ }
914
+
915
+
916
+ /*
917
+ * Ruby 2D native `on_controller` input callback function
918
+ */
919
+ static void on_controller(R2D_Event e) {
920
+
921
+ R_VAL type = R_NIL; R_VAL axis = R_NIL; R_VAL button = R_NIL;
922
+
923
+ switch (e.type) {
924
+ case R2D_AXIS:
925
+ type = r_char_to_sym("axis");
926
+ switch (e.axis) {
927
+ case R2D_AXIS_LEFTX:
928
+ axis = r_char_to_sym("left_x");
929
+ break;
930
+ case R2D_AXIS_LEFTY:
931
+ axis = r_char_to_sym("left_y");
932
+ break;
933
+ case R2D_AXIS_RIGHTX:
934
+ axis = r_char_to_sym("right_x");
935
+ break;
936
+ case R2D_AXIS_RIGHTY:
937
+ axis = r_char_to_sym("right_y");
938
+ break;
939
+ case R2D_AXIS_TRIGGERLEFT:
940
+ axis = r_char_to_sym("trigger_left");
941
+ break;
942
+ case R2D_AXIS_TRIGGERRIGHT:
943
+ axis = r_char_to_sym("trigger_right");
944
+ break;
945
+ case R2D_AXIS_INVALID:
946
+ axis = r_char_to_sym("invalid");
947
+ break;
948
+ }
949
+ break;
950
+ case R2D_BUTTON_DOWN: case R2D_BUTTON_UP:
951
+ type = e.type == R2D_BUTTON_DOWN ? r_char_to_sym("button_down") : r_char_to_sym("button_up");
952
+ switch (e.button) {
953
+ case R2D_BUTTON_A:
954
+ button = r_char_to_sym("a");
955
+ break;
956
+ case R2D_BUTTON_B:
957
+ button = r_char_to_sym("b");
958
+ break;
959
+ case R2D_BUTTON_X:
960
+ button = r_char_to_sym("x");
961
+ break;
962
+ case R2D_BUTTON_Y:
963
+ button = r_char_to_sym("y");
964
+ break;
965
+ case R2D_BUTTON_BACK:
966
+ button = r_char_to_sym("back");
967
+ break;
968
+ case R2D_BUTTON_GUIDE:
969
+ button = r_char_to_sym("guide");
970
+ break;
971
+ case R2D_BUTTON_START:
972
+ button = r_char_to_sym("start");
973
+ break;
974
+ case R2D_BUTTON_LEFTSTICK:
975
+ button = r_char_to_sym("left_stick");
976
+ break;
977
+ case R2D_BUTTON_RIGHTSTICK:
978
+ button = r_char_to_sym("right_stick");
979
+ break;
980
+ case R2D_BUTTON_LEFTSHOULDER:
981
+ button = r_char_to_sym("left_shoulder");
982
+ break;
983
+ case R2D_BUTTON_RIGHTSHOULDER:
984
+ button = r_char_to_sym("right_shoulder");
985
+ break;
986
+ case R2D_BUTTON_DPAD_UP:
987
+ button = r_char_to_sym("up");
988
+ break;
989
+ case R2D_BUTTON_DPAD_DOWN:
990
+ button = r_char_to_sym("down");
991
+ break;
992
+ case R2D_BUTTON_DPAD_LEFT:
993
+ button = r_char_to_sym("left");
994
+ break;
995
+ case R2D_BUTTON_DPAD_RIGHT:
996
+ button = r_char_to_sym("right");
997
+ break;
998
+ case R2D_BUTTON_INVALID:
999
+ button = r_char_to_sym("invalid");
1000
+ break;
1001
+ }
1002
+ break;
1003
+ }
1004
+
1005
+ r_funcall(
1006
+ ruby2d_window, "controller_callback", 5, INT2NUM(e.which),
1007
+ type, axis, DBL2NUM(normalize_controller_axis(e.value)), button
1008
+ );
1009
+ }
1010
+
1011
+
1012
+ /*
1013
+ * Ruby 2D native `update` callback function
1014
+ */
1015
+ static void update() {
1016
+
1017
+ // Set the cursor
1018
+ r_iv_set(ruby2d_window, "@mouse_x", INT2NUM(window->mouse.x));
1019
+ r_iv_set(ruby2d_window, "@mouse_y", INT2NUM(window->mouse.y));
1020
+
1021
+ // Store frames
1022
+ r_iv_set(ruby2d_window, "@frames", DBL2NUM(window->frames));
1023
+
1024
+ // Store frame rate
1025
+ r_iv_set(ruby2d_window, "@fps", DBL2NUM(window->fps));
1026
+
1027
+ // Call update proc, `window.update`
1028
+ r_funcall(ruby2d_window, "update_callback", 0);
1029
+ }
1030
+
1031
+
1032
+ /*
1033
+ * Ruby 2D native `render` callback function
1034
+ */
1035
+ static void render() {
1036
+
1037
+ // Set background color
1038
+ R_VAL bc = r_iv_get(ruby2d_window, "@background");
1039
+ window->background.r = NUM2DBL(r_iv_get(bc, "@r"));
1040
+ window->background.g = NUM2DBL(r_iv_get(bc, "@g"));
1041
+ window->background.b = NUM2DBL(r_iv_get(bc, "@b"));
1042
+ window->background.a = NUM2DBL(r_iv_get(bc, "@a"));
1043
+
1044
+ // Read window objects
1045
+ R_VAL objects = r_iv_get(ruby2d_window, "@objects");
1046
+ int num_objects = NUM2INT(r_funcall(objects, "length", 0));
1047
+
1048
+ // Switch on each object type
1049
+ for (int i = 0; i < num_objects; ++i) {
1050
+ R_VAL el = r_ary_entry(objects, i);
1051
+ r_funcall(el, "render", 0); // call the object's `render` function
1052
+ }
1053
+
1054
+ // Call render proc, `window.render`
1055
+ r_funcall(ruby2d_window, "render_callback", 0);
1056
+ }
1057
+
1058
+
1059
+ /*
1060
+ * Ruby2D::Window#ext_diagnostics
1061
+ */
1062
+ #if MRUBY
1063
+ static R_VAL ruby2d_ext_diagnostics(mrb_state* mrb, R_VAL self) {
1064
+ mrb_value enable;
1065
+ mrb_get_args(mrb, "o", &enable);
1066
+ #else
1067
+ static R_VAL ruby2d_ext_diagnostics(R_VAL self, R_VAL enable) {
1068
+ #endif
1069
+ // Set Ruby 2D native diagnostics
1070
+ R2D_Diagnostics(r_test(enable));
1071
+ return R_TRUE;
1072
+ }
1073
+
1074
+
1075
+ /*
1076
+ * Ruby2D::Window#ext_get_display_dimensions
1077
+ */
1078
+ #if MRUBY
1079
+ static R_VAL ruby2d_window_ext_get_display_dimensions(mrb_state* mrb, R_VAL self) {
1080
+ #else
1081
+ static R_VAL ruby2d_window_ext_get_display_dimensions(R_VAL self) {
1082
+ #endif
1083
+ int w; int h;
1084
+ R2D_GetDisplayDimensions(&w, &h);
1085
+ r_iv_set(self, "@display_width" , INT2NUM(w));
1086
+ r_iv_set(self, "@display_height", INT2NUM(h));
1087
+ return R_NIL;
1088
+ }
1089
+
1090
+
1091
+ /*
1092
+ * Ruby2D::Window#ext_add_controller_mappings
1093
+ */
1094
+ #if MRUBY
1095
+ static R_VAL ruby2d_window_ext_add_controller_mappings(mrb_state* mrb, R_VAL self) {
1096
+ mrb_value path;
1097
+ mrb_get_args(mrb, "o", &path);
1098
+ #else
1099
+ static R_VAL ruby2d_window_ext_add_controller_mappings(R_VAL self, R_VAL path) {
1100
+ #endif
1101
+ R2D_Log(R2D_INFO, "Adding controller mappings from `%s`", RSTRING_PTR(path));
1102
+ R2D_AddControllerMappingsFromFile(RSTRING_PTR(path));
1103
+ return R_NIL;
1104
+ }
1105
+
1106
+
1107
+ /*
1108
+ * Ruby2D::Window#ext_show
1109
+ */
1110
+ #if MRUBY
1111
+ static R_VAL ruby2d_window_ext_show(mrb_state* mrb, R_VAL self) {
1112
+ #else
1113
+ static R_VAL ruby2d_window_ext_show(R_VAL self) {
1114
+ #endif
1115
+ ruby2d_window = self;
1116
+
1117
+ // Add controller mappings from file
1118
+ r_funcall(self, "add_controller_mappings", 0);
1119
+
1120
+ // Get window attributes
1121
+ char *title = RSTRING_PTR(r_iv_get(self, "@title"));
1122
+ int width = NUM2INT(r_iv_get(self, "@width"));
1123
+ int height = NUM2INT(r_iv_get(self, "@height"));
1124
+ int fps_cap = NUM2INT(r_iv_get(self, "@fps_cap"));
1125
+
1126
+ // Get the window icon
1127
+ char *icon = NULL;
1128
+ R_VAL iv_icon = r_iv_get(self, "@icon");
1129
+ if (r_test(iv_icon)) icon = RSTRING_PTR(iv_icon);
1130
+
1131
+ // Get window flags
1132
+ int flags = 0;
1133
+ if (r_test(r_iv_get(self, "@resizable"))) {
1134
+ flags = flags | R2D_RESIZABLE;
1135
+ }
1136
+ if (r_test(r_iv_get(self, "@borderless"))) {
1137
+ flags = flags | R2D_BORDERLESS;
1138
+ }
1139
+ if (r_test(r_iv_get(self, "@fullscreen"))) {
1140
+ flags = flags | R2D_FULLSCREEN;
1141
+ }
1142
+ if (r_test(r_iv_get(self, "@highdpi"))) {
1143
+ flags = flags | R2D_HIGHDPI;
1144
+ }
1145
+
1146
+ // Check viewport size and set
1147
+
1148
+ R_VAL vp_w = r_iv_get(self, "@viewport_width");
1149
+ int viewport_width = r_test(vp_w) ? NUM2INT(vp_w) : width;
1150
+
1151
+ R_VAL vp_h = r_iv_get(self, "@viewport_height");
1152
+ int viewport_height = r_test(vp_h) ? NUM2INT(vp_h) : height;
1153
+
1154
+ // Create and show window
1155
+
1156
+ window = R2D_CreateWindow(
1157
+ title, width, height, update, render, flags
1158
+ );
1159
+
1160
+ window->viewport.width = viewport_width;
1161
+ window->viewport.height = viewport_height;
1162
+ window->fps_cap = fps_cap;
1163
+ window->icon = icon;
1164
+ window->on_key = on_key;
1165
+ window->on_mouse = on_mouse;
1166
+ window->on_controller = on_controller;
1167
+
1168
+ R2D_Show(window);
1169
+
1170
+ atexit(free_window);
1171
+ return R_NIL;
1172
+ }
1173
+
1174
+ /*
1175
+ * Ruby2D::Window#ext_screenshot
1176
+ */
1177
+ #if MRUBY
1178
+ static R_VAL ruby2d_ext_screenshot(mrb_state* mrb, R_VAL self) {
1179
+ mrb_value path;
1180
+ mrb_get_args(mrb, "o", &path);
1181
+ #else
1182
+ static R_VAL ruby2d_ext_screenshot(R_VAL self, R_VAL path) {
1183
+ #endif
1184
+ if (window) {
1185
+ R2D_Screenshot(window, RSTRING_PTR(path));
1186
+ return path;
1187
+ } else {
1188
+ return R_FALSE;
1189
+ }
1190
+ }
1191
+
1192
+
1193
+ /*
1194
+ * Ruby2D::Window#ext_close
1195
+ */
1196
+ static R_VAL ruby2d_window_ext_close() {
1197
+ R2D_Close(window);
1198
+ return R_NIL;
1199
+ }
1200
+
1201
+
1202
+ #if MRUBY
1203
+ /*
1204
+ * MRuby entry point
1205
+ */
1206
+ int main() {
1207
+ // Open the MRuby environment
1208
+ mrb = mrb_open();
1209
+ if (!mrb) { /* handle error */ }
1210
+
1211
+ // Load the Ruby 2D library
1212
+ mrb_load_irep(mrb, ruby2d_lib);
1213
+
1214
+ #else
1215
+ /*
1216
+ * Ruby C extension init
1217
+ */
1218
+ void Init_ruby2d() {
1219
+ #endif
1220
+
1221
+ // Ruby2D
1222
+ R_CLASS ruby2d_module = r_define_module("Ruby2D");
1223
+
1224
+ // Ruby2D#self.ext_base_path
1225
+ r_define_class_method(ruby2d_module, "ext_base_path", ruby2d_ext_base_path, r_args_none);
1226
+
1227
+ // Ruby2D::Pixel
1228
+ R_CLASS ruby2d_pixel_class = r_define_class(ruby2d_module, "Pixel");
1229
+
1230
+ // Ruby2D::Pixel#self.ext_draw
1231
+ r_define_class_method(ruby2d_pixel_class, "ext_draw", ruby2d_pixel_ext_draw, r_args_req(1));
1232
+
1233
+ // Ruby2D::Triangle
1234
+ R_CLASS ruby2d_triangle_class = r_define_class(ruby2d_module, "Triangle");
1235
+
1236
+ // Ruby2D::Triangle#self.ext_draw
1237
+ r_define_class_method(ruby2d_triangle_class, "ext_draw", ruby2d_triangle_ext_draw, r_args_req(1));
1238
+
1239
+ // Ruby2D::Quad
1240
+ R_CLASS ruby2d_quad_class = r_define_class(ruby2d_module, "Quad");
1241
+
1242
+ // Ruby2D::Quad#self.ext_draw
1243
+ r_define_class_method(ruby2d_quad_class, "ext_draw", ruby2d_quad_ext_draw, r_args_req(1));
1244
+
1245
+ // Ruby2D::Line
1246
+ R_CLASS ruby2d_line_class = r_define_class(ruby2d_module, "Line");
1247
+
1248
+ // Ruby2D::Line#self.ext_draw
1249
+ r_define_class_method(ruby2d_line_class, "ext_draw", ruby2d_line_ext_draw, r_args_req(1));
1250
+
1251
+ // Ruby2D::Circle
1252
+ R_CLASS ruby2d_circle_class = r_define_class(ruby2d_module, "Circle");
1253
+
1254
+ // Ruby2D::Circle#self.ext_draw
1255
+ r_define_class_method(ruby2d_circle_class, "ext_draw", ruby2d_circle_ext_draw, r_args_req(1));
1256
+
1257
+ // Ruby2D::Image
1258
+ R_CLASS ruby2d_image_class = r_define_class(ruby2d_module, "Image");
1259
+
1260
+ // Ruby2D::Image#ext_load_image
1261
+ r_define_class_method(ruby2d_image_class, "ext_load_image", ruby2d_image_ext_load_image, r_args_req(1));
1262
+
1263
+ // Ruby2D::Text
1264
+ R_CLASS ruby2d_text_class = r_define_class(ruby2d_module, "Text");
1265
+
1266
+ // Ruby2D::Text#ext_load_text
1267
+ r_define_class_method(ruby2d_text_class, "ext_load_text", ruby2d_text_ext_load_text, r_args_req(2));
1268
+
1269
+ // Ruby2D::Sound
1270
+ R_CLASS ruby2d_sound_class = r_define_class(ruby2d_module, "Sound");
1271
+
1272
+ // Ruby2D::Sound#ext_init
1273
+ r_define_method(ruby2d_sound_class, "ext_init", ruby2d_sound_ext_init, r_args_req(1));
1274
+
1275
+ // Ruby2D::Sound#ext_play
1276
+ r_define_method(ruby2d_sound_class, "ext_play", ruby2d_sound_ext_play, r_args_none);
1277
+
1278
+ // Ruby2D::Sound#ext_get_volume
1279
+ r_define_method(ruby2d_sound_class, "ext_get_volume", ruby2d_sound_ext_get_volume, r_args_none);
1280
+
1281
+ // Ruby2D::Sound#ext_set_volume
1282
+ r_define_method(ruby2d_sound_class, "ext_set_volume", ruby2d_sound_ext_set_volume, r_args_req(1));
1283
+
1284
+ // Ruby2D::Sound#self.ext_get_mix_volume
1285
+ r_define_class_method(ruby2d_sound_class, "ext_get_mix_volume", ruby2d_sound_ext_get_mix_volume, r_args_none);
1286
+
1287
+ // Ruby2D::Sound#self.ext_set_mix_volume
1288
+ r_define_class_method(ruby2d_sound_class, "ext_set_mix_volume", ruby2d_sound_ext_set_mix_volume, r_args_req(1));
1289
+
1290
+ // Ruby2D::Sound#ext_length
1291
+ r_define_method(ruby2d_sound_class, "ext_length", ruby2d_sound_ext_length, r_args_none);
1292
+
1293
+ // Ruby2D::Music
1294
+ R_CLASS ruby2d_music_class = r_define_class(ruby2d_module, "Music");
1295
+
1296
+ // Ruby2D::Music#ext_init
1297
+ r_define_method(ruby2d_music_class, "ext_init", ruby2d_music_ext_init, r_args_req(1));
1298
+
1299
+ // Ruby2D::Music#ext_play
1300
+ r_define_method(ruby2d_music_class, "ext_play", ruby2d_music_ext_play, r_args_none);
1301
+
1302
+ // Ruby2D::Music#ext_pause
1303
+ r_define_method(ruby2d_music_class, "ext_pause", ruby2d_music_ext_pause, r_args_none);
1304
+
1305
+ // Ruby2D::Music#ext_resume
1306
+ r_define_method(ruby2d_music_class, "ext_resume", ruby2d_music_ext_resume, r_args_none);
1307
+
1308
+ // Ruby2D::Music#ext_stop
1309
+ r_define_method(ruby2d_music_class, "ext_stop", ruby2d_music_ext_stop, r_args_none);
1310
+
1311
+ // Ruby2D::Music#self.ext_get_volume
1312
+ r_define_class_method(ruby2d_music_class, "ext_get_volume", ruby2d_music_ext_get_volume, r_args_none);
1313
+
1314
+ // Ruby2D::Music#self.ext_set_volume
1315
+ r_define_class_method(ruby2d_music_class, "ext_set_volume", ruby2d_music_ext_set_volume, r_args_req(1));
1316
+
1317
+ // Ruby2D::Music#ext_fadeout
1318
+ r_define_method(ruby2d_music_class, "ext_fadeout", ruby2d_music_ext_fadeout, r_args_req(1));
1319
+
1320
+ // Ruby2D::Music#ext_length
1321
+ r_define_method(ruby2d_music_class, "ext_length", ruby2d_music_ext_length, r_args_none);
1322
+
1323
+ // Ruby2D::Font
1324
+ R_CLASS ruby2d_font_class = r_define_class(ruby2d_module, "Font");
1325
+
1326
+ // Ruby2D::Font#ext_load
1327
+ r_define_class_method(ruby2d_font_class, "ext_load", ruby2d_font_ext_load, r_args_req(3));
1328
+
1329
+ // Ruby2D::Texture
1330
+ R_CLASS ruby2d_texture_class = r_define_class(ruby2d_module, "Texture");
1331
+
1332
+ // Ruby2D::Texture#ext_draw
1333
+ r_define_method(ruby2d_texture_class, "ext_draw", ruby2d_texture_ext_draw, r_args_req(4));
1334
+
1335
+ // Ruby2D::Texture#ext_create
1336
+ r_define_method(ruby2d_texture_class, "ext_create", ruby2d_texture_ext_create, r_args_req(3));
1337
+
1338
+ // Ruby2D::Texture#ext_delete
1339
+ r_define_method(ruby2d_texture_class, "ext_delete", ruby2d_texture_ext_delete, r_args_req(1));
1340
+
1341
+ // Ruby2D::Window
1342
+ R_CLASS ruby2d_window_class = r_define_class(ruby2d_module, "Window");
1343
+
1344
+ // Ruby2D::Window#ext_diagnostics
1345
+ r_define_method(ruby2d_window_class, "ext_diagnostics", ruby2d_ext_diagnostics, r_args_req(1));
1346
+
1347
+ // Ruby2D::Window#ext_get_display_dimensions
1348
+ r_define_method(ruby2d_window_class, "ext_get_display_dimensions", ruby2d_window_ext_get_display_dimensions, r_args_none);
1349
+
1350
+ // Ruby2D::Window#ext_add_controller_mappings
1351
+ r_define_method(ruby2d_window_class, "ext_add_controller_mappings", ruby2d_window_ext_add_controller_mappings, r_args_req(1));
1352
+
1353
+ // Ruby2D::Window#ext_show
1354
+ r_define_method(ruby2d_window_class, "ext_show", ruby2d_window_ext_show, r_args_none);
1355
+
1356
+ // Ruby2D::Window#ext_screenshot
1357
+ r_define_method(ruby2d_window_class, "ext_screenshot", ruby2d_ext_screenshot, r_args_req(1));
1358
+
1359
+ // Ruby2D::Window#ext_close
1360
+ r_define_method(ruby2d_window_class, "ext_close", ruby2d_window_ext_close, r_args_none);
1361
+
1362
+ #if MRUBY
1363
+ // Load the Ruby 2D app
1364
+ mrb_load_irep(mrb, ruby2d_app);
1365
+
1366
+ // If an exception, print error
1367
+ if (mrb->exc) mrb_print_error(mrb);
1368
+
1369
+ // Close the MRuby environment
1370
+ mrb_close(mrb);
1371
+
1372
+ return 0;
1373
+ #endif
1374
+ }