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.

801 lines
17 KiB
JavaScript

import { defined } from "../../Source/Cesium.js";
import { GeographicTilingScheme } from "../../Source/Cesium.js";
import { HeightmapEncoding } from "../../Source/Cesium.js";
import { HeightmapTerrainData } from "../../Source/Cesium.js";
import { TerrainData } from "../../Source/Cesium.js";
import { when } from "../../Source/Cesium.js";
describe("Core/HeightmapTerrainData", function () {
it("conforms to TerrainData interface", function () {
expect(HeightmapTerrainData).toConformToInterface(TerrainData);
});
describe("constructor", function () {
it("requires buffer", function () {
expect(function () {
return new HeightmapTerrainData();
}).toThrowDeveloperError();
expect(function () {
return new HeightmapTerrainData({
width: 5,
height: 5,
});
}).toThrowDeveloperError();
});
it("requires width", function () {
expect(function () {
return new HeightmapTerrainData({
buffer: new Float32Array(25),
height: 5,
});
}).toThrowDeveloperError();
});
it("requires height", function () {
expect(function () {
return new HeightmapTerrainData({
buffer: new Float32Array(25),
width: 5,
});
}).toThrowDeveloperError();
});
it("non-LERC encoded buffers sets correct buffer type", function () {
var data = new HeightmapTerrainData({
buffer: new Uint16Array(25),
width: 5,
height: 5,
});
expect(data._encoding).toBe(HeightmapEncoding.NONE);
expect(data._bufferType).toBe(Uint16Array);
});
it("LERC encoded buffers sets correct buffer type", function () {
var data = new HeightmapTerrainData({
buffer: new Uint16Array(25),
width: 5,
height: 5,
encoding: HeightmapEncoding.LERC,
});
expect(data._encoding).toBe(HeightmapEncoding.LERC);
expect(data._bufferType).toBe(Float32Array);
});
});
describe("createMesh", function () {
var data;
var tilingScheme;
function createSampleTerrainData() {
return new HeightmapTerrainData({
buffer: new Float32Array(25),
width: 5,
height: 5,
});
}
beforeEach(function () {
tilingScheme = new GeographicTilingScheme();
data = createSampleTerrainData();
});
it("requires tilingScheme", function () {
expect(function () {
data.createMesh({ tilingScheme: undefined, x: 0, y: 0, level: 0 });
}).toThrowDeveloperError();
});
it("requires x", function () {
expect(function () {
data.createMesh({
tilingScheme: tilingScheme,
x: undefined,
y: 0,
level: 0,
});
}).toThrowDeveloperError();
});
it("requires y", function () {
expect(function () {
data.createMesh({
tilingScheme: tilingScheme,
x: 0,
y: undefined,
level: 0,
});
}).toThrowDeveloperError();
});
it("requires level", function () {
expect(function () {
data.createMesh({
tilingScheme: tilingScheme,
x: 0,
y: 0,
level: undefined,
});
}).toThrowDeveloperError();
});
it("enables throttling for asynchronous tasks", function () {
var options = {
tilingScheme: tilingScheme,
x: 0,
y: 0,
level: 0,
throttle: true,
};
var taskCount = TerrainData.maximumAsynchronousTasks + 1;
var promises = new Array();
for (var i = 0; i < taskCount; i++) {
var tempData = createSampleTerrainData();
var promise = tempData.createMesh(options);
if (defined(promise)) {
promises.push(promise);
}
}
expect(promises.length).toBe(TerrainData.maximumAsynchronousTasks);
return when.all(promises);
});
it("disables throttling for asynchronous tasks", function () {
var options = {
tilingScheme: tilingScheme,
x: 0,
y: 0,
level: 0,
throttle: false,
};
var taskCount = TerrainData.maximumAsynchronousTasks + 1;
var promises = new Array();
for (var i = 0; i < taskCount; i++) {
var tempData = createSampleTerrainData();
var promise = tempData.createMesh(options);
if (defined(promise)) {
promises.push(promise);
}
}
expect(promises.length).toBe(taskCount);
return when.all(promises);
});
});
describe("upsample", function () {
var data;
var tilingScheme;
beforeEach(function () {
tilingScheme = new GeographicTilingScheme();
data = new HeightmapTerrainData({
buffer: new Float32Array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]),
width: 3,
height: 3,
});
});
it("requires tilingScheme", function () {
expect(function () {
data.upsample(undefined, 0, 0, 0, 0, 0, 0);
}).toThrowDeveloperError();
});
it("requires thisX", function () {
expect(function () {
data.upsample(tilingScheme, undefined, 0, 0, 0, 0, 0);
}).toThrowDeveloperError();
});
it("requires thisY", function () {
expect(function () {
data.upsample(tilingScheme, 0, undefined, 0, 0, 0, 0);
}).toThrowDeveloperError();
});
it("requires thisLevel", function () {
expect(function () {
data.upsample(tilingScheme, 0, 0, undefined, 0, 0, 0);
}).toThrowDeveloperError();
});
it("requires descendantX", function () {
expect(function () {
data.upsample(tilingScheme, 0, 0, 0, undefined, 0, 0);
}).toThrowDeveloperError();
});
it("requires descendantY", function () {
expect(function () {
data.upsample(tilingScheme, 0, 0, 0, 0, undefined, 0);
}).toThrowDeveloperError();
});
it("requires descendantLevel", function () {
expect(function () {
data.upsample(tilingScheme, 0, 0, 0, 0, 0, undefined);
}).toThrowDeveloperError();
});
it("can only upsample cross one level", function () {
expect(function () {
data.upsample(tilingScheme, 0, 0, 0, 0, 0, 2);
}).toThrowDeveloperError();
});
it("upsamples", function () {
data = new HeightmapTerrainData({
buffer: new Float32Array([
1.0,
2.0,
3.0,
4.0,
5.0,
6.0,
7.0,
8.0,
9.0,
10.0,
11.0,
12.0,
13.0,
14.0,
15.0,
16.0,
]),
width: 4,
height: 4,
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 0, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
1.0,
1.5,
2.0,
2.5,
3.0,
3.5,
4.0,
4.5,
5.0,
5.5,
6.0,
6.5,
7.0,
7.5,
8.0,
8.5,
]);
});
});
it("upsample works with a stride", function () {
data = new HeightmapTerrainData({
buffer: new Uint8Array([
1,
1,
10,
2,
1,
10,
3,
1,
10,
4,
1,
10,
5,
1,
10,
6,
1,
10,
7,
1,
10,
8,
1,
10,
9,
1,
10,
10,
1,
10,
11,
1,
10,
12,
1,
10,
13,
1,
10,
14,
1,
10,
15,
1,
10,
16,
1,
10,
]),
width: 4,
height: 4,
structure: {
stride: 3,
elementsPerHeight: 2,
},
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 0, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
1,
1,
0,
1,
1,
0,
2,
1,
0,
2,
1,
0,
3,
1,
0,
3,
1,
0,
4,
1,
0,
4,
1,
0,
5,
1,
0,
5,
1,
0,
6,
1,
0,
6,
1,
0,
7,
1,
0,
7,
1,
0,
8,
1,
0,
8,
1,
0,
]);
});
});
it("upsample works with a big endian stride", function () {
data = new HeightmapTerrainData({
buffer: new Uint8Array([
1,
1,
10,
1,
2,
10,
1,
3,
10,
1,
4,
10,
1,
5,
10,
1,
6,
10,
1,
7,
10,
1,
8,
10,
1,
9,
10,
1,
10,
10,
1,
11,
10,
1,
12,
10,
1,
13,
10,
1,
14,
10,
1,
15,
10,
1,
16,
10,
]),
width: 4,
height: 4,
structure: {
stride: 3,
elementsPerHeight: 2,
isBigEndian: true,
},
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 0, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
1,
1,
0,
1,
1,
0,
1,
2,
0,
1,
2,
0,
1,
3,
0,
1,
3,
0,
1,
4,
0,
1,
4,
0,
1,
5,
0,
1,
5,
0,
1,
6,
0,
1,
6,
0,
1,
7,
0,
1,
7,
0,
1,
8,
0,
1,
8,
0,
]);
});
});
it("upsample works for an eastern child", function () {
data = new HeightmapTerrainData({
buffer: new Float32Array([
1.0,
2.0,
3.0,
4.0,
5.0,
6.0,
7.0,
8.0,
9.0,
10.0,
11.0,
12.0,
13.0,
14.0,
15.0,
16.0,
]),
width: 4,
height: 4,
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 1, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
2.5,
3.0,
3.5,
4.0,
4.5,
5.0,
5.5,
6.0,
6.5,
7.0,
7.5,
8.0,
8.5,
9.0,
9.5,
10.0,
]);
});
});
it("upsample works with a stride for an eastern child", function () {
data = new HeightmapTerrainData({
buffer: new Uint8Array([
1,
1,
10,
2,
1,
10,
3,
1,
10,
4,
1,
10,
5,
1,
10,
6,
1,
10,
7,
1,
10,
8,
1,
10,
9,
1,
10,
10,
1,
10,
11,
1,
10,
12,
1,
10,
13,
1,
10,
14,
1,
10,
15,
1,
10,
16,
1,
10,
]),
width: 4,
height: 4,
structure: {
stride: 3,
elementsPerHeight: 2,
},
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 1, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
2,
1,
0,
3,
1,
0,
3,
1,
0,
4,
1,
0,
4,
1,
0,
5,
1,
0,
5,
1,
0,
6,
1,
0,
6,
1,
0,
7,
1,
0,
7,
1,
0,
8,
1,
0,
8,
1,
0,
9,
1,
0,
9,
1,
0,
10,
1,
0,
]);
});
});
it("upsample clamps out of range data", function () {
data = new HeightmapTerrainData({
buffer: new Float32Array([
-1.0,
-2.0,
-3.0,
-4.0,
5.0,
6.0,
7.0,
8.0,
9.0,
10.0,
11.0,
12.0,
13.0,
14.0,
15.0,
16.0,
]),
width: 4,
height: 4,
structure: {
stride: 1,
elementsPerHeight: 1,
lowestEncodedHeight: 1,
highestEncodedHeight: 7,
},
});
return data
.createMesh({ tilingScheme: tilingScheme, x: 0, y: 0, level: 0 })
.then(function () {
return data.upsample(tilingScheme, 0, 0, 0, 0, 0, 1);
})
.then(function (upsampled) {
expect(upsampled.wasCreatedByUpsampling()).toBe(true);
expect(upsampled._width).toBe(4);
expect(upsampled._height).toBe(4);
expect(upsampled._buffer).toEqual([
1,
1,
1,
1,
2,
1.5,
2,
1.5,
5,
5.5,
6,
6.5,
7,
7,
7,
7,
]);
});
});
});
describe("isChildAvailable", function () {
var data;
beforeEach(function () {
data = new HeightmapTerrainData({
buffer: new Float32Array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]),
width: 3,
height: 3,
});
});
it("requires thisX", function () {
expect(function () {
data.isChildAvailable(undefined, 0, 0, 0);
}).toThrowDeveloperError();
});
it("requires thisY", function () {
expect(function () {
data.isChildAvailable(0, undefined, 0, 0);
}).toThrowDeveloperError();
});
it("requires childX", function () {
expect(function () {
data.isChildAvailable(0, 0, undefined, 0);
}).toThrowDeveloperError();
});
it("requires childY", function () {
expect(function () {
data.isChildAvailable(0, 0, 0, undefined);
}).toThrowDeveloperError();
});
});
});