package {
 import flash.display.*;
 import flash.text.*;
 import flash.events.*;
 import flash.utils.getTimer;
 import flash.geom.Rectangle;

 import org.papervision3d.view.*;
 import org.papervision3d.cameras.Camera3D;
 import org.papervision3d.render.BasicRenderEngine;
 import org.papervision3d.scenes.Scene3D;
 import org.papervision3d.materials.*;
 import org.papervision3d.materials.utils.MaterialsList;
 import org.papervision3d.objects.*;
 import org.papervision3d.objects.primitives.*;
 import org.papervision3d.events.*;
 import org.papervision3d.materials.special.CompositeMaterial;

 import caurina.transitions.*;
 
 public class Main extends Sprite
 {
  private var viewport:Viewport3D;
  private var camera:Camera3D;
  private var scene:Scene3D;
  private var renderer:BasicRenderEngine;
  
  private var myCube:Cube;
  private var plane:Plane;
   
  public function Main()
  {
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.quality = StageQuality.HIGH;
   
   //PV3D初期設定
   init3D();
   //3Dオブジェクト追加
   init3D_Obj();
   //フレームレート表示設定
   iniFpsDisp();
   
   //キーイベントを追加
   stage.addEventListener(KeyboardEvent.KEY_DOWN,evKeyDown);
   //マウスイベントを追加
   stage.addEventListener(MouseEvent.MOUSE_DOWN,evMouseDown);
   stage.addEventListener(MouseEvent.MOUSE_UP,evMouseUp);
   stage.addEventListener(MouseEvent.MOUSE_MOVE,evMouseMove);
   //毎フレーム処理
   addEventListener(Event.ENTER_FRAME,handler );
  }
  
  //毎フレーム処理
  private function handler(event:Event):void
  {
   //フレームレートを表示
   disFps();
   //3Dレンダリング
   renderer.renderScene( scene , camera, viewport );
  }
  
  //====================■フレームレート表示■====================
  private var oldTimer:Number = getTimer();
  private var dispFps = new TextField;
private var myBitmapData:BitmapData
private var base:Sprite=new Sprite();
  private var line:Shape=new Shape();
  //フレームレート表示設定
  private function iniFpsDisp():void
  {
   myBitmapData = new BitmapData(60, 3, false, 0x000000);
   var myBitmapImage:Bitmap = new Bitmap(myBitmapData,"auto",true);
   myBitmapImage.x = 3;
   myBitmapImage.y = 18;
   stage.addChild(myBitmapImage);
   
   dispFps.textColor = 0xEEEEEE;
   addChild(dispFps);
  }
  //フレームレート情報を表示
  private function disFps():void
  {
   // 1フレームにかかった時間からfpsを計測
   var fps:Number = 1 / ((getTimer() - oldTimer) / 1000);
   // 小数点第1位に丸めてトレース
   oldTimer = getTimer();
   dispFps.text = "fps : " + (Math.round( fps )) + "/" + stage.frameRate;
   
   var rect : Rectangle = new Rectangle(0, 0, 60, 5);
   myBitmapData.fillRect(rect , 0x00000000);
   var line:Shape=new Shape();
   line.graphics.lineStyle(3,0xff0000);//線幅・線色
   line.graphics.moveTo(0,1);//始点のXY座標
   line.graphics.lineTo((fps / stage.frameRate) * 60 ,1);//終点のXY座標
   myBitmapData.draw(line);
  }
  //====================□フレームレート表示□====================
  
  //papervision3d初期設定
  private function init3D():void
  {
   viewport = new Viewport3D(550,400,true,true);
   viewport.opaqueBackground = 0x000000;
   //インタラクティブオブジェクトをオーバーした時にカーソルを指カーソルにする
   viewport.containerSprite.buttonMode = true;

   addChild(viewport);
   
   renderer = new BasicRenderEngine();
   
   camera = new Camera3D();
   camera.x = 0;
   camera.y = 0;
   camera.z = -300;
   //camera.focus = 8.660254037844389;
   //camera.zoom = 40;
   
   scene = new Scene3D();
   
  }
  
  //papervision3d初期設定
  function init3D_Obj():void
  {
   //マテリアルを作成
   var compoMat_r:CompositeMaterial = new CompositeMaterial();
   var compoMat_b:CompositeMaterial = new CompositeMaterial();
   var compoMat_g:CompositeMaterial = new CompositeMaterial();
   var compoMat_y:CompositeMaterial = new CompositeMaterial();
   var compoMat_p:CompositeMaterial = new CompositeMaterial();
   var compoMat_w:CompositeMaterial = new CompositeMaterial();
   
   var cl_material_r : ColorMaterial = new ColorMaterial( 0xff0000,0.5 );//赤色でべた塗り
   var cl_material_b : ColorMaterial = new ColorMaterial( 0x0000ff,0.3 );//青色でべた塗り
   var cl_material_g : ColorMaterial = new ColorMaterial( 0x00ff00,0.3 );//緑色でべた塗り
   var cl_material_y : ColorMaterial = new ColorMaterial( 0x00ffff,0.3 );//黄色でべた塗り
   var cl_material_p : ColorMaterial = new ColorMaterial( 0xff00ff,0.3 );//桃色でべた塗り
   var cl_material_w : ColorMaterial = new ColorMaterial( 0xffffff,0.3 );//白色でべた塗り
   
   var wireMat_r:WireframeMaterial = new WireframeMaterial( 0x0099cc );
   
   compoMat_r.addMaterial(wireMat_r);
   
   compoMat_r.addMaterial(cl_material_r);
   compoMat_b.addMaterial(cl_material_b);
   compoMat_g.addMaterial(cl_material_g);
   compoMat_y.addMaterial(cl_material_y);
   compoMat_p.addMaterial(cl_material_p);
   compoMat_w.addMaterial(cl_material_w);
   
   compoMat_r.doubleSided = true;
   compoMat_b.doubleSided = true;
   compoMat_g.doubleSided = true;
   compoMat_y.doubleSided = true;
   compoMat_p.doubleSided = true;
   compoMat_w.doubleSided = true;
   
   compoMat_r.interactive = true;
   //compoMat_b.interactive = true;
   //compoMat_g.interactive = true;
   //compoMat_y.interactive = true;
   //compoMat_p.interactive = true;
   //compoMat_w.interactive = true;
   
   //compoMat_r.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, myCubeClick_R);
   
   //マテリアルに対してのイベントは無効?
   //compoMat_r.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, myCubeClick);
   //compoMat_r.addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, evMouseMove);
   
   //マテリアルリストを作成
   var mList : MaterialsList = new MaterialsList( {
               front : compoMat_r ,
               back : compoMat_b ,
               right : compoMat_g ,
               left : compoMat_y,
               top : compoMat_w ,
               bottom : compoMat_p
               } );
   //立方体オブジェクトを作成
   myCube = new Cube(mList,100,100,100,8,8,8);
   myCube.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, myCubeClick);
   myCube.addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, myCubeMove);
   
   
   //オブジェクトを追加
   scene.addChild( myCube );
   
   
  }
  
  //赤い面をクリックすると拡大
  function myCubeClick(e):void{
   trace(e);
   if(camera.z == -300){
    camera.z = -200;
   }else{
    camera.z = -300;
   }
  }
  
  function myCubeMove(e):void{
   trace(e);
  }
  
  function nextAction():void{
   stage.quality = StageQuality.HIGH;
  }
  

  var xPos:Number = 0;
  var yPos:Number = 0;
  var eFlg:Boolean = false;
  var kFlg:Boolean = false;
  
  //キー入力イベントを作成
  function evKeyDown(event:KeyboardEvent){
   switch(event.keyCode){
    case 32: //↑が押された
     if(kFlg){
      kFlg = false;
     }else{
      kFlg = true;
     }
    break;
   }
   
   trace(event.keyCode);
  }
  
  //マウスダウン処理
  function evMouseDown(event:MouseEvent):void{
   eFlg = true;
   //stage.quality = StageQuality.LOW;
  }
  
  //マウスアップ処理
  function evMouseUp(event:MouseEvent):void{
   eFlg = false;
  }
  
  //マウスムーブ処理
  function evMouseMove(event:MouseEvent):void{
   if(eFlg){
    Tweener.addTween(myCube,{
         rotationY: myCube.rotationY - (mouseX - xPos) * 5,
         time:1,
         onComplete:nextAction
         });
    if(kFlg){
     //Xモード
     Tweener.addTween(myCube,{
          rotationX: myCube.rotationX - (mouseY - yPos) * 5,
          time:1,
          onComplete:nextAction
          });
    }else{
     //Zモード
     Tweener.addTween(myCube,{
          rotationZ: myCube.rotationZ - (mouseY - yPos) * 5,
          time:1,
          onComplete:nextAction
          });
    }
   }
   xPos = mouseX;
   yPos = mouseY;
  }
  
 }
}