coffee-processing
Helps writing Processing.js sketches in Coffeescript.
Installation
Add this line to your application's Gemfile:
gem 'coffee-processing'
And then execute:
$ bundle
Or install it yourself as:
$ gem install coffee-processing
Usage
A sample Processing.js sketch written in Coffeescript with the help of coffee-processing.
setup = ->
  size $(window).width(), $(window).height()
  frameRate 30
  background 255
draw = ->
  for i in [0..10]
    s = random(100)
    stroke random(255), random(255), random(255)
    ellipse random(width()), random(height()), s, sRuby code for compiling it into Javascript.
require 'coffee-processing'
File.open('compiled.js', 'w') do |f|
  f << CoffeeProcessing.compile('this.sketch', code)
endAnd the HTML page.
<script src='compiled.js' type='text/javascript'></script>
<canvas id='sketch'></canvas>
<script type='text/javascript'>
  var processing = new Processing(document.getElementById("sketch"), this.sketch)
</script>Preloading (Experimental)
Asynchronous nature of Javascript requires preloading of images and fonts. Processing.js allows you to preload assets with @pjs directives. However they are only applied during the compilation of Processing syntax, and there's currenty no direct way to preload in Javascript-only Processing.js code.
If you define preload object in your coffee-processing code as the following example,
coffee-processing will delay the execution until those assets are ready.
(Although the way it does so seems quite hacky.)
preload =
  images: ['/images/image1.png', '/images/image2.png']
  fonts:  ['/fonts/font.ttf']
setup = ->
  font = createFont '/fonts/font.ttf', 0 
  img1 = loadImage '/images/image1.png'
  img2 = loadImage '/images/image2.png'coffee-processing script
usage: coffee-processing [--template] <js object name> <sketch file>
        --template                   Create a template page for the sketch
    -h, --help                       Show this message
Caveats
Non-constant, instance variables of Processing object,
such as width, frameCount and __mousePressed (among others)
should be accessed through their corresponding shortcut functions as follows.
# __mousePressed, frameCount, width and height are functions, not values.
setup = ->
  size 100, 100, P3D
draw = ->
  if __mousePressed()
    point frameCount() % width(), frameCount() % height()Or equivalently, you can access them as the properties of processing object.
This is slightly more efficient.
# Alias for processing instance
p5 = processing
setup = ->
  size 100, 100, P3D
draw = ->
  if p5.__mousePressed
    point p5.frameCount % p5.width, p5.frameCount % p5.heightExamples
Check out examples directory.
Also check out a Sinatra demo app.
Contributing
- Fork it
 - Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Added some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request