blog

App3DDMAnaglyph.as

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