Source code for picogl.backend.modern.core.shader.load

from functools import wraps

from picogl.shaders.type import ShaderType


[docs] def load_shader(shader_type: ShaderType): """ A decorator to load the shader and set the MVP matrix. Args: shader_type (ShaderType): The type of shader to use. """ def decorator(func): @wraps(func) def wrapper(*args, **kwargs): """ Wrapper that supports both keyword-style and legacy positional calls. Expected original signature (after any container like RibbonChainGroup): func(ribbon_buffers, shader_manager, mvp_matrix, zoom_scale=None, ...) """ # Prefer explicit keyword arguments when provided shader_manager = kwargs.get("shader_manager") mvp_matrix = kwargs.get("mvp_matrix") zoom_scale = kwargs.get("zoom_scale") # Backwards compatibility: allow positional shader_manager / mvp_matrix # # args layout for draw_ribbon_vao: # 0: ribbon_buffers (RibbonChainGroup) # 1: shader_manager (ShaderManager) # 2: mvp_matrix (glm.mat4 / np.ndarray) # 3: optional zoom_scale (float) if shader_manager is None and len(args) >= 2: shader_manager = args[1] if mvp_matrix is None and len(args) >= 3: mvp_matrix = args[2] if zoom_scale is None and len(args) >= 4: zoom_scale = args[3] if shader_manager is None or mvp_matrix is None: raise ValueError( "shader_manager and mvp_matrix must be provided " "either as keyword arguments or positional parameters." ) # Use the shader and set the MVP matrix shader_manager.use_shader_type( shader_type=shader_type, mvp_matrix=mvp_matrix, zoom_scale=zoom_scale ) # Execute the original function return func(*args, **kwargs) return wrapper return decorator