spray-brush.js

total 0
used 0
limit 0
/* title: Spray categories: brush files: head point stage dragging pointlist mouse stroke ../point_src/random.js ../point_src/table.js --- On mouse down the _paint spray_ functionality plots many points near the mouse position, using the `random.within(point)` method. To make it efficient the stage doesn't _loop draw_ with a clearing layer. Instead the _drawOnce_ occurs after every mouse move without the clear. */ let keys = [ /* Random rotation per point every spray down */ 'randomPointRot' // : true /* If the randomPointRot is true*/ , 'randomPointRotMin' // : 0 , 'randomPointRotMax' // : 360 /* Random radius per point every spray down */ , 'randomPointRadius' // : true , 'randomPointRadiusMin' , 'randomPointRadiusMax' , 'randomPointColor' // : false , 'fillPointColor' // : false /* How many point to plot per spray down*/ , 'sprayDownMin' // : 5 , 'sprayDownMax' // : 20 , 'walkTicker' // : 100 /* resize the mouse based on its speed.*/ , 'speedMouse' // : true , 'speedMouseMin' , 'speedMouseMax' , 'minRandomColor' ] const confTable = new Table(keys, { 'a': [true, 0, 360, true, .1, 3, true, false, 2, 50, 10, true, 3, 50, 0] , 'b': [false, 0, 0, true, .1, 3, false, false, 5, 90, 50, false, 3, 50, 0] , 'c': [true, 0, 360, true, .1, 3, false, false, 2, 9, 5, true, 3, 50, 0] , 'd': [false, 0, 0, true, 1, 5, false, false, 2, 9, 50, false, 3, 50, 0] , 'e': [true, 0, 360, true, .1, 3, true, false, 2, 50, 100, false, 3, 50, 0] , 'f': [false, 0, 0, true, .1, 3, true, true, 2, 50, 900, true, 3, 50, 0] , 'g': [false, 0, 0, true, .1, 3, false, true, 2, 50, 900, true, 3, 50, 0] , 'h': [true, 0, 304, true, 10, 30, false, false, .1, .2, 1000, true, 3, 50, 0] , 'i': [false, 0, 0, true, .1, .7, false, true, 30, 90, 300, true, 1, 8, 90] },) // addControl('choice', { // field: 'select' // , options: confTable.getKeys() // , stage: this // , onchange(ev) { // let sval = ev.currentTarget.value // settings = confTable.get(sval) // } // }) confTable.controls.choice((ev) => { let sval = ev.currentTarget.value settings = confTable.get(sval) }) addButton('clear', { // label: 'my button' onclick(ev) { console.log('clear') stage.clear() } }); var settings = confTable.get('i') const _settings = { /* Random rotation per point every spray down */ randomPointRot: true /* If the randomPointRot is true*/ , randomPointRotMin: 0 , randomPointRotMax: 360 /* Random radius per point every spray down */ , randomPointRadius: true , randomPointRotMin: .1 , randomPointRotMax: 3 , randomPointColor: false /* How many point to plot per spray down*/ , sprayDownMin: 5 , sprayDownMax: 20 , walkTicker: 100 /* resize the mouse based on its speed.*/ , speedMouse: true } class MainStage extends Stage { // canvas = document.getElementById('playspace'); canvas = 'playspace' mounted(){ // this.dragging.add(...this.points) // this.events.wake() this.points = new PointList; this.mouse.point.radius = 30 this.clicker = 0 } maxDistance = 50 projectionSpread = .3 minSpeed = 20 onMousedown(ev) { let delta = Infinity if(this.mouseUpTime) { delta = +(new Date) - this.mouseUpTime } if(delta < 100) { /* mouse click buffer */ console.warn('fast click') } // console.log('start draw', delta) clearInterval(this.walkTicker) this.walkTicker = undefined this.clicker += 1 console.log(this.clicker % 2) this.drawingLine = true this.startLine(Point.from(ev)) } onMouseup(ev) { // console.log('stop draw') this.drawingLine = false this.stopLine(Point.from(ev)) this.mouseUpTime = +(new Date) } onMousemove(ev) { if(this.drawingLine) { this.tickFunc() } } startLine(point) { /* Start a line at a position*/ this.line = new PointList(point) this.walkTicker = setInterval(this.tickFunc.bind(this), settings.walkTicker) } stopLine(point) { this.line.push(point) clearInterval(this.walkTicker) this.walkTicker = undefined } tickFunc() { /* Tick event, if the distance is greater than the existing, add point.*/ let mp = this.mouse.point let l = this.points let last = l.last() let perform = true; if(settings.speedMouse) { mp.radius = clamp(this.mouse.speed(), settings.speedMouseMin, settings.speedMouseMax) } if(last) { last.lookAt(mp) if(mp.distanceTo(last) < this.maxDistance) { perform = false; } } if(perform){ // l.push(mp.copy()) // this.points.push(...this.brushAt(mp)) let rv = random.int(settings.sprayDownMin,settings.sprayDownMax) let sprayPoints = this.brushAt(mp, rv) this.drawOnce(sprayPoints) } } brushAt(mp, rv=random.int(5,20)){ let ps = new PointList() for (var i = rv - 1; i >= 0; i--) { let p = new Point(random.within(mp)) if(settings.randomPointRadius){ p.radius = random.float( settings.randomPointRadiusMin, settings.randomPointRadiusMax) } if(settings.randomPointRot){ p.rotation = random.int( settings.randomPointRotMin, settings.randomPointRotMax) } p.color = random.color() ps.push(p) } return ps } drawOnce(points, veryRandom=undefined){ // this.clear(ctx) let color = random.color let v = this.clicker % 2 let ri = ()=>random.int(settings.minRandomColor, 100) let rd = ()=>random.int(0, 360) color = ()=>`hsl(${rd()}deg ${ri()}% ${ri()}%)` if(veryRandom == undefined) { veryRandom = settings.randomPointColor } let conf = veryRandom? {color}: {color: color()} if(settings.fillPointColor){ points.pen.fill(this.ctx, conf.color) }else { points.pen.indicator(this.ctx, conf) } } } stage = MainStage.go({ loop: false })
Run
Meta Data
title Spray
imports ()
files ('head', 'point', 'stage', 'dragging', 'pointlist', 'mouse', 'stroke', '../point_src/random.js', '../point_src/table.js')
unused_keys ()
unknown_keys ('categories',)
categories ['brush']
filepath_exists True
path spray-brush.js
filepath spray-brush.js
clean_files ('../point_src/core/head.js', '../point_src/pointpen.js', '../point_src/compass.js', '../point_src/center.js', '../point_src/point-content.js', '../point_src/pointdraw.js', '../point_src/relative-xy.js', '../point_src/pointcast.js', '../point_src/point.js', '../point_src/stage-resize.js', '../point_src/functions/resolve.js', '../point_src/stage.js', '../point_src/functions/clamp.js', '../point_src/distances.js', '../point_src/protractor.js', '../point_src/text/beta.js', '../point_src/dragging.js', '../point_src/pointlistdraw.js', '../point_src/pointlistgradient.js', '../point_src/pointlistshape.js', '../point_src/pointlistgenerator.js', '../point_src/unpack.js', '../point_src/pointlist.js', '../point_src/pointlistpen.js', '../point_src/events.js', '../point_src/automouse.js', '../point_src/setunset.js', '../point_src/stroke.js', '../point_src/random.js', '../point_src/table.js')
markdown {'html': "<p>On mouse down the <em>paint spray</em> functionality plots many points near\nthe mouse position, using the <code>random.within(point)</code> method.</p>\n<p>To make it efficient the stage doesn't <em>loop draw</em> with a clearing layer. Instead\nthe <em>drawOnce</em> occurs after every mouse move without the clear.</p>", 'content': "title: Spray\ncategories: brush\nfiles:\n head\n point\n stage\n dragging\n pointlist\n mouse\n stroke\n ../point_src/random.js\n ../point_src/table.js\n---\n\nOn mouse down the _paint spray_ functionality plots many points near\nthe mouse position, using the `random.within(point)` method.\n\nTo make it efficient the stage doesn't _loop draw_ with a clearing layer. Instead\nthe _drawOnce_ occurs after every mouse move without the clear."}