--- ray/src/util/genBSDF.pl 2011/10/27 16:35:54 2.27 +++ ray/src/util/genBSDF.pl 2013/04/23 23:19:09 2.41 @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# RCSid $Id: genBSDF.pl,v 2.27 2011/10/27 16:35:54 greg Exp $ +# RCSid $Id: genBSDF.pl,v 2.41 2013/04/23 23:19:09 greg Exp $ # # Compute BSDF based on geometry and material description # @@ -8,7 +8,7 @@ use strict; use File::Temp qw/ :mktemp /; sub userror { - print STDERR "Usage: genBSDF [-n Nproc][-c Nsamp][-t{3|4} Nlog2][-r \"ropts\"][-dim xmin xmax ymin ymax zmin zmax][{+|-}f][{+|-}b][{+|-}mgf][{+|-}geom] [input ..]\n"; + print STDERR "Usage: genBSDF [-n Nproc][-c Nsamp][-t{3|4} Nlog2][-r \"ropts\"][-dim xmin xmax ymin ymax zmin zmax][{+|-}f][{+|-}b][{+|-}mgf][{+|-}geom units] [input ..]\n"; exit 1; } my $td = mkdtemp("/tmp/genBSDF.XXXXXX"); @@ -23,8 +23,8 @@ my $geout = 1; my $nproc = 1; my $doforw = 0; my $doback = 1; -my $pctcull = 95; -my $gunit = "Meter"; +my $pctcull = 90; +my $gunit = "meter"; my @dim; # Get options while ($#ARGV >= 0) { @@ -45,6 +45,7 @@ while ($#ARGV >= 0) { } elsif ("$ARGV[0]" =~ /^[-+]b/) { $doback = ("$ARGV[0]" =~ /^\+/); } elsif ("$ARGV[0]" eq "-t") { + # Use value < 0 for rttree_reduce bypass $pctcull = $ARGV[1]; shift @ARGV; } elsif ("$ARGV[0]" =~ /^-t[34]$/) { @@ -70,12 +71,6 @@ while ($#ARGV >= 0) { } # Check that we're actually being asked to do something die "Must have at least one of +forward or +backward\n" if (!$doforw && !$doback); -# Name our own persist file? -my $persistfile; -if ( $tensortree && $nproc > 1 && "$rtargs" !~ /-PP /) { - $persistfile = "$td/pfile.txt"; - $rtargs = "-PP $persistfile $rtargs"; -} # Get scene description and dimensions my $radscn = "$td/device.rad"; my $mgfscn = "$td/device.mgf"; @@ -113,6 +108,7 @@ print print "\n"; print 'System +BSDF @@ -122,18 +118,20 @@ print 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"; +print "\t\tOther\n"; +print " \n"; # Output MGF description if requested if ( $geout ) { - print "\t\t\n"; + print "\t\n"; + print "\n"; printf "xf -t %.6f %.6f 0\n", -($dim[0]+$dim[1])/2, -($dim[2]+$dim[3])/2; open(MGFSCN, "< $mgfscn"); while () { print $_; } close MGFSCN; print "xf\n"; - print "\t\t\n"; + print "\t\t\n"; + print "\t\n"; } -print " \n"; # Set up surface sampling my $nx = int(sqrt($nsamp*($dim[1]-$dim[0])/($dim[3]-$dim[2])) + .5); my $ny = int($nsamp/$nx + .5); @@ -157,35 +155,8 @@ 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 ); -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; -} -die "Script error 1" if ($pdiv[-1] != $ns2); # Shirley-Chiu mapping from unit square to disk $sq2disk = ' in_square_a = 2*in_square_x - 1; @@ -228,66 +199,30 @@ out_square_y = (out_square_b + 1)/2; 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 $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 $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); -} + +# Start rcontrib processes for compute each side +do_tree_rtcontrib(0) if ( $doback ); +do_tree_rtcontrib(1) if ( $doforw ); + } # end of sub do_tree_bsdf() -# 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; - if ($pid > 0) { return $pid; } +# Run rcontrib process to generate tensor tree samples +sub do_tree_rtcontrib { my $forw = shift; - my $pn = shift; - my $pbeg = $pdiv[$pn]; - my $plen = $pdiv[$pn+1] - $pbeg; my $matargs = "-m $bmodnm"; - if ( !$forw || !$doback ) { $matargs .= " -m $fmodnm"; } - my $cmd = "rtcontrib $rtargs -h -ff -fo -c $nsamp " . + if ( !$forw || !$doback || $tensortree==3 ) { $matargs .= " -m $fmodnm"; } + my $cmd = "rcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . "-e '$disk2sq' -bn '$ns*$ns' " . "-b '$ns*floor(out_square_x*$ns)+floor(out_square_y*$ns)' " . - "-o $td/%s_" . sprintf("%03d", $pn) . ".flt $matargs $octree"; + "-o $td/%s.flt $matargs $octree"; if ( $tensortree == 3 ) { # Isotropic BSDF - $cmd = "cnt $plen $ny $nx " . - "| rcalc -e 'r1=rand(($pn+.8681)*recno-.673892)' " . - "-e 'r2=rand(($pn-5.37138)*recno+67.1737811)' " . - "-e 'r3=rand(($pn+3.17603772)*recno+83.766771)' " . - "-e 'Dx=1-2*($pbeg+\$1+r1)/$ns;Dy:0;Dz=sqrt(1-Dx*Dx)' " . + my $ns2 = $ns / 2; + $cmd = "cnt $ns2 $ny $nx " . + "| rcalc -e 'r1=rand(.8681*recno-.673892)' " . + "-e 'r2=rand(-5.37138*recno+67.1737811)' " . + "-e 'r3=rand(+3.17603772*recno+83.766771)' " . + "-e 'Dx=1-2*(\$1+r1)/$ns;Dy:0;Dz=sqrt(1-Dx*Dx)' " . "-e 'xp=(\$3+r2)*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . "-e 'yp=(\$2+r3)*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . "-e 'zp=$dim[5-$forw]' -e 'myDz=Dz*($forw*2-1)' " . @@ -298,12 +233,12 @@ sub bg_tree_rtcontrib { # Anisotropic BSDF # Sample area vertically to improve load balance, since # shading systems usually have bilateral symmetry (L-R) - $cmd = "cnt $plen $ns $ny $nx " . - "| rcalc -e 'r1=rand(($pn+.8681)*recno-.673892)' " . - "-e 'r2=rand(($pn-5.37138)*recno+67.1737811)' " . - "-e 'r3=rand(($pn+3.17603772)*recno+83.766771)' " . - "-e 'r4=rand(($pn-2.3857833)*recno-964.72738)' " . - "-e 'in_square_x=($pbeg+\$1+r1)/$ns' " . + $cmd = "cnt $ns $ns $ny $nx " . + "| rcalc -e 'r1=rand(.8681*recno-.673892)' " . + "-e 'r2=rand(-5.37138*recno+67.1737811)' " . + "-e 'r3=rand(3.17603772*recno+83.766771)' " . + "-e 'r4=rand(-2.3857833*recno-964.72738)' " . + "-e 'in_square_x=(\$1+r1)/$ns' " . "-e 'in_square_y=(\$2+r2)/$ns' -e '$sq2disk' " . "-e 'xp=(\$4+r3)*(($dim[1]-$dim[0])/$nx)+$dim[0]' " . "-e 'yp=(\$3+r4)*(($dim[3]-$dim[2])/$ny)+$dim[2]' " . @@ -313,16 +248,17 @@ sub bg_tree_rtcontrib { "| $cmd"; } # print STDERR "Starting: $cmd\n"; - exec($cmd); # no return; status report to parent via wait - die "Cannot exec: $cmd\n"; -} # end of bg_tree_rtcontrib() + system "$cmd" || die "Failure running rcontrib"; + ttree_out($forw); +} # end of do_tree_rtcontrib() # Simplify and output tensor tree results sub ttree_out { my $forw = shift; my $side = ("Back","Front")[$forw]; -# Only output one transmitted distribution, preferring backwards -if ( !$forw || !$doback ) { + my $cmd; +# Only output one transmitted anisotropic distribution, preferring backwards +if ( !$forw || !$doback || $tensortree==3 ) { print ' System @@ -330,16 +266,28 @@ print CIE Illuminant D65 1nm.ssp ASTM E308 1931 Y.dsp - Transmission - LBNL/Shirley-Chiu +'; +print "\t\t\tTransmission $side\n"; +print +' LBNL/Shirley-Chiu BTDF '; -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 -t $pctcull -r $tensortree -g $ttlog2"; -die "Failure running rttree_reduce" if ( $? ); +$cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . + q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; +if ($pctcull >= 0) { + $cmd .= "-of $td/" . ($bmodnm,$fmodnm)[$forw] . ".flt " . + "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2"; + system "$cmd" || die "Failure running rttree_reduce"; +} else { + $cmd .= "$td/" . ($bmodnm,$fmodnm)[$forw] . ".flt"; + print "{\n"; + system "$cmd" || die "Failure running rcalc"; + for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) { + print "0\n"; + } + print "}\n"; +} print ' @@ -358,14 +306,24 @@ print print "\t\t\tReflection $side\n"; print ' LBNL/Shirley-Chiu - BRDF + BTDF '; -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 -t $pctcull -r $tensortree -g $ttlog2"; -die "Failure running rttree_reduce" if ( $? ); +$cmd = "rcalc -if3 -e 'Omega:PI/($ns*$ns)' " . + q{-e '$1=(0.265*$1+0.670*$2+0.065*$3)/Omega' }; +if ($pctcull >= 0) { + $cmd .= "-of $td/" . ($fmodnm,$bmodnm)[$forw] . ".flt " . + "| rttree_reduce -a -h -ff -t $pctcull -r $tensortree -g $ttlog2"; + system "$cmd" || die "Failure running rttree_reduce"; +} else { + $cmd .= "$td/" . ($fmodnm,$bmodnm)[$forw] . ".flt"; + print "{\n"; + system "$cmd" || die "Failure running rcalc"; + for (my $i = ($tensortree==3)*$ns*$ns*$ns/2; $i-- > 0; ) { + print "0\n"; + } + print "}\n"; +} print ' @@ -382,7 +340,7 @@ sub do_matrix_bsdf { $tcal = ' DEGREE : PI/180; sq(x) : x*x; -Kpola(r) : select(r+1, -5, 5, 15, 25, 35, 45, 55, 65, 75, 90); +Kpola(r) : select(r+1, 0, 5, 15, 25, 35, 45, 55, 65, 75, 90); Knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); Kaccum(r) : if(r-.5, Knaz(r) + Kaccum(r-1), 0); Kmax : Kaccum(Knaz(0)); @@ -403,9 +361,9 @@ KprojOmega = PI * if(Kbin-.5, $kcal = ' DEGREE : PI/180; abs(x) : if(x, x, -x); -Acos(x) : 1/DEGREE * if(x-1, 0, if(-1-x, 0, acos(x))); +Acos(x) : if(x-1, 0, if(-1-x, PI, acos(x))) / DEGREE; posangle(a) : if(-a, a + 2*PI, a); -Atan2(y,x) : 1/DEGREE * posangle(atan2(y,x)); +Atan2(y,x) : posangle(atan2(y,x)) / DEGREE; kpola(r) : select(r, 5, 15, 25, 35, 45, 55, 65, 75, 90); knaz(r) : select(r, 1, 8, 16, 20, 24, 24, 24, 16, 12); kaccum(r) : if(r-.5, knaz(r) + kaccum(r-1), 0); @@ -426,19 +384,18 @@ kbin2(pol,azi) = select(kfindrow(1, pol), kbin = kbin2(Acos(abs(Dz)),Atan2(Dy,Dx)); '; my $ndiv = 145; -# Compute scattering data using rtcontrib +# Compute scattering data using rcontrib my @tfarr; my @rfarr; my @tbarr; my @rbarr; my $cmd; -my $rtcmd = "rtcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . +my $rtcmd = "rcontrib $rtargs -h -ff -fo -n $nproc -c $nsamp " . "-e '$kcal' -b kbin -bn $ndiv " . "-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 'oval=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' } . - q[-o '${ oval },']; + q{-if3 -e '$1=(0.265*$1+0.670*$2+0.065*$3)/KprojOmega' }; 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]' " . @@ -450,8 +407,10 @@ $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . system "$cmd" || die "Failure running: $cmd\n"; @tfarr = `$rccmd $td/$fmodnm.flt`; die "Failure running: $rccmd $td/$fmodnm.flt\n" if ( $? ); +chomp(@tfarr); @rfarr = `$rccmd $td/$bmodnm.flt`; die "Failure running: $rccmd $td/$bmodnm.flt\n" if ( $? ); +chomp(@rfarr); } if ( $doback ) { $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . @@ -464,8 +423,10 @@ $cmd = "cnt $ndiv $ny $nx | rcalc -of -e '$tcal' " . system "$cmd" || die "Failure running: $cmd\n"; @tbarr = `$rccmd $td/$bmodnm.flt`; die "Failure running: $rccmd $td/$bmodnm.flt\n" if ( $? ); +chomp(@tbarr); @rbarr = `$rccmd $td/$fmodnm.flt`; die "Failure running: $rccmd $td/$fmodnm.flt\n" if ( $? ); +chomp(@rbarr); } # Output angle basis print @@ -474,77 +435,77 @@ print LBNL/Klems Full - 0 - 1 - - 0 - 5 - - - - 10 - 8 - - 5 - 15 - - - - 20 - 16 - - 15 - 25 - - - - 30 - 20 - - 25 - 35 - - - - 40 - 24 - - 35 - 45 - - - - 50 - 24 - - 45 - 55 - - - - 60 - 24 - - 55 - 65 - - - - 70 - 16 - - 65 - 75 - - - - 82.5 - 12 - - 75 - 90 - + 0 + 1 + + 0 + 5 + + + 10 + 8 + + 5 + 15 + + + + 20 + 16 + + 15 + 25 + + + + 30 + 20 + + 25 + 35 + + + + 40 + 24 + + 35 + 45 + + + + 50 + 24 + + 45 + 55 + + + + 60 + 24 + + 55 + 65 + + + + 70 + 16 + + 65 + 75 + + + + 82.5 + 12 + + 75 + 90 + + '; @@ -565,7 +526,7 @@ print # Output front transmission (transposed order) for (my $od = 0; $od < $ndiv; $od++) { for (my $id = 0; $id < $ndiv; $id++) { - print $tfarr[$ndiv*$id + $od]; + print $tfarr[$ndiv*$id + $od], ",\n"; } print "\n"; } @@ -582,13 +543,13 @@ print Reflection Front LBNL/Klems Full LBNL/Klems Full - BRDF + BTDF '; # Output front reflection (transposed order) for (my $od = 0; $od < $ndiv; $od++) { for (my $id = 0; $id < $ndiv; $id++) { - print $rfarr[$ndiv*$id + $od]; + print $rfarr[$ndiv*$id + $od], ",\n"; } print "\n"; } @@ -615,7 +576,7 @@ print # Output back transmission (transposed order) for (my $od = 0; $od < $ndiv; $od++) { for (my $id = 0; $id < $ndiv; $id++) { - print $tbarr[$ndiv*$id + $od]; + print $tbarr[$ndiv*$id + $od], ",\n"; } print "\n"; } @@ -632,13 +593,13 @@ print Reflection Back LBNL/Klems Full LBNL/Klems Full - BRDF + BTDF '; # Output back reflection (transposed order) for (my $od = 0; $od < $ndiv; $od++) { for (my $id = 0; $id < $ndiv; $id++) { - print $rbarr[$ndiv*$id + $od]; + print $rbarr[$ndiv*$id + $od], ",\n"; } print "\n"; }