[Scummvm-git-logs] scummvm master -> 9223de088f7338ee659ad613eff48ac4b25875c1
aquadran
noreply at scummvm.org
Sat Jul 18 07:04:35 UTC 2026
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:
9223de088f WINTERMUTE: Added gamma support (only 3d renderer) for game 'Oknytt'
Commit: 9223de088f7338ee659ad613eff48ac4b25875c1
https://github.com/scummvm/scummvm/commit/9223de088f7338ee659ad613eff48ac4b25875c1
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2026-07-18T09:04:21+02:00
Commit Message:
WINTERMUTE: Added gamma support (only 3d renderer) for game 'Oknytt'
Changed paths:
A engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
A engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
dists/scummvm.rc
engines/wintermute/base/base_game.cpp
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_shader.cpp
engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 4860fa4d26a..5dc58c37415 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -104,6 +104,8 @@ shaders/wme_fade.fragment FILE "engines/wintermute/base/gfx/ope
shaders/wme_fade.vertex FILE "engines/wintermute/base/gfx/opengl/shaders/wme_fade.vertex"
shaders/wme_flat_shadow_modelx.fragment FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.fragment"
shaders/wme_flat_shadow_modelx.vertex FILE "engines/wintermute/base/gfx/opengl/shaders/wme_flat_shadow_modelx.vertex"
+shaders/wme_gamma.fragment FILE "engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment"
+shaders/wme_gamma.vertex FILE "engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex"
shaders/wme_geometry.fragment FILE "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.fragment"
shaders/wme_geometry.vertex FILE "engines/wintermute/base/gfx/opengl/shaders/wme_geometry.vertex"
shaders/wme_line.fragment FILE "engines/wintermute/base/gfx/opengl/shaders/wme_line.fragment"
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 5cebef9c8d6..bae8868883d 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -2849,6 +2849,37 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
stack->pushNULL();
+ return STATUS_OK;
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // SetGamma
+ // This is for game 'Oknytt'
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "SetGamma") == 0) {
+ stack->correctParams(1);
+
+ int32 gamma = stack->pop()->getInt(0);
+
+ if (_renderer3D)
+ _renderer3D->setGamma(gamma);
+
+ stack->pushNULL();
+
+ return STATUS_OK;
+ }
+ //////////////////////////////////////////////////////////////////////////
+ // GetGamma
+ // This is for game 'Oknytt'
+ //////////////////////////////////////////////////////////////////////////
+ else if (strcmp(name, "GetGamma") == 0) {
+ stack->correctParams(0);
+
+ int32 gamma = 0;
+ if (_renderer3D)
+ gamma = _renderer3D->getGamma();
+
+ stack->pushInt(gamma);
+
return STATUS_OK;
} else {
return BaseObject::scCallMethod(script, stack, thisStack, name);
diff --git a/engines/wintermute/base/gfx/base_renderer3d.cpp b/engines/wintermute/base/gfx/base_renderer3d.cpp
index 78eb9d57eef..14b3d2b878e 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.cpp
+++ b/engines/wintermute/base/gfx/base_renderer3d.cpp
@@ -44,6 +44,8 @@ BaseRenderer3D::BaseRenderer3D(Wintermute::BaseGame *inGame) : BaseRenderer(inGa
DXMatrixIdentity(&_worldMatrix);
DXMatrixIdentity(&_viewMatrix);
DXMatrixIdentity(&_projectionMatrix);
+
+ _gamma = -1;
}
BaseRenderer3D::~BaseRenderer3D() {
diff --git a/engines/wintermute/base/gfx/base_renderer3d.h b/engines/wintermute/base/gfx/base_renderer3d.h
index c0fcadaf84b..0074116a2ef 100644
--- a/engines/wintermute/base/gfx/base_renderer3d.h
+++ b/engines/wintermute/base/gfx/base_renderer3d.h
@@ -155,6 +155,13 @@ public:
void endSaveLoad() override;
+ void setGamma(int32 gamma) {
+ _gamma = gamma;
+ }
+ float getGamma() {
+ return _gamma;
+ }
+
// ScummVM specific methods <--
protected:
@@ -168,6 +175,7 @@ protected:
TRendererState _state;
PostFilter _postFilterMode;
bool _flipInProgress;
+ int32 _gamma;
virtual void setAmbientLightRenderState() = 0;
};
diff --git a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
index ad13a733e94..c19510f4033 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d.cpp
@@ -27,6 +27,7 @@
#include "engines/wintermute/ad/ad_walkplane.h"
#include "engines/wintermute/ad/ad_waypoint_group3d.h"
#include "engines/wintermute/base/base_game.h"
+#include "engines/wintermute/base/base_engine.h"
#include "engines/wintermute/base/gfx/base_image.h"
#include "engines/wintermute/base/gfx/3dcamera.h"
#include "engines/wintermute/base/gfx/3dlight.h"
@@ -1042,6 +1043,77 @@ bool BaseRenderOpenGL3D::setProjectionTransform(const DXMatrix &transform) {
}
void BaseRenderOpenGL3D::postfilter() {
+ GLfloat vertices[] = {
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ 1.0f, 1.0f,
+ -1.0f, 1.0f
+ };
+
+ GLfloat texCoords[] = {
+ 0.0f, 0.0f,
+ 1.0f, 0.0f,
+ 1.0f, 1.0f,
+ 0.0f, 1.0f
+ };
+
+ // This is for game 'Oknytt'
+ if (_gamma != -1) {
+ setup2D();
+ glViewport(0, 0, _width, _height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glDisable(GL_BLEND);
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_CULL_FACE);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+
+ g_system->presentBuffer();
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glVertexPointer(2, GL_FLOAT, 0, vertices);
+ glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+
+ if (_gamma <= 140) {
+ float factor = 1.0f - (140.0f - _gamma) / 50.0f;
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glColor4f(factor, factor, factor, 1.0f);
+ glDrawArrays(GL_QUADS, 0, 4);
+ } else {
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glDrawArrays(GL_QUADS, 0, 4);
+ float alpha = (_gamma - 140.0f) / 200.0f;
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(1.0f, 1.0f, 1.0f, alpha);
+ glDrawArrays(GL_QUADS, 0, 4);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glDisable(GL_BLEND);
+ }
+
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
+ return;
+ }
+
if (_postFilterMode == kPostFilterOff)
return;
@@ -1057,20 +1129,6 @@ void BaseRenderOpenGL3D::postfilter() {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
- GLfloat vertices[] = {
- -1.0f, -1.0f,
- 1.0f, -1.0f,
- 1.0f, 1.0f,
- -1.0f, 1.0f
- };
-
- GLfloat texCoords[] = {
- 0.0f, 0.0f,
- 1.0f, 0.0f,
- 1.0f, 1.0f,
- 0.0f, 1.0f
- };
-
if (_postFilterMode == kPostFilterBlackAndWhite ||
_postFilterMode == kPostFilterSepia) {
glDisable(GL_BLEND);
@@ -1123,7 +1181,7 @@ void BaseRenderOpenGL3D::postfilter() {
g_system->presentBuffer();
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
-
+
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
GLfloat luminanceWeights[] = { 0.65f, 0.65f, 0.65f };
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 f29df597494..dab71774ea6 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.cpp
@@ -63,6 +63,7 @@ BaseRenderOpenGL3DShader::~BaseRenderOpenGL3DShader() {
glDeleteBuffers(1, &_rectangleVBO);
glDeleteBuffers(1, &_simpleShadowVBO);
glDeleteBuffers(1, &_postfilterVBO);
+ glDeleteBuffers(1, &_gammaVBO);
}
bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed) {
@@ -184,6 +185,16 @@ bool BaseRenderOpenGL3DShader::initRenderer(int width, int height, bool windowed
_postfilterShader->enableVertexAttribute("position", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 0);
_postfilterShader->enableVertexAttribute("texcoord", _postfilterVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 8);
+ glGenBuffers(1, &_gammaVBO);
+ glBindBuffer(GL_ARRAY_BUFFER, _gammaVBO);
+ glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(GLfloat), quadVertices, GL_STATIC_DRAW);
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ static const char *gammaAttributes[] = { "position", "texcoord", nullptr };
+ _gammaShader = OpenGL::Shader::fromFiles("wme_gamma", gammaAttributes);
+ _gammaShader->enableVertexAttribute("position", _gammaVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 0);
+ _gammaShader->enableVertexAttribute("texcoord", _gammaVBO, 2, GL_FLOAT, false, 4 * sizeof(GLfloat), 8);
+
glGenTextures(1, &_postfilterTexture);
glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -1151,6 +1162,30 @@ bool BaseRenderOpenGL3DShader::setProjectionTransform(const DXMatrix &transform)
}
void BaseRenderOpenGL3DShader::postfilter() {
+ // This is for game 'Oknytt'
+ if (_gamma != -1) {
+ setup2D();
+ glViewport(0, 0, _width, _height);
+ glDisable(GL_BLEND);
+ glDisable(GL_CULL_FACE);
+
+ _gammaShader->use();
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, _postfilterTexture);
+ glUniform1i(_gammaShader->getUniformLocation("tex"), 0);
+ _gammaShader->setUniform1f("gammaValue", _gamma);
+
+ g_system->presentBuffer();
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, _width, _height, 0);
+
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ return;
+ }
+
if (_postFilterMode == kPostFilterOff)
return;
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 4aa7632121c..043bddfd256 100644
--- a/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
+++ b/engines/wintermute/base/gfx/opengl/base_render_opengl3d_shader.h
@@ -181,6 +181,7 @@ private:
GLuint _rectangleVBO{};
GLuint _simpleShadowVBO{};
GLuint _postfilterVBO{};
+ GLuint _gammaVBO{};
OpenGL::Shader *_spriteShader{};
OpenGL::Shader *_fadeShader{};
OpenGL::Shader *_xmodelShader{};
@@ -190,6 +191,7 @@ private:
OpenGL::Shader *_shadowVolumeShader{};
OpenGL::Shader *_lineShader{};
OpenGL::Shader *_postfilterShader{};
+ OpenGL::Shader *_gammaShader{};
GLuint _postfilterTexture;
};
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
new file mode 100644
index 00000000000..554754e8a4a
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.fragment
@@ -0,0 +1,13 @@
+varying vec2 texPos;
+
+uniform sampler2D tex;
+uniform float gammaValue;
+
+OUTPUT
+
+void main() {
+ vec4 color = texture2D(tex, texPos);
+ float t = (gammaValue - 140.0) / 15.0;
+ float gamma = exp2(t * 0.5);
+ outColor = vec4(pow(color.rgb, vec3(1.0 / gamma)), 1.0);
+}
diff --git a/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
new file mode 100644
index 00000000000..0ab72b31e36
--- /dev/null
+++ b/engines/wintermute/base/gfx/opengl/shaders/wme_gamma.vertex
@@ -0,0 +1,9 @@
+in vec2 position;
+in vec2 texcoord;
+
+varying vec2 texPos;
+
+void main() {
+ gl_Position = vec4(position, 0.0, 1.0);
+ texPos = texcoord;
+}
More information about the Scummvm-git-logs
mailing list