Source code for picogl.backend.gl.driver.blend

"""
gl Blend Driver
"""

from typing import TYPE_CHECKING

from OpenGL.GL import glBlendFunc

from picogl.backend.gl.capability import (
    GLBlendFactor,
    GLBlendTarget,
    GLPipelineCapability,
)
from picogl.backend.gl.driver.applyable import Applyable
from picogl.backend.gl.driver.capability import GLCapabilityDriver
from picogl.backend.state import gl_value

if TYPE_CHECKING:
    from picogl.backend.state import BlendState


[docs] class GLBlendDriver(Applyable): """ GLBlendDriver """ def __init__(self, capabilities: GLCapabilityDriver): super().__init__()
[docs] self.capabilities = capabilities
[docs] def set_blend(self, enabled: bool): self.capabilities.set_enabled(GLPipelineCapability.BLEND, enabled)
@staticmethod
[docs] def set_blend_func(src: GLBlendFactor | int, dst: GLBlendFactor | int): glBlendFunc(int(gl_value(src)), int(gl_value(dst)))
@staticmethod
[docs] def get_blend_func() -> tuple[GLBlendFactor, GLBlendFactor]: c = GLCapabilityDriver src = GLBlendFactor.from_gl(int(c.get_integerv(GLBlendTarget.BLEND_SRC))) dst = GLBlendFactor.from_gl(int(c.get_integerv(GLBlendTarget.BLEND_DST))) return src, dst
[docs] def setup_blending(self): self.set_blend_func(GLBlendFactor.SRC_ALPHA, GLBlendFactor.ONE_MINUS_SRC_ALPHA)
[docs] def _do_apply(self, state: "BlendState | None", prev: "BlendState | None"): if state is None: return if prev is None or prev.enabled != state.enabled: self.set_blend(state.enabled) if state.enabled and ( prev is None or prev.src != state.src or prev.dst != state.dst ): self.set_blend_func(state.src, state.dst)
[docs] def _is_same(self, prev: "BlendState", state: "BlendState") -> bool: if prev == state: return True return False