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;
}
}
}