[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