package {
    
    /**
     * 
     * Auteur: Vincent Helwig
     * Date: 25.09.2008
     * Website: http://www.tsoin.com
     * Description: Alternativa3D - Création d’un cube
     * 
     **/
    
    import alternativa.engine3d.controllers.CameraController;
    import alternativa.engine3d.core.Camera3D;
    import alternativa.engine3d.core.Object3D;
    import alternativa.engine3d.core.Scene3D;
    import alternativa.engine3d.display.View;
    import alternativa.engine3d.materials.WireMaterial;
    import alternativa.engine3d.primitives.Box;
    import alternativa.utils.FPS;
    
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    
    [SWF(backgroundColor="#000000", frameRate="100", width="600", height="400")]

    public class Alternativa3D_002 extends Sprite    {
        
        private var scene:Scene3D;
        private var view:View;
        private var camera:Camera3D;
        private var cameraController:CameraController;
        private var box:Box;
        
        private var _numFaces:uint = 3;
        
        public function Alternativa3D_002()    {
            addEventListener(Event.ADDED_TO_STAGE, init);
        }

        public function init(e:Event): void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            
            setupScene();

            stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        }
        
        private function setupScene():void {
            
            scene = new Scene3D();
            scene.root = new Object3D();
            
            camera = new Camera3D();
            camera.x = 0;
            camera.y = 0;
            camera.z = -300;
            camera.zoom = 10;
            camera.fov = 1.5;
            scene.root.addChild(camera);
            
            view = new View();
            view.width = 600;
            view.height = 400;
            addChild(view);
            view.camera = camera;
            
            createBox();

            cameraController = new CameraController(stage);
            cameraController.camera = camera;
            
            FPS.init(stage);
        }
        
        private function onMouseMove(event:Event):void {
            box.rotationX = Math.PI * ( ( stage.mouseY * 180 ) / stage.stageHeight - 90 ) / 180;
            box.rotationY = Math.PI * ( ( stage.mouseX * 180 ) / stage.stageWidth - 90 ) / 180;
        }
        
        private function createBox():void {
            box = new Box(100, 100, 100, _numFaces, _numFaces, _numFaces);
            box.cloneMaterialToAllSurfaces(new WireMaterial(1, 0x789789));
            scene.root.addChild( box );
        }
        
        private function onKeyDown(event:KeyboardEvent):void {
            if ( event.keyCode == 107 || event.keyCode == 187 ) {
                _numFaces++;
            } else if ( ( event.keyCode == 109 || event.keyCode == 54) && _numFaces != 1 ) {
                _numFaces--;
            }
            if ( box.parent != null) { scene.root.removeChild( box ); }
            createBox();
        }
        
        private function onEnterFrame(event:Event):void {
            cameraController.processInput();
            scene.calculate();
        }
        
    }
}