import java.awt.*;
import jsparrow.gl.*;
import java.awt.event.*;

public class HandCanvas extends OGLCanvas {

GLUquadricObj finger;
int View = 3;
float yangle = 0.0f;
float xangle = 0.0f;

public void draw_palm ()
{
		
		//draw part opposite of the one connecting to the thumb
		glColor3f(0.7f, 0.7f, 0.7f);
		glScalef(1.0f, 1.35f, 1.0f);
		glTranslatef(0.25f, -0.35f, 0.0f);
		glutSolidSphere(0.25, 20, 20);
		glTranslatef(-0.25f, 0.35f, 0.0f);
		glScalef(1.0f/1.0f, 1.0f/1.35f, 1.0f/1.0f);

		//draw part of palm connecting to thumb
		glColor3f(0.3f, 0.3f, 0.3f);
		
		glRotatef(-20.0f, 0.0f, 0.0f, 1.0f);
		glScalef(1.25f, 1.0f, 1.0f);
		glTranslatef(-0.04f, -0.6f, 0.0f);
		glutSolidSphere(0.25, 20, 20);
		glTranslatef(0.04f, 0.6f, 0.0f);
		glScalef(1.0f/1.25f, 1.0f/1.0f, 1.0f/1.0f);
		glRotatef(20.0f, 0.0f, 0.0f, 1.0f);

		//draw part of palm connecting to pinky finger
		glColor3f(0.0f, 1.0f, 0.0f);
		glTranslatef(0.3f, -0.02f, 0.0f);
		glutSolidSphere(0.2, 20, 20);
		glTranslatef(-0.3f, 0.02f, 0.0f);

		//draw part of palm connected to fingers
		glColor3f(1.0f, 0.0f, 0.0f);
		glTranslatef(-0.05f, -0.05f, 0.0f);
		glScalef(1.35f, 1.0f, 1.0f);
		glutSolidSphere(0.25, 20, 20);
		glScalef(1.0f/1.35f, 1.0f/1.0f, 1.0f/1.0f);
		glTranslatef(0.05f, 0.05f, 0.0f);

		//draw back of palm	
		glTranslatef(0.0f, 0.0f, -0.01f);
		glColor3f(0.0f, 0.0f, 1.0f);
		glRotatef(-5, 1.0f, 0.0f, 0.0f);
		glTranslatef(0.065f, -0.4f, 0.18f);
		glScalef(1.2f, 1.2f, 0.2f);
		glutSolidCube(0.7);
		glScalef(1.0f/1.2f, 1.0f/1.2f, 1.0f/0.2f);
		glTranslatef(-0.065f, 0.4f, -0.18f);
		glRotatef(5, 1.0f, 0.0f, 0.0f);
		glTranslatef(0.0f, 0.0f, 0.01f);

	
//	glPopMatrix();
}

public void draw_thumb()
{
	//draw joint connecting base of thumb to palm
	glColor3f(1.0f, 0.0f, 0.0f);

	glTranslatef(-0.6f, -0.4f, 0.0f);
	glutSolidSphere(0.11, 20, 20);
	glTranslatef(0.6f, 0.4f, 0.0f);


	//draw joint connecting base of thumb to top thumb
	glColor3f(1.0f, 0.0f, 0.0f);

	glTranslatef(-0.76f, -0.19f, 0.0f);
	glutSolidSphere(0.1, 20, 20);
	glTranslatef(0.76f, 0.19f, 0.0f);

	//draw base of thumb
	glColor3f(0.0f, 1.0f, 0.0f);

	glTranslatef(-0.75f, -0.2f, 0.0f);
	glRotatef(-52, 0.0f, 0.0f, 1.0f);
	glRotatef(90, 0.0f, 1.0f, 0.0f);
	gluCylinder(finger, 0.1, 0.1, 0.17, 20, 20);
	glRotatef(-90, 0.0f, 1.0f, 0.0f);
	glRotatef(52, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.75f, 0.2f, 0.0f);

	//draw top of thumb
	glColor3f(1.0f, 1.0f, 1.0f);

	glTranslatef(-0.87f, -0.0f, 0.0f);
	glRotatef(30, 0.0f, 0.0f, 1.0f);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.2f, 20, 20);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	glRotatef(-30, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.87f, 0.0f, 0.0f);
}

public void draw_pointfinger()
{
	//draw sphere connecting finger to thumb (base joint)
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.26f, 0.12f, 0.0f);
	glutSolidSphere(0.12f, 20, 20);
	glTranslatef(0.26f, -0.12f, 0.0f);

	//draw part connected to base joint
	glColor3f(0.0f, 1.0f, 0.0f);
	
	glTranslatef(-0.3f, 0.2f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.3f, -0.2f, 0.0f);

	//draw joint middle of finger
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.37f, 0.42f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.37f, -0.42f, 0.0f);

	//draw middle cylinder of finger
	glColor3f(0.0f, 0.0f, 1.0f);
	
	glTranslatef(-0.39f, 0.49f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.39f, -0.49f, 0.0f);

	//draw joint connected to the part with the tip
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.46f, 0.71f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.46f, -0.71f, 0.0f);

	//draw last cylinder of finger
	glColor3f(1.0f, 0.0f, 0.0f);
	
	glTranslatef(-0.48f, 0.79f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.48f, -0.79f, 0.0f);
}

public void draw_indexfinger ()
{	
	glTranslatef(0.22f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glScalef(1.1f, 1.1f, 1.1f);

		//draw sphere connecting finger to thumb (base joint)
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.26f, 0.12f, 0.0f);
	glutSolidSphere(0.12f, 20, 20);
	glTranslatef(0.26f, -0.12f, 0.0f);

	//draw part connected to base joint
	glColor3f(0.0f, 1.0f, 0.0f);
	
	glTranslatef(-0.3f, 0.2f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.3f, -0.2f, 0.0f);

	//draw joint middle of finger
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.37f, 0.42f, 0.0f);
	glutSolidSphere(0.1, 20, 20);
	glTranslatef(0.37f, -0.42f, 0.0f);

	//draw middle cylinder of finger
	glColor3f(0.0f, 0.0f, 1.0f);
	
	glTranslatef(-0.39f, 0.49f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.39f, -0.49f, 0.0f);

	//draw joint connected to the part with the tip
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.46f, 0.71f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.46f, -0.71f, 0.0f);

	//draw last cylinder of finger
	glColor3f(1.0f, 0.0f, 0.0f);
	
	glTranslatef(-0.48f, 0.79f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.48f, -0.79f, 0.0f);

	glScalef(1.0f/1.1f, 1.0f/1.1f, 1.0f/1.1f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glTranslatef(-0.22f, 0.0f, 0.0f);
}

public void draw_ringfinger ()
{
	glTranslatef(0.41f, -0.05f, 0.0f);
	glRotatef(-27, 0.0f, 0.0f, 1.0f);
	
	//draw sphere connecting finger to thumb (base joint)
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.26f, 0.12f, 0.0f);
	glutSolidSphere(0.12f, 20, 20);
	glTranslatef(0.26f, -0.12f, 0.0f);

	//draw part connected to base joint
	glColor3f(0.0f, 1.0f, 0.0f);
	
	glTranslatef(-0.3f, 0.2f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.3f, -0.2f, 0.0f);

	//draw joint middle of finger
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.37f, 0.42f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.37f, -0.42f, 0.0f);

	//draw middle cylinder of finger
	glColor3f(0.0f, 0.0f, 1.0f);
	
	glTranslatef(-0.39f, 0.49f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.39f, -0.49f, 0.0f);

	//draw joint connected to the part with the tip
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.46f, 0.71f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.46f, -0.71f, 0.0f);

	//draw last cylinder of finger
	glColor3f(1.0f, 0.0f, 0.0f);
	
	glTranslatef(-0.48f, 0.79f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.16f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.48f, -0.79f, 0.0f);

	glRotatef(27, 0.0f, 0.0f, 1.0f);
	glTranslatef(-0.41f, 0.05f, 0.0f);
}

public void draw_littlefinger ()
{
	
	glTranslatef(0.61f, -0.05f, 0.0f);
	glRotatef(-37, 0.0f, 0.0f, 1.0f);
	//glScalef(1.0f, 0.8f, 1.0f);

	//draw sphere connecting finger to thumb (base joint)
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.26f, 0.05f, 0.0f);
	glutSolidSphere(0.1f, 20, 20);
	glTranslatef(0.26f, -0.05f, 0.0f);

	//draw part connected to base joint
	glColor3f(0.0f, 1.0f, 0.0f);
	
	glTranslatef(-0.28f, 0.1f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.13f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.28f, -0.1f, 0.0f);

	//draw joint middle of finger
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.33f, 0.26f, 0.0f);
	glutSolidSphere(0.08f, 20, 20);
	glTranslatef(0.33f, -0.26f, 0.0f);

	//draw middle cylinder of finger
	glColor3f(0.0f, 0.0f, 1.0f);
	
	glTranslatef(-0.35f, 0.31f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.13f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.35f, -0.31f, 0.0f);

	//draw joint connected to the part with the tip
	glColor3f(1.0f, 1.0f, 1.0f);
	
	glTranslatef(-0.4f, 0.48f, 0.0f);
	glutSolidSphere(0.08f, 20, 20);
	glTranslatef(0.4f, -0.48f, 0.0f);

	//draw last cylinder of finger
	glColor3f(1.0f, 0.0f, 0.0f);
	
	glTranslatef(-0.41f, 0.53f, 0.0f);
	glRotatef(15, 0.0f, 0.0f, 1.0f);
	glRotatef(-90, 1.0f, 0.0f, 0.0f);
	gluCylinder(finger, 0.1f, 0.1f, 0.13f, 20, 20);
	glRotatef(90, 1.0f, 0.0f, 0.0f);
	glRotatef(-15, 0.0f, 0.0f, 1.0f);
	glTranslatef(0.41f, -0.53f, 0.0f);

	//glScalef(1.0f/1.0f, 1.0/0.8f, 1.0f/1.0f);
	glRotatef(37, 0.0f, 0.0f, 1.0f);
	glTranslatef(-0.61f, 0.05f, 0.0f);

}

public void event_keyboard(char key, int x, int y)
{
	switch (key)
	{
		case '4': yangle = yangle - 7; //rotate around right 
				  break;
		case '6': yangle = yangle + 7; //rotate around left
				  break;
		case '8': xangle = xangle - 7; 
				  break;
		case '2': xangle = xangle + 7; 
				  break;
	}

	glutPostRedisplay();
}

public void init()
{
	finger=gluNewQuadric();
	//View = 0;

    glEnable(GL_DEPTH_TEST);
}

public void event_display()
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
	glRotatef(yangle,0.0f,1.0f,0.0f);
	glRotatef(xangle,1.0f,0.0f,0.0f);

	glScalef(0.8f, 0.8f, 0.8f);
	draw_palm();
	draw_thumb();
	draw_pointfinger();
	draw_indexfinger();
	draw_ringfinger();
	draw_littlefinger();
	glScalef(1.0f/0.8f, 1.0f/0.8f, 1.0f/0.8f);
	
	glPopMatrix();
	glutSwapBuffers();
}

int main()
{

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB 
                            | GLUT_DEPTH);
    OGLContext context = jsCreateContextAuto();
    glutInitWindowSize(400, 400);
    jsInitFunc("init", this, context);
    glutDisplayFunc("event_display", this, context);
    glutKeyboardFunc("event_keyboard", this, context);
    //gluDeleteQuadric(finger);
    return 0;
}

public static void main (String argv[]) {
    HandCanvas canvas = new HandCanvas();
    canvas.main();
    Frame frame = new Frame("HAND!!!!");
    frame.add(canvas);
    frame.pack();
    frame.show();
}


}
