mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Fix and clean up skeletal animation (#15722)
* Fix attachments lagging behind their parents (#14818) * Fix animation blending (#14817) * Bring back cool guy as another .x smoke test * Add .x mesh loader unittest * Do bounding box & matrix calculation at proper point in time * Remove obsolete `SAnimatedMesh`
This commit is contained in:
parent
0bb87eb1ff
commit
fde6384a09
40 changed files with 856 additions and 1388 deletions
|
@ -394,36 +394,40 @@ SECTION("simple skin")
|
|||
const auto joints = csm->getAllJoints();
|
||||
REQUIRE(joints.size() == 3);
|
||||
|
||||
const auto findJoint = [&](const std::function<bool(SkinnedMesh::SJoint*)> &predicate) {
|
||||
for (std::size_t i = 0; i < joints.size(); ++i) {
|
||||
if (predicate(joints[i])) {
|
||||
return joints[i];
|
||||
const auto findJoint = [&](const std::function<bool(const SkinnedMesh::SJoint*)> &predicate) {
|
||||
for (const auto *joint : joints) {
|
||||
if (predicate(joint)) {
|
||||
return joint;
|
||||
}
|
||||
}
|
||||
throw std::runtime_error("joint not found");
|
||||
};
|
||||
|
||||
// Check the node hierarchy
|
||||
const auto parent = findJoint([](auto joint) {
|
||||
return !joint->Children.empty();
|
||||
const auto child = findJoint([&](auto *joint) {
|
||||
return !!joint->ParentJointID;
|
||||
});
|
||||
REQUIRE(parent->Children.size() == 1);
|
||||
const auto child = parent->Children[0];
|
||||
REQUIRE(child != parent);
|
||||
const auto *parent = joints.at(*child->ParentJointID);
|
||||
|
||||
SECTION("transformations are correct")
|
||||
{
|
||||
CHECK(parent->Animatedposition == v3f(0, 0, 0));
|
||||
CHECK(parent->Animatedrotation == irr::core::quaternion());
|
||||
CHECK(parent->Animatedscale == v3f(1, 1, 1));
|
||||
CHECK(parent->GlobalInversedMatrix == irr::core::matrix4());
|
||||
const v3f childTranslation(0, 1, 0);
|
||||
CHECK(child->Animatedposition == childTranslation);
|
||||
CHECK(child->Animatedrotation == irr::core::quaternion());
|
||||
CHECK(child->Animatedscale == v3f(1, 1, 1));
|
||||
irr::core::matrix4 inverseBindMatrix;
|
||||
inverseBindMatrix.setTranslation(-childTranslation);
|
||||
CHECK(child->GlobalInversedMatrix == inverseBindMatrix);
|
||||
{
|
||||
const auto &transform = std::get<core::Transform>(parent->transform);
|
||||
CHECK(transform.translation == v3f(0, 0, 0));
|
||||
CHECK(transform.rotation == irr::core::quaternion());
|
||||
CHECK(transform.scale == v3f(1, 1, 1));
|
||||
CHECK(parent->GlobalInversedMatrix == irr::core::matrix4());
|
||||
}
|
||||
{
|
||||
const auto &transform = std::get<core::Transform>(child->transform);
|
||||
const v3f translation(0, 1, 0);
|
||||
CHECK(transform.translation == translation);
|
||||
CHECK(transform.rotation == irr::core::quaternion());
|
||||
CHECK(transform.scale == v3f(1, 1, 1));
|
||||
irr::core::matrix4 inverseBindMatrix;
|
||||
inverseBindMatrix.setTranslation(-translation);
|
||||
CHECK(child->GlobalInversedMatrix == inverseBindMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
SECTION("weights are correct")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue