cesium
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
473 lines (447 loc) • 11.7 kB
JavaScript
import Check from "../Core/Check.js";
import DeveloperError from "../Core/DeveloperError.js";
import FeatureDetection from "../Core/FeatureDetection.js";
/**
* An enum of metadata types.
*
* @enum MetadataType
* @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.
*/
var MetadataType = {
/**
* An 8-bit signed integer
*
* @type {String}
* @constant
* @private
*/
INT8: "INT8",
/**
* An 8-bit unsigned integer
*
* @type {String}
* @constant
* @private
*/
UINT8: "UINT8",
/**
* A 16-bit signed integer
*
* @type {String}
* @constant
* @private
*/
INT16: "INT16",
/**
* A 16-bit unsigned integer
*
* @type {String}
* @constant
* @private
*/
UINT16: "UINT16",
/**
* A 32-bit signed integer
*
* @type {String}
* @constant
* @private
*/
INT32: "INT32",
/**
* A 32-bit unsigned integer
*
* @type {String}
* @constant
* @private
*/
UINT32: "UINT32",
/**
* A 64-bit signed integer. This type requires BigInt support.
*
* @see FeatureDetection.supportsBigInt
*
* @type {String}
* @constant
* @private
*/
INT64: "INT64",
/**
* A 64-bit signed integer. This type requires BigInt support
*
* @see FeatureDetection.supportsBigInt
*
* @type {String}
* @constant
* @private
*/
UINT64: "UINT64",
/**
* A 32-bit (single precision) floating point number
*
* @type {String}
* @constant
* @private
*/
FLOAT32: "FLOAT32",
/**
* A 64-bit (double precision) floating point number
*
* @type {String}
* @constant
* @private
*/
FLOAT64: "FLOAT64",
/**
* A boolean (true/false) value
*
* @type {String}
* @constant
* @private
*/
BOOLEAN: "BOOLEAN",
/**
* A UTF-8 encoded string value
*
* @type {String}
* @constant
* @private
*/
STRING: "STRING",
/**
* An enumerated value. This type is used in conjunction with a {@link MetadataEnum} to describe the valid values.
*
* @see MetadataEnum
*
* @type {String}
* @constant
* @private
*/
ENUM: "ENUM",
/**
* An array of values. A <code>componentType</code> property is needed to
* define what type of values are stored in the array.
*
* @type {String}
* @constant
* @private
*/
ARRAY: "ARRAY",
};
/**
* Gets the minimum value for the numeric type.
* <p>
* Returns a BigInt for the INT64 and UINT64 types if BigInt is supported on this platform.
* Otherwise an approximate number is returned.
* </p>
*
* @param {MetadataType} type The type.
* @returns {Number|BigInt} The minimum value.
*
* @exception {DeveloperError} type must be a numeric type
*
* @private
*/
MetadataType.getMinimum = function (type) {
//>>includeStart('debug', pragmas.debug);
if (!MetadataType.isNumericType(type)) {
throw new DeveloperError("type must be a numeric type");
}
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
return -128;
case MetadataType.UINT8:
return 0;
case MetadataType.INT16:
return -32768;
case MetadataType.UINT16:
return 0;
case MetadataType.INT32:
return -2147483648;
case MetadataType.UINT32:
return 0;
case MetadataType.INT64:
if (FeatureDetection.supportsBigInt()) {
return BigInt("-9223372036854775808"); // eslint-disable-line
}
return -Math.pow(2, 63);
case MetadataType.UINT64:
if (FeatureDetection.supportsBigInt()) {
return BigInt(0); // eslint-disable-line
}
return 0;
case MetadataType.FLOAT32:
// Maximum 32-bit floating point number. This value will be converted to the nearest 64-bit Number
return -340282346638528859811704183484516925440.0;
case MetadataType.FLOAT64:
return -Number.MAX_VALUE;
}
};
/**
* Gets the maximum value for the numeric type.
* <p>
* Returns a BigInt for the INT64 and UINT64 types if BigInt is supported on this platform.
* Otherwise an approximate number is returned.
* </p>
*
* @param {MetadataType} type The type.
* @returns {Number|BigInt} The maximum value.
*
* @exception {DeveloperError} type must be a numeric type
*
* @private
*/
MetadataType.getMaximum = function (type) {
//>>includeStart('debug', pragmas.debug);
if (!MetadataType.isNumericType(type)) {
throw new DeveloperError("type must be a numeric type");
}
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
return 127;
case MetadataType.UINT8:
return 255;
case MetadataType.INT16:
return 32767;
case MetadataType.UINT16:
return 65535;
case MetadataType.INT32:
return 2147483647;
case MetadataType.UINT32:
return 4294967295;
case MetadataType.INT64:
if (FeatureDetection.supportsBigInt()) {
// Need to initialize with a string otherwise the value will be 9223372036854775808
return BigInt("9223372036854775807"); // eslint-disable-line
}
return Math.pow(2, 63) - 1;
case MetadataType.UINT64:
if (FeatureDetection.supportsBigInt()) {
// Need to initialize with a string otherwise the value will be 18446744073709551616
return BigInt("18446744073709551615"); // eslint-disable-line
}
return Math.pow(2, 64) - 1;
case MetadataType.FLOAT32:
// Maximum 32-bit floating point number
return 340282346638528859811704183484516925440.0;
case MetadataType.FLOAT64:
return Number.MAX_VALUE;
}
};
/**
* Returns whether the type is a numeric type.
*
* @param {MetadataType} type The type.
* @returns {Boolean} Whether the type is a numeric type.
*
* @private
*/
MetadataType.isNumericType = function (type) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.string("type", type);
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
case MetadataType.UINT8:
case MetadataType.INT16:
case MetadataType.UINT16:
case MetadataType.INT32:
case MetadataType.UINT32:
case MetadataType.INT64:
case MetadataType.UINT64:
case MetadataType.FLOAT32:
case MetadataType.FLOAT64:
return true;
default:
return false;
}
};
/**
* Returns whether the type is an integer type.
*
* @param {MetadataType} type The type.
* @returns {Boolean} Whether the type is an integer type.
*
* @private
*/
MetadataType.isIntegerType = function (type) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.string("type", type);
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
case MetadataType.UINT8:
case MetadataType.INT16:
case MetadataType.UINT16:
case MetadataType.INT32:
case MetadataType.UINT32:
case MetadataType.INT64:
case MetadataType.UINT64:
return true;
default:
return false;
}
};
/**
* Returns whether the type is an unsigned integer type.
*
* @param {MetadataType} type The type.
* @returns {Boolean} Whether the type is an unsigned integer type.
*
* @private
*/
MetadataType.isUnsignedIntegerType = function (type) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.string("type", type);
//>>includeEnd('debug');
switch (type) {
case MetadataType.UINT8:
case MetadataType.UINT16:
case MetadataType.UINT32:
case MetadataType.UINT64:
return true;
default:
return false;
}
};
/**
* Returns whether a type can be used in a vector, i.e. the {@link Cartesian2},
* {@link Cartesian3}, or {@link Cartesian4} classes. This includes all numeric
* types except for types requiring 64-bits
* @param {MetadataType} type The type to check
* @return {Boolean} <code>true</code> if the type can be encoded as a vector type, or <code>false</code> otherwise
* @private
*/
MetadataType.isVectorCompatible = function (type) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.string("type", type);
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
case MetadataType.UINT8:
case MetadataType.INT16:
case MetadataType.UINT16:
case MetadataType.INT32:
case MetadataType.UINT32:
case MetadataType.FLOAT32:
case MetadataType.FLOAT64:
return true;
default:
return false;
}
};
/**
* Normalizes signed integers to the range [-1.0, 1.0] and unsigned integers to
* the range [0.0, 1.0].
* <p>
* value may be a BigInt for the INT64 and UINT64 types. The value is converted
* to a 64-bit floating point number during normalization which may result in
* small precision differences.
* </p>
*
* @param {Number|BigInt} value The integer value.
* @param {MetadataType} type The type.
* @returns {Number} The normalized value.
*
* @exception {DeveloperError} value must be a number or a BigInt
* @exception {DeveloperError} type must be an integer type
*
* @private
*/
MetadataType.normalize = function (value, type) {
//>>includeStart('debug', pragmas.debug);
if (typeof value !== "number" && typeof value !== "bigint") {
throw new DeveloperError("value must be a number or a BigInt");
}
if (!MetadataType.isIntegerType(type)) {
throw new DeveloperError("type must be an integer type");
}
//>>includeEnd('debug');
if (value >= 0) {
return Math.min(Number(value) / Number(MetadataType.getMaximum(type)), 1.0);
}
return -Math.min(Number(value) / Number(MetadataType.getMinimum(type)), 1.0);
};
/**
* Unnormalizes signed numbers in the range [-1.0, 1.0] to signed integers and
* unsigned numbers in the range [0.0, 1.0] to unsigned integers. Values outside
* the range are clamped to the range.
* <p>
* Returns a BigInt for the INT64 and UINT64 types if BigInt is supported on this platform.
* </p>
*
* @param {Number} value The normalized value.
* @param {MetadataType} type The type.
* @returns {Number|BigInt} The integer value.
*
* @exception {DeveloperError} type must be an integer type
*
* @private
*/
MetadataType.unnormalize = function (value, type) {
//>>includeStart('debug', pragmas.debug);
Check.typeOf.number("value", value);
if (!MetadataType.isIntegerType(type)) {
throw new DeveloperError("type must be an integer type");
}
//>>includeEnd('debug');
var min = MetadataType.getMinimum(type);
var max = MetadataType.getMaximum(type);
if (value >= 0.0) {
value = value * Number(max);
} else {
value = -value * Number(min);
}
if (
(type === MetadataType.INT64 || type === MetadataType.UINT64) &&
FeatureDetection.supportsBigInt()
) {
value = BigInt(value); // eslint-disable-line
}
if (value > max) {
return max;
}
if (value < min) {
return min;
}
return value;
};
/**
* Gets the size in bytes for the numeric type.
*
* @param {MetadataType} type The type.
* @returns {Number} The size in bytes.
*
* @exception {DeveloperError} type must be a numeric type
*
* @private
*/
MetadataType.getSizeInBytes = function (type) {
//>>includeStart('debug', pragmas.debug);
if (!MetadataType.isNumericType(type)) {
throw new DeveloperError("type must be a numeric type");
}
//>>includeEnd('debug');
switch (type) {
case MetadataType.INT8:
case MetadataType.UINT8:
return 1;
case MetadataType.INT16:
case MetadataType.UINT16:
return 2;
case MetadataType.INT32:
case MetadataType.UINT32:
return 4;
case MetadataType.INT64:
case MetadataType.UINT64:
return 8;
case MetadataType.FLOAT32:
return 4;
case MetadataType.FLOAT64:
return 8;
}
};
export default Object.freeze(MetadataType);