ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/objpict.pl
Revision: 2.1
Committed: Wed Dec 4 20:07:07 2013 UTC (10 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad4R2P2, rad5R0, rad5R1, rad4R2, rad4R2P1, rad5R3, HEAD
Log Message:
Replaced objview and objpict with Perl scripts written by Axel Jacobs

File Contents

# User Rev Content
1 greg 2.1 #!/usr/bin/perl
2     # RCSid $Id$
3     #
4     # Make a nice multi-view picture of an object
5     # Command line arguments contain materials and object files
6     #
7     # This is a re-write of Greg's objpict.csh and should be a drop-in
8     # replacement, with no funcionality added or removed
9    
10     use strict;
11     use warnings;
12    
13     use File::Temp qw/ tempdir /;
14     my $td = tempdir( CLEANUP => 1 );
15    
16     my $xres = 1024;
17     my $yres = 1024;
18     my $rpict_cmd = "rpict -av .2 .2 .2 -x $xres -y $yres";
19    
20     my $testroom = "$td/testroom.rad";
21     my $octree = "$td/op.oct";
22    
23     # We need at least one Radiance file or a scene on STDIN (but not both)
24     if ($#ARGV < 0) {
25     open(FH, ">$td/stdin.rad") or
26     die("objview: Can't write to temporary file $td/stdin.rad\n");
27     while (<>) {
28     print FH;
29     }
30     # Pretend stdin.rad was passed as argument.
31     @ARGV = ("$td/stdin.rad");
32     }
33    
34     # Create some lights and a box as back drop.
35     # The objects and view points will be inside the box.
36     open(FH, ">$testroom") or
37     die("Can\'t write to temporary file $testroom");
38     print FH <<EndOfTestroom;
39     void plastic wall_mat 0 0 5 .681 .543 .686 0 .2
40     void light bright 0 0 3 3000 3000 3000
41    
42     bright sphere lamp0 0 0 4 4 4 -4 .1
43     bright sphere lamp1 0 0 4 4 0 4 .1
44     bright sphere lamp2 0 0 4 0 4 4 .1
45    
46     wall_mat polygon box.1540 0 0 12 5 -5 -5 5 -5 5 -5 -5 5 -5 -5 -5
47     wall_mat polygon box.4620 0 0 12 -5 -5 5 -5 5 5 -5 5 -5 -5 -5 -5
48     wall_mat polygon box.2310 0 0 12 -5 5 -5 5 5 -5 5 -5 -5 -5 -5 -5
49     wall_mat polygon box.3267 0 0 12 5 5 -5 -5 5 -5 -5 5 5 5 5 5
50     wall_mat polygon box.5137 0 0 12 5 -5 5 5 -5 -5 5 5 -5 5 5 5
51     wall_mat polygon box.6457 0 0 12 -5 5 5 -5 -5 5 5 -5 5 5 5 5
52     EndOfTestroom
53     close(FH);
54    
55     my $dimstr = `getbbox -h @ARGV`;
56     chomp $dimstr;
57     # Values returned by getbbox are indented and delimited with multiple spaces.
58     $dimstr =~ s/^\s+//; # remove leading spaces
59     my @dims = split(/\s+/, $dimstr); # convert to array
60    
61     # Find largest axes-aligned dimension
62     my @diffs = ($dims[1]-$dims[0], $dims[3]-$dims[2], $dims[5]-$dims[4]);
63     @diffs = reverse sort { $a <=> $b } @diffs;
64     my $size = $diffs[0];
65    
66     # Define the four views
67     my $vw1 = "-vtl -vp 2 .5 .5 -vd -1 0 0 -vh 1 -vv 1";
68     my $vw2 = "-vtl -vp .5 2 .5 -vd 0 -1 0 -vh 1 -vv 1";
69     my $vw3 = "-vtl -vp .5 .5 2 -vd 0 0 -1 -vu -1 0 0 -vh 1 -vv 1";
70     my $vw4 = "-vp 3 3 3 -vd -1 -1 -1 -vh 20 -vv 20";
71    
72     # Move objects so centre is at origin
73     my $xtrans = -1.0 * ($dims[0] + $dims[1]) / 2;
74     my $ytrans = -1.0 * ($dims[2] + $dims[3]) / 2;
75     my $ztrans = -1.0 * ($dims[4] + $dims[5]) / 2;
76     # Scale so that largest object dimension is unity
77     my $scale = 1 / $size;
78    
79     my $cmd = "xform -t $xtrans $ytrans $ztrans -s $scale -t .5 .5 .5 @ARGV";
80     $cmd .= " |oconv $testroom - > $octree";
81     system "$cmd";
82    
83     # Render four different views of the objects
84     system "$rpict_cmd $vw1 $octree > $td/right.hdr";
85     system "$rpict_cmd $vw2 $octree > $td/front.hdr";
86     system "$rpict_cmd $vw3 $octree > $td/down.hdr";
87     system "$rpict_cmd $vw4 $octree > $td/oblique.hdr";
88    
89     # Compose the four views into one image
90     $cmd = "pcompos $td/down.hdr 0 $xres $td/oblique.hdr $xres $yres";
91     $cmd .= " $td/right.hdr 0 0 $td/front.hdr $xres 0";
92     $cmd .= " |pfilt -1 -r .6 -x /2 -y /2";
93     exec "$cmd";
94    
95     #EOF