[Scummvm-git-logs] scummvm master -> e3ade792b57485aa09e9e9056914dbba62ea7e51
aquadran
noreply at scummvm.org
Thu Oct 17 15:16:14 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
e3ade792b5 WINTERMUTE: Sync on isTransparentAt function. Fix gap in matrix inverse.
Commit: e3ade792b57485aa09e9e9056914dbba62ea7e51
https://github.com/scummvm/scummvm/commit/e3ade792b57485aa09e9e9056914dbba62ea7e51
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2024-10-17T17:16:08+02:00
Commit Message:
WINTERMUTE: Sync on isTransparentAt function. Fix gap in matrix inverse.
Changed paths:
engines/wintermute/base/gfx/xmath.cpp
engines/wintermute/base/gfx/xmodel.cpp
diff --git a/engines/wintermute/base/gfx/xmath.cpp b/engines/wintermute/base/gfx/xmath.cpp
index b046dd87dbb..5722a4e8956 100644
--- a/engines/wintermute/base/gfx/xmath.cpp
+++ b/engines/wintermute/base/gfx/xmath.cpp
@@ -304,6 +304,7 @@ DXMatrix *DXMatrixInverse(DXMatrix *pout, float *pdeterminant, const DXMatrix *p
t[1] = pm->_m[3][0] * pm->_m[0][1] - pm->_m[0][0] * pm->_m[3][1];
t[2] = pm->_m[1][0] * pm->_m[3][1] - pm->_m[3][0] * pm->_m[1][1];
v[10] = pm->_m[3][3] * t[0] + pm->_m[1][3] * t[1] + pm->_m[0][3] * t[2];
+ v[14] = -pm->_m[3][2] * t[0] - pm->_m[1][2] * t[1] - pm->_m[0][2] * t[2];
t[0] = pm->_m[1][2] * pm->_m[2][3] - pm->_m[1][3] * pm->_m[2][2];
t[1] = pm->_m[0][2] * pm->_m[2][3] - pm->_m[0][3] * pm->_m[2][2];
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index da53429900a..158816d4ca9 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -562,31 +562,42 @@ bool XModel::isTransparentAt(int x, int y) {
y += _gameRef->_renderer3D->_drawOffsetY;
}
- Math::Vector3d pickRayDir;
- Math::Vector3d pickRayOrig;
+ DXVector3 pickRayDir;
+ DXVector3 pickRayOrig;
// Compute the vector of the pick ray in screen space
- Math::Vector3d vec((((2.0f * x) / _drawingViewport.width()) - 1) / _lastProjMat(0, 0),
- -(((2.0f * y) / _drawingViewport.height()) - 1) / _lastProjMat(1, 1),
- -1.0f);
-
- Math::Matrix4 m = _lastViewMat;
- m.inverse();
- m.transpose();
- m.transform(&vec, false);
-
- pickRayDir = vec;
- pickRayOrig = m.getPosition();
+ DXVector3 vec;
+ vec._x = (((2.0f * x) / (_drawingViewport.width())) - 1) / _lastProjMat(0, 0);
+ vec._y = -(((2.0f * y) / (_drawingViewport.height())) - 1) / _lastProjMat(1, 1);
+ vec._z = -1.0f;
+
+ // Get the inverse view matrix
+ DXMatrix m, viewMatrix = DXMatrix(_lastViewMat.getData());
+ DXMatrixInverse(&m, nullptr, &viewMatrix);
+
+ // Transform the screen space pick ray into 3D space
+ pickRayDir._x = vec._x * m.matrix._11 + vec._y * m.matrix._21 + vec._z * m.matrix._31;
+ pickRayDir._y = vec._x * m.matrix._12 + vec._y * m.matrix._22 + vec._z * m.matrix._32;
+ pickRayDir._z = vec._x * m.matrix._13 + vec._y * m.matrix._23 + vec._z * m.matrix._33;
+ pickRayOrig._x = m.matrix._41;
+ pickRayOrig._y = m.matrix._42;
+ pickRayOrig._z = m.matrix._43;
// transform to model space
- Math::Vector3d end = pickRayOrig + pickRayDir;
- m = _lastWorldMat;
- m.inverse();
- m.transform(&pickRayOrig, true);
- m.transform(&end, true);
+ DXVector3 end = pickRayOrig + pickRayDir;
+ DXMatrix worldMatrix = DXMatrix(_lastWorldMat.getData());
+ DXMatrixInverse(&m, nullptr, &worldMatrix);
+ DXMatrixTranspose(&m, &m);
+ DXVec3TransformCoord(&pickRayOrig, &pickRayOrig, &m);
+ DXVec3TransformCoord(&end, &end, &m);
pickRayDir = end - pickRayOrig;
- return !_rootFrame->pickPoly(&pickRayOrig, &pickRayDir);
+ Math::Vector3d vPickRayOrig = Math::Vector3d(pickRayOrig._x, pickRayOrig._y, pickRayOrig._z);
+ Math::Vector3d vPickRayDir = Math::Vector3d(pickRayDir._x, pickRayDir._y, pickRayDir._z);
+
+ return !_rootFrame->pickPoly(&vPickRayOrig, &vPickRayDir);
+
+ return true;
}
//////////////////////////////////////////////////////////////////////////
More information about the Scummvm-git-logs
mailing list