| 1 |
greg |
2.1 |
#!/usr/bin/env ruby
|
| 2 |
greg |
2.2 |
# RCSid: $Id: objview.rb,v 2.1 2012/08/07 18:17:17 greg Exp $
|
| 3 |
greg |
2.1 |
#
|
| 4 |
|
|
# objview.rb, v1.1 2012.07.04 RPG
|
| 5 |
|
|
# Ruby port of objview.csh
|
| 6 |
|
|
#
|
| 7 |
|
|
# Make a nice view of an object, or luminaire
|
| 8 |
|
|
# Arguments are scene input files
|
| 9 |
|
|
#
|
| 10 |
|
|
|
| 11 |
|
|
require 'optparse'
|
| 12 |
|
|
require 'ostruct'
|
| 13 |
|
|
require 'tempfile'
|
| 14 |
|
|
|
| 15 |
|
|
class Optparse
|
| 16 |
|
|
#
|
| 17 |
|
|
# Return a structure describing the options.
|
| 18 |
|
|
#
|
| 19 |
|
|
def self.parse(args)
|
| 20 |
|
|
# The options specified on the command line will be collected in *options*.
|
| 21 |
|
|
options = OpenStruct.new
|
| 22 |
|
|
|
| 23 |
|
|
opts = OptionParser.new do |opts|
|
| 24 |
|
|
opts.banner = "Usage: (ruby) objview.rb [options] [radiance scene input files]"
|
| 25 |
|
|
|
| 26 |
|
|
opts.separator ""
|
| 27 |
|
|
opts.separator "Options:"
|
| 28 |
|
|
|
| 29 |
|
|
options.radopt = []
|
| 30 |
|
|
options.glradopt = []
|
| 31 |
|
|
|
| 32 |
|
|
options.up = "Z"
|
| 33 |
|
|
opts.on("-u, --up", String, [:X, :Y, :Z], "View up vector (X, Y, or Z)") do |n|
|
| 34 |
|
|
options.up = n
|
| 35 |
|
|
end
|
| 36 |
|
|
|
| 37 |
|
|
#Specify display device (qt is only option for Windows)
|
| 38 |
|
|
if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM)
|
| 39 |
|
|
options.dev = "qt"
|
| 40 |
|
|
else
|
| 41 |
|
|
options.dev = "x11"
|
| 42 |
|
|
end
|
| 43 |
|
|
opts.on("-o, --odev", String, [:x11, :qt], "Output device (x11 or qt)") do |n|
|
| 44 |
|
|
options.dev = n
|
| 45 |
|
|
options.radopt << "-o #{options.dev}"
|
| 46 |
|
|
end
|
| 47 |
|
|
|
| 48 |
|
|
options.procs = "1"
|
| 49 |
|
|
opts.on("-N, --nprocs", String, "Number of processors (UNIX ony)") do |n|
|
| 50 |
|
|
options.procs = n
|
| 51 |
|
|
options.radopt << "-N #{options.procs}"
|
| 52 |
|
|
end
|
| 53 |
|
|
|
| 54 |
|
|
options.vw = "XYZ"
|
| 55 |
|
|
opts.on("-v", "--view", String, "View specification") do |n|
|
| 56 |
|
|
options.view = n
|
| 57 |
|
|
options.radopt << "-v #{options.view}"
|
| 58 |
|
|
end
|
| 59 |
|
|
|
| 60 |
|
|
options.ltv = false
|
| 61 |
|
|
opts.on("-l", "--ltview", "Luminaire viewer mode") do |n|
|
| 62 |
|
|
options.ltv = true
|
| 63 |
|
|
options.vw = "y"
|
| 64 |
|
|
end
|
| 65 |
|
|
|
| 66 |
|
|
#set "room" size for ltview, default is 4' square box (in meters)
|
| 67 |
|
|
options.rsiz = "0.6096"
|
| 68 |
|
|
opts.on("-r", "--roomsize", String, "Room scaling factor for ltview") do |n|
|
| 69 |
|
|
options.rsiz = n
|
| 70 |
|
|
end
|
| 71 |
|
|
|
| 72 |
|
|
opts.on("-d", "--debug", "Run verbosely") do |n|
|
| 73 |
|
|
options.verbose = true
|
| 74 |
|
|
end
|
| 75 |
|
|
|
| 76 |
|
|
opts.on("-g", "--ogl", "Use OpenGL (glrad)") do |n|
|
| 77 |
|
|
options.ogl = true
|
| 78 |
|
|
end
|
| 79 |
|
|
|
| 80 |
|
|
opts.on("-e", "--rad", "Set rad options") do |n|
|
| 81 |
|
|
options.radopt << n
|
| 82 |
|
|
end
|
| 83 |
|
|
|
| 84 |
|
|
opts.on("-S", "--glrad", "Set glrad options") do |n|
|
| 85 |
|
|
options.glradopt = "-S #{n}"
|
| 86 |
|
|
end
|
| 87 |
|
|
|
| 88 |
|
|
# No argument, shows at tail. This will print an options summary.
|
| 89 |
|
|
opts.on_tail("-h", "--help", "Show this message") do
|
| 90 |
|
|
puts opts
|
| 91 |
|
|
exit
|
| 92 |
|
|
end
|
| 93 |
|
|
|
| 94 |
|
|
end
|
| 95 |
|
|
|
| 96 |
|
|
opts.parse!(args)
|
| 97 |
|
|
options
|
| 98 |
|
|
|
| 99 |
|
|
end # parse()
|
| 100 |
|
|
|
| 101 |
|
|
end # class Optparse
|
| 102 |
|
|
|
| 103 |
|
|
options = Optparse.parse(ARGV)
|
| 104 |
|
|
|
| 105 |
|
|
# utility function: print statement and execute as system call
|
| 106 |
|
|
def exec_statement(s)
|
| 107 |
|
|
if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM)
|
| 108 |
|
|
s = s.gsub("/", "\\")
|
| 109 |
|
|
end
|
| 110 |
|
|
puts "'#{s}'"
|
| 111 |
|
|
result = system(s)
|
| 112 |
|
|
puts
|
| 113 |
|
|
return result
|
| 114 |
|
|
end
|
| 115 |
|
|
|
| 116 |
|
|
exec = "system"
|
| 117 |
|
|
if options.verbose == true
|
| 118 |
|
|
puts options
|
| 119 |
|
|
puts "Input file(s): #{ARGV}"
|
| 120 |
|
|
exec = "exec_statement"
|
| 121 |
|
|
end
|
| 122 |
|
|
|
| 123 |
|
|
#not needed(?)
|
| 124 |
|
|
#octree = Tempfile.new(['objview_', '.oct'])
|
| 125 |
|
|
#ambf = Tempfile.new(['objview_', '.amb'])
|
| 126 |
|
|
|
| 127 |
|
|
if options.ltv == true
|
| 128 |
|
|
rendopts = "-ab 1 -ds .15"
|
| 129 |
|
|
end
|
| 130 |
|
|
|
| 131 |
|
|
# not sure how these options are supposed to work... RPG
|
| 132 |
|
|
#
|
| 133 |
|
|
# case -s:
|
| 134 |
|
|
# case -w:
|
| 135 |
|
|
# set opts=($opts $argv[1])
|
| 136 |
|
|
# breaksw
|
| 137 |
|
|
# case -b*:
|
| 138 |
|
|
# set rendopts=($rendopts -bv)
|
| 139 |
|
|
# breaksw
|
| 140 |
|
|
# case -V:
|
| 141 |
|
|
#
|
| 142 |
|
|
|
| 143 |
|
|
|
| 144 |
|
|
if not ARGV[0]
|
| 145 |
|
|
puts "No input files specified"
|
| 146 |
|
|
exit 1
|
| 147 |
|
|
end
|
| 148 |
|
|
|
| 149 |
|
|
if options.ogl == true
|
| 150 |
|
|
if rendopts
|
| 151 |
|
|
puts "bad option for glrad"
|
| 152 |
|
|
exit 1
|
| 153 |
|
|
else
|
| 154 |
|
|
if options.glradopt == true
|
| 155 |
|
|
puts "bad option for rad"
|
| 156 |
|
|
exit 1
|
| 157 |
|
|
end
|
| 158 |
|
|
end
|
| 159 |
|
|
end
|
| 160 |
|
|
|
| 161 |
|
|
if options.ltv == false
|
| 162 |
|
|
# create lights input file for objview
|
| 163 |
|
|
lights = Tempfile.new(['lt_', '.rad'])
|
| 164 |
|
|
lights.write("void glow dim 0 0 4 .1 .1 .15 0\n")
|
| 165 |
|
|
lights.write("dim source background 0 0 4 0 0 1 360\n")
|
| 166 |
|
|
lights.write("void light bright 0 0 3 1000 1000 1000\n")
|
| 167 |
|
|
lights.write("bright source sun1 0 0 4 1 .2 1 5\n")
|
| 168 |
|
|
lights.write("bright source sun2 0 0 4 .3 1 1 5\n")
|
| 169 |
|
|
lights.write("bright source sun3 0 0 4 -1 -.7 1 5\n")
|
| 170 |
|
|
if options.verbose == true
|
| 171 |
|
|
lights.rewind
|
| 172 |
|
|
lightsread = lights.read
|
| 173 |
|
|
puts "\nlights file:"
|
| 174 |
|
|
puts lightsread
|
| 175 |
|
|
end
|
| 176 |
|
|
lights.close
|
| 177 |
|
|
end
|
| 178 |
|
|
|
| 179 |
|
|
if options.ltv == true
|
| 180 |
|
|
#create room input file for ltview
|
| 181 |
|
|
room = Tempfile.new(['lt_', '.rad'])
|
| 182 |
|
|
room.write("void plastic surf\n0\n0\n5\n.2 .2 .2 0 0\n\n")
|
| 183 |
|
|
room.write("surf polygon floor\n0\n0\n12\n")
|
| 184 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
|
| 185 |
|
|
room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
|
| 186 |
|
|
room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
|
| 187 |
|
|
room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n\n")
|
| 188 |
|
|
|
| 189 |
|
|
room.write("surf polygon clg\n0\n0\n12\n")
|
| 190 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
|
| 191 |
|
|
room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
|
| 192 |
|
|
room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
|
| 193 |
|
|
room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")
|
| 194 |
|
|
|
| 195 |
|
|
room.write("surf polygon wall-north\n0\n0\n12\n")
|
| 196 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
|
| 197 |
|
|
room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
|
| 198 |
|
|
room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
|
| 199 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")
|
| 200 |
|
|
|
| 201 |
|
|
room.write("surf polygon wall-east\n0\n0\n12\n")
|
| 202 |
|
|
room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
|
| 203 |
|
|
room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n")
|
| 204 |
|
|
room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
|
| 205 |
|
|
room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n")
|
| 206 |
|
|
|
| 207 |
|
|
room.write("surf polygon wall-west\n0\n0\n12\n")
|
| 208 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n")
|
| 209 |
|
|
room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n")
|
| 210 |
|
|
room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n")
|
| 211 |
|
|
room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n\n")
|
| 212 |
|
|
if options.verbose == true
|
| 213 |
|
|
room.rewind
|
| 214 |
|
|
roomread = room.read
|
| 215 |
|
|
puts "\nroom file:"
|
| 216 |
|
|
puts roomread
|
| 217 |
|
|
end
|
| 218 |
|
|
room.close
|
| 219 |
|
|
end
|
| 220 |
|
|
|
| 221 |
|
|
# create .rif file
|
| 222 |
|
|
rif = Tempfile.new(['ov_', '.rif'])
|
| 223 |
|
|
if options.ltv == true
|
| 224 |
|
|
rif.write("scene= #{ARGV.join(' ')} #{room.path}\n")
|
| 225 |
|
|
else
|
| 226 |
|
|
rif.write("scene= #{ARGV.join(' ')} #{lights.path}\n")
|
| 227 |
|
|
end
|
| 228 |
|
|
rif.write("EXPOSURE= .5\n")
|
| 229 |
|
|
rif.write("UP= #{options.up}\n")
|
| 230 |
|
|
rif.write("view= #{options.vw}\n")
|
| 231 |
|
|
rif.write("oconv= -f\n")
|
| 232 |
|
|
rif.write("render= #{rendopts}\n")
|
| 233 |
|
|
#doesn't rad handle the construction and destruction of these files (below) on its own? RPG
|
| 234 |
|
|
#rif.write("OCTREE= #{octree.path}\n")
|
| 235 |
|
|
#rif.write("AMBF= #{ambf.path}\n")
|
| 236 |
|
|
if options.verbose == true
|
| 237 |
|
|
rif.rewind
|
| 238 |
|
|
rifread = rif.read
|
| 239 |
|
|
puts "\nrif file:"
|
| 240 |
|
|
puts rifread
|
| 241 |
|
|
end
|
| 242 |
|
|
rif.close
|
| 243 |
|
|
|
| 244 |
|
|
puts "radopt = #{options.radopt.join(" ")}"
|
| 245 |
|
|
|
| 246 |
|
|
#run executive control program of choice
|
| 247 |
|
|
if options.ogl == true
|
| 248 |
|
|
exec("glrad #{options.radopt.join(" ")} #{rif.path}")
|
| 249 |
|
|
else
|
| 250 |
|
|
exec("rad -o #{options.dev} #{options.radopt.join(" ")} #{rif.path}")
|
| 251 |
|
|
end
|
| 252 |
|
|
|
| 253 |
|
|
# clean up temp files
|
| 254 |
|
|
if coptions.ltv == true
|
| 255 |
|
|
room.unlink
|
| 256 |
|
|
else
|
| 257 |
|
|
lights.unlink
|
| 258 |
|
|
end
|
| 259 |
|
|
rif.unlink
|
| 260 |
|
|
#ambf.unlink
|
| 261 |
|
|
#octree.unlink
|
| 262 |
|
|
|
| 263 |
|
|
exit 0
|
| 264 |
|
|
|