# HG changeset patch # User Axel Jacobs # Date 1385939836 0 # Node ID 0216da79ade00c0c7d8e89b03f4fc5d6ede529b9 # Parent a21b69f32c773c784ffe858cbeb735ef4cb6cfbd orig/objview.rb: Windows version of objview.csh with extra ltview functionality diff -r a21b69f32c77 -r 0216da79ade0 orig/objview.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/orig/objview.rb Sun Dec 01 23:17:16 2013 +0000 @@ -0,0 +1,264 @@ +#!/usr/bin/env ruby +# RCSid: $Id$ +# +# objview.rb, v1.1 2012.07.04 RPG +# Ruby port of objview.csh +# +# Make a nice view of an object, or luminaire +# Arguments are scene input files +# + +require 'optparse' +require 'ostruct' +require 'tempfile' + +class Optparse + # + # Return a structure describing the options. + # + def self.parse(args) + # The options specified on the command line will be collected in *options*. + options = OpenStruct.new + + opts = OptionParser.new do |opts| + opts.banner = "Usage: (ruby) objview.rb [options] [radiance scene input files]" + + opts.separator "" + opts.separator "Options:" + + options.radopt = [] + options.glradopt = [] + + options.up = "Z" + opts.on("-u, --up", String, [:X, :Y, :Z], "View up vector (X, Y, or Z)") do |n| + options.up = n + end + + #Specify display device (qt is only option for Windows) + if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM) + options.dev = "qt" + else + options.dev = "x11" + end + opts.on("-o, --odev", String, [:x11, :qt], "Output device (x11 or qt)") do |n| + options.dev = n + options.radopt << "-o #{options.dev}" + end + + options.procs = "1" + opts.on("-N, --nprocs", String, "Number of processors (UNIX ony)") do |n| + options.procs = n + options.radopt << "-N #{options.procs}" + end + + options.vw = "XYZ" + opts.on("-v", "--view", String, "View specification") do |n| + options.view = n + options.radopt << "-v #{options.view}" + end + + options.ltv = false + opts.on("-l", "--ltview", "Luminaire viewer mode") do |n| + options.ltv = true + options.vw = "y" + end + + #set "room" size for ltview, default is 4' square box (in meters) + options.rsiz = "0.6096" + opts.on("-r", "--roomsize", String, "Room scaling factor for ltview") do |n| + options.rsiz = n + end + + opts.on("-d", "--debug", "Run verbosely") do |n| + options.verbose = true + end + + opts.on("-g", "--ogl", "Use OpenGL (glrad)") do |n| + options.ogl = true + end + + opts.on("-e", "--rad", "Set rad options") do |n| + options.radopt << n + end + + opts.on("-S", "--glrad", "Set glrad options") do |n| + options.glradopt = "-S #{n}" + end + + # No argument, shows at tail. This will print an options summary. + opts.on_tail("-h", "--help", "Show this message") do + puts opts + exit + end + + end + + opts.parse!(args) + options + + end # parse() + +end # class Optparse + +options = Optparse.parse(ARGV) + +# utility function: print statement and execute as system call +def exec_statement(s) + if /mswin/.match(RUBY_PLATFORM) or /mingw/.match(RUBY_PLATFORM) + s = s.gsub("/", "\\") + end + puts "'#{s}'" + result = system(s) + puts + return result +end + +exec = "system" +if options.verbose == true + puts options + puts "Input file(s): #{ARGV}" + exec = "exec_statement" +end + +#not needed(?) +#octree = Tempfile.new(['objview_', '.oct']) +#ambf = Tempfile.new(['objview_', '.amb']) + +if options.ltv == true + rendopts = "-ab 1 -ds .15" +end + +# not sure how these options are supposed to work... RPG +# +# case -s: +# case -w: +# set opts=($opts $argv[1]) +# breaksw +# case -b*: +# set rendopts=($rendopts -bv) +# breaksw +# case -V: +# + + +if not ARGV[0] + puts "No input files specified" + exit 1 +end + +if options.ogl == true + if rendopts + puts "bad option for glrad" + exit 1 + else + if options.glradopt == true + puts "bad option for rad" + exit 1 + end + end +end + +if options.ltv == false + # create lights input file for objview + lights = Tempfile.new(['lt_', '.rad']) + lights.write("void glow dim 0 0 4 .1 .1 .15 0\n") + lights.write("dim source background 0 0 4 0 0 1 360\n") + lights.write("void light bright 0 0 3 1000 1000 1000\n") + lights.write("bright source sun1 0 0 4 1 .2 1 5\n") + lights.write("bright source sun2 0 0 4 .3 1 1 5\n") + lights.write("bright source sun3 0 0 4 -1 -.7 1 5\n") + if options.verbose == true + lights.rewind + lightsread = lights.read + puts "\nlights file:" + puts lightsread + end + lights.close +end + +if options.ltv == true + #create room input file for ltview + room = Tempfile.new(['lt_', '.rad']) + room.write("void plastic surf\n0\n0\n5\n.2 .2 .2 0 0\n\n") + room.write("surf polygon floor\n0\n0\n12\n") + room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n") + room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n\n") + + room.write("surf polygon clg\n0\n0\n12\n") + room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n") + room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n") + room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n") + room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n") + + room.write("surf polygon wall-north\n0\n0\n12\n") + room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n") + room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n") + + room.write("surf polygon wall-east\n0\n0\n12\n") + room.write("#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n") + room.write("#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n") + room.write("#{options.rsiz} #{options.rsiz} #{options.rsiz}\n\n") + + room.write("surf polygon wall-west\n0\n0\n12\n") + room.write("-#{options.rsiz} #{options.rsiz} -#{options.rsiz}\n") + room.write("-#{options.rsiz} #{options.rsiz} #{options.rsiz}\n") + room.write("-#{options.rsiz} -#{options.rsiz} #{options.rsiz}\n") + room.write("-#{options.rsiz} -#{options.rsiz} -#{options.rsiz}\n\n") + if options.verbose == true + room.rewind + roomread = room.read + puts "\nroom file:" + puts roomread + end + room.close +end + +# create .rif file +rif = Tempfile.new(['ov_', '.rif']) +if options.ltv == true + rif.write("scene= #{ARGV.join(' ')} #{room.path}\n") +else + rif.write("scene= #{ARGV.join(' ')} #{lights.path}\n") +end +rif.write("EXPOSURE= .5\n") +rif.write("UP= #{options.up}\n") +rif.write("view= #{options.vw}\n") +rif.write("oconv= -f\n") +rif.write("render= #{rendopts}\n") +#doesn't rad handle the construction and destruction of these files (below) on its own? RPG +#rif.write("OCTREE= #{octree.path}\n") +#rif.write("AMBF= #{ambf.path}\n") +if options.verbose == true + rif.rewind + rifread = rif.read + puts "\nrif file:" + puts rifread +end +rif.close + +puts "radopt = #{options.radopt.join(" ")}" + +#run executive control program of choice +if options.ogl == true + exec("glrad #{options.radopt.join(" ")} #{rif.path}") +else + exec("rad -o #{options.dev} #{options.radopt.join(" ")} #{rif.path}") +end + +# clean up temp files +if coptions.ltv == true + room.unlink +else + lights.unlink +end +rif.unlink +#ambf.unlink +#octree.unlink + +exit 0 +