Register post-render functions instead of using an event

This commit is contained in:
Tom Payne
2013-01-11 01:09:10 +01:00
parent 434dd84c04
commit f00e299039
3 changed files with 43 additions and 34 deletions

View File

@@ -1,4 +1,5 @@
goog.provide('ol.FrameState'); goog.provide('ol.FrameState');
goog.provide('ol.PostRenderFunction');
goog.provide('ol.PreRenderFunction'); goog.provide('ol.PreRenderFunction');
goog.require('ol.Color'); goog.require('ol.Color');
@@ -15,6 +16,7 @@ goog.require('ol.layer.LayerState');
* extent: (null|ol.Extent), * extent: (null|ol.Extent),
* layersArray: Array.<ol.layer.Layer>, * layersArray: Array.<ol.layer.Layer>,
* layerStates: Object.<number, ol.layer.LayerState>, * layerStates: Object.<number, ol.layer.LayerState>,
* postRenderFunctions: Array.<ol.PostRenderFunction>,
* size: ol.Size, * size: ol.Size,
* time: number, * time: number,
* view2DState: ol.View2DState}} * view2DState: ol.View2DState}}
@@ -22,6 +24,12 @@ goog.require('ol.layer.LayerState');
ol.FrameState; ol.FrameState;
/**
* @typedef {function(ol.Map, ?ol.FrameState): boolean}
*/
ol.PostRenderFunction;
/** /**
* @typedef {function(ol.Map, ?ol.FrameState): boolean} * @typedef {function(ol.Map, ?ol.FrameState): boolean}
*/ */

View File

@@ -89,14 +89,6 @@ ol.DEFAULT_RENDERER_HINTS = [
]; ];
/**
* @enum {string}
*/
ol.MapEventType = {
POSTRENDER: 'postrender'
};
/** /**
* @enum {string} * @enum {string}
*/ */
@@ -245,9 +237,17 @@ ol.Map = function(mapOptions) {
*/ */
this.preRenderFunctions_ = []; this.preRenderFunctions_ = [];
this.dispatchPostRenderEvent_ = goog.bind(function() { /**
this.dispatchEvent(ol.MapEventType.POSTRENDER); * @private
}, this); * @type {Array.<ol.PostRenderFunction>}
*/
this.postRenderFunctions_ = [];
/**
* @private
* @type {function(this: ol.Map)}
*/
this.handlePostRender_ = goog.bind(this.handlePostRender, this);
this.setValues(mapOptionsInternal.values); 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 * @protected
*/ */
@@ -556,6 +570,7 @@ ol.Map.prototype.renderFrame_ = function(time) {
extent: null, extent: null,
layersArray: layersArray, layersArray: layersArray,
layerStates: layerStates, layerStates: layerStates,
postRenderFunctions: [],
size: size, size: size,
view2DState: view2DState, view2DState: view2DState,
time: time time: time
@@ -596,15 +611,13 @@ ol.Map.prototype.renderFrame_ = function(time) {
if (frameState.animate) { if (frameState.animate) {
this.requestRenderFrame(); this.requestRenderFrame();
} }
Array.prototype.push.apply(
this.postRenderFunctions_, frameState.postRenderFunctions);
} }
this.frameState_ = frameState; this.frameState_ = frameState;
this.dirty_ = false; this.dirty_ = false;
if (goog.DEBUG) { goog.global.setTimeout(this.handlePostRender_, 0);
this.logger.info('postrender');
}
goog.global.setTimeout(this.dispatchPostRenderEvent_, 0);
}; };

View File

@@ -17,6 +17,7 @@ goog.require('goog.vec.Mat4');
goog.require('goog.vec.Vec4'); goog.require('goog.vec.Vec4');
goog.require('goog.webgl'); goog.require('goog.webgl');
goog.require('ol.Coordinate'); goog.require('ol.Coordinate');
goog.require('ol.FrameState');
goog.require('ol.Size'); goog.require('ol.Size');
goog.require('ol.TileState'); goog.require('ol.TileState');
goog.require('ol.layer.TileLayer'); 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. * @param {number} framebufferDimension Framebuffer dimension.
* @private * @private
*/ */
ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ = ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
function(framebufferDimension) { function(frameState, framebufferDimension) {
var mapRenderer = this.getMapRenderer(); var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL(); var gl = mapRenderer.getGL();
@@ -192,13 +194,8 @@ ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
} }
} else { } else {
var map = this.getMap(); var map = this.getMap();
goog.events.listenOnce( frameState.postRenderFunctions.push(
map,
ol.MapEventType.POSTRENDER,
goog.partial(function(gl, framebuffer, texture) { goog.partial(function(gl, framebuffer, texture) {
if (goog.DEBUG) {
this.logger.info('freeing WebGL resources on postrender');
}
if (!gl.isContextLost()) { if (!gl.isContextLost()) {
gl.deleteFramebuffer(framebuffer); gl.deleteFramebuffer(framebuffer);
gl.deleteTexture(texture); gl.deleteTexture(texture);
@@ -330,7 +327,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
minX + framebufferExtentSize.width, minX + framebufferExtentSize.width,
minY + framebufferExtentSize.height); minY + framebufferExtentSize.height);
this.bindFramebuffer_(framebufferDimension); this.bindFramebuffer_(frameState, framebufferDimension);
gl.viewport(0, 0, framebufferDimension, framebufferDimension); gl.viewport(0, 0, framebufferDimension, framebufferDimension);
gl.clearColor(0, 0, 0, 0); gl.clearColor(0, 0, 0, 0);
@@ -455,21 +452,12 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
}, this); }, this);
if (!goog.array.isEmpty(tilesToLoad)) { if (!goog.array.isEmpty(tilesToLoad)) {
goog.events.listenOnce( frameState.postRenderFunctions.push(
this.getMap(),
ol.MapEventType.POSTRENDER,
goog.partial(function(mapRenderer, tilesToLoad) { goog.partial(function(mapRenderer, tilesToLoad) {
if (goog.DEBUG) {
this.logger.info(
'uploading ' + tilesToLoad.length + ' textures');
}
goog.array.forEach(tilesToLoad, function(tile) { goog.array.forEach(tilesToLoad, function(tile) {
mapRenderer.bindTileTexture( mapRenderer.bindTileTexture(
tile, goog.webgl.LINEAR, goog.webgl.LINEAR); tile, goog.webgl.LINEAR, goog.webgl.LINEAR);
}); });
if (goog.DEBUG) {
this.logger.info('uploaded textures');
}
}, mapRenderer, tilesToLoad)); }, mapRenderer, tilesToLoad));
} }