Replay vector batches for each world
This commit is contained in:
@@ -120,6 +120,9 @@ ol.proj.Projection = function(options) {
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.global_ = goog.isDef(options.global) ? options.global : false;
|
||||
if (this.global_) {
|
||||
goog.asserts.assert(!goog.isNull(this.extent_));
|
||||
}
|
||||
|
||||
/**
|
||||
* @private
|
||||
|
||||
@@ -192,19 +192,23 @@ ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod;
|
||||
|
||||
/**
|
||||
* @param {olx.FrameState} frameState Frame state.
|
||||
* @param {number=} opt_offsetX Offset on the x-axis in view coordinates.
|
||||
* @protected
|
||||
* @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 pixelRatio = frameState.pixelRatio;
|
||||
var offsetX = goog.isDef(opt_offsetX) ? opt_offsetX : 0;
|
||||
return ol.vec.Mat4.makeTransform2D(this.transform_,
|
||||
pixelRatio * frameState.size[0] / 2,
|
||||
pixelRatio * frameState.size[1] / 2,
|
||||
pixelRatio / viewState.resolution,
|
||||
-pixelRatio / viewState.resolution,
|
||||
-viewState.rotation,
|
||||
-viewState.center[0], -viewState.center[1]);
|
||||
-viewState.center[0] + offsetX,
|
||||
-viewState.center[1]);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ goog.require('ol.render.EventType');
|
||||
goog.require('ol.render.canvas.ReplayGroup');
|
||||
goog.require('ol.renderer.canvas.Layer');
|
||||
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 =
|
||||
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);
|
||||
|
||||
this.dispatchPreComposeEvent(context, frameState, transform);
|
||||
@@ -97,8 +108,28 @@ ol.renderer.canvas.VectorLayer.prototype.composeFrame =
|
||||
var alpha = replayContext.globalAlpha;
|
||||
replayContext.globalAlpha = layerState.opacity;
|
||||
replayGroup.replay(
|
||||
replayContext, frameState.pixelRatio, transform,
|
||||
frameState.viewState.rotation, frameState.skippedFeatureUids);
|
||||
replayContext, pixelRatio, transform, rotation, 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) {
|
||||
this.dispatchRenderEvent(replayContext, frameState, transform);
|
||||
@@ -194,6 +225,14 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
|
||||
|
||||
var extent = ol.extent.buffer(frameStateExtent,
|
||||
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_ &&
|
||||
this.renderedResolution_ == resolution &&
|
||||
|
||||
@@ -146,6 +146,12 @@ ol.source.Vector = function(opt_options) {
|
||||
this.addFeaturesInternal(options.features);
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
* @private
|
||||
*/
|
||||
this.wrapX_ = goog.isDef(options.wrapX) ? options.wrapX : true;
|
||||
|
||||
};
|
||||
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.
|
||||
* @private
|
||||
|
||||
Reference in New Issue
Block a user