package {
    import com.derschmale.slicedVolume.SlicedVolumeContainer;
    
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.ui.Keyboard;
    
    import net.hires.debug.Stats;
    
    /**
     * Volume Rendering based on view-aligned slice textures
     * 
     * @author David Lenaerts - http://www.derschmale.com
     */
    
    [SWF(width="500", height="500", frameRate="120", backgroundColor="0x000000")]
    public class SlicedVolumeRendering extends Sprite
    {
        private var _slicedVolumeHQ : SlicedVolumeContainer;
        private var _slicedVolumeLQ : SlicedVolumeContainer;
        
        [Embed(source="/../assets/bulldogscan_hq.png")]
        private var TextureHQ : Class;
        
        [Embed(source="/../assets/bulldogscan_lq.png")]
        private var TextureLQ : Class;
        
        private var _dragStartX : Number;
        private var _dragStartY : Number;
        
        public function SlicedVolumeRendering()
        {
            stage.quality = StageQuality.LOW;
            init();
        }
        
        /**
         * Initialize the view
         */
        private function init() : void
        {
            // Add Stats view by Mr. Doob (dõ_õb ?)!
            addChild(new Stats());
            
            // create sliced volume
            _slicedVolumeHQ = new SlicedVolumeContainer(new TextureHQ().bitmapData, 100);
            _slicedVolumeLQ = new SlicedVolumeContainer(new TextureLQ().bitmapData);
            _slicedVolumeLQ.x = _slicedVolumeHQ.x = stage.stageWidth*.5;
            _slicedVolumeLQ.y = _slicedVolumeHQ.y = stage.stageHeight*.5;
            _slicedVolumeHQ.scaleX = _slicedVolumeHQ.scaleY = 2;
            _slicedVolumeLQ.scaleX = _slicedVolumeLQ.scaleY = 4;
            
            // set lighting fall-off
            _slicedVolumeLQ.fallOffPower = _slicedVolumeHQ.fallOffPower = 2;
            _slicedVolumeLQ.visible = false;
            addChild(_slicedVolumeHQ);
            addChild(_slicedVolumeLQ);
            
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        }
        
        private function onMouseDown(event : MouseEvent) : void
        {
            // start drag
            _dragStartX = mouseX;
            _dragStartY = mouseY;
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            _slicedVolumeLQ.visible = true;
            _slicedVolumeHQ.visible = false;
        }
        
        private function onMouseUp(event : MouseEvent) : void
        {
            // stop drag
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            _slicedVolumeLQ.visible = false;
            _slicedVolumeHQ.visible = true;
            _slicedVolumeHQ.rotationX = _slicedVolumeLQ.rotationX;
            _slicedVolumeHQ.rotationY = _slicedVolumeLQ.rotationY;
            _slicedVolumeHQ.forceRender();
        }
        
        /**
         * Rotate object based on mouse drag
         */
        private function onEnterFrame(event : Event) : void
        {
            _slicedVolumeLQ.rotationY += (_dragStartX-mouseX)/50;
            _slicedVolumeLQ.rotationX -= (_dragStartY-mouseY)/50;
        }
    }
}