var GLTexture = require('pixi-gl-core').GLTexture,
CONST = require('../../const'),
RenderTarget = require('./utils/RenderTarget'),
utils = require('../../utils');
/**
* Helper class to create a webGL Texture
*
* @class
* @memberof PIXI
* @param renderer {PIXI.WebGLRenderer} A reference to the current renderer
*/
var TextureManager = function(renderer)
{
/**
* 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 = [];
};
TextureManager.prototype.bindTexture = function()
{
};
TextureManager.prototype.getTexture = function()
{
};
/**
* Updates and/or Creates a WebGL texture for the renderer's context.
*
* @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to update
*/
TextureManager.prototype.updateTexture = function(texture)
{
texture = texture.baseTexture || texture;
var isRenderTexture = !!texture._glRenderTargets;
if (!texture.hasLoaded)
{
return;
}
var glTexture = texture._glTextures[this.renderer.CONTEXT_UID];
if (!glTexture)
{
if(isRenderTexture)
{
var renderTarget = new RenderTarget(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 GLTexture(this.gl);
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();
}
}
else
{
// the textur ealrady exists so we only need to update it..
if(isRenderTexture)
{
texture._glRenderTargets[this.renderer.CONTEXT_UID].resize(texture.width, texture.height);
}
else
{
glTexture.upload(texture.source);
}
}
return glTexture;
};
/**
* Deletes the texture from WebGL
*
* @param texture {PIXI.BaseTexture|PIXI.Texture} the texture to destroy
* @param [skipRemove=false] {boolean} Whether to skip removing the texture from the TextureManager.
*/
TextureManager.prototype.destroyTexture = function(texture, skipRemove)
{
texture = texture.baseTexture || texture;
if (!texture.hasLoaded)
{
return;
}
if (texture._glTextures[this.renderer.CONTEXT_UID])
{
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) {
utils.removeItems(this._managedTextures, i, 1);
}
}
}
};
/**
* Deletes all the textures from WebGL
*/
TextureManager.prototype.removeAll = function()
{
// 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 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;
};
module.exports = TextureManager;