UNPKG

mdx-m3-viewer

Version:

A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.

71 lines (56 loc) 2 kB
import { powerOfTwo } from '../common/math'; import { isGif, isJpeg, isPng, isWebP } from '../common/isformat'; import { imageToImageData, scaleNPOT } from '../common/canvas'; import Texture from './texture'; import { HandlerResourceData } from './handlerresource'; /** * Checks if the given source is a supported image texture source. */ export function isImageSource(src: any) { return src instanceof ImageData || src instanceof HTMLImageElement || src instanceof HTMLCanvasElement || src instanceof HTMLVideoElement; } /** * Detects whether the given buffer is a supported format, and if so returns the mime. * The supported formats are PNG, JPEG, GIF, and WebP. */ export function detectMime(buffer: ArrayBuffer) { if (isPng(buffer)) { return 'image/png' } if (isJpeg(buffer)) { return 'image/jpeg'; } if (isGif(buffer)) { return 'image/gif'; } if (isWebP(buffer)) { return 'image/webp' } return ''; } /** * A texture handler for image sources. */ export class ImageTexture extends Texture { constructor(src: TexImageSource, resourceData: HandlerResourceData) { super(resourceData); let widthPOT = powerOfTwo(src.width); let heightPOT = powerOfTwo(src.height); if (widthPOT !== src.width || heightPOT !== src.height) { if (!(src instanceof ImageData)) { src = imageToImageData(src); } // Upscale to POT if the size is NPOT. src = scaleNPOT(src); } let gl = this.viewer.gl; this.webglResource = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, this.webglResource); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, src); gl.generateMipmap(gl.TEXTURE_2D); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); this.width = src.width; this.height = src.height; } }