import Texture2D from '../Texture2D';
import glenum from '../core/glenum';
import util from '../core/util';
var TexturePool = function () {
this._pool = {};
this._allocatedTextures = [];
};
TexturePool.prototype = {
constructor: TexturePool,
get: function (parameters) {
var key = generateKey(parameters);
if (!this._pool.hasOwnProperty(key)) {
this._pool[key] = [];
}
var list = this._pool[key];
if (!list.length) {
var texture = new Texture2D(parameters);
this._allocatedTextures.push(texture);
return texture;
}
return list.pop();
},
put: function (texture) {
var key = generateKey(texture);
if (!this._pool.hasOwnProperty(key)) {
this._pool[key] = [];
}
var list = this._pool[key];
list.push(texture);
},
clear: function (renderer) {
for (var i = 0; i < this._allocatedTextures.length; i++) {
this._allocatedTextures[i].dispose(renderer);
}
this._pool = {};
this._allocatedTextures = [];
}
};
var defaultParams = {
width: 512,
height: 512,
type: glenum.UNSIGNED_BYTE,
format: glenum.RGBA,
wrapS: glenum.CLAMP_TO_EDGE,
wrapT: glenum.CLAMP_TO_EDGE,
minFilter: glenum.LINEAR_MIPMAP_LINEAR,
magFilter: glenum.LINEAR,
useMipmap: true,
anisotropic: 1,
flipY: true,
unpackAlignment: 4,
premultiplyAlpha: false
};
var defaultParamPropList = Object.keys(defaultParams);
function generateKey(parameters) {
util.defaultsWithPropList(parameters, defaultParams, defaultParamPropList);
fallBack(parameters);
var key = '';
for (var i = 0; i < defaultParamPropList.length; i++) {
var name = defaultParamPropList[i];
var chunk = parameters[name].toString();
key += chunk;
}
return key;
}
function fallBack(target) {
var IPOT = isPowerOfTwo(target.width, target.height);
if (target.format === glenum.DEPTH_COMPONENT) {
target.useMipmap = false;
}
if (!IPOT || !target.useMipmap) {
if (target.minFilter == glenum.NEAREST_MIPMAP_NEAREST ||
target.minFilter == glenum.NEAREST_MIPMAP_LINEAR) {
target.minFilter = glenum.NEAREST;
} else if (
target.minFilter == glenum.LINEAR_MIPMAP_LINEAR ||
target.minFilter == glenum.LINEAR_MIPMAP_NEAREST
) {
target.minFilter = glenum.LINEAR;
}
}
if (!IPOT) {
target.wrapS = glenum.CLAMP_TO_EDGE;
target.wrapT = glenum.CLAMP_TO_EDGE;
}
}
function isPowerOfTwo(width, height) {
return (width & (width-1)) === 0 &&
(height & (height-1)) === 0;
}
export default TexturePool;
|