ruby2d 0.11.2 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/assets/include/GLES2/gl2.h +656 -0
  3. data/assets/include/GLES2/gl2ext.h +3949 -0
  4. data/assets/include/GLES2/gl2ext_angle.h +701 -0
  5. data/assets/include/GLES2/gl2platform.h +27 -0
  6. data/assets/include/GLES3/gl3.h +1192 -0
  7. data/assets/include/GLES3/gl31.h +1507 -0
  8. data/assets/include/GLES3/gl32.h +1808 -0
  9. data/assets/include/GLES3/gl3platform.h +27 -0
  10. data/assets/include/KHR/khrplatform.h +290 -0
  11. data/assets/include/SDL2/SDL.h +1 -0
  12. data/assets/include/SDL2/SDL_assert.h +4 -2
  13. data/assets/include/SDL2/SDL_atomic.h +20 -0
  14. data/assets/include/SDL2/SDL_audio.h +40 -4
  15. data/assets/include/SDL2/SDL_blendmode.h +4 -6
  16. data/assets/include/SDL2/SDL_clipboard.h +47 -0
  17. data/assets/include/SDL2/SDL_config.h +6 -2
  18. data/assets/include/SDL2/SDL_config_android.h +2 -0
  19. data/assets/include/SDL2/SDL_config_emscripten.h +2 -0
  20. data/assets/include/SDL2/SDL_config_iphoneos.h +3 -1
  21. data/assets/include/SDL2/SDL_config_macosx.h +3 -6
  22. data/assets/include/SDL2/SDL_config_minimal.h +18 -11
  23. data/assets/include/SDL2/SDL_config_ngage.h +89 -0
  24. data/assets/include/SDL2/SDL_config_os2.h +5 -3
  25. data/assets/include/SDL2/SDL_config_pandora.h +1 -0
  26. data/assets/include/SDL2/SDL_config_windows.h +71 -45
  27. data/assets/include/SDL2/SDL_config_wingdk.h +253 -0
  28. data/assets/include/SDL2/SDL_config_winrt.h +11 -49
  29. data/assets/include/SDL2/SDL_config_xbox.h +235 -0
  30. data/assets/include/SDL2/SDL_cpuinfo.h +39 -4
  31. data/assets/include/SDL2/SDL_egl.h +59 -9
  32. data/assets/include/SDL2/SDL_endian.h +34 -3
  33. data/assets/include/SDL2/SDL_events.h +32 -1
  34. data/assets/include/SDL2/SDL_filesystem.h +5 -1
  35. data/assets/include/SDL2/SDL_gamecontroller.h +78 -5
  36. data/assets/include/SDL2/SDL_guid.h +100 -0
  37. data/assets/include/SDL2/SDL_hints.h +645 -43
  38. data/assets/include/SDL2/SDL_image.h +2045 -33
  39. data/assets/include/SDL2/SDL_joystick.h +127 -7
  40. data/assets/include/SDL2/SDL_keyboard.h +38 -1
  41. data/assets/include/SDL2/SDL_keycode.h +6 -1
  42. data/assets/include/SDL2/SDL_log.h +2 -2
  43. data/assets/include/SDL2/SDL_main.h +42 -2
  44. data/assets/include/SDL2/SDL_metal.h +2 -1
  45. data/assets/include/SDL2/SDL_mixer.h +2529 -396
  46. data/assets/include/SDL2/SDL_mouse.h +12 -1
  47. data/assets/include/SDL2/SDL_opengl.h +0 -51
  48. data/assets/include/SDL2/SDL_opengl_glext.h +2260 -231
  49. data/assets/include/SDL2/SDL_opengles2_gl2.h +374 -339
  50. data/assets/include/SDL2/SDL_opengles2_gl2ext.h +3479 -1496
  51. data/assets/include/SDL2/SDL_opengles2_gl2platform.h +6 -9
  52. data/assets/include/SDL2/SDL_opengles2_khrplatform.h +43 -14
  53. data/assets/include/SDL2/SDL_platform.h +32 -6
  54. data/assets/include/SDL2/SDL_rect.h +154 -2
  55. data/assets/include/SDL2/SDL_render.h +46 -17
  56. data/assets/include/SDL2/SDL_revision.h +4 -0
  57. data/assets/include/SDL2/SDL_rwops.h +1 -15
  58. data/assets/include/SDL2/SDL_scancode.h +46 -21
  59. data/assets/include/SDL2/SDL_sensor.h +24 -3
  60. data/assets/include/SDL2/SDL_stdinc.h +119 -8
  61. data/assets/include/SDL2/SDL_surface.h +3 -1
  62. data/assets/include/SDL2/SDL_system.h +66 -6
  63. data/assets/include/SDL2/SDL_syswm.h +2 -0
  64. data/assets/include/SDL2/SDL_test_common.h +1 -0
  65. data/assets/include/SDL2/SDL_test_font.h +90 -3
  66. data/assets/include/SDL2/SDL_thread.h +3 -3
  67. data/assets/include/SDL2/SDL_touch.h +8 -0
  68. data/assets/include/SDL2/SDL_ttf.h +2084 -155
  69. data/assets/include/SDL2/SDL_version.h +19 -3
  70. data/assets/include/SDL2/SDL_video.h +71 -9
  71. data/assets/include/SDL2/begin_code.h +4 -4
  72. data/assets/include/mrbconf.h +15 -17
  73. data/assets/include/mruby/array.h +8 -21
  74. data/assets/include/mruby/boxing_nan.h +115 -86
  75. data/assets/include/mruby/boxing_word.h +104 -78
  76. data/assets/include/mruby/common.h +6 -0
  77. data/assets/include/mruby/compile.h +3 -4
  78. data/assets/include/mruby/debug.h +4 -2
  79. data/assets/include/mruby/dump.h +5 -2
  80. data/assets/include/mruby/error.h +12 -2
  81. data/assets/include/mruby/gc.h +2 -0
  82. data/assets/include/mruby/hash.h +1 -3
  83. data/assets/include/mruby/irep.h +4 -4
  84. data/assets/include/mruby/numeric.h +21 -13
  85. data/assets/include/mruby/opcode.h +30 -0
  86. data/assets/include/mruby/ops.h +99 -101
  87. data/assets/include/mruby/presym/scanning.h +15 -9
  88. data/assets/include/mruby/proc.h +4 -2
  89. data/assets/include/mruby/string.h +3 -24
  90. data/assets/include/mruby/value.h +80 -40
  91. data/assets/include/mruby/variable.h +0 -15
  92. data/assets/include/mruby/version.h +5 -5
  93. data/assets/include/mruby.h +86 -16
  94. data/assets/macos/universal/bin/mrbc +0 -0
  95. data/assets/macos/universal/lib/libFLAC.a +0 -0
  96. data/assets/macos/universal/lib/libSDL2.a +0 -0
  97. data/assets/macos/universal/lib/libSDL2_image.a +0 -0
  98. data/assets/macos/universal/lib/libSDL2_mixer.a +0 -0
  99. data/assets/macos/universal/lib/libSDL2_ttf.a +0 -0
  100. data/assets/macos/universal/lib/libavif.a +0 -0
  101. data/assets/macos/universal/lib/libbrotlicommon-static.a +0 -0
  102. data/assets/macos/universal/lib/libbrotlidec-static.a +0 -0
  103. data/assets/macos/universal/lib/libfreetype.a +0 -0
  104. data/assets/macos/universal/lib/libgraphite2.a +0 -0
  105. data/assets/macos/universal/lib/libharfbuzz.a +0 -0
  106. data/assets/macos/universal/lib/libhwy.a +0 -0
  107. data/assets/macos/universal/lib/libjpeg.a +0 -0
  108. data/assets/macos/universal/lib/libjxl.a +0 -0
  109. data/assets/macos/universal/lib/libmodplug.a +0 -0
  110. data/assets/macos/universal/lib/libmpg123.a +0 -0
  111. data/assets/macos/universal/lib/libmruby.a +0 -0
  112. data/assets/macos/universal/lib/libogg.a +0 -0
  113. data/assets/macos/universal/lib/libpng.a +0 -0
  114. data/assets/macos/universal/lib/libtiff.a +0 -0
  115. data/assets/macos/universal/lib/libvorbis.a +0 -0
  116. data/assets/macos/universal/lib/libvorbisfile.a +0 -0
  117. data/assets/macos/universal/lib/libwebp.a +0 -0
  118. data/assets/macos/universal/lib/libzstd.a +0 -0
  119. data/assets/wasm/libmruby.a +0 -0
  120. data/assets/wasm/template.html +52 -4
  121. data/assets/windows/mingw-w64-ucrt-x86_64/bin/mrbc.exe +0 -0
  122. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libFLAC.a +0 -0
  123. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libLerc.a +0 -0
  124. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2.a +0 -0
  125. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_image.a +0 -0
  126. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_mixer.a +0 -0
  127. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libSDL2_ttf.a +0 -0
  128. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlicommon.a +0 -0
  129. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbrotlidec.a +0 -0
  130. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libbz2.a +0 -0
  131. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libdeflate.a +0 -0
  132. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libfreetype.a +0 -0
  133. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libglew32.a +0 -0
  134. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libgraphite2.a +0 -0
  135. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libharfbuzz.a +0 -0
  136. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libhwy.a +0 -0
  137. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjbig.a +0 -0
  138. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjpeg.a +0 -0
  139. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libjxl.a +0 -0
  140. data/assets/windows/mingw-w64-ucrt-x86_64/lib/liblzma.a +0 -0
  141. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmodplug.a +0 -0
  142. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmpg123.a +0 -0
  143. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libmruby.a +0 -0
  144. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libogg.a +0 -0
  145. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopus.a +0 -0
  146. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libopusfile.a +0 -0
  147. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libpng.a +0 -0
  148. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libsndfile.a +0 -0
  149. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libssp.a +1 -0
  150. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libstdc++.a +0 -0
  151. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libtiff.a +0 -0
  152. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbis.a +0 -0
  153. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libvorbisfile.a +0 -0
  154. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libwebp.a +0 -0
  155. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libz.a +0 -0
  156. data/assets/windows/mingw-w64-ucrt-x86_64/lib/libzstd.a +0 -0
  157. data/assets/windows/mingw-w64-x86_64/bin/mrbc.exe +0 -0
  158. data/assets/windows/mingw-w64-x86_64/lib/libFLAC.a +0 -0
  159. data/assets/windows/mingw-w64-x86_64/lib/libLerc.a +0 -0
  160. data/assets/windows/mingw-w64-x86_64/lib/libSDL2.a +0 -0
  161. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_image.a +0 -0
  162. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_mixer.a +0 -0
  163. data/assets/windows/mingw-w64-x86_64/lib/libSDL2_ttf.a +0 -0
  164. data/assets/windows/mingw-w64-x86_64/lib/libbrotlicommon.a +0 -0
  165. data/assets/windows/mingw-w64-x86_64/lib/libbrotlidec.a +0 -0
  166. data/assets/windows/mingw-w64-x86_64/lib/libdeflate.a +0 -0
  167. data/assets/windows/mingw-w64-x86_64/lib/libfreetype.a +0 -0
  168. data/assets/windows/mingw-w64-x86_64/lib/libglew32.a +0 -0
  169. data/assets/windows/mingw-w64-x86_64/lib/libharfbuzz.a +0 -0
  170. data/assets/windows/mingw-w64-x86_64/lib/libhwy.a +0 -0
  171. data/assets/windows/mingw-w64-x86_64/lib/libjpeg.a +0 -0
  172. data/assets/windows/mingw-w64-x86_64/lib/libjxl.a +0 -0
  173. data/assets/windows/mingw-w64-x86_64/lib/liblzma.a +0 -0
  174. data/assets/windows/mingw-w64-x86_64/lib/libmpg123.a +0 -0
  175. data/assets/windows/mingw-w64-x86_64/lib/libmruby.a +0 -0
  176. data/assets/windows/mingw-w64-x86_64/lib/libopus.a +0 -0
  177. data/assets/windows/mingw-w64-x86_64/lib/libpng.a +0 -0
  178. data/assets/windows/mingw-w64-x86_64/lib/libsndfile.a +0 -0
  179. data/assets/windows/mingw-w64-x86_64/lib/libssp.a +0 -0
  180. data/assets/windows/mingw-w64-x86_64/lib/libstdc++.a +0 -0
  181. data/assets/windows/mingw-w64-x86_64/lib/libtiff.a +0 -0
  182. data/assets/windows/mingw-w64-x86_64/lib/libwebp.a +0 -0
  183. data/assets/windows/mingw-w64-x86_64/lib/libz.a +0 -0
  184. data/assets/windows/mingw-w64-x86_64/lib/libzstd.a +0 -0
  185. data/ext/ruby2d/canvas.c +540 -0
  186. data/ext/ruby2d/extconf.rb +39 -21
  187. data/ext/ruby2d/gl.c +3 -3
  188. data/ext/ruby2d/image.c +7 -7
  189. data/ext/ruby2d/ruby2d.c +741 -24
  190. data/ext/ruby2d/ruby2d.h +66 -3
  191. data/ext/ruby2d/sound.c +16 -2
  192. data/lib/ruby2d/canvas.rb +315 -0
  193. data/lib/ruby2d/circle.rb +30 -15
  194. data/lib/ruby2d/cli/build.rb +11 -4
  195. data/lib/ruby2d/cli/enable_console.rb +3 -1
  196. data/lib/ruby2d/color.rb +133 -77
  197. data/lib/ruby2d/core.rb +32 -0
  198. data/lib/ruby2d/dsl.rb +38 -32
  199. data/lib/ruby2d/exceptions.rb +2 -1
  200. data/lib/ruby2d/font.rb +97 -62
  201. data/lib/ruby2d/image.rb +48 -27
  202. data/lib/ruby2d/line.rb +84 -45
  203. data/lib/ruby2d/music.rb +33 -23
  204. data/lib/ruby2d/pixel.rb +10 -9
  205. data/lib/ruby2d/pixmap.rb +39 -0
  206. data/lib/ruby2d/pixmap_atlas.rb +56 -0
  207. data/lib/ruby2d/quad.rb +98 -49
  208. data/lib/ruby2d/rectangle.rb +35 -36
  209. data/lib/ruby2d/renderable.rb +7 -6
  210. data/lib/ruby2d/sound.rb +23 -17
  211. data/lib/ruby2d/sprite.rb +181 -140
  212. data/lib/ruby2d/square.rb +21 -20
  213. data/lib/ruby2d/text.rb +47 -19
  214. data/lib/ruby2d/texture.rb +13 -3
  215. data/lib/ruby2d/tileset.rb +97 -44
  216. data/lib/ruby2d/triangle.rb +91 -42
  217. data/lib/ruby2d/version.rb +3 -1
  218. data/lib/ruby2d/vertices.rb +81 -45
  219. data/lib/ruby2d/window.rb +508 -371
  220. data/lib/ruby2d.rb +11 -29
  221. metadata +84 -16
  222. data/assets/include/SDL2/SDL_config_psp.h +0 -165
  223. data/assets/include/SDL2/SDL_config_wiz.h +0 -154
  224. data/assets/include/glew.h +0 -23686
  225. data/assets/macos/universal/lib/libpng16.a +0 -0
  226. data/assets/wasm/build_config.rb +0 -13
  227. data/assets/windows/glew/README.md +0 -10
  228. data/assets/windows/glew/glew.h +0 -23686
  229. data/assets/windows/glew/libglew32.a +0 -0
  230. data/assets/windows/mingw-w64-x86_64/lib/libpng16.a +0 -0
  231. data/lib/ruby2d/entity.rb +0 -17
data/ext/ruby2d/ruby2d.h CHANGED
@@ -129,7 +129,7 @@ extern "C" {
129
129
  #define GL_GLEXT_PROTOTYPES 1
130
130
  #if WINDOWS
131
131
  #define GLEW_STATIC
132
- #include <glew.h>
132
+ #include <GL/glew.h>
133
133
  #endif
134
134
  #include <SDL2/SDL_opengl.h>
135
135
  #endif
@@ -321,6 +321,7 @@ typedef struct {
321
321
  typedef struct {
322
322
  const char *path;
323
323
  Mix_Chunk *data;
324
+ int channel;
324
325
  } R2D_Sound;
325
326
 
326
327
  // R2D_Music
@@ -471,7 +472,12 @@ R2D_Sound *R2D_CreateSound(const char *path);
471
472
  /*
472
473
  * Play the sound
473
474
  */
474
- void R2D_PlaySound(R2D_Sound *snd);
475
+ void R2D_PlaySound(R2D_Sound *snd, bool loop);
476
+
477
+ /*
478
+ * Stop the sound
479
+ */
480
+ void R2D_StopSound(R2D_Sound *snd);
475
481
 
476
482
  /*
477
483
  * Get the sound's length
@@ -503,6 +509,63 @@ void R2D_SetSoundMixVolume(int volume);
503
509
  */
504
510
  void R2D_FreeSound(R2D_Sound *snd);
505
511
 
512
+ // Canvas //////////////////////////////////////////////////////////////////////
513
+
514
+ /*
515
+ * Draw a thick rectangle on a canvas using a pre-converted RGBA colour value.
516
+ * @param [int] thickness must be > 1, else does nothing
517
+ */
518
+ void R2D_Canvas_DrawThickRect(SDL_Renderer *render, int x, int y, int width,
519
+ int height, int thickness, int r, int g, int b,
520
+ int a);
521
+
522
+ /*
523
+ * Draw a thick line on a canvas using a pre-converted RGBA colour value.
524
+ * @param [int] thickness must be > 1, else does nothing
525
+ */
526
+ void R2D_Canvas_DrawThickLine(SDL_Renderer *render,
527
+ int x1, int y1, int x2, int y2, int thickness,
528
+ int r, int g, int b, int a);
529
+
530
+ /*
531
+ * Draw a thin (single pixel) ellipse on a canvas using a pre-converted RGBA
532
+ * colour value.
533
+ */
534
+ void R2D_Canvas_DrawThinEllipse(SDL_Renderer *render, int x, int y,
535
+ float xradius, float yradius, float sectors,
536
+ int r, int g, int b, int a);
537
+
538
+ /*
539
+ * Draw a thick ellipse on a canvas using a pre-converted RGBA colour value.
540
+ * @param [int] thickness must be > 1, else does nothing
541
+ */
542
+ void R2D_Canvas_DrawThickEllipse(SDL_Renderer *render, int x, int y,
543
+ float xradius, float yradius, float sectors,
544
+ int thickness, int r, int g, int b, int a);
545
+
546
+ /*
547
+ * Draw a thick N-point polyline, with a mitre join where two
548
+ * segments are joined.
549
+ * @param [int] thickness must be > 1, else does nothing
550
+ * @param [bool] skip_first_last use false for polyline, true for polygon when specifying first, second points again at the end
551
+ */
552
+ void R2D_Canvas_DrawThickPolyline(SDL_Renderer *render, SDL_FPoint *points,
553
+ int num_points, int thickness, int r, int g,
554
+ int b, int a, bool skip_first_last);
555
+
556
+ /*
557
+ * Fill a polygon with a single colour.
558
+ * @param points Array of points
559
+ * @param num_points Number of points
560
+ * @param colors Array of colours
561
+ * @param num_colors Number of colors, must be at least 1, and may be less than
562
+ * +num_points+ in which case the colours will be repeated
563
+ * via modulo.
564
+ * @note Currently supports only: convex polygons or simple polygons with one concave corner. For now.
565
+ */
566
+ void R2D_Canvas_FillPolygon(SDL_Renderer *render, SDL_FPoint *points,
567
+ int num_points, SDL_Color *colors, int num_colors);
568
+
506
569
  // Music ///////////////////////////////////////////////////////////////////////
507
570
 
508
571
  /*
@@ -639,7 +702,7 @@ int R2D_GL_CheckLinked(GLuint program, const char *name);
639
702
  void R2D_GL_GetViewportScale(R2D_Window *window, int *w, int *h, double *scale);
640
703
  void R2D_GL_SetViewport(R2D_Window *window);
641
704
  void R2D_GL_CreateTexture(
642
- GLuint *id, GLint format,
705
+ GLuint *id, GLint internalFormat, GLint format, GLenum type,
643
706
  int w, int h,
644
707
  const GLvoid *data, GLint filter);
645
708
  void R2D_GL_DrawTriangle(
data/ext/ruby2d/sound.c CHANGED
@@ -40,9 +40,23 @@ R2D_Sound *R2D_CreateSound(const char *path) {
40
40
  /*
41
41
  * Play the sound
42
42
  */
43
- void R2D_PlaySound(R2D_Sound *snd) {
43
+ void R2D_PlaySound(R2D_Sound *snd, bool loop) {
44
44
  if (!snd) return;
45
- Mix_PlayChannel(-1, snd->data, 0);
45
+
46
+ // If looping, set to -1 times; else 0
47
+ int times = loop ? -1 : 0;
48
+
49
+ // times: 0 == once, -1 == forever
50
+ snd->channel = Mix_PlayChannel(-1, snd->data, times);
51
+ }
52
+
53
+ /*
54
+ * Stop the sound
55
+ */
56
+ void R2D_StopSound(R2D_Sound *snd) {
57
+ if (!snd) return;
58
+
59
+ Mix_HaltChannel(snd->channel);
46
60
  }
47
61
 
48
62
 
@@ -0,0 +1,315 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ruby2D::Canvas
4
+
5
+ module Ruby2D
6
+ #
7
+ # Canvas provides a surface into which you can draw using primitives and render the contents
8
+ # as if it were an image/texture.
9
+ #
10
+ # @example A basic Canvas positioned at (0, 0)
11
+ # Canvas.new width: 320, height: 240
12
+ # @example A Canvas that doesn't update texture on every draw method
13
+ # Canvas.new width: 320, height: 240, update: false
14
+ #
15
+ class Canvas
16
+ include Renderable
17
+
18
+ # Create a Canvas.
19
+ #
20
+ # @param [Numeric] width The +width+ of the canvas in pixels
21
+ # @param [Numeric] height The +height+ of the canvas in pixels
22
+ # @param [Numeric] x
23
+ # @param [Numeric] y
24
+ # @param [Numeric] z
25
+ # @param [Numeric] rotate Angle, default is 0
26
+ # @param [String] fill Colour to clear the canvas, respects transparency
27
+ # @param [String] color or +colour+ Tint the texture when rendering
28
+ # @param [Numeric] opacity Opacity of the texture when rendering
29
+ # @param [true, false] update If +true+ updates the texture for every draw/fill call
30
+ # @param [true, false] show If +true+ the canvas is added to +Window+ automatically.
31
+ def initialize(width:, height:, x: 0, y: 0, z: 0, rotate: 0,
32
+ fill: [0, 0, 0, 0], color: nil, colour: nil, opacity: nil,
33
+ update: true, show: true)
34
+ @x = x
35
+ @y = y
36
+ @z = z
37
+ @width = width
38
+ @height = height
39
+ @rotate = rotate
40
+ @fill = Color.new(fill)
41
+ self.color = color || colour || 'white'
42
+ color.opacity = opacity if opacity
43
+ @update = update
44
+
45
+ ext_create([@width, @height, @fill.r, @fill.g, @fill.b, @fill.a]) # sets @ext_pixel_data
46
+ @texture = Texture.new(@ext_pixel_data, @width, @height)
47
+ add if show
48
+ end
49
+
50
+ # Clear the entire canvas, replacing every pixel with fill colour without blending.
51
+ # @param [Color] fill_color
52
+ def clear(fill_color = @fill)
53
+ color = fill_color || @fill
54
+ ext_clear([color.r, color.g, color.b, color.a])
55
+ update_texture if @update
56
+ end
57
+
58
+ # Draw a filled triangle with a single colour or per-vertex colour blending.
59
+ # @param [Numeric] x1
60
+ # @param [Numeric] y1
61
+ # @param [Numeric] x2
62
+ # @param [Numeric] y2
63
+ # @param [Numeric] x3
64
+ # @param [Numeric] y3
65
+ # @param [Color, Color::Set] color (or +colour+) Set one or per-vertex colour
66
+ def fill_triangle(x1:, y1:, x2:, y2:, x3:, y3:, color: nil, colour: nil)
67
+ fill_polygon coordinates: [x1, y1, x2, y2, x3, y3], color: color || colour
68
+ end
69
+
70
+ # Draw a filled quad(rilateral) with a single colour or per-vertex colour blending.
71
+ # @param [Numeric] x1
72
+ # @param [Numeric] y1
73
+ # @param [Numeric] x2
74
+ # @param [Numeric] y2
75
+ # @param [Numeric] x3
76
+ # @param [Numeric] y3
77
+ # @param [Numeric] x4
78
+ # @param [Numeric] y4
79
+ # @param [Color, Color::Set] color (or +colour+) Set one or per-vertex colour
80
+ def fill_quad(x1:, y1:, x2:, y2:, x3:, y3:, x4:, y4:, color: nil, colour: nil)
81
+ fill_polygon coordinates: [x1, y1, x2, y2, x3, y3, x4, y4], color: color || colour
82
+ end
83
+
84
+ # Draw a circle.
85
+ # @param [Numeric] x Centre
86
+ # @param [Numeric] y Centre
87
+ # @param [Numeric] radius
88
+ # @param [Numeric] sectors The number of segments to subdivide the circumference.
89
+ # @param [Numeric] stroke_width The thickness of the circle in pixels
90
+ # @param [Color] color (or +colour+) The fill colour
91
+ def draw_circle(x:, y:, radius:, sectors: 30, stroke_width: 1, color: nil, colour: nil)
92
+ clr = color || colour
93
+ clr = Color.new(clr) unless clr.is_a? Color
94
+ ext_draw_ellipse([
95
+ x, y, radius, radius, sectors, stroke_width,
96
+ clr.r, clr.g, clr.b, clr.a
97
+ ])
98
+ update_texture if @update
99
+ end
100
+
101
+ # Draw an ellipse
102
+ # @param [Numeric] x Centre
103
+ # @param [Numeric] y Centre
104
+ # @param [Numeric] xradius
105
+ # @param [Numeric] yradius
106
+ # @param [Numeric] sectors The number of segments to subdivide the circumference.
107
+ # @param [Numeric] stroke_width The thickness of the circle in pixels
108
+ # @param [Color] color (or +colour+) The fill colour
109
+ def draw_ellipse(x:, y:, xradius:, yradius:, sectors: 30, stroke_width: 1, color: nil, colour: nil)
110
+ clr = color || colour
111
+ clr = Color.new(clr) unless clr.is_a? Color
112
+ ext_draw_ellipse([
113
+ x, y, xradius, yradius, sectors, stroke_width,
114
+ clr.r, clr.g, clr.b, clr.a
115
+ ])
116
+ update_texture if @update
117
+ end
118
+
119
+ # Draw a filled circle.
120
+ # @param [Numeric] x Centre
121
+ # @param [Numeric] y Centre
122
+ # @param [Numeric] radius
123
+ # @param [Numeric] sectors The number of segments to subdivide the circumference.
124
+ # @param [Color] color (or +colour+) The fill colour
125
+ def fill_circle(x:, y:, radius:, sectors: 30, color: nil, colour: nil)
126
+ clr = color || colour
127
+ clr = Color.new(clr) unless clr.is_a? Color
128
+ ext_fill_ellipse([
129
+ x, y, radius, radius, sectors,
130
+ clr.r, clr.g, clr.b, clr.a
131
+ ])
132
+ update_texture if @update
133
+ end
134
+
135
+ # Draw a filled ellipse.
136
+ # @param [Numeric] x Centre
137
+ # @param [Numeric] y Centre
138
+ # @param [Numeric] xradius
139
+ # @param [Numeric] yradius
140
+ # @param [Numeric] sectors The number of segments to subdivide the circumference.
141
+ # @param [Color] color (or +colour+) The fill colour
142
+ def fill_ellipse(x:, y:, xradius:, yradius:, sectors: 30, color: nil, colour: nil)
143
+ clr = color || colour
144
+ clr = Color.new(clr) unless clr.is_a? Color
145
+ ext_fill_ellipse([
146
+ x, y, xradius, yradius, sectors,
147
+ clr.r, clr.g, clr.b, clr.a
148
+ ])
149
+ update_texture if @update
150
+ end
151
+
152
+ # Draw a filled rectangle.
153
+ # @param [Numeric] x
154
+ # @param [Numeric] y
155
+ # @param [Numeric] width
156
+ # @param [Numeric] height
157
+ # @param [Color] color (or +colour+) The fill colour
158
+ def fill_rectangle(x:, y:, width:, height:, color: nil, colour: nil)
159
+ clr = color || colour
160
+ clr = Color.new(clr) unless clr.is_a? Color
161
+ ext_fill_rectangle([
162
+ x, y, width, height,
163
+ clr.r, clr.g, clr.b, clr.a
164
+ ])
165
+ update_texture if @update
166
+ end
167
+
168
+ # Draw an outline of a triangle.
169
+ # @param [Numeric] x1
170
+ # @param [Numeric] y1
171
+ # @param [Numeric] x2
172
+ # @param [Numeric] y2
173
+ # @param [Numeric] x3
174
+ # @param [Numeric] y3
175
+ # @param [Numeric] stroke_width The thickness of the rectangle in pixels
176
+ # @param [Color] color (or +colour+) The line colour
177
+ def draw_triangle(x1:, y1:, x2:, y2:, x3:, y3:, stroke_width: 1, color: nil, colour: nil)
178
+ draw_polyline closed: true,
179
+ coordinates: [x1, y1, x2, y2, x3, y3],
180
+ color: color, colour: colour, stroke_width: stroke_width
181
+ end
182
+
183
+ # Draw an outline of a quad.
184
+ # @param [Numeric] x1
185
+ # @param [Numeric] y1
186
+ # @param [Numeric] x2
187
+ # @param [Numeric] y2
188
+ # @param [Numeric] x3
189
+ # @param [Numeric] y3
190
+ # @param [Numeric] x4
191
+ # @param [Numeric] y4
192
+ # @param [Numeric] stroke_width The thickness of the rectangle in pixels
193
+ # @param [Color] color (or +colour+) The line colour
194
+ def draw_quad(x1:, y1:, x2:, y2:, x3:, y3:, x4:, y4:, stroke_width: 1, color: nil, colour: nil)
195
+ draw_polyline closed: true,
196
+ coordinates: [x1, y1, x2, y2, x3, y3, x4, y4],
197
+ color: color, colour: colour, stroke_width: stroke_width
198
+ end
199
+
200
+ # Draw an outline of a rectangle
201
+ # @param [Numeric] x
202
+ # @param [Numeric] y
203
+ # @param [Numeric] width
204
+ # @param [Numeric] height
205
+ # @param [Numeric] stroke_width The thickness of the rectangle in pixels
206
+ # @param [Color] color (or +colour+) The line colour
207
+ def draw_rectangle(x:, y:, width:, height:, stroke_width: 1, color: nil, colour: nil)
208
+ clr = color || colour
209
+ clr = Color.new(clr) unless clr.is_a? Color
210
+ ext_draw_rectangle([
211
+ x, y, width, height, stroke_width,
212
+ clr.r, clr.g, clr.b, clr.a
213
+ ])
214
+ update_texture if @update
215
+ end
216
+
217
+ # Draw a straight line between two points
218
+ # @param [Numeric] x1
219
+ # @param [Numeric] y1
220
+ # @param [Numeric] x2
221
+ # @param [Numeric] y2
222
+ # @param [Numeric] stroke_width The line's thickness in pixels; defaults to 1.
223
+ # @param [Color] color (or +colour+) The line colour
224
+ def draw_line(x1:, y1:, x2:, y2:, stroke_width: 1, color: nil, colour: nil)
225
+ clr = color || colour
226
+ clr = Color.new(clr) unless clr.is_a? Color
227
+ ext_draw_line([
228
+ x1, y1, x2, y2, stroke_width,
229
+ clr.r, clr.g, clr.b, clr.a
230
+ ])
231
+ update_texture if @update
232
+ end
233
+
234
+ # Draw a poly-line between N points.
235
+ # @param [Array] coordinates An array of numbers x1, y1, x2, y2 ... with at least three coordinates (6 values)
236
+ # @param [Numeric] stroke_width The line's thickness in pixels; defaults to 1.
237
+ # @param [Color] color (or +colour+) The line colour
238
+ # @param [Boolean] closed Use +true+ to draw this as a closed shape
239
+ def draw_polyline(coordinates:, stroke_width: 1, color: nil, colour: nil, closed: false)
240
+ return if coordinates.nil? || coordinates.count < 6
241
+
242
+ clr = color || colour
243
+ clr = Color.new(clr) unless clr.is_a? Color
244
+ config = [stroke_width, clr.r, clr.g, clr.b, clr.a]
245
+ if closed
246
+ ext_draw_polygon(config, coordinates)
247
+ else
248
+ ext_draw_polyline(config, coordinates)
249
+ end
250
+ update_texture if @update
251
+ end
252
+
253
+ # Fill a polygon made up of N points.
254
+ # @note Currently only supports convex polygons or simple polygons with one concave corner.
255
+ # @note Supports per-vertex coloring, but the triangulation may change and affect the coloring.
256
+ # @param [Array] coordinates An array of numbers x1, y1, x2, y2 ... with at least three coordinates (6 values)
257
+ # @param [Color, Color::Set] color (or +colour+) Set one or per-vertex colour; at least one colour must be specified.
258
+ def fill_polygon(coordinates:, color: nil, colour: nil)
259
+ return if coordinates.nil? || coordinates.count < 6 || (color.nil? && colour.nil?)
260
+
261
+ colors = colors_to_a(color || colour)
262
+ ext_fill_polygon(coordinates, colors)
263
+ update_texture if @update
264
+ end
265
+
266
+ # Draw the pixmap at the specified location and size
267
+ #
268
+ # @note This API will evolve to be able to draw a portion of the pixmap; coming soon.
269
+ # @param [Pixmap] pixmap
270
+ # @param [Numeric] x
271
+ # @param [Numeric] y
272
+ # @param [Numeric] width Optional, specify to scale the size
273
+ # @param [Numeric] height Optional, specify to scale the size
274
+ # @param [Hash] crop Optional, specify a hash with `x:, y:, width:, height:` to crop from within the pixmap to draw.
275
+ def draw_pixmap(pixmap, x:, y:, width: nil, height: nil, crop: nil)
276
+ src_rect = crop ? [crop[:x], crop[:y], crop[:width], crop[:height]] : nil
277
+ ext_draw_pixmap pixmap, src_rect, x, y, width, height
278
+ end
279
+
280
+ def update
281
+ update_texture
282
+ end
283
+
284
+ private
285
+
286
+ # Converts +color_or_set+ as a sequence of colour components; e.g. +[ r1, g1, b1, a1, ...]+
287
+ # @param [Color, Color::Set] color_or_set
288
+ # @return an array of r, g, b, a values
289
+ def colors_to_a(color_or_set)
290
+ if color_or_set.is_a? Color::Set
291
+ color_a = []
292
+ color_or_set.each do |clr|
293
+ color_a << clr.r << clr.g << clr.b << clr.a
294
+ end
295
+ return color_a
296
+ end
297
+
298
+ color_or_set = Color.new(color_or_set) unless color_or_set.is_a? Color
299
+ color_or_set.to_a
300
+ end
301
+
302
+ def update_texture
303
+ @texture.delete
304
+ @texture = Texture.new(@ext_pixel_data, @width, @height)
305
+ end
306
+
307
+ def render(x: @x, y: @y, width: @width, height: @height, color: @color, rotate: @rotate)
308
+ vertices = Vertices.new(x, y, width, height, rotate)
309
+
310
+ @texture.draw(
311
+ vertices.coordinates, vertices.texture_coordinates, color
312
+ )
313
+ end
314
+ end
315
+ end
data/lib/ruby2d/circle.rb CHANGED
@@ -1,22 +1,38 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Ruby2D::Circle
2
4
 
3
5
  module Ruby2D
6
+ #
7
+ # Create a circle using +Circle.new+
8
+ #
4
9
  class Circle
5
10
  include Renderable
6
11
 
7
12
  attr_accessor :x, :y, :radius, :sectors
8
13
 
9
- def initialize(opts = {})
10
- @x = opts[:x] || 25
11
- @y = opts[:y] || 25
12
- @z = opts[:z] || 0
13
- @radius = opts[:radius] || 50
14
- @sectors = opts[:sectors] || 30
15
- self.color = opts[:color] || 'white'
16
- self.color.opacity = opts[:opacity] if opts[:opacity]
14
+ # Create a circle
15
+ #
16
+ # @param [Numeric] x
17
+ # @param [Numeric] y
18
+ # @param [Numeric] z
19
+ # @param [Numeric] radius
20
+ # @param [Numeric] sectors Smoothness of the circle is better when more +sectors+ are used.
21
+ # @param [String | Color] color Or +colour+
22
+ # @param [Float] opacity
23
+ def initialize(x: 25, y: 25, z: 0, radius: 50, sectors: 30,
24
+ color: nil, colour: nil, opacity: nil)
25
+ @x = x
26
+ @y = y
27
+ @z = z
28
+ @radius = radius
29
+ @sectors = sectors
30
+ self.color = color || colour || 'white'
31
+ self.color.opacity = opacity unless opacity.nil?
17
32
  add
18
33
  end
19
34
 
35
+ # Check if the circle contains the point at +(x, y)+
20
36
  def contains?(x, y)
21
37
  Math.sqrt((x - @x)**2 + (y - @y)**2) <= @radius
22
38
  end
@@ -25,19 +41,18 @@ module Ruby2D
25
41
  Window.render_ready_check
26
42
 
27
43
  ext_draw([
28
- opts[:x], opts[:y], opts[:radius], opts[:sectors],
29
- opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
30
- ])
44
+ opts[:x], opts[:y], opts[:radius], opts[:sectors],
45
+ opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
46
+ ])
31
47
  end
32
48
 
33
49
  private
34
50
 
35
51
  def render
36
52
  self.class.ext_draw([
37
- @x, @y, @radius, @sectors,
38
- @color.r, @color.g, @color.b, @color.a
39
- ])
53
+ @x, @y, @radius, @sectors,
54
+ @color.r, @color.g, @color.b, @color.a
55
+ ])
40
56
  end
41
-
42
57
  end
43
58
  end
@@ -14,7 +14,6 @@ require 'ruby2d/cli/platform'
14
14
  'color',
15
15
  'window',
16
16
  'dsl',
17
- 'entity',
18
17
  'quad',
19
18
  'line',
20
19
  'circle',
@@ -22,11 +21,14 @@ require 'ruby2d/cli/platform'
22
21
  'square',
23
22
  'triangle',
24
23
  'pixel',
24
+ 'pixmap',
25
+ 'pixmap_atlas',
25
26
  'image',
26
27
  'sprite',
27
28
  'tileset',
28
29
  'font',
29
30
  'text',
31
+ 'canvas',
30
32
  'sound',
31
33
  'music',
32
34
  'texture',
@@ -161,7 +163,7 @@ def compile_native
161
163
 
162
164
  ld_flags = ''
163
165
  ['mruby', 'SDL2', 'SDL2_image', 'SDL2_mixer', 'SDL2_ttf',
164
- 'jpeg', 'png16', 'tiff', 'webp',
166
+ 'jpeg', 'jxl', 'avif', 'png', 'tiff', 'webp',
165
167
  'mpg123', 'ogg', 'FLAC', 'vorbis', 'vorbisfile', 'modplug',
166
168
  'freetype', 'harfbuzz', 'graphite2'].each do |name|
167
169
  add_ld_flags(ld_flags, name, :archive, ld_dir)
@@ -178,12 +180,17 @@ def compile_native
178
180
  # ld_flags = '-lSDL2 -lSDL2_image -lSDL2_mixer -lSDL2_ttf -lm -lGL'
179
181
 
180
182
  when :windows
181
- ld_dir = "#{Ruby2D.assets}/windows/mingw-w64-x86_64/lib"
183
+
184
+ if RUBY_PLATFORM =~ /ucrt/
185
+ ld_dir = "#{Ruby2D.assets}/windows/mingw-w64-ucrt-x86_64/lib"
186
+ else
187
+ ld_dir = "#{Ruby2D.assets}/windows/mingw-w64-x86_64/lib"
188
+ end
182
189
 
183
190
  ld_flags = '-static -Wl,--start-group '
184
191
  ['mruby',
185
192
  'SDL2',
186
- 'SDL2_image', 'jpeg', 'png16', 'tiff', 'webp', 'jbig', 'deflate', 'lzma', 'zstd', 'Lerc',
193
+ 'SDL2_image', 'jpeg', 'png', 'tiff', 'webp', 'jxl', 'hwy', 'jbig', 'deflate', 'lzma', 'zstd', 'Lerc',
187
194
  'SDL2_mixer', 'mpg123', 'FLAC', 'vorbis', 'vorbisfile', 'ogg', 'modplug', 'opus', 'opusfile', 'sndfile',
188
195
  'SDL2_ttf', 'freetype', 'harfbuzz', 'graphite2', 'bz2', 'brotlicommon', 'brotlidec',
189
196
  'glew32', 'stdc++', 'z', 'ssp'
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Enable the interactive console
2
4
 
3
5
  require 'io/wait'
4
6
 
5
- $ruby2d_console_mode = true
7
+ ENV['RUBY2D_ENABLE_CONSOLE'] = 'true'