diff --git a/sources/index.html b/sources/index.html index af236e7..e78e232 100644 --- a/sources/index.html +++ b/sources/index.html @@ -4,6 +4,7 @@ + diff --git a/sources/scripts/commander.js b/sources/scripts/commander.js index 2068fd8..758f8fa 100644 --- a/sources/scripts/commander.js +++ b/sources/scripts/commander.js @@ -12,10 +12,8 @@ function Commander() this.input_el.focus(); } - this.validate = function(query_str = ronin.commander.input_el.value) + this.validate = function(q = ronin.commander.query()) { - var q = new Query(query_str); - if(!ronin.modules[q.module]){ console.log("Unknown module",q.module); return; } // Update settings @@ -47,4 +45,19 @@ function Commander() { this.input_el.blur(); } + + this.active_module = function() + { + return this.query().module; + } + + this.inject = function(str,entry_code = "$") + { + ronin.commander.input_el.value = ronin.commander.input_el.value.replace(entry_code,str); + } + + this.query = function() + { + return new Query(ronin.commander.input_el.value); + } } \ No newline at end of file diff --git a/sources/scripts/cursor.js b/sources/scripts/cursor.js index 9844b13..7b07687 100644 --- a/sources/scripts/cursor.js +++ b/sources/scripts/cursor.js @@ -7,6 +7,7 @@ function Cursor(rune) { e.preventDefault(); + ronin.cursor.line.origin = {x:e.clientX,y:e.clientY}; ronin.cursor.line.from = {x:e.clientX,y:e.clientY}; } @@ -18,7 +19,10 @@ function Cursor(rune) ronin.cursor.line.to = {x:e.clientX,y:e.clientY}; - if(e.altKey){ + if(ronin.commander.active_module()){ + + } + else if(e.altKey){ ronin.eraser.stroke(ronin.cursor.line); } else{ @@ -32,7 +36,21 @@ function Cursor(rune) { e.preventDefault(); + ronin.cursor.line.destination = {x:e.clientX,y:e.clientY}; + + if(distance_between(ronin.cursor.line.origin,ronin.cursor.line.destination) > 10){ + ronin.commander.inject(e.clientX+"x"+e.clientY); + } + else{ + ronin.commander.inject(e.clientX+","+e.clientY); + } + ronin.cursor.is_down = false; ronin.cursor.line = {}; } + + function distance_between(a,b) + { + return Math.sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ); + } } \ No newline at end of file diff --git a/sources/scripts/modules/brush.js b/sources/scripts/modules/brush.js index 3a9f11b..f2f0884 100644 --- a/sources/scripts/modules/brush.js +++ b/sources/scripts/modules/brush.js @@ -2,7 +2,7 @@ function Brush() { Module.call(this,"brush"); - this.settings = {size:1,color:"#f00",opacity:1.0}; + this.settings = {size:4,color:"#000",opacity:1.0}; this.pointers = [ new Pointer({offset:{x:0,y:0}}), @@ -14,7 +14,7 @@ function Brush() this.ports.speed = 0; this.ports.distance = 0; - this.ports.red = 255; + this.ports.red = 0; this.ports.green = 0; this.ports.blue = 0; this.ports.alpha = 1; diff --git a/sources/scripts/modules/line.js b/sources/scripts/modules/line.js new file mode 100644 index 0000000..4cd8310 --- /dev/null +++ b/sources/scripts/modules/line.js @@ -0,0 +1,87 @@ +function Line() +{ + Module.call(this,"line"); + + this.settings = {steps:20}; + + this.methods = {}; + + this.methods.tween = function(q) + { + var from = parse_sequence(q.split(">>")[0]); + var to = parse_sequence(q.split(">>")[1]); + + var s = 0; + while(s < ronin.line.settings.steps){ + var progress = s/parseFloat(ronin.line.settings.steps); + var new_positions = tween_positions(from,to,progress); + ronin.line.stroke_multi(new_positions); + s += 1; + } + } + + this.stroke_multi = function(coordinates) + { + var from = coordinates[0]; + for(pos_id in coordinates){ + var pos = coordinates[pos_id]; + ronin.line.stroke(from,pos); + from = pos; + } + } + + this.stroke = function(from,to) + { + var ctx = ronin.render.context(); + + ctx.beginPath(); + ctx.globalCompositeOperation="source-over"; + ctx.moveTo((from.x * 2),(from.y * 2)); + ctx.lineTo((to.x * 2),(to.y * 2)); + ctx.lineCap="round"; + ctx.lineWidth = 4; + ctx.strokeStyle = "#000"; + ctx.stroke(); + ctx.closePath(); + } + + function parse_sequence(seq_str) + { + var a = []; + + var parts = seq_str.split("&"); + for(part_id in parts){ + var part = parts[part_id]; + a.push(parse_unit(part)); + } + return a; + } + + function parse_unit(unit_str) + { + if(unit_str.indexOf(",") > -1){ + return {x:parseInt(unit_str.split(",")[0]),y:parseInt(unit_str.split(",")[1])}; + } + if(unit_str.indexOf("x") > -1){ + return {width:parseInt(unit_str.split("x")[0]),height:parseInt(unit_str.split("x")[1])}; + } + } + + function tween_positions(froms,tos,progress) + { + var a = []; + for(pos_id in froms){ + var from = froms[pos_id]; + var to = tos[pos_id]; + a.push(tween_position(from,to,progress)); + } + + return a; + } + + function tween_position(from,to,progress) + { + var offset = {x:to.x - from.x,y:to.y - from.y}; + return {x:from.x + offset.x * progress,y:from.y + offset.y * progress}; + } +} \ No newline at end of file diff --git a/sources/scripts/ronin.js b/sources/scripts/ronin.js index c80a66d..4884c0c 100644 --- a/sources/scripts/ronin.js +++ b/sources/scripts/ronin.js @@ -14,11 +14,13 @@ function Ronin() this.brush = new Brush(); this.eraser = new Eraser(); this.frame = new Frame(); + this.line = new Line(); this.modules = { brush : this.brush, eraser : this.eraser, frame : this.frame, + line : this.line, }; this.install = function() @@ -46,5 +48,7 @@ function Ronin() console.log("Ronin","Started"); this.render.update(); this.grid.update(); + + this.commander.input_el.value = "line tween:$&$&$>>$&$&$" } } \ No newline at end of file