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.SimpleDisplacer; [SWF(frameRate="30", backgroundColor="#FFFFFF")] public class App3DDMSimple 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:SimpleDisplacer; public function App3DDMSimple():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 w:Number = stage.stageWidth / 2; var h:Number = stage.stageHeight / 2; displacer = new SimpleDisplacer( Bitmap(imageLoader.content).bitmapData, Bitmap(mapLoader.content).bitmapData, data.image[index].@rotationXMax, data.image[index].@rotationYMax, data.image[index].@rotationXMultiplier, data.image[index].@rotationYMultiplier); 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(); } } }