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);