package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageDisplayState;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import org.papervision3d.cameras.DebugCamera3D;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
[SWF(frameRate="31", backgroundColor="0xffffff")]
public class DebugCamera3DTest extends Sprite
{
private var viewport:Viewport3D;
private var renderer:BasicRenderEngine;
private var scene:Scene3D;
private var camera:DebugCamera3D;
private var fsbot:TextField;
private var text:TextField;
private var fullscreen:Boolean = false;
public function DebugCamera3DTest()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
Init3D();
CreateFullScreenControl();
CreateCameraControlText();
stage.addEventListener(Event.RESIZE, ControlResize);
ControlResize();
}
private function CreateFullScreenControl():void
{
fsbot = new TextField;
fsbot.text = "FullSreen";
fsbot.textColor = 0xffffff;
fsbot.selectable = false;
fsbot.background = true;
fsbot.backgroundColor = 0x000000;
fsbot.autoSize = TextFieldAutoSize.RIGHT;
var format:TextFormat = new TextFormat("_sans", 9);
fsbot.setTextFormat(format);
fsbot.addEventListener(MouseEvent.CLICK, ShowFullScreen);
addChild(fsbot);
}
private function CreateCameraControlText():void
{
var html:String = "
Presiona y arrastra el ratón.
Las teclas para controlar
la cámara son las siguientes:
";
html += "w = forward
";
html += "s = backward
";
html += "a = left
";
html += "d = right
";
html += "q = rotationZ--
";
html += "e = rotationZ++
";
html += "r = fov++
";
html += "f = fov--
";
html += "t = near++
";
html += "g = near--
";
html += "y = far++
";
html += "h = far--
";
text = new TextField;
text.alpha = .5;
text.multiline = true;
text.htmlText = html;
text.textColor = 0xffffff;
text.selectable = false;
text.background = true;
text.backgroundColor = 0x000000;
text.autoSize = TextFieldAutoSize.LEFT;
text.width = 120;
var format:TextFormat = new TextFormat("_sans", 9);
text.setTextFormat(format);
addChild(text);
}
private function ControlResize(e:Event = null):void
{
fsbot.y = 0;
fsbot.x = stage.stageWidth - fsbot.width;
text.y = stage.stageHeight - text.height;
text.x = stage.stageWidth - text.width;
}
private function ShowFullScreen(e:Event):void
{
if(fullscreen)
{
stage.displayState = StageDisplayState.NORMAL;
fullscreen = false;
}else
{
stage.displayState = StageDisplayState.FULL_SCREEN;
fullscreen = true;
}
}
private function Init3D():void
{
viewport = new Viewport3D(500, 350, true, true);
addChild(viewport);
renderer = new BasicRenderEngine;
scene = new Scene3D;
camera = new DebugCamera3D(viewport, 90, 10, 10000);
camera.propsDisplay.alpha = 0.5;
// evita que los objetos de la escena desaparezcan al salirse del la vista frustum
//camera.useFrustumCulling = false;
CreateObjects();
addEventListener(Event.ENTER_FRAME, Loop3D);
}
private function CreateObjects():void
{
var mat:WireframeMaterial = new WireframeMaterial;
mat.doubleSided = true;
var materialList:MaterialsList = new MaterialsList;
materialList.addMaterial(mat, "all");
// coloca varios cubos repartidos aleatoreamente por la escena
for( var i:int = 0; i < 20; i++)
{
var cube:Cube = new Cube(materialList, 500, 500, 500, 2, 2, 2);
cube.x = Float(-6000, 6000);
cube.y = Float(-6000, 6000);
cube.z = Float(500, 5000);
scene.addChild(cube);
}
}
private function Loop3D(event:Event):void
{
renderer.renderScene(scene, camera, viewport);
}
private function Float(min:Number,max:Number=NaN):Number {
if (isNaN(max)) { max = min; min=0; }
return Random()*(max-min)+min;
}
private function Random():Number {
return Math.random();
}
}
}