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