From 5d31a44c12d26b85e4f7c763c6a4b324cec449ea Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 12 Jan 2013 16:51:17 +0100 Subject: [PATCH 1/7] Implement view hints architecture --- src/ol/framestate.js | 3 ++- src/ol/interaction/dragpaninteraction.js | 1 + src/ol/map.js | 2 ++ src/ol/view.js | 34 ++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/ol/framestate.js b/src/ol/framestate.js index 32a7edb31c..d3d0f5ffa7 100644 --- a/src/ol/framestate.js +++ b/src/ol/framestate.js @@ -23,7 +23,8 @@ goog.require('ol.layer.LayerState'); * size: ol.Size, * tileQueue: ol.TileQueue, * time: number, - * view2DState: ol.View2DState}} + * view2DState: ol.View2DState, + * viewHints: Array.}} */ ol.FrameState; diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 32a5acc697..66b2645a4b 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -6,6 +6,7 @@ goog.require('goog.asserts'); goog.require('ol.Coordinate'); goog.require('ol.MapBrowserEvent'); goog.require('ol.View2D'); +goog.require('ol.ViewHint'); goog.require('ol.interaction.ConditionType'); goog.require('ol.interaction.Drag'); diff --git a/src/ol/map.js b/src/ol/map.js index a617727b2e..300a09b015 100644 --- a/src/ol/map.js +++ b/src/ol/map.js @@ -585,6 +585,7 @@ ol.Map.prototype.renderFrame_ = function(time) { if (goog.isDef(layersArray) && goog.isDef(size) && goog.isDef(view2D) && view2D.isDef()) { var backgroundColor = this.getBackgroundColor(); + var viewHints = view.getHints(); var layerStates = {}; goog.array.forEach(layersArray, function(layer) { layerStates[goog.getUid(layer)] = layer.getLayerState(); @@ -601,6 +602,7 @@ ol.Map.prototype.renderFrame_ = function(time) { size: size, tileQueue: this.tileQueue_, view2DState: view2DState, + viewHints: viewHints, time: time }; } diff --git a/src/ol/view.js b/src/ol/view.js index b155d8ae15..15e476fe7e 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -1,10 +1,19 @@ goog.provide('ol.View'); +goog.provide('ol.ViewHint'); goog.require('ol.IView'); goog.require('ol.IView2D'); goog.require('ol.IView3D'); +/** + * @enum {number} + */ +ol.ViewHint = { + PANNING: 0 +}; + + /** * @constructor @@ -12,10 +21,25 @@ goog.require('ol.IView3D'); * @extends {ol.Object} */ ol.View = function() { + + /** + * @private + * @type {Array.} + */ + this.hints_ = [0]; + }; goog.inherits(ol.View, ol.Object); +/** + * @return {Array.} Hint. + */ +ol.View.prototype.getHints = function() { + return this.hints_; +}; + + /** * @inheritDoc */ @@ -27,3 +51,13 @@ ol.View.prototype.getView2D = goog.abstractMethod; */ ol.View.prototype.getView3D = goog.abstractMethod; + +/** + * @param {ol.ViewHint} hint Hint. + * @param {number} delta Delta. + */ +ol.View.prototype.setHint = function(hint, delta) { + goog.asserts.assert(0 <= hint && hint < this.hints_.length); + this.hints_[hint] += delta; + goog.asserts.assert(this.hints_[hint] >= 0); +}; From e837a74e00968d7a26e02523f4415113418a5bcd Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 12 Jan 2013 16:53:26 +0100 Subject: [PATCH 2/7] Set panning hint in DragPanInteraction --- src/ol/interaction/dragpaninteraction.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js index 66b2645a4b..494d953912 100644 --- a/src/ol/interaction/dragpaninteraction.js +++ b/src/ol/interaction/dragpaninteraction.js @@ -53,13 +53,25 @@ ol.interaction.DragPan.prototype.handleDrag = function(mapBrowserEvent) { }; +/** + * @inheritDoc + */ +ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) { + var map = mapBrowserEvent.map; + map.requestRenderFrame(); + map.getView().setHint(ol.ViewHint.PANNING, -1); +}; + + /** * @inheritDoc */ ol.interaction.DragPan.prototype.handleDragStart = function(mapBrowserEvent) { var browserEvent = mapBrowserEvent.browserEvent; if (this.condition_(browserEvent)) { - mapBrowserEvent.map.requestRenderFrame(); + var map = mapBrowserEvent.map; + map.requestRenderFrame(); + map.getView().setHint(ol.ViewHint.PANNING, 1); return true; } else { return false; From 2ea6f0903ca848bb1a6183157ca89da9d1646a6f Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 12 Jan 2013 16:53:53 +0100 Subject: [PATCH 3/7] Don't remove tiles while panning --- src/ol/renderer/dom/domtilelayerrenderer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index db8698b086..bb3cbaef3b 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -14,6 +14,7 @@ goog.require('ol.Size'); goog.require('ol.TileCoord'); goog.require('ol.TileRange'); goog.require('ol.TileState'); +goog.require('ol.ViewHint'); goog.require('ol.dom'); goog.require('ol.renderer.dom.Layer'); goog.require('ol.tilegrid.TileGrid'); @@ -210,7 +211,9 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = goog.dom.insertChildAt(this.target, tileLayerZ.target, 0); } } else { - tileLayerZ.removeTilesOutsideExtent(frameState.extent); + if (!frameState.viewHints[ol.ViewHint.PANNING]) { + tileLayerZ.removeTilesOutsideExtent(frameState.extent); + } } } From c48bb6142ed71170f3ac6a0fff965d52e119aa03 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sat, 12 Jan 2013 23:59:37 +0100 Subject: [PATCH 4/7] Add animating hint --- src/ol/view.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ol/view.js b/src/ol/view.js index 15e476fe7e..6929a4ff48 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -10,7 +10,8 @@ goog.require('ol.IView3D'); * @enum {number} */ ol.ViewHint = { - PANNING: 0 + ANIMATING: 0, + PANNING: 1 }; @@ -26,7 +27,7 @@ ol.View = function() { * @private * @type {Array.} */ - this.hints_ = [0]; + this.hints_ = [0, 0]; }; goog.inherits(ol.View, ol.Object); From 969553cedefad7c74324064e68aaa39d75d62084 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 13 Jan 2013 00:14:49 +0100 Subject: [PATCH 5/7] Clone hints array so that pre-render functions can modify it --- src/ol/view.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/view.js b/src/ol/view.js index 6929a4ff48..27e0c9db1f 100644 --- a/src/ol/view.js +++ b/src/ol/view.js @@ -1,6 +1,7 @@ goog.provide('ol.View'); goog.provide('ol.ViewHint'); +goog.require('goog.array'); goog.require('ol.IView'); goog.require('ol.IView2D'); goog.require('ol.IView3D'); @@ -37,7 +38,7 @@ goog.inherits(ol.View, ol.Object); * @return {Array.} Hint. */ ol.View.prototype.getHints = function() { - return this.hints_; + return goog.array.clone(this.hints_); }; From bafb53f2e1c25787bffa6dedde2b6faa355bbc9d Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 13 Jan 2013 00:15:21 +0100 Subject: [PATCH 6/7] Make animations set animating hint --- src/ol/animation.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ol/animation.js b/src/ol/animation.js index 6b80f0accc..e85fccbd5a 100644 --- a/src/ol/animation.js +++ b/src/ol/animation.js @@ -24,12 +24,14 @@ ol.animation.createBounce = return function(map, frameState) { if (frameState.time < start) { frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else if (frameState.time < start + duration) { var delta = easingFunction((frameState.time - start) / duration); var deltaResolution = resolution - frameState.view2DState.resolution; frameState.animate = true; frameState.view2DState.resolution += delta * deltaResolution; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else { return false; @@ -56,6 +58,7 @@ ol.animation.createPanFrom = return function(map, frameState) { if (frameState.time < start) { frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else if (frameState.time < start + duration) { var delta = 1 - easingFunction((frameState.time - start) / duration); @@ -64,6 +67,7 @@ ol.animation.createPanFrom = frameState.animate = true; frameState.view2DState.center.x += delta * deltaX; frameState.view2DState.center.y += delta * deltaY; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else { return false; @@ -90,11 +94,13 @@ ol.animation.createSpin = return function(map, frameState) { if (frameState.time < start) { frameState.animate = true; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else if (frameState.time < start + duration) { var delta = easingFunction((frameState.time - start) / duration); frameState.animate = true; frameState.view2DState.rotation += delta * deltaTheta; + frameState.viewHints[ol.ViewHint.ANIMATING] += 1; return true; } else { return false; From 3febb24529f5106c568a508ecb3e91ca429d7ef4 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Sun, 13 Jan 2013 00:15:43 +0100 Subject: [PATCH 7/7] Don't remove tiles when animating --- src/ol/renderer/dom/domtilelayerrenderer.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js index bb3cbaef3b..79c4e755a4 100644 --- a/src/ol/renderer/dom/domtilelayerrenderer.js +++ b/src/ol/renderer/dom/domtilelayerrenderer.js @@ -211,7 +211,8 @@ ol.renderer.dom.TileLayer.prototype.renderFrame = goog.dom.insertChildAt(this.target, tileLayerZ.target, 0); } } else { - if (!frameState.viewHints[ol.ViewHint.PANNING]) { + if (!frameState.viewHints[ol.ViewHint.ANIMATING] && + !frameState.viewHints[ol.ViewHint.PANNING]) { tileLayerZ.removeTilesOutsideExtent(frameState.extent); } }