forked from: agal 2d lights

by bradsedito
...
@author lizhi
♥0 | Line 93 | Modified 2012-06-13 07:00:15 | MIT License
play

ActionScript3 source code

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

// forked from lizhi's agal 2d lights
package  
{
    import com.adobe.utils.AGALMiniAssembler;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.display3D.Context3D;
    import flash.display3D.Context3DProgramType;
    import flash.display3D.Context3DTextureFormat;
    import flash.display3D.IndexBuffer3D;
    import flash.display3D.Program3D;
    import flash.display3D.textures.Texture;
    import flash.display3D.VertexBuffer3D;
    import flash.events.Event;
    /**
     * ...
     * @author lizhi
     */
    public class AgalLights extends Sprite
    {
        private var context3d:Context3D;
        private var lights:Array=[];
        private var ibuf:IndexBuffer3D;
        public function AgalLights() 
        { 
            stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, stage3Ds_context3dCreate);
            stage.stage3Ds[0].requestContext3D();

        }
        
        private function stage3Ds_context3dCreate(e:Event):void 
        {
            var c:int = 24;
            while (c-->0) lights.push(new Light);
            
            
            context3d = stage.stage3Ds[0].context3D;
            context3d.configureBackBuffer(465, 465, 0);
            var vsa:AGALMiniAssembler = new AGALMiniAssembler(false);
            vsa.assemble(Context3DProgramType.VERTEX,
                "mov op,va0\n"+
                "mov v0,va1");
            var fsa:AGALMiniAssembler = new AGALMiniAssembler(false);
            
            var code:String = "tex ft0,v0,fs0<2d,linear,nomip>\n" +
                "mov ft1.z,fc0.x\n";
                
            for (var i:int = 1; i <= lights.length;i++ ) {
                code+="sub ft1.xy,v0.xy,fc"+i+".xy\n" +
                "mul ft1.xy,ft1.xy,ft1.xy\n" +
                "add ft1.x,ft1.x,ft1.y\n" +
                "sqt ft1.x,ft1.x\n" +
                "div ft1.x,ft1.x,fc"+i+".z\n" +
                "sub ft1.x,fc0.y,ft1.x\n" +
                "sat ft1.x,ft1.x\n" +
                "add ft1.z,ft1.x,ft1.z\n";
            }
            code+="sat ft1.z,ft1.z\n" +
                "mul ft0.xyz,ft0.xyz,ft1.zzz\n"+
                "mov oc,ft0"
            
            fsa.assemble(Context3DProgramType.FRAGMENT, code);
            var program:Program3D = context3d.createProgram();
            program.upload(vsa.agalcode, fsa.agalcode);
            
            var vdata:Vector.<Number> = Vector.<Number>([-1, 1, 0, 0, 0,
            1, 1, 0, 1, 0, 
            -1, -1, 0, 0, 1, 
            1, -1, 0, 1, 1]);
            var vbuf:VertexBuffer3D = context3d.createVertexBuffer(4, 5);
            vbuf.uploadFromVector(vdata, 0, 4);
            
            var bmd:BitmapData = new BitmapData(512, 512, true, 0);
            bmd.perlinNoise(400, 400, 3, 1, true, true);
            var texture:Texture = context3d.createTexture(512, 512, Context3DTextureFormat.BGRA, false);
            texture.uploadFromBitmapData(bmd);
            
            context3d.setVertexBufferAt(0, vbuf,0,"float3");
            context3d.setVertexBufferAt(1, vbuf,3,"float2");
            context3d.setTextureAt(0, texture);
            context3d.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, Vector.<Number>([0, 1, 0, 0]));
            
            context3d.setProgram(program);
            
            ibuf = context3d.createIndexBuffer(6);
            ibuf.uploadFromVector(Vector.<uint>([0, 1, 2, 1, 2, 3]), 0, 6);
            
            addEventListener(Event.ENTER_FRAME, enterFrame);
        }
        
        private function enterFrame(e:Event):void 
        {
            for (var i:int = 1; i <= lights.length; i++ ) {
                var light:Light = lights[i - 1];
                light.v[0] += light.vx;
                light.v[1] += light.vy;
                if (light.v[0]<0||light.v[0]>1)light.vx*=-1;
                if (light.v[1]<0||light.v[1]>1)light.vy*=-1;
                context3d.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, i, light.v);
            }
            context3d.clear();
            context3d.drawTriangles(ibuf, 0, 2);
            context3d.present();
            
        }
        
    }

}
class Light {
    public var v:Vector.<Number> = Vector.<Number>([Math.random(), Math.random(), 0.05+0.2 * Math.random(), 0]);
    public var vx:Number = 0.03 * (Math.random() - 0.5);
    public var vy:Number = 0.03 * (Math.random() - 0.5);
}