Add tile texture queue

This commit is contained in:
Tom Payne
2013-03-26 18:16:06 +01:00
parent 00b862de10
commit 6221680b0b

View File

@@ -23,6 +23,7 @@ goog.require('ol.renderer.webgl.map.shader');
goog.require('ol.structs.Buffer');
goog.require('ol.structs.IntegerSet');
goog.require('ol.structs.LRUCache');
goog.require('ol.structs.PriorityQueue');
goog.require('ol.webgl');
goog.require('ol.webgl.WebGLContextEventType');
goog.require('ol.webgl.shader');
@@ -154,6 +155,51 @@ ol.renderer.webgl.Map = function(container, map) {
*/
this.textureCache_ = new ol.structs.LRUCache();
/**
* @private
* @type {ol.Coordinate}
*/
this.focus_ = null;
/**
* @private
* @type {ol.structs.PriorityQueue}
*/
this.tileTextureQueue_ = new ol.structs.PriorityQueue(
/**
* @param {Array} element Element.
* @return {number} Priority.
*/
goog.bind(function(element) {
var tile = /** @type {ol.Tile} */ (element[0]);
var tileCenter = /** @type {ol.Coordinate} */ (element[1]);
var tileResolution = /** @type {number} */ (element[2]);
var deltaX = tileCenter.x - this.focus_.x;
var deltaY = tileCenter.y - this.focus_.y;
return tileResolution * (deltaX * deltaX + deltaY * deltaY + 1);
}, this),
/**
* @param {Array} element Element.
* @return {string} Key.
*/
function(element) {
return /** @type {ol.Tile} */ (element[0]).getKey();
});
/**
* @private
* @type {ol.PostRenderFunction}
*/
this.loadNextTileTexture_ = goog.bind(
function(map, frameState) {
if (!this.tileTextureQueue_.isEmpty()) {
this.tileTextureQueue_.reprioritize();
var tile =
/** @type {ol.Tile} */ (this.tileTextureQueue_.dequeue()[0]);
this.bindTileTexture(tile, goog.webgl.LINEAR, goog.webgl.LINEAR);
}
}, this);
/**
* @private
* @type {number}
@@ -424,6 +470,14 @@ ol.renderer.webgl.Map.prototype.getShader = function(shaderObject) {
};
/**
* @return {ol.structs.PriorityQueue} Tile texture queue.
*/
ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() {
return this.tileTextureQueue_;
};
/**
* @param {goog.events.Event} event Event.
* @protected
@@ -494,6 +548,8 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
return false;
}
this.focus_ = frameState.focus;
this.textureCache_.set(frameState.time.toString(), null);
++this.textureCacheFrameMarkerCount_;
@@ -584,4 +640,9 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
frameState.postRenderFunctions.push(goog.bind(this.expireCache_, this));
}
if (!this.tileTextureQueue_.isEmpty()) {
frameState.postRenderFunctions.push(this.loadNextTileTexture_);
frameState.animate = true;
}
};