175 lines
5.7 KiB
JavaScript
175 lines
5.7 KiB
JavaScript
defineSuite([
|
|
'Core/CoplanarPolygonGeometry',
|
|
'Core/Cartesian3',
|
|
'Core/Ellipsoid',
|
|
'Core/Math',
|
|
'Core/VertexFormat',
|
|
'Specs/createPackableSpecs'
|
|
], function(
|
|
CoplanarPolygonGeometry,
|
|
Cartesian3,
|
|
Ellipsoid,
|
|
CesiumMath,
|
|
VertexFormat,
|
|
createPackableSpecs) {
|
|
'use strict';
|
|
|
|
it('throws with no hierarchy', function() {
|
|
expect(function() {
|
|
return new CoplanarPolygonGeometry();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('fromPositions throws without positions', function() {
|
|
expect(function() {
|
|
return CoplanarPolygonGeometry.fromPositions();
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it('returns undefined with less than 3 unique positions', function() {
|
|
var geometry = CoplanarPolygonGeometry.createGeometry(CoplanarPolygonGeometry.fromPositions({
|
|
positions : Cartesian3.fromDegreesArrayHeights([
|
|
49.0, 18.0, 1000.0,
|
|
49.0, 18.0, 5000.0,
|
|
49.0, 18.0, 5000.0,
|
|
49.0, 18.0, 1000.0
|
|
])
|
|
}));
|
|
expect(geometry).toBeUndefined();
|
|
});
|
|
|
|
it('returns undefined when positions are linear', function() {
|
|
var geometry = CoplanarPolygonGeometry.createGeometry(CoplanarPolygonGeometry.fromPositions({
|
|
positions : Cartesian3.fromDegreesArrayHeights([
|
|
0.0, 0.0, 1.0,
|
|
0.0, 0.0, 2.0,
|
|
0.0, 0.0, 3.0
|
|
])
|
|
}));
|
|
expect(geometry).toBeUndefined();
|
|
});
|
|
|
|
it('createGeometry returns undefined due to duplicate hierarchy positions', function() {
|
|
var hierarchy = {
|
|
positions : Cartesian3.fromDegreesArray([
|
|
1.0, 1.0,
|
|
1.0, 1.0,
|
|
1.0, 1.0
|
|
]),
|
|
holes : [{
|
|
positions : Cartesian3.fromDegreesArray([
|
|
0.0, 0.0,
|
|
0.0, 0.0,
|
|
0.0, 0.0
|
|
])
|
|
}]
|
|
};
|
|
|
|
var geometry = CoplanarPolygonGeometry.createGeometry(new CoplanarPolygonGeometry({ polygonHierarchy : hierarchy }));
|
|
expect(geometry).toBeUndefined();
|
|
});
|
|
|
|
it('computes positions', function() {
|
|
var p = CoplanarPolygonGeometry.createGeometry(CoplanarPolygonGeometry.fromPositions({
|
|
vertexFormat : VertexFormat.POSITION_ONLY,
|
|
positions : Cartesian3.fromDegreesArrayHeights([
|
|
-1.0, -1.0, 0.0,
|
|
-1.0, 0.0, 1.0,
|
|
-1.0, 1.0, 1.0,
|
|
-1.0, 2.0, 0.0
|
|
])
|
|
}));
|
|
|
|
expect(p.attributes.position.values.length).toEqual(4 * 3);
|
|
expect(p.indices.length).toEqual(2 * 3);
|
|
});
|
|
|
|
it('computes all attributes', function() {
|
|
var p = CoplanarPolygonGeometry.createGeometry(CoplanarPolygonGeometry.fromPositions({
|
|
vertexFormat : VertexFormat.ALL,
|
|
positions : Cartesian3.fromDegreesArrayHeights([
|
|
-1.0, -1.0, 0.0,
|
|
-1.0, 0.0, 1.0,
|
|
-1.0, 1.0, 1.0,
|
|
-1.0, 2.0, 0.0
|
|
])
|
|
}));
|
|
|
|
var numVertices = 4;
|
|
var numTriangles = 2;
|
|
expect(p.attributes.position.values.length).toEqual(numVertices * 3);
|
|
expect(p.attributes.st.values.length).toEqual(numVertices * 2);
|
|
expect(p.attributes.normal.values.length).toEqual(numVertices * 3);
|
|
expect(p.attributes.tangent.values.length).toEqual(numVertices * 3);
|
|
expect(p.attributes.bitangent.values.length).toEqual(numVertices * 3);
|
|
expect(p.indices.length).toEqual(numTriangles * 3);
|
|
});
|
|
|
|
it('flips normal to roughly match surface normal', function() {
|
|
var p = CoplanarPolygonGeometry.createGeometry(CoplanarPolygonGeometry.fromPositions({
|
|
vertexFormat : VertexFormat.ALL,
|
|
positions : Cartesian3.fromDegreesArrayHeights([
|
|
90.0, -1.0, 0.0,
|
|
90.0, 1.0, 0.0,
|
|
92.0, 1.0, 0.0,
|
|
92.0, -1.0, 0.0
|
|
])
|
|
}));
|
|
|
|
var center = Cartesian3.fromDegrees(91.0, 0.0);
|
|
var expectedNormal = Ellipsoid.WGS84.geodeticSurfaceNormal(center);
|
|
|
|
var actual = Cartesian3.unpack(p.attributes.normal.values);
|
|
|
|
expect(expectedNormal).toEqualEpsilon(actual, CesiumMath.EPSILON6);
|
|
});
|
|
|
|
var positions = Cartesian3.fromDegreesArray([
|
|
-12.4, 3.5,
|
|
-12.0, 3.5,
|
|
-12.0, 4.0
|
|
]);
|
|
var holePositions0 = Cartesian3.fromDegreesArray([
|
|
-12.2, 3.5,
|
|
-12.2, 3.6,
|
|
-12.3, 3.6
|
|
]);
|
|
var holePositions1 = Cartesian3.fromDegreesArray([
|
|
-12.20, 3.5,
|
|
-12.25, 3.5,
|
|
-12.25, 3.55
|
|
]);
|
|
var hierarchy = {
|
|
positions : positions,
|
|
holes : [{
|
|
positions : holePositions0,
|
|
holes : [{
|
|
positions : holePositions1,
|
|
holes : undefined
|
|
}]
|
|
}]
|
|
};
|
|
|
|
var polygon = new CoplanarPolygonGeometry({
|
|
vertexFormat : VertexFormat.POSITION_ONLY,
|
|
polygonHierarchy : hierarchy
|
|
});
|
|
|
|
function addPositions(array, positions) {
|
|
for (var i = 0; i < positions.length; ++i) {
|
|
array.push(positions[i].x, positions[i].y, positions[i].z);
|
|
}
|
|
}
|
|
|
|
var packedInstance = [3.0, 1.0];
|
|
addPositions(packedInstance, positions);
|
|
packedInstance.push(3.0, 1.0);
|
|
addPositions(packedInstance, holePositions0);
|
|
packedInstance.push(3.0, 0.0);
|
|
addPositions(packedInstance, holePositions1);
|
|
packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z);
|
|
packedInstance.push(1, 0, 0, 0, 0, 0, 0, 44);
|
|
createPackableSpecs(CoplanarPolygonGeometry, polygon, packedInstance);
|
|
});
|
|
|