diff --git a/History.md b/History.md index 4ba54a2..4cddddb 100644 --- a/History.md +++ b/History.md @@ -1,3 +1,12 @@ +0.4.0 / 2014-10-28 +================== + + * Processing.js v1.4.8 + * API Changed + * Removed dependency upon nsdom + * Added the ability to generate server side animations (see examples) + * Updated server.js to show latest tests + 0.3.0 / 2012-08-13 ================== diff --git a/Readme.md b/Readme.md index dbb17ee..09d2b54 100644 --- a/Readme.md +++ b/Readme.md @@ -3,7 +3,8 @@ [Processing.js](http://processingjs.org/) for [Node.js](http://nodejs.org) -![screenshot](http://cl.ly/1R1L2S2n190c0L2j1I32/node-processing.png) +![screenshot](https://raw.github.com/sudsy/node-processing/master/testServer.png) + ## Installation @@ -11,26 +12,129 @@ $ npm install processing ``` +## Issues +1. Currently does not support 3d sketches +2. Has buggy support for loadImage and loadSVG (run make test-server to see examples that are not working) + ## Usage ```javascript var fs = require('fs') , sketch = __dirname + '/scribbleplotter.pde' - , processing = require('processing'); + , Processing = require('processing') + , Canvas = require("canvas") + , canvas = new Canvas(200,200); fs.readFile(sketch, function(err, data) { - var p5 = processing.createInstance(data, sketch) + var p5 = new Processing(canvas, data) , out = fs.createWriteStream(__dirname + '/scribbleplotter.png') - , stream = p5.canvas.createPNGStream(); + , stream = canvas.createPNGStream(); stream.pipe(out); }); ``` +## Usage + +```javascript +// Compile processing code into javascript, so it can be used in a LAMP webapp more effectively (no p5 lang parsing step by client needed) +// Intended to use with Grunt when developing and deploying web applications +// contribution by kroko.me + +var fs = require('fs'); +var Processing = require('processing'); +if (process.argv.length != 5) { + console.log("Usage: node compile.js "); + process.exit(code = 1); +} +else { + console.log("Reading file: " + process.argv[2]); + console.log("Output will be: " + process.argv[3]); + console.log("Variable will be: " + process.argv[4]); +} +console.log("Compiling sketch..."); + +fs.readFile(process.argv[2], function(err, data) { + var compiled = Processing.compile(data.toString('utf-8')); + compiled = "var " + process.argv[4] + " = " + compiled + ";"; + fs.writeFile(process.argv[3], compiled, function(err) { + if (err) { + console.log(err); + } else { + console.log("...done!"); + } + }); +}); + +// Usage in web +// var domCanvas = document.getElementById('id-of-canvas-dom-element'); +// pjsPtr = new Processing(domCanvas, valiable-name-as-passed-to-this-script); +// if (pjsPtr) { } +``` + +## Usage - Animation + +![Animated Example](https://raw.github.com/sudsy/node-processing/master/examples/animation/bobbingball.gif) + +```javascript +// Generate server side animations with processing + +var fs = require('fs'), + sketch = __dirname + '/bobbingball.pde', + Processing = require('../../'), + Canvas = require("canvas"), + GIFEncoder = require("gifencoder"); + + + + var canvas = new Canvas(400,400); + var ctx = canvas.getContext('2d'); + + var encoder = new GIFEncoder(400, 400); + encoder.createReadStream().pipe(fs.createWriteStream('bobbingball.gif')); + encoder.setDelay(40); + + +fs.readFile(sketch, {"encoding": "utf-8"}, function(err, data) { + if(err){ + console.log(err); + } + + var p5 = new Processing(canvas, data); + + p5.onAfterDraw = function(){ + + encoder.addFrame(ctx); + } + + encoder.start(); + + //Finish the animation + setTimeout(function(){ + //stop encoding the gif + encoder.finish(); + //Stop Processing from looping + p5.noLoop(); + + }, 3600); + + +}); + + +``` + + ## Authors - Seiya Konno <seiya@uniba.jp> ([nulltask](https://github.com/nulltask)) +## Contributors + + - Reinis Adovičs ([kroko](https://github.com/kroko)) + - Ben Sudbury ([sudsy](https://github.com/sudsy)) + + ## License (The MIT License) diff --git a/deps/processing-js b/deps/processing-js index 308591d..2c88a18 160000 --- a/deps/processing-js +++ b/deps/processing-js @@ -1 +1 @@ -Subproject commit 308591d05db8be7e9a6ea0ea1f9ca1fb304e4e89 +Subproject commit 2c88a18fcd10951bd84008a5c2ebd996fe873042 diff --git a/examples/animation/bobbingball.gif b/examples/animation/bobbingball.gif new file mode 100644 index 0000000..196441c Binary files /dev/null and b/examples/animation/bobbingball.gif differ diff --git a/examples/animation/bobbingball.js b/examples/animation/bobbingball.js new file mode 100644 index 0000000..486f97e --- /dev/null +++ b/examples/animation/bobbingball.js @@ -0,0 +1,41 @@ +var fs = require('fs'), + sketch = __dirname + '/bobbingball.pde', + Processing = require('../../'), + Canvas = require("canvas"), + GIFEncoder = require("gifencoder"); + + + + var canvas = new Canvas(400,400); + var ctx = canvas.getContext('2d'); + + var encoder = new GIFEncoder(400, 400); + encoder.createReadStream().pipe(fs.createWriteStream('bobbingball.gif')); + encoder.setDelay(40); + + +fs.readFile(sketch, {"encoding": "utf-8"}, function(err, data) { + if(err){ + console.log(err); + } + // console.log(data); + var p5 = new Processing(canvas, data); + + p5.onAfterDraw = function(){ + // console.log("fired"); + encoder.addFrame(ctx); + } + + encoder.start(); + + //Finish the animation + setTimeout(function(){ + //stop encoding the gif + encoder.finish(); + //Stop Processing from looping + p5.noLoop(); + + }, 3600); + + +}); diff --git a/examples/animation/bobbingball.pde b/examples/animation/bobbingball.pde new file mode 100644 index 0000000..a118a5a --- /dev/null +++ b/examples/animation/bobbingball.pde @@ -0,0 +1,98 @@ +Ball ball; +float angle = 0; +float centerY = 200; +float range = 100; +float speed = 0.2; + +void setup() { + size(400, 400); + frameRate(25); + + initialize(); +} + +void initialize() { + smooth(); + noStroke(); + background(255); + ball = new Ball(); + centerY = height/2; + ball.x = width/2; + ball.y = centerY; + ball.radius = 50; + ball.setFillColor(color(255, 0, 0)); + ball.update(); + +} + +void draw() { + background(255); + ball.y = centerY + sin(angle) * range; + angle += speed; + ball.update(); +} + +//////////////////////////////// + +class Ball extends Sprite { + float radius; + + Ball() { + super(); + } + + void draw() { + ellipse(0, 0, radius*2, radius*2); + } +} + +//////////////////////////////// + +class Sprite { + float x, y; + float scaleX, scaleY; + float width, height; + float rotation; + boolean visible; + color strokeColor; + color fillColor; + Boolean isStroke; + Boolean isFill; + + Sprite() { + x = 0.0; + y = 0.0; + scaleX = 1.0; + scaleY = 1.0; + rotation = 0.0; + strokeColor = color(0); + fillColor = color(0); + isStroke = false; + isFill = false; + visible = true; + } + + void update() { + if(! visible) return; + pushMatrix(); + translate(x, y); + scale(scaleX, scaleY); + rotate(rotation * PI / 180.0); + if(isStroke) stroke(strokeColor); + if(isFill) fill(fillColor); + draw(); + popMatrix(); + } + + void setStrokeColor(color strokeColor) { + this.strokeColor = strokeColor; + isStroke = true; + } + + void setFillColor(color fillColor) { + this.fillColor = fillColor; + isFill = true; + } + + void draw() {} +} \ No newline at end of file diff --git a/examples/compile/compile.js b/examples/compile/compile.js new file mode 100644 index 0000000..705c7a3 --- /dev/null +++ b/examples/compile/compile.js @@ -0,0 +1,34 @@ +// Compile processing code into javascript, so that can be used in webpage more effectively (no p5 lang parsing step by client needed) +// Intended to use with Grunt when developing and deploying web applications +// contribution by kroko.me + +var fs = require('fs'); +var Processing = require('../../'); +if (process.argv.length != 5) { + console.log("Usage: node compile.js "); + process.exit(code = 1); +} +else { + console.log("Reading file: " + process.argv[2]); + console.log("Output will be: " + process.argv[3]); + console.log("Variable will be: " + process.argv[4]); +} +console.log("Compiling sketch..."); +// console.log(Processing); + +fs.readFile(process.argv[2], function(err, data) { + var compiled = Processing.compile(data.toString('utf-8')); + compiled = "var " + process.argv[4] + " = " + compiled + ";"; + fs.writeFile(process.argv[3], compiled, function(err) { + if (err) { + console.log(err); + } else { + console.log("...done!"); + } + }); +}); + +// Usage in web +// var domCanvas = document.getElementById('id_of_canvas_dom_element'); +// pjsPtr = new Processing(domCanvas, valiable_name_as_passed_to_this_script); +// if (pjsPtr) { } \ No newline at end of file diff --git a/examples/scribbleplotter/scribbleplotter.js b/examples/scribbleplotter/scribbleplotter.js index 70974db..399f109 100644 --- a/examples/scribbleplotter/scribbleplotter.js +++ b/examples/scribbleplotter/scribbleplotter.js @@ -1,11 +1,22 @@ var fs = require('fs') , sketch = __dirname + '/scribbleplotter.pde' - , processing = require('../../'); + , Processing = require('../../') + , Canvas = require("canvas"); -fs.readFile(sketch, function(err, data) { - var p5 = processing.createInstance(data, sketch) + + + var canvas = new Canvas(200,200); + + +fs.readFile(sketch, {"encoding": "utf-8"}, function(err, data) { + if(err){ + console.log(err); + } + // console.log(data); + var p5 = new Processing(canvas, data) , out = fs.createWriteStream(__dirname + '/scribbleplotter.png') - , stream = p5.canvas.createPNGStream(); + , stream = canvas.createPNGStream(); + stream.pipe(out); }); diff --git a/examples/scribbleplotter/scribbleplotter.png b/examples/scribbleplotter/scribbleplotter.png index 72878bd..dff7958 100644 Binary files a/examples/scribbleplotter/scribbleplotter.png and b/examples/scribbleplotter/scribbleplotter.png differ diff --git a/lib/browser.js b/lib/browser.js new file mode 100644 index 0000000..c775810 --- /dev/null +++ b/lib/browser.js @@ -0,0 +1,39 @@ +var browser = require('../deps/processing-js/lib/Browser'); +var fs = require("fs"); +var path = require("path"); +var Canvas = require("canvas"); +var patchCanvas = require("./patchCanvas.js"); + +//patch the Canvas constructor to return a canvas with extra attributes +// +function PatchedCanvas(){ + var aCanvas = new Canvas(); + patchCanvas(aCanvas); + return aCanvas; +} + + + +//Add timer events for animation +browser.window.setInterval = setInterval; +browser.window.clearInterval = clearInterval; +browser.window.setTimeout = setTimeout; + +browser.ajax = function(url) { + // console.log("replacement ajax"); + + var imagePath = loadImagePath || path.join(__dirname,'images'); + return fs.readFileSync(path.join(imagePath, url)).toString(); + +} + +var oldCreateElement = browser.window.document.createElement + +browser.window.document.createElement = function (tag) { + if (tag === "canvas") return new PatchedCanvas(); + return oldCreateElement(tag); +} + +// console.log(browser.window.HTMLCanvasElement.toString()); + +module.exports = browser; \ No newline at end of file diff --git a/lib/canvas.js b/lib/canvas.js deleted file mode 100644 index e2b1d4c..0000000 --- a/lib/canvas.js +++ /dev/null @@ -1,24 +0,0 @@ - -/** - * Module dependencies. - */ - -var Canvas = require('canvas') - , noop = function() {}; - -/** - * Apply patching for `Cnavas`. - */ - -Canvas.prototype.style = { setProperty: noop }; -Canvas.prototype.attachEvent = noop; -Canvas.prototype.setAttribute = noop; -Canvas.prototype.getAttribute = noop; -Canvas.prototype.hasAttribute = noop; -Canvas.prototype.__proto__ = noop.prototype; - -/** - * Expose `Canvas`. - */ - -module.exports = Canvas; diff --git a/lib/patch.js b/lib/patch.js index b15e1d9..8f5d649 100644 --- a/lib/patch.js +++ b/lib/patch.js @@ -1,28 +1,78 @@ +var Canvas = require("canvas") +var canvasImage = Canvas.Image; +var path = require("path"); +var fs = require("fs"); +var patchCanvas = require("./patchCanvas.js"); -/** - * Module dependencies. - */ - -var path = require('path'); - -/** - * Apply patching for Processing instance. - * - * @param {Processing} p5 - * @param {String} filePath - * @return {Processing} - */ - -module.exports = function(p5, filePath) { - var loadImage = p5.loadImage; - - p5.loadImage = function(file, type, callback) { - console.log('IMG: ', file); - console.log('PJS: ', filePath); - return loadImage(file, type, callback); - }; - - p5.canvas = p5.externals.canvas; // add short-hand. - - return p5; -}; + + +module.exports = function(processingConstructor){ + + + + //Wrap the Processing Constructor so we can augment node canvas as it is passed in + function newConstructor(aCanvas){ + + //noop some canvas functions that are called but not needed in node + patchCanvas(aCanvas); + + processingConstructor.apply(this, arguments); + + // Add an onAfterRedraw event to the instance for animation + var superRedraw = this.redraw; + var sub = this; + this.redraw = function(){ + superRedraw.call(sub); + //Fire an event to say that the frame has drawn + if(this.onAfterDraw){ + this.onAfterDraw.call(sub); + } + }; + + + } + + newConstructor.prototype = Object.create(processingConstructor.prototype); + + + // Copy static methods like compile + for (var i in processingConstructor) { + newConstructor[i] = processingConstructor[i]; + } + + + + + + //Make a global Image object that can be used by the image cache to load images + Image = function (){ + // need to use parasitic inheritance due to error with normal inheritance + var anImage = new canvasImage(); + var superSrc = anImage.src; + Object.defineProperty(anImage, "src", { + get: function() {return superSrc; }, + set: function(y) { + if(Object.prototype.toString.call(y) != '[object String]'){ + superSrc = y; + return; + } + //Define an Image path + var imagePath = loadImagePath || path.join(__dirname,'images'); + fs.readFile(path.join(imagePath, y), function(err, fileContents){ + if (err) throw err; + superSrc = fileContents; + + if(anImage.onload){ + anImage.onload.call(anImage); + } + }); + } + + }); + return anImage; + }; + + + + return newConstructor; +}; \ No newline at end of file diff --git a/lib/patchCanvas.js b/lib/patchCanvas.js new file mode 100644 index 0000000..8155680 --- /dev/null +++ b/lib/patchCanvas.js @@ -0,0 +1,13 @@ + +var noop = function(){}; + +module.exports = function(aCanvas){ + aCanvas.attachEvent = noop; + aCanvas.getAttribute = noop; + aCanvas.setAttribute = noop; + aCanvas.style = { + setProperty : noop + }; + +}; + diff --git a/lib/processing.js b/lib/processing.js index bad7a5f..3e7032a 100644 --- a/lib/processing.js +++ b/lib/processing.js @@ -1,91 +1,8 @@ -/** - * Module dependencies. - */ +//Mock Browser used by Processing-js for their own tests +var browser = require('./browser'); +var patch = require("./patch"); -var fs = require('fs') - , util = require('util') - , jsdom = require('jsdom') - , pkg = require('../package') - , patch = require('./patch') - , XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest - , Canvas = require('./canvas') - , Image = Canvas.Image - , document = jsdom.jsdom('') - , window = document.createWindow() - , navigator = window.navigator - , HTMLImageElement = window.HTMLImageElement - , noop = function() {} - , processing = fs.readFileSync('./deps/processing-js/processing.js'); - -/** - * Expose `version`. - */ - -exports.version = pkg.version; - -/** - * Expose `window`. - */ - -exports.window = window; - -/** - * Expose `document`. - */ - -exports.document = document; - -/** - * Make `Canvas` instance of `HTMLCanvasElement`. - */ - -function HTMLCanvasElement() {} -Canvas.prototype.__proto__ = HTMLCanvasElement.prototype; - -/** - * Evaluating Processing source code. - * - * FIXME: `Processing` leaks to global object. - */ - -eval('(function(window, document) {' - + processing.toString('utf-8') - + '})(window, document);'); - -/** - * Expose `Processing`. - */ - -exports.Processing = Processing; - -/** - * Return processing instance. - * - * @param {Canvas} canvas - * @param {String} path - * @return {Processing} - */ - -exports.createInstance = function(canvas, path) { - var src; - - if (Buffer.isBuffer(canvas)) { - canvas = canvas.toString(); - } - - if (1 == arguments.length) { - path = canvas; - canvas = document.createElement('canvas'); - } else if ('string' === typeof canvas) { - src = canvas; - canvas = document.createElement('canvas'); - } - - if (!src) { - src = fs.readFileSync(path).toString(); - } - - return patch(new Processing(canvas, src), path); -}; +var Processing = require('../deps/processing-js/src/')(browser); +module.exports = patch(Processing); \ No newline at end of file diff --git a/package.json b/package.json index 1735181..ca40b19 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,16 @@ { "author": "Seiya Konno (http://null.ly)", + "contributors": [ + { "name" : "Ben Sudbury [sudsy]" + , "url" : "http://www.lighthouselogic.com/" + }, + { "name" : "Reinis Adovičs [kroko]" + , "url" : "http://www.kroko.me/" + } + ] "name": "processing", "description": "Processing.js for Node.js", - "version": "0.3.0", + "version": "0.4.0", "homepage": "https://github.com/uniba/node-processing", "repository": { "url": "git@github.com:uniba/node-processing.git" @@ -12,12 +20,18 @@ "test": "make test" }, "dependencies": { - "jsdom": "*", - "xmlhttprequest": "*", "canvas": "*" }, "devDependencies": { - "express": "*" + "gifencoder": "*", + "animation": "*", + "express": "*", + "morgan" : "*", + "serve-index" : "*", + "express3-handlebars" : "*", + "traceback" : "*", + "colors" : "*" + }, "optionalDependencies": {}, "engines": { diff --git a/test/home.handlebars b/test/home.handlebars new file mode 100644 index 0000000..cfe10b8 --- /dev/null +++ b/test/home.handlebars @@ -0,0 +1,8 @@ +

Example App: Home

+ + + {{#each tests}} + +

{{this.path}}

+ + {{/each}} diff --git a/test/index.html b/test/index.html deleted file mode 100644 index c290c11..0000000 --- a/test/index.html +++ /dev/null @@ -1,1097 +0,0 @@ - - - - - - - -

node-processing test server

-

examples/basic/additivewave.html

- -

examples/basic/alphamask.html

- -

examples/basic/arctangent.html

- -

examples/basic/arm.html

- -

examples/basic/array.html

- -

examples/basic/array2d.html

- -

examples/basic/arrayobjects.html

- -

examples/basic/backgroundimage.html

- -

examples/basic/bezier.html

- -

examples/basic/bezierellipse.html

- -

examples/basic/brightness.html

- -

examples/basic/charactersstrings.html

- -

examples/basic/clock.html

- -

examples/basic/colorwheel.html

- -

examples/basic/compositeobjects.html

- -

examples/basic/conditionals1.html

- -

examples/basic/conditionals2.html

- -

examples/basic/constrain.html

- -

examples/basic/coordinates.html

- -

examples/basic/creategraphics.html

- -

examples/basic/createimage.html

- -

examples/basic/creating.html

- -

examples/basic/datatypeconversion.html

- -

examples/basic/displaying.html

- -

examples/basic/distance1d.html

- -

examples/basic/distance2d.html

- -

examples/basic/doublerandom.html

- -

examples/basic/easing.html

- -

examples/basic/embeddediteration.html

- -

examples/basic/embeddedlinks.html

- -

examples/basic/functions.html

- -

examples/basic/graphing2dequation.html

- -

examples/basic/hue.html

- -

examples/basic/incrementdecrement.html

- -

examples/basic/index.html

- -

examples/basic/inheritance.html

- -

examples/basic/integersfloats.html

- -

examples/basic/iteration.html

- -

examples/basic/keyboard.html

- -

examples/basic/keyboardfunctions.html

- -

examples/basic/letters.html

- -

examples/basic/lineargradient.html

- -

examples/basic/loadingimages.html

- -

examples/basic/logicaloperators.html

- -

examples/basic/loop.html

- -

examples/basic/milliseconds.html

- -

examples/basic/modulo.html

- -

examples/basic/mouse1d.html

- -

examples/basic/mouse2d.html

- -

examples/basic/mousefunctions.html

- -

examples/basic/mouseoverandout.html

- -

examples/basic/mousepress.html

- -

examples/basic/mousesignals.html

- -

examples/basic/multipleconstructors.html

- -

examples/basic/neighborhood.html

- -

examples/basic/noise1d.html

- -

examples/basic/noise2d.html

- -

examples/basic/noise3d.html

- -

examples/basic/noisewave.html

- -

examples/basic/noloop.html

- -

examples/basic/objects.html

- -

examples/basic/operatorprecedence.html

- -

examples/basic/piechart.html

- -

examples/basic/pointillism.html

- -

examples/basic/pointslines.html

- -

examples/basic/polartocartesian.html

- -

examples/basic/radialgradient.html

- -

examples/basic/random.html

- -

examples/basic/reading.html

- -

examples/basic/recursion.html

- -

examples/basic/recursion2.html

- -

examples/basic/redraw.html

- -

examples/basic/relativity.html

- -

examples/basic/rotate.html

- -

examples/basic/saturation.html

- -

examples/basic/scale.html

- -

examples/basic/setupdraw.html

- -

examples/basic/shapeprimitives.html

- -

examples/basic/simplecurves.html

- -

examples/basic/sine.html

- -

examples/basic/sinecosine.html

- -

examples/basic/sinewave.html

- -

examples/basic/sprite.html

- -

examples/basic/statementscomments.html

- -

examples/basic/storinginput.html

- -

examples/basic/translate.html

- -

examples/basic/transparency.html

- -

examples/basic/triangleflower.html

- -

examples/basic/trianglestrip.html

- -

examples/basic/truefalse.html

- -

examples/basic/variables.html

- -

examples/basic/variablescope.html

- -

examples/basic/vertices.html

- -

examples/basic/wavegradient.html

- -

examples/basic/widthheight.html

- -

examples/basic/words.html

- -

examples/custom/fullscreen.html

- -

examples/custom/index.html

- -

examples/custom/intersect.html

- -

examples/custom/molten.html

- -

examples/custom/snake.html

- -

examples/custom/substrate.html

- -

examples/js/3d.html

- -

examples/js/compile-lib.html

- -

examples/js/imagecache-js.html

- -

examples/js/libraries.html

- -

examples/js/simple.html

- -

examples/js/simpler.html

- -

examples/js/sketch-event-hooks.html

- -

examples/seneca/begin-endShape/2d/774.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-lines/endShape-2dtest-lines.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-noclose/endShape-2dtest-noclose.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-nomod/endShape-2dtest-nomod.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-nomodnofill/endShape-2dtest-nomodnofill.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-points/endShape-2dtest-points.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-polygon/endShape-2dtest-polygon.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-quads/endShape-2dtest-quads.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-quadstrip/endShape-2dtest-quadstrip.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-trianglefan/endShape-2dtest-trianglefan.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-triangles/endShape-2dtest-triangles.html

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-trianglestrip/endShape-2dtest-trianglestrip.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-lines/endShape-3dtest-lines.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-noclose/endShape-3dtest-noclose.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-nomod/endShape-3dtest-nomod.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-nomodnofill/endShape-3dtest-nomodnofill.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-points/endShape-3dtest-points.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-polygon/endShape-3dtest-polygon.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-quads/endShape-3dtest-quads.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-quadstrip/endShape-3dtest-quadstrip.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-trianglefan/endShape-3dtest-trianglefan.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-triangles/endShape-3dtest-triangles.html

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-trianglestrip/endShape-3dtest-trianglestrip.html

- -

examples/seneca/bezier/bezier.html

- -

examples/seneca/bezier3D/bezier.html

- -

examples/seneca/bezier3D/jellyfish.html

- -

examples/seneca/bezierDetail/bezierDetail.html

- -

examples/seneca/bezierTangent/bezierTangent.html

- -

examples/seneca/bezierVertex/bezierVertex.html

- -

examples/seneca/bezierVertex/bezierVertex2.html

- -

examples/seneca/bezierVertex3D/bezierVertex.html

- -

examples/seneca/bezierVertex3D/bezierVertex2.html

- -

examples/seneca/binary/binary.html

- -

examples/seneca/bug1116/index.html

- -

examples/seneca/bug277/test1/test.html

- -

examples/seneca/bug277/test2/test.html

- -

examples/seneca/bug277/test3/test.html

- -

examples/seneca/bug277/test4/test.html

- -

examples/seneca/bug277/test5/test.html

- -

examples/seneca/bug277/test6/test.html

- -

examples/seneca/bug596/test1/test.html

- -

examples/seneca/bug596/test2/test.html

- -

examples/seneca/bug597/test1/test.html

- -

examples/seneca/bug597/test2/test.html

- -

examples/seneca/bug597/test3/test.html

- -

examples/seneca/bug597/test4/test.html

- -

examples/seneca/bug634/endShape-3dtest-lines/endShape-3dtest-lines.html

- -

examples/seneca/bug634/endShape-3dtest-noclose/endShape-3dtest-noclose.html

- -

examples/seneca/bug634/endShape-3dtest-nomod/endShape-3dtest-nomod.html

- -

examples/seneca/bug634/endShape-3dtest-nomodnofill/endShape-3dtest-nomod.html

- -

examples/seneca/bug634/endShape-3dtest-points/endShape-3dtest-points.html

- -

examples/seneca/bug634/endShape-3dtest-points_2/endShape-3dtest-points.html

- -

examples/seneca/bug634/endShape-3dtest-polygon/endShape-3dtest-polygon.html

- -

examples/seneca/bug634/endShape-3dtest-quads/endShape-3dtest-quads.html

- -

examples/seneca/bug634/endShape-3dtest-quadstrip/endShape-3dtest-quadstrip.html

- -

examples/seneca/bug634/endShape-3dtest-trianglefan/endShape-3dtest-trianglefan.html

- -

examples/seneca/bug634/endShape-3dtest-triangles/endShape-3dtest-triangles.html

- -

examples/seneca/bug634/endShape-3dtest-trianglestrip/endShape-3dtest-trianglestrip.html

- -

examples/seneca/bug634/test1/test.html

- -

examples/seneca/bug634/test2/test.html

- -

examples/seneca/bug634/test3/test.html

- -

examples/seneca/bug634/test4/test.html

- -

examples/seneca/bug634/test5/test.html

- -

examples/seneca/bug634/test6/test.html

- -

examples/seneca/bug634/test7/test.html

- -

examples/seneca/bug650/tests/noclose/noclose.html

- -

examples/seneca/bug650/tests/nomod/nomod.html

- -

examples/seneca/bug650/tests/polygon/polygon.html

- -

examples/seneca/bug650/tests/quad_strip/quad_strip.html

- -

examples/seneca/bug650/tests/quads/quads.html

- -

examples/seneca/bug650/tests/triangle_fan/triangle_fan.html

- -

examples/seneca/bug650/tests/triangle_strip/triangle_strip.html

- -

examples/seneca/bug650/tests/triangles/triangles.html

- -

examples/seneca/bug755/test.html

- -

examples/seneca/bug842/test.html

- -

examples/seneca/bug954/test.html

- -

examples/seneca/canvas properties/index.html

- -

examples/seneca/canvas_size/test1/canvas_size.html

- -

examples/seneca/conflictingNames/test.html

- -

examples/seneca/createGraphics3D/createGraphics3D.html

- -

examples/seneca/cursor/cursorMode.html

- -

examples/seneca/cursor/cursorUrl.html

- -

examples/seneca/cursor/noCursor.html

- -

examples/seneca/customFonts/example.html

- -

examples/seneca/ellipse3D/ellipse.html

- -

examples/seneca/ellipse3D/ellipseMode.html

- -

examples/seneca/file and fragment loading (1818)/index.html

- -

examples/seneca/fill/test1/fill_test.html

- -

examples/seneca/focus (1089)/index.html

- -

examples/seneca/fontcache (1741)/index.html

- -

examples/seneca/imageCopy/imageCopy.html

- -

examples/seneca/keyEvents (1042 1065)/index.html

- -

examples/seneca/keyEvents (1042 1065)/keyPress.html

- -

examples/seneca/lazy loading (1186)/index.html

- -

examples/seneca/lerpColor/lerpColor.html

- -

examples/seneca/line/line-3d.html

- -

examples/seneca/loadBytes/loadBytesTest0.html

- -

examples/seneca/loading (95)/index.html

- -

examples/seneca/loadStrings/example.html

- -

examples/seneca/log/customLogger.html

- -

examples/seneca/log/index.html

- -

examples/seneca/log/miltipleCanvasPrint.html

- -

examples/seneca/log/simplePrint.html

- -

examples/seneca/max/maxTest1.html

- -

examples/seneca/max/maxTest2.html

- -

examples/seneca/min/minTest1.html

- -

examples/seneca/min/minTest2.html

- -

examples/seneca/mousePressed/mousePressed.html

- -

examples/seneca/mouseScroll/index.html

- -

examples/seneca/nf/nfTest1.html

- -

examples/seneca/nf/nfTest2.html

- -

examples/seneca/param/param.html

- -

examples/seneca/parseBoolean/parseBoolean.html

- -

examples/seneca/point/demos/corban/point-3d.html

- -

examples/seneca/point/demos/psys/psys.html

- -

examples/seneca/point/demos/spiral/spiral.html

- -

examples/seneca/printMatrix/print2DMatrixTest.html

- -

examples/seneca/printMatrix/print3DMatrixTest.html

- -

examples/seneca/Processing.reload/index.html

- -

examples/seneca/processingInstances/instances.html

- -

examples/seneca/rect/demos/bird demo/bird.html

- -

examples/seneca/rect/demos/birds demo/birds.html

- -

examples/seneca/rect/demos/blinds/blinds.html

- -

examples/seneca/rect/tests/test1/rect.html

- -

examples/seneca/rect/tests/test2/rect.html

- -

examples/seneca/rotate/rotate.html

- -

examples/seneca/rotate/rotateX.html

- -

examples/seneca/rotate/rotateY.html

- -

examples/seneca/rotate/rotateZ.html

- -

examples/seneca/saveStrings/example.html

- -

examples/seneca/screen/XandY/screenX.html

- -

examples/seneca/screen/XandY/screenXProjection.html

- -

examples/seneca/screen/XandY/screenY.html

- -

examples/seneca/shape/shape.html

- -

examples/seneca/shape/shape2.html

- -

examples/seneca/shapeMode/shapeMode.html

- -

examples/seneca/shapeMode/shapeMode2.html

- -

examples/seneca/size/size.html

- -

examples/seneca/size/size2.html

- -

examples/seneca/sphere/sphere.html

- -

examples/seneca/sphere/sphere2.html

- -

examples/seneca/status/status.html

- -

examples/seneca/stringEquals/stringEqualsTest.html

- -

examples/seneca/strokeWeight/strokeWeight.html

- -

examples/seneca/text/textTest1.html

- -

examples/seneca/text/textTest2.html

- -

examples/seneca/text/textTest3.html

- -

examples/seneca/text/textTest4.html

- -

examples/seneca/text/textTest5.html

- -

examples/seneca/text/textTest6.html

- -

examples/seneca/text$6/textTest1.html

- -

examples/seneca/text3D/text-3d.html

- -

examples/seneca/textAscent/textAscent.html

- -

examples/seneca/textDescent/textDescent.html

- -

examples/seneca/textMode/textMode2D.html

- -

examples/seneca/textMode/textMode3D.html

- -

examples/seneca/textWidth/2d/demos/index.html

- -

examples/seneca/textWidth/2d/tests/test.html

- -

examples/seneca/textWidth/2d/tests/test2.html

- -

examples/seneca/textWidth/3d/test/test.html

- -

examples/seneca/textWidth/3d/test/test2.html

- -

examples/seneca/touchevents/multitouchevents.html

- -

examples/seneca/touchevents/simpletouchevents.html

- -

examples/seneca/triangle/triangle-3d.html

- -

examples/seneca/XMLElement/xmlElementAddChild.html

- -

examples/seneca/XMLElement/xmlElementEquals.html

- -

examples/seneca/XMLElement/xmlElementGetChild.html

- -

examples/seneca/XMLElement/xmlElementGetChildCount.html

- -

examples/seneca/XMLElement/xmlElementGetContent.html

- -

examples/seneca/XMLElement/xmlElementGetName.html

- -

examples/seneca/XMLElement/xmlElementInsertChild.html

- -

examples/seneca/XMLElement/xmlElementListChildren.html

- -

examples/seneca/XMLElement/xmlElementRemoveAttribute.html

- -

examples/seneca/XMLElement/xmlElementRemoveChild.html

- -

examples/seneca/XMLElement/xmlElementRemoveChild2.html

- -

examples/seneca/XMLElement/xmlElementRemoveChildAtIndex.html

- -

examples/seneca/XMLElement/xmlElementSetAttribute.html

- -

examples/topics/animatedsprite.html

- -

examples/topics/animator.html

- -

examples/topics/anisprite.html

- -

examples/topics/blur.html

- -

examples/topics/bounce.html

- -

examples/topics/bouncybubbles.html

- -

examples/topics/brightness.html

- -

examples/topics/brownian.html

- -

examples/topics/button.html

- -

examples/topics/buttons.html

- -

examples/topics/chain.html

- -

examples/topics/circlecollision.html

- -

examples/topics/collision.html

- -

examples/topics/continuouslines.html

- -

examples/topics/convolution.html

- -

examples/topics/conway.html

- -

examples/topics/customtool.html

- -

examples/topics/edgedetection.html

- -

examples/topics/flocking.html

- -

examples/topics/fluid.html

- -

examples/topics/follow1.html

- -

examples/topics/follow2.html

- -

examples/topics/follow3.html

- -

examples/topics/handles.html

- -

examples/topics/histogram.html

- -

examples/topics/imagebutton.html

- -

examples/topics/index.html

- -

examples/topics/koch.html

- -

examples/topics/linear.html

- -

examples/topics/linearimage.html

- -

examples/topics/loadfile1.html

- -

examples/topics/loadfile2.html

- -

examples/topics/mandelbrot.html

- -

examples/topics/movingoncurves.html

- -

examples/topics/multipleparticlesystems.html

- -

examples/topics/pattern.html

- -

examples/topics/penrosesnowflake.html

- -

examples/topics/penrosetile.html

- -

examples/topics/pentigree.html

- -

examples/topics/pixelarray.html

- -

examples/topics/puff.html

- -

examples/topics/pulses.html

- -

examples/topics/reach1.html

- -

examples/topics/reach2.html

- -

examples/topics/reach3.html

- -

examples/topics/reflection1.html

- -

examples/topics/reflection2.html

- -

examples/topics/rollover.html

- -

examples/topics/savefile1.html

- -

examples/topics/savefile2.html

- -

examples/topics/savemanyimages.html

- -

examples/topics/saveoneimage.html

- -

examples/topics/scribbleplotter.html

- -

examples/topics/scrollbar.html

- -

examples/topics/sequential.html

- -

examples/topics/simpleparticlesystem.html

- -

examples/topics/smoke.html

- -

examples/topics/smokeparticlesystem.html

- -

examples/topics/softbody.html

- -

examples/topics/spore1.html

- -

examples/topics/spore2.html

- -

examples/topics/spring.html

- -

examples/topics/springs.html

- -

examples/topics/tickle.html

- -

examples/topics/tileimages.html

- -

examples/topics/tree.html

- -

examples/topics/wolfram.html

- -

examples/seneca/canvas properties/demo.pde

- -

examples/seneca/file and fragment loading (1818)/fafl.pde

- -

examples/seneca/focus (1089)/focusblur.pde

- -

examples/seneca/focus (1089)/pauseonblur.pde

- -

examples/seneca/fontcache (1741)/fontcache.pde

- -

examples/seneca/keyEvents (1042 1065)/bypass.pde

- -

examples/seneca/keyEvents (1042 1065)/keyevent.pde

- -

examples/seneca/keyEvents (1042 1065)/keypress.pde

- -

examples/seneca/keyEvents (1042 1065)/keypress2.pde

- -

examples/seneca/lazy loading (1186)/lorem.pde

- -

examples/seneca/loading (95)/a3.pde

- -

examples/seneca/loading (95)/c1.pde

- -

examples/seneca/loading (95)/c10.pde

- -

examples/seneca/loading (95)/c11.pde

- -

examples/seneca/loading (95)/c3.pde

- -

examples/seneca/loading (95)/c5.pde

- -

examples/seneca/loading (95)/c6.pde

- -

examples/seneca/loading (95)/c7.pde

- -

examples/seneca/loading (95)/c8.pde

- -

examples/seneca/loading (95)/c9.pde

- -

examples/seneca/log/test.pde

- -

examples/seneca/param/sketch.pde

- -

examples/seneca/Processing.reload/sketch1.pde

- -

examples/seneca/Processing.reload/sketch2.pde

- -

examples/seneca/Processing.reload/sketch3.pde

- -

examples/seneca/Processing.reload/sketch4.pde

- -

examples/seneca/Processing.reload/sketch5.pde

- -

examples/seneca/Processing.reload/sketch6.pde

- -

examples/seneca/arrayCopy/arrayCopy.pjs

- -

examples/seneca/begin-endShape/2d/774.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-lines/endShape-2dtest-lines.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-noclose/endShape-2dtest-noclose.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-nomod/endShape-2dtest-nomod.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-nomodnofill/endShape-2dtest-nomodnofill.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-points/endShape-2dtest-points.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-polygon/endShape-2dtest-polygon.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-quads/endShape-2dtest-quads.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-quadstrip/endShape-2dtest-quadstrip.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-trianglefan/endShape-2dtest-trianglefan.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-triangles/endShape-2dtest-triangles.pjs

- -

examples/seneca/begin-endShape/2d/endShape-2dtest-trianglestrip/endShape-2dtest-trianglestrip.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-lines/endShape-3dtest-lines.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-noclose/endShape-3dtest-noclose.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-nomod/endShape-3dtest-nomod.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-nomodnofill/endShape-3dtest-nomodnofill.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-points/endShape-3dtest-points.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-polygon/endShape-3dtest-polygon.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-quads/endShape-3dtest-quads.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-quadstrip/endShape-3dtest-quadstrip.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-trianglefan/endShape-3dtest-trianglefan.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-triangles/endShape-3dtest-triangles.pjs

- -

examples/seneca/begin-endShape/3d/endShape-3dtest-trianglestrip/endShape-3dtest-trianglestrip.pjs

- -

examples/seneca/bezier/bezier.pjs

- -

examples/seneca/bezier/bezier2.pjs

- -

examples/seneca/bezier3D/bezier.pjs

- -

examples/seneca/bezier3D/bezier2.pjs

- -

examples/seneca/bezier3D/jellyfish.pjs

- -

examples/seneca/bezierDetail/bezierDetail.pjs

- -

examples/seneca/bezierVertex/bezierVertex.pjs

- -

examples/seneca/bezierVertex/bezierVertex1.pjs

- -

examples/seneca/bezierVertex/bezierVertex2.pjs

- -

examples/seneca/bezierVertex3D/bezierVertex.pjs

- -

examples/seneca/bezierVertex3D/bezierVertex1.pjs

- -

examples/seneca/bezierVertex3D/bezierVertex2.pjs

- -

examples/seneca/blendColor/blendColor.pjs

- -

examples/seneca/bug1116/test.pjs

- -

examples/seneca/bug277/test1/test.pjs

- -

examples/seneca/bug277/test2/test.pjs

- -

examples/seneca/bug277/test3/test.pjs

- -

examples/seneca/bug277/test4/test.pjs

- -

examples/seneca/bug277/test5/test.pjs

- -

examples/seneca/bug277/test6/test.pjs

- -

examples/seneca/bug596/test1/test.pjs

- -

examples/seneca/bug596/test2/test.pjs

- -

examples/seneca/bug597/test1/test.pjs

- -

examples/seneca/bug597/test2/test.pjs

- -

examples/seneca/bug597/test3/test.pjs

- -

examples/seneca/bug597/test4/test.pjs

- -

examples/seneca/bug634/endShape-3dtest-lines/endShape-3dtest-lines.pjs

- -

examples/seneca/bug634/endShape-3dtest-noclose/endShape-3dtest-noclose.pjs

- -

examples/seneca/bug634/endShape-3dtest-nomod/endShape-3dtest-nomod.pjs

- -

examples/seneca/bug634/endShape-3dtest-nomodnofill/endShape-3dtest-nomod.pjs

- -

examples/seneca/bug634/endShape-3dtest-points/endShape-3dtest-points.pjs

- -

examples/seneca/bug634/endShape-3dtest-points_2/endShape-3dtest-points.pjs

- -

examples/seneca/bug634/endShape-3dtest-polygon/endShape-3dtest-polygon.pjs

- -

examples/seneca/bug634/endShape-3dtest-quads/endShape-3dtest-quads.pjs

- -

examples/seneca/bug634/endShape-3dtest-quadstrip/endShape-3dtest-quadstrip.pjs

- -

examples/seneca/bug634/endShape-3dtest-trianglefan/endShape-3dtest-trianglefan.pjs

- -

examples/seneca/bug634/endShape-3dtest-triangles/endShape-3dtest-triangles.pjs

- -

examples/seneca/bug634/endShape-3dtest-trianglestrip/endShape-3dtest-trianglestrip.pjs

- -

examples/seneca/bug634/test1/test.pjs

- -

examples/seneca/bug634/test2/test.pjs

- -

examples/seneca/bug634/test3/test.pjs

- -

examples/seneca/bug634/test4/test.pjs

- -

examples/seneca/bug634/test5/test.pjs

- -

examples/seneca/bug634/test6/test.pjs

- -

examples/seneca/bug634/test7/test.pjs

- -

examples/seneca/bug650/tests/noclose/noclose.pjs

- -

examples/seneca/bug650/tests/nomod/nomod.pjs

- -

examples/seneca/bug650/tests/polygon/polygon.pjs

- -

examples/seneca/bug650/tests/quad_strip/quad_strip.pjs

- -

examples/seneca/bug650/tests/quads/quads.pjs

- -

examples/seneca/bug650/tests/triangle_fan/triangle_fan.pjs

- -

examples/seneca/bug650/tests/triangle_strip/triangle_strip.pjs

- -

examples/seneca/bug650/tests/triangles/triangles.pjs

- -

examples/seneca/bug755/test.pjs

- -

examples/seneca/bug842/test.pjs

- -

examples/seneca/bug954/test.pjs

- -

examples/seneca/canvas_size/test1/canvas_size.pjs

- -

examples/seneca/conflictingNames/test.pjs

- -

examples/seneca/createGraphics3D/createGraphics2D-3D.pjs

- -

examples/seneca/createGraphics3D/createGraphics3D-2D.pjs

- -

examples/seneca/createGraphics3D/createGraphics3D-3D.pjs

- -

examples/seneca/createGraphics3D/createGraphics3D.pjs

- -

examples/seneca/cursor/cursorimg.pjs

- -

examples/seneca/curveVertex3D/curveVertex.pjs

- -

examples/seneca/customFonts/examples.pjs

- -

examples/seneca/ellipse3D/ellipse.pjs

- -

examples/seneca/ellipse3D/ellipseMode.pjs

- -

examples/seneca/hex/hex.pjs

- -

examples/seneca/imageCopy/imageCopy.pjs

- -

examples/seneca/keyCode/keyCode.pjs

- -

examples/seneca/line/line-3d.pjs

- -

examples/seneca/loadStrings/examples.pjs

- -

examples/seneca/long/long.pjs

- -

examples/seneca/mousePressed/mousePressed.pjs

- -

examples/seneca/mouseScroll/mousescroll.pjs

- -

examples/seneca/parseBoolean/parseBoolean.pjs

- -

examples/seneca/pimage/background.pjs

- -

examples/seneca/pimage/basetest.pjs

- -

examples/seneca/pimage/blend.pjs

- -

examples/seneca/pimage/copy.pjs

- -

examples/seneca/pimage/copyimg.pjs

- -

examples/seneca/pimage/filter.pjs

- -

examples/seneca/pimage/gradient.pjs

- -

examples/seneca/pimage/imagemode.pjs

- -

examples/seneca/pimage/loadimage.pjs

- -

examples/seneca/pimage/masktest.pjs

- -

examples/seneca/pimage/pimage.pjs

- -

examples/seneca/pimage/pimage0.pjs

- -

examples/seneca/pimage/pimage3d.pjs

- -

examples/seneca/pimage/pimageblend.pjs

- -

examples/seneca/pimage/pimagecopy.pjs

- -

examples/seneca/pimage/pimagefilter.pjs

- -

examples/seneca/pimage/pimagemask.pjs

- -

examples/seneca/pimage/pimagepreloader.pjs

- -

examples/seneca/pimage/pimageset.pjs

- -

examples/seneca/pimage/pixels.pjs

- -

examples/seneca/pimage/remoteimage.pjs

- -

examples/seneca/pimage/requestimage.pjs

- -

examples/seneca/pimage/resize.pjs

- -

examples/seneca/pimage/resizeloop.pjs

- -

examples/seneca/pimage/save.pjs

- -

examples/seneca/pimage/set.pjs

- -

examples/seneca/pimage/slideshow.pjs

- -

examples/seneca/pimage/spotlight.pjs

- -

examples/seneca/pimage/thumbnail.pjs

- -

examples/seneca/pimage/wormhole.pjs

- -

examples/seneca/point/demos/corban/point-3d.pjs

- -

examples/seneca/point/demos/psys/psys.pjs

- -

examples/seneca/point/demos/spiral/spiral.pjs

- -

examples/seneca/processingInstances/instance1.pjs

- -

examples/seneca/processingInstances/instance2.pjs

- -

examples/seneca/rect/demos/bird demo/bird.pjs

- -

examples/seneca/rect/demos/birds demo/birds.pjs

- -

examples/seneca/rect/demos/blinds/blinds.pjs

- -

examples/seneca/rect/tests/test1/rect.pjs

- -

examples/seneca/rect/tests/test2/rect.pjs

- -

examples/seneca/saveStrings/examples.pjs

- -

examples/seneca/screen/XandY/screenX.pjs

- -

examples/seneca/screen/XandY/screenXProjection.pjs

- -

examples/seneca/screen/XandY/screenY.pjs

- -

examples/seneca/sphere/sphere2.pjs

- -

examples/seneca/strokeWeight/strokeWeight.pjs

- -

examples/seneca/text3D/text-3d.pjs

- -

examples/seneca/textMode/textMode2D.pjs

- -

examples/seneca/textWidth/2d/tests/test.pjs

- -

examples/seneca/textWidth/3d/test/test.pjs

- -

examples/seneca/tint/tint.pjs

- -

examples/seneca/triangle/triangle-3d.pjs

- -

examples/seneca/trim/trim.pjs

- - - diff --git a/test/main.handlebars b/test/main.handlebars new file mode 100644 index 0000000..d74a0ee --- /dev/null +++ b/test/main.handlebars @@ -0,0 +1,12 @@ + + + + + Test Server + + + + {{{body}}} + + + \ No newline at end of file diff --git a/test/server.js b/test/server.js index 44d7ef8..6fb6ea0 100644 --- a/test/server.js +++ b/test/server.js @@ -4,27 +4,65 @@ */ var fs = require('fs') + , Canvas = require("canvas") + , path = require("path") , extname = require('path').extname - , jsdom = require('jsdom') , express = require('express') - , processing = require('../') - , app = express(); + , Processing = require('../') + , exphbs = require('express3-handlebars') + , app = express() + , morgan = require('morgan') + , serveIndex = require('serve-index') + , colors = require('colors/safe'); -app.use(express.logger('dev')); -app.use('/processing-js', express.static(__dirname + '/../deps/processing-js')); -app.use('/processing-js', express.directory(__dirname + '/../deps/processing-js')); +// Set Handlebars to use the test directory +app.engine('handlebars', exphbs({ + layoutsDir: __dirname, + defaultLayout: 'main' +})); +app.set('views', __dirname); +app.set('view engine', 'handlebars'); + +//Set up Logging +app.use(morgan('combined')); + +var pathToref = "../deps/processing-js/test/ref"; + +//pull in list of test to merge with template +var filedata = fs.readFileSync(path.join(__dirname, pathToref, 'tests.js'),'utf8'); +eval(filedata); + +selectedTests = new Array(); +for(var i = 0; i < tests.length; ++i) { + if(tests[i].tags.indexOf("2D") !== -1){ + selectedTests.push(tests[i]); + // if(i > 60){ + // break; + // } + } +} -process.on('uncaughtException', function(){}); app.get('/', function(req, res) { - res.sendfile(__dirname + '/index.html'); + res.render('home', {"tests" : selectedTests}); +}); + +//This needs to be global +loadImagePath = require("path").join(__dirname, '../deps/processing-js/test/ref/'); +process.on('uncaughtException', function(e){ + console.log(colors.red.underline(e)); }); + app.get('/test/:path(*)', function(req, res) { - var path = req.params.path - , file = '/../deps/processing-js/examples/' + path; - - fs.readFile(__dirname + file, function(err, data) { + var pdePath = req.params.path + , file = path.join(__dirname, pathToref, pdePath); + // console.log(file); + fs.readFile(file, {"encoding": "utf-8"}, function(err, data) { + if(err){ + console.log(err); + res.send(err); + } try { if ('.html' === extname(path)) { var document = jsdom.jsdom(data + '') @@ -38,14 +76,16 @@ app.get('/test/:path(*)', function(req, res) { p5.canvas.createPNGStream().pipe(res); }, 500); } else { - var p5 = processing.createInstance(__dirname + file); + var canvas = new Canvas(200,200); + var p5 = new Processing(canvas, data); setTimeout(function() { p5.noLoop(); - p5.canvas.createPNGStream().pipe(res); + canvas.createPNGStream().pipe(res); }, 500); } } catch (e) { + console.log(e); res.send(e); } }); diff --git a/testServer.png b/testServer.png new file mode 100644 index 0000000..57b6505 Binary files /dev/null and b/testServer.png differ