X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fgrits-opengl.c;h=7b5697e4b19b529a36f28921c4f6f642114e1670;hb=76547a2ce3597d4d6e99d8057503be1ab957dad6;hp=774c75725f02e628945fed7e389cf533e00adc92;hpb=ff72b493deceef82d583d50c478857ebf3bd0a17;p=grits diff --git a/src/grits-opengl.c b/src/grits-opengl.c index 774c757..7b5697e 100644 --- a/src/grits-opengl.c +++ b/src/grits-opengl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2010 Andy Spencer + * Copyright (C) 2009-2011 Andy Spencer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,8 +32,6 @@ #include #include #include -#include -#include #include "grits-opengl.h" #include "grits-util.h" @@ -142,6 +140,18 @@ static void _foreach_object(GritsOpenGL *opengl, GFunc func, gpointer user_data) g_tree_foreach(opengl->objects, _foreach_object_cb, pointers); } +static void _add_object(GritsObject *object, GPtrArray *array) +{ + g_ptr_array_add(array, object); +} + +static GPtrArray *_objects_to_array(GritsOpenGL *opengl) +{ + GPtrArray *array = g_ptr_array_new(); + _foreach_object(opengl, (GFunc)_add_object, array); + return array; +} + /************* * Callbacks * *************/ @@ -170,7 +180,7 @@ static gboolean on_configure(GritsOpenGL *opengl, GdkEventConfigure *event, gpoi static gboolean _draw_level(gpointer key, gpointer value, gpointer user_data) { - g_debug("GritsOpenGL: _draw_level - level=%-4d", (int)key); + g_debug("GritsOpenGL: _draw_level - level=%-4ld", (glong)key); GritsOpenGL *opengl = user_data; struct RenderLevel *level = value; int nsorted = 0, nunsorted = 0; @@ -200,6 +210,8 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _ { g_debug("GritsOpenGL: on_expose - begin"); + gtk_gl_begin(GTK_WIDGET(opengl)); + glClear(GL_COLOR_BUFFER_BIT); _set_visuals(opengl); @@ -255,7 +267,14 @@ static gboolean on_motion_notify(GritsOpenGL *opengl, GdkEventMotion *event, gpo /* Run picking */ g_mutex_lock(opengl->objects_lock); - _foreach_object(opengl, (GFunc)grits_object_pick_begin, opengl); + GPtrArray *objects = _objects_to_array(opengl); + for (guint i = 0; i < objects->len; i++) { + glPushName(i); + GritsObject *object = objects->pdata[i]; + object->state.picked = FALSE; + grits_object_pick(object, opengl); + glPopName(); + } int hits = glRenderMode(GL_RENDER); g_debug("GritsOpenGL: on_motion_notify - hits=%d ev=%.0lf,%.0lf", hits, gl_x, gl_y); @@ -265,10 +284,15 @@ static gboolean on_motion_notify(GritsOpenGL *opengl, GdkEventMotion *event, gpo //g_debug("\t\tz1: %f", (float)buffer[i][1]/0x7fffffff); //g_debug("\t\tz2: %f", (float)buffer[i][2]/0x7fffffff); //g_debug("\t\tname: %p", (gpointer)buffer[i][3]); - GritsObject *object = GRITS_OBJECT(buffer[i][3]); - grits_object_pick_pointer(object, gl_x, gl_y); + guint index = buffer[i][3]; + GritsObject *object = objects->pdata[index]; + object->state.picked = TRUE; } - _foreach_object(opengl, (GFunc)grits_object_pick_end, NULL); + for (guint i = 0; i < objects->len; i++) { + GritsObject *object = objects->pdata[i]; + grits_object_set_pointer(object, object->state.picked); + } + g_ptr_array_free(objects, TRUE); g_mutex_unlock(opengl->objects_lock); /* Cleanup */ @@ -465,10 +489,10 @@ static gpointer grits_opengl_add(GritsViewer *_opengl, GritsObject *object, g_assert(GRITS_IS_OPENGL(_opengl)); GritsOpenGL *opengl = GRITS_OPENGL(_opengl); g_mutex_lock(opengl->objects_lock); - struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)key); + struct RenderLevel *level = g_tree_lookup(opengl->objects, (gpointer)(gintptr)key); if (!level) { level = g_new0(struct RenderLevel, 1); - g_tree_insert(opengl->objects, (gpointer)key, level); + g_tree_insert(opengl->objects, (gpointer)(gintptr)key, level); } GList *list = sort ? &level->sorted : &level->unsorted; /* Put the link in the list */ @@ -506,7 +530,7 @@ static GritsObject *grits_opengl_remove(GritsViewer *_opengl, GritsObject *objec ****************/ static int _objects_cmp(gconstpointer _a, gconstpointer _b, gpointer _) { - gint a = (int)_a, b = (int)_b; + gintptr a = (gintptr)_a, b = (gintptr)_b; return a < b ? -1 : a > b ? 1 : 0; } @@ -529,7 +553,8 @@ static void grits_opengl_init(GritsOpenGL *opengl) opengl->sphere = roam_sphere_new(opengl); opengl->sphere_lock = g_mutex_new(); gtk_gl_enable(GTK_WIDGET(opengl)); - g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL); + gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK); + g_signal_connect(opengl, "map", G_CALLBACK(on_realize), NULL); } static void grits_opengl_dispose(GObject *_opengl) {