mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 20:53:53 +00:00
animations: convert skinning weights from unorm8x4 to float32x4 (#9338)
# Objective - Fixes part of #9021 ## Solution - Joint mesh are in format `Unorm8x4` in some gltf file, but Bevy expects a `Float32x4`. Converts them. Also converts `Unorm16x4` - According to gltf spec: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#skinned-mesh-attributes > WEIGHTS_n: float, or normalized unsigned byte, or normalized unsigned short
This commit is contained in:
parent
cfa3303cf3
commit
3aad5c6b99
1 changed files with 19 additions and 2 deletions
|
@ -6,7 +6,7 @@ use bevy_render::{
|
||||||
use bevy_utils::HashMap;
|
use bevy_utils::HashMap;
|
||||||
use gltf::{
|
use gltf::{
|
||||||
accessor::{DataType, Dimensions},
|
accessor::{DataType, Dimensions},
|
||||||
mesh::util::{ReadColors, ReadJoints, ReadTexCoords},
|
mesh::util::{ReadColors, ReadJoints, ReadTexCoords, ReadWeights},
|
||||||
};
|
};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
|
@ -206,6 +206,19 @@ impl<'a> VertexAttributeIter<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Materializes joint weight values, converting compatible formats to Float32x4
|
||||||
|
fn into_joint_weight_values(self) -> Result<Values, AccessFailed> {
|
||||||
|
match self {
|
||||||
|
VertexAttributeIter::U8x4(it, Normalization(true)) => {
|
||||||
|
Ok(Values::Float32x4(ReadWeights::U8(it).into_f32().collect()))
|
||||||
|
}
|
||||||
|
VertexAttributeIter::U16x4(it, Normalization(true)) => {
|
||||||
|
Ok(Values::Float32x4(ReadWeights::U16(it).into_f32().collect()))
|
||||||
|
}
|
||||||
|
s => s.into_any_values(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Materializes texture coordinate values, converting compatible formats to Float32x2
|
/// Materializes texture coordinate values, converting compatible formats to Float32x2
|
||||||
fn into_tex_coord_values(self) -> Result<Values, AccessFailed> {
|
fn into_tex_coord_values(self) -> Result<Values, AccessFailed> {
|
||||||
match self {
|
match self {
|
||||||
|
@ -224,6 +237,7 @@ enum ConversionMode {
|
||||||
Any,
|
Any,
|
||||||
Rgba,
|
Rgba,
|
||||||
JointIndex,
|
JointIndex,
|
||||||
|
JointWeight,
|
||||||
TexCoord,
|
TexCoord,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,7 +266,9 @@ pub(crate) fn convert_attribute(
|
||||||
gltf::Semantic::Joints(0) => {
|
gltf::Semantic::Joints(0) => {
|
||||||
Some((Mesh::ATTRIBUTE_JOINT_INDEX, ConversionMode::JointIndex))
|
Some((Mesh::ATTRIBUTE_JOINT_INDEX, ConversionMode::JointIndex))
|
||||||
}
|
}
|
||||||
gltf::Semantic::Weights(0) => Some((Mesh::ATTRIBUTE_JOINT_WEIGHT, ConversionMode::Any)),
|
gltf::Semantic::Weights(0) => {
|
||||||
|
Some((Mesh::ATTRIBUTE_JOINT_WEIGHT, ConversionMode::JointWeight))
|
||||||
|
}
|
||||||
gltf::Semantic::Extras(name) => custom_vertex_attributes
|
gltf::Semantic::Extras(name) => custom_vertex_attributes
|
||||||
.get(name)
|
.get(name)
|
||||||
.map(|attr| (attr.clone(), ConversionMode::Any)),
|
.map(|attr| (attr.clone(), ConversionMode::Any)),
|
||||||
|
@ -264,6 +280,7 @@ pub(crate) fn convert_attribute(
|
||||||
ConversionMode::Rgba => iter.into_rgba_values(),
|
ConversionMode::Rgba => iter.into_rgba_values(),
|
||||||
ConversionMode::TexCoord => iter.into_tex_coord_values(),
|
ConversionMode::TexCoord => iter.into_tex_coord_values(),
|
||||||
ConversionMode::JointIndex => iter.into_joint_index_values(),
|
ConversionMode::JointIndex => iter.into_joint_index_values(),
|
||||||
|
ConversionMode::JointWeight => iter.into_joint_weight_values(),
|
||||||
});
|
});
|
||||||
match converted_values {
|
match converted_values {
|
||||||
Ok(values) => {
|
Ok(values) => {
|
||||||
|
|
Loading…
Reference in a new issue