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.SimpleDisplacerPV; [SWF(frameRate="30", backgroundColor="#FFFFFF")] public class App3DDMSimplePV 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:SimpleDisplacerPV; private var renderedRotationX:Number; private var renderedRotationY:Number; public function App3DDMSimplePV() { 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); 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; displacer = new SimpleDisplacerPV( stage.stageWidth, stage.stageHeight, Bitmap(imageLoader.content).bitmapData, Bitmap(mapLoader.content).bitmapData, data.image[index].@rotationXMax, data.image[index].@rotationYMax, data.image[index].@depth, data.image[index].@segmentsW, data.image[index].@segmentsH); 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(); } } }