     #!/usr/bin/perl
#
# Feb 2002 - Ico Doornekamp - Zeff@zevv.nl
#

$|=1;

$xmax = 320;
$ymax = 240;

$fontfile = "./Trebuchet-MS.fdb";
$fontfile = "/usr/share/libming/fonts/openOfficeTTF/Helmet.fdb";
$text = hn($ENV{REMOTE_ADDR});


###########################################

use SWF;
use SWF::Font;
use SWF::Shape;
use Socket;

SWF::setScale(1.0);
$xcen = $xmax/2;
$ycen = $ymax/2;

print "Content-type: application/x-shockwave-flash\n\n";

my $m = new SWF::Movie();
$m->setRate(16);
$m->setDimension($xmax, $ymax);
$m->setBackground(0,0,0);

my $font = new SWF::Font($fontfile);
$zevv = new SWF::Text();
$zevv->setFont($font);
$zevv->setColor(rand(255),rand(255), rand(255));
$zevv->setHeight(40);
$zevv->moveTo(-$font->getWidth($text)/(2000/40), 15);
$zevv->addString($text);


 #
# The endpoind spheres
#

$grad = new SWF::Gradient();
$grad->addEntry(0, rand(255), rand(255), rand(255), 0xff);
$grad->addEntry(0.1, 0x0, 0x0, 0x0, 0xff);
$circle = new SWF::Shape();
$fill=$circle->addFill($grad, 0x12);
$fill->scaleTo(0.03);
$fill->moveTo(-15,-10);
$circle->setRightFill($fill);
circle($circle, 0, 0, 20);


$i=0;
while(<DATA>) {
        chomp;
        ($t, $i, $r) = split /\s+/, $_, 3;

        if($t eq "point") {
                ($x[$i], $y[$i], $z[$i]) = split /\s*,\s*/, $r;
                $icircle[$i] = $m->add($circle);

                if($bla++==5) {
                        $izevv = $m->add($zevv);
                        $izevv->moveTo($xcen, $ycen);
                }

        }
}

#
# Animation
#

$s = 100;
$frames = 100;

$drx = int(rand(1)+1); $drx *=-1 if(rand(2)<1);
$dry = int(rand(1)+1); $dry *=-1 if(rand(2)<1);
$drz = int(rand(1)+1); $drz *=-1 if(rand(2)<1);

for($f=0; $f<$frames; $f++) {

        $rad = ($f/$frames)*3.141592*2;
        $izevv->rotateTo(-($f/$frames)*360);

        $rx =  $drx * $rad;
        $ry =  $dry * $rad;
        $rz =  $drz * $rad;

        #
        # Rotation. Stolen from www.geocities.com/thomasnilsonse/equations3d.html
        #

        %dep = ();
        for($i=0; $i<=$#icircle; $i++) {
                $x1 = $x[$i];
                $y1 = $y[$i];
                $z1 = $z[$i];
                $y2 = $y1*cos($rz) - $z1*sin($rz);
                $z2 = $y1*sin($rz) + $z1*cos($rz);
                $x2 = $x1*cos($ry) - $z2*sin($ry);
                $z3 = $x1*sin($ry) + $z2*cos($ry);
                $x3 = $x2*cos($rx) - $y2*sin($rx);
                $y3 = $x2*sin($rx) + $y2*cos($rx);

                $perc = ($z3+1)/10 + 0.8;

                $px[$i] = $x3 * $s * $perc + $xcen;
                $py[$i] = $y3 * $s * $perc + $ycen;
                $pz[$i] = $z3;
        }

#
        # Project rotated stuff
        #

        $i=0;
        foreach $depth (sort @pz) {
                for($j=0; $j<=$#icircle; $j++) {
                        last if($pz[$j] == $depth);
                }

                $scale = ($pz[$j]+1)/4  + 0.5;
                $shade = ($pz[$j]+1)/2;
                $x = $px[$j];
                $y = $py[$j];

                $c = $icircle[$i];
                $c->scaleTo($scale);
                $c->moveTo($x, $y);
                $c->multColor($shade, $shade, $shade);

                $i++;
        }

        $m->nextFrame();

}
          $m->output();


sub circle
{
        my($s, $x, $y, $r) = @_;

        $a = $r * 0.414213562;
        $b = $r * 0.707106781;

        $s->movePenTo($x+$r, $y);
        $s->drawCurveTo($x+$r, $y-$a, $x+$b, $y-$b);
        $s->drawCurveTo($x+$a, $y-$r, $x, $y-$r);
        $s->drawCurveTo($x-$a, $y-$r, $x-$b, $y-$b);
        $s->drawCurveTo($x-$r, $y-$a, $x-$r, $y);
        $s->drawCurveTo($x-$r, $y+$a, $x-$b, $y+$b);
        $s->drawCurveTo($x-$a, $y+$r, $x, $y+$r);
        $s->drawCurveTo($x+$a, $y+$r, $x+$b, $y+$b);
        $s->drawCurveTo($x+$r, $y+$a, $x+$r, $y);

}

 sub hn
{
        my($ip) = @_;

        unless(defined($addr{$ip})) {
                $t = gethostbyaddr(inet_aton($ip), AF_INET);
                if(defined($t)) {
                        $addr{$ip} = sprintf "%s", $t, $ip;
                } else {
                        $addr{$ip} = $ip;
                }
        }
        return $addr{$ip};
}


__DATA__
point   0        0.00000000,  0.00000000, -0.95105650
point   1        0.00000000,  0.85065080, -0.42532537
point   2        0.80901698,  0.26286556, -0.42532537
point   3        0.50000000, -0.68819095, -0.42532537
point   4       -0.50000000, -0.68819095, -0.42532537
point   5       -0.80901698,  0.26286556, -0.42532537
point   6        0.50000000,  0.68819095,  0.42532537
point   7        0.80901698, -0.26286556,  0.42532537
point   8        0.00000000, -0.85065080,  0.42532537
point   9       -0.80901698, -0.26286556,  0.42532537
point   10      -0.50000000,  0.68819095,  0.42532537
point   11       0.00000000,  0.00000000,  0.95105650


