diff --git a/irr/src/CAnimatedMeshSceneNode.cpp b/irr/src/CAnimatedMeshSceneNode.cpp index c1f8afcfe..d36932689 100644 --- a/irr/src/CAnimatedMeshSceneNode.cpp +++ b/irr/src/CAnimatedMeshSceneNode.cpp @@ -163,9 +163,7 @@ IMesh *CAnimatedMeshSceneNode::getMeshForCurrentFrame() SkinnedMesh *skinnedMesh = static_cast(Mesh); - skinnedMesh->animateMesh(getFrameNr()); - - // skinnedMesh->transferJointsToMesh(JointChildSceneNodes); + skinnedMesh->transferJointsToMesh(JointChildSceneNodes); // Update the skinned mesh for the current joint transforms. skinnedMesh->skinMesh(); @@ -174,8 +172,6 @@ IMesh *CAnimatedMeshSceneNode::getMeshForCurrentFrame() Box = skinnedMesh->getBoundingBox(); - setAutomaticCulling(EAC_OFF); - return skinnedMesh; } } @@ -238,7 +234,6 @@ void CAnimatedMeshSceneNode::render() driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); // for debug purposes only: - // DebugDataVisible = ~0; if (DebugDataVisible && PassCount == 1) { video::SMaterial debug_mat; debug_mat.AntiAliasing = video::EAAM_OFF; @@ -513,18 +508,15 @@ void CAnimatedMeshSceneNode::setMesh(IAnimatedMesh *mesh) // get materials and bounding box Box = Mesh->getBoundingBox(); - IMesh *m = Mesh->getMesh(0); - if (m) { - Materials.clear(); - Materials.reallocate(m->getMeshBufferCount()); + Materials.clear(); + Materials.reallocate(Mesh->getMeshBufferCount()); - for (u32 i = 0; i < m->getMeshBufferCount(); ++i) { - IMeshBuffer *mb = m->getMeshBuffer(i); - if (mb) - Materials.push_back(mb->getMaterial()); - else - Materials.push_back(video::SMaterial()); - } + for (u32 i = 0; i < Mesh->getMeshBufferCount(); ++i) { + IMeshBuffer *mb = Mesh->getMeshBuffer(i); + if (mb) + Materials.push_back(mb->getMaterial()); + else + Materials.push_back(video::SMaterial()); } // clean up joint nodes @@ -563,58 +555,58 @@ void CAnimatedMeshSceneNode::setRenderFromIdentity(bool enable) //! updates the joint positions of this mesh void CAnimatedMeshSceneNode::animateJoints() { - if (Mesh && Mesh->getMeshType() == EAMT_SKINNED) { - checkJoints(); - const f32 frame = getFrameNr(); // old? + if (!Mesh || Mesh->getMeshType() != EAMT_SKINNED) + return; - SkinnedMesh *skinnedMesh = static_cast(Mesh); + checkJoints(); - skinnedMesh->animateMesh(frame); - skinnedMesh->recoverJointsFromMesh(JointChildSceneNodes); + SkinnedMesh *skinnedMesh = static_cast(Mesh); - //----------------------------------------- - // Transition - //----------------------------------------- + skinnedMesh->animateMesh(getFrameNr()); + skinnedMesh->recoverJointsFromMesh(JointChildSceneNodes); - if (Transiting != 0.f) { - // Init additional matrices - if (PretransitingSave.size() < JointChildSceneNodes.size()) { - for (u32 n = PretransitingSave.size(); n < JointChildSceneNodes.size(); ++n) - PretransitingSave.push_back(core::matrix4()); - } + //----------------------------------------- + // Transition + //----------------------------------------- - for (u32 n = 0; n < JointChildSceneNodes.size(); ++n) { - //------Position------ + if (Transiting != 0.f) { + // Init additional matrices + if (PretransitingSave.size() < JointChildSceneNodes.size()) { + for (u32 n = PretransitingSave.size(); n < JointChildSceneNodes.size(); ++n) + PretransitingSave.push_back(core::matrix4()); + } - JointChildSceneNodes[n]->setPosition( - core::lerp( - PretransitingSave[n].getTranslation(), - JointChildSceneNodes[n]->getPosition(), - TransitingBlend)); + for (u32 n = 0; n < JointChildSceneNodes.size(); ++n) { + //------Position------ - //------Rotation------ + JointChildSceneNodes[n]->setPosition( + core::lerp( + PretransitingSave[n].getTranslation(), + JointChildSceneNodes[n]->getPosition(), + TransitingBlend)); - // Code is slow, needs to be fixed up + //------Rotation------ - const core::quaternion RotationStart(PretransitingSave[n].getRotationRadians()); - const core::quaternion RotationEnd(JointChildSceneNodes[n]->getRotation() * core::DEGTORAD); + // Code is slow, needs to be fixed up - core::quaternion QRotation; - QRotation.slerp(RotationStart, RotationEnd, TransitingBlend); + const core::quaternion RotationStart(PretransitingSave[n].getRotationDegrees() * core::DEGTORAD); + const core::quaternion RotationEnd(JointChildSceneNodes[n]->getRotation() * core::DEGTORAD); - core::vector3df tmpVector; - QRotation.toEuler(tmpVector); - tmpVector *= core::RADTODEG; // convert from radians back to degrees - JointChildSceneNodes[n]->setRotation(tmpVector); + core::quaternion QRotation; + QRotation.slerp(RotationStart, RotationEnd, TransitingBlend); - //------Scale------ + core::vector3df tmpVector; + QRotation.toEuler(tmpVector); + tmpVector *= core::RADTODEG; // convert from radians back to degrees + JointChildSceneNodes[n]->setRotation(tmpVector); - // JointChildSceneNodes[n]->setScale( - // core::lerp( - // PretransitingSave[n].getScale(), - // JointChildSceneNodes[n]->getScale(), - // TransitingBlend)); - } + //------Scale------ + + // JointChildSceneNodes[n]->setScale( + // core::lerp( + // PretransitingSave[n].getScale(), + // JointChildSceneNodes[n]->getScale(), + // TransitingBlend)); } } } diff --git a/irr/src/SkinnedMesh.cpp b/irr/src/SkinnedMesh.cpp index 10fa3082e..5340884cb 100644 --- a/irr/src/SkinnedMesh.cpp +++ b/irr/src/SkinnedMesh.cpp @@ -636,11 +636,25 @@ void SkinnedMesh::recoverJointsFromMesh(std::vector &jointChil for (u32 i = 0; i < AllJoints.size(); ++i) { IBoneSceneNode *node = jointChildSceneNodes[i]; SJoint *joint = AllJoints[i]; - node->setPosition(joint->LocalAnimatedMatrix.getTranslation()); - node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees()); - node->setScale(joint->LocalAnimatedMatrix.getScale()); + if (std::holds_alternative(joint->transform)) { + auto transform = std::get(joint->transform); + node->setPosition(transform.translation); + { + core::vector3df euler; + auto rot = transform.rotation; + // Invert to be consistent with setRotationDegrees + rot.makeInverse(); + rot.toEuler(euler); + node->setRotation(euler * core::RADTODEG); + } + node->setScale(transform.scale); + } else { + node->setPosition(joint->LocalAnimatedMatrix.getTranslation()); + node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees()); + node->setScale(joint->LocalAnimatedMatrix.getScale()); + } - node->updateAbsolutePosition(); // WTF + // node->updateAbsolutePosition(); // WTF } } @@ -650,9 +664,12 @@ void SkinnedMesh::transferJointsToMesh(const std::vector &join const IBoneSceneNode *const node = jointChildSceneNodes[i]; SJoint *joint = AllJoints[i]; - joint->LocalAnimatedMatrix.setRotationDegrees(node->getRotation()); - joint->LocalAnimatedMatrix.setTranslation(node->getPosition()); - joint->LocalAnimatedMatrix *= core::matrix4().setScale(node->getScale()); + if (std::holds_alternative(joint->transform)) { + joint->LocalAnimatedMatrix = core::matrix4(); + joint->LocalAnimatedMatrix.setRotationDegrees(node->getRotation()); + joint->LocalAnimatedMatrix.setTranslation(node->getPosition()); + joint->LocalAnimatedMatrix *= core::matrix4().setScale(node->getScale()); + } } // Make sure we recalc the next frame LastAnimatedFrame = -1;