#!/usr/bin/perl

print "#VRML V2.0 utf8\n\n";

print " PROTO BRICK [ ] {\n";
print "  Appearance {\n";
print "	   material Material {\n";
print "	     diffuseColor 1.0 1.0 1.0\n";
print "	     emissiveColor 0.7 0.7 0.7\n";
print "      shininess 1\n";
print "	   }\n";
print "  }\n";
print " }\n\n";

$flnm = $ARGV[0];
#print "Reading input from $flnm\n";

open (SPINE, $flnm);
#Read the title
$line = <SPINE>;
print "#$line\n";

# blank Line
$line = <SPINE>;

# first line gives first translation parameters for spine 1
$line = <SPINE>;
@pcs = split(' ',$line);
$T11[0] = $pcs[0];
$T11[1] = $pcs[1];
$T11[2] = $pcs[2];
# second line gives second translation parameters for spine 1
$line = <SPINE>;
@pcs = split(' ',$line);
$T12[0] = $pcs[0];
$T12[1] = $pcs[1];
$T12[2] = $pcs[2];
# first line gives first translation parameters for spine 2
$line = <SPINE>;
@pcs = split(' ',$line);
$T21[0] = $pcs[0];
$T21[1] = $pcs[1];
$T21[2] = $pcs[2];
# second line gives second translation parameters for spine 2
$line = <SPINE>;
@pcs = split(' ',$line);
$T22[0] = $pcs[0];
$T22[1] = $pcs[1];
$T22[2] = $pcs[2];

# blank Line
$line = <SPINE>;

# Definition of spine1
$numele = -1;
do {
    $line = <SPINE>;
    chomp $line;
    @pcs = split(' ',$line);
    if ($#pcs > 0) {
	$numele ++;
	$one[$numele][0] = $pcs[0];
	$one[$numele][1] = $pcs[1];
    }
} while $#pcs > 0 ;
#print "\nNumber of elements in spine $#one \n";

# Definition of spine2
$numele = -1;
do {
    $line = <SPINE>;
    chomp $line;
    @pcs = split(' ',$line);
    if ($#pcs > 0) {
	$numele ++;
	$two[$numele][0] = $pcs[0];
	$two[$numele][1] = $pcs[1];
    }
} while $#pcs > 0 ;
#print "\nNumber of elements in spine $#two \n";

close SPINE ;


#---------------------------------------------------------

# First quadrant
@first = genquadrant(@one,@two,1);


$t[0] = $T11[0];
$t[1] = $T11[1];
$t[2] = $T11[2];
&printFace(@first);

#---------------------------------------------------------

sub genquadrant {
    my @temp;
    my @spine;
    my $numele = $#_ - 1;
    my $numone = ($numele+1)/2-1;
    my $flag = $_[$#_];
    if ($flag==1) { $gap1 = 0.0; $gap2 = $T21[2]-$T11[2]}
    if ($flag==2) { $gap1 = $T22[0]-$T12[0]; $gap2 = 0.0}
    if ($flag==3) { $gap1 = 0.0; $gap2 = -($T21[2]-$T11[2])}
    if ($flag==4) { $gap1 =-($T22[0]-$T12[0]); $gap2 = 0.0}

    $j = -1;
    for $i (0 .. $numone) {
	if ($flag == 1) {
	    $x =       $_[$i][0];
	    $y =       $_[$i][1];
	}
	if ($flag == 2) {
	    $x = 0.0 - $_[$numone-$i][0];
	    $y =       $_[$numone-$i][1];
	}
	if ($flag == 3) {
	    $x = 0.0 - $_[$i][0];
	    $y = 0.0 - $_[$i][1];
	}
	if ($flag == 4) {
	    $x =       $_[$numone-$i][0];
	    $y = 0.0 - $_[$numone-$i][1];
	}
	$j++;
	$temp[$j][0] = $x;
	$temp[$j][1] = $y;
    }
    @spine = genspine(@temp,0.0,0.0);
    $j = -1;
    for $i ($numone+1 .. $numele) {
	if ($flag == 1) {
	    $x =       $_[$i][0];
	    $y =       $_[$i][1];
	}
	if ($flag == 2) {
	    $x = 0.0 - $_[$numone+1+$numele-$i][0];
	    $y =       $_[$numone+1+$numele-$i][1];
	}
	if ($flag == 3) {
	    $x = 0.0 - $_[$i][0];
	    $y = 0.0 - $_[$i][1];
	}
	if ($flag == 4) {
	    $x =       $_[$numone+1+$numele-$i][0];
	    $y = 0.0 - $_[$numone+1+$numele-$i][1];
	}
	$j++;
	$temp[$j][0] = $x;
	$temp[$j][1] = $y;
    }
    @spine = (@spine,genspine(@temp,$gap1,$gap2));
}

#########################################################
sub genspine {
    my @spine ;
    my $gap1 = $_[$#_-1];
    my $gap2 = $_[$#_];

    $numele = 0;
    $spine[0][0] = 0.0;
    $spine[0][1] = 0.0;
    for $i (0 .. ($#_-2)) {
	$numele ++;
	$spine[$numele][0] = $spine[$numele-1][0] + $_[$i][0];
	$spine[$numele][1] = $spine[$numele-1][1] + $_[$i][1];
    }
    for $i (0 .. ($#spine)) {
	$spine[$i][0] += $gap1;
	$spine[$i][1] += $gap2;
    }
    @spine;
}

#########################################################
sub printFace {

    my @coord = @_;
    my $numele = $#_;
    my $numone = ($numele+1)/2;

    print "DEF MainFloor Transform {\n";
    print " children [\n";
    for $i (0 .. $numone-2) {
	$j = $i+1; $k = $numone+$i+1; $l = $numone+$i;
	print "  DEF FLOOR$i Transform {\n";
	printf "  translation %7.2f %7.2f %7.2f\n",$t[0],$t[1],$t[2];
	print "  children [\n";
	print "    Shape {\n";
	print "      appearance BRICK { }\n";
	print "      geometry IndexedLineSet {\n";
	print "        coord Coordinate {\n";
	print "          point [\n";
	printf "             %7.2f 0.0 %7.2f,\n",$coord[$i][0],$coord[$i][1];
	printf "             %7.2f 0.0 %7.2f,\n",$coord[$j][0],$coord[$j][1];
	printf "             %7.2f 0.0 %7.2f,\n",$coord[$k][0],$coord[$k][1];
	printf "             %7.2f 0.0 %7.2f,\n",$coord[$l][0],$coord[$l][1];
	$xc = $t[0]+($coord[$i][0]+$coord[$j][0]+$coord[$k][0]+$coord[$l][0])/4.0;
	$yc = $t[1];
	$zc = $t[2]+($coord[$i][1]+$coord[$j][1]+$coord[$k][1]+$coord[$l][1])/4.0;
	print "          ]\n";
	print "        }\n";
	print "        coordIndex [ 0, 1, 2, 3, 0, -1 ]\n";
	print "      }\n";
	print "    }\n";
	print "  ]\n";
	print "}\n";
        print "Transform {\n";
        print "  scale 0.75 0.75 0.75\n";
	print "  center $xc $yc $zc\n";
	print "  children USE FLOOR$i\n";
	print "}\n\n";	
        print "Transform {\n";
        print "  scale 0.5 0.5 0.5\n";
	print "  center $xc $yc $zc\n";
	print "  children USE FLOOR$i\n";
	print "}\n\n";	
        print "Transform {\n";
        print "  scale 0.25 0.25 0.25\n";
	print "  center $xc $yc $zc\n";
	print "  children USE FLOOR$i\n";
	print "}\n\n";	
    }
    print " ]\n}\n";
######################################################
#    print "DEF FLOOR Transform {\n";
#    printf "  translation %7.2f %7.2f %7.2f\n",$t[0],$t[1],$t[2];
#    print "  children [\n";
#    print "    Shape {\n";
#    print "      appearance BRICK { }\n";
#    print "      geometry IndexedLineSet {\n";
#    print "        coord Coordinate {\n";
#    print "          point [\n";
#    for $i (0 .. $numele) {
#	 printf "             %7.2f 0.0 %7.2f,\n",$coord[$i][0],$coord[$i][1];
#    }
#    print "          ]\n";
#    print "        }\n";
#    print "        coordIndex [\n";
#    for $i (0 .. $numone-2) {
#	 $j = $i+1; $k = $numone+$i+1; $l = $numone+$i;
#	 print "        $i, $j, $k, $l, -1,\n";
#    }
#    print "        ]\n";
#    print "      }\n";
#    print "    }\n";
#    print "  ]\n";
#    print "}\n";
#
#
# Replicate the object in remaining quadrants
    print "\n\nTransform {\n";
    print "  rotation 0.0 1.0 0.0 1.57079\n";
    print "  children [\n";
    print "    USE MainFloor\n";
    print "    Transform {\n";
    print "      rotation 0.0 1.0 0.0 1.57079\n";
    print "      children [\n";
    print "        USE MainFloor\n";
    print "        Transform {\n";
    print "          rotation 0.0 1.0 0.0 1.57079\n";
    print "          children [\n";
    print "            USE MainFloor\n";
    print "          ]\n";
    print "        }\n";
    print "      ]\n";
    print "    }\n";
    print "  ]\n";
    print "}\n";
}
