"""
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