[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