Source code for picogl.backend.modern.core.uniform.location_value

from typing import Union

import numpy as np
from OpenGL.GL import *  # pylint: disable=W0614
from OpenGL.GL import glUniformMatrix4fv
from pyglm import glm

from picogl.logger import Logger as log


[docs] def set_uniform_location_value( location: int, uniform_value: Union[ float, int, glm.vec2, glm.vec3, glm.vec4, glm.mat4, np.ndarray ], ): """ set_uniform_value :param uniform location: int :param uniform_value: Value to set (supports float, int, vec2, vec3, vec4, mat4, or np.ndarray) Set a uniform variable in a shader program """ # Handle types if isinstance(uniform_value, float): glUniform1f(location, uniform_value) elif isinstance(uniform_value, int): glUniform1i(location, uniform_value) elif isinstance(uniform_value, glm.vec2): glUniform2fv(location, 1, glm.value_ptr(uniform_value)) elif isinstance(uniform_value, glm.vec3): glUniform3fv(location, 1, glm.value_ptr(uniform_value)) elif isinstance(uniform_value, glm.vec4): glUniform4fv(location, 1, glm.value_ptr(uniform_value)) elif isinstance(uniform_value, glm.mat4): glUniformMatrix4fv(location, 1, GL_FALSE, glm.value_ptr(uniform_value)) elif isinstance(uniform_value, np.ndarray): if uniform_value.shape == (4, 4): # mat4 glUniformMatrix4fv( location, 1, GL_FALSE, uniform_value.astype(np.float32).flatten() ) elif uniform_value.shape == (3,): # vec3 glUniform3fv(location, 1, uniform_value.astype(np.float32)) elif uniform_value.shape == (4,): # vec4 glUniform4fv(location, 1, uniform_value.astype(np.float32)) else: log.warning( f"Unsupported ndarray shape {uniform_value.shape} for uniform '{location}'" ) else: log.warning(f"Unsupported uniform type for '{location}': {type(uniform_value)}")