UNPKG

@cesium/engine

Version:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.

249 lines (232 loc) 7.66 kB
import Cartesian3 from "../../../../Core/Cartesian3.js"; import Check from "../../../../Core/Check.js"; import Matrix3 from "../../../../Core/Matrix3.js"; import RuntimeError from "../../../../Core/RuntimeError.js"; import AnchorPointDirect from "./AnchorPointDirect.js"; import AnchorPointIndirect from "./AnchorPointIndirect.js"; import CorrelationGroup from "./CorrelationGroup.js"; import GltfGpmLocal from "./GltfGpmLocal.js"; import Spdcf from "./Spdcf.js"; import StorageType from "./StorageType.js"; /** * Loads glTF NGA_gpm_local from the root of a glTF object * * @alias GltfGpmLoader * @constructor * * @param {object} options Object with the following properties: * @param {object} options.gltf The glTF JSON. * @param {string} [options.extension] The <code>NGA_gpm_local</code> extension object. * * @private */ function GltfGpmLoader() {} /** * Creates a Matrix3 that describes a covariance matrix (which is * symmetric) from the array containing the upper triangle, in * column-major order. * * @param {number[]} array The input array * @returns {Matrix3} The Matrix3 */ function createCovarianceMatrixFromUpperTriangle(array) { const covarianceMatrix = new Matrix3( array[0], array[1], array[3], array[1], array[2], array[4], array[3], array[4], array[5], ); return covarianceMatrix; } /** * Creates an `AnchorPointDirect` from the given JSON representation * * @param {object} anchorPointDirectJson The input JSON * @returns {AnchorPointDirect} The direct anchor point */ function createAnchorPointDirect(anchorPointDirectJson) { const position = Cartesian3.fromArray( anchorPointDirectJson.position, 0, new Cartesian3(), ); const adjustmentParams = Cartesian3.fromArray( anchorPointDirectJson.adjustmentParams, 0, new Cartesian3(), ); const anchorPointDirect = new AnchorPointDirect({ position: position, adjustmentParams: adjustmentParams, }); return anchorPointDirect; } /** * Creates an `AnchorPointIndirect` from the given JSON representation * * @param {object} anchorPointIndirectJson The input JSON * @returns {AnchorPointIndirect} The indirect anchor point */ function createAnchorPointIndirect(anchorPointIndirectJson) { const position = Cartesian3.fromArray( anchorPointIndirectJson.position, 0, new Cartesian3(), ); const adjustmentParams = Cartesian3.fromArray( anchorPointIndirectJson.adjustmentParams, 0, new Cartesian3(), ); const covarianceMatrix = createCovarianceMatrixFromUpperTriangle( anchorPointIndirectJson.covarianceMatrix, ); const anchorPointIndirect = new AnchorPointIndirect({ position: position, adjustmentParams: adjustmentParams, covarianceMatrix: covarianceMatrix, }); return anchorPointIndirect; } /** * Creates a `CorrelationGroup` from the given JSON representation * * @param {object} correlationGroupJson The input JSON * @returns {CorrelationGroup} The correlation group */ function createCorrelationGroup(correlationGroupJson) { const groupFlags = correlationGroupJson.groupFlags; const rotationThetas = Cartesian3.fromArray( correlationGroupJson.rotationThetas, 0, new Cartesian3(), ); const params = []; for (const paramJson of correlationGroupJson.params) { const param = new Spdcf({ A: paramJson.A, alpha: paramJson.alpha, beta: paramJson.beta, T: paramJson.T, }); params.push(param); } const correlationGroup = new CorrelationGroup({ groupFlags: groupFlags, rotationThetas: rotationThetas, params: params, }); return correlationGroup; } /** * Loads the GPM data from the given JSON that was found as the * `NGA_gpm_local` extension object in the root of the glTF. * * @param {object} gltfGpmLocalJson The extension object * @returns {GltfGpmLocal} The parsed object * @throws RuntimeError When the given object contains invalid storage types. * @private */ GltfGpmLoader.load = function (gltfGpmLocalJson) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object("gltfGpmLocalJson", gltfGpmLocalJson); //>>includeEnd('debug'); const storageType = gltfGpmLocalJson.storageType; if (storageType === StorageType.Direct) { return GltfGpmLoader.loadDirect(gltfGpmLocalJson); } if (storageType === StorageType.Indirect) { return GltfGpmLoader.loadIndirect(gltfGpmLocalJson); } throw new RuntimeError( `Invalid storage type in NGA_gpm_local - expected 'Direct' or 'Indirect', but found ${storageType}`, ); }; /** * Loads the GPM data from the given JSON that was found as the * `NGA_gpm_local` extension object in the root of the glTF, * assuming that the `storageType` of the given object is * `StorageType.Direct`. * * @param {object} gltfGpmLocalJson The extension object * @returns {GltfGpmLocal} The parsed object * @private */ GltfGpmLoader.loadDirect = function (gltfGpmLocalJson) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object("gltfGpmLocalJson", gltfGpmLocalJson); Check.typeOf.object( "gltfGpmLocalJson.anchorPointsDirect", gltfGpmLocalJson.anchorPointsDirect, ); Check.typeOf.object( "gltfGpmLocalJson.covarianceDirectUpperTriangle", gltfGpmLocalJson.covarianceDirectUpperTriangle, ); //>>includeEnd('debug'); const anchorPointsDirect = []; const anchorPointsDirectJson = gltfGpmLocalJson.anchorPointsDirect; for (const anchorPointDirectJson of anchorPointsDirectJson) { const anchorPointDirect = createAnchorPointDirect(anchorPointDirectJson); anchorPointsDirect.push(anchorPointDirect); } const covarianceDirect = createCovarianceMatrixFromUpperTriangle( gltfGpmLocalJson.covarianceDirectUpperTriangle, ); const gltfGpmLocal = new GltfGpmLocal({ storageType: StorageType.Direct, anchorPointsDirect: anchorPointsDirect, covarianceDirect: covarianceDirect, }); return gltfGpmLocal; }; /** * Loads the GPM data from the given JSON that was found as the * `NGA_gpm_local` extension object in the root of the glTF, * assuming that the `storageType` of the given object is * `StorageType.Indirect`. * * @param {object} gltfGpmLocalJson The extension object * @returns {GltfGpmLocal} The parsed object * @private */ GltfGpmLoader.loadIndirect = function (gltfGpmLocalJson) { //>>includeStart('debug', pragmas.debug); Check.typeOf.object("gltfGpmLocalJson", gltfGpmLocalJson); Check.typeOf.object( "gltfGpmLocalJson.anchorPointsIndirect", gltfGpmLocalJson.anchorPointsIndirect, ); Check.typeOf.object( "gltfGpmLocalJson.intraTileCorrelationGroups", gltfGpmLocalJson.intraTileCorrelationGroups, ); //>>includeEnd('debug'); const anchorPointsIndirect = []; const anchorPointsIndirectJson = gltfGpmLocalJson.anchorPointsIndirect; for (const anchorPointIndirectJson of anchorPointsIndirectJson) { const anchorPointIndirect = createAnchorPointIndirect( anchorPointIndirectJson, ); anchorPointsIndirect.push(anchorPointIndirect); } const intraTileCorrelationGroupsJson = gltfGpmLocalJson.intraTileCorrelationGroups; const intraTileCorrelationGroups = []; for (const correlationGroupJson of intraTileCorrelationGroupsJson) { const correlationGroup = createCorrelationGroup(correlationGroupJson); intraTileCorrelationGroups.push(correlationGroup); } const gltfGpmLocal = new GltfGpmLocal({ storageType: StorageType.Indirect, anchorPointsIndirect: anchorPointsIndirect, intraTileCorrelationGroups: intraTileCorrelationGroups, }); return gltfGpmLocal; }; export default GltfGpmLoader;