From 8604d6d5ad2ec3e70f83fba103327eb7c3212ffa Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 23 Jul 2014 16:36:40 -0400 Subject: [PATCH] load shaders from Ruby on Window creation --- runtime/lib/window.rb | 24 ++++++++++++++++++++++++ runtime/main.rb | 3 ++- src/GUI.cc | 42 ------------------------------------------ src/Window.cc | 5 ++++- 4 files changed, 30 insertions(+), 44 deletions(-) create mode 100644 runtime/lib/window.rb diff --git a/runtime/lib/window.rb b/runtime/lib/window.rb new file mode 100644 index 0000000..6cf382c --- /dev/null +++ b/runtime/lib/window.rb @@ -0,0 +1,24 @@ +class Window + def initialize + @programs = {} + load_shaders + 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 diff --git a/runtime/main.rb b/runtime/main.rb index 06f8a84..bbfffeb 100644 --- a/runtime/main.rb +++ b/runtime/main.rb @@ -3,8 +3,9 @@ def init_loadpath end def load_lib_files - require "runtime" require "gl_program" + require "runtime" + require "window" end def main(argv) diff --git a/src/GUI.cc b/src/GUI.cc index 408032b..f17b04a 100644 --- a/src/GUI.cc +++ b/src/GUI.cc @@ -21,48 +21,6 @@ bool GUI::load() return true; } -bool GUI::load_shaders() -{ - static const char * shader_sources[PROGRAM_COUNT][2] = { - {"text.v.glsl", "text.f.glsl"}, - {"basic.v.glsl", "basic.f.glsl"}, - {"rect.v.glsl", "basic.f.glsl"}, - }; - - for (int i = 0; i < PROGRAM_COUNT; i++) - { - PathRef shader_paths[2]; - GLShaderRef shaders[2]; - - m_programs[i] = new GLProgram(); - - for (int j = 0; j < 2; j++) - { - /* TODO */ - shader_paths[j] = NULL; -#if 0 - shader_paths[j] = Runtime::locate(Runtime::SHADER, shader_sources[i][j]); -#endif - if (shader_paths[j] == NULL) - { - std::cerr << "Could not find shader source " << shader_sources[i][j] << std::endl; - return false; - } - shaders[j] = new GLShader(); - if (!shaders[j]->create(j == 0 ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER, shader_paths[j])) - { - return false; - } - - m_programs[i]->attach_shader(shaders[j]); - } - if (!m_programs[i]->link()) - return false; - } - - return true; -} - bool GUI::load_buffers() { static const GLint rect_coords[4][2] = { diff --git a/src/Window.cc b/src/Window.cc index cbe81bc..bbedd06 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -91,7 +91,10 @@ static VALUE Window_new(VALUE klass) one_created = true; - return Data_Wrap_Struct(ruby_class, NULL, Window_free, window); + VALUE rv = Data_Wrap_Struct(ruby_class, NULL, Window_free, window); + rb_obj_call_init(rv, 0, NULL); + + return rv; } void Window_Init(void)