diff --git a/source/blender/io/usd/intern/usd_attribute_utils.cc b/source/blender/io/usd/intern/usd_attribute_utils.cc index c50600f2d52..f270035180e 100644 --- a/source/blender/io/usd/intern/usd_attribute_utils.cc +++ b/source/blender/io/usd/intern/usd_attribute_utils.cc @@ -123,6 +123,10 @@ void copy_primvar_to_blender_attribute(const pxr::UsdGeomPrimvar &primvar, copy_primvar_to_blender_buffer( primvar, timecode, face_indices, attribute.span.typed()); break; + case CD_PROP_QUATERNION: + copy_primvar_to_blender_buffer( + primvar, timecode, face_indices, attribute.span.typed()); + break; default: BLI_assert_unreachable(); diff --git a/source/blender/io/usd/intern/usd_attribute_utils.hh b/source/blender/io/usd/intern/usd_attribute_utils.hh index 5a8984dfe18..6cb62eddcfe 100644 --- a/source/blender/io/usd/intern/usd_attribute_utils.hh +++ b/source/blender/io/usd/intern/usd_attribute_utils.hh @@ -64,7 +64,7 @@ template<> inline pxr::GfVec3f convert_value(const ColorGeometry4f value) } template<> inline pxr::GfQuatf convert_value(const math::Quaternion value) { - return pxr::GfQuatf(value.x, value.y, value.z, value.w); + return pxr::GfQuatf(value.w, value.x, value.y, value.z); } template<> inline float2 convert_value(const pxr::GfVec2f value) @@ -79,6 +79,11 @@ template<> inline ColorGeometry4f convert_value(const pxr::GfVec3f value) { return ColorGeometry4f(value[0], value[1], value[2], 1.0f); } +template<> inline math::Quaternion convert_value(const pxr::GfQuatf value) +{ + const pxr::GfVec3f &img = value.GetImaginary(); + return math::Quaternion(value.GetReal(), img[0], img[1], img[2]); +} } // namespace detail