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, 9 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

# Content
1 #!/usr/bin/perl -w
2 # RCSid $Id: rtpict.pl,v 2.7 2019/07/05 00:20:57 greg Exp $
3 #
4 # Run rtrace in parallel mode to simulate rpict -n option
5 # May also be used to render layered images with -o* option
6 #
7 # G. Ward
8 #
9 use strict;
10 # we'll run rpict if no -n or -o* option
11 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 my $irrad = 0;
21 # view options and the associated number of arguments
22 my %vwraysC = ("-vf",1, "-vtv",0, "-vtl",0, "-vth",0, "-vta",0, "-vts",0, "-vtc",0,
23 "-x",1, "-y",1, "-vp",3, "-vd",3, "-vu",3, "-vh",1, "-vv",1,
24 "-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 # Starting options for rtrace (rpict values)
28 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 my @vwraysA = ("vwrays", "-ff", "-pj", ".67");
31 my @vwrightA = ("vwright", "-vtv");
32 my @rpictA = ("rpict");
33 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 my $outpic;
60 my $outzbf;
61 OPTION: # sort through options
62 while ($#ARGV >= 0 && "$ARGV[0]" =~ /^[-\@]/) {
63 # Check for file inclusion
64 if ("$ARGV[0]" =~ /^\@/) {
65 open my $handle, '<', substr($ARGV[0], 1);
66 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 if ("$ARGV[0]" =~ ('^' . $boopt . '[-+01tfynTFYN]?$')) {
75 push @rtraceA, $ARGV[0];
76 push @rpictA, shift(@ARGV);
77 if ("$ARGV[0]" eq "-i") {
78 $irrad = ! $irrad;
79 } elsif ("$ARGV[0]" =~ /^-i[-+01tfynTFYN]/) {
80 $irrad = ("$ARGV[0]" =~ /^-i[+1tyTY]/);
81 }
82 next OPTION;
83 }
84 }
85 # Check view options
86 if (defined $vwraysC{$ARGV[0]}) {
87 push @vwraysA, $ARGV[0];
88 my $isvopt = ("$ARGV[0]" =~ /^-v/);
89 push(@vwrightA, $ARGV[0]) if ($isvopt);
90 push @rpictA, shift(@ARGV);
91 for (my $i = $vwraysC{$rpictA[-1]}; $i-- > 0; ) {
92 push @vwraysA, $ARGV[0];
93 push(@vwrightA, $ARGV[0]) if ($isvopt);
94 push @rpictA, shift(@ARGV);
95 }
96 next OPTION;
97 }
98 # Check rtrace options
99 if (defined $rtraceC{$ARGV[0]}) {
100 push @rtraceA, $ARGV[0];
101 push @rpictA, shift(@ARGV);
102 for (my $i = $rtraceC{$rpictA[-1]}; $i-- > 0; ) {
103 push @rtraceA, $ARGV[0];
104 push @rpictA, shift(@ARGV);
105 }
106 next OPTION;
107 }
108 # 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 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 } elsif ("$ARGV[0]" eq "-z") {
121 push @rpictA, shift(@ARGV);
122 $outzbf = $ARGV[0];
123 push @rpictA, shift(@ARGV);
124 } elsif ("$ARGV[0]" eq "-n") {
125 shift @ARGV;
126 $nprocs = shift(@ARGV);
127 } 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 } else {
135 die "Unsupported option: " . $ARGV[0] . "\n";
136 }
137 }
138 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 die "Number of processes must be positive" if ($nprocs <= 0);
145 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 if (defined $outpic) { # redirect output?
150 die "File '$outpic' already exists\n" if (-e $outpic);
151 open STDOUT, '>', "$outpic";
152 }
153 # may as well run rpict?
154 if ($nprocs == 1 && !defined($outdir)) {
155 push(@rpictA, $ARGV[0]) if ($#ARGV == 0);
156 exec @rpictA ;
157 }
158 push @rtraceA, ("-n", "$nprocs");
159 die "Need single octree argument\n" if ($#ARGV != 0);
160 my $oct = $ARGV[0];
161 my $view = `@vwrightA 0`;
162 my @res = split(/\s/, `@vwraysA -d`);
163 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 if (defined $outzbf) { # generating depth buffer?
204 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 }
210 # no depth buffer, simplest case
211 exec "@vwraysA | @rtraceA -ffc @res $oct | getinfo -a 'VIEW=$view'";