| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493 | import PixelDatatype from "../Renderer/PixelDatatype.js";import WebGLConstants from "./WebGLConstants.js";/** * The format of a pixel, i.e., the number of components it has and what they represent. * * @enum {Number} */const PixelFormat = {  /**   * A pixel format containing a depth value.   *   * @type {Number}   * @constant   */  DEPTH_COMPONENT: WebGLConstants.DEPTH_COMPONENT,  /**   * A pixel format containing a depth and stencil value, most often used with {@link PixelDatatype.UNSIGNED_INT_24_8}.   *   * @type {Number}   * @constant   */  DEPTH_STENCIL: WebGLConstants.DEPTH_STENCIL,  /**   * A pixel format containing an alpha channel.   *   * @type {Number}   * @constant   */  ALPHA: WebGLConstants.ALPHA,  /**   * A pixel format containing red, green, and blue channels.   *   * @type {Number}   * @constant   */  RGB: WebGLConstants.RGB,  /**   * A pixel format containing red, green, blue, and alpha channels.   *   * @type {Number}   * @constant   */  RGBA: WebGLConstants.RGBA,  /**   * A pixel format containing a luminance (intensity) channel.   *   * @type {Number}   * @constant   */  LUMINANCE: WebGLConstants.LUMINANCE,  /**   * A pixel format containing luminance (intensity) and alpha channels.   *   * @type {Number}   * @constant   */  LUMINANCE_ALPHA: WebGLConstants.LUMINANCE_ALPHA,  /**   * A pixel format containing red, green, and blue channels that is DXT1 compressed.   *   * @type {Number}   * @constant   */  RGB_DXT1: WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT,  /**   * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed.   *   * @type {Number}   * @constant   */  RGBA_DXT1: WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT,  /**   * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed.   *   * @type {Number}   * @constant   */  RGBA_DXT3: WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT,  /**   * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed.   *   * @type {Number}   * @constant   */  RGBA_DXT5: WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT,  /**   * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed.   *   * @type {Number}   * @constant   */  RGB_PVRTC_4BPPV1: WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG,  /**   * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed.   *   * @type {Number}   * @constant   */  RGB_PVRTC_2BPPV1: WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG,  /**   * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed.   *   * @type {Number}   * @constant   */  RGBA_PVRTC_4BPPV1: WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG,  /**   * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed.   *   * @type {Number}   * @constant   */  RGBA_PVRTC_2BPPV1: WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG,  /**   * A pixel format containing red, green, blue, and alpha channels that is ASTC compressed.   *   * @type {Number}   * @constant   */  RGBA_ASTC: WebGLConstants.COMPRESSED_RGBA_ASTC_4x4_WEBGL,  /**   * A pixel format containing red, green, and blue channels that is ETC1 compressed.   *   * @type {Number}   * @constant   */  RGB_ETC1: WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL,  /**   * A pixel format containing red, green, and blue channels that is ETC2 compressed.   *   * @type {Number}   * @constant   */  RGB8_ETC2: WebGLConstants.COMPRESSED_RGB8_ETC2,  /**   * A pixel format containing red, green, blue, and alpha channels that is ETC2 compressed.   *   * @type {Number}   * @constant   */  RGBA8_ETC2_EAC: WebGLConstants.COMPRESSED_RGBA8_ETC2_EAC,  /**   * A pixel format containing red, green, blue, and alpha channels that is BC7 compressed.   *   * @type {Number}   * @constant   */  RGBA_BC7: WebGLConstants.COMPRESSED_RGBA_BPTC_UNORM,};/** * @private */PixelFormat.componentsLength = function (pixelFormat) {  switch (pixelFormat) {    case PixelFormat.RGB:      return 3;    case PixelFormat.RGBA:      return 4;    case PixelFormat.LUMINANCE_ALPHA:      return 2;    case PixelFormat.ALPHA:    case PixelFormat.LUMINANCE:      return 1;    default:      return 1;  }};/** * @private */PixelFormat.validate = function (pixelFormat) {  return (    pixelFormat === PixelFormat.DEPTH_COMPONENT ||    pixelFormat === PixelFormat.DEPTH_STENCIL ||    pixelFormat === PixelFormat.ALPHA ||    pixelFormat === PixelFormat.RGB ||    pixelFormat === PixelFormat.RGBA ||    pixelFormat === PixelFormat.LUMINANCE ||    pixelFormat === PixelFormat.LUMINANCE_ALPHA ||    pixelFormat === PixelFormat.RGB_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT3 ||    pixelFormat === PixelFormat.RGBA_DXT5 ||    pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 ||    pixelFormat === PixelFormat.RGBA_ASTC ||    pixelFormat === PixelFormat.RGB_ETC1 ||    pixelFormat === PixelFormat.RGB8_ETC2 ||    pixelFormat === PixelFormat.RGBA8_ETC2_EAC ||    pixelFormat === PixelFormat.RGBA_BC7  );};/** * @private */PixelFormat.isColorFormat = function (pixelFormat) {  return (    pixelFormat === PixelFormat.ALPHA ||    pixelFormat === PixelFormat.RGB ||    pixelFormat === PixelFormat.RGBA ||    pixelFormat === PixelFormat.LUMINANCE ||    pixelFormat === PixelFormat.LUMINANCE_ALPHA  );};/** * @private */PixelFormat.isDepthFormat = function (pixelFormat) {  return (    pixelFormat === PixelFormat.DEPTH_COMPONENT ||    pixelFormat === PixelFormat.DEPTH_STENCIL  );};/** * @private */PixelFormat.isCompressedFormat = function (pixelFormat) {  return (    pixelFormat === PixelFormat.RGB_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT3 ||    pixelFormat === PixelFormat.RGBA_DXT5 ||    pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 ||    pixelFormat === PixelFormat.RGBA_ASTC ||    pixelFormat === PixelFormat.RGB_ETC1 ||    pixelFormat === PixelFormat.RGB8_ETC2 ||    pixelFormat === PixelFormat.RGBA8_ETC2_EAC ||    pixelFormat === PixelFormat.RGBA_BC7  );};/** * @private */PixelFormat.isDXTFormat = function (pixelFormat) {  return (    pixelFormat === PixelFormat.RGB_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT1 ||    pixelFormat === PixelFormat.RGBA_DXT3 ||    pixelFormat === PixelFormat.RGBA_DXT5  );};/** * @private */PixelFormat.isPVRTCFormat = function (pixelFormat) {  return (    pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 ||    pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1  );};/** * @private */PixelFormat.isASTCFormat = function (pixelFormat) {  return pixelFormat === PixelFormat.RGBA_ASTC;};/** * @private */PixelFormat.isETC1Format = function (pixelFormat) {  return pixelFormat === PixelFormat.RGB_ETC1;};/** * @private */PixelFormat.isETC2Format = function (pixelFormat) {  return (    pixelFormat === PixelFormat.RGB8_ETC2 ||    pixelFormat === PixelFormat.RGBA8_ETC2_EAC  );};/** * @private */PixelFormat.isBC7Format = function (pixelFormat) {  return pixelFormat === PixelFormat.RGBA_BC7;};/** * @private */PixelFormat.compressedTextureSizeInBytes = function (  pixelFormat,  width,  height) {  switch (pixelFormat) {    case PixelFormat.RGB_DXT1:    case PixelFormat.RGBA_DXT1:    case PixelFormat.RGB_ETC1:    case PixelFormat.RGB8_ETC2:      return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8;    case PixelFormat.RGBA_DXT3:    case PixelFormat.RGBA_DXT5:    case PixelFormat.RGBA_ASTC:    case PixelFormat.RGBA8_ETC2_EAC:      return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16;    case PixelFormat.RGB_PVRTC_4BPPV1:    case PixelFormat.RGBA_PVRTC_4BPPV1:      return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8);    case PixelFormat.RGB_PVRTC_2BPPV1:    case PixelFormat.RGBA_PVRTC_2BPPV1:      return Math.floor(        (Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8      );    case PixelFormat.RGBA_BC7:      return Math.ceil(width / 4) * Math.ceil(height / 4) * 16;    default:      return 0;  }};/** * @private */PixelFormat.textureSizeInBytes = function (  pixelFormat,  pixelDatatype,  width,  height) {  let componentsLength = PixelFormat.componentsLength(pixelFormat);  if (PixelDatatype.isPacked(pixelDatatype)) {    componentsLength = 1;  }  return (    componentsLength * PixelDatatype.sizeInBytes(pixelDatatype) * width * height  );};/** * @private */PixelFormat.alignmentInBytes = function (pixelFormat, pixelDatatype, width) {  const mod =    PixelFormat.textureSizeInBytes(pixelFormat, pixelDatatype, width, 1) % 4;  return mod === 0 ? 4 : mod === 2 ? 2 : 1;};/** * @private */PixelFormat.createTypedArray = function (  pixelFormat,  pixelDatatype,  width,  height) {  let constructor;  const sizeInBytes = PixelDatatype.sizeInBytes(pixelDatatype);  if (sizeInBytes === Uint8Array.BYTES_PER_ELEMENT) {    constructor = Uint8Array;  } else if (sizeInBytes === Uint16Array.BYTES_PER_ELEMENT) {    constructor = Uint16Array;  } else if (    sizeInBytes === Float32Array.BYTES_PER_ELEMENT &&    pixelDatatype === PixelDatatype.FLOAT  ) {    constructor = Float32Array;  } else {    constructor = Uint32Array;  }  const size = PixelFormat.componentsLength(pixelFormat) * width * height;  return new constructor(size);};/** * @private */PixelFormat.flipY = function (  bufferView,  pixelFormat,  pixelDatatype,  width,  height) {  if (height === 1) {    return bufferView;  }  const flipped = PixelFormat.createTypedArray(    pixelFormat,    pixelDatatype,    width,    height  );  const numberOfComponents = PixelFormat.componentsLength(pixelFormat);  const textureWidth = width * numberOfComponents;  for (let i = 0; i < height; ++i) {    const row = i * width * numberOfComponents;    const flippedRow = (height - i - 1) * width * numberOfComponents;    for (let j = 0; j < textureWidth; ++j) {      flipped[flippedRow + j] = bufferView[row + j];    }  }  return flipped;};/** * @private */PixelFormat.toInternalFormat = function (pixelFormat, pixelDatatype, context) {  // WebGL 1 require internalFormat to be the same as PixelFormat  if (!context.webgl2) {    return pixelFormat;  }  // Convert pixelFormat to correct internalFormat for WebGL 2  if (pixelFormat === PixelFormat.DEPTH_STENCIL) {    return WebGLConstants.DEPTH24_STENCIL8;  }  if (pixelFormat === PixelFormat.DEPTH_COMPONENT) {    if (pixelDatatype === PixelDatatype.UNSIGNED_SHORT) {      return WebGLConstants.DEPTH_COMPONENT16;    } else if (pixelDatatype === PixelDatatype.UNSIGNED_INT) {      return WebGLConstants.DEPTH_COMPONENT24;    }  }  if (pixelDatatype === PixelDatatype.FLOAT) {    switch (pixelFormat) {      case PixelFormat.RGBA:        return WebGLConstants.RGBA32F;      case PixelFormat.RGB:        return WebGLConstants.RGB32F;      case PixelFormat.RG:        return WebGLConstants.RG32F;      case PixelFormat.R:        return WebGLConstants.R32F;    }  }  if (pixelDatatype === PixelDatatype.HALF_FLOAT) {    switch (pixelFormat) {      case PixelFormat.RGBA:        return WebGLConstants.RGBA16F;      case PixelFormat.RGB:        return WebGLConstants.RGB16F;      case PixelFormat.RG:        return WebGLConstants.RG16F;      case PixelFormat.R:        return WebGLConstants.R16F;    }  }  return pixelFormat;};export default Object.freeze(PixelFormat);
 |