Fix NiUVController UV offset calculations (bug #5995)

cherry-pick-74612b12
Dobrohotov Alexei 3 years ago
parent 131a4665aa
commit 24f4bf9c28

@ -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

@ -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())

Loading…
Cancel
Save