playscii/texture.py

49 lines
1.7 KiB
Python

import numpy as np
from OpenGL import GL
class Texture:
# TODO: move texture data init to a set method to make hot reload trivial(?)
mag_filter = GL.GL_NEAREST
min_filter = GL.GL_NEAREST
# min_filter = GL.GL_NEAREST_MIPMAP_NEAREST
packing = GL.GL_UNPACK_ALIGNMENT
def __init__(self, data, width, height):
self.width, self.height = width, height
img_data = np.frombuffer(data, dtype=np.uint8)
self.gltex = GL.glGenTextures(1)
GL.glPixelStorei(self.packing, 1)
GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex)
self.set_filter(self.mag_filter, self.min_filter, False)
self.set_wrap(False, False)
GL.glTexImage2D(
GL.GL_TEXTURE_2D,
0,
GL.GL_RGBA,
width,
height,
0,
GL.GL_RGBA,
GL.GL_UNSIGNED_BYTE,
img_data,
)
if bool(GL.glGenerateMipmap):
GL.glGenerateMipmap(GL.GL_TEXTURE_2D)
def set_filter(self, new_mag_filter, new_min_filter, bind_first=True):
if bind_first:
GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex)
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, new_mag_filter)
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, new_min_filter)
def set_wrap(self, new_wrap, bind_first=True):
if bind_first:
GL.glBindTexture(GL.GL_TEXTURE_2D, self.gltex)
wrap = GL.GL_REPEAT if new_wrap else GL.GL_CLAMP_TO_EDGE
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, wrap)
GL.glTexParameterf(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, wrap)
def destroy(self):
GL.glDeleteTextures([self.gltex])