diff --git a/CHANGELOG.md b/CHANGELOG.md index dec5e1e7f0..87009f58d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -118,6 +118,7 @@ Bug #5923: Clicking on empty spaces between journal entries might show random topics Bug #5934: AddItem command doesn't accept negative values Bug #5975: NIF controllers from sheath meshes are used + Bug #5995: NiUVController doesn't calculate the UV offset properly Feature #390: 3rd person look "over the shoulder" Feature #832: OpenMW-CS: Handle deleted references Feature #1536: Show more information about level on menu diff --git a/components/nifosg/controller.cpp b/components/nifosg/controller.cpp index 31fd92b43e..7f4bdcef21 100644 --- a/components/nifosg/controller.cpp +++ b/components/nifosg/controller.cpp @@ -282,14 +282,17 @@ void UVController::apply(osg::StateSet* stateset, osg::NodeVisitor* nv) float uScale = mUScale.interpKey(value); float vScale = mVScale.interpKey(value); - osg::Matrix flipMat; - flipMat.preMultTranslate(osg::Vec3f(0,1,0)); - flipMat.preMultScale(osg::Vec3f(1,-1,1)); - + // First scale the UV relative to (0,0), + // then offset the UV to change the scaling origin to its center. osg::Matrixf mat = osg::Matrixf::scale(uScale, vScale, 1); - mat.setTrans(uTrans, vTrans, 0); - - mat = flipMat * mat * flipMat; + float uOffset = 0.5f * (1.f - uScale); + float vOffset = 0.5f * (1.f - vScale); + // Apply the original offsets: + // U offset is supposed to be subtracted regardless of the graphics library, + // while V offset is made negative to account for OpenGL's Y axis convention. + uOffset -= uTrans; + vOffset -= vTrans; + mat.setTrans(uOffset, vOffset, 0); // setting once is enough because all other texture units share the same TexMat (see setDefaults). if (!mTextureUnits.empty())