var nopaint = (function(){ var is_paint = false controls.nopaint = {} controls.no = new Checkbox (nopaint_no_el) controls.no.use = function(state){ this.update(! nopaint.timeout) controls.paint.update(false) undo.undo() nopaint.play() } controls.paint = new Checkbox (nopaint_paint_el) controls.paint.use = function(state){ controls.no.update(false) nopaint.play() this.update(!! nopaint.timeout) } // use own stepwise clock to drive tweens oktween.raf = function(){} var nopaint = {} nopaint.delay = 100 nopaint.tool = null nopaint.tools = {} nopaint.step = 0 nopaint.time = 0 nopaint.timeout = false nopaint.undo = function(){ undo.undo() } nopaint.pause = function(){ clearTimeout(nopaint.timeout) nopaint.timeout = 0 nopaint.step = 0 } nopaint.play = function(){ nopaint.pause() nopaint.switch_tool() nopaint.go() } nopaint.go = function(){ nopaint.timeout = setTimeout(nopaint.go, nopaint.delay) oktween.update(nopaint.time) nopaint.tool.paint( nopaint.step ) nopaint.time += 1 nopaint.step += 1 } nopaint.switch_tool = function(){ undo.new() last_tool = nopaint.tool last_tool && last_tool.finish() nopaint.tool = nopaint.tools[ choice(Object.keys(nopaint.tools)) ] nopaint.tool.start( last_tool ) // console.log(nopaint.tool.type) } nopaint.add_tool = function(fn){ nopaint.tools[fn.type] = fn } var NopaintTool = Model({ type: "none", init: function(){}, start: function(){}, paint: function(t){}, finish: function(){}, }) var NopaintBrush = NopaintTool.extend({ type: "brush", is_brush: true, init: function(){ this.p = {x: 0, y: 0} this.fg = 0 this.bg = 1 this.char = " " this.tweens = [] }, start: function(last_brush){ this.reset( last_brush ) this.iterate( last_brush ) brush.load( this ) brush.generate() draw.down({}, null, [this.p.x, this.p.y]) }, paint: function(t){ this.update( t ) draw.move_toroidal({}, null, [this.p.x, this.p.y]) }, finish: function(){ this.tweens.forEach(function(t){ t.cancel() }) this.tweens = [] }, reorient: function(last_brush){ var a = {}, b if (last_brush) { this.p.x = a.x = randint(canvas.w) this.p.y = a.y = randint(canvas.h) } else { a.x = this.p.x a.y = this.p.y } b = this.get_next_point() var tween = oktween.add({ obj: this.p, from: a, to: b, duration: b.duration, easing: b.easing, update: function(o,dt){ // console.log(o,dt) }, finished: function(){ this.reorient() }.bind(this) }) this.tweens.push(tween) }, }) var easings = "linear circ_out circ_in circ_in_out quad_in quad_out quad_in_out".split(" ") var SolidBrush = NopaintBrush.extend({ type: "solid", get_next_point: function(){ var b = {} b.duration = randrange(1,7) b.easing = choice(easings) b.x = this.p.x + randrange(-10, 10) b.y = this.p.y + randrange(-10, 10) return b }, recolor: function(){ this.fg = this.bg = randint(16) this.char = " " }, reset: function(){ brush.resize(1,1) }, iterate: function( last_brush ){ this.reorient( last_brush ) this.recolor( last_brush ) }, update: function(t){ } }) nopaint.add_tool( new SolidBrush ) })()