require "set" class Window @windows = Set.new class << self def register(window) @windows << window end def remove(window) @windows.delete(window) end end def initialize @programs = {} load_shaders Window.register(self) end def close Window.remove(self) end private def load_shaders program_sources = { text: ["text.v.glsl", "text.f.glsl"], basic: ["basic.v.glsl", "basic.f.glsl"], rect: ["rect.v.glsl", "basic.f.glsl"], } program_sources.each do |program, (v_src_fname, f_src_fname)| v_shader = GLShader.new(:vertex, Runtime.read(:shader, v_src_fname)) v_shader or raise "Could not find shader #{v_src_fname}" f_shader = GLShader.new(:fragment, Runtime.read(:shader, f_src_fname)) f_shader or raise "Could not find shader #{f_src_fname}" @programs[program] = GLProgram.new(v_shader, f_shader) end end end