package experiments.flexperiments.text3d {
    import away3d.containers.ObjectContainer3D;
    import away3d.containers.View3D;
    import away3d.core.math.Number3D;
    import away3d.materials.BitmapMaterial;
    
    import flash.display.BitmapData;
    import flash.text.TextField;
    import flash.text.TextFormat;
    
    import mx.controls.ComboBox;
    import mx.controls.TextInput;
    import mx.core.Application;
    import mx.core.UIComponent;
    import away3d.core.render.Renderer;
    import away3d.primitives.Plane;
    import flash.text.TextFieldType;
    import flash.events.Event;
    import flash.text.Font;
    import flash.display.StageAlign;
    import mx.events.FlexEvent;

    public class Text3dFXApp extends Application {
        
        public var input_txt:TextInput;
        public var font_cmb:ComboBox;
        public var awayholder_uic:UIComponent;
        
        private var _render_txt:TextField;
        
        private var _frontMaterial:BitmapMaterial;
        private var _backMaterial:BitmapMaterial;
        
        private var _center:Number3D = new Number3D(0,0,0);
        private var _text_bmd:BitmapData;
        private var _render_tf:TextFormat;
        
        private var _oldX:Number;
        private var _oldY:Number;
            
        public var view3d:View3D;
        public var planeContainer:ObjectContainer3D;
        
        [Bindable] public var fontList:Array;
    
        public function Text3dFXApp() {
            super();
            this.awayholder_uic = new UIComponent();
            
            this.fontList = Font.enumerateFonts(true);
            
            this._render_tf = new TextFormat();
            this._render_tf.align = "center";
            this._render_tf.size = 60;
            this.addEventListener(FlexEvent.APPLICATION_COMPLETE, init);
            
            
        }    
        
        public function init(event:FlexEvent):void {
            
            this.awayholder_uic.height = 200;
            this.awayholder_uic.width = 660;
            
            this.view3d = new View3D({    width:660,
                                        height:200,
                                        x: 330,
                                        y: 100,
                                        renderer:Renderer.INTERSECTING_OBJECTS});
                                        
            this.view3d.camera.z = -1000;
            this.view3d.camera.lookAt(this._center);
            
            
            this.planeContainer = new ObjectContainer3D();
            
            var plane:Plane;
            for(var i:int = 0; i < 10; i++) {
                plane = new Plane({    width:600,
                                    height:100,
                                    rotationX:90,
                                    segments:2,
                                    z: i*2});
                this.planeContainer.addChild(plane);
            }
            
            this._render_txt = new TextField();
            this._render_txt.width = 600;
            this._render_txt.height = 100;
            this._render_txt.type = TextFieldType.DYNAMIC;
            //this.render_txt.embedFonts = true;
            //this.render_txt.antiAliasType = AntiAliasType.ADVANCED;
            
            this.awayholder_uic.addChild(this.view3d);
            this.view3d.scene.addChild(this.planeContainer);
            this.addChild(this.awayholder_uic);
            
            this._render();    
            this.createBitmaps();
            this.addEventListener(Event.ENTER_FRAME, _enterFrame);
        }
        
        private function _render():void {
            this.view3d.render();
                trace("rendering");
        }
        
        public function createBitmaps(event:Event = null):void {
            this._render_txt.text = this.input_txt.text;
            this._render_tf.color = 0xabd607;
            this._render_tf.font = this.font_cmb.selectedItem.fontName;
            this._render_txt.setTextFormat(this._render_tf);
            this._text_bmd = new BitmapData(600,100, true, 0x000000);            
            this._text_bmd.draw(this._render_txt);
            this._frontMaterial = new BitmapMaterial(this._text_bmd, {smooth:true, debug:false});
            
            this._render_tf.color = 0xa0c807;
            this._render_txt.setTextFormat(this._render_tf);
            
            this._text_bmd = new BitmapData(600,100, true, 0x000000);            
            this._text_bmd.draw(this._render_txt);
            this._backMaterial = new BitmapMaterial(this._text_bmd, {smooth:true, debug:false});
            
            var c:int = 0;
            for each(var plane:Plane in this.planeContainer.children) {
                if(c == 0) {
                    plane.material = this._frontMaterial;
                    c++
                } else {
                    plane.material = this._backMaterial;    
                }
            }
            this._render();
        }
        
        private function _enterFrame(event:Event):void {
            if(this.mouseX != this._oldX || this.mouseY != this._oldY) {
                this._oldX = this.mouseX;
                this._oldY = this.mouseY;
                
                var ry:Number = this.mouseX / stage.stageWidth;
                var rx:Number = this.mouseY / stage.stageHeight;
                this.planeContainer.rotationX = (120 * rx) - 60;
                this.planeContainer.rotationY = -((90 * ry) - 45);
                this._render();
            }
        }
    }
}