wolfhece.opengl.cloud_points_shader2d ===================================== .. py:module:: wolfhece.opengl.cloud_points_shader2d .. autoapi-nested-parse:: Shared-resource shader for cloud point rendering. Draws cloud vertices as GL_POINTS with configurable shape in fragment shader (point, circle, cross, quad), color and fill mode. Module Contents --------------- .. py:data:: SHADER_DIR .. py:data:: SYMBOLS_DIR .. py:class:: CloudPointsShader2D Singleton shader for point-cloud rendering. .. py:attribute:: _instance :type: CloudPointsShader2D | None :value: None .. py:attribute:: _program :type: int | None :value: None .. py:attribute:: _locs :type: dict | None :value: None .. py:attribute:: _vao :type: int | None :value: None .. py:attribute:: _vao_pt :type: int | None :value: None .. py:attribute:: _vbo :type: int | None :value: None .. py:attribute:: _texture_cache :type: dict[tuple[str, float], int] .. py:method:: get_instance() -> CloudPointsShader2D :classmethod: .. py:method:: _init_program() .. py:method:: _compile(shader_type: int, path: pathlib.Path) -> int :staticmethod: .. py:method:: _ensure_vao_vbo() .. py:method:: _upload(pts_xy: numpy.ndarray) .. py:method:: _get_symbol_texture_id(symbol_path: str | None, symbol_raster_size: int = 128) -> int | None .. py:method:: draw_points(pts_xy: numpy.ndarray, mvp: numpy.ndarray, point_size_px: float, color: tuple[float, float, float, float], style: int, filled: bool, symbol_path: str | None = None, symbol_raster_size: int = 128, symbol_rotation: float = 0.0, symbol_scale: float = 1.0, pts_transform: numpy.ndarray | None = None) Draw cloud points with the shader pipeline. :param symbol_rotation: Per-cloud rotation in **radians** (CCW, Option A). Ignored when *pts_transform* is provided. :param symbol_scale: Per-cloud scale factor (Option A). Ignored when *pts_transform* is provided. :param pts_transform: Optional ``(N, 2)`` float32 array with per-point ``[rotation_rad, scale]`` columns (Option B). When provided, overrides *symbol_rotation* and *symbol_scale* on a per-point basis and uses the dedicated 4-float VAO layout. .. py:method:: destroy()