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.

144 lines
4.8 KiB
JavaScript

import { Cartesian3 } from "../../Source/Cesium.js";
import { Color } from "../../Source/Cesium.js";
import { HeadingPitchRange } from "../../Source/Cesium.js";
import Cesium3DTilesTester from "../Cesium3DTilesTester.js";
import createScene from "../createScene.js";
describe(
"Scene/Composite3DTileContent",
function () {
var scene;
var centerLongitude = -1.31968;
var centerLatitude = 0.698874;
var compositeUrl = "./Data/Cesium3DTiles/Composite/Composite/tileset.json";
var compositeOfComposite =
"./Data/Cesium3DTiles/Composite/CompositeOfComposite/tileset.json";
var compositeOfInstanced =
"./Data/Cesium3DTiles/Composite/CompositeOfInstanced/tileset.json";
beforeAll(function () {
scene = createScene();
// One item in each data set is always located in the center, so point the camera there
var center = Cartesian3.fromRadians(centerLongitude, centerLatitude);
scene.camera.lookAt(center, new HeadingPitchRange(0.0, -1.57, 26.0));
});
afterAll(function () {
scene.destroyForSpecs();
});
afterEach(function () {
scene.primitives.removeAll();
});
function expectRenderComposite(tileset) {
expect(scene).toPickAndCall(function (result) {
// Pick a building
var pickedBuilding = result;
expect(pickedBuilding).toBeDefined();
// Change the color of the picked building to yellow
pickedBuilding.color = Color.clone(Color.YELLOW, pickedBuilding.color);
// Expect the pixel color to be some shade of yellow
Cesium3DTilesTester.expectRender(scene, tileset, function (rgba) {
expect(rgba[0]).toBeGreaterThan(0);
expect(rgba[1]).toBeGreaterThan(0);
expect(rgba[2]).toEqual(0);
expect(rgba[3]).toEqual(255);
});
// Both a building and instance are located at the center, hide the building and pick the instance
pickedBuilding.show = false;
var pickedInstance;
expect(scene).toPickAndCall(function (result) {
pickedInstance = result;
expect(pickedInstance).toBeDefined();
expect(pickedInstance).not.toEqual(pickedBuilding);
});
// Change the color of the picked instance to green
pickedInstance.color = Color.clone(Color.GREEN, pickedInstance.color);
// Expect the pixel color to be some shade of green
Cesium3DTilesTester.expectRender(scene, tileset, function (rgba) {
expect(rgba[0]).toEqual(0);
expect(rgba[1]).toBeGreaterThan(0);
expect(rgba[2]).toEqual(0);
expect(rgba[3]).toEqual(255);
});
// Hide the instance, and expect the render to be blank
pickedInstance.show = false;
Cesium3DTilesTester.expectRenderBlank(scene, tileset);
});
}
it("throws with invalid version", function () {
var arrayBuffer = Cesium3DTilesTester.generateCompositeTileBuffer({
version: 2,
});
Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, "cmpt");
});
it("throws with invalid inner tile content type", function () {
var arrayBuffer = Cesium3DTilesTester.generateCompositeTileBuffer({
tiles: [
Cesium3DTilesTester.generateInstancedTileBuffer({
magic: [120, 120, 120, 120],
}),
],
});
Cesium3DTilesTester.loadTileExpectError(scene, arrayBuffer, "cmpt");
});
it("resolves readyPromise", function () {
return Cesium3DTilesTester.resolvesReadyPromise(scene, compositeUrl);
});
it("rejects readyPromise on error", function () {
// Try loading a composite tile with an instanced tile that has an invalid url.
// Expect promise to be rejected in Model, ModelInstanceCollection,
// Instanced3DModel3DTileContent, and Composite3DTileContent.
var arrayBuffer = Cesium3DTilesTester.generateCompositeTileBuffer({
tiles: [
Cesium3DTilesTester.generateInstancedTileBuffer({
gltfFormat: 0,
gltfUri: "invalid",
}),
],
});
return Cesium3DTilesTester.rejectsReadyPromiseOnError(
scene,
arrayBuffer,
"cmpt"
);
});
it("renders composite", function () {
return Cesium3DTilesTester.loadTileset(scene, compositeUrl).then(
expectRenderComposite
);
});
it("renders composite of composite", function () {
return Cesium3DTilesTester.loadTileset(scene, compositeOfComposite).then(
expectRenderComposite
);
});
it("renders multiple instanced tilesets", function () {
return Cesium3DTilesTester.loadTileset(scene, compositeOfInstanced).then(
expectRenderComposite
);
});
it("destroys", function () {
return Cesium3DTilesTester.tileDestroys(scene, compositeUrl);
});
},
"WebGL"
);