UNPKG

@google/model-viewer

Version:

Easily display interactive 3D models on the web and in AR!

126 lines 4.51 kB
/* @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an 'AS IS' BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { ZERO } from './parsers'; /** * Ensures that a given number is expressed in radians. If the number is already * in radians, does nothing. If the value is in degrees, converts it to radians. * If the value has no specified unit, the unit is assumed to be radians. If the * value is not in radians or degrees, the value is resolved as 0 radians. * * Also accepts a second argument that is a default value to use if the input * numberNode number is NaN or Infinity. */ export const degreesToRadians = (numberNode, fallbackRadianValue = 0) => { let { number, unit } = numberNode; if (!isFinite(number)) { number = fallbackRadianValue; unit = 'rad'; } else if (numberNode.unit === 'rad' || numberNode.unit == null) { return numberNode; } const valueIsDegrees = unit === 'deg' && number != null; const value = valueIsDegrees ? number : 0; const radians = value * Math.PI / 180; return { type: 'number', number: radians, unit: 'rad' }; }; /** * Ensures that a given number is expressed in degrees. If the number is alrady * in degrees, does nothing. If the value is in radians or has no specified * unit, converts it to degrees. If the value is not in radians or degrees, the * value is resolved as 0 degrees. * * Also accepts a second argument that is a default value to use if the input * numberNode number is NaN or Infinity. */ export const radiansToDegrees = (numberNode, fallbackDegreeValue = 0) => { let { number, unit } = numberNode; if (!isFinite(number)) { number = fallbackDegreeValue; unit = 'deg'; } else if (numberNode.unit === 'deg') { return numberNode; } const valueIsRadians = (unit === null || unit === 'rad') && number != null; const value = valueIsRadians ? number : 0; const degrees = value * 180 / Math.PI; return { type: 'number', number: degrees, unit: 'deg' }; }; /** * Converts a given length to meters. Currently supported input units are * meters, centimeters and millimeters. * * Also accepts a second argument that is a default value to use if the input * numberNode number is NaN or Infinity. */ export const lengthToBaseMeters = (numberNode, fallbackMeterValue = 0) => { let { number, unit } = numberNode; if (!isFinite(number)) { number = fallbackMeterValue; unit = 'm'; } else if (numberNode.unit === 'm') { return numberNode; } let scale; switch (unit) { default: scale = 1; break; case 'cm': scale = 1 / 100; break; case 'mm': scale = 1 / 1000; break; } const value = scale * number; return { type: 'number', number: value, unit: 'm' }; }; /** * Normalizes the unit of a given input number so that it is expressed in a * preferred unit. For length nodes, the return value will be expressed in * meters. For angle nodes, the return value will be expressed in radians. * * Also takes a fallback number that is used when the number value is not a * valid number or when the unit of the given number cannot be normalized. */ export const normalizeUnit = (() => { const identity = (node) => node; const unitNormalizers = { 'rad': identity, 'deg': degreesToRadians, 'm': identity, 'mm': lengthToBaseMeters, 'cm': lengthToBaseMeters }; return (node, fallback = ZERO) => { let { number, unit } = node; if (!isFinite(number)) { number = fallback.number; unit = fallback.unit; } if (unit == null) { return node; } const normalize = unitNormalizers[unit]; if (normalize == null) { return fallback; } return normalize(node); }; })(); //# sourceMappingURL=conversions.js.map