40 lines
1.6 KiB
Python
40 lines
1.6 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])
|