Register post-render functions instead of using an event
This commit is contained in:
@@ -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}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user