sgl 0.3.1 → 0.4.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 (103) hide show
  1. data/ChangeLog +234 -0
  2. data/Manifest.txt +94 -0
  3. data/Rakefile +16 -5
  4. data/examples/cocoa1-basic.rb +14 -0
  5. data/examples/cocoa10-transparent.rb +26 -0
  6. data/examples/cocoa11-application.rb +13 -0
  7. data/examples/cocoa2-draw.rb +23 -0
  8. data/examples/cocoa3-affine.rb +29 -0
  9. data/examples/cocoa4-font.rb +24 -0
  10. data/examples/cocoa5-image.rb +22 -0
  11. data/examples/cocoa6-sound.rb +24 -0
  12. data/examples/cocoa7-movie.rb +40 -0
  13. data/examples/cocoa8-movieoverlay.rb +42 -0
  14. data/examples/cocoa9-streaming.rb +40 -0
  15. data/examples/opengl1-basic.rb +14 -0
  16. data/examples/opengl11-application.rb +13 -0
  17. data/examples/opengl2-draw.rb +23 -0
  18. data/examples/opengl3-affine.rb +29 -0
  19. data/examples/sample1.rb +11 -0
  20. data/examples/sample10.rb +16 -0
  21. data/examples/sample11.rb +22 -0
  22. data/examples/sample11a.rb +33 -0
  23. data/examples/sample12.rb +30 -0
  24. data/examples/sample12a.rb +35 -0
  25. data/examples/sample13.rb +116 -0
  26. data/examples/sample15.rb +24 -0
  27. data/examples/sample16.rb +31 -0
  28. data/examples/sample16a.rb +35 -0
  29. data/examples/sample6.rb +18 -0
  30. data/examples/sample7.rb +16 -0
  31. data/examples/sample9.rb +20 -0
  32. data/examples/sgl-sound1.rb +6 -0
  33. data/examples/sgl-sound2.rb +19 -0
  34. data/examples/sine.ogg +0 -0
  35. data/examples/testgl.rb +169 -0
  36. data/lib/sgl/bass-api.rb +202 -0
  37. data/lib/sgl/bass-sample.rb +106 -0
  38. data/lib/sgl/bass.rb +46 -0
  39. data/lib/sgl/cocoa-app.rb +43 -0
  40. data/lib/sgl/cocoa-color.rb +65 -0
  41. data/lib/sgl/cocoa-draw.rb +72 -0
  42. data/lib/sgl/cocoa-event.rb +229 -0
  43. data/lib/sgl/cocoa-media.rb +144 -0
  44. data/lib/sgl/cocoa-notuse.rb +493 -0
  45. data/lib/sgl/cocoa-window.rb +203 -0
  46. data/lib/sgl/cocoa.rb +8 -0
  47. data/lib/sgl/notuse-objs.rb +358 -0
  48. data/lib/sgl/opengl-app.rb +38 -0
  49. data/lib/sgl/opengl-color.rb +44 -0
  50. data/lib/sgl/opengl-draw.rb +260 -0
  51. data/lib/sgl/opengl-event.rb +325 -0
  52. data/lib/sgl/opengl-modules.rb +22 -0
  53. data/lib/sgl/opengl-window.rb +224 -0
  54. data/lib/sgl/opengl.rb +7 -0
  55. data/lib/sgl/sgl-basic.rb +61 -0
  56. data/lib/sgl/sgl-button.rb +135 -0
  57. data/lib/sgl/sgl-client.rb +21 -0
  58. data/lib/sgl/sgl-color.rb +82 -0
  59. data/lib/sgl/sgl-connect.rb +9 -0
  60. data/lib/sgl/sgl-objlib.rb +0 -0
  61. data/lib/sgl/sgl-objs.rb +0 -0
  62. data/lib/sgl/sgl-server.rb +58 -0
  63. data/lib/sgl/sgl-sound.rb +24 -0
  64. data/lib/sgl/sgl-spring.rb +216 -0
  65. data/lib/sgl/sgl-timer.rb +72 -0
  66. data/lib/sgl/sgl.rb +5 -0
  67. data/lib/sgl/version.rb +2 -2
  68. data/scripts/makemanifest.rb +20 -0
  69. data/test/test_bass.rb +27 -0
  70. data/test/test_cocoa_app.rb +5 -5
  71. data/test/test_helper.rb +9 -1
  72. data/test/test_module_ruby16.rb +22 -21
  73. data/test/test_opengl_app.rb +4 -5
  74. data/test/test_opengl_basic.rb +3 -4
  75. data/test/test_opengl_fullscreen.rb +4 -6
  76. data/test/test_opengl_novice.rb +3 -6
  77. data/test/test_sgl.rb +4 -27
  78. data/test/test_sound.rb +15 -0
  79. data/website/challenge1.html +91 -0
  80. data/website/challenge1.txt +30 -0
  81. data/website/challenge2.html +144 -0
  82. data/website/challenge2.txt +73 -0
  83. data/website/challenge3.html +63 -0
  84. data/website/challenge3.txt +15 -0
  85. data/website/cocoa.html +88 -0
  86. data/website/cocoa.txt +35 -0
  87. data/website/description.html +138 -0
  88. data/website/description.txt +90 -0
  89. data/website/exercise1.html +264 -0
  90. data/website/exercise1.txt +192 -0
  91. data/website/exercise2.html +683 -0
  92. data/website/exercise2.txt +597 -0
  93. data/website/exhibition.html +84 -0
  94. data/website/exhibition.txt +24 -0
  95. data/website/howto.html +134 -0
  96. data/website/howto.txt +56 -0
  97. data/website/index.html +17 -9
  98. data/website/index.txt +13 -4
  99. data/website/sound.html +141 -0
  100. data/website/sound.txt +87 -0
  101. data/website/stylesheets/grade.png +0 -0
  102. data/website/stylesheets/screen.css +21 -20
  103. metadata +109 -3
@@ -0,0 +1,325 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ # callback functions
6
+ def setup() end
7
+ def onMouseDown(x,y) end
8
+ def onMouseUp(x,y) end
9
+ def onKeyDown(k) end
10
+ def onKeyUp(k) end
11
+ def display() end
12
+
13
+ # callback functions for fullscreen
14
+ def onMouseDown0(x,y) end
15
+ def display0() end
16
+
17
+ # mainloop
18
+ def mainloop
19
+ $__a__.set_setup { setup }
20
+ $__a__.set_mousedown {|x, y| onMouseDown(x, y) }
21
+ $__a__.set_mouseup {|x, y| onMouseUp(x, y) }
22
+ $__a__.set_keydown {|k| onKeyDown(k) }
23
+ $__a__.set_keyup {|k| onKeyUp(k) }
24
+ if ! $__a__.check_display0
25
+ $__a__.set_display0 { display0 }
26
+ $__a__.set_mousedown0 {|x, y| onMouseDown0(x, y) }
27
+ end
28
+ $__a__.set_display { display }
29
+
30
+ if ! defined?($__sgl_in_mainloop__)
31
+ $__sgl_in_mainloop__ = true
32
+ $__a__.mainloop
33
+ else
34
+ # do setup only.
35
+ $__a__.mainloop_setup
36
+
37
+ # for debug
38
+ # $__a__.mainloop
39
+ end
40
+ end
41
+
42
+ # novice mode
43
+ def flip(*a) $__a__.flip(*a) end
44
+ def wait(*a) $__a__.wait(*a) end
45
+ def process(&b) $__a__.process(&b) end
46
+
47
+ # get status functions
48
+ def mouseX() $__a__.mouseX; end
49
+ def mouseY() $__a__.mouseY; end
50
+ def mouseDown() $__a__.mouseDown; end
51
+ def key(k) $__a__.key[k]; end
52
+ def keynum() $__a__.keynum; end
53
+
54
+ # get status functions for fullscreen
55
+ def mouseX0() $__a__.mouseX0; end
56
+ def mouseY0() $__a__.mouseY0; end
57
+
58
+ # event control
59
+ def useDelay(*a) $__a__.useDelay(*a) end
60
+ def useFramerate(*a) $__a__.useFramerate(*a) end
61
+ def useRuntime(*a) $__a__.useRuntime(*a) end
62
+
63
+ class Application
64
+ def initialize_event
65
+ @setup_done = nil
66
+ @display_drawing = nil
67
+ @block = {}
68
+
69
+ # status setting
70
+ @mouseX, @mouseY = 0, 0
71
+ @mouseX0, @mouseY0 = 0, 0
72
+ @mouseDown = 0
73
+ @keynum = 0
74
+
75
+ @starttime = nil
76
+ end
77
+ private :initialize_event
78
+
79
+ # get status
80
+ attr_reader :mouseX, :mouseY
81
+ attr_reader :mouseX0, :mouseY0
82
+ attr_reader :mouseDown
83
+ attr_reader :keynum
84
+
85
+ # setup
86
+ def set_setup(&b)
87
+ return unless block_given?
88
+ @block[:setup] = Proc.new
89
+ end
90
+
91
+ def setup_pre
92
+ # do nothing
93
+ end
94
+
95
+ def do_setup
96
+ setup_pre
97
+ @block[:setup].call if @block[:setup]
98
+ setup_post
99
+ end
100
+
101
+ def setup_post
102
+ @setup_done = true
103
+ end
104
+ private :setup_pre, :setup_post
105
+
106
+ # display
107
+ def set_display(&b)
108
+ return unless block_given?
109
+ @block[:display] = Proc.new
110
+ end
111
+
112
+ def set_display0(&b)
113
+ return unless block_given?
114
+ @block[:display0] = Proc.new
115
+ end
116
+
117
+ def check_display0
118
+ return ! @block[:display0].nil?
119
+ end
120
+
121
+ def display_pre
122
+ set_camera_position
123
+ check_event
124
+ clear
125
+ end
126
+
127
+ def do_display # callback
128
+ return if @setup_done.nil?
129
+ # return if @display_drawing
130
+ @display_drawing = true
131
+ display_pre
132
+ @block[:display].call if @block[:display]
133
+ display_post
134
+ @display_drawing = nil
135
+ end
136
+
137
+ def display_post
138
+ set_fullscreen_camera_position
139
+ cur_color = @cur_color
140
+ @block[:display0].call if @block[:display0]
141
+ color(*cur_color)
142
+ SDL.GLSwapBuffers
143
+ #GC.start
144
+ end
145
+ private :display_pre, :display_post
146
+
147
+ # mouse events
148
+ def set_mousedown(&b)
149
+ return unless block_given?
150
+ @block[:mousedown] = Proc.new
151
+ end
152
+
153
+ def do_mousedown
154
+ @mouseDown = 1
155
+ @block[:mousedown].call(@mouseX, @mouseY) if @block[:mousedown]
156
+ @block[:mousedown0].call(@mouseX0, @mouseY0) if @block[:mousedown0]
157
+ end
158
+
159
+ def set_mouseup(&b)
160
+ return unless block_given?
161
+ @block[:mouseup] = Proc.new
162
+ end
163
+
164
+ def do_mouseup
165
+ @mouseDown = 0
166
+ @block[:mouseup].call(@mouseX, @mouseY) if @block[:mouseup]
167
+ end
168
+
169
+ # mouse events for fullscreen
170
+ def set_mousedown0(&b)
171
+ return unless block_given?
172
+ @block[:mousedown0] = Proc.new
173
+ end
174
+
175
+ def check_mousedown0
176
+ return ! @block[:mousedown0].nil?
177
+ end
178
+
179
+ # key events
180
+ def set_keydown(&b)
181
+ return unless block_given?
182
+ @block[:keydown] = Proc.new
183
+ end
184
+
185
+ def keydown_pre(key)
186
+ exit if key == SDL::Key::ESCAPE
187
+ end
188
+ private :keydown_pre
189
+
190
+ def do_keydown(key)
191
+ keydown_pre(key)
192
+ @block[:keydown].call(key) if @block[:keydown]
193
+ end
194
+
195
+ def set_keyup(&b)
196
+ return unless block_given?
197
+ @block[:keyup] = Proc.new
198
+ end
199
+
200
+ def do_keyup(key)
201
+ @block[:keyup].call(key) if @block[:keyup]
202
+ end
203
+
204
+ def calc_keynum(e)
205
+ input = e.characters
206
+ @keynum = input.to_s[0]
207
+ end
208
+ private :calc_keynum
209
+
210
+ def mainloop_setup
211
+ do_setup
212
+ end
213
+
214
+ def mainloop
215
+ mainloop_setup
216
+ @starttime = Time.now
217
+ loop {
218
+ @begintime = Time.now
219
+ do_display
220
+ delay
221
+ return if check_runtime_finished(@starttime)
222
+ }
223
+ end
224
+
225
+ def delay
226
+ if @options[:framerate]
227
+ sec_per_frame = 1.0 / @options[:framerate]
228
+ diff = sec_per_frame - (Time.now - @begintime)
229
+ sleep(diff) if 0 < diff
230
+ else
231
+ delaytime = @options[:delaytime]
232
+ sleep(delaytime)
233
+ end
234
+ end
235
+ private :delay
236
+
237
+ def check_runtime_finished(starttime)
238
+ runtime = @options[:runtime]
239
+ return false if runtime.nil?
240
+ diff = Time.now - starttime
241
+ return (runtime && runtime < diff)
242
+ end
243
+ private :check_runtime_finished
244
+
245
+ # novice mode
246
+ def flip
247
+ @starttime = Time.now if @starttime.nil?
248
+ display_post
249
+ delay
250
+ display_pre
251
+ #exit if check_runtime_finished(@starttime)
252
+ end
253
+
254
+ def wait
255
+ #SGL.flip if !$__v__.flipped
256
+ loop {
257
+ check_event
258
+ delay
259
+ return if check_runtime_finished(@starttime)
260
+ }
261
+ end
262
+
263
+ def process(&b)
264
+ block = Proc.new
265
+ @starttime = Time.now
266
+ loop {
267
+ check_event
268
+ block.call
269
+ #yield
270
+ delay
271
+ return if check_runtime_finished(@starttime)
272
+ }
273
+ end
274
+
275
+ # check event
276
+ def check_event
277
+ x, y, l, m, r = SDL::Mouse.state
278
+ # x pos, y pos, left button, middle button, right button
279
+ @mouseX, @mouseY = calc_mouse_xy(x, y)
280
+ @mouseX0, @mouseY0 = calc_fullscreen_mouse_xy(x, y)
281
+ event = @sdl_event
282
+ while event.poll != 0
283
+ case event.type
284
+ when SDL::Event::MOUSEBUTTONDOWN
285
+ do_mousedown
286
+ when SDL::Event::MOUSEBUTTONUP
287
+ do_mouseup
288
+ when SDL::Event::KEYDOWN
289
+ @keynum = event.info[2]
290
+ do_keydown(@keynum)
291
+ when SDL::Event::KEYUP
292
+ @keynum = event.info[2]
293
+ do_keyup(@keynum)
294
+ when SDL::Event::QUIT
295
+ exit
296
+ end
297
+ end
298
+ end
299
+
300
+ def calc_mouse_xy(x, y)
301
+ if @options[:fullscreen]
302
+ w, h = @options[:fullscreen]
303
+ mx = @cameraX - (w / 2) + x
304
+ my = @cameraY - (h / 2) + (h - y)
305
+ else
306
+ mx = @left + x
307
+ my = @bottom + (@height - y)
308
+ end
309
+ return [mx, my]
310
+ end
311
+
312
+ def calc_fullscreen_mouse_xy(x, y)
313
+ if @options[:fullscreen]
314
+ w, h = @options[:fullscreen]
315
+ mx = - (w / 2) + x
316
+ my = - (h / 2) + (h - y)
317
+ else
318
+ mx = @left + x
319
+ my = @bottom + (@height - y)
320
+ end
321
+ return [mx, my]
322
+ end
323
+ private :check_event, :calc_mouse_xy, :calc_fullscreen_mouse_xy
324
+ end
325
+ end
@@ -0,0 +1,22 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ # module control
6
+ def useMidi() $__a__.useMidi; end
7
+ def useMidiIn(*a) $__a__.useMidiIn(*a) end
8
+
9
+ class Application
10
+ def useMidi
11
+ require "sgl/sgl-midi"
12
+ $__midi__ = SGLMidi.new
13
+ end
14
+
15
+ def useMidiIn(num = -1)
16
+ require "sgl/sgl-midiin"
17
+ printMidiDeviceNames
18
+ openMidiIn(num)
19
+ startMidiInThread
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,224 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ # window functions
6
+ def window(*a) $__a__.window(*a) end
7
+ def close_window() $__a__.close_window; end
8
+ def width() $__a__.width; end
9
+ def height() $__a__.height; end
10
+
11
+ # opengl special functions
12
+ def useFov(*a) $__a__.useFov(*a); end
13
+ def useDepth(*a) $__a__.useDepth(*a) end
14
+ def useSmooth(*a) $__a__.useSmooth(*a) end
15
+ def useCulling(*a) $__a__.useCulling(*a) end
16
+ def useFullscreen(*a) $__a__.useFullscreen(*a) end
17
+ alias useFullScreen useFullscreen
18
+ def useCursor(*a) $__a__.useCursor(*a) end
19
+
20
+ class Application
21
+ DEFAULT_WINDOW_WIDTH = 100
22
+ DEFAULT_WINDOW_HEIGHT = 100
23
+ DEFAULT_FULLSCREEN_WIDTH = 1024
24
+ DEFAULT_FULLSCREEN_HEIGHT = 768
25
+
26
+ def initialize_window
27
+ @width, @height = DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT
28
+ @left, @bottom, @right, @top = 0, 0, @width, @height
29
+ @cameraX, @cameraY, @cameraZ = 0, 0, 5
30
+ initialize_sdl
31
+ end
32
+
33
+ def initialize_sdl
34
+ SDL.init(SDL::INIT_VIDEO)
35
+ # Setting color size is important for Mac OS X.
36
+ SDL.setGLAttr(SDL::GL_RED_SIZE, 5)
37
+ SDL.setGLAttr(SDL::GL_GREEN_SIZE, 5)
38
+ SDL.setGLAttr(SDL::GL_BLUE_SIZE, 5)
39
+ SDL.setGLAttr(SDL::GL_DEPTH_SIZE, 16)
40
+ SDL.setGLAttr(SDL::GL_DOUBLEBUFFER, 1)
41
+ if !windows?
42
+ SDL.setVideoMode(640, 400, 16, SDL::OPENGL)
43
+ end
44
+ @sdl_event = SDL::Event.new
45
+ end
46
+ private :initialize_window, :initialize_sdl
47
+
48
+ def windows?
49
+ r = RUBY_PLATFORM
50
+ (r.index("cygwin") || r.index("mswin32") || r.index("mingw32")) != nil
51
+ end
52
+ private :windows?
53
+
54
+ # create window
55
+ def window(*a)
56
+ @options.update(a.pop) if a.last.is_a? Hash
57
+
58
+ if a.length == 4
59
+ @left, @bottom, @right, @top = a
60
+ elsif a.length == 2
61
+ @right, @top = a
62
+ @left = @bottom = 0
63
+ else
64
+ raise "error"
65
+ end
66
+
67
+ @width, @height = (@right - @left), (@top - @bottom)
68
+
69
+ # Do not initialize twice.
70
+ if ! defined?($__sgl_sdl_window_initialized__)
71
+ # sdl_window_init
72
+ mode = SDL::OPENGL
73
+ if @options[:fullscreen]
74
+ mode |= SDL::FULLSCREEN
75
+ w, h = @options[:fullscreen]
76
+ SDL.setVideoMode(w, h, 0, mode)
77
+ else
78
+ SDL.setVideoMode(@width, @height + 1, 0, mode) # why +1?
79
+ end
80
+ GC.start
81
+ SDL::WM.setCaption("sgl", "sgl")
82
+ $__sgl_sdl_window_initialized__ = true
83
+ end
84
+
85
+ # setCurosr
86
+ if @options[:cursor]
87
+ # You can use only black and white for cursor image.
88
+ file = @options[:cursor]
89
+ bmp = SDL::Surface.loadBMP(file) # Create surface from bitmap.
90
+ SDL::Mouse.setCursor(bmp, # bitmap
91
+ [255, 255, 255], # white
92
+ [ 0, 0, 0], # black
93
+ [128, 128, 128], # transparent
94
+ [100, 100, 100], # inverted
95
+ 8, 8) # hot_x, hot_y
96
+ end
97
+
98
+ # gl_init
99
+ if @options[:fullscreen]
100
+ set_fullscreen_position
101
+ else
102
+ set_window_position
103
+ end
104
+ set_camera_position
105
+ GL.Enable(GL::BLEND)
106
+ GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
107
+ GL.ShadeModel(GL::SMOOTH)
108
+ useDepth(@options[:depth])
109
+ useCulling(@options[:culling])
110
+ useSmooth(@options[:smooth])
111
+
112
+ background(0)
113
+ color(100)
114
+
115
+ check_event
116
+ end
117
+
118
+ def close_window
119
+ # do nothing for now
120
+ end
121
+
122
+ # get window size
123
+ attr_reader :width, :height
124
+
125
+ # world control methods
126
+ def useFov(f = 45)
127
+ @options[:fov] = f
128
+ end
129
+
130
+ def useDepth(a = true)
131
+ @options[:depth] = a
132
+ @options[:depth] ? GL.Enable(GL::DEPTH_TEST) : GL.Disable(GL::DEPTH_TEST)
133
+ end
134
+
135
+ def useSmooth(a = true)
136
+ @options[:smooth] = a
137
+ @options[:smooth] ?
138
+ GL.Enable(GL::LINE_SMOOTH) : GL.Disable(GL::LINE_SMOOTH)
139
+ end
140
+
141
+ def useCulling(a = true)
142
+ @options[:culling] = a
143
+ @options[:culling] ? GL.Enable(GL::CULL_FACE) : GL.Disable(GL::CULL_FACE)
144
+ end
145
+
146
+ def useFullscreen(w=DEFAULT_FULLSCREEN_WIDTH, h=DEFAULT_FULLSCREEN_HEIGHT)
147
+ if @options[:fullscreen].nil?
148
+ @options[:fullscreen] = (w.nil? || h.nil?) ? nil : [w, h]
149
+ end
150
+ end
151
+
152
+ def useCursor(bmpfile)
153
+ @options[:cursor] = bmpfile
154
+ end
155
+
156
+ def useDelay(sec)
157
+ @options[:delaytime] = sec
158
+ end
159
+
160
+ def useFramerate(f)
161
+ @options[:framerate] = f
162
+ end
163
+
164
+ def useRuntime(r)
165
+ @options[:runtime] = r
166
+ end
167
+
168
+ def runtime=(r)
169
+ useRuntime(r)
170
+ end
171
+
172
+ def set_window_position
173
+ @cameraX, @cameraY = ((@left + @right)/2), ((@bottom + @top)/2)
174
+ fov = @options[:fov]
175
+ @cameraZ = 1.0 +
176
+ @height / (2.0 * Math.tan(Math::PI * (fov/2.0) / 180.0))
177
+ GL.Viewport(0, 0, @width, @height)
178
+ GL.MatrixMode(GL::PROJECTION)
179
+ loadIdentity
180
+ GLU.Perspective(fov, @width/@height.to_f, @cameraZ * 0.1, @cameraZ * 10.0)
181
+ end
182
+
183
+ def set_fullscreen_position
184
+ cx, cy = ((@left + @right)/2), ((@bottom + @top)/2)
185
+ @cameraX, @cameraY = cx, cy
186
+ w, h = @options[:fullscreen]
187
+ fhw = w / 2 #fullscreen half width
188
+ fhh = h / 2 #fullscreen half height
189
+ left = cx - fhw
190
+ bottom = cy - fhh
191
+ right = cx + fhw
192
+ top = cy + fhh
193
+ GL.Viewport(0, 0, w, h)
194
+ GL.MatrixMode(GL::PROJECTION)
195
+ loadIdentity
196
+ fov = @options[:fov]
197
+ @cameraZ = 1.0 + h / (2.0 * Math.tan(Math::PI * (fov/2.0) / 180.0));
198
+ GLU.Perspective(fov, w/h.to_f, @cameraZ * 0.1, @cameraZ * 10.0)
199
+ end
200
+ private :set_window_position, :set_fullscreen_position
201
+
202
+ def set_camera_position
203
+ GL.MatrixMode(GL::MODELVIEW)
204
+ loadIdentity
205
+ GLU.LookAt(@cameraX, @cameraY, @cameraZ,
206
+ @cameraX, @cameraY, 0,
207
+ 0, 1, 0)
208
+ end
209
+
210
+ def set_fullscreen_camera_position
211
+ GL.MatrixMode(GL::MODELVIEW)
212
+ loadIdentity
213
+ GLU.LookAt(0, 0, @cameraZ,
214
+ 0, 0, 0,
215
+ 0, 1, 0)
216
+ end
217
+ private :set_camera_position, :set_fullscreen_camera_position
218
+
219
+ def loadIdentity
220
+ GL.LoadIdentity
221
+ end
222
+ private :loadIdentity
223
+ end
224
+ end
data/lib/sgl/opengl.rb ADDED
@@ -0,0 +1,7 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ require "sgl/opengl-app"
5
+
6
+ include SGL
7
+ $__a__ = Application.new
@@ -0,0 +1,61 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ $LOAD_PATH.unshift '..' if !$LOAD_PATH.include? '..'
5
+
6
+ module SGL
7
+ class RingArray < Array
8
+ alias get []
9
+
10
+ def [](nth)
11
+ nth %= length() if nth < 0 || length() <= nth
12
+ return get(nth)
13
+ end
14
+ end
15
+
16
+ class Timer
17
+ # starttime�b��ɏ��܂��āAendtime�b��ɏI��B
18
+ def initialize(st, et)
19
+ # begintime���J�n����
20
+ @bt = Time.now.to_f
21
+ @st,@et = @bt+st,@bt+et
22
+ @now = 0
23
+ @span = (@et - @st).to_f #p ['Timer', @bt, @st, @et, @span]
24
+ end
25
+
26
+ def count
27
+ @now = Time.now.to_f
28
+ end
29
+
30
+ # ���߂�0�ŁA���񂾂�1.0�ɂ����Â��Ă���
31
+ def ratio
32
+ count
33
+ return 0.0 if ! (@st <= @now)
34
+ return 1.0 if @et <= @now
35
+ return (@now - @st) / @span
36
+ end
37
+
38
+ def started?() count; @st <= @now end
39
+ def ended?() count; @et <= @now end
40
+ end
41
+ end
42
+
43
+ if $0 == __FILE__
44
+ require 'test/unit'
45
+ $__test_sgl__ = true
46
+ end
47
+
48
+ if defined?($__test_sgl__) && $__test_sgl__
49
+ class TestSglBasic < Test::Unit::TestCase #:nodoc:
50
+ def test_ring_array
51
+ t = SGL::RingArray.new
52
+ t[0], t[1], t[2] = 0, 1, 2
53
+ assert_equal([0, 1, 2, 0, 1, 2, 0, 1],
54
+ [t[-3], t[-2], t[-1], t[0], t[1], t[2], t[3], t[4]])
55
+ end
56
+
57
+ def test_timer
58
+ assert true
59
+ end
60
+ end
61
+ end