From 77203b0a8bf5a79248dac4da0b0a8b889cd7dc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Wed, 2 Aug 2023 15:45:13 +0200 Subject: [PATCH] convert skinning weight unorm8x4 to float32x4 --- crates/bevy_gltf/src/vertex_attributes.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/bevy_gltf/src/vertex_attributes.rs b/crates/bevy_gltf/src/vertex_attributes.rs index 558000cc1bfee9..41fdb8cea8e279 100644 --- a/crates/bevy_gltf/src/vertex_attributes.rs +++ b/crates/bevy_gltf/src/vertex_attributes.rs @@ -6,7 +6,7 @@ use bevy_render::{ use bevy_utils::HashMap; use gltf::{ accessor::{DataType, Dimensions}, - mesh::util::{ReadColors, ReadJoints, ReadTexCoords}, + mesh::util::{ReadColors, ReadJoints, ReadTexCoords, ReadWeights}, }; use thiserror::Error; @@ -206,6 +206,16 @@ impl<'a> VertexAttributeIter<'a> { } } + /// Materializes joint index weight, converting compatible formats to Float32x4 + fn into_joint_weight_values(self) -> Result { + match self { + VertexAttributeIter::U8x4(it, Normalization(true)) => { + Ok(Values::Float32x4(ReadWeights::U8(it).into_f32().collect())) + } + s => s.into_any_values(), + } + } + /// Materializes texture coordinate values, converting compatible formats to Float32x2 fn into_tex_coord_values(self) -> Result { match self { @@ -224,6 +234,7 @@ enum ConversionMode { Any, Rgba, JointIndex, + JointWeight, TexCoord, } @@ -252,7 +263,9 @@ pub(crate) fn convert_attribute( gltf::Semantic::Joints(0) => { 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 .get(name) .map(|attr| (attr.clone(), ConversionMode::Any)), @@ -264,6 +277,7 @@ pub(crate) fn convert_attribute( ConversionMode::Rgba => iter.into_rgba_values(), ConversionMode::TexCoord => iter.into_tex_coord_values(), ConversionMode::JointIndex => iter.into_joint_index_values(), + ConversionMode::JointWeight => iter.into_joint_weight_values(), }); match converted_values { Ok(values) => {