1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//! Error types for the viewport library.
/// Errors that can occur during mesh upload and manipulation.
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum ViewportError {
/// Mesh data has empty positions or indices.
#[error("empty mesh: {positions} positions, {indices} indices")]
EmptyMesh {
/// Number of positions provided.
positions: usize,
/// Number of indices provided.
indices: usize,
},
/// Positions and normals arrays have different lengths.
#[error("mesh length mismatch: {positions} positions vs {normals} normals")]
MeshLengthMismatch {
/// Number of positions provided.
positions: usize,
/// Number of normals provided.
normals: usize,
},
/// Mesh index is out of bounds for the mesh storage.
#[error("mesh index {index} out of bounds (mesh count: {count})")]
MeshIndexOutOfBounds {
/// The requested mesh index.
index: usize,
/// The number of meshes currently stored.
count: usize,
},
/// An index buffer entry references a vertex that does not exist.
#[error("invalid vertex index {vertex_index} (vertex count: {vertex_count})")]
InvalidVertexIndex {
/// The offending index value.
vertex_index: u32,
/// Total number of vertices.
vertex_count: usize,
},
/// Texture RGBA data has an unexpected size.
#[error("invalid texture data: expected {expected} bytes, got {actual}")]
InvalidTextureData {
/// Expected byte count (width * height * 4).
expected: usize,
/// Actual byte count provided.
actual: usize,
},
/// Attempted to access or replace a mesh slot that is empty (previously removed).
#[error("mesh slot {index} is empty")]
MeshSlotEmpty {
/// The slot index that was accessed.
index: usize,
},
/// Named scalar attribute not found on the given mesh.
#[error("attribute '{name}' not found on mesh {mesh_id}")]
AttributeNotFound {
/// The mesh index that was accessed.
mesh_id: usize,
/// The attribute name that was requested.
name: String,
},
/// Attribute data length does not match the existing buffer.
///
/// `replace_attribute` requires the same vertex count as the original upload.
#[error("attribute length mismatch: expected {expected} f32 elements, got {got}")]
AttributeLengthMismatch {
/// Expected number of f32 elements (original attribute length).
expected: usize,
/// Actual number of f32 elements provided.
got: usize,
},
}
/// Convenience alias for `Result<T, ViewportError>`.
pub type ViewportResult<T> = Result<T, ViewportError>;