blog
App3DDMFade.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.FadeDisplacer;
[SWF(frameRate="30", backgroundColor="#FFFFFF")]
public class App3DDMFade 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 fadeLoader:Loader = new Loader();
private var shape:Sprite = new Sprite();
private var index:int = -1;
private var data:XML;
private var displacer:FadeDisplacer;
public function App3DDMFade():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);
var fadeRequest:URLRequest = new URLRequest(image.@fade);
imageLoader && imageLoader.unload();
imageLoader.load(imageRequest, context);
imageLoader.contentLoaderInfo.addEventListener(type, onImageComplete);
mapLoader && mapLoader.unload();
mapLoader.load(mapRequest, context);
mapLoader.contentLoaderInfo.addEventListener(type, onImageComplete);
fadeLoader && fadeLoader.unload();
fadeLoader.load(fadeRequest, context);
fadeLoader.contentLoaderInfo.addEventListener(type, onImageComplete);
displacer && removeChild(displacer);
displacer = null;
}
private function onImageComplete(event:Event):void
{
if(!imageLoader.content || !mapLoader.content
|| !fadeLoader.content || displacer)
return;
var w:Number = stage.stageWidth / 2;
var h:Number = stage.stageHeight / 2;
displacer = new FadeDisplacer(
Bitmap(imageLoader.content).bitmapData,
Bitmap(mapLoader.content).bitmapData,
Bitmap(fadeLoader.content).bitmapData,
data.image[index].@rotationXMax,
data.image[index].@rotationYMax,
data.image[index].@rotationXMultiplier,
data.image[index].@rotationYMultiplier,
data.image[index].@fadeNear,
data.image[index].@fadeDistant);
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
|| !fadeLoader.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();
}
}
}