Source code for picogl.safe

"""
glGenSafe

Example Usage:
==============
>>>self.hetatm_buffers_vao = gl_gen_safe(glGenVertexArrays)
...self.hetatm_buffers_vbo_pos = gl_gen_safe(glGenBuffers)

"""

from typing import Callable, Sequence, Union

import numpy as np


[docs] def gl_gen_safe( gen_func: Callable[[int], Union[int, list[int], tuple[int], "np.ndarray"]], count: int = 1, ) -> int: """ glGenSafe :param gen_func: Callable An OpenGL generator function like glGenVertexArrays or glGenBuffers :param count: Number of items to generate (default is 1) :return: The first generated OpenGL handle (GLuint) Calls an OpenGL glGen* function safely and returns a single GLuint handle. """ result = gen_func(count) if isinstance(result, (list, tuple)): return result[0] if hasattr(result, "__getitem__") and not isinstance(result, (int, float, str)): try: return result[0] except Exception: return int(result) return int(result)
[docs] def gl_delete_safe( delete_func: Callable[[int, Union[int, Sequence[int]]], None], handle: Union[int, Sequence[int]], ) -> None: """ glDeleteSafe :param delete_func: An OpenGL delete function like glDeleteBuffers or glDeleteVertexArrays :param handle: A single handle (int) or a sequence of handles (list/tuple/data) Safely deletes OpenGL resources using glDelete* functions. """ if isinstance(handle, int): delete_func(1, [handle]) elif isinstance(handle, (list, tuple)): delete_func(len(handle), handle) elif hasattr(handle, "__len__"): delete_func(len(handle), handle) else: raise TypeError(f"Invalid handle type for deletion: {type(handle)}")