Invert color-AGAL experiment

by J.J
♥0 | Line 93 | Modified 2013-02-08 01:48:28 | MIT License
play

ActionScript3 source code

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

package  {
    import flash.system.LoaderContext;
    import flash.display.BitmapData;
    import flash.net.URLRequest;
    import flash.display.Loader;
    import flash.display3D.textures.Texture;
    import flash.display3D.Context3DTextureFormat;
    import flash.display.Bitmap;
    import flash.display3D.Program3D;
    import flash.display3D.Context3DProgramType;
    import com.adobe.utils.AGALMiniAssembler;
    import flash.display3D.VertexBuffer3D;
    import flash.display3D.IndexBuffer3D;
    import flash.display3D.Context3D;
    import flash.display.Stage3D;
    import flash.events.Event;
    import flash.display.Sprite;
    /**

     * @author javid jafari

     */
     
    public class Invert extends Sprite {
        
        private var img_src : Bitmap
        private var c3d : Context3D;
        private var w : int;
        private var h : int;
        private var vertices : Vector.<Number>;
        private var indxBuffer : IndexBuffer3D;
        private var vrtxBuffer : VertexBuffer3D;
        private var tex : Texture;
        private var level : int;

        public function Invert() {
            if(stage) inits()
            else addEventListener(Event.ADDED_TO_STAGE, inits)
        }

        private function inits(event : Event=null) : void {            
            var loader:Loader=new Loader()
           loader.load(new URLRequest('http://www.bongiovi.tw/wonderfl/rock.jpg'),new LoaderContext(true))
           loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded)           
           //onLoaded(null)
        }

        private function onLoaded(event : Event) : void {
            img_src=event.target.content as Bitmap
           // img_src.bitmapData=new BitmapData(256,256,false,0)
          //  img_src.bitmapData.noise(.5,0,255)
            stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, CreatedC3d)            
            stage.stage3Ds[0].requestContext3D()
        }
        private function CreatedC3d(event : Event) : void {
          
            w=stage.stageWidth,h=stage.stageHeight
            var s3d:Stage3D=event.target as Stage3D
            c3d=s3d.context3D
            c3d.configureBackBuffer(w, h, 1)
            var o:Number=1
            var offs:Number=1
            vertices=Vector.<Number>([
            -o,o,0,   0,0, offs,
            o,o,0,    1,0, offs,
            o,-o,0,   1,1, offs,
            -o,-o,0,  0,1, offs,
            ])
            indxBuffer=c3d.createIndexBuffer(6)
            indxBuffer.uploadFromVector(Vector.<uint>([0,1,2,0,2,3]), 0, 6)

            vrtxBuffer=c3d.createVertexBuffer(4, 6)
            vrtxBuffer.uploadFromVector(vertices,0,4)

            var bmp:Bitmap=img_src          
            tex=c3d.createTexture(256, 256, Context3DTextureFormat.BGRA, false)
            tex.uploadFromBitmapData(bmp.bitmapData)
                        
            var vertexAssembler:AGALMiniAssembler=new AGALMiniAssembler()
            vertexAssembler.assemble(Context3DProgramType.VERTEX,
            'mov op, va0\n'+
            'mov v0, va1\n'+
            'mov v1, va2\n'
            )
            var fragmentAssembler:AGALMiniAssembler=new AGALMiniAssembler()
            fragmentAssembler.assemble(Context3DProgramType.FRAGMENT, 
            'tex ft0, v0, fs0 <2d,linear,nomip>\n'+

            'sub ft1.x, v1.x, ft0.x\n'+

            'sub ft1.y, v1.x, ft0.y\n'+

            'sub ft1.z, v1.x, ft0.z\n'+

            'mov ft0.x, ft1.x\n'+

            'mov ft0.y, ft1.y\n'+

            'mov ft0.z, ft1.z\n'+

            'mov oc, ft0\n')                        
            var p3d:Program3D=c3d.createProgram()
            p3d.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode)
            //set data
            c3d.setVertexBufferAt(0, vrtxBuffer,0,'float3')
            c3d.setVertexBufferAt(1, vrtxBuffer,3,'float2')
            c3d.setVertexBufferAt(2, vrtxBuffer,5,'float1')
            c3d.setTextureAt(0, tex)
            c3d.setProgram(p3d)
            addEventListener(Event.ENTER_FRAME, loop)

        }



        private function loop(event : Event) : void {
            c3d.clear()
            c3d.drawTriangles(indxBuffer)
            c3d.present()

        }

    }

}