#!/usr/bin/perl -w
use strict;
use OpenGL qw/ :all /;
use Math::Trig;

use constant N_SHAPES => 7;
my $r = 0; #回転角
my $green = [0.0, 1.0, 0.0, 1.0];
my $red   = [0.8, 0.2, 0.2, 1.0];
my $white = [1.0, 1.0, 1.0, 1.0];

glutInit();
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow('test');
glutDisplayFunc(\&display);
glutReshapeFunc(\&resize);
glutMouseFunc(\&mouse);
glutKeyboardFunc(\&keyboard);
init();
glutMainLoop();

sub idle
{
	glutPostRedisplay();
}

sub display
{
#光源の位置
	my $lightpos = [3.0, 4.0, .0, 1.0];
#視点の位置
	my ($ex, $ez) = (0.0, 0.0);
#視点の向き
	my $r = 0.0;
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
#視点の移動
	glRotated($r, 0.0, 1.0, 0.0);
	glTranslated($ex, 0.0, $ez);
#	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
#光源の位置を設定
	glLightf(GL_LIGHT0, GL_POSITION, $lightpos);

#	glColor3d(0.0, 0.0, 0.0);
	glMaterialf(GL_FRONT_AND_BACK, GL_DIFFUSE, $red);
	glBegin(GL_LINE_LOOP); 
		glVertex2d(-0.9, -0.9);
		glVertex2d( 0.9, -0.9);
		glVertex2d( 0.9,  0.9);
		glVertex2d(-0.9,  0.9);
	glEnd();
	glPushMatrix();
		glTranslated(0.5, 0.0, 0.0);
		glutSolidCube(0.5);
	glPopMatrix();

#	glFlush();
	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(0.0, 0.0, 0.0, 1.0);
#隠面処理を有効にする
	glEnable(GL_DEPTH_TEST);
#カリング（後ろを向いている面を除外する)
#	glEnable(GL_CULL_FACE);
#	glCullFace(GL_BACK); # GL_FRONT GL_FRONT_AND_BACK

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glLightf(GL_LIGHT0, GL_DIFFUSE,  $white);
	glLightf(GL_LIGHT0, GL_SPECULAR, $white);
}
