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