//#include #include "Input.h" #include "Renderer.h" #include "structs.h" #include "defs.h" #include 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; } }