diff --git a/src/ol/framestate.js b/src/ol/framestate.js index 51a7dfaacb..ccb38ccdc3 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -1,4 +1,5 @@ goog.provide('ol.FrameState'); +goog.provide('ol.PostRenderFunction'); goog.provide('ol.PreRenderFunction'); goog.require('ol.Color'); @@ -15,6 +16,7 @@ goog.require('ol.layer.LayerState'); * extent: (null|ol.Extent), * layersArray: Array., * layerStates: Object., + * postRenderFunctions: Array., * size: ol.Size, * time: number, * view2DState: ol.View2DState}} @@ -22,6 +24,12 @@ goog.require('ol.layer.LayerState'); ol.FrameState; +/** + * @typedef {function(ol.Map, ?ol.FrameState): boolean} + */ +ol.PostRenderFunction; + + /** * @typedef {function(ol.Map, ?ol.FrameState): boolean} */ diff --git a/src/ol/map.js b/src/ol/map.js index 8485f2a221..8b623c8320 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -89,14 +89,6 @@ ol.DEFAULT_RENDERER_HINTS = [ ]; -/** - * @enum {string} - */ -ol.MapEventType = { - POSTRENDER: 'postrender' -}; - - /** * @enum {string} */ @@ -245,9 +237,17 @@ ol.Map = function(mapOptions) { */ this.preRenderFunctions_ = []; - this.dispatchPostRenderEvent_ = goog.bind(function() { - this.dispatchEvent(ol.MapEventType.POSTRENDER); - }, this); + /** + * @private + * @type {Array.} + */ + this.postRenderFunctions_ = []; + + /** + * @private + * @type {function(this: ol.Map)} + */ + this.handlePostRender_ = goog.bind(this.handlePostRender, this); this.setValues(mapOptionsInternal.values); @@ -470,6 +470,20 @@ ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) { }; +/** + * @protected + */ +ol.Map.prototype.handlePostRender = function() { + goog.array.forEach( + this.postRenderFunctions_, + function(postRenderFunction) { + postRenderFunction(this, this.frameState_); + }, + this); + this.postRenderFunctions_.length = 0; +}; + + /** * @protected */ @@ -556,6 +570,7 @@ ol.Map.prototype.renderFrame_ = function(time) { extent: null, layersArray: layersArray, layerStates: layerStates, + postRenderFunctions: [], size: size, view2DState: view2DState, time: time @@ -596,15 +611,13 @@ ol.Map.prototype.renderFrame_ = function(time) { if (frameState.animate) { this.requestRenderFrame(); } + Array.prototype.push.apply( + this.postRenderFunctions_, frameState.postRenderFunctions); } this.frameState_ = frameState; this.dirty_ = false; - if (goog.DEBUG) { - this.logger.info('postrender'); - } - - goog.global.setTimeout(this.dispatchPostRenderEvent_, 0); + goog.global.setTimeout(this.handlePostRender_, 0); }; diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js index 23de60684e..fa4160dfe1 100644 --- a/src/ol/renderer/webgl/webgltilelayerrenderer.js +++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js @@ -17,6 +17,7 @@ goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('goog.webgl'); goog.require('ol.Coordinate'); +goog.require('ol.FrameState'); goog.require('ol.Size'); goog.require('ol.TileState'); goog.require('ol.layer.TileLayer'); @@ -166,11 +167,12 @@ goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer); /** + * @param {ol.FrameState} frameState Frame state. * @param {number} framebufferDimension Framebuffer dimension. * @private */ ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ = - function(framebufferDimension) { + function(frameState, framebufferDimension) { var mapRenderer = this.getMapRenderer(); var gl = mapRenderer.getGL(); @@ -192,13 +194,8 @@ ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ = } } else { var map = this.getMap(); - goog.events.listenOnce( - map, - ol.MapEventType.POSTRENDER, + frameState.postRenderFunctions.push( goog.partial(function(gl, framebuffer, texture) { - if (goog.DEBUG) { - this.logger.info('freeing WebGL resources on postrender'); - } if (!gl.isContextLost()) { gl.deleteFramebuffer(framebuffer); gl.deleteTexture(texture); @@ -330,7 +327,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = minX + framebufferExtentSize.width, minY + framebufferExtentSize.height); - this.bindFramebuffer_(framebufferDimension); + this.bindFramebuffer_(frameState, framebufferDimension); gl.viewport(0, 0, framebufferDimension, framebufferDimension); gl.clearColor(0, 0, 0, 0); @@ -455,21 +452,12 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame = }, this); if (!goog.array.isEmpty(tilesToLoad)) { - goog.events.listenOnce( - this.getMap(), - ol.MapEventType.POSTRENDER, + frameState.postRenderFunctions.push( goog.partial(function(mapRenderer, tilesToLoad) { - if (goog.DEBUG) { - this.logger.info( - 'uploading ' + tilesToLoad.length + ' textures'); - } goog.array.forEach(tilesToLoad, function(tile) { mapRenderer.bindTileTexture( tile, goog.webgl.LINEAR, goog.webgl.LINEAR); }); - if (goog.DEBUG) { - this.logger.info('uploaded textures'); - } }, mapRenderer, tilesToLoad)); }