ashton 0.0.1alpha → 0.0.2alpha
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/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
|
Binary file
|
|
Binary file
|
data/examples/media/simple.png
CHANGED
|
Binary file
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Use of GLSL shader in Gosu to post-process the entire screen.
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
$LOAD_PATH.unshift File.expand_path('../lib/', File.dirname(__FILE__))
|
|
9
|
+
require "ashton"
|
|
10
|
+
|
|
11
|
+
def media_path(file); File.expand_path "media/#{file}", File.dirname(__FILE__) end
|
|
12
|
+
|
|
13
|
+
class TestWindow < Gosu::Window
|
|
14
|
+
NOISE_FRAGMENT =<<-END
|
|
15
|
+
#version 110
|
|
16
|
+
|
|
17
|
+
// Use 3D Simplex noise, even though the shader operates on a 2D
|
|
18
|
+
// texture, since then we can make the Z-coordinate act as time.
|
|
19
|
+
#include <noise3d>
|
|
20
|
+
|
|
21
|
+
uniform sampler2D in_Texture;
|
|
22
|
+
|
|
23
|
+
uniform float in_T;
|
|
24
|
+
uniform vec4 in_BlobColor;
|
|
25
|
+
|
|
26
|
+
varying vec2 var_TexCoord;
|
|
27
|
+
|
|
28
|
+
void main()
|
|
29
|
+
{
|
|
30
|
+
gl_FragColor = texture2D(in_Texture, var_TexCoord);
|
|
31
|
+
|
|
32
|
+
// First layer. faster, low intensity, small scale blobbing.
|
|
33
|
+
// Use [x, y, t] to create a 2D noise that varies over time.
|
|
34
|
+
vec3 position1 = vec3(var_TexCoord * 25.0, in_T * 1.6);
|
|
35
|
+
|
|
36
|
+
// Gives range 0.75..1.25
|
|
37
|
+
float brightness1 = snoise(position1) / 4.0 + 1.0;
|
|
38
|
+
|
|
39
|
+
// Second layer - slow, high intensity, large-scale blobbing
|
|
40
|
+
// This decides where the first layer will be "seen"
|
|
41
|
+
// Use [x, y, t] to create a 2D noise that varies over time.
|
|
42
|
+
vec3 position2 = vec3(var_TexCoord * 3.0, in_T * 0.16);
|
|
43
|
+
|
|
44
|
+
// Gives range 0.3..1.3
|
|
45
|
+
float brightness2 = snoise(position2) / 2.0 + 0.8;
|
|
46
|
+
|
|
47
|
+
if(brightness2 > 0.8)
|
|
48
|
+
{
|
|
49
|
+
gl_FragColor.rgb += in_BlobColor.rgb;
|
|
50
|
+
gl_FragColor.rgb *= brightness1 * brightness2;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
END
|
|
54
|
+
|
|
55
|
+
def initialize
|
|
56
|
+
super 640, 480, false
|
|
57
|
+
self.caption = "Post-processing with the simplex noise function - intelligent blob?"
|
|
58
|
+
|
|
59
|
+
@noise = Ashton::Shader.new fragment: NOISE_FRAGMENT, uniforms: {
|
|
60
|
+
blob_color: Gosu::Color.rgb(0, 40, 0),
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@font = Gosu::Font.new self, Gosu::default_font_name, 40
|
|
64
|
+
@background = Gosu::Image.new(self, media_path("Earth.png"), true)
|
|
65
|
+
@start_time = Time.now
|
|
66
|
+
|
|
67
|
+
update # Ensure the values are initially set.
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def update
|
|
71
|
+
$gosu_blocks.clear if defined? $gosu_blocks # Workaround for Gosu bug (0.7.45)
|
|
72
|
+
@noise.t = Time.now - @start_time
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def draw
|
|
76
|
+
post_process @noise do
|
|
77
|
+
@background.draw 0, 0, 0, width.fdiv(@background.width), height.fdiv(@background.height)
|
|
78
|
+
|
|
79
|
+
@font.draw_rel "Hello world!", 350, 50, 0, 0.5, 0.5, 1, 1, Gosu::Color::GREEN
|
|
80
|
+
@font.draw_rel "Goodbye world!", 400, 350, 0, 0.5, 0.5, 2, 2, Gosu::Color::BLUE
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Drawing after the effect isn't processed, which is useful for GUI elements.
|
|
84
|
+
@font.draw "FPS: #{Gosu::fps}", 0, 0, 0
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def button_down(id)
|
|
88
|
+
if id == Gosu::KbEscape
|
|
89
|
+
close
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
TestWindow.new.show
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Use of GLSL shader in Gosu to post-process the entire screen.
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
$LOAD_PATH.unshift File.expand_path('../lib/', File.dirname(__FILE__))
|
|
9
|
+
require "ashton"
|
|
10
|
+
|
|
11
|
+
def media_path(file); File.expand_path "media/#{file}", File.dirname(__FILE__) end
|
|
12
|
+
|
|
13
|
+
class TestWindow < Gosu::Window
|
|
14
|
+
def initialize
|
|
15
|
+
super 640, 480, false
|
|
16
|
+
|
|
17
|
+
Gosu::enable_undocumented_retrofication
|
|
18
|
+
|
|
19
|
+
self.caption = "Image, font and buffer composition drawn with 'outline' shader"
|
|
20
|
+
|
|
21
|
+
@outline = Ashton::Shader.new fragment: :outline
|
|
22
|
+
|
|
23
|
+
@font = Gosu::Font.new self, Gosu::default_font_name, 40
|
|
24
|
+
@ship = Gosu::Image.new(self, media_path("Starfighter.png"), true)
|
|
25
|
+
@background = Gosu::Image.new(self, media_path("Earth.png"), true)
|
|
26
|
+
|
|
27
|
+
@buffer = Ashton::Texture.new width, height
|
|
28
|
+
|
|
29
|
+
render_to_buffer
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def update
|
|
33
|
+
$gosu_blocks.clear if defined? $gosu_blocks # Workaround for Gosu bug (0.7.45)
|
|
34
|
+
render_to_buffer
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def render_to_buffer
|
|
38
|
+
# Draw together into a temp buffer, before outlining all together.
|
|
39
|
+
@buffer.render do |buffer|
|
|
40
|
+
buffer.clear
|
|
41
|
+
|
|
42
|
+
10.downto(1) do |i|
|
|
43
|
+
scale = i / 2.0
|
|
44
|
+
angle = i * 15 + Time.now.to_f * 10
|
|
45
|
+
|
|
46
|
+
@ship.draw_rot i * 25, 15 + i * 30, 0, angle, 0.5, 0.5, scale, scale
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def button_down(id)
|
|
52
|
+
if id == Gosu::KbEscape
|
|
53
|
+
close
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def draw
|
|
58
|
+
@background.draw 0, 0, 0, width.fdiv(@background.width), height.fdiv(@background.height)
|
|
59
|
+
|
|
60
|
+
@outline.outline_width = 2.0
|
|
61
|
+
@outline.outline_color = Gosu::Color::YELLOW
|
|
62
|
+
@buffer.draw 0, 0, 0, shader: @outline
|
|
63
|
+
|
|
64
|
+
# Draw individually, each with their own outline.
|
|
65
|
+
10.downto(1) do |i|
|
|
66
|
+
scale = i / 2.0
|
|
67
|
+
angle = i * 15 + Time.now.to_f * 10
|
|
68
|
+
|
|
69
|
+
@outline.outline_color = [Gosu::Color::RED, Gosu::Color::WHITE][i % 2]
|
|
70
|
+
|
|
71
|
+
# This keeps the outline of constant width on the screen,
|
|
72
|
+
# compared to the sprite pixels. Wouldn't keep updating this in real usage, of course.
|
|
73
|
+
@outline.outline_width = 0.9 / scale
|
|
74
|
+
|
|
75
|
+
@ship.draw_rot 225 + i * 25, 15 + i * 30, 0, angle, 0.5, 0.5, scale, scale, :shader => @outline
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Guitastic!
|
|
79
|
+
@outline.outline_width = 2.0
|
|
80
|
+
@outline.outline_color = Gosu::Color::BLACK
|
|
81
|
+
@font.draw "FPS:", 0, 0, 0, 1, 1, Gosu::Color::BLUE, shader: @outline
|
|
82
|
+
@font.draw_rel "#{Gosu::fps}", 150, 0, 0, 1, 0, 1, 1, Gosu::Color::GREEN, shader: @outline
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
TestWindow.new.show
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
begin
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
rescue LoadError
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
$LOAD_PATH.unshift File.expand_path('../lib/', File.dirname(__FILE__))
|
|
7
|
+
require "ashton"
|
|
8
|
+
|
|
9
|
+
def media_path(file); File.expand_path "media/#{file}", File.dirname(__FILE__) end
|
|
10
|
+
|
|
11
|
+
class TestWindow < Gosu::Window
|
|
12
|
+
def initialize
|
|
13
|
+
super 640, 480, false
|
|
14
|
+
self.caption = "Particle emitters - 4 emitters at static positions and one on mouse"
|
|
15
|
+
|
|
16
|
+
@grayscale = Ashton::Shader.new fragment: :grayscale
|
|
17
|
+
|
|
18
|
+
@font = Gosu::Font.new self, Gosu::default_font_name, 24
|
|
19
|
+
@star = Gosu::Image.new self, media_path("SmallStar.png"), true
|
|
20
|
+
|
|
21
|
+
@image_emitter = Ashton::ParticleEmitter.new 450, 100, 0,
|
|
22
|
+
image: @star,
|
|
23
|
+
scale: 0.2,
|
|
24
|
+
speed: 40,
|
|
25
|
+
friction: 0.1,
|
|
26
|
+
max_particles: 30000,
|
|
27
|
+
interval: 0.00015,
|
|
28
|
+
fade: 57, # loses 25 alpha/s
|
|
29
|
+
angular_velocity: -50..50
|
|
30
|
+
|
|
31
|
+
@shaded_image_emitter = Ashton::ParticleEmitter.new 450, 350, 0,
|
|
32
|
+
image: @star,
|
|
33
|
+
shader: @grayscale,
|
|
34
|
+
interval: 0.00015,
|
|
35
|
+
offset: 0..10,
|
|
36
|
+
max_particles: 30000,
|
|
37
|
+
angular_velocity: 20..50,
|
|
38
|
+
center_x: 3..8, center_y: 3..8,
|
|
39
|
+
zoom: -0.22 # Shrinks, so doesn't need TTL.
|
|
40
|
+
|
|
41
|
+
@point_emitter = Ashton::ParticleEmitter.new 100, 100, 1,
|
|
42
|
+
scale: 10,
|
|
43
|
+
speed: 200,
|
|
44
|
+
interval: 0.0002,
|
|
45
|
+
max_particles: 30000,
|
|
46
|
+
interval: 0.0001,
|
|
47
|
+
color: Gosu::Color.rgba(255, 0, 0, 150),
|
|
48
|
+
fade: 50 # loses 50 alpha/s
|
|
49
|
+
|
|
50
|
+
@shaded_point_emitter = Ashton::ParticleEmitter.new 100, 300, 2,
|
|
51
|
+
scale: 4..10,
|
|
52
|
+
shader: @grayscale,
|
|
53
|
+
speed: 60..100,
|
|
54
|
+
offset: 0..10,
|
|
55
|
+
time_to_live: 12,
|
|
56
|
+
interval: 0.0003,
|
|
57
|
+
max_particles: 30000,
|
|
58
|
+
color: Gosu::Color.rgba(255, 0, 0, 100),
|
|
59
|
+
gravity: 60 # pixels/s*s
|
|
60
|
+
|
|
61
|
+
@mouse_emitter = Ashton::ParticleEmitter.new 0, 0, 3,
|
|
62
|
+
scale: 4,
|
|
63
|
+
speed: 20..50,
|
|
64
|
+
max_particles: 5000,
|
|
65
|
+
offset: 0..5,
|
|
66
|
+
interval: 0.0010,
|
|
67
|
+
color: Gosu::Color.rgba(0, 255, 255, 100),
|
|
68
|
+
fade: 25,
|
|
69
|
+
gravity: 60 # pixels/s*s
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def needs_cursor?; true end
|
|
73
|
+
|
|
74
|
+
def update
|
|
75
|
+
$gosu_blocks.clear if defined? $gosu_blocks # workaround for Gosu 0.7.45 bug.
|
|
76
|
+
|
|
77
|
+
# Calculate delta from milliseconds.
|
|
78
|
+
@last_update_at ||= Gosu::milliseconds
|
|
79
|
+
delta = [Gosu::milliseconds - @last_update_at, 100].min * 0.001 # Limit delta to 100ms (10fps), in case of freezing.
|
|
80
|
+
@last_update_at = Gosu::milliseconds
|
|
81
|
+
|
|
82
|
+
@image_emitter.update delta unless button_down? Gosu::Kb1
|
|
83
|
+
@shaded_image_emitter.update delta unless button_down? Gosu::Kb2
|
|
84
|
+
@point_emitter.update delta unless button_down? Gosu::Kb3
|
|
85
|
+
@shaded_point_emitter.update delta unless button_down? Gosu::Kb4
|
|
86
|
+
|
|
87
|
+
@mouse_emitter.x, @mouse_emitter.y = mouse_x, mouse_y
|
|
88
|
+
@mouse_emitter.update delta unless button_down? Gosu::Kb5
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def button_down(id)
|
|
92
|
+
if id == Gosu::KbEscape
|
|
93
|
+
close
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def draw
|
|
98
|
+
@point_emitter.draw
|
|
99
|
+
@shaded_image_emitter.draw
|
|
100
|
+
@shaded_point_emitter.draw
|
|
101
|
+
@image_emitter.draw
|
|
102
|
+
@mouse_emitter.draw
|
|
103
|
+
|
|
104
|
+
num_particles = @point_emitter.count + @shaded_point_emitter.count +
|
|
105
|
+
@image_emitter.count + @shaded_image_emitter.count +
|
|
106
|
+
@mouse_emitter.count
|
|
107
|
+
@font.draw "FPS: #{Gosu::fps} Particles: #{num_particles}", 0, 0, Float::INFINITY
|
|
108
|
+
|
|
109
|
+
totals = "Pnt: #{@point_emitter.count} ShaPnt: #{@shaded_point_emitter.count} Img: #{@image_emitter.count} ShaImg: #{@shaded_image_emitter.count} Mouse: #{@mouse_emitter.count}"
|
|
110
|
+
@font.draw_rel totals, 0, height, Float::INFINITY, 0, 1
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
TestWindow.new.show
|
|
@@ -1,50 +1,52 @@
|
|
|
1
|
-
# Use of GLSL shader in Gosu to post-process the entire screen.
|
|
2
|
-
|
|
3
|
-
begin
|
|
4
|
-
require 'rubygems'
|
|
5
|
-
rescue LoadError
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
$LOAD_PATH.unshift File.expand_path('../lib/', File.dirname(__FILE__))
|
|
9
|
-
require "ashton"
|
|
10
|
-
|
|
11
|
-
def
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@font = Gosu::Font.new self, Gosu::default_font_name, 40
|
|
23
|
-
@star = Gosu::Image.new(self, media_path("LargeStar.png"), true)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@
|
|
42
|
-
@
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
# Use of GLSL shader in Gosu to post-process the entire screen.
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
rescue LoadError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
$LOAD_PATH.unshift File.expand_path('../lib/', File.dirname(__FILE__))
|
|
9
|
+
require "ashton"
|
|
10
|
+
|
|
11
|
+
def media_path(file); File.expand_path "media/#{file}", File.dirname(__FILE__) end
|
|
12
|
+
|
|
13
|
+
class TestWindow < Gosu::Window
|
|
14
|
+
def initialize
|
|
15
|
+
super 640, 480, false
|
|
16
|
+
self.caption = "Post-processing with 'pixelate' - 1..9 affect pixel size"
|
|
17
|
+
|
|
18
|
+
@pixelate = Ashton::Shader.new fragment: :pixelate, uniforms: {
|
|
19
|
+
pixel_size: @pixel_size = 4,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@font = Gosu::Font.new self, Gosu::default_font_name, 40
|
|
23
|
+
@star = Gosu::Image.new(self, media_path("LargeStar.png"), true)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def update
|
|
27
|
+
$gosu_blocks.clear if defined? $gosu_blocks # Workaround for Gosu bug (0.7.45)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def button_down(id)
|
|
31
|
+
if (Gosu::Kb1..Gosu::Kb9).include? id
|
|
32
|
+
@pixel_size = (id - Gosu::Kb1 + 1) ** 2
|
|
33
|
+
@pixelate.pixel_size = @pixel_size
|
|
34
|
+
elsif id == Gosu::KbEscape
|
|
35
|
+
close
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def draw
|
|
40
|
+
post_process @pixelate do
|
|
41
|
+
@font.draw_rel "Hello world!", 350, 50, 0, 0.5, 0.5
|
|
42
|
+
@font.draw_rel "Goodbye world!", 400, 350, 0, 0.5, 0.5
|
|
43
|
+
@star.draw 0, 0, 0
|
|
44
|
+
@star.draw 200, 100, 0
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Drawing after the effect isn't processed, which is useful for GUI elements.
|
|
48
|
+
@font.draw "Pixel ratio: 1:#{@pixel_size}", 0, 0, 0
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
50
52
|
TestWindow.new.show
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Use of GLSL shader in Gosu.
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/ashton'
|
|
4
|
+
|
|
5
|
+
def media_path(file); File.expand_path "media/#{file}", File.dirname(__FILE__) end
|
|
6
|
+
|
|
7
|
+
class GameWindow < Gosu::Window
|
|
8
|
+
def initialize
|
|
9
|
+
super 800, 600, false
|
|
10
|
+
|
|
11
|
+
# Enable pixelation for all Gosu Images (must be called before creating any Images).
|
|
12
|
+
# Comment this line out to see default Gosu behaviour (smoothing).
|
|
13
|
+
Gosu.enable_undocumented_retrofication
|
|
14
|
+
|
|
15
|
+
self.caption = "Ashton::Texture pixelation example (Gosu::enable_undocumented_retrofication HAS "
|
|
16
|
+
self.caption += "NOT " unless Ashton::Texture.pixelated?
|
|
17
|
+
self.caption += "been called)"
|
|
18
|
+
|
|
19
|
+
@image = Gosu::Image.new self, media_path("Starfighter.bmp"), true
|
|
20
|
+
@texture = @image.to_texture
|
|
21
|
+
@font = Gosu::Font.new $window, Gosu::default_font_name, 15
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def update
|
|
25
|
+
$gosu_blocks.clear if defined? $gosu_blocks # Workaround for Gosu bug (0.7.45)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def draw
|
|
29
|
+
# Drawing Textures will pixelate by default if Gosu::enable_undocumented_retrofication has ever been called.
|
|
30
|
+
@font.draw "Gosu::Image", 0, 0, 0
|
|
31
|
+
@font.draw "Ashton::Texture default", 200, 0, 0
|
|
32
|
+
@font.draw "Ashton::Texture pixelated: true", 400, 0, 0
|
|
33
|
+
@font.draw "Ashton::Texture pixelated: false", 600, 0, 0
|
|
34
|
+
|
|
35
|
+
# Zoom in a Texture, so smoothing/pixelation occurs based on preference.
|
|
36
|
+
scale 4 do
|
|
37
|
+
@image.draw 0, 10, 0
|
|
38
|
+
@texture.draw 50, 10, 0
|
|
39
|
+
@texture.draw 100, 10, 0, pixelated: true
|
|
40
|
+
@texture.draw 150, 10, 0, pixelated: false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Actual size, so all will look the same.
|
|
44
|
+
@image.draw 0, 300, 0
|
|
45
|
+
@texture.draw 200, 300, 0
|
|
46
|
+
@texture.draw 400, 300, 0, pixelated: true
|
|
47
|
+
@texture.draw 600, 300, 0, pixelated: false
|
|
48
|
+
|
|
49
|
+
# Zooming out a Texture will _always_ smooth (with Gosu::Image it will pixelate on zooming out, which looks terrible!)
|
|
50
|
+
scale 0.5 do
|
|
51
|
+
@image.draw 0, 900, 0
|
|
52
|
+
@texture.draw 400, 900, 0
|
|
53
|
+
@texture.draw 800, 900, 0, pixelated: true
|
|
54
|
+
@texture.draw 1200, 900, 0, pixelated: false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@font.draw "Ashton::Texture is <i>always</i> smoothed when zoomed out, so it doesn't distort", 0, 400, 0
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def button_down(id)
|
|
61
|
+
case id
|
|
62
|
+
when Gosu::KbEscape
|
|
63
|
+
close
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
window = GameWindow.new
|
|
69
|
+
window.show
|