flash on 2011-5-24

by tepe
♥0 | Line 94 | Modified 2011-05-25 10:46:06 | MIT License
play

ActionScript3 source code

/**
 * Copyright tepe ( http://wonderfl.net/user/tepe )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/rEIC
 */

package {
    import flash.events.*;
    import flash.filters.*;
    import flash.utils.*;
    import flash.net.*;
    import flash.display.*;
    import flash.events.Event;
    import flash.utils.ByteArray;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.view.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.utils.MaterialsList;
    import mx.utils.Base64Decoder;
    
    import org.papervision3d.core.effects.view.*;
    import org.papervision3d.lights.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.shadematerials.*;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.objects.primitives.*;
    
    
    
    public class Reflect extends ReflectionView {
        
        // 画像を BASE64 エンコードしたもの
        private static var ImageBase64:String = "R0lGODlhEAAQAJkAAOdfEwAAAPDQsAAAACH5BAAAAAAALAAAAAAQABAAAAI2hI4XhgYPXxBxxkqhvTJ33i0fuATm4l1TsnEt8GIymZ5uCiviqFG6ictBEDGhCmeCnZKCZbIAADs=";
        private var cube:Cube;
        private var field:Plane;
        private var mat01:BitmapMaterial;
        
        private function loadComplete(bmd:BitmapData):void{
            var block:Cube;
            // 表示するテクスチャを右上に表示
            //addChild(new Bitmap(bmd));
    
            // BitmapMaterial に BitmapData を渡す
            mat01 = new BitmapMaterial(bmd, true);

            // tiled を true に、maxU, maxV に敷き詰める数を渡す
            mat01.tiled = true;
            mat01.maxU = 1;
            mat01.maxV = 1;

            // Cube の面に貼り付ける
            cube = new Cube(new MaterialsList({all:mat01}));
            scene.addChild(cube);
            //setCube(1,0,0);
            //setCube(1,1,0);
            //setCube(1,2,1);
            for(var i:int = 0;i<3;i++){
                for(var j:int =0;j<3;j++){
                    for(var k:int =0;k<3;k++){
                        //setCube(i,j,k);
                    }
                }
            }


            // 描画を開始する
            startRendering();
        }
        private function setCube(x:int,y:int,z:int):void{
            // Cube の面に貼り付ける
            cube = new Cube(new MaterialsList({all:mat01}));
            cube.x = x*500;
            cube.y = y*500;
            cube.z = z*500;
            scene.addChild(cube);
        }

        
        private function base64ToBitmapData(base64:String, callback:Function):void{
            var decoder:Base64Decoder = new Base64Decoder();
            decoder.decode(base64);

            var bytes:ByteArray = decoder.toByteArray();
            bytes.position = 0;
            var loader:Loader = new Loader();
            loader.loadBytes(bytes);
            var bmd:BitmapData = new BitmapData(16, 16);
            loader.contentLoaderInfo.addEventListener("complete", function(event:Event):void{
                var bmd:BitmapData = new BitmapData(loader.width, loader.height);
                bmd.draw(loader);
                callback(bmd);
            });
        }    

        

        public function Reflect():void {
            //背景色
            graphics.beginFill(0x000000);
            graphics.drawRect(0, 0, 465, 465);
            graphics.endFill();
            // マテリアルを作成
            //var material:FlatShadeMaterial = new FlatShadeMaterial(new PointLight3D(), 0x2288CC, 0x004466);
            //var materials:MaterialsList = new MaterialsList( { all:material } );
            
            base64ToBitmapData(ImageBase64, loadComplete);
            
            //モデル生成
            field = createEarth();
            //cube = new Cube(materials);
            
            //scene.addChild(cube);
            scene.addChild(field);
            //scene.removeChild(field);

            // 反射を設定
            //surfaceHeight = -600; // 反射面の座標
            //viewportReflection.filters = [new BlurFilter(10, 5, 5)]; // 反射面のフィルタ
            //viewportReflection.alpha = 0.7; // 反射面の透明度
            
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
         private function createEarth():Plane {
            var earth:Plane = new Plane(new WireframeMaterial(0x00ff00, 0.5), 6000, 6000, 10, 10);
            with (earth) {
                rotationX = 90;
                //rotationY = 20;
                scaleX = scaleY = 1;
                y = -3000;
            }

            return earth;
        }
        
        
        private var sw:Boolean;
        // エンターフレームイベントを登録
        private function loop(e:Event):void {
            // モーション
            //cube.rotationY += 2;
            //camera.x += 20;
            camera.y = 500 + 2000 * Math.sin(getTimer() / 1000);
            if(Math.sin(getTimer() / 1000) > 0 && sw == true){
                scene.addChild(cube);
                sw = false;
            }
            else if(Math.sin(getTimer() / 1000) < 0 && sw == false){
                scene.removeChild(cube);
                sw = true;
            }

            
            // レンダリング
            singleRender();
        }
    }
}