Expand MergeMeshError to include IncompatiblePrimitiveTopology variant
This commit is contained in:
parent
713acc2e6d
commit
29e17f8cc4
@ -826,11 +826,23 @@ impl Mesh {
|
|||||||
///
|
///
|
||||||
/// # Errors
|
/// # Errors
|
||||||
///
|
///
|
||||||
/// Returns [`Err(MergeMeshError)`](MergeMeshError) if the vertex attribute values of `other` are incompatible with `self`.
|
/// Returns [`Err(MeshMergeError)`](MeshMergeError) if any of the following conditions are met:
|
||||||
|
/// * the vertex attribute values of `other` are incompatible with `self`.
|
||||||
/// For example, [`VertexAttributeValues::Float32`] is incompatible with [`VertexAttributeValues::Float32x3`].
|
/// For example, [`VertexAttributeValues::Float32`] is incompatible with [`VertexAttributeValues::Float32x3`].
|
||||||
pub fn merge(&mut self, other: &Mesh) -> Result<(), MergeMeshError> {
|
/// * the primitive topology of `other` doesn't match the primitive topology of `self`
|
||||||
|
pub fn merge(&mut self, other: &Mesh) -> Result<(), MeshMergeError> {
|
||||||
use VertexAttributeValues::*;
|
use VertexAttributeValues::*;
|
||||||
|
|
||||||
|
// Check if the meshes `primitive_topology` field is the same,
|
||||||
|
// as if that is not the case, the resulting mesh could (and most likely would)
|
||||||
|
// be invalid.
|
||||||
|
if self.primitive_topology != other.primitive_topology {
|
||||||
|
return Err(MeshMergeError::IncompatiblePrimitiveTopology {
|
||||||
|
self_primitive_topology: self.primitive_topology,
|
||||||
|
other_primitive_topology: other.primitive_topology
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// The indices of `other` should start after the last vertex of `self`.
|
// The indices of `other` should start after the last vertex of `self`.
|
||||||
let index_offset = self.count_vertices();
|
let index_offset = self.count_vertices();
|
||||||
|
|
||||||
@ -871,7 +883,7 @@ impl Mesh {
|
|||||||
(Uint8x4(vec1), Uint8x4(vec2)) => vec1.extend(vec2),
|
(Uint8x4(vec1), Uint8x4(vec2)) => vec1.extend(vec2),
|
||||||
(Unorm8x4(vec1), Unorm8x4(vec2)) => vec1.extend(vec2),
|
(Unorm8x4(vec1), Unorm8x4(vec2)) => vec1.extend(vec2),
|
||||||
_ => {
|
_ => {
|
||||||
return Err(MergeMeshError {
|
return Err(MeshMergeError::IncompatibleVertexAttributes {
|
||||||
self_attribute: *attribute,
|
self_attribute: *attribute,
|
||||||
other_attribute: other
|
other_attribute: other
|
||||||
.attribute_data(attribute.id)
|
.attribute_data(attribute.id)
|
||||||
@ -1391,10 +1403,17 @@ impl MeshDeserializer {
|
|||||||
|
|
||||||
/// Error that can occur when calling [`Mesh::merge`].
|
/// Error that can occur when calling [`Mesh::merge`].
|
||||||
#[derive(Error, Debug, Clone)]
|
#[derive(Error, Debug, Clone)]
|
||||||
|
pub enum MeshMergeError {
|
||||||
#[error("Incompatible vertex attribute types {} and {}", self_attribute.name, other_attribute.map(|a| a.name).unwrap_or("None"))]
|
#[error("Incompatible vertex attribute types {} and {}", self_attribute.name, other_attribute.map(|a| a.name).unwrap_or("None"))]
|
||||||
pub struct MergeMeshError {
|
IncompatibleVertexAttributes {
|
||||||
pub self_attribute: MeshVertexAttribute,
|
self_attribute: MeshVertexAttribute,
|
||||||
pub other_attribute: Option<MeshVertexAttribute>,
|
other_attribute: Option<MeshVertexAttribute>,
|
||||||
|
},
|
||||||
|
#[error("Incompatible primitive topologies {:?} and {:?}", self_primitive_topology, other_primitive_topology)]
|
||||||
|
IncompatiblePrimitiveTopology {
|
||||||
|
self_primitive_topology: PrimitiveTopology,
|
||||||
|
other_primitive_topology: PrimitiveTopology,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
Loading…
Reference in New Issue
Block a user