#!/usr/bin/perl -w
use strict;
use OpenGL qw/ :all /;
use Math::Trig;

use constant N_SHAPES => 7;
my $vertex = [
	[0.0, 0.0, 0.0],
	[1.0, 0.0, 0.0],
	[1.0, 1.0, 0.0],
	[0.0, 1.0, 0.0],
	[0.0, 0.0, 1.0],
	[1.0, 0.0, 1.0],
	[1.0, 1.0, 1.0],
	[0.0, 1.0, 1.0],
	];
my $edge = [
	[0, 1],
	[1, 2],
	[2, 3],
	[3, 0],
	[4, 5],
	[5, 6],
	[6, 7],
	[7, 4],
	[0, 4],
	[1, 5],
	[2, 6],
	[3, 7],
	];
my $face = [
	[0, 1, 2, 3],
	[1, 5, 6, 2],
	[5, 4, 7, 6],
	[4, 0, 3, 7],
	[4, 5, 1, 0],
	[3, 2, 6, 7],
	];
my $color = [
	[1.0, 0.0, 0.0],
	[0.0, 1.0, 0.0],
	[0.0, 0.0, 1.0],
	[1.0, 1.0, 0.0],
	[1.0, 0.0, 1.0],
	[0.0, 1.0, 1.0],
	];
my $r = 0; #回転角

glutInit();
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow('test');
glutDisplayFunc(\&display);
glutReshapeFunc(\&resize);
glutMouseFunc(\&mouse);
glutKeyboardFunc(\&keyboard);
init();
glutMainLoop();

sub idle
{
	glutPostRedisplay();
}

sub display
{
	glClear(GL_COLOR_BUFFER_BIT);
	glLoadIdentity();
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glRotated($r, 0.0, 1.0, 0.0);

	glColor3d(0.0, 0.0, 0.0);
#GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_TRIANGLES GL_QUADS 
#GL_TRIANGLE_STRIP GL_QUAD_STRIP GL_TRIANGLE_FAN GL_POLYGON
	glBegin(GL_POLYGON);
#    for(my $i = 0 ; $i < 12 ; $i++) {
#    	glVertex3d($vertex->[$edge->[$i][0]][0], $vertex->[$edge->[$i][0]][1], $vertex->[$edge->[$i][0]][2]);
#    	glVertex3d($vertex->[$edge->[$i][1]][0], $vertex->[$edge->[$i][1]][1], $vertex->[$edge->[$i][1]][2]);
#    }
    for(my $j = 0; $j < 6 ; $j++) {
    	glColor3d($color->[$j][0], $color->[$j][1], $color->[$j][2]);
    	for(my $i = 0; $i < 4 ; $i++) {
    		glVertex3d($vertex->[$face->[$j][$i]][0], $vertex->[$face->[$j][$i]][1], $vertex->[$face->[$j][$i]][2]);
	    }
    }
   
	glEnd();
	
	glutSwapBuffers();
	
	if(++$r >= 360) { 
		$r = 0;
	}
}

sub resize
{
	my ($w, $h) = @_;
# $w, $h: 表示ウインドウのサイズが入ってくる

#表示するサイズ
	glViewport(0, 0, $w, $h);
#透視変換行列の設定
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, $h ? $w/$h : 0, 1.0, 100.0);

#モデルビュー変換行列の設定
	glMatrixMode(GL_MODELVIEW);
}

sub mouse {
  my ($button, $state, $x, $y) = @_;
#x,y: 左上を(0,0)とした画面のピクセル座標
print "mouse ($x, $y)\n";

	if($button == GLUT_LEFT_BUTTON) {
		if($state == GLUT_DOWN) {
			glutIdleFunc(\&idle);
		}
		else {
			glutIdleFunc();
		}
	}
	elsif ($button == GLUT_RIGHT_BUTTON) {
		if($state == GLUT_DOWN) {
			glutPostRedisplay();
		}
	}
	else {
	}
}

sub keyboard
{
	my ($key, $x, $y) = @_;
print "keyboard ($key, $x, $y)\n";

	if($key eq 'q' or $key eq 'Q' or $key == 113 or $key == 81) {
		exit;
	}
	else {
	}
}

sub init
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
}
