orig/objview.rb
changeset 39 0216da79ade0
equal deleted inserted replaced
38:a21b69f32c77 39:0216da79ade0
       
     1 #!/usr/bin/env ruby
       
     2 # RCSid: $Id$
       
     3 #
       
     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