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

aquadran noreply at scummvm.org
Sat Oct 26 21:23:34 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:
cd716c9118 WINTERMUTE: Synced viewport code with original


Commit: cd716c9118e6ec1813aaa658cbf7d482805e7118
    https://github.com/scummvm/scummvm/commit/cd716c9118e6ec1813aaa658cbf7d482805e7118
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-10-26T23:23:29+02:00

Commit Message:
WINTERMUTE: Synced viewport code with original

Changed paths:
    engines/wintermute/ad/ad_object_3d.cpp
    engines/wintermute/ad/ad_scene_geometry.cpp
    engines/wintermute/ad/ad_scene_geometry.h
    engines/wintermute/base/gfx/base_renderer.h
    engines/wintermute/base/gfx/base_renderer3d.cpp
    engines/wintermute/base/gfx/base_renderer3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
    engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
    engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
    engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
    engines/wintermute/base/gfx/osystem/base_render_osystem.h
    engines/wintermute/base/gfx/xmath.cpp
    engines/wintermute/base/gfx/xmath.h
    engines/wintermute/base/gfx/xmodel.cpp
    engines/wintermute/base/gfx/xmodel.h


diff --git a/engines/wintermute/ad/ad_object_3d.cpp b/engines/wintermute/ad/ad_object_3d.cpp
index 984abaecf85..034c65c94bd 100644
--- a/engines/wintermute/ad/ad_object_3d.cpp
+++ b/engines/wintermute/ad/ad_object_3d.cpp
@@ -133,7 +133,7 @@ bool AdObject3D::convert3DTo2D(DXMatrix *worldMat, int32 *posX, int32 *posY) {
 	_gameRef->_renderer3D->getViewTransform(&viewMat);
 	_gameRef->_renderer3D->getProjectionTransform(&projMat);
 
-	Rect32 viewport = _gameRef->_renderer3D->getViewPort();
+	DXViewport viewport = _gameRef->_renderer3D->getViewPort();
 
 	DXVec3Project(&vec2d, &origin, &viewport, &projMat, &viewMat, worldMat);
 
diff --git a/engines/wintermute/ad/ad_scene_geometry.cpp b/engines/wintermute/ad/ad_scene_geometry.cpp
index 5d4fb9dcbc6..bb1ef148051 100644
--- a/engines/wintermute/ad/ad_scene_geometry.cpp
+++ b/engines/wintermute/ad/ad_scene_geometry.cpp
@@ -73,7 +73,7 @@ AdSceneGeometry::AdSceneGeometry(BaseGame *gameRef) : BaseObject(gameRef) {
 	_PFSource = _PFTarget = _PFAlternateTarget = DXVector3(0, 0, 0);
 	_PFAlternateDist = FLT_MAX;
 
-	_drawingViewport.setRect(0, 0, 0, 0);
+	memset(&_drawingViewport, 0, sizeof(DXViewport));
 
 	DXMatrixIdentity(&_lastWorldMat);
 	DXMatrixIdentity(&_lastViewMat);
@@ -685,10 +685,10 @@ bool AdSceneGeometry::convert2Dto3D(int x, int y, DXVector3 *pos) {
 	_gameRef->_renderer3D->getProjectionParams(&resWidth, &resHeight, &layerWidth, &layerHeight, &modWidth, &modHeight, &customViewport);
 
 	// modify coordinates according to viewport settings
-	int mleft = _drawingViewport.left;
-	int mright = resWidth - _drawingViewport.width() - _drawingViewport.left;
-	int mtop = _drawingViewport.top;
-	int mbottom = resHeight - _drawingViewport.height() - _drawingViewport.top;
+	int mleft = _drawingViewport._x;
+	int mright = resWidth - _drawingViewport._width - _drawingViewport._x;
+	int mtop = _drawingViewport._y;
+	int mbottom = resHeight - _drawingViewport._height - _drawingViewport._y;
 
 	x -= (mleft + mright) / 2 + modWidth;
 	y -= (mtop + mbottom) / 2 + modHeight;
@@ -699,8 +699,8 @@ bool AdSceneGeometry::convert2Dto3D(int x, int y, DXVector3 *pos) {
 
 	// Compute the vector of the pick ray in screen space
 	DXVector3 vec;
-	vec._x =  (((2.0f * x) / _drawingViewport.width()) - 1) / _lastProjMat.matrix._11;
-	vec._y = -(((2.0f * y) / _drawingViewport.height()) - 1) / _lastProjMat.matrix._22;
+	vec._x =  (((2.0f * x) / _drawingViewport._width) - 1) / _lastProjMat.matrix._11;
+	vec._y = -(((2.0f * y) / _drawingViewport._height) - 1) / _lastProjMat.matrix._22;
 	vec._z =  1.0f;
 
 	// Get the inverse view matrix
diff --git a/engines/wintermute/ad/ad_scene_geometry.h b/engines/wintermute/ad/ad_scene_geometry.h
index bf6f05b531c..f315ed4ca06 100644
--- a/engines/wintermute/ad/ad_scene_geometry.h
+++ b/engines/wintermute/ad/ad_scene_geometry.h
@@ -67,7 +67,7 @@ public:
 	DXMatrix _lastProjMat;
 	int _lastOffsetX;
 	int _lastOffsetY;
-	Rect32 _drawingViewport;
+	DXViewport _drawingViewport;
 	int _lastScrollX;
 	int _lastScrollY;
 
diff --git a/engines/wintermute/base/gfx/base_renderer.h b/engines/wintermute/base/gfx/base_renderer.h
index acc35637c43..e899eaa998e 100644
--- a/engines/wintermute/base/gfx/base_renderer.h
+++ b/engines/wintermute/base/gfx/base_renderer.h
@@ -67,7 +67,6 @@ public:
 	virtual bool saveScreenShot(const Common::String &filename, int sizeX = 0, int sizeY = 0);
 	virtual bool setViewport(int left, int top, int right, int bottom);
 	virtual bool setViewport(Rect32 *rect);
-	virtual Rect32 getViewPort() = 0;
 	virtual bool setScreenViewport();
 	virtual void setWindowed(bool windowed) = 0;
 
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index 3b9b60a1c22..dbe4c1a6735 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -116,8 +116,8 @@ bool BaseRenderer3D::setDefaultAmbientLightColor() {
 	return true;
 }
 
-Rect32 BaseRenderer3D::getViewPort() {
-	return _viewportRect;
+DXViewport BaseRenderer3D::getViewPort() {
+	return _viewport;
 }
 
 Graphics::PixelFormat BaseRenderer3D::getPixelFormat() const {
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index dacec961e17..e5c5466729a 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -98,6 +98,7 @@ public:
 	// NOT declared in sub class: virtual HRESULT Setup3DCustom(D3DXMATRIX* ViewMat, D3DXMATRIX* ProjMat);
 	// declared in sub class: virtual HRESULT Setup2D(bool Force=false);
 	// declared in sub class: virtual HRESULT SetupLines();
+	Camera3D *_camera;
 	// declared in sub class: HRESULT ResetDevice();
 	void initLoop() override;
 	// declared in sub class: virtual HRESULT Fill(BYTE r, BYTE g, BYTE b, RECT* rect=NULL);
@@ -124,7 +125,7 @@ public:
 	virtual void enableCulling() = 0;
 	virtual void disableCulling() = 0;
 
-	Rect32 getViewPort() override;
+	DXViewport getViewPort();
 
 	Graphics::PixelFormat getPixelFormat() const override;
 
@@ -146,8 +147,6 @@ public:
 		*transform = _projectionMatrix;
 	}
 
-	Camera3D *_camera;
-
 	virtual Mesh3DS *createMesh3DS() = 0;
 	virtual XMesh *createXMesh() = 0;
 	virtual ShadowVolume *createShadowVolume() = 0;
@@ -159,13 +158,15 @@ public:
 
 	Math::Matrix3 build2dTransformation(const Vector2 &center, float angle);
 
+	virtual bool setViewport3D(DXViewport *viewport) = 0;
+
 	// ScummVM specific methods <--
 
 protected:
 	DXMatrix _worldMatrix;
 	DXMatrix _viewMatrix;
 	DXMatrix _projectionMatrix;
-	Rect32 _viewport;
+	DXViewport _viewport;
 	float _fov;
 	float _nearClipPlane;
 	float _farClipPlane;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index 10ba76fc9df..60032429148 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -299,7 +299,21 @@ bool BaseRenderOpenGL3D::fill(byte r, byte g, byte b, Common::Rect *rect) {
 
 bool BaseRenderOpenGL3D::setViewport(int left, int top, int right, int bottom) {
 	_viewportRect.setRect(left, top, right, bottom);
+	_viewport._x = left;
+	_viewport._y = top;
+	_viewport._width = right - left;
+	_viewport._height = bottom - top;
+	_viewport._minZ = 0.0f;
+	_viewport._maxZ = 1.0f;
 	glViewport(left, _height - bottom, right - left, bottom - top);
+	glDepthRange(_viewport._minZ, _viewport._maxZ);
+	return true;
+}
+
+bool BaseRenderOpenGL3D::setViewport3D(DXViewport *viewport) {
+	_viewport = *viewport;
+	glViewport(_viewport._x, _height - _viewport._height, _viewport._width, _viewport._height);
+	glDepthRange(_viewport._minZ, _viewport._maxZ);
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
index 806c3c326e5..99ca434817f 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -136,6 +136,8 @@ public:
 	XMesh *createXMesh() override;
 	ShadowVolume *createShadowVolume() override;
 
+	bool setViewport3D(DXViewport *viewport) override;
+
 private:
 	SimpleShadowVertex _simpleShadow[4];
 	Common::Array<DXVector4> _lightPositions;
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 f9908a8870b..d3cd3917b83 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -410,7 +410,21 @@ bool BaseRenderOpenGL3DShader::fill(byte r, byte g, byte b, Common::Rect *rect)
 
 bool BaseRenderOpenGL3DShader::setViewport(int left, int top, int right, int bottom) {
 	_viewportRect.setRect(left, top, right, bottom);
+	_viewport._x = left;
+	_viewport._y = top;
+	_viewport._width = right - left;
+	_viewport._height = bottom - top;
+	_viewport._minZ = 0.0f;
+	_viewport._maxZ = 1.0f;
 	glViewport(left, _height - bottom, right - left, bottom - top);
+	glDepthRange(_viewport._minZ, _viewport._maxZ);
+	return true;
+}
+
+bool BaseRenderOpenGL3DShader::setViewport3D(DXViewport *viewport) {
+	_viewport = *viewport;
+	glViewport(_viewport._x, _height - _viewport._height, _viewport._width, _viewport._height);
+	glDepthRange(_viewport._minZ, _viewport._maxZ);
 	return true;
 }
 
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
index bfbc2b299c3..443abfb84e2 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -125,6 +125,8 @@ public:
 	XMesh *createXMesh() override;
 	ShadowVolume *createShadowVolume() override;
 
+	bool setViewport3D(DXViewport *viewport) override;
+
 private:
 	DXMatrix _projectionMatrix2d;
 
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
index 0fc098d415d..97796b166b3 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
@@ -151,22 +151,22 @@ bool ShadowVolumeOpenGL::renderToScene() {
 
 //////////////////////////////////////////////////////////////////////////
 bool ShadowVolumeOpenGL::initMask() {
-	Rect32 viewport = _gameRef->_renderer->getViewPort();
+	DXViewport viewport = _gameRef->_renderer3D->getViewPort();
 
-	_shadowMask[0].x = viewport.left;
-	_shadowMask[0].y = viewport.bottom;
+	_shadowMask[0].x = viewport._x;
+	_shadowMask[0].y = viewport._height;
 	_shadowMask[0].z = 0.0f;
 
-	_shadowMask[1].x = viewport.left;
-	_shadowMask[1].y = viewport.top;
+	_shadowMask[1].x = viewport._x;
+	_shadowMask[1].y = viewport._y;
 	_shadowMask[1].z = 0.0f;
 
-	_shadowMask[2].x = viewport.right;
-	_shadowMask[2].y = viewport.bottom;
+	_shadowMask[2].x = viewport._width;
+	_shadowMask[2].y = viewport._height;
 	_shadowMask[2].z = 0.0f;
 
-	_shadowMask[3].x = viewport.right;
-	_shadowMask[3].y = viewport.top;
+	_shadowMask[3].x = viewport._width;
+	_shadowMask[3].y = viewport._y;
 	_shadowMask[3].z = 0.0f;
 
 	byte a = RGBCOLGetA(_color);
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
index dd3a590e90d..65db86230dd 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
@@ -46,19 +46,19 @@ struct ShadowVertexShader {
 ShadowVolumeOpenGLShader::ShadowVolumeOpenGLShader(BaseGame *inGame, OpenGL::Shader *volumeShader, OpenGL::Shader *maskShader)
 	: ShadowVolume(inGame), _color(0x7f000000), _volumeShader(volumeShader), _maskShader(maskShader) {
 	ShadowVertexShader shadowMask[4];
-	Rect32 viewport = _gameRef->_renderer->getViewPort();
+	DXViewport viewport = _gameRef->_renderer3D->getViewPort();
 
-	shadowMask[0].x = viewport.left;
-	shadowMask[0].y = viewport.bottom;
+	shadowMask[0].x = viewport._x;
+	shadowMask[0].y = viewport._height;
 
-	shadowMask[1].x = viewport.left;
-	shadowMask[1].y = viewport.top;
+	shadowMask[1].x = viewport._x;
+	shadowMask[1].y = viewport._y;
 
-	shadowMask[2].x = viewport.right;
-	shadowMask[2].y = viewport.bottom;
+	shadowMask[2].x = viewport._width;
+	shadowMask[2].y = viewport._height;
 
-	shadowMask[3].x = viewport.right;
-	shadowMask[3].y = viewport.top;
+	shadowMask[3].x = viewport._width;
+	shadowMask[3].y = viewport._y;
 
 	glGenBuffers(1, &_shadowMaskVertexBuffer);
 	glBindBuffer(GL_ARRAY_BUFFER, _shadowMaskVertexBuffer);
@@ -166,21 +166,21 @@ bool ShadowVolumeOpenGLShader::renderToScene() {
 
 //////////////////////////////////////////////////////////////////////////
 bool ShadowVolumeOpenGLShader::initMask() {
-	Rect32 viewport = _gameRef->_renderer->getViewPort();
+	DXViewport viewport = _gameRef->_renderer3D->getViewPort();
 
 	ShadowVertexShader shadowMask[4];
 
-	shadowMask[0].x = viewport.left;
-	shadowMask[0].y = viewport.bottom;
+	shadowMask[0].x = viewport._x;
+	shadowMask[0].y = viewport._height;
 
-	shadowMask[1].x = viewport.left;
-	shadowMask[1].y = viewport.top;
+	shadowMask[1].x = viewport._x;
+	shadowMask[1].y = viewport._y;
 
-	shadowMask[2].x = viewport.right;
-	shadowMask[2].y = viewport.bottom;
+	shadowMask[2].x = viewport._width;
+	shadowMask[2].y = viewport._height;
 
-	shadowMask[3].x = viewport.right;
-	shadowMask[3].y = viewport.top;
+	shadowMask[3].x = viewport._width;
+	shadowMask[3].y = viewport._y;
 
 	glBindBuffer(GL_ARRAY_BUFFER, _shadowMaskVertexBuffer);
 	glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * sizeof(ShadowVertexShader), shadowMask);
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
index e14d757b391..1413f15fa30 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.cpp
@@ -536,15 +536,6 @@ bool BaseRenderOSystem::setViewport(int left, int top, int right, int bottom) {
 	return STATUS_OK;
 }
 
-Rect32 BaseRenderOSystem::getViewPort() {
-	Rect32 ret;
-	ret.top = _renderRect.top;
-	ret.bottom = _renderRect.bottom;
-	ret.left = _renderRect.left;
-	ret.right = _renderRect.right;
-	return ret;
-}
-
 //////////////////////////////////////////////////////////////////////////
 void BaseRenderOSystem::modTargetRect(Common::Rect *rect) {
 	return;
diff --git a/engines/wintermute/base/gfx/osystem/base_render_osystem.h b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
index 315151c36ca..6ab55d26a9d 100644
--- a/engines/wintermute/base/gfx/osystem/base_render_osystem.h
+++ b/engines/wintermute/base/gfx/osystem/base_render_osystem.h
@@ -98,7 +98,6 @@ public:
 
 	bool setViewport(int left, int top, int right, int bottom) override;
 	bool setViewport(Rect32 *rect) override { return BaseRenderer::setViewport(rect); }
-	Rect32 getViewPort() override;
 	void modTargetRect(Common::Rect *rect);
 	void pointFromScreen(Point32 *point);
 	void pointToScreen(Point32 *point);
diff --git a/engines/wintermute/base/gfx/xmath.cpp b/engines/wintermute/base/gfx/xmath.cpp
index bdb2b5e097d..cb9f0d4bd04 100644
--- a/engines/wintermute/base/gfx/xmath.cpp
+++ b/engines/wintermute/base/gfx/xmath.cpp
@@ -540,7 +540,7 @@ DXMatrix *DXMatrixMultiply(DXMatrix *pout, const DXMatrix *pm1, const DXMatrix *
 	return pout;
 }
 
-DXVector3 *DXVec3Project(DXVector3 *pout, const DXVector3 *pv, const Rect32 *pviewport,
+DXVector3 *DXVec3Project(DXVector3 *pout, const DXVector3 *pv, const DXViewport *pviewport,
                          const DXMatrix *pprojection, const DXMatrix *pview, const DXMatrix *pworld) {
 	DXMatrix m;
 
@@ -555,9 +555,9 @@ DXVector3 *DXVec3Project(DXVector3 *pout, const DXVector3 *pv, const Rect32 *pvi
 	DXVec3TransformCoord(pout, pv, &m);
 
 	if (pviewport) {
-		pout->_x = pviewport->left + (1.0f + pout->_x) * pviewport->width() / 2.0f;
-		pout->_y = pviewport->top  + (1.0f - pout->_y) * pviewport->height() / 2.0f;
-		pout->_z = (1.0f + pout->_z) / 2.0f;
+		pout->_x = pviewport->_x + (1.0f + pout->_x) * pviewport->_width / 2.0f;
+		pout->_y = pviewport->_y  + (1.0f - pout->_y) * pviewport->_height / 2.0f;
+		pout->_z = pviewport->_minZ + pout->_z * (pviewport->_maxZ - pviewport->_minZ);
 	}
 	return pout;
 }
diff --git a/engines/wintermute/base/gfx/xmath.h b/engines/wintermute/base/gfx/xmath.h
index c94c5ea5519..47bf12854ce 100644
--- a/engines/wintermute/base/gfx/xmath.h
+++ b/engines/wintermute/base/gfx/xmath.h
@@ -133,6 +133,15 @@ struct DXMatrix {
 	DXMatrix operator * (const DXMatrix &) const;
 };
 
+struct DXViewport {
+	uint32       _x;
+	uint32       _y;
+	uint32       _width;
+	uint32       _height;
+	float        _minZ;
+	float        _maxZ;
+};
+
 #if defined(SCUMMVM_USE_PRAGMA_PACK)
 #pragma pack()
 #endif
@@ -158,7 +167,7 @@ DXVector4 *DXVec3Transform(DXVector4 *pout, const DXVector3 *pv, const DXMatrix
 DXVector3 *DXVec3TransformCoord(DXVector3 *pout, const DXVector3 *pv, const DXMatrix *pm);
 DXVector3 *DXVec3TransformNormal(DXVector3 *pout, const DXVector3 *pv, const DXMatrix *pm);
 DXMatrix *DXMatrixMultiply(DXMatrix *pout, const DXMatrix *pm1, const DXMatrix *pm2);
-DXVector3 *DXVec3Project(DXVector3 *pout, const DXVector3 *pv, const Rect32 *pviewport,
+DXVector3 *DXVec3Project(DXVector3 *pout, const DXVector3 *pv, const DXViewport *pviewport,
                          const DXMatrix *pprojection, const DXMatrix *pview, const DXMatrix *pworld);
 DXMatrix *DXMatrixTranspose(DXMatrix *pout, const DXMatrix *pm);
 
diff --git a/engines/wintermute/base/gfx/xmodel.cpp b/engines/wintermute/base/gfx/xmodel.cpp
index 8371c93c5ae..be2a8429c27 100644
--- a/engines/wintermute/base/gfx/xmodel.cpp
+++ b/engines/wintermute/base/gfx/xmodel.cpp
@@ -56,7 +56,7 @@ XModel::XModel(BaseGame *inGame, BaseObject *owner) : BaseObject(inGame) {
 
 	_rootFrame = nullptr;
 
-	_drawingViewport.setEmpty();
+	memset(&_drawingViewport, 0, sizeof(DXViewport));
 	DXMatrixIdentity(&_lastWorldMat);
 	DXMatrixIdentity(&_lastViewMat);
 	DXMatrixIdentity(&_lastProjMat);
@@ -557,8 +557,8 @@ bool XModel::isTransparentAt(int x, int y) {
 	bool customViewport;
 	_gameRef->_renderer3D->getProjectionParams(&resWidth, &resHeight, &layerWidth, &layerHeight, &modWidth, &modHeight, &customViewport);
 
-	x -= _drawingViewport.left + modWidth;
-	y -= _drawingViewport.top + modHeight;
+	x -= _drawingViewport._x + modWidth;
+	y -= _drawingViewport._y + modHeight;
 
 	if (customViewport) {
 		x += _gameRef->_renderer3D->_drawOffsetX;
@@ -570,8 +570,8 @@ bool XModel::isTransparentAt(int x, int y) {
 
 	// Compute the vector of the pick ray in screen space
 	DXVector3 vec;
-	vec._x =  (((2.0f * x) / (_drawingViewport.width())) - 1) / _lastProjMat.matrix._11;
-	vec._y = -(((2.0f * y) / (_drawingViewport.height())) - 1) / _lastProjMat.matrix._22;
+	vec._x =  (((2.0f * x) / (_drawingViewport._width)) - 1) / _lastProjMat.matrix._11;
+	vec._y = -(((2.0f * y) / (_drawingViewport._height)) - 1) / _lastProjMat.matrix._22;
 	vec._z =  1.0f;
 
 	// Get the inverse view matrix
@@ -890,7 +890,7 @@ bool XModel::persist(BasePersistenceManager *persistMgr) {
 	persistMgr->transferRect32(TMEMBER(_boundingRect));
 
 	if (!persistMgr->getIsSaving()) {
-		_drawingViewport.setEmpty();
+		memset(&_drawingViewport, 0, sizeof(DXViewport));
 	}
 
 	persistMgr->transferSint32(TMEMBER(_lastOffsetX));
diff --git a/engines/wintermute/base/gfx/xmodel.h b/engines/wintermute/base/gfx/xmodel.h
index 908509aae5c..bfc6031b28b 100644
--- a/engines/wintermute/base/gfx/xmodel.h
+++ b/engines/wintermute/base/gfx/xmodel.h
@@ -178,7 +178,7 @@ private:
 
 	void updateBoundingRect();
 	void static inline updateRect(Rect32 *rc, DXVector3 *vec);
-	Rect32 _drawingViewport;
+	DXViewport _drawingViewport;
 	DXMatrix _lastWorldMat;
 	DXMatrix _lastViewMat;
 	DXMatrix _lastProjMat;




More information about the Scummvm-git-logs mailing list