mini-led-cube/editor/src/input.c
Aaron Mueller 37e885f02e 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!).
2011-10-30 23:55:53 +01:00

63 lines
1.3 KiB
C

#include <stdio.h>
#include <math.h>
#include <glut.h>
#include "config.h"
#include "input.h"
#include "display.h"
void moveCameraPosition(float direction) {
eyePos += direction;
if (eyePos > 360.0) eyePos = 0.0;
lookX = sin(eyePos * PI/180.0)*70.0;
lookZ = cos(eyePos * PI/180.0)*70.0;
}
void moveCameraAngle(float angle) {
eyeAngle += angle;
if (eyeAngle > 120) eyeAngle = 120;
if (eyeAngle < 0) eyeAngle = 0;
}
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 27: // ESC
exit(0);
break;
}
glutPostRedisplay();
}
void keyboard_special(int key, int x, int y) {
switch (key) {
case GLUT_KEY_LEFT:
moveCameraPosition(MOVE_SPEED);
break;
case GLUT_KEY_RIGHT:
moveCameraPosition(MOVE_SPEED*-1);
break;
case GLUT_KEY_UP:
moveCameraAngle(MOVE_SPEED);
break;
case GLUT_KEY_DOWN:
moveCameraAngle(MOVE_SPEED*-1);
}
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
}
}