Source code for picogl.texture.gltexture_driver

"""
This module provides functionality for managing 2D OpenGL textures.

It includes a class for creating, binding, uploading data, setting parameters, generating mipmaps, and deleting
2D textures in OpenGL. This class ensures efficient management of texture resources in graphics applications.

Example Usage:
==============

  >> spec = TextureSpec(width=width, height=height)
  >> tex = Texture2D(spec, data)
  >> driver = GLTextureDriver()
  >> driver.create(tex)
  >> driver.bind(tex)
  >> driver.set_parameters()
  >> driver.upload(tex)
  >> driver.generate_mipmap()
  >> return tex.handle

"""

from OpenGL.GL import glGenTextures
from OpenGL.raw.GL.VERSION.GL_1_1 import glBindTexture, glDeleteTextures

from picogl.backend.gl.enums import GLNumeric
from picogl.backend.gl.wrappers import (
    gl_generate_mipmap,
    gl_tex_parameter,
    gl_teximage2d,
)
from picogl.texture.gltexture import GLTexture
from picogl.texture.mapping import FILTER_MAP, FORMAT_MAP, WRAP_MAP
from picogl.texture.texture2d import Texture2D


[docs] class GLTextureDriver: """gl Texture 2d""" @staticmethod
[docs] def create(tex: Texture2D): """create""" tex.handle = glGenTextures(1)
@staticmethod
[docs] def bind(tex: Texture2D): """bind""" glBindTexture(GLTexture.TEXTURE_2D, tex.handle)
@staticmethod
[docs] def ensure_initialized(tex: Texture2D): if not tex.initialized: GLTextureDriver.initialize(tex) tex.initialized = True
@staticmethod
[docs] def unbind(): """bind""" glBindTexture(GLTexture.TEXTURE_2D, 0)
@staticmethod
[docs] def initialize(tex: Texture2D): """initialize""" GLTextureDriver.bind(tex) spec = tex.spec internal_format = FORMAT_MAP[spec.format] min_filter = FILTER_MAP[spec.min_filter] mag_filter = FILTER_MAP[spec.mag_filter] wrap_s = WRAP_MAP[spec.wrap_s] wrap_t = WRAP_MAP[spec.wrap_t] gl_teximage2d( target=GLTexture.TEXTURE_2D, level=0, internalformat=internal_format, width=spec.width, height=spec.height, border=0, format=internal_format, num_type=GLNumeric.UNSIGNED_BYTE, data=tex.data, ) gl_tex_parameter(GLTexture.TEXTURE_2D, GLTexture.TEXTURE_MIN_FILTER, min_filter) gl_tex_parameter(GLTexture.TEXTURE_2D, GLTexture.TEXTURE_MAG_FILTER, mag_filter) gl_tex_parameter(GLTexture.TEXTURE_2D, GLTexture.TEXTURE_WRAP_S, wrap_s) gl_tex_parameter(GLTexture.TEXTURE_2D, GLTexture.TEXTURE_WRAP_T, wrap_t) if spec.min_filter == "mipmap": gl_generate_mipmap()
@staticmethod
[docs] def delete(tex: Texture2D): """delete""" if tex.handle is not None: glDeleteTextures([tex.handle]) tex.handle = None tex.initialized = False