| function MouseModifier(){} |
| extendPrototype([ShapeModifier],MouseModifier); |
| MouseModifier.prototype.processKeys = function(forceRender){ |
| if(this.elem.globalData.frameId === this.frameId && !forceRender){ |
| return; |
| } |
| this._mdf = true; |
| |
| }; |
| |
| MouseModifier.prototype.addShapeToModifier = function(){ |
| this.positions.push([]); |
| }; |
| |
| MouseModifier.prototype.processPath = function(path, mouseCoords, positions){ |
| var i, len = path.v.length; |
| var vValues = [],oValues = [],iValues = []; |
| var dist; |
| var theta, x,y; |
| //// OPTION A |
| for(i=0;i<len;i+=1){ |
| if(!positions.v[i]){ |
| positions.v[i] = [path.v[i][0],path.v[i][1]]; |
| positions.o[i] = [path.o[i][0],path.o[i][1]]; |
| positions.i[i] = [path.i[i][0],path.i[i][1]]; |
| positions.distV[i] = 0; |
| positions.distO[i] = 0; |
| positions.distI[i] = 0; |
| |
| } |
| theta = Math.atan2( |
| path.v[i][1] - mouseCoords[1], |
| path.v[i][0] - mouseCoords[0] |
| ); |
| |
| x = mouseCoords[0] - positions.v[i][0]; |
| y = mouseCoords[1] - positions.v[i][1]; |
| var distance = Math.sqrt( (x * x) + (y * y) ); |
| positions.distV[i] += (distance - positions.distV[i]) * this.data.dc; |
| |
| positions.v[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distV[i])/2 + (path.v[i][0]); |
| positions.v[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distV[i])/2 + (path.v[i][1]); |
| |
| |
| theta = Math.atan2( |
| path.o[i][1] - mouseCoords[1], |
| path.o[i][0] - mouseCoords[0] |
| ); |
| |
| x = mouseCoords[0] - positions.o[i][0]; |
| y = mouseCoords[1] - positions.o[i][1]; |
| var distance = Math.sqrt( (x * x) + (y * y) ); |
| positions.distO[i] += (distance - positions.distO[i]) * this.data.dc; |
| |
| positions.o[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distO[i])/2 + (path.o[i][0]); |
| positions.o[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distO[i])/2 + (path.o[i][1]); |
| |
| |
| theta = Math.atan2( |
| path.i[i][1] - mouseCoords[1], |
| path.i[i][0] - mouseCoords[0] |
| ); |
| |
| x = mouseCoords[0] - positions.i[i][0]; |
| y = mouseCoords[1] - positions.i[i][1]; |
| var distance = Math.sqrt( (x * x) + (y * y) ); |
| positions.distI[i] += (distance - positions.distI[i]) * this.data.dc; |
| |
| positions.i[i][0] = Math.cos(theta) * Math.max(0,this.data.maxDist-positions.distI[i])/2 + (path.i[i][0]); |
| positions.i[i][1] = Math.sin(theta) * Math.max(0,this.data.maxDist-positions.distI[i])/2 + (path.i[i][1]); |
| |
| /////OPTION 1 |
| vValues.push(positions.v[i]); |
| oValues.push(positions.o[i]); |
| iValues.push(positions.i[i]); |
| |
| |
| |
| /////OPTION 2 |
| //vValues.push(positions.v[i]); |
| // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]); |
| // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]); |
| |
| |
| |
| /////OPTION 3 |
| //vValues.push(positions.v[i]); |
| //iValues.push(path.i[i]); |
| //oValues.push(path.o[i]); |
| |
| |
| /////OPTION 4 |
| //vValues.push(path.v[i]); |
| //oValues.push(positions.o[i]); |
| //iValues.push(positions.i[i]); |
| } |
| |
| |
| |
| //// OPTION B |
| /*for(i=0;i<len;i+=1){ |
| if(!positions.v[i]){ |
| positions.v[i] = [path.v[i][0],path.v[i][1]]; |
| positions.o[i] = [path.o[i][0],path.o[i][1]]; |
| positions.i[i] = [path.i[i][0],path.i[i][1]]; |
| positions.distV[i] = 0; |
| |
| } |
| theta = Math.atan2( |
| positions.v[i][1] - mouseCoords[1], |
| positions.v[i][0] - mouseCoords[0] |
| ); |
| x = mouseCoords[0] - positions.v[i][0]; |
| y = mouseCoords[1] - positions.v[i][1]; |
| var distance = this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) ); |
| |
| positions.v[i][0] += Math.cos(theta) * distance + (path.v[i][0] - positions.v[i][0]) * this.data.dc; |
| positions.v[i][1] += Math.sin(theta) * distance + (path.v[i][1] - positions.v[i][1]) * this.data.dc; |
| |
| |
| theta = Math.atan2( |
| positions.o[i][1] - mouseCoords[1], |
| positions.o[i][0] - mouseCoords[0] |
| ); |
| x = mouseCoords[0] - positions.o[i][0]; |
| y = mouseCoords[1] - positions.o[i][1]; |
| var distance = this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) ); |
| |
| positions.o[i][0] += Math.cos(theta) * distance + (path.o[i][0] - positions.o[i][0]) * this.data.dc; |
| positions.o[i][1] += Math.sin(theta) * distance + (path.o[i][1] - positions.o[i][1]) * this.data.dc; |
| |
| |
| theta = Math.atan2( |
| positions.i[i][1] - mouseCoords[1], |
| positions.i[i][0] - mouseCoords[0] |
| ); |
| x = mouseCoords[0] - positions.i[i][0]; |
| y = mouseCoords[1] - positions.i[i][1]; |
| var distance = this.data.ss * this.data.mx / Math.sqrt( (x * x) + (y * y) ); |
| |
| positions.i[i][0] += Math.cos(theta) * distance + (path.i[i][0] - positions.i[i][0]) * this.data.dc; |
| positions.i[i][1] += Math.sin(theta) * distance + (path.i[i][1] - positions.i[i][1]) * this.data.dc; |
| |
| /////OPTION 1 |
| //vValues.push(positions.v[i]); |
| // oValues.push(positions.o[i]); |
| // iValues.push(positions.i[i]); |
| |
| |
| |
| /////OPTION 2 |
| //vValues.push(positions.v[i]); |
| // iValues.push([path.i[i][0]+(positions.v[i][0]-path.v[i][0]),path.i[i][1]+(positions.v[i][1]-path.v[i][1])]); |
| // oValues.push([path.o[i][0]+(positions.v[i][0]-path.v[i][0]),path.o[i][1]+(positions.v[i][1]-path.v[i][1])]); |
| |
| |
| |
| /////OPTION 3 |
| //vValues.push(positions.v[i]); |
| //iValues.push(path.i[i]); |
| //oValues.push(path.o[i]); |
| |
| |
| /////OPTION 4 |
| //vValues.push(path.v[i]); |
| // oValues.push(positions.o[i]); |
| // iValues.push(positions.i[i]); |
| }*/ |
| |
| |
| return { |
| v:vValues, |
| o:oValues, |
| i:iValues, |
| c:path.c |
| }; |
| } |
| |
| MouseModifier.prototype.processShapes = function(){ |
| var mouseX = this.elem.globalData.mouseX; |
| var mouseY = this.elem.globalData.mouseY; |
| var shapePaths; |
| var i, len = this.shapes.length; |
| var j, jLen; |
| |
| if(mouseX){ |
| var localMouseCoords = this.elem.globalToLocal([mouseX,mouseY,0]); |
| |
| var shapeData, newPaths = []; |
| for(i=0;i<len;i+=1){ |
| shapeData = this.shapes[i]; |
| if(!shapeData.shape._mdf && !this._mdf){ |
| shapeData.shape.paths = shapeData.last; |
| } else { |
| shapeData.shape._mdf = true; |
| shapePaths = shapeData.shape.paths; |
| jLen = shapePaths.length; |
| for(j=0;j<jLen;j+=1){ |
| if(!this.positions[i][j]){ |
| this.positions[i][j] = { |
| v:[], |
| o:[], |
| i:[], |
| distV:[], |
| distO:[], |
| distI:[] |
| }; |
| } |
| newPaths.push(this.processPath(shapePaths[j],localMouseCoords, this.positions[i][j])); |
| } |
| shapeData.shape.paths = newPaths; |
| shapeData.last = newPaths; |
| } |
| } |
| |
| } |
| |
| } |
| |
| MouseModifier.prototype.initModifierProperties = function(elem,data){ |
| this.getValue = this.processKeys; |
| this.data = data; |
| this.positions = []; |
| }; |
| |
| |
| |
| ShapeModifiers.registerModifier('ms',MouseModifier); |