diff --git a/libs/gfx/include/psemek/gfx/armature.hpp b/libs/gfx/include/psemek/gfx/armature.hpp index f869d03e..36338c35 100644 --- a/libs/gfx/include/psemek/gfx/armature.hpp +++ b/libs/gfx/include/psemek/gfx/armature.hpp @@ -79,6 +79,16 @@ namespace psemek::gfx return bone_transform{m1.rotation * m2.rotation, m1.scale * m2.scale, m1.translation + m1.scale * geom::rotate(m1.rotation, m2.translation)}; } + template + bone_transform inverse(bone_transform const & m) + { + // [(1, T) * (S, 0) * (R, 0)]^-1 = (R^-1, 0) * (S^-1, 0) * (1, -T) = + // = (1, - R^-1 S^-1 T) * (S^-1, 0) * (R^-1, 0) + + auto ir = geom::inverse(m.rotation); + return bone_transform{ir, T{1} / m.scale, - geom::rotate(ir, m.translation) / m.scale}; + } + template bone_transform lerp(bone_transform const & m1, bone_transform const & m2, T t) {