[Scummvm-git-logs] scummvm master -> a4781543e2c0b1fe8eadd418a8743457df3256d4

aquadran noreply at scummvm.org
Thu Oct 17 08:53:50 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:
a4781543e2 WINTERMUTE: Synced code with original and fixed produce view matrix


Commit: a4781543e2c0b1fe8eadd418a8743457df3256d4
    https://github.com/scummvm/scummvm/commit/a4781543e2c0b1fe8eadd418a8743457df3256d4
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-17T10:53:43+02:00

Commit Message:
WINTERMUTE: Synced code with original and fixed produce view matrix

Changed paths:
    engines/wintermute/ad/ad_actor_3dx.cpp
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/base/gfx/3dcamera.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/xmodel.cpp
    engines/wintermute/base/gfx/xmodel.h


diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index 8ba7ac48c20..d96ff0d4a30 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -404,7 +404,6 @@ bool AdActor3DX::display() {
 
 	_gameRef->_renderer3D->setSpriteBlendMode(_blendMode);
 	_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
-	_xmodel->_lastWorldMat = _worldMatrix;
 
 	bool res = _xmodel->render();
 
@@ -458,8 +457,6 @@ bool AdActor3DX::renderModel() {
 		return false;
 	}
 
-	_xmodel->_lastWorldMat = _worldMatrix;
-
 	displayAttachments(false);
 	return res;
 }
@@ -470,7 +467,7 @@ bool AdActor3DX::displayShadowVolume() {
 		return false;
 	}
 
-	//_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
+	_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
 
 	Math::Vector3d lightVector = Math::Vector3d(_shadowLightPos.x() * _scale3D,
 	                                            _shadowLightPos.y() * _scale3D,
@@ -512,7 +509,8 @@ bool AdActor3DX::displayShadowVolume() {
 		at->displayShadowVol(viewMat, lightVector, extrusionDepth, true);
 	}
 
-	_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
+	// restore model's world matrix and render the shadow volume
+	_gameRef->_renderer3D->setWorldTransform(origWorld);
 
 	getShadowVolume()->renderToStencilBuffer();
 
@@ -558,10 +556,11 @@ bool AdActor3DX::displayAttachments(bool registerObjects) {
 
 		Math::Matrix4 viewMat;
 		viewMat.setData(*boneMat);
+
 		at->displayAttachable(viewMat, registerObjects);
 	}
 
-	//_gameRef->_renderer3D->setWorldTransform(origView);
+	_gameRef->_renderer3D->setWorldTransform(origView);
 
 	return true;
 }
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index a8b3de4a8ef..6bae8c2b777 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -359,9 +359,9 @@ bool AdSceneGeometry::storeDrawingParams() {
 	_drawingViewport = _gameRef->_renderer3D->getViewPort();
 
 	// store values
-	//_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
-	//_gameRef->_renderer3D->getViewTransform(_lastViewMat);
-	//_gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
+	_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+	_gameRef->_renderer3D->getViewTransform(_lastViewMat);
+	_gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
 
 
 	AdScene *scene = ((AdGame *)_gameRef)->_scene;
@@ -634,7 +634,7 @@ bool AdSceneGeometry::convert2Dto3DTolerant(int x, int y, Math::Vector3d *pos) {
 bool AdSceneGeometry::convert2Dto3D(int x, int y, Math::Vector3d *pos) {
 	if (!_lastValuesInitialized) {
 		_drawingViewport = _gameRef->_renderer3D->getViewPort();
-		//_gameRef->_renderer3D->getProjectionTransform(&_lastProjMat);
+		_gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
 	}
 
 	float resWidth, resHeight;
@@ -655,9 +655,18 @@ bool AdSceneGeometry::convert2Dto3D(int x, int y, Math::Vector3d *pos) {
 	Math::Vector3d vPickRayDir;
 	Math::Vector3d vPickRayOrig;
 
-	Math::Ray rayScene = _gameRef->_renderer3D->rayIntoScene(x, y);
-	vPickRayDir = rayScene.getDirection();
-	vPickRayOrig = rayScene.getOrigin();
+	// 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 = _viewMatrix;
+	m.inverse();
+	m.transpose();
+	m.transform(&vec, false);
+
+	vPickRayDir = vec;
+	vPickRayOrig = m.getPosition();
 
 
 	bool intFound = false;
diff --git a/engines/wintermute/base/gfx/3dcamera.cpp b/engines/wintermute/base/gfx/3dcamera.cpp
index 3f3edfad01a..8b132627752 100644
--- a/engines/wintermute/base/gfx/3dcamera.cpp
+++ b/engines/wintermute/base/gfx/3dcamera.cpp
@@ -54,15 +54,19 @@ Camera3D::~Camera3D() {
 
 //////////////////////////////////////////////////////////////////////////
 bool Camera3D::getViewMatrix(Math::Matrix4 *viewMatrix) {
-	Math::Vector3d up = Math::Vector3d(0.0f, 1.0f, 0.0f);
+	DXVector3 up = DXVector3(0.0f, 1.0f, 0.0f);
 
 	if (_bank != 0) {
-		Math::Matrix4 rotZ;
-		rotZ.buildAroundZ(Math::Angle(_bank).getRadians());
-		rotZ.transform(&up, false);
+		DXMatrix rot;
+		DXMatrixRotationZ(&rot, degToRad(_bank));
+		DXVec3TransformCoord(&up, &up, &rot);
 	}
 
-	*viewMatrix = Math::makeLookAtMatrix(_position, _target, up);
+	DXVector3 position = DXVector3(_position.getData());
+	DXVector3 target = DXVector3(_target.getData());
+	DXMatrix view = DXMatrix(viewMatrix->getData());
+	DXMatrixLookAtRH(&view, &position, &target, &up);
+	viewMatrix->setData(view);
 
 	return true;
 }
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index cd29cde502c..83852b39b6b 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -232,7 +232,7 @@ BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
 #endif
 	surface->create(_viewportRect.width(), _viewportRect.height(), format);
 
-	glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+	glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
 	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
 	flipVertical(surface);
 	Graphics::Surface *converted = surface->convertTo(getPixelFormat());
@@ -532,11 +532,6 @@ bool BaseRenderOpenGL3D::setup3D(Camera3D *camera, bool force) {
 		if (_camera) {
 			Math::Matrix4 viewMatrix;
 			_camera->getViewMatrix(&viewMatrix);
-
-			Math::Matrix4 cameraTranslate;
-			cameraTranslate.setPosition(-_camera->_position);
-			cameraTranslate.transpose();
-			viewMatrix = cameraTranslate * viewMatrix;
 			setViewTransform(viewMatrix);
 
 			_fov = _camera->_fov;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
index 09c7ad508fb..6998411abdd 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -344,7 +344,7 @@ BaseImage *BaseRenderOpenGL3DShader::takeScreenshot() {
 #endif
 	surface->create(_viewportRect.width(), _viewportRect.height(), format);
 
-	glReadPixels(_viewportRect.left, g_system->getHeight() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
+	glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
 	             GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
 	flipVertical(surface);
 	Graphics::Surface *converted = surface->convertTo(getPixelFormat());
@@ -662,10 +662,6 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 		if (_camera) {
 			Math::Matrix4 viewMatrix;
 			_camera->getViewMatrix(&viewMatrix);
-			Math::Matrix4 cameraTranslate;
-			cameraTranslate.setPosition(-_camera->_position);
-			cameraTranslate.transpose();
-			viewMatrix = cameraTranslate * viewMatrix;
 			setViewTransform(viewMatrix);
 
 			_fov = _camera->_fov;
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index 0dcb833cf98..f8991ca15b4 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -478,9 +478,9 @@ bool XModel::render() {
 		bool res = _rootFrame->render(this);
 
 		// remember matrices for object picking purposes
-		//_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
-		//_gameRef->_renderer3D->getWorldTransform(_lastViewMat);
-		//_gameRef->_renderer3D->getWorldTransform(_lastProjMat);
+		_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+		_gameRef->_renderer3D->getWorldTransform(_lastViewMat);
+		_gameRef->_renderer3D->getWorldTransform(_lastProjMat);
 
 		// remember scene offset
 		Rect32 rc;
diff --git a/engines/wintermute/base/gfx/xmodel.h b/engines/wintermute/base/gfx/xmodel.h
index e4907dd2257..46f84aef45f 100644
--- a/engines/wintermute/base/gfx/xmodel.h
+++ b/engines/wintermute/base/gfx/xmodel.h
@@ -145,7 +145,6 @@ public:
 	static bool loadName(BaseNamedObject *obj, XFileData *data);
 	static bool loadName(Common::String &targetStr, XFileData *data);
 
-	Math::Matrix4 _lastWorldMat;
 	Rect32 _boundingRect;
 	BaseObject *_owner;
 
@@ -179,6 +178,7 @@ private:
 	void updateBoundingRect();
 	void static inline updateRect(Rect32 *rc, Math::Vector3d vec);
 	Rect32 _drawingViewport;
+	Math::Matrix4 _lastWorldMat;
 	Math::Matrix4 _lastViewMat;
 	Math::Matrix4 _lastProjMat;
 	int32 _lastOffsetX;




More information about the Scummvm-git-logs mailing list