UNPKG

meta-next

Version:

110 lines (86 loc) 2.52 kB
import Engine from "../Engine" import { isPowerOf2 } from "../Utils" import Resource from "./Resource" const greenPixel = new Uint8Array([ 0, 255, 0, 255 ]) class Texture extends Resource { constructor(config) { super(config) this.instance = Engine.gl.createTexture() this.width = 0 this.height = 0 if(config) { this.setup(config) } } setup(config) { this.loadFromPath(config.path) } loadFromPath(path) { this.loading = true const image = new Image() image.onload = () => { this.loadFromImage(image) } image.onfailed = () => { this.loadEmpty() } image.src = path } loadEmpty() { const gl = Engine.gl this.width = 1 this.height = 1 gl.bindTexture(gl.TEXTURE_2D, this.instance) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, greenPixel) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) this.loaded = true } loadFromImage(image) { const gl = Engine.gl this.width = image.width this.height = image.height gl.bindTexture(gl.TEXTURE_2D, this.instance) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image) if(isPowerOf2(image.width) && isPowerOf2(image.height)) { gl.generateMipmap(gl.TEXTURE_2D) } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) } this.loading = false } loadFromCanvas(canvas) { const gl = Engine.gl this.width = canvas.width this.height = canvas.height gl.bindTexture(gl.TEXTURE_2D, this.instance) gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas) if(isPowerOf2(canvas.width) && isPowerOf2(canvas.height)) { gl.generateMipmap(gl.TEXTURE_2D) } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) } this.loaded = true } frame() { return this.frameData } use() { const gl = Engine.gl gl.bindTexture(gl.TEXTURE_2D, this.instance) } } export default Texture