Replay vector batches for each world
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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 &&
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user