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.
129 lines
3.5 KiB
JavaScript
129 lines
3.5 KiB
JavaScript
import { clone } from "../Source/Cesium.js";
|
|
import { Texture } from "../Source/Cesium.js";
|
|
import { GlobeSurfaceTile } from "../Source/Cesium.js";
|
|
import { ImageryLayer } from "../Source/Cesium.js";
|
|
import { TerrainState } from "../Source/Cesium.js";
|
|
import { when } from "../Source/Cesium.js";
|
|
|
|
function TerrainTileProcessor(
|
|
frameState,
|
|
terrainProvider,
|
|
imageryLayerCollection
|
|
) {
|
|
this.frameState = frameState;
|
|
this.terrainProvider = terrainProvider;
|
|
this.imageryLayerCollection = imageryLayerCollection;
|
|
}
|
|
|
|
// Processes the given list of tiles until all terrain and imagery states stop changing.
|
|
TerrainTileProcessor.prototype.process = function (tiles, maxIterations) {
|
|
var that = this;
|
|
|
|
var deferred = when.defer();
|
|
|
|
function getState(tile) {
|
|
return [
|
|
tile.state,
|
|
tile.data ? tile.data.terrainState : undefined,
|
|
tile.data && tile.data.imagery
|
|
? tile.data.imagery.map(function (imagery) {
|
|
return [
|
|
imagery.readyImagery ? imagery.readyImagery.state : undefined,
|
|
imagery.loadingImagery ? imagery.loadingImagery.state : undefined,
|
|
];
|
|
})
|
|
: [],
|
|
];
|
|
}
|
|
|
|
function statesAreSame(a, b) {
|
|
if (a.length !== b.length) {
|
|
return false;
|
|
}
|
|
|
|
var same = true;
|
|
for (var i = 0; i < a.length; ++i) {
|
|
if (Array.isArray(a[i]) && Array.isArray(b[i])) {
|
|
same = same && statesAreSame(a[i], b[i]);
|
|
} else if (Array.isArray(a[i]) || Array.isArray(b[i])) {
|
|
same = false;
|
|
} else {
|
|
same = same && a[i] === b[i];
|
|
}
|
|
}
|
|
|
|
return same;
|
|
}
|
|
|
|
var iterations = 0;
|
|
|
|
function next() {
|
|
++iterations;
|
|
++that.frameState.frameNumber;
|
|
|
|
// Keep going until all terrain and imagery provider are ready and states are no longer changing.
|
|
var changed = !that.terrainProvider.ready;
|
|
|
|
for (var i = 0; i < that.imageryLayerCollection.length; ++i) {
|
|
changed =
|
|
changed || !that.imageryLayerCollection.get(i).imageryProvider.ready;
|
|
}
|
|
|
|
if (that.terrainProvider.ready) {
|
|
tiles.forEach(function (tile) {
|
|
var beforeState = getState(tile);
|
|
GlobeSurfaceTile.processStateMachine(
|
|
tile,
|
|
that.frameState,
|
|
that.terrainProvider,
|
|
that.imageryLayerCollection
|
|
);
|
|
var afterState = getState(tile);
|
|
changed =
|
|
changed ||
|
|
tile.data.terrainState === TerrainState.RECEIVING ||
|
|
tile.data.terrainState === TerrainState.TRANSFORMING ||
|
|
!statesAreSame(beforeState, afterState);
|
|
});
|
|
}
|
|
|
|
if (!changed || iterations >= maxIterations) {
|
|
deferred.resolve(iterations);
|
|
} else {
|
|
setTimeout(next, 0);
|
|
}
|
|
}
|
|
|
|
next();
|
|
|
|
return deferred.promise;
|
|
};
|
|
|
|
TerrainTileProcessor.prototype.mockWebGL = function () {
|
|
spyOn(GlobeSurfaceTile, "_createVertexArrayForMesh").and.callFake(
|
|
function () {
|
|
var vertexArray = jasmine.createSpyObj("VertexArray", ["destroy"]);
|
|
return vertexArray;
|
|
}
|
|
);
|
|
|
|
spyOn(ImageryLayer.prototype, "_createTextureWebGL").and.callFake(function (
|
|
context,
|
|
imagery
|
|
) {
|
|
var texture = jasmine.createSpyObj("Texture", ["destroy"]);
|
|
texture.width = imagery.image.width;
|
|
texture.height = imagery.image.height;
|
|
return texture;
|
|
});
|
|
|
|
spyOn(ImageryLayer.prototype, "_finalizeReprojectTexture");
|
|
|
|
spyOn(Texture, "create").and.callFake(function (options) {
|
|
var result = clone(options);
|
|
result.destroy = function () {};
|
|
return result;
|
|
});
|
|
};
|
|
export default TerrainTileProcessor;
|