From c95c7503a820aa989750544b5b90b5e151e87fa8 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 29 Jun 2024 22:52:48 -0500 Subject: [PATCH 1/5] FIX(rotatecontroller): Account for parent node scale when rotating objects --- apps/openmw/mwrender/rotatecontroller.cpp | 13 ++++++++++++- apps/openmw/mwrender/rotatecontroller.hpp | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/rotatecontroller.cpp b/apps/openmw/mwrender/rotatecontroller.cpp index 61a2a2628a..5d9339ae09 100644 --- a/apps/openmw/mwrender/rotatecontroller.cpp +++ b/apps/openmw/mwrender/rotatecontroller.cpp @@ -40,7 +40,8 @@ namespace MWRender osg::Quat orient = worldOrient * mRotate * worldOrientInverse * matrix.getRotate(); matrix.setRotate(orient); - matrix.setTrans(matrix.getTrans() + worldOrientInverse * mOffset); + + matrix *= osg::Matrix::scale(getParentScale(node)); node->setMatrix(matrix); @@ -71,4 +72,14 @@ namespace MWRender return worldOrient; } + osg::Vec3d RotateController::getParentScale(osg::Node* node) + { + osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); + if (!nodepaths.empty()) + { + return osg::computeLocalToWorld(nodepaths[0]).getScale(); + } + return osg::Vec3d(1.0, 1.0, 1.0); + } + } diff --git a/apps/openmw/mwrender/rotatecontroller.hpp b/apps/openmw/mwrender/rotatecontroller.hpp index 87bf0adfe1..d19b133b28 100644 --- a/apps/openmw/mwrender/rotatecontroller.hpp +++ b/apps/openmw/mwrender/rotatecontroller.hpp @@ -28,6 +28,7 @@ namespace MWRender protected: osg::Quat getWorldOrientation(osg::Node* node); + osg::Vec3d getParentScale(osg::Node* node); bool mEnabled; osg::Vec3f mOffset; From 33cd654bf5b6c79a67c10d509eb32272bc90e01d Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 29 Jun 2024 22:53:15 -0500 Subject: [PATCH 2/5] FIX(character.cpp): Don't allow turn to movement direction to apply to non-bipeds --- apps/openmw/mwmechanics/character.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 287e5d035c..8c048550b4 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -2042,7 +2042,8 @@ namespace MWMechanics float effectiveRotation = rot.z(); bool canMove = cls.getMaxSpeed(mPtr) > 0; const bool turnToMovementDirection = Settings::game().mTurnToMovementDirection; - if (!turnToMovementDirection || isFirstPersonPlayer) + const bool isBiped = mPtr.getClass().isBipedal(mPtr); + if (!isBiped || !turnToMovementDirection || isFirstPersonPlayer) { movementSettings.mIsStrafing = std::abs(vec.x()) > std::abs(vec.y()) * 2; stats.setSideMovementAngle(0); @@ -2296,7 +2297,7 @@ namespace MWMechanics } } - if (turnToMovementDirection && !isFirstPersonPlayer + if (turnToMovementDirection && !isFirstPersonPlayer && isBiped && (movestate == CharState_SwimRunForward || movestate == CharState_SwimWalkForward || movestate == CharState_SwimRunBack || movestate == CharState_SwimWalkBack)) { From cac5ae34a5e5471ccacbb8d8b19132c4ed7e3d11 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 29 Jun 2024 22:53:38 -0500 Subject: [PATCH 3/5] CLEANUP(character.cpp): Replace usages of biped function with isBiped var --- apps/openmw/mwmechanics/character.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 8c048550b4..27c3cff6b8 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -2287,7 +2287,7 @@ namespace MWMechanics // It seems only bipedal actors use turning animations. // Also do not use turning animations in the first-person view and when sneaking. - if (!sneak && !isFirstPersonPlayer && mPtr.getClass().isBipedal(mPtr)) + if (!sneak && !isFirstPersonPlayer && isBiped) { if (effectiveRotation > rotationThreshold) movestate = inwater ? CharState_SwimTurnRight : CharState_TurnRight; @@ -2331,7 +2331,7 @@ namespace MWMechanics } else { - if (mPtr.getClass().isBipedal(mPtr)) + if (isBiped) { if (mTurnAnimationThreshold > 0) mTurnAnimationThreshold -= duration; From fcc58f6db38e5e02298e7c13a44b718d35512999 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sat, 29 Jun 2024 23:15:18 -0500 Subject: [PATCH 4/5] CLEANUP(rotatecontroller): Deduplicate rotate/scale checks into the main callback function --- apps/openmw/mwrender/rotatecontroller.cpp | 40 ++++++++--------------- apps/openmw/mwrender/rotatecontroller.hpp | 3 -- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/apps/openmw/mwrender/rotatecontroller.cpp b/apps/openmw/mwrender/rotatecontroller.cpp index 5d9339ae09..b8bcde9ee6 100644 --- a/apps/openmw/mwrender/rotatecontroller.cpp +++ b/apps/openmw/mwrender/rotatecontroller.cpp @@ -35,13 +35,25 @@ namespace MWRender return; } osg::Matrix matrix = node->getMatrix(); - osg::Quat worldOrient = getWorldOrientation(node); + + osg::Quat worldOrient; + osg::Vec3d worldScale(1.0, 1.0, 1.0); + + osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); + + if (!nodepaths.empty()) + { + osg::Matrixf worldMat = osg::computeLocalToWorld(nodepaths[0]); + worldOrient = worldMat.getRotate(); + worldScale = worldMat.getScale(); + } + osg::Quat worldOrientInverse = worldOrient.inverse(); osg::Quat orient = worldOrient * mRotate * worldOrientInverse * matrix.getRotate(); matrix.setRotate(orient); - matrix *= osg::Matrix::scale(getParentScale(node)); + matrix *= osg::Matrix::scale(worldScale); node->setMatrix(matrix); @@ -58,28 +70,4 @@ namespace MWRender traverse(node, nv); } - - osg::Quat RotateController::getWorldOrientation(osg::Node* node) - { - // this could be optimized later, we just need the world orientation, not the full matrix - osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); - osg::Quat worldOrient; - if (!nodepaths.empty()) - { - osg::Matrixf worldMat = osg::computeLocalToWorld(nodepaths[0]); - worldOrient = worldMat.getRotate(); - } - return worldOrient; - } - - osg::Vec3d RotateController::getParentScale(osg::Node* node) - { - osg::NodePathList nodepaths = node->getParentalNodePaths(mRelativeTo); - if (!nodepaths.empty()) - { - return osg::computeLocalToWorld(nodepaths[0]).getScale(); - } - return osg::Vec3d(1.0, 1.0, 1.0); - } - } diff --git a/apps/openmw/mwrender/rotatecontroller.hpp b/apps/openmw/mwrender/rotatecontroller.hpp index d19b133b28..3c7e130d98 100644 --- a/apps/openmw/mwrender/rotatecontroller.hpp +++ b/apps/openmw/mwrender/rotatecontroller.hpp @@ -27,9 +27,6 @@ namespace MWRender void operator()(osg::MatrixTransform* node, osg::NodeVisitor* nv); protected: - osg::Quat getWorldOrientation(osg::Node* node); - osg::Vec3d getParentScale(osg::Node* node); - bool mEnabled; osg::Vec3f mOffset; osg::Quat mRotate; From 9bbf3551b129ee0076aa80a777ea1f270b9273f8 Mon Sep 17 00:00:00 2001 From: Dave Corley Date: Sun, 30 Jun 2024 00:13:20 -0500 Subject: [PATCH 5/5] c h a n g e l o g --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6881a0fe4..0421a594b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Bug #6550: Cloned body parts don't inherit texture effects Bug #6574: Crash at far away from world origin coordinates Bug #6645: Enemy block sounds align with animation instead of blocked hits + Bug #6665: The kobolds in the skyrim: home of the nords mod are oversized Bug #6657: Distant terrain tiles become black when using FWIW mod Bug #6661: Saved games that have no preview screenshot cause issues or crashes Bug #6716: mwscript comparison operator handling is too restrictive