Replay vector batches for each world

This commit is contained in:
Andreas Hocevar
2015-04-16 14:08:16 +02:00
parent a948ed410e
commit a90a012e5d
4 changed files with 64 additions and 4 deletions

View File

@@ -120,6 +120,9 @@ ol.proj.Projection = function(options) {
* @type {boolean} * @type {boolean}
*/ */
this.global_ = goog.isDef(options.global) ? options.global : false; this.global_ = goog.isDef(options.global) ? options.global : false;
if (this.global_) {
goog.asserts.assert(!goog.isNull(this.extent_));
}
/** /**
* @private * @private

View File

@@ -192,19 +192,23 @@ ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod;
/** /**
* @param {olx.FrameState} frameState Frame state. * @param {olx.FrameState} frameState Frame state.
* @param {number=} opt_offsetX Offset on the x-axis in view coordinates.
* @protected * @protected
* @return {!goog.vec.Mat4.Number} Transform. * @return {!goog.vec.Mat4.Number} Transform.
*/ */
ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) { ol.renderer.canvas.Layer.prototype.getTransform =
function(frameState, opt_offsetX) {
var viewState = frameState.viewState; var viewState = frameState.viewState;
var pixelRatio = frameState.pixelRatio; var pixelRatio = frameState.pixelRatio;
var offsetX = goog.isDef(opt_offsetX) ? opt_offsetX : 0;
return ol.vec.Mat4.makeTransform2D(this.transform_, return ol.vec.Mat4.makeTransform2D(this.transform_,
pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[0] / 2,
pixelRatio * frameState.size[1] / 2, pixelRatio * frameState.size[1] / 2,
pixelRatio / viewState.resolution, pixelRatio / viewState.resolution,
-pixelRatio / viewState.resolution, -pixelRatio / viewState.resolution,
-viewState.rotation, -viewState.rotation,
-viewState.center[0], -viewState.center[1]); -viewState.center[0] + offsetX,
-viewState.center[1]);
}; };

View File

@@ -11,6 +11,7 @@ goog.require('ol.render.EventType');
goog.require('ol.render.canvas.ReplayGroup'); goog.require('ol.render.canvas.ReplayGroup');
goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Layer');
goog.require('ol.renderer.vector'); goog.require('ol.renderer.vector');
goog.require('ol.source.Vector');
@@ -75,6 +76,16 @@ goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer);
ol.renderer.canvas.VectorLayer.prototype.composeFrame = ol.renderer.canvas.VectorLayer.prototype.composeFrame =
function(frameState, layerState, context) { function(frameState, layerState, context) {
var extent = frameState.extent;
var pixelRatio = frameState.pixelRatio;
var skippedFeatureUids = frameState.skippedFeatureUids;
var viewState = frameState.viewState;
var projection = viewState.projection;
var rotation = viewState.rotation;
var projectionExtent = projection.getExtent();
var vectorSource = this.getLayer().getSource();
goog.asserts.assertInstanceof(vectorSource, ol.source.Vector);
var transform = this.getTransform(frameState); var transform = this.getTransform(frameState);
this.dispatchPreComposeEvent(context, frameState, transform); this.dispatchPreComposeEvent(context, frameState, transform);
@@ -97,8 +108,28 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame =
var alpha = replayContext.globalAlpha; var alpha = replayContext.globalAlpha;
replayContext.globalAlpha = layerState.opacity; replayContext.globalAlpha = layerState.opacity;
replayGroup.replay( replayGroup.replay(
replayContext, frameState.pixelRatio, transform, replayContext, pixelRatio, transform, rotation, skippedFeatureUids);
frameState.viewState.rotation, frameState.skippedFeatureUids);
if (vectorSource.getWrapX() && projection.isGlobal() &&
!ol.extent.containsExtent(projectionExtent, frameState.extent)) {
var startX = extent[0];
var worldWidth = ol.extent.getWidth(projectionExtent);
var world = 0;
while (startX < projectionExtent[0]) {
transform = this.getTransform(frameState, worldWidth * (--world));
replayGroup.replay(
replayContext, pixelRatio, transform, rotation, skippedFeatureUids);
startX += worldWidth;
}
world = 0;
startX = extent[2];
while (startX > projectionExtent[2]) {
transform = this.getTransform(frameState, worldWidth * (++world));
replayGroup.replay(
replayContext, pixelRatio, transform, rotation, skippedFeatureUids);
startX -= worldWidth;
}
}
if (replayContext != context) { if (replayContext != context) {
this.dispatchRenderEvent(replayContext, frameState, transform); this.dispatchRenderEvent(replayContext, frameState, transform);
@@ -194,6 +225,14 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
var extent = ol.extent.buffer(frameStateExtent, var extent = ol.extent.buffer(frameStateExtent,
vectorLayerRenderBuffer * resolution); vectorLayerRenderBuffer * resolution);
var projectionExtent = viewState.projection.getExtent();
if (vectorSource.getWrapX() && viewState.projection.isGlobal() &&
!ol.extent.containsExtent(projectionExtent, frameState.extent)) {
// do not clip when the view crosses the 0 or 180 meridians
extent[0] = projectionExtent[0];
extent[2] = projectionExtent[2];
}
if (!this.dirty_ && if (!this.dirty_ &&
this.renderedResolution_ == resolution && this.renderedResolution_ == resolution &&

View File

@@ -146,6 +146,12 @@ ol.source.Vector = function(opt_options) {
this.addFeaturesInternal(options.features); this.addFeaturesInternal(options.features);
} }
/**
* @type {boolean}
* @private
*/
this.wrapX_ = goog.isDef(options.wrapX) ? options.wrapX : true;
}; };
goog.inherits(ol.source.Vector, ol.source.Source); goog.inherits(ol.source.Vector, ol.source.Source);
@@ -564,6 +570,14 @@ ol.source.Vector.prototype.getFeatureById = function(id) {
}; };
/**
* @return {boolean}
*/
ol.source.Vector.prototype.getWrapX = function() {
return this.wrapX_;
};
/** /**
* @param {goog.events.Event} event Event. * @param {goog.events.Event} event Event.
* @private * @private