cesium/Specs/createDynamicGeometryUpdate...

170 lines
5.2 KiB
JavaScript

import {
BoundingSphere,
JulianDate,
BoundingSphereState,
EllipsoidGeometryUpdater,
PrimitiveCollection,
Math as CesiumMath,
} from "@cesium/engine";
import createDynamicProperty from "./createDynamicProperty.js";
import pollToPromise from "./pollToPromise.js";
function createDynamicGeometryUpdaterSpecs(
Updater,
geometryPropertyName,
createDynamicEntity,
getScene,
) {
const time = JulianDate.now();
it("dynamic updater sets properties", function () {
if (Updater === EllipsoidGeometryUpdater) {
// Dynamic ellipsoids create primitives a little differently
// This is covered in EllipsoidGeometryUpdaterSpecs instead
return;
}
const entity = createDynamicEntity();
const geometry = entity[geometryPropertyName];
geometry.show = createDynamicProperty(true);
geometry.outline = createDynamicProperty(true);
geometry.fill = createDynamicProperty(true);
const updater = new Updater(entity, getScene());
const primitives = new PrimitiveCollection();
const groundPrimitives = new PrimitiveCollection();
const dynamicUpdater = updater.createDynamicUpdater(
primitives,
groundPrimitives,
);
expect(primitives.length).toBe(0);
expect(groundPrimitives.length).toBe(0);
dynamicUpdater.update(JulianDate.now());
expect(primitives.length).toBe(2);
expect(groundPrimitives.length).toBe(0);
expect(dynamicUpdater.isDestroyed()).toBe(false);
expect(dynamicUpdater._options.id).toBe(entity);
entity.show = false;
updater._onEntityPropertyChanged(entity, "show");
dynamicUpdater.update(JulianDate.now());
expect(primitives.length).toBe(0);
entity.show = true;
updater._onEntityPropertyChanged(entity, "show");
geometry.show.setValue(false);
updater._onEntityPropertyChanged(entity, "box");
dynamicUpdater.update(JulianDate.now());
expect(primitives.length).toBe(0);
geometry.show.setValue(true);
geometry.fill.setValue(false);
updater._onEntityPropertyChanged(entity, "box");
dynamicUpdater.update(JulianDate.now());
expect(primitives.length).toBe(1);
geometry.fill.setValue(true);
geometry.outline.setValue(false);
updater._onEntityPropertyChanged(entity, "box");
dynamicUpdater.update(JulianDate.now());
expect(primitives.length).toBe(1);
dynamicUpdater.destroy();
expect(primitives.length).toBe(0);
updater.destroy();
});
it("Computes dynamic geometry bounding sphere for fill.", function () {
const scene = getScene();
const entity = createDynamicEntity();
const geometry = entity[geometryPropertyName];
const updater = new Updater(entity, scene);
geometry.fill = true;
geometry.outline = false;
updater._onEntityPropertyChanged(entity, updater._geometryPropertyName);
const dynamicUpdater = updater.createDynamicUpdater(
scene.primitives,
scene.groundPrimitives,
);
dynamicUpdater.update(time);
let state;
const result = new BoundingSphere();
return pollToPromise(function () {
scene.initializeFrame();
scene.render();
state = dynamicUpdater.getBoundingSphere(result);
return state !== BoundingSphereState.PENDING;
}).then(function () {
const primitive = scene.primitives.get(0);
expect(state).toBe(BoundingSphereState.DONE);
const attributes = primitive.getGeometryInstanceAttributes(entity);
expect(result).toEqualEpsilon(
attributes.boundingSphere,
CesiumMath.EPSILON6,
);
updater.destroy();
scene.primitives.removeAll();
});
});
it("Computes dynamic geometry bounding sphere for outline.", function () {
const scene = getScene();
const entity = createDynamicEntity();
const geometry = entity[geometryPropertyName];
const updater = new Updater(entity, scene);
geometry.fill = false;
geometry.outline = true;
updater._onEntityPropertyChanged(entity, updater._geometryPropertyName);
const dynamicUpdater = updater.createDynamicUpdater(
scene.primitives,
scene.groundPrimitives,
);
dynamicUpdater.update(time);
let state;
const result = new BoundingSphere();
return pollToPromise(function () {
scene.initializeFrame();
scene.render();
state = dynamicUpdater.getBoundingSphere(result);
return state !== BoundingSphereState.PENDING;
}).then(function () {
const primitive = scene.primitives.get(0);
expect(state).toBe(BoundingSphereState.DONE);
const attributes = primitive.getGeometryInstanceAttributes(entity);
expect(result).toEqualEpsilon(
attributes.boundingSphere,
CesiumMath.EPSILON6,
);
updater.destroy();
scene.primitives.removeAll();
});
});
it("Compute dynamic geometry bounding sphere throws without result.", function () {
const scene = getScene();
const entity = createDynamicEntity();
const updater = new Updater(entity, scene);
const dynamicUpdater = updater.createDynamicUpdater(
scene.primitives,
scene.groundPrimitives,
);
expect(function () {
dynamicUpdater.getBoundingSphere(undefined);
}).toThrowDeveloperError();
updater.destroy();
scene.primitives.removeAll();
});
}
export default createDynamicGeometryUpdaterSpecs;