text: import OpenGL.GL as GL
  import numpy as np
  from PIL import Image
  
  
  class Texture:
      """ Helper class to create and automatically destroy textures """
  
      def __init__(self, tex_file, wrap_mode=GL.GL_REPEAT, min_filter=GL.GL_LINEAR,
                   mag_filter=GL.GL_LINEAR_MIPMAP_LINEAR):
          self.glid = GL.glGenTextures(1)
          try:
              # imports image as a numpy array in exactly right format
              tex = np.asarray(Image.open(tex_file).convert('RGBA'))
              GL.glBindTexture(GL.GL_TEXTURE_2D, self.glid)
              GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, tex.shape[1],
                              tex.shape[0], 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, tex)
              GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, wrap_mode)
              GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, wrap_mode)
              GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, min_filter)
              GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, mag_filter)
              GL.glGenerateMipmap(GL.GL_TEXTURE_2D)
              # message = 'Loaded texture %s\t(%s, %s, %s, %s)'
              # print(message % (tex_file, tex.shape, wrap_mode, min_filter, mag_filter))
          except FileNotFoundError:
              print("ERROR: unable to load texture file %s" % tex_file)
  
      def __del__(self):  # delete GL texture from GPU when object dies
          GL.glDeleteTextures(self.glid)
  