'use strict'; exports.__esModule = true; var _pixiGlCore = require('pixi-gl-core'); var _const = require('../../const'); var _RenderTarget = require('./utils/RenderTarget'); var _RenderTarget2 = _interopRequireDefault(_RenderTarget); var _utils = require('../../utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * Helper class to create a webGL Texture * * @class * @memberof PIXI */ var TextureManager = function () { /** * @param {PIXI.WebGLRenderer} renderer - A reference to the current renderer */ function TextureManager(renderer) { _classCallCheck(this, TextureManager); /** * A reference to the current renderer * * @member {PIXI.WebGLRenderer} */ this.renderer = renderer; /** * The current WebGL rendering context * * @member {WebGLRenderingContext} */ this.gl = renderer.gl; /** * Track textures in the renderer so we can no longer listen to them on destruction. * * @member {Array<*>} * @private */ this._managedTextures = []; } /** * Binds a texture. * */ TextureManager.prototype.bindTexture = function bindTexture() {} // empty /** * Gets a texture. * */ ; TextureManager.prototype.getTexture = function getTexture() {} // empty /** * Updates and/or Creates a WebGL texture for the renderer's context. * * @param {PIXI.BaseTexture|PIXI.Texture} texture - the texture to update * @param {Number} location - the location the texture will be bound to. * @return {GLTexture} The gl texture. */ ; TextureManager.prototype.updateTexture = function updateTexture(texture, location) { // assume it good! // texture = texture.baseTexture || texture; location = location || 0; var gl = this.gl; var isRenderTexture = !!texture._glRenderTargets; if (!texture.hasLoaded) { return null; } gl.activeTexture(gl.TEXTURE0 + location); var glTexture = texture._glTextures[this.renderer.CONTEXT_UID]; if (!glTexture) { if (isRenderTexture) { var renderTarget = new _RenderTarget2.default(this.gl, texture.width, texture.height, texture.scaleMode, texture.resolution); renderTarget.resize(texture.width, texture.height); texture._glRenderTargets[this.renderer.CONTEXT_UID] = renderTarget; glTexture = renderTarget.texture; } else { glTexture = new _pixiGlCore.GLTexture(this.gl, null, null, null, null); glTexture.bind(location); glTexture.premultiplyAlpha = true; glTexture.upload(texture.source); } texture._glTextures[this.renderer.CONTEXT_UID] = glTexture; texture.on('update', this.updateTexture, this); texture.on('dispose', this.destroyTexture, this); this._managedTextures.push(texture); if (texture.isPowerOfTwo) { if (texture.mipmap) { glTexture.enableMipmap(); } if (texture.wrapMode === _const.WRAP_MODES.CLAMP) { glTexture.enableWrapClamp(); } else if (texture.wrapMode === _const.WRAP_MODES.REPEAT) { glTexture.enableWrapRepeat(); } else { glTexture.enableWrapMirrorRepeat(); } } else { glTexture.enableWrapClamp(); } if (texture.scaleMode === _const.SCALE_MODES.NEAREST) { glTexture.enableNearestScaling(); } else { glTexture.enableLinearScaling(); } } // the texture already exists so we only need to update it.. else if (isRenderTexture) { texture._glRenderTargets[this.renderer.CONTEXT_UID].resize(texture.width, texture.height); } else { glTexture.upload(texture.source); } this.renderer.boundTextures[location] = texture; return glTexture; }; /** * Deletes the texture from WebGL * * @param {PIXI.BaseTexture|PIXI.Texture} texture - the texture to destroy * @param {boolean} [skipRemove=false] - Whether to skip removing the texture from the TextureManager. */ TextureManager.prototype.destroyTexture = function destroyTexture(texture, skipRemove) { texture = texture.baseTexture || texture; if (!texture.hasLoaded) { return; } if (texture._glTextures[this.renderer.CONTEXT_UID]) { this.renderer.unbindTexture(texture); texture._glTextures[this.renderer.CONTEXT_UID].destroy(); texture.off('update', this.updateTexture, this); texture.off('dispose', this.destroyTexture, this); delete texture._glTextures[this.renderer.CONTEXT_UID]; if (!skipRemove) { var i = this._managedTextures.indexOf(texture); if (i !== -1) { (0, _utils.removeItems)(this._managedTextures, i, 1); } } } }; /** * Deletes all the textures from WebGL */ TextureManager.prototype.removeAll = function removeAll() { // empty all the old gl textures as they are useless now for (var i = 0; i < this._managedTextures.length; ++i) { var texture = this._managedTextures[i]; if (texture._glTextures[this.renderer.CONTEXT_UID]) { delete texture._glTextures[this.renderer.CONTEXT_UID]; } } }; /** * Destroys this manager and removes all its textures */ TextureManager.prototype.destroy = function destroy() { // destroy managed textures for (var i = 0; i < this._managedTextures.length; ++i) { var texture = this._managedTextures[i]; this.destroyTexture(texture, true); texture.off('update', this.updateTexture, this); texture.off('dispose', this.destroyTexture, this); } this._managedTextures = null; }; return TextureManager; }(); exports.default = TextureManager; //# sourceMappingURL=TextureManager.js.map