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.
- data/ChangeLog +234 -0
- data/Manifest.txt +94 -0
- data/Rakefile +16 -5
- data/examples/cocoa1-basic.rb +14 -0
- data/examples/cocoa10-transparent.rb +26 -0
- data/examples/cocoa11-application.rb +13 -0
- data/examples/cocoa2-draw.rb +23 -0
- data/examples/cocoa3-affine.rb +29 -0
- data/examples/cocoa4-font.rb +24 -0
- data/examples/cocoa5-image.rb +22 -0
- data/examples/cocoa6-sound.rb +24 -0
- data/examples/cocoa7-movie.rb +40 -0
- data/examples/cocoa8-movieoverlay.rb +42 -0
- data/examples/cocoa9-streaming.rb +40 -0
- data/examples/opengl1-basic.rb +14 -0
- data/examples/opengl11-application.rb +13 -0
- data/examples/opengl2-draw.rb +23 -0
- data/examples/opengl3-affine.rb +29 -0
- data/examples/sample1.rb +11 -0
- data/examples/sample10.rb +16 -0
- data/examples/sample11.rb +22 -0
- data/examples/sample11a.rb +33 -0
- data/examples/sample12.rb +30 -0
- data/examples/sample12a.rb +35 -0
- data/examples/sample13.rb +116 -0
- data/examples/sample15.rb +24 -0
- data/examples/sample16.rb +31 -0
- data/examples/sample16a.rb +35 -0
- data/examples/sample6.rb +18 -0
- data/examples/sample7.rb +16 -0
- data/examples/sample9.rb +20 -0
- data/examples/sgl-sound1.rb +6 -0
- data/examples/sgl-sound2.rb +19 -0
- data/examples/sine.ogg +0 -0
- data/examples/testgl.rb +169 -0
- data/lib/sgl/bass-api.rb +202 -0
- data/lib/sgl/bass-sample.rb +106 -0
- data/lib/sgl/bass.rb +46 -0
- data/lib/sgl/cocoa-app.rb +43 -0
- data/lib/sgl/cocoa-color.rb +65 -0
- data/lib/sgl/cocoa-draw.rb +72 -0
- data/lib/sgl/cocoa-event.rb +229 -0
- data/lib/sgl/cocoa-media.rb +144 -0
- data/lib/sgl/cocoa-notuse.rb +493 -0
- data/lib/sgl/cocoa-window.rb +203 -0
- data/lib/sgl/cocoa.rb +8 -0
- data/lib/sgl/notuse-objs.rb +358 -0
- data/lib/sgl/opengl-app.rb +38 -0
- data/lib/sgl/opengl-color.rb +44 -0
- data/lib/sgl/opengl-draw.rb +260 -0
- data/lib/sgl/opengl-event.rb +325 -0
- data/lib/sgl/opengl-modules.rb +22 -0
- data/lib/sgl/opengl-window.rb +224 -0
- data/lib/sgl/opengl.rb +7 -0
- data/lib/sgl/sgl-basic.rb +61 -0
- data/lib/sgl/sgl-button.rb +135 -0
- data/lib/sgl/sgl-client.rb +21 -0
- data/lib/sgl/sgl-color.rb +82 -0
- data/lib/sgl/sgl-connect.rb +9 -0
- data/lib/sgl/sgl-objlib.rb +0 -0
- data/lib/sgl/sgl-objs.rb +0 -0
- data/lib/sgl/sgl-server.rb +58 -0
- data/lib/sgl/sgl-sound.rb +24 -0
- data/lib/sgl/sgl-spring.rb +216 -0
- data/lib/sgl/sgl-timer.rb +72 -0
- data/lib/sgl/sgl.rb +5 -0
- data/lib/sgl/version.rb +2 -2
- data/scripts/makemanifest.rb +20 -0
- data/test/test_bass.rb +27 -0
- data/test/test_cocoa_app.rb +5 -5
- data/test/test_helper.rb +9 -1
- data/test/test_module_ruby16.rb +22 -21
- data/test/test_opengl_app.rb +4 -5
- data/test/test_opengl_basic.rb +3 -4
- data/test/test_opengl_fullscreen.rb +4 -6
- data/test/test_opengl_novice.rb +3 -6
- data/test/test_sgl.rb +4 -27
- data/test/test_sound.rb +15 -0
- data/website/challenge1.html +91 -0
- data/website/challenge1.txt +30 -0
- data/website/challenge2.html +144 -0
- data/website/challenge2.txt +73 -0
- data/website/challenge3.html +63 -0
- data/website/challenge3.txt +15 -0
- data/website/cocoa.html +88 -0
- data/website/cocoa.txt +35 -0
- data/website/description.html +138 -0
- data/website/description.txt +90 -0
- data/website/exercise1.html +264 -0
- data/website/exercise1.txt +192 -0
- data/website/exercise2.html +683 -0
- data/website/exercise2.txt +597 -0
- data/website/exhibition.html +84 -0
- data/website/exhibition.txt +24 -0
- data/website/howto.html +134 -0
- data/website/howto.txt +56 -0
- data/website/index.html +17 -9
- data/website/index.txt +13 -4
- data/website/sound.html +141 -0
- data/website/sound.txt +87 -0
- data/website/stylesheets/grade.png +0 -0
- data/website/stylesheets/screen.css +21 -20
- metadata +109 -3
@@ -0,0 +1,135 @@
|
|
1
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
2
|
+
# License: Ruby License
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift("..") if !$LOAD_PATH.include?("..")
|
5
|
+
require "sgl/opengl"
|
6
|
+
require "sgl/sgl-spring"
|
7
|
+
|
8
|
+
class Button
|
9
|
+
def initialize(x, y)
|
10
|
+
@dx, @dy = x, y
|
11
|
+
@x, @y = x, y
|
12
|
+
@w, @h = 8, 8
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :x, :y
|
16
|
+
|
17
|
+
def pos
|
18
|
+
return [x, y]
|
19
|
+
end
|
20
|
+
|
21
|
+
def move_to(x, y)
|
22
|
+
@x, @y = x, y
|
23
|
+
end
|
24
|
+
|
25
|
+
def draw(s)
|
26
|
+
colorHSV(0, s, 100, 60)
|
27
|
+
draw_rect(@w, @h)
|
28
|
+
colorHSV(0, s, 0, 30)
|
29
|
+
draw_rect(@w-1, @h-1)
|
30
|
+
end
|
31
|
+
|
32
|
+
def draw_rect(w, h)
|
33
|
+
rect(@x-w, @y-h, @x+w, @y+h)
|
34
|
+
end
|
35
|
+
|
36
|
+
def inside?(x, y)
|
37
|
+
(@x-@w) < x && x < (@x+@w) && (@y-@h) < y && y < (@y+@h)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class ButtonColumn
|
42
|
+
def initialize(length, dy, hy)
|
43
|
+
@length, @dy, @hy = length, dy, hy #destination y and hide y
|
44
|
+
@cur = 0
|
45
|
+
@buttons = []
|
46
|
+
@y_spring = NumSpring.new(@dy, @dy, 5, 0.6)
|
47
|
+
make_buttons
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :y_spring
|
51
|
+
attr_accessor :cur
|
52
|
+
|
53
|
+
def make_buttons
|
54
|
+
y = @y_spring.x
|
55
|
+
sw = 46
|
56
|
+
w = 0
|
57
|
+
@length.times {
|
58
|
+
@buttons << Button.new(0, y)
|
59
|
+
w += sw
|
60
|
+
}
|
61
|
+
x = -w/2
|
62
|
+
@buttons.each {|b|
|
63
|
+
b.x = x
|
64
|
+
x += sw
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
def move(x, y)
|
69
|
+
# @y_spring.target = y.abs < (768/2 - 120) ? @hy : @dy
|
70
|
+
#if y.abs < (768/2 - 120)
|
71
|
+
if (@dy - y).abs < 50
|
72
|
+
@y_spring.target = @dy
|
73
|
+
else
|
74
|
+
@y_spring.target = @hy
|
75
|
+
end
|
76
|
+
@y_spring.moving = true
|
77
|
+
@y_spring.move
|
78
|
+
y = @y_spring.x
|
79
|
+
@buttons.each {|b|
|
80
|
+
b.y = y
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
def draw
|
85
|
+
@buttons.each_index {|i|
|
86
|
+
b = @buttons[i]
|
87
|
+
s = (@cur == i) ? 100 : 0
|
88
|
+
b.draw(s)
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
def onMouseDown(x, y)
|
93
|
+
@buttons.each_index {|i|
|
94
|
+
b = @buttons[i]
|
95
|
+
if b.inside?(x, y)
|
96
|
+
@cur = i
|
97
|
+
return i
|
98
|
+
end
|
99
|
+
}
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if $0 == __FILE__
|
105
|
+
require "test/unit"
|
106
|
+
$__test_sgl__ = true
|
107
|
+
end
|
108
|
+
|
109
|
+
if defined?($__test_sgl__) && $__test_sgl__
|
110
|
+
class TestSglButton < Test::Unit::TestCase #:nodoc:
|
111
|
+
def test_button
|
112
|
+
b = Button.new(1, 2)
|
113
|
+
assert_equal(1, b.x)
|
114
|
+
assert_equal(2, b.y)
|
115
|
+
assert_equal([1, 2], b.pos)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_draw
|
119
|
+
app = SGL::Application.new
|
120
|
+
app.set_setup {
|
121
|
+
app.window(100, 100)
|
122
|
+
app.runtime = 0.1
|
123
|
+
}
|
124
|
+
i = 0
|
125
|
+
button = Button.new(0, 0)
|
126
|
+
app.set_display {
|
127
|
+
button.move_to(i, i)
|
128
|
+
button.draw(i)
|
129
|
+
i += 5
|
130
|
+
i = 0 if 100 < i
|
131
|
+
}
|
132
|
+
app.mainloop
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
3
|
+
# License: Ruby License
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift("..") if !$LOAD_PATH.include?("..")
|
6
|
+
require "sgl/sgl-connect"
|
7
|
+
|
8
|
+
module Sgl
|
9
|
+
class Client
|
10
|
+
def self.main(argv)
|
11
|
+
uri = ARGV.shift
|
12
|
+
there = DRbObject.new_with_uri(uri)
|
13
|
+
there.puts('Hello, World.')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
if $0 == __FILE__
|
19
|
+
require "test/unit"
|
20
|
+
Sgl::Client.main(ARGV)
|
21
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
3
|
+
# License: Ruby License
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift("..") if !$LOAD_PATH.include?("..")
|
6
|
+
|
7
|
+
module SGL
|
8
|
+
RGB = 0
|
9
|
+
HSV = 1
|
10
|
+
DEFAULT_MAX = 100
|
11
|
+
|
12
|
+
class ColorTranslatorRGB
|
13
|
+
def initialize(r=nil, g=nil, b=nil, a=nil)
|
14
|
+
a = DEFAULT_MAX if a == nil
|
15
|
+
r = DEFAULT_MAX if r == nil
|
16
|
+
g = b = r if g == nil || b == nil
|
17
|
+
@rm, @gm, @bm, @am = r.to_f, g.to_f, b.to_f, a.to_f
|
18
|
+
end
|
19
|
+
|
20
|
+
def norm(r, g=nil, b=nil, a=nil)
|
21
|
+
a = DEFAULT_MAX if a == nil
|
22
|
+
g = b = r if g == nil || b == nil
|
23
|
+
return [r/@rm, g/@gm, b/@bm, a/@am]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class ColorTranslatorHSV
|
28
|
+
def initialize(h=nil, s=nil, v=nil, a=nil)
|
29
|
+
a = DEFAULT_MAX if a == nil
|
30
|
+
h = DEFAULT_MAX if h == nil
|
31
|
+
s = v = h if s == nil || v == nil
|
32
|
+
@hm, @sm, @vm, @am = h.to_f, s.to_f, v.to_f, a.to_f
|
33
|
+
end
|
34
|
+
|
35
|
+
def norm(h, s=nil, v=nil, a=nil)
|
36
|
+
if h < 0
|
37
|
+
base = (h.abs / @hm).to_i + 1
|
38
|
+
h += (base * @hm).to_f
|
39
|
+
end
|
40
|
+
h = (h % @hm) if @hm < h
|
41
|
+
a = DEFAULT_MAX if a == nil
|
42
|
+
s = v = h if s == nil || v == nil
|
43
|
+
r, g, b = hsv_to_rgb(360.0*h/@hm, s/@sm, v/@vm)
|
44
|
+
return [r, g, b, a/@am]
|
45
|
+
end
|
46
|
+
|
47
|
+
def hsv_to_rgb(h, s, v) #h:[0-360] s,v:[0,1], r,g,b:[0,1]
|
48
|
+
return v, v, v if s == 0.0
|
49
|
+
h = 0 if h == 360
|
50
|
+
h /= 60.0 #h is now [0,6)
|
51
|
+
i = h.to_i
|
52
|
+
f = (h-i).to_f
|
53
|
+
pp = v * (1-s)
|
54
|
+
q = v * (1-(s*f))
|
55
|
+
t = v * (1-(s*(1-f)))
|
56
|
+
#p [h,s,v, i, f, pp, q, t]
|
57
|
+
case i
|
58
|
+
when 0; return v, t, pp
|
59
|
+
when 1; return q, v, pp
|
60
|
+
when 2; return pp, v, t
|
61
|
+
when 3; return pp, q, v
|
62
|
+
when 4; return t, pp, v
|
63
|
+
when 5; return v, pp, q
|
64
|
+
end
|
65
|
+
return 0, 0, 0
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
if $0 == __FILE__
|
71
|
+
require "test/unit"
|
72
|
+
$__test_sgl__ = true
|
73
|
+
end
|
74
|
+
|
75
|
+
if defined?($__test_sgl__) && $__test_sgl__
|
76
|
+
class TestSglColor_SglColor < Test::Unit::TestCase #:nodoc:
|
77
|
+
def test_all
|
78
|
+
rgb = SGL::ColorTranslatorRGB.new(100, 100, 100, 100)
|
79
|
+
assert_equal([1.0, 1.0, 1.0, 1.0], rgb.norm(100, 100, 100))
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
File without changes
|
data/lib/sgl/sgl-objs.rb
ADDED
File without changes
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
3
|
+
# License: Ruby License
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift("..") if !$LOAD_PATH.include?("..")
|
6
|
+
require "sgl/sgl-connect"
|
7
|
+
|
8
|
+
module Sgl
|
9
|
+
class Puts
|
10
|
+
def initialize(stream=$stdout)
|
11
|
+
stream.sync = true
|
12
|
+
@stream = stream
|
13
|
+
end
|
14
|
+
|
15
|
+
def puts(str)
|
16
|
+
@stream.puts(str)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Server
|
21
|
+
def self.main(argv)
|
22
|
+
server = self.new
|
23
|
+
server.run
|
24
|
+
end
|
25
|
+
|
26
|
+
def run(duration=0)
|
27
|
+
uri = DEFAULT_URI
|
28
|
+
DRb.start_service(uri, Puts.new)
|
29
|
+
puts DRb.uri
|
30
|
+
|
31
|
+
if duration == 0
|
32
|
+
sleep
|
33
|
+
else
|
34
|
+
sleep duration
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if $0 == __FILE__
|
41
|
+
require "test/unit"
|
42
|
+
$__test_sgl__ = true
|
43
|
+
end
|
44
|
+
|
45
|
+
if defined?($__test_sgl__) && $__test_sgl__
|
46
|
+
class TestSglServer < Test::Unit::TestCase #:nodoc:
|
47
|
+
def test_all
|
48
|
+
server = Sgl::Server.new
|
49
|
+
Thread.start {
|
50
|
+
server.run(5)
|
51
|
+
}
|
52
|
+
|
53
|
+
uri = Sgl::DEFAULT_URI
|
54
|
+
there = DRbObject.new_with_uri(uri)
|
55
|
+
there.puts('Hello, World.')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
2
|
+
# License: Ruby License
|
3
|
+
|
4
|
+
require 'sgl/bass'
|
5
|
+
|
6
|
+
module SGL
|
7
|
+
def useSound() $__a__.useSound; end
|
8
|
+
def loadSound(*a) $__a__.loadSound(*a) end
|
9
|
+
def stopSound(*a) $__a__.stopAll(*a) end
|
10
|
+
|
11
|
+
class Application
|
12
|
+
def useSound
|
13
|
+
bass = Bass::BassLib.instance
|
14
|
+
end
|
15
|
+
|
16
|
+
def loadSound(file)
|
17
|
+
return Bass::Sample.new(file)
|
18
|
+
end
|
19
|
+
|
20
|
+
def stopSound
|
21
|
+
Bass::BassLib.instance.stop_all
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,216 @@
|
|
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
|
+
=begin
|
8
|
+
# not yet.
|
9
|
+
module SpringModule
|
10
|
+
end
|
11
|
+
=end
|
12
|
+
|
13
|
+
class Spring
|
14
|
+
EPSILON = 0.01
|
15
|
+
|
16
|
+
# �ڕW�ƂȂ�l�A�����l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
17
|
+
def initialize(target, initial, ks, kd, e=EPSILON, v=0)
|
18
|
+
@target, @initial, @ks, @kd, @e, @v = target, initial, ks, kd, e, v
|
19
|
+
@x = @initial
|
20
|
+
@moving = true
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :x, :target
|
24
|
+
attr_accessor :v, :ks, :kd
|
25
|
+
|
26
|
+
def inspect
|
27
|
+
mov = @moving ? "��" : "��"
|
28
|
+
sprintf("[%s%.1f %.1f %.1f %.1f %.1f]", mov, @target, @x, @v, @ks, @kd)
|
29
|
+
end
|
30
|
+
|
31
|
+
def target=(num)
|
32
|
+
@target = num
|
33
|
+
@moving = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def x=(num)
|
37
|
+
@x = num
|
38
|
+
@moving = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def move
|
42
|
+
return if ! @moving
|
43
|
+
if @x.is_a?(Vector)
|
44
|
+
l = @x - @target
|
45
|
+
diff = l.length
|
46
|
+
if diff < @e && @v.length < @e
|
47
|
+
@moving = false
|
48
|
+
return
|
49
|
+
end
|
50
|
+
#fa = -(@ks * diff + @kd * @v)
|
51
|
+
ln = l.normalize
|
52
|
+
fak = -(@ks * diff + @kd * @v.length)
|
53
|
+
fa = ln.scale(fak)
|
54
|
+
@v += fa
|
55
|
+
@x += @v
|
56
|
+
#p ['sp', fa, fak, @v, @x]
|
57
|
+
else
|
58
|
+
diff = @x - @target
|
59
|
+
if diff.abs < @e && @v.abs < @e
|
60
|
+
@moving = false
|
61
|
+
return
|
62
|
+
end
|
63
|
+
fa = -(@ks * diff + @kd * @v)
|
64
|
+
@v += fa
|
65
|
+
@x += @v
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class ISpring < Spring
|
71
|
+
# �ڕW�ƂȂ�l�A�����l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
72
|
+
def initialize(target, initial, ks, kd, e=EPSILON, v=0)
|
73
|
+
super(target, initial, 1.0/ks, 1.0/kd, e, v) # ks��kd��inverse����B
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class NumSpring
|
78
|
+
EPSILON = 0.01
|
79
|
+
|
80
|
+
# �ڕW�ƂȂ�l�A�����l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
81
|
+
def initialize(target, initial, ks, kd, e=EPSILON, v=0)
|
82
|
+
@target, @initial, @ks, @kd, @e, @v = target, initial, ks, kd, e, v
|
83
|
+
@x = @initial
|
84
|
+
@moving = true
|
85
|
+
end
|
86
|
+
|
87
|
+
attr_reader :x, :target
|
88
|
+
attr_accessor :v, :ks, :kd, :moving
|
89
|
+
|
90
|
+
def inspect
|
91
|
+
mov = @moving ? "��" : "��"
|
92
|
+
sprintf("[%s%.1f %.1f %.1f %.1f %.1f]", mov, @target, @x, @v, @ks, @kd)
|
93
|
+
end
|
94
|
+
|
95
|
+
def target=(num)
|
96
|
+
@target = num
|
97
|
+
@moving = true
|
98
|
+
end
|
99
|
+
|
100
|
+
def x=(num)
|
101
|
+
@x = num
|
102
|
+
@moving = true
|
103
|
+
end
|
104
|
+
|
105
|
+
def move
|
106
|
+
return if ! @moving
|
107
|
+
diff = @target - @x
|
108
|
+
if diff.abs < @e && @v.abs < @e
|
109
|
+
@moving = false
|
110
|
+
return
|
111
|
+
end
|
112
|
+
@v += (diff / @ks)
|
113
|
+
@v *= @kd
|
114
|
+
@x += @v
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class INumSpring < NumSpring
|
119
|
+
# �ڕW�ƂȂ�l�A�����l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
120
|
+
def initialize(target, initial, ks, kd, e=EPSILON, v=0)
|
121
|
+
super(target, initial, ks, 1.0 - 1.0/kd, e, v) # kd����inverse����B
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
=begin
|
127
|
+
class NuSpringPos
|
128
|
+
EPSILON = 0.01
|
129
|
+
|
130
|
+
# �����l�A�ڕW�ƂȂ�l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
131
|
+
def initialize(x, y, ks, kd, e=EPSILON)
|
132
|
+
@x, @y, @ks, @kd, @e = x, y, ks, kd, e
|
133
|
+
@vx, @vy, @tx, @ty = 0, 0, 0, 0
|
134
|
+
@moving = true
|
135
|
+
end
|
136
|
+
|
137
|
+
attr_reader :x, :y, :moving
|
138
|
+
|
139
|
+
def set_target(tx, ty)
|
140
|
+
@tx, @ty = tx, ty
|
141
|
+
end
|
142
|
+
|
143
|
+
def move
|
144
|
+
return if ! @moving
|
145
|
+
|
146
|
+
#diff = @target - @x
|
147
|
+
diff = @tx - @x
|
148
|
+
if diff.abs < @e && @v.abs < @e
|
149
|
+
@moving = false
|
150
|
+
return
|
151
|
+
end
|
152
|
+
@v += (diff / @ks)
|
153
|
+
@v *= @kd
|
154
|
+
@x += @v
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
class NuNumSpring
|
159
|
+
EPSILON = 0.01
|
160
|
+
|
161
|
+
# �ڕW�ƂȂ�l�A�����l�A�o�l�萔�A�e���萔�A�C�v�V����(�\���������l)
|
162
|
+
def initialize(target, initial, ks, kd, e=EPSILON)
|
163
|
+
@target, @initial, @ks, @kd, @e = target, initial, ks, kd, e
|
164
|
+
@x = @initial
|
165
|
+
@v = 0
|
166
|
+
@moving = true
|
167
|
+
end
|
168
|
+
|
169
|
+
attr_reader :v
|
170
|
+
attr_accessor :x, :target, :moving, :ks, :kd
|
171
|
+
|
172
|
+
def inspect
|
173
|
+
mov = @moving ? "��" : "��"
|
174
|
+
sprintf("[%s%.1f %.1f %.1f %.1f %.1f]", mov, @target, @x, @v, @ks, @kd)
|
175
|
+
end
|
176
|
+
|
177
|
+
def move
|
178
|
+
return if ! @moving
|
179
|
+
diff = @target - @x
|
180
|
+
if diff.abs < @e && @v.abs < @e
|
181
|
+
@moving = false
|
182
|
+
return
|
183
|
+
end
|
184
|
+
@v += (diff / @ks)
|
185
|
+
@v *= @kd
|
186
|
+
@x += @v
|
187
|
+
end
|
188
|
+
|
189
|
+
def rel_ks_notuse(r)
|
190
|
+
@ks += r
|
191
|
+
@ks = 1 if @ks <= 0
|
192
|
+
end
|
193
|
+
end
|
194
|
+
=end
|
195
|
+
|
196
|
+
if $0 == __FILE__
|
197
|
+
require "test/unit"
|
198
|
+
$__test_sgl__ = true
|
199
|
+
end
|
200
|
+
|
201
|
+
if defined?($__test_sgl__) && $__test_sgl__
|
202
|
+
class TestSglSpring < Test::Unit::TestCase #:nodoc:
|
203
|
+
def test_all
|
204
|
+
|
205
|
+
s = SGL::NumSpring.new(0, 1, 0.1, 0.1)
|
206
|
+
assert_equal(1, s.x)
|
207
|
+
assert_equal(true, s.moving)
|
208
|
+
|
209
|
+
s.move
|
210
|
+
assert_equal(0.0, s.x)
|
211
|
+
|
212
|
+
s.move
|
213
|
+
assert_equal(-0.1, s.x)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
2
|
+
# License: Ruby License
|
3
|
+
|
4
|
+
module SGL
|
5
|
+
# starttime�b��Ɏn�܂��āAendtime�b��ɏI��B
|
6
|
+
class Timer
|
7
|
+
def initialize(st, et)
|
8
|
+
@st, @et = st, et
|
9
|
+
revert # �����߂�
|
10
|
+
count
|
11
|
+
@span = (@et - @st).to_f
|
12
|
+
#p ['Timer', @bt, @st, @et, @span]
|
13
|
+
end
|
14
|
+
attr_accessor :st, :et
|
15
|
+
|
16
|
+
# start at 0.0, finished at 1.0
|
17
|
+
def ratio
|
18
|
+
count
|
19
|
+
return 0.0 if @now < @st
|
20
|
+
return 1.0 if @et <= @now
|
21
|
+
return (@now - @st) / @span
|
22
|
+
end
|
23
|
+
|
24
|
+
def started?
|
25
|
+
count
|
26
|
+
@st <= @now
|
27
|
+
end
|
28
|
+
|
29
|
+
def ended?
|
30
|
+
count
|
31
|
+
@et <= @now
|
32
|
+
end
|
33
|
+
|
34
|
+
def start
|
35
|
+
@bt += @st if ! started?
|
36
|
+
@bt = Time.now.to_f - @st if ! started?
|
37
|
+
end
|
38
|
+
|
39
|
+
# begintime���J�n����
|
40
|
+
def revert
|
41
|
+
@bt = Time.now.to_f
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def count
|
47
|
+
@now = Time.now.to_f - @bt
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module Fadeout
|
52
|
+
EXISTENCE_TIME = 6 # ��������
|
53
|
+
FADEOUT_TIME = 2 # fadeout���鎞��
|
54
|
+
|
55
|
+
def fadeout_initialize
|
56
|
+
@timer = Timer.new(EXISTENCE_TIME - FADEOUT_TIME, EXISTENCE_TIME)
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_longer_timer
|
60
|
+
t = 10
|
61
|
+
@timer = Timer.new(EXISTENCE_TIME * t - FADEOUT_TIME * t, EXISTENCE_TIME * t)
|
62
|
+
end
|
63
|
+
|
64
|
+
def fadeout
|
65
|
+
@timer.start
|
66
|
+
end
|
67
|
+
|
68
|
+
def ended?
|
69
|
+
@timer.ended?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/sgl/sgl.rb
ADDED
data/lib/sgl/version.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
base_dir = File.join(File.dirname(__FILE__), "..")
|
4
|
+
glob_pattern = File.join("**", "*")
|
5
|
+
exclude_patterns = [
|
6
|
+
/^pkg/,/^doc/,
|
7
|
+
]
|
8
|
+
|
9
|
+
Dir.chdir(base_dir)
|
10
|
+
files = Dir.glob(glob_pattern).delete_if do |fname|
|
11
|
+
File.directory?(fname) or
|
12
|
+
exclude_patterns.find do |pattern|
|
13
|
+
pattern =~ fname
|
14
|
+
end
|
15
|
+
end
|
16
|
+
manifest = File.new("Manifest.txt", "w")
|
17
|
+
manifest.puts files.sort.join("\n")
|
18
|
+
manifest.close
|
19
|
+
|
20
|
+
puts "Manifest.txt updated"
|
data/test/test_bass.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
3
|
+
# License: Ruby License
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
6
|
+
require 'sgl/bass'
|
7
|
+
|
8
|
+
class TestSample < Test::Unit::TestCase
|
9
|
+
TEST_FILENAME = "c:/WINDOWS/Media/start.wav"
|
10
|
+
|
11
|
+
def test_0_simple_play
|
12
|
+
bass = Bass::BassLib.instance
|
13
|
+
samp = Bass::Sample.new(TEST_FILENAME)
|
14
|
+
|
15
|
+
# test_play
|
16
|
+
samp.play; sleep 0.05
|
17
|
+
|
18
|
+
# test_note
|
19
|
+
[0, 2, 4, 5, 7, 9, 11, 12].each {|n| samp.play(60 + n); sleep 0.05 }
|
20
|
+
|
21
|
+
# test_volume
|
22
|
+
10.times {|v| samp.play(60, v * 10); sleep 0.05 }
|
23
|
+
|
24
|
+
# test_pan
|
25
|
+
10.times {|pos| samp.play(60, 100, pos * 20 - 100); sleep 0.05 }
|
26
|
+
end
|
27
|
+
end
|
data/test/test_cocoa_app.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# Copyright (C) 2004-
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
|
3
|
+
# License: Ruby License
|
3
4
|
|
4
|
-
|
5
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
5
6
|
|
6
|
-
if /
|
7
|
+
if /osx/ =~ RUBY_PLATFORM
|
7
8
|
|
8
9
|
require "sgl/cocoa-app"
|
9
|
-
require "test/unit"
|
10
10
|
|
11
11
|
class TestCocoaBasic < Test::Unit::TestCase
|
12
12
|
def test_basic
|