- 
[SWF(width=500,height=500,backgroundColor=0x333333, frameRate=40)] 
- 
var terrain:Shape = Shape(addChild(new Shape())); 
- 
terrain.x = terrain.y = 250; 
- 
var rows:int = 60; 
- 
var size:int = rows + 1; 
- 
var vertNum:int = size * size; 
- 
var polySize:Number = 5; 
- 
var gridWidth:Number = polySize * rows; 
- 
var halfWidth:Number = gridWidth / 2; 
- 
var verts:Vector.<Number> = new Vector.<Number>(); 
- 
var pVerts:Vector.<Number> = new Vector.<Number>(); 
- 
var indices:Vector.<int> = new Vector.<int>(); 
- 
var uvs:Vector.<Number> = new Vector.<Number>(); 
- 
var uvts:Vector.<Number> = new Vector.<Number>(); 
- 
var tex:BitmapData = new BitmapData(gridWidth, gridWidth, false, 0x000000); 
- 
var pix:int = gridWidth * gridWidth; 
- 
var perlin:BitmapData = new BitmapData(gridWidth, gridWidth, false, 0x000000); 
- 
// generate the texture and the terrain 
- 
function generate():void{ 
- 
    tex.fillRect(tex.rect, 0x000000); 
- 
    var i:Number, xp:Number, yp:Number; 
- 
    for (i = 0; i<pix; i++){ 
- 
        xp = i % gridWidth; 
- 
        yp= int(i / gridWidth); 
- 
        var dx:Number = xp - gridWidth / 2; 
- 
        var dy:Number = yp - gridWidth / 2; 
- 
        var d:Number = 255 - Math.sqrt(dx * dx + dy * dy) / halfWidth* 255; 
- 
        if (d <0) d = 0; 
- 
        if (d> 255) d = 255; 
- 
        var c:uint = uint(d); 
- 
        tex.setPixel(xp, yp, c <<16 | c <<8 | c); 
- 
    } 
- 
    perlin.perlinNoise(100,100,3,Math.random()*100,false,false,7,true); 
- 
    perlin.draw(perlin, null, null, BlendMode.SCREEN); 
- 
    tex.draw(perlin, null, null, BlendMode.MULTIPLY); 
- 
    // calculate verts, uvs and indices 
- 
    var vIndex:int = 0; 
- 
    var uvIndex:int = 0; 
- 
    indices = new Vector.<int>(); 
- 
    for (i = 0; i<vertNum; i++){ 
- 
        var xMod:Number = i % size; 
- 
        xp = xMod * polySize; 
- 
        yp = int(i / size) * polySize; 
- 
        verts[vIndex++] = xp - halfWidth; 
- 
        verts[vIndex++] = yp - halfWidth; 
- 
        verts[vIndex++] = tex.getPixel(xp, yp) & 0xFF; 
- 
        uvs[uvIndex++] = xp /  gridWidth; 
- 
        uvs[uvIndex++] = yp / gridWidth; 
- 
        if (xMod != rows){ 
- 
              indices.push(i, i+1, i+size, i+1, i+size+1, i+size); 
- 
        } 
- 
    } 
- 
} 
- 
generate(); 
- 
stage.addEventListener(MouseEvent.MOUSE_DOWN, onGenerate); 
- 
function onGenerate(evt:MouseEvent):void{ generate() }; 
- 
var m:Matrix3D = new Matrix3D(); 
- 
var rot:Number = 0; 
- 
addEventListener(Event.ENTER_FRAME, onLoop); 
- 
function onLoop(evt:Event):void { 
- 
        m.identity(); 
- 
        var destRot:Number = mouseX / stage.stageWidth * 90; 
- 
        if (destRot <0) destRot = 0; 
- 
        if (destRot> 90) destRot = 90; 
- 
        rot += (destRot - rot) * 0.2; 
- 
        m.appendRotation(rot,Vector3D.Z_AXIS); 
- 
        m.appendRotation(60,Vector3D.X_AXIS); 
- 
        Utils3D.projectVectors(m, verts, pVerts, uvts); 
- 
        with(terrain.graphics){ 
- 
            clear(); 
- 
            beginBitmapFill(tex, null, false, true); 
- 
            drawTriangles(pVerts, indices, uvs, TriangleCulling.NEGATIVE); 
- 
        } 
- 
}