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.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();
}
}
}
}