ruby-glfw 0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (206) hide show
  1. data/README +1 -0
  2. data/README.API +73 -0
  3. data/Rakefile +120 -0
  4. data/examples/boing.rb +519 -0
  5. data/examples/gears.rb +327 -0
  6. data/examples/keytest.rb +117 -0
  7. data/examples/listmodes.rb +20 -0
  8. data/examples/mipmaps.rb +104 -0
  9. data/examples/mipmaps.tga +0 -0
  10. data/examples/particles.rb +837 -0
  11. data/examples/pong3d.rb +741 -0
  12. data/examples/pong3d_field.tga +0 -0
  13. data/examples/pong3d_instr.tga +0 -0
  14. data/examples/pong3d_menu.tga +0 -0
  15. data/examples/pong3d_title.tga +0 -0
  16. data/examples/pong3d_winner1.tga +0 -0
  17. data/examples/pong3d_winner2.tga +0 -0
  18. data/examples/splitview.rb +432 -0
  19. data/examples/triangle.rb +89 -0
  20. data/examples/wave.rb +294 -0
  21. data/ext/glfw/glfw.c +1094 -0
  22. data/ext/glfw/mkrf_conf.rb +70 -0
  23. data/glfw-src/Makefile +220 -0
  24. data/glfw-src/compile.ami +61 -0
  25. data/glfw-src/compile.bat +217 -0
  26. data/glfw-src/compile.sh +607 -0
  27. data/glfw-src/docs/Makefile +57 -0
  28. data/glfw-src/docs/Reference.pdf +0 -0
  29. data/glfw-src/docs/UsersGuide.pdf +0 -0
  30. data/glfw-src/docs/cleanup.bat +22 -0
  31. data/glfw-src/docs/glfwdoc.sty +80 -0
  32. data/glfw-src/docs/glfwrm.tex +3034 -0
  33. data/glfw-src/docs/glfwug.tex +2024 -0
  34. data/glfw-src/docs/readme.txt +80 -0
  35. data/glfw-src/examples/Makefile.amigaos.gcc +70 -0
  36. data/glfw-src/examples/Makefile.amigaos.vbcc +70 -0
  37. data/glfw-src/examples/Makefile.dos.djgpp +71 -0
  38. data/glfw-src/examples/Makefile.macosx.gcc +96 -0
  39. data/glfw-src/examples/Makefile.win32.bcc +75 -0
  40. data/glfw-src/examples/Makefile.win32.cross-mgw +79 -0
  41. data/glfw-src/examples/Makefile.win32.cygwin +79 -0
  42. data/glfw-src/examples/Makefile.win32.lcc +74 -0
  43. data/glfw-src/examples/Makefile.win32.mgw +75 -0
  44. data/glfw-src/examples/Makefile.win32.msvc +74 -0
  45. data/glfw-src/examples/Makefile.win32.ow +74 -0
  46. data/glfw-src/examples/Makefile.win32.pellesc +74 -0
  47. data/glfw-src/examples/Makefile.x11.in +54 -0
  48. data/glfw-src/examples/boing.c +606 -0
  49. data/glfw-src/examples/bundle.sh +46 -0
  50. data/glfw-src/examples/gears.c +382 -0
  51. data/glfw-src/examples/keytest.c +264 -0
  52. data/glfw-src/examples/listmodes.c +48 -0
  53. data/glfw-src/examples/mipmaps.c +126 -0
  54. data/glfw-src/examples/mipmaps.tga +0 -0
  55. data/glfw-src/examples/mtbench.c +301 -0
  56. data/glfw-src/examples/mthello.c +48 -0
  57. data/glfw-src/examples/particles.c +1148 -0
  58. data/glfw-src/examples/pong3d.c +839 -0
  59. data/glfw-src/examples/pong3d_field.tga +0 -0
  60. data/glfw-src/examples/pong3d_instr.tga +0 -0
  61. data/glfw-src/examples/pong3d_menu.tga +0 -0
  62. data/glfw-src/examples/pong3d_title.tga +0 -0
  63. data/glfw-src/examples/pong3d_winner1.tga +0 -0
  64. data/glfw-src/examples/pong3d_winner2.tga +0 -0
  65. data/glfw-src/examples/splitview.c +506 -0
  66. data/glfw-src/examples/triangle.c +108 -0
  67. data/glfw-src/examples/wave.c +397 -0
  68. data/glfw-src/images/opengl.gif +0 -0
  69. data/glfw-src/images/osicert.gif +0 -0
  70. data/glfw-src/include/GL/glfw.h +486 -0
  71. data/glfw-src/lib/amigaos/Makefile.amigaos.gcc +128 -0
  72. data/glfw-src/lib/amigaos/Makefile.amigaos.vbcc +128 -0
  73. data/glfw-src/lib/amigaos/SDI_compiler.h +94 -0
  74. data/glfw-src/lib/amigaos/amigaos_enable.c +51 -0
  75. data/glfw-src/lib/amigaos/amigaos_fullscreen.c +319 -0
  76. data/glfw-src/lib/amigaos/amigaos_glext.c +61 -0
  77. data/glfw-src/lib/amigaos/amigaos_init.c +284 -0
  78. data/glfw-src/lib/amigaos/amigaos_joystick.c +359 -0
  79. data/glfw-src/lib/amigaos/amigaos_thread.c +494 -0
  80. data/glfw-src/lib/amigaos/amigaos_time.c +206 -0
  81. data/glfw-src/lib/amigaos/amigaos_window.c +830 -0
  82. data/glfw-src/lib/amigaos/platform.h +337 -0
  83. data/glfw-src/lib/dos/Makefile.dos.djgpp +146 -0
  84. data/glfw-src/lib/dos/dos_enable.c +51 -0
  85. data/glfw-src/lib/dos/dos_events.c +173 -0
  86. data/glfw-src/lib/dos/dos_fullscreen.c +101 -0
  87. data/glfw-src/lib/dos/dos_glext.c +59 -0
  88. data/glfw-src/lib/dos/dos_init.c +105 -0
  89. data/glfw-src/lib/dos/dos_irq.s +246 -0
  90. data/glfw-src/lib/dos/dos_joystick.c +94 -0
  91. data/glfw-src/lib/dos/dos_keyboard.c +694 -0
  92. data/glfw-src/lib/dos/dos_mouse.c +337 -0
  93. data/glfw-src/lib/dos/dos_thread.c +267 -0
  94. data/glfw-src/lib/dos/dos_time.c +309 -0
  95. data/glfw-src/lib/dos/dos_window.c +563 -0
  96. data/glfw-src/lib/dos/platform.h +341 -0
  97. data/glfw-src/lib/enable.c +295 -0
  98. data/glfw-src/lib/fullscreen.c +95 -0
  99. data/glfw-src/lib/glext.c +201 -0
  100. data/glfw-src/lib/image.c +629 -0
  101. data/glfw-src/lib/init.c +108 -0
  102. data/glfw-src/lib/input.c +280 -0
  103. data/glfw-src/lib/internal.h +210 -0
  104. data/glfw-src/lib/joystick.c +101 -0
  105. data/glfw-src/lib/macosx/Makefile.macosx.gcc +172 -0
  106. data/glfw-src/lib/macosx/Makefile.macosx.gcc.universal +166 -0
  107. data/glfw-src/lib/macosx/libglfw.pc.in +11 -0
  108. data/glfw-src/lib/macosx/macosx_enable.c +42 -0
  109. data/glfw-src/lib/macosx/macosx_fullscreen.c +126 -0
  110. data/glfw-src/lib/macosx/macosx_glext.c +52 -0
  111. data/glfw-src/lib/macosx/macosx_init.c +194 -0
  112. data/glfw-src/lib/macosx/macosx_joystick.c +50 -0
  113. data/glfw-src/lib/macosx/macosx_thread.c +414 -0
  114. data/glfw-src/lib/macosx/macosx_time.c +112 -0
  115. data/glfw-src/lib/macosx/macosx_window.c +1279 -0
  116. data/glfw-src/lib/macosx/platform.h +349 -0
  117. data/glfw-src/lib/stream.c +194 -0
  118. data/glfw-src/lib/tga.c +405 -0
  119. data/glfw-src/lib/thread.c +340 -0
  120. data/glfw-src/lib/time.c +83 -0
  121. data/glfw-src/lib/win32/Makefile.win32.bcc +265 -0
  122. data/glfw-src/lib/win32/Makefile.win32.cross-mgw +274 -0
  123. data/glfw-src/lib/win32/Makefile.win32.cygwin +279 -0
  124. data/glfw-src/lib/win32/Makefile.win32.lcc +246 -0
  125. data/glfw-src/lib/win32/Makefile.win32.mgw +243 -0
  126. data/glfw-src/lib/win32/Makefile.win32.msvc +242 -0
  127. data/glfw-src/lib/win32/Makefile.win32.ow +242 -0
  128. data/glfw-src/lib/win32/Makefile.win32.pellesc +242 -0
  129. data/glfw-src/lib/win32/glfwdll.def +67 -0
  130. data/glfw-src/lib/win32/glfwdll_mgw1.def +67 -0
  131. data/glfw-src/lib/win32/glfwdll_mgw2.def +67 -0
  132. data/glfw-src/lib/win32/glfwdll_pellesc.def +65 -0
  133. data/glfw-src/lib/win32/libglfw.pc.in +11 -0
  134. data/glfw-src/lib/win32/platform.h +474 -0
  135. data/glfw-src/lib/win32/win32_dllmain.c +60 -0
  136. data/glfw-src/lib/win32/win32_enable.c +155 -0
  137. data/glfw-src/lib/win32/win32_fullscreen.c +317 -0
  138. data/glfw-src/lib/win32/win32_glext.c +85 -0
  139. data/glfw-src/lib/win32/win32_init.c +356 -0
  140. data/glfw-src/lib/win32/win32_joystick.c +234 -0
  141. data/glfw-src/lib/win32/win32_thread.c +511 -0
  142. data/glfw-src/lib/win32/win32_time.c +146 -0
  143. data/glfw-src/lib/win32/win32_window.c +1714 -0
  144. data/glfw-src/lib/window.c +727 -0
  145. data/glfw-src/lib/x11/Makefile.x11.in +243 -0
  146. data/glfw-src/lib/x11/platform.h +415 -0
  147. data/glfw-src/lib/x11/x11_enable.c +51 -0
  148. data/glfw-src/lib/x11/x11_fullscreen.c +524 -0
  149. data/glfw-src/lib/x11/x11_glext.c +69 -0
  150. data/glfw-src/lib/x11/x11_init.c +275 -0
  151. data/glfw-src/lib/x11/x11_joystick.c +371 -0
  152. data/glfw-src/lib/x11/x11_keysym2unicode.c +902 -0
  153. data/glfw-src/lib/x11/x11_thread.c +507 -0
  154. data/glfw-src/lib/x11/x11_time.c +154 -0
  155. data/glfw-src/lib/x11/x11_window.c +1746 -0
  156. data/glfw-src/license.txt +21 -0
  157. data/glfw-src/readme.html +927 -0
  158. data/glfw-src/support/d/examples/Makefile +59 -0
  159. data/glfw-src/support/d/examples/boing.d +610 -0
  160. data/glfw-src/support/d/examples/gears.d +379 -0
  161. data/glfw-src/support/d/examples/keytest.d +272 -0
  162. data/glfw-src/support/d/examples/listmodes.d +48 -0
  163. data/glfw-src/support/d/examples/mipmaps.d +126 -0
  164. data/glfw-src/support/d/examples/mtbench.d +304 -0
  165. data/glfw-src/support/d/examples/mthello.d +54 -0
  166. data/glfw-src/support/d/examples/particles.d +1150 -0
  167. data/glfw-src/support/d/examples/pong3d.d +840 -0
  168. data/glfw-src/support/d/examples/splitview.d +486 -0
  169. data/glfw-src/support/d/examples/triangle.d +108 -0
  170. data/glfw-src/support/d/examples/wave.d +400 -0
  171. data/glfw-src/support/d/imports/gl.d +4539 -0
  172. data/glfw-src/support/d/imports/glfw.d +349 -0
  173. data/glfw-src/support/d/imports/glu.d +328 -0
  174. data/glfw-src/support/d/lib/glfwdll.def +64 -0
  175. data/glfw-src/support/d/lib/glu32.def +56 -0
  176. data/glfw-src/support/d/lib/makefile +12 -0
  177. data/glfw-src/support/d/lib/opengl32.def +372 -0
  178. data/glfw-src/support/d/readme.html +83 -0
  179. data/glfw-src/support/delphi/examples/Triangle.dpr +105 -0
  180. data/glfw-src/support/delphi/lib/glfw.pas +437 -0
  181. data/glfw-src/support/delphi/readme.html +97 -0
  182. data/glfw-src/support/lua/examples/gears.lua +383 -0
  183. data/glfw-src/support/lua/examples/test1.lua +68 -0
  184. data/glfw-src/support/lua/readme.html +128 -0
  185. data/glfw-src/support/lua/src/luaglfw.c +1179 -0
  186. data/glfw-src/support/lua/src/luaglfw.h +48 -0
  187. data/glfw-src/support/lua/src/runlua.c +82 -0
  188. data/glfw-src/support/masm/examples/fpc.mac +47 -0
  189. data/glfw-src/support/masm/examples/makeit.bat +66 -0
  190. data/glfw-src/support/masm/examples/triangle.asm +232 -0
  191. data/glfw-src/support/masm/include/glfw.inc +326 -0
  192. data/glfw-src/support/masm/include/glu32.inc +55 -0
  193. data/glfw-src/support/masm/include/opengl32.inc +372 -0
  194. data/glfw-src/support/masm/lib/glfwdll.lib +0 -0
  195. data/glfw-src/support/masm/readme.html +170 -0
  196. data/glfw-src/support/msvc80/GLFW.sln +26 -0
  197. data/glfw-src/support/msvc80/GLFW.vcproj +257 -0
  198. data/glfw-src/support/msvc80/GLFWDLL.vcproj +287 -0
  199. data/glfw-src/support/visualbasic/bindings/glfw.bas +320 -0
  200. data/glfw-src/support/visualbasic/bindings/glu32.bas +284 -0
  201. data/glfw-src/support/visualbasic/bindings/opengl32.bas +999 -0
  202. data/glfw-src/support/visualbasic/examples/Triangle.bas +101 -0
  203. data/glfw-src/support/visualbasic/readme.html +164 -0
  204. data/website/index.html +84 -0
  205. data/website/style.css +110 -0
  206. metadata +301 -0
data/README ADDED
@@ -0,0 +1 @@
1
+ See file website/index.html
@@ -0,0 +1,73 @@
1
+ = Usage and API
2
+
3
+ The function names and general usage are equivalent to C (you can read the
4
+ GLFW C API documentation here[http://glfw.sourceforge.net/GLFWUsersGuide26.pdf]), with some differences outlined bellow.
5
+
6
+ = Naming
7
+
8
+ The naming conventions follows those of ruby-opengl bindings - all the
9
+ constants and functions are contained in Glfw module (click for RDoc documentation), in file glfw.so which
10
+ is loaded by writing
11
+
12
+ require 'glfw'
13
+
14
+ You can also add
15
+
16
+ include Glfw
17
+
18
+ which will export the module's functions and constants to the global namespace, so
19
+ instead of writing
20
+
21
+ Glfw.glfwSomeFunction(Glfw::GLFW_SOME_CONSTANT)
22
+
23
+ in full scope, you can then use the C-like syntax:
24
+
25
+ glfwSomeFunction(GLFW_SOME_CONSTANT)
26
+
27
+ Loading the module will call Glfw.glfwInit function, and will generate ruby
28
+ exception should the initialization fail. At the end of your program,
29
+ Glfw.glfwTerminate is automatically called, although you are free to call it
30
+ yourself if you wish.
31
+
32
+ Functions working with boolean states are using ruby's true/false rather then GL_TRUE/GL_FALSE (both for
33
+ input and output).
34
+
35
+ = Callbacks
36
+
37
+ For specifying callback functions just pass ruby Proc object, e.g
38
+
39
+ mouse_callback = lambda do |x,y|
40
+ puts "Mouse moved! current mouse position is #{x} #{y}"
41
+ end
42
+ ...
43
+ glfwSetMousePosCallback(mouse_callback)
44
+
45
+ or convert regular function, as
46
+
47
+ def mouse_callback(x,y)
48
+ puts "Mouse moved! current mouse position is #{x} #{y}"
49
+ end
50
+ ...
51
+ glfwSetMousePosCallback(method("mouse_callback").to_proc)
52
+
53
+ Passing 'nil' will disable the callback.
54
+
55
+ = GLFW and GLUT or other windowing libraries
56
+
57
+ You can combine GLFW with other GL or graphic libraries as long as you use
58
+ only one of them for window creation/destruction, events callbacks and general
59
+ window state modifications. For example you can write:
60
+
61
+ require 'glfw'
62
+ require 'glut'
63
+ include Glfw,Glut
64
+ ...
65
+ glfwCreateWindow(...) # use GLFW to create OpenGL window
66
+ glutSolidSphere(...) # use GLUT to draw sphere
67
+ ...
68
+
69
+ = Examples
70
+
71
+ You can find the examples in the 'examples' directory - they are pretty much
72
+ just conversion of the GLFW C examples. The 'particles' example was tuned down
73
+ for compensation of ruby speed - see the file particles.rb for more details.
@@ -0,0 +1,120 @@
1
+ # Copyright (C) 2007 Jan Dvorak <jan.dvorak@kraxnet.cz>
2
+ #
3
+ # This software is provided 'as-is', without any express or implied
4
+ # warranty. In no event will the authors be held liable for any damages
5
+ # arising from the use of this software.
6
+ # Permission is granted to anyone to use this software for any purpose,
7
+ # including commercial applications, and to alter it and redistribute it
8
+ # freely, subject to the following restrictions:
9
+ #
10
+ # 1. The origin of this software must not be misrepresented; you must not
11
+ # claim that you wrote the original software. If you use this software
12
+ # in a product, an acknowledgment in the product documentation would be
13
+ # appreciated but is not required.
14
+ #
15
+ # 2. Altered source versions must be plainly marked as such, and must not be
16
+ # misrepresented as being the original software.
17
+ #
18
+ # 3. This notice may not be removed or altered from any source distribution.
19
+
20
+ require 'rubygems'
21
+ require 'rake'
22
+ require 'rake/clean'
23
+ require 'rake/gempackagetask'
24
+ require 'rake/rdoctask'
25
+ require 'mkrf/rakehelper'
26
+
27
+ CLEAN.include("ext/glfw/Rakefile", "ext/glfw/mkrf.log", "ext/glfw/*.so",
28
+ "ext/glfw/*.bundle", "lib/*.so", "lib/*.bundle", "ext/glfw/*.o{,bj}",
29
+ "ext/glfw/*.lib", "ext/glfw/*.exp", "ext/glfw/*.pdb",
30
+ "pkg","html")
31
+
32
+ setup_extension('glfw', 'glfw')
33
+
34
+ # setup building and cleaning the bundled GLFW library
35
+ case RUBY_PLATFORM
36
+ when /(:?mswin|mingw)/ # windows, MSVC 6
37
+ lib_build = "nmake.exe win32-msvc"
38
+ lib_clean = "nmake.exe win32-clean"
39
+ when /darwin/ # mac
40
+ lib_build = "make macosx-gcc"
41
+ lib_clean = "make macosx-clean"
42
+ else # general posix-x11
43
+ lib_build = "make x11"
44
+ lib_clean = "make x11-clean"
45
+ end
46
+
47
+ desc 'Compiles the bundled GLFW library'
48
+ task :glfwlib do
49
+ Dir.chdir("glfw-src") do
50
+ sh lib_build
51
+ end
52
+ end
53
+
54
+ # full cleanup
55
+ desc 'Cleanup, includes cleaup of the bunded GLFW library'
56
+ task :distclean => [:clean] do
57
+ Dir.chdir("glfw-src") do
58
+ sh lib_clean
59
+ end
60
+ end
61
+
62
+ # setup the build
63
+ case RUBY_PLATFORM
64
+ when /(:?mswin|mingw)/
65
+ # rake on windows doesn't work properly for subdirectories
66
+ # so iterate manually
67
+ begin
68
+ Dir.mkdir("lib")
69
+ rescue
70
+ end
71
+ task :default => [:glfwlib] do
72
+ Dir.chdir("ext\\glfw") do
73
+ sh "ruby mkrf_conf.rb"
74
+ sh "call rake --nosearch"
75
+ sh "copy glfw.so ..\\..\\lib"
76
+ end
77
+ end
78
+ else
79
+ # other systems
80
+ task :default => [:glfwlib,:glfw]
81
+ end
82
+
83
+ # for gem building
84
+ task :extension => :default
85
+
86
+ # build documentation
87
+ rd = Rake::RDocTask.new do |rdoc|
88
+ rdoc.main = "README.API"
89
+ rdoc.title = "GLFW bindings for Ruby"
90
+ rdoc.rdoc_files.include('README.API', 'ext/glfw/glfw.c')
91
+ end
92
+
93
+ # Define the files that will go into the gem
94
+ gem_files = FileList["{lib,ext,examples,glfw-src,website}/**/*","README"]
95
+ gem_files = gem_files.exclude("**/*.so", "**/*.o{,bj}", "ext/glfw/*.log","ext/glfw/Rakefile")
96
+
97
+ spec = Gem::Specification.new do |s|
98
+ s.name = "ruby-glfw"
99
+ s.version = "0.9"
100
+ s.author = "Jan Dvorak"
101
+ s.email = "jan.dvorak@kraxnet.cz"
102
+ s.homepage = "http://ruby-glfw.rubyforge.org"
103
+ s.platform = Gem::Platform::RUBY
104
+ s.summary = "GLFW library bindings for Ruby"
105
+ s.rubyforge_project = "ruby-glfw"
106
+ s.files = gem_files
107
+ s.extensions << 'Rakefile'
108
+ s.require_path = "lib"
109
+ s.has_rdoc = true
110
+ s.rdoc_options << '--main' << rd.main << '--title' << rd.title
111
+ s.extra_rdoc_files = rd.rdoc_files
112
+ s.add_dependency("mkrf", ">=0.2.0")
113
+ s.add_dependency("rake")
114
+ end
115
+
116
+ # Create a task for creating a ruby gem
117
+ Rake::GemPackageTask.new(spec) do |pkg|
118
+ pkg.gem_spec = spec
119
+ pkg.need_tar = true
120
+ end
@@ -0,0 +1,519 @@
1
+ #*****************************************************************************
2
+ # Title: GLBoing
3
+ # Desc: Tribute to Amiga Boing.
4
+ # Author: Jim Brooks <gfx@jimbrooks.org>
5
+ # Original Amiga authors were R.J. Mical and Dale Luck.
6
+ # GLFW conversion by Marcus Geelnard
7
+ # Notes: - 360' = 2*PI [radian]
8
+ #
9
+ # - Distances between objects are created by doing a relative
10
+ # Z translations.
11
+ #
12
+ # - Although OpenGL enticingly supports alpha-blending,
13
+ # the shadow of the original Boing didn't affect the color
14
+ # of the grid.
15
+ #
16
+ # - [Marcus] Changed timing scheme from interval driven to frame-
17
+ # time based animation steps (which results in much smoother
18
+ # movement)
19
+ #
20
+ # History of Amiga Boing:
21
+ #
22
+ # Boing was demonstrated on the prototype Amiga (codenamed "Lorraine") in
23
+ # 1985. According to legend, it was written ad-hoc in one night by
24
+ # R. J. Mical and Dale Luck. Because the bouncing ball animation was so fast
25
+ # and smooth, attendees did not believe the Amiga prototype was really doing
26
+ # the rendering. Suspecting a trick, they began looking around the booth for
27
+ # a hidden computer or VCR.
28
+ #****************************************************************************
29
+ # Converted to ruby from GLFW example boing.c
30
+
31
+ require 'opengl'
32
+ require 'glfw'
33
+ include Gl,Glu,Glfw,Math
34
+
35
+ RADIUS = 70.0
36
+ STEP_LONGITUDE = 22.5 # 22.5 makes 8 bands like original Boing
37
+ STEP_LATITUDE = 22.5
38
+
39
+ DIST_BALL = (RADIUS * 2.0 + RADIUS * 0.1)
40
+
41
+ VIEW_SCENE_DIST = (DIST_BALL * 3.0+ 200.0) # distance from viewer to middle of boing area
42
+ GRID_SIZE = (RADIUS * 4.5) # length (width) of grid
43
+ BOUNCE_HEIGHT = (RADIUS * 2.1)
44
+ BOUNCE_WIDTH = (RADIUS * 2.1)
45
+
46
+ SHADOW_OFFSET_X = -20.0
47
+ SHADOW_OFFSET_Y = 10.0
48
+ SHADOW_OFFSET_Z = 0.0
49
+
50
+ WALL_L_OFFSET = 0.0
51
+ WALL_R_OFFSET = 5.0
52
+
53
+ # Animation speed (50.0 mimics the original GLUT demo speed)
54
+ ANIMATION_SPEED = 50.0
55
+
56
+ # Maximum allowed delta time per physics iteration */
57
+ MAX_DELTA_T = 0.02
58
+
59
+
60
+ # Vertex type
61
+ class Vertex
62
+ attr_accessor :x,:y,:z
63
+ def initialize
64
+ @x = @y = @z = 0.0
65
+ end
66
+ end
67
+
68
+ # Global vars
69
+ $deg_rot_y = 0.0
70
+ $deg_rot_y_inc = 2.0
71
+ $ball_x = -RADIUS
72
+ $ball_y = -RADIUS
73
+ $ball_x_inc = 1.0
74
+ $ball_y_inc = 2.0
75
+ # Draw ball, or its shadow
76
+ $drawBallHow = :DRAW_BALL
77
+ $t = 0.0
78
+ $t_old = 0.0
79
+ $dt = 0.0
80
+
81
+ #*****************************************************************************
82
+ #* Truncate a degree.
83
+ #*****************************************************************************
84
+ def TruncateDeg(deg)
85
+ if ( deg >= 360.0 )
86
+ return (deg - 360.0)
87
+ else
88
+ return deg
89
+ end
90
+ end
91
+
92
+
93
+ #*****************************************************************************
94
+ #* Convert a degree (360-based) into a radian.
95
+ #* 360' = 2 * PI
96
+ #*****************************************************************************
97
+ def deg2rad( deg )
98
+ deg / 360 * (2 * PI)
99
+ end
100
+
101
+ #*****************************************************************************
102
+ #* 360' sin().
103
+ #*****************************************************************************
104
+ def sin_deg( deg )
105
+ sin( deg2rad( deg ) )
106
+ end
107
+
108
+ #*****************************************************************************
109
+ #* 360' cos().
110
+ #*****************************************************************************
111
+ def cos_deg( deg )
112
+ cos( deg2rad( deg ) )
113
+ end
114
+
115
+ #*****************************************************************************
116
+ #* Compute a cross product (for a normal vector).
117
+ #*
118
+ #* c = a x b
119
+ #*****************************************************************************
120
+ def CrossProduct( a,b,c,n )
121
+ u1 = b.x - a.x;
122
+ u2 = b.y - a.y;
123
+ u3 = b.y - a.z;
124
+
125
+ v1 = c.x - a.x;
126
+ v2 = c.y - a.y;
127
+ v3 = c.z - a.z;
128
+
129
+ n.x = u2 * v3 - v2 * v3;
130
+ n.y = u3 * v1 - v3 * u1;
131
+ n.z = u1 * v2 - v1 * u2;
132
+ end
133
+
134
+ #*****************************************************************************
135
+ #* Calculate the angle to be passed to gluPerspective() so that a scene
136
+ #* is visible. This function originates from the OpenGL Red Book.
137
+ #*
138
+ #* Parms : size
139
+ #* The size of the segment when the angle is intersected at "dist"
140
+ #* (ie at the outermost edge of the angle of vision).
141
+ #*
142
+ #* dist
143
+ #* Distance from viewpoint to scene.
144
+ #*****************************************************************************
145
+ def PerspectiveAngle( size,dist )
146
+ radTheta = 2.0 * atan2( size / 2.0, dist )
147
+ degTheta = (180.0 * radTheta) / PI
148
+ end
149
+
150
+ BOING_DEBUG = 0
151
+
152
+ #*****************************************************************************
153
+ #* init()
154
+ #*****************************************************************************
155
+ def init
156
+ #
157
+ # Clear background.
158
+ #
159
+ glClearColor( 0.55, 0.55, 0.55, 0.0 )
160
+
161
+ glShadeModel( GL_FLAT )
162
+ end
163
+
164
+ #*****************************************************************************
165
+ #* display()
166
+ #*****************************************************************************
167
+ def display
168
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
169
+ glPushMatrix()
170
+
171
+ $drawBallHow = :DRAW_BALL_SHADOW
172
+ DrawBoingBall()
173
+
174
+ DrawGrid()
175
+
176
+ $drawBallHow = :DRAW_BALL;
177
+ DrawBoingBall()
178
+
179
+ glPopMatrix()
180
+ glFlush()
181
+ end
182
+
183
+
184
+ #*****************************************************************************
185
+ #* reshape()
186
+ #*****************************************************************************
187
+ reshape = lambda do |w,h|
188
+ glViewport( 0, 0, w, h )
189
+
190
+ glMatrixMode( GL_PROJECTION )
191
+ glLoadIdentity()
192
+
193
+ gluPerspective( PerspectiveAngle( RADIUS * 2, 200 ),
194
+ w.to_f / h.to_f,
195
+ 1.0,
196
+ VIEW_SCENE_DIST )
197
+
198
+ glMatrixMode( GL_MODELVIEW )
199
+ glLoadIdentity()
200
+
201
+ gluLookAt( 0.0, 0.0, VIEW_SCENE_DIST,#* eye
202
+ 0.0, 0.0, 0.0, #* center of vision
203
+ 0.0, -1.0, 0.0 ) #* up vector
204
+ end
205
+
206
+ #*****************************************************************************
207
+ #* Draw the Boing ball.
208
+ #*
209
+ #* The Boing ball is sphere in which each facet is a rectangle.
210
+ #* Facet colors alternate between red and white.
211
+ #* The ball is built by stacking latitudinal circles. Each circle is composed
212
+ #* of a widely-separated set of points, so that each facet is noticably large.
213
+ #*****************************************************************************
214
+ def DrawBoingBall
215
+ glPushMatrix()
216
+ glMatrixMode( GL_MODELVIEW )
217
+
218
+ #
219
+ # Another relative Z translation to separate objects.
220
+ #
221
+ glTranslatef( 0.0, 0.0, DIST_BALL )
222
+
223
+ # Update ball position and rotation (iterate if necessary)
224
+ dt_total = $dt
225
+ while( dt_total > 0.0 )
226
+ dt2 = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total
227
+ dt_total -= dt2
228
+ BounceBall( dt2 )
229
+ $deg_rot_y = TruncateDeg( $deg_rot_y + $deg_rot_y_inc*(dt2*ANIMATION_SPEED) )
230
+ end
231
+
232
+ # Set ball position
233
+ glTranslatef( $ball_x, $ball_y, 0.0 )
234
+
235
+ #
236
+ # Offset the shadow.
237
+ #
238
+ if ( $drawBallHow == :DRAW_BALL_SHADOW )
239
+ glTranslatef( SHADOW_OFFSET_X,
240
+ SHADOW_OFFSET_Y,
241
+ SHADOW_OFFSET_Z )
242
+ end
243
+
244
+ #
245
+ # Tilt the ball.
246
+ #
247
+ glRotatef( -20.0, 0.0, 0.0, 1.0 )
248
+
249
+ #
250
+ # Continually rotate ball around Y axis.
251
+ #
252
+ glRotatef( $deg_rot_y, 0.0, 1.0, 0.0 )
253
+
254
+ #
255
+ # Set OpenGL state for Boing ball.
256
+ #
257
+ glCullFace( GL_FRONT )
258
+ glEnable( GL_CULL_FACE )
259
+ glEnable( GL_NORMALIZE )
260
+
261
+ #
262
+ # Build a faceted latitude slice of the Boing ball,
263
+ # stepping same-sized vertical bands of the sphere.
264
+ #
265
+ 0.step(180-1,STEP_LONGITUDE) do |lon_deg|
266
+ #
267
+ # Draw a latitude circle at this longitude.
268
+ #
269
+ DrawBoingBallBand( lon_deg, lon_deg + STEP_LONGITUDE )
270
+ end
271
+
272
+ glPopMatrix()
273
+ end
274
+
275
+ #*****************************************************************************
276
+ #* Bounce the ball.
277
+ #*****************************************************************************
278
+ def BounceBall(dt)
279
+ # Bounce on walls
280
+ if ( $ball_x > (BOUNCE_WIDTH/2 + WALL_R_OFFSET ) )
281
+ $ball_x_inc = -0.5 - 0.75 * rand()
282
+ $deg_rot_y_inc = -$deg_rot_y_inc
283
+ end
284
+ if ( $ball_x < -(BOUNCE_HEIGHT/2 + WALL_L_OFFSET) )
285
+ $ball_x_inc = 0.5 + 0.75 * rand()
286
+ $deg_rot_y_inc = -$deg_rot_y_inc
287
+ end
288
+
289
+ # Bounce on floor / roof
290
+ if ( $ball_y > BOUNCE_HEIGHT/2 )
291
+ $ball_y_inc = -0.75 - 1.0 * rand()
292
+ end
293
+ if ( $ball_y < -(BOUNCE_HEIGHT/2)*0.85 )
294
+ $ball_y_inc = 0.75 + 1.0 * rand()
295
+ end
296
+
297
+ # Update ball position
298
+ $ball_x += $ball_x_inc * (dt*ANIMATION_SPEED)
299
+ $ball_y += $ball_y_inc * (dt*ANIMATION_SPEED)
300
+
301
+ #
302
+ # Simulate the effects of gravity on Y movement.
303
+ #
304
+ if ( $ball_y_inc < 0 )
305
+ sign = -1.0
306
+ else
307
+ sign = 1.0
308
+ end
309
+
310
+ deg = ($ball_y + BOUNCE_HEIGHT/2) * 90 / BOUNCE_HEIGHT
311
+ deg = 80 if ( deg > 80 )
312
+ deg = 10 if ( deg < 10 )
313
+
314
+ $ball_y_inc = sign * 4.0 * sin_deg( deg.to_f )
315
+ end
316
+
317
+ #*****************************************************************************
318
+ #* Draw a faceted latitude band of the Boing ball.
319
+ #*
320
+ #* Parms: long_lo, long_hi
321
+ #* Low and high longitudes of slice, resp.
322
+ #*****************************************************************************
323
+ def DrawBoingBallBand( long_lo, long_hi )
324
+ vert_ne = Vertex.new() # "ne" means south-east, so on
325
+ vert_nw = Vertex.new() #
326
+ vert_sw = Vertex.new() #
327
+ vert_se = Vertex.new() #
328
+ vert_norm = Vertex.new()
329
+
330
+ @@colorToggle ||= false
331
+
332
+ #
333
+ # Iterate thru the points of a latitude circle.
334
+ # A latitude circle is a 2D set of X,Z points.
335
+ #
336
+ 0.step(360-STEP_LATITUDE, STEP_LATITUDE) do |lat_deg|
337
+ #
338
+ # Color this polygon with red or white.
339
+ #
340
+ if ( @@colorToggle )
341
+ glColor3f( 0.8, 0.1, 0.1 )
342
+ else
343
+ glColor3f( 0.95, 0.95, 0.95 )
344
+ end
345
+
346
+ @@colorToggle = ! @@colorToggle
347
+
348
+ #
349
+ # Change color if drawing shadow.
350
+ #
351
+ if ( $drawBallHow == :DRAW_BALL_SHADOW )
352
+ glColor3f( 0.35, 0.35, 0.35 )
353
+ end
354
+
355
+ #
356
+ # Assign each Y.
357
+ #
358
+ vert_ne.y = vert_nw.y = cos_deg(long_hi) * RADIUS
359
+ vert_sw.y = vert_se.y = cos_deg(long_lo) * RADIUS
360
+
361
+ #
362
+ # Assign each X,Z with sin,cos values scaled by latitude radius indexed by longitude.
363
+ # Eg, long=0 and long=180 are at the poles, so zero scale is sin(longitude),
364
+ # while long=90 (sin(90)=1) is at equator.
365
+ #
366
+ vert_ne.x = cos_deg( lat_deg ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE ))
367
+ vert_se.x = cos_deg( lat_deg ) * (RADIUS * sin_deg( long_lo ))
368
+ vert_nw.x = cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE ))
369
+ vert_sw.x = cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo ))
370
+
371
+ vert_ne.z = sin_deg( lat_deg ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE ))
372
+ vert_se.z = sin_deg( lat_deg ) * (RADIUS * sin_deg( long_lo ))
373
+ vert_nw.z = sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE ))
374
+ vert_sw.z = sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo ))
375
+
376
+ #
377
+ # Draw the facet.
378
+ #
379
+ glBegin( GL_POLYGON )
380
+
381
+ CrossProduct( vert_ne, vert_nw, vert_sw, vert_norm )
382
+ glNormal3f( vert_norm.x, vert_norm.y, vert_norm.z )
383
+
384
+ glVertex3f( vert_ne.x, vert_ne.y, vert_ne.z )
385
+ glVertex3f( vert_nw.x, vert_nw.y, vert_nw.z )
386
+ glVertex3f( vert_sw.x, vert_sw.y, vert_sw.z )
387
+ glVertex3f( vert_se.x, vert_se.y, vert_se.z )
388
+
389
+ glEnd()
390
+
391
+ if BOING_DEBUG==1
392
+ printf( "----------------------------------------------------------- \n" );
393
+ printf( "lat = %f long_lo = %f long_hi = %f \n", lat_deg, long_lo, long_hi );
394
+ printf( "vert_ne x = %.8f y = %.8f z = %.8f \n", vert_ne.x, vert_ne.y, vert_ne.z );
395
+ printf( "vert_nw x = %.8f y = %.8f z = %.8f \n", vert_nw.x, vert_nw.y, vert_nw.z );
396
+ printf( "vert_se x = %.8f y = %.8f z = %.8f \n", vert_se.x, vert_se.y, vert_se.z );
397
+ printf( "vert_sw x = %.8f y = %.8f z = %.8f \n", vert_sw.x, vert_sw.y, vert_sw.z );
398
+ end
399
+ end
400
+
401
+ #
402
+ # Toggle color so that next band will opposite red/white colors than this one.
403
+ #
404
+ @@colorToggle = ! @@colorToggle
405
+
406
+ #
407
+ # This circular band is done.
408
+ #
409
+ end
410
+
411
+ #*****************************************************************************
412
+ #* Draw the purple grid of lines, behind the Boing ball.
413
+ #* When the Workbench is dropped to the bottom, Boing shows 12 rows.
414
+ #*****************************************************************************
415
+ def DrawGrid
416
+ rowTotal = 12 # must be divisible by 2
417
+ colTotal = rowTotal # must be same as rowTotal
418
+ widthLine = 2.0 # should be divisible by 2
419
+ sizeCell = GRID_SIZE / rowTotal
420
+ z_offset = -40.0
421
+
422
+ glPushMatrix()
423
+ glDisable( GL_CULL_FACE )
424
+
425
+ #
426
+ # Another relative Z translation to separate objects.
427
+ #
428
+ glTranslatef( 0.0, 0.0, DIST_BALL )
429
+
430
+ #
431
+ # Draw vertical lines (as skinny 3D rectangles).
432
+ #
433
+ 0.upto(colTotal) do |col|
434
+ #
435
+ # Compute co-ords of line.
436
+ #
437
+ xl = -GRID_SIZE / 2 + col * sizeCell
438
+ xr = xl + widthLine
439
+
440
+ yt = GRID_SIZE / 2
441
+ yb = -GRID_SIZE / 2 - widthLine
442
+
443
+ glBegin( GL_POLYGON )
444
+
445
+ glColor3f( 0.6, 0.1, 0.6 ) # purple
446
+
447
+ glVertex3f( xr, yt, z_offset ) # NE
448
+ glVertex3f( xl, yt, z_offset ) # NW
449
+ glVertex3f( xl, yb, z_offset ) # SW
450
+ glVertex3f( xr, yb, z_offset ) # SE
451
+
452
+ glEnd()
453
+ end
454
+
455
+ #
456
+ # Draw horizontal lines (as skinny 3D rectangles).
457
+ #
458
+ 0.upto(rowTotal) do |row|
459
+ #
460
+ # Compute co-ords of line.
461
+ #
462
+ yt = GRID_SIZE / 2 - row * sizeCell
463
+ yb = yt - widthLine
464
+
465
+ xl = -GRID_SIZE / 2
466
+ xr = GRID_SIZE / 2 + widthLine
467
+
468
+ glBegin( GL_POLYGON )
469
+
470
+ glColor3f( 0.6, 0.1, 0.6 ) # purple
471
+
472
+ glVertex3f( xr, yt, z_offset ) # NE
473
+ glVertex3f( xl, yt, z_offset ) # NW
474
+ glVertex3f( xl, yb, z_offset ) # SW
475
+ glVertex3f( xr, yb, z_offset ) # SE
476
+
477
+ glEnd()
478
+ end
479
+
480
+ glPopMatrix()
481
+ end
482
+
483
+
484
+ #======================================================================
485
+ # main()
486
+ #======================================================================
487
+
488
+ running = true
489
+
490
+ # Init GLFW
491
+ if( glfwOpenWindow( 400,400, 0,0,0,0, 16,0, GLFW_WINDOW ) == false)
492
+ exit
493
+ end
494
+ glfwSetWindowTitle( "Boing (classic Amiga demo)" )
495
+ glfwSetWindowSizeCallback( reshape )
496
+ glfwEnable( GLFW_STICKY_KEYS )
497
+ glfwSwapInterval( 1 )
498
+ glfwSetTime( 0.0 )
499
+
500
+ init()
501
+
502
+ # Main loop
503
+ while running
504
+ # Timing
505
+ $t = glfwGetTime()
506
+ $dt = $t - $t_old
507
+ $t_old = $t
508
+
509
+ # Draw one frame
510
+ display()
511
+
512
+ # Swap buffers
513
+ glfwSwapBuffers()
514
+
515
+ # Check if we are still running
516
+ running = (glfwGetKey( GLFW_KEY_ESC ) == GLFW_RELEASE) &&
517
+ (glfwGetWindowParam( GLFW_OPENED ) == true)
518
+
519
+ end