It really is much easier to prototype in ruby/ruby processing vs java/vanilla processing. Recently I had the idea of splitting up the povray files as follows:-
- pov.ini to hold size (resolution) and quality (ray-trace parameter
- pov.pov to hold template (camera/background etc)
- pov.inc to hold mesh data etc from the processing sketch
# Demonstrates how you can use my povwriter libary # in Ruby-Processing, to export to PovRAY load_libraries 'povwriter', 'control_panel' import 'povexport' require 'ini_writer' DATA = [-1, 0, 1] attr_reader :exporter, :precord, :pquality, :type, :pview, :povfile def setup size 1000, 1000, P3D @povfile = "balls.pov" @precord = false @pview = false @exporter = PovExporter.new self control_panel do |c| c.title = "Render as PovRAY" c.menu(:quality, ['instant', 'medium', 'high'], 'instant') {|m| load_quality_choice(m) } c.button :choose_template c.button :raytrace c.button :exit! end # uncomment next enter the path to povray executable on mac/windows/linux (or possibly jedit linux) exporter.set_povray_path('/usr/local/bin/povray') # choice is saved in '.povwriter/povwriter.properties' # uncomment following line to adjust degenerate triangle cut off (area squared) # export.set_epsilon("0.001") exporter.store_settings # uncomment this line to save settings no_stroke sphere_detail(18) end def draw lights # this needs to be outside the record loop if (precord) no_lights # let PovRAY do the lighting no_loop # don't loop while recording sketch begin_raw("povexport.RawPovray", data_path(povfile)) end if pview pov_image = load_image(data_path(povfile.gsub("pov", "png"))) update_pixels background(255) # clear the screen image(pov_image, 0, 0) else render end if (precord) end_raw @precord = false puts "done recording" trace = IniWriter.new(data_path(povfile), width, height, pquality) trace.raytrace exporter.get_povray_path @pview = true end end def exit! exit end def render() background(0) translate(width*0.7, height/2, -width) DATA.each do |y| DATA.each do |x| DATA.each do |z| push_matrix translate(120*x, 120*y, 120*z) fill(rand * 255, rand * 255, rand * 255) # a nice test for my colorFactory class exporter.sphere(60) # use a better sphere primitive for ray tracing pop_matrix end end end end ################################### Independent of sketch ############################ def raytrace @precord = true end def choose_template exporter.choose_template end def load_quality_choice(item) @pquality = item end
Here is the ini writer class..................
require 'pathname' INI = {'instant' => 'quick.ini', 'medium' => 'medium.ini', 'high' => 'quality.ini'} QUALITY = {'instant' => 4, 'medium' => 6, 'high' => 11} class IniWriter attr_reader :name, :width, :height, :qual, :base, :ini def initialize name, width, height, qual @name, @width, @height, @qual = name, width, height, qual init end def init @base = File.dirname(name) if (QUALITY[qual] < 6 && width > 300) @height *= 300.0/width @width = 300 end end def write @ini = File.join(base, INI[qual]) file = open(ini, 'w') file.puts("; #{ini}") file.puts("Input_File_Name='#{name}'") file.puts("width=#{width}") file.puts("height=#{height}") file.puts("quality=#{QUALITY[qual]}") file.puts("Antialias=true") unless QUALITY[qual] < 10 file.puts("Output_File_Type=N8") file.puts("Output_File_Name='#{name.gsub('pov', 'png')}'") file.close end def raytrace povray_path write system([povray_path, ini].join(" ")) end end