blog
App3DDMFadePV.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.net.URLLoader;
import flash.net.URLRequest;
import flash.system.LoaderContext;
import sk.yoz.displacing.FadeDisplacerPV;
[SWF(frameRate="30", backgroundColor="#FFFFFF")]
public class App3DDMFadePV 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:FadeDisplacerPV;
private var renderedRotationX:Number;
private var renderedRotationY:Number;
public function App3DDMFadePV()
{
super();
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;
displacer = new FadeDisplacerPV(
stage.stageWidth, stage.stageHeight,
Bitmap(imageLoader.content).bitmapData,
Bitmap(mapLoader.content).bitmapData,
Bitmap(fadeLoader.content).bitmapData,
data.image[index].@rotationXMax,
data.image[index].@rotationYMax,
data.image[index].@depth,
data.image[index].@segmentsW,
data.image[index].@segmentsH,
data.image[index].@fadeNear,
data.image[index].@fadeDistant);
addChild(displacer);
}
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;
var rx:Number = Math.round(displacer.rotX * 40);
var ry:Number = Math.round(displacer.rotY * 40);
if(renderedRotationX == rx && renderedRotationY == ry)
return;
renderedRotationX = rx;
renderedRotationY = ry;
displacer.render();
}
}
}