github.com/atsaki/terraform@v0.4.3-0.20150919165407-25bba5967654/website/source/assets/javascripts/app/Engine.Shape.Puller.js (about) 1 (function( 2 Engine, 3 Point, 4 Polygon, 5 Vector 6 ){ 7 8 Engine.Shape.Puller = function(width, height, json){ 9 var i, ref, point, poly; 10 11 this.pos = new Vector(0, 0); 12 this.size = new Vector(width, height); 13 this.heightRatio = json.data.width / json.data.height; 14 this.widthRatio = json.data.ar; 15 16 this.resize(width, height, true); 17 18 ref = {}; 19 this.points = []; 20 this.polygons = []; 21 22 for (i = 0; i < json.points.length; i++) { 23 point = new Point( 24 json.points[i].id, 25 json.points[i].x, 26 json.points[i].y, 27 this.size 28 ); 29 ref[point.id] = point; 30 this.points.push(point); 31 } 32 33 for (i = 0; i < json.polygons.length; i++) { 34 poly = json.polygons[i]; 35 this.polygons.push(new Polygon( 36 ref[poly.points[0]], 37 ref[poly.points[1]], 38 ref[poly.points[2]], 39 poly.color 40 )); 41 this.polygons[this.polygons.length - 1].noFill = true; 42 } 43 44 this.ref = undefined; 45 }; 46 47 Engine.Shape.Puller.prototype = { 48 49 alpha: 0, 50 51 sizeOffset: 100, 52 53 resize: function(width, height, sizeOnly){ 54 var len, p, newWidth, newHeight; 55 56 newHeight = height + this.sizeOffset; 57 newWidth = this.size.y * this.heightRatio; 58 59 if (newWidth < width) { 60 newWidth = width + this.sizeOffset; 61 newHeight = newWidth * this.widthRatio; 62 } 63 64 this.size.y = newHeight; 65 this.size.x = newWidth; 66 67 this.pos.x = -(newWidth / 2); 68 this.pos.y = -(newHeight / 2); 69 70 if (sizeOnly) { 71 return this; 72 } 73 74 for (p = 0, len = this.points.length; p < len; p++) { 75 this.points[p].resize(); 76 } 77 }, 78 79 update: function(engine){ 80 var p; 81 82 for (p = 0; p < this.points.length; p++) { 83 this.points[p].update(engine); 84 } 85 86 if (this.alpha < 1) { 87 this.alpha = Math.min(this.alpha + 2 * engine.tick, 1); 88 } 89 90 return this; 91 }, 92 93 draw: function(ctx, scale, engine){ 94 var p, poly; 95 96 ctx.translate( 97 this.pos.x * scale >> 0, 98 this.pos.y * scale >> 0 99 ); 100 101 if (this.alpha < 1) { 102 ctx.globalAlpha = this.alpha; 103 } 104 105 ctx.beginPath(); 106 for (p = 0; p < this.polygons.length; p++) { 107 poly = this.polygons[p]; 108 ctx.moveTo( 109 poly.a.pos.x * scale >> 0, 110 poly.a.pos.y * scale >> 0 111 ); 112 ctx.lineTo( 113 poly.b.pos.x * scale >> 0, 114 poly.b.pos.y * scale >> 0 115 ); 116 ctx.lineTo( 117 poly.c.pos.x * scale >> 0, 118 poly.c.pos.y * scale >> 0 119 ); 120 ctx.lineTo( 121 poly.a.pos.x * scale >> 0, 122 poly.a.pos.y * scale >> 0 123 ); 124 } 125 ctx.closePath(); 126 ctx.lineWidth = 0.4 * scale; 127 ctx.strokeStyle = 'rgba(108,0,243,0.15)'; 128 ctx.stroke(); 129 130 if (this.alpha < 1) { 131 ctx.globalAlpha = 1; 132 } 133 134 for (p = 0; p < this.points.length; p++) { 135 this.points[p].draw(ctx, scale); 136 } 137 138 ctx.beginPath(); 139 for (p = 0; p < this.polygons.length; p++) { 140 if (this.polygons[p].checkChasing()) { 141 poly = this.polygons[p]; 142 ctx.moveTo( 143 poly.a.pos.x * scale >> 0, 144 poly.a.pos.y * scale >> 0 145 ); 146 ctx.lineTo( 147 poly.b.pos.x * scale >> 0, 148 poly.b.pos.y * scale >> 0 149 ); 150 ctx.lineTo( 151 poly.c.pos.x * scale >> 0, 152 poly.c.pos.y * scale >> 0 153 ); 154 ctx.lineTo( 155 poly.a.pos.x * scale >> 0, 156 poly.a.pos.y * scale >> 0 157 ); 158 } 159 } 160 ctx.closePath(); 161 ctx.fillStyle = 'rgba(108,0,243,0.05)'; 162 ctx.fill(); 163 164 ctx.setTransform(1, 0, 0, 1, 0, 0); 165 ctx.translate( 166 engine.width / 2 * engine.scale >> 0, 167 engine.height / 2 * engine.scale >> 0 168 ); 169 return this; 170 } 171 172 }; 173 174 })( 175 window.Engine, 176 window.Engine.Point.Puller, 177 window.Engine.Polygon.Puller, 178 window.Vector 179 );