1 |
#!/usr/bin/perl |
2 |
# RCSid $Id: bsdfview.pl,v 2.7 2018/07/20 00:50:40 greg Exp $ |
3 |
# |
4 |
# Call bsdf2rad to render BSDF and start viewing it. |
5 |
# Arguments are BSDF XML or SIR file(s) |
6 |
# |
7 |
use strict; |
8 |
use warnings; |
9 |
use File::Temp qw/ tempdir /; |
10 |
|
11 |
my $td = tempdir( CLEANUP => 0 ); |
12 |
my $octree = "$td/bv$$.oct"; |
13 |
my $ambf = "$td/af$$.amb"; |
14 |
my $raddev = "x11"; # default output device. Overwrite with -o |
15 |
my $qual = "Med"; |
16 |
my $usetrad = 0; |
17 |
|
18 |
my @range; # BSDF min and max range |
19 |
my $opts = ""; # Options common to rad |
20 |
my $rendopts = "-w-"; # For render= line in rif file |
21 |
|
22 |
while (@ARGV) { |
23 |
$_ = $ARGV[0]; |
24 |
if ((m/^-s\b/) or (m/^-w/)) { # silent, no warnings |
25 |
$opts .= " $_"; |
26 |
} elsif (m/^-v\b/) { # standard view |
27 |
# Let rad do any error handling... |
28 |
$opts .= qq( -v "$ARGV[1]"); |
29 |
shift @ARGV; |
30 |
} elsif (m/^-[nN]\b/) { # No. of parallel processes |
31 |
$opts .= ' -N ' . $ARGV[1]; |
32 |
shift @ARGV; |
33 |
} elsif (m/^-o\b/) { # output device (rvu -devices) |
34 |
$raddev = $ARGV[1]; |
35 |
shift @ARGV; |
36 |
} elsif (m/^-q/) { # quality setting |
37 |
$qual = $ARGV[1]; |
38 |
shift @ARGV; |
39 |
} elsif ((m/^-V\b/) or (m/^-e\b/)) { # print view, explicate variables |
40 |
# Think of those two as '-verbose'. |
41 |
$opts .= " $_"; |
42 |
} elsif (m/^-t\b/) { # start trad instead of rad |
43 |
$usetrad = 1; |
44 |
} elsif (m/^-r/) { # specified range for BSDF |
45 |
@range = ("-r", $ARGV[1], $ARGV[2]); |
46 |
shift @ARGV; shift @ARGV; |
47 |
} elsif (m/^-\w/) { |
48 |
die("bsdfview: Bad option: $_\n"); |
49 |
} else { |
50 |
last; |
51 |
} |
52 |
shift @ARGV; |
53 |
} |
54 |
|
55 |
# We need at least one XML or SIR file |
56 |
if ($#ARGV < 0) { |
57 |
die("bsdfview: missing input XML or SIR file(s)\n"); |
58 |
} |
59 |
|
60 |
if (length($opts) and $usetrad) { |
61 |
die("bsdfview: rad options not supported when calling trad (-t)\n"); |
62 |
} |
63 |
|
64 |
my @objects = @ARGV; |
65 |
|
66 |
# Make this work under Windoze |
67 |
if ( $^O =~ /MSWin32/ ) { |
68 |
for my $i (0 .. $#objects) { |
69 |
# rad doesn't like Windows-style backslashes. |
70 |
$objects[$i] =~ s{\\}{/}g; |
71 |
} |
72 |
$octree =~ s{\\}{/}g; |
73 |
$ambf =~ s{\\}{/}g; |
74 |
$raddev = "qt"; |
75 |
} |
76 |
|
77 |
my $name = $objects[0]; |
78 |
$name =~ s{.*/}{}; # remove leading path |
79 |
$name =~ s{\.[^.]+$}{}; # remove file extension |
80 |
|
81 |
my $rif = "$name.rif"; |
82 |
|
83 |
if (-e $rif) { # RIF already exists? |
84 |
print "Attempting to run with existing rad input file '$rif'\n"; |
85 |
if ($usetrad) { |
86 |
system "trad $rif"; |
87 |
} else { |
88 |
system "rad -o $raddev -w $opts $rif QUA=$qual"; |
89 |
} |
90 |
die("\nTry removing '$rif' and starting again\n\n") if $?; |
91 |
exit; |
92 |
} |
93 |
|
94 |
if ($objects[0] =~ /\.xml$/i) { |
95 |
system "checkBSDF $objects[0]"; |
96 |
die "Bad XML input\n" if ( $? ); |
97 |
} |
98 |
|
99 |
print "bsdfview: creating rad input file '$rif'\n"; |
100 |
|
101 |
my $scene = qq("!bsdf2rad @range @objects"); # let bsdf2rad do complaining |
102 |
|
103 |
my $objects = join(' ', @objects); |
104 |
open(FH, ">$rif") or |
105 |
die("bsdfview: Can't write to temporary file $rif\n"); |
106 |
print FH <<EndOfRif; |
107 |
scene= $scene |
108 |
objects= $objects |
109 |
ZONE= E -35 35 -20 15 -5 15 |
110 |
PICTURE= $name |
111 |
RESOLU= 1024 |
112 |
EXPOSURE= 1 |
113 |
UP= +Z |
114 |
OCTREE= $octree |
115 |
oconv= -w -f |
116 |
AMBF= $ambf |
117 |
QUAL= $qual |
118 |
render= $rendopts |
119 |
view= def -vp 0 -50 50 -vd 0 50 -50 -vh 45 -vv 30 |
120 |
view= fr -vp 15 -30 30 -vd 0 30 -30 |
121 |
view= br -vp -15 -30 30 -vd 0 30 -30 |
122 |
view= ft -vta -vp 15 0 0 -vd 0 0 1 -vu 0 1 0 -vh 200 -vv 200 |
123 |
view= bt -vta -vp -15 0 0 -vd 0 0 1 -vu 0 1 0 -vh 200 -vv 200 |
124 |
view= pr -vtl -vp 0 0 20 -vd 0 0 -1 -vu 0 1 0 -vv 35 -vh 65 |
125 |
view= pt -vtl -vp 0 0 -10 -vd 0 0 1 -vu 0 1 0 -vv 35 -vh 65 |
126 |
EndOfRif |
127 |
close(FH); |
128 |
|
129 |
if ($usetrad) { |
130 |
system "rad -v 0 $rif ; trad $rif"; |
131 |
} else { |
132 |
system "rad -o $raddev $opts $rif"; |
133 |
} |
134 |
#EOF |