"""
pybind11 example plugin
"""
from __future__ import annotations
import collections.abc
import glm
import typing
import typing_extensions
from . import forces
from . import key
__all__: list[str] = ['AmbientLight', 'Camera', 'Camera2D', 'Collider', 'ComputeShader', 'Cubemap', 'DirectionalLight', 'EBO', 'Engine', 'F32', 'FBO', 'Frame', 'GpuBuffer', 'GpuBufferDtype', 'I32', 'Image', 'Keyboard', 'Light', 'Material', 'Mesh', 'Mouse', 'Node', 'Node2D', 'PointLight', 'RayCastResult', 'RayCastResult2D', 'Rigid', 'Scene', 'Scene2D', 'Shader', 'Skybox', 'Solver', 'StaticCamera', 'StaticCamera2D', 'U32', 'UBO', 'VAO', 'VBO', 'Window', 'forces', 'init_gpu', 'key']
class AmbientLight(Light):
    def __init__(self, color: glm.vec3 = (1.0, 1.0, 1.0), intensity: typing.SupportsFloat = 1.0) -> None:
        ...
class Camera(StaticCamera):
    def __init__(self, engine: Engine, position: glm.vec3 = (0.0, 0.0, 0.0), pitch: typing.SupportsFloat = 0.0, yaw: typing.SupportsFloat = 0.0) -> None:
        ...
    def update(self) -> None:
        ...
    @property
    def speed(self) -> float:
        ...
    @speed.setter
    def speed(self, arg1: typing.SupportsFloat) -> None:
        ...
class Camera2D(StaticCamera2D):
    def __init__(self, engine: Engine, position: glm.vec2 = (0.0, 0.0), scale: typing.SupportsFloat = 10.0) -> None:
        ...
    def update(self) -> None:
        ...
    @property
    def speed(self) -> float:
        ...
    @speed.setter
    def speed(self, arg1: typing.SupportsFloat) -> None:
        ...
class Collider:
    def __init__(self, vertices: collections.abc.Sequence[glm.vec2]) -> None:
        ...
    def getArea(self) -> float:
        ...
    def getBaseMoment(self) -> float:
        ...
    def getBaseRadius(self) -> float:
        ...
    def getCOM(self) -> glm.vec2:
        ...
    def getGC(self) -> glm.vec2:
        ...
    def getHalfDim(self) -> glm.vec2:
        ...
    def getMass(self, arg0: glm.vec2, arg1: typing.SupportsFloat) -> float:
        ...
    def getMoment(self, arg0: glm.vec2, arg1: typing.SupportsFloat) -> float:
        ...
    def getRadius(self, arg0: glm.vec2) -> float:
        ...
    def getVertices(self) -> list[glm.vec2]:
        ...
    def setArea(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setBaseMoment(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setCOM(self, arg0: glm.vec2) -> None:
        ...
    def setGC(self, arg0: glm.vec2) -> None:
        ...
    def setHalfDim(self, arg0: glm.vec2) -> None:
        ...
    def setVertices(self, arg0: collections.abc.Sequence[glm.vec2]) -> None:
        ...
class ComputeShader:
    def __init__(self, wgsl: str, buffer_handles: list, uniform_size: typing.SupportsInt = 0) -> None:
        ...
    def dispatch(self, x: typing.SupportsInt, y: typing.SupportsInt = 1, z: typing.SupportsInt = 1) -> None:
        """
        Dispatch the compute shader with workgroup counts (x, y, z).
        """
    def set_uniform_bytes(self, data: typing_extensions.Buffer) -> None:
        """
        Set uniform data from a bytes-like or buffer object.
        """
class Cubemap:
    @typing.overload
    def __init__(self, faces: collections.abc.Sequence[Image]) -> None:
        ...
    @typing.overload
    def __init__(self, faces: collections.abc.Sequence[str]) -> None:
        ...
    def bind(self) -> None:
        ...
    def get_id(self) -> int:
        ...
    def unbind(self) -> None:
        ...
class DirectionalLight(Light):
    def __init__(self, color: glm.vec3 = (1.0, 1.0, 1.0), intensity: typing.SupportsFloat = 1.0, direction: glm.vec3 = (0.0, -1.0, 0.20000000298023224)) -> None:
        ...
    def get_direction(self) -> glm.vec3:
        ...
    def set_direction(self, direction: glm.vec3) -> None:
        ...
class EBO:
    def __init__(self, data: collections.abc.Sequence[typing.SupportsInt], drawType: typing.SupportsInt = 35044) -> None:
        ...
    def bind(self) -> None:
        ...
    def get_size(self) -> int:
        ...
    def unbind(self) -> None:
        ...
    def write(self, data: typing_extensions.CapsuleType, size: typing.SupportsInt, offset: typing.SupportsInt) -> None:
        ...
class Engine:
    @staticmethod
    def get_resource_server() -> ...:
        ...
    def __init__(self, width: typing.SupportsInt = 800, height: typing.SupportsInt = 800, title: str = 'Basilisk', auto_mouse_grab: bool = True, show_splash: bool = False) -> None:
        ...
    def disable_blend(self) -> None:
        ...
    def disable_cull_face(self) -> None:
        ...
    def disable_depth_test(self) -> None:
        ...
    def disable_multisample(self) -> None:
        ...
    def disable_vsync(self) -> None:
        ...
    def enable_blend(self) -> None:
        ...
    def enable_cull_face(self) -> None:
        ...
    def enable_depth_test(self) -> None:
        ...
    def enable_multisample(self) -> None:
        ...
    def enable_vsync(self) -> None:
        ...
    def get_delta_time(self) -> float:
        ...
    def get_frame(self) -> ...:
        ...
    def get_keyboard(self) -> Keyboard:
        """
        Get the keyboard. Use get_pressed, get_down, get_released with basilisk.key constants.
        """
    def get_mouse(self) -> Mouse:
        """
        Get the mouse. Access position, clicks, and button states.
        """
    def get_mouse_world_x(self, camera: ...) -> float:
        """
        Mouse X in world coordinates. Pass the scene's camera, e.g. scene.get_camera().
        """
    def get_mouse_world_y(self, camera: ...) -> float:
        """
        Mouse Y in world coordinates. Pass the scene's camera, e.g. scene.get_camera().
        """
    def get_mouse_x(self) -> float:
        """
        Mouse X position (screen coordinates, scaled).
        """
    def get_mouse_y(self) -> float:
        """
        Mouse Y position (screen coordinates, scaled).
        """
    def get_window(self) -> Window:
        """
        Get the window. Access width, height, FPS, etc.
        """
    def is_key_down(self, key_code: key.KeyCode) -> bool:
        """
        True if key is currently held down.
        """
    def is_key_pressed(self, key_code: key.KeyCode) -> bool:
        """
        True if key was pressed this frame (down now, was up last frame). Use basilisk.key.K_W, etc.
        """
    def is_key_released(self, key_code: key.KeyCode) -> bool:
        """
        True if key was released this frame.
        """
    def is_left_clicked(self) -> bool:
        """
        True if left button was clicked this frame (down now, was up last frame).
        """
    def is_left_down(self) -> bool:
        """
        True if left mouse button is held down.
        """
    def is_left_released(self) -> bool:
        """
        True if left button was released this frame.
        """
    def is_middle_clicked(self) -> bool:
        """
        True if middle button was clicked this frame.
        """
    def is_middle_down(self) -> bool:
        """
        True if middle mouse button is held down.
        """
    def is_middle_released(self) -> bool:
        """
        True if middle button was released this frame.
        """
    def is_right_clicked(self) -> bool:
        """
        True if right button was clicked this frame.
        """
    def is_right_down(self) -> bool:
        """
        True if right mouse button is held down.
        """
    def is_right_released(self) -> bool:
        """
        True if right button was released this frame.
        """
    def is_running(self) -> bool:
        ...
    def render(self) -> None:
        ...
    def set_resolution(self, width: typing.SupportsInt, height: typing.SupportsInt) -> None:
        ...
    def show_splash(self) -> None:
        ...
    def update(self) -> None:
        ...
    def use_context(self) -> None:
        ...
class FBO:
    def __init__(self, width: typing.SupportsInt, height: typing.SupportsInt, components: typing.SupportsInt) -> None:
        ...
    def bind(self) -> None:
        ...
    def clear(self, r: typing.SupportsFloat, g: typing.SupportsFloat, b: typing.SupportsFloat, a: typing.SupportsFloat) -> None:
        ...
    def get_depth_id(self) -> int:
        ...
    def get_height(self) -> int:
        ...
    def get_id(self) -> int:
        ...
    def get_texture_id(self) -> int:
        ...
    def get_width(self) -> int:
        ...
    def unbind(self) -> None:
        ...
class Frame:
    @typing.overload
    def __init__(self, engine: Engine, width: typing.SupportsInt = 800, height: typing.SupportsInt = 800) -> None:
        ...
    @typing.overload
    def __init__(self, engine: Engine, shader: Shader, width: typing.SupportsInt = 800, height: typing.SupportsInt = 800) -> None:
        ...
    def clear(self, r: typing.SupportsFloat = 0.0, g: typing.SupportsFloat = 0.0, b: typing.SupportsFloat = 0.0, a: typing.SupportsFloat = 1.0) -> None:
        ...
    def get_aspect_ratio(self) -> float:
        ...
    def get_ebo(self) -> EBO:
        ...
    def get_fbo(self) -> FBO:
        ...
    def get_height(self) -> int:
        ...
    def get_render_height(self) -> int:
        ...
    def get_render_width(self) -> int:
        ...
    def get_shader(self) -> Shader:
        ...
    def get_vao(self) -> VAO:
        ...
    def get_vbo(self) -> VBO:
        ...
    def get_width(self) -> int:
        ...
    @typing.overload
    def render(self) -> None:
        ...
    @typing.overload
    def render(self, x: typing.SupportsInt, y: typing.SupportsInt, width: typing.SupportsInt, height: typing.SupportsInt) -> None:
        ...
    def set_filter_linear(self) -> None:
        ...
    def set_filter_nearest(self) -> None:
        ...
    def use(self) -> None:
        ...
class GpuBuffer:
    def __init__(self, dtype: typing.Any, len: typing.SupportsInt) -> None:
        """
        Create a GPU buffer. dtype: 'u32'|'f32'|'i32', type (int/float), or object with .name; len: element count.
        """
    def dtype(self) -> str:
        """
        Return dtype string: 'u32', 'f32', or 'i32'.
        """
    def element_size(self) -> int:
        ...
    def handle(self) -> int:
        """
        Return opaque handle for use with ComputeShader buffer_handles.
        """
    def len(self) -> int:
        ...
    def read(self) -> list:
        """
        Read buffer into a list of elements.
        """
    def size_bytes(self) -> int:
        ...
    def write(self, data: collections.abc.Sequence) -> None:
        """
        Write a sequence of elements (length must not exceed buffer len).
        """
class GpuBufferDtype:
    """
    Members:
    
      U32
    
      F32
    
      I32
    """
    F32: typing.ClassVar[GpuBufferDtype]  # value = <GpuBufferDtype.F32: 1>
    I32: typing.ClassVar[GpuBufferDtype]  # value = <GpuBufferDtype.I32: 2>
    U32: typing.ClassVar[GpuBufferDtype]  # value = <GpuBufferDtype.U32: 0>
    __members__: typing.ClassVar[dict[str, GpuBufferDtype]]  # value = {'U32': <GpuBufferDtype.U32: 0>, 'F32': <GpuBufferDtype.F32: 1>, 'I32': <GpuBufferDtype.I32: 2>}
    def __eq__(self, other: typing.Any) -> bool:
        ...
    def __getstate__(self) -> int:
        ...
    def __hash__(self) -> int:
        ...
    def __index__(self) -> int:
        ...
    def __init__(self, value: typing.SupportsInt) -> None:
        ...
    def __int__(self) -> int:
        ...
    def __ne__(self, other: typing.Any) -> bool:
        ...
    def __repr__(self) -> str:
        ...
    def __setstate__(self, state: typing.SupportsInt) -> None:
        ...
    def __str__(self) -> str:
        ...
    @property
    def name(self) -> str:
        ...
    @property
    def value(self) -> int:
        ...
class Image:
    @typing.overload
    def __init__(self, file: str) -> None:
        ...
    @typing.overload
    def __init__(self, data: collections.abc.Sequence[typing.SupportsFloat], width: typing.SupportsInt, height: typing.SupportsInt, nChannels: typing.SupportsInt = 4) -> None:
        ...
    def get_data(self) -> int:
        ...
    def get_height(self) -> int:
        ...
    def get_width(self) -> int:
        ...
class Keyboard:
    def get_down(self, keyCode: key.KeyCode) -> bool:
        ...
    def get_pressed(self, keyCode: key.KeyCode) -> bool:
        ...
    def get_released(self, keyCode: key.KeyCode) -> bool:
        ...
    def update(self) -> None:
        ...
class Light:
    def get_color(self) -> glm.vec3:
        ...
    def get_intensity(self) -> float:
        ...
    def set_color(self, color: glm.vec3) -> None:
        ...
    def set_intensity(self, intensity: typing.SupportsFloat) -> None:
        ...
class Material:
    def __init__(self, color: typing.Any = None, albedo: Image = None, normal: Image = None, alpha: typing.SupportsFloat = 1.0, subsurface: typing.SupportsFloat = 0.0, sheen: typing.SupportsFloat = 0.0, sheen_tint: typing.SupportsFloat = 0.0, anisotropic: typing.SupportsFloat = 0.0, specular: typing.SupportsFloat = 0.75, metallicness: typing.SupportsFloat = 0.0, clearcoat: typing.SupportsFloat = 0.0, clearcoat_gloss: typing.SupportsFloat = 0.0) -> None:
        ...
    def get_albedo(self) -> Image:
        ...
    def get_alpha(self) -> float:
        ...
    def get_anisotropic(self) -> float:
        ...
    def get_clearcoat(self) -> float:
        ...
    def get_clearcoat_gloss(self) -> float:
        ...
    def get_color(self) -> glm.vec3:
        ...
    def get_metallicness(self) -> float:
        ...
    def get_normal(self) -> Image:
        ...
    def get_roughness(self) -> float:
        ...
    def get_sheen(self) -> float:
        ...
    def get_sheen_tint(self) -> float:
        ...
    def get_specular(self) -> float:
        ...
    def get_subsurface(self) -> float:
        ...
    @typing.overload
    def set_albedo(self, albedo: Image) -> None:
        ...
    @typing.overload
    def set_albedo(self, albedo: Image) -> None:
        ...
    def set_alpha(self, alpha: typing.SupportsFloat) -> None:
        ...
    def set_anisotropic(self, anisotropic: typing.SupportsFloat) -> None:
        ...
    def set_clearcoat(self, clearcoat: typing.SupportsFloat) -> None:
        ...
    def set_clearcoat_gloss(self, clearcoat_gloss: typing.SupportsFloat) -> None:
        ...
    def set_color(self, color: glm.vec3) -> None:
        ...
    def set_metallicness(self, metallicness: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_normal(self, normal: Image) -> None:
        ...
    @typing.overload
    def set_normal(self, normal: Image) -> None:
        ...
    def set_roughness(self, roughness: typing.SupportsFloat) -> None:
        ...
    def set_sheen(self, sheen: typing.SupportsFloat) -> None:
        ...
    def set_sheen_tint(self, sheen_tint: typing.SupportsFloat) -> None:
        ...
    def set_specular(self, specular: typing.SupportsFloat) -> None:
        ...
    def set_subsurface(self, subsurface: typing.SupportsFloat) -> None:
        ...
class Mesh:
    def __init__(self, modelPath: str, generateUV: bool = False, generateNormals: bool = False) -> None:
        ...
    def get_indices(self) -> list[int]:
        ...
    def get_vertices(self) -> list[float]:
        ...
class Mouse:
    def get_clicked(self) -> bool:
        ...
    def get_left_clicked(self) -> bool:
        ...
    def get_left_down(self) -> bool:
        ...
    def get_left_released(self) -> bool:
        ...
    def get_middle_clicked(self) -> bool:
        ...
    def get_middle_down(self) -> bool:
        ...
    def get_middle_released(self) -> bool:
        ...
    def get_relative_x(self) -> float:
        ...
    def get_relative_y(self) -> float:
        ...
    def get_right_clicked(self) -> bool:
        ...
    def get_right_down(self) -> bool:
        ...
    def get_right_released(self) -> bool:
        ...
    def get_world_x(self, camera: ...) -> float:
        """
        Mouse X in world coordinates using the given 2D camera.
        """
    def get_world_y(self, camera: ...) -> float:
        """
        Mouse Y in world coordinates using the given 2D camera.
        """
    def get_x(self) -> float:
        ...
    def get_y(self) -> float:
        ...
    def set_grab(self) -> None:
        ...
    def set_hidden(self) -> None:
        ...
    def set_visible(self) -> None:
        ...
    def update(self) -> None:
        ...
class Node:
    @typing.overload
    def __init__(self, scene: ..., mesh: typing.Any = None, material: typing.Any = None, position: glm.vec3 = (0.0, 0.0, 0.0), rotation: glm.quat = (1.0, 0.0, 0.0, 0.0), scale: glm.vec3 = (1.0, 1.0, 1.0)) -> None:
        ...
    @typing.overload
    def __init__(self, parent: Node, mesh: typing.Any = None, material: typing.Any = None, position: glm.vec3 = (0.0, 0.0, 0.0), rotation: glm.quat = (1.0, 0.0, 0.0, 0.0), scale: glm.vec3 = (1.0, 1.0, 1.0)) -> None:
        ...
    @typing.overload
    def __init__(self, scene: ...) -> None:
        ...
    @typing.overload
    def __init__(self, mesh: typing.Any = None, material: typing.Any = None, position: glm.vec3 = (0.0, 0.0, 0.0), rotation: glm.quat = (1.0, 0.0, 0.0, 0.0), scale: glm.vec3 = (1.0, 1.0, 1.0)) -> None:
        ...
    def add(self, child: Node) -> None:
        ...
    def get_children(self) -> ...:
        ...
    def get_engine(self) -> Engine:
        ...
    def get_material(self) -> ...:
        ...
    def get_mesh(self) -> ...:
        ...
    def get_parent(self) -> Node:
        ...
    def get_position(self) -> glm.vec3:
        ...
    def get_rotation(self) -> glm.quat:
        ...
    def get_scale(self) -> glm.vec3:
        ...
    def get_scene(self) -> ...:
        ...
    def get_shader(self) -> ...:
        ...
    def remove(self, child: Node) -> None:
        ...
    @typing.overload
    def set_material(self, material: ...) -> None:
        ...
    @typing.overload
    def set_material(self, material: ...) -> None:
        ...
    @typing.overload
    def set_mesh(self, mesh: ...) -> None:
        ...
    @typing.overload
    def set_mesh(self, mesh: ...) -> None:
        ...
    def set_position(self, position: glm.vec3) -> None:
        ...
    def set_rotation(self, rotation: typing.Any) -> None:
        ...
    def set_scale(self, scale: glm.vec3) -> None:
        ...
    @property
    def pos(self) -> glm.vec3:
        ...
    @property
    def position(self) -> _Vec3PropertyProxy:
        ...
    @position.setter
    def position(self, arg1: typing.Any) -> None:
        ...
    @property
    def rot(self) -> glm.quat:
        ...
    @property
    def rotation(self) -> _QuatPropertyProxy:
        ...
    @rotation.setter
    def rotation(self, arg1: typing.Any) -> None:
        ...
    @property
    def scale(self) -> _Vec3PropertyProxy:
        ...
    @scale.setter
    def scale(self, arg1: typing.Any) -> None:
        ...
    @property
    def scl(self) -> glm.vec3:
        ...
class Node2D:
    @typing.overload
    def __init__(self, scene: Scene2D, mesh: typing.Any, material: typing.Any, position: glm.vec2 = (0.0, 0.0), rotation: typing.SupportsFloat = 0.0, scale: glm.vec2 = (1.0, 1.0), velocity: glm.vec3 = (0.0, 0.0, 0.0), collider: ... = None, density: typing.SupportsFloat = 1.0, friction: typing.SupportsFloat = 0.5) -> None:
        ...
    @typing.overload
    def __init__(self, parent: Node2D, mesh: typing.Any, material: typing.Any, position: glm.vec2 = (0.0, 0.0), rotation: typing.SupportsFloat = 0.0, scale: glm.vec2 = (1.0, 1.0), velocity: glm.vec3 = (0.0, 0.0, 0.0), collider: ... = None, density: typing.SupportsFloat = 1.0, friction: typing.SupportsFloat = 0.5) -> None:
        ...
    @typing.overload
    def __init__(self, scene: Scene2D) -> None:
        ...
    @typing.overload
    def __init__(self, mesh: typing.Any = None, material: typing.Any = None, position: glm.vec2 = (0.0, 0.0), rotation: typing.SupportsFloat = 0.0, scale: glm.vec2 = (1.0, 1.0), velocity: glm.vec3 = (0.0, 0.0, 0.0), collider: ... = None, density: typing.SupportsFloat = 1.0, friction: typing.SupportsFloat = 0.5) -> None:
        ...
    def add(self, child: Node2D) -> None:
        ...
    def constrained_to(self, other: Node2D) -> ...:
        ...
    def get_children(self) -> ...:
        ...
    def get_collider(self) -> ...:
        ...
    def get_density(self) -> float:
        ...
    def get_engine(self) -> Engine:
        ...
    def get_friction(self) -> float:
        ...
    def get_layer(self) -> float:
        ...
    def get_material(self) -> Material:
        ...
    def get_mesh(self) -> Mesh:
        ...
    def get_parent(self) -> Node2D:
        ...
    def get_position(self) -> glm.vec2:
        ...
    def get_rigid(self) -> ...:
        ...
    def get_rotation(self) -> float:
        ...
    def get_scale(self) -> glm.vec2:
        ...
    def get_scene(self) -> Scene2D:
        ...
    def get_shader(self) -> ...:
        ...
    def get_velocity(self) -> glm.vec3:
        ...
    def is_touching(self, other: Node2D) -> bool:
        ...
    def just_collided(self, other: Node2D) -> bool:
        ...
    def remove(self, child: Node2D) -> None:
        ...
    def set_collider(self, collider: ...) -> None:
        ...
    def set_density(self, density: typing.SupportsFloat) -> None:
        ...
    def set_friction(self, friction: typing.SupportsFloat) -> None:
        ...
    def set_layer(self, layer: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_material(self, material: Material) -> None:
        ...
    @typing.overload
    def set_material(self, material: Material) -> None:
        ...
    @typing.overload
    def set_mesh(self, mesh: Mesh) -> None:
        ...
    @typing.overload
    def set_mesh(self, mesh: Mesh) -> None:
        ...
    @typing.overload
    def set_position(self, position: glm.vec2) -> None:
        ...
    @typing.overload
    def set_position(self, position: glm.vec3) -> None:
        ...
    def set_rotation(self, rotation: typing.SupportsFloat) -> None:
        ...
    def set_scale(self, scale: glm.vec2) -> None:
        ...
    def set_velocity(self, velocity: glm.vec3) -> None:
        ...
    @property
    def layer(self) -> float:
        ...
    @layer.setter
    def layer(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def pos(self) -> glm.vec2:
        ...
    @property
    def position(self) -> _Vec2PropertyProxy:
        ...
    @position.setter
    def position(self, arg1: typing.Any) -> None:
        ...
    @property
    def rotation(self) -> float:
        ...
    @rotation.setter
    def rotation(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def scale(self) -> _Vec2PropertyProxy:
        ...
    @scale.setter
    def scale(self, arg1: typing.Any) -> None:
        ...
    @property
    def scl(self) -> glm.vec2:
        ...
    @property
    def vel(self) -> glm.vec3:
        ...
    @property
    def velocity(self) -> _Vec3PropertyProxy:
        ...
    @velocity.setter
    def velocity(self, arg1: typing.Any) -> None:
        ...
class PointLight(Light):
    def __init__(self, color: glm.vec3 = (1.0, 1.0, 1.0), intensity: typing.SupportsFloat = 1.0, position: glm.vec3 = (0.0, 0.0, 0.0), range: typing.SupportsFloat = 15.0) -> None:
        ...
    def get_position(self) -> glm.vec3:
        ...
    def get_range(self) -> float:
        ...
    def set_position(self, position: glm.vec3) -> None:
        ...
    def set_range(self, range: typing.SupportsFloat) -> None:
        ...
class RayCastResult:
    @property
    def distance(self) -> float:
        ...
    @property
    def intersection(self) -> glm.vec3:
        ...
    @property
    def node(self) -> Node:
        """
        Hit node (shared_ptr) or None if no hit
        """
    @property
    def normal(self) -> glm.vec3:
        ...
class RayCastResult2D:
    @property
    def distance(self) -> float:
        ...
    @property
    def intersection(self) -> glm.vec2:
        ...
    @property
    def node(self) -> ...:
        """
        Hit node (shared_ptr) or None if no hit
        """
    @property
    def normal(self) -> glm.vec2:
        ...
class Rigid:
    def __init__(self, solver: Solver, node: Node2D, collider: Collider, position: glm.vec3, size: glm.vec2, density: typing.SupportsFloat, friction: typing.SupportsFloat, velocity: glm.vec3) -> None:
        ...
    def constrainedTo(self, arg0: Rigid) -> bool:
        ...
    def getAABB(self) -> tuple[glm.vec2, glm.vec2]:
        ...
    def getCollider(self) -> Collider:
        ...
    def getColor(self) -> int:
        ...
    def getDegree(self) -> int:
        ...
    def getDensity(self) -> float:
        ...
    def getForces(self) -> ...:
        ...
    def getFriction(self) -> float:
        ...
    def getIndex(self) -> int:
        ...
    def getInertial(self) -> glm.vec3:
        ...
    def getInitial(self) -> glm.vec3:
        ...
    def getMass(self) -> float:
        ...
    def getMoment(self) -> float:
        ...
    def getNext(self) -> Rigid:
        ...
    def getNextUnusedColor(self) -> int:
        ...
    def getNode(self) -> Node2D:
        ...
    def getPosition(self) -> glm.vec3:
        ...
    def getPrev(self) -> Rigid:
        ...
    def getPrevVelocity(self) -> glm.vec3:
        ...
    def getRadius(self) -> float:
        ...
    def getSatur(self) -> int:
        ...
    def getSize(self) -> glm.vec2:
        ...
    def getSolver(self) -> Solver:
        ...
    def getVel(self) -> glm.vec3:
        ...
    def getVelocity(self) -> glm.vec3:
        ...
    def incrSatur(self) -> None:
        ...
    def insert(self, arg0: ...) -> None:
        ...
    def isColorUsed(self, arg0: typing.SupportsInt) -> bool:
        ...
    def isColored(self) -> bool:
        ...
    def remove(self, arg0: ...) -> None:
        ...
    def reserveColors(self, arg0: typing.SupportsInt) -> None:
        ...
    def resetColoring(self) -> None:
        ...
    def setCollider(self, arg0: Collider) -> None:
        ...
    def setFriction(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setInertial(self, arg0: glm.vec3) -> None:
        ...
    def setInitial(self, arg0: glm.vec3) -> None:
        ...
    def setMass(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setMoment(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setNode(self, arg0: Node2D) -> None:
        ...
    def setPosition(self, arg0: glm.vec3) -> None:
        ...
    def setPrevVelocity(self, arg0: glm.vec3) -> None:
        ...
    def setRadius(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setScale(self, arg0: glm.vec2) -> None:
        ...
    def setVelocity(self, arg0: glm.vec3) -> None:
        ...
    def useColor(self, arg0: typing.SupportsInt) -> None:
        ...
    def verifyColoring(self) -> bool:
        ...
class Scene:
    @typing.overload
    def __init__(self, engine: Engine, addSkybox: bool = True, addLight: bool = True, addCube: bool = False) -> None:
        ...
    @typing.overload
    def __init__(self, engine: Engine, shader: ..., addSkybox: bool = True, addLight: bool = True, addCube: bool = False) -> None:
        ...
    @typing.overload
    def add(self, light: ...) -> None:
        ...
    @typing.overload
    def add(self, node: Node) -> None:
        ...
    def get_camera(self) -> StaticCamera:
        ...
    def get_shader(self) -> ...:
        ...
    def pick(self, mouse_position: glm.vec2) -> RayCastResultPy:
        """
        Cast a ray from the mouse position; returns RayCastResult with shared_ptr node. Raises if hit node lacks shared_ptr.
        """
    def raycast(self, origin: glm.vec3, direction: glm.vec3) -> RayCastResultPy:
        """
        Cast a ray in world space; returns RayCastResult with shared_ptr node. Raises if hit node lacks shared_ptr.
        """
    def remove(self, node: Node) -> None:
        ...
    def render(self) -> None:
        ...
    @typing.overload
    def set_camera(self, camera: StaticCamera) -> None:
        ...
    @typing.overload
    def set_camera(self, camera: StaticCamera) -> None:
        ...
    def set_skybox(self, skybox: ...) -> None:
        ...
    def update(self) -> None:
        ...
class Scene2D:
    camera: StaticCamera2D
    @typing.overload
    def __init__(self, engine: Engine) -> None:
        ...
    @typing.overload
    def __init__(self, engine: Engine, shader: ...) -> None:
        ...
    def add(self, node: ...) -> None:
        ...
    def get_camera(self) -> StaticCamera2D:
        ...
    def get_engine(self) -> Engine:
        ...
    def get_root(self) -> ...:
        ...
    def get_shader(self) -> ...:
        ...
    def get_solver(self) -> ...:
        ...
    def pick(self, position: glm.vec2) -> ...:
        """
        Return the topmost node at the given world position (by layer). Returns None if no hit. Raises if hit node lacks shared_ptr.
        """
    def raycast(self, origin: glm.vec2, direction: glm.vec2) -> RayCastResult2D:
        """
        Cast a ray in world space; returns RayCastResult2D with shared_ptr node. Raises if hit node lacks shared_ptr.
        """
    def remove(self, node: ...) -> None:
        ...
    def render(self) -> None:
        ...
    @typing.overload
    def set_camera(self, camera: StaticCamera2D) -> None:
        ...
    @typing.overload
    def set_camera(self, camera: StaticCamera2D) -> None:
        ...
    def update(self) -> None:
        ...
class Shader:
    @staticmethod
    @typing.overload
    def set_uniform(*args, **kwargs) -> None:
        ...
    def __init__(self, vertexPath: str, fragmentPath: str) -> None:
        ...
    @typing.overload
    def bind(self, name: str, texture: ..., slot: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind(self, name: str, textureArray: ..., slot: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind(self, name: str, tbo: ..., slot: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind(self, name: str, fbo: ..., slot: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind(self, name: str, cubemap: ..., slot: typing.SupportsInt) -> None:
        ...
    def get_attributes(self) -> ...:
        ...
    def get_stride(self) -> int:
        ...
    def get_uniform_location(self, name: str) -> int:
        ...
    @typing.overload
    def set_uniform(self, name: str, value: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_uniform(self, name: str, value: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_uniform(self, name: str, value: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def set_uniform(self, name: str, value: glm.vec3) -> None:
        ...
    @typing.overload
    def set_uniform(self, name: str, value: glm.vec2) -> None:
        ...
    def use(self) -> None:
        ...
class Skybox:
    @typing.overload
    def __init__(self, cubemap: Cubemap, ownsCubemap: bool = False) -> None:
        ...
    @typing.overload
    def __init__(self, faces: collections.abc.Sequence[Image]) -> None:
        ...
    @typing.overload
    def __init__(self, faces: collections.abc.Sequence[str]) -> None:
        ...
    def get_cubemap(self) -> Cubemap:
        ...
    def get_shader(self) -> Shader:
        ...
    def get_vao(self) -> VAO:
        ...
    def get_vbo(self) -> VBO:
        ...
    def render(self, camera: StaticCamera) -> None:
        ...
class Solver:
    @staticmethod
    def setGravity(*args, **kwargs) -> None:
        ...
    def __init__(self) -> None:
        ...
    def getAlpha(self) -> float:
        ...
    def getBeta(self) -> float:
        ...
    def getDt(self) -> float:
        ...
    def getGamma(self) -> float:
        ...
    def getGravity(self) -> ...:
        ...
    def getIterations(self) -> int:
        ...
    def getNumForces(self) -> int:
        ...
    def getNumRigids(self) -> int:
        ...
    def getPostStabilize(self) -> bool:
        ...
    @typing.overload
    def insert(self, arg0: ...) -> None:
        ...
    @typing.overload
    def insert(self, arg0: ...) -> None:
        ...
    @typing.overload
    def remove(self, arg0: ...) -> None:
        ...
    @typing.overload
    def remove(self, arg0: ...) -> None:
        ...
    def setAlpha(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setBeta(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setDt(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setGamma(self, arg0: typing.SupportsFloat) -> None:
        ...
    def setIterations(self, arg0: typing.SupportsInt) -> None:
        ...
    def setPostStabilize(self, arg0: bool) -> None:
        ...
class StaticCamera:
    def __init__(self, engine: Engine, position: glm.vec3 = (0.0, 0.0, 0.0), pitch: typing.SupportsFloat = 0.0, yaw: typing.SupportsFloat = 0.0) -> None:
        ...
    def get_aspect(self) -> float:
        ...
    def get_far(self) -> float:
        ...
    def get_fov(self) -> float:
        ...
    def get_near(self) -> float:
        ...
    def get_pitch(self) -> float:
        ...
    def get_position(self) -> glm.vec3:
        ...
    def get_x(self) -> float:
        ...
    def get_y(self) -> float:
        ...
    def get_yaw(self) -> float:
        ...
    def get_z(self) -> float:
        ...
    def look_at(self, target: glm.vec3) -> None:
        ...
    def set_aspect(self, aspect: typing.SupportsFloat) -> None:
        ...
    def set_far(self, far: typing.SupportsFloat) -> None:
        ...
    def set_fov(self, fov: typing.SupportsFloat) -> None:
        ...
    def set_near(self, near: typing.SupportsFloat) -> None:
        ...
    def set_pitch(self, pitch: typing.SupportsFloat) -> None:
        ...
    def set_position(self, position: glm.vec3) -> None:
        ...
    def set_x(self, x: typing.SupportsFloat) -> None:
        ...
    def set_y(self, y: typing.SupportsFloat) -> None:
        ...
    def set_yaw(self, yaw: typing.SupportsFloat) -> None:
        ...
    def set_z(self, z: typing.SupportsFloat) -> None:
        ...
    def update(self) -> None:
        ...
    def use(self, shader: ...) -> None:
        ...
class StaticCamera2D:
    def __init__(self, engine: Engine, position: glm.vec2 = (0.0, 0.0), scale: typing.SupportsFloat = 10.0) -> None:
        ...
    def get_position(self) -> glm.vec2:
        ...
    def get_view_height(self) -> float:
        ...
    def get_view_scale(self) -> glm.vec2:
        ...
    def get_view_width(self) -> float:
        ...
    def get_x(self) -> float:
        ...
    def get_y(self) -> float:
        ...
    def set_position(self, position: glm.vec2) -> None:
        ...
    @typing.overload
    def set_scale(self, scale: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_scale(self, x_scale: typing.SupportsFloat, y_scale: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def set_scale(self, view_scale: glm.vec2) -> None:
        ...
    def set_x(self, x: typing.SupportsFloat) -> None:
        ...
    def set_y(self, y: typing.SupportsFloat) -> None:
        ...
    def update(self) -> None:
        ...
    def use(self, shader: ...) -> None:
        ...
    @property
    def pos(self) -> glm.vec2:
        ...
    @property
    def position(self) -> ...:
        ...
    @position.setter
    def position(self, arg1: typing.Any) -> None:
        ...
    @property
    def scale(self) -> float:
        ...
    @scale.setter
    def scale(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def view_scale(self) -> ...:
        ...
    @view_scale.setter
    def view_scale(self, arg1: typing.Any) -> None:
        ...
class UBO:
    @typing.overload
    def __init__(self, data: typing_extensions.CapsuleType, size: typing.SupportsInt, drawType: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def __init__(self, data: ..., std: ..., drawType: typing.SupportsInt = 35044) -> None:
        ...
    def bind(self) -> None:
        ...
    def get_size(self) -> int:
        ...
    def unbind(self) -> None:
        ...
    def write(self, data: typing_extensions.CapsuleType, size: typing.SupportsInt, offset: typing.SupportsInt) -> None:
        ...
class VAO:
    def __init__(self, shader: Shader, vertices: VBO, indices: EBO) -> None:
        ...
    def bind(self) -> None:
        ...
    def bind_attribute(self, location: typing.SupportsInt, count: typing.SupportsInt, dataType: typing.SupportsInt, stride: typing.SupportsInt, offset: typing.SupportsInt, divisor: typing.SupportsInt) -> None:
        ...
    def bind_attributes(self, attribs: ..., std: ..., std: ..., std: ..., std: ..., std: ..., divisor: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind_buffer(self, buffer: VBO, attribs: ..., std: ..., std: ..., std: ..., std: ..., std: ..., divisor: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def bind_buffer(self, buffer: VBO, indices: EBO, attribs: ..., std: ..., std: ..., std: ..., std: ..., std: ..., divisor: typing.SupportsInt) -> None:
        ...
    def render(self, instanceCount: typing.SupportsInt = 0) -> None:
        ...
class VBO:
    @typing.overload
    def __init__(self, data: typing_extensions.CapsuleType, size: typing.SupportsInt, drawType: typing.SupportsInt) -> None:
        ...
    @typing.overload
    def __init__(self, data: collections.abc.Sequence, drawType: typing.SupportsInt = 35044) -> None:
        ...
    def bind(self) -> None:
        ...
    def get_size(self) -> int:
        ...
    def unbind(self) -> None:
        ...
class Window:
    def clear(self, r: typing.SupportsFloat = 0.0, g: typing.SupportsFloat = 0.0, b: typing.SupportsFloat = 0.0, a: typing.SupportsFloat = 1.0) -> None:
        ...
    def disable_blend(self) -> None:
        ...
    def disable_cull_face(self) -> None:
        ...
    def disable_depth_test(self) -> None:
        ...
    def disable_multisample(self) -> None:
        ...
    def disable_v_sync(self) -> None:
        ...
    def enable_blend(self) -> None:
        ...
    def enable_cull_face(self) -> None:
        ...
    def enable_depth_test(self) -> None:
        ...
    def enable_multisample(self) -> None:
        ...
    def enable_v_sync(self) -> None:
        ...
    def get_delta_time(self) -> float:
        ...
    def get_fps(self) -> int:
        ...
    def get_height(self) -> int:
        ...
    def get_time(self) -> float:
        ...
    def get_width(self) -> int:
        ...
    def get_window_scale_x(self) -> float:
        ...
    def get_window_scale_y(self) -> float:
        ...
    def is_running(self) -> bool:
        ...
    def render(self) -> None:
        ...
    def use(self) -> None:
        ...
class _QuatPropertyProxy:
    def __getitem__(self, arg0: typing.SupportsInt) -> float:
        ...
    @typing.overload
    def __imul__(self, arg0: glm.quat) -> _QuatPropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: typing.SupportsFloat) -> _QuatPropertyProxy:
        ...
    def __iter__(self) -> collections.abc.Iterator:
        ...
    def __len__(self) -> int:
        ...
    @typing.overload
    def __mul__(self, arg0: glm.quat) -> glm.quat:
        ...
    @typing.overload
    def __mul__(self, arg0: typing.SupportsFloat) -> glm.quat:
        ...
    def __rmul__(self, arg0: typing.SupportsFloat) -> glm.quat:
        ...
    def __setattr__(self, arg0: str, arg1: typing.Any) -> None:
        ...
    def __setitem__(self, arg0: typing.SupportsInt, arg1: typing.SupportsFloat) -> None:
        ...
    def conjugate(self) -> glm.quat:
        ...
    def dot(self, other: glm.quat) -> float:
        ...
    def euler_angles(self) -> glm.vec3:
        """
        Returns euler angles as a vec3 (pitch, yaw, roll) in radians
        """
    def inverse(self) -> glm.quat:
        ...
    def length(self) -> float:
        ...
    def normalize(self) -> glm.quat:
        ...
    @property
    def w(self) -> float:
        ...
    @w.setter
    def w(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def x(self) -> float:
        ...
    @x.setter
    def x(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def y(self) -> float:
        ...
    @y.setter
    def y(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def z(self) -> float:
        ...
    @z.setter
    def z(self, arg1: typing.SupportsFloat) -> None:
        ...
class _Vec2PropertyProxy:
    @typing.overload
    def __add__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __add__(self, arg0: typing.Any) -> glm.vec2:
        ...
    def __getitem__(self, arg0: typing.SupportsInt) -> float:
        ...
    @typing.overload
    def __iadd__(self, arg0: glm.vec2) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __iadd__(self, arg0: typing.Any) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: typing.SupportsFloat) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: glm.vec2) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: typing.Any) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __isub__(self, arg0: glm.vec2) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __isub__(self, arg0: typing.Any) -> _Vec2PropertyProxy:
        ...
    def __iter__(self) -> collections.abc.Iterator:
        ...
    @typing.overload
    def __itruediv__(self, arg0: typing.SupportsFloat) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __itruediv__(self, arg0: glm.vec2) -> _Vec2PropertyProxy:
        ...
    @typing.overload
    def __itruediv__(self, arg0: typing.Any) -> _Vec2PropertyProxy:
        ...
    def __len__(self) -> int:
        ...
    @typing.overload
    def __mul__(self, arg0: typing.SupportsFloat) -> glm.vec2:
        ...
    @typing.overload
    def __mul__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __mul__(self, arg0: typing.Any) -> glm.vec2:
        ...
    @typing.overload
    def __radd__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __radd__(self, arg0: typing.Any) -> glm.vec2:
        ...
    @typing.overload
    def __rmul__(self, arg0: typing.SupportsFloat) -> glm.vec2:
        ...
    @typing.overload
    def __rmul__(self, arg0: typing.Any) -> glm.vec2:
        ...
    @typing.overload
    def __rsub__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __rsub__(self, arg0: typing.Any) -> glm.vec2:
        ...
    def __setattr__(self, arg0: str, arg1: typing.Any) -> None:
        ...
    def __setitem__(self, arg0: typing.SupportsInt, arg1: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def __sub__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __sub__(self, arg0: typing.Any) -> glm.vec2:
        ...
    @typing.overload
    def __truediv__(self, arg0: typing.SupportsFloat) -> glm.vec2:
        ...
    @typing.overload
    def __truediv__(self, arg0: glm.vec2) -> glm.vec2:
        ...
    @typing.overload
    def __truediv__(self, arg0: typing.Any) -> glm.vec2:
        ...
    @property
    def x(self) -> float:
        ...
    @x.setter
    def x(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def y(self) -> float:
        ...
    @y.setter
    def y(self, arg1: typing.SupportsFloat) -> None:
        ...
class _Vec3PropertyProxy:
    @typing.overload
    def __add__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __add__(self, arg0: typing.Any) -> glm.vec3:
        ...
    def __getitem__(self, arg0: typing.SupportsInt) -> float:
        ...
    @typing.overload
    def __iadd__(self, arg0: glm.vec3) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __iadd__(self, arg0: typing.Any) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: typing.SupportsFloat) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: glm.vec3) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __imul__(self, arg0: typing.Any) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __isub__(self, arg0: glm.vec3) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __isub__(self, arg0: typing.Any) -> _Vec3PropertyProxy:
        ...
    def __iter__(self) -> collections.abc.Iterator:
        ...
    @typing.overload
    def __itruediv__(self, arg0: typing.SupportsFloat) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __itruediv__(self, arg0: glm.vec3) -> _Vec3PropertyProxy:
        ...
    @typing.overload
    def __itruediv__(self, arg0: typing.Any) -> _Vec3PropertyProxy:
        ...
    def __len__(self) -> int:
        ...
    @typing.overload
    def __mul__(self, arg0: typing.SupportsFloat) -> glm.vec3:
        ...
    @typing.overload
    def __mul__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __mul__(self, arg0: typing.Any) -> glm.vec3:
        ...
    @typing.overload
    def __radd__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __radd__(self, arg0: typing.Any) -> glm.vec3:
        ...
    @typing.overload
    def __rmul__(self, arg0: typing.SupportsFloat) -> glm.vec3:
        ...
    @typing.overload
    def __rmul__(self, arg0: typing.Any) -> glm.vec3:
        ...
    @typing.overload
    def __rsub__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __rsub__(self, arg0: typing.Any) -> glm.vec3:
        ...
    def __setattr__(self, arg0: str, arg1: typing.Any) -> None:
        ...
    def __setitem__(self, arg0: typing.SupportsInt, arg1: typing.SupportsFloat) -> None:
        ...
    @typing.overload
    def __sub__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __sub__(self, arg0: typing.Any) -> glm.vec3:
        ...
    @typing.overload
    def __truediv__(self, arg0: typing.SupportsFloat) -> glm.vec3:
        ...
    @typing.overload
    def __truediv__(self, arg0: glm.vec3) -> glm.vec3:
        ...
    @typing.overload
    def __truediv__(self, arg0: typing.Any) -> glm.vec3:
        ...
    @property
    def x(self) -> float:
        ...
    @x.setter
    def x(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def y(self) -> float:
        ...
    @y.setter
    def y(self, arg1: typing.SupportsFloat) -> None:
        ...
    @property
    def z(self) -> float:
        ...
    @z.setter
    def z(self, arg1: typing.SupportsFloat) -> None:
        ...
def init_gpu() -> None:
    """
    Initialize the GPU compute backend (call once at startup).
    """
F32: GpuBufferDtype  # value = <GpuBufferDtype.F32: 1>
I32: GpuBufferDtype  # value = <GpuBufferDtype.I32: 2>
U32: GpuBufferDtype  # value = <GpuBufferDtype.U32: 0>
