#!/usr/bin/perl -w

use strict;
use OpenGL qw/ :all /;

use lib 'd:/Programs/Perl/lib';
use Graphics::OpenGL;

my $spin = 0.0;
my $Light0 = new Graphics::OpenGLMaterial(
				-Position => [2.0, 8.0, 2.0, 0.0],
				-Diffuse  => [1.0, 1.0, 1.0, 1.0],
				-Ambient  => [0.15, 0.15, 0.15, 0.15],
				-Specular => [1.0, 1.0, 1.0, 1.0],
			);
my $Light1 = new Graphics::OpenGLMaterial(
				-Position => [-2.0, -8.0, 2.0, 0.0],
				-Diffuse  => [1.0, 1.0, 1.0, 1.0],
				-Ambient  => [0.15, 0.15, 0.15, 0.15],
				-Specular => [1.0, 1.0, 1.0, 1.0],
			);
my $Mater1 = new Graphics::OpenGLMaterial(
				-Diffuse   => [0.5, 0.7, 0.5, 0.5],
				-Ambient   => [0.5, 0.7, 0.5, 0.5],
				-Specular  => [1.0, 1.0, 1.0, 1.0],
#				-Emission  => [0.0, 0.0, 1.0, 1.0],
				-Shininess => [50.0],
			);

my $OGL = new Graphics::OpenGL();
$OGL->Initialize(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH,
				 0, 0, 300, 300, 'Test Module');
init($OGL);
$OGL->SetFunctions(
			-Reshape    => sub { &resize($OGL, @_); },
			-Display    => sub { &display($OGL, @_); },
			-Mouse      => sub { &mouse($OGL, @_); },
			-Keyboard   => sub { &keyboard($OGL, @_); },
#			-Special    => sub { &cbSpecialKeyPressed($OGL, @_); },
#			-Visibility => sub { &visibility($OGL, @_); },
			-Idel       => sub { &idle($OGL, @_); },
		);
#glutPostRedisplay();
$OGL->Run();


sub init {
	my ($OGL) = @_;

	$OGL->ClearColor(0.0, 0.0, 0.0, 1.0);
#For teapot
	$OGL->ShadeModel(GL_SMOOTH);
	$OGL->Enable(GL_DEPTH_TEST, GL_LIGHTING, GL_LIGHT0);
}

sub display {
	my ($OGL) = @_;
	$OGL->Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	$OGL->SetLight(GL_LIGHT0, $Light0);
#	$OGL->SetLight(GL_LIGHT1, $Light1);
	$OGL->InitializeMatrix();
	$OGL->LookAt(2.0, 4.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

	my ($x0, $y0, $z0) = (0.0, 0.0, 0.0);
	my ($x1, $y1, $z1) = (1.0, 1.0, 1.0);
	$OGL->DrawGround(0.0);
#	$OGL->DrawCube($x0, $y0, $z0, 0.2, $Mater1, 12);
#	$OGL->DrawCube($x1, $y1, $z1, 0.2, $Mater1, 12);
	$OGL->DrawSphere($x0, $y0, $z0, 0.2, $Mater1, 12);
	$OGL->DrawSphere($x1, $y1, $z1, 0.2, $Mater1, 12);
	$Mater1->SetParameters(-Emission => [1.0, 0.0, 0.0, 1.0]);
	$OGL->DrawCylinder($x0, $y0, $z0, $x1, $y1, $z1, 0.1, $Mater1, 12);
#	$OGL->DrawCylinder0(0, 0, 0, 0.1, 1.0, $Mater1, 12);

	$OGL->Show();
}

sub resize
{
	my ($OGL, $w, $h) = @_;

	$OGL->Viewport(0, 0, $w, $h);
#透視変換行列の設定
	$OGL->MatrixMode(GL_PROJECTION);
	$OGL->InitializeMatrix();
	$OGL->Perspective(30.0, $h ? $w/$h : 0, 1.0, 100.0);
#モデルビュー変換行列の設定
	$OGL->MatrixMode(GL_MODELVIEW);
}

sub idle {
	my ($OGL) = @_;

	$spin += 1.0;
	$spin = $spin - 360.0 if ($spin >360.0);
	$OGL->PostRedisplay();
}

sub mouse {
  my ($OGL, $button, $state, $x, $y) = @_;

print "mouse ($x, $y)\n";
	if($button == GLUT_LEFT_BUTTON) {
		if($state == GLUT_DOWN) {
			$OGL->SetFunctions(-Mouse => sub { &mouse($OGL, @_); } );
		}
		else {
			$OGL->SetFunctions(-Mouse => '');
		}
	}
	elsif ($button == GLUT_RIGHT_BUTTON) {
		if($state == GLUT_DOWN) {
			$OGL->PostRedisplay();
		}
	}
	else {
	}
}
