/// OpenGL initializations void init() { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); // lighting setup GLfloat mat_A[] = { 0.3, 0.3, 0.3, 1.0 }; GLfloat mat_D[] = { 0.5, 0.0, 0.75, 1.0 }; GLfloat mat_S[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat shine[] = { 128.0 }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_A); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_D); glMaterialfv(GL_FRONT, GL_SPECULAR, mat_S); glMaterialfv(GL_FRONT, GL_SHININESS, shine); GLfloat left_light_position[] = { 0.0f, 2.0f, 2.0f, 0.0f }; GLfloat right_light_position[] = { 0.0f, -2.0f, 2.0f, 0.0f }; GLfloat left_diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat right_diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, left_light_position); glLightfv(GL_LIGHT1, GL_POSITION, right_light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, left_diffuse_light); glLightfv(GL_LIGHT1, GL_DIFFUSE, right_diffuse_light); glClearColor(1, 1, 1, 1); glColor4f(1, 1, 0, 1); rendermode = SMOOTH; sceneT.identity(); std::time(&start); frame = 0; }
/// Implements the "zoomout" operation. Enlarges the view of the scene. void zoomOut() { AMatrix<float> mT; mT.identity(); mT.scaling(1.0 / 1.2); sceneT = mT*sceneT; }
/// Mouse move function void mousemove(int x, int y) { if (buttonpressed == GLUT_MIDDLE_BUTTON) { // rotations handler AMatrix<float> mT; arcball.drag(x, winh - y, &mT); sceneT = mT*sceneIniT; } else if (buttonpressed == GLUT_RIGHT_BUTTON) { // translations handler double xw, yw, zw; screenToWorld(x, winh - y, xw, yw, zw); AMatrix<float> mT; mT.identity(); mT.translation(xw - xwini, yw - ywini, zw - zwini); sceneT = mT*sceneIniT; } else if (buttonpressed == GLUT_LEFT_BUTTON) { Point2 p(x, winh - y); stroke.push_back(p); } glutPostRedisplay(); }