from OpenGL.GL import * import Image class Texture2D: def __init__(self, file, wrap=GL_REPEAT, minFilter=GL_LINEAR, magFilter=GL_LINEAR): self.file = file self.wrapS = wrap self.wrapT = wrap self.minFilter = minFilter self.magFilter = magFilter self.defined = False self.id = 0 def define(self): img = Image.open(self.file).transpose(Image.FLIP_TOP_BOTTOM).convert('RGBA') width = 2 while width < img.size[0]: width *= 2 width /= 2 height = 2 while height < img.size[1]: height *= 2 height /= 2 if (width != img.size[0]) or (height != img.size[1]): img = img.resize((width,height)) self.id = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, self.id) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.wrapS) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.wrapT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.minFilter) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.magFilter) if (self.minFilter == GL_NEAREST_MIPMAP_NEAREST) or \ (self.minFilter == GL_NEAREST_MIPMAP_LINEAR) or \ (self.minFilter == GL_LINEAR_MIPMAP_NEAREST) or \ (self.minFilter == GL_LINEAR_MIPMAP_LINEAR): gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, img.size[0], img.size[1], GL_RGBA, GL_UNSIGNED_BYTE, img.tostring()) else: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.size[0], img.size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, img.tostring()) glBindTexture(GL_TEXTURE_2D, 0) self.defined = True def apply(self): if not self.defined: self.define() glBindTexture(GL_TEXTURE_2D, self.id) if self.id != 0: glEnable(GL_TEXTURE_2D) else: glDisable(GL_TEXTURE_2D) def disable(self): glBindTexture(GL_TEXTURE_2D, 0) glDisable(GL_TEXTURE_2D)