meta-next
Version:
110 lines (86 loc) • 2.52 kB
JavaScript
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