"""
GL Context Class
"""
from dataclasses import dataclass, field
from pathlib import Path
from typing import Optional
import numpy as np
from picogl.backend.modern.core.shader.program import ShaderProgram
from picogl.backend.modern.core.vertex.array.object import VertexArrayObject
@dataclass
[docs]
class GLContext:
"""
Stores dynamic OpenGL-related state (VAO, shader, texture handles, etc.).
Does NOT store raw vertex data.
"""
[docs]
vaos: dict[str, VertexArrayObject] = field(default_factory=dict)
[docs]
vertex_array: Optional[VertexArrayObject] = None
[docs]
shader: Optional[ShaderProgram] = None
[docs]
texture_id: Optional[int] = None
[docs]
mvp_matrix: np.ndarray = field(
default_factory=lambda: np.identity(4, dtype=np.float32)
)
[docs]
model_matrix: np.ndarray = field(
default_factory=lambda: np.identity(4, dtype=np.float32)
)
[docs]
view: np.ndarray = field(default_factory=lambda: np.identity(4, dtype=np.float32))
[docs]
eye_np: np.ndarray = field(default_factory=lambda: np.identity(3, dtype=np.float32))
[docs]
def create_shader_program(
self,
vertex_source_file: str,
fragment_source_file: str,
glsl_dir: str | Path | None = None,
) -> None:
"""
create_shader_program
:param vertex_source_file: str
:param fragment_source_file: str
:param glsl_dir: str
:return: None
"""
self.shader = ShaderProgram(
vertex_source_file=vertex_source_file,
fragment_source_file=fragment_source_file,
glsl_dir=glsl_dir,
)