Source code for picogl.buffers.factory.validation

"""
Validation of input data
"""

import numpy as np
from picogl.renderer import MeshData


[docs] def validate_mesh_data(data: MeshData): """validate mesh data""" validate_input_data( vertices=data.vbo, indices=data.ebo, normals=data.nbo, colors=data.cbo )
[docs] def validate_input_data( vertices: np.ndarray, indices: np.ndarray = None, normals: np.ndarray = None, colors: np.ndarray = None, ): """ Validate mesh input data for consistency. Parameters ---------- vertices : np.ndarray Required array of shape (N, 3) for vertex positions. indices : np.ndarray, optional Optional array of shape (M, 3) for triangular faces. normals : np.ndarray, optional Optional array of shape (N, 3) for vertex normals. colors : np.ndarray, optional Optional array of shape (N, 3) or (N, 4) for per-vertex colors. Raises ------ ValueError If any provided array has an invalid shape or is inconsistent. """ # --- Vertices (required) --- if ( not isinstance(vertices, np.ndarray) or vertices.ndim != 2 or vertices.shape[1] != 3 ): raise ValueError( f"vertices must be a (N, 3) ndarray, got {vertices.shape if isinstance(vertices, np.ndarray) else type(vertices)}" ) n_vertices = vertices.shape[0] # --- Indices (optional) --- if indices is not None: if ( not isinstance(indices, np.ndarray) or indices.ndim != 2 or indices.shape[1] != 3 ): raise ValueError( f"indices must be a (M, 3) ndarray for triangular faces, got {indices.shape if isinstance(indices, np.ndarray) else type(indices)}" ) if np.any(indices < 0) or np.any(indices >= n_vertices): raise ValueError("indices contain out-of-bounds vertex references") # --- Normals (optional) --- if normals is not None: if not isinstance(normals, np.ndarray) or normals.shape != (n_vertices, 3): raise ValueError( f"normals must be a (N, 3) ndarray matching vertices, got {normals.shape if isinstance(normals, np.ndarray) else type(normals)}" ) # --- Colors (optional) --- if colors is not None: if ( not isinstance(colors, np.ndarray) or colors.ndim != 2 or colors.shape[0] != n_vertices ): raise ValueError( f"colors must have same number of rows as vertices, got {colors.shape if isinstance(colors, np.ndarray) else type(colors)}" ) if colors.shape[1] not in (3, 4): raise ValueError("colors must have 3 (RGB) or 4 (RGBA) columns") return True