You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
8.1 KiB
JavaScript
280 lines
8.1 KiB
JavaScript
import { BoundingSphere } from "../../Source/Cesium.js";
|
|
import { Cartesian3 } from "../../Source/Cesium.js";
|
|
import { Cartographic } from "../../Source/Cesium.js";
|
|
import { Ellipsoid } from "../../Source/Cesium.js";
|
|
import { Math as CesiumMath } from "../../Source/Cesium.js";
|
|
import { Rectangle } from "../../Source/Cesium.js";
|
|
import { Cesium3DTileBatchTable } from "../../Source/Cesium.js";
|
|
import { ColorBlendMode } from "../../Source/Cesium.js";
|
|
import { Vector3DTilePolylines } from "../../Source/Cesium.js";
|
|
import createScene from "../createScene.js";
|
|
import pollToPromise from "../pollToPromise.js";
|
|
|
|
describe(
|
|
"Scene/Vector3DTilePolylines",
|
|
function () {
|
|
var scene;
|
|
var rectangle;
|
|
var polylines;
|
|
|
|
var ellipsoid = Ellipsoid.WGS84;
|
|
|
|
beforeAll(function () {
|
|
scene = createScene();
|
|
});
|
|
|
|
afterAll(function () {
|
|
scene.destroyForSpecs();
|
|
});
|
|
|
|
var mockTileset = {
|
|
_statistics: {
|
|
texturesByteLength: 0,
|
|
},
|
|
tileset: {
|
|
_statistics: {
|
|
batchTableByteLength: 0,
|
|
},
|
|
colorBlendMode: ColorBlendMode.HIGHLIGHT,
|
|
},
|
|
getFeature: function (id) {
|
|
return { batchId: id };
|
|
},
|
|
};
|
|
|
|
beforeEach(function () {
|
|
rectangle = Rectangle.fromDegrees(-40.0, -40.0, 40.0, 40.0);
|
|
});
|
|
|
|
afterEach(function () {
|
|
scene.primitives.removeAll();
|
|
polylines = polylines && !polylines.isDestroyed() && polylines.destroy();
|
|
});
|
|
|
|
function loadPolylines(polylines) {
|
|
var ready = false;
|
|
polylines.readyPromise.then(function () {
|
|
ready = true;
|
|
});
|
|
return pollToPromise(function () {
|
|
polylines.update(scene.frameState);
|
|
scene.frameState.commandList.length = 0;
|
|
return ready;
|
|
});
|
|
}
|
|
|
|
function zigZag(value) {
|
|
return ((value << 1) ^ (value >> 15)) & 0xffff;
|
|
}
|
|
|
|
var maxShort = 32767;
|
|
|
|
function encodePositions(
|
|
rectangle,
|
|
minimumHeight,
|
|
maximumHeight,
|
|
positions
|
|
) {
|
|
var length = positions.length;
|
|
var buffer = new Uint16Array(length * 3);
|
|
|
|
var lastU = 0;
|
|
var lastV = 0;
|
|
var lastH = 0;
|
|
|
|
for (var i = 0; i < length; ++i) {
|
|
var position = positions[i];
|
|
|
|
var u = (position.longitude - rectangle.west) / rectangle.width;
|
|
var v = (position.latitude - rectangle.south) / rectangle.height;
|
|
var h =
|
|
(position.height - minimumHeight) / (maximumHeight - minimumHeight);
|
|
|
|
u = CesiumMath.clamp(u, 0.0, 1.0);
|
|
v = CesiumMath.clamp(v, 0.0, 1.0);
|
|
h = CesiumMath.clamp(h, 0.0, 1.0);
|
|
|
|
u = Math.floor(u * maxShort);
|
|
v = Math.floor(v * maxShort);
|
|
h = Math.floor(h * maxShort);
|
|
|
|
buffer[i] = zigZag(u - lastU);
|
|
buffer[i + length] = zigZag(v - lastV);
|
|
buffer[i + length * 2] = zigZag(h - lastH);
|
|
|
|
lastU = u;
|
|
lastV = v;
|
|
lastH = h;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
it("renders a polyline", function () {
|
|
var minHeight = 0.0;
|
|
var maxHeight = 5.0;
|
|
var cartoPositions = [
|
|
Cartographic.fromDegrees(0.0, 0.0, 1.0),
|
|
Cartographic.fromDegrees(1.0, 0.0, 2.0),
|
|
];
|
|
var positions = encodePositions(
|
|
rectangle,
|
|
minHeight,
|
|
maxHeight,
|
|
cartoPositions
|
|
);
|
|
|
|
var batchTable = new Cesium3DTileBatchTable(mockTileset, 1);
|
|
batchTable.update(mockTileset, scene.frameState);
|
|
|
|
var center = ellipsoid.cartographicToCartesian(
|
|
Rectangle.center(rectangle)
|
|
);
|
|
|
|
polylines = scene.primitives.add(
|
|
new Vector3DTilePolylines({
|
|
positions: positions,
|
|
widths: new Uint16Array([10]),
|
|
counts: new Uint32Array([2]),
|
|
batchIds: new Uint16Array([0]),
|
|
rectangle: rectangle,
|
|
minimumHeight: minHeight,
|
|
maximumHeight: maxHeight,
|
|
center: center,
|
|
boundingVolume: new BoundingSphere(center, 1000000.0),
|
|
batchTable: batchTable,
|
|
})
|
|
);
|
|
return loadPolylines(polylines).then(function () {
|
|
scene.camera.lookAt(
|
|
Cartesian3.fromDegrees(0.5, 0.0, 1.5),
|
|
new Cartesian3(0.0, 0.0, 1.0)
|
|
);
|
|
expect(scene).toRender([255, 255, 255, 255]);
|
|
});
|
|
});
|
|
|
|
it("renders multiple polylines", function () {
|
|
var minHeight = 0.0;
|
|
var maxHeight = 100.0;
|
|
var cartoPositions = [
|
|
Cartographic.fromDegrees(1.0, 0.0, 1.0),
|
|
Cartographic.fromDegrees(2.0, 0.0, 2.0),
|
|
Cartographic.fromDegrees(-6.0, 0.0, 12.0),
|
|
Cartographic.fromDegrees(-5.0, 0.0, 15.0),
|
|
Cartographic.fromDegrees(0.0, 10.0, 0.0),
|
|
Cartographic.fromDegrees(0.0, 5.0, 5.0),
|
|
Cartographic.fromDegrees(0.0, 0.0, 10.0),
|
|
Cartographic.fromDegrees(0.0, -5.0, 15.0),
|
|
];
|
|
var positions = encodePositions(
|
|
rectangle,
|
|
minHeight,
|
|
maxHeight,
|
|
cartoPositions
|
|
);
|
|
|
|
var batchTable = new Cesium3DTileBatchTable(mockTileset, 1);
|
|
batchTable.update(mockTileset, scene.frameState);
|
|
|
|
var center = ellipsoid.cartographicToCartesian(
|
|
Rectangle.center(rectangle)
|
|
);
|
|
|
|
polylines = scene.primitives.add(
|
|
new Vector3DTilePolylines({
|
|
positions: positions,
|
|
widths: new Uint16Array([10, 10, 10]),
|
|
counts: new Uint32Array([2, 2, 4]),
|
|
batchIds: new Uint16Array([0, 1, 2]),
|
|
rectangle: rectangle,
|
|
minimumHeight: minHeight,
|
|
maximumHeight: maxHeight,
|
|
center: center,
|
|
boundingVolume: new BoundingSphere(center, 1000000.0),
|
|
batchTable: batchTable,
|
|
})
|
|
);
|
|
return loadPolylines(polylines).then(function () {
|
|
for (var i = 0; i < cartoPositions.length; i += 2) {
|
|
var p1 = cartoPositions[i];
|
|
var p2 = cartoPositions[i + 1];
|
|
|
|
var longitude = CesiumMath.lerp(p1.longitude, p2.longitude, 0.5);
|
|
var latitude = CesiumMath.lerp(p1.latitude, p2.latitude, 0.5);
|
|
var height = CesiumMath.lerp(p1.height, p2.height, 0.5);
|
|
var target = Cartesian3.fromRadians(longitude, latitude, height);
|
|
scene.camera.lookAt(target, new Cartesian3(0.0, 0.0, 1.0));
|
|
expect(scene).toRender([255, 255, 255, 255]);
|
|
}
|
|
});
|
|
});
|
|
|
|
it("picks a polyline", function () {
|
|
var minHeight = 0.0;
|
|
var maxHeight = 5.0;
|
|
var cartoPositions = [
|
|
Cartographic.fromDegrees(0.0, 0.0, 1.0),
|
|
Cartographic.fromDegrees(1.0, 0.0, 2.0),
|
|
];
|
|
var positions = encodePositions(
|
|
rectangle,
|
|
minHeight,
|
|
maxHeight,
|
|
cartoPositions
|
|
);
|
|
|
|
var batchTable = new Cesium3DTileBatchTable(mockTileset, 1);
|
|
|
|
var center = ellipsoid.cartographicToCartesian(
|
|
Rectangle.center(rectangle)
|
|
);
|
|
|
|
polylines = scene.primitives.add(
|
|
new Vector3DTilePolylines({
|
|
positions: positions,
|
|
widths: new Uint16Array([10]),
|
|
counts: new Uint32Array([2]),
|
|
batchIds: new Uint16Array([0]),
|
|
rectangle: rectangle,
|
|
minimumHeight: minHeight,
|
|
maximumHeight: maxHeight,
|
|
center: center,
|
|
boundingVolume: new BoundingSphere(center, 1000000.0),
|
|
batchTable: batchTable,
|
|
})
|
|
);
|
|
return loadPolylines(polylines).then(function () {
|
|
scene.camera.lookAt(
|
|
Cartesian3.fromDegrees(0.5, 0.0, 1.5),
|
|
new Cartesian3(0.0, 0.0, 1.0)
|
|
);
|
|
|
|
var features = [];
|
|
polylines.createFeatures(mockTileset, features);
|
|
|
|
var getFeature = mockTileset.getFeature;
|
|
mockTileset.getFeature = function (index) {
|
|
return features[index];
|
|
};
|
|
|
|
scene.frameState.passes.pick = true;
|
|
batchTable.update(mockTileset, scene.frameState);
|
|
expect(scene).toPickAndCall(function (result) {
|
|
expect(result).toBe(features[0]);
|
|
});
|
|
|
|
mockTileset.getFeature = getFeature;
|
|
});
|
|
});
|
|
|
|
it("isDestroyed", function () {
|
|
polylines = new Vector3DTilePolylines({});
|
|
expect(polylines.isDestroyed()).toEqual(false);
|
|
polylines.destroy();
|
|
expect(polylines.isDestroyed()).toEqual(true);
|
|
});
|
|
},
|
|
"WebGL"
|
|
);
|