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,358 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ class ObjLib
5
+ START_CATEGORY = 1
6
+ START_NUMBER = 1
7
+
8
+ def initialize(c, n)
9
+ @cat = (c != nil) ? c.to_i : START_CATEGORY
10
+ @num = (n != nil) ? n.to_i : START_NUMBER
11
+
12
+ lines = [HexagonLines.new, PerpendicularLines.new, TangentLines.new, HomingLines.new, RandomFallLines.new,
13
+ NeonLines.new, RandomCageLines.new, TangeKenzoLines.new, BanShigeruLines.new, CircleLines.new]
14
+
15
+ colors = [LayeredCubes.new, ColorCircles.new, ColorfulGrids.new, RotateGrids.new, ColorSquares.new,
16
+ VerticalFields.new, MovingRects.new, TilingSquares.new, PackedCircles.new, GradationFields.new]
17
+
18
+ plants = [Ivies.new, TreeFields.new, Ivies.new, Ivies2.new, Ivies3.new]
19
+
20
+ gradations = [MeGrads.new, MeGrads.new]
21
+
22
+ #loops = [LoopGrids.new]
23
+
24
+ @lib = [[], lines, colors, plants, gradations]
25
+
26
+ @lx, @ly = nil, nil #��‘O��potision���Ƃ��Ă���
27
+ h, s, v = @lib[@cat][@num].background_color
28
+ @h = NumSpring.new(h, h, 10, 0.7)
29
+ @s = NumSpring.new(s, s, 10, 0.7)
30
+ @v = NumSpring.new(v, v, 10, 0.7)
31
+ Circle.make_list
32
+
33
+ change_stage(@cat, @num)
34
+ end
35
+
36
+ def onKeyDown(key)
37
+ if SDL::Key::K0 <= key && key <= SDL::Key::K9
38
+ key -= SDL::Key::K0
39
+ return if @lib[@cat][key] == nil
40
+ change_stage(@cat, key)
41
+ elsif SDL::Key::F1 <= key && key <= SDL::Key::F10
42
+ key -= (SDL::Key::F1-1)
43
+ return if @lib[key] == nil
44
+ return if @lib[key][1] == nil
45
+ change_stage(key, 1)
46
+ elsif key == SDL::Key::SPACE
47
+ fadeout
48
+ end
49
+ end
50
+
51
+ def onMouseDown(x, y)
52
+ @lib[@cat][@num].onMouseDown(x, y)
53
+ end
54
+
55
+ def onMouseUp(x, y)
56
+ @lib[@cat][@num].onMouseUp(x, y)
57
+ end
58
+
59
+ def change_stage(cat, num)
60
+ ocat, onum = @cat, @num
61
+ olib = @lib[@cat][@num]
62
+ olib.end_process()
63
+ @cat, @num = cat, num
64
+ lib = @lib[@cat][@num]
65
+ lib.start_process()
66
+ change_background_color
67
+ #category���ς��āA����lines����Ȃ���ΑS��fadeout
68
+ fadeout if ocat != @cat || @cat != 1
69
+ #fadeout if ocat != @cat || @cat != 1
70
+ #change_setup if @cat != 1
71
+ end
72
+
73
+ def change_background_color
74
+ h, s, v = @lib[@cat][@num].background_color
75
+ @h.moving = @s.moving = @v.moving = true
76
+ @h.target,@s.target,@v.target = h,s,v
77
+ end
78
+
79
+ def set_background_color
80
+ @h.move; @s.move; @v.move
81
+ backgroundHSV @h.x, @s.x, @v.x
82
+ end
83
+
84
+ def fadeout
85
+ @lib.each {|cat|
86
+ cat.each {|movement|
87
+ movement.fadeout
88
+ }
89
+ }
90
+ end
91
+
92
+ def display
93
+ mouse(mouseX, mouseY)
94
+ render()
95
+ end
96
+
97
+ def mouse(x, y)
98
+ @lib[@cat][@num].add(x, y, @lx, @ly) unless @lx == nil || @ly == nil
99
+ @lx,@ly = x,y #remember last potision
100
+ end
101
+
102
+ def render
103
+ set_background_color
104
+ @lib.each_index {|c|
105
+ cat = @lib[c]
106
+ cat.each_index {|n|
107
+ lib = @lib[c][n]
108
+ next if lib == nil
109
+ next if ! lib.running
110
+ lib.move
111
+ lib.render
112
+ }
113
+ }
114
+ end
115
+ end
116
+
117
+ # ����Obj��100�•ۗL����N���X
118
+ class Objs
119
+ MAX = 100
120
+ def initialize(orgclass, max = MAX)
121
+ @orgclass, @max = orgclass, max
122
+ @a = []
123
+ @max.times {|i|
124
+ @a[i] = @orgclass.dup
125
+ @a[i].index = i
126
+ @a[i].enable = false
127
+ }
128
+ @cur = 0
129
+ @running = false
130
+ @background_color = [66,100,20] # R0,G0,B20�A����
131
+ @top = height/2
132
+ @bottom = -@top
133
+ @right = width/2
134
+ @left = -@right
135
+ end
136
+
137
+ attr_reader :background_color
138
+ attr_reader :a, :running, :max, :cur
139
+
140
+ def start_process
141
+ useDepth(false)
142
+ useCulling(false)
143
+ useFov(45)
144
+ @running = true
145
+ end
146
+
147
+ def end_process
148
+ fadeout
149
+ @running = false
150
+ end
151
+
152
+ def onMouseDown(x, y)
153
+ end
154
+
155
+ def onMouseUp(x, y)
156
+ end
157
+
158
+ def add(x, y, lx, ly)
159
+ len = V2.length(x - lx, y - ly)
160
+ if @a[@cur].enable == true
161
+ @a[@cur].end_process
162
+ end
163
+ @a[@cur].init(self, x, y, lx, ly)
164
+ @a[@cur].start_process()
165
+ @a[@cur].enable = false if len < 3
166
+ @cur += 1
167
+ @cur = 0 if @max <= @cur
168
+ @running = true
169
+ #p [@cur, x, y, lx, ly]
170
+ end
171
+
172
+ def fadeout
173
+ @a.each {|m|
174
+ m.fadeout
175
+ }
176
+ end
177
+
178
+ def move
179
+ index = @cur
180
+ @a.each_index {
181
+ m = @a[index]
182
+ m.move if m.enable
183
+ index += 1
184
+ index = 0 if @max <= index
185
+ }
186
+ end
187
+
188
+ def render
189
+ r = false
190
+ index = @cur
191
+ @a.each_index {
192
+ m = @a[index]
193
+ if m.enable
194
+ m.render
195
+ r = true
196
+ end
197
+ index += 1
198
+ index = 0 if @max <= index
199
+ }
200
+ @running = r
201
+ end
202
+ end
203
+
204
+ class Obj
205
+ START_FADEOUT = 20
206
+
207
+ def initialize
208
+ @dx1,@dy1,@dx2,@dy2 = 0,0,0,0
209
+ @ttl = 0
210
+ @start_fadeout = START_FADEOUT
211
+ @enable = true
212
+ @index = 0
213
+ @top = height/2
214
+ @bottom = -@top
215
+ @right = width/2
216
+ @left = -@right
217
+ end
218
+
219
+ def init(lib, x1, y1, x2, y2)
220
+ @lib,@x1,@y1,@x2,@y2 = lib, x1, y1, x2, y2
221
+ @dx1,@dy1,@dx2,@dy2 = x1, y1, x2, y2 # �����l
222
+ @cx = (x1+x2)/2
223
+ @cy = (y1+y2)/2
224
+ @dcx,@dcy = @cx,@cy
225
+ @enable = true
226
+ @ttl = @lib.max
227
+ @sound = ObjSound.new('wav/start.wav')
228
+ end
229
+
230
+ def start_process
231
+ end
232
+
233
+ def end_process
234
+ end
235
+
236
+ attr_reader :x1, :y1, :dx1, :dy1
237
+ attr_accessor :enable, :index
238
+
239
+ def inspect() sprintf("[%d,%d-%d,%d]",@x1,@y1,@x2,@y2) end
240
+
241
+ def length() V2.length(@x1-@x2, @y1-@y2) end
242
+
243
+ def move() end
244
+
245
+ def fadeout
246
+ @ttl = @start_fadeout if @start_fadeout < @ttl
247
+ end
248
+
249
+ def render
250
+ if @ttl <= 0
251
+ @enable = false
252
+ return
253
+ end
254
+ @ttl -= 1
255
+ alpha = 100
256
+ alpha = @ttl * 100 / @start_fadeout if @ttl < @start_fadeout
257
+ renderObj(alpha)
258
+ end
259
+
260
+ def renderObj(alpha)
261
+ end
262
+
263
+ def playXY(alpha)
264
+ end
265
+
266
+ def colorline(x1, y1, x2, y2, h, s, v, sa, ea)
267
+ beginObj(LINES)
268
+ colorHSV h, s, v, sa
269
+ vertex x1, y1
270
+ colorHSV h, s, v, ea
271
+ vertex x2, y2
272
+ endObj
273
+ end
274
+
275
+ def randVector(r)
276
+ rad = deg2rad(rand(360)) #360�x�̂ǂ����������͗����ł���ƁB
277
+ c = Math.cos(rad) * r
278
+ s = Math.sin(rad) * r
279
+ [c, s]
280
+ end
281
+ end
282
+
283
+ class ObjSound
284
+ def initialize(file, base=60, span=4)
285
+ @filename = file
286
+ @samp = loadSound(file) #@samp = Sample.new(file)
287
+ @samp.base = base
288
+ @count = 0
289
+ @span = span
290
+ end
291
+
292
+ def inspect
293
+ "#{@filename} #{@samp.base} #{@span}"
294
+ end
295
+
296
+ def play(note, volume, pan)
297
+ @count += 1
298
+ if @span < @count
299
+ @count = 0
300
+ #p [self, note, volume, pan]
301
+ @samp.playNote(note, volume, pan)
302
+ end
303
+ end
304
+ end
305
+
306
+ # �O�Տ�
307
+ class TrailFields < Objs
308
+ def initialize(orgclass, max=MAX)
309
+ super(orgclass, max)
310
+ @a = []
311
+ @cur_trail = nil
312
+ onMouseDown(0, 0)
313
+ end
314
+
315
+ attr_reader :a
316
+
317
+ def onMouseDown(x, y)
318
+ @cur_trail = @orgclass.dup
319
+ @cur_trail.init(self, x, y, x, y)
320
+ @a << @cur_trail
321
+ @a.shift if @max < @a.length
322
+ end
323
+
324
+ def onMouseUp(x, y)
325
+ @cur_trail.start_trail_process
326
+ end
327
+
328
+ def add(x, y, lx, ly)
329
+ len = V2.length(x - lx, y - ly)
330
+ if len != 0
331
+ @cur_trail.add_trail(x, y, lx, ly, len)
332
+ else
333
+ onMouseUp(x, y)
334
+ onMouseDown(x, y)
335
+ end
336
+ @running = true
337
+ end
338
+
339
+ def move
340
+ @a.each {|m|
341
+ m.move if m.enable
342
+ }
343
+ end
344
+
345
+ def render
346
+ r = false
347
+ @a.each {|m|
348
+ if m.enable
349
+ m.render
350
+ r = true
351
+ end
352
+ }
353
+ @running = r
354
+ end
355
+ end
356
+
357
+ class TrailField < Obj
358
+ end
@@ -0,0 +1,38 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ require "sdl"
5
+ require "opengl"
6
+ require "sgl/sgl-color"
7
+ require "sgl/opengl-window"
8
+ require "sgl/opengl-color"
9
+ require "sgl/opengl-event"
10
+ require "sgl/opengl-draw"
11
+ require "sgl/sgl-sound"
12
+
13
+ module SGL
14
+ class Application
15
+ def initialize
16
+ Thread.abort_on_exception = true
17
+ @options = default_options
18
+ initialize_window # opengl-window.rb
19
+ initialize_color # sgl-color.rb
20
+ initialize_event # opengl-event.rb
21
+ end
22
+
23
+ def default_options
24
+ {
25
+ :fullscreen=>nil,
26
+ :fov=>45,
27
+ :cursor=>nil,
28
+ :depth=>false,
29
+ :culling=>false,
30
+ :smooth=>false,
31
+ :delaytime=>1.0/60,
32
+ :framerate=>nil,
33
+ :runtime=>nil,
34
+ }
35
+ end
36
+ private :default_options
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ def background(*a) $__a__.background(*a) end
6
+ def backgroundHSV(*a) $__a__.backgroundHSV(*a) end
7
+ def color(*a) $__a__.color(*a) end
8
+ def colorHSV(*a) $__a__.colorHSV(*a) end
9
+
10
+ class Application
11
+ def initialize_color
12
+ @bg_color = @cur_color = nil
13
+ @rgb = ColorTranslatorRGB.new(100, 100, 100, 100)
14
+ @hsv = ColorTranslatorHSV.new(100, 100, 100, 100)
15
+ end
16
+ private :initialize_color
17
+
18
+ attr_reader :cur_color # for test
19
+
20
+ def background(x, y = nil, z = nil, a = nil)
21
+ GL.ClearColor(*@rgb.norm(x, y, z, a))
22
+ clear
23
+ end
24
+
25
+ def backgroundHSV(x, y = nil, z = nil, a = nil)
26
+ GL.ClearColor(*@hsv.norm(x, y, z, a))
27
+ clear
28
+ end
29
+
30
+ def clear
31
+ GL.Clear(GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT)
32
+ end
33
+ private :clear
34
+
35
+ def color(x, y = nil, z = nil, a = nil)
36
+ @cur_color = [x, y, z, a]
37
+ GL.Color(*@rgb.norm(x, y, z, a))
38
+ end
39
+
40
+ def colorHSV(x, y = nil, z = nil, a = nil)
41
+ GL.Color(*@hsv.norm(x, y, z, a))
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,260 @@
1
+ # Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
2
+ # License: Ruby License
3
+
4
+ module SGL
5
+ LINES = GL::LINES
6
+ POINTS = GL::POINTS
7
+ LINE_STRIP = GL::LINE_STRIP
8
+ LINE_LOOP = GL::LINE_LOOP
9
+ TRIANGLES = GL::TRIANGLES
10
+ TRIANGLE_STRIP = GL::TRIANGLE_STRIP
11
+ TRIANGLE_FAN = GL::TRIANGLE_FAN
12
+ QUADS = GL::QUADS
13
+ QUAD_STRIP = GL::QUAD_STRIP
14
+ POLYGON = GL::POLYGON
15
+
16
+ # draw
17
+ def beginObj(*a) $__a__.beginObj(*a) end
18
+ def endObj(*a) $__a__.endObj(*a) end
19
+ def push(*a) $__a__.push(*a) end
20
+ def pop(*a) $__a__.pop(*a) end
21
+ def vertex(*a) $__a__.vertex(*a) end
22
+ def normal(*a) $__a__.normal(*a) end
23
+ def translate(*a) $__a__.translate(*a) end
24
+ def rotateX(*a) $__a__.rotateX(*a) end
25
+ def rotateY(*a) $__a__.rotateY(*a) end
26
+ def rotateZ(*a) $__a__.rotateZ(*a) end
27
+ def scale(*a) $__a__.scale(*a) end
28
+ def point(*a) $__a__.point(*a) end
29
+ def lineWidth(*a) $__a__.lineWidth(*a) end
30
+ def line(*a) $__a__.line(*a) end
31
+ def rect(*a) $__a__.rect(*a) end
32
+ def triangle(*a) $__a__.triangle(*a) end
33
+ def circle(*a) $__a__.circle(*a) end
34
+ def box(*a) $__a__.box(*a) end
35
+ def cube(*a) $__a__.cube(*a) end
36
+
37
+ class Application
38
+ LINES = GL::LINES
39
+ POINTS = GL::POINTS
40
+ LINE_STRIP = GL::LINE_STRIP
41
+ LINE_LOOP = GL::LINE_LOOP
42
+ TRIANGLES = GL::TRIANGLES
43
+ TRIANGLE_STRIP = GL::TRIANGLE_STRIP
44
+ TRIANGLE_FAN = GL::TRIANGLE_FAN
45
+ QUADS = GL::QUADS
46
+ QUAD_STRIP = GL::QUAD_STRIP
47
+ POLYGON = GL::POLYGON
48
+
49
+ # draw primitive
50
+ def beginObj(mode = POLYGON)
51
+ GL.Begin(mode)
52
+ end
53
+
54
+ def endObj
55
+ GL.End
56
+ end
57
+
58
+ def push
59
+ GL.PushMatrix
60
+ end
61
+
62
+ def pop
63
+ GL.PopMatrix
64
+ end
65
+
66
+ def vertex(a, b = nil, c = nil, d = nil)
67
+ GL.Vertex(a, b, c, d) if d
68
+ GL.Vertex(a, b, c) if c
69
+ GL.Vertex(a, b)
70
+ end
71
+
72
+ def normal(a, b = nil, c = nil)
73
+ GL.Normal(a, b, c)
74
+ end
75
+
76
+ # matrix manipulation
77
+ def translate(a, b, c = 0)
78
+ GL.Translate(a, b, c)
79
+ end
80
+
81
+ def rotateX(a)
82
+ GL.Rotate(a, 1, 0, 0)
83
+ end
84
+
85
+ def rotateY(a)
86
+ GL.Rotate(a, 0, 1, 0)
87
+ end
88
+
89
+ def rotateZ(a)
90
+ GL.Rotate(a, 0, 0, 1)
91
+ end
92
+
93
+ def scale(a)
94
+ GL.Scale(a, a, a)
95
+ end
96
+
97
+ # simple draw
98
+ def point(a, b, c = nil)
99
+ GL.Begin(GL::POINTS)
100
+ if c
101
+ GL.Vertex(a, b, c)
102
+ else
103
+ GL.Vertex(a, b)
104
+ end
105
+ GL.End
106
+ end
107
+
108
+ def lineWidth(w)
109
+ GL.LineWidth(w)
110
+ end
111
+
112
+ def line(a, b, c, d, e = nil, f = nil)
113
+ GL.Begin(GL::LINES)
114
+ if e && f
115
+ GL.Vertex(a, b, c) # 3D
116
+ GL.Vertex(d, e, f)
117
+ else
118
+ GL.Vertex(a, b) # 2D
119
+ GL.Vertex(c, d)
120
+ end
121
+ GL.End
122
+ end
123
+
124
+ def rect(a, b, c, d)
125
+ GL.Rect(a, b, c, d)
126
+ end
127
+
128
+ def triangle(a, b, c, d, e, f)
129
+ GL.Begin(GL::TRIANGLES)
130
+ GL.Vertex(a, b)
131
+ GL.Vertex(c, d)
132
+ GL.Vertex(e, f)
133
+ GL.End
134
+ end
135
+
136
+ def circleUnit(style = LINE_LOOP, div = nil)
137
+ div = 32 if div.nil?
138
+ e = 2 * Math::PI / div
139
+ GL.Begin(style)
140
+ div.times {|i|
141
+ rad = i * e
142
+ x = Math.cos(rad)
143
+ y = Math.sin(rad)
144
+ GL.Vertex(x, y)
145
+ }
146
+ GL.End
147
+ end
148
+ private :circleUnit
149
+
150
+ def circle(x, y, r, style = LINE_LOOP, div = nil)
151
+ GL.PushMatrix
152
+ GL.Translate(x, y, 0)
153
+ GL.Scale(r, r, r)
154
+ circleUnit(style, div)
155
+ GL.PopMatrix
156
+ end
157
+
158
+ def box(x1, y1, z1, x2, y2, z2)
159
+ box = [
160
+ [x1, y1, z1], # 0 back left bottom
161
+ [x2, y1, z1], # 1 back right bottom
162
+ [x2, y2, z1], # 2 back right top
163
+ [x1, y2, z1], # 3 back left top
164
+ [x1, y1, z2], # 4 front left bottom
165
+ [x2, y1, z2], # 5 front right bottom
166
+ [x2, y2, z2], # 6 front right top
167
+ [x1, y2, z2] # 7 front left top
168
+ ]
169
+ GL.Begin(GL::QUADS)
170
+ GL.Vertex(box[1]) # back
171
+ GL.Vertex(box[0])
172
+ GL.Vertex(box[3])
173
+ GL.Vertex(box[2])
174
+ GL.Vertex(box[0]) # left
175
+ GL.Vertex(box[4])
176
+ GL.Vertex(box[7])
177
+ GL.Vertex(box[3])
178
+ GL.Vertex(box[4]) # front
179
+ GL.Vertex(box[5])
180
+ GL.Vertex(box[6])
181
+ GL.Vertex(box[7])
182
+ GL.Vertex(box[5]) # right
183
+ GL.Vertex(box[1])
184
+ GL.Vertex(box[2])
185
+ GL.Vertex(box[6])
186
+ GL.Vertex(box[7]) # top
187
+ GL.Vertex(box[6])
188
+ GL.Vertex(box[2])
189
+ GL.Vertex(box[3])
190
+ GL.Vertex(box[0]) # bottom
191
+ GL.Vertex(box[1])
192
+ GL.Vertex(box[5])
193
+ GL.Vertex(box[4])
194
+ GL.End
195
+ end
196
+
197
+ def cube(x, y, z, s)
198
+ s = s / 2
199
+ box(x - s, y - s, z - s, x + s, y + s, z + s)
200
+ end
201
+ end
202
+
203
+ # This class is not used for now.
204
+ class FasterCircle
205
+ # circle
206
+ def self.circleUnit(style=LINE_LOOP, div=nil)
207
+ div = 32 if div == nil
208
+ e = 2 * Math::PI / div
209
+ beginObj(style)
210
+ div.times {|i|
211
+ rad = i * e
212
+ x = Math.cos(rad)
213
+ y = Math.sin(rad)
214
+ vertex(x, y)
215
+ }
216
+ endObj()
217
+ end
218
+
219
+ def self.make_list
220
+ GL.NewList(1, GL::COMPILE)
221
+ self.circleUnit(LINE_LOOP, 32)
222
+ GL.EndList()
223
+ GL.NewList(2, GL::COMPILE)
224
+ self.circleUnit(POLYGON, 32)
225
+ GL.EndList()
226
+ GL.NewList(3, GL::COMPILE)
227
+ self.circleUnit(LINE_LOOP, 6)
228
+ GL.EndList()
229
+ GL.NewList(4, GL::COMPILE)
230
+ self.circleUnit(POLYGON, 6)
231
+ GL.EndList()
232
+ end
233
+
234
+ def self.circleUnitList(style=LINE_LOOP, div=nil)
235
+ if div == 32
236
+ if style == LINE_LOOP
237
+ GL.CallList(1)
238
+ elsif style == POLYGON
239
+ GL.CallList(2)
240
+ end
241
+ elsif div == 6
242
+ if style == LINE_LOOP
243
+ GL.CallList(3)
244
+ elsif style == POLYGON
245
+ GL.CallList(4)
246
+ end
247
+ end
248
+ end
249
+
250
+ def self.circle(x, y, r, style=LINE_LOOP, div=nil)
251
+ push()
252
+ translate(x, y)
253
+ scale(r)
254
+ #circleUnit(style, div)
255
+ self.circleUnitList(style, div)
256
+ pop()
257
+ end
258
+ end
259
+
260
+ end