166 lines
4.3 KiB
C++
166 lines
4.3 KiB
C++
//#include <GL/glut.h>
|
|
|
|
#include "Input.h"
|
|
#include "Renderer.h"
|
|
#include "structs.h"
|
|
#include "defs.h"
|
|
|
|
#include <math.h>
|
|
|
|
GLvoid menu ( int value ) {
|
|
switch (value) {
|
|
case MENU_SHADOWS:
|
|
keyboard_event('a',0,0);
|
|
break;
|
|
case MENU_PRIMITIVES_ONLY:
|
|
keyboard_event('p',0,0);
|
|
break;
|
|
case MENU_SHADOW_VOLUMES:
|
|
keyboard_event('v',0,0);
|
|
break;
|
|
case MENU_CLEAR_WHITE:
|
|
keyboard_event('x',0,0);
|
|
break;
|
|
case MENU_CLEAR_BLACK:
|
|
keyboard_event('c',0,0);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
GLvoid keyboard_event(GLubyte key, GLint x, GLint y) {
|
|
switch (key) {
|
|
case 'w':
|
|
*(Renderer::getInstance()->getViewAngle())-=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case 's':
|
|
*(Renderer::getInstance()->getViewAngle())+=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'f':
|
|
Renderer::getInstance()->backFaceCull = false;
|
|
glCullFace(GL_FRONT);
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'b':
|
|
Renderer::getInstance()->backFaceCull = true;
|
|
glCullFace(GL_BACK);
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'p':
|
|
Renderer::getInstance()->primitivesOnly = true;
|
|
Renderer::getInstance()->drawShadows = false;
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'v':
|
|
Renderer::getInstance()->drawShadows = false;
|
|
Renderer::getInstance()->primitivesOnly = false;
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'a':
|
|
Renderer::getInstance()->drawShadows = true;
|
|
Renderer::getInstance()->primitivesOnly = false;
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'x':
|
|
glClearColor(1,1,1,1.0);
|
|
glutPostRedisplay();
|
|
break;
|
|
case 'c':
|
|
glClearColor(0,0,0,1.0);
|
|
glutPostRedisplay();
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
};
|
|
}
|
|
|
|
/*
|
|
* Convert screen coordinates to Trackball Coordinates
|
|
*/
|
|
inline void scalePoint(Point& p, GLint mx, GLint my) {
|
|
m_int vpd = Renderer::getInstance()->getVPD();
|
|
|
|
//scale to -1 and 1
|
|
float scale = ceil(vpd/2.);
|
|
p.x = (mx / scale) -1.;
|
|
p.y = (my / scale) -1.;
|
|
p.y*=-1.; //handle reversed y
|
|
|
|
p.z = 1.-pow(p.x,2)-pow(p.y,2);
|
|
|
|
if (p.z < 0) {
|
|
float under = sqrt((p.x*p.x)+(p.y*p.y));
|
|
p.x /= under;
|
|
p.y /= under;
|
|
p.z = 0;
|
|
} else {
|
|
p.z = sqrt(p.z);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
GLvoid button_motion(GLint mx, GLint my) {
|
|
Point scaledPoint;
|
|
static Point oldPoint;
|
|
|
|
Light* light = Renderer::getInstance()->lights->front();
|
|
|
|
scalePoint(scaledPoint, mx, my);
|
|
|
|
|
|
light->center.x = scaledPoint.x * Renderer::getInstance()->distanceToCenter.z;
|
|
light->center.y = scaledPoint.y * Renderer::getInstance()->distanceToCenter.z;
|
|
light->center.z = scaledPoint.z * Renderer::getInstance()->distanceToCenter.z;
|
|
|
|
if (Renderer::getInstance()->viewport.z - Renderer::getInstance()->l.z < 0) {
|
|
light->center.y *= -1.;
|
|
}
|
|
|
|
glutPostRedisplay();
|
|
|
|
}
|
|
|
|
GLvoid passive_motion(GLint mx, GLint my) {
|
|
|
|
}
|
|
|
|
GLvoid mouse_button(GLint btn, GLint state, GLint mx, GLint my) {
|
|
|
|
}
|
|
|
|
GLvoid keyboard_special_event(GLint key, GLint x, GLint y) {
|
|
switch (key) {
|
|
case GLUT_KEY_UP:
|
|
Renderer::getInstance()->lights->front()->center.z+=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case GLUT_KEY_DOWN:
|
|
Renderer::getInstance()->lights->front()->center.z-=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case GLUT_KEY_LEFT:
|
|
Renderer::getInstance()->lights->front()->center.x+=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case GLUT_KEY_RIGHT:
|
|
Renderer::getInstance()->lights->front()->center.x-=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case GLUT_KEY_PAGE_UP:
|
|
Renderer::getInstance()->lights->front()->center.y+=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
case GLUT_KEY_PAGE_DOWN:
|
|
Renderer::getInstance()->lights->front()->center.y-=.5;
|
|
glutPostRedisplay();
|
|
break;
|
|
}
|
|
}
|