Source code for picogl.backend.modern.core.pipeline.shader_pipeline

"""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)
[docs] def set_uniforms(self, uniforms: dict[str, Any]) -> None: if self._program is None: raise RuntimeError("ShaderPipeline.set_uniforms() requires a program") self.ensure_bound() for name, value in uniforms.items(): self._program.uniform(name, value)