diff --git a/CHANGES.md b/CHANGES.md index 88d8da30caec..8067f5b703ba 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -49,6 +49,7 @@ var geometry = BoxGeometry.createGeometry(box); * Optimized polyline bounding spheres. * `Viewer` now automatically sets its clock to that of the first added `DataSource`, regardless of how it was added to the `DataSourceCollection`. Previously, this was only done for dropped files by `viewerDragDropMixin`. * Upgraded Knockout from version 2.2.1 to 2.3.0. +* Fixed triangulation for polygons that cross the international date line. ### b19 - 2013-08-01 diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index 0cffdb4bf1b6..0348b57fae2f 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -1546,8 +1546,8 @@ define([ indices[4] = 2; indices[6] = 1; } else if (p1Behind) { - getXZIntersectionOffsetPoints(p1, p0, u1, q1); - getXZIntersectionOffsetPoints(p1, p2, u2, q2); + getXZIntersectionOffsetPoints(p1, p2, u1, q1); + getXZIntersectionOffsetPoints(p1, p0, u2, q2); indices[0] = 1; indices[3] = 2; diff --git a/Specs/Core/GeometryPipelineSpec.js b/Specs/Core/GeometryPipelineSpec.js index 40f3b1fe9951..d22094417f5f 100644 --- a/Specs/Core/GeometryPipelineSpec.js +++ b/Specs/Core/GeometryPipelineSpec.js @@ -1768,7 +1768,15 @@ defineSuite([ expect(geometry.indices).toEqual([0, 3, 4, 1, 2, 6, 1, 6, 5]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, -1.0, 0.0, -1.0, 1.0, 2.0, -1.0, 2.0, 2.0]); + var expectedPositions = []; + expectedPositions.push(-1.0, -1.0, 0.0, -1.0, 1.0, 2.0, -1.0, 2.0, 2.0); + var midpoint2 = new Cartesian3(-1, -CesiumMath.EPSILON11, 2/3); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 1); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); expect(positions.length).toEqual(7 * 3); }); @@ -1788,7 +1796,15 @@ defineSuite([ expect(geometry.indices).toEqual([1, 3, 4, 2, 0, 6, 2, 6, 5]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, 1.0, 2.0, -1.0, -1.0, 0.0, -1.0, 2.0, 2.0]); + var expectedPositions = []; + expectedPositions.push(-1.0, 1.0, 2.0, -1.0, -1.0, 0.0, -1.0, 2.0, 2.0); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 2/3); + var midpoint2 = new Cartesian3(-1, -CesiumMath.EPSILON11, 1); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); expect(positions.length).toEqual(7 * 3); }); @@ -1808,7 +1824,16 @@ defineSuite([ expect(geometry.indices).toEqual([2, 3, 4, 0, 1, 6, 0, 6, 5]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, 1.0, 2.0, -1.0, 2.0, 2.0, -1.0, -1.0, 0.0]); + var expectedPositions = []; + expectedPositions.push(-1.0, 1.0, 2.0, -1.0, 2.0, 2.0, -1.0, -1.0, 0.0); + var midpoint2 = new Cartesian3(-1, -CesiumMath.EPSILON11, 2/3); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 1); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); + expect(positions.length).toEqual(7 * 3); }); @@ -1818,7 +1843,7 @@ defineSuite([ position : new GeometryAttribute({ componentDatatype : ComponentDatatype.DOUBLE, componentsPerAttribute : 3, - values : new Float64Array([-1.0, 2.0, 0.0, -1.0, -1.0, 0.0, -1.0, -1.0, 0.0]) + values : new Float64Array([-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, -2.0, -1.0, 0.0]) }) }, indices : new Uint16Array([0, 1, 2]), @@ -1828,7 +1853,15 @@ defineSuite([ expect(geometry.indices).toEqual([1, 2, 4, 1, 4, 3, 0, 5, 6]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, 2.0, 0.0, -1.0, -1.0, 0.0, -1.0, -1.0, 0.0]); + var expectedPositions = []; + expectedPositions.push(-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, -2.0, -1.0, 0.0); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 0); + var midpoint2 = new Cartesian3(-1.5, -CesiumMath.EPSILON11, 0); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); expect(positions.length).toEqual(7 * 3); }); @@ -1838,7 +1871,7 @@ defineSuite([ position : new GeometryAttribute({ componentDatatype : ComponentDatatype.DOUBLE, componentsPerAttribute : 3, - values : new Float64Array([-1.0, -1.0, 0.0, -1.0, 2.0, 0.0, -1.0, -1.0, 0.0]) + values : new Float64Array([-2.0, -1.0, 0.0, -1.0, 1.0, 0.0, -1.0, -1.0, 0.0]) }) }, indices : new Uint16Array([0, 1, 2]), @@ -1848,7 +1881,15 @@ defineSuite([ expect(geometry.indices).toEqual([2, 0, 4, 2, 4, 3, 1, 5, 6]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, -1.0, 0.0, -1.0, 2.0, 0.0, -1.0, -1.0, 0.0]); + var expectedPositions = []; + expectedPositions.push(-2.0, -1.0, 0.0, -1.0, 1.0, 0.0, -1.0, -1.0, 0.0); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 0); + var midpoint2 = new Cartesian3(-1.5, -CesiumMath.EPSILON11, 0); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); expect(positions.length).toEqual(7 * 3); }); @@ -1858,7 +1899,7 @@ defineSuite([ position : new GeometryAttribute({ componentDatatype : ComponentDatatype.DOUBLE, componentsPerAttribute : 3, - values : new Float64Array([-1.0, -1.0, 0.0, -1.0, -1.0, 0.0, -1.0, 2.0, 0.0]) + values : new Float64Array([-1.0, -1.0, 0.0, -2.0, -1.0, 0.0, -1.0, 1.0, 0.0]) }) }, indices : new Uint16Array([0, 1, 2]), @@ -1868,7 +1909,15 @@ defineSuite([ expect(geometry.indices).toEqual([0, 1, 4, 0, 4, 3, 2, 5, 6]); var positions = geometry.attributes.position.values; - expect(positions.subarray(0, 3 * 3)).toEqual([-1.0, -1.0, 0.0, -1.0, -1.0, 0.0, -1.0, 2.0, 0.0]); + var expectedPositions = []; + expectedPositions.push(-1.0, -1.0, 0.0, -2.0, -1.0, 0.0, -1.0, 1.0, 0.0); + var midpoint1 = new Cartesian3(-1, -CesiumMath.EPSILON11, 0); + var midpoint2 = new Cartesian3(-1.5, -CesiumMath.EPSILON11, 0); + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + midpoint1.y = -midpoint1.y; + midpoint2.y = -midpoint2.y; + expectedPositions.push(midpoint1.x, midpoint1.y, midpoint1.z, midpoint2.x, midpoint2.y, midpoint2.z); + expect(positions).toEqual(expectedPositions); expect(positions.length).toEqual(7 * 3); });