From b1a73da9dd297c38355e327e0626e6f8bc6f5344 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Wed, 14 Jan 2015 16:33:05 +0100 Subject: [PATCH] Add updateWhileAnimating option With this option, vector batches will be recreated with every frame. For animations, this means that vector data won't be clipped to the extent at which the animation started. --- externs/olx.js | 12 ++++++++++++ src/ol/layer/vectorlayer.js | 17 +++++++++++++++++ .../canvas/canvasvectorlayerrenderer.js | 3 ++- src/ol/renderer/dom/domvectorlayerrenderer.js | 3 ++- .../renderer/webgl/webglvectorlayerrenderer.js | 3 ++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index c2ce2a2b9f..5e76abf33b 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -3220,6 +3220,7 @@ olx.layer.TileOptions.prototype.useInterimTilesOnError; * saturation: (number|undefined), * source: (ol.source.Vector|undefined), * style: (ol.style.Style|Array.|ol.style.StyleFunction|undefined), + * updateWhileAnimating: (boolean|undefined), * visible: (boolean|undefined)}} * @api */ @@ -3328,6 +3329,17 @@ olx.layer.VectorOptions.prototype.source; olx.layer.VectorOptions.prototype.style; +/** + * When set to `true`, feature batches will be recreated during animations. + * This means that no vectors will be shown clipped, but the setting will have a + * performance impact for large amounts of vector data. When set to `false`, + * batches will be recreated when no animation is active. Default is `false`. + * @type {boolean|undefined} + * @api + */ +olx.layer.VectorOptions.prototype.updateWhileAnimating; + + /** * Visibility. Default is `true` (visible). * @type {boolean|undefined} diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index a7dbc3b773..90d5e8657a 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -36,6 +36,7 @@ ol.layer.Vector = function(opt_options) { delete baseOptions.style; delete baseOptions.renderBuffer; + delete baseOptions.updateWhileAnimating; goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions)); /** @@ -61,6 +62,13 @@ ol.layer.Vector = function(opt_options) { this.setStyle(options.style); + /** + * @type {boolean} + * @private + */ + this.updateWhileAnimating_ = goog.isDef(options.updateWhileAnimating) ? + options.updateWhileAnimating : false; + }; goog.inherits(ol.layer.Vector, ol.layer.Layer); @@ -113,6 +121,15 @@ ol.layer.Vector.prototype.getStyleFunction = function() { }; +/** + * @return {boolean} Whether the rendered layer should be updated while + * animating. + */ +ol.layer.Vector.prototype.getUpdateWhileAnimating = function() { + return this.updateWhileAnimating_; +}; + + /** * @param {function(ol.Feature, ol.Feature):number|null|undefined} renderOrder * Render order. diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index 2ee8c5bf38..380c4daf0e 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -169,7 +169,8 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = frameState.attributions, vectorSource.getAttributions()); this.updateLogos(frameState, vectorSource); - if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || + if (!this.dirty_ && (!vectorLayer.getUpdateWhileAnimating() && + frameState.viewHints[ol.ViewHint.ANIMATING] || frameState.viewHints[ol.ViewHint.INTERACTING])) { return true; } diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index d388bc0d21..9043c5a655 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -209,7 +209,8 @@ ol.renderer.dom.VectorLayer.prototype.prepareFrame = frameState.attributions, vectorSource.getAttributions()); this.updateLogos(frameState, vectorSource); - if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || + if (!this.dirty_ && (!vectorLayer.getUpdateWhileAnimating() && + frameState.viewHints[ol.ViewHint.ANIMATING] || frameState.viewHints[ol.ViewHint.INTERACTING])) { return true; } diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index e2a685a633..b6f2774ae8 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -128,7 +128,8 @@ ol.renderer.webgl.VectorLayer.prototype.prepareFrame = frameState.attributions, vectorSource.getAttributions()); this.updateLogos(frameState, vectorSource); - if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] || + if (!this.dirty_ && (!vectorLayer.getUpdateWhileAnimating() && + frameState.viewHints[ol.ViewHint.ANIMATING] || frameState.viewHints[ol.ViewHint.INTERACTING])) { return true; }