123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import Check from "../Core/Check.js";
- import combine from "../Core/combine.js";
- import defaultValue from "../Core/defaultValue.js";
- import defined from "../Core/defined.js";
- import PropertyTable from "./PropertyTable.js";
- import PropertyTexture from "./PropertyTexture.js";
- import StructuralMetadata from "./StructuralMetadata.js";
- import MetadataTable from "./MetadataTable.js";
- /**
- * Parse the <code>EXT_feature_metadata</code> glTF extension to create a
- * structural metadata object.
- *
- * @param {Object} options Object with the following properties:
- * @param {Object} options.extension The extension JSON object.
- * @param {MetadataSchema} options.schema The parsed schema.
- * @param {Object.<String, Uint8Array>} [options.bufferViews] An object mapping bufferView IDs to Uint8Array objects.
- * @param {Object.<String, Texture>} [options.textures] An object mapping texture IDs to {@link Texture} objects.
- * @return {StructuralMetadata} A structural metadata object
- * @private
- * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy.
- */
- export default function parseFeatureMetadataLegacy(options) {
- options = defaultValue(options, defaultValue.EMPTY_OBJECT);
- const extension = options.extension;
- // The calling code is responsible for loading the schema.
- // This keeps metadata parsing synchronous.
- const schema = options.schema;
- //>>includeStart('debug', pragmas.debug);
- Check.typeOf.object("options.extension", extension);
- Check.typeOf.object("options.schema", schema);
- //>>includeEnd('debug');
- let i;
- const propertyTables = [];
- let sortedIds;
- if (defined(extension.featureTables)) {
- // Store textures in an array sorted by the dictionary keys. This
- // allows compatibility with the newer EXT_structural_metadata extension
- // which is array-based.
- sortedIds = Object.keys(extension.featureTables).sort();
- for (i = 0; i < sortedIds.length; i++) {
- const featureTableId = sortedIds[i];
- const featureTable = extension.featureTables[featureTableId];
- const classDefinition = schema.classes[featureTable.class];
- const metadataTable = new MetadataTable({
- count: featureTable.count,
- properties: featureTable.properties,
- class: classDefinition,
- bufferViews: options.bufferViews,
- });
- propertyTables.push(
- new PropertyTable({
- id: featureTableId,
- count: featureTable.count,
- metadataTable: metadataTable,
- extras: featureTable.extras,
- extensions: featureTable.extensions,
- })
- );
- }
- }
- const propertyTextures = [];
- if (defined(extension.featureTextures)) {
- // Store textures in an array sorted by the dictionary keys. This
- // allows compatibility with the newer EXT_structural_metadata extension
- // which is array-based.
- sortedIds = Object.keys(extension.featureTextures).sort();
- for (i = 0; i < sortedIds.length; i++) {
- const featureTextureId = sortedIds[i];
- const featureTexture = extension.featureTextures[featureTextureId];
- propertyTextures.push(
- new PropertyTexture({
- id: featureTextureId,
- propertyTexture: transcodeToPropertyTexture(featureTexture),
- class: schema.classes[featureTexture.class],
- textures: options.textures,
- })
- );
- }
- }
- return new StructuralMetadata({
- schema: schema,
- propertyTables: propertyTables,
- propertyTextures: propertyTextures,
- statistics: extension.statistics,
- extras: extension.extras,
- extensions: extension.extensions,
- });
- }
- function transcodeToPropertyTexture(featureTexture) {
- const propertyTexture = {
- class: featureTexture.class,
- properties: {},
- };
- const properties = featureTexture.properties;
- for (const propertyId in properties) {
- if (properties.hasOwnProperty(propertyId)) {
- const oldProperty = properties[propertyId];
- const property = {
- // EXT_structural_metadata uses numeric channel indices instead of
- // a string of channel letters like "rgba".
- channels: reformatChannels(oldProperty.channels),
- extras: oldProperty.extras,
- extensions: oldProperty.extensions,
- };
- // EXT_feature_metadata puts the textureInfo in property.texture.
- // EXT_structural_metadata flattens this structure; essentially a
- // textureInfo + channels
- propertyTexture.properties[propertyId] = combine(
- oldProperty.texture,
- property,
- true
- );
- }
- }
- return propertyTexture;
- }
- function reformatChannels(channelsString) {
- const length = channelsString.length;
- const result = new Array(length);
- for (let i = 0; i < length; i++) {
- result[i] = "rgba".indexOf(channelsString[i]);
- }
- return result;
- }
|