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
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();
|
|
});
|
|
});
|
|
});
|