ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rtpict.pl
(Generate patch)

Comparing ray/src/util/rtpict.pl (file contents):
Revision 2.1 by greg, Mon Mar 19 23:40:33 2018 UTC vs.
Revision 2.8 by greg, Tue Jul 23 01:03:30 2019 UTC

# Line 2 | Line 2
2   # RCSid $Id$
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 call rpict if this is not overridden
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,
# Line 16 | Line 17 | my %rtraceC = ("-dt",1, "-dc",1, "-dj",1, "-ds",1, "-d
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 = ("-vtv",0, "-vtl",0, "-vth",0, "-vta",0, "-vts",0, "-vtc",0,
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);
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 -ffc -u- -dt .05 -dc .5 -ds .25 -dr 1 -aa .2 -ar 64 -ad 512 -as 128 -lr 7 -lw 1e-03");
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);
65 >                open my $handle, '<', substr($ARGV[0], 1);
66                  shift @ARGV;
67                  chomp(my @args = <$handle>);
68                  close $handle;
# Line 39 | Line 71 | while ($#ARGV >= 0 && "$ARGV[0]" =~ /^[-\@]/) {
71          }
72          # Check booleans
73          for my $boopt (@boolO) {
74 <                if ("$ARGV[0]" =~ /"^" . $boopt . "[-+01tfynTFYN]$"/) {
75 <                        push @rtraceA, "$ARGV[0]";
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]";
87 >                push @vwraysA, $ARGV[0];
88                  my $isvopt = ("$ARGV[0]" =~ /^-v/);
89 <                push(@vwrightA, "$ARGV[0]") if ($isvopt);
89 >                push(@vwrightA, $ARGV[0]) if ($isvopt);
90                  push @rpictA, shift(@ARGV);
91 <                for (my $i = $vwraysC{$vwraysA[-1]}; $i-- > 0; ) {
92 <                        push @vwraysA, "$ARGV[0]";
93 <                        push(@vwrightA, "$ARGV[0]") if ($isvopt);
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]";
100 >                push @rtraceA, $ARGV[0];
101                  push @rpictA, shift(@ARGV);
102 <                for (my $i = $rtraceC{$rtraceA[-1]}; $i-- > 0; ) {
103 <                        push @rtraceA, "$ARGV[0]";
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 for pixel sampling option
109 <        if ("$ARGV[0]" eq "-ps") {
110 <                shift @ARGV;
111 <                die "We only support -ps 1\n" if (shift(@ARGV) > 1);
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";
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 ($outpic) {                  # redirect output?
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 < if ($nprocs == 1) {             # may as well run rpict?
154 <        push(@rpictA, "$ARGV[0]") if ($#ARGV == 0);
153 >                                # may as well run rpict?
154 > if ($nprocs == 1 && !defined($outdir)) {
155 >        push(@rpictA, $ARGV[0]) if ($#ARGV == 0);
156          exec @rpictA ;
157   }
96 die "Need single octree argument\n" if ($#ARGV != 0);
97 push @rtraceA, (`@vwraysA -d`);
98 chomp $rtraceA[-1];
158   push @rtraceA, ("-n", "$nprocs");
159 < push @rtraceA, "$ARGV[0]";
160 < my @view = (`@vwrightA 0`);
161 < exec "@vwraysA | @rtraceA | getinfo -a 'VIEW=@view'";
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'";

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines