
#include <windows.h>
#include <GL\glut.h>
#include <GL\glui.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
// ----- GLOBAL VARIABLES -----
const float SPINNER_SPEED = 0.2;
// ----- USER INTERFACE VARIABLES -----
int Win[2];
int windowID;
GLUI *glui;
// ----- CAMERA VARIABLES -----
GLdouble camXPos = 0.0;
GLdouble camYPos = 0.0;
GLdouble camZPos = -30;
const GLdouble CAMERA_FOVY = 100.0;
const GLdouble NEAR_CLIP = 0.1;
const GLdouble FAR_CLIP = 500.0;
const float CAMERA_MIN = -180.0;
const float CAMERA_MAX = 180.0;
// ----- ANIMATION VARIABLES -----
const float ROOT_TRANSLATE_X_MIN = -10.0;
const float ROOT_TRANSLATE_X_MAX = 10.0;
const float ROOT_TRANSLATE_Y_MIN = -10.0;
const float ROOT_TRANSLATE_Y_MAX = 10.0;
const float ROOT_TRANSLATE_Z_MIN = -10.0;
const float ROOT_TRANSLATE_Z_MAX = 10.0;
const float ROOT_ROTATE_X_MIN = -180.0;
const float ROOT_ROTATE_X_MAX = 180.0;
const float ROOT_ROTATE_Y_MIN = -180.0;
const float ROOT_ROTATE_Y_MAX = 180.0;
const float ROOT_ROTATE_Z_MIN = -180.0;
const float ROOT_ROTATE_Z_MAX = 180.0;
const float HEAD_MIN = -10.0;
const float HEAD_MAX = 10.0;
const float HEAD_PITCH_MIN = -45.0;
const float HEAD_PITCH_MAX = 45.0;
const float HAND_X_MIN = -180.0;
const float HAND_X_MAX = 180.0;
const float HAND_Y_MIN = -45.0;
const float HAND_Y_MAX = 45.0;
const float HAND_Z_MIN = -45.0;
const float HAND_Z_MAX = 45.0;
float joint_trans_x_root = 0.0f;
float joint_trans_y_root = 0.0f;
float joint_trans_z_root = 0.0f;
float joint_rot_x_root = 0.0f;
float joint_rot_y_root = 0.0f;
float joint_rot_z_root = 0.0f;
float joint_rot_head = 0.0f;
float joint_pitch_head = 0.0f;
float joint_rot_x_hand_r = 0.0f;
float joint_rot_y_hand_r = 0.0f;
float joint_rot_z_hand_r = 0.0f;
float joint_rot_x_hand_l = 0.0f;
float joint_rot_y_hand_l = 0.0f;
float joint_rot_z_hand_l = 0.0f;
// ----- FUNCTION DECLARATIONS -----
void display(void);
void myReshape(int w, int h);
void drawSquare(int i);
void initGlui();
void initGlut(char *winName);
void animate();
// main() function
// Initializes the user interface (and any user variables)
// then hands over control to the event handler, which calls
// display() whenever the GL window needs to be redrawn.
int main(int argc, char** argv) {
// Process program arguments
if(argc != 3) {
printf("Usage: demo [width] [height]\n");
printf("Using 400x400 window by default...\n");
Win[0] = 500;
Win[1] = 500;
} else {
Win[0] = atoi(argv[1]);
Win[1] = atoi(argv[2]);
}
glutInit(&argc, argv);
initGlut(argv[0]);
initGlui();
glClearColor(0.7f, 0.7f, 0.9f, 1.0f);
glEnable(GL_DEPTH_TEST);
// Standard GLUT main event loop
glutMainLoop();
return 0;
}
Void initGlut(char *winName)
{
glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
// Create window
glutInitWindowPosition(10, 10);
glutInitWindowSize(Win[0], Win[1]);
windowID = glutCreateWindow(winName);
// Callback functions for event handling
glutReshapeFunc(myReshape);
glutDisplayFunc(display);
}
// Initialize GLUI and the user interface
Void initGlui() {
GLUI_Panel* glui_panel;
GLUI_Spinner* glui_spinner;
GLUI_Master.set_glutIdleFunc(NULL);
// Create GLUI window (joint controls) ***************
//
glui = GLUI_Master.create_glui("Joint Control", 0, Win[0]+12, 0);
// Create controls to specify root position and orientation
glui_panel = glui->add_panel("Root");
glui_spinner = glui->add_spinner_to_panel(glui_panel, "translate x:", GLUI_SPINNER_FLOAT, &joint_trans_x_root);
glui_spinner->set_float_limits(ROOT_TRANSLATE_X_MIN, ROOT_TRANSLATE_X_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "translate y:", GLUI_SPINNER_FLOAT, &joint_trans_y_root);
glui_spinner->set_float_limits(ROOT_TRANSLATE_Y_MIN, ROOT_TRANSLATE_Y_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "translate z:", GLUI_SPINNER_FLOAT, &joint_trans_z_root);
glui_spinner->set_float_limits(ROOT_TRANSLATE_Z_MIN, ROOT_TRANSLATE_Z_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "rotate x:", GLUI_SPINNER_FLOAT, &joint_rot_x_root);
glui_spinner->set_float_limits(ROOT_ROTATE_X_MIN, ROOT_ROTATE_X_MAX, GLUI_LIMIT_WRAP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "rotate y:", GLUI_SPINNER_FLOAT, &joint_rot_y_root);
glui_spinner->set_float_limits(ROOT_ROTATE_Y_MIN, ROOT_ROTATE_Y_MAX, GLUI_LIMIT_WRAP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "rotate z:", GLUI_SPINNER_FLOAT, &joint_rot_z_root);
glui_spinner->set_float_limits(ROOT_ROTATE_Z_MIN, ROOT_ROTATE_Z_MAX, GLUI_LIMIT_WRAP);
glui_spinner->set_speed(SPINNER_SPEED);
// Create controls to specify head rotation
glui_panel = glui->add_panel("Head");
glui_spinner = glui->add_spinner_to_panel(glui_panel, "roll:", GLUI_SPINNER_FLOAT, &joint_rot_head);
glui_spinner->set_float_limits(HEAD_MIN, HEAD_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "nod:", GLUI_SPINNER_FLOAT, &joint_pitch_head);
glui_spinner->set_float_limits(HEAD_PITCH_MIN, HEAD_PITCH_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui->add_column(false);
// Create controls to specify right arm
glui_panel = glui->add_panel("Right arm");
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand x:", GLUI_SPINNER_FLOAT, &joint_rot_x_hand_r);
glui_spinner->set_float_limits(HAND_X_MIN, HAND_X_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand y:", GLUI_SPINNER_FLOAT, &joint_rot_y_hand_r);
glui_spinner->set_float_limits(HAND_Y_MIN, HAND_Y_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand z:", GLUI_SPINNER_FLOAT, &joint_rot_z_hand_r);
glui_spinner->set_float_limits(HAND_Z_MIN, HAND_Z_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
// Create controls to specify left arm
glui_panel = glui->add_panel("Left arm");
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand x:", GLUI_SPINNER_FLOAT, &joint_rot_x_hand_l);
glui_spinner->set_float_limits(HAND_X_MIN, HAND_X_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand y:", GLUI_SPINNER_FLOAT, &joint_rot_y_hand_l);
glui_spinner->set_float_limits(HAND_Y_MIN, HAND_Y_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
glui_spinner = glui->add_spinner_to_panel(glui_panel, "hand z:", GLUI_SPINNER_FLOAT, &joint_rot_z_hand_l);
glui_spinner->set_float_limits(HAND_Z_MIN, HAND_Z_MAX, GLUI_LIMIT_CLAMP);
glui_spinner->set_speed(SPINNER_SPEED);
// Set the main window to be the "active" window
glui->set_main_gfx_window(windowID);
}