package
{
import com.adobe.utils.*;
import flash.display.*;
import flash.display3D.*;
import flash.display3D.textures.*;
import flash.events.*;
public class Main extends Sprite
{
private var context:Context3D;
private var program:Program3D;
private var vertexBuffer:VertexBuffer3D;
private var indexBuffer:IndexBuffer3D;
private var texture:Texture;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, onContext3DCreate);
stage.stage3Ds[0].requestContext3D();
}
private function onContext3DCreate(e:Event):void
{
// context
context = stage.stage3Ds[0].context3D;
context.configureBackBuffer(800, 600, 0, false);
// vertexBuffer
const vertices:Vector.<Number> = Vector.<Number>([
// x, y, u, v,
-1, -1, 0, 0, // LB
-1, 1, 0, 1, // LT
1, 1, 1, 1, // RT
1, -1, 1, 0, // RB
]);
const perVertex:int = 4;
const numVertices:int = vertices.length / perVertex;
vertexBuffer = context.createVertexBuffer(numVertices, perVertex);
vertexBuffer.uploadFromVector(vertices, 0, numVertices);
// indexBuffer
const indices:Vector.<uint> = Vector.<uint>([0, 1, 2, 2, 3, 0]);
indexBuffer = context.createIndexBuffer(indices.length);
indexBuffer.uploadFromVector(indices, 0, indices.length);
// texture
var bitmapData:BitmapData = new BitmapData(16, 1, false);
for (var x:int = 0; x < bitmapData.width; x++)
{
var color:uint = 0xff * Math.sin((x / bitmapData.width) * (Math.PI / 2));
bitmapData.setPixel(x, 0, color);
}
texture = context.createTexture(
bitmapData.width, bitmapData.height, Context3DTextureFormat.BGRA, false);
texture.uploadFromBitmapData(bitmapData);
// program
var vertexAssembler:AGALMiniAssembler = new AGALMiniAssembler;
vertexAssembler.assemble(Context3DProgramType.VERTEX,
"mov op va0\n" +
"mov v0 va1\n"
);
var fragmentAssembler:AGALMiniAssembler = new AGALMiniAssembler;
fragmentAssembler.assemble(Context3DProgramType.FRAGMENT,
"tex ft0 v0 fs0 <2d,nearest>\n" + // nearest/linear
"mov oc ft0\n"
);
program = context.createProgram();
program.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
// va0 : xy
context.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
// va1 : uv
context.setVertexBufferAt(1, vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
// fs0 : texture sampler
context.setTextureAt(0, texture);
context.setProgram(program);
onRender();
}
private function onRender():void
{
if (!context) return;
context.clear();
context.drawTriangles(indexBuffer);
context.present();
}
}
}