Fix missing item images clipping in formspecs (#8652)
authorPierre-Yves Rollo <dev@pyrollo.com>
Fri, 26 Jul 2019 17:44:29 +0000 (19:44 +0200)
committerSmallJoker <SmallJoker@users.noreply.github.com>
Fri, 26 Jul 2019 17:44:29 +0000 (19:44 +0200)
* Fix clipping of itemimage

* Code style

* More code styling

src/client/hud.cpp

index cb58fb500e4cb354d614c0d582f78974db6543ea..51746f788492cee9974e8d8234d978f18d78a21c 100644 (file)
@@ -649,10 +649,31 @@ void drawItemStack(video::IVideoDriver *driver,
                core::rect<s32> oldViewPort = driver->getViewPort();
                core::matrix4 oldProjMat = driver->getTransform(video::ETS_PROJECTION);
                core::matrix4 oldViewMat = driver->getTransform(video::ETS_VIEW);
+               core::rect<s32> viewrect = rect;
+               if (clip)
+                       viewrect.clipAgainst(*clip);
+
                core::matrix4 ProjMatrix;
-               ProjMatrix.buildProjectionMatrixOrthoLH(2, 2, -1, 100);
+               ProjMatrix.buildProjectionMatrixOrthoLH(2.0f, 2.0f, -1.0f, 100.0f);
+
+               core::matrix4 ViewMatrix;
+               ViewMatrix.buildProjectionMatrixOrthoLH(
+                       2.0f * viewrect.getWidth() / rect.getWidth(),
+                       2.0f * viewrect.getHeight() / rect.getHeight(),
+                       -1.0f,
+                       100.0f);
+               ViewMatrix.setTranslation(core::vector3df(
+                       1.0f * (rect.LowerRightCorner.X + rect.UpperLeftCorner.X -
+                                       viewrect.LowerRightCorner.X - viewrect.UpperLeftCorner.X) /
+                                       viewrect.getWidth(),
+                       1.0f * (viewrect.LowerRightCorner.Y + viewrect.UpperLeftCorner.Y -
+                                       rect.LowerRightCorner.Y - rect.UpperLeftCorner.Y) /
+                                       viewrect.getHeight(),
+                       0.0f));
+
                driver->setTransform(video::ETS_PROJECTION, ProjMatrix);
-               driver->setTransform(video::ETS_VIEW, ProjMatrix);
+               driver->setTransform(video::ETS_VIEW, ViewMatrix);
+
                core::matrix4 matrix;
                matrix.makeIdentity();
 
@@ -662,7 +683,7 @@ void drawItemStack(video::IVideoDriver *driver,
                }
 
                driver->setTransform(video::ETS_WORLD, matrix);
-               driver->setViewPort(rect);
+               driver->setViewPort(viewrect);
 
                video::SColor basecolor =
                        client->idef()->getItemstackColor(item, client);