ashton 0.0.1alpha → 0.0.2alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +21 -21
- data/README.md +95 -68
- data/Rakefile +41 -23
- data/examples/bloom_example.rb +59 -0
- data/examples/lighting_example.rb +127 -0
- data/examples/media/SmallStar.png +0 -0
- data/examples/media/Starfighter.png +0 -0
- data/examples/media/simple.png +0 -0
- data/examples/noise_example.rb +94 -0
- data/examples/outline_example.rb +86 -0
- data/examples/particle_emitter_example.rb +114 -0
- data/examples/pixelate_example.rb +51 -49
- data/examples/pixelated_texture_example.rb +69 -0
- data/examples/radial_blur_example.rb +60 -62
- data/examples/shader_image_example.rb +74 -41
- data/examples/{shockwave2_example.rb → shockwave_example.rb} +74 -75
- data/examples/stencil_shader_example.rb +104 -0
- data/examples/{framebuffer_example.rb → texture_render_example.rb} +53 -49
- data/examples/{tv_screen_and_noise_example.rb → tv_screen_and_static_example.rb} +59 -59
- data/ext/ashton/GLee.c +18170 -0
- data/ext/ashton/GLee.h +17647 -0
- data/ext/ashton/ashton.c +42 -0
- data/ext/ashton/ashton.h +31 -0
- data/ext/ashton/color.c +45 -0
- data/ext/ashton/color.h +25 -0
- data/ext/ashton/common.h +41 -0
- data/ext/ashton/extconf.rb +42 -0
- data/ext/ashton/fast_math.c +30 -0
- data/ext/ashton/fast_math.h +30 -0
- data/ext/ashton/font.c +8 -0
- data/ext/ashton/font.h +16 -0
- data/ext/ashton/gosu.c +18 -0
- data/ext/ashton/gosu.h +19 -0
- data/ext/ashton/image.c +8 -0
- data/ext/ashton/image.h +16 -0
- data/ext/ashton/particle_emitter.c +788 -0
- data/ext/ashton/particle_emitter.h +171 -0
- data/ext/ashton/pixel_cache.c +237 -0
- data/ext/ashton/pixel_cache.h +58 -0
- data/ext/ashton/shader.c +9 -0
- data/ext/ashton/shader.h +16 -0
- data/ext/ashton/texture.c +442 -0
- data/ext/ashton/texture.h +63 -0
- data/ext/ashton/window.c +8 -0
- data/ext/ashton/window.h +16 -0
- data/lib/ashton.rb +38 -26
- data/lib/ashton/1.9/ashton.so +0 -0
- data/lib/ashton/gosu_ext/color.rb +24 -11
- data/lib/ashton/gosu_ext/font.rb +58 -0
- data/lib/ashton/gosu_ext/gosu_module.rb +16 -0
- data/lib/ashton/gosu_ext/image.rb +95 -31
- data/lib/ashton/gosu_ext/window.rb +78 -35
- data/lib/ashton/image_stub.rb +32 -36
- data/lib/ashton/lighting/light_source.rb +146 -0
- data/lib/ashton/lighting/manager.rb +98 -0
- data/lib/ashton/mixins/version_checking.rb +23 -0
- data/lib/ashton/particle_emitter.rb +87 -0
- data/lib/ashton/pixel_cache.rb +24 -0
- data/lib/ashton/shader.rb +353 -35
- data/lib/ashton/shaders/bloom.frag +41 -0
- data/lib/ashton/shaders/color_inversion.frag +11 -0
- data/lib/ashton/{post_process → shaders}/contrast.frag +16 -16
- data/lib/ashton/{shader → shaders}/default.frag +22 -19
- data/lib/ashton/{shader → shaders}/default.vert +13 -13
- data/lib/ashton/shaders/fade.frag +14 -0
- data/lib/ashton/shaders/grayscale.frag +15 -0
- data/lib/ashton/shaders/include/classicnoise2d.glsl +113 -0
- data/lib/ashton/shaders/include/classicnoise3d.glsl +177 -0
- data/lib/ashton/shaders/include/classicnoise4d.glsl +302 -0
- data/lib/ashton/{include/simplex.glsl → shaders/include/noise2d.glsl} +70 -63
- data/lib/ashton/shaders/include/noise3d.glsl +102 -0
- data/lib/ashton/shaders/include/noise4d.glsl +128 -0
- data/lib/ashton/shaders/include/rand.glsl +5 -0
- data/lib/ashton/shaders/lighting/distort.frag +57 -0
- data/lib/ashton/shaders/lighting/draw_shadows.frag +60 -0
- data/lib/ashton/shaders/lighting/shadow_blur.frag +60 -0
- data/lib/ashton/shaders/mezzotint.frag +22 -0
- data/lib/ashton/shaders/multitexture2.vert +19 -0
- data/lib/ashton/shaders/outline.frag +45 -0
- data/lib/ashton/{post_process → shaders}/pixelate.frag +48 -48
- data/lib/ashton/shaders/radial_blur.frag +63 -0
- data/lib/ashton/shaders/sepia.frag +26 -0
- data/lib/ashton/{post_process/shockwave2.frag → shaders/shockwave.frag} +38 -35
- data/lib/ashton/shaders/signed_distance_field.frag +80 -0
- data/lib/ashton/{post_process/noise.frag → shaders/static.frag} +25 -27
- data/lib/ashton/shaders/stencil.frag +27 -0
- data/lib/ashton/shaders/tv_screen.frag +23 -0
- data/lib/ashton/signed_distance_field.rb +151 -0
- data/lib/ashton/texture.rb +186 -0
- data/lib/ashton/version.rb +2 -2
- data/lib/ashton/window_buffer.rb +16 -0
- data/spec/ashton/ashton_spec.rb +22 -0
- data/spec/ashton/gosu_ext/color_spec.rb +34 -0
- data/spec/ashton/gosu_ext/font_spec.rb +57 -0
- data/spec/ashton/gosu_ext/gosu_spec.rb +11 -0
- data/spec/ashton/gosu_ext/image_spec.rb +66 -0
- data/spec/ashton/gosu_ext/window_spec.rb +71 -0
- data/spec/ashton/image_stub_spec.rb +46 -0
- data/spec/ashton/particle_emitter_spec.rb +123 -0
- data/spec/ashton/pixel_cache_spec.rb +153 -0
- data/spec/ashton/shader_spec.rb +152 -0
- data/spec/ashton/signed_distance_field_spec.rb +163 -0
- data/spec/ashton/texture_spec.rb +347 -0
- data/spec/helper.rb +12 -0
- metadata +159 -28
- data/examples/output/README.txt +0 -1
- data/lib/ashton/base_shader.rb +0 -172
- data/lib/ashton/framebuffer.rb +0 -183
- data/lib/ashton/post_process.rb +0 -83
- data/lib/ashton/post_process/default.vert +0 -9
- data/lib/ashton/post_process/fade.frag +0 -11
- data/lib/ashton/post_process/mezzotint.frag +0 -24
- data/lib/ashton/post_process/radial_blur.frag +0 -31
- data/lib/ashton/post_process/sepia.frag +0 -19
- data/lib/ashton/post_process/shockwave.frag +0 -40
- data/lib/ashton/post_process/tv_screen.frag +0 -32
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ashton
|
2
|
+
# A texture that is the same size as the Gosu::Window.
|
3
|
+
class WindowBuffer < Texture
|
4
|
+
def initialize
|
5
|
+
super $window.width, $window.height
|
6
|
+
end
|
7
|
+
|
8
|
+
public
|
9
|
+
# Copy the window contents into the buffer.
|
10
|
+
def capture
|
11
|
+
glBindTexture GL_TEXTURE_2D, id
|
12
|
+
glCopyTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, width, height, 0
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
require_relative "../helper.rb"
|
3
|
+
|
4
|
+
describe Ashton do
|
5
|
+
let(:accuracy) { 0.000001 }
|
6
|
+
|
7
|
+
describe "fast_sin" do
|
8
|
+
it "should give the same result as Math.sin" do
|
9
|
+
(-360..360).step 90 do |angle|
|
10
|
+
Ashton.fast_sin(angle).should be_within(accuracy).of Math.sin(angle.gosu_to_radians)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "fast_cos" do
|
16
|
+
it "should give the same result as Math.cos" do
|
17
|
+
(-360..360).step 90 do |angle|
|
18
|
+
Ashton.fast_cos(angle).should be_within(accuracy).of Math.cos(angle.gosu_to_radians)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "../../helper.rb"
|
2
|
+
|
3
|
+
describe Gosu::Color do
|
4
|
+
let :conversions do
|
5
|
+
[
|
6
|
+
[Gosu::Color::RED, [1.0, 0.0, 0.0, 1.0]],
|
7
|
+
[Gosu::Color::GREEN, [0.0, 1.0, 0.0, 1.0]],
|
8
|
+
[Gosu::Color::BLUE, [0.0, 0.0, 1.0, 1.0]],
|
9
|
+
[Gosu::Color.rgba(25, 50, 75, 125), [0.09803921568627451, 0.19607843137254902, 0.29411764705882354, 0.49019607843137253]],
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "to_opengl" do
|
14
|
+
it "should convert from Color to float array" do
|
15
|
+
conversions.each do |gosu, opengl|
|
16
|
+
gosu.to_opengl.should eq opengl
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".from_opengl" do
|
22
|
+
it "should create the expected Colors from a float array" do
|
23
|
+
conversions.each do |gosu, opengl|
|
24
|
+
Gosu::Color.from_opengl(opengl).should eq gosu
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "to_i" do
|
30
|
+
it "should convert to an ARGB8 value" do
|
31
|
+
Gosu::Color.new(0x01234567).to_i.should eq 0x01234567
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative "../../helper.rb"
|
2
|
+
|
3
|
+
describe Gosu::Font do
|
4
|
+
before :each do
|
5
|
+
$window = Gosu::Window.new 16, 16, false
|
6
|
+
end
|
7
|
+
let(:subject) { described_class.new $window, Gosu::default_font_name, 20 }
|
8
|
+
let(:shader) { Ashton::Shader.new }
|
9
|
+
|
10
|
+
describe "draw" do
|
11
|
+
it "should pass parameters through normally, without a hash" do
|
12
|
+
mock(subject).draw_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7
|
13
|
+
|
14
|
+
subject.draw "bleh", 1, 2, 3, 4, 5, 6, 7
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should pass parameters through normally, without :shader in the hash" do
|
18
|
+
mock(subject).draw_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7
|
19
|
+
|
20
|
+
subject.draw "bleh", 1, 2, 3, 4, 5, 6, 7, shader: shader
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should use the shader if supplied" do
|
24
|
+
mock(shader) do |m|
|
25
|
+
m.enable 3
|
26
|
+
m.disable 3
|
27
|
+
end
|
28
|
+
mock(subject).draw_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7
|
29
|
+
|
30
|
+
subject.draw "bleh", 1, 2, 3, 4, 5, 6, 7, shader: shader
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "draw_rel" do
|
35
|
+
it "should pass parameters through normally, without a hash" do
|
36
|
+
mock(subject).draw_rel_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9
|
37
|
+
|
38
|
+
subject.draw_rel "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should pass parameters through normally, without :shader in the hash" do
|
42
|
+
mock(subject).draw_rel_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9
|
43
|
+
|
44
|
+
subject.draw_rel "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9, shader: shader
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should use the shader if supplied" do
|
48
|
+
mock(shader) do |m|
|
49
|
+
m.enable 3
|
50
|
+
m.disable 3
|
51
|
+
end
|
52
|
+
mock(subject).draw_rel_without_hash "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9
|
53
|
+
|
54
|
+
subject.draw_rel "bleh", 1, 2, 3, 4, 5, 6, 7, 8, 9, shader: shader
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative "../../helper.rb"
|
2
|
+
|
3
|
+
describe Gosu do
|
4
|
+
describe "enable_undocumented_retrofication" do
|
5
|
+
it "should set Texture.pixelated? true" do
|
6
|
+
Ashton::Texture.should_not be_pixelated
|
7
|
+
Gosu.enable_undocumented_retrofication
|
8
|
+
Ashton::Texture.should be_pixelated
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require_relative "../../helper.rb"
|
2
|
+
|
3
|
+
describe Gosu::Image do
|
4
|
+
before :each do
|
5
|
+
$window = Gosu::Window.new 16, 16, false
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:subject) { described_class.new $window, media_path("LargeStar.png") }
|
9
|
+
|
10
|
+
describe "draw" do
|
11
|
+
it "should pass parameters through normally, without a hash" do
|
12
|
+
mock(subject).draw_without_hash 0, 1, 2, 3, 4, 5
|
13
|
+
|
14
|
+
subject.draw 0, 1, 2, 3, 4, 5
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should pass parameters through normally, without :shader in the hash" do
|
18
|
+
mock(subject).draw_without_hash 0, 1, 2, 3, 4, 5
|
19
|
+
|
20
|
+
subject.draw 0, 1, 2, 3, 4, 5, {}
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should use the shader if supplied" do
|
24
|
+
mock(shader = Ashton::Shader.new) do |m|
|
25
|
+
m.enable 2
|
26
|
+
m.image = subject
|
27
|
+
m.disable 2
|
28
|
+
end
|
29
|
+
mock(subject).draw_without_hash 0, 1, 2, 3, 4, 5
|
30
|
+
|
31
|
+
subject.draw 0, 1, 2, 3, 4, 5, :shader => shader
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "draw_rot" do
|
36
|
+
it "should pass parameters through normally, without a hash" do
|
37
|
+
mock(subject).draw_rot_without_hash 0, 1, 2, 3, 4, 5, 6, 7, 8
|
38
|
+
|
39
|
+
subject.draw_rot 0, 1, 2, 3, 4, 5, 6, 7, 8
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should pass parameters through normally, without :shader in the hash" do
|
43
|
+
mock(subject).draw_rot_without_hash 0, 1, 2, 3, 4, 5, 6, 7, 8
|
44
|
+
|
45
|
+
subject.draw_rot 0, 1, 2, 3, 4, 5, 6, 7, 8, {}
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should use the shader if supplied" do
|
49
|
+
mock(shader = Ashton::Shader.new) do |m|
|
50
|
+
m.enable 2
|
51
|
+
m.image = subject
|
52
|
+
m.disable 2
|
53
|
+
end
|
54
|
+
mock(subject).draw_rot_without_hash 0, 1, 2, 3, 4, 5, 6, 7, 8
|
55
|
+
|
56
|
+
subject.draw_rot 0, 1, 2, 3, 4, 5, 6, 7, 8, :shader => shader
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "to_texture" do
|
61
|
+
it "should create a texture identical to the image" do
|
62
|
+
texture = subject.to_texture
|
63
|
+
texture.to_blob.should eq subject.to_blob
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require_relative "../../helper.rb"
|
2
|
+
|
3
|
+
describe Gosu::Window do
|
4
|
+
before :all do
|
5
|
+
$window ||= Gosu::Window.new 16, 16, false
|
6
|
+
end
|
7
|
+
|
8
|
+
# Class methods.
|
9
|
+
|
10
|
+
describe "Window.pixel" do
|
11
|
+
it "should be a 1x1 image" do
|
12
|
+
described_class.pixel.should be_kind_of Gosu::Image
|
13
|
+
described_class.pixel.width.should eq 1
|
14
|
+
described_class.pixel.height.should eq 1
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should be white" do
|
18
|
+
described_class.pixel[0, 0].should eq [1.0, 1.0, 1.0, 1.0]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "Window.primary_buffer" do
|
23
|
+
it "should be a window sized buffer" do
|
24
|
+
described_class.primary_buffer.should be_kind_of Ashton::WindowBuffer
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "Window.secondary_buffer" do
|
29
|
+
it "should be a window sized buffer" do
|
30
|
+
described_class.secondary_buffer.should be_kind_of Ashton::WindowBuffer
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should not be the same as the primary buffer" do
|
34
|
+
described_class.secondary_buffer.should_not eq described_class.primary_buffer
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Instance methods
|
39
|
+
|
40
|
+
describe "post_process" do
|
41
|
+
pending
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "pixel" do
|
45
|
+
it "should be a 1x1 image" do
|
46
|
+
$window.pixel.should be_kind_of Gosu::Image
|
47
|
+
$window.pixel.width.should eq 1
|
48
|
+
$window.pixel.height.should eq 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be white" do
|
52
|
+
$window.pixel[0, 0].should eq [1.0, 1.0, 1.0, 1.0]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "primary_buffer" do
|
57
|
+
it "should be a window sized buffer" do
|
58
|
+
$window.primary_buffer.should be_kind_of Ashton::WindowBuffer
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "secondary_buffer" do
|
63
|
+
it "should be a window sized buffer" do
|
64
|
+
$window.secondary_buffer.should be_kind_of Ashton::WindowBuffer
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should not be the same as the primary buffer" do
|
68
|
+
$window.secondary_buffer.should_not eq $window.primary_buffer
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative "../helper.rb"
|
2
|
+
|
3
|
+
describe Ashton::ImageStub do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "should fail if the blob data is not the expected size" do
|
6
|
+
lambda do
|
7
|
+
described_class.new "\0\0\0", 2, 3
|
8
|
+
end.should raise_error ArgumentError, /Expected blob to be 24 bytes/
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should fail width <= 0" do
|
12
|
+
lambda do
|
13
|
+
described_class.new "\0\0\0\0", 0, 2
|
14
|
+
end.should raise_error ArgumentError, /Width must be >= 1 pixel/
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should fail height <= 0" do
|
18
|
+
lambda do
|
19
|
+
described_class.new "\0\0\0\0", 2, 0
|
20
|
+
end.should raise_error ArgumentError, /Height must be >= 1 pixel/
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "instantiated" do
|
25
|
+
let(:two_by_three_blob) { 24.times.to_a.pack("C*") }
|
26
|
+
let(:subject) { described_class.new two_by_three_blob, 2, 3 }
|
27
|
+
|
28
|
+
describe "#to_blob" do
|
29
|
+
it "should return the blob given" do
|
30
|
+
subject.to_blob.should eq two_by_three_blob
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#columns" do
|
35
|
+
it "should equal the width of the blob" do
|
36
|
+
subject.columns.should eq 2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#rows" do
|
41
|
+
it "should equal the height of the blob" do
|
42
|
+
subject.rows.should eq 3
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require_relative "../helper.rb"
|
2
|
+
|
3
|
+
# Values and their defaults. The deviations default to 0.
|
4
|
+
FLOATS_WITH_RANGE = {
|
5
|
+
angular_velocity: 0.0..0.0,
|
6
|
+
center_x: 0.5..0.5,
|
7
|
+
center_y: 0.5..0.5,
|
8
|
+
fade: 0.0..0.0,
|
9
|
+
friction: 0.0..0.0,
|
10
|
+
interval: Float::INFINITY..Float::INFINITY,
|
11
|
+
scale: 1.0..1.0,
|
12
|
+
speed: 0.0..0.0,
|
13
|
+
time_to_live: Float::INFINITY..Float::INFINITY,
|
14
|
+
zoom: 0.0..0.0,
|
15
|
+
}
|
16
|
+
|
17
|
+
describe Ashton::ParticleEmitter do
|
18
|
+
before :all do
|
19
|
+
$window ||= Gosu::Window.new 16, 16, false
|
20
|
+
# Need not to create a large number of these.
|
21
|
+
@emitter = described_class.new 1, 2, 3
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:default_max) { 1000 }
|
25
|
+
let(:subject) { @emitter }
|
26
|
+
|
27
|
+
describe "initialize" do
|
28
|
+
[:x, :y, :z].each.with_index(1) do |attr, value|
|
29
|
+
it "should set #{attr}" do
|
30
|
+
subject.send(attr).should be_kind_of Float
|
31
|
+
subject.send(attr).should eq value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
FLOATS_WITH_RANGE.each_pair do |attr, expected|
|
36
|
+
it "should set #{attr}" do
|
37
|
+
subject.send(attr).should be_kind_of Range
|
38
|
+
subject.send(attr).should eq expected
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be set max_particles" do
|
43
|
+
subject.max_particles.should be_kind_of Fixnum
|
44
|
+
subject.max_particles.should eq default_max
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not have any particles" do
|
48
|
+
subject.count.should eq 0
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should have color set to white" do
|
52
|
+
subject.color.should eq Gosu::Color::WHITE
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
[:x, :y, :z].each.with_index(1) do |attr, value|
|
57
|
+
describe "#{attr}=" do
|
58
|
+
it "should set the value of #{attr}" do
|
59
|
+
->{ subject.send "#{attr}=", value + 5.0 }.should change(subject, attr).from(value).to(value + 5)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
FLOATS_WITH_RANGE.keys.each do |attr|
|
65
|
+
describe "#{attr}=" do
|
66
|
+
it "should set #{attr} with a number" do
|
67
|
+
subject.send("#{attr}=", 42.0).should eq 42.0
|
68
|
+
subject.send("#{attr}").should eq 42.0..42.0
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should set #{attr} with a range" do
|
72
|
+
subject.send("#{attr}=", 42.0..99.0).should eq 42.0..99.0
|
73
|
+
subject.send("#{attr}").should eq 42.0..99.0
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "color=" do
|
79
|
+
it "should set color" do
|
80
|
+
(subject.color = Gosu::Color::BLACK).should eq Gosu::Color::BLACK
|
81
|
+
subject.color.should eq Gosu::Color::BLACK
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "draw" do
|
86
|
+
it "should respond to #draw" do
|
87
|
+
subject.draw
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "emit" do
|
92
|
+
it "should create one more particle" do
|
93
|
+
->{ subject.emit }.should change(subject, :count).from(0).to(1)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should replace a particle if we are already at max particles" do
|
97
|
+
(default_max + 1).times { subject.emit }
|
98
|
+
subject.count.should eq default_max
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "update" do
|
103
|
+
it "should an appropriate number of particles" do
|
104
|
+
subject = described_class.new 1, 2, 3, interval: 0.001
|
105
|
+
mock(subject).emit.times 16
|
106
|
+
subject.update 1.0 / 60.0 # 16.66667 ms
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should not emit a particle if delta is less than interval" do
|
110
|
+
subject = described_class.new 1, 2, 3, interval: 0.020
|
111
|
+
dont_allow(subject).emit
|
112
|
+
subject.update 1.0 / 60.0 # 16.66667 ms
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should fail given a negative delta" do
|
116
|
+
->{ subject.update -1 }.should raise_error ArgumentError, "delta must be >= 0"
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should fail for a bad delta type" do
|
120
|
+
->{ subject.update "fred" }.should raise_error TypeError
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|