예제 #1
0
/**
 * 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();
}
예제 #2
0
/**
 * 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();
}
예제 #3
0
/**
 * 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();
  }
}