예제 #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
/**
 * Callback used for menu events.
 */
void menuEvent(int id) {
   switch (id) {
    case MENU_NORMAL_MODE:
      printf("Entering normal mode...\n");
//      robot->clearSelect();
      break;

    case MENU_ZOOM_MODE:
      printf("Entering zoom mode...\n");
//      robot->clearSelect();
      break;

    case MENU_PAN_MODE:
      printf("Entering pan mode...\n");
//      robot->clearSelect();
      break;

    case MENU_LOAD_POSE: {
      printf("Loading pose from pose.dat...\n");
      Keyframe k;
      SerialFile f("pose.dat", "rb");
      k.readFromFile(f.getPointer());
      f.close();
      aClip.setFrameAt(aClip.getCurrentFrameIndex(), k);
      robot->getRobotFromKeyframe(&k);
      id = MENU_NORMAL_MODE;
      break;
    }

    case MENU_SAVE_POSE: {
      printf("Saving pose from pose.dat...\n");
      Keyframe k;
      k.getKeyframeFromRobot(robot);
      SerialFile f("pose.dat", "wb");
      k.writeToFile(f.getPointer());
      f.close();
      id = MENU_NORMAL_MODE;
      break;
    }

    case MENU_SAVE_ANIM: {
      SerialFile f("anim.dat", "wb");
      aClip.writeToFile(f.getPointer());
      f.close();
      id = MENU_NORMAL_MODE;
      break;
    }

    case MENU_LOAD_ANIM: {
      SerialFile f("anim.dat", "rb");
      aClip.readFromFile(f.getPointer());
      f.close();
      id = MENU_NORMAL_MODE;
      break;
    }

    case MENU_HEAD:
      printf("Entering head editing...\n");
//      robot->setSelected("HEAD");
      break;

    case MENU_NECK:
      printf("Entering neck editing...\n");
//      robot->setSelected("NECK");
      break;

    case MENU_UPPER_TORSO:
      printf("Entering upper torso editing...\n");
//      robot->setSelected("UPPER_TORSO");
      break;

    case MENU_LOWER_TORSO:
      printf("Entering lower torso editing...\n");
//      robot->setSelected("LOWER_TORSO");
      break;

    case MENU_PELVIS:
      printf("Entering pelvis editing...\n");
//      robot->setSelected("PELVIS");
      break;

    case MENU_LEFT_SHOULDER:
      printf("Entering left shoulder editing...\n");
//      robot->setSelected("LEFT_SHOULDER");
      break;

    case MENU_LEFT_UPPER_ARM:
      printf("Entering left upper arm editing...\n");
//      robot->setSelected("LEFT_UPPER_ARM");
      break;

    case MENU_LEFT_LOWER_ARM:
      printf("Entering left lower arm editing...\n");
//      robot->setSelected("LEFT_LOWER_ARM");
      break;

    case MENU_LEFT_HAND:
      printf("Entering left hand editing...\n");
//      robot->setSelected("LEFT_HAND");
      break;

    case MENU_RIGHT_SHOULDER:
      printf("Entering right shoulder editing...\n");
//      robot->setSelected("RIGHT_SHOULDER");
      break;

    case MENU_RIGHT_UPPER_ARM:
      printf("Entering right upper arm editing...\n");
//      robot->setSelected("RIGHT_UPPER_ARM");
      break;

    case MENU_RIGHT_LOWER_ARM:
      printf("Entering right lower arm editing...\n");
//      robot->setSelected("RIGHT_LOWER_ARM");
      break;

    case MENU_RIGHT_HAND:
      printf("Entering right hand editing...\n");
//      robot->setSelected("RIGHT_HAND");
      break;

    case MENU_LEFT_UPPER_LEG:
      printf("Entering left upper leg editing...\n");
//      robot->setSelected("LEFT_UPPER_LEG");
      break;

    case MENU_LEFT_LOWER_LEG:
      printf("Entering left lower leg editing...\n");
//      robot->setSelected("LEFT_LOWER_LEG");
      break;

    case MENU_LEFT_FOOT:
      printf("Entering left foot editing...\n");
//      robot->setSelected("LEFT_FOOT");
      break;

    case MENU_RIGHT_UPPER_LEG:
      printf("Entering right upper leg editing...\n");
//      robot->setSelected("RIGHT_UPPER_LEG");
      break;

    case MENU_RIGHT_LOWER_LEG:
      printf("Entering right lower leg editing...\n");
//      robot->setSelected("RIGHT_LOWER_LEG");
      break;

    case MENU_RIGHT_FOOT:
      printf("Entering right foot editing...\n");
//      robot->setSelected("RIGHT_FOOT");
      break;

    default: // Exit on unknown state
      printf("ERROR: Unknown menu state <%i>\n", id);
      return;
  }

 // Update the mode to reflect the changes
  currentMode = id;
}
예제 #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();
  }
}
예제 #4
0
/**
 * Renders the graphics onto the screen.
 * Uses:
 * GL_QUADS
 * glColor
 */
void render(void) {
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(90.0f, 640.0f/640.0f, 0.1f, 100.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  /* Background color is black */
  glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  /* Update camera */
  camera.update();
 
  /* Render the robot */
  Keyframe k_ = aClip.getCurrentFrame();
  robot->getRobotFromKeyframe(&k_);
  robot->render();

  /* Draw the text */
  glLoadIdentity();
  std::string msg;

  char frame[4];

  // The current frame
  sprintf(frame, "%d", aClip.getCurrentFrameIndex());
  msg = "Current Frame: ";
  msg += frame;
  Text::drawBitmapString(-0.9f, 0.9f, GLUT_BITMAP_8_BY_13, msg);
  
  // The current keyframe
  sprintf(frame, "%d", aClip.getKeyframeIndex());
  msg = "Keyframe: ";
  if (aClip.isKeyframeAtCurrent()) msg += frame;
  Text::drawBitmapString(-0.9f, 0.85f, GLUT_BITMAP_8_BY_13, msg);

  // Actual frames per second
  sprintf(frame, "%d", framesTotal);
  msg = "Frames Per Second: ";
  if (isPlaying) msg += frame;
  Text::drawBitmapString(-0.9f, 0.80f, GLUT_BITMAP_8_BY_13, msg);

  // The requested FPS
  sprintf(frame, "%d", framesPerSecond);
  msg = "Requested FPS: ";
  msg += frame;
  Text::drawBitmapString(-0.9f, -0.9f, GLUT_BITMAP_8_BY_13, msg);

  // Playing status
  if (isPlaying) {
    if (playingForward) msg = "Forward";
    if (playingBackward) msg = "Backward";
  } else {
    msg = "Stopped";
  }  
  Text::drawBitmapString(0.8f, -0.9f, GLUT_BITMAP_8_BY_13, msg);
 

  /* Swap the buffers to display changes */
  glutSwapBuffers();
}