#!/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