From 37e885f02eae5a2f154b4ec1928803242771ee3d Mon Sep 17 00:00:00 2001 From: Aaron Mueller Date: Sun, 30 Oct 2011 23:55:53 +0100 Subject: [PATCH] Add the picking feature. We can now select a LED on the screen and get the index of the LED. To get the right index, we use the color picking technique mentioned in the OpenGL RedBook. This works suprisingly pretty well (and fast!). --- editor/src/config.h | 8 ++++++-- editor/src/display.c | 40 ++++++++++++++++++++++++++++++---------- editor/src/display.h | 7 ++++++- editor/src/input.c | 14 ++++++++++++++ editor/src/input.h | 2 ++ editor/src/main.c | 1 + 6 files changed, 59 insertions(+), 13 deletions(-) diff --git a/editor/src/config.h b/editor/src/config.h index dfe7447..6937709 100644 --- a/editor/src/config.h +++ b/editor/src/config.h @@ -10,8 +10,12 @@ #define PI 3.1415926535897932 -#define TOP_ORIENTATION 1 -#define SIDE_ORIENTATION 2 +// Poor Man's enums +#define TOP_ORIENTATION 0x01 +#define SIDE_ORIENTATION 0x02 + +#define RENDER_MODE 0x01 +#define PICKING_MODE 0x02 // Materials extern float ledOnMaterial[]; diff --git a/editor/src/display.c b/editor/src/display.c index d5ec987..11f1cf5 100644 --- a/editor/src/display.c +++ b/editor/src/display.c @@ -5,21 +5,23 @@ #include "display.h" -void drawLEDCube(orientation) { +void drawLEDs(int orientation, int mode) { int x, y, z; + int colorIndex = 0; if (orientation == TOP_ORIENTATION) { glRotatef(90, 2, 0, 0); } - // LEDs - glMaterialfv(GL_FRONT, GL_AMBIENT, ledOnMaterial); for (z=-10; z<=10; z+=10) // Ebene for (y=-10; y<=10; y+=10) // Zeile for (x=-10; x<=10; x+=10) { // Spalte - - // TODO: Test different colors - glMaterialfv(GL_FRONT, GL_AMBIENT, (z == 0 ? ledOnMaterial : ledOffMaterial)); + if (mode == PICKING_MODE) { + glColor3ub(0, 0, colorIndex*8); + colorIndex++; + } else { + glMaterialfv(GL_FRONT, GL_AMBIENT, (z == 0 ? ledOnMaterial : ledOffMaterial)); + } glPushMatrix(); glTranslatef(x, y, z-0.8); @@ -35,8 +37,10 @@ void drawLEDCube(orientation) { glPopMatrix(); } +} - // Wires +void drawWires() { + int x, y; for (y=-10; y<=10; y+=10) for (x=-10; x<=10; x+=10) { glMaterialfv(GL_FRONT, GL_AMBIENT, ((x == 0 || y == 0) ? innerWireMaterial : wireMaterial)); @@ -61,9 +65,8 @@ void drawLEDCube(orientation) { } } -void display() { +void setScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(ZOOM_LEVEL, WINDOW_WIDTH/WINDOW_HEIGHT, 1.0, 350.0); @@ -71,8 +74,25 @@ void display() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(lookX, eyeAngle, lookZ, 0, 0, 0, 0, 1, 0); +} - drawLEDCube(TOP_ORIENTATION); +// OpenGL Display function +void display() { + setScene(); + drawLEDs(TOP_ORIENTATION, RENDER_MODE); + drawWires(); glutSwapBuffers(); } +// Picking function +void displayPickingObjects() { + setScene(); + glDisable(GL_DITHER); + glDisable(GL_LIGHTING); + + drawLEDs(TOP_ORIENTATION, PICKING_MODE); + + glEnable(GL_LIGHTING); + glEnable(GL_DITHER); +} + diff --git a/editor/src/display.h b/editor/src/display.h index 079f5bc..99de370 100644 --- a/editor/src/display.h +++ b/editor/src/display.h @@ -2,8 +2,13 @@ #define _DISPLAY_H -void drawLEDCube(); +void drawLEDs(int orientation, int mode); +void drawWires(); + void display(); +void displayPickingObjects(); + +void setScene(); #endif diff --git a/editor/src/input.c b/editor/src/input.c index 8759e6c..0632dbb 100644 --- a/editor/src/input.c +++ b/editor/src/input.c @@ -4,6 +4,7 @@ #include "config.h" #include "input.h" +#include "display.h" void moveCameraPosition(float direction) { eyePos += direction; @@ -46,3 +47,16 @@ void keyboard_special(int key, int x, int y) { glutPostRedisplay(); } +void mouse(int button, int state, int x, int y) { + if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { + int viewport[4]; + GLubyte pixel[3]; + + displayPickingObjects(); + + glGetIntegerv(GL_VIEWPORT, viewport); + glReadPixels(x, viewport[3]-y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, (void*)pixel); + printf("%d\n", pixel[2]/8); // Selected LED + } +} + diff --git a/editor/src/input.h b/editor/src/input.h index d3bc2b9..bb48fa1 100644 --- a/editor/src/input.h +++ b/editor/src/input.h @@ -7,5 +7,7 @@ void moveCameraAngle(float angle); void keyboard(unsigned char key, int x, int y); void keyboard_special(int key, int x, int y); +void mouse(int button, int state, int x, int y); + #endif diff --git a/editor/src/main.c b/editor/src/main.c index d0f9eaf..3a1861c 100644 --- a/editor/src/main.c +++ b/editor/src/main.c @@ -33,6 +33,7 @@ int main(int argc, char* argv[]) { glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutSpecialFunc(keyboard_special); + glutMouseFunc(mouse); glClearColor(0.0, 0.0, 0.0, 1.0); glShadeModel(GL_SMOOTH);