# src/shader_manager.py import OpenGL.GL as gl class ShaderManager: def __init__(self): pass def compile_shader(self, vertex_src: str, fragment_src: str) -> int: program = gl.glCreateProgram() def _compile(src, shader_type): shader = gl.glCreateShader(shader_type) gl.glShaderSource(shader, src) gl.glCompileShader(shader) if not gl.glGetShaderiv(shader, gl.GL_COMPILE_STATUS): info_log = gl.glGetShaderInfoLog(shader) if hasattr(info_log, "decode"): info_log = info_log.decode() raise RuntimeError(f"Shader compilation failed: {info_log}") return shader vert_shader = _compile(vertex_src, gl.GL_VERTEX_SHADER) frag_shader = _compile(fragment_src, gl.GL_FRAGMENT_SHADER) gl.glAttachShader(program, vert_shader) gl.glAttachShader(program, frag_shader) gl.glLinkProgram(program) if not gl.glGetProgramiv(program, gl.GL_LINK_STATUS): info_log = gl.glGetProgramInfoLog(program) if hasattr(info_log, "decode"): info_log = info_log.decode() raise RuntimeError(f"Program linking failed: {info_log}") # Optional: delete shaders as they are linked into the program gl.glDeleteShader(vert_shader) gl.glDeleteShader(frag_shader) return program