Skip to content

Instantly share code, notes, and snippets.

@alpicola
Created October 8, 2011 10:21
Show Gist options
  • Save alpicola/1272100 to your computer and use it in GitHub Desktop.
Save alpicola/1272100 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require 'optparse'
require 'pathname'
require 'tmpdir'
libraries = %w|/Applications/Processing.app/Contents/Resources/Java/core.jar|
compiler = 'scalac'
OptionParser.new {|opt|
opt.on('-w', '--watch') { compiler = 'fsc' }
}.parse!(ARGV)
template = DATA.read
sources = ARGV.map {|s| Pathname.new(s).expand_path }
compile_and_run = lambda {
File.open('Sketch.scala', 'w') {|f|
f << template % sources.map {|s| s.read }.join("\n")
}
begin
env = { 'CLASSPATH' => libraries.join(':') + ':.' }
pid = spawn(env, compiler, 'Sketch.scala')
puts 'Compiling...'
if Process.detach(pid).value.success?
pid = spawn(env, 'scala', 'Sketch')
puts 'Run!'
Process.waitpid(pid)
end
pid = nil
ensure
Process.kill(:INT, pid) if pid
end
}
Dir.mktmpdir do |dir|
Dir.chdir(dir)
case compiler
when 'scalac'
compile_and_run.call
when 'fsc'
Signal.trap(:INT) { exit }
thread = nil
t = Time.at(0)
loop do
if sources.any? {|s| s.file? && s.mtime > t }
t = Time.now
thread.kill if thread
thread = Thread.new(&compile_and_run)
end
sleep 1
end
end
end
__END__
import processing.core._
import PConstants._
import PApplet._
object Sketch {
def main(args:Array[String]) {
PApplet.main(Array("--location=5,25", classOf[Sketch].getName))
}
}
class Sketch extends PApplet {
lazy val proxy = new Proxy(this) {
%s
}
override def setup() { proxy.setup() }
override def draw() { proxy.draw() }
override def mousePressed() { proxy.mousePressed() }
override def mouseReleased() { proxy.mouseReleased() }
override def mouseClicked() { proxy.mouseClicked() }
override def mouseDragged() { proxy.mouseDragged() }
override def mouseMoved() { proxy.mouseMoved() }
abstract class Proxy(val applet:PApplet) {
def setup() {}
def draw()
def mousePressed() {}
def mouseReleased() {}
def mouseClicked() {}
def mouseDragged() {}
def mouseMoved() {}
def mouseX = applet.mouseX
def mouseY = applet.mouseY
def isMousePressed:Boolean = applet.mousePressed
def isKeyPressed:Boolean = applet.keyPressed
}
implicit def double2float(x:Double):Float = x.toFloat
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment