ray 0.0.1 → 0.1.0.pre1
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/.gemtest +0 -0
- data/.yardopts +4 -0
- data/README.md +17 -21
- data/Rakefile +18 -139
- data/VERSION +1 -1
- data/ext/audio.cpp +723 -0
- data/ext/{color.c → color.cpp} +25 -13
- data/ext/drawable.cpp +91 -0
- data/ext/event.cpp +460 -0
- data/ext/extconf.rb +5 -104
- data/ext/font.cpp +190 -0
- data/ext/image.cpp +733 -0
- data/ext/input.cpp +74 -0
- data/ext/ray.cpp +168 -0
- data/ext/ray.hpp +356 -0
- data/ext/{rect.c → rect.cpp} +51 -37
- data/ext/shader.cpp +169 -0
- data/ext/shape.cpp +409 -0
- data/ext/sprite.cpp +306 -0
- data/ext/text.cpp +181 -0
- data/ext/vector.cpp +215 -0
- data/guide.md +619 -0
- data/lib/ray/audio.rb +0 -41
- data/lib/ray/color.rb +32 -10
- data/lib/ray/drawable.rb +16 -0
- data/lib/ray/dsl/event_listener.rb +25 -2
- data/lib/ray/dsl/event_runner.rb +33 -5
- data/lib/ray/dsl/event_translator.rb +66 -30
- data/lib/ray/dsl/handler.rb +3 -2
- data/lib/ray/dsl/matcher.rb +58 -14
- data/lib/ray/font.rb +38 -96
- data/lib/ray/font_set.rb +8 -8
- data/lib/ray/game.rb +87 -66
- data/lib/ray/helper.rb +105 -10
- data/lib/ray/image.rb +150 -24
- data/lib/ray/image_set.rb +3 -1
- data/lib/ray/input.rb +10 -0
- data/lib/ray/music_set.rb +5 -3
- data/lib/ray/ray.rb +21 -9
- data/lib/ray/rect.rb +48 -7
- data/lib/ray/rmagick.rb +41 -0
- data/lib/ray/scene.rb +99 -43
- data/lib/ray/scene_list.rb +67 -0
- data/lib/ray/shape.rb +132 -0
- data/lib/ray/sound_set.rb +4 -2
- data/lib/ray/sprite.rb +49 -111
- data/lib/ray/text.rb +101 -0
- data/lib/ray/text_helper.rb +37 -0
- data/lib/ray/turtle.rb +215 -0
- data/lib/ray/vector.rb +226 -0
- data/samples/audio/spacial.rb +44 -0
- data/samples/hello_world/hello.rb +9 -13
- data/samples/hello_world/hello_dsl.rb +8 -12
- data/samples/hello_world/text.rb +15 -0
- data/samples/opengl/binding.rb +38 -0
- data/samples/opengl/image.rb +32 -0
- data/samples/opengl/opengl.rb +34 -0
- data/samples/opengl/shader.rb +42 -0
- data/samples/pong/pong.rb +14 -10
- data/samples/run_scene.rb +53 -0
- data/samples/shaders/scene.rb +40 -0
- data/samples/shaders/shaders.rb +42 -0
- data/samples/shaders/shape.rb +34 -0
- data/samples/sokoban/sokoban.rb +18 -18
- data/samples/test/actual_scene.rb +41 -0
- data/samples/test/scene_riot.rb +39 -0
- data/samples/test/scene_spec.rb +32 -0
- data/samples/test/scene_test_unit.rb +25 -0
- data/samples/turtle/byzantium.rb +45 -0
- data/samples/turtle/hilbert.rb +48 -0
- data/samples/turtle/koch.rb +55 -0
- data/samples/turtle/mandala.rb +61 -0
- data/samples/turtle/tree.rb +57 -0
- data/test/audio_test.rb +69 -0
- data/test/color_test.rb +77 -0
- data/test/drawable_test.rb +19 -0
- data/test/dsl_test.rb +93 -0
- data/test/font_test.rb +57 -0
- data/test/helpers.rb +94 -0
- data/test/image_test.rb +82 -0
- data/test/ray_test.rb +25 -0
- data/test/rect_test.rb +121 -0
- data/{spec → test}/res/VeraMono.ttf +0 -0
- data/{spec → test}/res/aqua.bmp +0 -0
- data/{spec → test}/res/aqua.png +0 -0
- data/{spec → test}/res/aqua2.bmp +0 -0
- data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
- data/{spec → test}/res/pop.wav +0 -0
- data/test/resource_set_test.rb +99 -0
- data/test/run_all.rb +7 -0
- data/test/shape_test.rb +101 -0
- data/test/sprite_test.rb +89 -0
- data/test/text_test.rb +78 -0
- data/test/turtle_test.rb +176 -0
- data/test/vector_test.rb +111 -0
- data/yard_ext.rb +0 -28
- metadata +95 -139
- data/.gitignore +0 -23
- data/.gitmodules +0 -3
- data/.rspec +0 -3
- data/ext/audio.c +0 -473
- data/ext/event.c +0 -557
- data/ext/font.c +0 -287
- data/ext/image.c +0 -933
- data/ext/joystick.c +0 -145
- data/ext/ray.c +0 -489
- data/ext/ray.h +0 -245
- data/ext/ray_osx.m +0 -161
- data/lib/ray/joystick.rb +0 -30
- data/psp/SDL_psp_main.c +0 -84
- data/psp/bigdecimal/README +0 -60
- data/psp/bigdecimal/bigdecimal.c +0 -4697
- data/psp/bigdecimal/bigdecimal.h +0 -216
- data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
- data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
- data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
- data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
- data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
- data/psp/digest/bubblebabble/bubblebabble.c +0 -142
- data/psp/digest/defs.h +0 -20
- data/psp/digest/digest.c +0 -643
- data/psp/digest/digest.h +0 -32
- data/psp/digest/lib/digest.rb +0 -50
- data/psp/digest/lib/md5.rb +0 -27
- data/psp/digest/lib/sha1.rb +0 -27
- data/psp/digest/md5/md5.c +0 -420
- data/psp/digest/md5/md5.h +0 -80
- data/psp/digest/md5/md5init.c +0 -40
- data/psp/digest/rmd160/rmd160.c +0 -457
- data/psp/digest/rmd160/rmd160.h +0 -56
- data/psp/digest/rmd160/rmd160init.c +0 -40
- data/psp/digest/sha1/sha1.c +0 -269
- data/psp/digest/sha1/sha1.h +0 -39
- data/psp/digest/sha1/sha1init.c +0 -40
- data/psp/digest/sha2/lib/sha2.rb +0 -73
- data/psp/digest/sha2/sha2.c +0 -919
- data/psp/digest/sha2/sha2.h +0 -109
- data/psp/digest/sha2/sha2init.c +0 -52
- data/psp/enumerator/enumerator.c +0 -298
- data/psp/etc/etc.c +0 -559
- data/psp/ext.c +0 -289
- data/psp/fcntl/fcntl.c +0 -187
- data/psp/lib/rbconfig.rb +0 -178
- data/psp/nkf/lib/kconv.rb +0 -367
- data/psp/nkf/nkf-utf8/config.h +0 -88
- data/psp/nkf/nkf-utf8/nkf.c +0 -6040
- data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
- data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
- data/psp/nkf/nkf.c +0 -654
- data/psp/socket/addrinfo.h +0 -173
- data/psp/socket/getaddrinfo.c +0 -676
- data/psp/socket/getnameinfo.c +0 -270
- data/psp/socket/pspsocket.c +0 -71
- data/psp/socket/pspsocket.h +0 -28
- data/psp/socket/socket.c +0 -4662
- data/psp/socket/sockport.h +0 -76
- data/psp/stringio/stringio.c +0 -1306
- data/psp/strscan/strscan.c +0 -1320
- data/psp/syck/bytecode.c +0 -1166
- data/psp/syck/emitter.c +0 -1242
- data/psp/syck/gram.c +0 -1894
- data/psp/syck/gram.h +0 -79
- data/psp/syck/handler.c +0 -174
- data/psp/syck/implicit.c +0 -2990
- data/psp/syck/node.c +0 -408
- data/psp/syck/rubyext.c +0 -2367
- data/psp/syck/syck.c +0 -504
- data/psp/syck/syck.h +0 -456
- data/psp/syck/token.c +0 -2725
- data/psp/syck/yaml2byte.c +0 -257
- data/psp/syck/yamlbyte.h +0 -170
- data/psp/thread/thread.c +0 -1175
- data/psp/zlib/zlib.c +0 -3547
- data/script.rb +0 -10
- data/spec/ray/audio_spec.rb +0 -146
- data/spec/ray/color_spec.rb +0 -57
- data/spec/ray/event_spec.rb +0 -80
- data/spec/ray/font_spec.rb +0 -93
- data/spec/ray/image_set_spec.rb +0 -48
- data/spec/ray/image_spec.rb +0 -162
- data/spec/ray/joystick_spec.rb +0 -21
- data/spec/ray/matcher_spec.rb +0 -50
- data/spec/ray/ray_spec.rb +0 -88
- data/spec/ray/rect_spec.rb +0 -154
- data/spec/ray/resource_set_spec.rb +0 -105
- data/spec/ray/sprite_spec.rb +0 -163
- data/spec/spec.opts +0 -4
- data/spec/spec_helper.rb +0 -8
data/.gemtest
ADDED
|
File without changes
|
data/.yardopts
ADDED
data/README.md
CHANGED
|
@@ -4,24 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
class HelloScene < Ray::Scene
|
|
6
6
|
scene_name :hello
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
def setup
|
|
9
|
-
@font = font(
|
|
9
|
+
@font = font("VeraMono.ttf")
|
|
10
10
|
end
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
def render(win)
|
|
13
|
-
@font.draw("Hello world!", :on => win, :at => [0, 0])
|
|
13
|
+
@font.draw("Hello world!", :on => win, :at => [0, 0], :size => 12)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
class HelloWorld < Ray::Game
|
|
18
18
|
def initialize
|
|
19
19
|
super("Hello world!")
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
HelloScene.bind(self)
|
|
22
22
|
push_scene :hello
|
|
23
23
|
end
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
def register
|
|
26
26
|
add_hook :quit, method(:exit!)
|
|
27
27
|
end
|
|
@@ -35,28 +35,24 @@
|
|
|
35
35
|
register do
|
|
36
36
|
add_hook :quit, method(:exit!)
|
|
37
37
|
end
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
scene :hello do
|
|
40
|
-
@font = font(
|
|
41
|
-
|
|
40
|
+
@font = font("VeraMono.ttf")
|
|
41
|
+
|
|
42
42
|
render do |win|
|
|
43
|
-
@font.draw("Hello world", :on => win, :at => [0, 0])
|
|
43
|
+
@font.draw("Hello world", :on => win, :at => [0, 0], :size => 12)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
|
-
|
|
46
|
+
|
|
47
47
|
push_scene :hello
|
|
48
48
|
end
|
|
49
|
-
# Installation
|
|
50
|
-
Run the following command:
|
|
51
49
|
|
|
52
|
-
gem install ray
|
|
53
|
-
|
|
54
|
-
This requires the SDL to be installed. SDL_TTF, SDL_image, SDL_gfx, and
|
|
55
|
-
SDL_mixer are also needed for several features, though you can install ray
|
|
56
|
-
without them.
|
|
57
50
|
# Features
|
|
58
|
-
*
|
|
51
|
+
* Can hide the event loop where registred blocks or methods are run when something
|
|
59
52
|
happens.
|
|
60
53
|
* Provides a cache for resources like images, fonts, sounds, ...
|
|
61
|
-
*
|
|
62
|
-
|
|
54
|
+
* Implements turtle graphics
|
|
55
|
+
* Nothing more serious than a toy.
|
|
56
|
+
|
|
57
|
+
# Installation & Getting started
|
|
58
|
+
See [the guide](guide.md)
|
data/Rakefile
CHANGED
|
@@ -3,7 +3,7 @@ begin
|
|
|
3
3
|
require 'yard'
|
|
4
4
|
|
|
5
5
|
YARD::Rake::YardocTask.new do |t|
|
|
6
|
-
t.files = ['lib/**/*.rb', 'ext/**/*.
|
|
6
|
+
t.files = ['lib/**/*.rb', 'ext/**/*.cpp']
|
|
7
7
|
t.options |= ["--private", "-e", "./yard_ext.rb"]
|
|
8
8
|
end
|
|
9
9
|
rescue LoadError
|
|
@@ -25,42 +25,24 @@ begin
|
|
|
25
25
|
s.authors = ["Mon ouïe"]
|
|
26
26
|
|
|
27
27
|
s.files |= FileList["lib/**/*.rb"]
|
|
28
|
-
s.files |= FileList["ext/**/*.{
|
|
28
|
+
s.files |= FileList["ext/**/*.{cpp,h}"]
|
|
29
|
+
s.files |= FileList["*.md"]
|
|
30
|
+
s.files << ".gemtest" << "Rakefile"
|
|
29
31
|
|
|
30
32
|
s.has_rdoc = "yard"
|
|
31
33
|
|
|
32
34
|
s.extensions = ["ext/extconf.rb"]
|
|
33
|
-
|
|
35
|
+
|
|
34
36
|
s.add_development_dependency "jeweler"
|
|
35
37
|
s.add_development_dependency "yard"
|
|
36
|
-
s.add_development_dependency "
|
|
37
|
-
s.add_development_dependency "
|
|
38
|
+
s.add_development_dependency "riot"
|
|
39
|
+
s.add_development_dependency "rr"
|
|
38
40
|
end
|
|
39
41
|
rescue LoadError
|
|
40
42
|
$stderr.puts("Jeweler is not installed. Please install it " +
|
|
41
43
|
"with the following command: gem intall jeweler")
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
begin
|
|
45
|
-
begin
|
|
46
|
-
require 'spec/rake/spectask'
|
|
47
|
-
|
|
48
|
-
Spec::Rake::SpecTask.new(:spec) do |t|
|
|
49
|
-
t.spec_files = FileList['spec/**/*_spec\.rb']
|
|
50
|
-
t.fail_on_error = false
|
|
51
|
-
end
|
|
52
|
-
rescue LoadError
|
|
53
|
-
require 'rspec/core/rake_task'
|
|
54
|
-
|
|
55
|
-
RSpec::Core::RakeTask.new(:spec) do |t|
|
|
56
|
-
t.fail_on_error = false
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
rescue LoadError
|
|
60
|
-
$stderr.puts("RSpec is not installed. Please install it " +
|
|
61
|
-
"with the following command: gem install rspec")
|
|
62
|
-
end
|
|
63
|
-
|
|
64
46
|
namespace :ext do
|
|
65
47
|
desc "Rebuilds the C extension"
|
|
66
48
|
task :rebuild do
|
|
@@ -78,123 +60,20 @@ end
|
|
|
78
60
|
desc "Builds the C extension"
|
|
79
61
|
task :ext => ["ext:build"]
|
|
80
62
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
socket/pspsocket.c
|
|
86
|
-
bigdecimal/bigdecimal.c
|
|
87
|
-
digest/sha2/sha2init.c digest/sha2/sha2.c
|
|
88
|
-
digest/rmd160/rmd160.c digest/rmd160/rmd160init.c
|
|
89
|
-
digest/bubblebabble/bubblebabble.c
|
|
90
|
-
digest/sha1/sha1.c digest/sha1/sha1init.c
|
|
91
|
-
digest/md5/md5.c digest/md5/md5init.c
|
|
92
|
-
digest/digest.c
|
|
93
|
-
enumerator/enumerator.c
|
|
94
|
-
fcntl/fcntl.c
|
|
95
|
-
stringio/stringio.c
|
|
96
|
-
strscan/strscan.c
|
|
97
|
-
thread/thread.c
|
|
98
|
-
zlib/zlib.c
|
|
99
|
-
nkf/nkf.c
|
|
100
|
-
etc/etc.c
|
|
101
|
-
syck/bytecode.c syck/gram.c syck/implicit.c syck/rubyext.c
|
|
102
|
-
syck/token.c syck/emitter.c syck/handler.c syck/node.c syck/syck.c
|
|
103
|
-
syck/yaml2byte.c).map { |i| "psp/#{i}" }
|
|
104
|
-
|
|
105
|
-
static_libs = ["-lSDL_ttf", "-lSDL_mixer", "-lSDL_gfx", "-lSDL_image",
|
|
106
|
-
"-lSDL", "-lGL", "-lpspvfpu", "-lfreetype", "-lvorbisfile",
|
|
107
|
-
"-lvorbis", "-lmikmod", "-logg",
|
|
108
|
-
"-lpspgu", "-lpspaudio", "-lpsprtc", "-lpsphprm", "-lpspwlan",
|
|
109
|
-
"-lruby", "-lpng", "-ljpeg", "-lz","-lm", "-lc"]
|
|
110
|
-
|
|
111
|
-
flags = ["-Wall", "-Wno-unused-parameter", "-D_PSP_ -DHAVE_STRUCT_TIMESPEC",
|
|
112
|
-
"-DHAVE_SDL_SDL_IMAGE_H", "-G0", "-DHAVE_SDL_SDL_ROTOZOOM_H",
|
|
113
|
-
"-DHAVE_SDL_SDL_TTF_H", "-DHAVE_SDL_SDL_MIXER_H", "-DUSE_RWOPS"]
|
|
114
|
-
|
|
115
|
-
begin
|
|
116
|
-
PSPTask.new do |t|
|
|
117
|
-
t.objdir = "./obj/"
|
|
118
|
-
t.srcs = Dir['ext/*.c', 'psp/*.c'] | libs
|
|
119
|
-
t.libs = static_libs | t.libs
|
|
120
|
-
t.cflags |= flags
|
|
121
|
-
t.incdir << "-I./ext" << "-I./psp"
|
|
122
|
-
t.target = "ray_release"
|
|
123
|
-
|
|
124
|
-
t.build_prx = true
|
|
125
|
-
t.build_eboot = true
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
PSPTask.new(:debug) do |t|
|
|
129
|
-
t.objdir = "./obj_dbg/"
|
|
130
|
-
t.srcs = Dir['ext/*.c', 'psp/*.c'] | libs
|
|
131
|
-
t.libs = static_libs | t.libs
|
|
132
|
-
t.cflags |= (flags | ["-O0", "-g"])
|
|
133
|
-
t.incdir << "-I./ext" << "-I./psp"
|
|
134
|
-
t.target = "ray"
|
|
135
|
-
|
|
136
|
-
t.build_prx = true
|
|
137
|
-
end
|
|
138
|
-
rescue
|
|
139
|
-
$stderr.puts "could not create PSP tasks"
|
|
140
|
-
end
|
|
141
|
-
rescue LoadError
|
|
142
|
-
$stderr.puts("psp_task is not installed. Please install it " +
|
|
143
|
-
"with the following command: gem intall psp_task")
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
require 'net/ftp'
|
|
147
|
-
|
|
148
|
-
file "ruby-1.8.7-p248.tar.bz2" do
|
|
149
|
-
ftp = Net::FTP.new
|
|
150
|
-
ftp.connect("ftp.ruby-lang.org", 21)
|
|
151
|
-
ftp.login("anonymous", "")
|
|
152
|
-
puts "Downloading ruby-1.8.7-p248.tar.bz2..."
|
|
153
|
-
ftp.getbinaryfile("pub/ruby/1.8/ruby-1.8.7-p248.tar.bz2",
|
|
154
|
-
"ruby-1.8.7-p248.tar.bz2")
|
|
155
|
-
ftp.close
|
|
156
|
-
end
|
|
63
|
+
desc "Starts IRB"
|
|
64
|
+
task :irb do
|
|
65
|
+
require 'irb'
|
|
66
|
+
ARGV.clear
|
|
157
67
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
sh "tar xvf ruby-1.8.7-p248.tar.bz2"
|
|
161
|
-
cp_r "ruby-1.8.7-p248/lib", "ruby_stdlib"
|
|
68
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "ext"))
|
|
69
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "lib"))
|
|
162
70
|
|
|
163
|
-
|
|
71
|
+
require 'ray'
|
|
164
72
|
|
|
165
|
-
|
|
166
|
-
cp "psp/digest/lib/digest.rb", "ruby_stdlib/lib"
|
|
167
|
-
cp "psp/digest/lib/sha1.rb", "ruby_stdlib/lib/digest"
|
|
168
|
-
cp "psp/digest/lib/md5.rb", "ruby_stdlib/lib/digest"
|
|
169
|
-
|
|
170
|
-
cp "psp/nkf/lib/kconv.rb", "ruby_stdlib/lib"
|
|
73
|
+
IRB.start
|
|
171
74
|
end
|
|
172
75
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
ruby_libs.each do |filename|
|
|
178
|
-
ext_name = case filename
|
|
179
|
-
when /(\w+)\.rb/
|
|
180
|
-
$1
|
|
181
|
-
when /\w+\/(\w+)\.rb/
|
|
182
|
-
$1
|
|
183
|
-
else
|
|
184
|
-
filename
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
dir = File.dirname("ruby_stdlib/lib/#{filename}")
|
|
188
|
-
|
|
189
|
-
directory dir
|
|
190
|
-
file "ruby_stdlib/lib/#{filename}" => ["ruby_stdlib", dir] do
|
|
191
|
-
open("ruby_stdlib/lib/#{filename}", 'w') do |file|
|
|
192
|
-
file.puts "Ray.init_internal(\"#{ext_name}\")"
|
|
193
|
-
end
|
|
194
|
-
end
|
|
76
|
+
desc "Runs tests"
|
|
77
|
+
task :test do
|
|
78
|
+
load File.expand_path(File.join(File.dirname(__FILE__), "test", "run_all.rb"))
|
|
195
79
|
end
|
|
196
|
-
|
|
197
|
-
ruby_libs.map! { |i| "ruby_stdlib/lib/#{i}" }
|
|
198
|
-
|
|
199
|
-
desc "Builds dependencies for running the specs on a PSP"
|
|
200
|
-
task :psp_spec => (['debug:prx'] | ruby_libs)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.1.0.pre1
|
data/ext/audio.cpp
ADDED
|
@@ -0,0 +1,723 @@
|
|
|
1
|
+
#include "ray.hpp"
|
|
2
|
+
|
|
3
|
+
void ray_audio_source::set_pitch(float value) {
|
|
4
|
+
source().SetPitch(value);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
float ray_audio_source::pitch() const {
|
|
8
|
+
return source().GetPitch();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
void ray_audio_source::set_position(const ray_vector3 &vector) {
|
|
12
|
+
source().SetPosition(vector);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
ray_vector3 ray_audio_source::position() const {
|
|
16
|
+
return source().GetPosition();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void ray_audio_source::set_relative(bool value) {
|
|
20
|
+
source().SetRelativeToListener(value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
bool ray_audio_source::is_relative() const {
|
|
24
|
+
return source().IsRelativeToListener();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void ray_audio_source::set_min_distance(float value) {
|
|
28
|
+
source().SetMinDistance(value);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
float ray_audio_source::min_distance() const {
|
|
32
|
+
return source().GetMinDistance();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
void ray_audio_source::set_attenuation(float value) {
|
|
36
|
+
source().SetAttenuation(value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
float ray_audio_source::attenuation() const {
|
|
40
|
+
return source().GetAttenuation();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
float ray_audio_source::volume() const {
|
|
44
|
+
return source().GetVolume();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
void ray_audio_source::set_volume(float value) {
|
|
48
|
+
source().SetVolume(value);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
void ray_sound::set_loop(bool value) {
|
|
52
|
+
sound.SetLoop(value);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
bool ray_sound::is_looping() const {
|
|
56
|
+
return sound.GetLoop();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
bool ray_sound::load_from_io(VALUE io) {
|
|
60
|
+
VALUE string = rb_funcall2(io, RAY_METH("read"), 0, NULL);
|
|
61
|
+
char *content = StringValuePtr(string);
|
|
62
|
+
|
|
63
|
+
if (!sound_buffer.LoadFromMemory(content, RSTRING_LEN(string)))
|
|
64
|
+
return false;
|
|
65
|
+
|
|
66
|
+
sound.SetBuffer(sound_buffer);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bool ray_sound::load_from_filename(const std::string &filename) {
|
|
71
|
+
if (!sound_buffer.LoadFromFile(filename))
|
|
72
|
+
return false;
|
|
73
|
+
sound.SetBuffer(sound_buffer);
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
bool ray_sound::create_from_sound(const ray_sound &source) {
|
|
78
|
+
sound_buffer = source.sound_buffer;
|
|
79
|
+
sound = source.sound;
|
|
80
|
+
|
|
81
|
+
sound.SetBuffer(sound_buffer);
|
|
82
|
+
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void ray_sound::play() {
|
|
87
|
+
sound.Play();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
void ray_sound::pause() {
|
|
91
|
+
sound.Pause();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void ray_sound::stop() {
|
|
95
|
+
sound.Stop();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
sf::SoundSource::Status ray_sound::status() const {
|
|
99
|
+
return sound.GetStatus();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
float ray_sound::current_time() const {
|
|
103
|
+
return sound.GetPlayingOffset();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
void ray_sound::set_current_time(float value) {
|
|
107
|
+
sound.SetPlayingOffset(value);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
sf::SoundSource &ray_sound::source() {
|
|
111
|
+
return sound;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const sf::SoundSource &ray_sound::source() const {
|
|
115
|
+
return sound;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
bool ray_music::load_from_io(VALUE self, VALUE io) {
|
|
119
|
+
VALUE string = rb_funcall2(io, RAY_METH("read"), 0, NULL);
|
|
120
|
+
rb_iv_set(self, "@content", string);
|
|
121
|
+
|
|
122
|
+
char *content = StringValuePtr(string);
|
|
123
|
+
return music.OpenFromMemory(content, RSTRING_LEN(string));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
bool ray_music::load_from_filename(const std::string &filename) {
|
|
127
|
+
return music.OpenFromFile(filename);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
void ray_music::play() {
|
|
131
|
+
music.Play();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void ray_music::pause() {
|
|
135
|
+
music.Pause();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
void ray_music::stop() {
|
|
139
|
+
music.Stop();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
sf::SoundSource::Status ray_music::status() const {
|
|
143
|
+
return music.GetStatus();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void ray_music::set_loop(bool value) {
|
|
147
|
+
music.SetLoop(value);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
bool ray_music::is_looping() const {
|
|
151
|
+
return music.GetLoop();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
float ray_music::current_time() const {
|
|
155
|
+
return music.GetPlayingOffset();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
void ray_music::set_current_time(float value) {
|
|
159
|
+
music.SetPlayingOffset(value);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
float ray_music::duration() const {
|
|
163
|
+
return music.GetDuration();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
int ray_music::sample_rate() const {
|
|
167
|
+
return music.GetSampleRate();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
int ray_music::channel_count() const {
|
|
171
|
+
return music.GetChannelsCount();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
sf::SoundSource &ray_music::source() {
|
|
175
|
+
return music;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const sf::SoundSource &ray_music::source() const {
|
|
179
|
+
return music;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
VALUE ray_mAudio = Qnil;
|
|
183
|
+
VALUE ray_cSound = Qnil;
|
|
184
|
+
VALUE ray_cMusic = Qnil;
|
|
185
|
+
VALUE ray_cAudioSource = Qnil;
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
@return [Float] The global volume. 0 is the minimum volume, whereas 100
|
|
189
|
+
is the maximum.
|
|
190
|
+
*/
|
|
191
|
+
VALUE ray_audio_volume(VALUE self) {
|
|
192
|
+
float volume = sf::Listener::GetGlobalVolume();
|
|
193
|
+
return rb_float_new(volume * 100);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Sets the global volume */
|
|
197
|
+
VALUE ray_audio_set_volume(VALUE self, VALUE value) {
|
|
198
|
+
float volume = (float)NUM2DBL(value);
|
|
199
|
+
sf::Listener::SetGlobalVolume(volume);
|
|
200
|
+
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
@return [Ray::Vector3] The position of the listener.
|
|
206
|
+
*/
|
|
207
|
+
VALUE ray_audio_pos(VALUE self) {
|
|
208
|
+
sf::Vector3f pos = sf::Listener::GetPosition();
|
|
209
|
+
return ray_vector3_to_rb(pos);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/*
|
|
213
|
+
@overload pos=(pos)
|
|
214
|
+
@param [Ray::Vector3, #to_vector3] pos The [x, y, z] position of the listener.
|
|
215
|
+
*/
|
|
216
|
+
VALUE ray_audio_set_pos(VALUE self, VALUE pos) {
|
|
217
|
+
sf::Listener::SetPosition(ray_convert_to_vector3(pos));
|
|
218
|
+
return pos;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/*
|
|
222
|
+
@return [Ray::Vector3] The orientation of the listener.
|
|
223
|
+
*/
|
|
224
|
+
VALUE ray_audio_direction(VALUE self) {
|
|
225
|
+
sf::Vector3f dir = sf::Listener::GetDirection();
|
|
226
|
+
return ray_vector3_to_rb(dir);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
@overload direction=(dir)
|
|
231
|
+
@param [Ray::Vector3, #to_vector3] dir The orientation of the listener.
|
|
232
|
+
*/
|
|
233
|
+
VALUE ray_audio_set_direction(VALUE self, VALUE dir) {
|
|
234
|
+
sf::Listener::SetDirection(ray_convert_to_vector3(dir));
|
|
235
|
+
return dir;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
ray_audio_source *ray_rb2source(VALUE object) {
|
|
239
|
+
if (!RAY_IS_A(object, ray_cAudioSource)) {
|
|
240
|
+
rb_raise(rb_eTypeError, "Can't convert %s into Ray::AudioSource",
|
|
241
|
+
RAY_OBJ_CLASSNAME(object));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
ray_audio_source *ptr = NULL;
|
|
245
|
+
Data_Get_Struct(object, ray_audio_source, ptr);
|
|
246
|
+
|
|
247
|
+
return ptr;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* @return [Float] Volume of the source, between 0 and 100. */
|
|
251
|
+
VALUE ray_audio_source_volume(VALUE self) {
|
|
252
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
253
|
+
return rb_float_new(source->volume());
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* Sets the volume of the source. */
|
|
257
|
+
VALUE ray_audio_source_set_volume(VALUE self, VALUE value) {
|
|
258
|
+
rb_check_frozen(self);
|
|
259
|
+
|
|
260
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
261
|
+
float volume = (float)NUM2DBL(value);
|
|
262
|
+
source->set_volume(volume);
|
|
263
|
+
|
|
264
|
+
return value;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* @return [Float] The pitch of the source. */
|
|
268
|
+
VALUE ray_audio_source_pitch(VALUE self) {
|
|
269
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
270
|
+
return rb_float_new(source->pitch());
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/*
|
|
274
|
+
@overload pitch=(pitch)
|
|
275
|
+
@param [Float] pitch the pitch value, which makes a sound more acute
|
|
276
|
+
or grave and also affects playing speed. Defaulted to 1.
|
|
277
|
+
*/
|
|
278
|
+
VALUE ray_audio_source_set_pitch(VALUE self, VALUE pitch) {
|
|
279
|
+
rb_check_frozen(self);
|
|
280
|
+
|
|
281
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
282
|
+
source->set_pitch(NUM2DBL(pitch));
|
|
283
|
+
|
|
284
|
+
return pitch;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* @return [Ray::Vector3] The position of the source */
|
|
288
|
+
VALUE ray_audio_source_pos(VALUE self) {
|
|
289
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
290
|
+
return ray_vector3_to_rb(source->position());
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/*
|
|
294
|
+
@overload pos=(pos)
|
|
295
|
+
@param [Ray::Vector3, #to_vector3] pos The position of the source
|
|
296
|
+
*/
|
|
297
|
+
VALUE ray_audio_source_set_pos(VALUE self, VALUE pos) {
|
|
298
|
+
rb_check_frozen(self);
|
|
299
|
+
|
|
300
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
301
|
+
source->set_position(ray_convert_to_vector3(pos));
|
|
302
|
+
|
|
303
|
+
return pos;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/*
|
|
307
|
+
@return [true, false] True if the source position is relative to the listener,
|
|
308
|
+
as opposed to being absolute.
|
|
309
|
+
*/
|
|
310
|
+
VALUE ray_audio_source_is_relative(VALUE self) {
|
|
311
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
312
|
+
return source->is_relative() ? Qtrue : Qfalse;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/*
|
|
316
|
+
@overload relative=(rel)
|
|
317
|
+
@param [true, false] rel Whether the source position should be relative
|
|
318
|
+
to the listener's.
|
|
319
|
+
*/
|
|
320
|
+
VALUE ray_audio_source_set_relative(VALUE self, VALUE val) {
|
|
321
|
+
rb_check_frozen(self);
|
|
322
|
+
|
|
323
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
324
|
+
source->set_relative(RTEST(val));
|
|
325
|
+
return val;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/* @return [Float] the source's minimal distance */
|
|
329
|
+
VALUE ray_audio_source_min_distance(VALUE self) {
|
|
330
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
331
|
+
return rb_float_new(source->min_distance());
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*
|
|
335
|
+
@overload min_distance=(dist)
|
|
336
|
+
@param [Float] dist the distance beyond which the source's volume will
|
|
337
|
+
decrease. Defaulted to 1.
|
|
338
|
+
*/
|
|
339
|
+
VALUE ray_audio_source_set_min_distance(VALUE self, VALUE dist) {
|
|
340
|
+
rb_check_frozen(self);
|
|
341
|
+
|
|
342
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
343
|
+
source->set_min_distance(NUM2DBL(dist));
|
|
344
|
+
return dist;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* @return [Float] The source's attenuation */
|
|
348
|
+
VALUE ray_audio_source_attenuation(VALUE self) {
|
|
349
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
350
|
+
return rb_float_new(source->attenuation());
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/*
|
|
354
|
+
@overload attenuation=(attenuation)
|
|
355
|
+
@param [Float] atenuation Attenuation factor of the sound.
|
|
356
|
+
0 will prevent the sound from being attenuated, 100 would
|
|
357
|
+
make the sound be attenuated much more quickly.
|
|
358
|
+
*/
|
|
359
|
+
VALUE ray_audio_source_set_attenuation(VALUE self, VALUE attenuation) {
|
|
360
|
+
rb_check_frozen(self);
|
|
361
|
+
|
|
362
|
+
ray_audio_source *source = ray_rb2source(self);
|
|
363
|
+
source->set_attenuation(NUM2DBL(attenuation));
|
|
364
|
+
return attenuation;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
ray_sound *ray_rb2sound(VALUE object) {
|
|
368
|
+
if (!RAY_IS_A(object, ray_cSound)) {
|
|
369
|
+
rb_raise(rb_eTypeError, "Can't convert %s into Ray::Sound",
|
|
370
|
+
RAY_OBJ_CLASSNAME(object));
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
ray_sound *ptr = NULL;
|
|
374
|
+
Data_Get_Struct(object, ray_sound, ptr);
|
|
375
|
+
|
|
376
|
+
return ptr;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
void ray_free_sound(ray_sound *sound) {
|
|
380
|
+
delete sound;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
VALUE ray_alloc_sound(VALUE self) {
|
|
384
|
+
ray_sound *ptr = new ray_sound;
|
|
385
|
+
VALUE ret = Data_Wrap_Struct(self, 0, ray_free_sound, ptr);
|
|
386
|
+
|
|
387
|
+
return ret;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
/*
|
|
391
|
+
@overload initialize(io_or_string)
|
|
392
|
+
Creates a new sound from an IO object or a filename.
|
|
393
|
+
*/
|
|
394
|
+
VALUE ray_init_sound(VALUE self, VALUE arg) {
|
|
395
|
+
int res = false;
|
|
396
|
+
ray_sound *sound = ray_rb2sound(self);
|
|
397
|
+
|
|
398
|
+
if (rb_respond_to(arg, RAY_METH("to_str"))) {
|
|
399
|
+
arg = rb_String(arg);
|
|
400
|
+
res = sound->load_from_filename(StringValuePtr(arg));
|
|
401
|
+
}
|
|
402
|
+
else if (rb_respond_to(arg, RAY_METH("read")))
|
|
403
|
+
res = sound->load_from_io(arg);
|
|
404
|
+
else {
|
|
405
|
+
rb_raise(rb_eTypeError, "Can't convert %s into String",
|
|
406
|
+
RAY_OBJ_CLASSNAME(arg));
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
if (!res)
|
|
410
|
+
rb_raise(rb_eRuntimeError, "Could not load sound");
|
|
411
|
+
|
|
412
|
+
return Qnil;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
VALUE ray_init_sound_copy(VALUE self, VALUE other) {
|
|
416
|
+
ray_sound *sound = ray_rb2sound(self);
|
|
417
|
+
ray_sound *source = ray_rb2sound(other);
|
|
418
|
+
|
|
419
|
+
if (!sound->create_from_sound(*source))
|
|
420
|
+
rb_raise(rb_eRuntimeError, "Couldn't copy the sound");
|
|
421
|
+
|
|
422
|
+
return self;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* Plays the sound. */
|
|
426
|
+
VALUE ray_sound_play(VALUE self) {
|
|
427
|
+
rb_check_frozen(self);
|
|
428
|
+
ray_rb2sound(self)->play();
|
|
429
|
+
return self;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
/* Pauses the sound. */
|
|
433
|
+
VALUE ray_sound_pause(VALUE self) {
|
|
434
|
+
rb_check_frozen(self);
|
|
435
|
+
ray_rb2sound(self)->pause();
|
|
436
|
+
return self;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/* Stops the sound. */
|
|
440
|
+
VALUE ray_sound_stop(VALUE self) {
|
|
441
|
+
rb_check_frozen(self);
|
|
442
|
+
ray_rb2sound(self)->stop();
|
|
443
|
+
return self;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/*
|
|
447
|
+
@return [Symbol] :playing, :paused, or :stopped.
|
|
448
|
+
*/
|
|
449
|
+
VALUE ray_sound_status(VALUE self) {
|
|
450
|
+
ray_sound *sound = ray_rb2sound(self);
|
|
451
|
+
|
|
452
|
+
switch (sound->status()) {
|
|
453
|
+
case sf::SoundSource::Playing: return RAY_SYM("playing");
|
|
454
|
+
case sf::SoundSource::Paused: return RAY_SYM("paused");
|
|
455
|
+
case sf::SoundSource::Stopped: return RAY_SYM("stopped");
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
return Qnil;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/* Sets whether the sound should loop */
|
|
462
|
+
VALUE ray_sound_set_loop(VALUE self, VALUE val) {
|
|
463
|
+
rb_check_frozen(self);
|
|
464
|
+
ray_rb2sound(self)->set_loop(RTEST(val));
|
|
465
|
+
return val;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/* @return [true, false] True if the sound loops */
|
|
469
|
+
VALUE ray_sound_loop(VALUE self) {
|
|
470
|
+
return ray_rb2sound(self)->is_looping() ? Qtrue : Qfalse;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/* @return [Float] The current position in the sound */
|
|
474
|
+
VALUE ray_sound_current_time(VALUE self) {
|
|
475
|
+
return rb_float_new(ray_rb2sound(self)->current_time());
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/* Sets the cursor to a given position */
|
|
479
|
+
VALUE ray_sound_set_current_time(VALUE self, VALUE val) {
|
|
480
|
+
rb_check_frozen(self);
|
|
481
|
+
ray_rb2sound(self)->set_current_time(NUM2DBL(val));
|
|
482
|
+
return val;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
ray_music *ray_rb2music(VALUE object) {
|
|
486
|
+
if (!RAY_IS_A(object, ray_cMusic)) {
|
|
487
|
+
rb_raise(rb_eTypeError, "Can't convert %s into Ray::Music",
|
|
488
|
+
RAY_OBJ_CLASSNAME(object));
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
ray_music *ptr = NULL;
|
|
492
|
+
Data_Get_Struct(object, ray_music, ptr);
|
|
493
|
+
|
|
494
|
+
return ptr;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
void ray_free_music(ray_music *music) {
|
|
498
|
+
delete music;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
VALUE ray_alloc_music(VALUE self) {
|
|
502
|
+
ray_music *ptr = new ray_music;
|
|
503
|
+
VALUE ret = Data_Wrap_Struct(self, 0, ray_free_music, ptr);
|
|
504
|
+
|
|
505
|
+
return ret;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
bool ray_init_music_with_filename(VALUE self, VALUE filename) {
|
|
509
|
+
ray_music *music = ray_rb2music(self);
|
|
510
|
+
return music->load_from_filename(StringValuePtr(filename));
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
bool ray_init_music_with_io(VALUE self, VALUE io) {
|
|
514
|
+
ray_music *music = ray_rb2music(self);
|
|
515
|
+
return music->load_from_io(self, io);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/*
|
|
519
|
+
@overload initialize(io_or_string)
|
|
520
|
+
Creates a new music from an IO object or a filename.
|
|
521
|
+
*/
|
|
522
|
+
VALUE ray_init_music(VALUE self, VALUE arg) {
|
|
523
|
+
bool res = false;
|
|
524
|
+
|
|
525
|
+
if (rb_respond_to(arg, RAY_METH("to_str")))
|
|
526
|
+
res = ray_init_music_with_filename(self, rb_String(arg));
|
|
527
|
+
else if (rb_respond_to(arg, RAY_METH("read")))
|
|
528
|
+
res = ray_init_music_with_io(self, arg);
|
|
529
|
+
else {
|
|
530
|
+
rb_raise(rb_eTypeError, "Can't convert %s into String",
|
|
531
|
+
RAY_OBJ_CLASSNAME(arg));
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
if (!res)
|
|
535
|
+
rb_raise(rb_eRuntimeError, "Could not load music");
|
|
536
|
+
|
|
537
|
+
return Qnil;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/*
|
|
541
|
+
Plays the music.
|
|
542
|
+
*/
|
|
543
|
+
VALUE ray_music_play(VALUE self) {
|
|
544
|
+
rb_check_frozen(self);
|
|
545
|
+
|
|
546
|
+
ray_music *music = ray_rb2music(self);
|
|
547
|
+
music->play();
|
|
548
|
+
|
|
549
|
+
return Qnil;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
/*
|
|
553
|
+
Pauses the music.
|
|
554
|
+
*/
|
|
555
|
+
VALUE ray_music_pause(VALUE self) {
|
|
556
|
+
rb_check_frozen(self);
|
|
557
|
+
|
|
558
|
+
ray_music *music = ray_rb2music(self);
|
|
559
|
+
music->pause();
|
|
560
|
+
|
|
561
|
+
return Qnil;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/*
|
|
565
|
+
Stops the music.
|
|
566
|
+
*/
|
|
567
|
+
VALUE ray_music_stop(VALUE self) {
|
|
568
|
+
rb_check_frozen(self);
|
|
569
|
+
|
|
570
|
+
ray_music *music = ray_rb2music(self);
|
|
571
|
+
music->stop();
|
|
572
|
+
|
|
573
|
+
return Qnil;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/*
|
|
577
|
+
@return [Symbol] :playing, :paused, or :stopped.
|
|
578
|
+
*/
|
|
579
|
+
VALUE ray_music_status(VALUE self) {
|
|
580
|
+
ray_music *music = ray_rb2music(self);
|
|
581
|
+
|
|
582
|
+
switch (music->status()) {
|
|
583
|
+
case sf::SoundSource::Playing: return RAY_SYM("playing");
|
|
584
|
+
case sf::SoundSource::Paused: return RAY_SYM("paused");
|
|
585
|
+
case sf::SoundSource::Stopped: return RAY_SYM("stopped");
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
return Qnil;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* Sets whether the music should loop */
|
|
592
|
+
VALUE ray_music_set_loop(VALUE self, VALUE val) {
|
|
593
|
+
rb_check_frozen(self);
|
|
594
|
+
ray_rb2music(self)->set_loop(RTEST(val));
|
|
595
|
+
return val;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/* @return [true, false] True if the music loops */
|
|
599
|
+
VALUE ray_music_loop(VALUE self) {
|
|
600
|
+
return ray_rb2music(self)->is_looping() ? Qtrue : Qfalse;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/* @return [Float] The current position in the music */
|
|
604
|
+
VALUE ray_music_current_time(VALUE self) {
|
|
605
|
+
return rb_float_new(ray_rb2music(self)->current_time());
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/* Sets the cursor to a given position */
|
|
609
|
+
VALUE ray_music_set_current_time(VALUE self, VALUE val) {
|
|
610
|
+
rb_check_frozen(self);
|
|
611
|
+
ray_rb2music(self)->set_current_time(NUM2DBL(val));
|
|
612
|
+
return val;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/* @return [Float] The duration of the music, in second */
|
|
616
|
+
VALUE ray_music_duration(VALUE self) {
|
|
617
|
+
return rb_float_new(ray_rb2music(self)->duration());
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
/* @return [Integer] The sample rate of the music */
|
|
621
|
+
VALUE ray_music_sample_rate(VALUE self) {
|
|
622
|
+
return INT2FIX(ray_rb2music(self)->sample_rate());
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/* @return [Integer] The amount of channels */
|
|
626
|
+
VALUE ray_music_channel_count(VALUE self) {
|
|
627
|
+
return INT2FIX(ray_rb2music(self)->channel_count());
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/*
|
|
631
|
+
Document-class: Ray::AudioSource
|
|
632
|
+
Represents an object emitting sound. The only point of having
|
|
633
|
+
this class is to avoid repetitions between Ray::Music and Ray:Audio.
|
|
634
|
+
*/
|
|
635
|
+
|
|
636
|
+
/*
|
|
637
|
+
Document-class: Ray::Music
|
|
638
|
+
Class used to stream music.
|
|
639
|
+
*/
|
|
640
|
+
|
|
641
|
+
/*
|
|
642
|
+
Document-class: Ray::Sound
|
|
643
|
+
Class used to represent short sounds.
|
|
644
|
+
*/
|
|
645
|
+
|
|
646
|
+
void Init_ray_audio() {
|
|
647
|
+
ray_mAudio = rb_define_module_under(ray_mRay, "Audio");
|
|
648
|
+
|
|
649
|
+
rb_define_module_function(ray_mAudio, "volume", ray_audio_volume, 0);
|
|
650
|
+
rb_define_module_function(ray_mAudio, "volume=", ray_audio_set_volume, 1);
|
|
651
|
+
|
|
652
|
+
rb_define_module_function(ray_mAudio, "pos", ray_audio_pos, 0);
|
|
653
|
+
rb_define_module_function(ray_mAudio, "pos=", ray_audio_set_pos, 1);
|
|
654
|
+
|
|
655
|
+
rb_define_module_function(ray_mAudio, "direction", ray_audio_direction, 0);
|
|
656
|
+
rb_define_module_function(ray_mAudio, "direction=", ray_audio_set_direction,
|
|
657
|
+
1);
|
|
658
|
+
|
|
659
|
+
ray_cAudioSource = rb_define_class_under(ray_mRay, "AudioSource", rb_cObject);
|
|
660
|
+
|
|
661
|
+
rb_define_method(ray_cAudioSource, "pitch", ray_audio_source_pitch, 0);
|
|
662
|
+
rb_define_method(ray_cAudioSource, "pitch=", ray_audio_source_set_pitch, 1);
|
|
663
|
+
|
|
664
|
+
rb_define_method(ray_cAudioSource, "pos", ray_audio_source_pos, 0);
|
|
665
|
+
rb_define_method(ray_cAudioSource, "pos=",
|
|
666
|
+
ray_audio_source_set_pos, 1);
|
|
667
|
+
|
|
668
|
+
rb_define_method(ray_cAudioSource, "relative?", ray_audio_source_is_relative,
|
|
669
|
+
0);
|
|
670
|
+
rb_define_method(ray_cAudioSource, "relative=", ray_audio_source_set_relative,
|
|
671
|
+
1);
|
|
672
|
+
|
|
673
|
+
rb_define_method(ray_cAudioSource, "min_distance",
|
|
674
|
+
ray_audio_source_min_distance, 0);
|
|
675
|
+
rb_define_method(ray_cAudioSource, "min_distance=",
|
|
676
|
+
ray_audio_source_set_min_distance, 1);
|
|
677
|
+
|
|
678
|
+
rb_define_method(ray_cAudioSource, "attenuation",
|
|
679
|
+
ray_audio_source_attenuation, 0);
|
|
680
|
+
rb_define_method(ray_cAudioSource, "attenuation=",
|
|
681
|
+
ray_audio_source_set_attenuation, 1);
|
|
682
|
+
|
|
683
|
+
rb_define_method(ray_cAudioSource, "volume", ray_audio_source_volume, 0);
|
|
684
|
+
rb_define_method(ray_cAudioSource, "volume=", ray_audio_source_set_volume, 1);
|
|
685
|
+
|
|
686
|
+
ray_cSound = rb_define_class_under(ray_mRay, "Sound", ray_cAudioSource);
|
|
687
|
+
rb_define_alloc_func(ray_cSound, ray_alloc_sound);
|
|
688
|
+
rb_define_method(ray_cSound, "initialize", ray_init_sound, 1);
|
|
689
|
+
rb_define_method(ray_cSound, "initialize_copy", ray_init_sound_copy, 1);
|
|
690
|
+
|
|
691
|
+
rb_define_method(ray_cSound, "play", ray_sound_play, 0);
|
|
692
|
+
rb_define_method(ray_cSound, "pause", ray_sound_pause, 0);
|
|
693
|
+
rb_define_method(ray_cSound, "stop", ray_sound_stop, 0);
|
|
694
|
+
|
|
695
|
+
rb_define_method(ray_cSound, "status", ray_sound_status, 0);
|
|
696
|
+
|
|
697
|
+
rb_define_method(ray_cSound, "loop=", ray_sound_set_loop, 1);
|
|
698
|
+
rb_define_method(ray_cSound, "loop?", ray_sound_loop, 0);
|
|
699
|
+
|
|
700
|
+
rb_define_method(ray_cSound, "current_time==", ray_sound_set_current_time, 1);
|
|
701
|
+
rb_define_method(ray_cSound, "current_time", ray_sound_current_time, 0);
|
|
702
|
+
|
|
703
|
+
ray_cMusic = rb_define_class_under(ray_mRay, "Music", ray_cAudioSource);
|
|
704
|
+
rb_define_alloc_func(ray_cMusic, ray_alloc_music);
|
|
705
|
+
rb_define_method(ray_cMusic, "initialize", ray_init_music, 1);
|
|
706
|
+
|
|
707
|
+
rb_define_method(ray_cMusic, "play", ray_music_play, 0);
|
|
708
|
+
rb_define_method(ray_cMusic, "pause", ray_music_pause, 0);
|
|
709
|
+
rb_define_method(ray_cMusic, "stop", ray_music_stop, 0);
|
|
710
|
+
|
|
711
|
+
rb_define_method(ray_cMusic, "status", ray_music_status, 0);
|
|
712
|
+
|
|
713
|
+
rb_define_method(ray_cMusic, "loop=", ray_music_set_loop, 1);
|
|
714
|
+
rb_define_method(ray_cMusic, "loop?", ray_music_loop, 0);
|
|
715
|
+
|
|
716
|
+
rb_define_method(ray_cMusic, "current_time==", ray_music_set_current_time, 1);
|
|
717
|
+
rb_define_method(ray_cMusic, "current_time", ray_music_current_time, 0);
|
|
718
|
+
|
|
719
|
+
rb_define_method(ray_cMusic, "duration", ray_music_duration, 0);
|
|
720
|
+
|
|
721
|
+
rb_define_method(ray_cMusic, "sample_rate", ray_music_sample_rate, 0);
|
|
722
|
+
rb_define_method(ray_cMusic, "channel_count", ray_music_channel_count, 0);
|
|
723
|
+
}
|