#!/usr/bin/perl

print "#VRML V2.0 utf8\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 "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 Appearance {\n";
    print "       texture DEF BRICK ImageTexture { url \"../IMG/64/brick17.jpg\" }\n";
    print "       material DEF BRICKMaterial Material {diffuseColor 1.0 1.0 1.0 }\n";
    print "      }\n";
    print "      geometry DEF FLOOR IndexedFaceSet {\n";
    print "        solid FALSE\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 "        texCoord TextureCoordinate {\n";
    print "          point [\n";
    for $i (0 .. $numele) {
	$fS = ($coord[$i][0]+$t[0])/4.0;
	$fT = ($coord[$i][1]+$t[2])/4.0;
	printf "             %8.3f %8.3f,\n",$fS,$fT;
    }
    print "          ]\n";
    print "        }\n";
    print "      }\n";
    print "    }\n";
    print "  ]\n";
    print "}\n";


# Replicate the object in remaining quadrants
    print "Transform {\n";
    print "	rotation 0.0 1.0 0.0 1.57079\n";
    print "	children [\n";
    print "	 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  Appearance {\n";
    print "	     texture USE BRICK\n";
    print "	     textureTransform TextureTransform { rotation 1.57079}\n";
    print "	     material USE BRICKMaterial\n";
    print "	    }\n";
    print "	    geometry USE FLOOR\n";
    print "	   }\n";
    print "	  ]\n";
    print "	 }\n";
    print "	]\n";
    print "}\n";
    print "Transform {\n";
    print "	rotation 0.0 1.0 0.0 3.14159\n";
    print "	children [\n";
    print "	 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  Appearance {\n";
    print "	     texture USE BRICK\n";
    print "	     textureTransform TextureTransform { rotation 3.14159 }\n";
    print "	     material USE BRICKMaterial\n";
    print "	    }\n";
    print "	    geometry USE FLOOR\n";
    print "	   }\n";
    print "	  ]\n";
    print "	 }\n";
    print "	]\n";
    print "}\n";
    print "Transform {\n";
    print "	rotation 0.0 1.0 0.0 -1.57079\n";
    print "	children [\n";
    print "	 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  Appearance {\n";
    print "	     texture USE BRICK\n";
    print "	     textureTransform TextureTransform { rotation -1.57079 }\n";
    print "	     material USE BRICKMaterial\n";
    print "	    }\n";
    print "	    geometry USE FLOOR\n";
    print "	   }\n";
    print "	  ]\n";
    print "	 }\n";
    print "	]\n";
    print "}\n";

}
