#!/usr/bin/perl # RCSid $Id: objview.pl,v 2.1 2013/12/04 20:07:07 greg Exp $ # # Make a nice view of an object # Arguments are scene input files # # This is a re-write of Greg's original objview.csh. # The only extra functionality is that we accept a scene on STDIN # if no file name is given. # # Axel, Nov 2013 use strict; use warnings; use File::Temp qw/ tempdir /; my $td = tempdir( CLEANUP => 1 ); my $octree = "$td/ov$$.oct"; my $lights = "$td/lt$$.rad"; my $rif = "$td/ov$$.rif"; my $ambf = "$td/af$$.amb"; my $raddev = "x11"; # default output device. Overwrite with -o my $up = "Z"; my $vw = "XYZ"; my $opts = ""; # Options common to rad and glrad my $rendopts = ""; # For render= line in rif file my $usegl = 0; # Run glrad instead of rad (Boolean). my $radopt = 0; # An option specific to rad was passed (Boolean). my $glradopt = 0; # An option specific to glrad was passed (Boolean). while (@ARGV) { $_ = $ARGV[0]; if (m/-g/) { # OpenGL output if ( $^O =~ /MSWin32/ ) { die("OpenGL view is not available under Windows.\n"); } $usegl = 1; } elsif (m/-u/) { # up direction $up = $ARGV[1]; shift @ARGV; } elsif ((m/-s/) or (m/-w/)) { # silent, no warnings $opts .= " $_"; } elsif (m/-b/) { # back face visibility $rendopts .= ' -bv'; } elsif (m/-v/) { # standard view "[Xx]?[Yy]?[Zz]?[vlcahs]?" # Let rad do any error handling... $vw = $ARGV[1]; shift @ARGV; } elsif (m/-N/) { # No. of parallel processes $opts .= ' -N ' . $ARGV[1]; $radopt = 1; shift @ARGV; } elsif (m/-o/) { # output device (rvu -devices) $raddev = $ARGV[1]; $radopt = 1; shift @ARGV; } elsif ((m/-V/) or (m/-e/)) { # print view, explicate variables # Think of those two as '-verbose'. $opts .= " $_"; $radopt = 1; } elsif (m/-S/) { # full-screen stereo $opts .= " $_"; $glradopt = 1; } elsif (m/^-\w/) { die("objview: Bad option: $_\n"); } else { last; } shift @ARGV; } # We need at least one Radiance file or a scene on STDIN if ($#ARGV < 0) { open(FH, ">$td/stdin.rad") or die("objview: Can't write to temporary file $td/stdin.rad\n"); while (<>) { print FH; } # Pretend stdin.rad was passed as argument. @ARGV = ("$td/stdin.rad"); } # Make sure we don't confuse glrad and rad options. if ($usegl) { if ($radopt) { die("objview: glrad output requested, but rad option passed.\n"); } } else { if ($glradopt) { die("objview: rad output requested, but glrad option passed.\n"); } } open(FH, ">$lights") or die("objview: Can't write to temporary file $lights\n"); print FH <$rif") or die("objview: Can't write to temporary file $rif\n"); print FH <