--- ray/src/util/genBSDF.pl 2011/06/03 19:41:14 2.19
+++ ray/src/util/genBSDF.pl 2011/11/21 20:07:50 2.28
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# RCSid $Id: genBSDF.pl,v 2.19 2011/06/03 19:41:14 greg Exp $
+# RCSid $Id: genBSDF.pl,v 2.28 2011/11/21 20:07:50 greg Exp $
#
# Compute BSDF based on geometry and material description
#
@@ -13,15 +13,18 @@ sub userror {
}
my $td = mkdtemp("/tmp/genBSDF.XXXXXX");
chomp $td;
+my @savedARGV = @ARGV;
my $tensortree = 0;
my $ttlog2 = 4;
-my $nsamp = 1000;
+my $nsamp = 2000;
my $rtargs = "-w -ab 5 -ad 700 -lw 3e-6";
my $mgfin = 0;
my $geout = 1;
my $nproc = 1;
my $doforw = 0;
my $doback = 1;
+my $pctcull = 95;
+my $gunit = "Meter";
my @dim;
# Get options
while ($#ARGV >= 0) {
@@ -32,10 +35,18 @@ while ($#ARGV >= 0) {
shift @ARGV;
} elsif ("$ARGV[0]" =~ /^[-+]g/) {
$geout = ("$ARGV[0]" =~ /^\+/);
+ $gunit = $ARGV[1];
+ if ($gunit !~ /^(?i)(meter|foot|inch|centimeter|millimeter)$/) {
+ die "Illegal geometry unit '$gunit': must be meter, foot, inch, centimeter, or millimeter\n";
+ }
+ shift @ARGV;
} elsif ("$ARGV[0]" =~ /^[-+]f/) {
$doforw = ("$ARGV[0]" =~ /^\+/);
} elsif ("$ARGV[0]" =~ /^[-+]b/) {
$doback = ("$ARGV[0]" =~ /^\+/);
+ } elsif ("$ARGV[0]" eq "-t") {
+ $pctcull = $ARGV[1];
+ shift @ARGV;
} elsif ("$ARGV[0]" =~ /^-t[34]$/) {
$tensortree = substr($ARGV[0], 2, 1);
$ttlog2 = $ARGV[1];
@@ -98,20 +109,23 @@ die "Could not compile scene\n" if ( $? );
print
'
-System
+';
+print "\n";
+print
+'System
Name
Manufacturer
';
-printf "\t\t%.3f\n", $dim[5] - $dim[4];
-printf "\t\t%.3f\n", $dim[1] - $dim[0];
-printf "\t\t%.3f\n", $dim[3] - $dim[2];
+printf "\t\t%.3f\n", $dim[5] - $dim[4];
+printf "\t\t%.3f\n", $dim[1] - $dim[0];
+printf "\t\t%.3f\n", $dim[3] - $dim[2];
print "\t\tIntegral\n";
# Output MGF description if requested
if ( $geout ) {
- print "\t\t\n";
+ print "\t\t\n";
printf "xf -t %.6f %.6f 0\n", -($dim[0]+$dim[1])/2, -($dim[2]+$dim[3])/2;
open(MGFSCN, "< $mgfscn");
while () { print $_; }
@@ -139,26 +153,34 @@ print
';
# Clean up temporary files and exit
-if ( $persistfile && open(PFI, "< $persistfile") ) {
- while () {
- s/^[^ ]* //;
- kill('ALRM', $_);
- last;
- }
- close PFI;
-}
exec("rm -rf $td");
#-------------- End of main program segment --------------#
+#++++++++++++++ Kill persistent rtrace +++++++++++++++++++#
+sub persist_end {
+ if ( $persistfile && open(PFI, "< $persistfile") ) {
+ while () {
+ s/^[^ ]* //;
+ kill('ALRM', $_);
+ last;
+ }
+ close PFI;
+ }
+}
+
#++++++++++++++ Tensor tree BSDF generation ++++++++++++++#
sub do_tree_bsdf {
# Get sampling rate and subdivide task
my $ns2 = $ns;
$ns2 /= 2 if ( $tensortree == 3 );
-@pdiv = (0, int($ns2/$nproc));
-my $nrem = $ns2 % $nproc;
-for (my $i = 1; $i < $nproc; $i++) {
+my $nsplice = $nproc;
+$nsplice *= 10 if ($nproc > 1);
+$nsplice = $ns2 if ($nsplice > $ns2);
+$nsplice = 999 if ($nsplice > 999);
+@pdiv = (0, int($ns2/$nsplice));
+my $nrem = $ns2 % $nsplice;
+for (my $i = 1; $i < $nsplice; $i++) {
my $nv = $pdiv[$i] + $pdiv[1];
++$nv if ( $nrem-- > 0 );
push @pdiv, $nv;
@@ -207,27 +229,44 @@ print "\t\n";
print "\t\tTensorTree$tensortree\n";
print "\t\n";
# Fork parallel rtcontrib processes to compute each side
+my $npleft = $nproc;
if ( $doback ) {
- for (my $proc = 0; $proc < $nproc; $proc++) {
- bg_tree_rtcontrib(0, $proc);
+ for (my $splice = 0; $splice < $nsplice; $splice++) {
+ if (! $npleft ) {
+ wait();
+ die "rtcontrib process reported error" if ( $? );
+ $npleft++;
+ }
+ bg_tree_rtcontrib(0, $splice);
+ $npleft--;
}
while (wait() >= 0) {
die "rtcontrib process reported error" if ( $? );
+ $npleft++;
}
+ persist_end();
ttree_out(0);
}
if ( $doforw ) {
- for (my $proc = 0; $proc < $nproc; $proc++) {
- bg_tree_rtcontrib(1, $proc);
+ for (my $splice = 0; $splice < $nsplice; $splice++) {
+ if (! $npleft ) {
+ wait();
+ die "rtcontrib process reported error" if ( $? );
+ $npleft++;
+ }
+ bg_tree_rtcontrib(1, $splice);
+ $npleft--;
}
while (wait() >= 0) {
die "rtcontrib process reported error" if ( $? );
+ $npleft++;
}
+ persist_end();
ttree_out(1);
}
} # end of sub do_tree_bsdf()
-# Run i'th rtcontrib process for generating tensor tree samples
+# Run rtcontrib process in background to generate tensor tree samples
sub bg_tree_rtcontrib {
my $pid = fork();
die "Cannot fork new process" unless defined $pid;
@@ -299,7 +338,7 @@ print
system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } .
"$td/" . ($bmodnm,$fmodnm)[$forw] . "_???.flt " .
- "| rttree_reduce -h -ff -r $tensortree -g $ttlog2";
+ "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2";
die "Failure running rttree_reduce" if ( $? );
print
'
@@ -317,14 +356,15 @@ print
';
print "\t\t\tReflection $side\n";
-print ' LBNL/Shirley-Chiu
+print
+' LBNL/Shirley-Chiu
BRDF
';
system "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " .
q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' -of } .
"$td/" . ($fmodnm,$bmodnm)[$forw] . "_???.flt " .
- "| rttree_reduce -h -ff -r $tensortree -g $ttlog2";
+ "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2";
die "Failure running rttree_reduce" if ( $? );
print
'
@@ -397,7 +437,8 @@ my $rtcmd = "rtcontrib $rtargs -h -ff -fo -n $nproc -c
"-o '$td/%s.flt' -m $fmodnm -m $bmodnm $octree";
my $rccmd = "rcalc -e '$tcal' " .
"-e 'mod(n,d):n-floor(n/d)*d' -e 'Kbin=mod(recno-.999,$ndiv)' " .
- q{-if3 -e '$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega'};
+ q{-if3 -e 'oval=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' } .
+ q[-o '${ oval },'];
if ( $doforw ) {
$cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " .
"-e 'xp=(\$3+rand(.12*recno+288))*(($dim[1]-$dim[0])/$nx)+$dim[0]' " .
@@ -544,10 +585,10 @@ print
BRDF
';
-# Output front reflection (transposed order)
+# Output front reflection (reciprocity averaging)
for (my $od = 0; $od < $ndiv; $od++) {
for (my $id = 0; $id < $ndiv; $id++) {
- print $rfarr[$ndiv*$id + $od];
+ print .5*($rfarr[$ndiv*$id + $od] + $rfarr[$ndiv*$od + $id]);
}
print "\n";
}
@@ -594,10 +635,10 @@ print
BRDF
';
-# Output back reflection (transposed order)
+# Output back reflection (reciprocity averaging)
for (my $od = 0; $od < $ndiv; $od++) {
for (my $id = 0; $id < $ndiv; $id++) {
- print $rbarr[$ndiv*$id + $od];
+ print .5*($rbarr[$ndiv*$id + $od] + $rbarr[$ndiv*$od + $id]);
}
print "\n";
}