@openhps/core
Version:
Open Hybrid Positioning System - Core component
271 lines (257 loc) • 10.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TextureUtils = void 0;
exports.contain = contain;
exports.cover = cover;
exports.fill = fill;
exports.getByteLength = getByteLength;
var _constants = require("../constants.js");
/**
* Scales the texture as large as possible within its surface without cropping
* or stretching the texture. The method preserves the original aspect ratio of
* the texture. Akin to CSS `object-fit: contain`
*
* @param {Texture} texture - The texture.
* @param {number} aspect - The texture's aspect ratio.
* @return {Texture} The updated texture.
*/
function contain(texture, aspect) {
const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1;
if (imageAspect > aspect) {
texture.repeat.x = 1;
texture.repeat.y = imageAspect / aspect;
texture.offset.x = 0;
texture.offset.y = (1 - texture.repeat.y) / 2;
} else {
texture.repeat.x = aspect / imageAspect;
texture.repeat.y = 1;
texture.offset.x = (1 - texture.repeat.x) / 2;
texture.offset.y = 0;
}
return texture;
}
/**
* Scales the texture to the smallest possible size to fill the surface, leaving
* no empty space. The method preserves the original aspect ratio of the texture.
* Akin to CSS `object-fit: cover`.
*
* @param {Texture} texture - The texture.
* @param {number} aspect - The texture's aspect ratio.
* @return {Texture} The updated texture.
*/
function cover(texture, aspect) {
const imageAspect = texture.image && texture.image.width ? texture.image.width / texture.image.height : 1;
if (imageAspect > aspect) {
texture.repeat.x = aspect / imageAspect;
texture.repeat.y = 1;
texture.offset.x = (1 - texture.repeat.x) / 2;
texture.offset.y = 0;
} else {
texture.repeat.x = 1;
texture.repeat.y = imageAspect / aspect;
texture.offset.x = 0;
texture.offset.y = (1 - texture.repeat.y) / 2;
}
return texture;
}
/**
* Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.
*
* @param {Texture} texture - The texture.
* @return {Texture} The updated texture.
*/
function fill(texture) {
texture.repeat.x = 1;
texture.repeat.y = 1;
texture.offset.x = 0;
texture.offset.y = 0;
return texture;
}
/**
* Determines how many bytes must be used to represent the texture.
*
* @param {number} width - The width of the texture.
* @param {number} height - The height of the texture.
* @param {number} format - The texture's format.
* @param {number} type - The texture's type.
* @return {number} The byte length.
*/
function getByteLength(width, height, format, type) {
const typeByteLength = getTextureTypeByteLength(type);
switch (format) {
// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml
case _constants.AlphaFormat:
return width * height;
case _constants.LuminanceFormat:
return width * height;
case _constants.LuminanceAlphaFormat:
return width * height * 2;
case _constants.RedFormat:
return width * height / typeByteLength.components * typeByteLength.byteLength;
case _constants.RedIntegerFormat:
return width * height / typeByteLength.components * typeByteLength.byteLength;
case _constants.RGFormat:
return width * height * 2 / typeByteLength.components * typeByteLength.byteLength;
case _constants.RGIntegerFormat:
return width * height * 2 / typeByteLength.components * typeByteLength.byteLength;
case _constants.RGBFormat:
return width * height * 3 / typeByteLength.components * typeByteLength.byteLength;
case _constants.RGBAFormat:
return width * height * 4 / typeByteLength.components * typeByteLength.byteLength;
case _constants.RGBAIntegerFormat:
return width * height * 4 / typeByteLength.components * typeByteLength.byteLength;
// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/
case _constants.RGB_S3TC_DXT1_Format:
case _constants.RGBA_S3TC_DXT1_Format:
return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;
case _constants.RGBA_S3TC_DXT3_Format:
case _constants.RGBA_S3TC_DXT5_Format:
return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;
// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/
case _constants.RGB_PVRTC_2BPPV1_Format:
case _constants.RGBA_PVRTC_2BPPV1_Format:
return Math.max(width, 16) * Math.max(height, 8) / 4;
case _constants.RGB_PVRTC_4BPPV1_Format:
case _constants.RGBA_PVRTC_4BPPV1_Format:
return Math.max(width, 8) * Math.max(height, 8) / 2;
// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/
case _constants.RGB_ETC1_Format:
case _constants.RGB_ETC2_Format:
return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;
case _constants.RGBA_ETC2_EAC_Format:
return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;
// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/
case _constants.RGBA_ASTC_4x4_Format:
return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;
case _constants.RGBA_ASTC_5x4_Format:
return Math.floor((width + 4) / 5) * Math.floor((height + 3) / 4) * 16;
case _constants.RGBA_ASTC_5x5_Format:
return Math.floor((width + 4) / 5) * Math.floor((height + 4) / 5) * 16;
case _constants.RGBA_ASTC_6x5_Format:
return Math.floor((width + 5) / 6) * Math.floor((height + 4) / 5) * 16;
case _constants.RGBA_ASTC_6x6_Format:
return Math.floor((width + 5) / 6) * Math.floor((height + 5) / 6) * 16;
case _constants.RGBA_ASTC_8x5_Format:
return Math.floor((width + 7) / 8) * Math.floor((height + 4) / 5) * 16;
case _constants.RGBA_ASTC_8x6_Format:
return Math.floor((width + 7) / 8) * Math.floor((height + 5) / 6) * 16;
case _constants.RGBA_ASTC_8x8_Format:
return Math.floor((width + 7) / 8) * Math.floor((height + 7) / 8) * 16;
case _constants.RGBA_ASTC_10x5_Format:
return Math.floor((width + 9) / 10) * Math.floor((height + 4) / 5) * 16;
case _constants.RGBA_ASTC_10x6_Format:
return Math.floor((width + 9) / 10) * Math.floor((height + 5) / 6) * 16;
case _constants.RGBA_ASTC_10x8_Format:
return Math.floor((width + 9) / 10) * Math.floor((height + 7) / 8) * 16;
case _constants.RGBA_ASTC_10x10_Format:
return Math.floor((width + 9) / 10) * Math.floor((height + 9) / 10) * 16;
case _constants.RGBA_ASTC_12x10_Format:
return Math.floor((width + 11) / 12) * Math.floor((height + 9) / 10) * 16;
case _constants.RGBA_ASTC_12x12_Format:
return Math.floor((width + 11) / 12) * Math.floor((height + 11) / 12) * 16;
// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/
case _constants.RGBA_BPTC_Format:
case _constants.RGB_BPTC_SIGNED_Format:
case _constants.RGB_BPTC_UNSIGNED_Format:
return Math.ceil(width / 4) * Math.ceil(height / 4) * 16;
// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/
case _constants.RED_RGTC1_Format:
case _constants.SIGNED_RED_RGTC1_Format:
return Math.ceil(width / 4) * Math.ceil(height / 4) * 8;
case _constants.RED_GREEN_RGTC2_Format:
case _constants.SIGNED_RED_GREEN_RGTC2_Format:
return Math.ceil(width / 4) * Math.ceil(height / 4) * 16;
}
throw new Error(`Unable to determine texture byte length for ${format} format.`);
}
function getTextureTypeByteLength(type) {
switch (type) {
case _constants.UnsignedByteType:
case _constants.ByteType:
return {
byteLength: 1,
components: 1
};
case _constants.UnsignedShortType:
case _constants.ShortType:
case _constants.HalfFloatType:
return {
byteLength: 2,
components: 1
};
case _constants.UnsignedShort4444Type:
case _constants.UnsignedShort5551Type:
return {
byteLength: 2,
components: 4
};
case _constants.UnsignedIntType:
case _constants.IntType:
case _constants.FloatType:
return {
byteLength: 4,
components: 1
};
case _constants.UnsignedInt5999Type:
return {
byteLength: 4,
components: 3
};
}
throw new Error(`Unknown texture type ${type}.`);
}
/**
* A class containing utility functions for textures.
*
* @hideconstructor
*/
class TextureUtils {
/**
* Scales the texture as large as possible within its surface without cropping
* or stretching the texture. The method preserves the original aspect ratio of
* the texture. Akin to CSS `object-fit: contain`
*
* @param {Texture} texture - The texture.
* @param {number} aspect - The texture's aspect ratio.
* @return {Texture} The updated texture.
*/
static contain(texture, aspect) {
return contain(texture, aspect);
}
/**
* Scales the texture to the smallest possible size to fill the surface, leaving
* no empty space. The method preserves the original aspect ratio of the texture.
* Akin to CSS `object-fit: cover`.
*
* @param {Texture} texture - The texture.
* @param {number} aspect - The texture's aspect ratio.
* @return {Texture} The updated texture.
*/
static cover(texture, aspect) {
return cover(texture, aspect);
}
/**
* Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.
*
* @param {Texture} texture - The texture.
* @return {Texture} The updated texture.
*/
static fill(texture) {
return fill(texture);
}
/**
* Determines how many bytes must be used to represent the texture.
*
* @param {number} width - The width of the texture.
* @param {number} height - The height of the texture.
* @param {number} format - The texture's format.
* @param {number} type - The texture's type.
* @return {number} The byte length.
*/
static getByteLength(width, height, format, type) {
return getByteLength(width, height, format, type);
}
}
exports.TextureUtils = TextureUtils;