package
{
    import away3d.cameras.HoverCamera3D;
    import away3d.containers.*;
    import away3d.core.base.*;
    import away3d.core.light.*;
    import away3d.core.math.*;
    import away3d.events.*;
    import away3d.materials.*;
    import away3d.primitives.*;
    
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.display.Stage;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    [SWF(width="500", height="400", frameRate="30", backgroundColor="#EEEEEE")]
    public class cmyk extends Sprite
    {
        private var View:View3D;
        private var swfStage:Stage;
        private var cover:Cover;
        private var waitFourFrames:Number = 0;
        
        // HoverCam controls
        private var camera:HoverCamera3D;
        private var lastMouseX:Number;
        private var lastMouseY:Number;
        private var lastPanAngle:Number;
        private var lastTiltAngle:Number;
        private var move:Boolean = false;
        
        // Embedded images
        [Embed (source="C.png")]
        private var cTex:Class;
        [Embed (source="M.png")]
        private var mTex:Class;
        [Embed (source="Y.png")]
        private var yTex:Class;
        [Embed (source="K.png")]
        private var kTex:Class;
        
        public function cmyk()
        {
            super();
            // prep for handling resizing events
            swfStage = this.stage;
            swfStage.scaleMode = StageScaleMode.NO_SCALE;
            swfStage.align = StageAlign.TOP;
            
            // create a 3D-viewport
            camera = new HoverCamera3D({zoom:18, focus:2000, distance:18000});
            View = new View3D({camera:camera,x:250, y:200});
            // add viewport to the stage
            addChild(View);
            camera.lookAt( new Number3D(0, 0, 0) );
            camera.targetpanangle = camera.panangle = 0;
            camera.targettiltangle = camera.tiltangle = 0;
            
            // Add some reference objects
            var cPlane:Plane = new Plane({material:cTex,width:200,height:130,bothsides:true,z:0,ownCanvas:true});
            cPlane.rotationX = 90;
            cPlane.rotationY = 180;
            cPlane.blendMode = BlendMode.MULTIPLY;
            View.scene.addChild(cPlane);
            
            var mPlane:Plane = new Plane({material:mTex,width:200,height:130,bothsides:true,z:-50,ownCanvas:true});
            mPlane.rotationX = 90;
            mPlane.rotationY = 180;
            mPlane.blendMode = BlendMode.MULTIPLY;
            View.scene.addChild(mPlane);
            
            var yPlane:Plane = new Plane({material:yTex,width:200,height:130,bothsides:true,z:-100,ownCanvas:true});
            yPlane.rotationX = 90;
            yPlane.rotationY = 180;
            yPlane.blendMode = BlendMode.MULTIPLY;
            View.scene.addChild(yPlane);
            
            var kPlane:Plane = new Plane({material:kTex,width:200,height:130,bothsides:true,z:-150,ownCanvas:true});
            kPlane.rotationX = 90;
            kPlane.rotationY = 180;
            kPlane.blendMode = BlendMode.MULTIPLY;
            View.scene.addChild(kPlane);
            
            // A final white plane is required as well
            var wPlane:Plane = new Plane({material:"white#white",width:200,height:130,bothsides:true,z:-200});
            wPlane.rotationX = 90;
            View.scene.addChild(wPlane);
            
            // Update view
            View.render();
            camera.hover();
            
            // only run when user is hovering
            cover = new Cover(this,800,600,"At the roulette in Monte Carlo (1892), The Munch Museum, Oslo\nClick and drag to see the color separation");
            addEventListener(Event.ENTER_FRAME, onEnterFrame);
            this.stage.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
            this.stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);
        }
        
        private function onEnterFrame(e:Event):void
        {
            if(!cover.visible || waitFourFrames < 4)
            {
                // rerender viewport
                var cameraSpeed:Number = 0.3; // Approximately same speed as mouse movement.
                if (move) {
                    camera.targetpanangle = cameraSpeed*(stage.mouseX - lastMouseX) + lastPanAngle;
                    camera.targettiltangle = cameraSpeed*(stage.mouseY - lastMouseY) + lastTiltAngle;
                }
                camera.hover();
                View.render();
                waitFourFrames++;
                if(waitFourFrames == 4){
                    cover.refresh();
                    addChild(cover);
                }
                
            }
        }
        
        private function MouseDown(event:MouseEvent):void
        {
            lastPanAngle = camera.targetpanangle;
            lastTiltAngle = camera.targettiltangle;
            lastMouseX = stage.mouseX;
            lastMouseY = stage.mouseY;
            move = true;
        }
        
        private function MouseUp(event:MouseEvent):void
        {
            move = false;
        }
        
    }
}