package { import alternativa.engine3d.controllers.SimpleObjectController; import alternativa.engine3d.core.Camera3D; import alternativa.engine3d.core.Object3D; import alternativa.engine3d.core.Resource; import alternativa.engine3d.core.View; import alternativa.engine3d.materials.TextureMaterial; import alternativa.engine3d.primitives.Box; import alternativa.engine3d.resources.BitmapTextureResource; import flash.display.Sprite; import flash.display.Stage3D; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; [SWF(frameRate = "60", width = "720", height = "480")] /** * Cube オブジェクトを配置したパフォーマンステスト。 * @author clockmaker.jp */ public class MolehillCubes extends Sprite { //---------------------------------------------------------- // // Static Property // //---------------------------------------------------------- private static const CELL_NUM:uint = 9; //---------------------------------------------------------- // // Constructor // //---------------------------------------------------------- public function MolehillCubes() { if (stage) addedToStageHanlder(); else addEventListener(Event.ADDED_TO_STAGE, addedToStageHanlder); } //---------------------------------------------------------- // // Property // //---------------------------------------------------------- [Embed(source = "/assets/image.png")] private var ImageCls:Class; private var boxContainer:Object3D; private var camera:Camera3D; private var scene:Object3D; private var stage3d:Stage3D; private var view:View; //---------------------------------------------------------- // // Function // //---------------------------------------------------------- private function addedToStageHanlder(event:Event = null):void { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage3d = stage.stage3Ds[0]; stage3d.addEventListener(Event.CONTEXT3D_CREATE, stage3D_context3DCreateHandler); stage3d.requestContext3D(); } private function stage3D_context3DCreateHandler(event:Event):void { // ビューポート作成 view = new View(720, 480, false, 0x0, 0, 0); this.addChild(view); // カメラ作成 camera = new Camera3D(1, int.MAX_VALUE); camera.view = view; var cameraController:SimpleObjectController = new SimpleObjectController(this, camera, 1); cameraController.setObjectPosXYZ(0, 0, -700); cameraController.lookAtXYZ(0, 0, 0); // 3Dシーン作成 scene = new Object3D(); scene.addChild(camera); // マテリアル作成 var material:TextureMaterial = new TextureMaterial(); material.diffuseMap = new BitmapTextureResource(new ImageCls().bitmapData) // Box boxContainer = new Object3D(); scene.addChild(boxContainer); for (var i:int = 0; i < CELL_NUM; i++) { for (var j:int = 0; j < CELL_NUM; j++) { for (var k:int = 0; k < CELL_NUM; k++) { var box:Box = new Box(30, 30, 30, 1, 1, 1, false); box.setMaterialToAllSurfaces(material); box.x = 60 * (i - CELL_NUM / 2); box.y = 60 * (j - CELL_NUM / 2); box.z = 60 * (k - CELL_NUM / 2); boxContainer.addChild(box); } } } // リソースへのアップロード for each (var resource:Resource in scene.getResources(true)) resource.upload(stage3d.context3D); // スタッツ表示 addChild(camera.diagram); this.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function enterFrameHandler(ev:Event):void { // オブジェクトのモーション boxContainer.rotationX += Math.PI / 180; boxContainer.rotationY += Math.PI / 180; // レンダリング camera.render(stage3d); } } }