[Scummvm-git-logs] scummvm master -> 6d8c7dc1c7456fc00d374c67b0c0760b00bc2c15

aquadran noreply at scummvm.org
Sun Oct 13 13:14:47 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:
6d8c7dc1c7 WINTERMUTE: Restore more code related renderer functions


Commit: 6d8c7dc1c7456fc00d374c67b0c0760b00bc2c15
    https://github.com/scummvm/scummvm/commit/6d8c7dc1c7456fc00d374c67b0c0760b00bc2c15
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-13T15:14:42+02:00

Commit Message:
WINTERMUTE: Restore more code related renderer functions

Changed paths:
    engines/wintermute/ad/ad_actor_3dx.cpp
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/base/gfx/base_renderer3d.h
    engines/wintermute/base/gfx/xmodel.cpp


diff --git a/engines/wintermute/ad/ad_actor_3dx.cpp b/engines/wintermute/ad/ad_actor_3dx.cpp
index 01a6c4765a2..35af96ae0ce 100644
--- a/engines/wintermute/ad/ad_actor_3dx.cpp
+++ b/engines/wintermute/ad/ad_actor_3dx.cpp
@@ -470,6 +470,8 @@ bool AdActor3DX::displayShadowVolume() {
 		return false;
 	}
 
+	//_gameRef->_renderer3D->setWorldTransform(_worldMatrix);
+
 	Math::Vector3d lightVector = Math::Vector3d(_shadowLightPos.x() * _scale3D,
 	                                            _shadowLightPos.y() * _scale3D,
 	                                            _shadowLightPos.z() * _scale3D);
@@ -489,6 +491,9 @@ bool AdActor3DX::displayShadowVolume() {
 
 	shadowModel->updateShadowVol(getShadowVolume(), _worldMatrix, lightVector, extrusionDepth);
 
+	Math::Matrix4 origWorld;
+	_gameRef->_renderer3D->getWorldTransform(origWorld);
+
 	// handle the attachments
 	for (uint32 i = 0; i < _attachments.size(); i++) {
 		AdAttach3DX *at = _attachments[i];
@@ -536,6 +541,9 @@ bool AdActor3DX::displayAttachments(bool registerObjects) {
 		return true;
 	}
 
+	Math::Matrix4 origView;
+	_gameRef->_renderer3D->getWorldTransform(origView);
+
 	for (uint32 i = 0; i < _attachments.size(); i++) {
 		AdAttach3DX *at = _attachments[i];
 		if (!at->_active) {
@@ -551,6 +559,8 @@ bool AdActor3DX::displayAttachments(bool registerObjects) {
 		at->displayAttachable(viewMat, registerObjects);
 	}
 
+	//_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 a86808d2956..d8621fc29f3 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -356,17 +356,13 @@ Math::Matrix4 *AdSceneGeometry::getViewMatrix() {
 
 //////////////////////////////////////////////////////////////////////////
 bool AdSceneGeometry::storeDrawingParams() {
-	// implement this later
-	//	CBRenderD3D* m_Renderer = (CBRenderD3D*)_gameRef->m_Renderer;
+	_drawingViewport = _gameRef->_renderer3D->getViewPort();
 
-	//  // store values
-	//	m_Renderer->m_Device->GetViewport(&m_DrawingViewport);
-
-	//	m_Renderer->m_Device->GetTransform(D3DTS_WORLD, &m_LastWorldMat);
-	//	m_Renderer->m_Device->GetTransform(D3DTS_VIEW, &m_LastViewMat);
-	//	m_Renderer->m_Device->GetTransform(D3DTS_PROJECTION, &m_LastProjMat);
+	// store values
+	//_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+	//_gameRef->_renderer3D->getViewTransform(_lastViewMat);
+	//_gameRef->_renderer3D->getProjectionTransform(_lastProjMat);
 
-	warning("AdSceneGeometry::storeDrawingParams not yet implemented");
 
 	AdScene *scene = ((AdGame *)_gameRef)->_scene;
 	if (scene) {
@@ -379,17 +375,17 @@ bool AdSceneGeometry::storeDrawingParams() {
 
 	Rect32 rc;
 	_gameRef->getCurrentViewportRect(&rc);
-//	float width = (float)rc.right - (float)rc.left;
-//	float height = (float)rc.bottom - (float)rc.top;
+	float width = (float)rc.right - (float)rc.left;
+	float height = (float)rc.bottom - (float)rc.top;
 
 	// margins
-	//	int mleft = rc.left;
-	//	int mright = m_Renderer->m_Width - Width - rc.left;
-	//	int mtop = rc.top;
-	//	int mbottom = m_Renderer->m_Height - Height - rc.top;
+	int mleft = rc.left;
+	int mright = _gameRef->_renderer3D->getWidth() - width - rc.left;
+	int mtop = rc.top;
+	int mbottom = _gameRef->_renderer3D->getHeight() - height - rc.top;
 
-	//	m_LastOffsetX = _gameRef->_offsetX + (mleft - mright)/2;
-	//	m_LastOffsetY = _gameRef->_offsetY + (mtop - mbottom)/2;
+	_lastOffsetX = _gameRef->_offsetX + (mleft - mright) / 2;
+	_lastOffsetY = _gameRef->_offsetY + (mtop - mbottom) / 2;
 
 	_lastValuesInitialized = true;
 
@@ -399,7 +395,7 @@ bool AdSceneGeometry::storeDrawingParams() {
 //////////////////////////////////////////////////////////////////////////
 bool AdSceneGeometry::render(bool render) {
 	// store values
-	// storeDrawingParams();
+	storeDrawingParams();
 	if (render) {
 		_gameRef->_renderer3D->renderSceneGeometry(_planes, _blocks, _generics, _lights, getActiveCamera());
 	}
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 3466ba6430d..bde8abc0b0e 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -94,13 +94,33 @@ public:
 	virtual bool setProjection2D() = 0;
 	virtual void setWorldTransform(const Math::Matrix4 &transform) = 0;
 
-	void project(const Math::Matrix4 &worldMatrix, const Math::Vector3d &point, int32 &x, int32 &y);
-	Math::Ray rayIntoScene(int x, int y);
+//	void setWorldTransform(const Math::Matrix4 &transform) {
+//		_worldMatrix = transform;
+//	}
 
 	Math::Matrix4 lastProjectionMatrix() {
-		return _projectionMatrix3d;
+		return _projectionMatrix;
+	}
+
+	void setProjectionTransform(const Math::Matrix4 &transform) {
+		_projectionMatrix = transform;
 	}
 
+	void getWorldTransform(Math::Matrix4 &transform) {
+		transform = _worldMatrix;
+	}
+
+	void getViewTransform(Math::Matrix4 &transform) {
+		transform = _viewMatrix;
+	}
+
+	void getProjectionTransform(Math::Matrix4 &transform) {
+		transform = _projectionMatrix;
+	}
+
+	void project(const Math::Matrix4 &worldMatrix, const Math::Vector3d &point, int32 &x, int32 &y);
+	Math::Ray rayIntoScene(int x, int y);
+
 	Camera3D *_camera;
 
 	virtual Mesh3DS *createMesh3DS() = 0;
@@ -121,6 +141,8 @@ public:
 protected:
 	Math::Matrix4 _lastViewMatrix;
 	Rect32 _viewport3dRect;
+	Math::Matrix4 _worldMatrix;
+	Math::Matrix4 _viewMatrix;
 	Math::Matrix4 _projectionMatrix;
 	float _fov;
 	float _nearClipPlane;
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index fe2e0eab5ae..d073a340b34 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -477,6 +477,11 @@ bool XModel::render() {
 		// render everything
 		bool res = _rootFrame->render(this);
 
+		// remember matrices for object picking purposes
+		//_gameRef->_renderer3D->getWorldTransform(_lastWorldMat);
+		//_gameRef->_renderer3D->getWorldTransform(_lastViewMat);
+		//_gameRef->_renderer3D->getWorldTransform(_lastProjMat);
+
 		// remember scene offset
 		Rect32 rc;
 		_gameRef->getCurrentViewportRect(&rc);
@@ -561,8 +566,13 @@ void XModel::updateBoundingRect() {
 	_boundingRect.left = _boundingRect.top = INT_MAX_VALUE;
 	_boundingRect.right = _boundingRect.bottom = INT_MIN_VALUE;
 
+	Math::Matrix4 viewMat, projMat, worldMat;
 	Math::Vector3d vec2d(0, 0, 0);
+	_gameRef->_renderer3D->getViewTransform(viewMat);
+	_gameRef->_renderer3D->getProjectionTransform(projMat);
+	_gameRef->_renderer3D->getWorldTransform(worldMat);
 
+	_drawingViewport = _gameRef->_renderer3D->getViewPort();
 	float x1 = _BBoxStart.x();
 	float x2 = _BBoxEnd.x();
 	float y1 = _BBoxStart.y();
@@ -596,6 +606,11 @@ void XModel::updateBoundingRect() {
 
 	_gameRef->_renderer3D->project(_lastWorldMat, Math::Vector3d(x2, y2, z2), screenX, screenY);
 	updateRect(&_boundingRect, Math::Vector3d(screenX, screenY, 0));
+
+	_boundingRect.left -= _gameRef->_renderer3D->_drawOffsetX;
+	_boundingRect.right -= _gameRef->_renderer3D->_drawOffsetX;
+	_boundingRect.bottom -= _gameRef->_renderer3D->_drawOffsetY;
+	_boundingRect.top -= _gameRef->_renderer3D->_drawOffsetY;
 }
 
 //////////////////////////////////////////////////////////////////////////




More information about the Scummvm-git-logs mailing list