Beautifl - Flash Gallery

Thumbnail : [PV3D] Xmas Tree
[PV3D] Xmas Tree
clockmaker 2009-12-02 MIT License

再生するにはFlash Playerが必要です。デスクトップのブラウザでご覧ください。

package {
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.utils.getTimer;
    
    import org.papervision3d.core.effects.BitmapColorEffect;
    import org.papervision3d.core.geom.Pixels;
    import org.papervision3d.core.geom.renderables.Pixel3D;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.view.layer.BitmapEffectLayer;

    [SWF(width=465, height=465, frameRate=60)]
    public class Tree extends BasicView {
        private var level:int = 0;
        private var rot:Number = 0;
        private var treePixels:Pixels;
        private var canvas:BitmapData;
        private var mtx:Matrix;
        
        public static const WHITE:uint = 0xFFF0F0F0;
        public static const GREEN:uint = 0xFF008800;
        public static const RED:uint = 0xFFCC0000;
        public static const GOLD:uint = 0xFFFFCC66;
        public static const SILVER:uint = 0xFFCCCCCC;
        public static const COLORS:Array = [WHITE, GREEN, RED, GOLD, SILVER];
        
        /**
        * コンストラクタ
        */ 
        public function Tree() {
            stage.quality = StageQuality.MEDIUM;
            opaqueBackground = 0;
            
            var bfx:BitmapEffectLayer = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight);
            bfx.addEffect(new BitmapColorEffect(1, 1, 1, 0.75));
            viewport.containerSprite.addLayer(bfx);

            treePixels = new Pixels(bfx);
            scene.addChild(treePixels);

            // tree
            drawTree(0, -1000, 0, 500, 90, GOLD);

            // snow
            for(var i:int=0; i< 300; i++){
                var pix:Pixel3D = new Pixel3D(0xFFFFFFFF,
                    10000 * (Math.random() - 0.5),
                    10000 * (Math.random() - 0.5),
                    10000 * (Math.random() - 0.5));
                treePixels.addPixel3D(pix);
            }
            
            // earth
            var p:Plane = new Plane(new WireframeMaterial(0x222222), 5000, 5000, 8, 8);
            p.rotationX = 90;
            p.y = -1000;
            scene.addChild(p);
            
            // kira kira
            canvas = new BitmapData(465 / 4, 465 / 4, false, 0x000000);
            var bmp:Bitmap = new Bitmap(canvas, PixelSnapping.NEVER, false);
            bmp.scaleX = bmp.scaleY = 4;
            bmp.smoothing = true;
            bmp.blendMode = BlendMode.ADD;
            addChild(bmp);
            
            mtx = new Matrix();
            mtx.scale(0.25, 0.25);

            // render
            startRendering();
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
        /**
        * 再帰関数で木の枝を作っていく
        */
        private function drawTree(x:Number, y:Number, z:Number, length:Number, angle:Number, cf:int):void {
            level += 1;
            var destx:Number = x + length * Math.cos(angle * (Math.PI / 180));
            var desty:Number = y + length * Math.sin(angle * (Math.PI / 180));
            var destz:Number = z + length * (Math.random() - 0.5) * 2;

            if (Math.random() < 0.5)
                cf = COLORS[COLORS.length * Math.random() | 0];

            var max:int = 8 - level / 2;

            for (var i:int = 0; i < max; i++) {
                treePixels.addPixel3D(new Pixel3D(cf,
                    destx * i / max + x * (max - i) / max,
                    desty * i / max + y * (max - i) / max,
                    destz * i / max + z * (max - i) / max
                    ));
            }

            if (level < 7) {
                drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
                drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
                drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
                drawTree(destx, desty, destz, length * (1 + 3 * Math.random()) * 0.25, angle + 60 * (Math.random() - Math.random()), cf);
            }
            level -= 1;
        }
        
        /**
        * エンターフレーム
        */ 
        private function loop(e:Event):void {
            // camera motion
            rot += (mouseX / stage.stageWidth * 3 * Math.PI - rot) * .1
            camera.x = Math.sin(rot) * 1500;
            camera.z = Math.cos(rot) * 1500;
            camera.y += (mouseY / stage.stageHeight * 3000 - 500 - camera.y) * .05;
            camera.fov = Math.sin(getTimer() / 2000) * 10 + 60;
            
            // kira kira
            canvas.fillRect(canvas.rect, 0x000000);
            canvas.draw(viewport, mtx);
        }
    }
}