From e95b066044551c5c5d0e642e78689e5b09500501 Mon Sep 17 00:00:00 2001 From: Aaron Mueller Date: Wed, 21 Dec 2011 22:58:57 +0100 Subject: [PATCH] Make The LEDs clickable --- editor/Makefile | 4 ++-- editor/src/display.c | 29 ++++++++++++++--------------- editor/src/display.h | 3 +-- editor/src/event_callbacks.c | 30 +++++++++++++++++++++++++----- editor/src/input.c | 25 +++++++++---------------- editor/src/input.h | 2 +- editor/src/main.c | 6 ++++-- editor/src/main_gui.glade | 3 ++- 8 files changed, 58 insertions(+), 44 deletions(-) diff --git a/editor/Makefile b/editor/Makefile index c4b9224..cdb975c 100644 --- a/editor/Makefile +++ b/editor/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-Wall LINKER_FLAGS=-lglut -export-dynamic -GTKLIBS=`pkg-config --cflags --libs gtkglext-1.0 libglade-2.0 gmodule-export-2.0` +GTKLIBS=`pkg-config --cflags --libs gtk+-2.0 gtkglext-1.0 libglade-2.0 gmodule-export-2.0` SRCDIR=src all: @@ -16,5 +16,5 @@ all: clean: rm -f *.o rm -f gui - #rm -f ledcube-edit + rm -f ledcube-edit diff --git a/editor/src/display.c b/editor/src/display.c index b12ae13..0a31d1f 100644 --- a/editor/src/display.c +++ b/editor/src/display.c @@ -79,7 +79,7 @@ void setScene() { } // OpenGL Display function -void display() { +void display(gboolean onlyForPicking) { glClearColor(0.0, 0.0, 0.0, 1.0); glShadeModel(GL_SMOOTH); @@ -92,19 +92,18 @@ void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); setScene(); - drawWires(); - drawLEDs(RENDER_MODE); -} - -// Picking function -void displayPickingObjects() { - setScene(); - glDisable(GL_DITHER); - glDisable(GL_LIGHTING); - - drawLEDs(PICKING_MODE); - - glEnable(GL_LIGHTING); - glEnable(GL_DITHER); + + if (onlyForPicking == TRUE) { + glDisable(GL_DITHER); + glDisable(GL_LIGHTING); + + drawLEDs(PICKING_MODE); + + glEnable(GL_LIGHTING); + glEnable(GL_DITHER); + } else { + drawWires(); + drawLEDs(RENDER_MODE); + } } diff --git a/editor/src/display.h b/editor/src/display.h index 0397f85..d6236fb 100644 --- a/editor/src/display.h +++ b/editor/src/display.h @@ -4,8 +4,7 @@ void drawLEDs(int mode); void drawWires(); -void display(); -void displayPickingObjects(); +void display(gboolean onlyForPicking); void setScene(); diff --git a/editor/src/event_callbacks.c b/editor/src/event_callbacks.c index ad366ea..c0a7bf1 100644 --- a/editor/src/event_callbacks.c +++ b/editor/src/event_callbacks.c @@ -13,7 +13,7 @@ void on_main_window_delete_event(GtkObject *object, gpointer userData) { gboolean on_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data) { GdkGLContext *glContext = gtk_widget_get_gl_context(widget); - GdkGLDrawable *glDrawable =gtk_widget_get_gl_drawable(widget); + GdkGLDrawable *glDrawable = gtk_widget_get_gl_drawable(widget); if (!gdk_gl_drawable_gl_begin(glDrawable, glContext)) return FALSE; @@ -25,26 +25,26 @@ gboolean on_drawing_area_configure_event(GtkWidget *widget, GdkEventConfigure *e gboolean on_drawing_area_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data) { GdkGLContext *glContext = gtk_widget_get_gl_context(widget); - GdkGLDrawable *glDrawable =gtk_widget_get_gl_drawable(widget); + GdkGLDrawable *glDrawable = gtk_widget_get_gl_drawable(widget); if (!gdk_gl_drawable_gl_begin(glDrawable, glContext)) return FALSE; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - display(); + display(FALSE); if (gdk_gl_drawable_is_double_buffered(glDrawable)) gdk_gl_drawable_swap_buffers(glDrawable); else glFlush(); gdk_gl_drawable_gl_end(glDrawable); + return FALSE; } void on_drawing_area_realize(GtkWidget *widget, gpointer data) { GdkGLContext *glContext = gtk_widget_get_gl_context(widget); - GdkGLDrawable *glDrawable =gtk_widget_get_gl_drawable(widget); + GdkGLDrawable *glDrawable = gtk_widget_get_gl_drawable(widget); if (!gdk_gl_drawable_gl_begin(glDrawable, glContext)) return; - gdk_gl_drawable_gl_end(glDrawable); } @@ -67,3 +67,23 @@ void on_drawing_area_key_press_event(GtkWidget *widget, GdkEventKey *event) { gtk_widget_queue_draw_area(widget, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); } +void on_drawing_area_button_press_event(GtkWidget *widget, gpointer data) { + gtk_widget_grab_focus(widget); + + GdkGLContext *glContext = gtk_widget_get_gl_context(widget); + GdkGLDrawable *glDrawable =gtk_widget_get_gl_drawable(widget); + + if (!gdk_gl_drawable_gl_begin(glDrawable, glContext)) return; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + gint x, y; + gtk_widget_get_pointer(widget, &x, &y); + + display(TRUE); + mouse(x, y); + + gdk_gl_drawable_gl_end(glDrawable); + gtk_widget_queue_draw_area(widget, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); +} + diff --git a/editor/src/input.c b/editor/src/input.c index 39c87c4..7a0286c 100644 --- a/editor/src/input.c +++ b/editor/src/input.c @@ -23,23 +23,16 @@ void moveCameraAngle(float angle) { if (eyeAngle < 0) eyeAngle = 0; } -void mouse(int button, int state, int x, int y) { - if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { - int position, viewport[4]; - GLubyte pixel[3]; +void mouse(int x, int y) { + int position, viewport[4]; + GLubyte pixel[3]; - displayPickingObjects(); + glGetIntegerv(GL_VIEWPORT, viewport); + glReadPixels(x, viewport[3]-y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void*)pixel); + position = ((int)pixel[2]/8)-1; // Selected LED - glGetIntegerv(GL_VIEWPORT, viewport); - glReadPixels(x, viewport[3]-y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void*)pixel); - position = ((int)pixel[2]/8)-1; // Selected LED - - printf("%d\n", position); - currentFrame[position] = currentFrame[position] == 0 ? 1 : 0; - printf("%d\n", currentFrame[position]); - - // FIXME: Redraw the gl-container - //display(); - } + printf("%d\n", position); + currentFrame[position] = currentFrame[position] == 0 ? 1 : 0; + printf("%d\n", currentFrame[position]); } diff --git a/editor/src/input.h b/editor/src/input.h index 1c3751f..d010515 100644 --- a/editor/src/input.h +++ b/editor/src/input.h @@ -4,7 +4,7 @@ void moveCameraPosition(float direction); void moveCameraAngle(float angle); -void mouse(int button, int state, int x, int y); +void mouse(int x, int y); #endif diff --git a/editor/src/main.c b/editor/src/main.c index 53aa65f..cc9329a 100644 --- a/editor/src/main.c +++ b/editor/src/main.c @@ -12,6 +12,8 @@ #include "input.h" #include "event_callbacks.c" +// TODO: Refactor to GLib-Datatypes (page 747) + // Materials float ledOnMaterial[] = {0.0, 0.0, 1.0, 1.0}; float ledOffMaterial[] = {0.1, 0.1, 0.1, 0.0}; @@ -57,10 +59,10 @@ int main(int argc, char *argv[]) { // Configure the OpenGL widget glConfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); if (glConfig == NULL) { - g_print("EEE Double buffer not available, trying single buffer."); + g_warning("EEE Double buffer not available, trying single buffer."); glConfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH); if (glConfig == NULL) { - g_print("EEE Sorry, can't configure the OpenGL window. Giving up."); + g_error("EEE Sorry, can't configure the OpenGL window. Giving up."); exit(1); } } diff --git a/editor/src/main_gui.glade b/editor/src/main_gui.glade index 0fb50f7..6b9a1d9 100644 --- a/editor/src/main_gui.glade +++ b/editor/src/main_gui.glade @@ -90,8 +90,9 @@ 500 True True - GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK + GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK +