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 8a7a7f7fb3..12ad78760d 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -229,7 +229,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; }