import { Cartesian3, ImplicitSubtree, ImplicitTileCoordinates, ImplicitTileset, ImplicitTileMetadata, MetadataClass, MetadataSchema, Resource, } from "../../Source/Cesium.js"; import ImplicitTilingTester from "../ImplicitTilingTester.js"; describe("Scene/ImplicitTileMetadata", function () { var highlightColors = [ [255, 0, 0], [255, 255, 0], [255, 0, 255], ]; var buildingCounts = [100, 350, 200]; var tileTableDescription = { name: "Tiles", class: "tile", properties: { highlightColor: highlightColors, buildingCount: buildingCounts, }, }; var schema = { classes: { tile: { properties: { highlightColor: { type: "VEC3", componentType: "UINT8", semantic: "_HIGHLIGHT_COLOR", }, buildingCount: { componentType: "UINT16", }, }, }, }, }; var tileClass = new MetadataClass({ id: "tile", class: schema.classes.tile, }); var propertyTablesDescription = { schema: schema, propertyTables: [tileTableDescription], }; var subtreeDescription = { tileAvailability: { descriptor: "10011", lengthBits: 5, isInternal: true, includeAvailableCount: true, }, contentAvailability: [ { descriptor: "10011", lengthBits: 5, isInternal: true, }, ], childSubtreeAvailability: { descriptor: 0, lengthBits: 16, isInternal: true, }, metadata: { isInternal: true, propertyTables: propertyTablesDescription, }, }; var bufferResults = ImplicitTilingTester.generateSubtreeBuffers( subtreeDescription ); var tilesetResource = new Resource({ url: "https://example.com/tileset.json", }); var subtreeResource = new Resource({ url: "https://example.com/test.subtree", }); var mockTilesetWithMetadata = { metadata: { schema: new MetadataSchema(schema), }, }; var metadataSchema = mockTilesetWithMetadata.metadata.schema; var implicitQuadtreeJson = { geometricError: 500, refine: "ADD", boundingVolume: { region: [0, 0, Math.PI / 24, Math.PI / 24, 0, 1000.0], }, content: { uri: "https://example.com/{level}/{x}/{y}.b3dm", }, extensions: { "3DTILES_implicit_tiling": { subdivisionScheme: "QUADTREE", subtreeLevels: 2, maximumLevel: 1, subtrees: { uri: "https://example.com/{level}/{x}/{y}.subtree", }, }, }, }; var metadataQuadtree = new ImplicitTileset( tilesetResource, implicitQuadtreeJson, metadataSchema ); var rootCoordinates = new ImplicitTileCoordinates({ subdivisionScheme: metadataQuadtree.subdivisionScheme, subtreeLevels: metadataQuadtree.subtreeLevels, x: 0, y: 0, level: 0, }); var implicitCoordinates = new ImplicitTileCoordinates({ subdivisionScheme: metadataQuadtree.subdivisionScheme, subtreeLevels: metadataQuadtree.subtreeLevels, x: 0, y: 1, level: 1, }); var subtree; beforeAll(function () { subtree = new ImplicitSubtree( subtreeResource, bufferResults.subtreeBuffer, metadataQuadtree, rootCoordinates ); return subtree.readyPromise; }); var tileMetadata; beforeEach(function () { tileMetadata = new ImplicitTileMetadata({ implicitSubtree: subtree, implicitCoordinates: implicitCoordinates, class: tileClass, }); }); it("throws without implicitSubtree", function () { expect(function () { tileMetadata = new ImplicitTileMetadata({ implicitSubtree: undefined, implicitCoordinates: implicitCoordinates, class: tileClass, }); }).toThrowDeveloperError(); }); it("throws without implicitCoordinates", function () { expect(function () { tileMetadata = new ImplicitTileMetadata({ implicitSubtree: subtree, implicitCoordinates: undefined, class: tileClass, }); }).toThrowDeveloperError(); }); it("creates tile metadata", function () { tileMetadata = new ImplicitTileMetadata({ implicitSubtree: subtree, implicitCoordinates: implicitCoordinates, class: tileClass, }); expect(tileMetadata.class).toBe(tileClass); expect(tileMetadata.extras).toBe(undefined); expect(tileMetadata.extensions).toBe(undefined); }); it("hasProperty returns true if the tile has this property", function () { expect(tileMetadata.hasProperty("highlightColor")).toBe(true); }); it("hasProperty returns false if the tile does not have this property", function () { expect(tileMetadata.hasProperty("numberOfPoints")).toBe(false); }); it("hasPropertyBySemantic returns true if the tile has a property with the given semantic", function () { expect(tileMetadata.hasPropertyBySemantic("_HIGHLIGHT_COLOR")).toBe(true); }); it("hasPropertyBySemantic returns false if the tile does not have a property with the given semantic", function () { expect(tileMetadata.hasPropertyBySemantic("_NUMBER_OF_POINTS")).toBe(false); }); it("getPropertyIds returns array of property IDs", function () { var propertyIds = tileMetadata.getPropertyIds([]); propertyIds.sort(); expect(propertyIds).toEqual(["buildingCount", "highlightColor"]); }); it("getProperty returns undefined if a property does not exist", function () { expect(tileMetadata.getProperty("numberOfPoints")).not.toBeDefined(); }); it("getProperty returns the property value", function () { expect(tileMetadata.getProperty("highlightColor")).toEqual( new Cartesian3(255, 255, 0) ); expect(tileMetadata.getProperty("buildingCount")).toBe(350); }); it("setProperty does not create property if it doesn't exist", function () { expect(tileMetadata.setProperty("numberOfPoints", 10)).toBe(false); }); it("setProperty sets property value", function () { expect(tileMetadata.getProperty("buildingCount")).toBe(350); expect(tileMetadata.setProperty("buildingCount", 400)).toBe(true); expect(tileMetadata.getProperty("buildingCount")).toBe(400); }); it("getPropertyBySemantic returns undefined when there's no property with the given semantic", function () { expect( tileMetadata.getPropertyBySemantic("HORIZON_OCCLUSION_POINT") ).not.toBeDefined(); }); it("getPropertyBySemantic returns the property value", function () { expect(tileMetadata.getPropertyBySemantic("_HIGHLIGHT_COLOR")).toEqual( new Cartesian3(255, 255, 0) ); }); it("setPropertyBySemantic sets property value", function () { expect(tileMetadata.getPropertyBySemantic("_HIGHLIGHT_COLOR")).toEqual( new Cartesian3(255, 255, 0) ); expect( tileMetadata.setPropertyBySemantic( "_HIGHLIGHT_COLOR", new Cartesian3(0, 0, 0) ) ).toBe(true); expect(tileMetadata.getPropertyBySemantic("_HIGHLIGHT_COLOR")).toEqual( new Cartesian3(0, 0, 0) ); }); it("setPropertyBySemantic returns false if the semantic does not exist", function () { expect(tileMetadata.setPropertyBySemantic("NAME", "Test Tile")).toBe(false); }); });