"""Modern shader-based rendering pipeline."""
from __future__ import annotations
from typing import TYPE_CHECKING, Any
from OpenGL.GL import glUseProgram
from picogl.renderer.initializable import Bindable
if TYPE_CHECKING:
from picogl.backend.modern.core.shader.program import ShaderProgram
[docs]
class ShaderPipeline(Bindable):
"""Shader program binding and uniform upload for modern gl draws."""
def __init__(self, program: "ShaderProgram | None" = None):
super().__init__()
[docs]
self._program = program
@property
[docs]
def program(self) -> "ShaderProgram | None":
return self._program
[docs]
def set_program(self, program: "ShaderProgram") -> None:
self._program = program
[docs]
def _do_binding(self) -> None:
if self._program is None:
raise RuntimeError("ShaderPipeline.bind() requires a program")
self._program.bind()
[docs]
def _do_unbinding(self) -> None:
glUseProgram(0)