/** * 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(); }
/** * 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; }
/** * 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(); } }
/** * 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(); }