177 lines
5.1 KiB
JavaScript
177 lines
5.1 KiB
JavaScript
|
|
defineSuite([
|
||
|
|
'Scene/TileReplacementQueue',
|
||
|
|
'Core/defined',
|
||
|
|
'Core/GeographicTilingScheme',
|
||
|
|
'Scene/QuadtreeTile',
|
||
|
|
'Scene/QuadtreeTileLoadState'
|
||
|
|
], function(
|
||
|
|
TileReplacementQueue,
|
||
|
|
defined,
|
||
|
|
GeographicTilingScheme,
|
||
|
|
QuadtreeTile,
|
||
|
|
QuadtreeTileLoadState) {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
function Tile(num, loadedState, upsampledState) {
|
||
|
|
this._num = num;
|
||
|
|
this.state = QuadtreeTileLoadState.LOADING;
|
||
|
|
this.data = {};
|
||
|
|
this.data.imagery = [];
|
||
|
|
if (defined(loadedState)) {
|
||
|
|
this.data.loadedTerrain = {
|
||
|
|
state : loadedState
|
||
|
|
};
|
||
|
|
}
|
||
|
|
if (defined(upsampledState)) {
|
||
|
|
this.data.upsampledTerrain = {
|
||
|
|
state : upsampledState
|
||
|
|
};
|
||
|
|
}
|
||
|
|
this.eligibleForUnloading = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
Tile.prototype.freeResources = function() {
|
||
|
|
|
||
|
|
};
|
||
|
|
|
||
|
|
var queue;
|
||
|
|
var one;
|
||
|
|
var two;
|
||
|
|
var three;
|
||
|
|
var four;
|
||
|
|
var notEligibleForUnloading;
|
||
|
|
beforeEach(function() {
|
||
|
|
var tilingScheme = new GeographicTilingScheme();
|
||
|
|
queue = new TileReplacementQueue();
|
||
|
|
one = new QuadtreeTile({
|
||
|
|
tilingScheme : tilingScheme,
|
||
|
|
level : 0,
|
||
|
|
x : 0,
|
||
|
|
y : 0
|
||
|
|
});
|
||
|
|
two = new QuadtreeTile({
|
||
|
|
tilingScheme : tilingScheme,
|
||
|
|
level : 0,
|
||
|
|
x : 1,
|
||
|
|
y : 0
|
||
|
|
});
|
||
|
|
three = new QuadtreeTile({
|
||
|
|
tilingScheme : tilingScheme,
|
||
|
|
level : 1,
|
||
|
|
x : 0,
|
||
|
|
y : 0
|
||
|
|
});
|
||
|
|
four = new QuadtreeTile({
|
||
|
|
tilingScheme : tilingScheme,
|
||
|
|
level : 1,
|
||
|
|
x : 2,
|
||
|
|
y : 1
|
||
|
|
});
|
||
|
|
notEligibleForUnloading = new QuadtreeTile({
|
||
|
|
tilingScheme : tilingScheme,
|
||
|
|
level : 1,
|
||
|
|
x : 2,
|
||
|
|
y : 1
|
||
|
|
});
|
||
|
|
notEligibleForUnloading.data = {
|
||
|
|
eligibleForUnloading : false
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('markStartOfRenderFrame', function() {
|
||
|
|
it('prevents tiles added afterward from being trimmed.', function() {
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
|
||
|
|
expect(queue.count).toEqual(1);
|
||
|
|
expect(queue.head).toEqual(three);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('prevents all tiles from being trimmed if called on an empty queue.', function() {
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(3);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('adjusts properly when last tile in previous frame is moved to the head.', function() {
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(1);
|
||
|
|
expect(queue.head).toEqual(three);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('adjusts properly when all tiles are moved to the head.', function() {
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(3);
|
||
|
|
expect(queue.head).toEqual(three);
|
||
|
|
expect(queue.tail).toEqual(one);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('trimTiles', function() {
|
||
|
|
it('does not remove a tile that is not eligible for unloading.', function() {
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(notEligibleForUnloading);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(1);
|
||
|
|
expect(queue.head).toEqual(notEligibleForUnloading);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('does not remove a transitioning tile at the end of the last render frame.', function() {
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
queue.markTileRendered(notEligibleForUnloading);
|
||
|
|
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(1);
|
||
|
|
expect(queue.head).toEqual(notEligibleForUnloading);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('removes two tiles not used last render frame.', function() {
|
||
|
|
queue.markTileRendered(notEligibleForUnloading);
|
||
|
|
queue.markTileRendered(one);
|
||
|
|
queue.markTileRendered(two);
|
||
|
|
queue.markStartOfRenderFrame();
|
||
|
|
queue.markTileRendered(three);
|
||
|
|
queue.markTileRendered(four);
|
||
|
|
queue.trimTiles(0);
|
||
|
|
expect(queue.count).toEqual(3);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|