In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

Plasmountains

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

package {
    import flash.display.*;
    import flash.geom.*;
    import flash.utils.*;
    import net.hires.debug.Stats;

    [SWF(width=465,height=465,frameRate=30,backgroundColor=0x88aaff)]
    public class Plasmountains extends Sprite {
        private static const SIZE:int = 32;
        private static const OCTAVES:int = 5;

        private var vertices:Vector.<Number> = new Vector.<Number>(SIZE*SIZE*3, true);
        private var projected:Vector.<Number> = new Vector.<Number>(0, false);
        private var uvtData:Vector.<Number> = new Vector.<Number>(SIZE*SIZE*3, true);
        private var heightMap:BitmapData = new BitmapData(SIZE, SIZE, false);
        private var indices:Vector.<int> = new Vector.<int>((SIZE-1)*(SIZE-1)*6, true);
        private var tmpBmd1:BitmapData = new BitmapData(SIZE, SIZE);
        private var texture:BitmapData = new BitmapData(SIZE, SIZE);
        private var projection:PerspectiveProjection = new PerspectiveProjection();
        private var viewport:Shape = new Shape();

        private var stats:Sprite = new Sprite;
        
        public function Plasmountains() {
            viewport.x = viewport.y = 465 / 2;
            addChild(viewport);
            projection.fieldOfView = 20;

            stats.addChild(new Bitmap(heightMap));
            stats.addChild(new Bitmap(tmpBmd1)).y=SIZE*1.1;
            stats.addChild(new Bitmap(texture)).y=SIZE*2.2;
            stats.addChild(new Stats()).x=400;
            addChild(stats).visible = false;

            addEventListener("enterFrame", loop);
            stage.addEventListener("click", function(e:*):void { stats.visible = !stats.visible; });
        }

        private function loop(e:*):void {
            var offsets:Array = [];
            var offset:Number = -getTimer()/100;

            for(var i:uint = 0; i < OCTAVES; i++) {
                offsets.push(new Point(0, offset/(i+1)));
            }
            
            heightMap.perlinNoise(SIZE, SIZE, OCTAVES, 16, true, false, 
                BitmapDataChannel.RED | BitmapDataChannel.GREEN | BitmapDataChannel.BLUE, true,
                offsets);
            texture.perlinNoise(SIZE, SIZE, OCTAVES, 3, false, false,
                BitmapDataChannel.RED | BitmapDataChannel.GREEN | BitmapDataChannel.BLUE, false,
                offsets);

            // "shadows" in valleys
            tmpBmd1.draw(heightMap)
            tmpBmd1.draw(heightMap, null, null, "screen");
            texture.draw(tmpBmd1, null, null, "multiply");

            // generate vertices, uvtdata and indices
            i = 0;
            var ii:uint = 0; // indices index
            for(var y:int = 0; y < SIZE; y++) {
                for(var x:int = 0; x < SIZE; x++) {
                    vertices[i]  = -(x*2-SIZE);
                    uvtData[i++] = x/SIZE;
                    vertices[i]  = ((heightMap.getPixel(x,y) & 0xFF) - 0x80) / 0x80 * SIZE;
                    uvtData[i++] = y/SIZE;
                    vertices[i]  = y*2-SIZE;
                    uvtData[i++] = 0;

                    if(x < SIZE-1 && y < SIZE-1) {
                        var i1:uint = y*SIZE+x;
                        var i2:uint = i1+SIZE;
                        
                        indices[ii++]=i1;
                        indices[ii++]=i1+1;
                        indices[ii++]=i2;
                        indices[ii++]=i1+1;
                        indices[ii++]=i2+1;
                        indices[ii++]=i2;
                    }
                }
            }
            
            // project
            var m:Matrix3D = new Matrix3D;
            m.appendScale(.6,.4,.6);
            m.appendRotation(38, Vector3D.X_AXIS);
            m.appendTranslation(0,-SIZE/8,-SIZE*2.3);
            m.append(projection.toMatrix3D());
            Utils3D.projectVectors(m, vertices, projected, uvtData);

            viewport.graphics.clear();
            //viewport.graphics.lineStyle(1, 0, 0.25);
            viewport.graphics.beginBitmapFill(texture, null, false, true);
            viewport.graphics.drawTriangles(projected, indices, uvtData);
            viewport.graphics.endFill();
        }
    }
}