3d stuff

by wh0 forked from AGAL feedback (diff: 70)
man, it's not obvious what the range of outputs for the vertex shader should be
♥1 | Line 66 | Modified 2012-08-02 15:37:06 | MIT License
play

ActionScript3 source code

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

// forked from wh0's AGAL feedback
package {
    import flash.display.*;
    import flash.display3D.*;
    import flash.events.*;
    import flash.geom.*;
    
    import com.adobe.utils.AGALMiniAssembler;
    public class FlashTest extends Sprite {

        private var stage3D:Stage3D;
        private var context3D:Context3D;
        private var indexBuffer3D:IndexBuffer3D;
        private var matrix3D:Matrix3D;

        public function FlashTest() {
            loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, function (e:UncaughtErrorEvent):void { Wonderfl.log(e.error); } );
            if (stage.stage3Ds.length == 0) throw 'no stage3D';
            
            // stage.frameRate = 60;
            
            stage3D = stage.stage3Ds[0];
            stage3D.addEventListener(Event.CONTEXT3D_CREATE, context3DCreate);
            stage3D.requestContext3D();
        }
        
        private function context3DCreate(e:Event):void {
            context3D = stage3D.context3D;
            context3D.configureBackBuffer(stage.stageWidth, stage.stageHeight, 0, false);
            prepareTestProgram();
            // addEventListener(Event.ENTER_FRAME, draw);
            draw(null);
        }
        
        private function prepareTestProgram():void {
            var vsa:AGALMiniAssembler = new AGALMiniAssembler();
            vsa.assemble(Context3DProgramType.VERTEX, <![CDATA[
m44 op, va0, vc0
mov v0, va0
            ]]>);
            var fsa:AGALMiniAssembler = new AGALMiniAssembler();
            fsa.assemble(Context3DProgramType.FRAGMENT, <![CDATA[
mov ft0, v0.x
neg ft0.z, v0.x
frc ft0.y, v0.z
mov oc, ft0
            ]]>);
            var p:Program3D = context3D.createProgram();
            p.upload(vsa.agalcode, fsa.agalcode);
            context3D.setProgram(p);
            
            var va:VertexBuffer3D = context3D.createVertexBuffer(4, 3);
            va.uploadFromVector(new <Number> [
            //   x   y   z
                -1, -1,  0,
                 1, -1,  0,
                -1, -1,  8,
                 1, -1,  8
            ], 0, 4);
            context3D.setVertexBufferAt(0, va, 0, Context3DVertexBufferFormat.FLOAT_3);
            
            matrix3D = new Matrix3D(new <Number> [
                1, 0, 0, 0,
                0, 1, 0, 0,
                0, 0, 1, 0,
                0, 0, 1, 1
            ]);
            matrix3D.transpose();
            
            indexBuffer3D = context3D.createIndexBuffer(6);
            indexBuffer3D.uploadFromVector(new <uint> [0, 1, 2, 1, 2, 3], 0, 6);
        }
        
        private function draw(e:Event):void {
            context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, 0, matrix3D, true);
            context3D.clear();
            context3D.drawTriangles(indexBuffer3D);
            context3D.present();
        }

    }
}