From f645a9e1e4671b1952adebec4964383e46194a45 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 19 Jun 2015 13:06:29 +0200 Subject: [PATCH] Make unmanaged vector layers behave more like ol.FeatureOverlay * Skipped features need to be hit-detected on unmanaged layers. * updateWhileAnimating and updateWhileInteracting are recommended to achieve the same instant visual feedback that ol.FeatureOverlay had. --- changelog/upgrade-notes.md | 6 ++++-- src/ol/interaction/modifyinteraction.js | 4 +++- src/ol/interaction/selectinteraction.js | 4 +++- src/ol/renderer/canvas/canvasvectorlayerrenderer.js | 5 +++-- src/ol/renderer/dom/domvectorlayerrenderer.js | 5 +++-- src/ol/renderer/webgl/webglvectorlayerrenderer.js | 3 ++- .../ol/renderer/canvas/canvasvectorlayerrenderer.test.js | 2 ++ 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/changelog/upgrade-notes.md b/changelog/upgrade-notes.md index 5d3abb73d9..ea637d1765 100644 --- a/changelog/upgrade-notes.md +++ b/changelog/upgrade-notes.md @@ -20,11 +20,13 @@ you will have to change this to: var collection = new ol.Collection(); var featureOverlay = new ol.layer.Vector({ map: map, - style: overlayStyle, source: new ol.source.Vector({ features: collection, useSpatialIndex: false // optional, might improve performance - }); + }), + style: overlayStyle, + updateWhileAnimating: true, // optional, for instant visual feedback + updateWhileInteracting: true // optional, for instant visual feedback }); featureOverlay.getSource().addFeature(feature); featureOverlay.getSource().removeFeature(feature); diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js index ad6e34993d..e90df9d183 100644 --- a/src/ol/interaction/modifyinteraction.js +++ b/src/ol/interaction/modifyinteraction.js @@ -122,7 +122,9 @@ ol.interaction.Modify = function(options) { wrapX: goog.isDef(options.wrapX) ? options.wrapX : false }), style: goog.isDef(options.style) ? options.style : - ol.interaction.Modify.getDefaultStyleFunction() + ol.interaction.Modify.getDefaultStyleFunction(), + updateWhileAnimating: true, + updateWhileInteracting: true }); /** diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js index 1f47a75353..6c4b73d8e4 100644 --- a/src/ol/interaction/selectinteraction.js +++ b/src/ol/interaction/selectinteraction.js @@ -178,7 +178,9 @@ ol.interaction.Select = function(opt_options) { wrapX: options.wrapX }), style: goog.isDef(options.style) ? options.style : - ol.interaction.Select.getDefaultStyleFunction() + ol.interaction.Select.getDefaultStyleFunction(), + updateWhileAnimating: true, + updateWhileInteracting: true }); var features = this.featureOverlay_.getSource().getFeaturesCollection(); diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js index d796e7d74a..7b4a89b065 100644 --- a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js @@ -160,10 +160,11 @@ ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtCoordinate = var resolution = frameState.viewState.resolution; var rotation = frameState.viewState.rotation; var layer = this.getLayer(); + var layerState = frameState.layerStates[goog.getUid(layer)]; /** @type {Object.} */ var features = {}; - return this.replayGroup_.forEachFeatureAtCoordinate(coordinate, - resolution, rotation, frameState.skippedFeatureUids, + return this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution, + rotation, layerState.managed ? frameState.skippedFeatureUids : {}, /** * @param {ol.Feature} feature Feature. * @return {?} Callback result. diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js index db613d3034..8a09696b3f 100644 --- a/src/ol/renderer/dom/domvectorlayerrenderer.js +++ b/src/ol/renderer/dom/domvectorlayerrenderer.js @@ -184,10 +184,11 @@ ol.renderer.dom.VectorLayer.prototype.forEachFeatureAtCoordinate = var resolution = frameState.viewState.resolution; var rotation = frameState.viewState.rotation; var layer = this.getLayer(); + var layerState = frameState.layerStates[goog.getUid(layer)]; /** @type {Object.} */ var features = {}; - return this.replayGroup_.forEachFeatureAtCoordinate(coordinate, - resolution, rotation, frameState.skippedFeatureUids, + return this.replayGroup_.forEachFeatureAtCoordinate(coordinate, resolution, + rotation, layerState.managed ? frameState.skippedFeatureUids : {}, /** * @param {ol.Feature} feature Feature. * @return {?} Callback result. diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js index 1099114a4a..cc3dde07ca 100644 --- a/src/ol/renderer/webgl/webglvectorlayerrenderer.js +++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js @@ -122,7 +122,8 @@ ol.renderer.webgl.VectorLayer.prototype.forEachFeatureAtCoordinate = context, viewState.center, viewState.resolution, viewState.rotation, frameState.size, frameState.pixelRatio, layerState.opacity, layerState.brightness, layerState.contrast, - layerState.hue, layerState.saturation, frameState.skippedFeatureUids, + layerState.hue, layerState.saturation, + layerState.managed ? frameState.skippedFeatureUids : {}, /** * @param {ol.Feature} feature Feature. * @return {?} Callback result. diff --git a/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js index 82636f5730..5a97a9d89e 100644 --- a/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js +++ b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js @@ -76,12 +76,14 @@ describe('ol.renderer.canvas.VectorLayer', function() { var spy = sinon.spy(); var coordinate = [0, 0]; var frameState = { + layerStates: {}, skippedFeatureUids: {}, viewState: { resolution: 1, rotation: 0 } }; + frameState.layerStates[goog.getUid(layer)] = {}; renderer.forEachFeatureAtCoordinate( coordinate, frameState, spy, undefined); expect(spy.callCount).to.be(1);