ruby-sfml-example/example.rb

111 lines
2.7 KiB
Ruby
Executable File

#!/usr/bin/env ruby
require 'sfml/all'
require 'opengl'
require 'glutil'
include GLUtil
class Example
include SFML
TITLE = "Josh's Ruby SFML/OpenGL Example"
def initialize
@fullscreen = false
@window = Window.new
create_window
end
def load_shaders
v_shader = GLShader.new(GL_VERTEX_SHADER, <<-EOS)
uniform vec2 offset;
uniform vec2 screen_size;
attribute vec2 pos;
varying vec4 pos_i;
void main()
{
vec2 scaled_pos = vec2((offset.x - screen_size.x / 2) / screen_size.x * 2,
(offset.y - screen_size.y / 2) / screen_size.y * 2);
pos_i = vec4(pos.x * screen_size.y / screen_size.x + scaled_pos.x,
pos.y + scaled_pos.y, 0, 1);
gl_Position = pos_i;
}
EOS
f_shader = GLShader.new(GL_FRAGMENT_SHADER, <<-EOS)
varying vec4 pos_i;
void main()
{
gl_FragColor = vec4((pos_i.x + 1.0) / 2.0,
(pos_i.y + 1.0) / 2.0,
0, 1);
}
EOS
program = GLProgram.new([v_shader, f_shader])
$offset_loc = program.get_uniform_location("offset")
$screen_size_loc = program.get_uniform_location("screen_size")
program.use
end
def create_window
if @fullscreen
@window.create(VideoMode.get_desktop_mode, TITLE, Style::Fullscreen)
else
@window.create([1200, 900], TITLE)
end
glClearColor(1, 0.5, 0, 0)
load_shaders
end
def run
quad_attrs = [0.02, 0.02,
-0.02, 0.02,
-0.02, -0.02,
0.02, -0.02].pack("f*")
buffer = GLBuffer.new(GL_ARRAY_BUFFER, GL_STATIC_DRAW, quad_attrs, 2 * 4 * 4)
x, y = 0, 0
while @window.open?
@window.each_event do |event|
case event.type
when Event::Closed
@window.close
when Event::KeyPressed
case event.key.code
when Keyboard::Escape
@window.close
when Keyboard::F
@fullscreen = !@fullscreen
create_window
end
when Event::MouseMoved
x = event.mouse_move.x
y = event.mouse_move.y
when Event::Resized # Resize event : adjust viewport
x = event.size.width / 2
y = event.size.height / 2
glViewport(0, 0, event.size.width, event.size.height)
end
end
break unless @window.open?
glClear(GL_COLOR_BUFFER_BIT)
glUniform2f($offset_loc, x, @window.getSize.y - y)
glUniform2f($screen_size_loc, @window.getSize.x, @window.getSize.y)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * 4, 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
@window.display
end
end
end
Example.new.run