<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>src/pixi/textures/RenderTexture.js - pixi.js</title> <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css"> <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css"> <link rel="stylesheet" href="../assets/css/main.css" id="site_styles"> <link rel="shortcut icon" type="image/png" href="../assets/favicon.png"> <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script> </head> <body class="yui3-skin-sam"> <div id="doc"> <div id="hd" class="yui3-g header"> <div class="yui3-u-3-4"> <h1><img src="http://www.goodboydigital.com/pixijs/logo_small.png" title="pixi.js"></h1> </div> <div class="yui3-u-1-4 version"> <em>API Docs for: 2.1.0</em> </div> </div> <div id="bd" class="yui3-g"> <div class="yui3-u-1-4"> <div id="docs-sidebar" class="sidebar apidocs"> <div id="api-list"> <h2 class="off-left">APIs</h2> <div id="api-tabview" class="tabview"> <ul class="tabs"> <li><a href="#api-classes">Classes</a></li> <li><a href="#api-modules">Modules</a></li> </ul> <div id="api-tabview-filter"> <input type="search" id="api-filter" placeholder="Type to filter APIs"> </div> <div id="api-tabview-panel"> <ul id="api-classes" class="apis classes"> <li><a href="../classes/AbstractFilter.html">AbstractFilter</a></li> <li><a href="../classes/AjaxRequest.html">AjaxRequest</a></li> <li><a href="../classes/AlphaMaskFilter.html">AlphaMaskFilter</a></li> <li><a href="../classes/AsciiFilter.html">AsciiFilter</a></li> <li><a href="../classes/AssetLoader.html">AssetLoader</a></li> <li><a href="../classes/AtlasLoader.html">AtlasLoader</a></li> <li><a href="../classes/autoDetectRecommendedRenderer.html">autoDetectRecommendedRenderer</a></li> <li><a href="../classes/autoDetectRenderer.html">autoDetectRenderer</a></li> <li><a href="../classes/BaseTexture.html">BaseTexture</a></li> <li><a href="../classes/BitmapFontLoader.html">BitmapFontLoader</a></li> <li><a href="../classes/BitmapText.html">BitmapText</a></li> <li><a href="../classes/BlurFilter.html">BlurFilter</a></li> <li><a href="../classes/BlurXFilter.html">BlurXFilter</a></li> <li><a href="../classes/BlurYFilter.html">BlurYFilter</a></li> <li><a href="../classes/CanvasBuffer.html">CanvasBuffer</a></li> <li><a href="../classes/CanvasGraphics.html">CanvasGraphics</a></li> <li><a href="../classes/CanvasMaskManager.html">CanvasMaskManager</a></li> <li><a href="../classes/CanvasRenderer.html">CanvasRenderer</a></li> <li><a href="../classes/CanvasTinter.html">CanvasTinter</a></li> <li><a href="../classes/Circle.html">Circle</a></li> <li><a href="../classes/ColorMatrixFilter.html">ColorMatrixFilter</a></li> <li><a href="../classes/ColorStepFilter.html">ColorStepFilter</a></li> <li><a href="../classes/ComplexPrimitiveShader.html">ComplexPrimitiveShader</a></li> <li><a href="../classes/ConvolutionFilter.html">ConvolutionFilter</a></li> <li><a href="../classes/CrossHatchFilter.html">CrossHatchFilter</a></li> <li><a href="../classes/DisplacementFilter.html">DisplacementFilter</a></li> <li><a href="../classes/DisplayObject.html">DisplayObject</a></li> <li><a href="../classes/DisplayObjectContainer.html">DisplayObjectContainer</a></li> <li><a href="../classes/DotScreenFilter.html">DotScreenFilter</a></li> <li><a href="../classes/Ellipse.html">Ellipse</a></li> <li><a href="../classes/Event.html">Event</a></li> <li><a href="../classes/EventTarget.html">EventTarget</a></li> <li><a href="../classes/FilterBlock.html">FilterBlock</a></li> <li><a href="../classes/FilterTexture.html">FilterTexture</a></li> <li><a href="../classes/Graphics.html">Graphics</a></li> <li><a href="../classes/GraphicsData.html">GraphicsData</a></li> <li><a href="../classes/GrayFilter.html">GrayFilter</a></li> <li><a href="../classes/ImageLoader.html">ImageLoader</a></li> <li><a href="../classes/InteractionData.html">InteractionData</a></li> <li><a href="../classes/InteractionManager.html">InteractionManager</a></li> <li><a href="../classes/InvertFilter.html">InvertFilter</a></li> <li><a href="../classes/JsonLoader.html">JsonLoader</a></li> <li><a href="../classes/Matrix.html">Matrix</a></li> <li><a href="../classes/MovieClip.html">MovieClip</a></li> <li><a href="../classes/NoiseFilter.html">NoiseFilter</a></li> <li><a href="../classes/NormalMapFilter.html">NormalMapFilter</a></li> <li><a href="../classes/PixelateFilter.html">PixelateFilter</a></li> <li><a href="../classes/PixiFastShader.html">PixiFastShader</a></li> <li><a href="../classes/PixiShader.html">PixiShader</a></li> <li><a href="../classes/Point.html">Point</a></li> <li><a href="../classes/Polygon.html">Polygon</a></li> <li><a href="../classes/PolyK.html">PolyK</a></li> <li><a href="../classes/PrimitiveShader.html">PrimitiveShader</a></li> <li><a href="../classes/Rectangle.html">Rectangle</a></li> <li><a href="../classes/RenderTexture.html">RenderTexture</a></li> <li><a href="../classes/RGBSplitFilter.html">RGBSplitFilter</a></li> <li><a href="../classes/Rope.html">Rope</a></li> <li><a href="../classes/Rounded Rectangle.html">Rounded Rectangle</a></li> <li><a href="../classes/SepiaFilter.html">SepiaFilter</a></li> <li><a href="../classes/SmartBlurFilter.html">SmartBlurFilter</a></li> <li><a href="../classes/Spine.html">Spine</a></li> <li><a href="../classes/SpineLoader.html">SpineLoader</a></li> <li><a href="../classes/Sprite.html">Sprite</a></li> <li><a href="../classes/SpriteBatch.html">SpriteBatch</a></li> <li><a href="../classes/SpriteSheetLoader.html">SpriteSheetLoader</a></li> <li><a href="../classes/Stage.html">Stage</a></li> <li><a href="../classes/Strip.html">Strip</a></li> <li><a href="../classes/StripShader.html">StripShader</a></li> <li><a href="../classes/Text.html">Text</a></li> <li><a href="../classes/Texture.html">Texture</a></li> <li><a href="../classes/TilingSprite.html">TilingSprite</a></li> <li><a href="../classes/TiltShiftFilter.html">TiltShiftFilter</a></li> <li><a href="../classes/TiltShiftXFilter.html">TiltShiftXFilter</a></li> <li><a href="../classes/TiltShiftYFilter.html">TiltShiftYFilter</a></li> <li><a href="../classes/TwistFilter.html">TwistFilter</a></li> <li><a href="../classes/WebGLBlendModeManager.html">WebGLBlendModeManager</a></li> <li><a href="../classes/WebGLFastSpriteBatch.html">WebGLFastSpriteBatch</a></li> <li><a href="../classes/WebGLFilterManager.html">WebGLFilterManager</a></li> <li><a href="../classes/WebGLGraphics.html">WebGLGraphics</a></li> <li><a href="../classes/WebGLGraphicsData.html">WebGLGraphicsData</a></li> <li><a href="../classes/WebGLMaskManager.html">WebGLMaskManager</a></li> <li><a href="../classes/WebGLRenderer.html">WebGLRenderer</a></li> <li><a href="../classes/WebGLShaderManager.html">WebGLShaderManager</a></li> <li><a href="../classes/WebGLSpriteBatch.html">WebGLSpriteBatch</a></li> <li><a href="../classes/WebGLStencilManager.html">WebGLStencilManager</a></li> </ul> <ul id="api-modules" class="apis modules"> <li><a href="../modules/PIXI.html">PIXI</a></li> </ul> </div> </div> </div> </div> </div> <div class="yui3-u-3-4"> <div id="api-options"> Show: <label for="api-show-inherited"> <input type="checkbox" id="api-show-inherited" checked> Inherited </label> <label for="api-show-protected"> <input type="checkbox" id="api-show-protected"> Protected </label> <label for="api-show-private"> <input type="checkbox" id="api-show-private"> Private </label> <label for="api-show-deprecated"> <input type="checkbox" id="api-show-deprecated"> Deprecated </label> </div> <div class="apidocs"> <div id="docs-main"> <div class="content"> <h1 class="file-heading">File: src/pixi/textures/RenderTexture.js</h1> <div class="file"> <pre class="code prettyprint linenums"> /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A RenderTexture is a special texture that allows any Pixi display object to be rendered to it. * * __Hint__: All DisplayObjects (i.e. Sprites) that render to a RenderTexture should be preloaded otherwise black rectangles will be drawn instead. * * A RenderTexture takes a snapshot of any Display Object given to its render method. The position and rotation of the given Display Objects is ignored. For example: * * var renderTexture = new PIXI.RenderTexture(800, 600); * var sprite = PIXI.Sprite.fromImage("spinObj_01.png"); * sprite.position.x = 800/2; * sprite.position.y = 600/2; * sprite.anchor.x = 0.5; * sprite.anchor.y = 0.5; * renderTexture.render(sprite); * * The Sprite in this case will be rendered to a position of 0,0. To render this sprite at its actual position a DisplayObjectContainer should be used: * * var doc = new PIXI.DisplayObjectContainer(); * doc.addChild(sprite); * renderTexture.render(doc); // Renders to center of renderTexture * * @class RenderTexture * @extends Texture * @constructor * @param width {Number} The width of the render texture * @param height {Number} The height of the render texture * @param renderer {CanvasRenderer|WebGLRenderer} The renderer used for this RenderTexture * @param scaleMode {Number} Should be one of the PIXI.scaleMode consts * @param resolution {Number} The resolution of the texture being generated */ PIXI.RenderTexture = function(width, height, renderer, scaleMode, resolution) { /** * The with of the render texture * * @property width * @type Number */ this.width = width || 100; /** * The height of the render texture * * @property height * @type Number */ this.height = height || 100; /** * The Resolution of the texture. * * @property resolution * @type Number */ this.resolution = resolution || 1; /** * The framing rectangle of the render texture * * @property frame * @type Rectangle */ this.frame = new PIXI.Rectangle(0, 0, this.width * this.resolution, this.height * this.resolution); /** * This is the area of the BaseTexture image to actually copy to the Canvas / WebGL when rendering, * irrespective of the actual frame size or placement (which can be influenced by trimmed texture atlases) * * @property crop * @type Rectangle */ this.crop = new PIXI.Rectangle(0, 0, this.width * this.resolution, this.height * this.resolution); /** * The base texture object that this texture uses * * @property baseTexture * @type BaseTexture */ this.baseTexture = new PIXI.BaseTexture(); this.baseTexture.width = this.width * this.resolution; this.baseTexture.height = this.height * this.resolution; this.baseTexture._glTextures = []; this.baseTexture.resolution = this.resolution; this.baseTexture.scaleMode = scaleMode || PIXI.scaleModes.DEFAULT; this.baseTexture.hasLoaded = true; PIXI.Texture.call(this, this.baseTexture, new PIXI.Rectangle(0, 0, this.width, this.height) ); /** * The renderer this RenderTexture uses. A RenderTexture can only belong to one renderer at the moment if its webGL. * * @property renderer * @type CanvasRenderer|WebGLRenderer */ this.renderer = renderer || PIXI.defaultRenderer; if(this.renderer.type === PIXI.WEBGL_RENDERER) { var gl = this.renderer.gl; this.baseTexture._dirty[gl.id] = false; this.textureBuffer = new PIXI.FilterTexture(gl, this.width * this.resolution, this.height * this.resolution, this.baseTexture.scaleMode); this.baseTexture._glTextures[gl.id] = this.textureBuffer.texture; this.render = this.renderWebGL; this.projection = new PIXI.Point(this.width*0.5, -this.height*0.5); } else { this.render = this.renderCanvas; this.textureBuffer = new PIXI.CanvasBuffer(this.width* this.resolution, this.height* this.resolution); this.baseTexture.source = this.textureBuffer.canvas; } /** * @property valid * @type Boolean */ this.valid = true; this._updateUvs(); }; PIXI.RenderTexture.prototype = Object.create(PIXI.Texture.prototype); PIXI.RenderTexture.prototype.constructor = PIXI.RenderTexture; /** * Resizes the RenderTexture. * * @method resize * @param width {Number} The width to resize to. * @param height {Number} The height to resize to. * @param updateBase {Boolean} Should the baseTexture.width and height values be resized as well? */ PIXI.RenderTexture.prototype.resize = function(width, height, updateBase) { if (width === this.width && height === this.height)return; this.valid = (width > 0 && height > 0); this.width = this.frame.width = this.crop.width = width; this.height = this.frame.height = this.crop.height = height; if (updateBase) { this.baseTexture.width = this.width; this.baseTexture.height = this.height; } if (this.renderer.type === PIXI.WEBGL_RENDERER) { this.projection.x = this.width / 2; this.projection.y = -this.height / 2; } if(!this.valid)return; this.textureBuffer.resize(this.width * this.resolution, this.height * this.resolution); }; /** * Clears the RenderTexture. * * @method clear */ PIXI.RenderTexture.prototype.clear = function() { if(!this.valid)return; if (this.renderer.type === PIXI.WEBGL_RENDERER) { this.renderer.gl.bindFramebuffer(this.renderer.gl.FRAMEBUFFER, this.textureBuffer.frameBuffer); } this.textureBuffer.clear(); }; /** * This function will draw the display object to the texture. * * @method renderWebGL * @param displayObject {DisplayObject} The display object to render this texture on * @param [matrix] {Matrix} Optional matrix to apply to the display object before rendering. * @param [clear] {Boolean} If true the texture will be cleared before the displayObject is drawn * @private */ PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, matrix, clear) { if(!this.valid)return; //TOOD replace position with matrix.. //Lets create a nice matrix to apply to our display object. Frame buffers come in upside down so we need to flip the matrix var wt = displayObject.worldTransform; wt.identity(); wt.translate(0, this.projection.y * 2); if(matrix)wt.append(matrix); wt.scale(1,-1); // setWorld Alpha to ensure that the object is renderer at full opacity displayObject.worldAlpha = 1; // Time to update all the children of the displayObject with the new matrix.. var children = displayObject.children; for(var i=0,j=children.length; i<j; i++) { children[i].updateTransform(); } // time for the webGL fun stuff! var gl = this.renderer.gl; gl.viewport(0, 0, this.width * this.resolution, this.height * this.resolution); gl.bindFramebuffer(gl.FRAMEBUFFER, this.textureBuffer.frameBuffer ); if(clear)this.textureBuffer.clear(); this.renderer.spriteBatch.dirty = true; this.renderer.renderDisplayObject(displayObject, this.projection, this.textureBuffer.frameBuffer); this.renderer.spriteBatch.dirty = true; }; /** * This function will draw the display object to the texture. * * @method renderCanvas * @param displayObject {DisplayObject} The display object to render this texture on * @param [matrix] {Matrix} Optional matrix to apply to the display object before rendering. * @param [clear] {Boolean} If true the texture will be cleared before the displayObject is drawn * @private */ PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, matrix, clear) { if(!this.valid)return; var wt = displayObject.worldTransform; wt.identity(); if(matrix)wt.append(matrix); // setWorld Alpha to ensure that the object is renderer at full opacity displayObject.worldAlpha = 1; // Time to update all the children of the displayObject with the new matrix.. var children = displayObject.children; for(var i = 0, j = children.length; i < j; i++) { children[i].updateTransform(); } if(clear)this.textureBuffer.clear(); var context = this.textureBuffer.context; var realResolution = this.renderer.resolution; this.renderer.resolution = this.resolution; this.renderer.renderDisplayObject(displayObject, context); this.renderer.resolution = realResolution; }; /** * Will return a HTML Image of the texture * * @method getImage * @return {Image} */ PIXI.RenderTexture.prototype.getImage = function() { var image = new Image(); image.src = this.getBase64(); return image; }; /** * Will return a a base64 encoded string of this texture. It works by calling RenderTexture.getCanvas and then running toDataURL on that. * * @method getBase64 * @return {String} A base64 encoded string of the texture. */ PIXI.RenderTexture.prototype.getBase64 = function() { return this.getCanvas().toDataURL(); }; /** * Creates a Canvas element, renders this RenderTexture to it and then returns it. * * @method getCanvas * @return {HTMLCanvasElement} A Canvas element with the texture rendered on. */ PIXI.RenderTexture.prototype.getCanvas = function() { if (this.renderer.type === PIXI.WEBGL_RENDERER) { var gl = this.renderer.gl; var width = this.textureBuffer.width; var height = this.textureBuffer.height; var webGLPixels = new Uint8Array(4 * width * height); gl.bindFramebuffer(gl.FRAMEBUFFER, this.textureBuffer.frameBuffer); gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, webGLPixels); gl.bindFramebuffer(gl.FRAMEBUFFER, null); var tempCanvas = new PIXI.CanvasBuffer(width, height); var canvasData = tempCanvas.context.getImageData(0, 0, width, height); canvasData.data.set(webGLPixels); tempCanvas.context.putImageData(canvasData, 0, 0); return tempCanvas.canvas; } else { return this.textureBuffer.canvas; } }; PIXI.RenderTexture.tempMatrix = new PIXI.Matrix(); </pre> </div> </div> </div> </div> </div> </div> </div> <script src="../assets/vendor/prettify/prettify-min.js"></script> <script>prettyPrint();</script> <script src="../assets/js/yui-prettify.js"></script> <script src="../assets/../api.js"></script> <script src="../assets/js/api-filter.js"></script> <script src="../assets/js/api-list.js"></script> <script src="../assets/js/api-search.js"></script> <script src="../assets/js/apidocs.js"></script> </body> </html>