blog
App3DDMAnaglyph.as
package
{
import flash.display.Bitmap;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import sk.yoz.displacing.AnaglyphDisplacer;
[SWF(frameRate="30", backgroundColor="#FFFFFF")]
public class App3DDMAnaglyph extends Sprite
{
private static const MAX_ROTATION_X:Number = 10;
private static const MAX_ROTATION_Y:Number = 10;
private var configLoader:URLLoader = new URLLoader();
private var imageLoader:Loader = new Loader();
private var mapLoader:Loader = new Loader();
private var shape:Sprite = new Sprite();
private var index:int = -1;
private var data:XML;
private var displacer:AnaglyphDisplacer;
public function App3DDMAnaglyph():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
shape.graphics.beginFill(0, 0);
shape.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
shape.graphics.endFill();
addChild(shape);
configLoader.load(new URLRequest(loaderInfo.parameters.config));
configLoader.addEventListener(Event.COMPLETE, onConfigComplete);
}
private function onConfigComplete(event:Event):void
{
data = XML(URLLoader(event.currentTarget).data);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
addEventListener(MouseEvent.CLICK, changeSource);
changeSource();
}
private function changeSource(... rest):void
{
index = index + 1 >= data.image.length() ? 0 : index + 1;
var image:XML = data.image[index];
var type:String = Event.COMPLETE;
var context:LoaderContext = new LoaderContext(true);
var imageRequest:URLRequest = new URLRequest(image.@source);
var mapRequest:URLRequest = new URLRequest(image.@map);
imageLoader && imageLoader.unload();
imageLoader.load(imageRequest, context);
imageLoader.contentLoaderInfo.addEventListener(type, onImageComplete);
mapLoader && mapLoader.unload();
mapLoader.load(mapRequest, context);
mapLoader.contentLoaderInfo.addEventListener(type, onImageComplete);
displacer && removeChild(displacer);
displacer = null;
}
private function onImageComplete(event:Event):void
{
if(!imageLoader.content || !mapLoader.content || displacer)
return;
var matrixLeft:Array;
var matrixRight:Array;
if(data.image[index].hasOwnProperty("matrices"))
{
var m:XML = data.image[index].matrices[0];
matrixLeft = [
Number(m.@l0), Number(m.@l1), Number(m.@l2),
Number(m.@l3), Number(m.@l4), Number(m.@l5),
Number(m.@l6), Number(m.@l7), Number(m.@l8)];
matrixRight = [
Number(m.@r0), Number(m.@r1), Number(m.@r2),
Number(m.@r3), Number(m.@r4), Number(m.@r5),
Number(m.@r6), Number(m.@r7), Number(m.@r8)];
}
var w:Number = stage.stageWidth / 2;
var h:Number = stage.stageHeight / 2;
displacer = new AnaglyphDisplacer(
Bitmap(imageLoader.content).bitmapData,
Bitmap(mapLoader.content).bitmapData,
data.image[index].@rotationXMax,
data.image[index].@rotationYMax,
data.image[index].@rotationXMultiplier,
data.image[index].@rotationYMultiplier,
data.image[index].@maxDistanceX,
data.image[index].@maxDistanceY,
data.image[index].@zBase,
matrixLeft, matrixRight);
displacer.x = w;
displacer.y = h;
addChild(displacer);
var projection:PerspectiveProjection = new PerspectiveProjection();
projection.projectionCenter = new Point(w, h);
displacer.transform.perspectiveProjection = projection;
}
private function onEnterFrame(event:Event):void
{
if(!imageLoader.content || !mapLoader.content || !displacer)
return;
var w:Number = stage.stageWidth / 2;
var h:Number = stage.stageHeight / 2;
var dx:Number = (mouseX - w) / w;
var dy:Number = (mouseY - h) / h;
displacer.rotX +=
(displacer.rotationXMax * dy - displacer.rotX) / 10;
displacer.rotY +=
(displacer.rotationYMax * -dx - displacer.rotY) / 10;
displacer.render();
}
}
}