import { BoundingSphere } from "../../Source/Cesium.js"; import { Cartesian3 } from "../../Source/Cesium.js"; import { Color } from "../../Source/Cesium.js"; import { ColorGeometryInstanceAttribute } from "../../Source/Cesium.js"; import { combine } from "../../Source/Cesium.js"; import { destroyObject } from "../../Source/Cesium.js"; import { Ellipsoid } from "../../Source/Cesium.js"; import { GeometryInstance } from "../../Source/Cesium.js"; import { Matrix4 } from "../../Source/Cesium.js"; import { Rectangle } from "../../Source/Cesium.js"; import { RectangleGeometry } from "../../Source/Cesium.js"; import { Transforms } from "../../Source/Cesium.js"; import { Pass } from "../../Source/Cesium.js"; import { RenderState } from "../../Source/Cesium.js"; import { Cesium3DTileBatchTable } from "../../Source/Cesium.js"; import { ClassificationType } from "../../Source/Cesium.js"; import { ColorBlendMode } from "../../Source/Cesium.js"; import { PerInstanceColorAppearance } from "../../Source/Cesium.js"; import { Primitive } from "../../Source/Cesium.js"; import { StencilConstants } from "../../Source/Cesium.js"; import { Vector3DTileGeometry } from "../../Source/Cesium.js"; import createContext from "../createContext.js"; import createScene from "../createScene.js"; import pollToPromise from "../pollToPromise.js"; describe( "Scene/Vector3DTileGeometry", function () { createGeometrySpecs({}); var c = createContext({ requestWebgl2: true }); // Don't repeat WebGL 1 tests when WebGL 2 is not supported if (c.webgl2) { createGeometrySpecs({ requestWebgl2: true }); } c.destroyForSpecs(); function createGeometrySpecs(contextOptions) { var webglMessage = contextOptions.requestWebgl2 ? ": WebGL 2" : ""; var scene; var rectangle; var geometry; var globePrimitive; var tilesetPrimitive; var reusableGlobePrimitive; var reusableTilesetPrimitive; var ellipsoid = Ellipsoid.WGS84; var mockTileset = { _statistics: { texturesByteLength: 0, }, tileset: { _statistics: { batchTableByteLength: 0, }, colorBlendMode: ColorBlendMode.HIGHLIGHT, }, getFeature: function (id) { return { batchId: id }; }, }; function createPrimitive(rectangle, pass) { var renderState; if (pass === Pass.CESIUM_3D_TILE) { renderState = RenderState.fromCache({ stencilTest: StencilConstants.setCesium3DTileBit(), stencilMask: StencilConstants.CESIUM_3D_TILE_MASK, depthTest: { enabled: true, }, }); } var depthColorAttribute = ColorGeometryInstanceAttribute.fromColor( new Color(1.0, 0.0, 0.0, 1.0) ); return new Primitive({ geometryInstances: new GeometryInstance({ geometry: new RectangleGeometry({ ellipsoid: Ellipsoid.WGS84, rectangle: rectangle, }), id: "depth rectangle", attributes: { color: depthColorAttribute, }, }), appearance: new PerInstanceColorAppearance({ translucent: false, flat: true, renderState: renderState, }), asynchronous: false, }); } function MockPrimitive(primitive, pass) { this._primitive = primitive; this._pass = pass; this.show = true; } MockPrimitive.prototype.update = function (frameState) { if (!this.show) { return; } var commandList = frameState.commandList; var startLength = commandList.length; this._primitive.update(frameState); for (var i = startLength; i < commandList.length; ++i) { var command = commandList[i]; command.pass = this._pass; } }; MockPrimitive.prototype.isDestroyed = function () { return false; }; MockPrimitive.prototype.destroy = function () { return destroyObject(this); }; beforeAll(function () { scene = createScene({ contextOptions: contextOptions }); rectangle = Rectangle.fromDegrees(-80.0, 20.0, -70.0, 30.0); reusableGlobePrimitive = createPrimitive(rectangle, Pass.GLOBE); reusableTilesetPrimitive = createPrimitive( rectangle, Pass.CESIUM_3D_TILE ); }); afterAll(function () { reusableGlobePrimitive.destroy(); reusableTilesetPrimitive.destroy(); scene.destroyForSpecs(); }); beforeEach(function () { // wrap rectangle primitive so it gets executed during the globe pass and 3D Tiles pass to lay down depth globePrimitive = new MockPrimitive(reusableGlobePrimitive, Pass.GLOBE); tilesetPrimitive = new MockPrimitive( reusableTilesetPrimitive, Pass.CESIUM_3D_TILE ); }); afterEach(function () { scene.primitives.removeAll(); globePrimitive = globePrimitive && !globePrimitive.isDestroyed() && globePrimitive.destroy(); tilesetPrimitive = tilesetPrimitive && !tilesetPrimitive.isDestroyed() && tilesetPrimitive.destroy(); geometry = geometry && !geometry.isDestroyed() && geometry.destroy(); }); function loadGeometries(geometries) { var ready = false; geometries.readyPromise.then(function () { ready = true; }); return pollToPromise(function () { geometries.update(scene.frameState); scene.frameState.commandList.length = 0; return ready; }); } function packBoxes(boxes) { var length = boxes.length; var packedBoxes = new Float32Array( length * Vector3DTileGeometry.packedBoxLength ); var offset = 0; for (var i = 0; i < length; ++i) { var box = boxes[i]; Cartesian3.pack(box.dimensions, packedBoxes, offset); offset += Cartesian3.packedLength; Matrix4.pack(box.modelMatrix, packedBoxes, offset); offset += Matrix4.packedLength; } return packedBoxes; } function packCylinders(cylinders) { var length = cylinders.length; var packedCylinders = new Float32Array( length * Vector3DTileGeometry.packedCylinderLength ); var offset = 0; for (var i = 0; i < length; ++i) { var cylinder = cylinders[i]; packedCylinders[offset++] = cylinder.radius; packedCylinders[offset++] = cylinder.length; Matrix4.pack(cylinder.modelMatrix, packedCylinders, offset); offset += Matrix4.packedLength; } return packedCylinders; } function packEllipsoids(ellipsoids) { var length = ellipsoids.length; var packedEllipsoids = new Float32Array( length * Vector3DTileGeometry.packedEllipsoidLength ); var offset = 0; for (var i = 0; i < length; ++i) { var ellipsoid = ellipsoids[i]; Cartesian3.pack(ellipsoid.radii, packedEllipsoids, offset); offset += Cartesian3.packedLength; Matrix4.pack(ellipsoid.modelMatrix, packedEllipsoids, offset); offset += Matrix4.packedLength; } return packedEllipsoids; } function packSpheres(spheres) { var length = spheres.length; var packedSpheres = new Float32Array( length * Vector3DTileGeometry.packedSphereLength ); var offset = 0; for (var i = 0; i < length; ++i) { var sphere = spheres[i]; packedSpheres[offset++] = sphere.radius; Cartesian3.pack( Matrix4.getTranslation(sphere.modelMatrix, new Cartesian3()), packedSpheres, offset ); offset += Cartesian3.packedLength; } return packedSpheres; } function verifySingleRender(geometryOptions) { var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); Cartesian3.clone(center, geometryOptions.boundingVolume.center); var batchTable = new Cesium3DTileBatchTable(mockTileset, 1); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(globePrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry( combine(geometryOptions, { center: center, modelMatrix: modelMatrix, batchTable: batchTable, }) ) ); return loadGeometries(geometry).then(function () { scene.camera.setView({ destination: rectangle, }); scene.camera.zoomIn(scene.camera.positionCartographic.height * 0.9); expect(scene).toRender([255, 255, 255, 255]); batchTable.setColor(0, Color.BLUE); geometry.updateCommands(0, Color.BLUE); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([0, 0, 255, 255]); }); } function verifyMultipleRender(modelMatrices, geometryOptions) { var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); Cartesian3.clone(center, geometryOptions.boundingVolume.center); var length = modelMatrices.length; var batchTable = new Cesium3DTileBatchTable(mockTileset, length); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(globePrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry( combine(geometryOptions, { center: center, modelMatrix: modelMatrix, batchTable: batchTable, }) ) ); return loadGeometries(geometry).then(function () { var i; for (i = 0; i < length; ++i) { batchTable.setShow(i, false); } for (i = 0; i < length; ++i) { var transform = Matrix4.multiply( modelMatrix, modelMatrices[i], new Matrix4() ); scene.camera.lookAtTransform( transform, new Cartesian3(0.0, 0.0, 10.0) ); batchTable.setShow(i, true); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([255, 255, 255, 255]); batchTable.setColor(i, Color.BLUE); geometry.updateCommands(i, Color.BLUE); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([0, 0, 255, 255]); batchTable.setShow(i, false); } }); } it("renders a single box" + webglMessage, function () { var dimensions = new Cartesian3(1000000.0, 1000000.0, 1000000.0); var boxes = packBoxes([ { modelMatrix: Matrix4.IDENTITY, dimensions: dimensions, }, ]); var boxBatchIds = new Uint16Array([0]); var bv = new BoundingSphere( undefined, Math.sqrt(3.0 * dimensions.x * dimensions.x) ); return verifySingleRender({ boxes: boxes, boxBatchIds: boxBatchIds, boundingVolume: bv, }); }); it("renders multiple boxes" + webglMessage, function () { var dimensions = new Cartesian3(500000.0, 500000.0, 500000.0); var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(dimensions.x, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-dimensions.x, 0.0, 0.0)), ]; var boxes = packBoxes([ { modelMatrix: modelMatrices[0], dimensions: dimensions, }, { modelMatrix: modelMatrices[1], dimensions: dimensions, }, ]); var boxBatchIds = new Uint16Array([0, 1]); var bv = new BoundingSphere( undefined, Math.sqrt(3.0 * 2.0 * dimensions.x * dimensions.x) ); return verifyMultipleRender(modelMatrices, { boxes: boxes, boxBatchIds: boxBatchIds, boundingVolume: bv, }); }); it("renders a single cylinder" + webglMessage, function () { var radius = 1000000.0; var length = 1000000.0; var cylinders = packCylinders([ { modelMatrix: Matrix4.IDENTITY, radius: radius, length: length, }, ]); var cylinderBatchIds = new Uint16Array([0]); var bv = new BoundingSphere( undefined, Math.sqrt(radius * radius + length * length) ); return verifySingleRender({ cylinders: cylinders, cylinderBatchIds: cylinderBatchIds, boundingVolume: bv, }); }); it("renders multiple cylinders" + webglMessage, function () { var radius = 500000.0; var length = 500000.0; var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(radius, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radius, 0.0, 0.0)), ]; var cylinders = packCylinders([ { modelMatrix: modelMatrices[0], radius: radius, length: length, }, { modelMatrix: modelMatrices[1], radius: radius, length: length, }, ]); var cylinderBatchIds = new Uint16Array([0, 1]); var bv = new BoundingSphere( undefined, Math.sqrt(2.0 * (radius * radius + length * length)) ); return verifyMultipleRender(modelMatrices, { cylinders: cylinders, cylinderBatchIds: cylinderBatchIds, boundingVolume: bv, }); }); it("renders a single ellipsoid" + webglMessage, function () { var radii = new Cartesian3(500000.0, 500000.0, 500000.0); var ellipsoid = packEllipsoids([ { modelMatrix: Matrix4.IDENTITY, radii: radii, }, ]); var ellipsoidBatchIds = new Uint16Array([0]); var bv = new BoundingSphere( undefined, Cartesian3.maximumComponent(radii) ); return verifySingleRender({ ellipsoids: ellipsoid, ellipsoidBatchIds: ellipsoidBatchIds, boundingVolume: bv, }); }); it("renders multiple ellipsoids" + webglMessage, function () { var radii = new Cartesian3(500000.0, 500000.0, 500000.0); var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(radii.x, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radii.x, 0.0, 0.0)), ]; var ellipsoids = packEllipsoids([ { modelMatrix: modelMatrices[0], radii: radii, }, { modelMatrix: modelMatrices[1], radii: radii, }, ]); var ellipsoidBatchIds = new Uint16Array([0, 1]); var bv = new BoundingSphere( undefined, 2.0 * Cartesian3.maximumComponent(radii) ); return verifyMultipleRender(modelMatrices, { ellipsoids: ellipsoids, ellipsoidBatchIds: ellipsoidBatchIds, boundingVolume: bv, }); }); it("renders a single sphere" + webglMessage, function () { var radius = 500000.0; var sphere = packSpheres([ { radius: radius, modelMatrix: Matrix4.IDENTITY, }, ]); var sphereBatchIds = new Uint16Array([0]); var bv = new BoundingSphere(undefined, radius); return verifySingleRender({ spheres: sphere, sphereBatchIds: sphereBatchIds, boundingVolume: bv, }); }); it("renders multiple spheres" + webglMessage, function () { var radius = 500000.0; var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(radius, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radius, 0.0, 0.0)), ]; var spheres = packSpheres([ { modelMatrix: modelMatrices[0], radius: radius, }, { modelMatrix: modelMatrices[1], radius: radius, }, ]); var sphereBatchIds = new Uint16Array([0, 1]); var bv = new BoundingSphere(undefined, 2.0 * radius); return verifyMultipleRender(modelMatrices, { spheres: spheres, sphereBatchIds: sphereBatchIds, boundingVolume: bv, }); }); it( "renders with multiple types of each geometry" + webglMessage, function () { var dimensions = new Cartesian3(125000.0, 125000.0, 125000.0); var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(dimensions.x, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-dimensions.x, 0.0, 0.0)), ]; var boxes = packBoxes([ { modelMatrix: modelMatrices[0], dimensions: dimensions, }, { modelMatrix: modelMatrices[1], dimensions: dimensions, }, ]); var boxBatchIds = new Uint16Array([0, 1]); var radius = 125000.0; var length = 125000.0; modelMatrices.push( Matrix4.fromTranslation(new Cartesian3(radius, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radius, 0.0, 0.0)) ); var cylinders = packCylinders([ { modelMatrix: modelMatrices[2], radius: radius, length: length, }, { modelMatrix: modelMatrices[3], radius: radius, length: length, }, ]); var cylinderBatchIds = new Uint16Array([2, 3]); var radii = new Cartesian3(125000.0, 125000.0, 125000.0); modelMatrices.push( Matrix4.fromTranslation(new Cartesian3(radii.x, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radii.x, 0.0, 0.0)) ); var ellipsoids = packEllipsoids([ { modelMatrix: modelMatrices[4], radii: radii, }, { modelMatrix: modelMatrices[5], radii: radii, }, ]); var ellipsoidBatchIds = new Uint16Array([4, 5]); modelMatrices.push( Matrix4.fromTranslation(new Cartesian3(radius, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radius, 0.0, 0.0)) ); var spheres = packSpheres([ { modelMatrix: modelMatrices[6], radius: radius, }, { modelMatrix: modelMatrices[7], radius: radius, }, ]); var sphereBatchIds = new Uint16Array([6, 7]); var bv = new BoundingSphere(undefined, 50000000.0); return verifyMultipleRender(modelMatrices, { boxes: boxes, boxBatchIds: boxBatchIds, cylinders: cylinders, cylinderBatchIds: cylinderBatchIds, ellipsoids: ellipsoids, ellipsoidBatchIds: ellipsoidBatchIds, spheres: spheres, sphereBatchIds: sphereBatchIds, boundingVolume: bv, }); } ); it( "renders multiple geometries after a re-batch" + webglMessage, function () { var dimensions = new Cartesian3(125000.0, 125000.0, 125000.0); var modelMatrices = [ Matrix4.fromTranslation(new Cartesian3(dimensions.x, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-dimensions.x, 0.0, 0.0)), ]; var boxes = packBoxes([ { modelMatrix: modelMatrices[0], dimensions: dimensions, }, { modelMatrix: modelMatrices[1], dimensions: dimensions, }, ]); var boxBatchIds = new Uint16Array([0, 1]); var radius = 125000.0; var length = 125000.0; modelMatrices.push( Matrix4.fromTranslation(new Cartesian3(radius, 0.0, 0.0)), Matrix4.fromTranslation(new Cartesian3(-radius, 0.0, 0.0)) ); var cylinders = packCylinders([ { modelMatrix: modelMatrices[2], radius: radius, length: length, }, { modelMatrix: modelMatrices[3], radius: radius, length: length, }, ]); var cylinderBatchIds = new Uint16Array([2, 3]); var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); var bv = new BoundingSphere(center, 50000000.0); length = modelMatrices.length; var batchTable = new Cesium3DTileBatchTable(mockTileset, length); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(globePrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry({ boxes: boxes, boxBatchIds: boxBatchIds, cylinders: cylinders, cylinderBatchIds: cylinderBatchIds, center: center, modelMatrix: modelMatrix, batchTable: batchTable, boundingVolume: bv, }) ); geometry.forceRebatch = true; return loadGeometries(geometry).then(function () { var i; for (i = 0; i < length; ++i) { batchTable.setShow(i, false); } for (i = 0; i < length; ++i) { var transform = Matrix4.multiply( modelMatrix, modelMatrices[i], new Matrix4() ); scene.camera.lookAtTransform( transform, new Cartesian3(0.0, 0.0, 10.0) ); batchTable.setShow(i, true); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([255, 255, 255, 255]); batchTable.setColor(i, Color.BLUE); geometry.updateCommands(i, Color.BLUE); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([0, 0, 255, 255]); batchTable.setShow(i, false); } }); } ); it("renders with inverted classification" + webglMessage, function () { var radii = new Cartesian3(100.0, 100.0, 1000.0); var ellipsoids = packEllipsoids([ { modelMatrix: Matrix4.IDENTITY, radii: radii, }, ]); var ellipsoidBatchIds = new Uint16Array([0]); var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); var bv = new BoundingSphere(center, Cartesian3.maximumComponent(radii)); var batchTable = new Cesium3DTileBatchTable(mockTileset, 1); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(tilesetPrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry({ ellipsoids: ellipsoids, ellipsoidBatchIds: ellipsoidBatchIds, boundingVolume: bv, center: center, modelMatrix: modelMatrix, batchTable: batchTable, }) ); return loadGeometries(geometry).then(function () { scene.camera.lookAtTransform( modelMatrix, new Cartesian3(0.0, 0.0, 1.0) ); expect(scene).toRender([255, 255, 255, 255]); scene.camera.lookAtTransform( modelMatrix, new Cartesian3(radii.x, 0.0, 1.0) ); expect(scene).toRender([255, 0, 0, 255]); scene.invertClassification = true; scene.invertClassificationColor = new Color(0.25, 0.25, 0.25, 1.0); expect(scene).toRender([64, 0, 0, 255]); scene.invertClassification = false; }); }); it("renders wireframe" + webglMessage, function () { var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); var batchTable = new Cesium3DTileBatchTable(mockTileset, 1); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(globePrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry({ ellipsoids: packEllipsoids([ { modelMatrix: Matrix4.IDENTITY, radii: new Cartesian3(1000000.0, 1000000.0, 1000000.0), }, ]), ellipsoidBatchIds: new Uint16Array([0]), center: center, modelMatrix: modelMatrix, batchTable: batchTable, boundingVolume: new BoundingSphere(center, 1000000.0), }) ); geometry.debugWireframe = true; return loadGeometries(geometry).then(function () { scene.camera.setView({ destination: rectangle, }); scene.camera.zoomIn(scene.camera.positionCartographic.height * 0.9); expect(scene).toRender([255, 255, 255, 255]); batchTable.setColor(0, Color.BLUE); geometry.updateCommands(0, Color.BLUE); batchTable.update(mockTileset, scene.frameState); expect(scene).toRender([0, 0, 255, 255]); }); }); it("renders based on classificationType" + webglMessage, function () { var radii = new Cartesian3(100.0, 100.0, 1000.0); var ellipsoids = packEllipsoids([ { modelMatrix: Matrix4.IDENTITY, radii: radii, }, ]); var ellipsoidBatchIds = new Uint16Array([0]); var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); var bv = new BoundingSphere(center, Cartesian3.maximumComponent(radii)); var batchTable = new Cesium3DTileBatchTable(mockTileset, 1); batchTable.update(mockTileset, scene.frameState); scene.primitives.add(globePrimitive); scene.primitives.add(tilesetPrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry({ ellipsoids: ellipsoids, ellipsoidBatchIds: ellipsoidBatchIds, boundingVolume: bv, center: center, modelMatrix: modelMatrix, batchTable: batchTable, }) ); return loadGeometries(geometry).then(function () { scene.camera.lookAtTransform( modelMatrix, new Cartesian3(0.0, 0.0, 1.0) ); geometry.classificationType = ClassificationType.CESIUM_3D_TILE; globePrimitive.show = false; tilesetPrimitive.show = true; expect(scene).toRender([255, 255, 255, 255]); globePrimitive.show = true; tilesetPrimitive.show = false; expect(scene).toRender([255, 0, 0, 255]); geometry.classificationType = ClassificationType.TERRAIN; globePrimitive.show = false; tilesetPrimitive.show = true; expect(scene).toRender([255, 0, 0, 255]); globePrimitive.show = true; tilesetPrimitive.show = false; expect(scene).toRender([255, 255, 255, 255]); geometry.classificationType = ClassificationType.BOTH; globePrimitive.show = false; tilesetPrimitive.show = true; expect(scene).toRender([255, 255, 255, 255]); globePrimitive.show = true; tilesetPrimitive.show = false; expect(scene).toRender([255, 255, 255, 255]); globePrimitive.show = true; tilesetPrimitive.show = true; }); }); it("picks geometry" + webglMessage, function () { var origin = Rectangle.center(rectangle); var center = ellipsoid.cartographicToCartesian(origin); var modelMatrix = Transforms.eastNorthUpToFixedFrame(center); var batchTable = new Cesium3DTileBatchTable(mockTileset, 1); scene.primitives.add(globePrimitive); geometry = scene.primitives.add( new Vector3DTileGeometry({ ellipsoids: packEllipsoids([ { modelMatrix: Matrix4.IDENTITY, radii: new Cartesian3(500000.0, 500000.0, 500000.0), }, ]), ellipsoidBatchIds: new Uint16Array([0]), center: center, modelMatrix: modelMatrix, batchTable: batchTable, boundingVolume: new BoundingSphere(center, 500000.0), }) ); return loadGeometries(geometry).then(function () { scene.camera.setView({ destination: rectangle, }); scene.camera.zoomIn(scene.camera.positionCartographic.height * 0.9); var features = []; geometry.createFeatures(mockTileset, features); var getFeature = mockTileset.getFeature; mockTileset.getFeature = function (index) { return features[index]; }; scene.frameState.passes.pick = true; batchTable.update(mockTileset, scene.frameState); expect(scene).toPickAndCall(function (result) { expect(result).toBe(features[0]); }); mockTileset.getFeature = getFeature; }); }); it("isDestroyed" + webglMessage, function () { geometry = new Vector3DTileGeometry({}); expect(geometry.isDestroyed()).toEqual(false); geometry.destroy(); expect(geometry.isDestroyed()).toEqual(true); }); } }, "WebGL" );