# Some 3D/2D representations of Go Boards.
# this may not be of great interest to people who don't play Go
# except in some strange visualization senses.
# Also Go players will not find this to look too much like a real go board.
package PDL::Graphics::TriD::GoBoard;
use base qw/PDL::Graphics::TriD::Object/;
use fields qw /Data InLays BG/;
BEGIN {
use PDL::Config;
if ( $PDL::Config{USE_POGL} ) {
eval "use OpenGL $PDL::Config{POGL_VERSION} qw(:all)";
eval 'use PDL::Graphics::OpenGL::Perl::OpenGL';
} else {
eval 'use PDL::Graphics::OpenGL';
}
}
use PDL::Lite;
sub new {
my($type,$opts) = @_;
my $this = $type->SUPER::new();
$this->{Data} = $opts->{Data};
my $d = $opts->{Data};
my $eo = ($d->slice("(3)")+0.000005) /
($d->slice("(2)") + $d->slice("(3)") + 0.00001);
$this->{BG} = new PDL::Graphics::TriD::Image([$eo*0, $eo, 0*$eo]);
return $this;
}
sub add_inlay {
my($this,$data,$x,$y,$z) = @_;
push @{$this->{InLays}},[$z,(new PDL::Graphics::TriD::GoBoard({Data => $data})),
$x,$y, $data->dims];
}
sub togl {
my($this) = @_;
# my $z = 0.5;
# my $z = 0.001;
my $z = 0.01;
print "BOARD2GL\n" if $PDL::Graphics::TriD::verbose;
# 0 = white, 1 = black, 2 = outside, 3 = empty.
my $d = $this->{Data};
$this->{BG}->togl();
glDisable(GL_LIGHTING);
# 1. stones.
my $hass = $d->slice("(0)") + $d->slice("(1)");
my $stoc = $d->slice("(0)") / ($hass+0.00001);
my ($x,$y);
my ($foo,$nx,$ny) = ($this->{Data}->dims);
my $xs = 0.5/$nx; my $ys = 0.5/$ny;
glBegin(GL_QUADS);
for $x (0..$nx-1) {
for $y (0..$ny-1) {
my $c = $stoc->at($x,$y);
my $s = $hass->at($x,$y);
my $cx = ($x+0.5)/$nx;
my $cy = ($y+0.5)/$ny;
# glColor3f($c,$c,$c);
glColor3f($c,0.3,1-$c);
glVertex3d($cx+$s*$xs,$cy,$z);
glVertex3d($cx,$cy+$s*$ys,$z);
glVertex3d($cx-$s*$xs,$cy,$z);
glVertex3d($cx,$cy-$s*$ys,$z);
}
}
glEnd();
for (@{$this->{InLays}}) {
glEnable(&GL_DEPTH_TEST);
glPushMatrix();
glTranslatef($xs*2*$_->[2],$ys*2*$_->[3],
$_->[0]);
my $z = -$_->[0];
glScalef($_->[5]/$nx,$_->[6]/$ny,1);
$_->[1]->togl();
glDisable(&GL_LIGHTING);
glColor3d(1,1,1);
glBegin(&GL_LINES);
glVertex3d(0,0,0);
glVertex3d(0,0,$z);
glVertex3d(0,1,0);
glVertex3d(0,1,$z);
glVertex3d(1,0,0);
glVertex3d(1,0,$z);
glVertex3d(1,1,0);
glVertex3d(1,1,$z);
glEnd();
glPopMatrix();
}
glEnable(&GL_LIGHTING);
}
1;