add Window rendering capabilities

This commit is contained in:
Josh Holtrop 2014-07-27 13:57:58 -04:00
parent a19f17481b
commit d68cd6a396
2 changed files with 42 additions and 10 deletions

View File

@ -18,7 +18,7 @@ module Widget
end
def draw
if @x > 0 and @y > 0
if @width > 0 and @height > 0
render_begin
render
children.each do |child|

View File

@ -82,6 +82,22 @@ static void Window_free(void * ptr)
delete window;
}
static void resize()
{
GLint viewport_size[2];
Window * window;
Data_Get_Struct(window_instance, Window, window);
SDL_GetWindowSize(window->sdl_window, &viewport_size[0], &viewport_size[1]);
glViewport(0, 0, viewport_size[0], viewport_size[1]);
rb_funcall(window_instance,
rb_intern("resize"),
4,
INT2FIX(0),
INT2FIX(0),
INT2FIX(viewport_size[0]),
INT2FIX(viewport_size[1]));
}
static VALUE Window_new(VALUE klass)
{
static bool one_created = false;
@ -117,21 +133,18 @@ static VALUE Window_new(VALUE klass)
one_created = true;
VALUE rv = Data_Wrap_Struct(ruby_class, NULL, Window_free, window);
rb_obj_call_init(rv, 0, NULL);
/* TODO: remove window_instance and map SDL_Window * to Window Ruby object
* to support multiple windows. */
window_instance = rv;
rb_obj_call_init(rv, 0, NULL);
resize();
return rv;
}
static void resize()
static void draw()
{
GLint viewport_size[2];
Window * window;
Data_Get_Struct(window_instance, Window, window);
SDL_GetWindowSize(window->sdl_window, &viewport_size[0], &viewport_size[1]);
glViewport(0, 0, viewport_size[0], viewport_size[1]);
rb_funcall(window_instance, rb_intern("draw"), 0);
}
static VALUE Window_event_loop(VALUE klass)
@ -152,11 +165,11 @@ static VALUE Window_event_loop(VALUE klass)
switch (event.window.event)
{
case SDL_WINDOWEVENT_EXPOSED:
// draw();
draw();
break;
case SDL_WINDOWEVENT_RESIZED:
resize();
// draw();
draw();
break;
}
}
@ -165,9 +178,28 @@ static VALUE Window_event_loop(VALUE klass)
return Qnil;
}
static VALUE Window_render(VALUE self)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
return Qnil;
}
static VALUE Window_render_end(VALUE self)
{
Window * window;
Data_Get_Struct(window_instance, Window, window);
SDL_GL_SwapWindow(window->sdl_window);
return Qnil;
}
void Window_Init(void)
{
ruby_class = rb_define_class("Window", rb_cObject);
rb_define_singleton_method(ruby_class, "new", (VALUE(*)(...))Window_new, 0);
rb_define_singleton_method(ruby_class, "event_loop", (VALUE(*)(...))Window_event_loop, 0);
rb_define_method(ruby_class, "render", (VALUE(*)(...))Window_render, 0);
rb_define_method(ruby_class, "render_end", (VALUE(*)(...))Window_render_end, 0);
}