/** * Locks frames per second based on current lock. */ void idleEvent(void) { if (isPlaying) { int newTime = glutGet(GLUT_ELAPSED_TIME); if ((newTime - currentTime) >= (1000.0f / framesPerSecond)) { if (playingForward) { aClip.incrementFrame(true); if (aClip.getCurrentFrameIndex() == aClip.getMaxFrameIndex()) isPlaying = 0; } if (playingBackward) { aClip.decrementFrame(true); if (aClip.getCurrentFrameIndex() == 1) isPlaying = 0; } currentTime = newTime; ++frames; } // If over a second if ((newTime - baseTime) >= 1000.0f) { currentTime = newTime; baseTime = newTime; framesTotal = frames; frames = 0; } } glutPostRedisplay(); }
/** * Keyboard callback */ void arrowPress(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: aClip.decrementFrame(true); //camera.panLeft(1); break; case GLUT_KEY_RIGHT: aClip.incrementFrame(false); //camera.panRight(1); break; case GLUT_KEY_UP: if (++framesPerSecond > MAX_FRAMES) framesPerSecond = MAX_FRAMES; //camera.zoomIn(0.1f); break; case GLUT_KEY_DOWN: if (--framesPerSecond < MIN_FRAMES) framesPerSecond = MIN_FRAMES; //camera.zoomOut(0.1f); break; } glutPostRedisplay(); }
/** * Callback for mouse movement events. */ void mouseMoveEvent(int x, int y) { if (isPressed) { int changeInX = x - oldX; int changeInY = y - oldY; // If shift is being held, do something special if (glutGetModifiers() == GLUT_ACTIVE_SHIFT) { if (changeInX > 0) { aClip.incrementFrame(false); } else if (changeInX < 0) { aClip.decrementFrame(true); } oldX = x; oldY = y; glutPostRedisplay(); return; } // Check to see what kind of event should take place switch (currentMode) { case MENU_NORMAL_MODE: camera.rotateRight(changeInX); camera.rotateUp(changeInY); break; case MENU_ZOOM_MODE: if (changeInY > 0) camera.zoomIn(0.01f); if (changeInY < 0) camera.zoomOut(0.01f); break; case MENU_PAN_MODE: camera.panRight(changeInX); break; case MENU_HEAD: robot->setAngle("HEAD", robot->getAngleH("HEAD") + changeInY, robot->getAngleV("HEAD") + changeInX); break; case MENU_NECK: robot->setAngle("NECK", robot->getAngleH("NECK") + changeInY, robot->getAngleV("NECK") + changeInX); break; case MENU_UPPER_TORSO: robot->setAngle("UPPER_TORSO", robot->getAngleH("UPPER_TORSO") + changeInY, robot->getAngleV("UPPER_TORSO") + changeInX); break; case MENU_LOWER_TORSO: robot->setAngle("LOWER_TORSO", robot->getAngleH("LOWER_TORSO") + changeInY, robot->getAngleV("LOWER_TORSO") + changeInX); break; case MENU_PELVIS: robot->setAngle("PELVIS", robot->getAngleH("PELVIS") + changeInY, robot->getAngleV("PELVIS") + changeInX); break; case MENU_LEFT_SHOULDER: robot->setAngle("LEFT_SHOULDER", robot->getAngleH("LEFT_SHOULDER") + changeInY, robot->getAngleV("LEFT_SHOULDER") + changeInX); break; case MENU_LEFT_UPPER_ARM: robot->setAngle("LEFT_UPPER_ARM", robot->getAngleH("LEFT_UPPER_ARM") + changeInY, robot->getAngleV("LEFT_UPPER_ARM") + changeInX); break; case MENU_LEFT_LOWER_ARM: robot->setAngle("LEFT_LOWER_ARM", robot->getAngleH("LEFT_LOWER_ARM") + changeInY, robot->getAngleV("LEFT_LOWER_ARM") + changeInX); break; case MENU_LEFT_HAND: robot->setAngle("LEFT_HAND", robot->getAngleH("LEFT_HAND") + changeInY, robot->getAngleV("LEFT_HAND") + changeInX); break; case MENU_RIGHT_SHOULDER: robot->setAngle("RIGHT_SHOULDER", robot->getAngleH("RIGHT_SHOULDER") + changeInY, robot->getAngleV("RIGHT_SHOULDER") + changeInX); break; case MENU_RIGHT_UPPER_ARM: robot->setAngle("RIGHT_UPPER_ARM", robot->getAngleH("RIGHT_UPPER_ARM") + changeInY, robot->getAngleV("RIGHT_UPPER_ARM") + changeInX); break; case MENU_RIGHT_LOWER_ARM: robot->setAngle("RIGHT_LOWER_ARM", robot->getAngleH("RIGHT_LOWER_ARM") + changeInY, robot->getAngleV("RIGHT_LOWER_ARM") + changeInX); break; case MENU_RIGHT_HAND: robot->setAngle("RIGHT_HAND", robot->getAngleH("RIGHT_HAND") + changeInY, robot->getAngleV("RIGHT_HAND") + changeInX); break; case MENU_LEFT_UPPER_LEG: robot->setAngle("LEFT_UPPER_LEG", robot->getAngleH("LEFT_UPPER_LEG") + changeInY, robot->getAngleV("LEFT_UPPER_LEG") + changeInX); break; case MENU_LEFT_LOWER_LEG: robot->setAngle("LEFT_LOWER_LEG", robot->getAngleH("LEFT_LOWER_LEG") + changeInY, robot->getAngleV("LEFT_LOWER_LEG") + changeInX); break; case MENU_LEFT_FOOT: robot->setAngle("LEFT_FOOT", robot->getAngleH("LEFT_FOOT") + changeInY, robot->getAngleV("LEFT_FOOT") + changeInX); break; case MENU_RIGHT_UPPER_LEG: robot->setAngle("RIGHT_UPPER_LEG", robot->getAngleH("RIGHT_UPPER_LEG") + changeInY, robot->getAngleV("RIGHT_UPPER_LEG") + changeInX); break; case MENU_RIGHT_LOWER_LEG: robot->setAngle("RIGHT_LOWER_LEG", robot->getAngleH("RIGHT_LOWER_LEG") + changeInY, robot->getAngleV("RIGHT_LOWER_LEG") + changeInX); break; case MENU_RIGHT_FOOT: robot->setAngle("RIGHT_FOOT", robot->getAngleH("RIGHT_FOOT") + changeInY, robot->getAngleV("RIGHT_FOOT") + changeInX); break; default: // Exit on unknown state printf("ERROR: Unknown menu state <%i> in motion!\n", currentMode); return; } Keyframe k_; k_.getKeyframeFromRobot(robot); aClip.setFrameAt(aClip.getCurrentFrameIndex(), k_); oldX = x; oldY = y; glutPostRedisplay(); } }