From 0be2fb6e75ffb449131de2c01991e8df2c5eaebb Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 21 Aug 2012 18:00:27 +0200 Subject: [PATCH] Defer texture loads until post render --- src/ol/webgl/tilelayerrenderer.js | 83 +++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/src/ol/webgl/tilelayerrenderer.js b/src/ol/webgl/tilelayerrenderer.js index 717a3901bd..a5c4723181 100644 --- a/src/ol/webgl/tilelayerrenderer.js +++ b/src/ol/webgl/tilelayerrenderer.js @@ -1,6 +1,5 @@ // FIXME large resolutions lead to too large framebuffers :-( // FIXME animated shaders! check in redraw -// FIXME defer texture uploads goog.provide('ol.webgl.TileLayerRenderer'); goog.provide('ol.webgl.tilelayerrenderer'); @@ -285,6 +284,8 @@ ol.webgl.TileLayerRenderer.prototype.handleWebGLContextLost = function() { */ ol.webgl.TileLayerRenderer.prototype.render = function() { + var animate = false; + var mapRenderer = this.getMapRenderer(); var map = this.getMap(); var gl = mapRenderer.getGL(); @@ -369,12 +370,24 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { */ var tilesToDrawByZ = {}; + /** + * @type {Array.} + */ + var imagesToLoad = []; + tilesToDrawByZ[z] = {}; tileBounds.forEachTileCoord(z, function(tileCoord) { + var tile = tileStore.getTile(tileCoord); + if (goog.isNull(tile)) { } else if (tile.getState() == ol.TileState.LOADED) { - tilesToDrawByZ[z][tileCoord.toString()] = tile; + if (mapRenderer.isImageTextureLoaded(tile.getImage())) { + tilesToDrawByZ[z][tileCoord.toString()] = tile; + return; + } else { + imagesToLoad.push(tile.getImage()); + } } else { var tileKey = goog.getUid(tile); if (!(tileKey in this.tileChangeListenerKeys_)) { @@ -383,30 +396,32 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { this.tileChangeListenerKeys_[tileKey] = goog.events.listen(tile, goog.events.EventType.CHANGE, this.handleTileChange, false, this); } - // FIXME this could be more efficient about filling partial holes - tileGrid.forEachTileCoordParentTileBounds( - tileCoord, - function(z, tileBounds) { - var fullyCovered = true; - tileBounds.forEachTileCoord(z, function(tileCoord) { - var tileCoordKey = tileCoord.toString(); - if (tilesToDrawByZ[z] && tilesToDrawByZ[z][tileCoordKey]) { - return; - } - var tile = tileStore.getTile(tileCoord); - if (!goog.isNull(tile) && - tile.getState() == ol.TileState.LOADED) { - if (!tilesToDrawByZ[z]) { - tilesToDrawByZ[z] = {}; - } - tilesToDrawByZ[z][tileCoordKey] = tile; - } else { - fullyCovered = false; - } - }); - return fullyCovered; - }); } + + // FIXME this could be more efficient about filling partial holes + tileGrid.forEachTileCoordParentTileBounds( + tileCoord, + function(z, tileBounds) { + var fullyCovered = true; + tileBounds.forEachTileCoord(z, function(tileCoord) { + var tileCoordKey = tileCoord.toString(); + if (tilesToDrawByZ[z] && tilesToDrawByZ[z][tileCoordKey]) { + return; + } + var tile = tileStore.getTile(tileCoord); + if (!goog.isNull(tile) && + tile.getState() == ol.TileState.LOADED) { + if (!tilesToDrawByZ[z]) { + tilesToDrawByZ[z] = {}; + } + tilesToDrawByZ[z][tileCoordKey] = tile; + } else { + fullyCovered = false; + } + }); + return fullyCovered; + }); + }, this); var zs = goog.object.getKeys(tilesToDrawByZ); @@ -454,4 +469,22 @@ ol.webgl.TileLayerRenderer.prototype.render = function() { -0.5, 0); + if (!goog.array.isEmpty(imagesToLoad)) { + goog.events.listenOnce( + map, + ol.MapEventType.POST_RENDER, + goog.partial(function(mapRenderer, imagesToLoad) { + if (goog.DEBUG) { + ol.webgl.tilelayerrenderer.logger.info('uploading textures'); + } + goog.array.forEach(imagesToLoad, function(image) { + mapRenderer.bindImageTexture( + image, goog.webgl.LINEAR, goog.webgl.LINEAR); + }); + }, mapRenderer, imagesToLoad)); + animate = true; + } + + return animate; + };