Files
GTSchoolShit/CS4451/proj4/Input.cpp
2025-06-07 01:59:34 -04:00

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