flash on 2013-9-15
/**
* Copyright novic.one ( http://wonderfl.net/user/novic.one )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/ewAB
*/
package {
import flash.geom.Point;
import flash.utils.Dictionary;
import flash.system.LoaderContext;
import flash.net.URLRequest;
import flash.display.*;
import flash.events.*;
import com.bit101.components.*;
public class FlashTest extends Sprite {
private var loader:Loader;
private var properties:Object = {
tlX : 0,
tlY : 0,
trX : 100,
trY : 0,
blX : 0,
blY : 100,
brX : 100,
brY : 100
};
private var labelsMap:Dictionary = new Dictionary();
private var slidersMap:Dictionary = new Dictionary();
private var shapeContainer:Sprite;
private var bmp:BitmapData;
public function FlashTest() {
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
addChild(shapeContainer = new Sprite());
shapeContainer.x = 120;
var vbox:VBox = new VBox(this);
var props:Array = [];
for (var pn:String in properties) {
props.push(pn);
}
props.sort();
for each (var propName:String in props) {
var label:Label = new Label(vbox);
label.text = propName;
var slider:Slider = new Slider("horizontal", vbox, 0, 0, onSliderValueChanged);
slider.minimum = 0;
slider.maximum = 100;
slider.value = properties[propName];
slidersMap[slider] = propName;
labelsMap[slider] = label;
}
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("http://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Znak_A-1.svg/110px-Znak_A-1.svg.png"), new LoaderContext(true));
}
private function onComplete(e:Event):void {
bmp = Bitmap(loader.content).bitmapData;
draw();
}
private function onSliderValueChanged(e:Event):void {
var slider:Slider = e.target as Slider;
properties[slidersMap[slider]] = slider.value;
draw();
}
private function updateLabels():void {
for (var s:* in slidersMap) {
var slider:Slider = s;
var label:Label = labelsMap[slider];
var propName:String = slidersMap[slider];
label.text = propName + " = " + (Math.round(slider.value * 100) / 100);
}
}
private function draw():void {
updateLabels();
const S:int = 6;
const tl:int = 0;
const tr:int = S - 1;
const bl:int = S * S - S;
const br:int = S * S - 1;
const step:Number = 1 / (S - 1);
var points:Vector.<Point> = new Vector.<Point>(S*S);
var uvt:Vector.<Number> = new Vector.<Number>(S*S);
points[tl] = getPoint("tl");
points[tr] = getPoint("tr");
points[bl] = getPoint("bl");
points[br] = getPoint("br");
var i:int, j:int;
var cs:Number;
for (i = 1; i < S - 1; i++) {
cs = 1 - i * step;
points[tl + i] = Point.interpolate(points[tl], points[tr], cs);
points[tr + i * S] = Point.interpolate(points[tr], points[br], cs);
points[i * S] = Point.interpolate(points[tl], points[bl], cs);
points[bl + i] = Point.interpolate(points[bl], points[br], cs);
}
for (i = 1; i < S - 1; i++) {
var lineStart:Point = points[tl + S * i];
var lineEnd:Point = points[tr + S * i];
cs = 1;
for (j = tl + S * i + 1; j < tr + S * i; j++) {
cs -= step;
points[j] = Point.interpolate(lineStart, lineEnd, cs);
}
}
for (i = 0; i < S; i++) {
for (j = 0; j < S; j++) {
var index:int = 2 * (i * S + j);
uvt[index] = step * j;
uvt[index + 1] = step * i;
}
}
var indices:Vector.<int> = new Vector.<int>();
for (i = 0; i < S * S - S; i += S) {
for (j = i; j < i + S - 1; j++) {
indices.push(j, j + 1, j + S);
indices.push(j + S, j + 1, j + S + 1);
}
}
var vertices:Vector.<Number> = new Vector.<Number>();
for each (var pt:Point in points) {
vertices.push(pt.x, pt.y);
}
shapeContainer.graphics.clear();
shapeContainer.graphics.lineStyle(1);
shapeContainer.graphics.beginBitmapFill(bmp);
shapeContainer.graphics.drawTriangles(vertices, indices, uvt);
}
private function getPoint(name:String):Point {
return new Point(properties[name + "X"], properties[name + "Y"]);
}
}
}