#!/usr/bin/perl -w
# RCSid $Id: genambpos.pl,v 2.8 2014/05/15 17:30:53 greg Exp $
#
# Visualize ambient positions and gradients
#
use strict;
sub userror {
	print STDERR "Usage: genambpos [-l lvl][-w minwt][-r rad][-s sf][-p][-d] scene.amb > ambloc.rad\n";
	exit 1;
}
my $lvlsel = -1;
my $scale = 0.25;
my $doposgrad = 0;
my $dodirgrad = 0;
my $minwt = 0.5001**6;
my $fixedrad="";
my $savedARGV = "genambpos @ARGV";
# Get options
while ($#ARGV >= 0) {
	if ("$ARGV[0]" =~ /^-p/) {
		$doposgrad=1;
	} elsif ("$ARGV[0]" =~ /^-d/) {
		$dodirgrad=1;
	} elsif ("$ARGV[0]" =~ /^-l/) {
		$lvlsel = $ARGV[1];
		shift @ARGV;
	} elsif ("$ARGV[0]" =~ /^-w/) {
		$minwt = $ARGV[1];
		shift @ARGV;
	} elsif ("$ARGV[0]" =~ /^-s/) {
		$scale = $ARGV[1];
		shift @ARGV;
	} elsif ("$ARGV[0]" =~ /^-r/) {
		$fixedrad = "-e psiz:$ARGV[1]";
		shift @ARGV;
	} elsif ("$ARGV[0]" =~ /^-./) {
		userror();
	} else {
		last;
	}
	shift @ARGV;
}
userror() if ($#ARGV != 0);
my $cmd = "getinfo < $ARGV[0] " . 
		q[| sed -n 's/^.* -aa \([.0-9][^ ]*\) .*$/\1/p'];
my $ambacc=`$cmd`;
die "Missing -aa setting in header\n" if (! $ambacc );
die "Zero -aa setting in header\n" if ($ambacc <= .00001);
$scale *= $ambacc;
my $ambfmt = '
void glow posglow
0
0
4 ${agr} ${agg} ${agb} 0

posglow sphere position${recno}
0
0
4 ${  px  } ${  py  } ${  pz  } ${ psiz }
';
my $posgradfmt = '
void glow arrglow
0
0
4 ${wt*agr} ${wt*agg} ${wt*agb} 0

arrglow cone pgarrow${recno}
0
0
8
	${    cx0    }	${    cy0    }	${    cz0    }
	${    cx1    }	${    cy1    }	${    cz1    }
	${   cr0   }	0

void brightfunc pgpat
2 posfunc ambpos.cal
0
6 ${ px } ${ py } ${ pz } ${ pgx } ${ pgy } ${ pgz }

pgpat glow pgval
0
0
4 ${avr} ${avg} ${avb} 0

void mixfunc pgeval
4 pgval void ellipstencil ambpos.cal
0
9 ${ px } ${ py } ${ pz } ${ux/r0} ${uy/r0} ${uz/r0} ${vx/r1} ${vy/r1} ${vz/r1}

pgeval polygon pgellipse${recno}
0
0
12
	${   px1   } ${   py1   } ${   pz1   }
	${   px2   } ${   py2   } ${   pz2   }
	${   px3   } ${   py3   } ${   pz3   }
	${   px4   } ${   py4   } ${   pz4   }
';
$posgradfmt .= '
void glow tipglow
0
0
4 ${2*agr} ${2*agg} ${2*agb} 0

tipglow sphere atip
0
0
4 ${   cx1   } ${   cy1   } ${   cz1   } ${psiz/7}
' if ($dodirgrad);
my $dirgradfmt='
void brightfunc dgpat
2 dirfunc ambpos.cal
0
9 ${ px } ${ py } ${ pz } ${ nx } ${ ny } ${ nz } ${ dgx } ${ dgy } ${ dgz }

dgpat glow dgval
0
0
4 ${avr} ${avg} ${avb} 0

dgval ring dgdisk${recno}a
0
0
8
	${ px+dgx/dg*eps*.5 } ${ py+dgy/dg*eps*.5 } ${ pz+dgz/dg*eps*.5 }
	${ dgx } ${ dgy } ${ dgz }
	0	${  r0/2  }

dgval ring dgdisk${recno}b
0
0
8
	${ px-dgx/dg*eps*.5 } ${ py-dgy/dg*eps*.5 } ${ pz-dgz/dg*eps*.5 }
	${ -dgx } ${ -dgy } ${ -dgz }
	0	${  r0/2  }
';
# Load & convert ambient values
print "# Output produced by: $savedARGV\n";
system "lookamb -h -d $ARGV[0] | rcalc -e 'LV:$lvlsel;MW:$minwt;SF:$scale'" .
		" -f rambpos.cal -e cond=acond $fixedrad -o '$ambfmt'";
if ($doposgrad) {
	system "lookamb -h -d $ARGV[0] " .
		"| rcalc -e 'LV:$lvlsel;MW:$minwt;SF:$scale'" .
		" -f rambpos.cal -e cond=pcond $fixedrad -o '$posgradfmt'";
}
if ($dodirgrad) {
	system "lookamb -h -d $ARGV[0] " .
		"| rcalc -e 'LV:$lvlsel;MW:$minwt;SF:$scale'" .
		" -f rambpos.cal -e cond=dcond -o '$dirgradfmt'";
}
exit;
