ray 0.1.0.pre1 → 0.1.0

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 (370) hide show
  1. data/README.md +235 -32
  2. data/Rakefile +20 -49
  3. data/ext/audio.c +68 -0
  4. data/ext/audio_source.c +197 -0
  5. data/ext/buffer_renderer.c +130 -0
  6. data/ext/color.c +179 -0
  7. data/ext/drawable.c +446 -0
  8. data/ext/event.c +337 -0
  9. data/ext/extconf.rb +80 -6
  10. data/ext/font.c +97 -0
  11. data/ext/gl.c +114 -0
  12. data/ext/gl_buffer.c +224 -0
  13. data/ext/gl_index_buffer.c +202 -0
  14. data/ext/gl_int_array.c +139 -0
  15. data/ext/gl_vertex.c +157 -0
  16. data/ext/image.c +263 -0
  17. data/ext/image_target.c +84 -0
  18. data/ext/input.c +53 -0
  19. data/ext/matrix.c +374 -0
  20. data/ext/music.c +113 -0
  21. data/ext/polygon.c +426 -0
  22. data/ext/ray.c +59 -0
  23. data/ext/ray.h +168 -0
  24. data/ext/rect.c +255 -0
  25. data/ext/say.h +31 -0
  26. data/ext/say_all.h +77 -0
  27. data/ext/say_arial.h +14689 -0
  28. data/ext/say_array.c +124 -0
  29. data/ext/say_array.h +34 -0
  30. data/ext/say_audio.c +64 -0
  31. data/ext/say_audio.h +170 -0
  32. data/ext/say_audio_context.c +40 -0
  33. data/ext/say_audio_source.c +96 -0
  34. data/ext/say_basic_type.c +17 -0
  35. data/ext/say_basic_type.h +47 -0
  36. data/ext/say_buffer.c +277 -0
  37. data/ext/say_buffer.h +37 -0
  38. data/ext/say_buffer_renderer.c +121 -0
  39. data/ext/say_buffer_renderer.h +33 -0
  40. data/ext/say_buffer_slice.c +247 -0
  41. data/ext/say_buffer_slice.h +29 -0
  42. data/ext/say_clean_up.c +14 -0
  43. data/ext/say_context.c +163 -0
  44. data/ext/say_context.h +26 -0
  45. data/ext/say_drawable.c +350 -0
  46. data/ext/say_drawable.h +100 -0
  47. data/ext/say_error.c +27 -0
  48. data/ext/say_event.h +213 -0
  49. data/ext/say_font.c +335 -0
  50. data/ext/say_font.h +51 -0
  51. data/ext/say_image.c +283 -0
  52. data/ext/say_image.h +52 -0
  53. data/ext/say_image_target.c +134 -0
  54. data/ext/say_image_target.h +25 -0
  55. data/ext/say_imp.h +70 -0
  56. data/ext/say_index_buffer.c +90 -0
  57. data/ext/say_index_buffer.h +29 -0
  58. data/ext/say_index_buffer_slice.c +227 -0
  59. data/ext/say_index_buffer_slice.h +28 -0
  60. data/ext/say_input.c +35 -0
  61. data/ext/say_matrix.c +314 -0
  62. data/ext/say_matrix.h +55 -0
  63. data/ext/say_music.c +225 -0
  64. data/ext/say_osx.h +62 -0
  65. data/ext/say_osx_context.h +98 -0
  66. data/ext/say_osx_window.h +766 -0
  67. data/ext/say_polygon.c +358 -0
  68. data/ext/say_polygon.h +62 -0
  69. data/ext/say_renderer.c +42 -0
  70. data/ext/say_renderer.h +22 -0
  71. data/ext/say_shader.c +375 -0
  72. data/ext/say_shader.h +91 -0
  73. data/ext/say_sound.c +67 -0
  74. data/ext/say_sound_buffer.c +96 -0
  75. data/ext/say_sprite.c +273 -0
  76. data/ext/say_sprite.h +53 -0
  77. data/ext/say_string.c +9 -0
  78. data/ext/say_table.c +86 -0
  79. data/ext/say_table.h +24 -0
  80. data/ext/say_target.c +264 -0
  81. data/ext/say_target.h +67 -0
  82. data/ext/say_text.c +441 -0
  83. data/ext/say_text.h +56 -0
  84. data/ext/say_thread.c +46 -0
  85. data/ext/say_thread.h +39 -0
  86. data/ext/say_thread_variable.c +44 -0
  87. data/ext/say_utf.c +62 -0
  88. data/ext/say_vertex_type.c +113 -0
  89. data/ext/say_vertex_type.h +40 -0
  90. data/ext/say_vfile.c +57 -0
  91. data/ext/say_view.c +150 -0
  92. data/ext/say_view.h +44 -0
  93. data/ext/say_win.h +24 -0
  94. data/ext/say_win_context.h +91 -0
  95. data/ext/say_win_window.h +670 -0
  96. data/ext/say_window.c +155 -0
  97. data/ext/say_window.h +43 -0
  98. data/ext/say_x11.h +41 -0
  99. data/ext/say_x11_context.h +96 -0
  100. data/ext/say_x11_window.h +818 -0
  101. data/ext/shader.c +302 -0
  102. data/ext/sound.c +118 -0
  103. data/ext/sound_buffer.c +75 -0
  104. data/ext/sprite.c +241 -0
  105. data/ext/stb_image.h +4971 -0
  106. data/ext/stb_image_write.h +511 -0
  107. data/ext/target.c +184 -0
  108. data/ext/text.c +162 -0
  109. data/ext/utils.c +10 -0
  110. data/ext/vector.c +261 -0
  111. data/ext/vendor/freetype/bin/freetype6.dll +0 -0
  112. data/ext/vendor/freetype/bin/zlib1.dll +0 -0
  113. data/ext/vendor/freetype/include/freetype2/freetype/config/ftconfig.h +350 -0
  114. data/ext/vendor/freetype/include/freetype2/freetype/config/ftheader.h +729 -0
  115. data/ext/vendor/freetype/include/freetype2/freetype/config/ftmodule.h +22 -0
  116. data/ext/vendor/freetype/include/freetype2/freetype/config/ftoption.h +695 -0
  117. data/ext/vendor/freetype/include/freetype2/freetype/config/ftstdlib.h +180 -0
  118. data/ext/vendor/freetype/include/freetype2/freetype/freetype.h +3434 -0
  119. data/ext/vendor/freetype/include/freetype2/freetype/ftbbox.h +94 -0
  120. data/ext/vendor/freetype/include/freetype2/freetype/ftbdf.h +200 -0
  121. data/ext/vendor/freetype/include/freetype2/freetype/ftbitmap.h +206 -0
  122. data/ext/vendor/freetype/include/freetype2/freetype/ftcache.h +1110 -0
  123. data/ext/vendor/freetype/include/freetype2/freetype/ftchapters.h +100 -0
  124. data/ext/vendor/freetype/include/freetype2/freetype/fterrdef.h +239 -0
  125. data/ext/vendor/freetype/include/freetype2/freetype/fterrors.h +206 -0
  126. data/ext/vendor/freetype/include/freetype2/freetype/ftgasp.h +113 -0
  127. data/ext/vendor/freetype/include/freetype2/freetype/ftglyph.h +575 -0
  128. data/ext/vendor/freetype/include/freetype2/freetype/ftgxval.h +358 -0
  129. data/ext/vendor/freetype/include/freetype2/freetype/ftgzip.h +102 -0
  130. data/ext/vendor/freetype/include/freetype2/freetype/ftimage.h +1237 -0
  131. data/ext/vendor/freetype/include/freetype2/freetype/ftincrem.h +331 -0
  132. data/ext/vendor/freetype/include/freetype2/freetype/ftlcdfil.h +166 -0
  133. data/ext/vendor/freetype/include/freetype2/freetype/ftlist.h +273 -0
  134. data/ext/vendor/freetype/include/freetype2/freetype/ftlzw.h +99 -0
  135. data/ext/vendor/freetype/include/freetype2/freetype/ftmac.h +272 -0
  136. data/ext/vendor/freetype/include/freetype2/freetype/ftmm.h +378 -0
  137. data/ext/vendor/freetype/include/freetype2/freetype/ftmodapi.h +406 -0
  138. data/ext/vendor/freetype/include/freetype2/freetype/ftmoderr.h +155 -0
  139. data/ext/vendor/freetype/include/freetype2/freetype/ftotval.h +198 -0
  140. data/ext/vendor/freetype/include/freetype2/freetype/ftoutln.h +526 -0
  141. data/ext/vendor/freetype/include/freetype2/freetype/ftpfr.h +172 -0
  142. data/ext/vendor/freetype/include/freetype2/freetype/ftrender.h +229 -0
  143. data/ext/vendor/freetype/include/freetype2/freetype/ftsizes.h +159 -0
  144. data/ext/vendor/freetype/include/freetype2/freetype/ftsnames.h +170 -0
  145. data/ext/vendor/freetype/include/freetype2/freetype/ftstroke.h +716 -0
  146. data/ext/vendor/freetype/include/freetype2/freetype/ftsynth.h +73 -0
  147. data/ext/vendor/freetype/include/freetype2/freetype/ftsystem.h +346 -0
  148. data/ext/vendor/freetype/include/freetype2/freetype/fttrigon.h +350 -0
  149. data/ext/vendor/freetype/include/freetype2/freetype/fttypes.h +583 -0
  150. data/ext/vendor/freetype/include/freetype2/freetype/ftwinfnt.h +263 -0
  151. data/ext/vendor/freetype/include/freetype2/freetype/ftxf86.h +80 -0
  152. data/ext/vendor/freetype/include/freetype2/freetype/t1tables.h +450 -0
  153. data/ext/vendor/freetype/include/freetype2/freetype/ttnameid.h +1132 -0
  154. data/ext/vendor/freetype/include/freetype2/freetype/tttables.h +756 -0
  155. data/ext/vendor/freetype/include/freetype2/freetype/tttags.h +99 -0
  156. data/ext/vendor/freetype/include/freetype2/freetype/ttunpat.h +59 -0
  157. data/ext/vendor/freetype/include/ft2build.h +61 -0
  158. data/ext/vendor/freetype/lib/freetype-bcc.lib +0 -0
  159. data/ext/vendor/freetype/lib/freetype6.def +249 -0
  160. data/ext/vendor/freetype/lib/libfreetype.dll.a +0 -0
  161. data/ext/vendor/freetype/lib/tmp.freetype.lib +0 -0
  162. data/ext/vendor/glew/LICENSE.txt +73 -0
  163. data/ext/vendor/glew/README.txt +18 -0
  164. data/ext/vendor/glew/include/GL/glew.h +15507 -0
  165. data/ext/vendor/glew/include/GL/glxew.h +1568 -0
  166. data/ext/vendor/glew/include/GL/wglew.h +1361 -0
  167. data/ext/vendor/glew/lib/glew32.dll +0 -0
  168. data/ext/vendor/glew/lib/glew32mx.dll +0 -0
  169. data/ext/vendor/glew/lib/libglew32.a +0 -0
  170. data/ext/vendor/glew/lib/libglew32.dll.a +0 -0
  171. data/ext/vendor/glew/lib/libglew32mx.a +0 -0
  172. data/ext/vendor/glew/lib/libglew32mx.dll.a +0 -0
  173. data/ext/vendor/openal/COPYING +484 -0
  174. data/ext/vendor/openal/Win32/soft_oal.dll +0 -0
  175. data/ext/vendor/openal/include/AL/al.h +724 -0
  176. data/ext/vendor/openal/include/AL/alc.h +277 -0
  177. data/ext/vendor/openal/include/AL/alext.h +165 -0
  178. data/ext/vendor/openal/include/AL/efx-creative.h +3 -0
  179. data/ext/vendor/openal/include/AL/efx.h +758 -0
  180. data/ext/vendor/openal/lib/libOpenAL32.dll.a +0 -0
  181. data/ext/vendor/sndfile/bin/libsndfile-1.dll +0 -0
  182. data/ext/vendor/sndfile/include/sndfile.h +666 -0
  183. data/ext/vendor/sndfile/include/sndfile.hh +422 -0
  184. data/ext/vendor/sndfile/lib/libsndfile-1.def +41 -0
  185. data/ext/vendor/sndfile/lib/libsndfile-1.lib +0 -0
  186. data/ext/vertex.c +96 -0
  187. data/ext/view.c +131 -0
  188. data/ext/window.c +183 -0
  189. data/lib/ray/animation.rb +248 -0
  190. data/lib/ray/animation/block_animation.rb +36 -0
  191. data/lib/ray/animation/circular_motion.rb +57 -0
  192. data/lib/ray/animation/color_variation.rb +102 -0
  193. data/lib/ray/animation/combination.rb +71 -0
  194. data/lib/ray/animation/float_variation.rb +76 -0
  195. data/lib/ray/animation/sequence.rb +65 -0
  196. data/lib/ray/animation/sprite_animation.rb +68 -0
  197. data/lib/ray/animation/vector_variation.rb +111 -0
  198. data/lib/ray/animation_list.rb +50 -0
  199. data/lib/ray/audio.rb +4 -7
  200. data/lib/ray/buffer_renderer.rb +9 -0
  201. data/lib/ray/color.rb +41 -6
  202. data/lib/ray/drawable.rb +34 -9
  203. data/lib/ray/dsl.rb +6 -0
  204. data/lib/ray/dsl/event.rb +1 -1
  205. data/lib/ray/dsl/event_listener.rb +14 -10
  206. data/lib/ray/dsl/event_raiser.rb +5 -2
  207. data/lib/ray/dsl/event_runner.rb +4 -10
  208. data/lib/ray/dsl/event_translator.rb +67 -99
  209. data/lib/ray/dsl/handler.rb +1 -1
  210. data/lib/ray/dsl/matcher.rb +40 -27
  211. data/lib/ray/event.rb +22 -0
  212. data/lib/ray/font.rb +0 -42
  213. data/lib/ray/font_set.rb +3 -7
  214. data/lib/ray/game.rb +33 -73
  215. data/lib/ray/gl/int_array.rb +24 -0
  216. data/lib/ray/gl/vertex.rb +106 -0
  217. data/lib/ray/helper.rb +25 -11
  218. data/lib/ray/image.rb +9 -154
  219. data/lib/ray/image_set.rb +3 -8
  220. data/lib/ray/image_target.rb +12 -0
  221. data/lib/ray/matrix.rb +90 -0
  222. data/lib/ray/music.rb +12 -0
  223. data/lib/ray/polygon.rb +77 -0
  224. data/lib/ray/ray.rb +45 -13
  225. data/lib/ray/rect.rb +14 -3
  226. data/lib/ray/resource_set.rb +18 -35
  227. data/lib/ray/scene.rb +43 -81
  228. data/lib/ray/scene_list.rb +12 -5
  229. data/lib/ray/shader.rb +82 -0
  230. data/lib/ray/sound.rb +18 -0
  231. data/lib/ray/sound_buffer.rb +6 -0
  232. data/lib/ray/sound_buffer_set.rb +32 -0
  233. data/lib/ray/sprite.rb +111 -97
  234. data/lib/ray/target.rb +18 -0
  235. data/lib/ray/text.rb +80 -58
  236. data/lib/ray/text_helper.rb +21 -27
  237. data/lib/ray/turtle.rb +49 -38
  238. data/lib/ray/vector.rb +76 -1
  239. data/lib/ray/vertex.rb +24 -0
  240. data/lib/ray/view.rb +47 -0
  241. data/lib/ray/window.rb +23 -0
  242. data/samples/_media/Beep.wav +0 -0
  243. data/samples/_media/CptnRuby Gem.png +0 -0
  244. data/samples/_media/CptnRuby Map.txt +25 -0
  245. data/samples/_media/CptnRuby Tileset.png +0 -0
  246. data/samples/_media/CptnRuby.png +0 -0
  247. data/samples/_media/Space.png +0 -0
  248. data/samples/_media/Star.png +0 -0
  249. data/samples/_media/Starfighter.png +0 -0
  250. data/samples/animation/chain.rb +33 -0
  251. data/samples/animation/circle.rb +38 -0
  252. data/samples/animation/color.rb +18 -0
  253. data/samples/animation/rotation.rb +17 -0
  254. data/samples/animation/sequence.rb +33 -0
  255. data/samples/animation/shader.rb +65 -0
  256. data/samples/animation/sprite_motion.rb +103 -0
  257. data/samples/animation/translation.rb +23 -0
  258. data/samples/audio/spacial.rb +25 -11
  259. data/samples/buffer/buffer.rb +28 -0
  260. data/samples/buffer/index_buffer.rb +36 -0
  261. data/samples/buffer/renderer.rb +27 -0
  262. data/samples/cptn_ruby/cptn_ruby.rb +279 -0
  263. data/samples/hello_world/hello.rb +2 -2
  264. data/samples/hello_world/hello_dsl.rb +3 -3
  265. data/samples/hello_world/text.rb +2 -2
  266. data/samples/opengl/cube.rb +124 -0
  267. data/samples/opengl/image.rb +36 -16
  268. data/samples/opengl/obj_loader.rb +99 -0
  269. data/samples/opengl/opengl.rb +24 -18
  270. data/samples/opengl/shader.rb +36 -26
  271. data/samples/pong/pong.rb +41 -39
  272. data/samples/{run_scene.rb → scenes/run_scene.rb} +21 -7
  273. data/samples/shaders/geometry.rb +98 -0
  274. data/samples/shaders/scene.rb +19 -12
  275. data/samples/shaders/shaders.rb +34 -17
  276. data/samples/shaders/shape.rb +12 -7
  277. data/samples/sokoban/level_1 +11 -7
  278. data/samples/sokoban/sokoban.rb +36 -63
  279. data/samples/starfighter/starfighter.rb +159 -0
  280. data/samples/test/actual_scene.rb +3 -3
  281. data/samples/test/scene_riot.rb +4 -4
  282. data/samples/test/scene_spec.rb +3 -3
  283. data/samples/test/scene_test_unit.rb +1 -1
  284. data/samples/turtle/byzantium.rb +10 -5
  285. data/samples/turtle/hilbert.rb +16 -11
  286. data/samples/turtle/koch.rb +16 -11
  287. data/samples/turtle/mandala.rb +43 -38
  288. data/samples/turtle/tree.rb +13 -8
  289. data/samples/view/resize.rb +26 -0
  290. data/samples/view/view.rb +35 -0
  291. data/samples/window/all_events.rb +44 -0
  292. data/samples/window/change_title.rb +16 -0
  293. data/samples/window/fullscreen.rb +18 -0
  294. data/samples/window/get_pixel.rb +29 -0
  295. data/samples/window/icon.rb +88 -0
  296. data/samples/window/input.rb +27 -0
  297. data/samples/window/no_border.rb +16 -0
  298. data/samples/window/resize.rb +24 -0
  299. data/test/animation/color_variation_test.rb +64 -0
  300. data/test/animation/combination_test.rb +35 -0
  301. data/test/animation/float_variation_test.rb +75 -0
  302. data/test/animation/vector_variation_test.rb +123 -0
  303. data/test/animation_list_test.rb +122 -0
  304. data/test/animation_test.rb +83 -0
  305. data/test/audio_test.rb +88 -33
  306. data/test/buffer_renderer_test.rb +38 -0
  307. data/test/color_test.rb +31 -22
  308. data/test/drawable_test.rb +207 -7
  309. data/test/dsl_test.rb +25 -7
  310. data/test/font_test.rb +6 -40
  311. data/test/game_test.rb +76 -0
  312. data/test/gl_buffer_test.rb +26 -0
  313. data/test/gl_index_buffer_test.rb +17 -0
  314. data/test/gl_vertex_test.rb +117 -0
  315. data/test/helpers.rb +45 -5
  316. data/test/image_target_test.rb +19 -0
  317. data/test/image_test.rb +73 -53
  318. data/test/int_array_test.rb +64 -0
  319. data/test/matrix_test.rb +134 -0
  320. data/test/polygon_test.rb +126 -0
  321. data/test/rect_test.rb +6 -8
  322. data/test/res/frag.c +14 -0
  323. data/test/res/frag3d.c +10 -0
  324. data/test/res/frag_gray.c +17 -0
  325. data/test/res/frag_light3d.c +20 -0
  326. data/test/res/light3d.c +20 -0
  327. data/test/res/sprite.png +0 -0
  328. data/test/res/teapot.obj +12831 -0
  329. data/test/res/vert.c +17 -0
  330. data/test/res/vertex3d.c +14 -0
  331. data/test/resource_set_test.rb +8 -45
  332. data/test/run_all.rb +1 -1
  333. data/test/scene_list_test.rb +79 -0
  334. data/test/scene_test.rb +168 -0
  335. data/test/shader_test.rb +58 -0
  336. data/test/sprite_test.rb +46 -41
  337. data/test/target_test.rb +34 -0
  338. data/test/text_test.rb +20 -31
  339. data/test/turtle_test.rb +35 -20
  340. data/test/vector_test.rb +61 -19
  341. data/test/vertex_test.rb +43 -0
  342. data/test/view_test.rb +61 -0
  343. metadata +347 -126
  344. data/.yardopts +0 -4
  345. data/VERSION +0 -1
  346. data/ext/audio.cpp +0 -723
  347. data/ext/color.cpp +0 -159
  348. data/ext/drawable.cpp +0 -91
  349. data/ext/event.cpp +0 -460
  350. data/ext/font.cpp +0 -190
  351. data/ext/image.cpp +0 -733
  352. data/ext/input.cpp +0 -74
  353. data/ext/ray.cpp +0 -168
  354. data/ext/ray.hpp +0 -356
  355. data/ext/rect.cpp +0 -245
  356. data/ext/shader.cpp +0 -169
  357. data/ext/shape.cpp +0 -409
  358. data/ext/sprite.cpp +0 -306
  359. data/ext/text.cpp +0 -181
  360. data/ext/vector.cpp +0 -215
  361. data/guide.md +0 -619
  362. data/lib/ray/input.rb +0 -10
  363. data/lib/ray/music_set.rb +0 -37
  364. data/lib/ray/rmagick.rb +0 -41
  365. data/lib/ray/shape.rb +0 -132
  366. data/lib/ray/sound_set.rb +0 -37
  367. data/samples/opengl/binding.rb +0 -38
  368. data/test/ray_test.rb +0 -25
  369. data/test/shape_test.rb +0 -101
  370. data/yard_ext.rb +0 -63
data/README.md CHANGED
@@ -1,58 +1,261 @@
1
- # Hello world!
2
- ## Subclassing Ray::Game or Ray::Scene
1
+ What is Ray?
2
+ ============
3
+
4
+ Ray is a library than can create windows, play music, and draw 2D graphics (or
5
+ not too complex 3D by doing just a bit more work, thanks to OpenGL). It is meant
6
+ to be easy and fun to use (à la Shoes), and still flexible and powerful.
7
+
8
+ Tutorial & Installation
9
+ =======================
10
+
11
+ See [on this page](http://mon-ouie.github.com/projects/ray.html).
12
+
13
+ Features
14
+ ========
15
+
16
+ Fun DSL
17
+ -------
18
+
3
19
  require 'ray'
4
20
 
5
- class HelloScene < Ray::Scene
6
- scene_name :hello
21
+ Ray.game "Hello" do
22
+ register { add_hook :quit, method(:exit!) }
23
+
24
+ scene :hello do
25
+ @text = text "Hello world!", :size => 30, :angle => 30, :at => [50, 50]
26
+ render { |win| win.draw @text }
27
+ end
28
+
29
+ scenes << :hello
30
+ end
31
+
32
+ Flexible for more complex games
33
+ -------------------------------
34
+
35
+ require 'ray'
36
+
37
+ class TitleScene < Ray::Scene
38
+ scene_name :title
7
39
 
8
40
  def setup
9
- @font = font("VeraMono.ttf")
41
+ # setup resources
42
+ end
43
+
44
+ def register
45
+ # register for events
10
46
  end
11
47
 
12
48
  def render(win)
13
- @font.draw("Hello world!", :on => win, :at => [0, 0], :size => 12)
49
+ # draw!
14
50
  end
51
+
52
+ def clean_up
53
+ # perform cleanup
54
+ end
55
+ end
56
+
57
+ class GameScene < Ray::Scene
58
+ scene_name :game
59
+
60
+ # same stuff
15
61
  end
16
62
 
17
- class HelloWorld < Ray::Game
63
+ # ...
64
+
65
+ class Game < Ray::Game
18
66
  def initialize
19
- super("Hello world!")
67
+ super "Awesome Game"
20
68
 
21
- HelloScene.bind(self)
22
- push_scene :hello
69
+ TitleScene.bind(self)
70
+ GameScene.bind(self)
71
+ # ...
72
+
73
+ scenes << :title
23
74
  end
75
+ end
24
76
 
25
- def register
26
- add_hook :quit, method(:exit!)
77
+ Drawable API
78
+ ------------
79
+
80
+ Ray has a drawable class that specifies a common interface to all the drawable
81
+ objects – how to perform transformations to them and how to draw them.
82
+
83
+
84
+ obj = AnyDrawable.new
85
+
86
+ window.draw obj
87
+
88
+ obj.pos = [0, 2] # set position
89
+ obj.angle = 40 # rotation
90
+ obj.origin = [20, 20] # just sets the origin of transformations
91
+ # ...
92
+
93
+ # You can even have a completely custom transformation matrix:
94
+ obj.matrix = Ray::Matrix.translation [2, 3, 4]
95
+
96
+ Off-screen rendering
97
+ --------------------
98
+
99
+ When rendering to a window is not enough, you can render on an image just fine:
100
+
101
+ Ray::ImageTarget.new some_image do |target|
102
+ target.clear Ray::Color.red
103
+ target.draw Ray::Polygon.circle([50, 50], 10, Ray::Color.green)
104
+ target.update
105
+ end
106
+
107
+ OpenGL integration
108
+ ------------------
109
+
110
+ Ray uses OpenGL, and provides some classes and methods to allow using it from
111
+ Ray. In fact, ``Ray::Drawable`` can simply be used for OpenGL rendering:
112
+
113
+ # Ray has a more advanced sprite class, of course!
114
+ class CustomSprite < Ray::Drawable
115
+ def initialize(image)
116
+ super() # very important: creating the actual drawable
117
+
118
+ # Ray allocates a VBO to store your vertices.
119
+ # You could just use your own OpenGL binding to call glBegin and glEnd
120
+ # if you don't want to use it.
121
+ self.vertex_count = 4
122
+
123
+ # Tells Ray to enable texturing for this drawable
124
+ self.textured = true
125
+
126
+ @image = image
127
+ end
128
+
129
+ # return an array of vertices
130
+ def fill_vertices
131
+ [
132
+ Ray::Vertex.new([0, 0], Ray::Color.white, [0, 0]),
133
+ Ray::Vertex.new([@img.w, 0], Ray::Color.white, [1, 0]),
134
+ Ray::Vertex.new([@img.w, @img.h], Ray::Color.white, [1, 1]),
135
+ Ray::Vertex.new([0, @img.h], Ray::Color.white, [0, 1]),
136
+ ]
137
+ end
138
+
139
+ # The index parameter is there in case you'd want to use
140
+ # draw_elements. You can fill indices by defining a fill_indices method
141
+ # and setting index_count.
142
+ def render(first, index)
143
+ @image.bind
144
+
145
+ # Some low level OpenGL calls are available
146
+ Ray::GL.draw_arrays :triangle_fan, first, 4
27
147
  end
28
148
  end
29
149
 
30
- HelloWorld.new.run
31
- ## DSL
32
- require 'ray'
150
+ You can also create and use shaders from Ruby:
151
+
152
+ shader = Ray::Shader.new :vertex => "vertex_shader.glsl",
153
+ :frag => "frag_shader.glsl"
154
+ drawable.shader = shader
155
+
156
+ # You can't assign an image to a render target, but you can recompile it:
157
+ window.shader.compile :vertex => "vertex.glsl", :frag => "frag.glsl"
158
+
159
+ 3D rendering
160
+ ------------
161
+
162
+ 3D rendering is a very cool thing! Even if Ray's graphics module only uses 2D, a
163
+ 3D API can be created with it. You can just use ``Ray::Drawable`` again, but you
164
+ will ned to specify the layout of your vertices and to write your own shaders
165
+ (the default shaders are only designed for 2D). You will probably need a custom
166
+ projection matrix too.
33
167
 
34
- Ray::Game.new("Hello world!") do
35
- register do
36
- add_hook :quit, method(:exit!)
168
+ class Cube < Ray::Drawable
169
+ include Ray::GL
170
+
171
+ Vertex = Ray::GL::Vertex.make [
172
+ [:pos, "in_Position", :vector3],
173
+ [:col, "in_Color", :color]
174
+ ]
175
+
176
+ def initialize
177
+ super Vertex
178
+ # ...
37
179
  end
38
180
 
39
- scene :hello do
40
- @font = font("VeraMono.ttf")
181
+ # ...
182
+ end
183
+
184
+ # ...
185
+
186
+ # Tell the shader what vertex layout to use.
187
+ window.shader.apply_vertex Cube::Vertex
188
+ window.shader.compile :vertex => "vertex.glsl", :frag => "frag.glsl"
189
+
190
+ # Ray::Matrix can create 3D transformation and projection matrices!
191
+ window.view = Ray::View.new Ray::Matrix.perspective(90, 1, 1, 100)
192
+
193
+ Audio playback
194
+ --------------
195
+
196
+ Ray can play short sounds right away and stream longer ones — it uses OpenAL for
197
+ this. 3D audio effects can be added as well.
41
198
 
42
- render do |win|
43
- @font.draw("Hello world", :on => win, :at => [0, 0], :size => 12)
44
- end
199
+ @sound = sound "test.wav"
200
+ @music = music "test.ogg"
201
+
202
+ @sound.pause
203
+ @music.play
204
+
205
+ @music.pause
206
+
207
+ @music.volume = 80
208
+ @music.pitch = 0.9
209
+ @music.pos = [10, 20, 30]
210
+
211
+ @music.play
212
+
213
+ Testing
214
+ -------
215
+
216
+ Ray's events can be faked so that you can simulate user input in your tests:
217
+
218
+ require 'awesome_scene'
219
+
220
+ describe AwesomeScene do
221
+ before :each do
222
+ @game = AwesomeGame.new
223
+ @scene = @game.registered_scene(:awesome_scene)
224
+
225
+ @scene.register
226
+ @scene.setup
227
+ end
228
+
229
+ it "has a cursor at (0, 0)" do
230
+ @scene.cursor.pos.should == [0, 0]
231
+ end
232
+
233
+ it "moves its cursor after the mouse moved" do
234
+ @game.raise_event :mouse_motion, Ray::Vector2[100, 100]
235
+ @game.event_runner.run
236
+
237
+ @scene.cursor.pos.should == [100, 100]
238
+ end
239
+
240
+ it "draws its cursor" do
241
+ @scene.window.should_receive(:draw, @scene.cursor)
242
+ @scene.render @scene.window
45
243
  end
46
244
 
47
- push_scene :hello
245
+ after :each do
246
+ @scene.clean_up
247
+ end
48
248
  end
49
249
 
50
- # Features
51
- * Can hide the event loop where registred blocks or methods are run when something
52
- happens.
53
- * Provides a cache for resources like images, fonts, sounds, ...
54
- * Implements turtle graphics
55
- * Nothing more serious than a toy.
250
+ Animations
251
+ ----------
252
+
253
+ You can animate the fact the state of an object is changing (its position, etc.)
254
+ using Ray's animation objects:
255
+
256
+ animations << translation(:from => [0, 0], :to => [100, 100],
257
+ :duration => 4).start(@some_drawable)
258
+
259
+ (They can really be used to animate any change, not just those that are visible,
260
+ and not just those applied to a drawable.)
56
261
 
57
- # Installation & Getting started
58
- See [the guide](guide.md)
data/Rakefile CHANGED
@@ -1,9 +1,15 @@
1
1
  # -*- coding: utf-8 -*-
2
+
3
+ begin
4
+ require 'devkit' # only used on windows
5
+ rescue LoadError
6
+ end
7
+
2
8
  begin
3
9
  require 'yard'
4
10
 
5
11
  YARD::Rake::YardocTask.new do |t|
6
- t.files = ['lib/**/*.rb', 'ext/**/*.cpp']
12
+ t.files = ['lib/**/*.rb', 'ext/**/*.c']
7
13
  t.options |= ["--private", "-e", "./yard_ext.rb"]
8
14
  end
9
15
  rescue LoadError
@@ -11,69 +17,34 @@ rescue LoadError
11
17
  "with the following command: gem install yard")
12
18
  end
13
19
 
14
- begin
15
- require 'jeweler'
16
-
17
- Jeweler::Tasks.new do |s|
18
- s.name = "ray"
19
-
20
- s.summary = "A library to write games (or to play with) in Ruby"
21
- s.description = "Written to play with Ruby"
22
- s.homepage = "http://github.com/Mon-Ouie/ray"
23
-
24
- s.email = "mon.ouie@gmail.com"
25
- s.authors = ["Mon ouïe"]
26
-
27
- s.files |= FileList["lib/**/*.rb"]
28
- s.files |= FileList["ext/**/*.{cpp,h}"]
29
- s.files |= FileList["*.md"]
30
- s.files << ".gemtest" << "Rakefile"
31
-
32
- s.has_rdoc = "yard"
33
-
34
- s.extensions = ["ext/extconf.rb"]
35
-
36
- s.add_development_dependency "jeweler"
37
- s.add_development_dependency "yard"
38
- s.add_development_dependency "riot"
39
- s.add_development_dependency "rr"
40
- end
41
- rescue LoadError
42
- $stderr.puts("Jeweler is not installed. Please install it " +
43
- "with the following command: gem intall jeweler")
44
- end
45
-
46
20
  namespace :ext do
47
21
  desc "Rebuilds the C extension"
48
22
  task :rebuild do
49
23
  cd "ext/"
50
- sh "ruby extconf.rb && make clean && make"
24
+ ruby "extconf.rb" and sh "make clean && make"
51
25
  end
52
26
 
53
27
  desc "Builds the C extension"
54
28
  task :build do
55
29
  cd "ext/"
56
- sh "ruby extconf.rb && make"
30
+ ruby "extconf.rb" and sh "make"
57
31
  end
58
32
  end
59
33
 
60
34
  desc "Builds the C extension"
61
35
  task :ext => ["ext:build"]
62
36
 
63
- desc "Starts IRB"
64
- task :irb do
65
- require 'irb'
66
- ARGV.clear
67
-
68
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), "ext"))
69
- $:.unshift File.expand_path(File.join(File.dirname(__FILE__), "lib"))
70
-
71
- require 'ray'
72
-
73
- IRB.start
74
- end
75
-
76
37
  desc "Runs tests"
77
38
  task :test do
78
- load File.expand_path(File.join(File.dirname(__FILE__), "test", "run_all.rb"))
39
+ test_file = File.expand_path("test/run_all.rb", File.dirname(__FILE__))
40
+
41
+ begin
42
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
43
+ ruby "-X+O", test_file
44
+ else
45
+ ruby test_file
46
+ end
47
+ rescue
48
+ exit 1
49
+ end
79
50
  end
@@ -0,0 +1,68 @@
1
+ #include "ray.h"
2
+
3
+ VALUE ray_mAudio = Qnil;
4
+
5
+ /*
6
+ @return [Float] The global volume. 0 is the minimum volume, whereas 100
7
+ is the maximum.
8
+ */
9
+ VALUE ray_audio_volume(VALUE self) {
10
+ return rb_float_new(say_audio_get_volume());
11
+ }
12
+
13
+ /*
14
+ @overload volume=(val)
15
+ Sets the global volume.
16
+ @param [Float] val The new value for the volume.
17
+ */
18
+ VALUE ray_audio_set_volume(VALUE self, VALUE value) {
19
+ float volume = (float)NUM2DBL(value);
20
+ say_audio_set_volume(volume);
21
+
22
+ return value;
23
+ }
24
+
25
+ /*
26
+ @return [Ray::Vector3] The position of the listener.
27
+ */
28
+ VALUE ray_audio_pos(VALUE self) {
29
+ return ray_vector3_to_rb(say_audio_get_pos());
30
+ }
31
+
32
+ /*
33
+ @overload pos=(pos)
34
+ Sets the position of the listener.
35
+ @param [Ray::Vector3, #to_vector3] pos The new position of the
36
+ listener.
37
+ */
38
+ VALUE ray_audio_set_pos(VALUE self, VALUE pos) {
39
+ say_audio_set_pos(ray_convert_to_vector3(pos));
40
+ return pos;
41
+ }
42
+
43
+ /*
44
+ @return [Ray::Vector3] The orientation of the listener.
45
+ */
46
+ VALUE ray_audio_direction(VALUE self) {
47
+ return ray_vector3_to_rb(say_audio_get_direction());
48
+ }
49
+
50
+ /*
51
+ @overload direction=(dir)
52
+ Sets the orientation of the listener.
53
+ @param [Ray::Vector3, #to_vector3] dir The new orientation of the listener.
54
+ */
55
+ VALUE ray_audio_set_direction(VALUE self, VALUE dir) {
56
+ say_audio_set_direction(ray_convert_to_vector3(dir));
57
+ return dir;
58
+ }
59
+
60
+ void Init_ray_audio() {
61
+ ray_mAudio = rb_define_module_under(ray_mRay, "Audio");
62
+ rb_define_module_function(ray_mAudio, "volume", ray_audio_volume, 0);
63
+ rb_define_module_function(ray_mAudio, "volume=", ray_audio_set_volume, 1);
64
+ rb_define_module_function(ray_mAudio, "pos", ray_audio_pos, 0);
65
+ rb_define_module_function(ray_mAudio, "pos=", ray_audio_set_pos, 1);
66
+ rb_define_module_function(ray_mAudio, "direction", ray_audio_direction, 0);
67
+ rb_define_module_function(ray_mAudio, "direction=", ray_audio_set_direction, 1);
68
+ }