ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rtpict.pl
Revision: 2.8
Committed: Tue Jul 23 01:03:30 2019 UTC (4 years, 8 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +95 -4 lines
Log Message:
Add -o* option (and -d) to support layered image folders

File Contents

# User Rev Content
1 greg 2.1 #!/usr/bin/perl -w
2 greg 2.8 # RCSid $Id: rtpict.pl,v 2.7 2019/07/05 00:20:57 greg Exp $
3 greg 2.1 #
4     # Run rtrace in parallel mode to simulate rpict -n option
5 greg 2.8 # May also be used to render layered images with -o* option
6 greg 2.1 #
7     # G. Ward
8     #
9     use strict;
10 greg 2.8 # we'll run rpict if no -n or -o* option
11 greg 2.1 my $nprocs = 1;
12     # rtrace options and the associated number of arguments
13     my %rtraceC = ("-dt",1, "-dc",1, "-dj",1, "-ds",1, "-dr",1, "-dp",1,
14     "-ss",1, "-st",1, "-e",1, "-am",1,
15     "-ab",1, "-af",1, "-ai",1, "-aI",1, "-ae",1, "-aE",1,
16     "-av",3, "-aw",1, "-aa",1, "-ar",1, "-ad",1, "-as",1,
17     "-me",3, "-ma",3, "-mg",1, "-ms",1, "-lr",1, "-lw",1);
18     # boolean rtrace options
19     my @boolO = ("-w", "-bv", "-dv", "-i", "-u");
20 greg 2.8 my $irrad = 0;
21 greg 2.1 # view options and the associated number of arguments
22 greg 2.2 my %vwraysC = ("-vf",1, "-vtv",0, "-vtl",0, "-vth",0, "-vta",0, "-vts",0, "-vtc",0,
23 greg 2.1 "-x",1, "-y",1, "-vp",3, "-vd",3, "-vu",3, "-vh",1, "-vv",1,
24 greg 2.2 "-vo",1, "-va",1, "-vs",1, "-vl",1, "-pa",1, "-pj",1, "-pd",1);
25     # options we need to silently ignore
26     my %ignoreC = ("-t",1, "-ps",1, "-pt",1, "-pm",1);
27 greg 2.1 # Starting options for rtrace (rpict values)
28 greg 2.5 my @rtraceA = split(' ', "rtrace -u- -dt .05 -dc .5 -ds .25 -dr 1 " .
29     "-aa .2 -ar 64 -ad 512 -as 128 -lr 7 -lw 1e-03");
30 greg 2.1 my @vwraysA = ("vwrays", "-ff", "-pj", ".67");
31     my @vwrightA = ("vwright", "-vtv");
32     my @rpictA = ("rpict");
33 greg 2.8 my @rsplitA = ("rsplit", "'-t '", "-ih", "-iH", "-oh", "-oH");
34     my $refDepth="";
35     # Supported rtrace -o* options and data type encoders
36     my %rtoutC = (
37     v => "radiance.hdr",
38     r => "mirrored.hdr",
39     x => "unmirrored.hdr",
40     i => "irradiance.hdr",
41     l => "effective.dpt",
42     L => "firstsurface.dpt",
43     R => "mirrored.dpt",
44     X => "unmirrored.dpt",
45     n => "perturbed.nrm",
46     N => "unperturbed.nrm",
47     s => "surface.idx",
48     m => "modifier.idx",
49     M => "material.idx"
50     );
51     my $outpatt = "^-o[vrxlLRXnNsmM]+";
52     # Supported compressed format suffixes and compressors, decompressors
53     my %comprC = (
54     ".tgz", ["tar czf ", "tar xzf "],
55     ".zip", ["zip -q -r ", "unzip -q "]
56     );
57     my $outlyr;
58     my $outdir;
59 greg 2.1 my $outpic;
60 greg 2.5 my $outzbf;
61 greg 2.1 OPTION: # sort through options
62     while ($#ARGV >= 0 && "$ARGV[0]" =~ /^[-\@]/) {
63     # Check for file inclusion
64     if ("$ARGV[0]" =~ /^\@/) {
65 greg 2.2 open my $handle, '<', substr($ARGV[0], 1);
66 greg 2.1 shift @ARGV;
67     chomp(my @args = <$handle>);
68     close $handle;
69     unshift @ARGV, split(/\s+/, "@args");
70     next OPTION;
71     }
72     # Check booleans
73     for my $boopt (@boolO) {
74 greg 2.6 if ("$ARGV[0]" =~ ('^' . $boopt . '[-+01tfynTFYN]?$')) {
75 greg 2.2 push @rtraceA, $ARGV[0];
76 greg 2.1 push @rpictA, shift(@ARGV);
77 greg 2.8 if ("$ARGV[0]" eq "-i") {
78     $irrad = ! $irrad;
79     } elsif ("$ARGV[0]" =~ /^-i[-+01tfynTFYN]/) {
80     $irrad = ("$ARGV[0]" =~ /^-i[+1tyTY]/);
81     }
82 greg 2.1 next OPTION;
83     }
84     }
85     # Check view options
86     if (defined $vwraysC{$ARGV[0]}) {
87 greg 2.2 push @vwraysA, $ARGV[0];
88 greg 2.1 my $isvopt = ("$ARGV[0]" =~ /^-v/);
89 greg 2.2 push(@vwrightA, $ARGV[0]) if ($isvopt);
90 greg 2.1 push @rpictA, shift(@ARGV);
91 greg 2.2 for (my $i = $vwraysC{$rpictA[-1]}; $i-- > 0; ) {
92     push @vwraysA, $ARGV[0];
93     push(@vwrightA, $ARGV[0]) if ($isvopt);
94 greg 2.1 push @rpictA, shift(@ARGV);
95     }
96     next OPTION;
97     }
98     # Check rtrace options
99     if (defined $rtraceC{$ARGV[0]}) {
100 greg 2.2 push @rtraceA, $ARGV[0];
101 greg 2.1 push @rpictA, shift(@ARGV);
102 greg 2.2 for (my $i = $rtraceC{$rpictA[-1]}; $i-- > 0; ) {
103     push @rtraceA, $ARGV[0];
104 greg 2.1 push @rpictA, shift(@ARGV);
105     }
106     next OPTION;
107     }
108 greg 2.2 # Check options to ignore
109     if (defined $ignoreC{$ARGV[0]}) {
110     push @rpictA, shift(@ARGV);
111     for (my $i = $ignoreC{$rpictA[-1]}; $i-- > 0; ) {
112     push @rpictA, shift(@ARGV);
113     }
114 greg 2.1 next OPTION;
115     }
116     # Check for output file or number of processes
117     if ("$ARGV[0]" eq "-o") {
118     shift @ARGV;
119     $outpic = shift(@ARGV);
120 greg 2.5 } elsif ("$ARGV[0]" eq "-z") {
121     push @rpictA, shift(@ARGV);
122     $outzbf = $ARGV[0];
123     push @rpictA, shift(@ARGV);
124 greg 2.1 } elsif ("$ARGV[0]" eq "-n") {
125     shift @ARGV;
126     $nprocs = shift(@ARGV);
127 greg 2.8 } elsif ("$ARGV[0]" eq "-d") {
128     shift @ARGV;
129     $refDepth = " -d " . shift(@ARGV);
130     } elsif ("$ARGV[0]" =~ "$outpatt") {
131     push @rtraceA, $ARGV[0];
132     $outlyr = substr(shift(@ARGV), 2);
133     $outdir = shift(@ARGV);
134 greg 2.1 } else {
135 greg 2.2 die "Unsupported option: " . $ARGV[0] . "\n";
136 greg 2.1 }
137     }
138 greg 2.8 my %rcodeC = (
139     ".hdr", ["-of3", "!pvalue -r -df -u"],
140     ".dpt", ["-of", "!rcode_depth$refDepth -ff"],
141     ".nrm", ["-of3", "!rcode_norm -ff"],
142     ".idx", ["-oa", '!rcode_ident "-t "']
143     );
144 greg 2.1 die "Number of processes must be positive" if ($nprocs <= 0);
145 greg 2.8 if (defined $outdir) { # check conflicting options
146     die "Options -o and -o* are mutually exclusive\n" if (defined $outpic);
147     die "Options -z and -o* are mutually exclusive\n" if (defined $outzbf);
148     }
149 greg 2.4 if (defined $outpic) { # redirect output?
150     die "File '$outpic' already exists\n" if (-e $outpic);
151 greg 2.1 open STDOUT, '>', "$outpic";
152     }
153 greg 2.8 # may as well run rpict?
154     if ($nprocs == 1 && !defined($outdir)) {
155 greg 2.2 push(@rpictA, $ARGV[0]) if ($#ARGV == 0);
156 greg 2.1 exec @rpictA ;
157     }
158 greg 2.5 push @rtraceA, ("-n", "$nprocs");
159 greg 2.1 die "Need single octree argument\n" if ($#ARGV != 0);
160 greg 2.5 my $oct = $ARGV[0];
161     my $view = `@vwrightA 0`;
162     my @res = split(/\s/, `@vwraysA -d`);
163 greg 2.8 if (defined $outdir) { # layered output directory?
164     my $pkg;
165     my ($pkgext) = ($outdir =~ /(\.[^.]+)$/);
166    
167     if ($pkgext) {
168     die "Unknown compressor for '$pkgext'\n" if (!defined $comprC{$pkgext});
169     $pkg = $outdir;
170     die "Output '$pkg' exists as directory!\n" if (-d $pkg);
171     $outdir = substr($pkg, 0, length($pkg)-length($pkgext));
172     if (-e $outdir) {
173     die "Both '$outdir' and '$pkg' exist!\n" if (-e $pkg);
174     } elsif (-e $pkg) {
175     system "$comprC{$pkgext}[1] '$pkg'";
176     die "Cannot decompress '$pkg'\n" if ( $? );
177     }
178     }
179     if (! -d $outdir) {
180     mkdir $outdir or die("Cannot create output directory '$outdir'\n");
181     }
182     # construct rsplit command
183     foreach (0..(length($outlyr) - 1)) {
184     my $oval=substr($outlyr, $_, 1);
185     $oval = "i" if ($oval eq "v" && $irrad);
186     die "Duplicate letter in -o$outlyr\n" if (!defined $rtoutC{$oval});
187     my ($otyp) = ($rtoutC{$oval} =~ /(\.[^.]+)$/);
188     push @rsplitA, $rcodeC{$otyp}[0];
189     push @rsplitA, qq{'$rcodeC{$otyp}[1] > "$outdir/$rtoutC{$oval}"'};
190     delete $rtoutC{$oval};
191     }
192     system "@vwraysA | @rtraceA -fff @res $oct | " .
193     "getinfo -a 'VIEW=$view' | @rsplitA";
194     die "Error running rtrace\n" if ( $? );
195     if (defined $pkg) { # compress folder if requested
196     unlink $pkg;
197     system "$comprC{$pkgext}[0] '$pkg' '$outdir'";
198     die "Cannot compress folder '$outdir'\n" if ( $? );
199     system "rm -r '$outdir'";
200     }
201     exit; # all done with layered output
202     }
203 greg 2.5 if (defined $outzbf) { # generating depth buffer?
204 greg 2.7 exec "@vwraysA | @rtraceA -fff -olv @res $oct | " .
205     "rsplit -ih -iH -f " .
206     "-of $outzbf " .
207     "-oh -oH -of3 '!pvalue -r -df' | " .
208     "getinfo -a 'VIEW=$view'";
209 greg 2.5 }
210 greg 2.8 # no depth buffer, simplest case
211 greg 2.5 exec "@vwraysA | @rtraceA -ffc @res $oct | getinfo -a 'VIEW=$view'";