Update 22 December I have gone on to modify my java
povwriter library, incorporating some of ideas developed here. This sketch is incompatible with that new library, however old library is still available
here.
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
In this iteration of prototyping I get to do 1 and 2, as 3 will involve a rewrite of my povwriter library, which I'm putting off until is clear whether beginRaw/endRaw will work in processing 2.0 (scheduled for release in Spring 2012?). I have decided less is definetly more for my gui, there are now only 3 quality options and the raytrace button now also initiates the recording of the PovRAY files as well as starting PovRAY. Further I've split the ini writer/povray runner into a new class as follows:-
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
exporter.set_povray_path('/usr/local/bin/povray')
exporter.store_settings
no_stroke
sphere_detail(18)
end
def draw
lights
if (precord)
no_lights
no_loop
begin_raw("povexport.RawPovray", data_path(povfile))
end
if pview
pov_image = load_image(data_path(povfile.gsub("pov", "png")))
update_pixels
background(255)
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)
exporter.sphere(60)
pop_matrix
end
end
end
end
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