Merge pull request #1754 from tschaub/clip

Track max extent for replay and limit draw instructions outside that extent.
This commit is contained in:
Tim Schaub
2014-03-06 09:37:43 -07:00
7 changed files with 655 additions and 21 deletions

View File

@@ -1,6 +1,5 @@
goog.provide('ol.test.extent');
describe('ol.extent', function() {
describe('buffer', function() {
@@ -65,6 +64,86 @@ describe('ol.extent', function() {
});
});
describe('coordinateRelationship()', function() {
var extent = [-180, -90, 180, 90];
var INTERSECTING = ol.extent.Relationship.INTERSECTING;
var ABOVE = ol.extent.Relationship.ABOVE;
var RIGHT = ol.extent.Relationship.RIGHT;
var BELOW = ol.extent.Relationship.BELOW;
var LEFT = ol.extent.Relationship.LEFT;
it('returns intersecting for within', function() {
var rel = ol.extent.coordinateRelationship(extent, [0, 0]);
expect(rel).to.be(INTERSECTING);
});
it('returns intersecting for touching top', function() {
var rel = ol.extent.coordinateRelationship(extent, [0, 90]);
expect(rel).to.be(INTERSECTING);
});
it('returns intersecting for touching right', function() {
var rel = ol.extent.coordinateRelationship(extent, [180, 0]);
expect(rel).to.be(INTERSECTING);
});
it('returns intersecting for touching bottom', function() {
var rel = ol.extent.coordinateRelationship(extent, [0, -90]);
expect(rel).to.be(INTERSECTING);
});
it('returns intersecting for touching left', function() {
var rel = ol.extent.coordinateRelationship(extent, [-180, 0]);
expect(rel).to.be(INTERSECTING);
});
it('above for north', function() {
var rel = ol.extent.coordinateRelationship(extent, [0, 100]);
expect(rel).to.be(ABOVE);
});
it('above and right for northeast', function() {
var rel = ol.extent.coordinateRelationship(extent, [190, 100]);
expect(rel & ABOVE).to.be(ABOVE);
expect(rel & RIGHT).to.be(RIGHT);
});
it('right for east', function() {
var rel = ol.extent.coordinateRelationship(extent, [190, 0]);
expect(rel).to.be(RIGHT);
});
it('below and right for southeast', function() {
var rel = ol.extent.coordinateRelationship(extent, [190, -100]);
expect(rel & BELOW).to.be(BELOW);
expect(rel & RIGHT).to.be(RIGHT);
});
it('below for south', function() {
var rel = ol.extent.coordinateRelationship(extent, [0, -100]);
expect(rel).to.be(BELOW);
});
it('below and left for southwest', function() {
var rel = ol.extent.coordinateRelationship(extent, [-190, -100]);
expect(rel & BELOW).to.be(BELOW);
expect(rel & LEFT).to.be(LEFT);
});
it('left for west', function() {
var rel = ol.extent.coordinateRelationship(extent, [-190, 0]);
expect(rel).to.be(LEFT);
});
it('above and left for northwest', function() {
var rel = ol.extent.coordinateRelationship(extent, [-190, 100]);
expect(rel & ABOVE).to.be(ABOVE);
expect(rel & LEFT).to.be(LEFT);
});
});
describe('getCenter', function() {
it('returns the expected center', function() {
var extent = [1, 2, 3, 4];
@@ -221,6 +300,131 @@ describe('ol.extent', function() {
});
});
describe('segmentIntersects()', function() {
var extent = [-180, -90, 180, 90];
var north = [0, 100];
var northeast = [190, 100];
var east = [190, 0];
var southeast = [190, -100];
var south = [0, -100];
var southwest = [-190, -100];
var west = [-190, 0];
var northwest = [-190, 100];
var center = [0, 0];
var top = [0, 90];
var right = [180, 0];
var bottom = [-90, 0];
var left = [-180, 0];
var inside = [10, 10];
it('returns true if contained', function() {
var intersects = ol.extent.segmentIntersects(extent, center, inside);
expect(intersects).to.be(true);
});
it('returns true if crosses top', function() {
var intersects = ol.extent.segmentIntersects(extent, center, north);
expect(intersects).to.be(true);
});
it('returns true if crosses right', function() {
var intersects = ol.extent.segmentIntersects(extent, center, east);
expect(intersects).to.be(true);
});
it('returns true if crosses bottom', function() {
var intersects = ol.extent.segmentIntersects(extent, center, south);
expect(intersects).to.be(true);
});
it('returns true if crosses left', function() {
var intersects = ol.extent.segmentIntersects(extent, center, west);
expect(intersects).to.be(true);
});
it('returns false if above', function() {
var intersects = ol.extent.segmentIntersects(extent, northwest, north);
expect(intersects).to.be(false);
});
it('returns false if right', function() {
var intersects = ol.extent.segmentIntersects(extent, northeast, east);
expect(intersects).to.be(false);
});
it('returns false if below', function() {
var intersects = ol.extent.segmentIntersects(extent, south, southwest);
expect(intersects).to.be(false);
});
it('returns false if left', function() {
var intersects = ol.extent.segmentIntersects(extent, west, southwest);
expect(intersects).to.be(false);
});
it('returns true if crosses top to bottom', function() {
var intersects = ol.extent.segmentIntersects(extent, north, south);
expect(intersects).to.be(true);
});
it('returns true if crosses bottom to top', function() {
var intersects = ol.extent.segmentIntersects(extent, south, north);
expect(intersects).to.be(true);
});
it('returns true if crosses left to right', function() {
var intersects = ol.extent.segmentIntersects(extent, west, east);
expect(intersects).to.be(true);
});
it('returns true if crosses right to left', function() {
var intersects = ol.extent.segmentIntersects(extent, east, west);
expect(intersects).to.be(true);
});
it('returns true if crosses northwest to east', function() {
var intersects = ol.extent.segmentIntersects(extent, northwest, east);
expect(intersects).to.be(true);
});
it('returns true if crosses south to west', function() {
var intersects = ol.extent.segmentIntersects(extent, south, west);
expect(intersects).to.be(true);
});
it('returns true if touches top', function() {
var intersects = ol.extent.segmentIntersects(extent, northwest, top);
expect(intersects).to.be(true);
});
it('returns true if touches right', function() {
var intersects = ol.extent.segmentIntersects(extent, southeast, right);
expect(intersects).to.be(true);
});
it('returns true if touches bottom', function() {
var intersects = ol.extent.segmentIntersects(extent, bottom, south);
expect(intersects).to.be(true);
});
it('returns true if touches left', function() {
var intersects = ol.extent.segmentIntersects(extent, left, west);
expect(intersects).to.be(true);
});
it('works for zero length inside', function() {
var intersects = ol.extent.segmentIntersects(extent, center, center);
expect(intersects).to.be(true);
});
it('works for zero length outside', function() {
var intersects = ol.extent.segmentIntersects(extent, north, north);
expect(intersects).to.be(false);
});
});
describe('transform', function() {
it('does transform', function() {
@@ -263,8 +467,50 @@ describe('ol.extent', function() {
});
describe('transform2D()', function() {
var extent;
beforeEach(function() {
extent = [-180, -90, 180, 90];
});
it('applies a translate transform', function() {
var mat = goog.vec.Mat4.createNumber();
goog.vec.Mat4.makeTranslate(mat, 10, 20, 0);
var transformed = ol.extent.transform2D(extent, mat);
expect(transformed).to.eql([-170, -70, 190, 110]);
});
it('applies a rotate transform', function() {
var mat = goog.vec.Mat4.createNumber();
goog.vec.Mat4.makeRotateZ(mat, Math.PI / 2);
var transformed = ol.extent.transform2D(extent, mat);
expect(transformed[0]).to.roughlyEqual(-90, 1e-5);
expect(transformed[1]).to.roughlyEqual(-180, 1e-5);
expect(transformed[2]).to.roughlyEqual(90, 1e-5);
expect(transformed[3]).to.roughlyEqual(180, 1e-5);
});
it('does not modify original', function() {
var mat = goog.vec.Mat4.createNumber();
goog.vec.Mat4.makeRotateZ(mat, Math.PI / 2);
ol.extent.transform2D(extent, mat);
expect(extent).to.eql([-180, -90, 180, 90]);
});
it('accepts an extent to modify', function() {
var mat = goog.vec.Mat4.createNumber();
goog.vec.Mat4.makeScale(mat, 2, 0.5);
ol.extent.transform2D(extent, mat, extent);
expect(extent).to.eql([-360, -45, 360, 45]);
});
});
});
goog.require('goog.vec.Mat4');
goog.require('ol.extent');
goog.require('ol.extent.Relationship');
goog.require('ol.proj');