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.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.textures.Texture;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.geom.Matrix;
public class Main extends Sprite
{
private var context3D:Context3D;
private var program:Program3D;
private var vertexBuffer:VertexBuffer3D;
private var indexBuffer:IndexBuffer3D;
[Embed(source="earthmap1k.jpg")]
private const TextureBitmap:Class;
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
{
context3D = stage.stage3Ds[0].context3D;
context3D.configureBackBuffer(1024, 512, 2, true);
// vertexBuffer
const vertices:Vector.<Number> = Vector.<Number>([
// x, y, u, v,
-1, -1, 0, 1, // LB
-1, 1, 0, 0, // LT
1, 1, 1, 0, // RT
1, -1, 1, 1, // RB
]);
const perVertex:int = 4;
const numVertices:int = vertices.length / perVertex;
vertexBuffer = context3D.createVertexBuffer(numVertices, perVertex);
vertexBuffer.uploadFromVector(vertices, 0, numVertices);
// indexBuffer
const indices:Vector.<uint> = Vector.<uint>([0, 1, 2, 2, 3, 0]);
indexBuffer = context3D.createIndexBuffer(indices.length);
indexBuffer.uploadFromVector(indices, 0, indices.length);
// texture
var bitmap:Bitmap = new TextureBitmap();
var bitmapData:BitmapData = new BitmapData(1024, 512);
bitmapData.draw(bitmap.bitmapData,
new Matrix(1024 / 1000, 0, 0, 512 / 500), null, null, null, true);
texture = context3D.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>\n" +
"mov oc ft0\n"
);
program = context3D.createProgram();
program.upload(vertexAssembler.agalcode, fragmentAssembler.agalcode);
// va0 : xy
context3D.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_2);
// va1 : uv
context3D.setVertexBufferAt(1, vertexBuffer, 2, Context3DVertexBufferFormat.FLOAT_2);
// fs0 : texture sampler
context3D.setTextureAt(0, texture);
context3D.setProgram(program);
onRender(null);
}
private function onRender(e:Event):void
{
if (!context3D) return;
context3D.clear();
context3D.drawTriangles(indexBuffer);
context3D.present();
}
}
}