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

aquadran noreply at scummvm.org
Sun Nov 3 11:44:46 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:
fed9be649b WINTERMUTE: Reworked 2D setup projection to make work closer to original


Commit: fed9be649b3801c9cecdf09bc7f94721797cb10f
    https://github.com/scummvm/scummvm/commit/fed9be649b3801c9cecdf09bc7f94721797cb10f
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2024-11-03T12:44:41+01:00

Commit Message:
WINTERMUTE: Reworked 2D setup projection to make work closer to original

Changed paths:
    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


diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index 5f7af531b29..f201da33903 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -135,8 +135,6 @@ public:
 
 	Graphics::PixelFormat getPixelFormat() const override;
 
-	virtual bool setProjection2D() = 0;
-
 	virtual bool setWorldTransform(const DXMatrix &transform) = 0;
 	virtual bool setViewTransform(const DXMatrix &transform) = 0;
 	virtual bool setProjectionTransform(const DXMatrix &transform) = 0;
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index d6fbdfdbfdf..bf477765b71 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -156,9 +156,6 @@ bool BaseRenderOpenGL3D::setup2D(bool force) {
 		// D3DTSS_MIPFILTER             = D3DTEXF_NONE
 		// D3DTSS_TEXCOORDINDEX         = 0
 		// D3DTSS_TEXTURETRANSFORMFLAGS = D3DTTFF_DISABLE
-
-		glViewport(0, 0, _width, _height);
-		setProjection2D();
 	}
 
 	return true;
@@ -247,7 +244,6 @@ bool BaseRenderOpenGL3D::setup3D(Camera3D *camera, bool force) {
 			glDisable(GL_FOG);
 		}
 
-		glViewport(_viewportRect.left, _height - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height());
 		setProjection();
 	}
 
@@ -367,19 +363,19 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
 	// position coords
 	vertices[0].x = pos.x;
 	vertices[0].y = correctedYPos;
-	vertices[0].z = -0.9f;
+	vertices[0].z = 0.9f;
 
 	vertices[1].x = pos.x;
 	vertices[1].y = correctedYPos - height;
-	vertices[1].z = -0.9f;
+	vertices[1].z = 0.9f;
 
 	vertices[2].x = pos.x + width;
 	vertices[2].y = correctedYPos;
-	vertices[2].z = -0.9f;
+	vertices[2].z = 0.9f;
 
 	vertices[3].x = pos.x + width;
 	vertices[3].y = correctedYPos - height;
-	vertices[3].z = -0.9f;
+	vertices[3].z = 0.9f;
 
 	// not exactly sure about the color format, but this seems to work
 	byte a = RGBCOLGetA(color);
@@ -420,6 +416,8 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
 			glEnable(GL_TEXTURE_2D);
 		}
 
+		setProjection2D();
+
 		glEnableClientState(GL_COLOR_ARRAY);
 		glEnableClientState(GL_VERTEX_ARRAY);
 		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -580,8 +578,6 @@ bool BaseRenderOpenGL3D::drawLine(int x1, int y1, int x2, int y2, uint32 color)
 }
 
 void BaseRenderOpenGL3D::fadeToColor(byte r, byte g, byte b, byte a) {
-	setProjection2D();
-
 	const int vertexSize = 16;
 	byte vertices[4 * vertexSize];
 	float *vertexCoords = reinterpret_cast<float *>(vertices);
@@ -625,6 +621,8 @@ void BaseRenderOpenGL3D::fadeToColor(byte r, byte g, byte b, byte a) {
 	glDisable(GL_TEXTURE_2D);
 	_lastTexture = nullptr;
 
+	setProjection2D();
+
 	glEnableClientState(GL_VERTEX_ARRAY);
 	glEnableClientState(GL_COLOR_ARRAY);
 
@@ -950,11 +948,19 @@ bool BaseRenderOpenGL3D::setViewport3D(DXViewport *viewport) {
 }
 
 bool BaseRenderOpenGL3D::setProjection2D() {
+	DXMatrix matrix2D;
+	DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, 0, _height, 0.0f, 1.0f);
+
+	// convert DX [0, 1] depth range to OpenGL [-1, 1] depth range.
+	matrix2D.matrix._33 = 2.0f;
+	matrix2D.matrix._43 = -1.0f;
+
 	glMatrixMode(GL_PROJECTION);
-	glLoadIdentity();
-	glOrtho(0, _width, 0, _height, -1.0, 100.0);
+	glLoadMatrixf(matrix2D);
+
 	glMatrixMode(GL_MODELVIEW);
 	glLoadIdentity();
+
 	return true;
 }
 
@@ -988,6 +994,11 @@ bool BaseRenderOpenGL3D::setProjectionTransform(const DXMatrix &transform) {
 
 	glMatrixMode(GL_PROJECTION);
 	glLoadMatrixf(finalMatrix);
+
+	glMatrixMode(GL_MODELVIEW);
+
+	glViewport(_viewportRect.left, _height - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height());
+
 	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 419ffe14c53..58a825e20fa 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.h
@@ -99,7 +99,7 @@ public:
 	void transformVertices(struct SpriteVertex *vertices, const DXVector2 *centre, const DXVector2 *scaling, float angle);
 
 	bool setProjection() override;
-	bool setProjection2D() override;
+	bool setProjection2D();
 	bool setWorldTransform(const DXMatrix &transform) override;
 	bool setViewTransform(const DXMatrix &transform) override;
 	bool setProjectionTransform(const DXMatrix &transform) override;
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 cfafb673d76..b43ab6c296d 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -159,10 +159,6 @@ bool BaseRenderOpenGL3DShader::setup2D(bool force) {
 		glFrontFace(GL_CCW);  // WME DX have CW
 		glEnable(GL_BLEND);
 		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-		glViewport(0, 0, _width, _height);
-
-		setProjection2D();
 	}
 
 	return true;
@@ -219,8 +215,6 @@ bool BaseRenderOpenGL3DShader::setup3D(Camera3D *camera, bool force) {
 			// TODO: Disable fog in shader
 		}
 
-		glViewport(_viewportRect.left, _height - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height());
-
 		setProjection();
 	}
 
@@ -280,6 +274,7 @@ bool BaseRenderOpenGL3DShader::setupLines() {
 		glEnable(GL_ALPHA_TEST);
 
 		glBindTexture(GL_TEXTURE_2D, 0);
+		_lastTexture = nullptr;
 	}
 
 	return true;
@@ -342,19 +337,15 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 	// texture coords
 	vertices[0].u = texLeft;
 	vertices[0].v = texBottom;
-	vertices[0].z = -0.9f;
 
 	vertices[1].u = texLeft;
 	vertices[1].v = texTop;
-	vertices[1].z = -0.9f;
 
 	vertices[2].u = texRight;
 	vertices[2].v = texBottom;
-	vertices[2].z = -0.9f;
 
 	vertices[3].u = texRight;
 	vertices[3].v = texTop;
-	vertices[3].z = -0.9f;
 
 	float offset = _height / 2.0f;
 	float correctedYPos = (pos.y - offset) * -1.0f + offset;
@@ -362,15 +353,19 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 	// position coords
 	vertices[0].x = pos.x;
 	vertices[0].y = correctedYPos;
+	vertices[0].z = 0.9f;
 
 	vertices[1].x = pos.x;
 	vertices[1].y = correctedYPos - height;
+	vertices[1].z = 0.9f;
 
 	vertices[2].x = pos.x + width;
 	vertices[2].y = correctedYPos;
+	vertices[2].z = 0.9f;
 
 	vertices[3].x = pos.x + width;
 	vertices[3].y = correctedYPos - height;
+	vertices[3].z = 0.9f;
 
 	// not exactly sure about the color format, but this seems to work
 	byte a = RGBCOLGetA(color);
@@ -391,22 +386,18 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
 		transformVertices(vertices, &rotation, &sc, degToRad(-angle));
 	}
 
-	Math::Matrix3 transform;
-	transform.setToIdentity();
-	Math::Matrix4 projectionMatrix2d;
-	projectionMatrix2d.setData(_projectionMatrix2d);
-	_spriteShader->use();
-	_spriteShader->setUniform("alphaTest", !alphaDisable);
-	_spriteShader->setUniform("transform", transform);
-	_spriteShader->setUniform("projMatrix", projectionMatrix2d);
-
-	glBindBuffer(GL_ARRAY_BUFFER, _spriteVBO);
-	glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * sizeof(SpriteVertex), vertices);
-
 	if (_spriteBatchMode) {
 		// TODO
 	} else {
 		setSpriteBlendMode(blendMode);
+
+		glBindBuffer(GL_ARRAY_BUFFER, _spriteVBO);
+		glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * sizeof(SpriteVertex), vertices);
+
+		_spriteShader->use();
+		_spriteShader->setUniform("alphaTest", !alphaDisable);
+		setProjection2D(_spriteShader);
+
 		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 	}
 
@@ -551,11 +542,9 @@ bool BaseRenderOpenGL3DShader::drawLine(int x1, int y1, int x2, int y2, uint32 c
 	colorValue.z() = b / 255.0f;
 	colorValue.w() = a / 255.0f;
 
-	Math::Matrix4 projectionMatrix2d;
-	projectionMatrix2d.setData(_projectionMatrix2d);
 	_lineShader->use();
 	_lineShader->setUniform("color", colorValue);
-	_lineShader->setUniform("projMatrix", projectionMatrix2d);
+	setProjection2D(_lineShader);
 
 	glDrawArrays(GL_LINES, 0, 2);
 
@@ -564,8 +553,6 @@ bool BaseRenderOpenGL3DShader::drawLine(int x1, int y1, int x2, int y2, uint32 c
 }
 
 void BaseRenderOpenGL3DShader::fadeToColor(byte r, byte g, byte b, byte a) {
-	setProjection2D();
-
 	Math::Vector4d color;
 	color.x() = r / 255.0f;
 	color.y() = g / 255.0f;
@@ -581,11 +568,9 @@ void BaseRenderOpenGL3DShader::fadeToColor(byte r, byte g, byte b, byte a) {
 	glBindBuffer(GL_ARRAY_BUFFER, _fadeVBO);
 	_lastTexture = nullptr;
 
-	Math::Matrix4 projectionMatrix2d;
-	projectionMatrix2d.setData(_projectionMatrix2d);
 	_fadeShader->use();
 	_fadeShader->setUniform("color", color);
-	_fadeShader->setUniform("projMatrix", projectionMatrix2d);
+	setProjection2D(_fadeShader);
 
 	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
@@ -799,24 +784,22 @@ bool BaseRenderOpenGL3DShader::setViewport3D(DXViewport *viewport) {
 	return true;
 }
 
-bool BaseRenderOpenGL3DShader::setProjection2D() {
-	float nearPlane = -1.0f;
-	float farPlane = 1.0f;
-
-	DXMatrixIdentity(&_projectionMatrix2d);
-
-	_projectionMatrix2d.matrix._11 = 2.0f / _width;
-	_projectionMatrix2d.matrix._22 = 2.0f / _height;
-	_projectionMatrix2d.matrix._33 = 2.0f / (farPlane - nearPlane);
+bool BaseRenderOpenGL3DShader::setProjection2D(OpenGL::Shader *shader) {
+	DXMatrix matrix2D;
+	DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, 0, _height, 0.0f, 1.0f);
 
-	_projectionMatrix2d.matrix._41 = -1.0f;
-	_projectionMatrix2d.matrix._42 = -1.0f;
-	_projectionMatrix2d.matrix._43 = -(farPlane + nearPlane) / (farPlane - nearPlane);
+	// convert DX [0, 1] depth range to OpenGL [-1, 1] depth range.
+	matrix2D.matrix._33 = 2.0f;
+	matrix2D.matrix._43 = -1.0f;
 
+	Math::Matrix3 transform;
+	transform.setToIdentity();
 	Math::Matrix4 projectionMatrix2d;
-	projectionMatrix2d.setData(_projectionMatrix2d);
-	_shadowMaskShader->use();
-	_shadowMaskShader->setUniform("projMatrix", projectionMatrix2d);
+	projectionMatrix2d.setData(matrix2D);
+	shader->use();
+	shader->setUniform("projMatrix", projectionMatrix2d);
+	shader->setUniform("transform", transform);
+
 	return true;
 }
 
@@ -858,6 +841,8 @@ bool BaseRenderOpenGL3DShader::setProjectionTransform(const DXMatrix &transform)
 	_glProjectionMatrix.matrix._33 = range;
 	_glProjectionMatrix.matrix._43 = -(_nearClipPlane + _farClipPlane) * range / 2;
 
+	glViewport(_viewportRect.left, _height - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height());
+
 	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 e87a1df3965..18a18f97664 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -88,7 +88,7 @@ public:
 	void transformVertices(struct SpriteVertex *vertices, const DXVector2 *centre, const DXVector2 *scaling, float angle);
 
 	bool setProjection() override;
-	bool setProjection2D() override;
+	bool setProjection2D(OpenGL::Shader *);
 	bool setWorldTransform(const DXMatrix &transform) override;
 	bool setViewTransform(const DXMatrix &transform) override;
 	bool setProjectionTransform(const DXMatrix &transform) override;
@@ -134,8 +134,9 @@ public:
 
 	bool setViewport3D(DXViewport *viewport) override;
 
+	OpenGL::Shader *_shadowMaskShader;
+
 private:
-	DXMatrix _projectionMatrix2d;
 	DXMatrix _glProjectionMatrix;
 
 	Common::Array<DXMatrix> _transformStack;
@@ -150,7 +151,6 @@ private:
 	OpenGL::Shader *_xmodelShader;
 	OpenGL::Shader *_geometryShader;
 	OpenGL::Shader *_shadowVolumeShader;
-	OpenGL::Shader *_shadowMaskShader;
 	OpenGL::Shader *_lineShader;
 };
 
diff --git a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
index 4ab7e4ecdf0..8a81e8cef89 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl.cpp
@@ -121,10 +121,11 @@ bool ShadowVolumeOpenGL::renderToScene() {
 	glDisable(GL_LIGHTING);
 	glDisable(GL_ALPHA_TEST);
 
-	_gameRef->_renderer3D->setProjection2D();
-
 	glBindTexture(GL_TEXTURE_2D, 0);
 
+	BaseRenderOpenGL3D *renderer = dynamic_cast<BaseRenderOpenGL3D *>(_gameRef->_renderer3D);
+	renderer->setProjection2D();
+
 	glEnableClientState(GL_COLOR_ARRAY);
 	glEnableClientState(GL_VERTEX_ARRAY);
 
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 0890b4d9bf0..c931fd41659 100644
--- a/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.cpp
@@ -32,7 +32,7 @@
 
 #if defined(USE_OPENGL_SHADERS)
 
-#include "engines/wintermute/base/gfx/opengl/base_render_opengl3d.h"
+#include "engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h"
 #include "engines/wintermute/base/gfx/opengl/shadow_volume_opengl_shader.h"
 
 namespace Wintermute {
@@ -144,10 +144,12 @@ bool ShadowVolumeOpenGLShader::renderToScene() {
 	glStencilFunc(GL_LEQUAL, 0x1, 0xFFFFFFFF);
 	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 
-	_gameRef->_renderer3D->setProjection2D();
-
 	glBindTexture(GL_TEXTURE_2D, 0);
 
+	BaseRenderOpenGL3DShader *renderer = dynamic_cast<BaseRenderOpenGL3DShader *>(_gameRef->_renderer3D);
+	renderer->_shadowMaskShader->use();
+	renderer->setProjection2D(renderer->_shadowMaskShader);
+
 	_maskShader->enableVertexAttribute("position", _shadowMaskVertexBuffer, 2, GL_FLOAT, false, 8, 0);
 	_maskShader->use(true);
 




More information about the Scummvm-git-logs mailing list