97 lines
1.9 KiB
Ruby
Executable File
97 lines
1.9 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
require 'sfml/all'
|
|
require 'opengl'
|
|
|
|
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_id = glCreateShader(GL_VERTEX_SHADER)
|
|
glShaderSource(v_id, <<-EOS)
|
|
attribute vec2 pos;
|
|
varying vec4 pos_i;
|
|
|
|
void main()
|
|
{
|
|
pos_i = vec4(pos, 0, 1);
|
|
gl_Position = pos_i;
|
|
}
|
|
EOS
|
|
glCompileShader(v_id)
|
|
unless glGetShaderiv(v_id, GL_COMPILE_STATUS)
|
|
raise glGetShaderInfoLog(v_id)
|
|
end
|
|
|
|
f_id = glCreateShader(GL_FRAGMENT_SHADER)
|
|
glShaderSource(f_id, <<-EOS)
|
|
varying vec4 pos_i;
|
|
|
|
void main()
|
|
{
|
|
gl_FragColor = pos_i;
|
|
}
|
|
EOS
|
|
glCompileShader(f_id)
|
|
unless glGetShaderiv(f_id, GL_COMPILE_STATUS)
|
|
raise glGetShaderInfoLog(f_id)
|
|
end
|
|
|
|
p_id = glCreateProgram()
|
|
glAttachShader(p_id, v_id)
|
|
glAttachShader(p_id, f_id)
|
|
glLinkProgram(p_id)
|
|
unless glGetProgramiv(p_id, GL_LINK_STATUS)
|
|
raise glGetProgramInfoLog(p_id)
|
|
end
|
|
|
|
glUseProgram(p_id)
|
|
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
|
|
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::Resized # Resize event : adjust viewport
|
|
glViewport(0, 0, event.size.width, event.size.height)
|
|
end
|
|
end
|
|
|
|
glClear(GL_COLOR_BUFFER_BIT)
|
|
|
|
@window.display
|
|
end
|
|
end
|
|
end
|
|
|
|
Example.new.run
|