[Scummvm-git-logs] scummvm master -> 66bb48216e21c96de9340f181638c483c9c26ecb
aquadran
noreply at scummvm.org
Sun May 18 12:45:43 UTC 2025
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
66bb48216e WINTERMUTE: Synced with original code and fixed DrawSpriteEx rendering
Commit: 66bb48216e21c96de9340f181638c483c9c26ecb
https://github.com/scummvm/scummvm/commit/66bb48216e21c96de9340f181638c483c9c26ecb
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2025-05-18T14:45:39+02:00
Commit Message:
WINTERMUTE: Synced with original code and fixed DrawSpriteEx rendering
Changed paths:
engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
engines/wintermute/base/gfx/xmath.cpp
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index 5aecf26a18f..660ee90cbc8 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -302,7 +302,6 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
float angle, uint32 color, bool alphaDisable,
Graphics::TSpriteBlendMode blendMode,
bool mirrorX, bool mirrorY) {
-
BaseSurfaceOpenGL3D *texture = dynamic_cast<BaseSurfaceOpenGL3D *>(tex);
if (!texture)
return false;
@@ -330,10 +329,7 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
SWAP(texTop, texBottom);
}
- SpriteVertex vertices[4] = {};
-
- // Convert to OpenGL origin space
- SWAP(texTop, texBottom);
+ SpriteVertex vertices[4];
// texture coords
vertices[0].u = texLeft;
@@ -348,27 +344,34 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
vertices[3].u = texRight;
vertices[3].v = texTop;
- float offset = _height / 2.0f;
- float correctedYPos = (pos.y - offset) * -1.0f + offset;
-
// position coords
vertices[0].x = pos.x;
- vertices[0].y = correctedYPos;
+ vertices[0].y = pos.y + height;
vertices[0].z = 0.9f;
vertices[1].x = pos.x;
- vertices[1].y = correctedYPos - height;
+ vertices[1].y = pos.y;
vertices[1].z = 0.9f;
vertices[2].x = pos.x + width;
- vertices[2].y = correctedYPos;
+ vertices[2].y = pos.y + height;
vertices[2].z = 0.9f;
vertices[3].x = pos.x + width;
- vertices[3].y = correctedYPos - height;
+ vertices[3].y = pos.y;
vertices[3].z = 0.9f;
- // not exactly sure about the color format, but this seems to work
+ if (angle != 0) {
+ DXVector2 sc(1.0f, 1.0f);
+ DXVector2 rotation(rot.x, rot.y);
+ transformVertices(vertices, &rotation, &sc, degToRad(-angle));
+ }
+
+ for (int i = 0; i < 4; i++) {
+ vertices[i].x += _drawOffsetX;
+ vertices[i].y += _drawOffsetY;
+ }
+
byte a = RGBCOLGetA(color);
byte r = RGBCOLGetR(color);
byte g = RGBCOLGetG(color);
@@ -381,12 +384,6 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
vertices[i].a = a;
}
- if (angle != 0) {
- DXVector2 sc(1.0f, 1.0f);
- DXVector2 rotation(rot.x, (rot.y - (_height / 2.0f)) * -1.0f + (_height / 2.0f));
- transformVertices(vertices, &rotation, &sc, degToRad(-angle));
- }
-
setSpriteBlendMode(blendMode);
if (alphaDisable) {
glDisable(GL_ALPHA_TEST);
@@ -398,14 +395,17 @@ bool BaseRenderOpenGL3D::drawSpriteEx(BaseSurface *tex, const Wintermute::Rect32
glBindTexture(GL_TEXTURE_2D, texture->getTextureName());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// for sprites we clamp to the edge, to avoid line fragments at the edges
- // this is not done by wme, though
+ // this is not done by wme, but centering pixel by 0.5
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glEnable(GL_TEXTURE_2D);
}
+ glViewport(0, 0, _width, _height);
setProjection2D();
+ glFrontFace(GL_CW);
+
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
@@ -613,8 +613,9 @@ BaseImage *BaseRenderOpenGL3D::takeScreenshot() {
#endif
surface->create(_viewportRect.width(), _viewportRect.height(), format);
- glReadPixels(_viewportRect.left, _viewportRect.height() - _viewportRect.bottom, _viewportRect.width(), _viewportRect.height(),
- GL_RGBA, GL_UNSIGNED_BYTE, surface->getPixels());
+ 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());
screenshot->copyFrom(converted);
@@ -916,7 +917,7 @@ bool BaseRenderOpenGL3D::setViewport(int left, int top, int right, int bottom) {
_viewport._y = top;
_viewport._width = right - left;
_viewport._height = bottom - top;
- glViewport(left, _height - bottom, right - left, bottom - top);
+ glViewport(left, top, right - left, bottom - top);
return true;
}
@@ -929,7 +930,8 @@ bool BaseRenderOpenGL3D::setViewport3D(DXViewport *viewport) {
bool BaseRenderOpenGL3D::setProjection2D() {
DXMatrix matrix2D;
- DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, 0, _height, 0.0f, 1.0f);
+ DXMatrixIdentity(&matrix2D);
+ DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, _height, 0, 0.0f, 1.0f);
// convert DX [0, 1] depth range to OpenGL [-1, 1] depth range.
matrix2D.matrix._33 = 2.0f;
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 df7866cd798..fc1257819dd 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -57,7 +57,6 @@ BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
}
bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed) {
-
glGenBuffers(1, &_spriteVBO);
glBindBuffer(GL_ARRAY_BUFFER, _spriteVBO);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(SpriteVertex), nullptr, GL_DYNAMIC_DRAW);
@@ -356,10 +355,7 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
SWAP(texTop, texBottom);
}
- SpriteVertex vertices[4] = {};
-
- // Convert to OpenGL origin space
- SWAP(texTop, texBottom);
+ SpriteVertex vertices[4];
// texture coords
vertices[0].u = texLeft;
@@ -374,27 +370,34 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
vertices[3].u = texRight;
vertices[3].v = texTop;
- float offset = _height / 2.0f;
- float correctedYPos = (pos.y - offset) * -1.0f + offset;
-
// position coords
vertices[0].x = pos.x;
- vertices[0].y = correctedYPos;
+ vertices[0].y = pos.y + height;
vertices[0].z = 0.9f;
vertices[1].x = pos.x;
- vertices[1].y = correctedYPos - height;
+ vertices[1].y = pos.y;
vertices[1].z = 0.9f;
vertices[2].x = pos.x + width;
- vertices[2].y = correctedYPos;
+ vertices[2].y = pos.y + height;
vertices[2].z = 0.9f;
vertices[3].x = pos.x + width;
- vertices[3].y = correctedYPos - height;
+ vertices[3].y = pos.y;
vertices[3].z = 0.9f;
- // not exactly sure about the color format, but this seems to work
+ if (angle != 0) {
+ DXVector2 sc(1.0f, 1.0f);
+ DXVector2 rotation(rot.x, rot.y);
+ transformVertices(vertices, &rotation, &sc, degToRad(-angle));
+ }
+
+ for (int i = 0; i < 4; i++) {
+ vertices[i].x += _drawOffsetX;
+ vertices[i].y += _drawOffsetY;
+ }
+
byte a = RGBCOLGetA(color);
byte r = RGBCOLGetR(color);
byte g = RGBCOLGetG(color);
@@ -407,12 +410,6 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
vertices[i].a = a / 255.0f;
}
- if (angle != 0) {
- DXVector2 sc(1.0f, 1.0f);
- DXVector2 rotation(rot.x, (rot.y - (_height / 2.0f)) * -1.0f + (_height / 2.0f));
- transformVertices(vertices, &rotation, &sc, degToRad(-angle));
- }
-
setSpriteBlendMode(blendMode);
if (alphaDisable) {
_spriteShader->setUniform("alphaTest", false);
@@ -424,7 +421,7 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
glBindTexture(GL_TEXTURE_2D, texture->getTextureName());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// for sprites we clamp to the edge, to avoid line fragments at the edges
- // this is not done by wme, though
+ // this is not done by wme, but centering pixel by 0.5
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glEnable(GL_TEXTURE_2D);
@@ -433,8 +430,11 @@ bool BaseRenderOpenGL3DShader::drawSpriteEx(BaseSurface *tex, const Wintermute::
glBindBuffer(GL_ARRAY_BUFFER, _spriteVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, 4 * sizeof(SpriteVertex), vertices);
+ glViewport(0, 0, _width, _height);
setProjection2D(_spriteShader);
+ glFrontFace(GL_CW);
+
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
if (alphaDisable) {
@@ -744,7 +744,7 @@ void BaseRenderOpenGL3DShader::renderSceneGeometry(const BaseArray<AdWalkplane *
// backend layer 3DShadowVolume::Render()
void BaseRenderOpenGL3DShader::renderShadowGeometry(const BaseArray<AdWalkplane *> &planes, const BaseArray<AdBlock *> &blocks,
- const BaseArray<AdGeneric *> &generics, Camera3D *camera) {
+ const BaseArray<AdGeneric *> &generics, Camera3D *camera) {
DXMatrix matIdentity;
DXMatrixIdentity(&matIdentity);
@@ -806,7 +806,7 @@ bool BaseRenderOpenGL3DShader::setViewport(int left, int top, int right, int bot
_viewport._y = top;
_viewport._width = right - left;
_viewport._height = bottom - top;
- glViewport(left, _height - bottom, right - left, bottom - top);
+ glViewport(left, top, right - left, bottom - top);
return true;
}
@@ -819,7 +819,8 @@ bool BaseRenderOpenGL3DShader::setViewport3D(DXViewport *viewport) {
bool BaseRenderOpenGL3DShader::setProjection2D(OpenGL::Shader *shader) {
DXMatrix matrix2D;
- DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, 0, _height, 0.0f, 1.0f);
+ DXMatrixIdentity(&matrix2D);
+ DXMatrixOrthoOffCenterLH(&matrix2D, 0, _width, _height, 0, 0.0f, 1.0f);
// convert DX [0, 1] depth range to OpenGL [-1, 1] depth range.
matrix2D.matrix._33 = 2.0f;
diff --git a/engines/wintermute/base/gfx/xmath.cpp b/engines/wintermute/base/gfx/xmath.cpp
index 3b616d5f9fb..769a7013086 100644
--- a/engines/wintermute/base/gfx/xmath.cpp
+++ b/engines/wintermute/base/gfx/xmath.cpp
@@ -662,8 +662,8 @@ DXMatrix *DXMatrixOrthoOffCenterLH(DXMatrix *pout, float l, float r, float b, fl
pout->_m[0][0] = 2.0f / (r - l);
pout->_m[1][1] = 2.0f / (t - b);
pout->_m[2][2] = 1.0f / (zf -zn);
- pout->_m[3][0] = -1.0f -2.0f * l / (r - l);
- pout->_m[3][1] = 1.0f + 2.0f * t / (b - t);
+ pout->_m[3][0] = -1.0f - 2.0f * l / (r - l);
+ pout->_m[3][1] = 1.0f + 2.0f * t / (b - t);
pout->_m[3][2] = zn / (zn -zf);
return pout;
}
More information about the Scummvm-git-logs
mailing list