~~NOTOC~~ ====== Batch Renderer ====== ---- dataentry extension ---- author_mail : lazarecki@gmail.com Łukasz Łazarecki description : Batch Renderer lets you create custom display object, post processing effects and custom shaders in a easy to learn, quick and pleasant way :) If you need to render a custom geometry (not a Quad) or do a custom texture processing, it may be just the thing for you. Visit its GitHub page for more details and a tutorial. lastupdate_dt : 2014-01-23 # the date you created the extension compatible : v1.4.1 # the Starling version you tested the extension with depends : Starling, EasyAGAL# if the ext. depends on others, list them here tags : batch,renderer,shader,AGAL,EasyAGAL homepage_url : https://github.com/b005t3r/Starling-Extension-BatchRenderer download_url : https://github.com/b005t3r/Starling-Extension-BatchRenderer ---- ===== Overview ===== Please visit [[https://github.com/b005t3r/Starling-Extension-BatchRenderer/|BatchRenderer GitHub page]] for a more detailed description. To use it, first you need to subclass BatchRenderer class: use namespace renderer_internal; public class TexturedGeometryRenderer extends BatchRenderer { public static const POSITION:String = "position"; public static const UV:String = "uv"; public static const INPUT_TEXTURE:String = "inputTexture"; private var _positionID:int, _uvID:int; // shader variables private var uv:IRegister = VARYING[0]; // v0 is used to pass interpolated uv from vertex to fragment shader public function TexturedGeometryRenderer() { setVertexFormat(createVertexFormat()); } public function get inputTexture():Texture { return getInputTexture(INPUT_TEXTURE); } public function set inputTexture(value:Texture):void { setInputTexture(INPUT_TEXTURE, value); } public function getVertexPosition(vertex:int, position:Vector. = null):Vector. { return getVertexData(vertex, _positionID, position); } public function setVertexPosition(vertex:int, x:Number, y:Number):void { setVertexData(vertex, _positionID, x, y); } public function getVertexUV(vertex:int, uv:Vector. = null):Vector. { return getVertexData(vertex, _uvID, uv); } public function setVertexUV(vertex:int, u:Number, v:Number):void { setVertexData(vertex, _uvID, u, v); } override protected function vertexShaderCode():void { comment("output vertex position"); multiply4x4(OUTPUT, getVertexAttribute(POSITION), getRegisterConstant(PROJECTION_MATRIX)); comment("pass uv to fragment shader"); move(uv, getVertexAttribute(UV)); } override protected function fragmentShaderCode():void { var input:ISampler = getTextureSampler(INPUT_TEXTURE); comment("sample the texture and send resulting color to the output"); sampleTexture(OUTPUT, uv, input, [TextureFlag.TYPE_2D, TextureFlag.MODE_CLAMP, TextureFlag.FILTER_LINEAR, TextureFlag.MIP_NONE]); } private function createVertexFormat():VertexFormat { var format:VertexFormat = new VertexFormat(); _positionID = format.addProperty(POSITION, 2); // x, y; id: 0 _uvID = format.addProperty(UV, 2); // u, v; id: 1 return format; } } Then you set up your geometry, set its vertex data and input textures and/or constants, if your shader requires you to: // add a new quad var vertex:int = BatchRendererUtil.addQuad(texturedRenderer); // setup Quad's vertices position... texturedRenderer.setVertexPosition(vertex , 0, 0); texturedRenderer.setVertexPosition(vertex + 1, 100, 0); texturedRenderer.setVertexPosition(vertex + 2, 0, 100); texturedRenderer.setVertexPosition(vertex + 3, 100, 100); // ... UV mapping... texturedRenderer.setVertexUV(vertex , 0, 0); texturedRenderer.setVertexUV(vertex + 1, 1, 0); texturedRenderer.setVertexUV(vertex + 2, 0, 1); texturedRenderer.setVertexUV(vertex + 3, 1, 1); // ... and an input texture texturedRenderer.inputTexture = Texture.fromBitmap(new AmazingBitmap()); And finally you make it render stuff either to a texture: // create rendering settings to be used settings = new RenderingSettings(); settings.blendMode = BlendMode.NORMAL; settings.clearColor = 0xcccccc; settings.clearAlpha = 1.0; // and render! var outputTexture:RenderTexture = new RenderTexture(1024, 1024, false); texturedRenderer.renderToTexture(renderTexture, settings); ... or the back buffer (using a wrapper DisplayObject): var wrapper:BatchRendererWrapper = new BatchRendererWrapper(texturedRenderer); addChild(wrapper); That's it :) Once again, visit the [[https://github.com/b005t3r/Starling-Extension-BatchRenderer/|BatchRenderer GitHub page]] for a more detailed tutorial. ===== Changelog ===== * //2014/01/23 12:58//: First public version ===== Source Code ===== [[https://github.com/b005t3r/Starling-Extension-BatchRenderer/|BatchRenderer GitHub page]]