blog

App3DDMFade.as

Stiahnuť 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();
        }
    }
}